aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Smirnov <alex@ydb.tech>2024-12-24 22:01:20 +0000
committerAlexander Smirnov <alex@ydb.tech>2024-12-24 22:01:20 +0000
commitbd0e2de0b1035962a4d5b9e847eaa6508fad7fcf (patch)
tree79878ca309f9f7fada064f9b78b4223af4635f28
parentbe43a4691ebdd4dbe260a8d77df4cd8423b14c05 (diff)
parente6bd80ded127cd064560f7ea471974b602770cb1 (diff)
downloadydb-bd0e2de0b1035962a4d5b9e847eaa6508fad7fcf.tar.gz
Merge branch 'PR'
-rw-r--r--build/conf/java.conf1
-rw-r--r--build/conf/proto.conf12
-rw-r--r--build/conf/settings.conf1
-rw-r--r--build/conf/ts/ts_test.conf2
-rw-r--r--build/export_generators/ide-gradle/build.gradle.kts.jinja11
-rw-r--r--build/export_generators/ide-gradle/generator.toml1
-rw-r--r--build/export_generators/ide-gradle/jdk.jinja24
-rw-r--r--build/export_generators/ide-gradle/kotlin_plugins.jinja2
-rw-r--r--build/export_generators/ide-gradle/plugins.jinja7
-rw-r--r--build/export_generators/ide-gradle/preview.jinja4
-rw-r--r--build/export_generators/ide-gradle/proto_plugins.jinja9
-rw-r--r--build/export_generators/ide-gradle/proto_vars.jinja2
-rw-r--r--build/export_generators/ide-gradle/run_java_program.jinja26
-rw-r--r--build/export_generators/ide-gradle/source_sets.jinja52
-rw-r--r--build/export_generators/ide-gradle/vars.jinja9
-rw-r--r--build/external_resources/ymake/public.resources.json10
-rw-r--r--build/external_resources/ymake/resources.json10
-rw-r--r--build/mapping.conf.json18
-rw-r--r--build/platform/test_tool/host.ya.make.inc10
-rw-r--r--build/platform/test_tool/host_os.ya.make.inc10
-rw-r--r--build/scripts/compile_java.py1
-rw-r--r--build/sysincl/stl-to-nothing.yml4
-rw-r--r--build/ymake.core.conf18
-rw-r--r--contrib/libs/cxxsupp/libcxx/include/__support/win32/locale_win32.h6
-rw-r--r--contrib/libs/cxxsupp/libcxx/patches/09-clang-cl-abi.patch (renamed from contrib/libs/cxxsupp/libcxx/patches/09-msc-ver.patch)0
-rw-r--r--contrib/libs/cxxsupp/libcxx/patches/18-locale-win32.patch24
-rw-r--r--contrib/libs/hyperscan/.yandex_meta/__init__.py2
-rw-r--r--contrib/libs/nghttp3/.yandex_meta/__init__.py2
-rw-r--r--contrib/libs/protobuf/.yandex_meta/__init__.py10
-rw-r--r--contrib/python/Pillow/py3/.yandex_meta/__init__.py4
-rw-r--r--contrib/python/anyio/.dist-info/METADATA44
-rw-r--r--contrib/python/anyio/anyio/__init__.py2
-rw-r--r--contrib/python/anyio/anyio/_backends/_asyncio.py282
-rw-r--r--contrib/python/anyio/anyio/_backends/_trio.py12
-rw-r--r--contrib/python/anyio/anyio/_core/_asyncio_selector_thread.py150
-rw-r--r--contrib/python/anyio/anyio/_core/_exceptions.py2
-rw-r--r--contrib/python/anyio/anyio/_core/_fileio.py4
-rw-r--r--contrib/python/anyio/anyio/_core/_sockets.py93
-rw-r--r--contrib/python/anyio/anyio/_core/_synchronization.py13
-rw-r--r--contrib/python/anyio/anyio/abc/__init__.py12
-rw-r--r--contrib/python/anyio/anyio/abc/_eventloop.py6
-rw-r--r--contrib/python/anyio/anyio/abc/_tasks.py6
-rw-r--r--contrib/python/anyio/ya.make4
-rw-r--r--contrib/python/fonttools/.dist-info/METADATA9
-rw-r--r--contrib/python/fonttools/fontTools/__init__.py2
-rw-r--r--contrib/python/fonttools/fontTools/designspaceLib/__init__.py2
-rw-r--r--contrib/python/fonttools/fontTools/feaLib/builder.py39
-rw-r--r--contrib/python/fonttools/ya.make2
-rw-r--r--contrib/python/grpcio/py3/.yandex_meta/__init__.py2
-rw-r--r--contrib/python/scipy/py3/tests/_build_utils/ya.make26
-rw-r--r--contrib/python/scipy/py3/tests/_lib/ya.make38
-rw-r--r--contrib/python/scipy/py3/tests/cluster/ya.make29
-rw-r--r--contrib/python/scipy/py3/tests/constants/ya.make27
-rw-r--r--contrib/python/scipy/py3/tests/fft/ya.make42
-rw-r--r--contrib/python/scipy/py3/tests/fftpack/ya.make34
-rw-r--r--contrib/python/scipy/py3/tests/integrate/ya.make32
-rw-r--r--contrib/python/scipy/py3/tests/interpolate/ya.make41
-rw-r--r--contrib/python/scipy/py3/tests/io/ya.make48
-rw-r--r--contrib/python/scipy/py3/tests/linalg/ya.make54
-rw-r--r--contrib/python/scipy/py3/tests/misc/ya.make28
-rw-r--r--contrib/python/scipy/py3/tests/ndimage/ya.make36
-rw-r--r--contrib/python/scipy/py3/tests/odr/ya.make26
-rw-r--r--contrib/python/scipy/py3/tests/optimize/ya.make69
-rw-r--r--contrib/python/scipy/py3/tests/signal/ya.make46
-rw-r--r--contrib/python/scipy/py3/tests/sparse/ya.make75
-rw-r--r--contrib/python/scipy/py3/tests/spatial/ya.make43
-rw-r--r--contrib/python/scipy/py3/tests/special/ya.make73
-rw-r--r--contrib/python/scipy/py3/tests/stats/ya.make61
-rw-r--r--contrib/python/scipy/py3/tests/ya.make351
-rw-r--r--contrib/python/six/py2/.dist-info/METADATA10
-rw-r--r--contrib/python/six/py2/LICENSE2
-rw-r--r--contrib/python/six/py2/README.rst4
-rw-r--r--contrib/python/six/py2/six.py15
-rw-r--r--contrib/python/six/py2/ya.make2
-rw-r--r--contrib/python/six/py3/.dist-info/METADATA10
-rw-r--r--contrib/python/six/py3/LICENSE2
-rw-r--r--contrib/python/six/py3/README.rst4
-rw-r--r--contrib/python/six/py3/six.py15
-rw-r--r--contrib/python/six/py3/ya.make2
-rw-r--r--contrib/python/types-protobuf/.dist-info/METADATA8
-rw-r--r--contrib/python/types-protobuf/README.md6
-rw-r--r--contrib/python/types-protobuf/google-stubs/METADATA.toml4
-rw-r--r--contrib/python/types-protobuf/ya.make2
-rw-r--r--contrib/python/ydb/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/ydb/py3/ya.make2
-rw-r--r--contrib/python/ydb/py3/ydb/_topic_writer/topic_writer_asyncio.py2
-rw-r--r--contrib/python/ydb/py3/ydb/ydb_version.py2
-rw-r--r--contrib/restricted/boost/context/.yandex_meta/devtools.copyrights.report102
-rw-r--r--contrib/restricted/boost/context/.yandex_meta/devtools.licenses.report79
-rw-r--r--contrib/restricted/boost/context/.yandex_meta/licenses.list.txt43
-rw-r--r--contrib/restricted/boost/context/fcontext_impl/ya.make73
-rw-r--r--contrib/restricted/boost/context/impl_common/ya.make4
-rw-r--r--contrib/restricted/boost/context/include/boost/context/detail/fcontext.hpp9
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_arm_aapcs_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_arm_aapcs_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_combined_sysv_macho_gas.S24
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_clang_gas.S123
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_gas.asm123
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_i386_sysv_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_i386_sysv_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_i386_x86_64_sysv_macho_gas.S16
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_loongarch64_sysv_elf_gas.S121
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_mips32_o32_elf_gas.S119
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_mips64_n64_elf_gas.S124
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_ppc32_ppc64_sysv_macho_gas.S16
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_elf_gas.S201
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_macho_gas.S201
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_xcoff_gas.S216
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_elf_gas.S221
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_macho_gas.S164
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_xcoff_gas.S173
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_riscv64_sysv_elf_gas.S150
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_s390x_sysv_elf_gas.S160
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_sparc64_sysv_elf_gas.S51
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_clang_gas.S209
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_gas.asm209
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S9
-rw-r--r--contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/make_arm64_aapcs_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/make_arm64_aapcs_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/make_arm_aapcs_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/make_arm_aapcs_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/make_combined_sysv_macho_gas.S24
-rw-r--r--contrib/restricted/boost/context/src/asm/make_i386_ms_pe_clang_gas.S153
-rw-r--r--contrib/restricted/boost/context/src/asm/make_i386_ms_pe_gas.asm153
-rw-r--r--contrib/restricted/boost/context/src/asm/make_i386_sysv_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/make_i386_sysv_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/make_i386_x86_64_sysv_macho_gas.S16
-rw-r--r--contrib/restricted/boost/context/src/asm/make_loongarch64_sysv_elf_gas.S72
-rw-r--r--contrib/restricted/boost/context/src/asm/make_mips32_o32_elf_gas.S97
-rw-r--r--contrib/restricted/boost/context/src/asm/make_mips64_n64_elf_gas.S96
-rw-r--r--contrib/restricted/boost/context/src/asm/make_ppc32_ppc64_sysv_macho_gas.S16
-rw-r--r--contrib/restricted/boost/context/src/asm/make_ppc32_sysv_elf_gas.S146
-rw-r--r--contrib/restricted/boost/context/src/asm/make_ppc32_sysv_macho_gas.S154
-rw-r--r--contrib/restricted/boost/context/src/asm/make_ppc32_sysv_xcoff_gas.S125
-rw-r--r--contrib/restricted/boost/context/src/asm/make_ppc64_sysv_elf_gas.S177
-rw-r--r--contrib/restricted/boost/context/src/asm/make_ppc64_sysv_macho_gas.S127
-rw-r--r--contrib/restricted/boost/context/src/asm/make_ppc64_sysv_xcoff_gas.S137
-rw-r--r--contrib/restricted/boost/context/src/asm/make_riscv64_sysv_elf_gas.S91
-rw-r--r--contrib/restricted/boost/context/src/asm/make_s390x_sysv_elf_gas.S108
-rw-r--r--contrib/restricted/boost/context/src/asm/make_sparc64_sysv_elf_gas.S68
-rw-r--r--contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_clang_gas.S174
-rw-r--r--contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_gas.asm174
-rw-r--r--contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S30
-rw-r--r--contrib/restricted/boost/context/src/asm/make_x86_64_sysv_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_combined_sysv_macho_gas.S24
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_clang_gas.S131
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_gas.asm131
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_i386_sysv_elf_gas.S7
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_i386_sysv_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_i386_x86_64_sysv_macho_gas.S16
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_loongarch64_sysv_elf_gas.S118
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_mips32_o32_elf_gas.S120
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_mips64_n64_elf_gas.S123
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_ppc32_ppc64_sysv_macho_gas.S16
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_elf_gas.S193
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_macho_gas.S201
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_xcoff_gas.S230
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_elf_gas.S244
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_macho_gas.S151
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_xcoff_gas.S187
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_riscv64_sysv_elf_gas.S149
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_s390x_sysv_elf_gas.S145
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_sparc64_sysv_elf_gas.S50
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_clang_gas.S211
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_gas.asm211
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_macho_gas.S1
-rw-r--r--contrib/restricted/boost/context/src/asm/tail_ontop_ppc32_sysv.cpp18
-rw-r--r--contrib/restricted/boost/context/src/fcontext.cpp39
-rw-r--r--contrib/restricted/boost/context/ucontext_impl/ya.make4
-rw-r--r--contrib/restricted/boost/context/ya.make4
-rw-r--r--contrib/restricted/boost/coroutine/include/boost/coroutine/posix/protected_stack_allocator.hpp8
-rw-r--r--contrib/restricted/boost/coroutine/include/boost/coroutine/windows/protected_stack_allocator.hpp10
-rw-r--r--contrib/restricted/boost/coroutine/src/posix/stack_traits.cpp4
-rw-r--r--contrib/restricted/boost/coroutine/ya.make4
-rw-r--r--contrib/restricted/boost/function/include/boost/function/function_template.hpp14
-rw-r--r--contrib/restricted/boost/function/ya.make5
-rw-r--r--contrib/restricted/boost/move/include/boost/move/adl_move_swap.hpp2
-rw-r--r--contrib/restricted/boost/move/include/boost/move/core.hpp8
-rw-r--r--contrib/restricted/boost/move/include/boost/move/detail/meta_utils.hpp21
-rw-r--r--contrib/restricted/boost/move/include/boost/move/detail/meta_utils_core.hpp15
-rw-r--r--contrib/restricted/boost/move/include/boost/move/detail/nsec_clock.hpp2
-rw-r--r--contrib/restricted/boost/move/include/boost/move/detail/placement_new.hpp2
-rw-r--r--contrib/restricted/boost/move/include/boost/move/detail/std_ns_begin.hpp14
-rw-r--r--contrib/restricted/boost/move/include/boost/move/detail/std_ns_end.hpp3
-rw-r--r--contrib/restricted/boost/move/ya.make4
-rw-r--r--contrib/restricted/boost/regex/.yandex_meta/devtools.copyrights.report49
-rw-r--r--contrib/restricted/boost/regex/.yandex_meta/devtools.licenses.report46
-rw-r--r--contrib/restricted/boost/regex/include/boost/cregex.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/concepts.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/icu.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/pattern_except.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/pending/object_cache.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/pending/unicode_iterator.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/regex_traits.hpp2
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex.hpp797
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_creator.hpp1598
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_parser.hpp3174
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/c_regex_traits.hpp511
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/char_regex_traits.hpp81
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/cpp_regex_traits.hpp1237
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/cregex.hpp213
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/error_type.hpp59
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/icu.hpp1516
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/indexed_bit_flag.hpp54
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/iterator_category.hpp91
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/iterator_traits.hpp135
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/match_flags.hpp161
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/match_results.hpp716
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/mem_block_cache.hpp183
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/object_cache.hpp171
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/pattern_except.hpp128
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher.hpp645
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_common.hpp1030
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp1947
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_recursive.hpp1131
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/primary_transform.hpp146
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/protected_call.hpp83
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regbase.hpp180
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex.hpp166
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_format.hpp1158
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_fwd.hpp73
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_grep.hpp155
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_iterator.hpp195
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_match.hpp382
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_merge.hpp93
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_raw_buffer.hpp241
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_replace.hpp99
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_search.hpp217
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_split.hpp174
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_token_iterator.hpp327
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits.hpp189
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits_defaults.hpp997
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/regex_workaround.hpp237
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/states.hpp321
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/sub_match.hpp516
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/syntax_type.hpp105
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_iterator.hpp185
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_token_iterator.hpp360
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/unicode_iterator.hpp871
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex/v4/w32_regex_traits.hpp1229
-rw-r--r--contrib/restricted/boost/regex/include/boost/regex_fwd.hpp2
-rw-r--r--contrib/restricted/boost/regex/src/posix_api.cpp2
-rw-r--r--contrib/restricted/boost/regex/src/regex.cpp2
-rw-r--r--contrib/restricted/boost/regex/src/static_mutex.cpp2
-rw-r--r--contrib/restricted/boost/regex/src/wide_posix_api.cpp2
-rw-r--r--contrib/restricted/boost/regex/ya.make9
-rw-r--r--contrib/tools/python3/.yandex_meta/devtools.licenses.report4
-rw-r--r--contrib/tools/python3/.yandex_meta/override.nix4
-rw-r--r--contrib/tools/python3/Include/internal/pycore_object_state.h8
-rw-r--r--contrib/tools/python3/Include/internal/pycore_runtime_init.h7
-rw-r--r--contrib/tools/python3/Include/internal/pycore_typeobject.h2
-rw-r--r--contrib/tools/python3/Include/internal/pycore_unicodeobject.h3
-rw-r--r--contrib/tools/python3/Include/patchlevel.h4
-rw-r--r--contrib/tools/python3/Lib/_collections_abc.py2
-rw-r--r--contrib/tools/python3/Lib/_strptime.py183
-rw-r--r--contrib/tools/python3/Lib/argparse.py132
-rw-r--r--contrib/tools/python3/Lib/asyncio/__main__.py6
-rw-r--r--contrib/tools/python3/Lib/asyncio/base_events.py18
-rw-r--r--contrib/tools/python3/Lib/asyncio/futures.py6
-rw-r--r--contrib/tools/python3/Lib/asyncio/sslproto.py5
-rw-r--r--contrib/tools/python3/Lib/asyncio/staggered.py18
-rw-r--r--contrib/tools/python3/Lib/asyncio/taskgroups.py41
-rw-r--r--contrib/tools/python3/Lib/bdb.py5
-rw-r--r--contrib/tools/python3/Lib/calendar.py16
-rw-r--r--contrib/tools/python3/Lib/concurrent/futures/process.py52
-rw-r--r--contrib/tools/python3/Lib/concurrent/futures/thread.py1
-rw-r--r--contrib/tools/python3/Lib/email/_policybase.py4
-rw-r--r--contrib/tools/python3/Lib/email/policy.py4
-rw-r--r--contrib/tools/python3/Lib/ensurepip/__init__.py2
-rw-r--r--contrib/tools/python3/Lib/enum.py16
-rw-r--r--contrib/tools/python3/Lib/functools.py14
-rw-r--r--contrib/tools/python3/Lib/importlib/__init__.py2
-rw-r--r--contrib/tools/python3/Lib/importlib/_bootstrap_external.py6
-rw-r--r--contrib/tools/python3/Lib/inspect.py14
-rw-r--r--contrib/tools/python3/Lib/json/decoder.py9
-rw-r--r--contrib/tools/python3/Lib/json/scanner.py2
-rw-r--r--contrib/tools/python3/Lib/logging/config.py14
-rw-r--r--contrib/tools/python3/Lib/multiprocessing/connection.py2
-rw-r--r--contrib/tools/python3/Lib/multiprocessing/forkserver.py2
-rw-r--r--contrib/tools/python3/Lib/multiprocessing/managers.py33
-rw-r--r--contrib/tools/python3/Lib/multiprocessing/synchronize.py4
-rw-r--r--contrib/tools/python3/Lib/ntpath.py49
-rw-r--r--contrib/tools/python3/Lib/nturl2path.py54
-rw-r--r--contrib/tools/python3/Lib/pathlib.py4
-rwxr-xr-xcontrib/tools/python3/Lib/pdb.py5
-rw-r--r--contrib/tools/python3/Lib/pickle.py9
-rw-r--r--contrib/tools/python3/Lib/pickletools.py11
-rw-r--r--contrib/tools/python3/Lib/pydoc_data/topics.py824
-rw-r--r--contrib/tools/python3/Lib/re/_compiler.py23
-rw-r--r--contrib/tools/python3/Lib/reprlib.py31
-rw-r--r--contrib/tools/python3/Lib/shutil.py22
-rw-r--r--contrib/tools/python3/Lib/site.py5
-rw-r--r--contrib/tools/python3/Lib/sysconfig.py18
-rw-r--r--contrib/tools/python3/Lib/token.py3
-rw-r--r--contrib/tools/python3/Lib/tokenize.py2
-rw-r--r--contrib/tools/python3/Lib/typing.py3
-rw-r--r--contrib/tools/python3/Lib/unittest/async_case.py1
-rw-r--r--contrib/tools/python3/Lib/unittest/mock.py9
-rw-r--r--contrib/tools/python3/Lib/urllib/request.py19
-rw-r--r--contrib/tools/python3/Lib/venv/__init__.py42
-rw-r--r--contrib/tools/python3/Lib/venv/scripts/common/activate15
-rw-r--r--contrib/tools/python3/Lib/venv/scripts/nt/activate.bat6
-rw-r--r--contrib/tools/python3/Lib/venv/scripts/posix/activate.csh8
-rw-r--r--contrib/tools/python3/Lib/venv/scripts/posix/activate.fish8
-rw-r--r--contrib/tools/python3/Lib/ya.make4
-rw-r--r--contrib/tools/python3/Lib/zipfile/__init__.py6
-rw-r--r--contrib/tools/python3/Lib/zipfile/_path/__init__.py2
-rw-r--r--contrib/tools/python3/Modules/_asynciomodule.c140
-rw-r--r--contrib/tools/python3/Modules/_bisectmodule.c4
-rw-r--r--contrib/tools/python3/Modules/_ctypes/_ctypes.c2
-rw-r--r--contrib/tools/python3/Modules/_datetimemodule.c169
-rw-r--r--contrib/tools/python3/Modules/_functoolsmodule.c14
-rw-r--r--contrib/tools/python3/Modules/_io/stringio.c30
-rw-r--r--contrib/tools/python3/Modules/_io/winconsoleio.c118
-rw-r--r--contrib/tools/python3/Modules/_localemodule.c54
-rw-r--r--contrib/tools/python3/Modules/_lsprof.c61
-rw-r--r--contrib/tools/python3/Modules/_pickle.c5
-rw-r--r--contrib/tools/python3/Modules/_sqlite/ya.make4
-rw-r--r--contrib/tools/python3/Modules/_sre/clinic/sre.c.h44
-rw-r--r--contrib/tools/python3/Modules/_sre/sre.c132
-rw-r--r--contrib/tools/python3/Modules/_sre/sre.h17
-rw-r--r--contrib/tools/python3/Modules/_sre/sre_lib.h44
-rw-r--r--contrib/tools/python3/Modules/_ssl.c8
-rw-r--r--contrib/tools/python3/Modules/_struct.c5
-rw-r--r--contrib/tools/python3/Modules/_threadmodule.c3
-rw-r--r--contrib/tools/python3/Modules/clinic/_cursesmodule.c.h98
-rw-r--r--contrib/tools/python3/Modules/clinic/posixmodule.c.h40
-rw-r--r--contrib/tools/python3/Modules/itertoolsmodule.c43
-rw-r--r--contrib/tools/python3/Modules/posixmodule.c20
-rw-r--r--contrib/tools/python3/Modules/socketmodule.c5
-rw-r--r--contrib/tools/python3/Modules/timemodule.c254
-rw-r--r--contrib/tools/python3/Objects/complexobject.c2
-rw-r--r--contrib/tools/python3/Objects/dictobject.c4
-rw-r--r--contrib/tools/python3/Objects/exceptions.c111
-rw-r--r--contrib/tools/python3/Objects/memoryobject.c1
-rw-r--r--contrib/tools/python3/Objects/object.c22
-rw-r--r--contrib/tools/python3/Objects/typeobject.c12
-rw-r--r--contrib/tools/python3/Objects/unicodeobject.c68
-rw-r--r--contrib/tools/python3/Parser/action_helpers.c9
-rw-r--r--contrib/tools/python3/Python/Python-ast.c13
-rw-r--r--contrib/tools/python3/Python/compile.c11
-rw-r--r--contrib/tools/python3/Python/deepfreeze/deepfreeze.c648
-rw-r--r--contrib/tools/python3/Python/frozen_modules/_collections_abc.h1188
-rw-r--r--contrib/tools/python3/Python/frozen_modules/importlib._bootstrap_external.h6659
-rw-r--r--contrib/tools/python3/Python/frozen_modules/ntpath.h3234
-rw-r--r--contrib/tools/python3/Python/frozen_modules/site.h1292
-rw-r--r--contrib/tools/python3/Python/future.c12
-rw-r--r--contrib/tools/python3/Python/import.c10
-rw-r--r--contrib/tools/python3/Python/pylifecycle.c8
-rw-r--r--contrib/tools/python3/Python/pystate.c8
-rw-r--r--contrib/tools/python3/Python/traceback.c23
-rw-r--r--contrib/tools/python3/README.rst4
-rw-r--r--contrib/tools/python3/bin/ya.make4
-rw-r--r--contrib/tools/python3/patches/124938.patch81
-rw-r--r--contrib/tools/python3/patches/pr127876-fix-segfault.patch29
-rw-r--r--contrib/tools/python3/ya.make4
-rw-r--r--library/cpp/regex/hyperscan/hyperscan.cpp16
-rw-r--r--library/cpp/regex/hyperscan/hyperscan.h2
-rw-r--r--library/cpp/regex/hyperscan/ut/hyperscan_ut.cpp1
-rw-r--r--library/cpp/regex/hyperscan/ya.make1
-rw-r--r--library/cpp/tld/tlds-alpha-by-domain.txt2
-rw-r--r--library/cpp/yt/misc/typeid-inl.h49
-rw-r--r--library/cpp/yt/misc/typeid.h27
-rw-r--r--library/cpp/yt/misc/unittests/typeid_sample.cpp (renamed from yt/yt/library/stockpile/public.h)10
-rw-r--r--library/cpp/yt/misc/unittests/typeid_sample.h (renamed from yt/yt/library/program/private.h)10
-rw-r--r--library/cpp/yt/misc/unittests/typeid_ut.cpp25
-rw-r--r--library/cpp/yt/misc/unittests/ya.make2
-rw-r--r--library/cpp/yt/stockpile/README.md12
-rw-r--r--library/cpp/yt/stockpile/stockpile.h52
-rw-r--r--library/cpp/yt/stockpile/stockpile_linux.cpp158
-rw-r--r--library/cpp/yt/stockpile/ya.make18
-rw-r--r--library/cpp/yt/yson_string/convert.cpp416
-rw-r--r--library/cpp/yt/yson_string/convert.h101
-rw-r--r--library/python/monlib/metric_registry.pxd1
-rw-r--r--library/python/monlib/metric_registry.pyx3
-rw-r--r--library/python/monlib/ut/py2/test.py91
-rw-r--r--library/python/monlib/ut/py3/test.py91
-rw-r--r--util/generic/fwd.h3
-rw-r--r--util/generic/hash.pxd12
-rw-r--r--util/generic/hash_set.pxd6
-rw-r--r--util/generic/ptr.pxd3
-rw-r--r--util/generic/string.pxd2
-rwxr-xr-xya20
-rw-r--r--ydb/ci/rightlib.txt2
-rw-r--r--yql/essentials/core/cbo/cbo_hints.cpp39
-rw-r--r--yql/essentials/core/services/mounts/ya.make1
-rw-r--r--yql/essentials/core/services/mounts/yql_mounts.cpp2
-rw-r--r--yql/essentials/core/type_ann/type_ann_core.cpp5
-rw-r--r--yql/essentials/minikql/comp_nodes/ut/mkql_block_map_join_ut.cpp17
-rw-r--r--yql/essentials/minikql/dom/make.cpp1
-rw-r--r--yql/essentials/minikql/dom/node.cpp4
-rw-r--r--yql/essentials/minikql/dom/node.h2
-rw-r--r--yql/essentials/minikql/mkql_program_builder.cpp2
-rw-r--r--yql/essentials/minikql/mkql_runtime_version.h2
-rw-r--r--yql/essentials/parser/pg_catalog/catalog.cpp3
-rw-r--r--yql/essentials/parser/pg_catalog/ya.make1
-rw-r--r--yql/essentials/parser/pg_wrapper/ut/codegen_ut.cpp22
-rw-r--r--yql/essentials/parser/pg_wrapper/ut/ya.make6
-rw-r--r--yql/essentials/parser/pg_wrapper/ya.make2
-rw-r--r--yql/essentials/providers/common/udf_resolve/yql_outproc_udf_resolver.cpp5
-rw-r--r--yql/essentials/providers/pure/ut/ya.make23
-rw-r--r--yql/essentials/providers/pure/ut/yql_pure_provider_ut.cpp270
-rw-r--r--yql/essentials/providers/pure/ya.make4
-rw-r--r--yql/essentials/providers/pure/yql_pure_provider.cpp50
-rw-r--r--yql/essentials/sql/v1/SQLv1.g.in14
-rw-r--r--yql/essentials/sql/v1/SQLv1Antlr4.g.in14
-rw-r--r--yql/essentials/sql/v1/format/sql_format.cpp5
-rw-r--r--yql/essentials/sql/v1/format/sql_format_ut.h12
-rw-r--r--yql/essentials/sql/v1/node.h8
-rw-r--r--yql/essentials/sql/v1/select.cpp4
-rw-r--r--yql/essentials/sql/v1/sql_query.cpp30
-rw-r--r--yql/essentials/sql/v1/sql_translation.cpp81
-rw-r--r--yql/essentials/sql/v1/sql_translation.h2
-rw-r--r--yql/essentials/sql/v1/sql_ut.cpp76
-rw-r--r--yql/essentials/sql/v1/sql_ut_antlr4.cpp76
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/result.json18
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_aggregate-group_by_session_nopush_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-add_bitcast_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-div_bitcast_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mod_bitcast_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mul_bitcast_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-sub_bitcast_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_column_group-hint_/formatted.sql12
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_datetime-date_tz_compare_diff_zones_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-cast_string_implicit_/formatted.sql37
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-dict_builtins_null_lookup_/formatted.sql6
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_ansi_join_/formatted.sql37
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_noansi_join_/formatted.sql37
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_ansi_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_/formatted.sql4
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_only_sorted_merge_/formatted.sql4
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_cbo_3_tables_/formatted.sql4
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_left_cbo_/formatted.sql4
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_right_cbo_/formatted.sql4
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-decimal_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-tzdate_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-uuid_/formatted.sql9
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_match_recognize-all_rows_per_match_/formatted.sql6
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_order_by-order_by_missing_project_column_nosimple_/formatted.sql46
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_params-primitives_/formatted.sql16
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_udf_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-subquery_expr_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_schema-user_schema_with_sort_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-named_args_for_script_with_posargs_reuse_args_fail_/formatted.sql3
-rw-r--r--yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-wrong_args_fail_/formatted.sql12
-rw-r--r--yql/essentials/tests/sql/sql2yql/ya.make4
-rw-r--r--yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.sql32
-rwxr-xr-xyql/essentials/tools/minirun/apply_patches.sh14
-rw-r--r--yql/essentials/tools/minirun/minirun.cpp1
-rw-r--r--yql/essentials/tools/minirun/patches/01_no_icu.patch93
-rw-r--r--yql/essentials/tools/udf_resolver/udf_resolver.cpp1
-rw-r--r--yql/essentials/tools/yql_facade_run/yql_facade_run.cpp2
-rw-r--r--yql/essentials/tools/yql_facade_run/yql_facade_run.h1
-rw-r--r--yql/essentials/udfs/common/digest/digest_udf.cpp165
-rw-r--r--yql/essentials/udfs/common/digest/test/canondata/result.json5
-rw-r--r--yql/essentials/udfs/common/digest/test/canondata/test.test_Init_/results.txt202
-rw-r--r--yql/essentials/udfs/common/digest/test/cases/Init.cfg1
-rw-r--r--yql/essentials/udfs/common/digest/test/cases/Init.sql11
-rw-r--r--yql/essentials/udfs/common/hyperscan/test/canondata/test.test_Error_/extracted2
-rw-r--r--yql/essentials/udfs/common/yson2/test/canondata/test.test_From_/results.txt10
-rw-r--r--yql/essentials/udfs/common/yson2/test/cases/From.sql1
-rw-r--r--yql/essentials/udfs/common/yson2/yson2_udf.cpp1
-rw-r--r--yql/essentials/utils/log/profile.cpp47
-rw-r--r--yt/cpp/mapreduce/client/client.cpp26
-rw-r--r--yt/cpp/mapreduce/client/client_reader.cpp105
-rw-r--r--yt/cpp/mapreduce/client/client_reader.h5
-rw-r--r--yt/cpp/mapreduce/client/file_reader.cpp172
-rw-r--r--yt/cpp/mapreduce/client/file_reader.h26
-rw-r--r--yt/cpp/mapreduce/common/retry_lib.cpp5
-rw-r--r--yt/cpp/mapreduce/common/retry_lib.h1
-rw-r--r--yt/cpp/mapreduce/http/http_client.h29
-rw-r--r--yt/cpp/mapreduce/http/retry_request.cpp19
-rw-r--r--yt/cpp/mapreduce/http/retry_request.h2
-rw-r--r--yt/cpp/mapreduce/interface/client_method_options.h9
-rw-r--r--yt/cpp/mapreduce/interface/raw_client.h31
-rw-r--r--yt/cpp/mapreduce/io/helpers.h4
-rw-r--r--yt/cpp/mapreduce/raw_client/raw_client.cpp187
-rw-r--r--yt/cpp/mapreduce/raw_client/raw_client.h24
-rw-r--r--yt/cpp/mapreduce/raw_client/raw_requests.cpp44
-rw-r--r--yt/cpp/mapreduce/raw_client/raw_requests.h9
-rw-r--r--yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.cpp50
-rw-r--r--yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.h12
-rw-r--r--yt/python/yt/yson/__init__.py2
-rw-r--r--yt/yql/providers/yt/comp_nodes/dq/dq_yt_block_reader.cpp2
-rw-r--r--yt/yql/providers/yt/gateway/native/ut/ya.make6
-rw-r--r--yt/yql/providers/yt/gateway/native/ut/yql_yt_native_folders_ut.cpp366
-rw-r--r--yt/yql/providers/yt/lib/ut_common/ya.make (renamed from yql/essentials/core/ut_common/ya.make)8
-rw-r--r--yt/yql/providers/yt/lib/ut_common/yql_ut_common.cpp (renamed from yql/essentials/core/ut_common/yql_ut_common.cpp)0
-rw-r--r--yt/yql/providers/yt/lib/ut_common/yql_ut_common.h (renamed from yql/essentials/core/ut_common/yql_ut_common.h)0
-rw-r--r--yt/yql/providers/yt/provider/ut/ya.make3
-rw-r--r--yt/yt/client/arrow/arrow_row_stream_encoder.cpp1114
-rw-r--r--yt/yt/client/arrow/arrow_row_stream_encoder.h1
-rw-r--r--yt/yt/client/arrow/ya.make2
-rw-r--r--yt/yt/client/driver/proxy_discovery_cache.cpp18
-rw-r--r--yt/yt/client/signature/public.h11
-rw-r--r--yt/yt/client/signature/signature.cpp64
-rw-r--r--yt/yt/client/signature/signature.h45
-rw-r--r--yt/yt/client/signature/unittests/signature_ut.cpp54
-rw-r--r--yt/yt/client/signature/unittests/ya.make (renamed from yt/yt/library/oom/unittests/ya.make)11
-rw-r--r--yt/yt/client/ya.make3
-rw-r--r--yt/yt/core/bus/tcp/config.h6
-rw-r--r--yt/yt/core/bus/tcp/configure_dispatcher.cpp41
-rw-r--r--yt/yt/core/bus/tcp/dispatcher.cpp1
-rw-r--r--yt/yt/core/bus/tcp/public.h4
-rw-r--r--yt/yt/core/concurrency/configure_fiber_manager.cpp41
-rw-r--r--yt/yt/core/concurrency/coroutine.h2
-rw-r--r--yt/yt/core/concurrency/execution_stack.h5
-rw-r--r--yt/yt/core/concurrency/new_fair_share_thread_pool.cpp20
-rw-r--r--yt/yt/core/concurrency/public.h5
-rw-r--r--yt/yt/core/logging/configure_log_manager.cpp51
-rw-r--r--yt/yt/core/logging/public.h5
-rw-r--r--yt/yt/core/misc/configurable_singleton_decl-inl.h33
-rw-r--r--yt/yt/core/misc/configurable_singleton_decl.h16
-rw-r--r--yt/yt/core/misc/configurable_singleton_def-inl.h150
-rw-r--r--yt/yt/core/misc/configurable_singleton_def.cpp151
-rw-r--r--yt/yt/core/misc/configurable_singleton_def.h93
-rw-r--r--yt/yt/core/misc/public.h5
-rw-r--r--yt/yt/core/misc/unittests/configurable_singleton_ut.cpp234
-rw-r--r--yt/yt/core/misc/unittests/ya.make1
-rw-r--r--yt/yt/core/net/address.cpp1
-rw-r--r--yt/yt/core/net/configure_address_resolver.cpp28
-rw-r--r--yt/yt/core/net/public.h6
-rw-r--r--yt/yt/core/rpc/configure_dispatcher.cpp41
-rw-r--r--yt/yt/core/rpc/dispatcher.cpp1
-rw-r--r--yt/yt/core/rpc/grpc/configure_dispatcher.cpp28
-rw-r--r--yt/yt/core/rpc/grpc/public.h4
-rw-r--r--yt/yt/core/rpc/grpc/ya.make1
-rw-r--r--yt/yt/core/rpc/http/server.cpp5
-rw-r--r--yt/yt/core/rpc/public.h4
-rw-r--r--yt/yt/core/service_discovery/yp/configure_service_discovery.cpp30
-rw-r--r--yt/yt/core/service_discovery/yp/public.h3
-rw-r--r--yt/yt/core/service_discovery/yp/ya.make1
-rw-r--r--yt/yt/core/ya.make7
-rw-r--r--yt/yt/core/yson/configure_protobuf_interop.cpp41
-rw-r--r--yt/yt/core/yson/public.h3
-rw-r--r--yt/yt/core/yson/string.h2
-rw-r--r--yt/yt/core/yson/token.h2
-rw-r--r--yt/yt/core/yson/writer.cpp26
-rw-r--r--yt/yt/core/ytree/unittests/text_yson_convert_ut.cpp273
-rw-r--r--yt/yt/core/ytree/unittests/ya.make1
-rw-r--r--yt/yt/core/ytree/ypath_client.h2
-rw-r--r--yt/yt/library/backtrace_introspector/http/handler.cpp87
-rw-r--r--yt/yt/library/backtrace_introspector/http/handler.h20
-rw-r--r--yt/yt/library/backtrace_introspector/http/ya.make16
-rw-r--r--yt/yt/library/backtrace_introspector/introspect.cpp224
-rw-r--r--yt/yt/library/backtrace_introspector/introspect.h57
-rw-r--r--yt/yt/library/backtrace_introspector/introspect_dummy.cpp14
-rw-r--r--yt/yt/library/backtrace_introspector/introspect_linux.cpp217
-rw-r--r--yt/yt/library/backtrace_introspector/private.h16
-rw-r--r--yt/yt/library/backtrace_introspector/public.h12
-rw-r--r--yt/yt/library/backtrace_introspector/unittests/introspect_ut.cpp198
-rw-r--r--yt/yt/library/backtrace_introspector/unittests/ya.make15
-rw-r--r--yt/yt/library/backtrace_introspector/ya.make31
-rw-r--r--yt/yt/library/formats/arrow_parser.cpp22
-rw-r--r--yt/yt/library/formats/unittests/arrow_parser_ut.cpp690
-rw-r--r--yt/yt/library/formats/unittests/dsv_parser_ut.cpp365
-rw-r--r--yt/yt/library/formats/unittests/dsv_writer_ut.cpp316
-rw-r--r--yt/yt/library/formats/unittests/format_writer_ut.h36
-rw-r--r--yt/yt/library/formats/unittests/protobuf_format_ut.cpp4659
-rw-r--r--yt/yt/library/formats/unittests/protobuf_format_ut.proto255
-rw-r--r--yt/yt/library/formats/unittests/row_helpers.cpp70
-rw-r--r--yt/yt/library/formats/unittests/row_helpers.h111
-rw-r--r--yt/yt/library/formats/unittests/schemaful_dsv_parser_ut.cpp248
-rw-r--r--yt/yt/library/formats/unittests/schemaful_dsv_writer_ut.cpp346
-rw-r--r--yt/yt/library/formats/unittests/skiff_format_ut.cpp3028
-rw-r--r--yt/yt/library/formats/unittests/skiff_yson_converter_ut.cpp707
-rw-r--r--yt/yt/library/formats/unittests/value_examples.cpp163
-rw-r--r--yt/yt/library/formats/unittests/value_examples.h24
-rw-r--r--yt/yt/library/formats/unittests/web_json_writer_ut.cpp1714
-rw-r--r--yt/yt/library/formats/unittests/ya.make53
-rw-r--r--yt/yt/library/formats/unittests/yaml_parser_ut.cpp598
-rw-r--r--yt/yt/library/formats/unittests/yaml_writer_ut.cpp319
-rw-r--r--yt/yt/library/formats/unittests/yamr_parser_ut.cpp601
-rw-r--r--yt/yt/library/formats/unittests/yamr_writer_ut.cpp645
-rw-r--r--yt/yt/library/formats/unittests/yamred_dsv_parser_ut.cpp185
-rw-r--r--yt/yt/library/formats/unittests/yamred_dsv_writer_ut.cpp424
-rw-r--r--yt/yt/library/formats/unittests/yson_helpers.cpp29
-rw-r--r--yt/yt/library/formats/unittests/yson_helpers.h (renamed from library/cpp/yt/stockpile/stockpile_other.cpp)7
-rw-r--r--yt/yt/library/monitoring/http_integration.cpp209
-rw-r--r--yt/yt/library/monitoring/http_integration.h28
-rw-r--r--yt/yt/library/monitoring/monitoring_manager.cpp177
-rw-r--r--yt/yt/library/monitoring/monitoring_manager.h55
-rw-r--r--yt/yt/library/monitoring/private.h15
-rw-r--r--yt/yt/library/monitoring/public.h13
-rw-r--r--yt/yt/library/monitoring/ya.make27
-rw-r--r--yt/yt/library/oom/oom.cpp144
-rw-r--r--yt/yt/library/oom/oom.h21
-rw-r--r--yt/yt/library/oom/unittests/oom_ut.cpp41
-rw-r--r--yt/yt/library/oom/ya.make20
-rw-r--r--yt/yt/library/process/config.cpp34
-rw-r--r--yt/yt/library/process/config.h43
-rw-r--r--yt/yt/library/process/configure_io_dispatcher.cpp41
-rw-r--r--yt/yt/library/process/io_dispatcher.cpp10
-rw-r--r--yt/yt/library/process/io_dispatcher.h19
-rw-r--r--yt/yt/library/process/public.h8
-rw-r--r--yt/yt/library/process/unittests/pipes_ut.cpp432
-rw-r--r--yt/yt/library/process/unittests/process_ut.cpp242
-rw-r--r--yt/yt/library/process/unittests/subprocess_ut.cpp111
-rw-r--r--yt/yt/library/process/unittests/ya.make22
-rw-r--r--yt/yt/library/process/ya.make2
-rw-r--r--yt/yt/library/profiling/resource_tracker/configure_resource_tracker.cpp28
-rw-r--r--yt/yt/library/profiling/resource_tracker/public.h6
-rw-r--r--yt/yt/library/profiling/resource_tracker/resource_tracker.cpp1
-rw-r--r--yt/yt/library/profiling/resource_tracker/ya.make1
-rw-r--r--yt/yt/library/profiling/solomon/config.cpp3
-rw-r--r--yt/yt/library/profiling/solomon/config.h1
-rw-r--r--yt/yt/library/profiling/solomon/exporter.cpp3
-rw-r--r--yt/yt/library/profiling/solomon/helpers.cpp37
-rw-r--r--yt/yt/library/profiling/solomon/helpers.h2
-rw-r--r--yt/yt/library/program/config.cpp61
-rw-r--r--yt/yt/library/program/config.h77
-rw-r--r--yt/yt/library/program/helpers.cpp101
-rw-r--r--yt/yt/library/program/helpers.h4
-rw-r--r--yt/yt/library/program/program.cpp2
-rw-r--r--yt/yt/library/program/program.h2
-rw-r--r--yt/yt/library/program/public.h2
-rw-r--r--yt/yt/library/program/ya.make11
-rw-r--r--yt/yt/library/stockpile/config.cpp61
-rw-r--r--yt/yt/library/stockpile/config.h45
-rw-r--r--yt/yt/library/stockpile/ya.make14
-rw-r--r--yt/yt/library/tcmalloc/configure_tcmalloc_manager.cpp36
-rw-r--r--yt/yt/library/tcmalloc/public.h6
-rw-r--r--yt/yt/library/tcmalloc/ya.make1
-rw-r--r--yt/yt/library/tracing/jaeger/configure_tracer.cpp43
-rw-r--r--yt/yt/library/tracing/jaeger/public.h6
-rw-r--r--yt/yt/library/tracing/jaeger/tracer.cpp1
-rw-r--r--yt/yt/library/tracing/jaeger/ya.make4
-rw-r--r--yt/yt/library/tvm/service/unittests/ya.make19
640 files changed, 31113 insertions, 45599 deletions
diff --git a/build/conf/java.conf b/build/conf/java.conf
index 114f78cd95..c83a583526 100644
--- a/build/conf/java.conf
+++ b/build/conf/java.conf
@@ -423,6 +423,7 @@ macro _SEM_JAR_SOURCE_SET(SRCDIR=".", PACKAGE_PREFIX="", EXCLUDE[], FILES[], RES
macro FULL_JAVA_SRCS(Args...) {
_IDEA_JAVA_SRCS_VALUE($Args)
_JAVA_SRCS($Args)
+ _SEM_JAR_SOURCE_SET($Args)
}
# tag:java-specific
diff --git a/build/conf/proto.conf b/build/conf/proto.conf
index 7f1194e32b..988206de22 100644
--- a/build/conf/proto.conf
+++ b/build/conf/proto.conf
@@ -511,18 +511,6 @@ macro _JAVA_PROTO_CMD(File) {
.SEM=proto_files ${input;rootrel:File} ${hide;output:File.jsrc}
}
-
-# tag:proto tag:perl-specific tag:deprecated
-### @usage: XS_PROTO(InputProto Dir Outputs...) # deprecated
-###
-### Generate Perl code from protobuf.
-### In order to use this macro one should predict all outputs protoc will emit from input_proto file and enlist those as outputs.
-macro XS_PROTO(File, Dir, Outputs...) {
- .CMD=${PROTOC_OLD} -I=${ARCADIA_ROOT}/${Dir} ${pre=-I=:_PROTO__INCLUDE} -I=${ARCADIA_ROOT} -I=${PROTOBUF_OLD_PATH} --perlxs_out=${BINDIR} $_PROTOC_FLAGS ${input:File} ${hide;output:Outputs} ${induced_deps=h+cpp;hide;nopath;noext;suf=.pb.h:File} ${hide:PROTO_FAKEID}
- PEERDIR(${Dir})
- ADDINCL(${ARCADIA_BUILD_ROOT}/${Dir})
-}
-
# tag:proto tag:python-specific
when ($PY_PROTOS_FOR == "yes") {
PEERDIR+=contrib/libs/protobuf/python
diff --git a/build/conf/settings.conf b/build/conf/settings.conf
index 87b1ba4203..2094fce5c5 100644
--- a/build/conf/settings.conf
+++ b/build/conf/settings.conf
@@ -127,4 +127,3 @@ ARCADIA_TEST_ROOT=../arcadia_tests_data/
DEFAULT_REQUIREMENTS=network:restricted cpu:1 ram:32
AUTOINCLUDE_PATHS=build/conf/autoincludes.json
-LINTERS_MAKE_FILENAME=linters.make.inc
diff --git a/build/conf/ts/ts_test.conf b/build/conf/ts/ts_test.conf
index c468139336..79f3d79bf2 100644
--- a/build/conf/ts/ts_test.conf
+++ b/build/conf/ts/ts_test.conf
@@ -35,7 +35,7 @@ module TS_TEST_JEST_FOR: _TS_TEST_BASE {
SET(PEERDIR_TAGS TS TS_PROTO TS_PROTO_FROM_SCHEMA)
# compatibility with old TS_TEST_SRCS
- SET(TS_TEST_EXTENSION test.(ts|tsx|js|jsx))
+ SET(TS_TEST_EXTENSION (test|spec).(ts|tsx|mts|cts|js|jsx|mjs|cjs))
SET(TS_TEST_EXTRA_SRCS_MASK /**/__mocks__/*)
# nots.py will decide if we need to depend on the testing target module output
diff --git a/build/export_generators/ide-gradle/build.gradle.kts.jinja b/build/export_generators/ide-gradle/build.gradle.kts.jinja
index d0a9040f05..36aa47faa9 100644
--- a/build/export_generators/ide-gradle/build.gradle.kts.jinja
+++ b/build/export_generators/ide-gradle/build.gradle.kts.jinja
@@ -1,14 +1,3 @@
-{%- macro OutDirs(run, prefix, suffix) -%}
-{%- if run.args|length and run.out_dir|length -%}
-{%- for out_dir in run.out_dir -%}
-{%- set out_dirs = select_by_ends(run.args, "/" + out_dir) -%}
-{%- if out_dirs|length %}
-{{ prefix }}{{ out_dirs|first }}{{ suffix }}
-{%- endif -%}
-{%- endfor -%}
-{%- endif -%}
-{%- endmacro -%}
-
{%- include "[generator]/vars.jinja" -%}
{%- include "[generator]/import.jinja" -%}
{%- include "[generator]/repositories.jinja" -%}
diff --git a/build/export_generators/ide-gradle/generator.toml b/build/export_generators/ide-gradle/generator.toml
index b618430b2c..afc18c34ce 100644
--- a/build/export_generators/ide-gradle/generator.toml
+++ b/build/export_generators/ide-gradle/generator.toml
@@ -88,4 +88,5 @@ test=[
"/src/test/java",
"/src/test-integration",
"/src/testFixtures",
+ "/src/intTest",
]
diff --git a/build/export_generators/ide-gradle/jdk.jinja b/build/export_generators/ide-gradle/jdk.jinja
new file mode 100644
index 0000000000..01fbc09daf
--- /dev/null
+++ b/build/export_generators/ide-gradle/jdk.jinja
@@ -0,0 +1,24 @@
+{#- default JDK version -#}
+{%- set jdk_version = '17' -%}
+{%- if target.required_jdk -%}
+{%- set jdk_version = target.required_jdk -%}
+{%- elif target.jdk_version -%}
+{%- set jdk_version = target.jdk_version -%}
+{%- elif not target and extra_targets|length -%}
+{%- set extra_jdk_version = extra_targets|selectattr('jdk_version')|map(attribute='jdk_version')|first -%}
+{%- if extra_jdk_version -%}
+{%- set jdk_version = extra_jdk_version -%}
+{%- endif -%}
+{%- endif -%}
+
+{%- set jdk_path = false -%}
+{%- if target.jdk_path and target.jdk_path != "NOT_FOUND" -%}
+{%- set jdk_path = target.jdk_path -%}
+{#- If no main target, but exists extra_targets -#}
+{%- elif not target and extra_targets|length -%}
+{%- set jdk_path_targets = extra_targets|selectattr('jdk_path')|rejectattr('jdk_path', 'eq', 'NOT_FOUND') -%}
+{%- if jdk_path_targets|length -%}
+{%- set jdk_path_target = jdk_path_targets|first -%}
+{%- set jdk_path = jdk_path_target.jdk_path -%}
+{%- endif -%}
+{%- endif -%}
diff --git a/build/export_generators/ide-gradle/kotlin_plugins.jinja b/build/export_generators/ide-gradle/kotlin_plugins.jinja
index df0f65de36..823fa5243d 100644
--- a/build/export_generators/ide-gradle/kotlin_plugins.jinja
+++ b/build/export_generators/ide-gradle/kotlin_plugins.jinja
@@ -59,6 +59,6 @@ noArg {
{%- if with_kotlin %}
kotlin {
- jvmToolchain({{ required_jdk }})
+ jvmToolchain({{ jdk_version }})
}
{% endif -%}
diff --git a/build/export_generators/ide-gradle/plugins.jinja b/build/export_generators/ide-gradle/plugins.jinja
index 13a46003be..25768f55ee 100644
--- a/build/export_generators/ide-gradle/plugins.jinja
+++ b/build/export_generators/ide-gradle/plugins.jinja
@@ -35,12 +35,11 @@ plugins {
{%- endif %}
}
-{#- language level -#}
-{%- if has_required_jdk %}
+{%- if jdk_version %}
java {
toolchain {
- languageVersion = JavaLanguageVersion.of("{{ required_jdk }}")
+ languageVersion = JavaLanguageVersion.of("{{ jdk_version }}")
}
}
-{%- endif -%}
+{% endif -%}
diff --git a/build/export_generators/ide-gradle/preview.jinja b/build/export_generators/ide-gradle/preview.jinja
index 18aa8fcd2d..5864b5171d 100644
--- a/build/export_generators/ide-gradle/preview.jinja
+++ b/build/export_generators/ide-gradle/preview.jinja
@@ -3,7 +3,7 @@
tasks.withType<JavaCompile> {
options.compilerArgs.add("--enable-preview")
options.compilerArgs.add("-Xlint:preview")
- options.release.set({{ required_jdk }})
+ options.release.set({{ jdk_version }})
}
tasks.withType<JavaExec> {
@@ -17,7 +17,7 @@ tasks.withType<Test> {
tasks.withType<Javadoc> {
val javadocOptions = options as CoreJavadocOptions
- javadocOptions.addStringOption("source", "{{ required_jdk }}")
+ javadocOptions.addStringOption("source", "{{ jdk_version }}")
javadocOptions.addBooleanOption("-enable-preview", true)
}
{% endif -%}
diff --git a/build/export_generators/ide-gradle/proto_plugins.jinja b/build/export_generators/ide-gradle/proto_plugins.jinja
index a5bb76d758..655614672d 100644
--- a/build/export_generators/ide-gradle/proto_plugins.jinja
+++ b/build/export_generators/ide-gradle/proto_plugins.jinja
@@ -7,3 +7,12 @@ plugins {
`signing`
{%- endif %}
}
+
+{%- if jdk_version %}
+
+java {
+ toolchain {
+ languageVersion = JavaLanguageVersion.of("{{ jdk_version }}")
+ }
+}
+{%- endif -%}
diff --git a/build/export_generators/ide-gradle/proto_vars.jinja b/build/export_generators/ide-gradle/proto_vars.jinja
index 45fa6d7bb7..761c74b070 100644
--- a/build/export_generators/ide-gradle/proto_vars.jinja
+++ b/build/export_generators/ide-gradle/proto_vars.jinja
@@ -1,2 +1,4 @@
{%- set publish = target.publish -%}
{%- set libraries = target.consumer|selectattr('type', 'eq', 'library') -%}
+
+{%- include "[generator]/jdk.jinja" -%}
diff --git a/build/export_generators/ide-gradle/run_java_program.jinja b/build/export_generators/ide-gradle/run_java_program.jinja
index 6f0597a86a..f28ef430cc 100644
--- a/build/export_generators/ide-gradle/run_java_program.jinja
+++ b/build/export_generators/ide-gradle/run_java_program.jinja
@@ -26,25 +26,31 @@ val runJav{{ loop.index }} = task<JavaExec>("runJavaProgram{{ loop.index }}") {
)
{% endif -%}
-{%- if run.in_dir %}
-{% for in_dir in run.in_dir -%}
+{%- if run.in_dir -%}
+{%- for in_dir in run.in_dir %}
inputs.files(fileTree("{{ in_dir }}"))
{% endfor -%}
{%- endif -%}
-{%- if run.in %}
-{% for in_file in run.in -%}
+
+{%- if run.in -%}
+{%- for in_file in run.in %}
inputs.files("{{ in_file }}")
{% endfor -%}
{%- endif -%}
-{{ OutDirs(run, ' outputs.dir("', '")') }}
-{#
+{%- if run.out_dir|length -%}
+{%- for out_dir in run.out_dir|unique %}
+ outputs.dir("{{ out_dir }}")
+{%- endfor -%}
+{%- endif -%}
+{#-
Не использованы аттрибуты
+ run-out="list"
run-cwd="str"
run-in_dirs_inputs="list"
run-in_noparse="list"
run-tool="list"
--#}
+#}
}
tasks.getByName("sourcesJar").dependsOn(runJav{{ loop.index }})
@@ -52,5 +58,11 @@ tasks.getByName("sourcesJar").dependsOn(runJav{{ loop.index }})
tasks.compileJava.configure {
dependsOn(runJav{{ loop.index }})
}
+{%- if with_kotlin %}
+
+tasks.compileKotlin.configure {
+ dependsOn(runJav{{ loop.index }})
+}
+{%- endif %}
{% endfor -%}
{% endif -%}
diff --git a/build/export_generators/ide-gradle/source_sets.jinja b/build/export_generators/ide-gradle/source_sets.jinja
index 75268d66aa..24965370d5 100644
--- a/build/export_generators/ide-gradle/source_sets.jinja
+++ b/build/export_generators/ide-gradle/source_sets.jinja
@@ -1,6 +1,6 @@
{#- empty string #}
sourceSets {
-{%- if target.runs|length %}
+{%- if target.runs|length or target.jar_source_set|length %}
main {
{#-
Default by Gradle:
@@ -9,9 +9,15 @@ sourceSets {
resources.srcDir("src/main/resources")
#}
-{%- for run in target.runs -%}
-{{ OutDirs(run, ' java.srcDir("', '")') }}
-{%- endfor %}
+{%- if target.jar_source_set|length -%}
+{%- for source_set in target.jar_source_set -%}
+{%- set srcdir_glob = split(source_set, ':') -%}
+{%- set out = srcdir_glob[0] -%}
+{%- if out != 'src/main/java' %}
+ java.srcDir("{{ out }}")
+{%- endif -%}
+{%- endfor -%}
+{%- endif %}
}
{%- endif %}
test {
@@ -30,30 +36,20 @@ sourceSets {
resources.srcDir("src/testFixtures/resources")
java.srcDir("src/intTest/java")
resources.srcDir("src/intTest/resources")
-{%- for extra_target in extra_targets -%}
-{%- if extra_target.runs|length -%}
-{%- for run in extra_target.runs -%}
-{{ OutDirs(run, ' java.srcDir("', '")') }}
-{%- endfor -%}
-{%- endif -%}
-{%- endfor %}
- }
-}
-
-{%- if target.jar_source_set|length -%}
-{%- for source_set in target.jar_source_set -%}
-{%- set srcdir_glob = split(source_set, ':') %}
-sourceSets.main.java.srcDirs += "{{ srcdir_glob[0] }}"
+{%- set extra_target_source_sets = extra_targets|selectattr('jar_source_set')|map(attribute='jar_source_set')|sum|unique -%}
+{%- if extra_target_source_sets|length -%}
+{%- for source_set in extra_target_source_sets -%}
+{%- set srcdir_glob = split(source_set, ':') -%}
+{%- set out = srcdir_glob[0] -%}
+{%- if out != 'src/test/java' %}
+ java.srcDir("{{ srcdir_glob[0] }}")
+{%- endif -%}
{%- endfor -%}
-{%- endif -%}
-
-{% for extra_target in extra_targets -%}
-{%- if extra_target.jar_source_set|length -%}
-{%- for source_set in extra_target.jar_source_set -%}
-{%- set srcdir_glob = split(source_set, ':') %}
+{%- endif %}
+ }
+}
-sourceSets.main.java.srcDirs += "{{ srcdir_glob[0] }}"
-{%- endfor -%}
-{%- endif -%}
-{%- endfor -%}
+tasks.withType<Jar>() {
+ duplicatesStrategy = DuplicatesStrategy.INCLUDE
+}
diff --git a/build/export_generators/ide-gradle/vars.jinja b/build/export_generators/ide-gradle/vars.jinja
index d8722a2b42..26f7e3621c 100644
--- a/build/export_generators/ide-gradle/vars.jinja
+++ b/build/export_generators/ide-gradle/vars.jinja
@@ -5,11 +5,4 @@
{%- set has_junit5_test = extra_targets|selectattr('junit5_test') -%}
{%- set has_errorprone = target.use_errorprone and not disable_errorprone and target.consumer|selectattr('jar', 'startsWith', 'contrib/java/com/google/errorprone/error_prone_annotations')|length -%}
-{%- if not target.required_jdk -%}
-{%- set has_required_jdk = false -%}
-{#- If no required JDK, set default JDK for Kotlin parts -#}
-{%- set required_jdk = '17' -%}
-{%- else -%}
-{%- set has_required_jdk = true -%}
-{%- set required_jdk = target.required_jdk -%}
-{%- endif -%}
+{%- include "[generator]/jdk.jinja" -%}
diff --git a/build/external_resources/ymake/public.resources.json b/build/external_resources/ymake/public.resources.json
index 206c810df4..1ef4b391df 100644
--- a/build/external_resources/ymake/public.resources.json
+++ b/build/external_resources/ymake/public.resources.json
@@ -1,19 +1,19 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:7666559958"
+ "uri": "sbr:7714082087"
},
"darwin-arm64": {
- "uri": "sbr:7666558962"
+ "uri": "sbr:7714081769"
},
"linux": {
- "uri": "sbr:7666562407"
+ "uri": "sbr:7714082818"
},
"linux-aarch64": {
- "uri": "sbr:7666556873"
+ "uri": "sbr:7714081292"
},
"win32-clang-cl": {
- "uri": "sbr:7666560929"
+ "uri": "sbr:7714082412"
}
}
}
diff --git a/build/external_resources/ymake/resources.json b/build/external_resources/ymake/resources.json
index 6ffdc2cea1..c958e7d196 100644
--- a/build/external_resources/ymake/resources.json
+++ b/build/external_resources/ymake/resources.json
@@ -1,19 +1,19 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:7666538130"
+ "uri": "sbr:7714069562"
},
"darwin-arm64": {
- "uri": "sbr:7666537615"
+ "uri": "sbr:7714068983"
},
"linux": {
- "uri": "sbr:7666539479"
+ "uri": "sbr:7714070680"
},
"linux-aarch64": {
- "uri": "sbr:7666537053"
+ "uri": "sbr:7714068462"
},
"win32-clang-cl": {
- "uri": "sbr:7666538798"
+ "uri": "sbr:7714070213"
}
}
}
diff --git a/build/mapping.conf.json b/build/mapping.conf.json
index 2972e50117..f3743e8100 100644
--- a/build/mapping.conf.json
+++ b/build/mapping.conf.json
@@ -464,6 +464,10 @@
"7658438634": "https://devtools-registry.s3.yandex.net/7658438634",
"7688925574": "https://devtools-registry.s3.yandex.net/7688925574",
"7688984774": "https://devtools-registry.s3.yandex.net/7688984774",
+ "7706167620": "https://devtools-registry.s3.yandex.net/7706167620",
+ "7706227677": "https://devtools-registry.s3.yandex.net/7706227677",
+ "7717368273": "https://devtools-registry.s3.yandex.net/7717368273",
+ "7717387253": "https://devtools-registry.s3.yandex.net/7717387253",
"5486731632": "https://devtools-registry.s3.yandex.net/5486731632",
"5514350352": "https://devtools-registry.s3.yandex.net/5514350352",
"5514360398": "https://devtools-registry.s3.yandex.net/5514360398",
@@ -647,6 +651,7 @@
"7642861686": "https://devtools-registry.s3.yandex.net/7642861686",
"7648122773": "https://devtools-registry.s3.yandex.net/7648122773",
"7666559958": "https://devtools-registry.s3.yandex.net/7666559958",
+ "7714082087": "https://devtools-registry.s3.yandex.net/7714082087",
"5766171800": "https://devtools-registry.s3.yandex.net/5766171800",
"5805430761": "https://devtools-registry.s3.yandex.net/5805430761",
"5829025456": "https://devtools-registry.s3.yandex.net/5829025456",
@@ -705,6 +710,7 @@
"7642861092": "https://devtools-registry.s3.yandex.net/7642861092",
"7648121342": "https://devtools-registry.s3.yandex.net/7648121342",
"7666558962": "https://devtools-registry.s3.yandex.net/7666558962",
+ "7714081769": "https://devtools-registry.s3.yandex.net/7714081769",
"5766173070": "https://devtools-registry.s3.yandex.net/5766173070",
"5805432830": "https://devtools-registry.s3.yandex.net/5805432830",
"5829031598": "https://devtools-registry.s3.yandex.net/5829031598",
@@ -763,6 +769,7 @@
"7642862516": "https://devtools-registry.s3.yandex.net/7642862516",
"7648125070": "https://devtools-registry.s3.yandex.net/7648125070",
"7666562407": "https://devtools-registry.s3.yandex.net/7666562407",
+ "7714082818": "https://devtools-registry.s3.yandex.net/7714082818",
"5766171341": "https://devtools-registry.s3.yandex.net/5766171341",
"5805430188": "https://devtools-registry.s3.yandex.net/5805430188",
"5829023352": "https://devtools-registry.s3.yandex.net/5829023352",
@@ -821,6 +828,7 @@
"7642860624": "https://devtools-registry.s3.yandex.net/7642860624",
"7648120215": "https://devtools-registry.s3.yandex.net/7648120215",
"7666556873": "https://devtools-registry.s3.yandex.net/7666556873",
+ "7714081292": "https://devtools-registry.s3.yandex.net/7714081292",
"5766172695": "https://devtools-registry.s3.yandex.net/5766172695",
"5805432230": "https://devtools-registry.s3.yandex.net/5805432230",
"5829029743": "https://devtools-registry.s3.yandex.net/5829029743",
@@ -879,6 +887,7 @@
"7642862140": "https://devtools-registry.s3.yandex.net/7642862140",
"7648124003": "https://devtools-registry.s3.yandex.net/7648124003",
"7666560929": "https://devtools-registry.s3.yandex.net/7666560929",
+ "7714082412": "https://devtools-registry.s3.yandex.net/7714082412",
"4307890075": "https://devtools-registry.s3.yandex.net/4307890075",
"5517245192": "https://devtools-registry.s3.yandex.net/5517245192",
"4307901240": "https://devtools-registry.s3.yandex.net/4307901240",
@@ -1596,6 +1605,10 @@
"7658438634": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"7688925574": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"7688984774": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "7706167620": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "7706227677": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "7717368273": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "7717387253": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"5486731632": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
"5514350352": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
"5514360398": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
@@ -1779,6 +1792,7 @@
"7642861686": "devtools/ymake/bin/ymake for darwin",
"7648122773": "devtools/ymake/bin/ymake for darwin",
"7666559958": "devtools/ymake/bin/ymake for darwin",
+ "7714082087": "devtools/ymake/bin/ymake for darwin",
"5766171800": "devtools/ymake/bin/ymake for darwin-arm64",
"5805430761": "devtools/ymake/bin/ymake for darwin-arm64",
"5829025456": "devtools/ymake/bin/ymake for darwin-arm64",
@@ -1837,6 +1851,7 @@
"7642861092": "devtools/ymake/bin/ymake for darwin-arm64",
"7648121342": "devtools/ymake/bin/ymake for darwin-arm64",
"7666558962": "devtools/ymake/bin/ymake for darwin-arm64",
+ "7714081769": "devtools/ymake/bin/ymake for darwin-arm64",
"5766173070": "devtools/ymake/bin/ymake for linux",
"5805432830": "devtools/ymake/bin/ymake for linux",
"5829031598": "devtools/ymake/bin/ymake for linux",
@@ -1895,6 +1910,7 @@
"7642862516": "devtools/ymake/bin/ymake for linux",
"7648125070": "devtools/ymake/bin/ymake for linux",
"7666562407": "devtools/ymake/bin/ymake for linux",
+ "7714082818": "devtools/ymake/bin/ymake for linux",
"5766171341": "devtools/ymake/bin/ymake for linux-aarch64",
"5805430188": "devtools/ymake/bin/ymake for linux-aarch64",
"5829023352": "devtools/ymake/bin/ymake for linux-aarch64",
@@ -1953,6 +1969,7 @@
"7642860624": "devtools/ymake/bin/ymake for linux-aarch64",
"7648120215": "devtools/ymake/bin/ymake for linux-aarch64",
"7666556873": "devtools/ymake/bin/ymake for linux-aarch64",
+ "7714081292": "devtools/ymake/bin/ymake for linux-aarch64",
"5766172695": "devtools/ymake/bin/ymake for win32-clang-cl",
"5805432230": "devtools/ymake/bin/ymake for win32-clang-cl",
"5829029743": "devtools/ymake/bin/ymake for win32-clang-cl",
@@ -2011,6 +2028,7 @@
"7642862140": "devtools/ymake/bin/ymake for win32-clang-cl",
"7648124003": "devtools/ymake/bin/ymake for win32-clang-cl",
"7666560929": "devtools/ymake/bin/ymake for win32-clang-cl",
+ "7714082412": "devtools/ymake/bin/ymake for win32-clang-cl",
"4307890075": "flake8_linter for linux",
"5517245192": "flake8_linter for linux",
"4307901240": "flake8_linter for linux-aarch64",
diff --git a/build/platform/test_tool/host.ya.make.inc b/build/platform/test_tool/host.ya.make.inc
index d362d78a85..bddbceb567 100644
--- a/build/platform/test_tool/host.ya.make.inc
+++ b/build/platform/test_tool/host.ya.make.inc
@@ -1,12 +1,12 @@
IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688980745)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717386600)
ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688979180)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717386279)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688984774)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717387253)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_AARCH64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688977846)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717386028)
ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688983202)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717387014)
ENDIF()
diff --git a/build/platform/test_tool/host_os.ya.make.inc b/build/platform/test_tool/host_os.ya.make.inc
index 287fa1f69c..e2c3ebc4b5 100644
--- a/build/platform/test_tool/host_os.ya.make.inc
+++ b/build/platform/test_tool/host_os.ya.make.inc
@@ -1,12 +1,12 @@
IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688921363)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717367660)
ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688919549)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717367448)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688925574)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717368273)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_AARCH64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688917384)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717367154)
ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7688923417)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:7717367994)
ENDIF()
diff --git a/build/scripts/compile_java.py b/build/scripts/compile_java.py
index a28d737195..995ce625db 100644
--- a/build/scripts/compile_java.py
+++ b/build/scripts/compile_java.py
@@ -88,6 +88,7 @@ def main():
[
opts.java_bin,
'-Didea.max.content.load.filesize=30720',
+ '-Djava.correct.class.type.by.place.resolve.scope=true',
'-jar',
opts.kotlin_compiler,
'-classpath',
diff --git a/build/sysincl/stl-to-nothing.yml b/build/sysincl/stl-to-nothing.yml
index 528ebdbc88..972f592404 100644
--- a/build/sysincl/stl-to-nothing.yml
+++ b/build/sysincl/stl-to-nothing.yml
@@ -145,3 +145,7 @@
- experimental/string_view: DO_NOT_INCLUDE_NON_STANDARD_EXPERIMENTAL_STRING_VIEW
- experimental/system_error: DO_NOT_INCLUDE_NON_STANDARD_EXPERIMENTAL_SYSTEM_ERROR
- experimental/tuple: DO_NOT_INCLUDE_NON_STANDARD_EXPERIMENTAL_TUPLE
+
+# These headers belong to libc++, yet certain contribs depend libc++ internal structure.
+- includes:
+ - __utility/swap.h
diff --git a/build/ymake.core.conf b/build/ymake.core.conf
index 3725d7b158..26e521b827 100644
--- a/build/ymake.core.conf
+++ b/build/ymake.core.conf
@@ -5884,3 +5884,21 @@ macro WITHOUT_VERSION() {
macro LINK_EXCLUDE_LIBRARIES(Libs...) {
SET_APPEND(_LINK_EXCLUDE_LIBRARIES_GLOBAL $Libs)
}
+
+### @usage: GENERATE_IMPLIB(Lib, Path, [SONAME Name])
+###
+### Generates a wrapper for external dynamic library using Implib.so and excludes the real library from linker command
+###
+### The wrapper loads the real library on the first call to any of its functions
+###
+### @example:
+###
+### PEERDIR(build/platform/cuda)
+###
+### GENERATE_IMPLIB(cuda $CUDA_TARGET_ROOT/lib64/stubs/libcuda.so SONAME libcuda.so.1)
+###
+macro GENERATE_IMPLIB(Lib, Path, SONAME="") {
+ .CMD=${tool:"contrib/tools/implib"} --target $HARDWARE_TYPE --outdir $BINDIR ${pre=--library-load-name :SONAME} $Path ${hide;output;nopath;suf=.init.c:Path} ${hide;output;nopath;suf=.tramp.S:Path}
+
+ LINK_EXCLUDE_LIBRARIES($Lib)
+}
diff --git a/contrib/libs/cxxsupp/libcxx/include/__support/win32/locale_win32.h b/contrib/libs/cxxsupp/libcxx/include/__support/win32/locale_win32.h
index 3c7ae9c693..55e818e63a 100644
--- a/contrib/libs/cxxsupp/libcxx/include/__support/win32/locale_win32.h
+++ b/contrib/libs/cxxsupp/libcxx/include/__support/win32/locale_win32.h
@@ -41,8 +41,8 @@
#define LC_NUMERIC_MASK _M_NUMERIC
#define LC_TIME_MASK _M_TIME
#define LC_MESSAGES_MASK _M_MESSAGES
-#define LC_MESSAGES _X_MESSAGES
-#define LC_ALL_MASK _M_ALL
+#define LC_ALL_MASK \
+ (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
class __lconv_storage {
public:
@@ -191,7 +191,7 @@ decltype(MB_CUR_MAX) MB_CUR_MAX_L(locale_t __l);
#define strtod_l _strtod_l
#if defined(_LIBCPP_MSVCRT)
# define strtof_l _strtof_l
-# define strtold_l _strtod_l
+# define strtold_l _strtold_l
#else
_LIBCPP_EXPORTED_FROM_ABI float strtof_l(const char*, char**, locale_t);
_LIBCPP_EXPORTED_FROM_ABI long double strtold_l(const char*, char**, locale_t);
diff --git a/contrib/libs/cxxsupp/libcxx/patches/09-msc-ver.patch b/contrib/libs/cxxsupp/libcxx/patches/09-clang-cl-abi.patch
index dd57def15a..dd57def15a 100644
--- a/contrib/libs/cxxsupp/libcxx/patches/09-msc-ver.patch
+++ b/contrib/libs/cxxsupp/libcxx/patches/09-clang-cl-abi.patch
diff --git a/contrib/libs/cxxsupp/libcxx/patches/18-locale-win32.patch b/contrib/libs/cxxsupp/libcxx/patches/18-locale-win32.patch
deleted file mode 100644
index 85e9323c0c..0000000000
--- a/contrib/libs/cxxsupp/libcxx/patches/18-locale-win32.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/include/__support/win32/locale_win32.h b/include/__support/win32/locale_win32.h
-index 55e818e..3c7ae9c 100644
---- a/include/__support/win32/locale_win32.h
-+++ b/include/__support/win32/locale_win32.h
-@@ -41,8 +41,8 @@
- #define LC_NUMERIC_MASK _M_NUMERIC
- #define LC_TIME_MASK _M_TIME
- #define LC_MESSAGES_MASK _M_MESSAGES
--#define LC_ALL_MASK \
-- (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
-+#define LC_MESSAGES _X_MESSAGES
-+#define LC_ALL_MASK _M_ALL
-
- class __lconv_storage {
- public:
-@@ -191,7 +191,7 @@ decltype(MB_CUR_MAX) MB_CUR_MAX_L(locale_t __l);
- #define strtod_l _strtod_l
- #if defined(_LIBCPP_MSVCRT)
- # define strtof_l _strtof_l
--# define strtold_l _strtold_l
-+# define strtold_l _strtod_l
- #else
- _LIBCPP_EXPORTED_FROM_ABI float strtof_l(const char*, char**, locale_t);
- _LIBCPP_EXPORTED_FROM_ABI long double strtold_l(const char*, char**, locale_t);
diff --git a/contrib/libs/hyperscan/.yandex_meta/__init__.py b/contrib/libs/hyperscan/.yandex_meta/__init__.py
index c56235d3b4..02f917dd90 100644
--- a/contrib/libs/hyperscan/.yandex_meta/__init__.py
+++ b/contrib/libs/hyperscan/.yandex_meta/__init__.py
@@ -61,7 +61,7 @@ def instantiate_runtime(self, *, runtime_name, runtime_yamake):
# list of symbols that will be duplicated if compiled without proper wrapping.
# It can be obtained with compiling runtime_* libraries and applying
# nm --defined-only --extern-only --format=posix -o *.a | awk '{print $2}'
- with open(P.join(self.meta_dir, 'symbols.json')) as f:
+ with open(P.join(self.meta_dir, "symbols.json")) as f:
symbols_to_rename = json.load(f)
# rename symbols that would be duplicated between runtimes otherwise
diff --git a/contrib/libs/nghttp3/.yandex_meta/__init__.py b/contrib/libs/nghttp3/.yandex_meta/__init__.py
index f75bcde11e..344c3f236e 100644
--- a/contrib/libs/nghttp3/.yandex_meta/__init__.py
+++ b/contrib/libs/nghttp3/.yandex_meta/__init__.py
@@ -8,7 +8,7 @@ def post_install(self):
with open(includeFilePath, "r") as file:
filedata = file.read()
- filedata = filedata.replace("<nghttp3/version.h>", "\"version.h\"")
+ filedata = filedata.replace("<nghttp3/version.h>", '"version.h"')
with open(includeFilePath, "w") as file:
file.write(filedata)
diff --git a/contrib/libs/protobuf/.yandex_meta/__init__.py b/contrib/libs/protobuf/.yandex_meta/__init__.py
index 7d7498e483..8eb399ce00 100644
--- a/contrib/libs/protobuf/.yandex_meta/__init__.py
+++ b/contrib/libs/protobuf/.yandex_meta/__init__.py
@@ -42,7 +42,7 @@ DEPRECATED_STUBS = [
"src/google/protobuf/json_util.h",
]
-DEPRECATED_SRC = [x for x in DEPRECATED_STUBS if x.endswith('.cc')]
+DEPRECATED_SRC = [x for x in DEPRECATED_STUBS if x.endswith(".cc")]
# Set of proto files coming with original google protobuf (excluding descriptor.proto, see below)
# WARN: upon changing this file, make sure to check protobuf_std counterpart.
@@ -219,19 +219,19 @@ ENDIF()
for lang in ["csharp", "objectivec"]:
for root, _, files in os.walk(os.path.join(libprotoc_abs_dir, "src/google/protobuf/compiler", lang)):
for file in files:
- if file.endswith('.h'):
- with open(os.path.join(root, lang + '_' + file), 'w') as f:
+ if file.endswith(".h"):
+ with open(os.path.join(root, lang + "_" + file), "w") as f:
f.write(f'#include "{file}"\n')
f.write('#include "names.h"')
# generate temporal proxy for ydb
- with open(os.path.join(libprotoc_abs_dir, "src/google/protobuf/compiler/cpp/cpp_helpers.h"), 'w') as f:
+ with open(os.path.join(libprotoc_abs_dir, "src/google/protobuf/compiler/cpp/cpp_helpers.h"), "w") as f:
f.write('#include "helpers.h"')
with open(f"{libprotoc_abs_dir}/ya.make", "wt") as ymake:
ymake.write(str(libprotoc))
- with open(os.path.join(self.ctx.arc, self.arcdir, "src/google/protobuf/util/json_util.h"), 'w') as f:
+ with open(os.path.join(self.ctx.arc, self.arcdir, "src/google/protobuf/util/json_util.h"), "w") as f:
f.write('#define USE_DEPRECATED_NAMESPACE 1\n#include "google/protobuf/json/json.h"')
diff --git a/contrib/python/Pillow/py3/.yandex_meta/__init__.py b/contrib/python/Pillow/py3/.yandex_meta/__init__.py
index 248ce1165e..63d5c8ea50 100644
--- a/contrib/python/Pillow/py3/.yandex_meta/__init__.py
+++ b/contrib/python/Pillow/py3/.yandex_meta/__init__.py
@@ -47,8 +47,8 @@ def post_install(self):
{
"NOT OPENSOURCE": Linkable(
CFLAGS=["-DHAVE_LIBIMAGEQUANT"],
- PEERDIR=['contrib/libs/libimagequant'],
- ADDINCL=['contrib/libs/libimagequant'],
+ PEERDIR=["contrib/libs/libimagequant"],
+ ADDINCL=["contrib/libs/libimagequant"],
),
}
),
diff --git a/contrib/python/anyio/.dist-info/METADATA b/contrib/python/anyio/.dist-info/METADATA
index 10d7aafc77..5d0f7c9130 100644
--- a/contrib/python/anyio/.dist-info/METADATA
+++ b/contrib/python/anyio/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: anyio
-Version: 4.6.2.post1
+Version: 4.7.0
Summary: High level compatibility layer for multiple asynchronous event loop implementations
Author-email: Alex Grönholm <alex.gronholm@nextday.fi>
License: MIT
@@ -23,28 +23,28 @@ Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.9
Description-Content-Type: text/x-rst
License-File: LICENSE
-Requires-Dist: idna >=2.8
-Requires-Dist: sniffio >=1.1
-Requires-Dist: exceptiongroup >=1.0.2 ; python_version < "3.11"
-Requires-Dist: typing-extensions >=4.1 ; python_version < "3.11"
-Provides-Extra: doc
-Requires-Dist: packaging ; extra == 'doc'
-Requires-Dist: Sphinx ~=7.4 ; extra == 'doc'
-Requires-Dist: sphinx-rtd-theme ; extra == 'doc'
-Requires-Dist: sphinx-autodoc-typehints >=1.2.0 ; extra == 'doc'
-Provides-Extra: test
-Requires-Dist: anyio[trio] ; extra == 'test'
-Requires-Dist: coverage[toml] >=7 ; extra == 'test'
-Requires-Dist: exceptiongroup >=1.2.0 ; extra == 'test'
-Requires-Dist: hypothesis >=4.0 ; extra == 'test'
-Requires-Dist: psutil >=5.9 ; extra == 'test'
-Requires-Dist: pytest >=7.0 ; extra == 'test'
-Requires-Dist: pytest-mock >=3.6.1 ; extra == 'test'
-Requires-Dist: trustme ; extra == 'test'
-Requires-Dist: uvloop >=0.21.0b1 ; (platform_python_implementation == "CPython" and platform_system != "Windows") and extra == 'test'
-Requires-Dist: truststore >=0.9.1 ; (python_version >= "3.10") and extra == 'test'
+Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11"
+Requires-Dist: idna>=2.8
+Requires-Dist: sniffio>=1.1
+Requires-Dist: typing_extensions>=4.5; python_version < "3.13"
Provides-Extra: trio
-Requires-Dist: trio >=0.26.1 ; extra == 'trio'
+Requires-Dist: trio>=0.26.1; extra == "trio"
+Provides-Extra: test
+Requires-Dist: anyio[trio]; extra == "test"
+Requires-Dist: coverage[toml]>=7; extra == "test"
+Requires-Dist: exceptiongroup>=1.2.0; extra == "test"
+Requires-Dist: hypothesis>=4.0; extra == "test"
+Requires-Dist: psutil>=5.9; extra == "test"
+Requires-Dist: pytest>=7.0; extra == "test"
+Requires-Dist: pytest-mock>=3.6.1; extra == "test"
+Requires-Dist: trustme; extra == "test"
+Requires-Dist: truststore>=0.9.1; python_version >= "3.10" and extra == "test"
+Requires-Dist: uvloop>=0.21; (platform_python_implementation == "CPython" and platform_system != "Windows") and extra == "test"
+Provides-Extra: doc
+Requires-Dist: packaging; extra == "doc"
+Requires-Dist: Sphinx~=7.4; extra == "doc"
+Requires-Dist: sphinx_rtd_theme; extra == "doc"
+Requires-Dist: sphinx-autodoc-typehints>=1.2.0; extra == "doc"
.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg
:target: https://github.com/agronholm/anyio/actions/workflows/test.yml
diff --git a/contrib/python/anyio/anyio/__init__.py b/contrib/python/anyio/anyio/__init__.py
index fd9fe06bcf..0738e59583 100644
--- a/contrib/python/anyio/anyio/__init__.py
+++ b/contrib/python/anyio/anyio/__init__.py
@@ -34,8 +34,10 @@ from ._core._sockets import create_unix_datagram_socket as create_unix_datagram_
from ._core._sockets import create_unix_listener as create_unix_listener
from ._core._sockets import getaddrinfo as getaddrinfo
from ._core._sockets import getnameinfo as getnameinfo
+from ._core._sockets import wait_readable as wait_readable
from ._core._sockets import wait_socket_readable as wait_socket_readable
from ._core._sockets import wait_socket_writable as wait_socket_writable
+from ._core._sockets import wait_writable as wait_writable
from ._core._streams import create_memory_object_stream as create_memory_object_stream
from ._core._subprocesses import open_process as open_process
from ._core._subprocesses import run_process as run_process
diff --git a/contrib/python/anyio/anyio/_backends/_asyncio.py b/contrib/python/anyio/anyio/_backends/_asyncio.py
index 0a69e7ac61..0b7479d264 100644
--- a/contrib/python/anyio/anyio/_backends/_asyncio.py
+++ b/contrib/python/anyio/anyio/_backends/_asyncio.py
@@ -28,6 +28,8 @@ from collections.abc import (
Collection,
Coroutine,
Iterable,
+ Iterator,
+ MutableMapping,
Sequence,
)
from concurrent.futures import Future
@@ -50,6 +52,7 @@ from threading import Thread
from types import TracebackType
from typing import (
IO,
+ TYPE_CHECKING,
Any,
Optional,
TypeVar,
@@ -99,6 +102,11 @@ from ..abc._eventloop import StrOrBytesPath
from ..lowlevel import RunVar
from ..streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream
+if TYPE_CHECKING:
+ from _typeshed import FileDescriptorLike
+else:
+ FileDescriptorLike = object
+
if sys.version_info >= (3, 10):
from typing import ParamSpec
else:
@@ -347,8 +355,12 @@ _run_vars: WeakKeyDictionary[asyncio.AbstractEventLoop, Any] = WeakKeyDictionary
def _task_started(task: asyncio.Task) -> bool:
"""Return ``True`` if the task has been started and has not finished."""
+ # The task coro should never be None here, as we never add finished tasks to the
+ # task list
+ coro = task.get_coro()
+ assert coro is not None
try:
- return getcoroutinestate(task.get_coro()) in (CORO_RUNNING, CORO_SUSPENDED)
+ return getcoroutinestate(coro) in (CORO_RUNNING, CORO_SUSPENDED)
except AttributeError:
# task coro is async_genenerator_asend https://bugs.python.org/issue37771
raise Exception(f"Cannot determine if task {task} has started or not") from None
@@ -360,11 +372,22 @@ def _task_started(task: asyncio.Task) -> bool:
def is_anyio_cancellation(exc: CancelledError) -> bool:
- return (
- bool(exc.args)
- and isinstance(exc.args[0], str)
- and exc.args[0].startswith("Cancelled by cancel scope ")
- )
+ # Sometimes third party frameworks catch a CancelledError and raise a new one, so as
+ # a workaround we have to look at the previous ones in __context__ too for a
+ # matching cancel message
+ while True:
+ if (
+ exc.args
+ and isinstance(exc.args[0], str)
+ and exc.args[0].startswith("Cancelled by cancel scope ")
+ ):
+ return True
+
+ if isinstance(exc.__context__, CancelledError):
+ exc = exc.__context__
+ continue
+
+ return False
class CancelScope(BaseCancelScope):
@@ -385,8 +408,10 @@ class CancelScope(BaseCancelScope):
self._cancel_handle: asyncio.Handle | None = None
self._tasks: set[asyncio.Task] = set()
self._host_task: asyncio.Task | None = None
- self._cancel_calls: int = 0
- self._cancelling: int | None = None
+ if sys.version_info >= (3, 11):
+ self._pending_uncancellations: int | None = 0
+ else:
+ self._pending_uncancellations = None
def __enter__(self) -> CancelScope:
if self._active:
@@ -405,13 +430,13 @@ class CancelScope(BaseCancelScope):
self._parent_scope = task_state.cancel_scope
task_state.cancel_scope = self
if self._parent_scope is not None:
+ # If using an eager task factory, the parent scope may not even contain
+ # the host task
self._parent_scope._child_scopes.add(self)
- self._parent_scope._tasks.remove(host_task)
+ self._parent_scope._tasks.discard(host_task)
self._timeout()
self._active = True
- if sys.version_info >= (3, 11):
- self._cancelling = self._host_task.cancelling()
# Start cancelling the host task if the scope was cancelled before entering
if self._cancel_called:
@@ -456,30 +481,41 @@ class CancelScope(BaseCancelScope):
host_task_state.cancel_scope = self._parent_scope
- # Undo all cancellations done by this scope
- if self._cancelling is not None:
- while self._cancel_calls:
- self._cancel_calls -= 1
- if self._host_task.uncancel() <= self._cancelling:
- break
+ # Restart the cancellation effort in the closest visible, cancelled parent
+ # scope if necessary
+ self._restart_cancellation_in_parent()
# We only swallow the exception iff it was an AnyIO CancelledError, either
# directly as exc_val or inside an exception group and there are no cancelled
# parent cancel scopes visible to us here
- not_swallowed_exceptions = 0
- swallow_exception = False
- if exc_val is not None:
- for exc in iterate_exceptions(exc_val):
- if self._cancel_called and isinstance(exc, CancelledError):
- if not (swallow_exception := self._uncancel(exc)):
- not_swallowed_exceptions += 1
- else:
- not_swallowed_exceptions += 1
+ if self._cancel_called and not self._parent_cancellation_is_visible_to_us:
+ # For each level-cancel() call made on the host task, call uncancel()
+ while self._pending_uncancellations:
+ self._host_task.uncancel()
+ self._pending_uncancellations -= 1
+
+ # Update cancelled_caught and check for exceptions we must not swallow
+ cannot_swallow_exc_val = False
+ if exc_val is not None:
+ for exc in iterate_exceptions(exc_val):
+ if isinstance(exc, CancelledError) and is_anyio_cancellation(
+ exc
+ ):
+ self._cancelled_caught = True
+ else:
+ cannot_swallow_exc_val = True
- # Restart the cancellation effort in the closest visible, cancelled parent
- # scope if necessary
- self._restart_cancellation_in_parent()
- return swallow_exception and not not_swallowed_exceptions
+ return self._cancelled_caught and not cannot_swallow_exc_val
+ else:
+ if self._pending_uncancellations:
+ assert self._parent_scope is not None
+ assert self._parent_scope._pending_uncancellations is not None
+ self._parent_scope._pending_uncancellations += (
+ self._pending_uncancellations
+ )
+ self._pending_uncancellations = 0
+
+ return False
finally:
self._host_task = None
del exc_val
@@ -506,31 +542,6 @@ class CancelScope(BaseCancelScope):
and self._parent_scope._effectively_cancelled
)
- def _uncancel(self, cancelled_exc: CancelledError) -> bool:
- if self._host_task is None:
- self._cancel_calls = 0
- return True
-
- while True:
- if is_anyio_cancellation(cancelled_exc):
- # Only swallow the cancellation exception if it's an AnyIO cancel
- # exception and there are no other cancel scopes down the line pending
- # cancellation
- self._cancelled_caught = (
- self._effectively_cancelled
- and not self._parent_cancellation_is_visible_to_us
- )
- return self._cancelled_caught
-
- # Sometimes third party frameworks catch a CancelledError and raise a new
- # one, so as a workaround we have to look at the previous ones in
- # __context__ too for a matching cancel message
- if isinstance(cancelled_exc.__context__, CancelledError):
- cancelled_exc = cancelled_exc.__context__
- continue
-
- return False
-
def _timeout(self) -> None:
if self._deadline != math.inf:
loop = get_running_loop()
@@ -562,8 +573,11 @@ class CancelScope(BaseCancelScope):
waiter = task._fut_waiter # type: ignore[attr-defined]
if not isinstance(waiter, asyncio.Future) or not waiter.done():
task.cancel(f"Cancelled by cancel scope {id(origin):x}")
- if task is origin._host_task:
- origin._cancel_calls += 1
+ if (
+ task is origin._host_task
+ and origin._pending_uncancellations is not None
+ ):
+ origin._pending_uncancellations += 1
# Deliver cancellation to child scopes that aren't shielded or running their own
# cancellation callbacks
@@ -663,7 +677,45 @@ class TaskState:
self.cancel_scope = cancel_scope
-_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary()
+class TaskStateStore(MutableMapping["Awaitable[Any] | asyncio.Task", TaskState]):
+ def __init__(self) -> None:
+ self._task_states = WeakKeyDictionary[asyncio.Task, TaskState]()
+ self._preliminary_task_states: dict[Awaitable[Any], TaskState] = {}
+
+ def __getitem__(self, key: Awaitable[Any] | asyncio.Task, /) -> TaskState:
+ assert isinstance(key, asyncio.Task)
+ try:
+ return self._task_states[key]
+ except KeyError:
+ if coro := key.get_coro():
+ if state := self._preliminary_task_states.get(coro):
+ return state
+
+ raise KeyError(key)
+
+ def __setitem__(
+ self, key: asyncio.Task | Awaitable[Any], value: TaskState, /
+ ) -> None:
+ if isinstance(key, asyncio.Task):
+ self._task_states[key] = value
+ else:
+ self._preliminary_task_states[key] = value
+
+ def __delitem__(self, key: asyncio.Task | Awaitable[Any], /) -> None:
+ if isinstance(key, asyncio.Task):
+ del self._task_states[key]
+ else:
+ del self._preliminary_task_states[key]
+
+ def __len__(self) -> int:
+ return len(self._task_states) + len(self._preliminary_task_states)
+
+ def __iter__(self) -> Iterator[Awaitable[Any] | asyncio.Task]:
+ yield from self._task_states
+ yield from self._preliminary_task_states
+
+
+_task_states = TaskStateStore()
#
@@ -783,7 +835,7 @@ class TaskGroup(abc.TaskGroup):
task_status_future: asyncio.Future | None = None,
) -> asyncio.Task:
def task_done(_task: asyncio.Task) -> None:
- task_state = _task_states[_task]
+ # task_state = _task_states[_task]
assert task_state.cancel_scope is not None
assert _task in task_state.cancel_scope._tasks
task_state.cancel_scope._tasks.remove(_task)
@@ -840,16 +892,26 @@ class TaskGroup(abc.TaskGroup):
f"the return value ({coro!r}) is not a coroutine object"
)
- name = get_callable_name(func) if name is None else str(name)
- task = create_task(coro, name=name)
- task.add_done_callback(task_done)
-
# Make the spawned task inherit the task group's cancel scope
- _task_states[task] = TaskState(
+ _task_states[coro] = task_state = TaskState(
parent_id=parent_id, cancel_scope=self.cancel_scope
)
+ name = get_callable_name(func) if name is None else str(name)
+ try:
+ task = create_task(coro, name=name)
+ finally:
+ del _task_states[coro]
+
+ _task_states[task] = task_state
self.cancel_scope._tasks.add(task)
self._tasks.add(task)
+
+ if task.done():
+ # This can happen with eager task factories
+ task_done(task)
+ else:
+ task.add_done_callback(task_done)
+
return task
def start_soon(
@@ -1718,8 +1780,8 @@ class ConnectedUNIXDatagramSocket(_RawSocketMixin, abc.ConnectedUNIXDatagramSock
return
-_read_events: RunVar[dict[Any, asyncio.Event]] = RunVar("read_events")
-_write_events: RunVar[dict[Any, asyncio.Event]] = RunVar("write_events")
+_read_events: RunVar[dict[int, asyncio.Event]] = RunVar("read_events")
+_write_events: RunVar[dict[int, asyncio.Event]] = RunVar("write_events")
#
@@ -2082,7 +2144,9 @@ class AsyncIOTaskInfo(TaskInfo):
else:
parent_id = task_state.parent_id
- super().__init__(id(task), parent_id, task.get_name(), task.get_coro())
+ coro = task.get_coro()
+ assert coro is not None, "created TaskInfo from a completed Task"
+ super().__init__(id(task), parent_id, task.get_name(), coro)
self._task = weakref.ref(task)
def has_pending_cancellation(self) -> bool:
@@ -2090,12 +2154,11 @@ class AsyncIOTaskInfo(TaskInfo):
# If the task isn't around anymore, it won't have a pending cancellation
return False
- if sys.version_info >= (3, 11):
- if task.cancelling():
- return True
+ if task._must_cancel: # type: ignore[attr-defined]
+ return True
elif (
- isinstance(task._fut_waiter, asyncio.Future)
- and task._fut_waiter.cancelled()
+ isinstance(task._fut_waiter, asyncio.Future) # type: ignore[attr-defined]
+ and task._fut_waiter.cancelled() # type: ignore[attr-defined]
):
return True
@@ -2335,10 +2398,11 @@ class AsyncIOBackend(AsyncBackend):
@classmethod
def current_effective_deadline(cls) -> float:
+ if (task := current_task()) is None:
+ return math.inf
+
try:
- cancel_scope = _task_states[
- current_task() # type: ignore[index]
- ].cancel_scope
+ cancel_scope = _task_states[task].cancel_scope
except KeyError:
return math.inf
@@ -2671,7 +2735,7 @@ class AsyncIOBackend(AsyncBackend):
return await get_running_loop().getnameinfo(sockaddr, flags)
@classmethod
- async def wait_socket_readable(cls, sock: socket.socket) -> None:
+ async def wait_readable(cls, obj: FileDescriptorLike) -> None:
await cls.checkpoint()
try:
read_events = _read_events.get()
@@ -2679,26 +2743,34 @@ class AsyncIOBackend(AsyncBackend):
read_events = {}
_read_events.set(read_events)
- if read_events.get(sock):
- raise BusyResourceError("reading from") from None
+ if not isinstance(obj, int):
+ obj = obj.fileno()
+
+ if read_events.get(obj):
+ raise BusyResourceError("reading from")
loop = get_running_loop()
- event = read_events[sock] = asyncio.Event()
- loop.add_reader(sock, event.set)
+ event = asyncio.Event()
+ try:
+ loop.add_reader(obj, event.set)
+ except NotImplementedError:
+ from anyio._core._asyncio_selector_thread import get_selector
+
+ selector = get_selector()
+ selector.add_reader(obj, event.set)
+ remove_reader = selector.remove_reader
+ else:
+ remove_reader = loop.remove_reader
+
+ read_events[obj] = event
try:
await event.wait()
finally:
- if read_events.pop(sock, None) is not None:
- loop.remove_reader(sock)
- readable = True
- else:
- readable = False
-
- if not readable:
- raise ClosedResourceError
+ remove_reader(obj)
+ del read_events[obj]
@classmethod
- async def wait_socket_writable(cls, sock: socket.socket) -> None:
+ async def wait_writable(cls, obj: FileDescriptorLike) -> None:
await cls.checkpoint()
try:
write_events = _write_events.get()
@@ -2706,23 +2778,31 @@ class AsyncIOBackend(AsyncBackend):
write_events = {}
_write_events.set(write_events)
- if write_events.get(sock):
- raise BusyResourceError("writing to") from None
+ if not isinstance(obj, int):
+ obj = obj.fileno()
+
+ if write_events.get(obj):
+ raise BusyResourceError("writing to")
loop = get_running_loop()
- event = write_events[sock] = asyncio.Event()
- loop.add_writer(sock.fileno(), event.set)
+ event = asyncio.Event()
+ try:
+ loop.add_writer(obj, event.set)
+ except NotImplementedError:
+ from anyio._core._asyncio_selector_thread import get_selector
+
+ selector = get_selector()
+ selector.add_writer(obj, event.set)
+ remove_writer = selector.remove_writer
+ else:
+ remove_writer = loop.remove_writer
+
+ write_events[obj] = event
try:
await event.wait()
finally:
- if write_events.pop(sock, None) is not None:
- loop.remove_writer(sock)
- writable = True
- else:
- writable = False
-
- if not writable:
- raise ClosedResourceError
+ del write_events[obj]
+ remove_writer(obj)
@classmethod
def current_default_thread_limiter(cls) -> CapacityLimiter:
diff --git a/contrib/python/anyio/anyio/_backends/_trio.py b/contrib/python/anyio/anyio/_backends/_trio.py
index 24dcd74446..70a0a60578 100644
--- a/contrib/python/anyio/anyio/_backends/_trio.py
+++ b/contrib/python/anyio/anyio/_backends/_trio.py
@@ -28,6 +28,7 @@ from socket import AddressFamily, SocketKind
from types import TracebackType
from typing import (
IO,
+ TYPE_CHECKING,
Any,
Generic,
NoReturn,
@@ -80,6 +81,9 @@ from ..abc import IPSockAddrType, UDPPacketType, UNIXDatagramPacketType
from ..abc._eventloop import AsyncBackend, StrOrBytesPath
from ..streams.memory import MemoryObjectSendStream
+if TYPE_CHECKING:
+ from _typeshed import HasFileno
+
if sys.version_info >= (3, 10):
from typing import ParamSpec
else:
@@ -1260,18 +1264,18 @@ class TrioBackend(AsyncBackend):
return await trio.socket.getnameinfo(sockaddr, flags)
@classmethod
- async def wait_socket_readable(cls, sock: socket.socket) -> None:
+ async def wait_readable(cls, obj: HasFileno | int) -> None:
try:
- await wait_readable(sock)
+ await wait_readable(obj)
except trio.ClosedResourceError as exc:
raise ClosedResourceError().with_traceback(exc.__traceback__) from None
except trio.BusyResourceError:
raise BusyResourceError("reading from") from None
@classmethod
- async def wait_socket_writable(cls, sock: socket.socket) -> None:
+ async def wait_writable(cls, obj: HasFileno | int) -> None:
try:
- await wait_writable(sock)
+ await wait_writable(obj)
except trio.ClosedResourceError as exc:
raise ClosedResourceError().with_traceback(exc.__traceback__) from None
except trio.BusyResourceError:
diff --git a/contrib/python/anyio/anyio/_core/_asyncio_selector_thread.py b/contrib/python/anyio/anyio/_core/_asyncio_selector_thread.py
new file mode 100644
index 0000000000..d98c304072
--- /dev/null
+++ b/contrib/python/anyio/anyio/_core/_asyncio_selector_thread.py
@@ -0,0 +1,150 @@
+from __future__ import annotations
+
+import asyncio
+import socket
+import threading
+from collections.abc import Callable
+from selectors import EVENT_READ, EVENT_WRITE, DefaultSelector
+from typing import TYPE_CHECKING, Any
+
+if TYPE_CHECKING:
+ from _typeshed import FileDescriptorLike
+
+_selector_lock = threading.Lock()
+_selector: Selector | None = None
+
+
+class Selector:
+ def __init__(self) -> None:
+ self._thread = threading.Thread(target=self.run, name="AnyIO socket selector")
+ self._selector = DefaultSelector()
+ self._send, self._receive = socket.socketpair()
+ self._send.setblocking(False)
+ self._receive.setblocking(False)
+ self._selector.register(self._receive, EVENT_READ)
+ self._closed = False
+
+ def start(self) -> None:
+ self._thread.start()
+ threading._register_atexit(self._stop) # type: ignore[attr-defined]
+
+ def _stop(self) -> None:
+ global _selector
+ self._closed = True
+ self._notify_self()
+ self._send.close()
+ self._thread.join()
+ self._selector.unregister(self._receive)
+ self._receive.close()
+ self._selector.close()
+ _selector = None
+ assert (
+ not self._selector.get_map()
+ ), "selector still has registered file descriptors after shutdown"
+
+ def _notify_self(self) -> None:
+ try:
+ self._send.send(b"\x00")
+ except BlockingIOError:
+ pass
+
+ def add_reader(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None:
+ loop = asyncio.get_running_loop()
+ try:
+ key = self._selector.get_key(fd)
+ except KeyError:
+ self._selector.register(fd, EVENT_READ, {EVENT_READ: (loop, callback)})
+ else:
+ if EVENT_READ in key.data:
+ raise ValueError(
+ "this file descriptor is already registered for reading"
+ )
+
+ key.data[EVENT_READ] = loop, callback
+ self._selector.modify(fd, key.events | EVENT_READ, key.data)
+
+ self._notify_self()
+
+ def add_writer(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None:
+ loop = asyncio.get_running_loop()
+ try:
+ key = self._selector.get_key(fd)
+ except KeyError:
+ self._selector.register(fd, EVENT_WRITE, {EVENT_WRITE: (loop, callback)})
+ else:
+ if EVENT_WRITE in key.data:
+ raise ValueError(
+ "this file descriptor is already registered for writing"
+ )
+
+ key.data[EVENT_WRITE] = loop, callback
+ self._selector.modify(fd, key.events | EVENT_WRITE, key.data)
+
+ self._notify_self()
+
+ def remove_reader(self, fd: FileDescriptorLike) -> bool:
+ try:
+ key = self._selector.get_key(fd)
+ except KeyError:
+ return False
+
+ if new_events := key.events ^ EVENT_READ:
+ del key.data[EVENT_READ]
+ self._selector.modify(fd, new_events, key.data)
+ else:
+ self._selector.unregister(fd)
+
+ return True
+
+ def remove_writer(self, fd: FileDescriptorLike) -> bool:
+ try:
+ key = self._selector.get_key(fd)
+ except KeyError:
+ return False
+
+ if new_events := key.events ^ EVENT_WRITE:
+ del key.data[EVENT_WRITE]
+ self._selector.modify(fd, new_events, key.data)
+ else:
+ self._selector.unregister(fd)
+
+ return True
+
+ def run(self) -> None:
+ while not self._closed:
+ for key, events in self._selector.select():
+ if key.fileobj is self._receive:
+ try:
+ while self._receive.recv(4096):
+ pass
+ except BlockingIOError:
+ pass
+
+ continue
+
+ if events & EVENT_READ:
+ loop, callback = key.data[EVENT_READ]
+ self.remove_reader(key.fd)
+ try:
+ loop.call_soon_threadsafe(callback)
+ except RuntimeError:
+ pass # the loop was already closed
+
+ if events & EVENT_WRITE:
+ loop, callback = key.data[EVENT_WRITE]
+ self.remove_writer(key.fd)
+ try:
+ loop.call_soon_threadsafe(callback)
+ except RuntimeError:
+ pass # the loop was already closed
+
+
+def get_selector() -> Selector:
+ global _selector
+
+ with _selector_lock:
+ if _selector is None:
+ _selector = Selector()
+ _selector.start()
+
+ return _selector
diff --git a/contrib/python/anyio/anyio/_core/_exceptions.py b/contrib/python/anyio/anyio/_core/_exceptions.py
index 6e3f8ccc67..97ea313041 100644
--- a/contrib/python/anyio/anyio/_core/_exceptions.py
+++ b/contrib/python/anyio/anyio/_core/_exceptions.py
@@ -16,7 +16,7 @@ class BrokenResourceError(Exception):
class BrokenWorkerProcess(Exception):
"""
- Raised by :func:`run_sync_in_process` if the worker process terminates abruptly or
+ Raised by :meth:`~anyio.to_process.run_sync` if the worker process terminates abruptly or
otherwise misbehaves.
"""
diff --git a/contrib/python/anyio/anyio/_core/_fileio.py b/contrib/python/anyio/anyio/_core/_fileio.py
index 53d3288c29..ef2930e480 100644
--- a/contrib/python/anyio/anyio/_core/_fileio.py
+++ b/contrib/python/anyio/anyio/_core/_fileio.py
@@ -92,10 +92,10 @@ class AsyncFile(AsyncResource, Generic[AnyStr]):
async def readlines(self) -> list[AnyStr]:
return await to_thread.run_sync(self._fp.readlines)
- async def readinto(self: AsyncFile[bytes], b: WriteableBuffer) -> bytes:
+ async def readinto(self: AsyncFile[bytes], b: WriteableBuffer) -> int:
return await to_thread.run_sync(self._fp.readinto, b)
- async def readinto1(self: AsyncFile[bytes], b: WriteableBuffer) -> bytes:
+ async def readinto1(self: AsyncFile[bytes], b: WriteableBuffer) -> int:
return await to_thread.run_sync(self._fp.readinto1, b)
@overload
diff --git a/contrib/python/anyio/anyio/_core/_sockets.py b/contrib/python/anyio/anyio/_core/_sockets.py
index 6070c647fd..a822d060d7 100644
--- a/contrib/python/anyio/anyio/_core/_sockets.py
+++ b/contrib/python/anyio/anyio/_core/_sockets.py
@@ -10,7 +10,7 @@ from collections.abc import Awaitable
from ipaddress import IPv6Address, ip_address
from os import PathLike, chmod
from socket import AddressFamily, SocketKind
-from typing import Any, Literal, cast, overload
+from typing import TYPE_CHECKING, Any, Literal, cast, overload
from .. import to_thread
from ..abc import (
@@ -31,9 +31,19 @@ from ._resources import aclose_forcefully
from ._synchronization import Event
from ._tasks import create_task_group, move_on_after
+if TYPE_CHECKING:
+ from _typeshed import FileDescriptorLike
+else:
+ FileDescriptorLike = object
+
if sys.version_info < (3, 11):
from exceptiongroup import ExceptionGroup
+if sys.version_info < (3, 13):
+ from typing_extensions import deprecated
+else:
+ from warnings import deprecated
+
IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41) # https://bugs.python.org/issue29515
AnyIPAddressFamily = Literal[
@@ -186,6 +196,14 @@ async def connect_tcp(
try:
addr_obj = ip_address(remote_host)
except ValueError:
+ addr_obj = None
+
+ if addr_obj is not None:
+ if isinstance(addr_obj, IPv6Address):
+ target_addrs = [(socket.AF_INET6, addr_obj.compressed)]
+ else:
+ target_addrs = [(socket.AF_INET, addr_obj.compressed)]
+ else:
# getaddrinfo() will raise an exception if name resolution fails
gai_res = await getaddrinfo(
target_host, remote_port, family=family, type=socket.SOCK_STREAM
@@ -194,7 +212,7 @@ async def connect_tcp(
# Organize the list so that the first address is an IPv6 address (if available)
# and the second one is an IPv4 addresses. The rest can be in whatever order.
v6_found = v4_found = False
- target_addrs: list[tuple[socket.AddressFamily, str]] = []
+ target_addrs = []
for af, *rest, sa in gai_res:
if af == socket.AF_INET6 and not v6_found:
v6_found = True
@@ -204,11 +222,6 @@ async def connect_tcp(
target_addrs.insert(1, (af, sa[0]))
else:
target_addrs.append((af, sa[0]))
- else:
- if isinstance(addr_obj, IPv6Address):
- target_addrs = [(socket.AF_INET6, addr_obj.compressed)]
- else:
- target_addrs = [(socket.AF_INET, addr_obj.compressed)]
oserrors: list[OSError] = []
async with create_task_group() as tg:
@@ -588,12 +601,13 @@ def getnameinfo(sockaddr: IPSockAddrType, flags: int = 0) -> Awaitable[tuple[str
return get_async_backend().getnameinfo(sockaddr, flags)
+@deprecated("This function is deprecated; use `wait_readable` instead")
def wait_socket_readable(sock: socket.socket) -> Awaitable[None]:
"""
- Wait until the given socket has data to be read.
+ .. deprecated:: 4.7.0
+ Use :func:`wait_readable` instead.
- This does **NOT** work on Windows when using the asyncio backend with a proactor
- event loop (default on py3.8+).
+ Wait until the given socket has data to be read.
.. warning:: Only use this on raw sockets that have not been wrapped by any higher
level constructs like socket streams!
@@ -605,11 +619,15 @@ def wait_socket_readable(sock: socket.socket) -> Awaitable[None]:
to become readable
"""
- return get_async_backend().wait_socket_readable(sock)
+ return get_async_backend().wait_readable(sock.fileno())
+@deprecated("This function is deprecated; use `wait_writable` instead")
def wait_socket_writable(sock: socket.socket) -> Awaitable[None]:
"""
+ .. deprecated:: 4.7.0
+ Use :func:`wait_writable` instead.
+
Wait until the given socket can be written to.
This does **NOT** work on Windows when using the asyncio backend with a proactor
@@ -625,7 +643,58 @@ def wait_socket_writable(sock: socket.socket) -> Awaitable[None]:
to become writable
"""
- return get_async_backend().wait_socket_writable(sock)
+ return get_async_backend().wait_writable(sock.fileno())
+
+
+def wait_readable(obj: FileDescriptorLike) -> Awaitable[None]:
+ """
+ Wait until the given object has data to be read.
+
+ On Unix systems, ``obj`` must either be an integer file descriptor, or else an
+ object with a ``.fileno()`` method which returns an integer file descriptor. Any
+ kind of file descriptor can be passed, though the exact semantics will depend on
+ your kernel. For example, this probably won't do anything useful for on-disk files.
+
+ On Windows systems, ``obj`` must either be an integer ``SOCKET`` handle, or else an
+ object with a ``.fileno()`` method which returns an integer ``SOCKET`` handle. File
+ descriptors aren't supported, and neither are handles that refer to anything besides
+ a ``SOCKET``.
+
+ On backends where this functionality is not natively provided (asyncio
+ ``ProactorEventLoop`` on Windows), it is provided using a separate selector thread
+ which is set to shut down when the interpreter shuts down.
+
+ .. warning:: Don't use this on raw sockets that have been wrapped by any higher
+ level constructs like socket streams!
+
+ :param obj: an object with a ``.fileno()`` method or an integer handle
+ :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the
+ object to become readable
+ :raises ~anyio.BusyResourceError: if another task is already waiting for the object
+ to become readable
+
+ """
+ return get_async_backend().wait_readable(obj)
+
+
+def wait_writable(obj: FileDescriptorLike) -> Awaitable[None]:
+ """
+ Wait until the given object can be written to.
+
+ :param obj: an object with a ``.fileno()`` method or an integer handle
+ :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the
+ object to become writable
+ :raises ~anyio.BusyResourceError: if another task is already waiting for the object
+ to become writable
+
+ .. seealso:: See the documentation of :func:`wait_readable` for the definition of
+ ``obj`` and notes on backend compatibility.
+
+ .. warning:: Don't use this on raw sockets that have been wrapped by any higher
+ level constructs like socket streams!
+
+ """
+ return get_async_backend().wait_writable(obj)
#
diff --git a/contrib/python/anyio/anyio/_core/_synchronization.py b/contrib/python/anyio/anyio/_core/_synchronization.py
index 023ab73370..7878ba6668 100644
--- a/contrib/python/anyio/anyio/_core/_synchronization.py
+++ b/contrib/python/anyio/anyio/_core/_synchronization.py
@@ -109,6 +109,7 @@ class Event:
class EventAdapter(Event):
_internal_event: Event | None = None
+ _is_set: bool = False
def __new__(cls) -> EventAdapter:
return object.__new__(cls)
@@ -117,14 +118,22 @@ class EventAdapter(Event):
def _event(self) -> Event:
if self._internal_event is None:
self._internal_event = get_async_backend().create_event()
+ if self._is_set:
+ self._internal_event.set()
return self._internal_event
def set(self) -> None:
- self._event.set()
+ if self._internal_event is None:
+ self._is_set = True
+ else:
+ self._event.set()
def is_set(self) -> bool:
- return self._internal_event is not None and self._internal_event.is_set()
+ if self._internal_event is None:
+ return self._is_set
+
+ return self._internal_event.is_set()
async def wait(self) -> None:
await self._event.wait()
diff --git a/contrib/python/anyio/anyio/abc/__init__.py b/contrib/python/anyio/anyio/abc/__init__.py
index 1ca0fcf746..3d3b61cc9a 100644
--- a/contrib/python/anyio/anyio/abc/__init__.py
+++ b/contrib/python/anyio/anyio/abc/__init__.py
@@ -1,7 +1,5 @@
from __future__ import annotations
-from typing import Any
-
from ._eventloop import AsyncBackend as AsyncBackend
from ._resources import AsyncResource as AsyncResource
from ._sockets import ConnectedUDPSocket as ConnectedUDPSocket
@@ -50,8 +48,8 @@ from .._core._tasks import CancelScope as CancelScope
from ..from_thread import BlockingPortal as BlockingPortal
# Re-export imports so they look like they live directly in this package
-key: str
-value: Any
-for key, value in list(locals().items()):
- if getattr(value, "__module__", "").startswith("anyio.abc."):
- value.__module__ = __name__
+for __value in list(locals().values()):
+ if getattr(__value, "__module__", "").startswith("anyio.abc."):
+ __value.__module__ = __name__
+
+del __value
diff --git a/contrib/python/anyio/anyio/abc/_eventloop.py b/contrib/python/anyio/anyio/abc/_eventloop.py
index 93d0e9d25b..2bfdf28635 100644
--- a/contrib/python/anyio/anyio/abc/_eventloop.py
+++ b/contrib/python/anyio/anyio/abc/_eventloop.py
@@ -28,6 +28,8 @@ else:
from typing_extensions import TypeAlias
if TYPE_CHECKING:
+ from _typeshed import HasFileno
+
from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore
from .._core._tasks import CancelScope
from .._core._testing import TaskInfo
@@ -333,12 +335,12 @@ class AsyncBackend(metaclass=ABCMeta):
@classmethod
@abstractmethod
- async def wait_socket_readable(cls, sock: socket) -> None:
+ async def wait_readable(cls, obj: HasFileno | int) -> None:
pass
@classmethod
@abstractmethod
- async def wait_socket_writable(cls, sock: socket) -> None:
+ async def wait_writable(cls, obj: HasFileno | int) -> None:
pass
@classmethod
diff --git a/contrib/python/anyio/anyio/abc/_tasks.py b/contrib/python/anyio/anyio/abc/_tasks.py
index 88aecf3833..f6e5c40c7f 100644
--- a/contrib/python/anyio/anyio/abc/_tasks.py
+++ b/contrib/python/anyio/anyio/abc/_tasks.py
@@ -40,6 +40,12 @@ class TaskGroup(metaclass=ABCMeta):
:ivar cancel_scope: the cancel scope inherited by all child tasks
:vartype cancel_scope: CancelScope
+
+ .. note:: On asyncio, support for eager task factories is considered to be
+ **experimental**. In particular, they don't follow the usual semantics of new
+ tasks being scheduled on the next iteration of the event loop, and may thus
+ cause unexpected behavior in code that wasn't written with such semantics in
+ mind.
"""
cancel_scope: CancelScope
diff --git a/contrib/python/anyio/ya.make b/contrib/python/anyio/ya.make
index aadbb5b297..956fc4c841 100644
--- a/contrib/python/anyio/ya.make
+++ b/contrib/python/anyio/ya.make
@@ -2,13 +2,14 @@
PY3_LIBRARY()
-VERSION(4.6.2.post1)
+VERSION(4.7.0)
LICENSE(MIT)
PEERDIR(
contrib/python/idna
contrib/python/sniffio
+ contrib/python/typing-extensions
)
NO_LINT()
@@ -25,6 +26,7 @@ PY_SRCS(
anyio/_backends/_asyncio.py
anyio/_backends/_trio.py
anyio/_core/__init__.py
+ anyio/_core/_asyncio_selector_thread.py
anyio/_core/_eventloop.py
anyio/_core/_exceptions.py
anyio/_core/_fileio.py
diff --git a/contrib/python/fonttools/.dist-info/METADATA b/contrib/python/fonttools/.dist-info/METADATA
index 9460888006..5a177ba30c 100644
--- a/contrib/python/fonttools/.dist-info/METADATA
+++ b/contrib/python/fonttools/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: fonttools
-Version: 4.55.1
+Version: 4.55.2
Summary: Tools to manipulate font files
Home-page: http://github.com/fonttools/fonttools
Author: Just van Rossum
@@ -377,6 +377,13 @@ Have fun!
Changelog
~~~~~~~~~
+4.55.2 (released 2024-12-05)
+----------------------------
+
+- [Docs] update Sphinx config (#3712)
+- [designspaceLib] Allow axisOrdering to be set to zero (#3715)
+- [feaLib] Don’t modify variable anchors in place (#3717)
+
4.55.1 (released 2024-12-02)
----------------------------
diff --git a/contrib/python/fonttools/fontTools/__init__.py b/contrib/python/fonttools/fontTools/__init__.py
index 6aa5f3ad59..2fe3602d32 100644
--- a/contrib/python/fonttools/fontTools/__init__.py
+++ b/contrib/python/fonttools/fontTools/__init__.py
@@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger
log = logging.getLogger(__name__)
-version = __version__ = "4.55.1"
+version = __version__ = "4.55.2"
__all__ = ["version", "log", "configLogger"]
diff --git a/contrib/python/fonttools/fontTools/designspaceLib/__init__.py b/contrib/python/fonttools/fontTools/designspaceLib/__init__.py
index 0a1e782f57..661f3405da 100644
--- a/contrib/python/fonttools/fontTools/designspaceLib/__init__.py
+++ b/contrib/python/fonttools/fontTools/designspaceLib/__init__.py
@@ -1596,7 +1596,7 @@ class BaseDocWriter(object):
mapElement.attrib["input"] = self.intOrFloat(inputValue)
mapElement.attrib["output"] = self.intOrFloat(outputValue)
axisElement.append(mapElement)
- if axisObject.axisOrdering or axisObject.axisLabels:
+ if axisObject.axisOrdering is not None or axisObject.axisLabels:
labelsElement = ET.Element("labels")
if axisObject.axisOrdering is not None:
labelsElement.attrib["ordering"] = str(axisObject.axisOrdering)
diff --git a/contrib/python/fonttools/fontTools/feaLib/builder.py b/contrib/python/fonttools/fontTools/feaLib/builder.py
index bda855e1e9..81aa8c2e26 100644
--- a/contrib/python/fonttools/fontTools/feaLib/builder.py
+++ b/contrib/python/fonttools/fontTools/feaLib/builder.py
@@ -1658,38 +1658,31 @@ class Builder(object):
return default, device
+ def makeAnchorPos(self, varscalar, deviceTable, location):
+ device = None
+ if not isinstance(varscalar, VariableScalar):
+ if deviceTable is not None:
+ device = otl.buildDevice(dict(deviceTable))
+ return varscalar, device
+ default, device = self.makeVariablePos(location, varscalar)
+ if device is not None and deviceTable is not None:
+ raise FeatureLibError(
+ "Can't define a device coordinate and variable scalar", location
+ )
+ return default, device
+
def makeOpenTypeAnchor(self, location, anchor):
"""ast.Anchor --> otTables.Anchor"""
if anchor is None:
return None
- variable = False
deviceX, deviceY = None, None
if anchor.xDeviceTable is not None:
deviceX = otl.buildDevice(dict(anchor.xDeviceTable))
if anchor.yDeviceTable is not None:
deviceY = otl.buildDevice(dict(anchor.yDeviceTable))
- for dim in ("x", "y"):
- varscalar = getattr(anchor, dim)
- if not isinstance(varscalar, VariableScalar):
- continue
- if getattr(anchor, dim + "DeviceTable") is not None:
- raise FeatureLibError(
- "Can't define a device coordinate and variable scalar", location
- )
- default, device = self.makeVariablePos(location, varscalar)
- setattr(anchor, dim, default)
- if device is not None:
- if dim == "x":
- deviceX = device
- else:
- deviceY = device
- variable = True
-
- otlanchor = otl.buildAnchor(
- anchor.x, anchor.y, anchor.contourpoint, deviceX, deviceY
- )
- if variable:
- otlanchor.Format = 3
+ x, deviceX = self.makeAnchorPos(anchor.x, anchor.xDeviceTable, location)
+ y, deviceY = self.makeAnchorPos(anchor.y, anchor.yDeviceTable, location)
+ otlanchor = otl.buildAnchor(x, y, anchor.contourpoint, deviceX, deviceY)
return otlanchor
_VALUEREC_ATTRS = {
diff --git a/contrib/python/fonttools/ya.make b/contrib/python/fonttools/ya.make
index ce8febfcdd..d01a0e414f 100644
--- a/contrib/python/fonttools/ya.make
+++ b/contrib/python/fonttools/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(4.55.1)
+VERSION(4.55.2)
LICENSE(MIT)
diff --git a/contrib/python/grpcio/py3/.yandex_meta/__init__.py b/contrib/python/grpcio/py3/.yandex_meta/__init__.py
index d519c459ee..5e4e2c47ca 100644
--- a/contrib/python/grpcio/py3/.yandex_meta/__init__.py
+++ b/contrib/python/grpcio/py3/.yandex_meta/__init__.py
@@ -57,7 +57,7 @@ def post_install(self):
# see https://github.com/grpc/grpc/blob/v1.45.0/tools/bazel.rc#L103
pb.after(
"ADDINCL",
- Switch({'SANITIZER_TYPE == undefined': Linkable(CXXFLAGS=["-fno-sanitize=function"])}),
+ Switch({"SANITIZER_TYPE == undefined": Linkable(CXXFLAGS=["-fno-sanitize=function"])}),
)
diff --git a/contrib/python/scipy/py3/tests/_build_utils/ya.make b/contrib/python/scipy/py3/tests/_build_utils/ya.make
new file mode 100644
index 0000000000..557f802cd6
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/_build_utils/ya.make
@@ -0,0 +1,26 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/_build_utils/tests/__init__.py
+ scipy/_build_utils/tests/test_scipy_version.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/_lib/ya.make b/contrib/python/scipy/py3/tests/_lib/ya.make
new file mode 100644
index 0000000000..ebc065f7d9
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/_lib/ya.make
@@ -0,0 +1,38 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/_lib/tests/__init__.py
+ scipy/_lib/tests/test__gcutils.py
+ scipy/_lib/tests/test__pep440.py
+ scipy/_lib/tests/test__testutils.py
+ scipy/_lib/tests/test__threadsafety.py
+ scipy/_lib/tests/test__util.py
+ scipy/_lib/tests/test_bunch.py
+ scipy/_lib/tests/test_public_api.py
+ scipy/_lib/tests/test_tmpdirs.py
+ scipy/_lib/tests/test_warnings.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/cluster/ya.make b/contrib/python/scipy/py3/tests/cluster/ya.make
new file mode 100644
index 0000000000..016955b98e
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/cluster/ya.make
@@ -0,0 +1,29 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/cluster/tests/__init__.py
+ scipy/cluster/tests/hierarchy_test_data.py
+ scipy/cluster/tests/test_disjoint_set.py
+ scipy/cluster/tests/test_hierarchy.py
+ scipy/cluster/tests/test_vq.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/constants/ya.make b/contrib/python/scipy/py3/tests/constants/ya.make
new file mode 100644
index 0000000000..caa3af28c6
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/constants/ya.make
@@ -0,0 +1,27 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/constants/tests/__init__.py
+ scipy/constants/tests/test_codata.py
+ scipy/constants/tests/test_constants.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/fft/ya.make b/contrib/python/scipy/py3/tests/fft/ya.make
new file mode 100644
index 0000000000..c6102cb142
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/fft/ya.make
@@ -0,0 +1,42 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/fft/_pocketfft/tests/__init__.py
+ scipy/fft/_pocketfft/tests/test_basic.py
+ scipy/fft/_pocketfft/tests/test_real_transforms.py
+ scipy/fft/tests/__init__.py
+ scipy/fft/tests/mock_backend.py
+ scipy/fft/tests/test_backend.py
+ scipy/fft/tests/test_fft_function.py
+ scipy/fft/tests/test_fftlog.py
+ scipy/fft/tests/test_helper.py
+ scipy/fft/tests/test_multithreading.py
+ scipy/fft/tests/test_numpy.py
+ scipy/fft/tests/test_real_transforms.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/fftpack/ya.make b/contrib/python/scipy/py3/tests/fftpack/ya.make
new file mode 100644
index 0000000000..327fb9f677
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/fftpack/ya.make
@@ -0,0 +1,34 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/fftpack/tests/__init__.py
+ scipy/fftpack/tests/test_basic.py
+ scipy/fftpack/tests/test_helper.py
+ scipy/fftpack/tests/test_import.py
+ scipy/fftpack/tests/test_pseudo_diffs.py
+ scipy/fftpack/tests/test_real_transforms.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/integrate/ya.make b/contrib/python/scipy/py3/tests/integrate/ya.make
new file mode 100644
index 0000000000..e2a1514951
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/integrate/ya.make
@@ -0,0 +1,32 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/integrate/_ivp/tests/__init__.py
+ scipy/integrate/_ivp/tests/test_ivp.py
+ scipy/integrate/_ivp/tests/test_rk.py
+ scipy/integrate/tests/__init__.py
+ scipy/integrate/tests/test__quad_vec.py
+ scipy/integrate/tests/test_banded_ode_solvers.py
+ scipy/integrate/tests/test_bvp.py
+ scipy/integrate/tests/test_integrate.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/interpolate/ya.make b/contrib/python/scipy/py3/tests/interpolate/ya.make
new file mode 100644
index 0000000000..a1f2ef582e
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/interpolate/ya.make
@@ -0,0 +1,41 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/interpolate/tests/__init__.py
+ scipy/interpolate/tests/test_bsplines.py
+ scipy/interpolate/tests/test_fitpack.py
+ scipy/interpolate/tests/test_fitpack2.py
+ scipy/interpolate/tests/test_gil.py
+ scipy/interpolate/tests/test_interpnd.py
+ scipy/interpolate/tests/test_interpolate.py
+ scipy/interpolate/tests/test_ndgriddata.py
+ scipy/interpolate/tests/test_pade.py
+ scipy/interpolate/tests/test_polyint.py
+ scipy/interpolate/tests/test_rbf.py
+ scipy/interpolate/tests/test_rbfinterp.py
+ scipy/interpolate/tests/test_rgi.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/io/ya.make b/contrib/python/scipy/py3/tests/io/ya.make
new file mode 100644
index 0000000000..66ecdbe323
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/io/ya.make
@@ -0,0 +1,48 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/io/_harwell_boeing/tests/__init__.py
+ scipy/io/_harwell_boeing/tests/test_fortran_format.py
+ scipy/io/_harwell_boeing/tests/test_hb.py
+ scipy/io/arff/tests/__init__.py
+ scipy/io/arff/tests/test_arffread.py
+ scipy/io/matlab/tests/__init__.py
+ scipy/io/matlab/tests/test_byteordercodes.py
+ scipy/io/matlab/tests/test_mio.py
+ scipy/io/matlab/tests/test_mio5_utils.py
+ scipy/io/matlab/tests/test_mio_funcs.py
+ scipy/io/matlab/tests/test_mio_utils.py
+ scipy/io/matlab/tests/test_miobase.py
+ scipy/io/matlab/tests/test_pathological.py
+ scipy/io/matlab/tests/test_streams.py
+ scipy/io/tests/__init__.py
+ scipy/io/tests/test_idl.py
+ scipy/io/tests/test_mmio.py
+ scipy/io/tests/test_netcdf.py
+ scipy/io/tests/test_paths.py
+ scipy/io/tests/test_wavfile.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/linalg/ya.make b/contrib/python/scipy/py3/tests/linalg/ya.make
new file mode 100644
index 0000000000..5623e4afa0
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/linalg/ya.make
@@ -0,0 +1,54 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/linalg/tests/__init__.py
+ scipy/linalg/tests/test_basic.py
+ scipy/linalg/tests/test_blas.py
+ scipy/linalg/tests/test_cython_blas.py
+ scipy/linalg/tests/test_cython_lapack.py
+ scipy/linalg/tests/test_cythonized_array_utils.py
+ scipy/linalg/tests/test_decomp.py
+ scipy/linalg/tests/test_decomp_cholesky.py
+ scipy/linalg/tests/test_decomp_cossin.py
+ scipy/linalg/tests/test_decomp_ldl.py
+ scipy/linalg/tests/test_decomp_lu.py
+ scipy/linalg/tests/test_decomp_polar.py
+ scipy/linalg/tests/test_decomp_update.py
+ scipy/linalg/tests/test_fblas.py
+ scipy/linalg/tests/test_interpolative.py
+ scipy/linalg/tests/test_lapack.py
+ scipy/linalg/tests/test_matfuncs.py
+ scipy/linalg/tests/test_matmul_toeplitz.py
+ scipy/linalg/tests/test_misc.py
+ scipy/linalg/tests/test_procrustes.py
+ scipy/linalg/tests/test_sketches.py
+ scipy/linalg/tests/test_solve_toeplitz.py
+ scipy/linalg/tests/test_solvers.py
+ scipy/linalg/tests/test_special_matrices.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/misc/ya.make b/contrib/python/scipy/py3/tests/misc/ya.make
new file mode 100644
index 0000000000..0e8d676c8c
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/misc/ya.make
@@ -0,0 +1,28 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/misc/tests/__init__.py
+ scipy/misc/tests/test_common.py
+ scipy/misc/tests/test_config.py
+ scipy/misc/tests/test_doccer.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/ndimage/ya.make b/contrib/python/scipy/py3/tests/ndimage/ya.make
new file mode 100644
index 0000000000..45c61ce0bf
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/ndimage/ya.make
@@ -0,0 +1,36 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/ndimage/tests/__init__.py
+ scipy/ndimage/tests/test_datatypes.py
+ scipy/ndimage/tests/test_filters.py
+ scipy/ndimage/tests/test_fourier.py
+ scipy/ndimage/tests/test_interpolation.py
+ scipy/ndimage/tests/test_measurements.py
+ scipy/ndimage/tests/test_morphology.py
+ scipy/ndimage/tests/test_splines.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/odr/ya.make b/contrib/python/scipy/py3/tests/odr/ya.make
new file mode 100644
index 0000000000..7242b97930
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/odr/ya.make
@@ -0,0 +1,26 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/odr/tests/__init__.py
+ scipy/odr/tests/test_odr.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/optimize/ya.make b/contrib/python/scipy/py3/tests/optimize/ya.make
new file mode 100644
index 0000000000..67f934a48c
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/optimize/ya.make
@@ -0,0 +1,69 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/optimize/_trustregion_constr/tests/__init__.py
+ scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py
+ scipy/optimize/_trustregion_constr/tests/test_projections.py
+ scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py
+ scipy/optimize/_trustregion_constr/tests/test_report.py
+ scipy/optimize/tests/__init__.py
+ scipy/optimize/tests/test__basinhopping.py
+ scipy/optimize/tests/test__differential_evolution.py
+ scipy/optimize/tests/test__dual_annealing.py
+ scipy/optimize/tests/test__linprog_clean_inputs.py
+ scipy/optimize/tests/test__numdiff.py
+ scipy/optimize/tests/test__remove_redundancy.py
+ scipy/optimize/tests/test__root.py
+ scipy/optimize/tests/test__shgo.py
+ scipy/optimize/tests/test__spectral.py
+ scipy/optimize/tests/test_cobyla.py
+ scipy/optimize/tests/test_constraint_conversion.py
+ scipy/optimize/tests/test_constraints.py
+ scipy/optimize/tests/test_cython_optimize.py
+ scipy/optimize/tests/test_differentiable_functions.py
+ scipy/optimize/tests/test_direct.py
+ scipy/optimize/tests/test_hessian_update_strategy.py
+ scipy/optimize/tests/test_lbfgsb_hessinv.py
+ scipy/optimize/tests/test_lbfgsb_setulb.py
+ scipy/optimize/tests/test_least_squares.py
+ scipy/optimize/tests/test_linesearch.py
+ scipy/optimize/tests/test_linprog.py
+ scipy/optimize/tests/test_lsq_common.py
+ scipy/optimize/tests/test_lsq_linear.py
+ scipy/optimize/tests/test_milp.py
+ scipy/optimize/tests/test_minimize_constrained.py
+ scipy/optimize/tests/test_minpack.py
+ scipy/optimize/tests/test_nnls.py
+ scipy/optimize/tests/test_nonlin.py
+ scipy/optimize/tests/test_optimize.py
+ scipy/optimize/tests/test_quadratic_assignment.py
+ scipy/optimize/tests/test_regression.py
+ scipy/optimize/tests/test_slsqp.py
+ scipy/optimize/tests/test_tnc.py
+ scipy/optimize/tests/test_trustregion.py
+ scipy/optimize/tests/test_trustregion_exact.py
+ scipy/optimize/tests/test_trustregion_krylov.py
+ scipy/optimize/tests/test_zeros.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/signal/ya.make b/contrib/python/scipy/py3/tests/signal/ya.make
new file mode 100644
index 0000000000..fb45a7254c
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/signal/ya.make
@@ -0,0 +1,46 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/signal/tests/__init__.py
+ scipy/signal/tests/mpsig.py
+ scipy/signal/tests/test_array_tools.py
+ scipy/signal/tests/test_bsplines.py
+ scipy/signal/tests/test_cont2discrete.py
+ scipy/signal/tests/test_czt.py
+ scipy/signal/tests/test_dltisys.py
+ scipy/signal/tests/test_filter_design.py
+ scipy/signal/tests/test_fir_filter_design.py
+ scipy/signal/tests/test_ltisys.py
+ scipy/signal/tests/test_max_len_seq.py
+ scipy/signal/tests/test_peak_finding.py
+ scipy/signal/tests/test_result_type.py
+ scipy/signal/tests/test_savitzky_golay.py
+ scipy/signal/tests/test_signaltools.py
+ scipy/signal/tests/test_spectral.py
+ scipy/signal/tests/test_upfirdn.py
+ scipy/signal/tests/test_waveforms.py
+ scipy/signal/tests/test_wavelets.py
+ scipy/signal/tests/test_windows.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/sparse/ya.make b/contrib/python/scipy/py3/tests/sparse/ya.make
new file mode 100644
index 0000000000..946ba0acbd
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/sparse/ya.make
@@ -0,0 +1,75 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/sparse/csgraph/tests/__init__.py
+ scipy/sparse/csgraph/tests/test_connected_components.py
+ scipy/sparse/csgraph/tests/test_conversions.py
+ scipy/sparse/csgraph/tests/test_flow.py
+ scipy/sparse/csgraph/tests/test_graph_laplacian.py
+ scipy/sparse/csgraph/tests/test_matching.py
+ scipy/sparse/csgraph/tests/test_reordering.py
+ scipy/sparse/csgraph/tests/test_shortest_path.py
+ scipy/sparse/csgraph/tests/test_spanning_tree.py
+ scipy/sparse/csgraph/tests/test_traversal.py
+ scipy/sparse/linalg/_dsolve/tests/__init__.py
+ scipy/sparse/linalg/_dsolve/tests/test_linsolve.py
+ scipy/sparse/linalg/_eigen/arpack/tests/__init__.py
+ scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py
+ scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py
+ scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py
+ scipy/sparse/linalg/_eigen/tests/__init__.py
+ scipy/sparse/linalg/_eigen/tests/test_svds.py
+ scipy/sparse/linalg/_isolve/tests/__init__.py
+ scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py
+ scipy/sparse/linalg/_isolve/tests/test_iterative.py
+ scipy/sparse/linalg/_isolve/tests/test_lgmres.py
+ scipy/sparse/linalg/_isolve/tests/test_lsmr.py
+ scipy/sparse/linalg/_isolve/tests/test_lsqr.py
+ scipy/sparse/linalg/_isolve/tests/test_minres.py
+ scipy/sparse/linalg/_isolve/tests/test_utils.py
+ scipy/sparse/linalg/tests/__init__.py
+ scipy/sparse/linalg/tests/test_expm_multiply.py
+ scipy/sparse/linalg/tests/test_interface.py
+ scipy/sparse/linalg/tests/test_matfuncs.py
+ scipy/sparse/linalg/tests/test_norm.py
+ scipy/sparse/linalg/tests/test_onenormest.py
+ scipy/sparse/linalg/tests/test_pydata_sparse.py
+ scipy/sparse/tests/__init__.py
+ scipy/sparse/tests/test_array_api.py
+ scipy/sparse/tests/test_base.py
+ scipy/sparse/tests/test_construct.py
+ scipy/sparse/tests/test_csc.py
+ scipy/sparse/tests/test_csr.py
+ scipy/sparse/tests/test_deprecations.py
+ scipy/sparse/tests/test_extract.py
+ scipy/sparse/tests/test_matrix_io.py
+ scipy/sparse/tests/test_sparsetools.py
+ scipy/sparse/tests/test_spfuncs.py
+ scipy/sparse/tests/test_sputils.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/spatial/ya.make b/contrib/python/scipy/py3/tests/spatial/ya.make
new file mode 100644
index 0000000000..b6f681177a
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/spatial/ya.make
@@ -0,0 +1,43 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/spatial/tests/__init__.py
+ scipy/spatial/tests/test__plotutils.py
+ scipy/spatial/tests/test__procrustes.py
+ scipy/spatial/tests/test_distance.py
+ scipy/spatial/tests/test_hausdorff.py
+ scipy/spatial/tests/test_kdtree.py
+ scipy/spatial/tests/test_qhull.py
+ scipy/spatial/tests/test_slerp.py
+ scipy/spatial/tests/test_spherical_voronoi.py
+ scipy/spatial/transform/tests/__init__.py
+ scipy/spatial/transform/tests/test_rotation.py
+ scipy/spatial/transform/tests/test_rotation_groups.py
+ scipy/spatial/transform/tests/test_rotation_spline.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/special/ya.make b/contrib/python/scipy/py3/tests/special/ya.make
new file mode 100644
index 0000000000..9ed889f3b0
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/special/ya.make
@@ -0,0 +1,73 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/special/tests/__init__.py
+ scipy/special/tests/test_basic.py
+ scipy/special/tests/test_bdtr.py
+ scipy/special/tests/test_boxcox.py
+ scipy/special/tests/test_cdft_asymptotic.py
+ scipy/special/tests/test_cosine_distr.py
+ scipy/special/tests/test_cython_special.py
+ scipy/special/tests/test_data.py
+ scipy/special/tests/test_digamma.py
+ scipy/special/tests/test_ellip_harm.py
+ scipy/special/tests/test_erfinv.py
+ scipy/special/tests/test_faddeeva.py
+ scipy/special/tests/test_gamma.py
+ scipy/special/tests/test_gammainc.py
+ scipy/special/tests/test_hyp2f1.py
+ scipy/special/tests/test_hypergeometric.py
+ scipy/special/tests/test_kolmogorov.py
+ scipy/special/tests/test_lambertw.py
+ scipy/special/tests/test_log_softmax.py
+ scipy/special/tests/test_loggamma.py
+ scipy/special/tests/test_logit.py
+ scipy/special/tests/test_logsumexp.py
+ scipy/special/tests/test_nan_inputs.py
+ scipy/special/tests/test_ndtr.py
+ scipy/special/tests/test_ndtri_exp.py
+ scipy/special/tests/test_orthogonal.py
+ scipy/special/tests/test_orthogonal_eval.py
+ scipy/special/tests/test_owens_t.py
+ scipy/special/tests/test_pcf.py
+ scipy/special/tests/test_pdtr.py
+ scipy/special/tests/test_precompute_expn_asy.py
+ scipy/special/tests/test_precompute_gammainc.py
+ scipy/special/tests/test_precompute_utils.py
+ scipy/special/tests/test_sf_error.py
+ scipy/special/tests/test_sici.py
+ scipy/special/tests/test_spence.py
+ scipy/special/tests/test_spfun_stats.py
+ scipy/special/tests/test_sph_harm.py
+ scipy/special/tests/test_spherical_bessel.py
+ scipy/special/tests/test_trig.py
+ scipy/special/tests/test_wright_bessel.py
+ scipy/special/tests/test_wrightomega.py
+ scipy/special/tests/test_zeta.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/stats/ya.make b/contrib/python/scipy/py3/tests/stats/ya.make
new file mode 100644
index 0000000000..6cbecf1ab6
--- /dev/null
+++ b/contrib/python/scipy/py3/tests/stats/ya.make
@@ -0,0 +1,61 @@
+# Generated by devtools/yamaker.
+
+PY3TEST()
+
+SUBSCRIBER(g:python-contrib)
+
+VERSION(1.11.4)
+
+ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
+
+SIZE(MEDIUM)
+
+FORK_SUBTESTS()
+
+PEERDIR(
+ contrib/python/scipy/py3/tests
+)
+
+NO_LINT()
+
+DATA(
+ arcadia/contrib/python/scipy/py3
+)
+
+SRCDIR(contrib/python/scipy/py3)
+
+TEST_SRCS(
+ scipy/stats/tests/__init__.py
+ scipy/stats/tests/common_tests.py
+ scipy/stats/tests/data/fisher_exact_results_from_r.py
+ scipy/stats/tests/test_axis_nan_policy.py
+ scipy/stats/tests/test_binned_statistic.py
+ scipy/stats/tests/test_boost_ufuncs.py
+ scipy/stats/tests/test_censored_data.py
+ scipy/stats/tests/test_contingency.py
+ scipy/stats/tests/test_continuous_basic.py
+ scipy/stats/tests/test_continuous_fit_censored.py
+ scipy/stats/tests/test_crosstab.py
+ scipy/stats/tests/test_discrete_basic.py
+ scipy/stats/tests/test_discrete_distns.py
+ scipy/stats/tests/test_entropy.py
+ scipy/stats/tests/test_fit.py
+ scipy/stats/tests/test_hypotests.py
+ scipy/stats/tests/test_morestats.py
+ scipy/stats/tests/test_mstats_basic.py
+ scipy/stats/tests/test_mstats_extras.py
+ scipy/stats/tests/test_multicomp.py
+ scipy/stats/tests/test_odds_ratio.py
+ scipy/stats/tests/test_qmc.py
+ scipy/stats/tests/test_rank.py
+ scipy/stats/tests/test_relative_risk.py
+ scipy/stats/tests/test_resampling.py
+ scipy/stats/tests/test_sampling.py
+ scipy/stats/tests/test_sensitivity_analysis.py
+ scipy/stats/tests/test_stats.py
+ scipy/stats/tests/test_survival.py
+ scipy/stats/tests/test_tukeylambda_stats.py
+ scipy/stats/tests/test_variation.py
+)
+
+END()
diff --git a/contrib/python/scipy/py3/tests/ya.make b/contrib/python/scipy/py3/tests/ya.make
index b0b1bf51bc..7ccd7890bf 100644
--- a/contrib/python/scipy/py3/tests/ya.make
+++ b/contrib/python/scipy/py3/tests/ya.make
@@ -1,6 +1,6 @@
# Generated by devtools/yamaker.
-PY3TEST()
+PY3_LIBRARY()
SUBSCRIBER(g:python-contrib)
@@ -8,13 +8,7 @@ VERSION(1.11.4)
ORIGINAL_SOURCE(mirror://pypi/s/scipy/scipy-1.11.4.tar.gz)
-SIZE(MEDIUM)
-
-FORK_SUBTESTS()
-
-SPLIT_FACTOR(20)
-
-REQUIREMENTS(ram:30)
+LICENSE(BSD-3-Clause)
PEERDIR(
contrib/python/mpmath
@@ -24,10 +18,6 @@ PEERDIR(
NO_LINT()
-DATA(
- arcadia/contrib/python/scipy/py3
-)
-
SRCDIR(contrib/python/scipy/py3)
PY_SRCS(
@@ -35,319 +25,26 @@ PY_SRCS(
scipy/conftest.py
)
-TEST_SRCS(
- scipy/_build_utils/tests/__init__.py
- scipy/_build_utils/tests/test_scipy_version.py
- scipy/_lib/tests/__init__.py
- scipy/_lib/tests/test__gcutils.py
- scipy/_lib/tests/test__pep440.py
- scipy/_lib/tests/test__testutils.py
- scipy/_lib/tests/test__threadsafety.py
- scipy/_lib/tests/test__util.py
- scipy/_lib/tests/test_bunch.py
- scipy/_lib/tests/test_public_api.py
- scipy/_lib/tests/test_tmpdirs.py
- scipy/_lib/tests/test_warnings.py
- scipy/cluster/tests/__init__.py
- scipy/cluster/tests/hierarchy_test_data.py
- scipy/cluster/tests/test_disjoint_set.py
- scipy/cluster/tests/test_hierarchy.py
- scipy/cluster/tests/test_vq.py
- scipy/constants/tests/__init__.py
- scipy/constants/tests/test_codata.py
- scipy/constants/tests/test_constants.py
- scipy/fft/_pocketfft/tests/__init__.py
- scipy/fft/_pocketfft/tests/test_basic.py
- scipy/fft/_pocketfft/tests/test_real_transforms.py
- scipy/fft/tests/__init__.py
- scipy/fft/tests/mock_backend.py
- scipy/fft/tests/test_backend.py
- scipy/fft/tests/test_fft_function.py
- scipy/fft/tests/test_fftlog.py
- scipy/fft/tests/test_helper.py
- scipy/fft/tests/test_multithreading.py
- scipy/fft/tests/test_numpy.py
- scipy/fft/tests/test_real_transforms.py
- scipy/fftpack/tests/__init__.py
- scipy/fftpack/tests/test_basic.py
- scipy/fftpack/tests/test_helper.py
- scipy/fftpack/tests/test_import.py
- scipy/fftpack/tests/test_pseudo_diffs.py
- scipy/fftpack/tests/test_real_transforms.py
- scipy/integrate/_ivp/tests/__init__.py
- scipy/integrate/_ivp/tests/test_ivp.py
- scipy/integrate/_ivp/tests/test_rk.py
- scipy/integrate/tests/__init__.py
- scipy/integrate/tests/test__quad_vec.py
- scipy/integrate/tests/test_banded_ode_solvers.py
- scipy/integrate/tests/test_bvp.py
- scipy/integrate/tests/test_integrate.py
- scipy/interpolate/tests/__init__.py
- scipy/interpolate/tests/test_bsplines.py
- scipy/interpolate/tests/test_fitpack.py
- scipy/interpolate/tests/test_fitpack2.py
- scipy/interpolate/tests/test_gil.py
- scipy/interpolate/tests/test_interpnd.py
- scipy/interpolate/tests/test_interpolate.py
- scipy/interpolate/tests/test_ndgriddata.py
- scipy/interpolate/tests/test_pade.py
- scipy/interpolate/tests/test_polyint.py
- scipy/interpolate/tests/test_rbf.py
- scipy/interpolate/tests/test_rbfinterp.py
- scipy/interpolate/tests/test_rgi.py
- scipy/io/_harwell_boeing/tests/__init__.py
- scipy/io/_harwell_boeing/tests/test_fortran_format.py
- scipy/io/_harwell_boeing/tests/test_hb.py
- scipy/io/arff/tests/__init__.py
- scipy/io/arff/tests/test_arffread.py
- scipy/io/matlab/tests/__init__.py
- scipy/io/matlab/tests/test_byteordercodes.py
- scipy/io/matlab/tests/test_mio.py
- scipy/io/matlab/tests/test_mio5_utils.py
- scipy/io/matlab/tests/test_mio_funcs.py
- scipy/io/matlab/tests/test_mio_utils.py
- scipy/io/matlab/tests/test_miobase.py
- scipy/io/matlab/tests/test_pathological.py
- scipy/io/matlab/tests/test_streams.py
- scipy/io/tests/__init__.py
- scipy/io/tests/test_idl.py
- scipy/io/tests/test_mmio.py
- scipy/io/tests/test_netcdf.py
- scipy/io/tests/test_paths.py
- scipy/io/tests/test_wavfile.py
- scipy/linalg/tests/__init__.py
- scipy/linalg/tests/test_basic.py
- scipy/linalg/tests/test_blas.py
- scipy/linalg/tests/test_cython_blas.py
- scipy/linalg/tests/test_cython_lapack.py
- scipy/linalg/tests/test_cythonized_array_utils.py
- scipy/linalg/tests/test_decomp.py
- scipy/linalg/tests/test_decomp_cholesky.py
- scipy/linalg/tests/test_decomp_cossin.py
- scipy/linalg/tests/test_decomp_ldl.py
- scipy/linalg/tests/test_decomp_lu.py
- scipy/linalg/tests/test_decomp_polar.py
- scipy/linalg/tests/test_decomp_update.py
- scipy/linalg/tests/test_fblas.py
- scipy/linalg/tests/test_interpolative.py
- scipy/linalg/tests/test_lapack.py
- scipy/linalg/tests/test_matfuncs.py
- scipy/linalg/tests/test_matmul_toeplitz.py
- scipy/linalg/tests/test_misc.py
- scipy/linalg/tests/test_procrustes.py
- scipy/linalg/tests/test_sketches.py
- scipy/linalg/tests/test_solve_toeplitz.py
- scipy/linalg/tests/test_solvers.py
- scipy/linalg/tests/test_special_matrices.py
- scipy/misc/tests/__init__.py
- scipy/misc/tests/test_common.py
- scipy/misc/tests/test_config.py
- scipy/misc/tests/test_doccer.py
- scipy/ndimage/tests/__init__.py
- scipy/ndimage/tests/test_datatypes.py
- scipy/ndimage/tests/test_filters.py
- scipy/ndimage/tests/test_fourier.py
- scipy/ndimage/tests/test_interpolation.py
- scipy/ndimage/tests/test_measurements.py
- scipy/ndimage/tests/test_morphology.py
- scipy/ndimage/tests/test_splines.py
- scipy/odr/tests/__init__.py
- scipy/odr/tests/test_odr.py
- scipy/optimize/_trustregion_constr/tests/__init__.py
- scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py
- scipy/optimize/_trustregion_constr/tests/test_projections.py
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py
- scipy/optimize/_trustregion_constr/tests/test_report.py
- scipy/optimize/tests/__init__.py
- scipy/optimize/tests/test__basinhopping.py
- scipy/optimize/tests/test__differential_evolution.py
- scipy/optimize/tests/test__dual_annealing.py
- scipy/optimize/tests/test__linprog_clean_inputs.py
- scipy/optimize/tests/test__numdiff.py
- scipy/optimize/tests/test__remove_redundancy.py
- scipy/optimize/tests/test__root.py
- scipy/optimize/tests/test__shgo.py
- scipy/optimize/tests/test__spectral.py
- scipy/optimize/tests/test_cobyla.py
- scipy/optimize/tests/test_constraint_conversion.py
- scipy/optimize/tests/test_constraints.py
- scipy/optimize/tests/test_cython_optimize.py
- scipy/optimize/tests/test_differentiable_functions.py
- scipy/optimize/tests/test_direct.py
- scipy/optimize/tests/test_hessian_update_strategy.py
- scipy/optimize/tests/test_lbfgsb_hessinv.py
- scipy/optimize/tests/test_lbfgsb_setulb.py
- scipy/optimize/tests/test_least_squares.py
- scipy/optimize/tests/test_linesearch.py
- scipy/optimize/tests/test_linprog.py
- scipy/optimize/tests/test_lsq_common.py
- scipy/optimize/tests/test_lsq_linear.py
- scipy/optimize/tests/test_milp.py
- scipy/optimize/tests/test_minimize_constrained.py
- scipy/optimize/tests/test_minpack.py
- scipy/optimize/tests/test_nnls.py
- scipy/optimize/tests/test_nonlin.py
- scipy/optimize/tests/test_optimize.py
- scipy/optimize/tests/test_quadratic_assignment.py
- scipy/optimize/tests/test_regression.py
- scipy/optimize/tests/test_slsqp.py
- scipy/optimize/tests/test_tnc.py
- scipy/optimize/tests/test_trustregion.py
- scipy/optimize/tests/test_trustregion_exact.py
- scipy/optimize/tests/test_trustregion_krylov.py
- scipy/optimize/tests/test_zeros.py
- scipy/signal/tests/__init__.py
- scipy/signal/tests/mpsig.py
- scipy/signal/tests/test_array_tools.py
- scipy/signal/tests/test_bsplines.py
- scipy/signal/tests/test_cont2discrete.py
- scipy/signal/tests/test_czt.py
- scipy/signal/tests/test_dltisys.py
- scipy/signal/tests/test_filter_design.py
- scipy/signal/tests/test_fir_filter_design.py
- scipy/signal/tests/test_ltisys.py
- scipy/signal/tests/test_max_len_seq.py
- scipy/signal/tests/test_peak_finding.py
- scipy/signal/tests/test_result_type.py
- scipy/signal/tests/test_savitzky_golay.py
- scipy/signal/tests/test_signaltools.py
- scipy/signal/tests/test_spectral.py
- scipy/signal/tests/test_upfirdn.py
- scipy/signal/tests/test_waveforms.py
- scipy/signal/tests/test_wavelets.py
- scipy/signal/tests/test_windows.py
- scipy/sparse/csgraph/tests/__init__.py
- scipy/sparse/csgraph/tests/test_connected_components.py
- scipy/sparse/csgraph/tests/test_conversions.py
- scipy/sparse/csgraph/tests/test_flow.py
- scipy/sparse/csgraph/tests/test_graph_laplacian.py
- scipy/sparse/csgraph/tests/test_matching.py
- scipy/sparse/csgraph/tests/test_reordering.py
- scipy/sparse/csgraph/tests/test_shortest_path.py
- scipy/sparse/csgraph/tests/test_spanning_tree.py
- scipy/sparse/csgraph/tests/test_traversal.py
- scipy/sparse/linalg/_dsolve/tests/__init__.py
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py
- scipy/sparse/linalg/_eigen/arpack/tests/__init__.py
- scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py
- scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py
- scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py
- scipy/sparse/linalg/_eigen/tests/__init__.py
- scipy/sparse/linalg/_eigen/tests/test_svds.py
- scipy/sparse/linalg/_isolve/tests/__init__.py
- scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py
- scipy/sparse/linalg/_isolve/tests/test_iterative.py
- scipy/sparse/linalg/_isolve/tests/test_lgmres.py
- scipy/sparse/linalg/_isolve/tests/test_lsmr.py
- scipy/sparse/linalg/_isolve/tests/test_lsqr.py
- scipy/sparse/linalg/_isolve/tests/test_minres.py
- scipy/sparse/linalg/_isolve/tests/test_utils.py
- scipy/sparse/linalg/tests/__init__.py
- scipy/sparse/linalg/tests/test_expm_multiply.py
- scipy/sparse/linalg/tests/test_interface.py
- scipy/sparse/linalg/tests/test_matfuncs.py
- scipy/sparse/linalg/tests/test_norm.py
- scipy/sparse/linalg/tests/test_onenormest.py
- scipy/sparse/linalg/tests/test_pydata_sparse.py
- scipy/sparse/tests/__init__.py
- scipy/sparse/tests/test_array_api.py
- scipy/sparse/tests/test_base.py
- scipy/sparse/tests/test_construct.py
- scipy/sparse/tests/test_csc.py
- scipy/sparse/tests/test_csr.py
- scipy/sparse/tests/test_deprecations.py
- scipy/sparse/tests/test_extract.py
- scipy/sparse/tests/test_matrix_io.py
- scipy/sparse/tests/test_sparsetools.py
- scipy/sparse/tests/test_spfuncs.py
- scipy/sparse/tests/test_sputils.py
- scipy/spatial/tests/__init__.py
- scipy/spatial/tests/test__plotutils.py
- scipy/spatial/tests/test__procrustes.py
- scipy/spatial/tests/test_distance.py
- scipy/spatial/tests/test_hausdorff.py
- scipy/spatial/tests/test_kdtree.py
- scipy/spatial/tests/test_qhull.py
- scipy/spatial/tests/test_slerp.py
- scipy/spatial/tests/test_spherical_voronoi.py
- scipy/spatial/transform/tests/__init__.py
- scipy/spatial/transform/tests/test_rotation.py
- scipy/spatial/transform/tests/test_rotation_groups.py
- scipy/spatial/transform/tests/test_rotation_spline.py
- scipy/special/tests/__init__.py
- scipy/special/tests/test_basic.py
- scipy/special/tests/test_bdtr.py
- scipy/special/tests/test_boxcox.py
- scipy/special/tests/test_cdft_asymptotic.py
- scipy/special/tests/test_cosine_distr.py
- scipy/special/tests/test_cython_special.py
- scipy/special/tests/test_data.py
- scipy/special/tests/test_digamma.py
- scipy/special/tests/test_ellip_harm.py
- scipy/special/tests/test_erfinv.py
- scipy/special/tests/test_faddeeva.py
- scipy/special/tests/test_gamma.py
- scipy/special/tests/test_gammainc.py
- scipy/special/tests/test_hyp2f1.py
- scipy/special/tests/test_hypergeometric.py
- scipy/special/tests/test_kolmogorov.py
- scipy/special/tests/test_lambertw.py
- scipy/special/tests/test_log_softmax.py
- scipy/special/tests/test_loggamma.py
- scipy/special/tests/test_logit.py
- scipy/special/tests/test_logsumexp.py
- scipy/special/tests/test_nan_inputs.py
- scipy/special/tests/test_ndtr.py
- scipy/special/tests/test_ndtri_exp.py
- scipy/special/tests/test_orthogonal.py
- scipy/special/tests/test_orthogonal_eval.py
- scipy/special/tests/test_owens_t.py
- scipy/special/tests/test_pcf.py
- scipy/special/tests/test_pdtr.py
- scipy/special/tests/test_precompute_expn_asy.py
- scipy/special/tests/test_precompute_gammainc.py
- scipy/special/tests/test_precompute_utils.py
- scipy/special/tests/test_sf_error.py
- scipy/special/tests/test_sici.py
- scipy/special/tests/test_spence.py
- scipy/special/tests/test_spfun_stats.py
- scipy/special/tests/test_sph_harm.py
- scipy/special/tests/test_spherical_bessel.py
- scipy/special/tests/test_trig.py
- scipy/special/tests/test_wright_bessel.py
- scipy/special/tests/test_wrightomega.py
- scipy/special/tests/test_zeta.py
- scipy/stats/tests/__init__.py
- scipy/stats/tests/common_tests.py
- scipy/stats/tests/data/fisher_exact_results_from_r.py
- scipy/stats/tests/test_axis_nan_policy.py
- scipy/stats/tests/test_binned_statistic.py
- scipy/stats/tests/test_boost_ufuncs.py
- scipy/stats/tests/test_censored_data.py
- scipy/stats/tests/test_contingency.py
- scipy/stats/tests/test_continuous_basic.py
- scipy/stats/tests/test_continuous_fit_censored.py
- scipy/stats/tests/test_crosstab.py
- scipy/stats/tests/test_discrete_basic.py
- scipy/stats/tests/test_discrete_distns.py
- scipy/stats/tests/test_entropy.py
- scipy/stats/tests/test_fit.py
- scipy/stats/tests/test_hypotests.py
- scipy/stats/tests/test_morestats.py
- scipy/stats/tests/test_mstats_basic.py
- scipy/stats/tests/test_mstats_extras.py
- scipy/stats/tests/test_multicomp.py
- scipy/stats/tests/test_odds_ratio.py
- scipy/stats/tests/test_qmc.py
- scipy/stats/tests/test_rank.py
- scipy/stats/tests/test_relative_risk.py
- scipy/stats/tests/test_resampling.py
- scipy/stats/tests/test_sampling.py
- scipy/stats/tests/test_sensitivity_analysis.py
- scipy/stats/tests/test_stats.py
- scipy/stats/tests/test_survival.py
- scipy/stats/tests/test_tukeylambda_stats.py
- scipy/stats/tests/test_variation.py
-)
-
END()
+
+RECURSE_FOR_TESTS(
+ _build_utils
+ _lib
+ cluster
+ constants
+ fft
+ fftpack
+ integrate
+ interpolate
+ io
+ linalg
+ misc
+ ndimage
+ odr
+ optimize
+ signal
+ sparse
+ spatial
+ special
+ stats
+)
diff --git a/contrib/python/six/py2/.dist-info/METADATA b/contrib/python/six/py2/.dist-info/METADATA
index 6d7525c2eb..cfde03c263 100644
--- a/contrib/python/six/py2/.dist-info/METADATA
+++ b/contrib/python/six/py2/.dist-info/METADATA
@@ -1,12 +1,11 @@
Metadata-Version: 2.1
Name: six
-Version: 1.16.0
+Version: 1.17.0
Summary: Python 2 and 3 compatibility utilities
Home-page: https://github.com/benjaminp/six
Author: Benjamin Peterson
Author-email: benjamin@python.org
License: MIT
-Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
@@ -15,15 +14,12 @@ Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Utilities
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
+License-File: LICENSE
.. image:: https://img.shields.io/pypi/v/six.svg
:target: https://pypi.org/project/six/
:alt: six on PyPI
-.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
- :target: https://travis-ci.org/benjaminp/six
- :alt: six on TravisCI
-
.. image:: https://readthedocs.org/projects/six/badge/?version=latest
:target: https://six.readthedocs.io/
:alt: six's documentation on Read the Docs
@@ -45,5 +41,3 @@ Online documentation is at https://six.readthedocs.io/.
Bugs can be reported to https://github.com/benjaminp/six. The code can also
be found there.
-
-
diff --git a/contrib/python/six/py2/LICENSE b/contrib/python/six/py2/LICENSE
index de6633112c..1cc22a5aa7 100644
--- a/contrib/python/six/py2/LICENSE
+++ b/contrib/python/six/py2/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2020 Benjamin Peterson
+Copyright (c) 2010-2024 Benjamin Peterson
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
diff --git a/contrib/python/six/py2/README.rst b/contrib/python/six/py2/README.rst
index 6339ba5d93..3674bc956e 100644
--- a/contrib/python/six/py2/README.rst
+++ b/contrib/python/six/py2/README.rst
@@ -2,10 +2,6 @@
:target: https://pypi.org/project/six/
:alt: six on PyPI
-.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
- :target: https://travis-ci.org/benjaminp/six
- :alt: six on TravisCI
-
.. image:: https://readthedocs.org/projects/six/badge/?version=latest
:target: https://six.readthedocs.io/
:alt: six's documentation on Read the Docs
diff --git a/contrib/python/six/py2/six.py b/contrib/python/six/py2/six.py
index 4cba03c75f..29b5da2249 100644
--- a/contrib/python/six/py2/six.py
+++ b/contrib/python/six/py2/six.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2020 Benjamin Peterson
+# Copyright (c) 2010-2024 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -29,7 +29,7 @@ import sys
import types
__author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.16.0"
+__version__ = "1.17.0"
# Useful for very coarse version differentiation.
@@ -263,7 +263,7 @@ _moved_attributes = [
MovedAttribute("reduce", "__builtin__", "functools"),
MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
MovedAttribute("StringIO", "StringIO", "io"),
- MovedAttribute("UserDict", "UserDict", "collections"),
+ MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"),
MovedAttribute("UserList", "UserList", "collections"),
MovedAttribute("UserString", "UserString", "collections"),
MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
@@ -435,12 +435,17 @@ _urllib_request_moved_attributes = [
MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
MovedAttribute("urlretrieve", "urllib", "urllib.request"),
MovedAttribute("urlcleanup", "urllib", "urllib.request"),
- MovedAttribute("URLopener", "urllib", "urllib.request"),
- MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
]
+if sys.version_info[:2] < (3, 14):
+ _urllib_request_moved_attributes.extend(
+ [
+ MovedAttribute("URLopener", "urllib", "urllib.request"),
+ MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+ ]
+ )
for attr in _urllib_request_moved_attributes:
setattr(Module_six_moves_urllib_request, attr.name, attr)
del attr
diff --git a/contrib/python/six/py2/ya.make b/contrib/python/six/py2/ya.make
index ca16ba19ac..bac6050e1c 100644
--- a/contrib/python/six/py2/ya.make
+++ b/contrib/python/six/py2/ya.make
@@ -2,7 +2,7 @@
PY2_LIBRARY()
-VERSION(1.16.0)
+VERSION(1.17.0)
LICENSE(MIT)
diff --git a/contrib/python/six/py3/.dist-info/METADATA b/contrib/python/six/py3/.dist-info/METADATA
index 6d7525c2eb..cfde03c263 100644
--- a/contrib/python/six/py3/.dist-info/METADATA
+++ b/contrib/python/six/py3/.dist-info/METADATA
@@ -1,12 +1,11 @@
Metadata-Version: 2.1
Name: six
-Version: 1.16.0
+Version: 1.17.0
Summary: Python 2 and 3 compatibility utilities
Home-page: https://github.com/benjaminp/six
Author: Benjamin Peterson
Author-email: benjamin@python.org
License: MIT
-Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
@@ -15,15 +14,12 @@ Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Utilities
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
+License-File: LICENSE
.. image:: https://img.shields.io/pypi/v/six.svg
:target: https://pypi.org/project/six/
:alt: six on PyPI
-.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
- :target: https://travis-ci.org/benjaminp/six
- :alt: six on TravisCI
-
.. image:: https://readthedocs.org/projects/six/badge/?version=latest
:target: https://six.readthedocs.io/
:alt: six's documentation on Read the Docs
@@ -45,5 +41,3 @@ Online documentation is at https://six.readthedocs.io/.
Bugs can be reported to https://github.com/benjaminp/six. The code can also
be found there.
-
-
diff --git a/contrib/python/six/py3/LICENSE b/contrib/python/six/py3/LICENSE
index de6633112c..1cc22a5aa7 100644
--- a/contrib/python/six/py3/LICENSE
+++ b/contrib/python/six/py3/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2020 Benjamin Peterson
+Copyright (c) 2010-2024 Benjamin Peterson
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
diff --git a/contrib/python/six/py3/README.rst b/contrib/python/six/py3/README.rst
index 6339ba5d93..3674bc956e 100644
--- a/contrib/python/six/py3/README.rst
+++ b/contrib/python/six/py3/README.rst
@@ -2,10 +2,6 @@
:target: https://pypi.org/project/six/
:alt: six on PyPI
-.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
- :target: https://travis-ci.org/benjaminp/six
- :alt: six on TravisCI
-
.. image:: https://readthedocs.org/projects/six/badge/?version=latest
:target: https://six.readthedocs.io/
:alt: six's documentation on Read the Docs
diff --git a/contrib/python/six/py3/six.py b/contrib/python/six/py3/six.py
index 4cba03c75f..29b5da2249 100644
--- a/contrib/python/six/py3/six.py
+++ b/contrib/python/six/py3/six.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2020 Benjamin Peterson
+# Copyright (c) 2010-2024 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -29,7 +29,7 @@ import sys
import types
__author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.16.0"
+__version__ = "1.17.0"
# Useful for very coarse version differentiation.
@@ -263,7 +263,7 @@ _moved_attributes = [
MovedAttribute("reduce", "__builtin__", "functools"),
MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
MovedAttribute("StringIO", "StringIO", "io"),
- MovedAttribute("UserDict", "UserDict", "collections"),
+ MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"),
MovedAttribute("UserList", "UserList", "collections"),
MovedAttribute("UserString", "UserString", "collections"),
MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
@@ -435,12 +435,17 @@ _urllib_request_moved_attributes = [
MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
MovedAttribute("urlretrieve", "urllib", "urllib.request"),
MovedAttribute("urlcleanup", "urllib", "urllib.request"),
- MovedAttribute("URLopener", "urllib", "urllib.request"),
- MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
]
+if sys.version_info[:2] < (3, 14):
+ _urllib_request_moved_attributes.extend(
+ [
+ MovedAttribute("URLopener", "urllib", "urllib.request"),
+ MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+ ]
+ )
for attr in _urllib_request_moved_attributes:
setattr(Module_six_moves_urllib_request, attr.name, attr)
del attr
diff --git a/contrib/python/six/py3/ya.make b/contrib/python/six/py3/ya.make
index ca5870c634..077c2a4153 100644
--- a/contrib/python/six/py3/ya.make
+++ b/contrib/python/six/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(1.16.0)
+VERSION(1.17.0)
LICENSE(MIT)
diff --git a/contrib/python/types-protobuf/.dist-info/METADATA b/contrib/python/types-protobuf/.dist-info/METADATA
index ed5007793c..2d60622cee 100644
--- a/contrib/python/types-protobuf/.dist-info/METADATA
+++ b/contrib/python/types-protobuf/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: types-protobuf
-Version: 5.28.3.20241203
+Version: 5.29.1.20241207
Summary: Typing stubs for protobuf
Home-page: https://github.com/python/typeshed
License: Apache-2.0
@@ -26,9 +26,9 @@ It can be used by type-checking tools like
[Pyre](https://pyre-check.org/),
PyCharm, etc. to check code that uses `protobuf`. This version of
`types-protobuf` aims to provide accurate annotations for
-`protobuf~=5.28.3`.
+`protobuf~=5.29.1`.
-Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 27.2 on [protobuf v28.3](https://github.com/protocolbuffers/protobuf/releases/tag/v28.3) (python `protobuf==5.28.3`).
+Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 28.1 on [protobuf v29.1](https://github.com/protocolbuffers/protobuf/releases/tag/v29.1) (python `protobuf==5.29.1`).
This stub package is marked as [partial](https://peps.python.org/pep-0561/#partial-stub-packages).
If you find that annotations are missing, feel free to contribute and help complete them.
@@ -46,4 +46,4 @@ mypy 1.13.0,
pyright 1.1.389,
and pytype 2024.10.11.
It was generated from typeshed commit
-[`f7c6acde6e1718b5f8748815200e95ef05d96d32`](https://github.com/python/typeshed/commit/f7c6acde6e1718b5f8748815200e95ef05d96d32).
+[`0e9c9e1362959512a880abbf1275471b0d76924f`](https://github.com/python/typeshed/commit/0e9c9e1362959512a880abbf1275471b0d76924f).
diff --git a/contrib/python/types-protobuf/README.md b/contrib/python/types-protobuf/README.md
index 8918d05f8e..ba94ec673a 100644
--- a/contrib/python/types-protobuf/README.md
+++ b/contrib/python/types-protobuf/README.md
@@ -9,9 +9,9 @@ It can be used by type-checking tools like
[Pyre](https://pyre-check.org/),
PyCharm, etc. to check code that uses `protobuf`. This version of
`types-protobuf` aims to provide accurate annotations for
-`protobuf~=5.28.3`.
+`protobuf~=5.29.1`.
-Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 27.2 on [protobuf v28.3](https://github.com/protocolbuffers/protobuf/releases/tag/v28.3) (python `protobuf==5.28.3`).
+Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 28.1 on [protobuf v29.1](https://github.com/protocolbuffers/protobuf/releases/tag/v29.1) (python `protobuf==5.29.1`).
This stub package is marked as [partial](https://peps.python.org/pep-0561/#partial-stub-packages).
If you find that annotations are missing, feel free to contribute and help complete them.
@@ -29,4 +29,4 @@ mypy 1.13.0,
pyright 1.1.389,
and pytype 2024.10.11.
It was generated from typeshed commit
-[`f7c6acde6e1718b5f8748815200e95ef05d96d32`](https://github.com/python/typeshed/commit/f7c6acde6e1718b5f8748815200e95ef05d96d32). \ No newline at end of file
+[`0e9c9e1362959512a880abbf1275471b0d76924f`](https://github.com/python/typeshed/commit/0e9c9e1362959512a880abbf1275471b0d76924f). \ No newline at end of file
diff --git a/contrib/python/types-protobuf/google-stubs/METADATA.toml b/contrib/python/types-protobuf/google-stubs/METADATA.toml
index 8349e2ea04..04c674e5fb 100644
--- a/contrib/python/types-protobuf/google-stubs/METADATA.toml
+++ b/contrib/python/types-protobuf/google-stubs/METADATA.toml
@@ -1,7 +1,7 @@
# Using an exact number in the specifier for scripts/sync_protobuf/google_protobuf.py
-version = "~=5.28.3"
+version = "~=5.29.1"
upstream_repository = "https://github.com/protocolbuffers/protobuf"
-extra_description = "Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 27.2 on [protobuf v28.3](https://github.com/protocolbuffers/protobuf/releases/tag/v28.3) (python `protobuf==5.28.3`)."
+extra_description = "Partially generated using [mypy-protobuf==3.6.0](https://github.com/nipunn1313/mypy-protobuf/tree/v3.6.0) and libprotoc 28.1 on [protobuf v29.1](https://github.com/protocolbuffers/protobuf/releases/tag/v29.1) (python `protobuf==5.29.1`)."
partial_stub = true
[tool.stubtest]
diff --git a/contrib/python/types-protobuf/ya.make b/contrib/python/types-protobuf/ya.make
index bd30a270ca..d583cb9a7c 100644
--- a/contrib/python/types-protobuf/ya.make
+++ b/contrib/python/types-protobuf/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(5.28.3.20241203)
+VERSION(5.29.1.20241207)
LICENSE(Apache-2.0)
diff --git a/contrib/python/ydb/py3/.dist-info/METADATA b/contrib/python/ydb/py3/.dist-info/METADATA
index 756e15d29a..8e8b79f6ab 100644
--- a/contrib/python/ydb/py3/.dist-info/METADATA
+++ b/contrib/python/ydb/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: ydb
-Version: 3.18.10
+Version: 3.18.11
Summary: YDB Python SDK
Home-page: http://github.com/ydb-platform/ydb-python-sdk
Author: Yandex LLC
diff --git a/contrib/python/ydb/py3/ya.make b/contrib/python/ydb/py3/ya.make
index a643d0b0b4..284cfb73d0 100644
--- a/contrib/python/ydb/py3/ya.make
+++ b/contrib/python/ydb/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(3.18.10)
+VERSION(3.18.11)
LICENSE(Apache-2.0)
diff --git a/contrib/python/ydb/py3/ydb/_topic_writer/topic_writer_asyncio.py b/contrib/python/ydb/py3/ydb/_topic_writer/topic_writer_asyncio.py
index c7f88a42a3..d759072c22 100644
--- a/contrib/python/ydb/py3/ydb/_topic_writer/topic_writer_asyncio.py
+++ b/contrib/python/ydb/py3/ydb/_topic_writer/topic_writer_asyncio.py
@@ -307,7 +307,7 @@ class WriterAsyncIOReconnector:
def _prepare_internal_messages(self, messages: List[PublicMessage]) -> List[InternalMessage]:
if self._settings.auto_created_at:
- now = datetime.datetime.now()
+ now = datetime.datetime.now(datetime.timezone.utc)
else:
now = None
diff --git a/contrib/python/ydb/py3/ydb/ydb_version.py b/contrib/python/ydb/py3/ydb/ydb_version.py
index 6d13618e64..c51c9d45d8 100644
--- a/contrib/python/ydb/py3/ydb/ydb_version.py
+++ b/contrib/python/ydb/py3/ydb/ydb_version.py
@@ -1 +1 @@
-VERSION = "3.18.10"
+VERSION = "3.18.11"
diff --git a/contrib/restricted/boost/context/.yandex_meta/devtools.copyrights.report b/contrib/restricted/boost/context/.yandex_meta/devtools.copyrights.report
index bc3f7ce474..5ab98d2b00 100644
--- a/contrib/restricted/boost/context/.yandex_meta/devtools.copyrights.report
+++ b/contrib/restricted/boost/context/.yandex_meta/devtools.copyrights.report
@@ -54,21 +54,6 @@ BELONGS ya.make
src/asm/ontop_arm64_aapcs_macho_gas.S [2:4]
src/asm/ontop_arm64_aapcs_pe_armasm.masm [1:3]
-KEEP COPYRIGHT_SERVICE_LABEL 48ce97ba62fc10cee11a213ab0560d6d
-BELONGS ya.make
- License text:
- Copyright Claudio Jeker 2024
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- Scancode info:
- Original SPDX id: COPYRIGHT_SERVICE_LABEL
- Score : 100.00
- Match type : COPYRIGHT
- Files with this license:
- src/asm/jump_sparc64_sysv_elf_gas.S [2:4]
- src/asm/make_sparc64_sysv_elf_gas.S [2:4]
- src/asm/ontop_sparc64_sysv_elf_gas.S [2:4]
-
KEEP COPYRIGHT_SERVICE_LABEL 768f987faaed0adc6222ab24c7bd02e6
BELONGS ya.make
License text:
@@ -84,101 +69,41 @@ BELONGS ya.make
src/asm/jump_arm_aapcs_elf_gas.S [2:4]
src/asm/jump_arm_aapcs_macho_gas.S [2:4]
src/asm/jump_arm_aapcs_pe_armasm.masm [2:4]
- src/asm/jump_i386_ms_pe_clang_gas.S [2:5]
- src/asm/jump_i386_ms_pe_gas.asm [2:5]
src/asm/jump_i386_ms_pe_masm.masm [2:4]
src/asm/jump_i386_sysv_elf_gas.S [2:4]
src/asm/jump_i386_sysv_macho_gas.S [2:4]
- src/asm/jump_mips32_o32_elf_gas.S [2:4]
- src/asm/jump_ppc32_sysv_elf_gas.S [2:4]
- src/asm/jump_ppc32_sysv_macho_gas.S [2:4]
- src/asm/jump_ppc32_sysv_xcoff_gas.S [2:4]
- src/asm/jump_ppc64_sysv_elf_gas.S [2:4]
- src/asm/jump_ppc64_sysv_macho_gas.S [2:4]
- src/asm/jump_ppc64_sysv_xcoff_gas.S [3:5]
- src/asm/jump_x86_64_ms_pe_clang_gas.S [2:5]
- src/asm/jump_x86_64_ms_pe_gas.asm [2:5]
src/asm/jump_x86_64_ms_pe_masm.masm [2:4]
src/asm/jump_x86_64_sysv_elf_gas.S [2:4]
src/asm/jump_x86_64_sysv_macho_gas.S [2:4]
src/asm/make_arm_aapcs_elf_gas.S [2:4]
src/asm/make_arm_aapcs_macho_gas.S [2:4]
src/asm/make_arm_aapcs_pe_armasm.masm [2:4]
- src/asm/make_i386_ms_pe_clang_gas.S [2:5]
- src/asm/make_i386_ms_pe_gas.asm [2:5]
src/asm/make_i386_ms_pe_masm.masm [2:4]
src/asm/make_i386_sysv_elf_gas.S [2:4]
src/asm/make_i386_sysv_macho_gas.S [2:4]
- src/asm/make_mips32_o32_elf_gas.S [2:4]
- src/asm/make_ppc32_sysv_elf_gas.S [2:4]
- src/asm/make_ppc32_sysv_macho_gas.S [2:4]
- src/asm/make_ppc32_sysv_xcoff_gas.S [2:4]
- src/asm/make_ppc64_sysv_elf_gas.S [2:4]
- src/asm/make_ppc64_sysv_macho_gas.S [2:4]
- src/asm/make_ppc64_sysv_xcoff_gas.S [2:4]
- src/asm/make_x86_64_ms_pe_clang_gas.S [2:5]
- src/asm/make_x86_64_ms_pe_gas.asm [2:5]
src/asm/make_x86_64_ms_pe_masm.masm [2:4]
src/asm/make_x86_64_sysv_elf_gas.S [2:4]
src/asm/make_x86_64_sysv_macho_gas.S [2:4]
src/asm/ontop_arm_aapcs_elf_gas.S [2:4]
src/asm/ontop_arm_aapcs_macho_gas.S [2:4]
src/asm/ontop_arm_aapcs_pe_armasm.masm [2:4]
- src/asm/ontop_i386_ms_pe_clang_gas.S [2:5]
- src/asm/ontop_i386_ms_pe_gas.asm [2:5]
src/asm/ontop_i386_ms_pe_masm.masm [2:4]
src/asm/ontop_i386_sysv_elf_gas.S [2:4]
src/asm/ontop_i386_sysv_macho_gas.S [2:4]
- src/asm/ontop_mips32_o32_elf_gas.S [2:4]
- src/asm/ontop_ppc32_sysv_elf_gas.S [2:4]
- src/asm/ontop_ppc32_sysv_macho_gas.S [2:4]
- src/asm/ontop_ppc32_sysv_xcoff_gas.S [2:4]
- src/asm/ontop_ppc64_sysv_elf_gas.S [2:4]
- src/asm/ontop_ppc64_sysv_macho_gas.S [2:4]
- src/asm/ontop_ppc64_sysv_xcoff_gas.S [2:4]
- src/asm/ontop_x86_64_ms_pe_clang_gas.S [2:5]
- src/asm/ontop_x86_64_ms_pe_gas.asm [2:5]
src/asm/ontop_x86_64_ms_pe_masm.masm [2:4]
src/asm/ontop_x86_64_sysv_elf_gas.S [2:4]
src/asm/ontop_x86_64_sysv_macho_gas.S [2:4]
- src/asm/tail_ontop_ppc32_sysv.cpp [2:4]
src/untested.cpp [2:4]
-KEEP COPYRIGHT_SERVICE_LABEL b56e68f168b25ead2610488b3af94842
-BELONGS ya.make
- License text:
- Copyright Jiaxun Yang 2018.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- Scancode info:
- Original SPDX id: COPYRIGHT_SERVICE_LABEL
- Score : 100.00
- Match type : COPYRIGHT
- Files with this license:
- src/asm/jump_mips64_n64_elf_gas.S [2:4]
- src/asm/make_mips64_n64_elf_gas.S [2:4]
- src/asm/ontop_mips64_n64_elf_gas.S [2:4]
-
-KEEP COPYRIGHT_SERVICE_LABEL bdb654e3fbbec678064a117bc379b41b
+KEEP COPYRIGHT_SERVICE_LABEL 9ed7b7468c684d33492a4176e9cf31b1
BELONGS ya.make
- License text:
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
+ Note: matched license text is too long. Read it in the source files.
Scancode info:
Original SPDX id: COPYRIGHT_SERVICE_LABEL
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- src/asm/jump_combined_sysv_macho_gas.S [2:4]
- src/asm/jump_i386_x86_64_sysv_macho_gas.S [2:4]
- src/asm/jump_ppc32_ppc64_sysv_macho_gas.S [2:4]
- src/asm/make_combined_sysv_macho_gas.S [2:4]
- src/asm/make_i386_x86_64_sysv_macho_gas.S [2:4]
- src/asm/make_ppc32_ppc64_sysv_macho_gas.S [2:4]
- src/asm/ontop_combined_sysv_macho_gas.S [2:4]
- src/asm/ontop_i386_x86_64_sysv_macho_gas.S [2:4]
- src/asm/ontop_ppc32_ppc64_sysv_macho_gas.S [2:4]
+ src/fcontext.cpp [1:3]
KEEP COPYRIGHT_SERVICE_LABEL c3ce9643507aa0942a28211fe8f95eff
BELONGS ya.make
@@ -236,24 +161,3 @@ BELONGS ya.make
include/boost/context/windows/protected_fixedsize_stack.hpp [2:4]
src/posix/stack_traits.cpp [2:4]
src/windows/stack_traits.cpp [2:4]
-
-KEEP COPYRIGHT_SERVICE_LABEL d1eeae51f362a32140f64b39499ca9bf
-BELONGS ya.make
- Note: matched license text is too long. Read it in the source files.
- Scancode info:
- Original SPDX id: COPYRIGHT_SERVICE_LABEL
- Score : 100.00
- Match type : COPYRIGHT
- Files with this license:
- src/asm/jump_i386_ms_pe_clang_gas.S [2:5]
- src/asm/jump_i386_ms_pe_gas.asm [2:5]
- src/asm/jump_x86_64_ms_pe_clang_gas.S [2:5]
- src/asm/jump_x86_64_ms_pe_gas.asm [2:5]
- src/asm/make_i386_ms_pe_clang_gas.S [2:5]
- src/asm/make_i386_ms_pe_gas.asm [2:5]
- src/asm/make_x86_64_ms_pe_clang_gas.S [2:5]
- src/asm/make_x86_64_ms_pe_gas.asm [2:5]
- src/asm/ontop_i386_ms_pe_clang_gas.S [2:5]
- src/asm/ontop_i386_ms_pe_gas.asm [2:5]
- src/asm/ontop_x86_64_ms_pe_clang_gas.S [2:5]
- src/asm/ontop_x86_64_ms_pe_gas.asm [2:5]
diff --git a/contrib/restricted/boost/context/.yandex_meta/devtools.licenses.report b/contrib/restricted/boost/context/.yandex_meta/devtools.licenses.report
index 2f7dd7780d..2259eba708 100644
--- a/contrib/restricted/boost/context/.yandex_meta/devtools.licenses.report
+++ b/contrib/restricted/boost/context/.yandex_meta/devtools.licenses.report
@@ -127,39 +127,12 @@ BELONGS ya.make
include/boost/context/stack_traits.hpp [3:5]
include/boost/context/windows/protected_fixedsize_stack.hpp [3:5]
src/continuation.cpp [3:5]
+ src/fcontext.cpp [2:4]
src/fiber.cpp [3:5]
src/posix/stack_traits.cpp [3:5]
src/untested.cpp [3:5]
src/windows/stack_traits.cpp [3:5]
-KEEP BSL-1.0 a56863ff22557bda50c7e49c3d85f911
-BELONGS ya.make
- License text:
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- Scancode info:
- Original SPDX id: BSL-1.0
- Score : 100.00
- Match type : NOTICE
- Links : http://www.boost.org/LICENSE_1_0.txt, http://www.boost.org/users/license.html, https://spdx.org/licenses/BSL-1.0
- Files with this license:
- src/asm/tail_ontop_ppc32_sysv.cpp [3:5]
-
-KEEP BSL-1.0 b8bd11cab76fe04f0b68b48ae6bc9630
-BELONGS ya.make
- License text:
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE
- Scancode info:
- Original SPDX id: BSL-1.0
- Score : 88.89
- Match type : NOTICE
- Links : http://www.boost.org/LICENSE_1_0.txt, http://www.boost.org/users/license.html, https://spdx.org/licenses/BSL-1.0
- Files with this license:
- src/asm/ontop_mips64_n64_elf_gas.S [3:5]
-
KEEP BSL-1.0 d398f407edc1c91c48f2e7613f7602d5
BELONGS ya.make
License text:
@@ -172,22 +145,10 @@ BELONGS ya.make
Match type : NOTICE
Links : http://www.boost.org/LICENSE_1_0.txt, http://www.boost.org/users/license.html, https://spdx.org/licenses/BSL-1.0
Files with this license:
- src/asm/jump_i386_ms_pe_clang_gas.S [4:6]
- src/asm/jump_i386_ms_pe_gas.asm [4:6]
- src/asm/jump_x86_64_ms_pe_clang_gas.S [4:6]
- src/asm/jump_x86_64_ms_pe_gas.asm [4:6]
src/asm/jump_x86_64_sysv_elf_gas.S [3:5]
src/asm/jump_x86_64_sysv_macho_gas.S [3:5]
- src/asm/make_i386_ms_pe_clang_gas.S [4:6]
- src/asm/make_i386_ms_pe_gas.asm [4:6]
- src/asm/make_x86_64_ms_pe_clang_gas.S [4:6]
- src/asm/make_x86_64_ms_pe_gas.asm [4:6]
src/asm/make_x86_64_sysv_elf_gas.S [3:5]
src/asm/make_x86_64_sysv_macho_gas.S [3:5]
- src/asm/ontop_i386_ms_pe_clang_gas.S [4:6]
- src/asm/ontop_i386_ms_pe_gas.asm [4:6]
- src/asm/ontop_x86_64_ms_pe_clang_gas.S [4:6]
- src/asm/ontop_x86_64_ms_pe_gas.asm [4:6]
src/asm/ontop_x86_64_sysv_elf_gas.S [3:5]
src/asm/ontop_x86_64_sysv_macho_gas.S [3:5]
@@ -207,55 +168,17 @@ BELONGS ya.make
src/asm/jump_arm64_aapcs_macho_gas.S [3:5]
src/asm/jump_arm_aapcs_elf_gas.S [3:5]
src/asm/jump_arm_aapcs_macho_gas.S [3:5]
- src/asm/jump_combined_sysv_macho_gas.S [3:5]
src/asm/jump_i386_sysv_elf_gas.S [3:5]
src/asm/jump_i386_sysv_macho_gas.S [3:5]
- src/asm/jump_i386_x86_64_sysv_macho_gas.S [3:5]
- src/asm/jump_mips32_o32_elf_gas.S [3:5]
- src/asm/jump_mips64_n64_elf_gas.S [3:5]
- src/asm/jump_ppc32_ppc64_sysv_macho_gas.S [3:5]
- src/asm/jump_ppc32_sysv_elf_gas.S [3:5]
- src/asm/jump_ppc32_sysv_macho_gas.S [3:5]
- src/asm/jump_ppc32_sysv_xcoff_gas.S [3:5]
- src/asm/jump_ppc64_sysv_elf_gas.S [3:5]
- src/asm/jump_ppc64_sysv_macho_gas.S [3:5]
- src/asm/jump_ppc64_sysv_xcoff_gas.S [4:6]
- src/asm/jump_riscv64_sysv_elf_gas.S [2:4]
- src/asm/jump_sparc64_sysv_elf_gas.S [3:5]
src/asm/make_arm64_aapcs_elf_gas.S [3:5]
src/asm/make_arm64_aapcs_macho_gas.S [3:5]
src/asm/make_arm_aapcs_elf_gas.S [3:5]
src/asm/make_arm_aapcs_macho_gas.S [3:5]
- src/asm/make_combined_sysv_macho_gas.S [3:5]
src/asm/make_i386_sysv_elf_gas.S [3:5]
src/asm/make_i386_sysv_macho_gas.S [3:5]
- src/asm/make_i386_x86_64_sysv_macho_gas.S [3:5]
- src/asm/make_mips32_o32_elf_gas.S [3:5]
- src/asm/make_mips64_n64_elf_gas.S [3:5]
- src/asm/make_ppc32_ppc64_sysv_macho_gas.S [3:5]
- src/asm/make_ppc32_sysv_elf_gas.S [3:5]
- src/asm/make_ppc32_sysv_macho_gas.S [3:5]
- src/asm/make_ppc32_sysv_xcoff_gas.S [3:5]
- src/asm/make_ppc64_sysv_elf_gas.S [3:5]
- src/asm/make_ppc64_sysv_macho_gas.S [3:5]
- src/asm/make_ppc64_sysv_xcoff_gas.S [3:5]
- src/asm/make_riscv64_sysv_elf_gas.S [2:4]
- src/asm/make_sparc64_sysv_elf_gas.S [3:5]
src/asm/ontop_arm64_aapcs_elf_gas.S [3:5]
src/asm/ontop_arm64_aapcs_macho_gas.S [3:5]
src/asm/ontop_arm_aapcs_elf_gas.S [3:5]
src/asm/ontop_arm_aapcs_macho_gas.S [3:5]
- src/asm/ontop_combined_sysv_macho_gas.S [3:5]
src/asm/ontop_i386_sysv_elf_gas.S [3:5]
src/asm/ontop_i386_sysv_macho_gas.S [3:5]
- src/asm/ontop_i386_x86_64_sysv_macho_gas.S [3:5]
- src/asm/ontop_mips32_o32_elf_gas.S [3:5]
- src/asm/ontop_ppc32_ppc64_sysv_macho_gas.S [3:5]
- src/asm/ontop_ppc32_sysv_elf_gas.S [3:5]
- src/asm/ontop_ppc32_sysv_macho_gas.S [3:5]
- src/asm/ontop_ppc32_sysv_xcoff_gas.S [3:5]
- src/asm/ontop_ppc64_sysv_elf_gas.S [3:5]
- src/asm/ontop_ppc64_sysv_macho_gas.S [3:5]
- src/asm/ontop_ppc64_sysv_xcoff_gas.S [3:5]
- src/asm/ontop_riscv64_sysv_elf_gas.S [2:4]
- src/asm/ontop_sparc64_sysv_elf_gas.S [3:5]
diff --git a/contrib/restricted/boost/context/.yandex_meta/licenses.list.txt b/contrib/restricted/boost/context/.yandex_meta/licenses.list.txt
index 6b4897d488..dbd9323671 100644
--- a/contrib/restricted/boost/context/.yandex_meta/licenses.list.txt
+++ b/contrib/restricted/boost/context/.yandex_meta/licenses.list.txt
@@ -7,12 +7,6 @@
====================BSL-1.0====================
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE
-
-
-====================BSL-1.0====================
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
@@ -23,12 +17,6 @@
====================BSL-1.0====================
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-
-====================BSL-1.0====================
; Distributed under the Boost Software License, Version 1.0.
; (See accompanying file LICENSE_1_0.txt or copy at
; http://www.boost.org/LICENSE_1_0.txt)
@@ -47,31 +35,6 @@
====================COPYRIGHT====================
- Copyright Jiaxun Yang 2018.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
-
-
-====================COPYRIGHT====================
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
-
-
-====================COPYRIGHT====================
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
-
-
-====================COPYRIGHT====================
- Copyright Claudio Jeker 2024
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
-
-
-====================COPYRIGHT====================
Copyright Edward Nevill + Oliver Kowalke 2015
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
@@ -93,3 +56,9 @@
// Copyright Oliver Kowalke 2017.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
+
+
+====================COPYRIGHT====================
+// SPDX-FileCopyrightText: Copyright 2024 Arm Limited and/or its affiliates <open-source-office@arm.com>
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
diff --git a/contrib/restricted/boost/context/fcontext_impl/ya.make b/contrib/restricted/boost/context/fcontext_impl/ya.make
index 830a53b844..d0b2bdffa7 100644
--- a/contrib/restricted/boost/context/fcontext_impl/ya.make
+++ b/contrib/restricted/boost/context/fcontext_impl/ya.make
@@ -4,22 +4,12 @@ LIBRARY()
WITHOUT_LICENSE_TEXTS()
-VERSION(1.86.0)
+VERSION(1.87.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.86.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.87.0.tar.gz)
LICENSE(BSL-1.0)
-SET(BOOST_CONTEXT_ABI sysv)
-
-SET(BOOST_CONTEXT_ARCHITECTURE x86_64)
-
-SET(BOOST_CONTEXT_ASM_EXT .S)
-
-SET(BOOST_CONTEXT_ASSEMBLER gas)
-
-SET(BOOST_CONTEXT_BINARY_FORMAT elf)
-
PEERDIR(
contrib/restricted/boost/context/impl_common
)
@@ -36,40 +26,49 @@ IF (OS_WINDOWS)
ENDIF()
ENDIF()
-SRCDIR(contrib/restricted/boost/context/src)
+SRCDIR(contrib/restricted/boost/context)
-IF (OS_DARWIN OR OS_IOS)
- SET(BOOST_CONTEXT_BINARY_FORMAT macho)
-ELSEIF (OS_WINDOWS)
- SET(BOOST_CONTEXT_ABI ms)
- SET(BOOST_CONTEXT_ASM_EXT .masm)
- SET(BOOST_CONTEXT_ASSEMBLER masm)
- SET(BOOST_CONTEXT_BINARY_FORMAT pe)
- IF (ARCH_ARM)
- SET(BOOST_CONTEXT_ASSEMBLER armasm)
- ELSEIF (ARCH_I386)
- MASMFLAGS(/safeseh)
- ENDIF()
+IF (OS_WINDOWS AND ARCH_I386)
+ MASMFLAGS(/safeseh)
ENDIF()
-IF (ARCH_ARM)
- SET(BOOST_CONTEXT_ABI aapcs)
+IF (ARCH_I386)
+ SET(FCONTEXT_ARCH "i386")
+ELSEIF (ARCH_X86_64)
+ SET(FCONTEXT_ARCH "x86_64")
+ELSEIF (ARCH_ARM64)
+ SET(FCONTEXT_ARCH "arm64")
+ELSEIF (ARCH_ARM)
+ SET(FCONTEXT_ARCH "arm")
ENDIF()
-IF (ARCH_ARM64)
- SET(BOOST_CONTEXT_ARCHITECTURE arm64)
-ELSEIF (ARCH_ARM7)
- SET(BOOST_CONTEXT_ARCHITECTURE arm)
-ELSEIF (ARCH_I386)
- SET(BOOST_CONTEXT_ARCHITECTURE i386)
+IF (OS_WINDOWS)
+ SET(FCONTEXT_ABI ms)
+ELSEIF (ARCH_ARM64 OR ARCH_ARM)
+ SET(FCONTEXT_ABI aapcs)
+ELSE(OS_LINUX OR OS_ANDROID)
+ SET(FCONTEXT_ABI sysv)
ENDIF()
-SET(BOOST_CONTEXT_ASM_SUFFIX ${BOOST_CONTEXT_ARCHITECTURE}_${BOOST_CONTEXT_ABI}_${BOOST_CONTEXT_BINARY_FORMAT}_${BOOST_CONTEXT_ASSEMBLER}${BOOST_CONTEXT_ASM_EXT})
+IF (OS_DARWIN OR OS_IOS)
+ SET(FCONTEXT_FMT macho)
+ SET(FCONTEXT_SUF gas.S)
+ELSEIF (OS_LINUX OR OS_ANDROID)
+ SET(FCONTEXT_FMT elf)
+ SET(FCONTEXT_SUF gas.S)
+ELSEIF (OS_WINDOWS AND ARCH_ARM64)
+ SET(FCONTEXT_FMT pe)
+ SET(FCONTEXT_SUF asmasm.masm)
+ELSEIF (OS_WINDOWS)
+ SET(FCONTEXT_FMT pe)
+ SET(FCONTEXT_SUF masm.masm)
+ENDIF()
SRCS(
- asm/jump_${BOOST_CONTEXT_ASM_SUFFIX}
- asm/make_${BOOST_CONTEXT_ASM_SUFFIX}
- asm/ontop_${BOOST_CONTEXT_ASM_SUFFIX}
+ src/asm/make_${FCONTEXT_ARCH}_${FCONTEXT_ABI}_${FCONTEXT_FMT}_${FCONTEXT_SUF}
+ src/asm/jump_${FCONTEXT_ARCH}_${FCONTEXT_ABI}_${FCONTEXT_FMT}_${FCONTEXT_SUF}
+ src/asm/ontop_${FCONTEXT_ARCH}_${FCONTEXT_ABI}_${FCONTEXT_FMT}_${FCONTEXT_SUF}
+ src/fcontext.cpp
)
END()
diff --git a/contrib/restricted/boost/context/impl_common/ya.make b/contrib/restricted/boost/context/impl_common/ya.make
index 61f7516118..3a9a118a9c 100644
--- a/contrib/restricted/boost/context/impl_common/ya.make
+++ b/contrib/restricted/boost/context/impl_common/ya.make
@@ -4,9 +4,9 @@ LIBRARY()
WITHOUT_LICENSE_TEXTS()
-VERSION(1.86.0)
+VERSION(1.87.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.86.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.87.0.tar.gz)
LICENSE(BSL-1.0)
diff --git a/contrib/restricted/boost/context/include/boost/context/detail/fcontext.hpp b/contrib/restricted/boost/context/include/boost/context/detail/fcontext.hpp
index 00cb24d941..52be6083af 100644
--- a/contrib/restricted/boost/context/include/boost/context/detail/fcontext.hpp
+++ b/contrib/restricted/boost/context/include/boost/context/detail/fcontext.hpp
@@ -27,14 +27,11 @@ struct transfer_t {
void * data;
};
-extern "C" BOOST_CONTEXT_DECL
-transfer_t BOOST_CONTEXT_CALLDECL jump_fcontext( fcontext_t const to, void * vp);
-extern "C" BOOST_CONTEXT_DECL
-fcontext_t BOOST_CONTEXT_CALLDECL make_fcontext( void * sp, std::size_t size, void (* fn)( transfer_t) );
+BOOST_CONTEXT_DECL transfer_t jump_fcontext( fcontext_t const to, void * vp);
+BOOST_CONTEXT_DECL fcontext_t make_fcontext( void * sp, std::size_t size, void (* fn)( transfer_t) );
// based on an idea of Giovanni Derreta
-extern "C" BOOST_CONTEXT_DECL
-transfer_t BOOST_CONTEXT_CALLDECL ontop_fcontext( fcontext_t const to, void * vp, transfer_t (* fn)( transfer_t) );
+BOOST_CONTEXT_DECL transfer_t ontop_fcontext( fcontext_t const to, void * vp, transfer_t (* fn)( transfer_t) );
}}}
diff --git a/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_elf_gas.S
index cefd1830d7..7c1f075355 100644
--- a/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_elf_gas.S
@@ -55,6 +55,7 @@
.text
.align 2
.global jump_fcontext
+.hidden jump_fcontext
.type jump_fcontext, %function
jump_fcontext:
# prepare stack for GP + FPU
diff --git a/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_macho_gas.S
index 31738f7453..12cc021586 100644
--- a/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_arm64_aapcs_macho_gas.S
@@ -52,6 +52,7 @@
*******************************************************/
.text
+.private_extern _jump_fcontext
.globl _jump_fcontext
.balign 16
_jump_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_elf_gas.S
index 86efe9d821..9934c0897c 100644
--- a/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_elf_gas.S
@@ -41,6 +41,7 @@
.file "jump_arm_aapcs_elf_gas.S"
.text
.globl jump_fcontext
+.hidden jump_fcontext
.align 2
.type jump_fcontext,%function
.syntax unified
diff --git a/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_macho_gas.S
index 077c36409e..44e7f2a422 100644
--- a/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_arm_aapcs_macho_gas.S
@@ -39,6 +39,7 @@
*******************************************************/
.text
+.private_extern _jump_fcontext
.globl _jump_fcontext
.align 2
_jump_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/jump_combined_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_combined_sysv_macho_gas.S
deleted file mode 100644
index 34a32f785f..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_combined_sysv_macho_gas.S
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
- #include "jump_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
- #include "jump_x86_64_sysv_macho_gas.S"
-#elif defined(__ppc__)
- #include "jump_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
- #include "jump_ppc64_sysv_macho_gas.S"
-#elif defined(__arm__)
- #include "jump_arm_aapcs_macho_gas.S"
-#elif defined(__arm64__)
- #include "jump_arm64_aapcs_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_clang_gas.S b/contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_clang_gas.S
deleted file mode 100644
index cad2c1361f..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_clang_gas.S
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* --------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* --------------------------------------------------------------------------------- *
-* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | *
-* --------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | *
-* --------------------------------------------------------------------------------- *
-* --------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* --------------------------------------------------------------------------------- *
-* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | *
-* --------------------------------------------------------------------------------- *
-* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| *
-* --------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "jump_i386_ms_pe_clang_gas.S"
-.text
-.p2align 4,,15
-
-/* mark as using no unregistered SEH handlers */
-.globl @feat.00
-.def @feat.00; .scl 3; .type 0; .endef
-.set @feat.00, 1
-
-.globl _jump_fcontext
-.def _jump_fcontext; .scl 2; .type 32; .endef
-_jump_fcontext:
- /* prepare stack */
- leal -0x2c(%esp), %esp
-
-#if !defined(BOOST_USE_TSX)
- /* save MMX control- and status-word */
- stmxcsr (%esp)
- /* save x87 control-word */
- fnstcw 0x4(%esp)
-#endif
-
- /* load NT_TIB */
- movl %fs:(0x18), %edx
- /* load fiber local storage */
- movl 0x10(%edx), %eax
- movl %eax, 0x8(%esp)
- /* load current dealloction stack */
- movl 0xe0c(%edx), %eax
- movl %eax, 0xc(%esp)
- /* load current stack limit */
- movl 0x8(%edx), %eax
- movl %eax, 0x10(%esp)
- /* load current stack base */
- movl 0x4(%edx), %eax
- movl %eax, 0x14(%esp)
- /* load current SEH exception list */
- movl (%edx), %eax
- movl %eax, 0x18(%esp)
-
- movl %edi, 0x1c(%esp) /* save EDI */
- movl %esi, 0x20(%esp) /* save ESI */
- movl %ebx, 0x24(%esp) /* save EBX */
- movl %ebp, 0x28(%esp) /* save EBP */
-
- /* store ESP (pointing to context-data) in EAX */
- movl %esp, %eax
-
- /* firstarg of jump_fcontext() == fcontext to jump to */
- movl 0x30(%esp), %ecx
-
- /* restore ESP (pointing to context-data) from ECX */
- movl %ecx, %esp
-
-#if !defined(BOOST_USE_TSX)
- /* restore MMX control- and status-word */
- ldmxcsr (%esp)
- /* restore x87 control-word */
- fldcw 0x4(%esp)
-#endif
-
- /* restore NT_TIB into EDX */
- movl %fs:(0x18), %edx
- /* restore fiber local storage */
- movl 0x8(%esp), %ecx
- movl %ecx, 0x10(%edx)
- /* restore current deallocation stack */
- movl 0xc(%esp), %ecx
- movl %ecx, 0xe0c(%edx)
- /* restore current stack limit */
- movl 0x10(%esp), %ecx
- movl %ecx, 0x8(%edx)
- /* restore current stack base */
- movl 0x14(%esp), %ecx
- movl %ecx, 0x4(%edx)
- /* restore current SEH exception list */
- movl 0x18(%esp), %ecx
- movl %ecx, (%edx)
-
- movl 0x2c(%esp), %ecx /* restore EIP */
-
- movl 0x1c(%esp), %edi /* restore EDI */
- movl 0x20(%esp), %esi /* restore ESI */
- movl 0x24(%esp), %ebx /* restore EBX */
- movl 0x28(%esp), %ebp /* restore EBP */
-
- /* prepare stack */
- leal 0x30(%esp), %esp
-
- /* return transfer_t */
- /* FCTX == EAX, DATA == EDX */
- movl 0x34(%eax), %edx
-
- /* jump to context */
- jmp *%ecx
-
-.section .drectve
-.ascii " -export:\"_jump_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_gas.asm b/contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_gas.asm
deleted file mode 100644
index 6eb45326ce..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_i386_ms_pe_gas.asm
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* --------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* --------------------------------------------------------------------------------- *
-* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | *
-* --------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | *
-* --------------------------------------------------------------------------------- *
-* --------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* --------------------------------------------------------------------------------- *
-* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | *
-* --------------------------------------------------------------------------------- *
-* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| *
-* --------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "jump_i386_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-
-/* mark as using no unregistered SEH handlers */
-.globl @feat.00
-.def @feat.00; .scl 3; .type 0; .endef
-.set @feat.00, 1
-
-.globl _jump_fcontext
-.def _jump_fcontext; .scl 2; .type 32; .endef
-_jump_fcontext:
- /* prepare stack */
- leal -0x2c(%esp), %esp
-
-#if !defined(BOOST_USE_TSX)
- /* save MMX control- and status-word */
- stmxcsr (%esp)
- /* save x87 control-word */
- fnstcw 0x4(%esp)
-#endif
-
- /* load NT_TIB */
- movl %fs:(0x18), %edx
- /* load fiber local storage */
- movl 0x10(%edx), %eax
- movl %eax, 0x8(%esp)
- /* load current dealloction stack */
- movl 0xe0c(%edx), %eax
- movl %eax, 0xc(%esp)
- /* load current stack limit */
- movl 0x8(%edx), %eax
- movl %eax, 0x10(%esp)
- /* load current stack base */
- movl 0x4(%edx), %eax
- movl %eax, 0x14(%esp)
- /* load current SEH exception list */
- movl (%edx), %eax
- movl %eax, 0x18(%esp)
-
- movl %edi, 0x1c(%esp) /* save EDI */
- movl %esi, 0x20(%esp) /* save ESI */
- movl %ebx, 0x24(%esp) /* save EBX */
- movl %ebp, 0x28(%esp) /* save EBP */
-
- /* store ESP (pointing to context-data) in EAX */
- movl %esp, %eax
-
- /* firstarg of jump_fcontext() == fcontext to jump to */
- movl 0x30(%esp), %ecx
-
- /* restore ESP (pointing to context-data) from ECX */
- movl %ecx, %esp
-
-#if !defined(BOOST_USE_TSX)
- /* restore MMX control- and status-word */
- ldmxcsr (%esp)
- /* restore x87 control-word */
- fldcw 0x4(%esp)
-#endif
-
- /* restore NT_TIB into EDX */
- movl %fs:(0x18), %edx
- /* restore fiber local storage */
- movl 0x8(%esp), %ecx
- movl %ecx, 0x10(%edx)
- /* restore current deallocation stack */
- movl 0xc(%esp), %ecx
- movl %ecx, 0xe0c(%edx)
- /* restore current stack limit */
- movl 0x10(%esp), %ecx
- movl %ecx, 0x8(%edx)
- /* restore current stack base */
- movl 0x14(%esp), %ecx
- movl %ecx, 0x4(%edx)
- /* restore current SEH exception list */
- movl 0x18(%esp), %ecx
- movl %ecx, (%edx)
-
- movl 0x2c(%esp), %ecx /* restore EIP */
-
- movl 0x1c(%esp), %edi /* restore EDI */
- movl 0x20(%esp), %esi /* restore ESI */
- movl 0x24(%esp), %ebx /* restore EBX */
- movl 0x28(%esp), %ebp /* restore EBP */
-
- /* prepare stack */
- leal 0x30(%esp), %esp
-
- /* return transfer_t */
- /* FCTX == EAX, DATA == EDX */
- movl 0x34(%eax), %edx
-
- /* jump to context */
- jmp *%ecx
-
-.section .drectve
-.ascii " -export:\"jump_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/jump_i386_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_i386_sysv_elf_gas.S
index ed83717ce2..d00ac4fffd 100644
--- a/contrib/restricted/boost/context/src/asm/jump_i386_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_i386_sysv_elf_gas.S
@@ -31,6 +31,7 @@
.file "jump_i386_sysv_elf_gas.S"
.text
.globl jump_fcontext
+.hidden jump_fcontext
.align 2
.type jump_fcontext,@function
jump_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/jump_i386_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_i386_sysv_macho_gas.S
index 8ab7c6f29c..12aa702be9 100644
--- a/contrib/restricted/boost/context/src/asm/jump_i386_sysv_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_i386_sysv_macho_gas.S
@@ -25,6 +25,7 @@
****************************************************************************************/
.text
+.private_extern _jump_fcontext
.globl _jump_fcontext
.align 2
_jump_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/jump_i386_x86_64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_i386_x86_64_sysv_macho_gas.S
deleted file mode 100644
index 959ddac16f..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_i386_x86_64_sysv_macho_gas.S
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
- #include "jump_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
- #include "jump_x86_64_sysv_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/jump_loongarch64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_loongarch64_sysv_elf_gas.S
deleted file mode 100644
index 74c081e07f..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_loongarch64_sysv_elf_gas.S
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | FS0 | FS1 | FS2 | FS3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | FS4 | FS5 | FS6 | FS7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | S8 | FP | RA | PC | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "jump_loongarch64_sysv_elf_gas.S"
-.text
-.globl jump_fcontext
-.align 2
-.type jump_fcontext,@function
-jump_fcontext:
- # reserve space on stack
- addi.d $sp, $sp, -160
-
- # save fs0 - fs7
- fst.d $fs0, $sp, 0
- fst.d $fs1, $sp, 8
- fst.d $fs2, $sp, 16
- fst.d $fs3, $sp, 24
- fst.d $fs4, $sp, 32
- fst.d $fs5, $sp, 40
- fst.d $fs6, $sp, 48
- fst.d $fs7, $sp, 56
-
- # save s0 - s8, fp, ra
- st.d $s0, $sp, 64
- st.d $s1, $sp, 72
- st.d $s2, $sp, 80
- st.d $s3, $sp, 88
- st.d $s4, $sp, 96
- st.d $s5, $sp, 104
- st.d $s6, $sp, 112
- st.d $s7, $sp, 120
- st.d $s8, $sp, 128
- st.d $fp, $sp, 136
- st.d $ra, $sp, 144
-
- # save RA as PC
- st.d $ra, $sp, 152
-
- # store SP (pointing to context-data) in A2
- move $a2, $sp
-
- # restore SP (pointing to context-data) from A0
- move $sp, $a0
-
- # load fs0 - fs7
- fld.d $fs0, $sp, 0
- fld.d $fs1, $sp, 8
- fld.d $fs2, $sp, 16
- fld.d $fs3, $sp, 24
- fld.d $fs4, $sp, 32
- fld.d $fs5, $sp, 40
- fld.d $fs6, $sp, 48
- fld.d $fs7, $sp, 56
-
- #load s0 - s7
- ld.d $s0, $sp, 64
- ld.d $s1, $sp, 72
- ld.d $s2, $sp, 80
- ld.d $s3, $sp, 88
- ld.d $s4, $sp, 96
- ld.d $s5, $sp, 104
- ld.d $s6, $sp, 112
- ld.d $s7, $sp, 120
- ld.d $s8, $sp, 128
- ld.d $fp, $sp, 136
- ld.d $ra, $sp, 144
-
- # return transfer_t from jump
- # pass transfer_t as first arg in context function
- # a0 == FCTX, a1 == DATA
- move $a0, $a2
-
- # load PC
- ld.d $a2, $sp, 152
-
- # restore stack
- addi.d $sp, $sp, 160
-
- # jump to context
- jr $a2
-.size jump_fcontext, .-jump_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_mips32_o32_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_mips32_o32_elf_gas.S
deleted file mode 100644
index f2b8034d8c..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_mips32_o32_elf_gas.S
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | F20 | F22 | F24 | F26 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | F28 | F30 | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | ABI ARGS | GP | FCTX| DATA| | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "jump_mips32_o32_elf_gas.S"
-.text
-.globl jump_fcontext
-.align 2
-.type jump_fcontext,@function
-.ent jump_fcontext
-jump_fcontext:
- # reserve space on stack
- addiu $sp, $sp, -96
-
- sw $s0, 48($sp) # save S0
- sw $s1, 52($sp) # save S1
- sw $s2, 56($sp) # save S2
- sw $s3, 60($sp) # save S3
- sw $s4, 64($sp) # save S4
- sw $s5, 68($sp) # save S5
- sw $s6, 72($sp) # save S6
- sw $s7, 76($sp) # save S7
- sw $fp, 80($sp) # save FP
- sw $a0, 84($sp) # save hidden, address of returned transfer_t
- sw $ra, 88($sp) # save RA
- sw $ra, 92($sp) # save RA as PC
-
-#if defined(__mips_hard_float)
- s.d $f20, ($sp) # save F20
- s.d $f22, 8($sp) # save F22
- s.d $f24, 16($sp) # save F24
- s.d $f26, 24($sp) # save F26
- s.d $f28, 32($sp) # save F28
- s.d $f30, 40($sp) # save F30
-#endif
-
- # store SP (pointing to context-data) in A0
- move $a0, $sp
-
- # restore SP (pointing to context-data) from A1
- move $sp, $a1
-
-#if defined(__mips_hard_float)
- l.d $f20, ($sp) # restore F20
- l.d $f22, 8($sp) # restore F22
- l.d $f24, 16($sp) # restore F24
- l.d $f26, 24($sp) # restore F26
- l.d $f28, 32($sp) # restore F28
- l.d $f30, 40($sp) # restore F30
-#endif
-
- lw $s0, 48($sp) # restore S0
- lw $s1, 52($sp) # restore S1
- lw $s2, 56($sp) # restore S2
- lw $s3, 60($sp) # restore S3
- lw $s4, 64($sp) # restore S4
- lw $s5, 68($sp) # restore S5
- lw $s6, 72($sp) # restore S6
- lw $s7, 76($sp) # restore S7
- lw $fp, 80($sp) # restore FP
- lw $v0, 84($sp) # restore hidden, address of returned transfer_t
- lw $ra, 88($sp) # restore RA
-
- # load PC
- lw $t9, 92($sp)
-
- # adjust stack
- addiu $sp, $sp, 96
-
- # return transfer_t from jump
- sw $a0, ($v0) # fctx of transfer_t
- sw $a2, 4($v0) # data of transfer_t
- # pass transfer_t as first arg in context function
- # A0 == fctx, A1 == data
- move $a1, $a2
-
- # jump to context
- jr $t9
-.end jump_fcontext
-.size jump_fcontext, .-jump_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_mips64_n64_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_mips64_n64_elf_gas.S
deleted file mode 100644
index e338912bb6..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_mips64_n64_elf_gas.S
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- Copyright Jiaxun Yang 2018.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | F24 | F25 | F26 | F27 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | F28 | F29 | F30 | F31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | FP | GP | RA | PC | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "jump_mips64_n64_elf_gas.S"
-.text
-.globl jump_fcontext
-.align 3
-.type jump_fcontext,@function
-.ent jump_fcontext
-jump_fcontext:
- # reserve space on stack
- daddiu $sp, $sp, -160
-
- sd $s0, 64($sp) # save S0
- sd $s1, 72($sp) # save S1
- sd $s2, 80($sp) # save S2
- sd $s3, 88($sp) # save S3
- sd $s4, 96($sp) # save S4
- sd $s5, 104($sp) # save S5
- sd $s6, 112($sp) # save S6
- sd $s7, 120($sp) # save S7
- sd $fp, 128($sp) # save FP
- sd $ra, 144($sp) # save RA
- sd $ra, 152($sp) # save RA as PC
-
-#if defined(__mips_hard_float)
- s.d $f24, 0($sp) # save F24
- s.d $f25, 8($sp) # save F25
- s.d $f26, 16($sp) # save F26
- s.d $f27, 24($sp) # save F27
- s.d $f28, 32($sp) # save F28
- s.d $f29, 40($sp) # save F29
- s.d $f30, 48($sp) # save F30
- s.d $f31, 56($sp) # save F31
-#endif
-
- # store SP (pointing to old context-data) in v0 as return
- move $v0, $sp
-
- # get SP (pointing to new context-data) from a0 param
- move $sp, $a0
-
-#if defined(__mips_hard_float)
- l.d $f24, 0($sp) # restore F24
- l.d $f25, 8($sp) # restore F25
- l.d $f26, 16($sp) # restore F26
- l.d $f27, 24($sp) # restore F27
- l.d $f28, 32($sp) # restore F28
- l.d $f29, 40($sp) # restore F29
- l.d $f30, 48($sp) # restore F30
- l.d $f31, 56($sp) # restore F31
-#endif
-
- ld $s0, 64($sp) # restore S0
- ld $s1, 72($sp) # restore S1
- ld $s2, 80($sp) # restore S2
- ld $s3, 88($sp) # restore S3
- ld $s4, 96($sp) # restore S4
- ld $s5, 104($sp) # restore S5
- ld $s6, 112($sp) # restore S6
- ld $s7, 120($sp) # restore S7
- ld $fp, 128($sp) # restore FP
- ld $ra, 144($sp) # restore RAa
-
- # load PC
- ld $t9, 152($sp)
-
- # adjust stack
- daddiu $sp, $sp, 160
-
- move $a0, $v0 # move old sp from v0 to a0 as param
- move $v1, $a1 # move *data from a1 to v1 as return
-
- # jump to context
- jr $t9
-.end jump_fcontext
-.size jump_fcontext, .-jump_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_ppc32_ppc64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_ppc32_ppc64_sysv_macho_gas.S
deleted file mode 100644
index f175e31233..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_ppc32_ppc64_sysv_macho_gas.S
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__ppc__)
- #include "jump_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
- #include "jump_ppc64_sysv_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_elf_gas.S
deleted file mode 100644
index 48e09c935e..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_elf_gas.S
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * |bchai|hiddn| fpscr | PC | CR | R14 | R15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------|------------ *
- * | 224 | 228 | 232 | 236 | 240 | 244 | *
- * ------------------------|------------ *
- * | F30 | F31 |bchai| LR | *
- * ------------------------|------------ *
- * *
- *******************************************************/
-
-.file "jump_ppc32_sysv_elf_gas.S"
-.text
-.globl jump_fcontext
-.align 2
-.type jump_fcontext,@function
-jump_fcontext:
- # Linux: jump_fcontext( hidden transfer_t * R3, R4, R5)
- # Other: transfer_t R3:R4 = jump_fcontext( R3, R4)
-
- mflr %r0 # return address from LR
- mffs %f0 # FPSCR
- mfcr %r8 # condition register
-
- stwu %r1, -240(%r1) # allocate stack space, R1 % 16 == 0
- stw %r0, 244(%r1) # save LR in caller's frame
-
-#ifdef __linux__
- stw %r3, 4(%r1) # hidden pointer
-#endif
-
- stfd %f0, 8(%r1) # FPSCR
- stw %r0, 16(%r1) # LR as PC
- stw %r8, 20(%r1) # CR
-
- # Save registers R14 to R31.
- # Don't change R2, the thread-local storage pointer.
- # Don't change R13, the small data pointer.
- stw %r14, 24(%r1)
- stw %r15, 28(%r1)
- stw %r16, 32(%r1)
- stw %r17, 36(%r1)
- stw %r18, 40(%r1)
- stw %r19, 44(%r1)
- stw %r20, 48(%r1)
- stw %r21, 52(%r1)
- stw %r22, 56(%r1)
- stw %r23, 60(%r1)
- stw %r24, 64(%r1)
- stw %r25, 68(%r1)
- stw %r26, 72(%r1)
- stw %r27, 76(%r1)
- stw %r28, 80(%r1)
- stw %r29, 84(%r1)
- stw %r30, 88(%r1)
- stw %r31, 92(%r1)
-
- # Save registers F14 to F31 in slots with 8-byte alignment.
- # 4-byte alignment may stall the pipeline of some processors.
- # Less than 4 may cause alignment traps.
- stfd %f14, 96(%r1)
- stfd %f15, 104(%r1)
- stfd %f16, 112(%r1)
- stfd %f17, 120(%r1)
- stfd %f18, 128(%r1)
- stfd %f19, 136(%r1)
- stfd %f20, 144(%r1)
- stfd %f21, 152(%r1)
- stfd %f22, 160(%r1)
- stfd %f23, 168(%r1)
- stfd %f24, 176(%r1)
- stfd %f25, 184(%r1)
- stfd %f26, 192(%r1)
- stfd %f27, 200(%r1)
- stfd %f28, 208(%r1)
- stfd %f29, 216(%r1)
- stfd %f30, 224(%r1)
- stfd %f31, 232(%r1)
-
- # store RSP (pointing to context-data) in R7/R6
- # restore RSP (pointing to context-data) from R4/R3
-#ifdef __linux__
- mr %r7, %r1
- mr %r1, %r4
- lwz %r3, 4(%r1) # hidden pointer
-#else
- mr %r6, %r1
- mr %r1, %r3
-#endif
-
- lfd %f0, 8(%r1) # FPSCR
- lwz %r0, 16(%r1) # PC
- lwz %r8, 20(%r1) # CR
-
- mtfsf 0xff, %f0 # restore FPSCR
- mtctr %r0 # load CTR with PC
- mtcr %r8 # restore CR
-
- # restore R14 to R31
- lwz %r14, 24(%r1)
- lwz %r15, 28(%r1)
- lwz %r16, 32(%r1)
- lwz %r17, 36(%r1)
- lwz %r18, 40(%r1)
- lwz %r19, 44(%r1)
- lwz %r20, 48(%r1)
- lwz %r21, 52(%r1)
- lwz %r22, 56(%r1)
- lwz %r23, 60(%r1)
- lwz %r24, 64(%r1)
- lwz %r25, 68(%r1)
- lwz %r26, 72(%r1)
- lwz %r27, 76(%r1)
- lwz %r28, 80(%r1)
- lwz %r29, 84(%r1)
- lwz %r30, 88(%r1)
- lwz %r31, 92(%r1)
-
- # restore F14 to F31
- lfd %f14, 96(%r1)
- lfd %f15, 104(%r1)
- lfd %f16, 112(%r1)
- lfd %f17, 120(%r1)
- lfd %f18, 128(%r1)
- lfd %f19, 136(%r1)
- lfd %f20, 144(%r1)
- lfd %f21, 152(%r1)
- lfd %f22, 160(%r1)
- lfd %f23, 168(%r1)
- lfd %f24, 176(%r1)
- lfd %f25, 184(%r1)
- lfd %f26, 192(%r1)
- lfd %f27, 200(%r1)
- lfd %f28, 208(%r1)
- lfd %f29, 216(%r1)
- lfd %f30, 224(%r1)
- lfd %f31, 232(%r1)
-
- # restore LR from caller's frame
- lwz %r0, 244(%r1)
- mtlr %r0
-
- # adjust stack
- addi %r1, %r1, 240
-
- # return transfer_t
-#ifdef __linux__
- stw %r7, 0(%r3)
- stw %r5, 4(%r3)
-#else
- mr %r3, %r6
- # %r4, %r4
-#endif
-
- # jump to context
- bctr
-.size jump_fcontext, .-jump_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_macho_gas.S
deleted file mode 100644
index fef90c295f..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_macho_gas.S
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F30 | F31 | fpscr | R13 | R14 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | | *
- * ------------------------------------------------- *
- * | 256 | | *
- * ------------------------------------------------- *
- * | DATA| | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.text
-.globl _jump_fcontext
-.align 2
-_jump_fcontext:
- ; reserve space on stack
- subi r1, r1, 244
-
- stfd f14, 0(r1) ; save F14
- stfd f15, 8(r1) ; save F15
- stfd f16, 16(r1) ; save F16
- stfd f17, 24(r1) ; save F17
- stfd f18, 32(r1) ; save F18
- stfd f19, 40(r1) ; save F19
- stfd f20, 48(r1) ; save F20
- stfd f21, 56(r1) ; save F21
- stfd f22, 64(r1) ; save F22
- stfd f23, 72(r1) ; save F23
- stfd f24, 80(r1) ; save F24
- stfd f25, 88(r1) ; save F25
- stfd f26, 96(r1) ; save F26
- stfd f27, 104(r1) ; save F27
- stfd f28, 112(r1) ; save F28
- stfd f29, 120(r1) ; save F29
- stfd f30, 128(r1) ; save F30
- stfd f31, 136(r1) ; save F31
- mffs f0 ; load FPSCR
- stfd f0, 144(r1) ; save FPSCR
-
- stw r13, 152(r1) ; save R13
- stw r14, 156(r1) ; save R14
- stw r15, 160(r1) ; save R15
- stw r16, 164(r1) ; save R16
- stw r17, 168(r1) ; save R17
- stw r18, 172(r1) ; save R18
- stw r19, 176(r1) ; save R19
- stw r20, 180(r1) ; save R20
- stw r21, 184(r1) ; save R21
- stw r22, 188(r1) ; save R22
- stw r23, 192(r1) ; save R23
- stw r24, 196(r1) ; save R24
- stw r25, 200(r1) ; save R25
- stw r26, 204(r1) ; save R26
- stw r27, 208(r1) ; save R27
- stw r28, 212(r1) ; save R28
- stw r29, 216(r1) ; save R29
- stw r30, 220(r1) ; save R30
- stw r31, 224(r1) ; save R31
- stw r3, 228(r1) ; save hidden
-
- ; save CR
- mfcr r0
- stw r0, 232(r1)
- ; save LR
- mflr r0
- stw r0, 236(r1)
- ; save LR as PC
- stw r0, 240(r1)
-
- ; store RSP (pointing to context-data) in R6
- mr r6, r1
-
- ; restore RSP (pointing to context-data) from R4
- mr r1, r4
-
- lfd f14, 0(r1) ; restore F14
- lfd f15, 8(r1) ; restore F15
- lfd f16, 16(r1) ; restore F16
- lfd f17, 24(r1) ; restore F17
- lfd f18, 32(r1) ; restore F18
- lfd f19, 40(r1) ; restore F19
- lfd f20, 48(r1) ; restore F20
- lfd f21, 56(r1) ; restore F21
- lfd f22, 64(r1) ; restore F22
- lfd f23, 72(r1) ; restore F23
- lfd f24, 80(r1) ; restore F24
- lfd f25, 88(r1) ; restore F25
- lfd f26, 96(r1) ; restore F26
- lfd f27, 104(r1) ; restore F27
- lfd f28, 112(r1) ; restore F28
- lfd f29, 120(r1) ; restore F29
- lfd f30, 128(r1) ; restore F30
- lfd f31, 136(r1) ; restore F31
- lfd f0, 144(r1) ; load FPSCR
- mtfsf 0xff, f0 ; restore FPSCR
-
- lwz r13, 152(r1) ; restore R13
- lwz r14, 156(r1) ; restore R14
- lwz r15, 160(r1) ; restore R15
- lwz r16, 164(r1) ; restore R16
- lwz r17, 168(r1) ; restore R17
- lwz r18, 172(r1) ; restore R18
- lwz r19, 176(r1) ; restore R19
- lwz r20, 180(r1) ; restore R20
- lwz r21, 184(r1) ; restore R21
- lwz r22, 188(r1) ; restore R22
- lwz r23, 192(r1) ; restore R23
- lwz r24, 196(r1) ; restore R24
- lwz r25, 200(r1) ; restore R25
- lwz r26, 204(r1) ; restore R26
- lwz r27, 208(r1) ; restore R27
- lwz r28, 212(r1) ; restore R28
- lwz r29, 216(r1) ; restore R29
- lwz r30, 220(r1) ; restore R30
- lwz r31, 224(r1) ; restore R31
- lwz r3, 228(r1) ; restore hidden
-
- ; restore CR
- lwz r0, 232(r1)
- mtcr r0
- ; restore LR
- lwz r0, 236(r1)
- mtlr r0
- ; load PC
- lwz r0, 240(r1)
- ; restore CTR
- mtctr r0
-
- ; adjust stack
- addi r1, r1, 244
-
- ; return transfer_t
- stw r6, 0(r3)
- stw r5, 4(r3)
-
- ; jump to context
- bctr
diff --git a/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_xcoff_gas.S b/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_xcoff_gas.S
deleted file mode 100644
index 1854613d76..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_ppc32_sysv_xcoff_gas.S
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * |bchai| CR | LR |compl| link| TOC | R14 | R15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | F30 | F31 | PC |hiddn| fpscr | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 256 | 260 | 264 | 268 | 272 | 276 | 280 | 284 | *
- * ------------------------------------------------- *
- * |bchai|savCR|savLR|compl| link|svTOC| FCTX| DATA| *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
- .file "jump_ppc32_sysv_xcoff_gas.S"
- .toc
- .csect .text[PR], 5
- .globl jump_fcontext[DS]
- .globl .jump_fcontext
- .csect jump_fcontext[DS]
-jump_fcontext:
- .long .jump_fcontext[PR], TOC[tc0], 0
- .csect .text[PR], 5
-.jump_fcontext:
- # reserve space on stack
- subi 1, 1, 256
-
- # save CR
- mfcr 0
- stw 0, 4(1)
- # save LR
- mflr 0
- stw 0, 8(1)
- # save LR as PC
- stw 0, 240(1)
- # save TOC
- stw 2, 20(1)
-
- # Save registers R14 to R31.
- stw 14, 24(1)
- stw 15, 28(1)
- stw 16, 32(1)
- stw 17, 36(1)
- stw 18, 40(1)
- stw 19, 44(1)
- stw 20, 48(1)
- stw 21, 52(1)
- stw 22, 56(1)
- stw 23, 60(1)
- stw 24, 64(1)
- stw 25, 68(1)
- stw 26, 72(1)
- stw 27, 76(1)
- stw 28, 80(1)
- stw 29, 84(1)
- stw 30, 88(1)
- stw 31, 92(1)
-
- # Save registers F14 to F31 in slots with 8-byte alignment.
- # 4-byte alignment may stall the pipeline of some processors.
- # Less than 4 may cause alignment traps.
- stfd 14, 96(1)
- stfd 15, 104(1)
- stfd 16, 112(1)
- stfd 17, 120(1)
- stfd 18, 128(1)
- stfd 19, 136(1)
- stfd 20, 144(1)
- stfd 21, 152(1)
- stfd 22, 160(1)
- stfd 23, 168(1)
- stfd 24, 176(1)
- stfd 25, 184(1)
- stfd 26, 192(1)
- stfd 27, 200(1)
- stfd 28, 208(1)
- stfd 29, 216(1)
- stfd 30, 224(1)
- stfd 31, 232(1)
-
- # hidden pointer
- stw 3, 244(1)
-
- mffs 0 # load FPSCR
- stfd 0, 248(1) # save FPSCR
-
-
- # store RSP (pointing to context-data) in R6
- mr 6, 1
-
- # restore RSP (pointing to context-data) from R4
- mr 1, 4
-
- # restore CR
- lwz 0, 4(1)
- mtcr 0
- # restore LR
- lwz 0, 8(1)
- mtlr 0
- # load PC
- lwz 0, 240(1)
- mtctr 0
-
- # restore TOC
- lwz 2, 20(1)
-
- # restore R14 to R31
- lwz 14, 24(1)
- lwz 15, 28(1)
- lwz 16, 32(1)
- lwz 17, 36(1)
- lwz 18, 40(1)
- lwz 19, 44(1)
- lwz 20, 48(1)
- lwz 21, 52(1)
- lwz 22, 56(1)
- lwz 23, 60(1)
- lwz 24, 64(1)
- lwz 25, 68(1)
- lwz 26, 72(1)
- lwz 27, 76(1)
- lwz 28, 80(1)
- lwz 29, 84(1)
- lwz 30, 88(1)
- lwz 31, 92(1)
-
- # restore F14 to F31
- lfd 14, 96(1)
- lfd 15, 104(1)
- lfd 16, 112(1)
- lfd 17, 120(1)
- lfd 18, 128(1)
- lfd 19, 136(1)
- lfd 20, 144(1)
- lfd 21, 152(1)
- lfd 22, 160(1)
- lfd 23, 168(1)
- lfd 24, 176(1)
- lfd 25, 184(1)
- lfd 26, 192(1)
- lfd 27, 200(1)
- lfd 28, 208(1)
- lfd 29, 216(1)
- lfd 30, 224(1)
- lfd 31, 232(1)
-
- # hidden pointer
- lwz 3, 244(1)
-
- lfd 0, 248(1) # load FPSCR
- mtfsf 0xff, 0 # restore FPSCR
-
- # adjust stack
- addi 1, 1, 256
-
- # zero in r3 indicates first jump to context-function
- cmpdi 3, 0
- beq use_entry_arg
-
- # return transfer_t
- stw 6, 0(3)
- stw 5, 4(3)
-
- # jump to context
- bctr
-
-use_entry_arg:
- # copy transfer_t into transfer_fn arg registers
- mr 3, 6
- mr 4, 5
-
- # jump to context
- bctr
diff --git a/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_elf_gas.S
deleted file mode 100644
index 28907db32b..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_elf_gas.S
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | TOC | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | TOC saved | FCTX | DATA | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.file "jump_ppc64_sysv_elf_gas.S"
-.globl jump_fcontext
-#if _CALL_ELF == 2
- .text
- .align 2
-jump_fcontext:
- addis %r2, %r12, .TOC.-jump_fcontext@ha
- addi %r2, %r2, .TOC.-jump_fcontext@l
- .localentry jump_fcontext, . - jump_fcontext
-#else
- .section ".opd","aw"
- .align 3
-jump_fcontext:
-# ifdef _CALL_LINUX
- .quad .L.jump_fcontext,.TOC.@tocbase,0
- .type jump_fcontext,@function
- .text
- .align 2
-.L.jump_fcontext:
-# else
- .hidden .jump_fcontext
- .globl .jump_fcontext
- .quad .jump_fcontext,.TOC.@tocbase,0
- .size jump_fcontext,24
- .type .jump_fcontext,@function
- .text
- .align 2
-.jump_fcontext:
-# endif
-#endif
- # reserve space on stack
- subi %r1, %r1, 184
-
-#if _CALL_ELF != 2
- std %r2, 0(%r1) # save TOC
-#endif
- std %r14, 8(%r1) # save R14
- std %r15, 16(%r1) # save R15
- std %r16, 24(%r1) # save R16
- std %r17, 32(%r1) # save R17
- std %r18, 40(%r1) # save R18
- std %r19, 48(%r1) # save R19
- std %r20, 56(%r1) # save R20
- std %r21, 64(%r1) # save R21
- std %r22, 72(%r1) # save R22
- std %r23, 80(%r1) # save R23
- std %r24, 88(%r1) # save R24
- std %r25, 96(%r1) # save R25
- std %r26, 104(%r1) # save R26
- std %r27, 112(%r1) # save R27
- std %r28, 120(%r1) # save R28
- std %r29, 128(%r1) # save R29
- std %r30, 136(%r1) # save R30
- std %r31, 144(%r1) # save R31
-#if _CALL_ELF != 2
- std %r3, 152(%r1) # save hidden
-#endif
-
- # save CR
- mfcr %r0
- std %r0, 160(%r1)
- # save LR
- mflr %r0
- std %r0, 168(%r1)
- # save LR as PC
- std %r0, 176(%r1)
-
- # store RSP (pointing to context-data) in R6
- mr %r6, %r1
-
-#if _CALL_ELF == 2
- # restore RSP (pointing to context-data) from R3
- mr %r1, %r3
-#else
- # restore RSP (pointing to context-data) from R4
- mr %r1, %r4
-
- ld %r2, 0(%r1) # restore TOC
-#endif
- ld %r14, 8(%r1) # restore R14
- ld %r15, 16(%r1) # restore R15
- ld %r16, 24(%r1) # restore R16
- ld %r17, 32(%r1) # restore R17
- ld %r18, 40(%r1) # restore R18
- ld %r19, 48(%r1) # restore R19
- ld %r20, 56(%r1) # restore R20
- ld %r21, 64(%r1) # restore R21
- ld %r22, 72(%r1) # restore R22
- ld %r23, 80(%r1) # restore R23
- ld %r24, 88(%r1) # restore R24
- ld %r25, 96(%r1) # restore R25
- ld %r26, 104(%r1) # restore R26
- ld %r27, 112(%r1) # restore R27
- ld %r28, 120(%r1) # restore R28
- ld %r29, 128(%r1) # restore R29
- ld %r30, 136(%r1) # restore R30
- ld %r31, 144(%r1) # restore R31
-#if _CALL_ELF != 2
- ld %r3, 152(%r1) # restore hidden
-#endif
-
- # restore CR
- ld %r0, 160(%r1)
- mtcr %r0
- # restore LR
- ld %r0, 168(%r1)
- mtlr %r0
-
- # load PC
- ld %r12, 176(%r1)
- # restore CTR
- mtctr %r12
-
- # adjust stack
- addi %r1, %r1, 184
-
-#if _CALL_ELF == 2
- # copy transfer_t into transfer_fn arg registers
- mr %r3, %r6
- # arg pointer already in %r4
-
- # jump to context
- bctr
- .size jump_fcontext, .-jump_fcontext
-#else
- # zero in r3 indicates first jump to context-function
- cmpdi %r3, 0
- beq use_entry_arg
-
- # return transfer_t
- std %r6, 0(%r3)
- std %r5, 8(%r3)
-
- # jump to context
- bctr
-
-use_entry_arg:
- # copy transfer_t into transfer_fn arg registers
- mr %r3, %r6
- mr %r4, %r5
-
- # jump to context
- bctr
-# ifdef _CALL_LINUX
- .size .jump_fcontext, .-.L.jump_fcontext
-# else
- .size .jump_fcontext, .-.jump_fcontext
-# endif
-#endif
-
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_macho_gas.S
deleted file mode 100644
index dcc6c645db..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_macho_gas.S
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | R13 | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | FCTX | DATA | | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.text
-.align 2
-.globl _jump_fcontext
-
-_jump_fcontext:
- ; reserve space on stack
- subi r1, r1, 184
-
- std r14, 8(r1) ; save R14
- std r15, 16(r1) ; save R15
- std r16, 24(r1) ; save R16
- std r17, 32(r1) ; save R17
- std r18, 40(r1) ; save R18
- std r19, 48(r1) ; save R19
- std r20, 56(r1) ; save R20
- std r21, 64(r1) ; save R21
- std r22, 72(r1) ; save R22
- std r23, 80(r1) ; save R23
- std r24, 88(r1) ; save R24
- std r25, 96(r1) ; save R25
- std r26, 104(r1) ; save R26
- std r27, 112(r1) ; save R27
- std r28, 120(r1) ; save R28
- std r29, 128(r1) ; save R29
- std r30, 136(r1) ; save R30
- std r31, 144(r1) ; save R31
- std r3, 152(r1) ; save hidden
-
- ; save CR
- mfcr r0
- std r0, 160(r1)
- ; save LR
- mflr r0
- std r0, 168(r1)
- ; save LR as PC
- std r0, 176(r1)
-
- ; store RSP (pointing to context-data) in R6
- mr r6, r1
-
- ; restore RSP (pointing to context-data) from R4
- mr r1, r4
-
- ld r14, 8(r1) ; restore R14
- ld r15, 16(r1) ; restore R15
- ld r16, 24(r1) ; restore R16
- ld r17, 32(r1) ; restore R17
- ld r18, 40(r1) ; restore R18
- ld r19, 48(r1) ; restore R19
- ld r20, 56(r1) ; restore R20
- ld r21, 64(r1) ; restore R21
- ld r22, 72(r1) ; restore R22
- ld r23, 80(r1) ; restore R23
- ld r24, 88(r1) ; restore R24
- ld r25, 96(r1) ; restore R25
- ld r26, 104(r1) ; restore R26
- ld r27, 112(r1) ; restore R27
- ld r28, 120(r1) ; restore R28
- ld r29, 128(r1) ; restore R29
- ld r30, 136(r1) ; restore R30
- ld r31, 144(r1) ; restore R31
- ld r3, 152(r1) ; restore hidden
-
- ; restore CR
- ld r0, 160(r1)
- mtcr r0
- ; restore LR
- ld r0, 168(r1)
- mtlr r0
-
- ; load PC
- ld r12, 176(r1)
- ; restore CTR
- mtctr r12
-
- ; adjust stack
- addi r1, r1, 184
-
- ; zero in r3 indicates first jump to context-function
- cmpdi r3, 0
- beq use_entry_arg
-
- ; return transfer_t
- std r6, 0(r3)
- std r5, 8(r3)
-
- ; jump to context
- bctr
-
-use_entry_arg:
- ; copy transfer_t into transfer_fn arg registers
- mr r3, r6
- mr r4, r5
-
- ; jump to context
- bctr
diff --git a/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_xcoff_gas.S b/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_xcoff_gas.S
deleted file mode 100644
index f835d2a76a..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_ppc64_sysv_xcoff_gas.S
+++ /dev/null
@@ -1,173 +0,0 @@
-
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | TOC | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | TOC saved | FCTX | DATA | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
- .file "jump_ppc64_sysv_xcoff_gas.S"
- .toc
- .csect .text[PR], 5
- .align 2
- .globl jump_fcontext[DS]
- .globl .jump_fcontext
- .csect jump_fcontext[DS], 3
-jump_fcontext:
- .llong .jump_fcontext[PR], TOC[tc0], 0
- .csect .text[PR], 5
-.jump_fcontext:
- # reserve space on stack
- subi 1, 1, 184
-
- std 2, 0(1) # save TOC
- std 14, 8(1) # save R14
- std 15, 16(1) # save R15
- std 16, 24(1) # save R16
- std 17, 32(1) # save R17
- std 18, 40(1) # save R18
- std 19, 48(1) # save R19
- std 20, 56(1) # save R20
- std 21, 64(1) # save R21
- std 22, 72(1) # save R22
- std 23, 80(1) # save R23
- std 24, 88(1) # save R24
- std 25, 96(1) # save R25
- std 26, 104(1) # save R26
- std 27, 112(1) # save R27
- std 28, 120(1) # save R28
- std 29, 128(1) # save R29
- std 30, 136(1) # save R30
- std 31, 144(1) # save R31
- std 3, 152(1) # save hidden
-
- # save CR
- mfcr 0
- std 0, 160(1)
- # save LR
- mflr 0
- std 0, 168(1)
- # save LR as PC
- std 0, 176(1)
-
- # store RSP (pointing to context-data) in R6
- mr 6, 1
-
- # restore RSP (pointing to context-data) from R4
- mr 1, 4
-
- ld 2, 0(1) # restore TOC
- ld 14, 8(1) # restore R14
- ld 15, 16(1) # restore R15
- ld 16, 24(1) # restore R16
- ld 17, 32(1) # restore R17
- ld 18, 40(1) # restore R18
- ld 19, 48(1) # restore R19
- ld 20, 56(1) # restore R20
- ld 21, 64(1) # restore R21
- ld 22, 72(1) # restore R22
- ld 23, 80(1) # restore R23
- ld 24, 88(1) # restore R24
- ld 25, 96(1) # restore R25
- ld 26, 104(1) # restore R26
- ld 27, 112(1) # restore R27
- ld 28, 120(1) # restore R28
- ld 29, 128(1) # restore R29
- ld 30, 136(1) # restore R30
- ld 31, 144(1) # restore R31
- ld 3, 152(1) # restore hidden
-
- # restore CR
- ld 0, 160(1)
- mtcr 0
- # restore LR
- ld 0, 168(1)
- mtlr 0
-
- # load PC
- ld 0, 176(1)
- # restore CTR
- mtctr 0
-
- # adjust stack
- addi 1, 1, 184
-
- # zero in r3 indicates first jump to context-function
- cmpdi 3, 0
- beq use_entry_arg
-
- # return transfer_t
- std 6, 0(3)
- std 5, 8(3)
-
- # jump to context
- bctr
-
-use_entry_arg:
- # copy transfer_t into transfer_fn arg registers
- mr 3, 6
- mr 4, 5
-
- # jump to context
- bctr
diff --git a/contrib/restricted/boost/context/src/asm/jump_riscv64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_riscv64_sysv_elf_gas.S
deleted file mode 100644
index 5417e5d5e3..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_riscv64_sysv_elf_gas.S
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
- * ------------------------------------------------- *
- * | fs0 | fs1 | fs2 | fs3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
- * ------------------------------------------------- *
- * | fs4 | fs5 | fs6 | fs7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
- * ------------------------------------------------- *
- * | fs8 | fs9 | fs10 | fs11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
- * ------------------------------------------------- *
- * | s0 | s1 | s2 | s3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
- * ------------------------------------------------- *
- * | s4 | s5 | s6 | s7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
- * ------------------------------------------------- *
- * | s8 | s9 | s10 | s11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | | | | | *
- * ------------------------------------------------- *
- * | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
- * ------------------------------------------------- *
- * | ra | pc | | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.file "jump_riscv64_sysv_elf_gas.S"
-.text
-.align 1
-.global jump_fcontext
-.type jump_fcontext, %function
-jump_fcontext:
- # prepare stack for GP + FPU
- addi sp, sp, -0xd0
-
- # save fs0 - fs11
- fsd fs0, 0x00(sp)
- fsd fs1, 0x08(sp)
- fsd fs2, 0x10(sp)
- fsd fs3, 0x18(sp)
- fsd fs4, 0x20(sp)
- fsd fs5, 0x28(sp)
- fsd fs6, 0x30(sp)
- fsd fs7, 0x38(sp)
- fsd fs8, 0x40(sp)
- fsd fs9, 0x48(sp)
- fsd fs10, 0x50(sp)
- fsd fs11, 0x58(sp)
-
- # save s0-s11, ra
- sd s0, 0x60(sp)
- sd s1, 0x68(sp)
- sd s2, 0x70(sp)
- sd s3, 0x78(sp)
- sd s4, 0x80(sp)
- sd s5, 0x88(sp)
- sd s6, 0x90(sp)
- sd s7, 0x98(sp)
- sd s8, 0xa0(sp)
- sd s9, 0xa8(sp)
- sd s10, 0xb0(sp)
- sd s11, 0xb8(sp)
- sd ra, 0xc0(sp)
-
- # save RA as PC
- sd ra, 0xc8(sp)
-
- # store SP (pointing to context-data) in A2
- mv a2, sp
-
- # restore SP (pointing to context-data) from A0
- mv sp, a0
-
- # load fs0 - fs11
- fld fs0, 0x00(sp)
- fld fs1, 0x08(sp)
- fld fs2, 0x10(sp)
- fld fs3, 0x18(sp)
- fld fs4, 0x20(sp)
- fld fs5, 0x28(sp)
- fld fs6, 0x30(sp)
- fld fs7, 0x38(sp)
- fld fs8, 0x40(sp)
- fld fs9, 0x48(sp)
- fld fs10, 0x50(sp)
- fld fs11, 0x58(sp)
-
- # load s0-s11,ra
- ld s0, 0x60(sp)
- ld s1, 0x68(sp)
- ld s2, 0x70(sp)
- ld s3, 0x78(sp)
- ld s4, 0x80(sp)
- ld s5, 0x88(sp)
- ld s6, 0x90(sp)
- ld s7, 0x98(sp)
- ld s8, 0xa0(sp)
- ld s9, 0xa8(sp)
- ld s10, 0xb0(sp)
- ld s11, 0xb8(sp)
- ld ra, 0xc0(sp)
-
- # return transfer_t from jump
- # pass transfer_t as first arg in context function
- # a0 == FCTX, a1 == DATA
- mv a0, a2
-
- # load pc
- ld a2, 0xc8(sp)
-
- # restore stack from GP + FPU
- addi sp, sp, 0xd0
-
- jr a2
-.size jump_fcontext,.-jump_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_s390x_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_s390x_sysv_elf_gas.S
deleted file mode 100644
index fa71467756..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_s390x_sysv_elf_gas.S
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | t.fctx | t.data | r2 | r6 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | r7 | r8 | r9 | r10 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | r11 | r12 | r13 | r14 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 104 | 112 | 120 | *
- * ------------------------------------------------- *
- * | f8 | f9 | f10 | f11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 136 | 144 | 152 | *
- * ------------------------------------------------- *
- * | f12 | f13 | f14 | f15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 168 | 176 | | *
- * ------------------------------------------------- *
- * | fpc | pc | | | *
- * ------------------------------------------------- *
- *******************************************************/
-
-.text
-.align 8
-.global jump_fcontext
-.type jump_fcontext, @function
-
-#define ARG_OFFSET 0
-#define GR_OFFSET 16
-#define R14_OFFSET 88
-#define FP_OFFSET 96
-#define FPC_OFFSET 160
-#define PC_OFFSET 168
-#define CONTEXT_SIZE 176
-
-#define REG_SAVE_AREA_SIZE 160
-
-/*
-
-typedef void* fcontext_t;
-
-struct transfer_t {
- fcontext_t fctx;
- void * data;
-};
-
-transfer_t jump_fcontext( fcontext_t const to,
- void * data);
-
-Incoming args
-r2 - Hidden argument to the location where the return transfer_t needs to be returned
-r3 - Context we want to switch to
-r4 - Data pointer
-
-*/
-
-jump_fcontext:
- .machine "z10"
- /* Reserve stack space to store the current context. */
- aghi %r15,-CONTEXT_SIZE
-
- /* Save the argument register holding the location of the return value. */
- stg %r2,GR_OFFSET(%r15)
-
- /* Save the call-saved general purpose registers. */
- stmg %r6,%r14,GR_OFFSET+8(%r15)
-
- /* Save call-saved floating point registers. */
- std %f8,FP_OFFSET(%r15)
- std %f9,FP_OFFSET+8(%r15)
- std %f10,FP_OFFSET+16(%r15)
- std %f11,FP_OFFSET+24(%r15)
- std %f12,FP_OFFSET+32(%r15)
- std %f13,FP_OFFSET+40(%r15)
- std %f14,FP_OFFSET+48(%r15)
- std %f15,FP_OFFSET+56(%r15)
-
- /* Save the return address as current pc. */
- stg %r14,PC_OFFSET(%r15)
-
- /* Save the floating point control register. */
- stfpc FPC_OFFSET(%r15)
-
- /* Backup the stack pointer pointing to the old context-data into r1. */
- lgr %r1,%r15
-
- /* Load the new context pointer as stack pointer. */
- lgr %r15,%r3
-
- /* Restore the call-saved GPRs from the new context. */
- lmg %r6,%r14,GR_OFFSET+8(%r15)
-
- /* Restore call-saved floating point registers. */
- ld %f8,FP_OFFSET(%r15)
- ld %f9,FP_OFFSET+8(%r15)
- ld %f10,FP_OFFSET+16(%r15)
- ld %f11,FP_OFFSET+24(%r15)
- ld %f12,FP_OFFSET+32(%r15)
- ld %f13,FP_OFFSET+40(%r15)
- ld %f14,FP_OFFSET+48(%r15)
- ld %f15,FP_OFFSET+56(%r15)
-
- /* Load the floating point control register. */
- lfpc FPC_OFFSET(%r15)
-
- /* Restore PC - the location where we will jump to at the end. */
- lg %r5,PC_OFFSET(%r15)
-
- ltg %r2,GR_OFFSET(%r15)
- jnz use_return_slot
-
- /* We're restoring a context created by make_fcontext.
- This is going to be the argument of the entry point
- of the fiber. We're placing it on top of the ABI
- defined register save area of the fiber's own stack. */
- la %r2,REG_SAVE_AREA_SIZE(%r15)
-
- /* REG_SAVE_AREA_SIZE + sizeof(transfer_t) */
- aghi %r15,-(REG_SAVE_AREA_SIZE+16)
-
-use_return_slot:
- /* Save the two fields in transfer_t. When calling a
- make_fcontext function this becomes the function argument of
- the target function, otherwise it will be the return value of
- jump_fcontext. */
- stg %r1,0(%r2)
- stg %r4,8(%r2)
-
- /* Free the restored context. */
- aghi %r15,CONTEXT_SIZE
-
- /* Jump to the PC loaded from the new context. */
- br %r5
-
-
-.size jump_fcontext,.-jump_fcontext
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_sparc64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_sparc64_sysv_elf_gas.S
deleted file mode 100644
index 61101fb1f6..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_sparc64_sysv_elf_gas.S
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- Copyright Claudio Jeker 2024
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*
- * typedef void* fcontext_t;
- *
- * struct transfer_t {
- * fcontext_t fctx;
- * void * data;
- * };
- *
- * transfer_t jump_fcontext(fcontext_t const to, void *vp);
- */
-#define CC64FSZ 176
-#define BIAS 2047
-#define SP 128
-#define I7 136
-
-.file "jump_sparc64_sysv_elf_gas.S"
-.text
-.align 4
-.global jump_fcontext
-.type jump_fcontext, %function
-jump_fcontext:
- # prepare stack
- save %sp, -CC64FSZ, %sp
-
- # store framepointer and return address in slots reserved
- # for arguments
- stx %fp, [%sp + BIAS + SP]
- stx %i7, [%sp + BIAS + I7]
- mov %sp, %o0
- # force flush register windows to stack and with that save context
- flushw
- # get SP (pointing to new context-data) from %i0 param
- mov %i0, %sp
- # load framepointer and return address from context
- ldx [%sp + BIAS + SP], %fp
- ldx [%sp + BIAS + I7], %i7
-
- ret
- restore %o0, %g0, %o0
- # restore old %sp (pointing to old context-data) in %o0
- # *data stored in %o1 was not modified
-.size jump_fcontext,.-jump_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_clang_gas.S b/contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_clang_gas.S
deleted file mode 100644
index 1f633f7562..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_clang_gas.S
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* ---------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc | *
-* ---------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc | *
-* ---------------------------------------------------------------------------------- *
-* | limit | base | R12 | R13 | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc | *
-* ---------------------------------------------------------------------------------- *
-* | R14 | R15 | RDI | RSI | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c | *
-* ---------------------------------------------------------------------------------- *
-* | RBX | RBP | hidden | RIP | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c | *
-* ---------------------------------------------------------------------------------- *
-* | parameter area | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c | *
-* ---------------------------------------------------------------------------------- *
-* | FCTX | DATA | | *
-* ---------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "jump_x86_64_ms_pe_clang_gas.S"
-.text
-.p2align 4,,15
-.globl jump_fcontext
-.def jump_fcontext; .scl 2; .type 32; .endef
-.seh_proc jump_fcontext
-jump_fcontext:
-.seh_endprologue
-
- leaq -0x118(%rsp), %rsp /* prepare stack */
-
-#if !defined(BOOST_USE_TSX)
- /* save XMM storage */
- movaps %xmm6, 0x0(%rsp)
- movaps %xmm7, 0x10(%rsp)
- movaps %xmm8, 0x20(%rsp)
- movaps %xmm9, 0x30(%rsp)
- movaps %xmm10, 0x40(%rsp)
- movaps %xmm11, 0x50(%rsp)
- movaps %xmm12, 0x60(%rsp)
- movaps %xmm13, 0x70(%rsp)
- movaps %xmm14, 0x80(%rsp)
- movaps %xmm15, 0x90(%rsp)
- stmxcsr 0xa0(%rsp) /* save MMX control- and status-word */
- fnstcw 0xa4(%rsp) /* save x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* save fiber local storage */
- movq 0x20(%r10), %rax
- movq %rax, 0xb0(%rsp)
- /* save current deallocation stack */
- movq 0x1478(%r10), %rax
- movq %rax, 0xb8(%rsp)
- /* save current stack limit */
- movq 0x10(%r10), %rax
- movq %rax, 0xc0(%rsp)
- /* save current stack base */
- movq 0x08(%r10), %rax
- movq %rax, 0xc8(%rsp)
-
- movq %r12, 0xd0(%rsp) /* save R12 */
- movq %r13, 0xd8(%rsp) /* save R13 */
- movq %r14, 0xe0(%rsp) /* save R14 */
- movq %r15, 0xe8(%rsp) /* save R15 */
- movq %rdi, 0xf0(%rsp) /* save RDI */
- movq %rsi, 0xf8(%rsp) /* save RSI */
- movq %rbx, 0x100(%rsp) /* save RBX */
- movq %rbp, 0x108(%rsp) /* save RBP */
-
- movq %rcx, 0x110(%rsp) /* save hidden address of transport_t */
-
- /* preserve RSP (pointing to context-data) in R9 */
- movq %rsp, %r9
-
- /* restore RSP (pointing to context-data) from RDX */
- movq %rdx, %rsp
-
-#if !defined(BOOST_USE_TSX)
- /* restore XMM storage */
- movaps 0x0(%rsp), %xmm6
- movaps 0x10(%rsp), %xmm7
- movaps 0x20(%rsp), %xmm8
- movaps 0x30(%rsp), %xmm9
- movaps 0x40(%rsp), %xmm10
- movaps 0x50(%rsp), %xmm11
- movaps 0x60(%rsp), %xmm12
- movaps 0x70(%rsp), %xmm13
- movaps 0x80(%rsp), %xmm14
- movaps 0x90(%rsp), %xmm15
- ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
- fldcw 0xa4(%rsp) /* restore x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* restore fiber local storage */
- movq 0xb0(%rsp), %rax
- movq %rax, 0x20(%r10)
- /* restore current deallocation stack */
- movq 0xb8(%rsp), %rax
- movq %rax, 0x1478(%r10)
- /* restore current stack limit */
- movq 0xc0(%rsp), %rax
- movq %rax, 0x10(%r10)
- /* restore current stack base */
- movq 0xc8(%rsp), %rax
- movq %rax, 0x08(%r10)
-
- movq 0xd0(%rsp), %r12 /* restore R12 */
- movq 0xd8(%rsp), %r13 /* restore R13 */
- movq 0xe0(%rsp), %r14 /* restore R14 */
- movq 0xe8(%rsp), %r15 /* restore R15 */
- movq 0xf0(%rsp), %rdi /* restore RDI */
- movq 0xf8(%rsp), %rsi /* restore RSI */
- movq 0x100(%rsp), %rbx /* restore RBX */
- movq 0x108(%rsp), %rbp /* restore RBP */
-
- movq 0x110(%rsp), %rax /* restore hidden address of transport_t */
-
- leaq 0x118(%rsp), %rsp /* prepare stack */
-
- /* restore return-address */
- popq %r10
-
- /* transport_t returned in RAX */
- /* return parent fcontext_t */
- movq %r9, 0x0(%rax)
- /* return data */
- movq %r8, 0x8(%rax)
-
- /* transport_t as 1.arg of context-function */
- movq %rax, %rcx
-
- /* indirect jump to context */
- jmp *%r10
-.seh_endproc
-
-.section .drectve
-.ascii " -export:\"jump_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_gas.asm b/contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_gas.asm
deleted file mode 100644
index ec4ecfe946..0000000000
--- a/contrib/restricted/boost/context/src/asm/jump_x86_64_ms_pe_gas.asm
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* ---------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc | *
-* ---------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc | *
-* ---------------------------------------------------------------------------------- *
-* | limit | base | R12 | R13 | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc | *
-* ---------------------------------------------------------------------------------- *
-* | R14 | R15 | RDI | RSI | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c | *
-* ---------------------------------------------------------------------------------- *
-* | RBX | RBP | hidden | RIP | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c | *
-* ---------------------------------------------------------------------------------- *
-* | parameter area | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c | *
-* ---------------------------------------------------------------------------------- *
-* | FCTX | DATA | | *
-* ---------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "jump_x86_64_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl jump_fcontext
-.def jump_fcontext; .scl 2; .type 32; .endef
-.seh_proc jump_fcontext
-jump_fcontext:
-.seh_endprologue
-
- leaq -0x118(%rsp), %rsp /* prepare stack */
-
-#if !defined(BOOST_USE_TSX)
- /* save XMM storage */
- movaps %xmm6, 0x0(%rsp)
- movaps %xmm7, 0x10(%rsp)
- movaps %xmm8, 0x20(%rsp)
- movaps %xmm9, 0x30(%rsp)
- movaps %xmm10, 0x40(%rsp)
- movaps %xmm11, 0x50(%rsp)
- movaps %xmm12, 0x60(%rsp)
- movaps %xmm13, 0x70(%rsp)
- movaps %xmm14, 0x80(%rsp)
- movaps %xmm15, 0x90(%rsp)
- stmxcsr 0xa0(%rsp) /* save MMX control- and status-word */
- fnstcw 0xa4(%rsp) /* save x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* save fiber local storage */
- movq 0x20(%r10), %rax
- movq %rax, 0xb0(%rsp)
- /* save current deallocation stack */
- movq 0x1478(%r10), %rax
- movq %rax, 0xb8(%rsp)
- /* save current stack limit */
- movq 0x10(%r10), %rax
- movq %rax, 0xc0(%rsp)
- /* save current stack base */
- movq 0x08(%r10), %rax
- movq %rax, 0xc8(%rsp)
-
- movq %r12, 0xd0(%rsp) /* save R12 */
- movq %r13, 0xd8(%rsp) /* save R13 */
- movq %r14, 0xe0(%rsp) /* save R14 */
- movq %r15, 0xe8(%rsp) /* save R15 */
- movq %rdi, 0xf0(%rsp) /* save RDI */
- movq %rsi, 0xf8(%rsp) /* save RSI */
- movq %rbx, 0x100(%rsp) /* save RBX */
- movq %rbp, 0x108(%rsp) /* save RBP */
-
- movq %rcx, 0x110(%rsp) /* save hidden address of transport_t */
-
- /* preserve RSP (pointing to context-data) in R9 */
- movq %rsp, %r9
-
- /* restore RSP (pointing to context-data) from RDX */
- movq %rdx, %rsp
-
-#if !defined(BOOST_USE_TSX)
- /* restore XMM storage */
- movaps 0x0(%rsp), %xmm6
- movaps 0x10(%rsp), %xmm7
- movaps 0x20(%rsp), %xmm8
- movaps 0x30(%rsp), %xmm9
- movaps 0x40(%rsp), %xmm10
- movaps 0x50(%rsp), %xmm11
- movaps 0x60(%rsp), %xmm12
- movaps 0x70(%rsp), %xmm13
- movaps 0x80(%rsp), %xmm14
- movaps 0x90(%rsp), %xmm15
- ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
- fldcw 0xa4(%rsp) /* restore x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* restore fiber local storage */
- movq 0xb0(%rsp), %rax
- movq %rax, 0x20(%r10)
- /* restore current deallocation stack */
- movq 0xb8(%rsp), %rax
- movq %rax, 0x1478(%r10)
- /* restore current stack limit */
- movq 0xc0(%rsp), %rax
- movq %rax, 0x10(%r10)
- /* restore current stack base */
- movq 0xc8(%rsp), %rax
- movq %rax, 0x08(%r10)
-
- movq 0xd0(%rsp), %r12 /* restore R12 */
- movq 0xd8(%rsp), %r13 /* restore R13 */
- movq 0xe0(%rsp), %r14 /* restore R14 */
- movq 0xe8(%rsp), %r15 /* restore R15 */
- movq 0xf0(%rsp), %rdi /* restore RDI */
- movq 0xf8(%rsp), %rsi /* restore RSI */
- movq 0x100(%rsp), %rbx /* restore RBX */
- movq 0x108(%rsp), %rbp /* restore RBP */
-
- movq 0x110(%rsp), %rax /* restore hidden address of transport_t */
-
- leaq 0x118(%rsp), %rsp /* prepare stack */
-
- /* restore return-address */
- popq %r10
-
- /* transport_t returned in RAX */
- /* return parent fcontext_t */
- movq %r9, 0x0(%rax)
- /* return data */
- movq %r8, 0x8(%rax)
-
- /* transport_t as 1.arg of context-function */
- movq %rax, %rcx
-
- /* indirect jump to context */
- jmp *%r10
-.seh_endproc
-
-.section .drectve
-.ascii " -export:\"jump_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S
index be264bdc2e..2eff59a380 100644
--- a/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_elf_gas.S
@@ -44,6 +44,7 @@
.file "jump_x86_64_sysv_elf_gas.S"
.text
.globl jump_fcontext
+.hidden jump_fcontext
.type jump_fcontext,@function
.align 16
jump_fcontext:
@@ -73,14 +74,6 @@ jump_fcontext:
/* read the current SSP and store it */
rdsspq %rcx
movq %rcx, (%rsp)
-#endif
-
-#if BOOST_CONTEXT_SHADOW_STACK
- /* grow the stack to reserve space for shadow stack pointer(SSP) */
- leaq -0x8(%rsp), %rsp
- /* read the current SSP and store it */
- rdsspq %rcx
- movq %rcx, (%rsp)
# endif
/* store RSP (pointing to context-data) in RAX */
diff --git a/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_macho_gas.S
index afc3e5c126..673daa61df 100644
--- a/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/jump_x86_64_sysv_macho_gas.S
@@ -25,6 +25,7 @@
****************************************************************************************/
.text
+.private_extern _jump_fcontext
.globl _jump_fcontext
.align 8
_jump_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_elf_gas.S
index 66cfb2da17..8ac825bf54 100644
--- a/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_elf_gas.S
@@ -55,6 +55,7 @@
.text
.align 2
.global make_fcontext
+.hidden make_fcontext
.type make_fcontext, %function
make_fcontext:
# shift address in x0 (allocated stack) to lower 16 byte boundary
diff --git a/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_macho_gas.S
index b30b1e3e5b..a6a1314c0d 100644
--- a/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_arm64_aapcs_macho_gas.S
@@ -52,6 +52,7 @@
*******************************************************/
.text
+.private_extern _make_fcontext
.globl _make_fcontext
.balign 16
diff --git a/contrib/restricted/boost/context/src/asm/make_arm_aapcs_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_arm_aapcs_elf_gas.S
index 98ae64b43f..9616e566af 100644
--- a/contrib/restricted/boost/context/src/asm/make_arm_aapcs_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_arm_aapcs_elf_gas.S
@@ -41,6 +41,7 @@
.file "make_arm_aapcs_elf_gas.S"
.text
.globl make_fcontext
+.hidden make_fcontext
.align 2
.type make_fcontext,%function
.syntax unified
diff --git a/contrib/restricted/boost/context/src/asm/make_arm_aapcs_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_arm_aapcs_macho_gas.S
index c909ae9d43..de934075d2 100644
--- a/contrib/restricted/boost/context/src/asm/make_arm_aapcs_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_arm_aapcs_macho_gas.S
@@ -39,6 +39,7 @@
*******************************************************/
.text
+.private_extern _make_fcontext
.globl _make_fcontext
.align 2
_make_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/make_combined_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_combined_sysv_macho_gas.S
deleted file mode 100644
index b22fa7ebe9..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_combined_sysv_macho_gas.S
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
- #include "make_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
- #include "make_x86_64_sysv_macho_gas.S"
-#elif defined(__ppc__)
- #include "make_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
- #include "make_ppc64_sysv_macho_gas.S"
-#elif defined(__arm__)
- #include "make_arm_aapcs_macho_gas.S"
-#elif defined(__arm64__)
- #include "make_arm64_aapcs_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/make_i386_ms_pe_clang_gas.S b/contrib/restricted/boost/context/src/asm/make_i386_ms_pe_clang_gas.S
deleted file mode 100644
index 79f5024602..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_i386_ms_pe_clang_gas.S
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* --------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* --------------------------------------------------------------------------------- *
-* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | *
-* --------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | *
-* --------------------------------------------------------------------------------- *
-* --------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* --------------------------------------------------------------------------------- *
-* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | *
-* --------------------------------------------------------------------------------- *
-* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| *
-* --------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "make_i386_ms_pe_clang_gas.S"
-.text
-.p2align 4,,15
-
-/* mark as using no unregistered SEH handlers */
-.globl @feat.00
-.def @feat.00; .scl 3; .type 0; .endef
-.set @feat.00, 1
-
-.globl _make_fcontext
-.def _make_fcontext; .scl 2; .type 32; .endef
-_make_fcontext:
- /* first arg of make_fcontext() == top of context-stack */
- movl 0x04(%esp), %eax
-
- /* reserve space for first argument of context-function */
- /* EAX might already point to a 16byte border */
- leal -0x8(%eax), %eax
-
- /* shift address in EAX to lower 16 byte boundary */
- andl $-16, %eax
-
- /* reserve space for context-data on context-stack */
- /* size for fc_mxcsr .. EIP + return-address for context-function */
- /* on context-function entry: (ESP -0x4) % 8 == 0 */
- /* additional space is required for SEH */
- leal -0x40(%eax), %eax
-
- /* save MMX control- and status-word */
- stmxcsr (%eax)
- /* save x87 control-word */
- fnstcw 0x4(%eax)
-
- /* first arg of make_fcontext() == top of context-stack */
- movl 0x4(%esp), %ecx
- /* save top address of context stack as 'base' */
- movl %ecx, 0x14(%eax)
- /* second arg of make_fcontext() == size of context-stack */
- movl 0x8(%esp), %edx
- /* negate stack size for LEA instruction (== substraction) */
- negl %edx
- /* compute bottom address of context stack (limit) */
- leal (%ecx,%edx), %ecx
- /* save bottom address of context-stack as 'limit' */
- movl %ecx, 0x10(%eax)
- /* save bottom address of context-stack as 'dealloction stack' */
- movl %ecx, 0xc(%eax)
- /* set fiber-storage to zero */
- xorl %ecx, %ecx
- movl %ecx, 0x8(%eax)
-
- /* third arg of make_fcontext() == address of context-function */
- /* stored in EBX */
- movl 0xc(%esp), %ecx
- movl %ecx, 0x24(%eax)
-
- /* compute abs address of label trampoline */
- movl $trampoline, %ecx
- /* save address of trampoline as return-address for context-function */
- /* will be entered after calling jump_fcontext() first time */
- movl %ecx, 0x2c(%eax)
-
- /* compute abs address of label finish */
- movl $finish, %ecx
- /* save address of finish as return-address for context-function */
- /* will be entered after context-function returns */
- movl %ecx, 0x28(%eax)
-
- /* traverse current seh chain to get the last exception handler installed by Windows */
- /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
- /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
- /* at its end by RaiseException all seh andlers are disregarded if not present and the */
- /* program is aborted */
- /* load NT_TIB into ECX */
- movl %fs:(0x0), %ecx
-
-walk:
- /* load 'next' member of current SEH into EDX */
- movl (%ecx), %edx
- /* test if 'next' of current SEH is last (== 0xffffffff) */
- incl %edx
- jz found
- decl %edx
- /* exchange content; ECX contains address of next SEH */
- xchgl %ecx, %edx
- /* inspect next SEH */
- jmp walk
-
-found:
- /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
- movl 0x04(%ecx), %ecx
- /* save address in ECX as SEH handler for context */
- movl %ecx, 0x3c(%eax)
- /* set ECX to -1 */
- movl $0xffffffff, %ecx
- /* save ECX as next SEH item */
- movl %ecx, 0x38(%eax)
- /* load address of next SEH item */
- leal 0x38(%eax), %ecx
- /* save next SEH */
- movl %ecx, 0x18(%eax)
-
- /* return pointer to context-data */
- ret
-
-trampoline:
- /* move transport_t for entering context-function */
- /* FCTX == EAX, DATA == EDX */
- movl %eax, (%esp)
- movl %edx, 0x4(%esp)
- /* label finish as return-address */
- pushl %ebp
- /* jump to context-function */
- jmp *%ebx
-
-finish:
- /* ESP points to same address as ESP on entry of context function + 0x4 */
- xorl %eax, %eax
- /* exit code is zero */
- movl %eax, (%esp)
- /* exit application */
- call __exit
- hlt
-
-.def __exit; .scl 2; .type 32; .endef /* standard C library function */
-
-.section .drectve
-.ascii " -export:\"_make_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/make_i386_ms_pe_gas.asm b/contrib/restricted/boost/context/src/asm/make_i386_ms_pe_gas.asm
deleted file mode 100644
index 608ddf3af0..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_i386_ms_pe_gas.asm
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* --------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* --------------------------------------------------------------------------------- *
-* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | *
-* --------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | *
-* --------------------------------------------------------------------------------- *
-* --------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* --------------------------------------------------------------------------------- *
-* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | *
-* --------------------------------------------------------------------------------- *
-* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| *
-* --------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "make_i386_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-
-/* mark as using no unregistered SEH handlers */
-.globl @feat.00
-.def @feat.00; .scl 3; .type 0; .endef
-.set @feat.00, 1
-
-.globl _make_fcontext
-.def _make_fcontext; .scl 2; .type 32; .endef
-_make_fcontext:
- /* first arg of make_fcontext() == top of context-stack */
- movl 0x04(%esp), %eax
-
- /* reserve space for first argument of context-function */
- /* EAX might already point to a 16byte border */
- leal -0x8(%eax), %eax
-
- /* shift address in EAX to lower 16 byte boundary */
- andl $-16, %eax
-
- /* reserve space for context-data on context-stack */
- /* size for fc_mxcsr .. EIP + return-address for context-function */
- /* on context-function entry: (ESP -0x4) % 8 == 0 */
- /* additional space is required for SEH */
- leal -0x40(%eax), %eax
-
- /* save MMX control- and status-word */
- stmxcsr (%eax)
- /* save x87 control-word */
- fnstcw 0x4(%eax)
-
- /* first arg of make_fcontext() == top of context-stack */
- movl 0x4(%esp), %ecx
- /* save top address of context stack as 'base' */
- movl %ecx, 0x14(%eax)
- /* second arg of make_fcontext() == size of context-stack */
- movl 0x8(%esp), %edx
- /* negate stack size for LEA instruction (== substraction) */
- negl %edx
- /* compute bottom address of context stack (limit) */
- leal (%ecx,%edx), %ecx
- /* save bottom address of context-stack as 'limit' */
- movl %ecx, 0x10(%eax)
- /* save bottom address of context-stack as 'dealloction stack' */
- movl %ecx, 0xc(%eax)
- /* set fiber-storage to zero */
- xorl %ecx, %ecx
- movl %ecx, 0x8(%eax)
-
- /* third arg of make_fcontext() == address of context-function */
- /* stored in EBX */
- movl 0xc(%esp), %ecx
- movl %ecx, 0x24(%eax)
-
- /* compute abs address of label trampoline */
- movl $trampoline, %ecx
- /* save address of trampoline as return-address for context-function */
- /* will be entered after calling jump_fcontext() first time */
- movl %ecx, 0x2c(%eax)
-
- /* compute abs address of label finish */
- movl $finish, %ecx
- /* save address of finish as return-address for context-function */
- /* will be entered after context-function returns */
- movl %ecx, 0x28(%eax)
-
- /* traverse current seh chain to get the last exception handler installed by Windows */
- /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
- /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
- /* at its end by RaiseException all seh andlers are disregarded if not present and the */
- /* program is aborted */
- /* load NT_TIB into ECX */
- movl %fs:(0x0), %ecx
-
-walk:
- /* load 'next' member of current SEH into EDX */
- movl (%ecx), %edx
- /* test if 'next' of current SEH is last (== 0xffffffff) */
- incl %edx
- jz found
- decl %edx
- /* exchange content; ECX contains address of next SEH */
- xchgl %ecx, %edx
- /* inspect next SEH */
- jmp walk
-
-found:
- /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
- movl 0x04(%ecx), %ecx
- /* save address in ECX as SEH handler for context */
- movl %ecx, 0x3c(%eax)
- /* set ECX to -1 */
- movl $0xffffffff, %ecx
- /* save ECX as next SEH item */
- movl %ecx, 0x38(%eax)
- /* load address of next SEH item */
- leal 0x38(%eax), %ecx
- /* save next SEH */
- movl %ecx, 0x18(%eax)
-
- /* return pointer to context-data */
- ret
-
-trampoline:
- /* move transport_t for entering context-function */
- /* FCTX == EAX, DATA == EDX */
- movl %eax, (%esp)
- movl %edx, 0x4(%esp)
- /* label finish as return-address */
- pushl %ebp
- /* jump to context-function */
- jmp *%ebx
-
-finish:
- /* ESP points to same address as ESP on entry of context function + 0x4 */
- xorl %eax, %eax
- /* exit code is zero */
- movl %eax, (%esp)
- /* exit application */
- call __exit
- hlt
-
-.def __exit; .scl 2; .type 32; .endef /* standard C library function */
-
-.section .drectve
-.ascii " -export:\"make_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/make_i386_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_i386_sysv_elf_gas.S
index c6e0b36558..992bae019a 100644
--- a/contrib/restricted/boost/context/src/asm/make_i386_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_i386_sysv_elf_gas.S
@@ -31,6 +31,7 @@
.file "make_i386_sysv_elf_gas.S"
.text
.globl make_fcontext
+.hidden make_fcontext
.align 2
.type make_fcontext,@function
make_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/make_i386_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_i386_sysv_macho_gas.S
index 519e406248..a5890d75f6 100644
--- a/contrib/restricted/boost/context/src/asm/make_i386_sysv_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_i386_sysv_macho_gas.S
@@ -25,6 +25,7 @@
****************************************************************************************/
.text
+.private_extern _make_fcontext
.globl _make_fcontext
.align 2
_make_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/make_i386_x86_64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_i386_x86_64_sysv_macho_gas.S
deleted file mode 100644
index e364b2db62..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_i386_x86_64_sysv_macho_gas.S
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
- #include "make_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
- #include "make_x86_64_sysv_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/make_loongarch64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_loongarch64_sysv_elf_gas.S
deleted file mode 100644
index 55062702f1..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_loongarch64_sysv_elf_gas.S
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | FS0 | FS1 | FS2 | FS3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | FS4 | FS5 | FS6 | FS7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | S8 | FP | RA | PC | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "make_loongarch64_sysv_elf_gas.S"
-.text
-.globl make_fcontext
-.align 2
-.type make_fcontext,@function
-make_fcontext:
- # shift address in A0 to lower 16 byte boundary
- bstrins.d $a0, $zero, 3, 0
-
- # reserve space for context-data on context-stack
- addi.d $a0, $a0, -160
-
- # third arg of make_fcontext() == address of context-function
- st.d $a2, $a0, 152
-
- # save address of finish as return-address for context-function
- # will be entered after context-function returns
- la.local $a4, finish
- st.d $a4, $a0, 144
-
- # return pointer to context-data
- jr $ra
-
-finish:
- # exit code is zero
- li.d $a0, 0
- # call _exit(0)
- b %plt(_exit)
-
-.size make_fcontext, .-make_fcontext
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_mips32_o32_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_mips32_o32_elf_gas.S
deleted file mode 100644
index 4e11e3d058..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_mips32_o32_elf_gas.S
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | F20 | F22 | F24 | F26 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | F28 | F30 | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | ABI ARGS | GP | FCTX| DATA| | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "make_mips32_o32_elf_gas.S"
-.text
-.globl make_fcontext
-.align 2
-.type make_fcontext,@function
-.ent make_fcontext
-make_fcontext:
-#ifdef __PIC__
-.set noreorder
-.cpload $t9
-.set reorder
-#endif
- # shift address in A0 to lower 16 byte boundary
- li $v1, -16 # 0xfffffffffffffff0
- and $v0, $v1, $a0
-
- # reserve space for context-data on context-stack
- # includes an extra 32 bytes for:
- # - 16-byte incoming argument area required by mips ABI used when
- # jump_context calls the initial function
- # - 4 bytes to save our GP register used in finish
- # - 8 bytes to as space for transfer_t returned to finish
- # - 4 bytes for alignment
- addiu $v0, $v0, -128
-
- # third arg of make_fcontext() == address of context-function
- sw $a2, 92($v0)
- # save global pointer in context-data
- sw $gp, 112($v0)
-
- # compute address of returned transfer_t
- addiu $t0, $v0, 116
- sw $t0, 84($v0)
-
- # compute abs address of label finish
- la $t9, finish
- # save address of finish as return-address for context-function
- # will be entered after context-function returns
- sw $t9, 88($v0)
-
- jr $ra # return pointer to context-data
-
-finish:
- # reload our gp register (needed for la)
- lw $gp, 16($sp)
-
- # call _exit(0)
- # the previous function should have left the 16 bytes incoming argument
- # area on the stack which we reuse for calling _exit
- la $t9, _exit
- move $a0, $zero
- jr $t9
-.end make_fcontext
-.size make_fcontext, .-make_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_mips64_n64_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_mips64_n64_elf_gas.S
deleted file mode 100644
index 7bb30b14de..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_mips64_n64_elf_gas.S
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- Copyright Jiaxun Yang 2018.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | F24 | F25 | F26 | F27 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | F28 | F29 | F30 | F31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | FP | GP | RA | PC | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "make_mips64_n64_elf_gas.S"
-.text
-.globl make_fcontext
-.align 3
-.type make_fcontext,@function
-.ent make_fcontext
-make_fcontext:
-#ifdef __PIC__
-.set noreorder
-.cpload $t9
-.set reorder
-#endif
- # shift address in A0 to lower 16 byte boundary
- li $v1, 0xfffffffffffffff0
- and $v0, $v1, $a0
-
- # reserve space for context-data on context-stack
- daddiu $v0, $v0, -160
-
- # third arg of make_fcontext() == address of context-function
- sd $a2, 152($v0)
- # save global pointer in context-data
- sd $gp, 136($v0)
-
- # psudo instruction compute abs address of label finish based on GP
- dla $t9, finish
-
- # save address of finish as return-address for context-function
- # will be entered after context-function returns
- sd $t9, 144($v0)
-
- jr $ra # return pointer to context-data
-
-finish:
- # reload our gp register (needed for la)
- daddiu $t0, $sp, -160
- ld $gp, 136($t0)
-
- # call _exit(0)
- # the previous function should have left the 16 bytes incoming argument
- # area on the stack which we reuse for calling _exit
- dla $t9, _exit
- move $a0, $zero
- jr $t9
-.end make_fcontext
-.size make_fcontext, .-make_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_ppc32_ppc64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_ppc32_ppc64_sysv_macho_gas.S
deleted file mode 100644
index 52e7220933..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_ppc32_ppc64_sysv_macho_gas.S
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__ppc__)
- #include "make_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
- #include "make_ppc64_sysv_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_elf_gas.S
deleted file mode 100644
index 9616c4ca9b..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_elf_gas.S
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * |bchai|hiddn| fpscr | PC | CR | R14 | R15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------|------------ *
- * | 224 | 228 | 232 | 236 | 240 | 244 | *
- * ------------------------|------------ *
- * | F30 | F31 |bchai| LR | *
- * ------------------------|------------ *
- * *
- *******************************************************/
-
-.file "make_ppc32_sysv_elf_gas.S"
-.text
-.globl make_fcontext
-.align 2
-.type make_fcontext,@function
-make_fcontext:
- # save return address into R6
- mflr %r6
-
- # first arg of make_fcontext() == top address of context-function
- # shift address in R3 to lower 16 byte boundary
- clrrwi %r3, %r3, 4
-
- # reserve space on context-stack, including 16 bytes of linkage
- # and parameter area + 240 bytes of context-data (R1 % 16 == 0)
- subi %r3, %r3, 16 + 240
-
- # third arg of make_fcontext() == address of context-function
-#ifdef __linux__
- # save context-function as PC
- stw %r5, 16(%r3)
-#else
- # save context-function for trampoline
- stw %r5, 248(%r3)
-#endif
-
- # set back-chain to zero
- li %r0, 0
- stw %r0, 240(%r3)
-
- # copy FPSCR to new context
- mffs %f0
- stfd %f0, 8(%r3)
-
-#ifdef __linux__
- # set hidden pointer for returning transfer_t
- la %r0, 248(%r3)
- stw %r0, 4(%r3)
-#endif
-
- # load address of label 1 into R4
- bl 1f
-1: mflr %r4
-#ifndef __linux__
- # compute abs address of trampoline, use as PC
- addi %r7, %r4, trampoline - 1b
- stw %r7, 16(%r3)
-#endif
- # compute abs address of label finish
- addi %r4, %r4, finish - 1b
- # save address of finish as return-address for context-function
- # will be entered after context-function returns
- stw %r4, 244(%r3)
-
- # restore return address from R6
- mtlr %r6
-
- blr # return pointer to context-data
-
-#ifndef __linux__
-trampoline:
- # On systems other than Linux, jump_fcontext is returning the
- # transfer_t in R3:R4, but we need to pass transfer_t * R3 to
- # our context-function.
- lwz %r0, 8(%r1) # address of context-function
- mtctr %r0
- stw %r3, 8(%r1)
- stw %r4, 12(%r1)
- la %r3, 8(%r1) # address of transfer_t
- bctr
-#endif
-
-finish:
- # Use the secure PLT for _exit(0). If we use the insecure BSS PLT
- # here, then the linker may use the insecure BSS PLT even if the
- # C++ compiler wanted the secure PLT.
-
- # set R30 for secure PLT, large model
- bl 2f
-2: mflr %r30
- addis %r30, %r30, .Ltoc - 2b@ha
- addi %r30, %r30, .Ltoc - 2b@l
-
- # call _exit(0) with special addend 0x8000 for large model
- li %r3, 0
- bl _exit + 0x8000@plt
-.size make_fcontext, .-make_fcontext
-
-/* Provide the GOT pointer for secure PLT, large model. */
-.section .got2,"aw"
-.Ltoc = . + 0x8000
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_macho_gas.S
deleted file mode 100644
index 1102ee90ef..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_macho_gas.S
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F30 | F31 | fpscr | R13 | R14 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | | *
- * ------------------------------------------------- *
- * | 256 | | *
- * ------------------------------------------------- *
- * | DATA| | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.text
-.globl _make_fcontext
-.align 2
-_make_fcontext:
- ; save return address into R6
- mflr r6
-
- ; first arg of make_fcontext() == top address of context-function
- ; shift address in R3 to lower 16 byte boundary
- clrrwi r3, r3, 4
-
- ; reserve space for context-data on context-stack
- ; including 64 byte of linkage + parameter area (R1 % 16 == 0)
- subi r3, r3, 336
-
- ; third arg of make_fcontext() == address of context-function
- ; store as trampoline's R31
- stw r5, 224(r3)
-
- ; set back-chain to zero
- li r0, 0
- stw r0, 244(r3)
-
- mffs f0 ; load FPSCR
- stfd f0, 144(r3) ; save FPSCR
-
- ; compute address of returned transfer_t
- addi r0, r3, 252
- mr r4, r0
- stw r4, 228(r3)
-
- ; load LR
- mflr r0
- ; jump to label 1
- bcl 20, 31, L1
-L1:
- ; load LR into R4
- mflr r4
- ; compute abs address of trampoline, use as PC
- addi r5, r4, lo16(Ltrampoline - L1)
- stw r5, 240(r3)
- ; compute abs address of label finish
- addi r4, r4, lo16(Lfinish - L1)
- ; restore LR
- mtlr r0
- ; save address of finish as return-address for context-function
- ; will be entered after context-function returns
- stw r4, 236(r3)
-
- ; restore return address from R6
- mtlr r6
-
- blr ; return pointer to context-data
-
-Ltrampoline:
- ; We get R31 = context-function, R3 = address of transfer_t,
- ; but we need to pass R3:R4 = transfer_t.
- mtctr r31
- lwz r4, 4(r3)
- lwz r3, 0(r3)
- bctr
-
-Lfinish:
- ; load address of _exit into CTR
- bcl 20, 31, L2
-L2:
- mflr r4
- addis r4, r4, ha16(Lexitp - L2)
- lwz r4, lo16(Lexitp - L2)(r4)
- mtctr r4
- ; exit code is zero
- li r3, 0
- ; exit application
- bctr
-
-.const_data
-.align 2
-Lexitp:
- .long __exit
diff --git a/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_xcoff_gas.S b/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_xcoff_gas.S
deleted file mode 100644
index e803757fa3..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_ppc32_sysv_xcoff_gas.S
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * |bchai| CR | LR |compl| link| TOC | R14 | R15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | F30 | F31 | PC |hiddn| fpscr | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 256 | 260 | 264 | 268 | 272 | 276 | 280 | 284 | *
- * ------------------------------------------------- *
- * |bchai|savLR|savLR|compl| link|svTOC| FCTX| DATA| *
- * ------------------------------------------------- *
- * *
- *******************************************************/
- .file "make_ppc32_sysv_xcoff_xas.S"
- .toc
- .csect .text[PR]
- .align 2
- .globl make_fcontext[DS]
- .globl .make_fcontext
- .csect make_fcontext[DS]
-make_fcontext:
- .long .make_fcontext[PR], TOC[tc0], 0
- .csect .text[PR], 5
-.make_fcontext:
- # save return address into R6
- mflr 6
-
- # first arg of make_fcontext() == top address of context-function
- # shift address in R3 to lower 16 byte boundary
- clrrwi 3, 3, 4
-
- # reserve space for context-data on context-stack
- # including 32 byte of linkage + parameter area (R1 % 16 == 0)
- subi 3, 3, 288
-
- # third arg of make_fcontext() == address of context-function descriptor
- lwz 4, 0(5)
- stw 4, 240(3)
- # save TOC of context-function
- lwz 4, 4(5)
- stw 4, 20(3)
-
- # set back-chain to zero
- li 0, 0
- stw 0, 256(3)
-
- # zero in r3 indicates first jump to context-function
- std 0, 244(3)
-
- # load LR
- mflr 0
- # jump to label 1
- bl .Label
-.Label:
- # load LR into R4
- mflr 4
- # compute abs address of label .L_finish
- addi 4, 4, .L_finish - .Label
- # restore LR
- mtlr 0
- # save address of finish as return-address for context-function
- # will be entered after context-function returns
- stw 4, 8(3)
-
- # restore return address from R6
- mtlr 6
-
- blr # return pointer to context-data
-
-.L_finish:
- # save return address into R0
- mflr 0
- # save return address on stack, set up stack frame
- stw 0, 4(1)
- # allocate stack space, R1 % 16 == 0
- stwu 1, -16(1)
-
- # exit code is zero
- li 3, 0
- # exit application
- bl ._exit
- nop
diff --git a/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_elf_gas.S
deleted file mode 100644
index c4d7ee5982..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_elf_gas.S
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | TOC | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | TOC saved | FCTX | DATA | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.file "make_ppc64_sysv_elf_gas.S"
-.globl make_fcontext
-#if _CALL_ELF == 2
- .text
- .align 2
-make_fcontext:
- addis %r2, %r12, .TOC.-make_fcontext@ha
- addi %r2, %r2, .TOC.-make_fcontext@l
- .localentry make_fcontext, . - make_fcontext
-#else
- .section ".opd","aw"
- .align 3
-make_fcontext:
-# ifdef _CALL_LINUX
- .quad .L.make_fcontext,.TOC.@tocbase,0
- .type make_fcontext,@function
- .text
- .align 2
-.L.make_fcontext:
-# else
- .hidden .make_fcontext
- .globl .make_fcontext
- .quad .make_fcontext,.TOC.@tocbase,0
- .size make_fcontext,24
- .type .make_fcontext,@function
- .text
- .align 2
-.make_fcontext:
-# endif
-#endif
- # save return address into R6
- mflr %r6
-
- # first arg of make_fcontext() == top address of context-stack
- # shift address in R3 to lower 16 byte boundary
- clrrdi %r3, %r3, 4
-
- # reserve space for context-data on context-stack
- # including 64 byte of linkage + parameter area (R1 % 16 == 0)
- subi %r3, %r3, 248
-
- # third arg of make_fcontext() == address of context-function
- # entry point (ELFv2) or descriptor (ELFv1)
-#if _CALL_ELF == 2
- # save address of context-function entry point
- std %r5, 176(%r3)
-#else
- # save address of context-function entry point
- ld %r4, 0(%r5)
- std %r4, 176(%r3)
- # save TOC of context-function
- ld %r4, 8(%r5)
- std %r4, 0(%r3)
-#endif
-
- # set back-chain to zero
- li %r0, 0
- std %r0, 184(%r3)
-
-#if _CALL_ELF != 2
- # zero in r3 indicates first jump to context-function
- std %r0, 152(%r3)
-#endif
-
- # load LR
- mflr %r0
- # jump to label 1
- bl 1f
-1:
- # load LR into R4
- mflr %r4
- # compute abs address of label finish
- addi %r4, %r4, finish - 1b
- # restore LR
- mtlr %r0
- # save address of finish as return-address for context-function
- # will be entered after context-function returns
- std %r4, 168(%r3)
-
- # restore return address from R6
- mtlr %r6
-
- blr # return pointer to context-data
-
-finish:
- # save return address into R0
- mflr %r0
- # save return address on stack, set up stack frame
- std %r0, 8(%r1)
- # allocate stack space, R1 % 16 == 0
- stdu %r1, -32(%r1)
-
- # exit code is zero
- li %r3, 0
- # exit application
- bl _exit
- nop
-#if _CALL_ELF == 2
- .size make_fcontext, .-make_fcontext
-#else
-# ifdef _CALL_LINUX
- .size .make_fcontext, .-.L.make_fcontext
-# else
- .size .make_fcontext, .-.make_fcontext
-# endif
-#endif
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_macho_gas.S
deleted file mode 100644
index dd7bf2c5c0..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_macho_gas.S
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | R13 | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | FCTX | DATA | | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.text
-.globl _make_fcontext
-_make_fcontext:
- ; save return address into R6
- mflr r6
-
- ; first arg of make_fcontext() == top address of context-function
- ; shift address in R3 to lower 16 byte boundary
- clrrwi r3, r3, 4
-
- ; reserve space for context-data on context-stack
- ; including 64 byte of linkage + parameter area (R1 16 == 0)
- subi r3, r3, 240
-
- ; third arg of make_fcontext() == address of context-function
- stw r5, 176(r3)
-
- ; set back-chain to zero
- li r0, 0
- std r0, 184(r3)
-
- ; compute address of returned transfer_t
- addi r0, r3, 224
- mr r4, r0
- std r4, 152(r3)
-
- ; load LR
- mflr r0
- ; jump to label 1
- bl l1
-l1:
- ; load LR into R4
- mflr r4
- ; compute abs address of label finish
- addi r4, r4, lo16((finish - .) + 4)
- ; restore LR
- mtlr r0
- ; save address of finish as return-address for context-function
- ; will be entered after context-function returns
- std r4, 168(r3)
-
- ; restore return address from R6
- mtlr r6
-
- blr ; return pointer to context-data
-
-finish:
- ; save return address into R0
- mflr r0
- ; save return address on stack, set up stack frame
- stw r0, 8(r1)
- ; allocate stack space, R1 16 == 0
- stwu r1, -32(r1)
-
- ; set return value to zero
- li r3, 0
- ; exit application
- bl __exit
- nop
diff --git a/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_xcoff_gas.S b/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_xcoff_gas.S
deleted file mode 100644
index 2374b50ee6..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_ppc64_sysv_xcoff_gas.S
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | TOC | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | TOC saved | FCTX | DATA | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
- .file "make_ppc64_sysv_xcoff_gas.S"
- .toc
- .csect .text[PR], 5
- .align 2
- .globl make_fcontext[DS]
- .globl .make_fcontext
- .csect make_fcontext[DS], 3
-make_fcontext:
- .llong .make_fcontext[PR], TOC[tc0], 0
- .csect .text[PR], 5
-.make_fcontext:
- # save return address into R6
- mflr 6
-
- # first arg of make_fcontext() == top address of context-function
- # shift address in R3 to lower 16 byte boundary
- clrrdi 3, 3, 4
-
- # reserve space for context-data on context-stack
- # including 64 byte of linkage + parameter area (R1 % 16 == 0)
- subi 3, 3, 248
-
- # third arg of make_fcontext() == address of context-function descriptor
- ld 4, 0(5)
- std 4, 176(3)
- # save TOC of context-function
- ld 4, 8(5)
- std 4, 0(3)
-
- # set back-chain to zero
- li 0, 0
- std 0, 184(3)
-
- # zero in r3 indicates first jump to context-function
- std 0, 152(3)
-
- # load LR
- mflr 0
- # jump to label 1
- bl .Label
-.Label:
- # load LR into R4
- mflr 4
- # compute abs address of label .L_finish
- addi 4, 4, .L_finish - .Label
- # restore LR
- mtlr 0
- # save address of finish as return-address for context-function
- # will be entered after context-function returns
- std 4, 168(3)
-
- # restore return address from R6
- mtlr 6
-
- blr # return pointer to context-data
-
-.L_finish:
- # save return address into R0
- mflr 0
- # save return address on stack, set up stack frame
- std 0, 8(1)
- # allocate stack space, R1 % 16 == 0
- stdu 1, -32(1)
-
- # exit code is zero
- li 3, 0
- # exit application
- bl ._exit
- nop
diff --git a/contrib/restricted/boost/context/src/asm/make_riscv64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_riscv64_sysv_elf_gas.S
deleted file mode 100644
index 5322e0fdbd..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_riscv64_sysv_elf_gas.S
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
- * ------------------------------------------------- *
- * | fs0 | fs1 | fs2 | fs3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
- * ------------------------------------------------- *
- * | fs4 | fs5 | fs6 | fs7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
- * ------------------------------------------------- *
- * | fs8 | fs9 | fs10 | fs11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
- * ------------------------------------------------- *
- * | s0 | s1 | s2 | s3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
- * ------------------------------------------------- *
- * | s4 | s5 | s6 | s7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
- * ------------------------------------------------- *
- * | s8 | s9 | s10 | s11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | | | | | *
- * ------------------------------------------------- *
- * | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
- * ------------------------------------------------- *
- * | ra | pc | | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.file "make_riscv64_sysv_elf_gas.S"
-.text
-.align 1
-.global make_fcontext
-.type make_fcontext, %function
-make_fcontext:
- # shift address in a0 (allocated stack) to lower 16 byte boundary
- andi a0, a0, ~0xF
-
- # reserve space for context-data on context-stack
- addi a0, a0, -0xd0
-
- # third arg of make_fcontext() == address of context-function
- # store address as a PC to jump in
- sd a2, 0xc8(a0)
-
- # save address of finish as return-address for context-function
- # will be entered after context-function returns (RA register)
- lla a4, finish
- sd a4, 0xc0(a0)
-
- ret // return pointer to context-data (a0)
-
-finish:
- # exit code is zero
- li a0, 0
- # exit application
- tail _exit@plt
-
-.size make_fcontext,.-make_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_s390x_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_s390x_sysv_elf_gas.S
deleted file mode 100644
index 4dd423e2a4..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_s390x_sysv_elf_gas.S
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | t.fctx | t.data | r2 | r6 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | r7 | r8 | r9 | r10 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | r11 | r12 | r13 | r14 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 104 | 112 | 120 | *
- * ------------------------------------------------- *
- * | f8 | f9 | f10 | f11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 136 | 144 | 152 | *
- * ------------------------------------------------- *
- * | f12 | f13 | f14 | f15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 168 | 176 | | *
- * ------------------------------------------------- *
- * | fpc | pc | | | *
- * ------------------------------------------------- *
- *******************************************************/
-
-.text
-.align 8
-.global make_fcontext
-.type make_fcontext, @function
-
-#define ARG_OFFSET 0
-#define GR_OFFSET 16
-#define R14_OFFSET 88
-#define FP_OFFSET 96
-#define FPC_OFFSET 160
-#define PC_OFFSET 168
-#define CONTEXT_SIZE 176
-
-/*
-
-fcontext_t make_fcontext( void * sp, std::size_t size, void (* fn)( transfer_t) );
-
-Create and return a context below SP to call FN.
-
-Incoming args
-r2 - The stack location where to create the context
-r3 - The size of the context
-r4 - The address of the context function
-
-*/
-
-make_fcontext:
- .machine "z10"
- /* Align the stack to an 8 byte boundary. */
- nill %r2,0xfff8
-
- /* Allocate stack space for the context. */
- aghi %r2,-CONTEXT_SIZE
-
- /* Set the r2 save slot to zero. This indicates jump_fcontext
- that this is a special context. */
- mvghi GR_OFFSET(%r2),0
-
- /* Save the floating point control register. */
- stfpc FPC_OFFSET(%r2)
-
- /* Store the address of the target function as new pc. */
- stg %r4,PC_OFFSET(%r2)
-
- /* Store a pointer to the finish routine as r14. If a function
- called via context routines just returns that value will be
- loaded and used as return address. Hence the program will
- just exit. */
- larl %r1,finish
- stg %r1,R14_OFFSET(%r2)
-
- /* Return as usual with the new context returned in r2. */
- br %r14
-
-finish:
- /* In finish tasks, you load the exit code and exit the
- make_fcontext This is called when the context-function is
- entirely executed. */
- lghi %r2,0
- brasl %r14,_exit@PLT
-
-.size make_fcontext,.-make_fcontext
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_sparc64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_sparc64_sysv_elf_gas.S
deleted file mode 100644
index 3e7ee809c9..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_sparc64_sysv_elf_gas.S
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- Copyright Claudio Jeker 2024
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*
- * fcontext_t *make_fcontext(void *sp, size_t size, void (*fn)(transfer_t));
- */
-#define CC64FSZ 176
-#define BIAS 2047
-#define FP 112
-#define SP 128
-#define I7 136
-
-.file "make_sparc64_sysv_elf_gas.S"
-.text
-.align 4
-.global make_fcontext
-.type make_fcontext, %function
-make_fcontext:
- save %sp, -CC64FSZ, %sp
-
- # shift address in %i0 (allocated stack) to lower 16 byte boundary
- and %i0, -0xf, %i0
-
- # reserve space for two frames on the stack
- # the first frame is for the call the second one holds the data
- # for jump_fcontext
- sub %i0, 2 * CC64FSZ, %i0
-
- # third argument of make_fcontext() is the context-function to call
- # store it in the first stack frame, also clear %fp there to indicate
- # the end of the stack.
- stx %i2, [%i0 + CC64FSZ + I7]
- stx %g0, [%i0 + CC64FSZ + FP]
-
- # On OpenBSD stackghost prevents overriding the return address on
- # a stack frame. So this code uses an extra trampoline to load
- # to call the context-function and then do the _exit(0) dance.
- # Extract the full address of the trampoline via pc relative addressing
-1:
- rd %pc, %l0
- add %l0, (trampoline - 1b - 8), %l0
- stx %l0, [%i0 + I7]
-
- # Save framepointer to first stack frame but first substract the BIAS
- add %i0, CC64FSZ - BIAS, %l0
- stx %l0, [%i0 + SP]
-
- # Return context-data which is also includes the BIAS
- ret
- restore %i0, -BIAS, %o0
-
-trampoline:
- ldx [%sp + BIAS + I7], %l0
-
- # no need to setup transfer_t, already in %o0 and %o1
- jmpl %l0, %o7
- nop
-
- call _exit
- clr %o0
- unimp
-.size make_fcontext,.-make_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_clang_gas.S b/contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_clang_gas.S
deleted file mode 100644
index 9b3a6fccf7..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_clang_gas.S
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* ---------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc | *
-* ---------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc | *
-* ---------------------------------------------------------------------------------- *
-* | limit | base | R12 | R13 | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc | *
-* ---------------------------------------------------------------------------------- *
-* | R14 | R15 | RDI | RSI | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c | *
-* ---------------------------------------------------------------------------------- *
-* | RBX | RBP | hidden | RIP | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c | *
-* ---------------------------------------------------------------------------------- *
-* | parameter area | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c | *
-* ---------------------------------------------------------------------------------- *
-* | FCTX | DATA | | *
-* ---------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "make_x86_64_ms_pe_clang_gas.S"
-.text
-.p2align 4,,15
-.globl make_fcontext
-.def make_fcontext; .scl 2; .type 32; .endef
-.seh_proc make_fcontext
-make_fcontext:
-.seh_endprologue
-
- /* first arg of make_fcontext() == top of context-stack */
- movq %rcx, %rax
-
- /* shift address in RAX to lower 16 byte boundary */
- /* == pointer to fcontext_t and address of context stack */
- andq $-16, %rax
-
- /* reserve space for context-data on context-stack */
- /* on context-function entry: (RSP -0x8) % 16 == 0 */
- leaq -0x150(%rax), %rax
-
- /* third arg of make_fcontext() == address of context-function */
- movq %r8, 0x100(%rax)
-
- /* first arg of make_fcontext() == top of context-stack */
- /* save top address of context stack as 'base' */
- movq %rcx, 0xc8(%rax)
- /* second arg of make_fcontext() == size of context-stack */
- /* negate stack size for LEA instruction (== substraction) */
- negq %rdx
- /* compute bottom address of context stack (limit) */
- leaq (%rcx,%rdx), %rcx
- /* save bottom address of context stack as 'limit' */
- movq %rcx, 0xc0(%rax)
- /* save address of context stack limit as 'dealloction stack' */
- movq %rcx, 0xb8(%rax)
- /* set fiber-storage to zero */
- xorq %rcx, %rcx
- movq %rcx, 0xb0(%rax)
-
- /* save MMX control- and status-word */
- stmxcsr 0xa0(%rax)
- /* save x87 control-word */
- fnstcw 0xa4(%rax)
-
- /* compute address of transport_t */
- leaq 0x140(%rax), %rcx
- /* store address of transport_t in hidden field */
- movq %rcx, 0x110(%rax)
-
- /* compute abs address of label trampoline */
- leaq trampoline(%rip), %rcx
- /* save address of finish as return-address for context-function */
- /* will be entered after jump_fcontext() first time */
- movq %rcx, 0x118(%rax)
-
- /* compute abs address of label finish */
- leaq finish(%rip), %rcx
- /* save address of finish as return-address for context-function */
- /* will be entered after context-function returns */
- movq %rcx, 0x108(%rax)
-
- ret /* return pointer to context-data */
-
-trampoline:
- /* store return address on stack */
- /* fix stack alignment */
- pushq %rbp
- /* jump to context-function */
- jmp *%rbx
-
-finish:
- /* 32byte shadow-space for _exit() */
- andq $-32, %rsp
- /* 32byte shadow-space for _exit() are */
- /* already reserved by make_fcontext() */
- /* exit code is zero */
- xorq %rcx, %rcx
- /* exit application */
- call _exit
- hlt
-.seh_endproc
-
-.def _exit; .scl 2; .type 32; .endef /* standard C library function */
-
-.section .drectve
-.ascii " -export:\"make_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_gas.asm b/contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_gas.asm
deleted file mode 100644
index 958a2a7b6d..0000000000
--- a/contrib/restricted/boost/context/src/asm/make_x86_64_ms_pe_gas.asm
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* ---------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc | *
-* ---------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc | *
-* ---------------------------------------------------------------------------------- *
-* | limit | base | R12 | R13 | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc | *
-* ---------------------------------------------------------------------------------- *
-* | R14 | R15 | RDI | RSI | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c | *
-* ---------------------------------------------------------------------------------- *
-* | RBX | RBP | hidden | RIP | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c | *
-* ---------------------------------------------------------------------------------- *
-* | parameter area | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c | *
-* ---------------------------------------------------------------------------------- *
-* | FCTX | DATA | | *
-* ---------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "make_x86_64_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl make_fcontext
-.def make_fcontext; .scl 2; .type 32; .endef
-.seh_proc make_fcontext
-make_fcontext:
-.seh_endprologue
-
- /* first arg of make_fcontext() == top of context-stack */
- movq %rcx, %rax
-
- /* shift address in RAX to lower 16 byte boundary */
- /* == pointer to fcontext_t and address of context stack */
- andq $-16, %rax
-
- /* reserve space for context-data on context-stack */
- /* on context-function entry: (RSP -0x8) % 16 == 0 */
- leaq -0x150(%rax), %rax
-
- /* third arg of make_fcontext() == address of context-function */
- movq %r8, 0x100(%rax)
-
- /* first arg of make_fcontext() == top of context-stack */
- /* save top address of context stack as 'base' */
- movq %rcx, 0xc8(%rax)
- /* second arg of make_fcontext() == size of context-stack */
- /* negate stack size for LEA instruction (== substraction) */
- negq %rdx
- /* compute bottom address of context stack (limit) */
- leaq (%rcx,%rdx), %rcx
- /* save bottom address of context stack as 'limit' */
- movq %rcx, 0xc0(%rax)
- /* save address of context stack limit as 'dealloction stack' */
- movq %rcx, 0xb8(%rax)
- /* set fiber-storage to zero */
- xorq %rcx, %rcx
- movq %rcx, 0xb0(%rax)
-
- /* save MMX control- and status-word */
- stmxcsr 0xa0(%rax)
- /* save x87 control-word */
- fnstcw 0xa4(%rax)
-
- /* compute address of transport_t */
- leaq 0x140(%rax), %rcx
- /* store address of transport_t in hidden field */
- movq %rcx, 0x110(%rax)
-
- /* compute abs address of label trampoline */
- leaq trampoline(%rip), %rcx
- /* save address of finish as return-address for context-function */
- /* will be entered after jump_fcontext() first time */
- movq %rcx, 0x118(%rax)
-
- /* compute abs address of label finish */
- leaq finish(%rip), %rcx
- /* save address of finish as return-address for context-function */
- /* will be entered after context-function returns */
- movq %rcx, 0x108(%rax)
-
- ret /* return pointer to context-data */
-
-trampoline:
- /* store return address on stack */
- /* fix stack alignment */
- pushq %rbp
- /* jump to context-function */
- jmp *%rbx
-
-finish:
- /* 32byte shadow-space for _exit() */
- andq $-32, %rsp
- /* 32byte shadow-space for _exit() are */
- /* already reserved by make_fcontext() */
- /* exit code is zero */
- xorq %rcx, %rcx
- /* exit application */
- call _exit
- hlt
-.seh_endproc
-
-.def _exit; .scl 2; .type 32; .endef /* standard C library function */
-
-.section .drectve
-.ascii " -export:\"make_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S
index b0d0c0341e..7561c0896b 100644
--- a/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_elf_gas.S
@@ -44,6 +44,7 @@
.file "make_x86_64_sysv_elf_gas.S"
.text
.globl make_fcontext
+.hidden make_fcontext
.type make_fcontext,@function
.align 16
make_fcontext:
@@ -92,35 +93,6 @@ make_fcontext:
movq %rcx, 0x38(%rax)
#if BOOST_CONTEXT_SHADOW_STACK
- /* Populate the shadow stack and normal stack */
- /* get original SSP */
- rdsspq %r8
- /* restore new shadow stack */
- rstorssp -0x8(%r9)
- /* save the restore token on the original shadow stack */
- saveprevssp
- /* push the address of "jmp trampoline" to the new shadow stack */
- /* as well as the stack */
- call 1f
- jmp trampoline
-1:
- /* save address of "jmp trampoline" as return-address */
- /* for context-function */
- pop 0x38(%rax)
- /* Get the new SSP. */
- rdsspq %r9
- /* restore original shadow stack */
- rstorssp -0x8(%r8)
- /* save the restore token on the new shadow stack. */
- saveprevssp
-
- /* reserve space for the new SSP */
- leaq -0x8(%rax), %rax
- /* save the new SSP to this fcontext */
- movq %r9, (%rax)
-#endif
-
-#if BOOST_CONTEXT_SHADOW_STACK
/* Populate the shadow stack */
/* get original SSP */
diff --git a/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_macho_gas.S
index 5d6c5431c5..06357f678a 100644
--- a/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/make_x86_64_sysv_macho_gas.S
@@ -25,6 +25,7 @@
****************************************************************************************/
.text
+.private_extern _make_fcontext
.globl _make_fcontext
.align 8
_make_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_elf_gas.S
index 665ca5a2c1..8e40fc7d36 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_elf_gas.S
@@ -55,6 +55,7 @@
.text
.align 2
.global ontop_fcontext
+.hidden ontop_fcontext
.type ontop_fcontext, %function
ontop_fcontext:
# prepare stack for GP + FPU
diff --git a/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_macho_gas.S
index a387d06dd2..8babe47023 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_arm64_aapcs_macho_gas.S
@@ -52,6 +52,7 @@
*******************************************************/
.text
+.private_extern _ontop_fcontext
.global _ontop_fcontext
.balign 16
_ontop_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_elf_gas.S
index 59ad5ca9ce..8c6c9020de 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_elf_gas.S
@@ -41,6 +41,7 @@
.file "ontop_arm_aapcs_elf_gas.S"
.text
.globl ontop_fcontext
+.hidden ontop_fcontext
.align 2
.type ontop_fcontext,%function
.syntax unified
diff --git a/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_macho_gas.S
index 3633aca641..07e63fb24f 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_arm_aapcs_macho_gas.S
@@ -39,6 +39,7 @@
*******************************************************/
.text
+.private_extern _ontop_fcontext
.globl _ontop_fcontext
.align 2
_ontop_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/ontop_combined_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_combined_sysv_macho_gas.S
deleted file mode 100644
index 7d254de22c..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_combined_sysv_macho_gas.S
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
- #include "ontop_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
- #include "ontop_x86_64_sysv_macho_gas.S"
-#elif defined(__ppc__)
- #include "ontop_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
- #include "ontop_ppc64_sysv_macho_gas.S"
-#elif defined(__arm__)
- #include "ontop_arm_aapcs_macho_gas.S"
-#elif defined(__arm64__)
- #include "ontop_arm64_aapcs_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_clang_gas.S b/contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_clang_gas.S
deleted file mode 100644
index 16eb33e1a7..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_clang_gas.S
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* --------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* --------------------------------------------------------------------------------- *
-* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | *
-* --------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | *
-* --------------------------------------------------------------------------------- *
-* --------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* --------------------------------------------------------------------------------- *
-* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | *
-* --------------------------------------------------------------------------------- *
-* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| *
-* --------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "ontop_i386_ms_pe_clang_gas.S"
-.text
-.p2align 4,,15
-
-/* mark as using no unregistered SEH handlers */
-.globl @feat.00
-.def @feat.00; .scl 3; .type 0; .endef
-.set @feat.00, 1
-
-.globl _ontop_fcontext
-.def _ontop_fcontext; .scl 2; .type 32; .endef
-_ontop_fcontext:
- /* prepare stack */
- leal -0x2c(%esp), %esp
-
-#if !defined(BOOST_USE_TSX)
- /* save MMX control- and status-word */
- stmxcsr (%esp)
- /* save x87 control-word */
- fnstcw 0x4(%esp)
-#endif
-
- /* load NT_TIB */
- movl %fs:(0x18), %edx
- /* load fiber local storage */
- movl 0x10(%edx), %eax
- movl %eax, 0x8(%esp)
- /* load current dealloction stack */
- movl 0xe0c(%edx), %eax
- movl %eax, 0xc(%esp)
- /* load current stack limit */
- movl 0x8(%edx), %eax
- movl %eax, 0x10(%esp)
- /* load current stack base */
- movl 0x4(%edx), %eax
- movl %eax, 0x14(%esp)
- /* load current SEH exception list */
- movl (%edx), %eax
- movl %eax, 0x18(%esp)
-
- movl %edi, 0x1c(%esp) /* save EDI */
- movl %esi, 0x20(%esp) /* save ESI */
- movl %ebx, 0x24(%esp) /* save EBX */
- movl %ebp, 0x28(%esp) /* save EBP */
-
- /* store ESP (pointing to context-data) in ECX */
- movl %esp, %ecx
-
- /* first arg of ontop_fcontext() == fcontext to jump to */
- movl 0x30(%esp), %eax
-
- /* pass parent fcontext_t */
- movl %ecx, 0x30(%eax)
-
- /* second arg of ontop_fcontext() == data to be transferred */
- movl 0x34(%esp), %ecx
-
- /* pass data */
- movl %ecx, 0x34(%eax)
-
- /* third arg of ontop_fcontext() == ontop-function */
- movl 0x38(%esp), %ecx
-
- /* restore ESP (pointing to context-data) from EDX */
- movl %eax, %esp
-
-#if !defined(BOOST_USE_TSX)
- /* restore MMX control- and status-word */
- ldmxcsr (%esp)
- /* restore x87 control-word */
- fldcw 0x4(%esp)
-#endif
-
- /* restore NT_TIB into EDX */
- movl %fs:(0x18), %edx
- /* restore fiber local storage */
- movl 0x8(%esp), %eax
- movl %eax, 0x10(%edx)
- /* restore current deallocation stack */
- movl 0xc(%esp), %eax
- movl %eax, 0xe0c(%edx)
- /* restore current stack limit */
- movl 0x10(%esp), %eax
- movl %eax, 0x08(%edx)
- /* restore current stack base */
- movl 0x14(%esp), %eax
- movl %eax, 0x04(%edx)
- /* restore current SEH exception list */
- movl 0x18(%esp), %eax
- movl %eax, (%edx)
-
- movl 0x1c(%esp), %edi /* restore EDI */
- movl 0x20(%esp), %esi /* restore ESI */
- movl 0x24(%esp), %ebx /* restore EBX */
- movl 0x28(%esp), %ebp /* restore EBP */
-
- /* prepare stack */
- leal 0x2c(%esp), %esp
-
- /* keep return-address on stack */
-
- /* jump to context */
- jmp *%ecx
-
-.section .drectve
-.ascii " -export:\"_ontop_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_gas.asm b/contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_gas.asm
deleted file mode 100644
index abe9002a4b..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_i386_ms_pe_gas.asm
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* --------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* --------------------------------------------------------------------------------- *
-* | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | *
-* --------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | *
-* --------------------------------------------------------------------------------- *
-* --------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* --------------------------------------------------------------------------------- *
-* | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | *
-* --------------------------------------------------------------------------------- *
-* | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| *
-* --------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "ontop_i386_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-
-/* mark as using no unregistered SEH handlers */
-.globl @feat.00
-.def @feat.00; .scl 3; .type 0; .endef
-.set @feat.00, 1
-
-.globl _ontop_fcontext
-.def _ontop_fcontext; .scl 2; .type 32; .endef
-_ontop_fcontext:
- /* prepare stack */
- leal -0x2c(%esp), %esp
-
-#if !defined(BOOST_USE_TSX)
- /* save MMX control- and status-word */
- stmxcsr (%esp)
- /* save x87 control-word */
- fnstcw 0x4(%esp)
-#endif
-
- /* load NT_TIB */
- movl %fs:(0x18), %edx
- /* load fiber local storage */
- movl 0x10(%edx), %eax
- movl %eax, 0x8(%esp)
- /* load current dealloction stack */
- movl 0xe0c(%edx), %eax
- movl %eax, 0xc(%esp)
- /* load current stack limit */
- movl 0x8(%edx), %eax
- movl %eax, 0x10(%esp)
- /* load current stack base */
- movl 0x4(%edx), %eax
- movl %eax, 0x14(%esp)
- /* load current SEH exception list */
- movl (%edx), %eax
- movl %eax, 0x18(%esp)
-
- movl %edi, 0x1c(%esp) /* save EDI */
- movl %esi, 0x20(%esp) /* save ESI */
- movl %ebx, 0x24(%esp) /* save EBX */
- movl %ebp, 0x28(%esp) /* save EBP */
-
- /* store ESP (pointing to context-data) in ECX */
- movl %esp, %ecx
-
- /* first arg of ontop_fcontext() == fcontext to jump to */
- movl 0x30(%esp), %eax
-
- /* pass parent fcontext_t */
- movl %ecx, 0x30(%eax)
-
- /* second arg of ontop_fcontext() == data to be transferred */
- movl 0x34(%esp), %ecx
-
- /* pass data */
- movl %ecx, 0x34(%eax)
-
- /* third arg of ontop_fcontext() == ontop-function */
- movl 0x38(%esp), %ecx
-
- /* restore ESP (pointing to context-data) from EDX */
- movl %eax, %esp
-
-#if !defined(BOOST_USE_TSX)
- /* restore MMX control- and status-word */
- ldmxcsr (%esp)
- /* restore x87 control-word */
- fldcw 0x4(%esp)
-#endif
-
- /* restore NT_TIB into EDX */
- movl %fs:(0x18), %edx
- /* restore fiber local storage */
- movl 0x8(%esp), %eax
- movl %eax, 0x10(%edx)
- /* restore current deallocation stack */
- movl 0xc(%esp), %eax
- movl %eax, 0xe0c(%edx)
- /* restore current stack limit */
- movl 0x10(%esp), %eax
- movl %eax, 0x08(%edx)
- /* restore current stack base */
- movl 0x14(%esp), %eax
- movl %eax, 0x04(%edx)
- /* restore current SEH exception list */
- movl 0x18(%esp), %eax
- movl %eax, (%edx)
-
- movl 0x1c(%esp), %edi /* restore EDI */
- movl 0x20(%esp), %esi /* restore ESI */
- movl 0x24(%esp), %ebx /* restore EBX */
- movl 0x28(%esp), %ebp /* restore EBP */
-
- /* prepare stack */
- leal 0x2c(%esp), %esp
-
- /* keep return-address on stack */
-
- /* jump to context */
- jmp *%ecx
-
-.section .drectve
-.ascii " -export:\"ontop_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_elf_gas.S
index 0cb6168fab..ea7a75b90f 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_elf_gas.S
@@ -24,9 +24,14 @@
* *
****************************************************************************************/
+#ifdef __x86_64__
+#include "ontop_x86_64_sysv_elf_gas.S"
+#else
+
.file "ontop_i386_sysv_elf_gas.S"
.text
.globl ontop_fcontext
+.hidden ontop_fcontext
.align 2
.type ontop_fcontext,@function
ontop_fcontext:
@@ -98,3 +103,5 @@ ontop_fcontext:
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
+
+#endif
diff --git a/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_macho_gas.S
index 3a88372b3a..c129e8e0c7 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_i386_sysv_macho_gas.S
@@ -25,6 +25,7 @@
****************************************************************************************/
.text
+.private_extern _ontop_fcontext
.globl _ontop_fcontext
.align 2
_ontop_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/ontop_i386_x86_64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_i386_x86_64_sysv_macho_gas.S
deleted file mode 100644
index 393c5fe43e..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_i386_x86_64_sysv_macho_gas.S
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
- #include "ontop_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
- #include "ontop_x86_64_sysv_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/ontop_loongarch64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_loongarch64_sysv_elf_gas.S
deleted file mode 100644
index c6ea044857..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_loongarch64_sysv_elf_gas.S
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | FS0 | FS1 | FS2 | FS3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | FS4 | FS5 | FS6 | FS7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | S8 | FP | RA | PC | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "ontop_loongarch64_sysv_elf_gas.S"
-.text
-.globl ontop_fcontext
-.align 2
-.type ontop_fcontext,@function
-ontop_fcontext:
- # reserve space on stack
- addi.d $sp, $sp, -160
-
- # save fs0 - fs7
- fst.d $fs0, $sp, 0
- fst.d $fs1, $sp, 8
- fst.d $fs2, $sp, 16
- fst.d $fs3, $sp, 24
- fst.d $fs4, $sp, 32
- fst.d $fs5, $sp, 40
- fst.d $fs6, $sp, 48
- fst.d $fs7, $sp, 56
-
- # save s0 - s8, fp, ra
- st.d $s0, $sp, 64
- st.d $s1, $sp, 72
- st.d $s2, $sp, 80
- st.d $s3, $sp, 88
- st.d $s4, $sp, 96
- st.d $s5, $sp, 104
- st.d $s6, $sp, 112
- st.d $s7, $sp, 120
- st.d $s8, $sp, 128
- st.d $fp, $sp, 136
- st.d $ra, $sp, 144
-
- # save RA as PC
- st.d $ra, $sp, 152
-
- # store SP (pointing to context-data) in A3
- move $a3, $sp
-
- # restore SP (pointing to context-data) from A0
- move $sp, $a0
-
- # load fs0 - fs11
- fld.d $fs0, $sp, 0
- fld.d $fs1, $sp, 8
- fld.d $fs2, $sp, 16
- fld.d $fs3, $sp, 24
- fld.d $fs4, $sp, 32
- fld.d $fs5, $sp, 40
- fld.d $fs6, $sp, 48
- fld.d $fs7, $sp, 56
-
- #load s0 - s11, fp, ra
- ld.d $s0, $sp, 64
- ld.d $s1, $sp, 72
- ld.d $s2, $sp, 80
- ld.d $s3, $sp, 88
- ld.d $s4, $sp, 96
- ld.d $s5, $sp, 104
- ld.d $s6, $sp, 112
- ld.d $s7, $sp, 120
- ld.d $s8, $sp, 128
- ld.d $fp, $sp, 136
- ld.d $ra, $sp, 144
-
- # return transfer_t from jump
- # pass transfer_t as first arg in context function
- # a0 == FCTX, a1 == DATA
- move $a0, $a3
-
- # adjust stack
- addi.d $sp, $sp, 160
-
- # jump to context
- jr $a2
-.size ontop_fcontext, .-ontop_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_mips32_o32_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_mips32_o32_elf_gas.S
deleted file mode 100644
index c69203c655..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_mips32_o32_elf_gas.S
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | F20 | F22 | F24 | F26 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | F28 | F30 | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | FP |hiddn| RA | PC | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | ABI ARGS | GP | FCTX| DATA| | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "ontop_mips32_o32_elf_gas.S"
-.text
-.globl ontop_fcontext
-.align 2
-.type ontop_fcontext,@function
-.ent ontop_fcontext
-ontop_fcontext:
- # reserve space on stack
- addiu $sp, $sp, -96
-
- sw $s0, 48($sp) # save S0
- sw $s1, 52($sp) # save S1
- sw $s2, 56($sp) # save S2
- sw $s3, 60($sp) # save S3
- sw $s4, 64($sp) # save S4
- sw $s5, 68($sp) # save S5
- sw $s6, 72($sp) # save S6
- sw $s7, 76($sp) # save S7
- sw $fp, 80($sp) # save FP
- sw $a0, 84($sp) # save hidden, address of returned transfer_t
- sw $ra, 88($sp) # save RA
- sw $ra, 92($sp) # save RA as PC
-
-#if defined(__mips_hard_float)
- s.d $f20, ($sp) # save F20
- s.d $f22, 8($sp) # save F22
- s.d $f24, 16($sp) # save F24
- s.d $f26, 24($sp) # save F26
- s.d $f28, 32($sp) # save F28
- s.d $f30, 40($sp) # save F30
-#endif
-
- # store SP (pointing to context-data) in A0
- move $a0, $sp
-
- # restore SP (pointing to context-data) from A1
- move $sp, $a1
-
-#if defined(__mips_hard_float)
- l.d $f20, ($sp) # restore F20
- l.d $f22, 8($sp) # restore F22
- l.d $f24, 16($sp) # restore F24
- l.d $f26, 24($sp) # restore F26
- l.d $f28, 32($sp) # restore F28
- l.d $f30, 40($sp) # restore F30
-#endif
-
- lw $s0, 48($sp) # restore S0
- lw $s1, 52($sp) # restore S1
- lw $s2, 56($sp) # restore S2
- lw $s3, 60($sp) # restore S3
- lw $s4, 64($sp) # restore S4
- lw $s5, 68($sp) # restore S5
- lw $s6, 72($sp) # restore S6
- lw $s7, 76($sp) # restore S7
- lw $fp, 80($sp) # restore FP
- lw $v0, 84($sp) # restore hidden, address of returned transfer_t
- lw $ra, 88($sp) # restore RA
-
- # load PC
- move $t9, $a3
-
- # adjust stack
- addiu $sp, $sp, 96
-
- # return transfer_t from jump
- sw $a0, ($v0) # fctx of transfer_t
- sw $a2, 4($v0) # data of transfer_t
- # pass transfer_t as first arg in context function
- # A0 == hidden, A1 == fctx, A2 == data
- move $a1, $a0
- move $a0, $v0
-
- # jump to context
- jr $t9
-.end ontop_fcontext
-.size ontop_fcontext, .-ontop_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_mips64_n64_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_mips64_n64_elf_gas.S
deleted file mode 100644
index 68087b0521..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_mips64_n64_elf_gas.S
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- Copyright Jiaxun Yang 2018.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | F24 | F25 | F26 | F27 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | F28 | F29 | F30 | F31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | S0 | S1 | S2 | S3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | S4 | S5 | S6 | S7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | FP | GP | RA | PC | *
- * ------------------------------------------------- *
- * *
- * *****************************************************/
-
-.file "ontop_mips64_n64_elf_gas.S"
-.text
-.globl ontop_fcontext
-.align 3
-.type ontop_fcontext,@function
-.ent ontop_fcontext
-ontop_fcontext:
- # reserve space on stack
- daddiu $sp, $sp, -160
-
- sd $s0, 64($sp) # save S0
- sd $s1, 72($sp) # save S1
- sd $s2, 80($sp) # save S2
- sd $s3, 88($sp) # save S3
- sd $s4, 96($sp) # save S4
- sd $s5, 104($sp) # save S5
- sd $s6, 112($sp) # save S6
- sd $s7, 120($sp) # save S7
- sd $fp, 128($sp) # save FP
- sd $ra, 144($sp) # save RA
- sd $ra, 152($sp) # save RA as PC
-
-#if defined(__mips_hard_float)
- s.d $f24, 0($sp) # save F24
- s.d $f25, 8($sp) # save F25
- s.d $f26, 16($sp) # save F26
- s.d $f27, 24($sp) # save F27
- s.d $f28, 32($sp) # save F28
- s.d $f29, 40($sp) # save F29
- s.d $f30, 48($sp) # save F30
- s.d $f31, 56($sp) # save F31
-#endif
-
- # store SP (pointing to context-data) in t0
- move $t0, $sp
-
- # restore SP (pointing to context-data) from a0
- move $sp, $a0
-
-#if defined(__mips_hard_float)
- l.d $f24, 0($sp) # restore F24
- l.d $f25, 8($sp) # restore F25
- l.d $f26, 16($sp) # restore F26
- l.d $f27, 24($sp) # restore F27
- l.d $f28, 32($sp) # restore F28
- l.d $f29, 40($sp) # restore F29
- l.d $f30, 48($sp) # restore F30
- l.d $f31, 56($sp) # restore F31
-#endif
-
- ld $s0, 64($sp) # restore S0
- ld $s1, 72($sp) # restore S1
- ld $s2, 80($sp) # restore S2
- ld $s3, 88($sp) # restore S3
- ld $s4, 96($sp) # restore S4
- ld $s5, 104($sp) # restore S5
- ld $s6, 112($sp) # restore S6
- ld $s7, 120($sp) # restore S7
- ld $fp, 128($sp) # restore FP
- ld $ra, 144($sp) # restore RA
-
- # load PC
- move $t9, $a2
-
- # adjust stack
- daddiu $sp, $sp, 160
-
- move $a0, $t0 # move param from t0 to a0 as param
-
- # jump to context
- jr $t9
-.end ontop_fcontext
-.size ontop_fcontext, .-ontop_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_ppc32_ppc64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_ppc32_ppc64_sysv_macho_gas.S
deleted file mode 100644
index 4632f4cc9e..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_ppc32_ppc64_sysv_macho_gas.S
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- Copyright Sergue E. Leontiev 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-// Stub file for universal binary
-
-#if defined(__ppc__)
- #include "ontop_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
- #include "ontop_ppc64_sysv_macho_gas.S"
-#else
- #error "No arch's"
-#endif
diff --git a/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_elf_gas.S
deleted file mode 100644
index 464d99d59d..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_elf_gas.S
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * |bchai|hiddn| fpscr | PC | CR | R14 | R15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------|------------ *
- * | 224 | 228 | 232 | 236 | 240 | 244 | *
- * ------------------------|------------ *
- * | F30 | F31 |bchai| LR | *
- * ------------------------|------------ *
- * *
- *******************************************************/
-
-.file "ontop_ppc32_sysv_elf_gas.S"
-.text
-.globl ontop_fcontext
-.align 2
-.type ontop_fcontext,@function
-ontop_fcontext:
- # Linux: ontop_fcontext( hidden transfer_t * R3, R4, R5, R6)
- # Other: transfer_t R3:R4 = jump_fcontext( R3, R4, R5)
-
- mflr %r0 # return address from LR
- mffs %f0 # FPSCR
- mfcr %r8 # condition register
-
- stwu %r1, -240(%r1) # allocate stack space, R1 % 16 == 0
- stw %r0, 244(%r1) # save LR in caller's frame
-
-#ifdef __linux__
- stw %r3, 4(%r1) # hidden pointer
-#endif
-
- stfd %f0, 8(%r1) # FPSCR
- stw %r0, 16(%r1) # LR as PC
- stw %r8, 20(%r1) # CR
-
- # Save registers R14 to R31.
- # Don't change R2, the thread-local storage pointer.
- # Don't change R13, the small data pointer.
- stw %r14, 24(%r1)
- stw %r15, 28(%r1)
- stw %r16, 32(%r1)
- stw %r17, 36(%r1)
- stw %r18, 40(%r1)
- stw %r19, 44(%r1)
- stw %r20, 48(%r1)
- stw %r21, 52(%r1)
- stw %r22, 56(%r1)
- stw %r23, 60(%r1)
- stw %r24, 64(%r1)
- stw %r25, 68(%r1)
- stw %r26, 72(%r1)
- stw %r27, 76(%r1)
- stw %r28, 80(%r1)
- stw %r29, 84(%r1)
- stw %r30, 88(%r1)
- stw %r31, 92(%r1)
-
- # Save registers F14 to F31 in slots with 8-byte alignment.
- # 4-byte alignment may stall the pipeline of some processors.
- # Less than 4 may cause alignment traps.
- stfd %f14, 96(%r1)
- stfd %f15, 104(%r1)
- stfd %f16, 112(%r1)
- stfd %f17, 120(%r1)
- stfd %f18, 128(%r1)
- stfd %f19, 136(%r1)
- stfd %f20, 144(%r1)
- stfd %f21, 152(%r1)
- stfd %f22, 160(%r1)
- stfd %f23, 168(%r1)
- stfd %f24, 176(%r1)
- stfd %f25, 184(%r1)
- stfd %f26, 192(%r1)
- stfd %f27, 200(%r1)
- stfd %f28, 208(%r1)
- stfd %f29, 216(%r1)
- stfd %f30, 224(%r1)
- stfd %f31, 232(%r1)
-
- # store RSP (pointing to context-data) in R7/R6
- # restore RSP (pointing to context-data) from R4/R3
-#ifdef __linux__
- mr %r7, %r1
- mr %r1, %r4
- lwz %r3, 4(%r1) # hidden pointer
-#else
- mr %r6, %r1
- mr %r1, %r3
-#endif
-
- # ignore PC at 16(%r1)
- lfd %f0, 8(%r1) # FPSCR
- lwz %r8, 20(%r1) # CR
-
- mtfsf 0xff, %f0 # restore FPSCR
- mtcr %r8 # restore CR
-
- # restore R14 to R31
- lwz %r14, 24(%r1)
- lwz %r15, 28(%r1)
- lwz %r16, 32(%r1)
- lwz %r17, 36(%r1)
- lwz %r18, 40(%r1)
- lwz %r19, 44(%r1)
- lwz %r20, 48(%r1)
- lwz %r21, 52(%r1)
- lwz %r22, 56(%r1)
- lwz %r23, 60(%r1)
- lwz %r24, 64(%r1)
- lwz %r25, 68(%r1)
- lwz %r26, 72(%r1)
- lwz %r27, 76(%r1)
- lwz %r28, 80(%r1)
- lwz %r29, 84(%r1)
- lwz %r30, 88(%r1)
- lwz %r31, 92(%r1)
-
- # restore F14 to F31
- lfd %f14, 96(%r1)
- lfd %f15, 104(%r1)
- lfd %f16, 112(%r1)
- lfd %f17, 120(%r1)
- lfd %f18, 128(%r1)
- lfd %f19, 136(%r1)
- lfd %f20, 144(%r1)
- lfd %f21, 152(%r1)
- lfd %f22, 160(%r1)
- lfd %f23, 168(%r1)
- lfd %f24, 176(%r1)
- lfd %f25, 184(%r1)
- lfd %f26, 192(%r1)
- lfd %f27, 200(%r1)
- lfd %f28, 208(%r1)
- lfd %f29, 216(%r1)
- lfd %f30, 224(%r1)
- lfd %f31, 232(%r1)
-
- # restore LR from caller's frame
- lwz %r0, 244(%r1)
- mtlr %r0
-
- # adjust stack
- addi %r1, %r1, 240
-
- # see tail_ppc32_sysv_elf_gas.cpp
- # Linux: fcontext_ontop_tail( hidden transfer_t * R3, R4, R5, R6, R7)
- # Other: transfer_t R3:R4 = fcontext_ontop_tail( R3, R4, R5, R6)
- b ontop_fcontext_tail
-.size ontop_fcontext, .-ontop_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_macho_gas.S
deleted file mode 100644
index a74617172c..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_macho_gas.S
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F30 | F31 | fpscr | R13 | R14 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | R31 |hiddn| CR | LR | PC |bchai|linkr| FCTX| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | | *
- * ------------------------------------------------- *
- * | 256 | | *
- * ------------------------------------------------- *
- * | DATA| | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.text
-.globl _ontop_fcontext
-.align 2
-_ontop_fcontext:
- ; reserve space on stack
- subi r1, r1, 244
-
- stfd f14, 0(r1) ; save F14
- stfd f15, 8(r1) ; save F15
- stfd f16, 16(r1) ; save F16
- stfd f17, 24(r1) ; save F17
- stfd f18, 32(r1) ; save F18
- stfd f19, 40(r1) ; save F19
- stfd f20, 48(r1) ; save F20
- stfd f21, 56(r1) ; save F21
- stfd f22, 64(r1) ; save F22
- stfd f23, 72(r1) ; save F23
- stfd f24, 80(r1) ; save F24
- stfd f25, 88(r1) ; save F25
- stfd f26, 96(r1) ; save F26
- stfd f27, 104(r1) ; save F27
- stfd f28, 112(r1) ; save F28
- stfd f29, 120(r1) ; save F29
- stfd f30, 128(r1) ; save F30
- stfd f31, 136(r1) ; save F31
- mffs f0 ; load FPSCR
- stfd f0, 144(r1) ; save FPSCR
-
- stw r13, 152(r1) ; save R13
- stw r14, 156(r1) ; save R14
- stw r15, 160(r1) ; save R15
- stw r16, 164(r1) ; save R16
- stw r17, 168(r1) ; save R17
- stw r18, 172(r1) ; save R18
- stw r19, 176(r1) ; save R19
- stw r20, 180(r1) ; save R20
- stw r21, 184(r1) ; save R21
- stw r22, 188(r1) ; save R22
- stw r23, 192(r1) ; save R23
- stw r24, 196(r1) ; save R24
- stw r25, 200(r1) ; save R25
- stw r26, 204(r1) ; save R26
- stw r27, 208(r1) ; save R27
- stw r28, 212(r1) ; save R28
- stw r29, 216(r1) ; save R29
- stw r30, 220(r1) ; save R30
- stw r31, 224(r1) ; save R31
- stw r3, 228(r1) ; save hidden
-
- ; save CR
- mfcr r0
- stw r0, 232(r1)
- ; save LR
- mflr r0
- stw r0, 236(r1)
- ; save LR as PC
- stw r0, 240(r1)
-
- ; store RSP (pointing to context-data) in R7
- mr r7, r1
-
- ; restore RSP (pointing to context-data) from R4
- mr r1, r4
-
- lfd f14, 0(r1) ; restore F14
- lfd f15, 8(r1) ; restore F15
- lfd f16, 16(r1) ; restore F16
- lfd f17, 24(r1) ; restore F17
- lfd f18, 32(r1) ; restore F18
- lfd f19, 40(r1) ; restore F19
- lfd f20, 48(r1) ; restore F20
- lfd f21, 56(r1) ; restore F21
- lfd f22, 64(r1) ; restore F22
- lfd f23, 72(r1) ; restore F23
- lfd f24, 80(r1) ; restore F24
- lfd f25, 88(r1) ; restore F25
- lfd f26, 96(r1) ; restore F26
- lfd f27, 104(r1) ; restore F27
- lfd f28, 112(r1) ; restore F28
- lfd f29, 120(r1) ; restore F29
- lfd f30, 128(r1) ; restore F30
- lfd f31, 136(r1) ; restore F31
- lfd f0, 144(r1) ; load FPSCR
- mtfsf 0xff, f0 ; restore FPSCR
-
- lwz r13, 152(r1) ; restore R13
- lwz r14, 156(r1) ; restore R14
- lwz r15, 160(r1) ; restore R15
- lwz r16, 164(r1) ; restore R16
- lwz r17, 168(r1) ; restore R17
- lwz r18, 172(r1) ; restore R18
- lwz r19, 176(r1) ; restore R19
- lwz r20, 180(r1) ; restore R20
- lwz r21, 184(r1) ; restore R21
- lwz r22, 188(r1) ; restore R22
- lwz r23, 192(r1) ; restore R23
- lwz r24, 196(r1) ; restore R24
- lwz r25, 200(r1) ; restore R25
- lwz r26, 204(r1) ; restore R26
- lwz r27, 208(r1) ; restore R27
- lwz r28, 212(r1) ; restore R28
- lwz r29, 216(r1) ; restore R29
- lwz r30, 220(r1) ; restore R30
- lwz r31, 224(r1) ; restore R31
- lwz r3, 228(r1) ; restore hidden
-
- ; restore CR
- lwz r0, 232(r1)
- mtcr r0
- ; restore LR
- lwz r0, 236(r1)
- mtlr r0
- ; ignore PC
-
- ; adjust stack
- addi r1, r1, 244
-
- ; Need to pass ontop_fcontext_tail(
- ; hidden R3,
- ; R4 = ignore,
- ; R5 = data,
- ; R6 = ontop-function,
- ; R7 = fcontext_t
- ; )
- ; All of these registers are correctly set at this point
- b _ontop_fcontext_tail
diff --git a/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_xcoff_gas.S b/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_xcoff_gas.S
deleted file mode 100644
index 9dfb492f7e..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_ppc32_sysv_xcoff_gas.S
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * |bchai| CR | LR |compl| link| TOC | R14 | R15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R16 | R17 | R18 | R19 | R20 | R21 | R22 | R23 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | F14 | F15 | F16 | F17 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | F18 | F19 | F20 | F21 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | F22 | F23 | F24 | F25 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | F26 | F27 | F28 | F29 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | F30 | F31 | PC |hiddn| fpscr | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 256 | 260 | 264 | 268 | 272 | 276 | 280 | 284 | *
- * ------------------------------------------------- *
- * |bchai|savLR|savLR|compl| link|svTOC| FCTX| DATA| *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
- .file "ontop_ppc32_sysv_xcoff_xas.S"
- .toc
- .csect .text[PR]
- .align 2
- .globl ontop_fcontext[DS]
- .globl .ontop_fcontext
- .csect ontop_fcontext[DS]
-ontop_fcontext:
- .long .ontop_fcontext[PR], TOC[tc0], 0
- .csect .text[PR], 5
-.ontop_fcontext:
- # reserve space on stack
- subi 1, 1, 256
-
- # save CR
- mfcr 0
- stw 0, 4(1)
- # save LR
- mflr 0
- stw 0, 8(1)
- # save LR as PC
- stw 0, 240(1)
- # save TOC
- stw 2, 20(1)
-
- # Save registers R14 to R31.
- stw 14, 24(1)
- stw 15, 28(1)
- stw 16, 32(1)
- stw 17, 36(1)
- stw 18, 40(1)
- stw 19, 44(1)
- stw 20, 48(1)
- stw 21, 52(1)
- stw 22, 56(1)
- stw 23, 60(1)
- stw 24, 64(1)
- stw 25, 68(1)
- stw 26, 72(1)
- stw 27, 76(1)
- stw 28, 80(1)
- stw 29, 84(1)
- stw 30, 88(1)
- stw 31, 92(1)
-
- # Save registers F14 to F31 in slots with 8-byte alignment.
- # 4-byte alignment may stall the pipeline of some processors.
- # Less than 4 may cause alignment traps.
- stfd 14, 96(1)
- stfd 15, 104(1)
- stfd 16, 112(1)
- stfd 17, 120(1)
- stfd 18, 128(1)
- stfd 19, 136(1)
- stfd 20, 144(1)
- stfd 21, 152(1)
- stfd 22, 160(1)
- stfd 23, 168(1)
- stfd 24, 176(1)
- stfd 25, 184(1)
- stfd 26, 192(1)
- stfd 27, 200(1)
- stfd 28, 208(1)
- stfd 29, 216(1)
- stfd 30, 224(1)
- stfd 31, 232(1)
-
- # hidden pointer
- stw 3, 244(1)
-
- mffs 0 # load FPSCR
- stfd 0, 248(1) # save FPSCR
-
- # store RSP (pointing to context-data) in R7
- mr 7, 1
-
- # restore RSP (pointing to context-data) from R4
- mr 1, 4
-
- # restore CR
- lwz 0, 4(1)
- mtcr 0
-
- # restore R14 to R31
- lwz 14, 24(1)
- lwz 15, 28(1)
- lwz 16, 32(1)
- lwz 17, 36(1)
- lwz 18, 40(1)
- lwz 19, 44(1)
- lwz 20, 48(1)
- lwz 21, 52(1)
- lwz 22, 56(1)
- lwz 23, 60(1)
- lwz 24, 64(1)
- lwz 25, 68(1)
- lwz 26, 72(1)
- lwz 27, 76(1)
- lwz 28, 80(1)
- lwz 29, 84(1)
- lwz 30, 88(1)
- lwz 31, 92(1)
-
- # restore F14 to F31
- lfd 14, 96(1)
- lfd 15, 104(1)
- lfd 16, 112(1)
- lfd 17, 120(1)
- lfd 18, 128(1)
- lfd 19, 136(1)
- lfd 20, 144(1)
- lfd 21, 152(1)
- lfd 22, 160(1)
- lfd 23, 168(1)
- lfd 24, 176(1)
- lfd 25, 184(1)
- lfd 26, 192(1)
- lfd 27, 200(1)
- lfd 28, 208(1)
- lfd 29, 216(1)
- lfd 30, 224(1)
- lfd 31, 232(1)
-
- lwz 3, 244(1) # restore hidden
-
- lfd 0, 248(1) # load FPSCR
- mtfsf 0xff, 0 # restore FPSCR
-
- # copy transfer_t into ontop_fn arg registers
- mr 4, 7
- # arg pointer already in r5
- # hidden arg already in r3
-
- # restore CTR
- lwz 7, 0(6)
- mtctr 7
- # restore TOC
- lwz 2, 4(6)
-
- # zero in r3 indicates first jump to context-function
- cmpdi 3, 0
- beq use_entry_arg
-
-return_to_ctx:
- # restore LR
- lwz 0, 8(1)
- mtlr 0
-
- # adjust stack
- addi 1, 1, 256
-
- # jump to context
- bctr
-
-use_entry_arg:
- # compute return-value struct address
- # (passed has hidden arg to ontop_fn)
- addi 3, 1, 8
-
- # jump to context and update LR
- bctrl
-
- # restore CTR
- lwz 7, 4(1)
- mtctr 7
- # restore TOC
- lwz 2, 20(1)
-
- # copy returned transfer_t into entry_fn arg registers
- lwz 3, 8(1)
- lwz 4, 12(1)
-
- b return_to_ctx
diff --git a/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_elf_gas.S
deleted file mode 100644
index cd97f45671..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_elf_gas.S
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | TOC | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | TOC saved | FCTX | DATA | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.file "ontop_ppc64_sysv_elf_gas.S"
-.globl ontop_fcontext
-#if _CALL_ELF == 2
- .text
- .align 2
-ontop_fcontext:
- addis %r2, %r12, .TOC.-ontop_fcontext@ha
- addi %r2, %r2, .TOC.-ontop_fcontext@l
- .localentry ontop_fcontext, . - ontop_fcontext
-#else
- .section ".opd","aw"
- .align 3
-ontop_fcontext:
-# ifdef _CALL_LINUX
- .quad .L.ontop_fcontext,.TOC.@tocbase,0
- .type ontop_fcontext,@function
- .text
- .align 2
-.L.ontop_fcontext:
-# else
- .hidden .ontop_fcontext
- .globl .ontop_fcontext
- .quad .ontop_fcontext,.TOC.@tocbase,0
- .size ontop_fcontext,24
- .type .ontop_fcontext,@function
- .text
- .align 2
-.ontop_fcontext:
-# endif
-#endif
- # reserve space on stack
- subi %r1, %r1, 184
-
-#if _CALL_ELF != 2
- std %r2, 0(%r1) # save TOC
-#endif
- std %r14, 8(%r1) # save R14
- std %r15, 16(%r1) # save R15
- std %r16, 24(%r1) # save R16
- std %r17, 32(%r1) # save R17
- std %r18, 40(%r1) # save R18
- std %r19, 48(%r1) # save R19
- std %r20, 56(%r1) # save R20
- std %r21, 64(%r1) # save R21
- std %r22, 72(%r1) # save R22
- std %r23, 80(%r1) # save R23
- std %r24, 88(%r1) # save R24
- std %r25, 96(%r1) # save R25
- std %r26, 104(%r1) # save R26
- std %r27, 112(%r1) # save R27
- std %r28, 120(%r1) # save R28
- std %r29, 128(%r1) # save R29
- std %r30, 136(%r1) # save R30
- std %r31, 144(%r1) # save R31
-#if _CALL_ELF != 2
- std %r3, 152(%r1) # save hidden
-#endif
-
- # save CR
- mfcr %r0
- std %r0, 160(%r1)
- # save LR
- mflr %r0
- std %r0, 168(%r1)
- # save LR as PC
- std %r0, 176(%r1)
-
- # store RSP (pointing to context-data) in R7
- mr %r7, %r1
-
-#if _CALL_ELF == 2
- # restore RSP (pointing to context-data) from R3
- mr %r1, %r3
-#else
- # restore RSP (pointing to context-data) from R4
- mr %r1, %r4
-#endif
-
- ld %r14, 8(%r1) # restore R14
- ld %r15, 16(%r1) # restore R15
- ld %r16, 24(%r1) # restore R16
- ld %r17, 32(%r1) # restore R17
- ld %r18, 40(%r1) # restore R18
- ld %r19, 48(%r1) # restore R19
- ld %r20, 56(%r1) # restore R20
- ld %r21, 64(%r1) # restore R21
- ld %r22, 72(%r1) # restore R22
- ld %r23, 80(%r1) # restore R23
- ld %r24, 88(%r1) # restore R24
- ld %r25, 96(%r1) # restore R25
- ld %r26, 104(%r1) # restore R26
- ld %r27, 112(%r1) # restore R27
- ld %r28, 120(%r1) # restore R28
- ld %r29, 128(%r1) # restore R29
- ld %r30, 136(%r1) # restore R30
- ld %r31, 144(%r1) # restore R31
-#if _CALL_ELF != 2
- ld %r3, 152(%r1) # restore hidden
-#endif
-
- # restore CR
- ld %r0, 160(%r1)
- mtcr %r0
-
-#if _CALL_ELF == 2
- # restore CTR
- mtctr %r5
-
- # store cb entrypoint in %r12, used for TOC calculation
- mr %r12, %r5
-
- # copy transfer_t into ontop_fn arg registers
- mr %r3, %r7
- # arg pointer already in %r4
-#else
- # copy transfer_t into ontop_fn arg registers
- mr %r4, %r7
- # arg pointer already in %r5
- # hidden arg already in %r3
-
- # restore CTR
- ld %r7, 0(%r6)
- mtctr %r7
- # restore TOC
- ld %r2, 8(%r6)
-
- # zero in r3 indicates first jump to context-function
- cmpdi %r3, 0
- beq use_entry_arg
-#endif
-
-return_to_ctx:
- # restore LR
- ld %r0, 168(%r1)
- mtlr %r0
-
- # adjust stack
- addi %r1, %r1, 184
-
- # jump to context
- bctr
-
-#if _CALL_ELF == 2
- .size ontop_fcontext, .-ontop_fcontext
-#else
-use_entry_arg:
- # compute return-value struct address
- # (passed has hidden arg to ontop_fn)
- addi %r3, %r1, 8
-
- # jump to context and update LR
- bctrl
-
- # restore CTR
- ld %r7, 176(%r1)
- mtctr %r7
-#if _CALL_ELF != 2
- # restore TOC
- ld %r2, 0(%r1)
-#endif
-
- # copy returned transfer_t into entry_fn arg registers
- ld %r3, 8(%r1)
- ld %r4, 16(%r1)
-
- b return_to_ctx
-# ifdef _CALL_LINUX
- .size .ontop_fcontext, .-.L.ontop_fcontext
-# else
- .size .ontop_fcontext, .-.ontop_fcontext
-# endif
-#endif
-
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_macho_gas.S
deleted file mode 100644
index a9fe8cf5b8..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_macho_gas.S
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | R13 | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | FCTX | DATA | | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.text
-.align 2
-.globl _ontop_fcontext
-
-_ontop_fcontext:
- ; reserve space on stack
- subi r1, r1, 184
-
- std r14, 8(r1) ; save R14
- std r15, 16(r1) ; save R15
- std r16, 24(r1) ; save R16
- std r17, 32(r1) ; save R17
- std r18, 40(r1) ; save R18
- std r19, 48(r1) ; save R19
- std r20, 56(r1) ; save R20
- std r21, 64(r1) ; save R21
- std r22, 72(r1) ; save R22
- std r23, 80(r1) ; save R23
- std r24, 88(r1) ; save R24
- std r25, 96(r1) ; save R25
- std r26, 104(r1) ; save R26
- std r27, 112(r1) ; save R27
- std r28, 120(r1) ; save R28
- std r29, 128(r1) ; save R29
- std r30, 136(r1) ; save R30
- std r31, 144(r1) ; save R31
- std r3, 152(r1) ; save hidden
-
- ; save CR
- mfcr r0
- std r0, 160(r1)
- ; save LR
- mflr r0
- std r0, 168(r1)
- ; save LR as PC
- std r0, 176(r1)
-
- ; store RSP (pointing to context-data) in R7
- mr r7, r1
-
- ; restore RSP (pointing to context-data) from R4
- mr r1, r4
-
- ld r14, 8(r1) ; restore R14
- ld r15, 16(r1) ; restore R15
- ld r16, 24(r1) ; restore R16
- ld r17, 32(r1) ; restore R17
- ld r18, 40(r1) ; restore R18
- ld r19, 48(r1) ; restore R19
- ld r20, 56(r1) ; restore R20
- ld r21, 64(r1) ; restore R21
- ld r22, 72(r1) ; restore R22
- ld r23, 80(r1) ; restore R23
- ld r24, 88(r1) ; restore R24
- ld r25, 96(r1) ; restore R25
- ld r26, 104(r1) ; restore R26
- ld r27, 112(r1) ; restore R27
- ld r28, 120(r1) ; restore R28
- ld r29, 128(r1) ; restore R29
- ld r30, 136(r1) ; restore R30
- ld r31, 144(r1) ; restore R31
- ld r4, 152(r1) ; restore hidden
-
- ; restore CR
- ld r0, 160(r1)
- mtcr r0
- ; restore LR
- ld r0, 168(r1)
- mtlr r0
- ; ignore PC
-
- ; adjust stack
- addi r1, r1, 184
-
- ; return transfer_t
- std r7, 0(r4)
- std r5, 8(r4)
-
- ; restore CTR
- mtctr r6
-
- ; jump to context
- bctr
diff --git a/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_xcoff_gas.S b/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_xcoff_gas.S
deleted file mode 100644
index 546b1b2da8..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_ppc64_sysv_xcoff_gas.S
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
- * ------------------------------------------------- *
- * | TOC | R14 | R15 | R16 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 36 | 40 | 44 | 48 | 52 | 56 | 60 | *
- * ------------------------------------------------- *
- * | R17 | R18 | R19 | R20 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 68 | 72 | 76 | 80 | 84 | 88 | 92 | *
- * ------------------------------------------------- *
- * | R21 | R22 | R23 | R24 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 | *
- * ------------------------------------------------- *
- * | R25 | R26 | R27 | R28 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 | *
- * ------------------------------------------------- *
- * | R29 | R30 | R31 | hidden | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 | *
- * ------------------------------------------------- *
- * | CR | LR | PC | back-chain| *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | *
- * ------------------------------------------------- *
- * | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 | *
- * ------------------------------------------------- *
- * | cr saved | lr saved | compiler | linker | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | *
- * ------------------------------------------------- *
- * | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
- * ------------------------------------------------- *
- * | TOC saved | FCTX | DATA | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
- .file "ontop_ppc64_sysv_xcoff_gas.S"
- .toc
- .csect .text[PR], 5
- .align 2
- .globl ontop_fcontext[DS]
- .globl .ontop_fcontext
- .csect ontop_fcontext[DS], 3
-ontop_fcontext:
- .llong .ontop_fcontext[PR], TOC[tc0], 0
- .csect .text[PR], 5
-.ontop_fcontext:
- # reserve space on stack
- subi 1, 1, 184
-
- std 2, 0(1) # save TOC
- std 14, 8(1) # save R14
- std 15, 16(1) # save R15
- std 16, 24(1) # save R16
- std 17, 32(1) # save R17
- std 18, 40(1) # save R18
- std 19, 48(1) # save R19
- std 20, 56(1) # save R20
- std 21, 64(1) # save R21
- std 22, 72(1) # save R22
- std 23, 80(1) # save R23
- std 24, 88(1) # save R24
- std 25, 96(1) # save R25
- std 26, 104(1) # save R26
- std 27, 112(1) # save R27
- std 28, 120(1) # save R28
- std 29, 128(1) # save R29
- std 30, 136(1) # save R30
- std 31, 144(1) # save R31
- std 3, 152(1) # save hidden
-
- # save CR
- mfcr 0
- std 0, 160(1)
- # save LR
- mflr 0
- std 0, 168(1)
- # save LR as PC
- std 0, 176(1)
-
- # store RSP (pointing to context-data) in R7
- mr 7, 1
-
- # restore RSP (pointing to context-data) from R4
- mr 1, 4
-
- ld 14, 8(1) # restore R14
- ld 15, 16(1) # restore R15
- ld 16, 24(1) # restore R16
- ld 17, 32(1) # restore R17
- ld 18, 40(1) # restore R18
- ld 19, 48(1) # restore R19
- ld 20, 56(1) # restore R20
- ld 21, 64(1) # restore R21
- ld 22, 72(1) # restore R22
- ld 23, 80(1) # restore R23
- ld 24, 88(1) # restore R24
- ld 25, 96(1) # restore R25
- ld 26, 104(1) # restore R26
- ld 27, 112(1) # restore R27
- ld 28, 120(1) # restore R28
- ld 29, 128(1) # restore R29
- ld 30, 136(1) # restore R30
- ld 31, 144(1) # restore R31
- ld 3, 152(1) # restore hidden
-
- # restore CR
- ld 0, 160(1)
- mtcr 0
-
- # copy transfer_t into ontop_fn arg registers
- mr 4, 7
- # arg pointer already in r5
- # hidden arg already in r3
-
- # restore CTR
- ld 7, 0(6)
- mtctr 7
- # restore TOC
- ld 2, 8(6)
-
- # zero in r3 indicates first jump to context-function
- cmpdi 3, 0
- beq use_entry_arg
-
-return_to_ctx:
- # restore LR
- ld 0, 168(1)
- mtlr 0
-
- # adjust stack
- addi 1, 1, 184
-
- # jump to context
- bctr
-
-use_entry_arg:
- # compute return-value struct address
- # (passed has hidden arg to ontop_fn)
- addi 3, 1, 8
-
- # jump to context and update LR
- bctrl
-
- # restore CTR
- ld 7, 176(1)
- mtctr 7
- # restore TOC
- ld 2, 0(1)
-
- # copy returned transfer_t into entry_fn arg registers
- ld 3, 8(1)
- ld 4, 16(1)
-
- b return_to_ctx
diff --git a/contrib/restricted/boost/context/src/asm/ontop_riscv64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_riscv64_sysv_elf_gas.S
deleted file mode 100644
index 61ab46bcc6..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_riscv64_sysv_elf_gas.S
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-/*******************************************************
- * *
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
- * ------------------------------------------------- *
- * | fs0 | fs1 | fs2 | fs3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
- * ------------------------------------------------- *
- * | fs4 | fs5 | fs6 | fs7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
- * ------------------------------------------------- *
- * | fs8 | fs9 | fs10 | fs11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
- * ------------------------------------------------- *
- * | s0 | s1 | s2 | s3 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
- * ------------------------------------------------- *
- * | s4 | s5 | s6 | s7 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
- * ------------------------------------------------- *
- * | s8 | s9 | s10 | s11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 48 | 49 | 50 | 51 | | | | | *
- * ------------------------------------------------- *
- * | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
- * ------------------------------------------------- *
- * | ra | pc | | | *
- * ------------------------------------------------- *
- * *
- *******************************************************/
-
-.file "ontop_riscv64_sysv_elf_gas.S"
-.text
-.align 1
-.global ontop_fcontext
-.type ontop_fcontext, %function
-ontop_fcontext:
- # prepare stack for GP + FPU
- addi sp, sp, -0xd0
-
- # save fs0 - fs11
- fsd fs0, 0x00(sp)
- fsd fs1, 0x08(sp)
- fsd fs2, 0x10(sp)
- fsd fs3, 0x18(sp)
- fsd fs4, 0x20(sp)
- fsd fs5, 0x28(sp)
- fsd fs6, 0x30(sp)
- fsd fs7, 0x38(sp)
- fsd fs8, 0x40(sp)
- fsd fs9, 0x48(sp)
- fsd fs10, 0x50(sp)
- fsd fs11, 0x58(sp)
-
- # save s0-s11, ra
- sd s0, 0x60(sp)
- sd s1, 0x68(sp)
- sd s2, 0x70(sp)
- sd s3, 0x78(sp)
- sd s4, 0x80(sp)
- sd s5, 0x88(sp)
- sd s6, 0x90(sp)
- sd s7, 0x98(sp)
- sd s8, 0xa0(sp)
- sd s9, 0xa8(sp)
- sd s10, 0xb0(sp)
- sd s11, 0xb8(sp)
- sd ra, 0xc0(sp)
-
- # save RA as PC
- sd ra, 0xc8(sp)
-
- # store SP (pointing to context-data) in A3
- mv a3, sp
-
- # restore SP (pointing to context-data) from A0
- mv sp, a0
-
- # load fs0 - fs11
- fld fs0, 0x00(sp)
- fld fs1, 0x08(sp)
- fld fs2, 0x10(sp)
- fld fs3, 0x18(sp)
- fld fs4, 0x20(sp)
- fld fs5, 0x28(sp)
- fld fs6, 0x30(sp)
- fld fs7, 0x38(sp)
- fld fs8, 0x40(sp)
- fld fs9, 0x48(sp)
- fld fs10, 0x50(sp)
- fld fs11, 0x58(sp)
-
- # load s0-s11,ra
- ld s0, 0x60(sp)
- ld s1, 0x68(sp)
- ld s2, 0x70(sp)
- ld s3, 0x78(sp)
- ld s4, 0x80(sp)
- ld s5, 0x88(sp)
- ld s6, 0x90(sp)
- ld s7, 0x98(sp)
- ld s8, 0xa0(sp)
- ld s9, 0xa8(sp)
- ld s10, 0xb0(sp)
- ld s11, 0xb8(sp)
- ld ra, 0xc0(sp)
-
- # return transfer_t from jump
- # pass transfer_t as first arg in context function
- # a0 == FCTX, a1 == DATA
- mv a0, a3
-
- # skip pc
- # restore stack from GP + FPU
- addi sp, sp, 0xd0
-
- # jump to ontop-function
- jr a2
-.size ontop_fcontext,.-ontop_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_s390x_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_s390x_sysv_elf_gas.S
deleted file mode 100644
index 6a464aa3bf..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_s390x_sysv_elf_gas.S
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************
- * ------------------------------------------------- *
- * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
- * ------------------------------------------------- *
- * | 0 | 8 | 16 | 24 | *
- * ------------------------------------------------- *
- * | t.fctx | t.data | r2 | r6 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
- * ------------------------------------------------- *
- * | 32 | 40 | 48 | 56 | *
- * ------------------------------------------------- *
- * | r7 | r8 | r9 | r10 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
- * ------------------------------------------------- *
- * | 64 | 72 | 80 | 88 | *
- * ------------------------------------------------- *
- * | r11 | r12 | r13 | r14 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
- * ------------------------------------------------- *
- * | 96 | 104 | 112 | 120 | *
- * ------------------------------------------------- *
- * | f8 | f9 | f10 | f11 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
- * ------------------------------------------------- *
- * | 128 | 136 | 144 | 152 | *
- * ------------------------------------------------- *
- * | f12 | f13 | f14 | f15 | *
- * ------------------------------------------------- *
- * ------------------------------------------------- *
- * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
- * ------------------------------------------------- *
- * | 160 | 168 | 176 | | *
- * ------------------------------------------------- *
- * | fpc | pc | | | *
- * ------------------------------------------------- *
- *******************************************************/
-
-.text
-.align 8
-.global ontop_fcontext
-.type ontop_fcontext, @function
-
-#define ARG_OFFSET 0
-#define GR_OFFSET 16
-#define R14_OFFSET 88
-#define FP_OFFSET 96
-#define FPC_OFFSET 160
-#define PC_OFFSET 168
-#define CONTEXT_SIZE 176
-
-/*
-
-typedef void* fcontext_t;
-
-struct transfer_t {
- fcontext_t fctx;
- void * data;
-};
-
-transfer_t ontop_fcontext( fcontext_t const to,
- void * vp,
- transfer_t (* fn)( transfer_t) );
-
-Incoming args
-r2 - Hidden argument to the location where the return transfer_t needs to be returned
-r3 - Target context
-r4 - Data pointer
-r5 - Function to be executed
-
-This implementation assumes that ontop_fcontext will never be called with target contexts
-created via make_fcontext.
-
-*/
-
-ontop_fcontext:
- /* Reserve stack space to store the current context. */
- aghi %r15,-CONTEXT_SIZE
-
- /* Save the argument register holding the location of the return value. */
- stg %r2,GR_OFFSET(%r15)
-
- /* Save the call-saved general purpose registers. */
- stmg %r6,%r14,GR_OFFSET+8(%r15)
-
- /* Save call-saved floating point registers. */
- std %f8,FP_OFFSET(%r15)
- std %f9,FP_OFFSET+8(%r15)
- std %f10,FP_OFFSET+16(%r15)
- std %f11,FP_OFFSET+24(%r15)
- std %f12,FP_OFFSET+32(%r15)
- std %f13,FP_OFFSET+40(%r15)
- std %f14,FP_OFFSET+48(%r15)
- std %f15,FP_OFFSET+56(%r15)
-
- /* Save the return address as current pc. */
- stg %r14,PC_OFFSET(%r15)
-
- /* Save the floating point control register. */
- stfpc FPC_OFFSET(%r15)
-
- /* Backup the stack pointer pointing to the old context-data into r1. */
- lgr %r1,%r15
-
- /* Load the new context pointer as stack pointer. */
- lgr %r15,%r3
-
- /* Restore the call-saved GPRs from the new context. */
- lmg %r6,%r14,GR_OFFSET+8(%r15)
-
- /* Restore call-saved floating point registers. */
- ld %f8,FP_OFFSET(%r15)
- ld %f9,FP_OFFSET+8(%r15)
- ld %f10,FP_OFFSET+16(%r15)
- ld %f11,FP_OFFSET+24(%r15)
- ld %f12,FP_OFFSET+32(%r15)
- ld %f13,FP_OFFSET+40(%r15)
- ld %f14,FP_OFFSET+48(%r15)
- ld %f15,FP_OFFSET+56(%r15)
-
- /* Load the floating point control register. */
- lfpc FPC_OFFSET(%r15)
-
- /* Store the transfer_t values located in the saved context. */
- stg %r1,0(%r1) /* transfer_t.fctx = old context */
- stg %r4,8(%r1) /* transfer_t.data = data */
-
- /* Set up the arguments for the target function. */
- lg %r2,GR_OFFSET(%r15)
- lgr %r3,%r1
-
- /* Deallocate the context. */
- aghi %r15,CONTEXT_SIZE
-
- br %r5
-
-.size ontop_fcontext,.-ontop_fcontext
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_sparc64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_sparc64_sysv_elf_gas.S
deleted file mode 100644
index 2fcdb89105..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_sparc64_sysv_elf_gas.S
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- Copyright Claudio Jeker 2024
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*
- * transfer_t ontop_fcontext(fcontext_t const to, void *vp, transfer_t (*fn)(transfer_t));
- */
-#define CC64FSZ 176
-#define BIAS 2047
-#define SP 128
-#define I7 136
-
-.file "ontop_sparc64_sysv_elf_gas.S"
-.text
-.align 4
-.global ontop_fcontext
-.type ontop_fcontext, %function
-ontop_fcontext:
- # prepare stack
- save %sp, -CC64FSZ, %sp
-
- # store framepointer and return address in slots reserved
- # for arguments
- stx %fp, [%sp + BIAS + SP]
- stx %i7, [%sp + BIAS + I7]
- mov %sp, %o0
- # force flush register windows to stack and with that save context
- flushw
- # get SP (pointing to new context-data) from %i0 param
- mov %i0, %sp
- # load framepointer and return address from context
- ldx [%sp + BIAS + SP], %fp
- ldx [%sp + BIAS + I7], %i7
-
- # ontop_fcontext requires to directly call a function on top of the
- # current frame so restore register window before doing the jump
- # to the context function which then is in %o2. Do not clobber
- # %o7 in the jump so that (*fn)() returns to that address.
- restore %o0, %g0, %o0
- # restore old %sp (pointing to old context-data) in %o0
- # *data stored in %o1 was not modified
-
- jmpl %o2, %g0
- nop
-.size jump_fcontext,.-jump_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
diff --git a/contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_clang_gas.S b/contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_clang_gas.S
deleted file mode 100644
index 162c1f4ea0..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_clang_gas.S
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* ---------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc | *
-* ---------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc | *
-* ---------------------------------------------------------------------------------- *
-* | limit | base | R12 | R13 | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc | *
-* ---------------------------------------------------------------------------------- *
-* | R14 | R15 | RDI | RSI | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c | *
-* ---------------------------------------------------------------------------------- *
-* | RBX | RBP | hidden | RIP | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c | *
-* ---------------------------------------------------------------------------------- *
-* | parameter area | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c | *
-* ---------------------------------------------------------------------------------- *
-* | FCTX | DATA | | *
-* ---------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "ontop_x86_64_ms_pe_clang_gas.S"
-.text
-.p2align 4,,15
-.globl ontop_fcontext
-.def ontop_fcontext; .scl 2; .type 32; .endef
-.seh_proc ontop_fcontext
-ontop_fcontext:
-.seh_endprologue
-
- leaq -0x118(%rsp), %rsp /* prepare stack */
-
-#if !defined(BOOST_USE_TSX)
- /* save XMM storage */
- movaps %xmm6, 0x0(%rsp)
- movaps %xmm7, 0x10(%rsp)
- movaps %xmm8, 0x20(%rsp)
- movaps %xmm9, 0x30(%rsp)
- movaps %xmm10, 0x40(%rsp)
- movaps %xmm11, 0x50(%rsp)
- movaps %xmm12, 0x60(%rsp)
- movaps %xmm13, 0x70(%rsp)
- movaps %xmm14, 0x80(%rsp)
- movaps %xmm15, 0x90(%rsp)
- stmxcsr 0xa0(%rsp) /* save MMX control- and status-word */
- fnstcw 0xa4(%rsp) /* save x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* save fiber local storage */
- movq 0x20(%r10), %rax
- movq %rax, 0xb0(%rsp)
- /* save current deallocation stack */
- movq 0x1478(%r10), %rax
- movq %rax, 0xb8(%rsp)
- /* save current stack limit */
- movq 0x10(%r10), %rax
- movq %rax, 0xc0(%rsp)
- /* save current stack base */
- movq 0x08(%r10), %rax
- movq %rax, 0xc8(%rsp)
-
- movq %r12, 0xd0(%rsp) /* save R12 */
- movq %r13, 0xd8(%rsp) /* save R13 */
- movq %r14, 0xe0(%rsp) /* save R14 */
- movq %r15, 0xe8(%rsp) /* save R15 */
- movq %rdi, 0xf0(%rsp) /* save RDI */
- movq %rsi, 0xf8(%rsp) /* save RSI */
- movq %rbx, 0x100(%rsp) /* save RBX */
- movq %rbp, 0x108(%rsp) /* save RBP */
-
- movq %rcx, 0x110(%rsp) /* save hidden address of transport_t */
-
- /* preserve RSP (pointing to context-data) in RCX */
- movq %rsp, %rcx
-
- /* restore RSP (pointing to context-data) from RDX */
- movq %rdx, %rsp
-
-#if !defined(BOOST_USE_TSX)
- /* restore XMM storage */
- movaps 0x0(%rsp), %xmm6
- movaps 0x10(%rsp), %xmm7
- movaps 0x20(%rsp), %xmm8
- movaps 0x30(%rsp), %xmm9
- movaps 0x40(%rsp), %xmm10
- movaps 0x50(%rsp), %xmm11
- movaps 0x60(%rsp), %xmm12
- movaps 0x70(%rsp), %xmm13
- movaps 0x80(%rsp), %xmm14
- movaps 0x90(%rsp), %xmm15
- ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
- fldcw 0xa4(%rsp) /* restore x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* restore fiber local storage */
- movq 0xb0(%rsp), %rax
- movq %rax, 0x20(%r10)
- /* restore current deallocation stack */
- movq 0xb8(%rsp), %rax
- movq %rax, 0x1478(%r10)
- /* restore current stack limit */
- movq 0xc0(%rsp), %rax
- movq %rax, 0x10(%r10)
- /* restore current stack base */
- movq 0xc8(%rsp), %rax
- movq %rax, 0x08(%r10)
-
- movq 0xd0(%rsp), %r12 /* restore R12 */
- movq 0xd8(%rsp), %r13 /* restore R13 */
- movq 0xe0(%rsp), %r14 /* restore R14 */
- movq 0xe8(%rsp), %r15 /* restore R15 */
- movq 0xf0(%rsp), %rdi /* restore RDI */
- movq 0xf8(%rsp), %rsi /* restore RSI */
- movq 0x100(%rsp), %rbx /* restore RBX */
- movq 0x108(%rsp), %rbp /* restore RBP */
-
- movq 0x110(%rsp), %rax /* restore hidden address of transport_t */
-
- leaq 0x118(%rsp), %rsp /* prepare stack */
-
- /* keep return-address on stack */
-
- /* transport_t returned in RAX */
- /* return parent fcontext_t */
- movq %rcx, 0x0(%rax)
- /* return data */
- movq %r8, 0x8(%rax)
-
- /* transport_t as 1.arg of context-function */
- /* RCX contains address of returned (hidden) transfer_t */
- movq %rax, %rcx
- /* RDX contains address of passed transfer_t */
- movq %rax, %rdx
-
- /* indirect jump to context */
- jmp *%r9
-.seh_endproc
-
-.section .drectve
-.ascii " -export:\"ontop_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_gas.asm b/contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_gas.asm
deleted file mode 100644
index 02e040c9dc..0000000000
--- a/contrib/restricted/boost/context/src/asm/ontop_x86_64_ms_pe_gas.asm
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- Copyright Oliver Kowalke 2009.
- Copyright Thomas Sailer 2013.
- Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
-*/
-
-/*************************************************************************************
-* ---------------------------------------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe40 | 0x44 | 0x48 | 0x4c | 0x50 | 0x54 | 0x58 | 0x5c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x60 | 0x64 | 0x68 | 0x6c | 0x70 | 0x74 | 0x78 | 0x7c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 32 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x80 | 0x84 | 0x88 | 0x8c | 0x90 | 0x94 | 0x98 | 0x9c | *
-* ---------------------------------------------------------------------------------- *
-* | SEE registers (XMM6-XMM15) | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xa0 | 0xa4 | 0xa8 | 0xac | 0xb0 | 0xb4 | 0xb8 | 0xbc | *
-* ---------------------------------------------------------------------------------- *
-* | fc_mxcsr|fc_x87_cw| <alignment> | fbr_strg | fc_dealloc | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xc0 | 0xc4 | 0xc8 | 0xcc | 0xd0 | 0xd4 | 0xd8 | 0xdc | *
-* ---------------------------------------------------------------------------------- *
-* | limit | base | R12 | R13 | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | *
-* ---------------------------------------------------------------------------------- *
-* | 0xe0 | 0xe4 | 0xe8 | 0xec | 0xf0 | 0xf4 | 0xf8 | 0xfc | *
-* ---------------------------------------------------------------------------------- *
-* | R14 | R15 | RDI | RSI | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x100 | 0x104 | 0x108 | 0x10c | 0x110 | 0x114 | 0x118 | 0x11c | *
-* ---------------------------------------------------------------------------------- *
-* | RBX | RBP | hidden | RIP | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x120 | 0x124 | 0x128 | 0x12c | 0x130 | 0x134 | 0x138 | 0x13c | *
-* ---------------------------------------------------------------------------------- *
-* | parameter area | *
-* ---------------------------------------------------------------------------------- *
-* ---------------------------------------------------------------------------------- *
-* | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | *
-* ---------------------------------------------------------------------------------- *
-* | 0x140 | 0x144 | 0x148 | 0x14c | 0x150 | 0x154 | 0x158 | 0x15c | *
-* ---------------------------------------------------------------------------------- *
-* | FCTX | DATA | | *
-* ---------------------------------------------------------------------------------- *
-**************************************************************************************/
-
-.file "ontop_x86_64_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl ontop_fcontext
-.def ontop_fcontext; .scl 2; .type 32; .endef
-.seh_proc ontop_fcontext
-ontop_fcontext:
-.seh_endprologue
-
- leaq -0x118(%rsp), %rsp /* prepare stack */
-
-#if !defined(BOOST_USE_TSX)
- /* save XMM storage */
- movaps %xmm6, 0x0(%rsp)
- movaps %xmm7, 0x10(%rsp)
- movaps %xmm8, 0x20(%rsp)
- movaps %xmm9, 0x30(%rsp)
- movaps %xmm10, 0x40(%rsp)
- movaps %xmm11, 0x50(%rsp)
- movaps %xmm12, 0x60(%rsp)
- movaps %xmm13, 0x70(%rsp)
- movaps %xmm14, 0x80(%rsp)
- movaps %xmm15, 0x90(%rsp)
- stmxcsr 0xa0(%rsp) /* save MMX control- and status-word */
- fnstcw 0xa4(%rsp) /* save x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* save fiber local storage */
- movq 0x20(%r10), %rax
- movq %rax, 0xb0(%rsp)
- /* save current deallocation stack */
- movq 0x1478(%r10), %rax
- movq %rax, 0xb8(%rsp)
- /* save current stack limit */
- movq 0x10(%r10), %rax
- movq %rax, 0xc0(%rsp)
- /* save current stack base */
- movq 0x08(%r10), %rax
- movq %rax, 0xc8(%rsp)
-
- movq %r12, 0xd0(%rsp) /* save R12 */
- movq %r13, 0xd8(%rsp) /* save R13 */
- movq %r14, 0xe0(%rsp) /* save R14 */
- movq %r15, 0xe8(%rsp) /* save R15 */
- movq %rdi, 0xf0(%rsp) /* save RDI */
- movq %rsi, 0xf8(%rsp) /* save RSI */
- movq %rbx, 0x100(%rsp) /* save RBX */
- movq %rbp, 0x108(%rsp) /* save RBP */
-
- movq %rcx, 0x110(%rsp) /* save hidden address of transport_t */
-
- /* preserve RSP (pointing to context-data) in RCX */
- movq %rsp, %rcx
-
- /* restore RSP (pointing to context-data) from RDX */
- movq %rdx, %rsp
-
-#if !defined(BOOST_USE_TSX)
- /* restore XMM storage */
- movaps 0x0(%rsp), %xmm6
- movaps 0x10(%rsp), %xmm7
- movaps 0x20(%rsp), %xmm8
- movaps 0x30(%rsp), %xmm9
- movaps 0x40(%rsp), %xmm10
- movaps 0x50(%rsp), %xmm11
- movaps 0x60(%rsp), %xmm12
- movaps 0x70(%rsp), %xmm13
- movaps 0x80(%rsp), %xmm14
- movaps 0x90(%rsp), %xmm15
- ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
- fldcw 0xa4(%rsp) /* restore x87 control-word */
-#endif
-
- /* load NT_TIB */
- movq %gs:(0x30), %r10
- /* restore fiber local storage */
- movq 0xb0(%rsp), %rax
- movq %rax, 0x20(%r10)
- /* restore current deallocation stack */
- movq 0xb8(%rsp), %rax
- movq %rax, 0x1478(%r10)
- /* restore current stack limit */
- movq 0xc0(%rsp), %rax
- movq %rax, 0x10(%r10)
- /* restore current stack base */
- movq 0xc8(%rsp), %rax
- movq %rax, 0x08(%r10)
-
- movq 0xd0(%rsp), %r12 /* restore R12 */
- movq 0xd8(%rsp), %r13 /* restore R13 */
- movq 0xe0(%rsp), %r14 /* restore R14 */
- movq 0xe8(%rsp), %r15 /* restore R15 */
- movq 0xf0(%rsp), %rdi /* restore RDI */
- movq 0xf8(%rsp), %rsi /* restore RSI */
- movq 0x100(%rsp), %rbx /* restore RBX */
- movq 0x108(%rsp), %rbp /* restore RBP */
-
- movq 0x110(%rsp), %rax /* restore hidden address of transport_t */
-
- leaq 0x118(%rsp), %rsp /* prepare stack */
-
- /* keep return-address on stack */
-
- /* transport_t returned in RAX */
- /* return parent fcontext_t */
- movq %rcx, 0x0(%rax)
- /* return data */
- movq %r8, 0x8(%rax)
-
- /* transport_t as 1.arg of context-function */
- /* RCX contains address of returned (hidden) transfer_t */
- movq %rax, %rcx
- /* RDX contains address of passed transfer_t */
- movq %rax, %rdx
-
- /* indirect jump to context */
- jmp *%r9
-.seh_endproc
-
-.section .drectve
-.ascii " -export:\"ontop_fcontext\""
diff --git a/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S b/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S
index c3892b8ba0..e3e4bdf870 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_elf_gas.S
@@ -40,6 +40,7 @@
.file "ontop_x86_64_sysv_elf_gas.S"
.text
.globl ontop_fcontext
+.hidden ontop_fcontext
.type ontop_fcontext,@function
.align 16
ontop_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_macho_gas.S b/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_macho_gas.S
index 49755c69b0..7d15b5ba24 100644
--- a/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_macho_gas.S
+++ b/contrib/restricted/boost/context/src/asm/ontop_x86_64_sysv_macho_gas.S
@@ -25,6 +25,7 @@
****************************************************************************************/
.text
+.private_extern _ontop_fcontext
.globl _ontop_fcontext
.align 8
_ontop_fcontext:
diff --git a/contrib/restricted/boost/context/src/asm/tail_ontop_ppc32_sysv.cpp b/contrib/restricted/boost/context/src/asm/tail_ontop_ppc32_sysv.cpp
deleted file mode 100644
index 348608460f..0000000000
--- a/contrib/restricted/boost/context/src/asm/tail_ontop_ppc32_sysv.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-
-// Copyright Oliver Kowalke 2009.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/context/detail/fcontext.hpp>
-
-using boost::context::detail::fcontext_t;
-using boost::context::detail::transfer_t;
-
-// This C++ tail of ontop_fcontext() allocates transfer_t{ from, vp }
-// on the stack. If fn() throws a C++ exception, then the C++ runtime
-// must remove this tail's stack frame.
-extern "C" transfer_t
-ontop_fcontext_tail( int ignore, void * vp, transfer_t (* fn)(transfer_t), fcontext_t const from) {
- return fn( transfer_t{ from, vp });
-}
diff --git a/contrib/restricted/boost/context/src/fcontext.cpp b/contrib/restricted/boost/context/src/fcontext.cpp
new file mode 100644
index 0000000000..9fe0a4892d
--- /dev/null
+++ b/contrib/restricted/boost/context/src/fcontext.cpp
@@ -0,0 +1,39 @@
+// SPDX-FileCopyrightText: Copyright 2024 Arm Limited and/or its affiliates <open-source-office@arm.com>
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This code wraps the plain C asm symbols into properly
+// namespaced and mangled C++ symbols that are safe to
+// export from a library.
+
+#include <boost/context/detail/fcontext.hpp>
+
+extern "C"
+boost::context::detail::transfer_t BOOST_CONTEXT_CALLDECL jump_fcontext( boost::context::detail::fcontext_t const to, void * vp);
+extern "C"
+boost::context::detail::fcontext_t BOOST_CONTEXT_CALLDECL make_fcontext( void * sp, std::size_t size, void (* fn)( boost::context::detail::transfer_t) );
+
+// based on an idea of Giovanni Derreta
+extern "C"
+boost::context::detail::transfer_t BOOST_CONTEXT_CALLDECL ontop_fcontext( boost::context::detail::fcontext_t const to, void * vp, boost::context::detail::transfer_t (* fn)( boost::context::detail::transfer_t) );
+
+namespace boost {
+namespace context {
+namespace detail {
+
+transfer_t jump_fcontext( fcontext_t const to, void * vp)
+{
+ return ::jump_fcontext(to, vp);
+}
+
+fcontext_t make_fcontext( void * sp, std::size_t size, void (* fn)( transfer_t) )
+{
+ return ::make_fcontext(sp, size, fn);
+}
+
+transfer_t ontop_fcontext( fcontext_t const to, void * vp, transfer_t (* fn)( transfer_t) )
+{
+ return ::ontop_fcontext(to, vp, fn);
+}
+}}}
diff --git a/contrib/restricted/boost/context/ucontext_impl/ya.make b/contrib/restricted/boost/context/ucontext_impl/ya.make
index 61ba1464c0..8c9ce98e9b 100644
--- a/contrib/restricted/boost/context/ucontext_impl/ya.make
+++ b/contrib/restricted/boost/context/ucontext_impl/ya.make
@@ -4,9 +4,9 @@ LIBRARY()
WITHOUT_LICENSE_TEXTS()
-VERSION(1.86.0)
+VERSION(1.87.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.86.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.87.0.tar.gz)
LICENSE(BSL-1.0)
diff --git a/contrib/restricted/boost/context/ya.make b/contrib/restricted/boost/context/ya.make
index f70cdc034c..d3c74aa986 100644
--- a/contrib/restricted/boost/context/ya.make
+++ b/contrib/restricted/boost/context/ya.make
@@ -6,9 +6,9 @@ LICENSE(BSL-1.0)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.86.0)
+VERSION(1.87.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.86.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/context/archive/boost-1.87.0.tar.gz)
IF (SANITIZER_TYPE)
PEERDIR(
diff --git a/contrib/restricted/boost/coroutine/include/boost/coroutine/posix/protected_stack_allocator.hpp b/contrib/restricted/boost/coroutine/include/boost/coroutine/posix/protected_stack_allocator.hpp
index 164bb56cd8..5c50e81d29 100644
--- a/contrib/restricted/boost/coroutine/include/boost/coroutine/posix/protected_stack_allocator.hpp
+++ b/contrib/restricted/boost/coroutine/include/boost/coroutine/posix/protected_stack_allocator.hpp
@@ -65,13 +65,7 @@ struct basic_protected_stack_allocator
if ( MAP_FAILED == limit) throw std::bad_alloc();
// conforming to POSIX.1-2001
-#if defined(BOOST_DISABLE_ASSERTS)
- ::mprotect( limit, traits_type::page_size(), PROT_NONE);
-#else
- const int result( ::mprotect( limit, traits_type::page_size(), PROT_NONE) );
- (void)result;
- BOOST_ASSERT( 0 == result);
-#endif
+ BOOST_VERIFY( 0 == ::mprotect( limit, traits_type::page_size(), PROT_NONE));
ctx.size = size_;
ctx.sp = static_cast< char * >( limit) + ctx.size;
diff --git a/contrib/restricted/boost/coroutine/include/boost/coroutine/windows/protected_stack_allocator.hpp b/contrib/restricted/boost/coroutine/include/boost/coroutine/windows/protected_stack_allocator.hpp
index 29e19babb7..4eda8fd3f9 100644
--- a/contrib/restricted/boost/coroutine/include/boost/coroutine/windows/protected_stack_allocator.hpp
+++ b/contrib/restricted/boost/coroutine/include/boost/coroutine/windows/protected_stack_allocator.hpp
@@ -52,14 +52,8 @@ struct basic_protected_stack_allocator
if ( ! limit) throw std::bad_alloc();
DWORD old_options;
-#if defined(BOOST_DISABLE_ASSERTS)
- ::VirtualProtect(
- limit, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
-#else
- const BOOL result = ::VirtualProtect(
- limit, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options);
- BOOST_ASSERT( FALSE != result);
-#endif
+ BOOST_VERIFY( FALSE != ::VirtualProtect(
+ limit, traits_type::page_size(), PAGE_READWRITE | PAGE_GUARD /*PAGE_NOACCESS*/, & old_options));
ctx.size = size_;
ctx.sp = static_cast< char * >( limit) + ctx.size;
diff --git a/contrib/restricted/boost/coroutine/src/posix/stack_traits.cpp b/contrib/restricted/boost/coroutine/src/posix/stack_traits.cpp
index 7a467b7493..20b3ab79b1 100644
--- a/contrib/restricted/boost/coroutine/src/posix/stack_traits.cpp
+++ b/contrib/restricted/boost/coroutine/src/posix/stack_traits.cpp
@@ -35,7 +35,7 @@ namespace {
std::size_t pagesize()
{
// conform to POSIX.1-2001
- return ::sysconf( _SC_PAGESIZE);
+ return static_cast<std::size_t>( ::sysconf( _SC_PAGESIZE) );
}
rlim_t stacksize_limit_()
@@ -86,7 +86,7 @@ stack_traits::default_size() BOOST_NOEXCEPT
std::size_t
stack_traits::minimum_size() BOOST_NOEXCEPT
-{ return SIGSTKSZ; }
+{ return static_cast<std::size_t>( SIGSTKSZ ); }
std::size_t
stack_traits::maximum_size() BOOST_NOEXCEPT
diff --git a/contrib/restricted/boost/coroutine/ya.make b/contrib/restricted/boost/coroutine/ya.make
index cb5d0b6e21..ffe47ab248 100644
--- a/contrib/restricted/boost/coroutine/ya.make
+++ b/contrib/restricted/boost/coroutine/ya.make
@@ -6,9 +6,9 @@ LICENSE(BSL-1.0)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.86.0)
+VERSION(1.87.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/coroutine/archive/boost-1.86.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/coroutine/archive/boost-1.87.0.tar.gz)
PEERDIR(
contrib/restricted/boost/assert
diff --git a/contrib/restricted/boost/function/include/boost/function/function_template.hpp b/contrib/restricted/boost/function/include/boost/function/function_template.hpp
index f21a395beb..ac4a5b247b 100644
--- a/contrib/restricted/boost/function/include/boost/function/function_template.hpp
+++ b/contrib/restricted/boost/function/include/boost/function/function_template.hpp
@@ -261,9 +261,9 @@ namespace boost {
actual invoker that will be used for the given function
object.
- Each specialization contains an "apply" nested class template
+ Each specialization contains an "apply_" nested class template
that accepts the function object, return type, function
- argument types, and allocator. The resulting "apply" class
+ argument types, and allocator. The resulting "apply_" class
contains two typedefs, "invoker_type" and "manager_type",
which correspond to the invoker and manager types. */
template<typename Tag>
@@ -275,7 +275,7 @@ namespace boost {
{
template<typename FunctionPtr,
typename R, typename... T>
- struct apply
+ struct apply_
{
typedef typename get_function_invoker<
FunctionPtr,
@@ -308,7 +308,7 @@ namespace boost {
{
template<typename MemberPtr,
typename R, typename... T>
- struct apply
+ struct apply_
{
typedef typename get_member_invoker<
MemberPtr,
@@ -341,7 +341,7 @@ namespace boost {
{
template<typename FunctionObj,
typename R, typename... T>
- struct apply
+ struct apply_
{
typedef typename get_function_obj_invoker<
FunctionObj,
@@ -374,7 +374,7 @@ namespace boost {
{
template<typename RefWrapper,
typename R, typename... T>
- struct apply
+ struct apply_
{
typedef typename get_function_ref_invoker<
typename RefWrapper::type,
@@ -923,7 +923,7 @@ namespace boost {
typedef typename boost::detail::function::get_function_tag<Functor>::type tag;
typedef boost::detail::function::get_invoker<tag> get_invoker;
typedef typename get_invoker::
- template apply<Functor, R,
+ template apply_<Functor, R,
T...>
handler_type;
diff --git a/contrib/restricted/boost/function/ya.make b/contrib/restricted/boost/function/ya.make
index ca3eef69e2..6b4f5f501e 100644
--- a/contrib/restricted/boost/function/ya.make
+++ b/contrib/restricted/boost/function/ya.make
@@ -6,9 +6,9 @@ LICENSE(BSL-1.0)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.86.0)
+VERSION(1.87.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/function/archive/boost-1.86.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/function/archive/boost-1.87.0.tar.gz)
PEERDIR(
contrib/restricted/boost/assert
@@ -16,7 +16,6 @@ PEERDIR(
contrib/restricted/boost/config
contrib/restricted/boost/core
contrib/restricted/boost/throw_exception
- contrib/restricted/boost/type_traits
)
ADDINCL(
diff --git a/contrib/restricted/boost/move/include/boost/move/adl_move_swap.hpp b/contrib/restricted/boost/move/include/boost/move/adl_move_swap.hpp
index 63ad7888e7..3648ea47f7 100644
--- a/contrib/restricted/boost/move/include/boost/move/adl_move_swap.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/adl_move_swap.hpp
@@ -40,6 +40,8 @@
//In GCC 4.4 stl_move.h was renamed to move.h
#include <bits/move.h>
#endif
+#elif defined(_LIBCPP_VERSION) && (_LIBCPP_VERSION >= 13000)
+ #include <__utility/swap.h> //libc++ refactored <utility> headers in smaller headers
#elif defined(_LIBCPP_VERSION)
#include <type_traits> //The initial import of libc++ defines std::swap and still there
#elif __cplusplus >= 201103L
diff --git a/contrib/restricted/boost/move/include/boost/move/core.hpp b/contrib/restricted/boost/move/include/boost/move/core.hpp
index 79205d6526..f309139353 100644
--- a/contrib/restricted/boost/move/include/boost/move/core.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/core.hpp
@@ -262,12 +262,12 @@
#define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
public:\
- inline TYPE& operator=(TYPE &t)\
+ BOOST_MOVE_FORCEINLINE TYPE& operator=(TYPE &t)\
{ this->operator=(const_cast<const TYPE&>(t)); return *this;}\
public:\
- inline operator ::boost::rv<TYPE>&() \
+ BOOST_MOVE_FORCEINLINE operator ::boost::rv<TYPE>&() \
{ return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this); }\
- inline operator const ::boost::rv<TYPE>&() const \
+ BOOST_MOVE_FORCEINLINE operator const ::boost::rv<TYPE>&() const \
{ return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this); }\
private:\
//
@@ -447,7 +447,7 @@
#else //!defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
- #include <boost/move/detail/meta_utils.hpp>
+ #include <boost/move/detail/meta_utils_core.hpp>
namespace boost {
namespace move_detail {
diff --git a/contrib/restricted/boost/move/include/boost/move/detail/meta_utils.hpp b/contrib/restricted/boost/move/include/boost/move/detail/meta_utils.hpp
index ad5654a395..6e12b178fe 100644
--- a/contrib/restricted/boost/move/include/boost/move/detail/meta_utils.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/detail/meta_utils.hpp
@@ -17,10 +17,9 @@
#if defined(BOOST_HAS_PRAGMA_ONCE)
# pragma once
#endif
-#include <boost/move/detail/config_begin.hpp>
+
#include <boost/move/detail/workaround.hpp> //forceinline
#include <boost/move/detail/meta_utils_core.hpp>
-#include <cstddef> //for std::size_t
#include <boost/move/detail/addressof.hpp>
//Small meta-typetraits to support move
@@ -202,22 +201,6 @@ struct add_const_lvalue_reference
};
//////////////////////////////////////
-// is_lvalue_reference
-//////////////////////////////////////
-template<class T>
-struct is_lvalue_reference
-{
- static const bool value = false;
-};
-
-template<class T>
-struct is_lvalue_reference<T&>
-{
- static const bool value = true;
-};
-
-
-//////////////////////////////////////
// identity
//////////////////////////////////////
template <class T>
@@ -558,6 +541,4 @@ template< class T > struct remove_rvalue_reference { typedef T type; };
} //namespace move_detail {
} //namespace boost {
-#include <boost/move/detail/config_end.hpp>
-
#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_HPP
diff --git a/contrib/restricted/boost/move/include/boost/move/detail/meta_utils_core.hpp b/contrib/restricted/boost/move/include/boost/move/detail/meta_utils_core.hpp
index 4e11673834..fcd04c749b 100644
--- a/contrib/restricted/boost/move/include/boost/move/detail/meta_utils_core.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/detail/meta_utils_core.hpp
@@ -131,6 +131,21 @@ struct enable_if_same : enable_if<is_same<T, U>, R> {};
template <class T, class U, class R = enable_if_nat>
struct disable_if_same : disable_if<is_same<T, U>, R> {};
+//////////////////////////////////////
+// is_lvalue_reference
+//////////////////////////////////////
+template<class T>
+struct is_lvalue_reference
+{
+ static const bool value = false;
+};
+
+template<class T>
+struct is_lvalue_reference<T&>
+{
+ static const bool value = true;
+};
+
} //namespace move_detail {
} //namespace boost {
diff --git a/contrib/restricted/boost/move/include/boost/move/detail/nsec_clock.hpp b/contrib/restricted/boost/move/include/boost/move/detail/nsec_clock.hpp
index 88c0551d2d..62ec2dfb0b 100644
--- a/contrib/restricted/boost/move/include/boost/move/detail/nsec_clock.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/detail/nsec_clock.hpp
@@ -43,7 +43,7 @@
#include <cassert>
#if defined( BOOST_USE_WINDOWS_H )
-#include <Windows.h>
+#include <windows.h>
#else
#if defined (WIN32_PLATFORM_PSPC)
diff --git a/contrib/restricted/boost/move/include/boost/move/detail/placement_new.hpp b/contrib/restricted/boost/move/include/boost/move/detail/placement_new.hpp
index 69d33328cf..11a9fca576 100644
--- a/contrib/restricted/boost/move/include/boost/move/detail/placement_new.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/detail/placement_new.hpp
@@ -18,6 +18,8 @@
# pragma once
#endif
+#include <cstddef>
+
struct boost_move_new_t{};
//avoid including <new>
diff --git a/contrib/restricted/boost/move/include/boost/move/detail/std_ns_begin.hpp b/contrib/restricted/boost/move/include/boost/move/detail/std_ns_begin.hpp
index 1d28117b7c..de13cde548 100644
--- a/contrib/restricted/boost/move/include/boost/move/detail/std_ns_begin.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/detail/std_ns_begin.hpp
@@ -23,12 +23,12 @@
#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE) //GCC >= 4.2
#define BOOST_MOVE_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
#define BOOST_MOVE_STD_NS_END _GLIBCXX_END_NAMESPACE
-#else
- #if defined(_MSC_VER) && (_MSC_VER >= 1915)
- #pragma warning (push)
- #pragma warning (disable : 4643) // Forward declaring 'X' in namespace std is not permitted by the C++ Standard
- #endif
+#elif defined(BOOST_DINKUMWARE_STDLIB)
+ #define BOOST_MOVE_STD_NS_BEG _STD_BEGIN
+ #define BOOST_MOVE_STD_NS_END _STD_END
+#endif
- #define BOOST_MOVE_STD_NS_BEG namespace std{
- #define BOOST_MOVE_STD_NS_END }
+#if defined(_MSC_VER) && (_MSC_VER >= 1915)
+ #pragma warning (push)
+ #pragma warning (disable : 4643) // Forward declaring 'X' in namespace std is not permitted by the C++ Standard
#endif
diff --git a/contrib/restricted/boost/move/include/boost/move/detail/std_ns_end.hpp b/contrib/restricted/boost/move/include/boost/move/detail/std_ns_end.hpp
index 61af2d7b1e..abc40ed022 100644
--- a/contrib/restricted/boost/move/include/boost/move/detail/std_ns_end.hpp
+++ b/contrib/restricted/boost/move/include/boost/move/detail/std_ns_end.hpp
@@ -14,3 +14,6 @@
#elif defined(_MSC_VER) && (_MSC_VER >= 1915)
#pragma warning (pop)
#endif //BOOST_MOVE_STD_NS_GCC_DIAGNOSTIC_PUSH
+
+#undef BOOST_MOVE_STD_NS_BEG
+#undef BOOST_MOVE_STD_NS_END
diff --git a/contrib/restricted/boost/move/ya.make b/contrib/restricted/boost/move/ya.make
index 0821343e3e..5475939966 100644
--- a/contrib/restricted/boost/move/ya.make
+++ b/contrib/restricted/boost/move/ya.make
@@ -9,9 +9,9 @@ LICENSE(
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.86.0)
+VERSION(1.87.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/move/archive/boost-1.86.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/move/archive/boost-1.87.0.tar.gz)
PEERDIR(
contrib/restricted/boost/config
diff --git a/contrib/restricted/boost/regex/.yandex_meta/devtools.copyrights.report b/contrib/restricted/boost/regex/.yandex_meta/devtools.copyrights.report
index 0a83d961d8..87aebabfea 100644
--- a/contrib/restricted/boost/regex/.yandex_meta/devtools.copyrights.report
+++ b/contrib/restricted/boost/regex/.yandex_meta/devtools.copyrights.report
@@ -45,7 +45,6 @@ BELONGS ya.make
Files with this license:
include/boost/regex/icu.hpp [3:4]
include/boost/regex/pending/unicode_iterator.hpp [3:4]
- include/boost/regex/v4/indexed_bit_flag.hpp [3:4]
KEEP COPYRIGHT_SERVICE_LABEL 1f04e771ae77a341bbc9ea094604bb99
BELONGS ya.make
@@ -69,7 +68,6 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/error_type.hpp [3:4]
include/boost/regex/v5/error_type.hpp [3:4]
KEEP COPYRIGHT_SERVICE_LABEL 3e16d1b440a4ce72af6366ce0b5d944c
@@ -82,7 +80,6 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/basic_regex.hpp [3:4]
include/boost/regex/v5/basic_regex.hpp [3:4]
src/regex.cpp [3:4]
src/regex_debug.cpp [3:4]
@@ -97,8 +94,6 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/basic_regex.hpp [3:4]
- include/boost/regex/v4/cpp_regex_traits.hpp [3:4]
include/boost/regex/v5/basic_regex.hpp [3:4]
include/boost/regex/v5/cpp_regex_traits.hpp [3:4]
@@ -116,16 +111,6 @@ BELONGS ya.make
include/boost/regex/mfc.hpp [3:4]
include/boost/regex/pending/object_cache.hpp [3:4]
include/boost/regex/pending/static_mutex.hpp [3:4]
- include/boost/regex/v4/basic_regex_creator.hpp [3:4]
- include/boost/regex/v4/basic_regex_parser.hpp [3:4]
- include/boost/regex/v4/c_regex_traits.hpp [3:4]
- include/boost/regex/v4/cpp_regex_traits.hpp [3:4]
- include/boost/regex/v4/icu.hpp [3:4]
- include/boost/regex/v4/object_cache.hpp [3:4]
- include/boost/regex/v4/protected_call.hpp [3:4]
- include/boost/regex/v4/regex_traits_defaults.hpp [3:4]
- include/boost/regex/v4/unicode_iterator.hpp [3:4]
- include/boost/regex/v4/w32_regex_traits.hpp [3:4]
include/boost/regex/v5/basic_regex_creator.hpp [3:4]
include/boost/regex/v5/basic_regex_parser.hpp [3:4]
include/boost/regex/v5/c_regex_traits.hpp [3:4]
@@ -159,13 +144,6 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/char_regex_traits.hpp [3:4]
- include/boost/regex/v4/iterator_category.hpp [3:4]
- include/boost/regex/v4/mem_block_cache.hpp [2:3]
- include/boost/regex/v4/perl_matcher.hpp [3:4]
- include/boost/regex/v4/perl_matcher_common.hpp [3:4]
- include/boost/regex/v4/perl_matcher_non_recursive.hpp [3:4]
- include/boost/regex/v4/perl_matcher_recursive.hpp [3:4]
include/boost/regex/v5/char_regex_traits.hpp [3:4]
include/boost/regex/v5/iterator_category.hpp [3:4]
include/boost/regex/v5/mem_block_cache.hpp [2:3]
@@ -191,22 +169,6 @@ BELONGS ya.make
include/boost/regex/pattern_except.hpp [3:4]
include/boost/regex/regex_traits.hpp [3:4]
include/boost/regex/user.hpp [3:4]
- include/boost/regex/v4/cregex.hpp [3:4]
- include/boost/regex/v4/iterator_traits.hpp [3:4]
- include/boost/regex/v4/match_flags.hpp [3:4]
- include/boost/regex/v4/pattern_except.hpp [3:4]
- include/boost/regex/v4/primary_transform.hpp [3:4]
- include/boost/regex/v4/regbase.hpp [3:4]
- include/boost/regex/v4/regex.hpp [3:4]
- include/boost/regex/v4/regex_fwd.hpp [3:4]
- include/boost/regex/v4/regex_grep.hpp [3:4]
- include/boost/regex/v4/regex_match.hpp [3:4]
- include/boost/regex/v4/regex_merge.hpp [3:4]
- include/boost/regex/v4/regex_raw_buffer.hpp [3:4]
- include/boost/regex/v4/regex_search.hpp [3:4]
- include/boost/regex/v4/regex_split.hpp [3:4]
- include/boost/regex/v4/states.hpp [3:4]
- include/boost/regex/v4/sub_match.hpp [3:4]
include/boost/regex/v5/cregex.hpp [3:4]
include/boost/regex/v5/iterator_traits.hpp [3:4]
include/boost/regex/v5/match_flags.hpp [3:4]
@@ -237,7 +199,6 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/regex_format.hpp [3:4]
include/boost/regex/v5/regex_format.hpp [3:4]
KEEP COPYRIGHT_SERVICE_LABEL e242cf22a8569c95827537aca7b8285d
@@ -250,12 +211,6 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/regex_iterator.hpp [3:4]
- include/boost/regex/v4/regex_token_iterator.hpp [3:4]
- include/boost/regex/v4/regex_traits.hpp [3:4]
- include/boost/regex/v4/syntax_type.hpp [3:4]
- include/boost/regex/v4/u32regex_iterator.hpp [3:4]
- include/boost/regex/v4/u32regex_token_iterator.hpp [3:4]
include/boost/regex/v5/regex_iterator.hpp [3:4]
include/boost/regex/v5/regex_token_iterator.hpp [3:4]
include/boost/regex/v5/regex_traits.hpp [3:4]
@@ -273,9 +228,6 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/match_results.hpp [3:4]
- include/boost/regex/v4/regex_format.hpp [3:4]
- include/boost/regex/v4/regex_replace.hpp [3:4]
include/boost/regex/v5/match_results.hpp [3:4]
include/boost/regex/v5/regex_format.hpp [3:4]
include/boost/regex/v5/regex_replace.hpp [3:4]
@@ -290,5 +242,4 @@ BELONGS ya.make
Score : 100.00
Match type : COPYRIGHT
Files with this license:
- include/boost/regex/v4/regex_workaround.hpp [3:4]
include/boost/regex/v5/regex_workaround.hpp [3:4]
diff --git a/contrib/restricted/boost/regex/.yandex_meta/devtools.licenses.report b/contrib/restricted/boost/regex/.yandex_meta/devtools.licenses.report
index fbec0562d9..45b8ef2d5f 100644
--- a/contrib/restricted/boost/regex/.yandex_meta/devtools.licenses.report
+++ b/contrib/restricted/boost/regex/.yandex_meta/devtools.licenses.report
@@ -45,7 +45,6 @@ BELONGS ya.make
Match type : NOTICE
Links : http://www.boost.org/LICENSE_1_0.txt, http://www.boost.org/users/license.html, https://spdx.org/licenses/BSL-1.0
Files with this license:
- include/boost/regex/v4/regex_token_iterator.hpp [6:8]
include/boost/regex/v5/regex_token_iterator.hpp [6:8]
KEEP BSL-1.0 65724380ee1601b28f0db6323a0ad006
@@ -61,11 +60,6 @@ BELONGS ya.make
Links : http://www.boost.org/LICENSE_1_0.txt, http://www.boost.org/users/license.html, https://spdx.org/licenses/BSL-1.0
Files with this license:
include/boost/regex/config.hpp [6:8]
- include/boost/regex/v4/char_regex_traits.hpp [6:8]
- include/boost/regex/v4/cregex.hpp [6:8]
- include/boost/regex/v4/error_type.hpp [6:8]
- include/boost/regex/v4/icu.hpp [6:8]
- include/boost/regex/v4/regex_traits_defaults.hpp [6:8]
include/boost/regex/v5/char_regex_traits.hpp [6:8]
include/boost/regex/v5/cregex.hpp [6:8]
include/boost/regex/v5/error_type.hpp [6:8]
@@ -97,45 +91,6 @@ BELONGS ya.make
include/boost/regex/pending/unicode_iterator.hpp [6:8]
include/boost/regex/regex_traits.hpp [6:8]
include/boost/regex/user.hpp [6:8]
- include/boost/regex/v4/basic_regex_creator.hpp [6:8]
- include/boost/regex/v4/basic_regex_parser.hpp [6:8]
- include/boost/regex/v4/c_regex_traits.hpp [6:8]
- include/boost/regex/v4/cpp_regex_traits.hpp [6:8]
- include/boost/regex/v4/indexed_bit_flag.hpp [6:8]
- include/boost/regex/v4/iterator_category.hpp [6:8]
- include/boost/regex/v4/iterator_traits.hpp [6:8]
- include/boost/regex/v4/match_flags.hpp [6:8]
- include/boost/regex/v4/match_results.hpp [6:8]
- include/boost/regex/v4/mem_block_cache.hpp [5:7]
- include/boost/regex/v4/object_cache.hpp [6:8]
- include/boost/regex/v4/pattern_except.hpp [6:8]
- include/boost/regex/v4/perl_matcher.hpp [6:8]
- include/boost/regex/v4/perl_matcher_common.hpp [6:8]
- include/boost/regex/v4/perl_matcher_non_recursive.hpp [6:8]
- include/boost/regex/v4/perl_matcher_recursive.hpp [6:8]
- include/boost/regex/v4/primary_transform.hpp [6:8]
- include/boost/regex/v4/protected_call.hpp [6:8]
- include/boost/regex/v4/regbase.hpp [6:8]
- include/boost/regex/v4/regex.hpp [6:8]
- include/boost/regex/v4/regex_format.hpp [6:8]
- include/boost/regex/v4/regex_fwd.hpp [6:8]
- include/boost/regex/v4/regex_grep.hpp [6:8]
- include/boost/regex/v4/regex_iterator.hpp [6:8]
- include/boost/regex/v4/regex_match.hpp [6:8]
- include/boost/regex/v4/regex_merge.hpp [6:8]
- include/boost/regex/v4/regex_raw_buffer.hpp [6:8]
- include/boost/regex/v4/regex_replace.hpp [6:8]
- include/boost/regex/v4/regex_search.hpp [6:8]
- include/boost/regex/v4/regex_split.hpp [6:8]
- include/boost/regex/v4/regex_traits.hpp [6:8]
- include/boost/regex/v4/regex_workaround.hpp [6:8]
- include/boost/regex/v4/states.hpp [6:8]
- include/boost/regex/v4/sub_match.hpp [6:8]
- include/boost/regex/v4/syntax_type.hpp [6:8]
- include/boost/regex/v4/u32regex_iterator.hpp [6:8]
- include/boost/regex/v4/u32regex_token_iterator.hpp [6:8]
- include/boost/regex/v4/unicode_iterator.hpp [6:8]
- include/boost/regex/v4/w32_regex_traits.hpp [6:8]
include/boost/regex/v5/basic_regex_creator.hpp [6:8]
include/boost/regex/v5/basic_regex_parser.hpp [6:8]
include/boost/regex/v5/c_regex_traits.hpp [6:8]
@@ -193,5 +148,4 @@ BELONGS ya.make
Match type : NOTICE
Links : http://www.boost.org/LICENSE_1_0.txt, http://www.boost.org/users/license.html, https://spdx.org/licenses/BSL-1.0
Files with this license:
- include/boost/regex/v4/basic_regex.hpp [6:8]
include/boost/regex/v5/basic_regex.hpp [6:8]
diff --git a/contrib/restricted/boost/regex/include/boost/cregex.hpp b/contrib/restricted/boost/regex/include/boost/cregex.hpp
index 78012dd658..7ad09e3f84 100644
--- a/contrib/restricted/boost/regex/include/boost/cregex.hpp
+++ b/contrib/restricted/boost/regex/include/boost/cregex.hpp
@@ -25,7 +25,7 @@
#endif
#ifdef BOOST_REGEX_CXX03
-#include <boost/regex/v4/cregex.hpp>
+#error #include <boost/regex/v4/cregex.hpp>
#else
#include <boost/regex/v5/cregex.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex.hpp b/contrib/restricted/boost/regex/include/boost/regex.hpp
index b0c8bf13c7..37e0dfe3ef 100644
--- a/contrib/restricted/boost/regex/include/boost/regex.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex.hpp
@@ -29,7 +29,7 @@
#endif
#ifdef BOOST_REGEX_CXX03
-#include <boost/regex/v4/regex.hpp>
+#error #include <boost/regex/v4/regex.hpp>
#else
#include <boost/regex/v5/regex.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/concepts.hpp b/contrib/restricted/boost/regex/include/boost/regex/concepts.hpp
index 2eafac1b57..d2c96afad9 100644
--- a/contrib/restricted/boost/regex/include/boost/regex/concepts.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex/concepts.hpp
@@ -23,7 +23,7 @@
#include <boost/concept_check.hpp>
#include <boost/type_traits/is_enum.hpp>
#include <boost/type_traits/is_base_and_derived.hpp>
-#include <boost/static_assert.hpp>
+#error #include <boost/static_assert.hpp>
#ifndef BOOST_TEST_TR1_REGEX
#include <boost/regex.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/icu.hpp b/contrib/restricted/boost/regex/include/boost/regex/icu.hpp
index b312612d19..601717d1c7 100644
--- a/contrib/restricted/boost/regex/include/boost/regex/icu.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex/icu.hpp
@@ -22,7 +22,7 @@
#include <boost/regex/config.hpp>
#ifdef BOOST_REGEX_CXX03
-#include <boost/regex/v4/icu.hpp>
+#error #include <boost/regex/v4/icu.hpp>
#else
#include <boost/regex/v5/icu.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/pattern_except.hpp b/contrib/restricted/boost/regex/include/boost/regex/pattern_except.hpp
index f2af1afe64..59c0d399c1 100644
--- a/contrib/restricted/boost/regex/include/boost/regex/pattern_except.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex/pattern_except.hpp
@@ -24,7 +24,7 @@
#endif
#ifdef BOOST_REGEX_CXX03
-#include <boost/regex/v4/pattern_except.hpp>
+#error #include <boost/regex/v4/pattern_except.hpp>
#else
#include <boost/regex/v5/pattern_except.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/pending/object_cache.hpp b/contrib/restricted/boost/regex/include/boost/regex/pending/object_cache.hpp
index 0ddbdadfa3..271cb2c36f 100644
--- a/contrib/restricted/boost/regex/include/boost/regex/pending/object_cache.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex/pending/object_cache.hpp
@@ -21,7 +21,7 @@
#include <boost/regex/config.hpp>
#ifdef BOOST_REGEX_CXX03
-#include <boost/regex/v4/object_cache.hpp>
+#error #include <boost/regex/v4/object_cache.hpp>
#else
#include <boost/regex/v5/object_cache.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/pending/unicode_iterator.hpp b/contrib/restricted/boost/regex/include/boost/regex/pending/unicode_iterator.hpp
index a565570a22..c5b4200e0e 100644
--- a/contrib/restricted/boost/regex/include/boost/regex/pending/unicode_iterator.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex/pending/unicode_iterator.hpp
@@ -22,7 +22,7 @@
#include <boost/regex/config.hpp>
#if defined(BOOST_REGEX_CXX03)
-#include <boost/regex/v4/unicode_iterator.hpp>
+#error #include <boost/regex/v4/unicode_iterator.hpp>
#else
#include <boost/regex/v5/unicode_iterator.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/regex_traits.hpp b/contrib/restricted/boost/regex/include/boost/regex/regex_traits.hpp
index 2b383160c1..e66284c6cd 100644
--- a/contrib/restricted/boost/regex/include/boost/regex/regex_traits.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex/regex_traits.hpp
@@ -25,7 +25,7 @@
# ifndef BOOST_REGEX_TRAITS_HPP_INCLUDED
#ifdef BOOST_REGEX_CXX03
-# include <boost/regex/v4/regex_traits.hpp>
+# error #include <boost/regex/v4/regex_traits.hpp>
#else
# include <boost/regex/v5/regex_traits.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex.hpp
deleted file mode 100644
index 0408a7543c..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex.hpp
+++ /dev/null
@@ -1,797 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2004 John Maddock
- * Copyright 2011 Garmin Ltd. or its subsidiaries
- *
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org/ for most recent version.
- * FILE basic_regex.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares template class basic_regex.
- */
-
-#ifndef BOOST_REGEX_V4_BASIC_REGEX_HPP
-#define BOOST_REGEX_V4_BASIC_REGEX_HPP
-
-#include <boost/type_traits/is_same.hpp>
-#include <boost/container_hash/hash.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable : 4251)
-#if BOOST_MSVC < 1700
-# pragma warning(disable : 4231)
-#endif
-#if BOOST_MSVC < 1600
-#pragma warning(disable : 4660)
-#endif
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-//
-// forward declaration, we will need this one later:
-//
-template <class charT, class traits>
-class basic_regex_parser;
-
-template <class I>
-void bubble_down_one(I first, I last)
-{
- if(first != last)
- {
- I next = last - 1;
- while((next != first) && (*next < *(next-1)))
- {
- (next-1)->swap(*next);
- --next;
- }
- }
-}
-
-static const int hash_value_mask = 1 << (std::numeric_limits<int>::digits - 1);
-
-template <class Iterator>
-inline int hash_value_from_capture_name(Iterator i, Iterator j)
-{
- std::size_t r = boost::hash_range(i, j);
- r %= ((std::numeric_limits<int>::max)());
- return static_cast<int>(r) | hash_value_mask;
-}
-
-class named_subexpressions
-{
-public:
- struct name
- {
- template <class charT>
- name(const charT* i, const charT* j, int idx)
- : index(idx)
- {
- hash = hash_value_from_capture_name(i, j);
- }
- name(int h, int idx)
- : index(idx), hash(h)
- {
- }
- int index;
- int hash;
- bool operator < (const name& other)const
- {
- return hash < other.hash;
- }
- bool operator == (const name& other)const
- {
- return hash == other.hash;
- }
- void swap(name& other)
- {
- std::swap(index, other.index);
- std::swap(hash, other.hash);
- }
- };
-
- typedef std::vector<name>::const_iterator const_iterator;
- typedef std::pair<const_iterator, const_iterator> range_type;
-
- named_subexpressions(){}
-
- template <class charT>
- void set_name(const charT* i, const charT* j, int index)
- {
- m_sub_names.push_back(name(i, j, index));
- bubble_down_one(m_sub_names.begin(), m_sub_names.end());
- }
- template <class charT>
- int get_id(const charT* i, const charT* j)const
- {
- name t(i, j, 0);
- typename std::vector<name>::const_iterator pos = std::lower_bound(m_sub_names.begin(), m_sub_names.end(), t);
- if((pos != m_sub_names.end()) && (*pos == t))
- {
- return pos->index;
- }
- return -1;
- }
- template <class charT>
- range_type equal_range(const charT* i, const charT* j)const
- {
- name t(i, j, 0);
- return std::equal_range(m_sub_names.begin(), m_sub_names.end(), t);
- }
- int get_id(int h)const
- {
- name t(h, 0);
- std::vector<name>::const_iterator pos = std::lower_bound(m_sub_names.begin(), m_sub_names.end(), t);
- if((pos != m_sub_names.end()) && (*pos == t))
- {
- return pos->index;
- }
- return -1;
- }
- range_type equal_range(int h)const
- {
- name t(h, 0);
- return std::equal_range(m_sub_names.begin(), m_sub_names.end(), t);
- }
-private:
- std::vector<name> m_sub_names;
-};
-
-//
-// class regex_data:
-// represents the data we wish to expose to the matching algorithms.
-//
-template <class charT, class traits>
-struct regex_data : public named_subexpressions
-{
- typedef regex_constants::syntax_option_type flag_type;
- typedef std::size_t size_type;
-
- regex_data(const ::boost::shared_ptr<
- ::boost::regex_traits_wrapper<traits> >& t)
- : m_ptraits(t), m_flags(0), m_status(0), m_expression(0), m_expression_len(0),
- m_mark_count(0), m_first_state(0), m_restart_type(0),
-#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !(defined(BOOST_MSVC) && (BOOST_MSVC < 1900))
- m_startmap{ 0 },
-#endif
- m_can_be_null(0), m_word_mask(0), m_has_recursions(false), m_disable_match_any(false) {}
- regex_data()
- : m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_flags(0), m_status(0), m_expression(0), m_expression_len(0),
- m_mark_count(0), m_first_state(0), m_restart_type(0),
-#if !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !(defined(BOOST_MSVC) && (BOOST_MSVC < 1900))
- m_startmap{ 0 },
-#endif
- m_can_be_null(0), m_word_mask(0), m_has_recursions(false), m_disable_match_any(false) {}
-
- ::boost::shared_ptr<
- ::boost::regex_traits_wrapper<traits>
- > m_ptraits; // traits class instance
- flag_type m_flags; // flags with which we were compiled
- int m_status; // error code (0 implies OK).
- const charT* m_expression; // the original expression
- std::ptrdiff_t m_expression_len; // the length of the original expression
- size_type m_mark_count; // the number of marked sub-expressions
- BOOST_REGEX_DETAIL_NS::re_syntax_base* m_first_state; // the first state of the machine
- unsigned m_restart_type; // search optimisation type
- unsigned char m_startmap[1 << CHAR_BIT]; // which characters can start a match
- unsigned int m_can_be_null; // whether we can match a null string
- BOOST_REGEX_DETAIL_NS::raw_storage m_data; // the buffer in which our states are constructed
- typename traits::char_class_type m_word_mask; // mask used to determine if a character is a word character
- std::vector<
- std::pair<
- std::size_t, std::size_t> > m_subs; // Position of sub-expressions within the *string*.
- bool m_has_recursions; // whether we have recursive expressions;
- bool m_disable_match_any; // when set we need to disable the match_any flag as it causes different/buggy behaviour.
-};
-//
-// class basic_regex_implementation
-// pimpl implementation class for basic_regex.
-//
-template <class charT, class traits>
-class basic_regex_implementation
- : public regex_data<charT, traits>
-{
-public:
- typedef regex_constants::syntax_option_type flag_type;
- typedef std::ptrdiff_t difference_type;
- typedef std::size_t size_type;
- typedef typename traits::locale_type locale_type;
- typedef const charT* const_iterator;
-
- basic_regex_implementation(){}
- basic_regex_implementation(const ::boost::shared_ptr<
- ::boost::regex_traits_wrapper<traits> >& t)
- : regex_data<charT, traits>(t) {}
- void assign(const charT* arg_first,
- const charT* arg_last,
- flag_type f)
- {
- regex_data<charT, traits>* pdat = this;
- basic_regex_parser<charT, traits> parser(pdat);
- parser.parse(arg_first, arg_last, f);
- }
-
- locale_type BOOST_REGEX_CALL imbue(locale_type l)
- {
- return this->m_ptraits->imbue(l);
- }
- locale_type BOOST_REGEX_CALL getloc()const
- {
- return this->m_ptraits->getloc();
- }
- std::basic_string<charT> BOOST_REGEX_CALL str()const
- {
- std::basic_string<charT> result;
- if(this->m_status == 0)
- result = std::basic_string<charT>(this->m_expression, this->m_expression_len);
- return result;
- }
- const_iterator BOOST_REGEX_CALL expression()const
- {
- return this->m_expression;
- }
- std::pair<const_iterator, const_iterator> BOOST_REGEX_CALL subexpression(std::size_t n)const
- {
- const std::pair<std::size_t, std::size_t>& pi = this->m_subs.at(n);
- std::pair<const_iterator, const_iterator> p(expression() + pi.first, expression() + pi.second);
- return p;
- }
- //
- // begin, end:
- const_iterator BOOST_REGEX_CALL begin()const
- {
- return (this->m_status ? 0 : this->m_expression);
- }
- const_iterator BOOST_REGEX_CALL end()const
- {
- return (this->m_status ? 0 : this->m_expression + this->m_expression_len);
- }
- flag_type BOOST_REGEX_CALL flags()const
- {
- return this->m_flags;
- }
- size_type BOOST_REGEX_CALL size()const
- {
- return this->m_expression_len;
- }
- int BOOST_REGEX_CALL status()const
- {
- return this->m_status;
- }
- size_type BOOST_REGEX_CALL mark_count()const
- {
- return this->m_mark_count - 1;
- }
- const BOOST_REGEX_DETAIL_NS::re_syntax_base* get_first_state()const
- {
- return this->m_first_state;
- }
- unsigned get_restart_type()const
- {
- return this->m_restart_type;
- }
- const unsigned char* get_map()const
- {
- return this->m_startmap;
- }
- const ::boost::regex_traits_wrapper<traits>& get_traits()const
- {
- return *(this->m_ptraits);
- }
- bool can_be_null()const
- {
- return this->m_can_be_null;
- }
- const regex_data<charT, traits>& get_data()const
- {
- basic_regex_implementation<charT, traits> const* p = this;
- return *static_cast<const regex_data<charT, traits>*>(p);
- }
-};
-
-} // namespace BOOST_REGEX_DETAIL_NS
-//
-// class basic_regex:
-// represents the compiled
-// regular expression:
-//
-
-#ifdef BOOST_REGEX_NO_FWD
-template <class charT, class traits = regex_traits<charT> >
-#else
-template <class charT, class traits >
-#endif
-class basic_regex : public regbase
-{
-public:
- // typedefs:
- typedef std::size_t traits_size_type;
- typedef typename traits::string_type traits_string_type;
- typedef charT char_type;
- typedef traits traits_type;
-
- typedef charT value_type;
- typedef charT& reference;
- typedef const charT& const_reference;
- typedef const charT* const_iterator;
- typedef const_iterator iterator;
- typedef std::ptrdiff_t difference_type;
- typedef std::size_t size_type;
- typedef regex_constants::syntax_option_type flag_type;
- // locale_type
- // placeholder for actual locale type used by the
- // traits class to localise *this.
- typedef typename traits::locale_type locale_type;
-
-public:
- explicit basic_regex(){}
- explicit basic_regex(const charT* p, flag_type f = regex_constants::normal)
- {
- assign(p, f);
- }
- basic_regex(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
- {
- assign(p1, p2, f);
- }
- basic_regex(const charT* p, size_type len, flag_type f)
- {
- assign(p, len, f);
- }
- basic_regex(const basic_regex& that)
- : m_pimpl(that.m_pimpl) {}
- ~basic_regex(){}
- basic_regex& BOOST_REGEX_CALL operator=(const basic_regex& that)
- {
- return assign(that);
- }
- basic_regex& BOOST_REGEX_CALL operator=(const charT* ptr)
- {
- return assign(ptr);
- }
-
- //
- // assign:
- basic_regex& assign(const basic_regex& that)
- {
- m_pimpl = that.m_pimpl;
- return *this;
- }
- basic_regex& assign(const charT* p, flag_type f = regex_constants::normal)
- {
- return assign(p, p + traits::length(p), f);
- }
- basic_regex& assign(const charT* p, size_type len, flag_type f)
- {
- return assign(p, p + len, f);
- }
-private:
- basic_regex& do_assign(const charT* p1,
- const charT* p2,
- flag_type f);
-public:
- basic_regex& assign(const charT* p1,
- const charT* p2,
- flag_type f = regex_constants::normal)
- {
- return do_assign(p1, p2, f);
- }
-#if !defined(BOOST_NO_MEMBER_TEMPLATES)
-
- template <class ST, class SA>
- unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
- {
- return set_expression(p.data(), p.data() + p.size(), f);
- }
-
- template <class ST, class SA>
- explicit basic_regex(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
- {
- assign(p, f);
- }
-
- template <class InputIterator>
- basic_regex(InputIterator arg_first, InputIterator arg_last, flag_type f = regex_constants::normal)
- {
- typedef typename traits::string_type seq_type;
- seq_type a(arg_first, arg_last);
- if(!a.empty())
- assign(static_cast<const charT*>(&*a.begin()), static_cast<const charT*>(&*a.begin() + a.size()), f);
- else
- assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);
- }
-
- template <class ST, class SA>
- basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string<charT, ST, SA>& p)
- {
- return assign(p.data(), p.data() + p.size(), regex_constants::normal);
- }
-
- template <class string_traits, class A>
- basic_regex& BOOST_REGEX_CALL assign(
- const std::basic_string<charT, string_traits, A>& s,
- flag_type f = regex_constants::normal)
- {
- return assign(s.data(), s.data() + s.size(), f);
- }
-
- template <class InputIterator>
- basic_regex& BOOST_REGEX_CALL assign(InputIterator arg_first,
- InputIterator arg_last,
- flag_type f = regex_constants::normal)
- {
- typedef typename traits::string_type seq_type;
- seq_type a(arg_first, arg_last);
- if(a.size())
- {
- const charT* p1 = &*a.begin();
- const charT* p2 = &*a.begin() + a.size();
- return assign(p1, p2, f);
- }
- return assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);
- }
-#else
- unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
- {
- return set_expression(p.data(), p.data() + p.size(), f);
- }
-
- basic_regex(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
- {
- assign(p, f);
- }
-
- basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string<charT>& p)
- {
- return assign(p.data(), p.data() + p.size(), regex_constants::normal);
- }
-
- basic_regex& BOOST_REGEX_CALL assign(
- const std::basic_string<charT>& s,
- flag_type f = regex_constants::normal)
- {
- return assign(s.data(), s.data() + s.size(), f);
- }
-
-#endif
-
- //
- // locale:
- locale_type BOOST_REGEX_CALL imbue(locale_type l);
- locale_type BOOST_REGEX_CALL getloc()const
- {
- return m_pimpl.get() ? m_pimpl->getloc() : locale_type();
- }
- //
- // getflags:
- // retained for backwards compatibility only, "flags"
- // is now the preferred name:
- flag_type BOOST_REGEX_CALL getflags()const
- {
- return flags();
- }
- flag_type BOOST_REGEX_CALL flags()const
- {
- return m_pimpl.get() ? m_pimpl->flags() : 0;
- }
- //
- // str:
- std::basic_string<charT> BOOST_REGEX_CALL str()const
- {
- return m_pimpl.get() ? m_pimpl->str() : std::basic_string<charT>();
- }
- //
- // begin, end, subexpression:
- std::pair<const_iterator, const_iterator> BOOST_REGEX_CALL subexpression(std::size_t n)const
- {
- if(!m_pimpl.get())
- boost::throw_exception(std::logic_error("Can't access subexpressions in an invalid regex."));
- return m_pimpl->subexpression(n);
- }
- const_iterator BOOST_REGEX_CALL begin()const
- {
- return (m_pimpl.get() ? m_pimpl->begin() : 0);
- }
- const_iterator BOOST_REGEX_CALL end()const
- {
- return (m_pimpl.get() ? m_pimpl->end() : 0);
- }
- //
- // swap:
- void BOOST_REGEX_CALL swap(basic_regex& that)throw()
- {
- m_pimpl.swap(that.m_pimpl);
- }
- //
- // size:
- size_type BOOST_REGEX_CALL size()const
- {
- return (m_pimpl.get() ? m_pimpl->size() : 0);
- }
- //
- // max_size:
- size_type BOOST_REGEX_CALL max_size()const
- {
- return UINT_MAX;
- }
- //
- // empty:
- bool BOOST_REGEX_CALL empty()const
- {
- return (m_pimpl.get() ? 0 != m_pimpl->status() : true);
- }
-
- size_type BOOST_REGEX_CALL mark_count()const
- {
- return (m_pimpl.get() ? m_pimpl->mark_count() : 0);
- }
-
- int status()const
- {
- return (m_pimpl.get() ? m_pimpl->status() : regex_constants::error_empty);
- }
-
- int BOOST_REGEX_CALL compare(const basic_regex& that) const
- {
- if(m_pimpl.get() == that.m_pimpl.get())
- return 0;
- if(!m_pimpl.get())
- return -1;
- if(!that.m_pimpl.get())
- return 1;
- if(status() != that.status())
- return status() - that.status();
- if(flags() != that.flags())
- return flags() - that.flags();
- return str().compare(that.str());
- }
- bool BOOST_REGEX_CALL operator==(const basic_regex& e)const
- {
- return compare(e) == 0;
- }
- bool BOOST_REGEX_CALL operator != (const basic_regex& e)const
- {
- return compare(e) != 0;
- }
- bool BOOST_REGEX_CALL operator<(const basic_regex& e)const
- {
- return compare(e) < 0;
- }
- bool BOOST_REGEX_CALL operator>(const basic_regex& e)const
- {
- return compare(e) > 0;
- }
- bool BOOST_REGEX_CALL operator<=(const basic_regex& e)const
- {
- return compare(e) <= 0;
- }
- bool BOOST_REGEX_CALL operator>=(const basic_regex& e)const
- {
- return compare(e) >= 0;
- }
-
- //
- // The following are deprecated as public interfaces
- // but are available for compatibility with earlier versions.
- const charT* BOOST_REGEX_CALL expression()const
- {
- return (m_pimpl.get() && !m_pimpl->status() ? m_pimpl->expression() : 0);
- }
- unsigned int BOOST_REGEX_CALL set_expression(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
- {
- assign(p1, p2, f | regex_constants::no_except);
- return status();
- }
- unsigned int BOOST_REGEX_CALL set_expression(const charT* p, flag_type f = regex_constants::normal)
- {
- assign(p, f | regex_constants::no_except);
- return status();
- }
- unsigned int BOOST_REGEX_CALL error_code()const
- {
- return status();
- }
- //
- // private access methods:
- //
- const BOOST_REGEX_DETAIL_NS::re_syntax_base* get_first_state()const
- {
- BOOST_REGEX_ASSERT(0 != m_pimpl.get());
- return m_pimpl->get_first_state();
- }
- unsigned get_restart_type()const
- {
- BOOST_REGEX_ASSERT(0 != m_pimpl.get());
- return m_pimpl->get_restart_type();
- }
- const unsigned char* get_map()const
- {
- BOOST_REGEX_ASSERT(0 != m_pimpl.get());
- return m_pimpl->get_map();
- }
- const ::boost::regex_traits_wrapper<traits>& get_traits()const
- {
- BOOST_REGEX_ASSERT(0 != m_pimpl.get());
- return m_pimpl->get_traits();
- }
- bool can_be_null()const
- {
- BOOST_REGEX_ASSERT(0 != m_pimpl.get());
- return m_pimpl->can_be_null();
- }
- const BOOST_REGEX_DETAIL_NS::regex_data<charT, traits>& get_data()const
- {
- BOOST_REGEX_ASSERT(0 != m_pimpl.get());
- return m_pimpl->get_data();
- }
- boost::shared_ptr<BOOST_REGEX_DETAIL_NS::named_subexpressions > get_named_subs()const
- {
- return m_pimpl;
- }
-
-private:
- shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > m_pimpl;
-};
-
-//
-// out of line members;
-// these are the only members that mutate the basic_regex object,
-// and are designed to provide the strong exception guarantee
-// (in the event of a throw, the state of the object remains unchanged).
-//
-template <class charT, class traits>
-basic_regex<charT, traits>& basic_regex<charT, traits>::do_assign(const charT* p1,
- const charT* p2,
- flag_type f)
-{
- shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > temp;
- if(!m_pimpl.get())
- {
- temp = shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> >(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>());
- }
- else
- {
- temp = shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> >(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>(m_pimpl->m_ptraits));
- }
- temp->assign(p1, p2, f);
- temp.swap(m_pimpl);
- return *this;
-}
-
-template <class charT, class traits>
-typename basic_regex<charT, traits>::locale_type BOOST_REGEX_CALL basic_regex<charT, traits>::imbue(locale_type l)
-{
- shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > temp(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>());
- locale_type result = temp->imbue(l);
- temp.swap(m_pimpl);
- return result;
-}
-
-//
-// non-members:
-//
-template <class charT, class traits>
-void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2)
-{
- e1.swap(e2);
-}
-
-#ifndef BOOST_NO_STD_LOCALE
-template <class charT, class traits, class traits2>
-std::basic_ostream<charT, traits>&
- operator << (std::basic_ostream<charT, traits>& os,
- const basic_regex<charT, traits2>& e)
-{
- return (os << e.str());
-}
-#else
-template <class traits>
-std::ostream& operator << (std::ostream& os, const basic_regex<char, traits>& e)
-{
- return (os << e.str());
-}
-#endif
-
-//
-// class reg_expression:
-// this is provided for backwards compatibility only,
-// it is deprecated, no not use!
-//
-#ifdef BOOST_REGEX_NO_FWD
-template <class charT, class traits = regex_traits<charT> >
-#else
-template <class charT, class traits >
-#endif
-class reg_expression : public basic_regex<charT, traits>
-{
-public:
- typedef typename basic_regex<charT, traits>::flag_type flag_type;
- typedef typename basic_regex<charT, traits>::size_type size_type;
- explicit reg_expression(){}
- explicit reg_expression(const charT* p, flag_type f = regex_constants::normal)
- : basic_regex<charT, traits>(p, f){}
- reg_expression(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
- : basic_regex<charT, traits>(p1, p2, f){}
- reg_expression(const charT* p, size_type len, flag_type f)
- : basic_regex<charT, traits>(p, len, f){}
- reg_expression(const reg_expression& that)
- : basic_regex<charT, traits>(that) {}
- ~reg_expression(){}
- reg_expression& BOOST_REGEX_CALL operator=(const reg_expression& that)
- {
- return this->assign(that);
- }
-
-#if !defined(BOOST_NO_MEMBER_TEMPLATES)
- template <class ST, class SA>
- explicit reg_expression(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
- : basic_regex<charT, traits>(p, f)
- {
- }
-
- template <class InputIterator>
- reg_expression(InputIterator arg_first, InputIterator arg_last, flag_type f = regex_constants::normal)
- : basic_regex<charT, traits>(arg_first, arg_last, f)
- {
- }
-
- template <class ST, class SA>
- reg_expression& BOOST_REGEX_CALL operator=(const std::basic_string<charT, ST, SA>& p)
- {
- this->assign(p);
- return *this;
- }
-#else
- explicit reg_expression(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
- : basic_regex<charT, traits>(p, f)
- {
- }
-
- reg_expression& BOOST_REGEX_CALL operator=(const std::basic_string<charT>& p)
- {
- this->assign(p);
- return *this;
- }
-#endif
-
-};
-
-#ifdef BOOST_MSVC
-#pragma warning (pop)
-#endif
-
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_creator.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_creator.hpp
deleted file mode 100644
index b9f02ecea0..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_creator.hpp
+++ /dev/null
@@ -1,1598 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE basic_regex_creator.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares template class basic_regex_creator which fills in
- * the data members of a regex_data object.
- */
-
-#ifndef BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
-#define BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
-
-#include <boost/regex/v4/indexed_bit_flag.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-namespace boost{
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-template <class charT>
-struct digraph : public std::pair<charT, charT>
-{
- digraph() : std::pair<charT, charT>(charT(0), charT(0)){}
- digraph(charT c1) : std::pair<charT, charT>(c1, charT(0)){}
- digraph(charT c1, charT c2) : std::pair<charT, charT>(c1, c2)
- {}
- digraph(const digraph<charT>& d) : std::pair<charT, charT>(d.first, d.second){}
-#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
- digraph<charT>& operator=(const digraph<charT>&) = default;
-#endif
- template <class Seq>
- digraph(const Seq& s) : std::pair<charT, charT>()
- {
- BOOST_REGEX_ASSERT(s.size() <= 2);
- BOOST_REGEX_ASSERT(s.size());
- this->first = s[0];
- this->second = (s.size() > 1) ? s[1] : 0;
- }
-};
-
-template <class charT, class traits>
-class basic_char_set
-{
-public:
- typedef digraph<charT> digraph_type;
- typedef typename traits::string_type string_type;
- typedef typename traits::char_class_type m_type;
-
- basic_char_set()
- {
- m_negate = false;
- m_has_digraphs = false;
- m_classes = 0;
- m_negated_classes = 0;
- m_empty = true;
- }
-
- void add_single(const digraph_type& s)
- {
- m_singles.insert(s);
- if(s.second)
- m_has_digraphs = true;
- m_empty = false;
- }
- void add_range(const digraph_type& first, const digraph_type& end)
- {
- m_ranges.push_back(first);
- m_ranges.push_back(end);
- if(first.second)
- {
- m_has_digraphs = true;
- add_single(first);
- }
- if(end.second)
- {
- m_has_digraphs = true;
- add_single(end);
- }
- m_empty = false;
- }
- void add_class(m_type m)
- {
- m_classes |= m;
- m_empty = false;
- }
- void add_negated_class(m_type m)
- {
- m_negated_classes |= m;
- m_empty = false;
- }
- void add_equivalent(const digraph_type& s)
- {
- m_equivalents.insert(s);
- if(s.second)
- {
- m_has_digraphs = true;
- add_single(s);
- }
- m_empty = false;
- }
- void negate()
- {
- m_negate = true;
- //m_empty = false;
- }
-
- //
- // accessor functions:
- //
- bool has_digraphs()const
- {
- return m_has_digraphs;
- }
- bool is_negated()const
- {
- return m_negate;
- }
- typedef typename std::vector<digraph_type>::const_iterator list_iterator;
- typedef typename std::set<digraph_type>::const_iterator set_iterator;
- set_iterator singles_begin()const
- {
- return m_singles.begin();
- }
- set_iterator singles_end()const
- {
- return m_singles.end();
- }
- list_iterator ranges_begin()const
- {
- return m_ranges.begin();
- }
- list_iterator ranges_end()const
- {
- return m_ranges.end();
- }
- set_iterator equivalents_begin()const
- {
- return m_equivalents.begin();
- }
- set_iterator equivalents_end()const
- {
- return m_equivalents.end();
- }
- m_type classes()const
- {
- return m_classes;
- }
- m_type negated_classes()const
- {
- return m_negated_classes;
- }
- bool empty()const
- {
- return m_empty;
- }
-private:
- std::set<digraph_type> m_singles; // a list of single characters to match
- std::vector<digraph_type> m_ranges; // a list of end points of our ranges
- bool m_negate; // true if the set is to be negated
- bool m_has_digraphs; // true if we have digraphs present
- m_type m_classes; // character classes to match
- m_type m_negated_classes; // negated character classes to match
- bool m_empty; // whether we've added anything yet
- std::set<digraph_type> m_equivalents; // a list of equivalence classes
-};
-
-template <class charT, class traits>
-class basic_regex_creator
-{
-public:
- basic_regex_creator(regex_data<charT, traits>* data);
- std::ptrdiff_t getoffset(void* addr)
- {
- return getoffset(addr, m_pdata->m_data.data());
- }
- std::ptrdiff_t getoffset(const void* addr, const void* base)
- {
- return static_cast<const char*>(addr) - static_cast<const char*>(base);
- }
- re_syntax_base* getaddress(std::ptrdiff_t off)
- {
- return getaddress(off, m_pdata->m_data.data());
- }
- re_syntax_base* getaddress(std::ptrdiff_t off, void* base)
- {
- return static_cast<re_syntax_base*>(static_cast<void*>(static_cast<char*>(base) + off));
- }
- void init(unsigned l_flags)
- {
- m_pdata->m_flags = l_flags;
- m_icase = l_flags & regex_constants::icase;
- }
- regbase::flag_type flags()
- {
- return m_pdata->m_flags;
- }
- void flags(regbase::flag_type f)
- {
- m_pdata->m_flags = f;
- if(m_icase != static_cast<bool>(f & regbase::icase))
- {
- m_icase = static_cast<bool>(f & regbase::icase);
- }
- }
- re_syntax_base* append_state(syntax_element_type t, std::size_t s = sizeof(re_syntax_base));
- re_syntax_base* insert_state(std::ptrdiff_t pos, syntax_element_type t, std::size_t s = sizeof(re_syntax_base));
- re_literal* append_literal(charT c);
- re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set);
- re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set, mpl::false_*);
- re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set, mpl::true_*);
- void finalize(const charT* p1, const charT* p2);
-protected:
- regex_data<charT, traits>* m_pdata; // pointer to the basic_regex_data struct we are filling in
- const ::boost::regex_traits_wrapper<traits>&
- m_traits; // convenience reference to traits class
- re_syntax_base* m_last_state; // the last state we added
- bool m_icase; // true for case insensitive matches
- unsigned m_repeater_id; // the state_id of the next repeater
- bool m_has_backrefs; // true if there are actually any backrefs
- indexed_bit_flag m_backrefs; // bitmask of permitted backrefs
- boost::uintmax_t m_bad_repeats; // bitmask of repeats we can't deduce a startmap for;
- bool m_has_recursions; // set when we have recursive expressions to fixup
- std::vector<unsigned char> m_recursion_checks; // notes which recursions we've followed while analysing this expression
- typename traits::char_class_type m_word_mask; // mask used to determine if a character is a word character
- typename traits::char_class_type m_mask_space; // mask used to determine if a character is a word character
- typename traits::char_class_type m_lower_mask; // mask used to determine if a character is a lowercase character
- typename traits::char_class_type m_upper_mask; // mask used to determine if a character is an uppercase character
- typename traits::char_class_type m_alpha_mask; // mask used to determine if a character is an alphabetic character
-private:
- basic_regex_creator& operator=(const basic_regex_creator&);
- basic_regex_creator(const basic_regex_creator&);
-
- void fixup_pointers(re_syntax_base* state);
- void fixup_recursions(re_syntax_base* state);
- void create_startmaps(re_syntax_base* state);
- int calculate_backstep(re_syntax_base* state);
- void create_startmap(re_syntax_base* state, unsigned char* l_map, unsigned int* pnull, unsigned char mask);
- unsigned get_restart_type(re_syntax_base* state);
- void set_all_masks(unsigned char* bits, unsigned char);
- bool is_bad_repeat(re_syntax_base* pt);
- void set_bad_repeat(re_syntax_base* pt);
- syntax_element_type get_repeat_type(re_syntax_base* state);
- void probe_leading_repeat(re_syntax_base* state);
-};
-
-template <class charT, class traits>
-basic_regex_creator<charT, traits>::basic_regex_creator(regex_data<charT, traits>* data)
- : m_pdata(data), m_traits(*(data->m_ptraits)), m_last_state(0), m_icase(false), m_repeater_id(0),
- m_has_backrefs(false), m_bad_repeats(0), m_has_recursions(false), m_word_mask(0), m_mask_space(0), m_lower_mask(0), m_upper_mask(0), m_alpha_mask(0)
-{
- m_pdata->m_data.clear();
- m_pdata->m_status = ::boost::regex_constants::error_ok;
- static const charT w = 'w';
- static const charT s = 's';
- static const charT l[5] = { 'l', 'o', 'w', 'e', 'r', };
- static const charT u[5] = { 'u', 'p', 'p', 'e', 'r', };
- static const charT a[5] = { 'a', 'l', 'p', 'h', 'a', };
- m_word_mask = m_traits.lookup_classname(&w, &w +1);
- m_mask_space = m_traits.lookup_classname(&s, &s +1);
- m_lower_mask = m_traits.lookup_classname(l, l + 5);
- m_upper_mask = m_traits.lookup_classname(u, u + 5);
- m_alpha_mask = m_traits.lookup_classname(a, a + 5);
- m_pdata->m_word_mask = m_word_mask;
- BOOST_REGEX_ASSERT(m_word_mask != 0);
- BOOST_REGEX_ASSERT(m_mask_space != 0);
- BOOST_REGEX_ASSERT(m_lower_mask != 0);
- BOOST_REGEX_ASSERT(m_upper_mask != 0);
- BOOST_REGEX_ASSERT(m_alpha_mask != 0);
-}
-
-template <class charT, class traits>
-re_syntax_base* basic_regex_creator<charT, traits>::append_state(syntax_element_type t, std::size_t s)
-{
- // if the state is a backref then make a note of it:
- if(t == syntax_element_backref)
- this->m_has_backrefs = true;
- // append a new state, start by aligning our last one:
- m_pdata->m_data.align();
- // set the offset to the next state in our last one:
- if(m_last_state)
- m_last_state->next.i = m_pdata->m_data.size() - getoffset(m_last_state);
- // now actually extend our data:
- m_last_state = static_cast<re_syntax_base*>(m_pdata->m_data.extend(s));
- // fill in boilerplate options in the new state:
- m_last_state->next.i = 0;
- m_last_state->type = t;
- return m_last_state;
-}
-
-template <class charT, class traits>
-re_syntax_base* basic_regex_creator<charT, traits>::insert_state(std::ptrdiff_t pos, syntax_element_type t, std::size_t s)
-{
- // append a new state, start by aligning our last one:
- m_pdata->m_data.align();
- // set the offset to the next state in our last one:
- if(m_last_state)
- m_last_state->next.i = m_pdata->m_data.size() - getoffset(m_last_state);
- // remember the last state position:
- std::ptrdiff_t off = getoffset(m_last_state) + s;
- // now actually insert our data:
- re_syntax_base* new_state = static_cast<re_syntax_base*>(m_pdata->m_data.insert(pos, s));
- // fill in boilerplate options in the new state:
- new_state->next.i = s;
- new_state->type = t;
- m_last_state = getaddress(off);
- return new_state;
-}
-
-template <class charT, class traits>
-re_literal* basic_regex_creator<charT, traits>::append_literal(charT c)
-{
- re_literal* result;
- // start by seeing if we have an existing re_literal we can extend:
- if((0 == m_last_state) || (m_last_state->type != syntax_element_literal))
- {
- // no existing re_literal, create a new one:
- result = static_cast<re_literal*>(append_state(syntax_element_literal, sizeof(re_literal) + sizeof(charT)));
- result->length = 1;
- *static_cast<charT*>(static_cast<void*>(result+1)) = m_traits.translate(c, m_icase);
- }
- else
- {
- // we have an existing re_literal, extend it:
- std::ptrdiff_t off = getoffset(m_last_state);
- m_pdata->m_data.extend(sizeof(charT));
- m_last_state = result = static_cast<re_literal*>(getaddress(off));
- charT* characters = static_cast<charT*>(static_cast<void*>(result+1));
- characters[result->length] = m_traits.translate(c, m_icase);
- result->length += 1;
- }
- return result;
-}
-
-template <class charT, class traits>
-inline re_syntax_base* basic_regex_creator<charT, traits>::append_set(
- const basic_char_set<charT, traits>& char_set)
-{
- typedef mpl::bool_< (sizeof(charT) == 1) > truth_type;
- return char_set.has_digraphs()
- ? append_set(char_set, static_cast<mpl::false_*>(0))
- : append_set(char_set, static_cast<truth_type*>(0));
-}
-
-template <class charT, class traits>
-re_syntax_base* basic_regex_creator<charT, traits>::append_set(
- const basic_char_set<charT, traits>& char_set, mpl::false_*)
-{
- typedef typename traits::string_type string_type;
- typedef typename basic_char_set<charT, traits>::list_iterator item_iterator;
- typedef typename basic_char_set<charT, traits>::set_iterator set_iterator;
- typedef typename traits::char_class_type m_type;
-
- re_set_long<m_type>* result = static_cast<re_set_long<m_type>*>(append_state(syntax_element_long_set, sizeof(re_set_long<m_type>)));
- //
- // fill in the basics:
- //
- result->csingles = static_cast<unsigned int>(::boost::BOOST_REGEX_DETAIL_NS::distance(char_set.singles_begin(), char_set.singles_end()));
- result->cranges = static_cast<unsigned int>(::boost::BOOST_REGEX_DETAIL_NS::distance(char_set.ranges_begin(), char_set.ranges_end())) / 2;
- result->cequivalents = static_cast<unsigned int>(::boost::BOOST_REGEX_DETAIL_NS::distance(char_set.equivalents_begin(), char_set.equivalents_end()));
- result->cclasses = char_set.classes();
- result->cnclasses = char_set.negated_classes();
- if(flags() & regbase::icase)
- {
- // adjust classes as needed:
- if(((result->cclasses & m_lower_mask) == m_lower_mask) || ((result->cclasses & m_upper_mask) == m_upper_mask))
- result->cclasses |= m_alpha_mask;
- if(((result->cnclasses & m_lower_mask) == m_lower_mask) || ((result->cnclasses & m_upper_mask) == m_upper_mask))
- result->cnclasses |= m_alpha_mask;
- }
-
- result->isnot = char_set.is_negated();
- result->singleton = !char_set.has_digraphs();
- //
- // remember where the state is for later:
- //
- std::ptrdiff_t offset = getoffset(result);
- //
- // now extend with all the singles:
- //
- item_iterator first, last;
- set_iterator sfirst, slast;
- sfirst = char_set.singles_begin();
- slast = char_set.singles_end();
- while(sfirst != slast)
- {
- charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (sfirst->first == static_cast<charT>(0) ? 1 : sfirst->second ? 3 : 2)));
- p[0] = m_traits.translate(sfirst->first, m_icase);
- if(sfirst->first == static_cast<charT>(0))
- {
- p[0] = 0;
- }
- else if(sfirst->second)
- {
- p[1] = m_traits.translate(sfirst->second, m_icase);
- p[2] = 0;
- }
- else
- p[1] = 0;
- ++sfirst;
- }
- //
- // now extend with all the ranges:
- //
- first = char_set.ranges_begin();
- last = char_set.ranges_end();
- while(first != last)
- {
- // first grab the endpoints of the range:
- digraph<charT> c1 = *first;
- c1.first = this->m_traits.translate(c1.first, this->m_icase);
- c1.second = this->m_traits.translate(c1.second, this->m_icase);
- ++first;
- digraph<charT> c2 = *first;
- c2.first = this->m_traits.translate(c2.first, this->m_icase);
- c2.second = this->m_traits.translate(c2.second, this->m_icase);
- ++first;
- string_type s1, s2;
- // different actions now depending upon whether collation is turned on:
- if(flags() & regex_constants::collate)
- {
- // we need to transform our range into sort keys:
- charT a1[3] = { c1.first, c1.second, charT(0), };
- charT a2[3] = { c2.first, c2.second, charT(0), };
- s1 = this->m_traits.transform(a1, (a1[1] ? a1+2 : a1+1));
- s2 = this->m_traits.transform(a2, (a2[1] ? a2+2 : a2+1));
- if(s1.empty())
- s1 = string_type(1, charT(0));
- if(s2.empty())
- s2 = string_type(1, charT(0));
- }
- else
- {
- if(c1.second)
- {
- s1.insert(s1.end(), c1.first);
- s1.insert(s1.end(), c1.second);
- }
- else
- s1 = string_type(1, c1.first);
- if(c2.second)
- {
- s2.insert(s2.end(), c2.first);
- s2.insert(s2.end(), c2.second);
- }
- else
- s2.insert(s2.end(), c2.first);
- }
- if(s1 > s2)
- {
- // Oops error:
- return 0;
- }
- charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s1.size() + s2.size() + 2) ) );
- BOOST_REGEX_DETAIL_NS::copy(s1.begin(), s1.end(), p);
- p[s1.size()] = charT(0);
- p += s1.size() + 1;
- BOOST_REGEX_DETAIL_NS::copy(s2.begin(), s2.end(), p);
- p[s2.size()] = charT(0);
- }
- //
- // now process the equivalence classes:
- //
- sfirst = char_set.equivalents_begin();
- slast = char_set.equivalents_end();
- while(sfirst != slast)
- {
- string_type s;
- if(sfirst->second)
- {
- charT cs[3] = { sfirst->first, sfirst->second, charT(0), };
- s = m_traits.transform_primary(cs, cs+2);
- }
- else
- s = m_traits.transform_primary(&sfirst->first, &sfirst->first+1);
- if(s.empty())
- return 0; // invalid or unsupported equivalence class
- charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s.size()+1) ) );
- BOOST_REGEX_DETAIL_NS::copy(s.begin(), s.end(), p);
- p[s.size()] = charT(0);
- ++sfirst;
- }
- //
- // finally reset the address of our last state:
- //
- m_last_state = result = static_cast<re_set_long<m_type>*>(getaddress(offset));
- return result;
-}
-
-template<class T>
-inline bool char_less(T t1, T t2)
-{
- return t1 < t2;
-}
-inline bool char_less(char t1, char t2)
-{
- return static_cast<unsigned char>(t1) < static_cast<unsigned char>(t2);
-}
-inline bool char_less(signed char t1, signed char t2)
-{
- return static_cast<unsigned char>(t1) < static_cast<unsigned char>(t2);
-}
-
-template <class charT, class traits>
-re_syntax_base* basic_regex_creator<charT, traits>::append_set(
- const basic_char_set<charT, traits>& char_set, mpl::true_*)
-{
- typedef typename traits::string_type string_type;
- typedef typename basic_char_set<charT, traits>::list_iterator item_iterator;
- typedef typename basic_char_set<charT, traits>::set_iterator set_iterator;
-
- re_set* result = static_cast<re_set*>(append_state(syntax_element_set, sizeof(re_set)));
- bool negate = char_set.is_negated();
- std::memset(result->_map, 0, sizeof(result->_map));
- //
- // handle singles first:
- //
- item_iterator first, last;
- set_iterator sfirst, slast;
- sfirst = char_set.singles_begin();
- slast = char_set.singles_end();
- while(sfirst != slast)
- {
- for(unsigned int i = 0; i < (1 << CHAR_BIT); ++i)
- {
- if(this->m_traits.translate(static_cast<charT>(i), this->m_icase)
- == this->m_traits.translate(sfirst->first, this->m_icase))
- result->_map[i] = true;
- }
- ++sfirst;
- }
- //
- // OK now handle ranges:
- //
- first = char_set.ranges_begin();
- last = char_set.ranges_end();
- while(first != last)
- {
- // first grab the endpoints of the range:
- charT c1 = this->m_traits.translate(first->first, this->m_icase);
- ++first;
- charT c2 = this->m_traits.translate(first->first, this->m_icase);
- ++first;
- // different actions now depending upon whether collation is turned on:
- if(flags() & regex_constants::collate)
- {
- // we need to transform our range into sort keys:
- charT c3[2] = { c1, charT(0), };
- string_type s1 = this->m_traits.transform(c3, c3+1);
- c3[0] = c2;
- string_type s2 = this->m_traits.transform(c3, c3+1);
- if(s1 > s2)
- {
- // Oops error:
- return 0;
- }
- BOOST_REGEX_ASSERT(c3[1] == charT(0));
- for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
- {
- c3[0] = static_cast<charT>(i);
- string_type s3 = this->m_traits.transform(c3, c3 +1);
- if((s1 <= s3) && (s3 <= s2))
- result->_map[i] = true;
- }
- }
- else
- {
- if(char_less(c2, c1))
- {
- // Oops error:
- return 0;
- }
- // everything in range matches:
- std::memset(result->_map + static_cast<unsigned char>(c1), true, static_cast<unsigned char>(1u) + static_cast<unsigned char>(static_cast<unsigned char>(c2) - static_cast<unsigned char>(c1)));
- }
- }
- //
- // and now the classes:
- //
- typedef typename traits::char_class_type m_type;
- m_type m = char_set.classes();
- if(flags() & regbase::icase)
- {
- // adjust m as needed:
- if(((m & m_lower_mask) == m_lower_mask) || ((m & m_upper_mask) == m_upper_mask))
- m |= m_alpha_mask;
- }
- if(m != 0)
- {
- for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
- {
- if(this->m_traits.isctype(static_cast<charT>(i), m))
- result->_map[i] = true;
- }
- }
- //
- // and now the negated classes:
- //
- m = char_set.negated_classes();
- if(flags() & regbase::icase)
- {
- // adjust m as needed:
- if(((m & m_lower_mask) == m_lower_mask) || ((m & m_upper_mask) == m_upper_mask))
- m |= m_alpha_mask;
- }
- if(m != 0)
- {
- for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
- {
- if(0 == this->m_traits.isctype(static_cast<charT>(i), m))
- result->_map[i] = true;
- }
- }
- //
- // now process the equivalence classes:
- //
- sfirst = char_set.equivalents_begin();
- slast = char_set.equivalents_end();
- while(sfirst != slast)
- {
- string_type s;
- BOOST_REGEX_ASSERT(static_cast<charT>(0) == sfirst->second);
- s = m_traits.transform_primary(&sfirst->first, &sfirst->first+1);
- if(s.empty())
- return 0; // invalid or unsupported equivalence class
- for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
- {
- charT c[2] = { (static_cast<charT>(i)), charT(0), };
- string_type s2 = this->m_traits.transform_primary(c, c+1);
- if(s == s2)
- result->_map[i] = true;
- }
- ++sfirst;
- }
- if(negate)
- {
- for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
- {
- result->_map[i] = !(result->_map[i]);
- }
- }
- return result;
-}
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::finalize(const charT* p1, const charT* p2)
-{
- if(this->m_pdata->m_status)
- return;
- // we've added all the states we need, now finish things off.
- // start by adding a terminating state:
- append_state(syntax_element_match);
- // extend storage to store original expression:
- std::ptrdiff_t len = p2 - p1;
- m_pdata->m_expression_len = len;
- charT* ps = static_cast<charT*>(m_pdata->m_data.extend(sizeof(charT) * (1 + (p2 - p1))));
- m_pdata->m_expression = ps;
- BOOST_REGEX_DETAIL_NS::copy(p1, p2, ps);
- ps[p2 - p1] = 0;
- // fill in our other data...
- // successful parsing implies a zero status:
- m_pdata->m_status = 0;
- // get the first state of the machine:
- m_pdata->m_first_state = static_cast<re_syntax_base*>(m_pdata->m_data.data());
- // fixup pointers in the machine:
- fixup_pointers(m_pdata->m_first_state);
- if(m_has_recursions)
- {
- m_pdata->m_has_recursions = true;
- fixup_recursions(m_pdata->m_first_state);
- if(this->m_pdata->m_status)
- return;
- }
- else
- m_pdata->m_has_recursions = false;
- // create nested startmaps:
- create_startmaps(m_pdata->m_first_state);
- // create main startmap:
- std::memset(m_pdata->m_startmap, 0, sizeof(m_pdata->m_startmap));
- m_pdata->m_can_be_null = 0;
-
- m_bad_repeats = 0;
- if(m_has_recursions)
- m_recursion_checks.assign(1 + m_pdata->m_mark_count, 0u);
- create_startmap(m_pdata->m_first_state, m_pdata->m_startmap, &(m_pdata->m_can_be_null), mask_all);
- // get the restart type:
- m_pdata->m_restart_type = get_restart_type(m_pdata->m_first_state);
- // optimise a leading repeat if there is one:
- probe_leading_repeat(m_pdata->m_first_state);
-}
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::fixup_pointers(re_syntax_base* state)
-{
- while(state)
- {
- switch(state->type)
- {
- case syntax_element_recurse:
- m_has_recursions = true;
- if(state->next.i)
- state->next.p = getaddress(state->next.i, state);
- else
- state->next.p = 0;
- break;
- case syntax_element_rep:
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_long_set_rep:
- // set the state_id of this repeat:
- static_cast<re_repeat*>(state)->state_id = m_repeater_id++;
- BOOST_FALLTHROUGH;
- case syntax_element_alt:
- std::memset(static_cast<re_alt*>(state)->_map, 0, sizeof(static_cast<re_alt*>(state)->_map));
- static_cast<re_alt*>(state)->can_be_null = 0;
- BOOST_FALLTHROUGH;
- case syntax_element_jump:
- static_cast<re_jump*>(state)->alt.p = getaddress(static_cast<re_jump*>(state)->alt.i, state);
- BOOST_FALLTHROUGH;
- default:
- if(state->next.i)
- state->next.p = getaddress(state->next.i, state);
- else
- state->next.p = 0;
- }
- state = state->next.p;
- }
-}
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::fixup_recursions(re_syntax_base* state)
-{
- re_syntax_base* base = state;
- while(state)
- {
- switch(state->type)
- {
- case syntax_element_assert_backref:
- {
- // just check that the index is valid:
- int idx = static_cast<const re_brace*>(state)->index;
- if(idx < 0)
- {
- idx = -idx-1;
- if(idx >= hash_value_mask)
- {
- idx = m_pdata->get_id(idx);
- if(idx <= 0)
- {
- // check of sub-expression that doesn't exist:
- if(0 == this->m_pdata->m_status) // update the error code if not already set
- this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
- //
- // clear the expression, we should be empty:
- //
- this->m_pdata->m_expression = 0;
- this->m_pdata->m_expression_len = 0;
- //
- // and throw if required:
- //
- if(0 == (this->flags() & regex_constants::no_except))
- {
- std::string message = "Encountered a forward reference to a marked sub-expression that does not exist.";
- boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
- e.raise();
- }
- }
- }
- }
- }
- break;
- case syntax_element_recurse:
- {
- bool ok = false;
- re_syntax_base* p = base;
- std::ptrdiff_t idx = static_cast<re_jump*>(state)->alt.i;
- if(idx >= hash_value_mask)
- {
- //
- // There may be more than one capture group with this hash, just do what Perl
- // does and recurse to the leftmost:
- //
- idx = m_pdata->get_id(static_cast<int>(idx));
- }
- if(idx < 0)
- {
- ok = false;
- }
- else
- {
- while(p)
- {
- if((p->type == syntax_element_startmark) && (static_cast<re_brace*>(p)->index == idx))
- {
- //
- // We've found the target of the recursion, set the jump target:
- //
- static_cast<re_jump*>(state)->alt.p = p;
- ok = true;
- //
- // Now scan the target for nested repeats:
- //
- p = p->next.p;
- int next_rep_id = 0;
- while(p)
- {
- switch(p->type)
- {
- case syntax_element_rep:
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_long_set_rep:
- next_rep_id = static_cast<re_repeat*>(p)->state_id;
- break;
- case syntax_element_endmark:
- if(static_cast<const re_brace*>(p)->index == idx)
- next_rep_id = -1;
- break;
- default:
- break;
- }
- if(next_rep_id)
- break;
- p = p->next.p;
- }
- if(next_rep_id > 0)
- {
- static_cast<re_recurse*>(state)->state_id = next_rep_id - 1;
- }
-
- break;
- }
- p = p->next.p;
- }
- }
- if(!ok)
- {
- // recursion to sub-expression that doesn't exist:
- if(0 == this->m_pdata->m_status) // update the error code if not already set
- this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
- //
- // clear the expression, we should be empty:
- //
- this->m_pdata->m_expression = 0;
- this->m_pdata->m_expression_len = 0;
- //
- // and throw if required:
- //
- if(0 == (this->flags() & regex_constants::no_except))
- {
- std::string message = "Encountered a forward reference to a recursive sub-expression that does not exist.";
- boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
- e.raise();
- }
- }
- }
- break;
- default:
- break;
- }
- state = state->next.p;
- }
-}
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::create_startmaps(re_syntax_base* state)
-{
- // non-recursive implementation:
- // create the last map in the machine first, so that earlier maps
- // can make use of the result...
- //
- // This was originally a recursive implementation, but that caused stack
- // overflows with complex expressions on small stacks (think COM+).
-
- // start by saving the case setting:
- bool l_icase = m_icase;
- std::vector<std::pair<bool, re_syntax_base*> > v;
-
- while(state)
- {
- switch(state->type)
- {
- case syntax_element_toggle_case:
- // we need to track case changes here:
- m_icase = static_cast<re_case*>(state)->icase;
- state = state->next.p;
- continue;
- case syntax_element_alt:
- case syntax_element_rep:
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_long_set_rep:
- // just push the state onto our stack for now:
- v.push_back(std::pair<bool, re_syntax_base*>(m_icase, state));
- state = state->next.p;
- break;
- case syntax_element_backstep:
- // we need to calculate how big the backstep is:
- static_cast<re_brace*>(state)->index
- = this->calculate_backstep(state->next.p);
- if(static_cast<re_brace*>(state)->index < 0)
- {
- // Oops error:
- if(0 == this->m_pdata->m_status) // update the error code if not already set
- this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
- //
- // clear the expression, we should be empty:
- //
- this->m_pdata->m_expression = 0;
- this->m_pdata->m_expression_len = 0;
- //
- // and throw if required:
- //
- if(0 == (this->flags() & regex_constants::no_except))
- {
- std::string message = "Invalid lookbehind assertion encountered in the regular expression.";
- boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
- e.raise();
- }
- }
- BOOST_FALLTHROUGH;
- default:
- state = state->next.p;
- }
- }
-
- // now work through our list, building all the maps as we go:
- while(!v.empty())
- {
- // Initialize m_recursion_checks if we need it:
- if(m_has_recursions)
- m_recursion_checks.assign(1 + m_pdata->m_mark_count, 0u);
-
- const std::pair<bool, re_syntax_base*>& p = v.back();
- m_icase = p.first;
- state = p.second;
- v.pop_back();
-
- // Build maps:
- m_bad_repeats = 0;
- create_startmap(state->next.p, static_cast<re_alt*>(state)->_map, &static_cast<re_alt*>(state)->can_be_null, mask_take);
- m_bad_repeats = 0;
-
- if(m_has_recursions)
- m_recursion_checks.assign(1 + m_pdata->m_mark_count, 0u);
- create_startmap(static_cast<re_alt*>(state)->alt.p, static_cast<re_alt*>(state)->_map, &static_cast<re_alt*>(state)->can_be_null, mask_skip);
- // adjust the type of the state to allow for faster matching:
- state->type = this->get_repeat_type(state);
- }
- // restore case sensitivity:
- m_icase = l_icase;
-}
-
-template <class charT, class traits>
-int basic_regex_creator<charT, traits>::calculate_backstep(re_syntax_base* state)
-{
- typedef typename traits::char_class_type m_type;
- int result = 0;
- while(state)
- {
- switch(state->type)
- {
- case syntax_element_startmark:
- if((static_cast<re_brace*>(state)->index == -1)
- || (static_cast<re_brace*>(state)->index == -2))
- {
- state = static_cast<re_jump*>(state->next.p)->alt.p->next.p;
- continue;
- }
- else if(static_cast<re_brace*>(state)->index == -3)
- {
- state = state->next.p->next.p;
- continue;
- }
- break;
- case syntax_element_endmark:
- if((static_cast<re_brace*>(state)->index == -1)
- || (static_cast<re_brace*>(state)->index == -2))
- return result;
- break;
- case syntax_element_literal:
- result += static_cast<re_literal*>(state)->length;
- break;
- case syntax_element_wild:
- case syntax_element_set:
- result += 1;
- break;
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_backref:
- case syntax_element_rep:
- case syntax_element_combining:
- case syntax_element_long_set_rep:
- case syntax_element_backstep:
- {
- re_repeat* rep = static_cast<re_repeat *>(state);
- // adjust the type of the state to allow for faster matching:
- state->type = this->get_repeat_type(state);
- if((state->type == syntax_element_dot_rep)
- || (state->type == syntax_element_char_rep)
- || (state->type == syntax_element_short_set_rep))
- {
- if(rep->max != rep->min)
- return -1;
- result += static_cast<int>(rep->min);
- state = rep->alt.p;
- continue;
- }
- else if(state->type == syntax_element_long_set_rep)
- {
- BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_long_set);
- if(static_cast<re_set_long<m_type>*>(rep->next.p)->singleton == 0)
- return -1;
- if(rep->max != rep->min)
- return -1;
- result += static_cast<int>(rep->min);
- state = rep->alt.p;
- continue;
- }
- }
- return -1;
- case syntax_element_long_set:
- if(static_cast<re_set_long<m_type>*>(state)->singleton == 0)
- return -1;
- result += 1;
- break;
- case syntax_element_jump:
- state = static_cast<re_jump*>(state)->alt.p;
- continue;
- case syntax_element_alt:
- {
- int r1 = calculate_backstep(state->next.p);
- int r2 = calculate_backstep(static_cast<re_alt*>(state)->alt.p);
- if((r1 < 0) || (r1 != r2))
- return -1;
- return result + r1;
- }
- default:
- break;
- }
- state = state->next.p;
- }
- return -1;
-}
-
-struct recursion_saver
-{
- std::vector<unsigned char> saved_state;
- std::vector<unsigned char>* state;
- recursion_saver(std::vector<unsigned char>* p) : saved_state(*p), state(p) {}
- ~recursion_saver()
- {
- state->swap(saved_state);
- }
-};
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::create_startmap(re_syntax_base* state, unsigned char* l_map, unsigned int* pnull, unsigned char mask)
-{
- recursion_saver saved_recursions(&m_recursion_checks);
- int not_last_jump = 1;
- re_syntax_base* recursion_start = 0;
- int recursion_sub = 0;
- re_syntax_base* recursion_restart = 0;
-
- // track case sensitivity:
- bool l_icase = m_icase;
-
- while(state)
- {
- switch(state->type)
- {
- case syntax_element_toggle_case:
- l_icase = static_cast<re_case*>(state)->icase;
- state = state->next.p;
- break;
- case syntax_element_literal:
- {
- // don't set anything in *pnull, set each element in l_map
- // that could match the first character in the literal:
- if(l_map)
- {
- l_map[0] |= mask_init;
- charT first_char = *static_cast<charT*>(static_cast<void*>(static_cast<re_literal*>(state) + 1));
- for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
- {
- if(m_traits.translate(static_cast<charT>(i), l_icase) == first_char)
- l_map[i] |= mask;
- }
- }
- return;
- }
- case syntax_element_end_line:
- {
- // next character must be a line separator (if there is one):
- if(l_map)
- {
- l_map[0] |= mask_init;
- l_map[static_cast<unsigned>('\n')] |= mask;
- l_map[static_cast<unsigned>('\r')] |= mask;
- l_map[static_cast<unsigned>('\f')] |= mask;
- l_map[0x85] |= mask;
- }
- // now figure out if we can match a NULL string at this point:
- if(pnull)
- create_startmap(state->next.p, 0, pnull, mask);
- return;
- }
- case syntax_element_recurse:
- {
- BOOST_REGEX_ASSERT(static_cast<const re_jump*>(state)->alt.p->type == syntax_element_startmark);
- recursion_sub = static_cast<re_brace*>(static_cast<const re_jump*>(state)->alt.p)->index;
- if(m_recursion_checks[recursion_sub] & 1u)
- {
- // Infinite recursion!!
- if(0 == this->m_pdata->m_status) // update the error code if not already set
- this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
- //
- // clear the expression, we should be empty:
- //
- this->m_pdata->m_expression = 0;
- this->m_pdata->m_expression_len = 0;
- //
- // and throw if required:
- //
- if(0 == (this->flags() & regex_constants::no_except))
- {
- std::string message = "Encountered an infinite recursion.";
- boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
- e.raise();
- }
- }
- else if(recursion_start == 0)
- {
- recursion_start = state;
- recursion_restart = state->next.p;
- state = static_cast<re_jump*>(state)->alt.p;
- m_recursion_checks[recursion_sub] |= 1u;
- break;
- }
- m_recursion_checks[recursion_sub] |= 1u;
- // can't handle nested recursion here...
- BOOST_FALLTHROUGH;
- }
- case syntax_element_backref:
- // can be null, and any character can match:
- if(pnull)
- *pnull |= mask;
- BOOST_FALLTHROUGH;
- case syntax_element_wild:
- {
- // can't be null, any character can match:
- set_all_masks(l_map, mask);
- return;
- }
- case syntax_element_accept:
- case syntax_element_match:
- {
- // must be null, any character can match:
- set_all_masks(l_map, mask);
- if(pnull)
- *pnull |= mask;
- return;
- }
- case syntax_element_word_start:
- {
- // recurse, then AND with all the word characters:
- create_startmap(state->next.p, l_map, pnull, mask);
- if(l_map)
- {
- l_map[0] |= mask_init;
- for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
- {
- if(!m_traits.isctype(static_cast<charT>(i), m_word_mask))
- l_map[i] &= static_cast<unsigned char>(~mask);
- }
- }
- return;
- }
- case syntax_element_word_end:
- {
- // recurse, then AND with all the word characters:
- create_startmap(state->next.p, l_map, pnull, mask);
- if(l_map)
- {
- l_map[0] |= mask_init;
- for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
- {
- if(m_traits.isctype(static_cast<charT>(i), m_word_mask))
- l_map[i] &= static_cast<unsigned char>(~mask);
- }
- }
- return;
- }
- case syntax_element_buffer_end:
- {
- // we *must be null* :
- if(pnull)
- *pnull |= mask;
- return;
- }
- case syntax_element_long_set:
- if(l_map)
- {
- typedef typename traits::char_class_type m_type;
- if(static_cast<re_set_long<m_type>*>(state)->singleton)
- {
- l_map[0] |= mask_init;
- for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
- {
- charT c = static_cast<charT>(i);
- if(&c != re_is_set_member(&c, &c + 1, static_cast<re_set_long<m_type>*>(state), *m_pdata, l_icase))
- l_map[i] |= mask;
- }
- }
- else
- set_all_masks(l_map, mask);
- }
- return;
- case syntax_element_set:
- if(l_map)
- {
- l_map[0] |= mask_init;
- for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
- {
- if(static_cast<re_set*>(state)->_map[
- static_cast<unsigned char>(m_traits.translate(static_cast<charT>(i), l_icase))])
- l_map[i] |= mask;
- }
- }
- return;
- case syntax_element_jump:
- // take the jump:
- state = static_cast<re_alt*>(state)->alt.p;
- not_last_jump = -1;
- break;
- case syntax_element_alt:
- case syntax_element_rep:
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_long_set_rep:
- {
- re_alt* rep = static_cast<re_alt*>(state);
- if(rep->_map[0] & mask_init)
- {
- if(l_map)
- {
- // copy previous results:
- l_map[0] |= mask_init;
- for(unsigned int i = 0; i <= UCHAR_MAX; ++i)
- {
- if(rep->_map[i] & mask_any)
- l_map[i] |= mask;
- }
- }
- if(pnull)
- {
- if(rep->can_be_null & mask_any)
- *pnull |= mask;
- }
- }
- else
- {
- // we haven't created a startmap for this alternative yet
- // so take the union of the two options:
- if(is_bad_repeat(state))
- {
- set_all_masks(l_map, mask);
- if(pnull)
- *pnull |= mask;
- return;
- }
- set_bad_repeat(state);
- create_startmap(state->next.p, l_map, pnull, mask);
- if((state->type == syntax_element_alt)
- || (static_cast<re_repeat*>(state)->min == 0)
- || (not_last_jump == 0))
- create_startmap(rep->alt.p, l_map, pnull, mask);
- }
- }
- return;
- case syntax_element_soft_buffer_end:
- // match newline or null:
- if(l_map)
- {
- l_map[0] |= mask_init;
- l_map[static_cast<unsigned>('\n')] |= mask;
- l_map[static_cast<unsigned>('\r')] |= mask;
- }
- if(pnull)
- *pnull |= mask;
- return;
- case syntax_element_endmark:
- // need to handle independent subs as a special case:
- if(static_cast<re_brace*>(state)->index < 0)
- {
- // can be null, any character can match:
- set_all_masks(l_map, mask);
- if(pnull)
- *pnull |= mask;
- return;
- }
- else if(recursion_start && (recursion_sub != 0) && (recursion_sub == static_cast<re_brace*>(state)->index))
- {
- // recursion termination:
- recursion_start = 0;
- state = recursion_restart;
- break;
- }
-
- //
- // Normally we just go to the next state... but if this sub-expression is
- // the target of a recursion, then we might be ending a recursion, in which
- // case we should check whatever follows that recursion, as well as whatever
- // follows this state:
- //
- if(m_pdata->m_has_recursions && static_cast<re_brace*>(state)->index)
- {
- bool ok = false;
- re_syntax_base* p = m_pdata->m_first_state;
- while(p)
- {
- if(p->type == syntax_element_recurse)
- {
- re_brace* p2 = static_cast<re_brace*>(static_cast<re_jump*>(p)->alt.p);
- if((p2->type == syntax_element_startmark) && (p2->index == static_cast<re_brace*>(state)->index))
- {
- ok = true;
- break;
- }
- }
- p = p->next.p;
- }
- if(ok && ((m_recursion_checks[static_cast<re_brace*>(state)->index] & 2u) == 0))
- {
- m_recursion_checks[static_cast<re_brace*>(state)->index] |= 2u;
- create_startmap(p->next.p, l_map, pnull, mask);
- }
- }
- state = state->next.p;
- break;
-
- case syntax_element_commit:
- set_all_masks(l_map, mask);
- // Continue scanning so we can figure out whether we can be null:
- state = state->next.p;
- break;
- case syntax_element_startmark:
- // need to handle independent subs as a special case:
- if(static_cast<re_brace*>(state)->index == -3)
- {
- state = state->next.p->next.p;
- break;
- }
- BOOST_FALLTHROUGH;
- default:
- state = state->next.p;
- }
- ++not_last_jump;
- }
-}
-
-template <class charT, class traits>
-unsigned basic_regex_creator<charT, traits>::get_restart_type(re_syntax_base* state)
-{
- //
- // find out how the machine starts, so we can optimise the search:
- //
- while(state)
- {
- switch(state->type)
- {
- case syntax_element_startmark:
- case syntax_element_endmark:
- state = state->next.p;
- continue;
- case syntax_element_start_line:
- return regbase::restart_line;
- case syntax_element_word_start:
- return regbase::restart_word;
- case syntax_element_buffer_start:
- return regbase::restart_buf;
- case syntax_element_restart_continue:
- return regbase::restart_continue;
- default:
- state = 0;
- continue;
- }
- }
- return regbase::restart_any;
-}
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::set_all_masks(unsigned char* bits, unsigned char mask)
-{
- //
- // set mask in all of bits elements,
- // if bits[0] has mask_init not set then we can
- // optimise this to a call to memset:
- //
- if(bits)
- {
- if(bits[0] == 0)
- (std::memset)(bits, mask, 1u << CHAR_BIT);
- else
- {
- for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
- bits[i] |= mask;
- }
- bits[0] |= mask_init;
- }
-}
-
-template <class charT, class traits>
-bool basic_regex_creator<charT, traits>::is_bad_repeat(re_syntax_base* pt)
-{
- switch(pt->type)
- {
- case syntax_element_rep:
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_long_set_rep:
- {
- unsigned state_id = static_cast<re_repeat*>(pt)->state_id;
- if(state_id >= sizeof(m_bad_repeats) * CHAR_BIT)
- return true; // run out of bits, assume we can't traverse this one.
- static const boost::uintmax_t one = 1uL;
- return m_bad_repeats & (one << state_id);
- }
- default:
- return false;
- }
-}
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::set_bad_repeat(re_syntax_base* pt)
-{
- switch(pt->type)
- {
- case syntax_element_rep:
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_long_set_rep:
- {
- unsigned state_id = static_cast<re_repeat*>(pt)->state_id;
- static const boost::uintmax_t one = 1uL;
- if(state_id <= sizeof(m_bad_repeats) * CHAR_BIT)
- m_bad_repeats |= (one << state_id);
- }
- break;
- default:
- break;
- }
-}
-
-template <class charT, class traits>
-syntax_element_type basic_regex_creator<charT, traits>::get_repeat_type(re_syntax_base* state)
-{
- typedef typename traits::char_class_type m_type;
- if(state->type == syntax_element_rep)
- {
- // check to see if we are repeating a single state:
- if(state->next.p->next.p->next.p == static_cast<re_alt*>(state)->alt.p)
- {
- switch(state->next.p->type)
- {
- case BOOST_REGEX_DETAIL_NS::syntax_element_wild:
- return BOOST_REGEX_DETAIL_NS::syntax_element_dot_rep;
- case BOOST_REGEX_DETAIL_NS::syntax_element_literal:
- return BOOST_REGEX_DETAIL_NS::syntax_element_char_rep;
- case BOOST_REGEX_DETAIL_NS::syntax_element_set:
- return BOOST_REGEX_DETAIL_NS::syntax_element_short_set_rep;
- case BOOST_REGEX_DETAIL_NS::syntax_element_long_set:
- if(static_cast<BOOST_REGEX_DETAIL_NS::re_set_long<m_type>*>(state->next.p)->singleton)
- return BOOST_REGEX_DETAIL_NS::syntax_element_long_set_rep;
- break;
- default:
- break;
- }
- }
- }
- return state->type;
-}
-
-template <class charT, class traits>
-void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* state)
-{
- // enumerate our states, and see if we have a leading repeat
- // for which failed search restarts can be optimized;
- do
- {
- switch(state->type)
- {
- case syntax_element_startmark:
- if(static_cast<re_brace*>(state)->index >= 0)
- {
- state = state->next.p;
- continue;
- }
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#pragma warning(disable:6011)
-#endif
- if((static_cast<re_brace*>(state)->index == -1)
- || (static_cast<re_brace*>(state)->index == -2))
- {
- // skip past the zero width assertion:
- state = static_cast<const re_jump*>(state->next.p)->alt.p->next.p;
- continue;
- }
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
- if(static_cast<re_brace*>(state)->index == -3)
- {
- // Have to skip the leading jump state:
- state = state->next.p->next.p;
- continue;
- }
- return;
- case syntax_element_endmark:
- case syntax_element_start_line:
- case syntax_element_end_line:
- case syntax_element_word_boundary:
- case syntax_element_within_word:
- case syntax_element_word_start:
- case syntax_element_word_end:
- case syntax_element_buffer_start:
- case syntax_element_buffer_end:
- case syntax_element_restart_continue:
- state = state->next.p;
- break;
- case syntax_element_dot_rep:
- case syntax_element_char_rep:
- case syntax_element_short_set_rep:
- case syntax_element_long_set_rep:
- if(this->m_has_backrefs == 0)
- static_cast<re_repeat*>(state)->leading = true;
- BOOST_FALLTHROUGH;
- default:
- return;
- }
- }while(state);
-}
-
-} // namespace BOOST_REGEX_DETAIL_NS
-
-} // namespace boost
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_parser.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_parser.hpp
deleted file mode 100644
index 1b7121f057..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/basic_regex_parser.hpp
+++ /dev/null
@@ -1,3174 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE basic_regex_parser.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares template class basic_regex_parser.
- */
-
-#ifndef BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
-#define BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable: 26812)
-#endif
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4244)
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-inline boost::intmax_t umax(mpl::false_ const&)
-{
- // Get out clause here, just in case numeric_limits is unspecialized:
- return std::numeric_limits<boost::intmax_t>::is_specialized ? (std::numeric_limits<boost::intmax_t>::max)() : INT_MAX;
-}
-inline boost::intmax_t umax(mpl::true_ const&)
-{
- return (std::numeric_limits<std::size_t>::max)();
-}
-
-inline boost::intmax_t umax()
-{
- return umax(mpl::bool_<std::numeric_limits<boost::intmax_t>::digits >= std::numeric_limits<std::size_t>::digits>());
-}
-
-template <class charT, class traits>
-class basic_regex_parser : public basic_regex_creator<charT, traits>
-{
-public:
- basic_regex_parser(regex_data<charT, traits>* data);
- void parse(const charT* p1, const charT* p2, unsigned flags);
- void fail(regex_constants::error_type error_code, std::ptrdiff_t position);
- void fail(regex_constants::error_type error_code, std::ptrdiff_t position, std::string message, std::ptrdiff_t start_pos);
- void fail(regex_constants::error_type error_code, std::ptrdiff_t position, const std::string& message)
- {
- fail(error_code, position, message, position);
- }
-
- bool parse_all();
- bool parse_basic();
- bool parse_extended();
- bool parse_literal();
- bool parse_open_paren();
- bool parse_basic_escape();
- bool parse_extended_escape();
- bool parse_match_any();
- bool parse_repeat(std::size_t low = 0, std::size_t high = (std::numeric_limits<std::size_t>::max)());
- bool parse_repeat_range(bool isbasic);
- bool parse_alt();
- bool parse_set();
- bool parse_backref();
- void parse_set_literal(basic_char_set<charT, traits>& char_set);
- bool parse_inner_set(basic_char_set<charT, traits>& char_set);
- bool parse_QE();
- bool parse_perl_extension();
- bool parse_perl_verb();
- bool match_verb(const char*);
- bool add_emacs_code(bool negate);
- bool unwind_alts(std::ptrdiff_t last_paren_start);
- digraph<charT> get_next_set_literal(basic_char_set<charT, traits>& char_set);
- charT unescape_character();
- regex_constants::syntax_option_type parse_options();
-
-private:
- typedef bool (basic_regex_parser::*parser_proc_type)();
- typedef typename traits::string_type string_type;
- typedef typename traits::char_class_type char_class_type;
- parser_proc_type m_parser_proc; // the main parser to use
- const charT* m_base; // the start of the string being parsed
- const charT* m_end; // the end of the string being parsed
- const charT* m_position; // our current parser position
- unsigned m_mark_count; // how many sub-expressions we have
- int m_mark_reset; // used to indicate that we're inside a (?|...) block.
- unsigned m_max_mark; // largest mark count seen inside a (?|...) block.
- std::ptrdiff_t m_paren_start; // where the last seen ')' began (where repeats are inserted).
- std::ptrdiff_t m_alt_insert_point; // where to insert the next alternative
- bool m_has_case_change; // true if somewhere in the current block the case has changed
- unsigned m_recursion_count; // How many times we've called parse_all.
-#if defined(BOOST_MSVC) && defined(_M_IX86)
- // This is an ugly warning suppression workaround (for warnings *inside* std::vector
- // that can not otherwise be suppressed)...
- BOOST_STATIC_ASSERT(sizeof(long) >= sizeof(void*));
- std::vector<long> m_alt_jumps; // list of alternative in the current scope.
-#else
- std::vector<std::ptrdiff_t> m_alt_jumps; // list of alternative in the current scope.
-#endif
-
- basic_regex_parser& operator=(const basic_regex_parser&);
- basic_regex_parser(const basic_regex_parser&);
-};
-
-template <class charT, class traits>
-basic_regex_parser<charT, traits>::basic_regex_parser(regex_data<charT, traits>* data)
- : basic_regex_creator<charT, traits>(data), m_parser_proc(), m_base(0), m_end(0), m_position(0),
- m_mark_count(0), m_mark_reset(-1), m_max_mark(0), m_paren_start(0), m_alt_insert_point(0), m_has_case_change(false), m_recursion_count(0)
-{
-}
-
-template <class charT, class traits>
-void basic_regex_parser<charT, traits>::parse(const charT* p1, const charT* p2, unsigned l_flags)
-{
- // pass l_flags on to base class:
- this->init(l_flags);
- // set up pointers:
- m_position = m_base = p1;
- m_end = p2;
- // empty strings are errors:
- if((p1 == p2) &&
- (
- ((l_flags & regbase::main_option_type) != regbase::perl_syntax_group)
- || (l_flags & regbase::no_empty_expressions)
- )
- )
- {
- fail(regex_constants::error_empty, 0);
- return;
- }
- // select which parser to use:
- switch(l_flags & regbase::main_option_type)
- {
- case regbase::perl_syntax_group:
- {
- m_parser_proc = &basic_regex_parser<charT, traits>::parse_extended;
- //
- // Add a leading paren with index zero to give recursions a target:
- //
- re_brace* br = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
- br->index = 0;
- br->icase = this->flags() & regbase::icase;
- break;
- }
- case regbase::basic_syntax_group:
- m_parser_proc = &basic_regex_parser<charT, traits>::parse_basic;
- break;
- case regbase::literal:
- m_parser_proc = &basic_regex_parser<charT, traits>::parse_literal;
- break;
- default:
- // Oops, someone has managed to set more than one of the main option flags,
- // so this must be an error:
- fail(regex_constants::error_unknown, 0, "An invalid combination of regular expression syntax flags was used.");
- return;
- }
-
- // parse all our characters:
- bool result = parse_all();
- //
- // Unwind our alternatives:
- //
- unwind_alts(-1);
- // reset l_flags as a global scope (?imsx) may have altered them:
- this->flags(l_flags);
- // if we haven't gobbled up all the characters then we must
- // have had an unexpected ')' :
- if(!result)
- {
- fail(regex_constants::error_paren, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_position), "Found a closing ) with no corresponding opening parenthesis.");
- return;
- }
- // if an error has been set then give up now:
- if(this->m_pdata->m_status)
- return;
- // fill in our sub-expression count:
- this->m_pdata->m_mark_count = 1u + (std::size_t)m_mark_count;
- this->finalize(p1, p2);
-}
-
-template <class charT, class traits>
-void basic_regex_parser<charT, traits>::fail(regex_constants::error_type error_code, std::ptrdiff_t position)
-{
- // get the error message:
- std::string message = this->m_pdata->m_ptraits->error_string(error_code);
- fail(error_code, position, message);
-}
-
-template <class charT, class traits>
-void basic_regex_parser<charT, traits>::fail(regex_constants::error_type error_code, std::ptrdiff_t position, std::string message, std::ptrdiff_t start_pos)
-{
- if(0 == this->m_pdata->m_status) // update the error code if not already set
- this->m_pdata->m_status = error_code;
- m_position = m_end; // don't bother parsing anything else
-
-#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
- //
- // Augment error message with the regular expression text:
- //
- if(start_pos == position)
- start_pos = (std::max)(static_cast<std::ptrdiff_t>(0), position - static_cast<std::ptrdiff_t>(10));
- std::ptrdiff_t end_pos = (std::min)(position + static_cast<std::ptrdiff_t>(10), static_cast<std::ptrdiff_t>(m_end - m_base));
- if(error_code != regex_constants::error_empty)
- {
- if((start_pos != 0) || (end_pos != (m_end - m_base)))
- message += " The error occurred while parsing the regular expression fragment: '";
- else
- message += " The error occurred while parsing the regular expression: '";
- if(start_pos != end_pos)
- {
- message += std::string(m_base + start_pos, m_base + position);
- message += ">>>HERE>>>";
- message += std::string(m_base + position, m_base + end_pos);
- }
- message += "'.";
- }
-#endif
-
-#ifndef BOOST_NO_EXCEPTIONS
- if(0 == (this->flags() & regex_constants::no_except))
- {
- boost::regex_error e(message, error_code, position);
- e.raise();
- }
-#else
- (void)position; // suppress warnings.
-#endif
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_all()
-{
- if (++m_recursion_count > 400)
- {
- // exceeded internal limits
- fail(boost::regex_constants::error_complexity, m_position - m_base, "Exceeded nested brace limit.");
- }
- bool result = true;
- while(result && (m_position != m_end))
- {
- result = (this->*m_parser_proc)();
- }
- --m_recursion_count;
- return result;
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4702)
-#endif
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_basic()
-{
- switch(this->m_traits.syntax_type(*m_position))
- {
- case regex_constants::syntax_escape:
- return parse_basic_escape();
- case regex_constants::syntax_dot:
- return parse_match_any();
- case regex_constants::syntax_caret:
- ++m_position;
- this->append_state(syntax_element_start_line);
- break;
- case regex_constants::syntax_dollar:
- ++m_position;
- this->append_state(syntax_element_end_line);
- break;
- case regex_constants::syntax_star:
- if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line))
- return parse_literal();
- else
- {
- ++m_position;
- return parse_repeat();
- }
- case regex_constants::syntax_plus:
- if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line) || !(this->flags() & regbase::emacs_ex))
- return parse_literal();
- else
- {
- ++m_position;
- return parse_repeat(1);
- }
- case regex_constants::syntax_question:
- if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line) || !(this->flags() & regbase::emacs_ex))
- return parse_literal();
- else
- {
- ++m_position;
- return parse_repeat(0, 1);
- }
- case regex_constants::syntax_open_set:
- return parse_set();
- case regex_constants::syntax_newline:
- if(this->flags() & regbase::newline_alt)
- return parse_alt();
- else
- return parse_literal();
- default:
- return parse_literal();
- }
- return true;
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable:26812)
-#endif
-#endif
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_extended()
-{
- bool result = true;
- switch(this->m_traits.syntax_type(*m_position))
- {
- case regex_constants::syntax_open_mark:
- return parse_open_paren();
- case regex_constants::syntax_close_mark:
- return false;
- case regex_constants::syntax_escape:
- return parse_extended_escape();
- case regex_constants::syntax_dot:
- return parse_match_any();
- case regex_constants::syntax_caret:
- ++m_position;
- this->append_state(
- (this->flags() & regex_constants::no_mod_m ? syntax_element_buffer_start : syntax_element_start_line));
- break;
- case regex_constants::syntax_dollar:
- ++m_position;
- this->append_state(
- (this->flags() & regex_constants::no_mod_m ? syntax_element_buffer_end : syntax_element_end_line));
- break;
- case regex_constants::syntax_star:
- if(m_position == this->m_base)
- {
- fail(regex_constants::error_badrepeat, 0, "The repeat operator \"*\" cannot start a regular expression.");
- return false;
- }
- ++m_position;
- return parse_repeat();
- case regex_constants::syntax_question:
- if(m_position == this->m_base)
- {
- fail(regex_constants::error_badrepeat, 0, "The repeat operator \"?\" cannot start a regular expression.");
- return false;
- }
- ++m_position;
- return parse_repeat(0,1);
- case regex_constants::syntax_plus:
- if(m_position == this->m_base)
- {
- fail(regex_constants::error_badrepeat, 0, "The repeat operator \"+\" cannot start a regular expression.");
- return false;
- }
- ++m_position;
- return parse_repeat(1);
- case regex_constants::syntax_open_brace:
- ++m_position;
- return parse_repeat_range(false);
- case regex_constants::syntax_close_brace:
- if((this->flags() & regbase::no_perl_ex) == regbase::no_perl_ex)
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, "Found a closing repetition operator } with no corresponding {.");
- return false;
- }
- result = parse_literal();
- break;
- case regex_constants::syntax_or:
- return parse_alt();
- case regex_constants::syntax_open_set:
- return parse_set();
- case regex_constants::syntax_newline:
- if(this->flags() & regbase::newline_alt)
- return parse_alt();
- else
- return parse_literal();
- case regex_constants::syntax_hash:
- //
- // If we have a mod_x flag set, then skip until
- // we get to a newline character:
- //
- if((this->flags()
- & (regbase::no_perl_ex|regbase::mod_x))
- == regbase::mod_x)
- {
- while((m_position != m_end) && !is_separator(*m_position++)){}
- return true;
- }
- BOOST_FALLTHROUGH;
- default:
- result = parse_literal();
- break;
- }
- return result;
-}
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_literal()
-{
- // append this as a literal provided it's not a space character
- // or the perl option regbase::mod_x is not set:
- if(
- ((this->flags()
- & (regbase::main_option_type|regbase::mod_x|regbase::no_perl_ex))
- != regbase::mod_x)
- || !this->m_traits.isctype(*m_position, this->m_mask_space))
- this->append_literal(*m_position);
- ++m_position;
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_open_paren()
-{
- //
- // skip the '(' and error check:
- //
- if(++m_position == m_end)
- {
- fail(regex_constants::error_paren, m_position - m_base);
- return false;
- }
- //
- // begin by checking for a perl-style (?...) extension:
- //
- if(
- ((this->flags() & (regbase::main_option_type | regbase::no_perl_ex)) == 0)
- || ((this->flags() & (regbase::main_option_type | regbase::emacs_ex)) == (regbase::basic_syntax_group|regbase::emacs_ex))
- )
- {
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_question)
- return parse_perl_extension();
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_star)
- return parse_perl_verb();
- }
- //
- // update our mark count, and append the required state:
- //
- unsigned markid = 0;
- if(0 == (this->flags() & regbase::nosubs))
- {
- markid = ++m_mark_count;
-#ifndef BOOST_NO_STD_DISTANCE
- if(this->flags() & regbase::save_subexpression_location)
- this->m_pdata->m_subs.push_back(std::pair<std::size_t, std::size_t>(std::distance(m_base, m_position) - 1, 0));
-#else
- if(this->flags() & regbase::save_subexpression_location)
- this->m_pdata->m_subs.push_back(std::pair<std::size_t, std::size_t>((m_position - m_base) - 1, 0));
-#endif
- }
- re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
- pb->index = markid;
- pb->icase = this->flags() & regbase::icase;
- std::ptrdiff_t last_paren_start = this->getoffset(pb);
- // back up insertion point for alternations, and set new point:
- std::ptrdiff_t last_alt_point = m_alt_insert_point;
- this->m_pdata->m_data.align();
- m_alt_insert_point = this->m_pdata->m_data.size();
- //
- // back up the current flags in case we have a nested (?imsx) group:
- //
- regex_constants::syntax_option_type opts = this->flags();
- bool old_case_change = m_has_case_change;
- m_has_case_change = false; // no changes to this scope as yet...
- //
- // Back up branch reset data in case we have a nested (?|...)
- //
- int mark_reset = m_mark_reset;
- m_mark_reset = -1;
- //
- // now recursively add more states, this will terminate when we get to a
- // matching ')' :
- //
- parse_all();
- //
- // Unwind pushed alternatives:
- //
- if(0 == unwind_alts(last_paren_start))
- return false;
- //
- // restore flags:
- //
- if(m_has_case_change)
- {
- // the case has changed in one or more of the alternatives
- // within the scoped (...) block: we have to add a state
- // to reset the case sensitivity:
- static_cast<re_case*>(
- this->append_state(syntax_element_toggle_case, sizeof(re_case))
- )->icase = opts & regbase::icase;
- }
- this->flags(opts);
- m_has_case_change = old_case_change;
- //
- // restore branch reset:
- //
- m_mark_reset = mark_reset;
- //
- // we either have a ')' or we have run out of characters prematurely:
- //
- if(m_position == m_end)
- {
- this->fail(regex_constants::error_paren, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_end));
- return false;
- }
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
- return false;
-#ifndef BOOST_NO_STD_DISTANCE
- if(markid && (this->flags() & regbase::save_subexpression_location))
- this->m_pdata->m_subs.at(markid - 1).second = std::distance(m_base, m_position);
-#else
- if(markid && (this->flags() & regbase::save_subexpression_location))
- this->m_pdata->m_subs.at(markid - 1).second = (m_position - m_base);
-#endif
- ++m_position;
- //
- // append closing parenthesis state:
- //
- pb = static_cast<re_brace*>(this->append_state(syntax_element_endmark, sizeof(re_brace)));
- pb->index = markid;
- pb->icase = this->flags() & regbase::icase;
- this->m_paren_start = last_paren_start;
- //
- // restore the alternate insertion point:
- //
- this->m_alt_insert_point = last_alt_point;
- //
- // allow backrefs to this mark:
- //
- if(markid > 0)
- this->m_backrefs.set(markid);
-
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_basic_escape()
-{
- if(++m_position == m_end)
- {
- fail(regex_constants::error_paren, m_position - m_base);
- return false;
- }
- bool result = true;
- switch(this->m_traits.escape_syntax_type(*m_position))
- {
- case regex_constants::syntax_open_mark:
- return parse_open_paren();
- case regex_constants::syntax_close_mark:
- return false;
- case regex_constants::syntax_plus:
- if(this->flags() & regex_constants::bk_plus_qm)
- {
- ++m_position;
- return parse_repeat(1);
- }
- else
- return parse_literal();
- case regex_constants::syntax_question:
- if(this->flags() & regex_constants::bk_plus_qm)
- {
- ++m_position;
- return parse_repeat(0, 1);
- }
- else
- return parse_literal();
- case regex_constants::syntax_open_brace:
- if(this->flags() & regbase::no_intervals)
- return parse_literal();
- ++m_position;
- return parse_repeat_range(true);
- case regex_constants::syntax_close_brace:
- if(this->flags() & regbase::no_intervals)
- return parse_literal();
- fail(regex_constants::error_brace, this->m_position - this->m_base, "Found a closing repetition operator } with no corresponding {.");
- return false;
- case regex_constants::syntax_or:
- if(this->flags() & regbase::bk_vbar)
- return parse_alt();
- else
- result = parse_literal();
- break;
- case regex_constants::syntax_digit:
- return parse_backref();
- case regex_constants::escape_type_start_buffer:
- if(this->flags() & regbase::emacs_ex)
- {
- ++m_position;
- this->append_state(syntax_element_buffer_start);
- }
- else
- result = parse_literal();
- break;
- case regex_constants::escape_type_end_buffer:
- if(this->flags() & regbase::emacs_ex)
- {
- ++m_position;
- this->append_state(syntax_element_buffer_end);
- }
- else
- result = parse_literal();
- break;
- case regex_constants::escape_type_word_assert:
- if(this->flags() & regbase::emacs_ex)
- {
- ++m_position;
- this->append_state(syntax_element_word_boundary);
- }
- else
- result = parse_literal();
- break;
- case regex_constants::escape_type_not_word_assert:
- if(this->flags() & regbase::emacs_ex)
- {
- ++m_position;
- this->append_state(syntax_element_within_word);
- }
- else
- result = parse_literal();
- break;
- case regex_constants::escape_type_left_word:
- if(this->flags() & regbase::emacs_ex)
- {
- ++m_position;
- this->append_state(syntax_element_word_start);
- }
- else
- result = parse_literal();
- break;
- case regex_constants::escape_type_right_word:
- if(this->flags() & regbase::emacs_ex)
- {
- ++m_position;
- this->append_state(syntax_element_word_end);
- }
- else
- result = parse_literal();
- break;
- default:
- if(this->flags() & regbase::emacs_ex)
- {
- bool negate = true;
- switch(*m_position)
- {
- case 'w':
- negate = false;
- BOOST_FALLTHROUGH;
- case 'W':
- {
- basic_char_set<charT, traits> char_set;
- if(negate)
- char_set.negate();
- char_set.add_class(this->m_word_mask);
- if(0 == this->append_set(char_set))
- {
- fail(regex_constants::error_ctype, m_position - m_base);
- return false;
- }
- ++m_position;
- return true;
- }
- case 's':
- negate = false;
- BOOST_FALLTHROUGH;
- case 'S':
- return add_emacs_code(negate);
- case 'c':
- case 'C':
- // not supported yet:
- fail(regex_constants::error_escape, m_position - m_base, "The \\c and \\C escape sequences are not supported by POSIX basic regular expressions: try the Perl syntax instead.");
- return false;
- default:
- break;
- }
- }
- result = parse_literal();
- break;
- }
- return result;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_extended_escape()
-{
- ++m_position;
- if(m_position == m_end)
- {
- fail(regex_constants::error_escape, m_position - m_base, "Incomplete escape sequence found.");
- return false;
- }
- bool negate = false; // in case this is a character class escape: \w \d etc
- switch(this->m_traits.escape_syntax_type(*m_position))
- {
- case regex_constants::escape_type_not_class:
- negate = true;
- BOOST_FALLTHROUGH;
- case regex_constants::escape_type_class:
- {
-escape_type_class_jump:
- typedef typename traits::char_class_type m_type;
- m_type m = this->m_traits.lookup_classname(m_position, m_position+1);
- if(m != 0)
- {
- basic_char_set<charT, traits> char_set;
- if(negate)
- char_set.negate();
- char_set.add_class(m);
- if(0 == this->append_set(char_set))
- {
- fail(regex_constants::error_ctype, m_position - m_base);
- return false;
- }
- ++m_position;
- return true;
- }
- //
- // not a class, just a regular unknown escape:
- //
- this->append_literal(unescape_character());
- break;
- }
- case regex_constants::syntax_digit:
- return parse_backref();
- case regex_constants::escape_type_left_word:
- ++m_position;
- this->append_state(syntax_element_word_start);
- break;
- case regex_constants::escape_type_right_word:
- ++m_position;
- this->append_state(syntax_element_word_end);
- break;
- case regex_constants::escape_type_start_buffer:
- ++m_position;
- this->append_state(syntax_element_buffer_start);
- break;
- case regex_constants::escape_type_end_buffer:
- ++m_position;
- this->append_state(syntax_element_buffer_end);
- break;
- case regex_constants::escape_type_word_assert:
- ++m_position;
- this->append_state(syntax_element_word_boundary);
- break;
- case regex_constants::escape_type_not_word_assert:
- ++m_position;
- this->append_state(syntax_element_within_word);
- break;
- case regex_constants::escape_type_Z:
- ++m_position;
- this->append_state(syntax_element_soft_buffer_end);
- break;
- case regex_constants::escape_type_Q:
- return parse_QE();
- case regex_constants::escape_type_C:
- return parse_match_any();
- case regex_constants::escape_type_X:
- ++m_position;
- this->append_state(syntax_element_combining);
- break;
- case regex_constants::escape_type_G:
- ++m_position;
- this->append_state(syntax_element_restart_continue);
- break;
- case regex_constants::escape_type_not_property:
- negate = true;
- BOOST_FALLTHROUGH;
- case regex_constants::escape_type_property:
- {
- ++m_position;
- char_class_type m;
- if(m_position == m_end)
- {
- fail(regex_constants::error_escape, m_position - m_base, "Incomplete property escape found.");
- return false;
- }
- // maybe have \p{ddd}
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
- {
- const charT* base = m_position;
- // skip forward until we find enclosing brace:
- while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
- ++m_position;
- if(m_position == m_end)
- {
- fail(regex_constants::error_escape, m_position - m_base, "Closing } missing from property escape sequence.");
- return false;
- }
- m = this->m_traits.lookup_classname(++base, m_position++);
- }
- else
- {
- m = this->m_traits.lookup_classname(m_position, m_position+1);
- ++m_position;
- }
- if(m != 0)
- {
- basic_char_set<charT, traits> char_set;
- if(negate)
- char_set.negate();
- char_set.add_class(m);
- if(0 == this->append_set(char_set))
- {
- fail(regex_constants::error_ctype, m_position - m_base);
- return false;
- }
- return true;
- }
- fail(regex_constants::error_ctype, m_position - m_base, "Escape sequence was neither a valid property nor a valid character class name.");
- return false;
- }
- case regex_constants::escape_type_reset_start_mark:
- if(0 == (this->flags() & (regbase::main_option_type | regbase::no_perl_ex)))
- {
- re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
- pb->index = -5;
- pb->icase = this->flags() & regbase::icase;
- this->m_pdata->m_data.align();
- ++m_position;
- return true;
- }
- goto escape_type_class_jump;
- case regex_constants::escape_type_line_ending:
- if(0 == (this->flags() & (regbase::main_option_type | regbase::no_perl_ex)))
- {
- const charT* e = get_escape_R_string<charT>();
- const charT* old_position = m_position;
- const charT* old_end = m_end;
- const charT* old_base = m_base;
- m_position = e;
- m_base = e;
- m_end = e + traits::length(e);
- bool r = parse_all();
- m_position = ++old_position;
- m_end = old_end;
- m_base = old_base;
- return r;
- }
- goto escape_type_class_jump;
- case regex_constants::escape_type_extended_backref:
- if(0 == (this->flags() & (regbase::main_option_type | regbase::no_perl_ex)))
- {
- bool have_brace = false;
- bool negative = false;
- static const char incomplete_message[] = "Incomplete \\g escape found.";
- if(++m_position == m_end)
- {
- fail(regex_constants::error_escape, m_position - m_base, incomplete_message);
- return false;
- }
- // maybe have \g{ddd}
- regex_constants::syntax_type syn = this->m_traits.syntax_type(*m_position);
- regex_constants::syntax_type syn_end = 0;
- if((syn == regex_constants::syntax_open_brace)
- || (syn == regex_constants::escape_type_left_word)
- || (syn == regex_constants::escape_type_end_buffer))
- {
- if(++m_position == m_end)
- {
- fail(regex_constants::error_escape, m_position - m_base, incomplete_message);
- return false;
- }
- have_brace = true;
- switch(syn)
- {
- case regex_constants::syntax_open_brace:
- syn_end = regex_constants::syntax_close_brace;
- break;
- case regex_constants::escape_type_left_word:
- syn_end = regex_constants::escape_type_right_word;
- break;
- default:
- syn_end = regex_constants::escape_type_end_buffer;
- break;
- }
- }
- negative = (*m_position == static_cast<charT>('-'));
- if((negative) && (++m_position == m_end))
- {
- fail(regex_constants::error_escape, m_position - m_base, incomplete_message);
- return false;
- }
- const charT* pc = m_position;
- boost::intmax_t i = this->m_traits.toi(pc, m_end, 10);
- if((i < 0) && syn_end)
- {
- // Check for a named capture, get the leftmost one if there is more than one:
- const charT* base = m_position;
- while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != syn_end))
- {
- ++m_position;
- }
- i = hash_value_from_capture_name(base, m_position);
- pc = m_position;
- }
- if(negative)
- i = 1 + (static_cast<boost::intmax_t>(m_mark_count) - i);
- if(((i < hash_value_mask) && (i > 0) && (this->m_backrefs.test(i))) || ((i >= hash_value_mask) && (this->m_pdata->get_id(i) > 0) && (this->m_backrefs.test(this->m_pdata->get_id(i)))))
- {
- m_position = pc;
- re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_backref, sizeof(re_brace)));
- pb->index = i;
- pb->icase = this->flags() & regbase::icase;
- }
- else
- {
- fail(regex_constants::error_backref, m_position - m_base);
- return false;
- }
- m_position = pc;
- if(have_brace)
- {
- if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != syn_end))
- {
- fail(regex_constants::error_escape, m_position - m_base, incomplete_message);
- return false;
- }
- ++m_position;
- }
- return true;
- }
- goto escape_type_class_jump;
- case regex_constants::escape_type_control_v:
- if(0 == (this->flags() & (regbase::main_option_type | regbase::no_perl_ex)))
- goto escape_type_class_jump;
- BOOST_FALLTHROUGH;
- default:
- this->append_literal(unescape_character());
- break;
- }
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_match_any()
-{
- //
- // we have a '.' that can match any character:
- //
- ++m_position;
- static_cast<re_dot*>(
- this->append_state(syntax_element_wild, sizeof(re_dot))
- )->mask = static_cast<unsigned char>(this->flags() & regbase::no_mod_s
- ? BOOST_REGEX_DETAIL_NS::force_not_newline
- : this->flags() & regbase::mod_s ?
- BOOST_REGEX_DETAIL_NS::force_newline : BOOST_REGEX_DETAIL_NS::dont_care);
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_t high)
-{
- bool greedy = true;
- bool possessive = false;
- std::size_t insert_point;
- //
- // when we get to here we may have a non-greedy ? mark still to come:
- //
- if((m_position != m_end)
- && (
- (0 == (this->flags() & (regbase::main_option_type | regbase::no_perl_ex)))
- || ((regbase::basic_syntax_group|regbase::emacs_ex) == (this->flags() & (regbase::main_option_type | regbase::emacs_ex)))
- )
- )
- {
- // OK we have a perl or emacs regex, check for a '?':
- if ((this->flags() & (regbase::main_option_type | regbase::mod_x | regbase::no_perl_ex)) == regbase::mod_x)
- {
- // whitespace skip:
- while ((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
- ++m_position;
- }
- if((m_position != m_end) && (this->m_traits.syntax_type(*m_position) == regex_constants::syntax_question))
- {
- greedy = false;
- ++m_position;
- }
- // for perl regexes only check for possessive ++ repeats.
- if((m_position != m_end)
- && (0 == (this->flags() & regbase::main_option_type))
- && (this->m_traits.syntax_type(*m_position) == regex_constants::syntax_plus))
- {
- possessive = true;
- ++m_position;
- }
- }
- if(0 == this->m_last_state)
- {
- fail(regex_constants::error_badrepeat, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_position), "Nothing to repeat.");
- return false;
- }
- if(this->m_last_state->type == syntax_element_endmark)
- {
- // insert a repeat before the '(' matching the last ')':
- insert_point = this->m_paren_start;
- }
- else if((this->m_last_state->type == syntax_element_literal) && (static_cast<re_literal*>(this->m_last_state)->length > 1))
- {
- // the last state was a literal with more than one character, split it in two:
- re_literal* lit = static_cast<re_literal*>(this->m_last_state);
- charT c = (static_cast<charT*>(static_cast<void*>(lit+1)))[lit->length - 1];
- lit->length -= 1;
- // now append new state:
- lit = static_cast<re_literal*>(this->append_state(syntax_element_literal, sizeof(re_literal) + sizeof(charT)));
- lit->length = 1;
- (static_cast<charT*>(static_cast<void*>(lit+1)))[0] = c;
- insert_point = this->getoffset(this->m_last_state);
- }
- else
- {
- // repeat the last state whatever it was, need to add some error checking here:
- switch(this->m_last_state->type)
- {
- case syntax_element_start_line:
- case syntax_element_end_line:
- case syntax_element_word_boundary:
- case syntax_element_within_word:
- case syntax_element_word_start:
- case syntax_element_word_end:
- case syntax_element_buffer_start:
- case syntax_element_buffer_end:
- case syntax_element_alt:
- case syntax_element_soft_buffer_end:
- case syntax_element_restart_continue:
- case syntax_element_jump:
- case syntax_element_startmark:
- case syntax_element_backstep:
- case syntax_element_toggle_case:
- // can't legally repeat any of the above:
- fail(regex_constants::error_badrepeat, m_position - m_base);
- return false;
- default:
- // do nothing...
- break;
- }
- insert_point = this->getoffset(this->m_last_state);
- }
- //
- // OK we now know what to repeat, so insert the repeat around it:
- //
- re_repeat* rep = static_cast<re_repeat*>(this->insert_state(insert_point, syntax_element_rep, re_repeater_size));
- rep->min = low;
- rep->max = high;
- rep->greedy = greedy;
- rep->leading = false;
- // store our repeater position for later:
- std::ptrdiff_t rep_off = this->getoffset(rep);
- // and append a back jump to the repeat:
- re_jump* jmp = static_cast<re_jump*>(this->append_state(syntax_element_jump, sizeof(re_jump)));
- jmp->alt.i = rep_off - this->getoffset(jmp);
- this->m_pdata->m_data.align();
- // now fill in the alt jump for the repeat:
- rep = static_cast<re_repeat*>(this->getaddress(rep_off));
- rep->alt.i = this->m_pdata->m_data.size() - rep_off;
- //
- // If the repeat is possessive then bracket the repeat with a (?>...)
- // independent sub-expression construct:
- //
- if(possessive)
- {
- if(m_position != m_end)
- {
- //
- // Check for illegal following quantifier, we have to do this here, because
- // the extra states we insert below circumvents our usual error checking :-(
- //
- bool contin = false;
- do
- {
- if ((this->flags() & (regbase::main_option_type | regbase::mod_x | regbase::no_perl_ex)) == regbase::mod_x)
- {
- // whitespace skip:
- while ((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
- ++m_position;
- }
- if (m_position != m_end)
- {
- switch (this->m_traits.syntax_type(*m_position))
- {
- case regex_constants::syntax_star:
- case regex_constants::syntax_plus:
- case regex_constants::syntax_question:
- case regex_constants::syntax_open_brace:
- fail(regex_constants::error_badrepeat, m_position - m_base);
- return false;
- case regex_constants::syntax_open_mark:
- // Do we have a comment? If so we need to skip it here...
- if ((m_position + 2 < m_end) && this->m_traits.syntax_type(*(m_position + 1)) == regex_constants::syntax_question
- && this->m_traits.syntax_type(*(m_position + 2)) == regex_constants::syntax_hash)
- {
- while ((m_position != m_end)
- && (this->m_traits.syntax_type(*m_position++) != regex_constants::syntax_close_mark)) {
- }
- contin = true;
- }
- else
- contin = false;
- break;
- default:
- contin = false;
- }
- }
- else
- contin = false;
- } while (contin);
- }
- re_brace* pb = static_cast<re_brace*>(this->insert_state(insert_point, syntax_element_startmark, sizeof(re_brace)));
- pb->index = -3;
- pb->icase = this->flags() & regbase::icase;
- jmp = static_cast<re_jump*>(this->insert_state(insert_point + sizeof(re_brace), syntax_element_jump, sizeof(re_jump)));
- this->m_pdata->m_data.align();
- jmp->alt.i = this->m_pdata->m_data.size() - this->getoffset(jmp);
- pb = static_cast<re_brace*>(this->append_state(syntax_element_endmark, sizeof(re_brace)));
- pb->index = -3;
- pb->icase = this->flags() & regbase::icase;
- }
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_repeat_range(bool isbasic)
-{
- static const char incomplete_message[] = "Missing } in quantified repetition.";
- //
- // parse a repeat-range:
- //
- std::size_t min, max;
- boost::intmax_t v;
- // skip whitespace:
- while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
- ++m_position;
- if(this->m_position == this->m_end)
- {
- if(this->flags() & (regbase::main_option_type | regbase::no_perl_ex))
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, incomplete_message);
- return false;
- }
- // Treat the opening '{' as a literal character, rewind to start of error:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_brace) --m_position;
- return parse_literal();
- }
- // get min:
- v = this->m_traits.toi(m_position, m_end, 10);
- // skip whitespace:
- if((v < 0) || (v > umax()))
- {
- if(this->flags() & (regbase::main_option_type | regbase::no_perl_ex))
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, incomplete_message);
- return false;
- }
- // Treat the opening '{' as a literal character, rewind to start of error:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_brace) --m_position;
- return parse_literal();
- }
- while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
- ++m_position;
- if(this->m_position == this->m_end)
- {
- if(this->flags() & (regbase::main_option_type | regbase::no_perl_ex))
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, incomplete_message);
- return false;
- }
- // Treat the opening '{' as a literal character, rewind to start of error:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_brace) --m_position;
- return parse_literal();
- }
- min = static_cast<std::size_t>(v);
- // see if we have a comma:
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_comma)
- {
- // move on and error check:
- ++m_position;
- // skip whitespace:
- while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
- ++m_position;
- if(this->m_position == this->m_end)
- {
- if(this->flags() & (regbase::main_option_type | regbase::no_perl_ex))
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, incomplete_message);
- return false;
- }
- // Treat the opening '{' as a literal character, rewind to start of error:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_brace) --m_position;
- return parse_literal();
- }
- // get the value if any:
- v = this->m_traits.toi(m_position, m_end, 10);
- max = ((v >= 0) && (v < umax())) ? (std::size_t)v : (std::numeric_limits<std::size_t>::max)();
- }
- else
- {
- // no comma, max = min:
- max = min;
- }
- // skip whitespace:
- while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
- ++m_position;
- // OK now check trailing }:
- if(this->m_position == this->m_end)
- {
- if(this->flags() & (regbase::main_option_type | regbase::no_perl_ex))
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, incomplete_message);
- return false;
- }
- // Treat the opening '{' as a literal character, rewind to start of error:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_brace) --m_position;
- return parse_literal();
- }
- if(isbasic)
- {
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_escape)
- {
- ++m_position;
- if(this->m_position == this->m_end)
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, incomplete_message);
- return false;
- }
- }
- else
- {
- fail(regex_constants::error_brace, this->m_position - this->m_base, incomplete_message);
- return false;
- }
- }
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_brace)
- ++m_position;
- else
- {
- // Treat the opening '{' as a literal character, rewind to start of error:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_brace) --m_position;
- return parse_literal();
- }
- //
- // finally go and add the repeat, unless error:
- //
- if(min > max)
- {
- // Backtrack to error location:
- m_position -= 2;
- while(this->m_traits.isctype(*m_position, this->m_word_mask)) --m_position;
- ++m_position;
- fail(regex_constants::error_badbrace, m_position - m_base);
- return false;
- }
- return parse_repeat(min, max);
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_alt()
-{
- //
- // error check: if there have been no previous states,
- // or if the last state was a '(' then error:
- //
- if(
- ((this->m_last_state == 0) || (this->m_last_state->type == syntax_element_startmark))
- &&
- !(
- ((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group)
- &&
- ((this->flags() & regbase::no_empty_expressions) == 0)
- )
- )
- {
- fail(regex_constants::error_empty, this->m_position - this->m_base, "A regular expression cannot start with the alternation operator |.");
- return false;
- }
- //
- // Reset mark count if required:
- //
- if(m_max_mark < m_mark_count)
- m_max_mark = m_mark_count;
- if(m_mark_reset >= 0)
- m_mark_count = m_mark_reset;
-
- ++m_position;
- //
- // we need to append a trailing jump:
- //
- re_syntax_base* pj = this->append_state(BOOST_REGEX_DETAIL_NS::syntax_element_jump, sizeof(re_jump));
- std::ptrdiff_t jump_offset = this->getoffset(pj);
- //
- // now insert the alternative:
- //
- re_alt* palt = static_cast<re_alt*>(this->insert_state(this->m_alt_insert_point, syntax_element_alt, re_alt_size));
- jump_offset += re_alt_size;
- this->m_pdata->m_data.align();
- palt->alt.i = this->m_pdata->m_data.size() - this->getoffset(palt);
- //
- // update m_alt_insert_point so that the next alternate gets
- // inserted at the start of the second of the two we've just created:
- //
- this->m_alt_insert_point = this->m_pdata->m_data.size();
- //
- // the start of this alternative must have a case changes state
- // if the current block has messed around with case changes:
- //
- if(m_has_case_change)
- {
- static_cast<re_case*>(
- this->append_state(syntax_element_toggle_case, sizeof(re_case))
- )->icase = this->m_icase;
- }
- //
- // push the alternative onto our stack, a recursive
- // implementation here is easier to understand (and faster
- // as it happens), but causes all kinds of stack overflow problems
- // on programs with small stacks (COM+).
- //
- m_alt_jumps.push_back(jump_offset);
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_set()
-{
- static const char incomplete_message[] = "Character set declaration starting with [ terminated prematurely - either no ] was found or the set had no content.";
- ++m_position;
- if(m_position == m_end)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- basic_char_set<charT, traits> char_set;
-
- const charT* base = m_position; // where the '[' was
- const charT* item_base = m_position; // where the '[' or '^' was
-
- while(m_position != m_end)
- {
- switch(this->m_traits.syntax_type(*m_position))
- {
- case regex_constants::syntax_caret:
- if(m_position == base)
- {
- char_set.negate();
- ++m_position;
- item_base = m_position;
- }
- else
- parse_set_literal(char_set);
- break;
- case regex_constants::syntax_close_set:
- if(m_position == item_base)
- {
- parse_set_literal(char_set);
- break;
- }
- else
- {
- ++m_position;
- if(0 == this->append_set(char_set))
- {
- fail(regex_constants::error_ctype, m_position - m_base);
- return false;
- }
- }
- return true;
- case regex_constants::syntax_open_set:
- if(parse_inner_set(char_set))
- break;
- return true;
- case regex_constants::syntax_escape:
- {
- //
- // look ahead and see if this is a character class shortcut
- // \d \w \s etc...
- //
- ++m_position;
- if(this->m_traits.escape_syntax_type(*m_position)
- == regex_constants::escape_type_class)
- {
- char_class_type m = this->m_traits.lookup_classname(m_position, m_position+1);
- if(m != 0)
- {
- char_set.add_class(m);
- ++m_position;
- break;
- }
- }
- else if(this->m_traits.escape_syntax_type(*m_position)
- == regex_constants::escape_type_not_class)
- {
- // negated character class:
- char_class_type m = this->m_traits.lookup_classname(m_position, m_position+1);
- if(m != 0)
- {
- char_set.add_negated_class(m);
- ++m_position;
- break;
- }
- }
- // not a character class, just a regular escape:
- --m_position;
- parse_set_literal(char_set);
- break;
- }
- default:
- parse_set_literal(char_set);
- break;
- }
- }
- return m_position != m_end;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_inner_set(basic_char_set<charT, traits>& char_set)
-{
- static const char incomplete_message[] = "Character class declaration starting with [ terminated prematurely - either no ] was found or the set had no content.";
- //
- // we have either a character class [:name:]
- // a collating element [.name.]
- // or an equivalence class [=name=]
- //
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- switch(this->m_traits.syntax_type(*m_position))
- {
- case regex_constants::syntax_dot:
- //
- // a collating element is treated as a literal:
- //
- --m_position;
- parse_set_literal(char_set);
- return true;
- case regex_constants::syntax_colon:
- {
- // check that character classes are actually enabled:
- if((this->flags() & (regbase::main_option_type | regbase::no_char_classes))
- == (regbase::basic_syntax_group | regbase::no_char_classes))
- {
- --m_position;
- parse_set_literal(char_set);
- return true;
- }
- // skip the ':'
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- const charT* name_first = m_position;
- // skip at least one character, then find the matching ':]'
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- while((m_position != m_end)
- && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_colon))
- ++m_position;
- const charT* name_last = m_position;
- if(m_end == m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- if((m_end == ++m_position)
- || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- //
- // check for negated class:
- //
- bool negated = false;
- if(this->m_traits.syntax_type(*name_first) == regex_constants::syntax_caret)
- {
- ++name_first;
- negated = true;
- }
- typedef typename traits::char_class_type m_type;
- m_type m = this->m_traits.lookup_classname(name_first, name_last);
- if(m == 0)
- {
- if(char_set.empty() && (name_last - name_first == 1))
- {
- // maybe a special case:
- ++m_position;
- if( (m_position != m_end)
- && (this->m_traits.syntax_type(*m_position)
- == regex_constants::syntax_close_set))
- {
- if(this->m_traits.escape_syntax_type(*name_first)
- == regex_constants::escape_type_left_word)
- {
- ++m_position;
- this->append_state(syntax_element_word_start);
- return false;
- }
- if(this->m_traits.escape_syntax_type(*name_first)
- == regex_constants::escape_type_right_word)
- {
- ++m_position;
- this->append_state(syntax_element_word_end);
- return false;
- }
- }
- }
- fail(regex_constants::error_ctype, name_first - m_base);
- return false;
- }
- if(!negated)
- char_set.add_class(m);
- else
- char_set.add_negated_class(m);
- ++m_position;
- break;
- }
- case regex_constants::syntax_equal:
- {
- // skip the '='
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- const charT* name_first = m_position;
- // skip at least one character, then find the matching '=]'
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- while((m_position != m_end)
- && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal))
- ++m_position;
- const charT* name_last = m_position;
- if(m_end == m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- if((m_end == ++m_position)
- || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
- {
- fail(regex_constants::error_brack, m_position - m_base, incomplete_message);
- return false;
- }
- string_type m = this->m_traits.lookup_collatename(name_first, name_last);
- if(m.empty() || (m.size() > 2))
- {
- fail(regex_constants::error_collate, name_first - m_base);
- return false;
- }
- digraph<charT> d;
- d.first = m[0];
- if(m.size() > 1)
- d.second = m[1];
- else
- d.second = 0;
- char_set.add_equivalent(d);
- ++m_position;
- break;
- }
- default:
- --m_position;
- parse_set_literal(char_set);
- break;
- }
- return true;
-}
-
-template <class charT, class traits>
-void basic_regex_parser<charT, traits>::parse_set_literal(basic_char_set<charT, traits>& char_set)
-{
- digraph<charT> start_range(get_next_set_literal(char_set));
- if(m_end == m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base);
- return;
- }
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_dash)
- {
- // we have a range:
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base);
- return;
- }
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set)
- {
- digraph<charT> end_range = get_next_set_literal(char_set);
- char_set.add_range(start_range, end_range);
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_dash)
- {
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_brack, m_position - m_base);
- return;
- }
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_set)
- {
- // trailing - :
- --m_position;
- return;
- }
- fail(regex_constants::error_range, m_position - m_base);
- return;
- }
- return;
- }
- --m_position;
- }
- char_set.add_single(start_range);
-}
-
-template <class charT, class traits>
-digraph<charT> basic_regex_parser<charT, traits>::get_next_set_literal(basic_char_set<charT, traits>& char_set)
-{
- digraph<charT> result;
- switch(this->m_traits.syntax_type(*m_position))
- {
- case regex_constants::syntax_dash:
- if(!char_set.empty())
- {
- // see if we are at the end of the set:
- if((++m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
- {
- fail(regex_constants::error_range, m_position - m_base);
- return result;
- }
- --m_position;
- }
- result.first = *m_position++;
- return result;
- case regex_constants::syntax_escape:
- // check to see if escapes are supported first:
- if(this->flags() & regex_constants::no_escape_in_lists)
- {
- result = *m_position++;
- break;
- }
- ++m_position;
- result = unescape_character();
- break;
- case regex_constants::syntax_open_set:
- {
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_collate, m_position - m_base);
- return result;
- }
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_dot)
- {
- --m_position;
- result.first = *m_position;
- ++m_position;
- return result;
- }
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_collate, m_position - m_base);
- return result;
- }
- const charT* name_first = m_position;
- // skip at least one character, then find the matching ':]'
- if(m_end == ++m_position)
- {
- fail(regex_constants::error_collate, name_first - m_base);
- return result;
- }
- while((m_position != m_end)
- && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_dot))
- ++m_position;
- const charT* name_last = m_position;
- if(m_end == m_position)
- {
- fail(regex_constants::error_collate, name_first - m_base);
- return result;
- }
- if((m_end == ++m_position)
- || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
- {
- fail(regex_constants::error_collate, name_first - m_base);
- return result;
- }
- ++m_position;
- string_type s = this->m_traits.lookup_collatename(name_first, name_last);
- if(s.empty() || (s.size() > 2))
- {
- fail(regex_constants::error_collate, name_first - m_base);
- return result;
- }
- result.first = s[0];
- if(s.size() > 1)
- result.second = s[1];
- else
- result.second = 0;
- return result;
- }
- default:
- result = *m_position++;
- }
- return result;
-}
-
-//
-// does a value fit in the specified charT type?
-//
-template <class charT>
-bool valid_value(charT, boost::intmax_t v, const mpl::true_&)
-{
- return (v >> (sizeof(charT) * CHAR_BIT)) == 0;
-}
-template <class charT>
-bool valid_value(charT, boost::intmax_t, const mpl::false_&)
-{
- return true; // v will alsways fit in a charT
-}
-template <class charT>
-bool valid_value(charT c, boost::intmax_t v)
-{
- return valid_value(c, v, mpl::bool_<(sizeof(charT) < sizeof(boost::intmax_t))>());
-}
-
-template <class charT, class traits>
-charT basic_regex_parser<charT, traits>::unescape_character()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- charT result(0);
- if(m_position == m_end)
- {
- fail(regex_constants::error_escape, m_position - m_base, "Escape sequence terminated prematurely.");
- return false;
- }
- switch(this->m_traits.escape_syntax_type(*m_position))
- {
- case regex_constants::escape_type_control_a:
- result = charT('\a');
- break;
- case regex_constants::escape_type_e:
- result = charT(27);
- break;
- case regex_constants::escape_type_control_f:
- result = charT('\f');
- break;
- case regex_constants::escape_type_control_n:
- result = charT('\n');
- break;
- case regex_constants::escape_type_control_r:
- result = charT('\r');
- break;
- case regex_constants::escape_type_control_t:
- result = charT('\t');
- break;
- case regex_constants::escape_type_control_v:
- result = charT('\v');
- break;
- case regex_constants::escape_type_word_assert:
- result = charT('\b');
- break;
- case regex_constants::escape_type_ascii_control:
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base, "ASCII escape sequence terminated prematurely.");
- return result;
- }
- result = static_cast<charT>(*m_position % 32);
- break;
- case regex_constants::escape_type_hex:
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base, "Hexadecimal escape sequence terminated prematurely.");
- return result;
- }
- // maybe have \x{ddd}
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
- {
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base, "Missing } in hexadecimal escape sequence.");
- return result;
- }
- boost::intmax_t i = this->m_traits.toi(m_position, m_end, 16);
- if((m_position == m_end)
- || (i < 0)
- || ((std::numeric_limits<charT>::is_specialized) && (i > (boost::intmax_t)(std::numeric_limits<charT>::max)()))
- || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_badbrace, m_position - m_base, "Hexadecimal escape sequence was invalid.");
- return result;
- }
- ++m_position;
- result = charT(i);
- }
- else
- {
- std::ptrdiff_t len = (std::min)(static_cast<std::ptrdiff_t>(2), static_cast<std::ptrdiff_t>(m_end - m_position));
- boost::intmax_t i = this->m_traits.toi(m_position, m_position + len, 16);
- if((i < 0)
- || !valid_value(charT(0), i))
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base, "Escape sequence did not encode a valid character.");
- return result;
- }
- result = charT(i);
- }
- return result;
- case regex_constants::syntax_digit:
- {
- // an octal escape sequence, the first character must be a zero
- // followed by up to 3 octal digits:
- std::ptrdiff_t len = (std::min)(::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end), static_cast<std::ptrdiff_t>(4));
- const charT* bp = m_position;
- boost::intmax_t val = this->m_traits.toi(bp, bp + 1, 8);
- if(val != 0)
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- // Oops not an octal escape after all:
- fail(regex_constants::error_escape, m_position - m_base, "Invalid octal escape sequence.");
- return result;
- }
- val = this->m_traits.toi(m_position, m_position + len, 8);
- if((val < 0) || (val > (boost::intmax_t)(std::numeric_limits<charT>::max)()))
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base, "Octal escape sequence is invalid.");
- return result;
- }
- return static_cast<charT>(val);
- }
- case regex_constants::escape_type_named_char:
- {
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base);
- return false;
- }
- // maybe have \N{name}
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
- {
- const charT* base = m_position;
- // skip forward until we find enclosing brace:
- while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base);
- return false;
- }
- string_type s = this->m_traits.lookup_collatename(++base, m_position++);
- if(s.empty())
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_collate, m_position - m_base);
- return false;
- }
- if(s.size() == 1)
- {
- return s[0];
- }
- }
- // fall through is a failure:
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base);
- return false;
- }
- default:
- result = *m_position;
- break;
- }
- ++m_position;
- return result;
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_backref()
-{
- BOOST_REGEX_ASSERT(m_position != m_end);
- const charT* pc = m_position;
- boost::intmax_t i = this->m_traits.toi(pc, pc + 1, 10);
- if((i == 0) || (((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group) && (this->flags() & regbase::no_bk_refs)))
- {
- // not a backref at all but an octal escape sequence:
- charT c = unescape_character();
- this->append_literal(c);
- }
- else if((i > 0) && (this->m_backrefs.test(i)))
- {
- m_position = pc;
- re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_backref, sizeof(re_brace)));
- pb->index = i;
- pb->icase = this->flags() & regbase::icase;
- }
- else
- {
- // Rewind to start of escape:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_backref, m_position - m_base);
- return false;
- }
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_QE()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- //
- // parse a \Q...\E sequence:
- //
- ++m_position; // skip the Q
- const charT* start = m_position;
- const charT* end;
- do
- {
- while((m_position != m_end)
- && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape))
- ++m_position;
- if(m_position == m_end)
- {
- // a \Q...\E sequence may terminate with the end of the expression:
- end = m_position;
- break;
- }
- if(++m_position == m_end) // skip the escape
- {
- fail(regex_constants::error_escape, m_position - m_base, "Unterminated \\Q...\\E sequence.");
- return false;
- }
- // check to see if it's a \E:
- if(this->m_traits.escape_syntax_type(*m_position) == regex_constants::escape_type_E)
- {
- ++m_position;
- end = m_position - 2;
- break;
- }
- // otherwise go round again:
- }while(true);
- //
- // now add all the character between the two escapes as literals:
- //
- while(start != end)
- {
- this->append_literal(*start);
- ++start;
- }
- return true;
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_perl_extension()
-{
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- //
- // treat comments as a special case, as these
- // are the only ones that don't start with a leading
- // startmark state:
- //
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_hash)
- {
- while((m_position != m_end)
- && (this->m_traits.syntax_type(*m_position++) != regex_constants::syntax_close_mark))
- {}
- return true;
- }
- //
- // backup some state, and prepare the way:
- //
- int markid = 0;
- std::ptrdiff_t jump_offset = 0;
- re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
- pb->icase = this->flags() & regbase::icase;
- std::ptrdiff_t last_paren_start = this->getoffset(pb);
- // back up insertion point for alternations, and set new point:
- std::ptrdiff_t last_alt_point = m_alt_insert_point;
- this->m_pdata->m_data.align();
- m_alt_insert_point = this->m_pdata->m_data.size();
- std::ptrdiff_t expected_alt_point = m_alt_insert_point;
- bool restore_flags = true;
- regex_constants::syntax_option_type old_flags = this->flags();
- bool old_case_change = m_has_case_change;
- m_has_case_change = false;
- charT name_delim;
- int mark_reset = m_mark_reset;
- int max_mark = m_max_mark;
- m_mark_reset = -1;
- m_max_mark = m_mark_count;
- boost::intmax_t v;
- //
- // select the actual extension used:
- //
- switch(this->m_traits.syntax_type(*m_position))
- {
- case regex_constants::syntax_or:
- m_mark_reset = m_mark_count;
- BOOST_FALLTHROUGH;
- case regex_constants::syntax_colon:
- //
- // a non-capturing mark:
- //
- pb->index = markid = 0;
- ++m_position;
- break;
- case regex_constants::syntax_digit:
- {
- //
- // a recursive subexpression:
- //
- v = this->m_traits.toi(m_position, m_end, 10);
- if((v < 0) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base, "The recursive sub-expression refers to an invalid marking group, or is unterminated.");
- return false;
- }
-insert_recursion:
- pb->index = markid = 0;
- re_recurse* pr = static_cast<re_recurse*>(this->append_state(syntax_element_recurse, sizeof(re_recurse)));
- pr->alt.i = v;
- pr->state_id = 0;
- static_cast<re_case*>(
- this->append_state(syntax_element_toggle_case, sizeof(re_case))
- )->icase = this->flags() & regbase::icase;
- break;
- }
- case regex_constants::syntax_plus:
- //
- // A forward-relative recursive subexpression:
- //
- ++m_position;
- v = this->m_traits.toi(m_position, m_end, 10);
- if((v <= 0) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base, "An invalid or unterminated recursive sub-expression.");
- return false;
- }
- if ((std::numeric_limits<boost::intmax_t>::max)() - m_mark_count < v)
- {
- fail(regex_constants::error_perl_extension, m_position - m_base, "An invalid or unterminated recursive sub-expression.");
- return false;
- }
- v += m_mark_count;
- goto insert_recursion;
- case regex_constants::syntax_dash:
- //
- // Possibly a backward-relative recursive subexpression:
- //
- ++m_position;
- v = this->m_traits.toi(m_position, m_end, 10);
- if(v <= 0)
- {
- --m_position;
- // Oops not a relative recursion at all, but a (?-imsx) group:
- goto option_group_jump;
- }
- v = static_cast<boost::intmax_t>(m_mark_count) + 1 - v;
- if(v <= 0)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base, "An invalid or unterminated recursive sub-expression.");
- return false;
- }
- goto insert_recursion;
- case regex_constants::syntax_equal:
- pb->index = markid = -1;
- ++m_position;
- jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
- this->m_pdata->m_data.align();
- m_alt_insert_point = this->m_pdata->m_data.size();
- break;
- case regex_constants::syntax_not:
- pb->index = markid = -2;
- ++m_position;
- jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
- this->m_pdata->m_data.align();
- m_alt_insert_point = this->m_pdata->m_data.size();
- break;
- case regex_constants::escape_type_left_word:
- {
- // a lookbehind assertion:
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- regex_constants::syntax_type t = this->m_traits.syntax_type(*m_position);
- if(t == regex_constants::syntax_not)
- pb->index = markid = -2;
- else if(t == regex_constants::syntax_equal)
- pb->index = markid = -1;
- else
- {
- // Probably a named capture which also starts (?< :
- name_delim = '>';
- --m_position;
- goto named_capture_jump;
- }
- ++m_position;
- jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
- this->append_state(syntax_element_backstep, sizeof(re_brace));
- this->m_pdata->m_data.align();
- m_alt_insert_point = this->m_pdata->m_data.size();
- break;
- }
- case regex_constants::escape_type_right_word:
- //
- // an independent sub-expression:
- //
- pb->index = markid = -3;
- ++m_position;
- jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
- this->m_pdata->m_data.align();
- m_alt_insert_point = this->m_pdata->m_data.size();
- break;
- case regex_constants::syntax_open_mark:
- {
- // a conditional expression:
- pb->index = markid = -4;
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- v = this->m_traits.toi(m_position, m_end, 10);
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(*m_position == charT('R'))
- {
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(*m_position == charT('&'))
- {
- const charT* base = ++m_position;
- while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- v = -static_cast<int>(hash_value_from_capture_name(base, m_position));
- }
- else
- {
- v = -this->m_traits.toi(m_position, m_end, 10);
- }
- re_brace* br = static_cast<re_brace*>(this->append_state(syntax_element_assert_backref, sizeof(re_brace)));
- br->index = v < 0 ? (v - 1) : 0;
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- }
- else if((*m_position == charT('\'')) || (*m_position == charT('<')))
- {
- const charT* base = ++m_position;
- while((m_position != m_end) && (*m_position != charT('>')) && (*m_position != charT('\'')))
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- v = static_cast<int>(hash_value_from_capture_name(base, m_position));
- re_brace* br = static_cast<re_brace*>(this->append_state(syntax_element_assert_backref, sizeof(re_brace)));
- br->index = v;
- if(((*m_position != charT('>')) && (*m_position != charT('\''))) || (++m_position == m_end))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base, "Unterminated named capture.");
- return false;
- }
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- }
- else if(*m_position == charT('D'))
- {
- const char* def = "DEFINE";
- while(*def && (m_position != m_end) && (*m_position == charT(*def)))
- ++m_position, ++def;
- if((m_position == m_end) || *def)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- re_brace* br = static_cast<re_brace*>(this->append_state(syntax_element_assert_backref, sizeof(re_brace)));
- br->index = 9999; // special magic value!
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- }
- else if(v > 0)
- {
- re_brace* br = static_cast<re_brace*>(this->append_state(syntax_element_assert_backref, sizeof(re_brace)));
- br->index = v;
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- }
- else
- {
- // verify that we have a lookahead or lookbehind assert:
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_question)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(this->m_traits.syntax_type(*m_position) == regex_constants::escape_type_left_word)
- {
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if((this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)
- && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_not))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- m_position -= 3;
- }
- else
- {
- if((this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)
- && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_not))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- m_position -= 2;
- }
- }
- break;
- }
- case regex_constants::syntax_close_mark:
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- case regex_constants::escape_type_end_buffer:
- {
- name_delim = *m_position;
-named_capture_jump:
- markid = 0;
- if(0 == (this->flags() & regbase::nosubs))
- {
- markid = ++m_mark_count;
- #ifndef BOOST_NO_STD_DISTANCE
- if(this->flags() & regbase::save_subexpression_location)
- this->m_pdata->m_subs.push_back(std::pair<std::size_t, std::size_t>(std::distance(m_base, m_position) - 2, 0));
- #else
- if(this->flags() & regbase::save_subexpression_location)
- this->m_pdata->m_subs.push_back(std::pair<std::size_t, std::size_t>((m_position - m_base) - 2, 0));
- #endif
- }
- pb->index = markid;
- const charT* base = ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- while((m_position != m_end) && (*m_position != name_delim))
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- this->m_pdata->set_name(base, m_position, markid);
- ++m_position;
- break;
- }
- default:
- if(*m_position == charT('R'))
- {
- ++m_position;
- v = 0;
- if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- goto insert_recursion;
- }
- if(*m_position == charT('&'))
- {
- ++m_position;
- const charT* base = m_position;
- while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- v = static_cast<int>(hash_value_from_capture_name(base, m_position));
- goto insert_recursion;
- }
- if(*m_position == charT('P'))
- {
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(*m_position == charT('>'))
- {
- ++m_position;
- const charT* base = m_position;
- while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- ++m_position;
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- v = static_cast<int>(hash_value_from_capture_name(base, m_position));
- goto insert_recursion;
- }
- }
- //
- // lets assume that we have a (?imsx) group and try and parse it:
- //
-option_group_jump:
- regex_constants::syntax_option_type opts = parse_options();
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- // make a note of whether we have a case change:
- m_has_case_change = ((opts & regbase::icase) != (this->flags() & regbase::icase));
- pb->index = markid = 0;
- if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark)
- {
- // update flags and carry on as normal:
- this->flags(opts);
- restore_flags = false;
- old_case_change |= m_has_case_change; // defer end of scope by one ')'
- }
- else if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_colon)
- {
- // update flags and carry on until the matching ')' is found:
- this->flags(opts);
- ++m_position;
- }
- else
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
-
- // finally append a case change state if we need it:
- if(m_has_case_change)
- {
- static_cast<re_case*>(
- this->append_state(syntax_element_toggle_case, sizeof(re_case))
- )->icase = opts & regbase::icase;
- }
-
- }
- //
- // now recursively add more states, this will terminate when we get to a
- // matching ')' :
- //
- parse_all();
- //
- // Unwind alternatives:
- //
- if(0 == unwind_alts(last_paren_start))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base, "Invalid alternation operators within (?...) block.");
- return false;
- }
- //
- // we either have a ')' or we have run out of characters prematurely:
- //
- if(m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- this->fail(regex_constants::error_paren, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_end));
- return false;
- }
- BOOST_REGEX_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
- ++m_position;
- //
- // restore the flags:
- //
- if(restore_flags)
- {
- // append a case change state if we need it:
- if(m_has_case_change)
- {
- static_cast<re_case*>(
- this->append_state(syntax_element_toggle_case, sizeof(re_case))
- )->icase = old_flags & regbase::icase;
- }
- this->flags(old_flags);
- }
- //
- // set up the jump pointer if we have one:
- //
- if(jump_offset)
- {
- this->m_pdata->m_data.align();
- re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
- jmp->alt.i = this->m_pdata->m_data.size() - this->getoffset(jmp);
- if((this->m_last_state == jmp) && (markid != -2))
- {
- // Oops... we didn't have anything inside the assertion.
- // Note we don't get here for negated forward lookahead as (?!)
- // does have some uses.
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base, "Invalid or empty zero width assertion.");
- return false;
- }
- }
- //
- // verify that if this is conditional expression, that we do have
- // an alternative, if not add one:
- //
- if(markid == -4)
- {
- re_syntax_base* b = this->getaddress(expected_alt_point);
- // Make sure we have exactly one alternative following this state:
- if(b->type != syntax_element_alt)
- {
- re_alt* alt = static_cast<re_alt*>(this->insert_state(expected_alt_point, syntax_element_alt, sizeof(re_alt)));
- alt->alt.i = this->m_pdata->m_data.size() - this->getoffset(alt);
- }
- else if(((std::ptrdiff_t)this->m_pdata->m_data.size() > (static_cast<re_alt*>(b)->alt.i + this->getoffset(b))) && (static_cast<re_alt*>(b)->alt.i > 0) && this->getaddress(static_cast<re_alt*>(b)->alt.i, b)->type == syntax_element_alt)
- {
- // Can't have seen more than one alternative:
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_bad_pattern, m_position - m_base, "More than one alternation operator | was encountered inside a conditional expression.");
- return false;
- }
- else
- {
- // We must *not* have seen an alternative inside a (DEFINE) block:
- b = this->getaddress(b->next.i, b);
- if((b->type == syntax_element_assert_backref) && (static_cast<re_brace*>(b)->index == 9999))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_bad_pattern, m_position - m_base, "Alternation operators are not allowed inside a DEFINE block.");
- return false;
- }
- }
- // check for invalid repetition of next state:
- b = this->getaddress(expected_alt_point);
- b = this->getaddress(static_cast<re_alt*>(b)->next.i, b);
- if((b->type != syntax_element_assert_backref)
- && (b->type != syntax_element_startmark))
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_badrepeat, m_position - m_base, "A repetition operator cannot be applied to a zero-width assertion.");
- return false;
- }
- }
- //
- // append closing parenthesis state:
- //
- pb = static_cast<re_brace*>(this->append_state(syntax_element_endmark, sizeof(re_brace)));
- pb->index = markid;
- pb->icase = this->flags() & regbase::icase;
- this->m_paren_start = last_paren_start;
- //
- // restore the alternate insertion point:
- //
- this->m_alt_insert_point = last_alt_point;
- //
- // and the case change data:
- //
- m_has_case_change = old_case_change;
- //
- // And the mark_reset data:
- //
- if(m_max_mark > m_mark_count)
- {
- m_mark_count = m_max_mark;
- }
- m_mark_reset = mark_reset;
- m_max_mark = max_mark;
-
-
- if(markid > 0)
- {
-#ifndef BOOST_NO_STD_DISTANCE
- if(this->flags() & regbase::save_subexpression_location)
- this->m_pdata->m_subs.at((std::size_t)markid - 1).second = std::distance(m_base, m_position) - 1;
-#else
- if(this->flags() & regbase::save_subexpression_location)
- this->m_pdata->m_subs.at(markid - 1).second = (m_position - m_base) - 1;
-#endif
- //
- // allow backrefs to this mark:
- //
- this->m_backrefs.set(markid);
- }
- return true;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::match_verb(const char* verb)
-{
- while(*verb)
- {
- if(static_cast<charT>(*verb) != *m_position)
- {
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(++m_position == m_end)
- {
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- ++verb;
- }
- return true;
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable:26812)
-#endif
-#endif
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::parse_perl_verb()
-{
- if(++m_position == m_end)
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- switch(*m_position)
- {
- case 'F':
- if(++m_position == m_end)
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if((this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark) || match_verb("AIL"))
- {
- if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- ++m_position;
- this->append_state(syntax_element_fail);
- return true;
- }
- break;
- case 'A':
- if(++m_position == m_end)
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(match_verb("CCEPT"))
- {
- if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- ++m_position;
- this->append_state(syntax_element_accept);
- return true;
- }
- break;
- case 'C':
- if(++m_position == m_end)
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(match_verb("OMMIT"))
- {
- if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- ++m_position;
- static_cast<re_commit*>(this->append_state(syntax_element_commit, sizeof(re_commit)))->action = commit_commit;
- this->m_pdata->m_disable_match_any = true;
- return true;
- }
- break;
- case 'P':
- if(++m_position == m_end)
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(match_verb("RUNE"))
- {
- if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- ++m_position;
- static_cast<re_commit*>(this->append_state(syntax_element_commit, sizeof(re_commit)))->action = commit_prune;
- this->m_pdata->m_disable_match_any = true;
- return true;
- }
- break;
- case 'S':
- if(++m_position == m_end)
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(match_verb("KIP"))
- {
- if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- ++m_position;
- static_cast<re_commit*>(this->append_state(syntax_element_commit, sizeof(re_commit)))->action = commit_skip;
- this->m_pdata->m_disable_match_any = true;
- return true;
- }
- break;
- case 'T':
- if(++m_position == m_end)
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- if(match_verb("HEN"))
- {
- if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
- {
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
- }
- ++m_position;
- this->append_state(syntax_element_then);
- this->m_pdata->m_disable_match_any = true;
- return true;
- }
- break;
- }
- // Rewind to start of (* sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_perl_extension, m_position - m_base);
- return false;
-}
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::add_emacs_code(bool negate)
-{
- //
- // parses an emacs style \sx or \Sx construct.
- //
- if(++m_position == m_end)
- {
- // Rewind to start of sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape) --m_position;
- fail(regex_constants::error_escape, m_position - m_base);
- return false;
- }
- basic_char_set<charT, traits> char_set;
- if(negate)
- char_set.negate();
-
- static const charT s_punct[5] = { 'p', 'u', 'n', 'c', 't', };
-
- switch(*m_position)
- {
- case 's':
- case ' ':
- char_set.add_class(this->m_mask_space);
- break;
- case 'w':
- char_set.add_class(this->m_word_mask);
- break;
- case '_':
- char_set.add_single(digraph<charT>(charT('$')));
- char_set.add_single(digraph<charT>(charT('&')));
- char_set.add_single(digraph<charT>(charT('*')));
- char_set.add_single(digraph<charT>(charT('+')));
- char_set.add_single(digraph<charT>(charT('-')));
- char_set.add_single(digraph<charT>(charT('_')));
- char_set.add_single(digraph<charT>(charT('<')));
- char_set.add_single(digraph<charT>(charT('>')));
- break;
- case '.':
- char_set.add_class(this->m_traits.lookup_classname(s_punct, s_punct+5));
- break;
- case '(':
- char_set.add_single(digraph<charT>(charT('(')));
- char_set.add_single(digraph<charT>(charT('[')));
- char_set.add_single(digraph<charT>(charT('{')));
- break;
- case ')':
- char_set.add_single(digraph<charT>(charT(')')));
- char_set.add_single(digraph<charT>(charT(']')));
- char_set.add_single(digraph<charT>(charT('}')));
- break;
- case '"':
- char_set.add_single(digraph<charT>(charT('"')));
- char_set.add_single(digraph<charT>(charT('\'')));
- char_set.add_single(digraph<charT>(charT('`')));
- break;
- case '\'':
- char_set.add_single(digraph<charT>(charT('\'')));
- char_set.add_single(digraph<charT>(charT(',')));
- char_set.add_single(digraph<charT>(charT('#')));
- break;
- case '<':
- char_set.add_single(digraph<charT>(charT(';')));
- break;
- case '>':
- char_set.add_single(digraph<charT>(charT('\n')));
- char_set.add_single(digraph<charT>(charT('\f')));
- break;
- default:
- fail(regex_constants::error_ctype, m_position - m_base);
- return false;
- }
- if(0 == this->append_set(char_set))
- {
- fail(regex_constants::error_ctype, m_position - m_base);
- return false;
- }
- ++m_position;
- return true;
-}
-
-template <class charT, class traits>
-regex_constants::syntax_option_type basic_regex_parser<charT, traits>::parse_options()
-{
- // we have a (?imsx-imsx) group, convert it into a set of flags:
- regex_constants::syntax_option_type f = this->flags();
- bool breakout = false;
- do
- {
- switch(*m_position)
- {
- case 's':
- f |= regex_constants::mod_s;
- f &= ~regex_constants::no_mod_s;
- break;
- case 'm':
- f &= ~regex_constants::no_mod_m;
- break;
- case 'i':
- f |= regex_constants::icase;
- break;
- case 'x':
- f |= regex_constants::mod_x;
- break;
- default:
- breakout = true;
- continue;
- }
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_paren, m_position - m_base);
- return false;
- }
- }
- while(!breakout);
-
- breakout = false;
-
- if(*m_position == static_cast<charT>('-'))
- {
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_paren, m_position - m_base);
- return false;
- }
- do
- {
- switch(*m_position)
- {
- case 's':
- f &= ~regex_constants::mod_s;
- f |= regex_constants::no_mod_s;
- break;
- case 'm':
- f |= regex_constants::no_mod_m;
- break;
- case 'i':
- f &= ~regex_constants::icase;
- break;
- case 'x':
- f &= ~regex_constants::mod_x;
- break;
- default:
- breakout = true;
- continue;
- }
- if(++m_position == m_end)
- {
- // Rewind to start of (? sequence:
- --m_position;
- while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- fail(regex_constants::error_paren, m_position - m_base);
- return false;
- }
- }
- while(!breakout);
- }
- return f;
-}
-
-template <class charT, class traits>
-bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_start)
-{
- //
- // If we didn't actually add any states after the last
- // alternative then that's an error:
- //
- if((this->m_alt_insert_point == static_cast<std::ptrdiff_t>(this->m_pdata->m_data.size()))
- && (!m_alt_jumps.empty()) && (m_alt_jumps.back() > last_paren_start)
- &&
- !(
- ((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group)
- &&
- ((this->flags() & regbase::no_empty_expressions) == 0)
- )
- )
- {
- fail(regex_constants::error_empty, this->m_position - this->m_base, "Can't terminate a sub-expression with an alternation operator |.");
- return false;
- }
- //
- // Fix up our alternatives:
- //
- while((!m_alt_jumps.empty()) && (m_alt_jumps.back() > last_paren_start))
- {
- //
- // fix up the jump to point to the end of the states
- // that we've just added:
- //
- std::ptrdiff_t jump_offset = m_alt_jumps.back();
- m_alt_jumps.pop_back();
- this->m_pdata->m_data.align();
- re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
- if (jmp->type != syntax_element_jump)
- {
- // Something really bad happened, this used to be an assert,
- // but we'll make it an error just in case we should ever get here.
- fail(regex_constants::error_unknown, this->m_position - this->m_base, "Internal logic failed while compiling the expression, probably you added a repeat to something non-repeatable!");
- return false;
- }
- jmp->alt.i = this->m_pdata->m_data.size() - jump_offset;
- }
- return true;
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace BOOST_REGEX_DETAIL_NS
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/c_regex_traits.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/c_regex_traits.hpp
deleted file mode 100644
index f966c4d4b4..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/c_regex_traits.hpp
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE c_regex_traits.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares regular expression traits class that wraps the global C locale.
- */
-
-#ifndef BOOST_C_REGEX_TRAITS_HPP_INCLUDED
-#define BOOST_C_REGEX_TRAITS_HPP_INCLUDED
-
-#ifndef BOOST_REGEX_CONFIG_HPP
-#include <boost/regex/config.hpp>
-#endif
-#ifndef BOOST_REGEX_WORKAROUND_HPP
-#include <boost/regex/v4/regex_workaround.hpp>
-#endif
-
-#include <cctype>
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-namespace std{
- using ::strlen; using ::tolower;
-}
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103 4244)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-
- namespace BOOST_REGEX_DETAIL_NS {
-
- enum
- {
- char_class_space = 1 << 0,
- char_class_print = 1 << 1,
- char_class_cntrl = 1 << 2,
- char_class_upper = 1 << 3,
- char_class_lower = 1 << 4,
- char_class_alpha = 1 << 5,
- char_class_digit = 1 << 6,
- char_class_punct = 1 << 7,
- char_class_xdigit = 1 << 8,
- char_class_alnum = char_class_alpha | char_class_digit,
- char_class_graph = char_class_alnum | char_class_punct,
- char_class_blank = 1 << 9,
- char_class_word = 1 << 10,
- char_class_unicode = 1 << 11,
- char_class_horizontal = 1 << 12,
- char_class_vertical = 1 << 13
- };
-
- }
-
-template <class charT>
-struct c_regex_traits;
-
-template<>
-struct c_regex_traits<char>
-{
- c_regex_traits(){}
- typedef char char_type;
- typedef std::size_t size_type;
- typedef std::string string_type;
- struct locale_type{};
- typedef boost::uint32_t char_class_type;
-
- static size_type length(const char_type* p)
- {
- return (std::strlen)(p);
- }
-
- char translate(char c) const
- {
- return c;
- }
- char translate_nocase(char c) const
- {
- return static_cast<char>((std::tolower)(static_cast<unsigned char>(c)));
- }
-
- static string_type BOOST_REGEX_CALL transform(const char* p1, const char* p2);
- static string_type BOOST_REGEX_CALL transform_primary(const char* p1, const char* p2);
-
- static char_class_type BOOST_REGEX_CALL lookup_classname(const char* p1, const char* p2);
- static string_type BOOST_REGEX_CALL lookup_collatename(const char* p1, const char* p2);
-
- static bool BOOST_REGEX_CALL isctype(char, char_class_type);
- static int BOOST_REGEX_CALL value(char, int);
-
- locale_type imbue(locale_type l)
- { return l; }
- locale_type getloc()const
- { return locale_type(); }
-
-private:
- // this type is not copyable:
- c_regex_traits(const c_regex_traits&);
- c_regex_traits& operator=(const c_regex_traits&);
-};
-
-#ifndef BOOST_NO_WREGEX
-template<>
-struct c_regex_traits<wchar_t>
-{
- c_regex_traits(){}
- typedef wchar_t char_type;
- typedef std::size_t size_type;
- typedef std::wstring string_type;
- struct locale_type{};
- typedef boost::uint32_t char_class_type;
-
- static size_type length(const char_type* p)
- {
- return (std::wcslen)(p);
- }
-
- wchar_t translate(wchar_t c) const
- {
- return c;
- }
- wchar_t translate_nocase(wchar_t c) const
- {
- return (std::towlower)(c);
- }
-
- static string_type BOOST_REGEX_CALL transform(const wchar_t* p1, const wchar_t* p2);
- static string_type BOOST_REGEX_CALL transform_primary(const wchar_t* p1, const wchar_t* p2);
-
- static char_class_type BOOST_REGEX_CALL lookup_classname(const wchar_t* p1, const wchar_t* p2);
- static string_type BOOST_REGEX_CALL lookup_collatename(const wchar_t* p1, const wchar_t* p2);
-
- static bool BOOST_REGEX_CALL isctype(wchar_t, char_class_type);
- static int BOOST_REGEX_CALL value(wchar_t, int);
-
- locale_type imbue(locale_type l)
- { return l; }
- locale_type getloc()const
- { return locale_type(); }
-
-private:
- // this type is not copyable:
- c_regex_traits(const c_regex_traits&);
- c_regex_traits& operator=(const c_regex_traits&);
-};
-
-#endif // BOOST_NO_WREGEX
-
-inline c_regex_traits<char>::string_type BOOST_REGEX_CALL c_regex_traits<char>::transform(const char* p1, const char* p2)
-{
- std::string result(10, ' ');
- std::size_t s = result.size();
- std::size_t r;
- std::string src(p1, p2);
- while (s < (r = std::strxfrm(&*result.begin(), src.c_str(), s)))
- {
-#if defined(_CPPLIB_VER)
- //
- // A bug in VC11 and 12 causes the program to hang if we pass a null-string
- // to std::strxfrm, but only for certain locales :-(
- // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
- //
- if (r == INT_MAX)
- {
- result.erase();
- result.insert(result.begin(), static_cast<char>(0));
- return result;
- }
-#endif
- result.append(r - s + 3, ' ');
- s = result.size();
- }
- result.erase(r);
- return result;
-}
-
-inline c_regex_traits<char>::string_type BOOST_REGEX_CALL c_regex_traits<char>::transform_primary(const char* p1, const char* p2)
-{
- static char s_delim;
- static const int s_collate_type = ::boost::BOOST_REGEX_DETAIL_NS::find_sort_syntax(static_cast<c_regex_traits<char>*>(0), &s_delim);
- std::string result;
- //
- // What we do here depends upon the format of the sort key returned by
- // sort key returned by this->transform:
- //
- switch (s_collate_type)
- {
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_C:
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_unknown:
- // the best we can do is translate to lower case, then get a regular sort key:
- {
- result.assign(p1, p2);
- for (std::string::size_type i = 0; i < result.size(); ++i)
- result[i] = static_cast<char>((std::tolower)(static_cast<unsigned char>(result[i])));
- result = transform(&*result.begin(), &*result.begin() + result.size());
- break;
- }
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_fixed:
- {
- // get a regular sort key, and then truncate it:
- result = transform(p1, p2);
- result.erase(s_delim);
- break;
- }
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_delim:
- // get a regular sort key, and then truncate everything after the delim:
- result = transform(p1, p2);
- if ((!result.empty()) && (result[0] == s_delim))
- break;
- std::size_t i;
- for (i = 0; i < result.size(); ++i)
- {
- if (result[i] == s_delim)
- break;
- }
- result.erase(i);
- break;
- }
- if (result.empty())
- result = std::string(1, char(0));
- return result;
-}
-
-inline c_regex_traits<char>::char_class_type BOOST_REGEX_CALL c_regex_traits<char>::lookup_classname(const char* p1, const char* p2)
-{
- using namespace BOOST_REGEX_DETAIL_NS;
- static const char_class_type masks[] =
- {
- 0,
- char_class_alnum,
- char_class_alpha,
- char_class_blank,
- char_class_cntrl,
- char_class_digit,
- char_class_digit,
- char_class_graph,
- char_class_horizontal,
- char_class_lower,
- char_class_lower,
- char_class_print,
- char_class_punct,
- char_class_space,
- char_class_space,
- char_class_upper,
- char_class_unicode,
- char_class_upper,
- char_class_vertical,
- char_class_alnum | char_class_word,
- char_class_alnum | char_class_word,
- char_class_xdigit,
- };
-
- int idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
- if (idx < 0)
- {
- std::string s(p1, p2);
- for (std::string::size_type i = 0; i < s.size(); ++i)
- s[i] = static_cast<char>((std::tolower)(static_cast<unsigned char>(s[i])));
- idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(&*s.begin(), &*s.begin() + s.size());
- }
- BOOST_REGEX_ASSERT(std::size_t(idx) + 1u < sizeof(masks) / sizeof(masks[0]));
- return masks[idx + 1];
-}
-
-inline bool BOOST_REGEX_CALL c_regex_traits<char>::isctype(char c, char_class_type mask)
-{
- using namespace BOOST_REGEX_DETAIL_NS;
- return
- ((mask & char_class_space) && (std::isspace)(static_cast<unsigned char>(c)))
- || ((mask & char_class_print) && (std::isprint)(static_cast<unsigned char>(c)))
- || ((mask & char_class_cntrl) && (std::iscntrl)(static_cast<unsigned char>(c)))
- || ((mask & char_class_upper) && (std::isupper)(static_cast<unsigned char>(c)))
- || ((mask & char_class_lower) && (std::islower)(static_cast<unsigned char>(c)))
- || ((mask & char_class_alpha) && (std::isalpha)(static_cast<unsigned char>(c)))
- || ((mask & char_class_digit) && (std::isdigit)(static_cast<unsigned char>(c)))
- || ((mask & char_class_punct) && (std::ispunct)(static_cast<unsigned char>(c)))
- || ((mask & char_class_xdigit) && (std::isxdigit)(static_cast<unsigned char>(c)))
- || ((mask & char_class_blank) && (std::isspace)(static_cast<unsigned char>(c)) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c))
- || ((mask & char_class_word) && (c == '_'))
- || ((mask & char_class_vertical) && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == '\v')))
- || ((mask & char_class_horizontal) && (std::isspace)(static_cast<unsigned char>(c)) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) && (c != '\v'));
-}
-
-inline c_regex_traits<char>::string_type BOOST_REGEX_CALL c_regex_traits<char>::lookup_collatename(const char* p1, const char* p2)
-{
- std::string s(p1, p2);
- s = ::boost::BOOST_REGEX_DETAIL_NS::lookup_default_collate_name(s);
- if (s.empty() && (p2 - p1 == 1))
- s.append(1, *p1);
- return s;
-}
-
-inline int BOOST_REGEX_CALL c_regex_traits<char>::value(char c, int radix)
-{
- char b[2] = { c, '\0', };
- char* ep;
- int result = std::strtol(b, &ep, radix);
- if (ep == b)
- return -1;
- return result;
-}
-
-#ifndef BOOST_NO_WREGEX
-
-inline c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::transform(const wchar_t* p1, const wchar_t* p2)
-{
- std::size_t r;
- std::size_t s = 10;
- std::wstring src(p1, p2);
- std::wstring result(s, L' ');
- while (s < (r = std::wcsxfrm(&*result.begin(), src.c_str(), s)))
- {
-#if defined(_CPPLIB_VER)
- //
- // A bug in VC11 and 12 causes the program to hang if we pass a null-string
- // to std::strxfrm, but only for certain locales :-(
- // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
- //
- if (r == INT_MAX)
- {
- result.erase();
- result.insert(result.begin(), static_cast<wchar_t>(0));
- return result;
- }
-#endif
- result.append(r - s + 3, L' ');
- s = result.size();
- }
- result.erase(r);
- return result;
-}
-
-inline c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::transform_primary(const wchar_t* p1, const wchar_t* p2)
-{
- static wchar_t s_delim;
- static const int s_collate_type = ::boost::BOOST_REGEX_DETAIL_NS::find_sort_syntax(static_cast<const c_regex_traits<wchar_t>*>(0), &s_delim);
- std::wstring result;
- //
- // What we do here depends upon the format of the sort key returned by
- // sort key returned by this->transform:
- //
- switch (s_collate_type)
- {
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_C:
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_unknown:
- // the best we can do is translate to lower case, then get a regular sort key:
- {
- result.assign(p1, p2);
- for (std::wstring::size_type i = 0; i < result.size(); ++i)
- result[i] = (std::towlower)(result[i]);
- result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());
- break;
- }
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_fixed:
- {
- // get a regular sort key, and then truncate it:
- result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());
- result.erase(s_delim);
- break;
- }
- case ::boost::BOOST_REGEX_DETAIL_NS::sort_delim:
- // get a regular sort key, and then truncate everything after the delim:
- result = c_regex_traits<wchar_t>::transform(&*result.begin(), &*result.begin() + result.size());
- if ((!result.empty()) && (result[0] == s_delim))
- break;
- std::size_t i;
- for (i = 0; i < result.size(); ++i)
- {
- if (result[i] == s_delim)
- break;
- }
- result.erase(i);
- break;
- }
- if (result.empty())
- result = std::wstring(1, char(0));
- return result;
-}
-
-inline c_regex_traits<wchar_t>::char_class_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::lookup_classname(const wchar_t* p1, const wchar_t* p2)
-{
- using namespace BOOST_REGEX_DETAIL_NS;
- static const char_class_type masks[] =
- {
- 0,
- char_class_alnum,
- char_class_alpha,
- char_class_blank,
- char_class_cntrl,
- char_class_digit,
- char_class_digit,
- char_class_graph,
- char_class_horizontal,
- char_class_lower,
- char_class_lower,
- char_class_print,
- char_class_punct,
- char_class_space,
- char_class_space,
- char_class_upper,
- char_class_unicode,
- char_class_upper,
- char_class_vertical,
- char_class_alnum | char_class_word,
- char_class_alnum | char_class_word,
- char_class_xdigit,
- };
-
- int idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
- if (idx < 0)
- {
- std::wstring s(p1, p2);
- for (std::wstring::size_type i = 0; i < s.size(); ++i)
- s[i] = (std::towlower)(s[i]);
- idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(&*s.begin(), &*s.begin() + s.size());
- }
- BOOST_REGEX_ASSERT(idx + 1 < static_cast<int>(sizeof(masks) / sizeof(masks[0])));
- return masks[idx + 1];
-}
-
-inline bool BOOST_REGEX_CALL c_regex_traits<wchar_t>::isctype(wchar_t c, char_class_type mask)
-{
- using namespace BOOST_REGEX_DETAIL_NS;
- return
- ((mask & char_class_space) && (std::iswspace)(c))
- || ((mask & char_class_print) && (std::iswprint)(c))
- || ((mask & char_class_cntrl) && (std::iswcntrl)(c))
- || ((mask & char_class_upper) && (std::iswupper)(c))
- || ((mask & char_class_lower) && (std::iswlower)(c))
- || ((mask & char_class_alpha) && (std::iswalpha)(c))
- || ((mask & char_class_digit) && (std::iswdigit)(c))
- || ((mask & char_class_punct) && (std::iswpunct)(c))
- || ((mask & char_class_xdigit) && (std::iswxdigit)(c))
- || ((mask & char_class_blank) && (std::iswspace)(c) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c))
- || ((mask & char_class_word) && (c == '_'))
- || ((mask & char_class_unicode) && (c & ~static_cast<wchar_t>(0xff)))
- || ((mask & char_class_vertical) && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == L'\v')))
- || ((mask & char_class_horizontal) && (std::iswspace)(c) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) && (c != L'\v'));
-}
-
-inline c_regex_traits<wchar_t>::string_type BOOST_REGEX_CALL c_regex_traits<wchar_t>::lookup_collatename(const wchar_t* p1, const wchar_t* p2)
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4244)
-#endif
- std::string name(p1, p2);
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
- name = ::boost::BOOST_REGEX_DETAIL_NS::lookup_default_collate_name(name);
- if (!name.empty())
- return string_type(name.begin(), name.end());
- if (p2 - p1 == 1)
- return string_type(1, *p1);
- return string_type();
-}
-
-inline int BOOST_REGEX_CALL c_regex_traits<wchar_t>::value(wchar_t c, int radix)
-{
-#ifdef BOOST_BORLANDC
- // workaround for broken wcstol:
- if ((std::iswxdigit)(c) == 0)
- return -1;
-#endif
- wchar_t b[2] = { c, '\0', };
- wchar_t* ep;
- int result = std::wcstol(b, &ep, radix);
- if (ep == b)
- return -1;
- return result;
-}
-
-#endif
-
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/char_regex_traits.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/char_regex_traits.hpp
deleted file mode 100644
index e8a501ca00..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/char_regex_traits.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *
- * Copyright (c) 2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE char_regex_traits.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares deprecated traits classes char_regex_traits<>.
- */
-
-
-#ifndef BOOST_REGEX_V4_CHAR_REGEX_TRAITS_HPP
-#define BOOST_REGEX_V4_CHAR_REGEX_TRAITS_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-
-namespace deprecated{
-//
-// class char_regex_traits_i
-// provides case insensitive traits classes (deprecated):
-template <class charT>
-class char_regex_traits_i : public regex_traits<charT> {};
-
-template<>
-class char_regex_traits_i<char> : public regex_traits<char>
-{
-public:
- typedef char char_type;
- typedef unsigned char uchar_type;
- typedef unsigned int size_type;
- typedef regex_traits<char> base_type;
-
-};
-
-#ifndef BOOST_NO_WREGEX
-template<>
-class char_regex_traits_i<wchar_t> : public regex_traits<wchar_t>
-{
-public:
- typedef wchar_t char_type;
- typedef unsigned short uchar_type;
- typedef unsigned int size_type;
- typedef regex_traits<wchar_t> base_type;
-
-};
-#endif
-} // namespace deprecated
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif // include
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/cpp_regex_traits.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/cpp_regex_traits.hpp
deleted file mode 100644
index 98b251511d..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/cpp_regex_traits.hpp
+++ /dev/null
@@ -1,1237 +0,0 @@
-/*
- *
- * Copyright (c) 2004 John Maddock
- * Copyright 2011 Garmin Ltd. or its subsidiaries
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE cpp_regex_traits.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares regular expression traits class cpp_regex_traits.
- */
-
-#ifndef BOOST_CPP_REGEX_TRAITS_HPP_INCLUDED
-#define BOOST_CPP_REGEX_TRAITS_HPP_INCLUDED
-
-#include <boost/config.hpp>
-#include <boost/integer.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
-
-#ifndef BOOST_NO_STD_LOCALE
-
-#ifndef BOOST_RE_PAT_EXCEPT_HPP
-#include <boost/regex/pattern_except.hpp>
-#endif
-#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
-#include <boost/regex/v4/regex_traits_defaults.hpp>
-#endif
-#ifdef BOOST_HAS_THREADS
-#include <boost/regex/pending/static_mutex.hpp>
-#endif
-#ifndef BOOST_REGEX_PRIMARY_TRANSFORM
-#include <boost/regex/v4/primary_transform.hpp>
-#endif
-#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
-#include <boost/regex/v4/object_cache.hpp>
-#endif
-
-#include <climits>
-#include <ios>
-#include <istream>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4786 4251)
-#endif
-
-namespace boost{
-
-//
-// forward declaration is needed by some compilers:
-//
-template <class charT>
-class cpp_regex_traits;
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-//
-// class parser_buf:
-// acts as a stream buffer which wraps around a pair of pointers:
-//
-template <class charT,
- class traits = ::std::char_traits<charT> >
-class parser_buf : public ::std::basic_streambuf<charT, traits>
-{
- typedef ::std::basic_streambuf<charT, traits> base_type;
- typedef typename base_type::int_type int_type;
- typedef typename base_type::char_type char_type;
- typedef typename base_type::pos_type pos_type;
- typedef ::std::streamsize streamsize;
- typedef typename base_type::off_type off_type;
-public:
- parser_buf() : base_type() { setbuf(0, 0); }
- const charT* getnext() { return this->gptr(); }
-protected:
- std::basic_streambuf<charT, traits>* setbuf(char_type* s, streamsize n) BOOST_OVERRIDE;
- typename parser_buf<charT, traits>::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which) BOOST_OVERRIDE;
- typename parser_buf<charT, traits>::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which) BOOST_OVERRIDE;
-private:
- parser_buf& operator=(const parser_buf&);
- parser_buf(const parser_buf&);
-};
-
-template<class charT, class traits>
-std::basic_streambuf<charT, traits>*
-parser_buf<charT, traits>::setbuf(char_type* s, streamsize n)
-{
- this->setg(s, s, s + n);
- return this;
-}
-
-template<class charT, class traits>
-typename parser_buf<charT, traits>::pos_type
-parser_buf<charT, traits>::seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which)
-{
- typedef typename boost::int_t<sizeof(way) * CHAR_BIT>::least cast_type;
-
- if(which & ::std::ios_base::out)
- return pos_type(off_type(-1));
- std::ptrdiff_t size = this->egptr() - this->eback();
- std::ptrdiff_t pos = this->gptr() - this->eback();
- charT* g = this->eback();
- switch(static_cast<cast_type>(way))
- {
- case ::std::ios_base::beg:
- if((off < 0) || (off > size))
- return pos_type(off_type(-1));
- else
- this->setg(g, g + off, g + size);
- break;
- case ::std::ios_base::end:
- if((off < 0) || (off > size))
- return pos_type(off_type(-1));
- else
- this->setg(g, g + size - off, g + size);
- break;
- case ::std::ios_base::cur:
- {
- std::ptrdiff_t newpos = static_cast<std::ptrdiff_t>(pos + off);
- if((newpos < 0) || (newpos > size))
- return pos_type(off_type(-1));
- else
- this->setg(g, g + newpos, g + size);
- break;
- }
- default: ;
- }
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4244)
-#endif
- return static_cast<pos_type>(this->gptr() - this->eback());
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template<class charT, class traits>
-typename parser_buf<charT, traits>::pos_type
-parser_buf<charT, traits>::seekpos(pos_type sp, ::std::ios_base::openmode which)
-{
- if(which & ::std::ios_base::out)
- return pos_type(off_type(-1));
- off_type size = static_cast<off_type>(this->egptr() - this->eback());
- charT* g = this->eback();
- if(off_type(sp) <= size)
- {
- this->setg(g, g + off_type(sp), g + size);
- }
- return pos_type(off_type(-1));
-}
-
-//
-// class cpp_regex_traits_base:
-// acts as a container for locale and the facets we are using.
-//
-template <class charT>
-struct cpp_regex_traits_base
-{
- cpp_regex_traits_base(const std::locale& l)
- { (void)imbue(l); }
- std::locale imbue(const std::locale& l);
-
- std::locale m_locale;
- std::ctype<charT> const* m_pctype;
-#ifndef BOOST_NO_STD_MESSAGES
- std::messages<charT> const* m_pmessages;
-#endif
- std::collate<charT> const* m_pcollate;
-
- bool operator<(const cpp_regex_traits_base& b)const
- {
- if(m_pctype == b.m_pctype)
- {
-#ifndef BOOST_NO_STD_MESSAGES
- if(m_pmessages == b.m_pmessages)
- {
- return m_pcollate < b.m_pcollate;
- }
- return m_pmessages < b.m_pmessages;
-#else
- return m_pcollate < b.m_pcollate;
-#endif
- }
- return m_pctype < b.m_pctype;
- }
- bool operator==(const cpp_regex_traits_base& b)const
- {
- return (m_pctype == b.m_pctype)
-#ifndef BOOST_NO_STD_MESSAGES
- && (m_pmessages == b.m_pmessages)
-#endif
- && (m_pcollate == b.m_pcollate);
- }
-};
-
-template <class charT>
-std::locale cpp_regex_traits_base<charT>::imbue(const std::locale& l)
-{
- std::locale result(m_locale);
- m_locale = l;
- m_pctype = &BOOST_USE_FACET(std::ctype<charT>, l);
-#ifndef BOOST_NO_STD_MESSAGES
- m_pmessages = BOOST_HAS_FACET(std::messages<charT>, l) ? &BOOST_USE_FACET(std::messages<charT>, l) : 0;
-#endif
- m_pcollate = &BOOST_USE_FACET(std::collate<charT>, l);
- return result;
-}
-
-//
-// class cpp_regex_traits_char_layer:
-// implements methods that require specialization for narrow characters:
-//
-template <class charT>
-class cpp_regex_traits_char_layer : public cpp_regex_traits_base<charT>
-{
- typedef std::basic_string<charT> string_type;
- typedef std::map<charT, regex_constants::syntax_type> map_type;
- typedef typename map_type::const_iterator map_iterator_type;
-public:
- cpp_regex_traits_char_layer(const std::locale& l)
- : cpp_regex_traits_base<charT>(l)
- {
- init();
- }
- cpp_regex_traits_char_layer(const cpp_regex_traits_base<charT>& b)
- : cpp_regex_traits_base<charT>(b)
- {
- init();
- }
- void init();
-
- regex_constants::syntax_type syntax_type(charT c)const
- {
- map_iterator_type i = m_char_map.find(c);
- return ((i == m_char_map.end()) ? 0 : i->second);
- }
- regex_constants::escape_syntax_type escape_syntax_type(charT c) const
- {
- map_iterator_type i = m_char_map.find(c);
- if(i == m_char_map.end())
- {
- if(this->m_pctype->is(std::ctype_base::lower, c)) return regex_constants::escape_type_class;
- if(this->m_pctype->is(std::ctype_base::upper, c)) return regex_constants::escape_type_not_class;
- return 0;
- }
- return i->second;
- }
-
-private:
- string_type get_default_message(regex_constants::syntax_type);
- // TODO: use a hash table when available!
- map_type m_char_map;
-};
-
-template <class charT>
-void cpp_regex_traits_char_layer<charT>::init()
-{
- // we need to start by initialising our syntax map so we know which
- // character is used for which purpose:
-#ifndef BOOST_NO_STD_MESSAGES
-#ifndef __IBMCPP__
- typename std::messages<charT>::catalog cat = static_cast<std::messages<char>::catalog>(-1);
-#else
- typename std::messages<charT>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
-#endif
- std::string cat_name(cpp_regex_traits<charT>::get_catalog_name());
- if((!cat_name.empty()) && (this->m_pmessages != 0))
- {
- cat = this->m_pmessages->open(
- cat_name,
- this->m_locale);
- if((int)cat < 0)
- {
- std::string m("Unable to open message catalog: ");
- std::runtime_error err(m + cat_name);
- boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
- }
- }
- //
- // if we have a valid catalog then load our messages:
- //
- if((int)cat >= 0)
- {
-#ifndef BOOST_NO_EXCEPTIONS
- try{
-#endif
- for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
- {
- string_type mss = this->m_pmessages->get(cat, 0, i, get_default_message(i));
- for(typename string_type::size_type j = 0; j < mss.size(); ++j)
- {
- m_char_map[mss[j]] = i;
- }
- }
- this->m_pmessages->close(cat);
-#ifndef BOOST_NO_EXCEPTIONS
- }
- catch(...)
- {
- if(this->m_pmessages)
- this->m_pmessages->close(cat);
- throw;
- }
-#endif
- }
- else
- {
-#endif
- for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
- {
- const char* ptr = get_default_syntax(i);
- while(ptr && *ptr)
- {
- m_char_map[this->m_pctype->widen(*ptr)] = i;
- ++ptr;
- }
- }
-#ifndef BOOST_NO_STD_MESSAGES
- }
-#endif
-}
-
-template <class charT>
-typename cpp_regex_traits_char_layer<charT>::string_type
- cpp_regex_traits_char_layer<charT>::get_default_message(regex_constants::syntax_type i)
-{
- const char* ptr = get_default_syntax(i);
- string_type result;
- while(ptr && *ptr)
- {
- result.append(1, this->m_pctype->widen(*ptr));
- ++ptr;
- }
- return result;
-}
-
-//
-// specialized version for narrow characters:
-//
-template <>
-class cpp_regex_traits_char_layer<char> : public cpp_regex_traits_base<char>
-{
- typedef std::string string_type;
-public:
- cpp_regex_traits_char_layer(const std::locale& l)
- : cpp_regex_traits_base<char>(l)
- {
- init();
- }
- cpp_regex_traits_char_layer(const cpp_regex_traits_base<char>& l)
- : cpp_regex_traits_base<char>(l)
- {
- init();
- }
-
- regex_constants::syntax_type syntax_type(char c)const
- {
- return m_char_map[static_cast<unsigned char>(c)];
- }
- regex_constants::escape_syntax_type escape_syntax_type(char c) const
- {
- return m_char_map[static_cast<unsigned char>(c)];
- }
-
-private:
- regex_constants::syntax_type m_char_map[1u << CHAR_BIT];
- void init();
-};
-
-#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
-enum
-{
- char_class_space=1<<0,
- char_class_print=1<<1,
- char_class_cntrl=1<<2,
- char_class_upper=1<<3,
- char_class_lower=1<<4,
- char_class_alpha=1<<5,
- char_class_digit=1<<6,
- char_class_punct=1<<7,
- char_class_xdigit=1<<8,
- char_class_alnum=char_class_alpha|char_class_digit,
- char_class_graph=char_class_alnum|char_class_punct,
- char_class_blank=1<<9,
- char_class_word=1<<10,
- char_class_unicode=1<<11,
- char_class_horizontal_space=1<<12,
- char_class_vertical_space=1<<13
-};
-
-#endif
-
-//
-// class cpp_regex_traits_implementation:
-// provides pimpl implementation for cpp_regex_traits.
-//
-template <class charT>
-class cpp_regex_traits_implementation : public cpp_regex_traits_char_layer<charT>
-{
-public:
- typedef typename cpp_regex_traits<charT>::char_class_type char_class_type;
- typedef typename std::ctype<charT>::mask native_mask_type;
- typedef typename boost::make_unsigned<native_mask_type>::type unsigned_native_mask_type;
-#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
- BOOST_STATIC_CONSTANT(char_class_type, mask_blank = 1u << 24);
- BOOST_STATIC_CONSTANT(char_class_type, mask_word = 1u << 25);
- BOOST_STATIC_CONSTANT(char_class_type, mask_unicode = 1u << 26);
- BOOST_STATIC_CONSTANT(char_class_type, mask_horizontal = 1u << 27);
- BOOST_STATIC_CONSTANT(char_class_type, mask_vertical = 1u << 28);
-#endif
-
- typedef std::basic_string<charT> string_type;
- typedef charT char_type;
- //cpp_regex_traits_implementation();
- cpp_regex_traits_implementation(const std::locale& l)
- : cpp_regex_traits_char_layer<charT>(l)
- {
- init();
- }
- cpp_regex_traits_implementation(const cpp_regex_traits_base<charT>& l)
- : cpp_regex_traits_char_layer<charT>(l)
- {
- init();
- }
- std::string error_string(regex_constants::error_type n) const
- {
- if(!m_error_strings.empty())
- {
- std::map<int, std::string>::const_iterator p = m_error_strings.find(n);
- return (p == m_error_strings.end()) ? std::string(get_default_error_string(n)) : p->second;
- }
- return get_default_error_string(n);
- }
- char_class_type lookup_classname(const charT* p1, const charT* p2) const
- {
- char_class_type result = lookup_classname_imp(p1, p2);
- if(result == 0)
- {
- string_type temp(p1, p2);
- this->m_pctype->tolower(&*temp.begin(), &*temp.begin() + temp.size());
- result = lookup_classname_imp(&*temp.begin(), &*temp.begin() + temp.size());
- }
- return result;
- }
- string_type lookup_collatename(const charT* p1, const charT* p2) const;
- string_type transform_primary(const charT* p1, const charT* p2) const;
- string_type transform(const charT* p1, const charT* p2) const;
-private:
- std::map<int, std::string> m_error_strings; // error messages indexed by numberic ID
- std::map<string_type, char_class_type> m_custom_class_names; // character class names
- std::map<string_type, string_type> m_custom_collate_names; // collating element names
- unsigned m_collate_type; // the form of the collation string
- charT m_collate_delim; // the collation group delimiter
- //
- // helpers:
- //
- char_class_type lookup_classname_imp(const charT* p1, const charT* p2) const;
- void init();
-#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
-public:
- bool isctype(charT c, char_class_type m)const;
-#endif
-};
-
-#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
-#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
-
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_blank;
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_word;
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_unicode;
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_vertical;
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_horizontal;
-
-#endif
-#endif
-
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::string_type
- cpp_regex_traits_implementation<charT>::transform_primary(const charT* p1, const charT* p2) const
-{
- //
- // PRECONDITIONS:
- //
- // A bug in gcc 3.2 (and maybe other versions as well) treats
- // p1 as a null terminated string, for efficiency reasons
- // we work around this elsewhere, but just assert here that
- // we adhere to gcc's (buggy) preconditions...
- //
- BOOST_REGEX_ASSERT(*p2 == 0);
- string_type result;
-#if defined(_CPPLIB_VER)
- //
- // A bug in VC11 and 12 causes the program to hang if we pass a null-string
- // to std::collate::transform, but only for certain locales :-(
- // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
- //
- if(*p1 == 0)
- {
- return string_type(1, charT(0));
- }
-#endif
- //
- // swallowing all exceptions here is a bad idea
- // however at least one std lib will always throw
- // std::bad_alloc for certain arguments...
- //
-#ifndef BOOST_NO_EXCEPTIONS
- try{
-#endif
- //
- // What we do here depends upon the format of the sort key returned by
- // sort key returned by this->transform:
- //
- switch(m_collate_type)
- {
- case sort_C:
- case sort_unknown:
- // the best we can do is translate to lower case, then get a regular sort key:
- {
- result.assign(p1, p2);
- this->m_pctype->tolower(&*result.begin(), &*result.begin() + result.size());
- result = this->m_pcollate->transform(&*result.begin(), &*result.begin() + result.size());
- break;
- }
- case sort_fixed:
- {
- // get a regular sort key, and then truncate it:
- result.assign(this->m_pcollate->transform(p1, p2));
- result.erase(this->m_collate_delim);
- break;
- }
- case sort_delim:
- // get a regular sort key, and then truncate everything after the delim:
- result.assign(this->m_pcollate->transform(p1, p2));
- std::size_t i;
- for(i = 0; i < result.size(); ++i)
- {
- if(result[i] == m_collate_delim)
- break;
- }
- result.erase(i);
- break;
- }
-#ifndef BOOST_NO_EXCEPTIONS
- }catch(...){}
-#endif
- while((!result.empty()) && (charT(0) == *result.rbegin()))
- result.erase(result.size() - 1);
- if(result.empty())
- {
- // character is ignorable at the primary level:
- result = string_type(1, charT(0));
- }
- return result;
-}
-
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::string_type
- cpp_regex_traits_implementation<charT>::transform(const charT* p1, const charT* p2) const
-{
- //
- // PRECONDITIONS:
- //
- // A bug in gcc 3.2 (and maybe other versions as well) treats
- // p1 as a null terminated string, for efficiency reasons
- // we work around this elsewhere, but just assert here that
- // we adhere to gcc's (buggy) preconditions...
- //
- BOOST_REGEX_ASSERT(*p2 == 0);
- //
- // swallowing all exceptions here is a bad idea
- // however at least one std lib will always throw
- // std::bad_alloc for certain arguments...
- //
- string_type result, result2;
-#if defined(_CPPLIB_VER)
- //
- // A bug in VC11 and 12 causes the program to hang if we pass a null-string
- // to std::collate::transform, but only for certain locales :-(
- // Probably effects Intel and Clang or any compiler using the VC std library (Dinkumware).
- //
- if(*p1 == 0)
- {
- return result;
- }
-#endif
-#ifndef BOOST_NO_EXCEPTIONS
- try{
-#endif
- result = this->m_pcollate->transform(p1, p2);
- //
- // Borland's STLPort version returns a NULL-terminated
- // string that has garbage at the end - each call to
- // std::collate<wchar_t>::transform returns a different string!
- // So as a workaround, we'll truncate the string at the first NULL
- // which _seems_ to work....
-#if BOOST_WORKAROUND(BOOST_BORLANDC, < 0x580)
- result.erase(result.find(charT(0)));
-#else
- //
- // some implementations (Dinkumware) append unnecessary trailing \0's:
- while((!result.empty()) && (charT(0) == *result.rbegin()))
- result.erase(result.size() - 1);
-#endif
- //
- // We may have NULL's used as separators between sections of the collate string,
- // an example would be Boost.Locale. We have no way to detect this case via
- // #defines since this can be used with any compiler/platform combination.
- // Unfortunately our state machine (which was devised when all implementations
- // used underlying C language API's) can't cope with that case. One workaround
- // is to replace each character with 2, fortunately this code isn't used that
- // much as this is now slower than before :-(
- //
- typedef typename make_unsigned<charT>::type uchar_type;
- result2.reserve(result.size() * 2 + 2);
- for(unsigned i = 0; i < result.size(); ++i)
- {
- if(static_cast<uchar_type>(result[i]) == (std::numeric_limits<uchar_type>::max)())
- {
- result2.append(1, charT((std::numeric_limits<uchar_type>::max)())).append(1, charT('b'));
- }
- else
- {
- result2.append(1, static_cast<charT>(1 + static_cast<uchar_type>(result[i]))).append(1, charT('b') - 1);
- }
- }
- BOOST_REGEX_ASSERT(std::find(result2.begin(), result2.end(), charT(0)) == result2.end());
-#ifndef BOOST_NO_EXCEPTIONS
- }
- catch(...)
- {
- }
-#endif
- return result2;
-}
-
-
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::string_type
- cpp_regex_traits_implementation<charT>::lookup_collatename(const charT* p1, const charT* p2) const
-{
- typedef typename std::map<string_type, string_type>::const_iterator iter_type;
- if(!m_custom_collate_names.empty())
- {
- iter_type pos = m_custom_collate_names.find(string_type(p1, p2));
- if(pos != m_custom_collate_names.end())
- return pos->second;
- }
-#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
- && !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
- std::string name(p1, p2);
-#else
- std::string name;
- const charT* p0 = p1;
- while(p0 != p2)
- name.append(1, char(*p0++));
-#endif
- name = lookup_default_collate_name(name);
-#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
- && !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
- if(!name.empty())
- return string_type(name.begin(), name.end());
-#else
- if(!name.empty())
- {
- string_type result;
- typedef std::string::const_iterator iter;
- iter b = name.begin();
- iter e = name.end();
- while(b != e)
- result.append(1, charT(*b++));
- return result;
- }
-#endif
- if(p2 - p1 == 1)
- return string_type(1, *p1);
- return string_type();
-}
-
-template <class charT>
-void cpp_regex_traits_implementation<charT>::init()
-{
-#ifndef BOOST_NO_STD_MESSAGES
-#ifndef __IBMCPP__
- typename std::messages<charT>::catalog cat = static_cast<std::messages<char>::catalog>(-1);
-#else
- typename std::messages<charT>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
-#endif
- std::string cat_name(cpp_regex_traits<charT>::get_catalog_name());
- if((!cat_name.empty()) && (this->m_pmessages != 0))
- {
- cat = this->m_pmessages->open(
- cat_name,
- this->m_locale);
- if((int)cat < 0)
- {
- std::string m("Unable to open message catalog: ");
- std::runtime_error err(m + cat_name);
- boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
- }
- }
- //
- // if we have a valid catalog then load our messages:
- //
- if((int)cat >= 0)
- {
- //
- // Error messages:
- //
- for(boost::regex_constants::error_type i = static_cast<boost::regex_constants::error_type>(0);
- i <= boost::regex_constants::error_unknown;
- i = static_cast<boost::regex_constants::error_type>(i + 1))
- {
- const char* p = get_default_error_string(i);
- string_type default_message;
- while(*p)
- {
- default_message.append(1, this->m_pctype->widen(*p));
- ++p;
- }
- string_type s = this->m_pmessages->get(cat, 0, i+200, default_message);
- std::string result;
- for(std::string::size_type j = 0; j < s.size(); ++j)
- {
- result.append(1, this->m_pctype->narrow(s[j], 0));
- }
- m_error_strings[i] = result;
- }
- //
- // Custom class names:
- //
-#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
- static const char_class_type masks[16] =
- {
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::alnum),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::alpha),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::cntrl),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::digit),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::graph),
- cpp_regex_traits_implementation<charT>::mask_horizontal,
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::lower),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::print),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::punct),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::space),
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::upper),
- cpp_regex_traits_implementation<charT>::mask_vertical,
- static_cast<unsigned_native_mask_type>(std::ctype<charT>::xdigit),
- cpp_regex_traits_implementation<charT>::mask_blank,
- cpp_regex_traits_implementation<charT>::mask_word,
- cpp_regex_traits_implementation<charT>::mask_unicode,
- };
-#else
- static const char_class_type masks[16] =
- {
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_alpha,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_cntrl,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_graph,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_horizontal_space,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_print,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_punct,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_space,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_vertical_space,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_xdigit,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_blank,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_word,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_unicode,
- };
-#endif
- static const string_type null_string;
- for(unsigned int j = 0; j <= 13; ++j)
- {
- string_type s(this->m_pmessages->get(cat, 0, j+300, null_string));
- if(!s.empty())
- this->m_custom_class_names[s] = masks[j];
- }
- }
-#endif
- //
- // get the collation format used by m_pcollate:
- //
- m_collate_type = BOOST_REGEX_DETAIL_NS::find_sort_syntax(this, &m_collate_delim);
-}
-
-template <class charT>
-typename cpp_regex_traits_implementation<charT>::char_class_type
- cpp_regex_traits_implementation<charT>::lookup_classname_imp(const charT* p1, const charT* p2) const
-{
-#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
- static const char_class_type masks[22] =
- {
- 0,
- static_cast<unsigned_native_mask_type>(std::ctype<char>::alnum),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::alpha),
- cpp_regex_traits_implementation<charT>::mask_blank,
- static_cast<unsigned_native_mask_type>(std::ctype<char>::cntrl),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::digit),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::digit),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::graph),
- cpp_regex_traits_implementation<charT>::mask_horizontal,
- static_cast<unsigned_native_mask_type>(std::ctype<char>::lower),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::lower),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::print),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::punct),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::space),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::space),
- static_cast<unsigned_native_mask_type>(std::ctype<char>::upper),
- cpp_regex_traits_implementation<charT>::mask_unicode,
- static_cast<unsigned_native_mask_type>(std::ctype<char>::upper),
- cpp_regex_traits_implementation<charT>::mask_vertical,
- static_cast<unsigned_native_mask_type>(std::ctype<char>::alnum) | cpp_regex_traits_implementation<charT>::mask_word,
- static_cast<unsigned_native_mask_type>(std::ctype<char>::alnum) | cpp_regex_traits_implementation<charT>::mask_word,
- static_cast<unsigned_native_mask_type>(std::ctype<char>::xdigit),
- };
-#else
- static const char_class_type masks[22] =
- {
- 0,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_alpha,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_blank,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_cntrl,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_graph,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_horizontal_space,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_print,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_punct,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_space,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_space,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_unicode,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_vertical_space,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum | ::boost::BOOST_REGEX_DETAIL_NS::char_class_word,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum | ::boost::BOOST_REGEX_DETAIL_NS::char_class_word,
- ::boost::BOOST_REGEX_DETAIL_NS::char_class_xdigit,
- };
-#endif
- if(!m_custom_class_names.empty())
- {
- typedef typename std::map<std::basic_string<charT>, char_class_type>::const_iterator map_iter;
- map_iter pos = m_custom_class_names.find(string_type(p1, p2));
- if(pos != m_custom_class_names.end())
- return pos->second;
- }
- std::size_t state_id = 1 + BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
- BOOST_REGEX_ASSERT(state_id < sizeof(masks) / sizeof(masks[0]));
- return masks[state_id];
-}
-
-#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
-template <class charT>
-bool cpp_regex_traits_implementation<charT>::isctype(const charT c, char_class_type mask) const
-{
- return
- ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_space) && (this->m_pctype->is(std::ctype<charT>::space, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_print) && (this->m_pctype->is(std::ctype<charT>::print, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_cntrl) && (this->m_pctype->is(std::ctype<charT>::cntrl, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper) && (this->m_pctype->is(std::ctype<charT>::upper, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower) && (this->m_pctype->is(std::ctype<charT>::lower, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_alpha) && (this->m_pctype->is(std::ctype<charT>::alpha, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit) && (this->m_pctype->is(std::ctype<charT>::digit, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_punct) && (this->m_pctype->is(std::ctype<charT>::punct, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_xdigit) && (this->m_pctype->is(std::ctype<charT>::xdigit, c)))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_blank) && (this->m_pctype->is(std::ctype<charT>::space, c)) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_word) && (c == '_'))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_unicode) && ::boost::BOOST_REGEX_DETAIL_NS::is_extended(c))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_vertical_space) && (is_separator(c) || (c == '\v')))
- || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_horizontal_space) && this->m_pctype->is(std::ctype<charT>::space, c) && !(is_separator(c) || (c == '\v')));
-}
-#endif
-
-
-template <class charT>
-inline boost::shared_ptr<const cpp_regex_traits_implementation<charT> > create_cpp_regex_traits(const std::locale& l)
-{
- cpp_regex_traits_base<charT> key(l);
- return ::boost::object_cache<cpp_regex_traits_base<charT>, cpp_regex_traits_implementation<charT> >::get(key, 5);
-}
-
-} // BOOST_REGEX_DETAIL_NS
-
-template <class charT>
-class cpp_regex_traits
-{
-private:
- typedef std::ctype<charT> ctype_type;
-public:
- typedef charT char_type;
- typedef std::size_t size_type;
- typedef std::basic_string<char_type> string_type;
- typedef std::locale locale_type;
- typedef boost::uint_least32_t char_class_type;
-
- struct boost_extensions_tag{};
-
- cpp_regex_traits()
- : m_pimpl(BOOST_REGEX_DETAIL_NS::create_cpp_regex_traits<charT>(std::locale()))
- { }
- static size_type length(const char_type* p)
- {
- return std::char_traits<charT>::length(p);
- }
- regex_constants::syntax_type syntax_type(charT c)const
- {
- return m_pimpl->syntax_type(c);
- }
- regex_constants::escape_syntax_type escape_syntax_type(charT c) const
- {
- return m_pimpl->escape_syntax_type(c);
- }
- charT translate(charT c) const
- {
- return c;
- }
- charT translate_nocase(charT c) const
- {
- return m_pimpl->m_pctype->tolower(c);
- }
- charT translate(charT c, bool icase) const
- {
- return icase ? m_pimpl->m_pctype->tolower(c) : c;
- }
- charT tolower(charT c) const
- {
- return m_pimpl->m_pctype->tolower(c);
- }
- charT toupper(charT c) const
- {
- return m_pimpl->m_pctype->toupper(c);
- }
- string_type transform(const charT* p1, const charT* p2) const
- {
- return m_pimpl->transform(p1, p2);
- }
- string_type transform_primary(const charT* p1, const charT* p2) const
- {
- return m_pimpl->transform_primary(p1, p2);
- }
- char_class_type lookup_classname(const charT* p1, const charT* p2) const
- {
- return m_pimpl->lookup_classname(p1, p2);
- }
- string_type lookup_collatename(const charT* p1, const charT* p2) const
- {
- return m_pimpl->lookup_collatename(p1, p2);
- }
- bool isctype(charT c, char_class_type f) const
- {
-#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
- typedef typename std::ctype<charT>::mask ctype_mask;
-
- static const ctype_mask mask_base =
- static_cast<ctype_mask>(
- std::ctype<charT>::alnum
- | std::ctype<charT>::alpha
- | std::ctype<charT>::cntrl
- | std::ctype<charT>::digit
- | std::ctype<charT>::graph
- | std::ctype<charT>::lower
- | std::ctype<charT>::print
- | std::ctype<charT>::punct
- | std::ctype<charT>::space
- | std::ctype<charT>::upper
- | std::ctype<charT>::xdigit);
-
- if((f & mask_base)
- && (m_pimpl->m_pctype->is(
- static_cast<ctype_mask>(f & mask_base), c)))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_unicode) && BOOST_REGEX_DETAIL_NS::is_extended(c))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_word) && (c == '_'))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_blank)
- && m_pimpl->m_pctype->is(std::ctype<charT>::space, c)
- && !BOOST_REGEX_DETAIL_NS::is_separator(c))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_vertical)
- && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == '\v')))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_horizontal)
- && this->isctype(c, std::ctype<charT>::space) && !this->isctype(c, BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_vertical))
- return true;
-#ifdef __CYGWIN__
- //
- // Cygwin has a buggy ctype facet, see https://www.cygwin.com/ml/cygwin/2012-08/msg00178.html:
- //
- else if((f & std::ctype<charT>::xdigit) == std::ctype<charT>::xdigit)
- {
- if((c >= 'a') && (c <= 'f'))
- return true;
- if((c >= 'A') && (c <= 'F'))
- return true;
- }
-#endif
- return false;
-#else
- return m_pimpl->isctype(c, f);
-#endif
- }
- boost::intmax_t toi(const charT*& p1, const charT* p2, int radix)const;
- int value(charT c, int radix)const
- {
- const charT* pc = &c;
- return (int)toi(pc, pc + 1, radix);
- }
- locale_type imbue(locale_type l)
- {
- std::locale result(getloc());
- m_pimpl = BOOST_REGEX_DETAIL_NS::create_cpp_regex_traits<charT>(l);
- return result;
- }
- locale_type getloc()const
- {
- return m_pimpl->m_locale;
- }
- std::string error_string(regex_constants::error_type n) const
- {
- return m_pimpl->error_string(n);
- }
-
- //
- // extension:
- // set the name of the message catalog in use (defaults to "boost_regex").
- //
- static std::string catalog_name(const std::string& name);
- static std::string get_catalog_name();
-
-private:
- boost::shared_ptr<const BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT> > m_pimpl;
- //
- // catalog name handler:
- //
- static std::string& get_catalog_name_inst();
-
-#ifdef BOOST_HAS_THREADS
- static static_mutex& get_mutex_inst();
-#endif
-};
-
-
-template <class charT>
-boost::intmax_t cpp_regex_traits<charT>::toi(const charT*& first, const charT* last, int radix)const
-{
- BOOST_REGEX_DETAIL_NS::parser_buf<charT> sbuf; // buffer for parsing numbers.
- std::basic_istream<charT> is(&sbuf); // stream for parsing numbers.
-
- // we do NOT want to parse any thousands separators inside the stream:
- last = std::find(first, last, BOOST_USE_FACET(std::numpunct<charT>, is.getloc()).thousands_sep());
-
- sbuf.pubsetbuf(const_cast<charT*>(static_cast<const charT*>(first)), static_cast<std::streamsize>(last-first));
- is.clear();
- if(std::abs(radix) == 16) is >> std::hex;
- else if(std::abs(radix) == 8) is >> std::oct;
- else is >> std::dec;
- boost::intmax_t val;
- if(is >> val)
- {
- first = first + ((last - first) - sbuf.in_avail());
- return val;
- }
- else
- return -1;
-}
-
-template <class charT>
-std::string cpp_regex_traits<charT>::catalog_name(const std::string& name)
-{
-#ifdef BOOST_HAS_THREADS
- static_mutex::scoped_lock lk(get_mutex_inst());
-#endif
- std::string result(get_catalog_name_inst());
- get_catalog_name_inst() = name;
- return result;
-}
-
-template <class charT>
-std::string& cpp_regex_traits<charT>::get_catalog_name_inst()
-{
- static std::string s_name;
- return s_name;
-}
-
-template <class charT>
-std::string cpp_regex_traits<charT>::get_catalog_name()
-{
-#ifdef BOOST_HAS_THREADS
- static_mutex::scoped_lock lk(get_mutex_inst());
-#endif
- std::string result(get_catalog_name_inst());
- return result;
-}
-
-#ifdef BOOST_HAS_THREADS
-template <class charT>
-static_mutex& cpp_regex_traits<charT>::get_mutex_inst()
-{
- static static_mutex s_mutex = BOOST_STATIC_MUTEX_INIT;
- return s_mutex;
-}
-#endif
-
-namespace BOOST_REGEX_DETAIL_NS {
-
- inline void cpp_regex_traits_char_layer<char>::init()
- {
- // we need to start by initialising our syntax map so we know which
- // character is used for which purpose:
- std::memset(m_char_map, 0, sizeof(m_char_map));
-#ifndef BOOST_NO_STD_MESSAGES
-#ifndef __IBMCPP__
- std::messages<char>::catalog cat = static_cast<std::messages<char>::catalog>(-1);
-#else
- std::messages<char>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
-#endif
- std::string cat_name(cpp_regex_traits<char>::get_catalog_name());
- if ((!cat_name.empty()) && (m_pmessages != 0))
- {
- cat = this->m_pmessages->open(
- cat_name,
- this->m_locale);
- if ((int)cat < 0)
- {
- std::string m("Unable to open message catalog: ");
- std::runtime_error err(m + cat_name);
- boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
- }
- }
- //
- // if we have a valid catalog then load our messages:
- //
- if ((int)cat >= 0)
- {
-#ifndef BOOST_NO_EXCEPTIONS
- try {
-#endif
- for (regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
- {
- string_type mss = this->m_pmessages->get(cat, 0, i, get_default_syntax(i));
- for (string_type::size_type j = 0; j < mss.size(); ++j)
- {
- m_char_map[static_cast<unsigned char>(mss[j])] = i;
- }
- }
- this->m_pmessages->close(cat);
-#ifndef BOOST_NO_EXCEPTIONS
- }
- catch (...)
- {
- this->m_pmessages->close(cat);
- throw;
- }
-#endif
- }
- else
- {
-#endif
- for (regex_constants::syntax_type j = 1; j < regex_constants::syntax_max; ++j)
- {
- const char* ptr = get_default_syntax(j);
- while (ptr && *ptr)
- {
- m_char_map[static_cast<unsigned char>(*ptr)] = j;
- ++ptr;
- }
- }
-#ifndef BOOST_NO_STD_MESSAGES
- }
-#endif
- //
- // finish off by calculating our escape types:
- //
- unsigned char i = 'A';
- do
- {
- if (m_char_map[i] == 0)
- {
- if (this->m_pctype->is(std::ctype_base::lower, i))
- m_char_map[i] = regex_constants::escape_type_class;
- else if (this->m_pctype->is(std::ctype_base::upper, i))
- m_char_map[i] = regex_constants::escape_type_not_class;
- }
- } while (0xFF != i++);
- }
-
-} // namespace detail
-
-
-} // boost
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/cregex.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/cregex.hpp
deleted file mode 100644
index dec49c9b9f..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/cregex.hpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE cregex.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares POSIX API functions
- * + boost::RegEx high level wrapper.
- */
-
-#ifndef BOOST_RE_CREGEX_HPP_INCLUDED
-#define BOOST_RE_CREGEX_HPP_INCLUDED
-
-#ifndef BOOST_REGEX_CONFIG_HPP
-#include <boost/regex/config.hpp>
-#endif
-#include <boost/regex/v4/match_flags.hpp>
-#include <boost/regex/v4/error_type.hpp>
-
-#ifdef __cplusplus
-#include <cstddef>
-#else
-#include <stddef.h>
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-/* include these defs only for POSIX compatablity */
-#ifdef __cplusplus
-namespace boost{
-extern "C" {
-#endif
-
-#if defined(__cplusplus) && !defined(BOOST_NO_STDC_NAMESPACE)
-typedef std::ptrdiff_t regoff_t;
-typedef std::size_t regsize_t;
-#else
-typedef ptrdiff_t regoff_t;
-typedef size_t regsize_t;
-#endif
-
-typedef struct
-{
- unsigned int re_magic;
-#ifdef __cplusplus
- std::size_t re_nsub; /* number of parenthesized subexpressions */
-#else
- size_t re_nsub;
-#endif
- const char* re_endp; /* end pointer for REG_PEND */
- void* guts; /* none of your business :-) */
- match_flag_type eflags; /* none of your business :-) */
-} regex_tA;
-
-#ifndef BOOST_NO_WREGEX
-typedef struct
-{
- unsigned int re_magic;
-#ifdef __cplusplus
- std::size_t re_nsub; /* number of parenthesized subexpressions */
-#else
- size_t re_nsub;
-#endif
- const wchar_t* re_endp; /* end pointer for REG_PEND */
- void* guts; /* none of your business :-) */
- match_flag_type eflags; /* none of your business :-) */
-} regex_tW;
-#endif
-
-typedef struct
-{
- regoff_t rm_so; /* start of match */
- regoff_t rm_eo; /* end of match */
-} regmatch_t;
-
-/* regcomp() flags */
-typedef enum{
- REG_BASIC = 0000,
- REG_EXTENDED = 0001,
- REG_ICASE = 0002,
- REG_NOSUB = 0004,
- REG_NEWLINE = 0010,
- REG_NOSPEC = 0020,
- REG_PEND = 0040,
- REG_DUMP = 0200,
- REG_NOCOLLATE = 0400,
- REG_ESCAPE_IN_LISTS = 01000,
- REG_NEWLINE_ALT = 02000,
- REG_PERLEX = 04000,
-
- REG_PERL = REG_EXTENDED | REG_NOCOLLATE | REG_ESCAPE_IN_LISTS | REG_PERLEX,
- REG_AWK = REG_EXTENDED | REG_ESCAPE_IN_LISTS,
- REG_GREP = REG_BASIC | REG_NEWLINE_ALT,
- REG_EGREP = REG_EXTENDED | REG_NEWLINE_ALT,
-
- REG_ASSERT = 15,
- REG_INVARG = 16,
- REG_ATOI = 255, /* convert name to number (!) */
- REG_ITOA = 0400 /* convert number to name (!) */
-} reg_comp_flags;
-
-/* regexec() flags */
-typedef enum{
- REG_NOTBOL = 00001,
- REG_NOTEOL = 00002,
- REG_STARTEND = 00004
-} reg_exec_flags;
-
-/*
- * POSIX error codes:
- */
-typedef unsigned reg_error_t;
-typedef reg_error_t reg_errcode_t; /* backwards compatibility */
-
-static const reg_error_t REG_NOERROR = 0; /* Success. */
-static const reg_error_t REG_NOMATCH = 1; /* Didn't find a match (for regexec). */
-
- /* POSIX regcomp return error codes. (In the order listed in the
- standard.) */
-static const reg_error_t REG_BADPAT = 2; /* Invalid pattern. */
-static const reg_error_t REG_ECOLLATE = 3; /* Undefined collating element. */
-static const reg_error_t REG_ECTYPE = 4; /* Invalid character class name. */
-static const reg_error_t REG_EESCAPE = 5; /* Trailing backslash. */
-static const reg_error_t REG_ESUBREG = 6; /* Invalid back reference. */
-static const reg_error_t REG_EBRACK = 7; /* Unmatched left bracket. */
-static const reg_error_t REG_EPAREN = 8; /* Parenthesis imbalance. */
-static const reg_error_t REG_EBRACE = 9; /* Unmatched \{. */
-static const reg_error_t REG_BADBR = 10; /* Invalid contents of \{\}. */
-static const reg_error_t REG_ERANGE = 11; /* Invalid range end. */
-static const reg_error_t REG_ESPACE = 12; /* Ran out of memory. */
-static const reg_error_t REG_BADRPT = 13; /* No preceding re for repetition op. */
-static const reg_error_t REG_EEND = 14; /* unexpected end of expression */
-static const reg_error_t REG_ESIZE = 15; /* expression too big */
-static const reg_error_t REG_ERPAREN = 8; /* = REG_EPAREN : unmatched right parenthesis */
-static const reg_error_t REG_EMPTY = 17; /* empty expression */
-static const reg_error_t REG_E_MEMORY = 15; /* = REG_ESIZE : out of memory */
-static const reg_error_t REG_ECOMPLEXITY = 18; /* complexity too high */
-static const reg_error_t REG_ESTACK = 19; /* out of stack space */
-static const reg_error_t REG_E_PERL = 20; /* Perl (?...) error */
-static const reg_error_t REG_E_UNKNOWN = 21; /* unknown error */
-static const reg_error_t REG_ENOSYS = 21; /* = REG_E_UNKNOWN : Reserved. */
-
-BOOST_REGEX_DECL int BOOST_REGEX_CCALL regcompA(regex_tA*, const char*, int);
-BOOST_REGEX_DECL regsize_t BOOST_REGEX_CCALL regerrorA(int, const regex_tA*, char*, regsize_t);
-BOOST_REGEX_DECL int BOOST_REGEX_CCALL regexecA(const regex_tA*, const char*, regsize_t, regmatch_t*, int);
-BOOST_REGEX_DECL void BOOST_REGEX_CCALL regfreeA(regex_tA*);
-
-#ifndef BOOST_NO_WREGEX
-BOOST_REGEX_DECL int BOOST_REGEX_CCALL regcompW(regex_tW*, const wchar_t*, int);
-BOOST_REGEX_DECL regsize_t BOOST_REGEX_CCALL regerrorW(int, const regex_tW*, wchar_t*, regsize_t);
-BOOST_REGEX_DECL int BOOST_REGEX_CCALL regexecW(const regex_tW*, const wchar_t*, regsize_t, regmatch_t*, int);
-BOOST_REGEX_DECL void BOOST_REGEX_CCALL regfreeW(regex_tW*);
-#endif
-
-#ifdef UNICODE
-#define regcomp regcompW
-#define regerror regerrorW
-#define regexec regexecW
-#define regfree regfreeW
-#define regex_t regex_tW
-#else
-#define regcomp regcompA
-#define regerror regerrorA
-#define regexec regexecA
-#define regfree regfreeA
-#define regex_t regex_tA
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-} /* namespace */
-#endif
-
-#endif /* include guard */
-
-
-
-
-
-
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/error_type.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/error_type.hpp
deleted file mode 100644
index afcc71e3d8..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/error_type.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *
- * Copyright (c) 2003-2005
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE error_type.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares regular expression error type enumerator.
- */
-
-#ifndef BOOST_REGEX_ERROR_TYPE_HPP
-#define BOOST_REGEX_ERROR_TYPE_HPP
-
-#ifdef __cplusplus
-namespace boost{
-#endif
-
-#ifdef __cplusplus
-namespace regex_constants{
-
-enum error_type{
-
- error_ok = 0, /* not used */
- error_no_match = 1, /* not used */
- error_bad_pattern = 2,
- error_collate = 3,
- error_ctype = 4,
- error_escape = 5,
- error_backref = 6,
- error_brack = 7,
- error_paren = 8,
- error_brace = 9,
- error_badbrace = 10,
- error_range = 11,
- error_space = 12,
- error_badrepeat = 13,
- error_end = 14, /* not used */
- error_size = 15,
- error_right_paren = 16, /* not used */
- error_empty = 17,
- error_complexity = 18,
- error_stack = 19,
- error_perl_extension = 20,
- error_unknown = 21
-};
-
-}
-}
-#endif /* __cplusplus */
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/icu.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/icu.hpp
deleted file mode 100644
index 7e70f57e5a..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/icu.hpp
+++ /dev/null
@@ -1,1516 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE icu.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Unicode regular expressions on top of the ICU Library.
- */
-
-#ifndef BOOST_REGEX_ICU_V4_HPP
-#define BOOST_REGEX_ICU_V4_HPP
-
-#include <boost/config.hpp>
-#include <unicode/utypes.h>
-#include <unicode/uchar.h>
-#include <unicode/coll.h>
-#include <boost/regex.hpp>
-#include <boost/regex/v4/unicode_iterator.hpp>
-#include <boost/mpl/int_fwd.hpp>
-#include <boost/static_assert.hpp>
-#include <bitset>
-
-#ifdef BOOST_MSVC
-#pragma warning (push)
-#pragma warning (disable: 4251)
-#endif
-
-namespace boost {
-
- namespace BOOST_REGEX_DETAIL_NS {
-
- //
- // Implementation details:
- //
- class icu_regex_traits_implementation
- {
- typedef UChar32 char_type;
- typedef std::size_t size_type;
- typedef std::vector<char_type> string_type;
- typedef U_NAMESPACE_QUALIFIER Locale locale_type;
- typedef boost::uint_least32_t char_class_type;
- public:
- icu_regex_traits_implementation(const U_NAMESPACE_QUALIFIER Locale& l)
- : m_locale(l)
- {
- UErrorCode success = U_ZERO_ERROR;
- m_collator.reset(U_NAMESPACE_QUALIFIER Collator::createInstance(l, success));
- if (U_SUCCESS(success) == 0)
- init_error();
- m_collator->setStrength(U_NAMESPACE_QUALIFIER Collator::IDENTICAL);
- success = U_ZERO_ERROR;
- m_primary_collator.reset(U_NAMESPACE_QUALIFIER Collator::createInstance(l, success));
- if (U_SUCCESS(success) == 0)
- init_error();
- m_primary_collator->setStrength(U_NAMESPACE_QUALIFIER Collator::PRIMARY);
- }
- U_NAMESPACE_QUALIFIER Locale getloc()const
- {
- return m_locale;
- }
- string_type do_transform(const char_type* p1, const char_type* p2, const U_NAMESPACE_QUALIFIER Collator* pcoll) const
- {
- // TODO make thread safe!!!! :
- typedef u32_to_u16_iterator<const char_type*, ::UChar> itt;
- itt i(p1), j(p2);
-#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
- std::vector< ::UChar> t(i, j);
-#else
- std::vector< ::UChar> t;
- while (i != j)
- t.push_back(*i++);
-#endif
- ::uint8_t result[100];
- ::int32_t len;
- if (!t.empty())
- len = pcoll->getSortKey(&*t.begin(), static_cast< ::int32_t>(t.size()), result, sizeof(result));
- else
- len = pcoll->getSortKey(static_cast<UChar const*>(0), static_cast< ::int32_t>(0), result, sizeof(result));
- if (std::size_t(len) > sizeof(result))
- {
- scoped_array< ::uint8_t> presult(new ::uint8_t[len + 1]);
- if (!t.empty())
- len = pcoll->getSortKey(&*t.begin(), static_cast< ::int32_t>(t.size()), presult.get(), len + 1);
- else
- len = pcoll->getSortKey(static_cast<UChar const*>(0), static_cast< ::int32_t>(0), presult.get(), len + 1);
- if ((0 == presult[len - 1]) && (len > 1))
- --len;
-#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
- return string_type(presult.get(), presult.get() + len);
-#else
- string_type sresult;
- ::uint8_t const* ia = presult.get();
- ::uint8_t const* ib = presult.get() + len;
- while (ia != ib)
- sresult.push_back(*ia++);
- return sresult;
-#endif
- }
- if ((0 == result[len - 1]) && (len > 1))
- --len;
-#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
- return string_type(result, result + len);
-#else
- string_type sresult;
- ::uint8_t const* ia = result;
- ::uint8_t const* ib = result + len;
- while (ia != ib)
- sresult.push_back(*ia++);
- return sresult;
-#endif
- }
- string_type transform(const char_type* p1, const char_type* p2) const
- {
- return do_transform(p1, p2, m_collator.get());
- }
- string_type transform_primary(const char_type* p1, const char_type* p2) const
- {
- return do_transform(p1, p2, m_primary_collator.get());
- }
- private:
- void init_error()
- {
- std::runtime_error e("Could not initialize ICU resources");
- boost::throw_exception(e);
- }
- U_NAMESPACE_QUALIFIER Locale m_locale; // The ICU locale that we're using
- boost::scoped_ptr< U_NAMESPACE_QUALIFIER Collator> m_collator; // The full collation object
- boost::scoped_ptr< U_NAMESPACE_QUALIFIER Collator> m_primary_collator; // The primary collation object
- };
-
- inline boost::shared_ptr<icu_regex_traits_implementation> get_icu_regex_traits_implementation(const U_NAMESPACE_QUALIFIER Locale& loc)
- {
- return boost::shared_ptr<icu_regex_traits_implementation>(new icu_regex_traits_implementation(loc));
- }
-
- }
-
- class icu_regex_traits
- {
- public:
- typedef UChar32 char_type;
- typedef std::size_t size_type;
- typedef std::vector<char_type> string_type;
- typedef U_NAMESPACE_QUALIFIER Locale locale_type;
-#ifdef BOOST_NO_INT64_T
- typedef std::bitset<64> char_class_type;
-#else
- typedef boost::uint64_t char_class_type;
-#endif
-
- struct boost_extensions_tag {};
-
- icu_regex_traits()
- : m_pimpl(BOOST_REGEX_DETAIL_NS::get_icu_regex_traits_implementation(U_NAMESPACE_QUALIFIER Locale()))
- {
- }
- static size_type length(const char_type* p)
- {
- size_type result = 0;
- while (*p)
- {
- ++p;
- ++result;
- }
- return result;
- }
- ::boost::regex_constants::syntax_type syntax_type(char_type c)const
- {
- return ((c < 0x7f) && (c > 0)) ? BOOST_REGEX_DETAIL_NS::get_default_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
- }
- ::boost::regex_constants::escape_syntax_type escape_syntax_type(char_type c) const
- {
- return ((c < 0x7f) && (c > 0)) ? BOOST_REGEX_DETAIL_NS::get_default_escape_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
- }
- char_type translate(char_type c) const
- {
- return c;
- }
- char_type translate_nocase(char_type c) const
- {
- return ::u_foldCase(c, U_FOLD_CASE_DEFAULT);
- }
- char_type translate(char_type c, bool icase) const
- {
- return icase ? translate_nocase(c) : translate(c);
- }
- char_type tolower(char_type c) const
- {
- return ::u_tolower(c);
- }
- char_type toupper(char_type c) const
- {
- return ::u_toupper(c);
- }
- string_type transform(const char_type* p1, const char_type* p2) const
- {
- return m_pimpl->transform(p1, p2);
- }
- string_type transform_primary(const char_type* p1, const char_type* p2) const
- {
- return m_pimpl->transform_primary(p1, p2);
- }
- char_class_type lookup_classname(const char_type* p1, const char_type* p2) const
- {
- static const char_class_type mask_blank = char_class_type(1) << offset_blank;
- static const char_class_type mask_space = char_class_type(1) << offset_space;
- static const char_class_type mask_xdigit = char_class_type(1) << offset_xdigit;
- static const char_class_type mask_underscore = char_class_type(1) << offset_underscore;
- static const char_class_type mask_unicode = char_class_type(1) << offset_unicode;
- static const char_class_type mask_any = char_class_type(1) << offset_any;
- static const char_class_type mask_ascii = char_class_type(1) << offset_ascii;
- static const char_class_type mask_horizontal = char_class_type(1) << offset_horizontal;
- static const char_class_type mask_vertical = char_class_type(1) << offset_vertical;
-
- static const char_class_type masks[] =
- {
- 0,
- U_GC_L_MASK | U_GC_ND_MASK,
- U_GC_L_MASK,
- mask_blank,
- U_GC_CC_MASK | U_GC_CF_MASK | U_GC_ZL_MASK | U_GC_ZP_MASK,
- U_GC_ND_MASK,
- U_GC_ND_MASK,
- (0x3FFFFFFFu) & ~(U_GC_CC_MASK | U_GC_CF_MASK | U_GC_CS_MASK | U_GC_CN_MASK | U_GC_Z_MASK),
- mask_horizontal,
- U_GC_LL_MASK,
- U_GC_LL_MASK,
- ~(U_GC_C_MASK),
- U_GC_P_MASK,
- char_class_type(U_GC_Z_MASK) | mask_space,
- char_class_type(U_GC_Z_MASK) | mask_space,
- U_GC_LU_MASK,
- mask_unicode,
- U_GC_LU_MASK,
- mask_vertical,
- char_class_type(U_GC_L_MASK | U_GC_ND_MASK | U_GC_MN_MASK) | mask_underscore,
- char_class_type(U_GC_L_MASK | U_GC_ND_MASK | U_GC_MN_MASK) | mask_underscore,
- char_class_type(U_GC_ND_MASK) | mask_xdigit,
- };
-
- int idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
- if (idx >= 0)
- return masks[idx + 1];
- char_class_type result = lookup_icu_mask(p1, p2);
- if (result != 0)
- return result;
-
- if (idx < 0)
- {
- string_type s(p1, p2);
- string_type::size_type i = 0;
- while (i < s.size())
- {
- s[i] = static_cast<char>((::u_tolower)(s[i]));
- if (::u_isspace(s[i]) || (s[i] == '-') || (s[i] == '_'))
- s.erase(s.begin() + i, s.begin() + i + 1);
- else
- {
- s[i] = static_cast<char>((::u_tolower)(s[i]));
- ++i;
- }
- }
- if (!s.empty())
- idx = ::boost::BOOST_REGEX_DETAIL_NS::get_default_class_id(&*s.begin(), &*s.begin() + s.size());
- if (idx >= 0)
- return masks[idx + 1];
- if (!s.empty())
- result = lookup_icu_mask(&*s.begin(), &*s.begin() + s.size());
- if (result != 0)
- return result;
- }
- BOOST_ASSERT(std::size_t(idx + 1) < sizeof(masks) / sizeof(masks[0]));
- return masks[idx + 1];
- }
- string_type lookup_collatename(const char_type* p1, const char_type* p2) const
- {
- string_type result;
-#ifdef BOOST_NO_CXX98_BINDERS
- if (std::find_if(p1, p2, std::bind(std::greater< ::UChar32>(), std::placeholders::_1, 0x7f)) == p2)
-#else
- if (std::find_if(p1, p2, std::bind2nd(std::greater< ::UChar32>(), 0x7f)) == p2)
-#endif
- {
-#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
- std::string s(p1, p2);
-#else
- std::string s;
- const char_type* p3 = p1;
- while (p3 != p2)
- s.append(1, *p3++);
-#endif
- // Try Unicode name:
- UErrorCode err = U_ZERO_ERROR;
- UChar32 c = ::u_charFromName(U_UNICODE_CHAR_NAME, s.c_str(), &err);
- if (U_SUCCESS(err))
- {
- result.push_back(c);
- return result;
- }
- // Try Unicode-extended name:
- err = U_ZERO_ERROR;
- c = ::u_charFromName(U_EXTENDED_CHAR_NAME, s.c_str(), &err);
- if (U_SUCCESS(err))
- {
- result.push_back(c);
- return result;
- }
- // try POSIX name:
- s = ::boost::BOOST_REGEX_DETAIL_NS::lookup_default_collate_name(s);
-#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
- result.assign(s.begin(), s.end());
-#else
- result.clear();
- std::string::const_iterator si, sj;
- si = s.begin();
- sj = s.end();
- while (si != sj)
- result.push_back(*si++);
-#endif
- }
- if (result.empty() && (p2 - p1 == 1))
- result.push_back(*p1);
- return result;
- }
- bool isctype(char_type c, char_class_type f) const
- {
- static const char_class_type mask_blank = char_class_type(1) << offset_blank;
- static const char_class_type mask_space = char_class_type(1) << offset_space;
- static const char_class_type mask_xdigit = char_class_type(1) << offset_xdigit;
- static const char_class_type mask_underscore = char_class_type(1) << offset_underscore;
- static const char_class_type mask_unicode = char_class_type(1) << offset_unicode;
- static const char_class_type mask_any = char_class_type(1) << offset_any;
- static const char_class_type mask_ascii = char_class_type(1) << offset_ascii;
- static const char_class_type mask_horizontal = char_class_type(1) << offset_horizontal;
- static const char_class_type mask_vertical = char_class_type(1) << offset_vertical;
-
- // check for standard catagories first:
- char_class_type m = char_class_type(static_cast<char_class_type>(1) << u_charType(c));
- if ((m & f) != 0)
- return true;
- // now check for special cases:
- if (((f & mask_blank) != 0) && u_isblank(c))
- return true;
- if (((f & mask_space) != 0) && u_isspace(c))
- return true;
- if (((f & mask_xdigit) != 0) && (u_digit(c, 16) >= 0))
- return true;
- if (((f & mask_unicode) != 0) && (c >= 0x100))
- return true;
- if (((f & mask_underscore) != 0) && (c == '_'))
- return true;
- if (((f & mask_any) != 0) && (c <= 0x10FFFF))
- return true;
- if (((f & mask_ascii) != 0) && (c <= 0x7F))
- return true;
- if (((f & mask_vertical) != 0) && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == static_cast<char_type>('\v')) || (m == U_GC_ZL_MASK) || (m == U_GC_ZP_MASK)))
- return true;
- if (((f & mask_horizontal) != 0) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) && u_isspace(c) && (c != static_cast<char_type>('\v')))
- return true;
- return false;
- }
- boost::intmax_t toi(const char_type*& p1, const char_type* p2, int radix)const
- {
- return BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
- }
- int value(char_type c, int radix)const
- {
- return u_digit(c, static_cast< ::int8_t>(radix));
- }
- locale_type imbue(locale_type l)
- {
- locale_type result(m_pimpl->getloc());
- m_pimpl = BOOST_REGEX_DETAIL_NS::get_icu_regex_traits_implementation(l);
- return result;
- }
- locale_type getloc()const
- {
- return locale_type();
- }
- std::string error_string(::boost::regex_constants::error_type n) const
- {
- return BOOST_REGEX_DETAIL_NS::get_default_error_string(n);
- }
- private:
- icu_regex_traits(const icu_regex_traits&);
- icu_regex_traits& operator=(const icu_regex_traits&);
-
- //
- // define the bitmasks offsets we need for additional character properties:
- //
- enum {
- offset_blank = U_CHAR_CATEGORY_COUNT,
- offset_space = U_CHAR_CATEGORY_COUNT + 1,
- offset_xdigit = U_CHAR_CATEGORY_COUNT + 2,
- offset_underscore = U_CHAR_CATEGORY_COUNT + 3,
- offset_unicode = U_CHAR_CATEGORY_COUNT + 4,
- offset_any = U_CHAR_CATEGORY_COUNT + 5,
- offset_ascii = U_CHAR_CATEGORY_COUNT + 6,
- offset_horizontal = U_CHAR_CATEGORY_COUNT + 7,
- offset_vertical = U_CHAR_CATEGORY_COUNT + 8
- };
-
- static char_class_type lookup_icu_mask(const ::UChar32* p1, const ::UChar32* p2)
- {
- static const char_class_type mask_blank = char_class_type(1) << offset_blank;
- static const char_class_type mask_space = char_class_type(1) << offset_space;
- static const char_class_type mask_xdigit = char_class_type(1) << offset_xdigit;
- static const char_class_type mask_underscore = char_class_type(1) << offset_underscore;
- static const char_class_type mask_unicode = char_class_type(1) << offset_unicode;
- static const char_class_type mask_any = char_class_type(1) << offset_any;
- static const char_class_type mask_ascii = char_class_type(1) << offset_ascii;
- static const char_class_type mask_horizontal = char_class_type(1) << offset_horizontal;
- static const char_class_type mask_vertical = char_class_type(1) << offset_vertical;
-
- static const ::UChar32 prop_name_table[] = {
- /* any */ 'a', 'n', 'y',
- /* ascii */ 'a', 's', 'c', 'i', 'i',
- /* assigned */ 'a', 's', 's', 'i', 'g', 'n', 'e', 'd',
- /* c* */ 'c', '*',
- /* cc */ 'c', 'c',
- /* cf */ 'c', 'f',
- /* closepunctuation */ 'c', 'l', 'o', 's', 'e', 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* cn */ 'c', 'n',
- /* co */ 'c', 'o',
- /* connectorpunctuation */ 'c', 'o', 'n', 'n', 'e', 'c', 't', 'o', 'r', 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* control */ 'c', 'o', 'n', 't', 'r', 'o', 'l',
- /* cs */ 'c', 's',
- /* currencysymbol */ 'c', 'u', 'r', 'r', 'e', 'n', 'c', 'y', 's', 'y', 'm', 'b', 'o', 'l',
- /* dashpunctuation */ 'd', 'a', 's', 'h', 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* decimaldigitnumber */ 'd', 'e', 'c', 'i', 'm', 'a', 'l', 'd', 'i', 'g', 'i', 't', 'n', 'u', 'm', 'b', 'e', 'r',
- /* enclosingmark */ 'e', 'n', 'c', 'l', 'o', 's', 'i', 'n', 'g', 'm', 'a', 'r', 'k',
- /* finalpunctuation */ 'f', 'i', 'n', 'a', 'l', 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* format */ 'f', 'o', 'r', 'm', 'a', 't',
- /* initialpunctuation */ 'i', 'n', 'i', 't', 'i', 'a', 'l', 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* l* */ 'l', '*',
- /* letter */ 'l', 'e', 't', 't', 'e', 'r',
- /* letternumber */ 'l', 'e', 't', 't', 'e', 'r', 'n', 'u', 'm', 'b', 'e', 'r',
- /* lineseparator */ 'l', 'i', 'n', 'e', 's', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r',
- /* ll */ 'l', 'l',
- /* lm */ 'l', 'm',
- /* lo */ 'l', 'o',
- /* lowercaseletter */ 'l', 'o', 'w', 'e', 'r', 'c', 'a', 's', 'e', 'l', 'e', 't', 't', 'e', 'r',
- /* lt */ 'l', 't',
- /* lu */ 'l', 'u',
- /* m* */ 'm', '*',
- /* mark */ 'm', 'a', 'r', 'k',
- /* mathsymbol */ 'm', 'a', 't', 'h', 's', 'y', 'm', 'b', 'o', 'l',
- /* mc */ 'm', 'c',
- /* me */ 'm', 'e',
- /* mn */ 'm', 'n',
- /* modifierletter */ 'm', 'o', 'd', 'i', 'f', 'i', 'e', 'r', 'l', 'e', 't', 't', 'e', 'r',
- /* modifiersymbol */ 'm', 'o', 'd', 'i', 'f', 'i', 'e', 'r', 's', 'y', 'm', 'b', 'o', 'l',
- /* n* */ 'n', '*',
- /* nd */ 'n', 'd',
- /* nl */ 'n', 'l',
- /* no */ 'n', 'o',
- /* nonspacingmark */ 'n', 'o', 'n', 's', 'p', 'a', 'c', 'i', 'n', 'g', 'm', 'a', 'r', 'k',
- /* notassigned */ 'n', 'o', 't', 'a', 's', 's', 'i', 'g', 'n', 'e', 'd',
- /* number */ 'n', 'u', 'm', 'b', 'e', 'r',
- /* openpunctuation */ 'o', 'p', 'e', 'n', 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* other */ 'o', 't', 'h', 'e', 'r',
- /* otherletter */ 'o', 't', 'h', 'e', 'r', 'l', 'e', 't', 't', 'e', 'r',
- /* othernumber */ 'o', 't', 'h', 'e', 'r', 'n', 'u', 'm', 'b', 'e', 'r',
- /* otherpunctuation */ 'o', 't', 'h', 'e', 'r', 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* othersymbol */ 'o', 't', 'h', 'e', 'r', 's', 'y', 'm', 'b', 'o', 'l',
- /* p* */ 'p', '*',
- /* paragraphseparator */ 'p', 'a', 'r', 'a', 'g', 'r', 'a', 'p', 'h', 's', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r',
- /* pc */ 'p', 'c',
- /* pd */ 'p', 'd',
- /* pe */ 'p', 'e',
- /* pf */ 'p', 'f',
- /* pi */ 'p', 'i',
- /* po */ 'p', 'o',
- /* privateuse */ 'p', 'r', 'i', 'v', 'a', 't', 'e', 'u', 's', 'e',
- /* ps */ 'p', 's',
- /* punctuation */ 'p', 'u', 'n', 'c', 't', 'u', 'a', 't', 'i', 'o', 'n',
- /* s* */ 's', '*',
- /* sc */ 's', 'c',
- /* separator */ 's', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r',
- /* sk */ 's', 'k',
- /* sm */ 's', 'm',
- /* so */ 's', 'o',
- /* spaceseparator */ 's', 'p', 'a', 'c', 'e', 's', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r',
- /* spacingcombiningmark */ 's', 'p', 'a', 'c', 'i', 'n', 'g', 'c', 'o', 'm', 'b', 'i', 'n', 'i', 'n', 'g', 'm', 'a', 'r', 'k',
- /* surrogate */ 's', 'u', 'r', 'r', 'o', 'g', 'a', 't', 'e',
- /* symbol */ 's', 'y', 'm', 'b', 'o', 'l',
- /* titlecase */ 't', 'i', 't', 'l', 'e', 'c', 'a', 's', 'e',
- /* titlecaseletter */ 't', 'i', 't', 'l', 'e', 'c', 'a', 's', 'e', 'l', 'e', 't', 't', 'e', 'r',
- /* uppercaseletter */ 'u', 'p', 'p', 'e', 'r', 'c', 'a', 's', 'e', 'l', 'e', 't', 't', 'e', 'r',
- /* z* */ 'z', '*',
- /* zl */ 'z', 'l',
- /* zp */ 'z', 'p',
- /* zs */ 'z', 's',
- };
-
- static const BOOST_REGEX_DETAIL_NS::character_pointer_range< ::UChar32> range_data[] = {
- { prop_name_table + 0, prop_name_table + 3, }, // any
- { prop_name_table + 3, prop_name_table + 8, }, // ascii
- { prop_name_table + 8, prop_name_table + 16, }, // assigned
- { prop_name_table + 16, prop_name_table + 18, }, // c*
- { prop_name_table + 18, prop_name_table + 20, }, // cc
- { prop_name_table + 20, prop_name_table + 22, }, // cf
- { prop_name_table + 22, prop_name_table + 38, }, // closepunctuation
- { prop_name_table + 38, prop_name_table + 40, }, // cn
- { prop_name_table + 40, prop_name_table + 42, }, // co
- { prop_name_table + 42, prop_name_table + 62, }, // connectorpunctuation
- { prop_name_table + 62, prop_name_table + 69, }, // control
- { prop_name_table + 69, prop_name_table + 71, }, // cs
- { prop_name_table + 71, prop_name_table + 85, }, // currencysymbol
- { prop_name_table + 85, prop_name_table + 100, }, // dashpunctuation
- { prop_name_table + 100, prop_name_table + 118, }, // decimaldigitnumber
- { prop_name_table + 118, prop_name_table + 131, }, // enclosingmark
- { prop_name_table + 131, prop_name_table + 147, }, // finalpunctuation
- { prop_name_table + 147, prop_name_table + 153, }, // format
- { prop_name_table + 153, prop_name_table + 171, }, // initialpunctuation
- { prop_name_table + 171, prop_name_table + 173, }, // l*
- { prop_name_table + 173, prop_name_table + 179, }, // letter
- { prop_name_table + 179, prop_name_table + 191, }, // letternumber
- { prop_name_table + 191, prop_name_table + 204, }, // lineseparator
- { prop_name_table + 204, prop_name_table + 206, }, // ll
- { prop_name_table + 206, prop_name_table + 208, }, // lm
- { prop_name_table + 208, prop_name_table + 210, }, // lo
- { prop_name_table + 210, prop_name_table + 225, }, // lowercaseletter
- { prop_name_table + 225, prop_name_table + 227, }, // lt
- { prop_name_table + 227, prop_name_table + 229, }, // lu
- { prop_name_table + 229, prop_name_table + 231, }, // m*
- { prop_name_table + 231, prop_name_table + 235, }, // mark
- { prop_name_table + 235, prop_name_table + 245, }, // mathsymbol
- { prop_name_table + 245, prop_name_table + 247, }, // mc
- { prop_name_table + 247, prop_name_table + 249, }, // me
- { prop_name_table + 249, prop_name_table + 251, }, // mn
- { prop_name_table + 251, prop_name_table + 265, }, // modifierletter
- { prop_name_table + 265, prop_name_table + 279, }, // modifiersymbol
- { prop_name_table + 279, prop_name_table + 281, }, // n*
- { prop_name_table + 281, prop_name_table + 283, }, // nd
- { prop_name_table + 283, prop_name_table + 285, }, // nl
- { prop_name_table + 285, prop_name_table + 287, }, // no
- { prop_name_table + 287, prop_name_table + 301, }, // nonspacingmark
- { prop_name_table + 301, prop_name_table + 312, }, // notassigned
- { prop_name_table + 312, prop_name_table + 318, }, // number
- { prop_name_table + 318, prop_name_table + 333, }, // openpunctuation
- { prop_name_table + 333, prop_name_table + 338, }, // other
- { prop_name_table + 338, prop_name_table + 349, }, // otherletter
- { prop_name_table + 349, prop_name_table + 360, }, // othernumber
- { prop_name_table + 360, prop_name_table + 376, }, // otherpunctuation
- { prop_name_table + 376, prop_name_table + 387, }, // othersymbol
- { prop_name_table + 387, prop_name_table + 389, }, // p*
- { prop_name_table + 389, prop_name_table + 407, }, // paragraphseparator
- { prop_name_table + 407, prop_name_table + 409, }, // pc
- { prop_name_table + 409, prop_name_table + 411, }, // pd
- { prop_name_table + 411, prop_name_table + 413, }, // pe
- { prop_name_table + 413, prop_name_table + 415, }, // pf
- { prop_name_table + 415, prop_name_table + 417, }, // pi
- { prop_name_table + 417, prop_name_table + 419, }, // po
- { prop_name_table + 419, prop_name_table + 429, }, // privateuse
- { prop_name_table + 429, prop_name_table + 431, }, // ps
- { prop_name_table + 431, prop_name_table + 442, }, // punctuation
- { prop_name_table + 442, prop_name_table + 444, }, // s*
- { prop_name_table + 444, prop_name_table + 446, }, // sc
- { prop_name_table + 446, prop_name_table + 455, }, // separator
- { prop_name_table + 455, prop_name_table + 457, }, // sk
- { prop_name_table + 457, prop_name_table + 459, }, // sm
- { prop_name_table + 459, prop_name_table + 461, }, // so
- { prop_name_table + 461, prop_name_table + 475, }, // spaceseparator
- { prop_name_table + 475, prop_name_table + 495, }, // spacingcombiningmark
- { prop_name_table + 495, prop_name_table + 504, }, // surrogate
- { prop_name_table + 504, prop_name_table + 510, }, // symbol
- { prop_name_table + 510, prop_name_table + 519, }, // titlecase
- { prop_name_table + 519, prop_name_table + 534, }, // titlecaseletter
- { prop_name_table + 534, prop_name_table + 549, }, // uppercaseletter
- { prop_name_table + 549, prop_name_table + 551, }, // z*
- { prop_name_table + 551, prop_name_table + 553, }, // zl
- { prop_name_table + 553, prop_name_table + 555, }, // zp
- { prop_name_table + 555, prop_name_table + 557, }, // zs
- };
-
- static const icu_regex_traits::char_class_type icu_class_map[] = {
- mask_any, // any
- mask_ascii, // ascii
- (0x3FFFFFFFu) & ~(U_GC_CN_MASK), // assigned
- U_GC_C_MASK, // c*
- U_GC_CC_MASK, // cc
- U_GC_CF_MASK, // cf
- U_GC_PE_MASK, // closepunctuation
- U_GC_CN_MASK, // cn
- U_GC_CO_MASK, // co
- U_GC_PC_MASK, // connectorpunctuation
- U_GC_CC_MASK, // control
- U_GC_CS_MASK, // cs
- U_GC_SC_MASK, // currencysymbol
- U_GC_PD_MASK, // dashpunctuation
- U_GC_ND_MASK, // decimaldigitnumber
- U_GC_ME_MASK, // enclosingmark
- U_GC_PF_MASK, // finalpunctuation
- U_GC_CF_MASK, // format
- U_GC_PI_MASK, // initialpunctuation
- U_GC_L_MASK, // l*
- U_GC_L_MASK, // letter
- U_GC_NL_MASK, // letternumber
- U_GC_ZL_MASK, // lineseparator
- U_GC_LL_MASK, // ll
- U_GC_LM_MASK, // lm
- U_GC_LO_MASK, // lo
- U_GC_LL_MASK, // lowercaseletter
- U_GC_LT_MASK, // lt
- U_GC_LU_MASK, // lu
- U_GC_M_MASK, // m*
- U_GC_M_MASK, // mark
- U_GC_SM_MASK, // mathsymbol
- U_GC_MC_MASK, // mc
- U_GC_ME_MASK, // me
- U_GC_MN_MASK, // mn
- U_GC_LM_MASK, // modifierletter
- U_GC_SK_MASK, // modifiersymbol
- U_GC_N_MASK, // n*
- U_GC_ND_MASK, // nd
- U_GC_NL_MASK, // nl
- U_GC_NO_MASK, // no
- U_GC_MN_MASK, // nonspacingmark
- U_GC_CN_MASK, // notassigned
- U_GC_N_MASK, // number
- U_GC_PS_MASK, // openpunctuation
- U_GC_C_MASK, // other
- U_GC_LO_MASK, // otherletter
- U_GC_NO_MASK, // othernumber
- U_GC_PO_MASK, // otherpunctuation
- U_GC_SO_MASK, // othersymbol
- U_GC_P_MASK, // p*
- U_GC_ZP_MASK, // paragraphseparator
- U_GC_PC_MASK, // pc
- U_GC_PD_MASK, // pd
- U_GC_PE_MASK, // pe
- U_GC_PF_MASK, // pf
- U_GC_PI_MASK, // pi
- U_GC_PO_MASK, // po
- U_GC_CO_MASK, // privateuse
- U_GC_PS_MASK, // ps
- U_GC_P_MASK, // punctuation
- U_GC_S_MASK, // s*
- U_GC_SC_MASK, // sc
- U_GC_Z_MASK, // separator
- U_GC_SK_MASK, // sk
- U_GC_SM_MASK, // sm
- U_GC_SO_MASK, // so
- U_GC_ZS_MASK, // spaceseparator
- U_GC_MC_MASK, // spacingcombiningmark
- U_GC_CS_MASK, // surrogate
- U_GC_S_MASK, // symbol
- U_GC_LT_MASK, // titlecase
- U_GC_LT_MASK, // titlecaseletter
- U_GC_LU_MASK, // uppercaseletter
- U_GC_Z_MASK, // z*
- U_GC_ZL_MASK, // zl
- U_GC_ZP_MASK, // zp
- U_GC_ZS_MASK, // zs
- };
-
-
- const BOOST_REGEX_DETAIL_NS::character_pointer_range< ::UChar32>* ranges_begin = range_data;
- const BOOST_REGEX_DETAIL_NS::character_pointer_range< ::UChar32>* ranges_end = range_data + (sizeof(range_data) / sizeof(range_data[0]));
-
- BOOST_REGEX_DETAIL_NS::character_pointer_range< ::UChar32> t = { p1, p2, };
- const BOOST_REGEX_DETAIL_NS::character_pointer_range< ::UChar32>* p = std::lower_bound(ranges_begin, ranges_end, t);
- if ((p != ranges_end) && (t == *p))
- return icu_class_map[p - ranges_begin];
- return 0;
- }
-
- boost::shared_ptr< ::boost::BOOST_REGEX_DETAIL_NS::icu_regex_traits_implementation> m_pimpl;
- };
-
-} // namespace boost
-
-namespace boost {
-
- // types:
- typedef basic_regex< ::UChar32, icu_regex_traits> u32regex;
- typedef match_results<const ::UChar32*> u32match;
- typedef match_results<const ::UChar*> u16match;
-
- //
- // Construction of 32-bit regex types from UTF-8 and UTF-16 primitives:
- //
- namespace BOOST_REGEX_DETAIL_NS {
-
-#if !defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(__IBMCPP__)
- template <class InputIterator>
- inline u32regex do_make_u32regex(InputIterator i,
- InputIterator j,
- boost::regex_constants::syntax_option_type opt,
- const boost::mpl::int_<1>*)
- {
- typedef boost::u8_to_u32_iterator<InputIterator, UChar32> conv_type;
- return u32regex(conv_type(i, i, j), conv_type(j, i, j), opt);
- }
-
- template <class InputIterator>
- inline u32regex do_make_u32regex(InputIterator i,
- InputIterator j,
- boost::regex_constants::syntax_option_type opt,
- const boost::mpl::int_<2>*)
- {
- typedef boost::u16_to_u32_iterator<InputIterator, UChar32> conv_type;
- return u32regex(conv_type(i, i, j), conv_type(j, i, j), opt);
- }
-
- template <class InputIterator>
- inline u32regex do_make_u32regex(InputIterator i,
- InputIterator j,
- boost::regex_constants::syntax_option_type opt,
- const boost::mpl::int_<4>*)
- {
- return u32regex(i, j, opt);
- }
-#else
- template <class InputIterator>
- inline u32regex do_make_u32regex(InputIterator i,
- InputIterator j,
- boost::regex_constants::syntax_option_type opt,
- const boost::mpl::int_<1>*)
- {
- typedef boost::u8_to_u32_iterator<InputIterator, UChar32> conv_type;
- typedef std::vector<UChar32> vector_type;
- vector_type v;
- conv_type a(i, i, j), b(j, i, j);
- while (a != b)
- {
- v.push_back(*a);
- ++a;
- }
- if (v.size())
- return u32regex(&*v.begin(), v.size(), opt);
- return u32regex(static_cast<UChar32 const*>(0), static_cast<u32regex::size_type>(0), opt);
- }
-
- template <class InputIterator>
- inline u32regex do_make_u32regex(InputIterator i,
- InputIterator j,
- boost::regex_constants::syntax_option_type opt,
- const boost::mpl::int_<2>*)
- {
- typedef boost::u16_to_u32_iterator<InputIterator, UChar32> conv_type;
- typedef std::vector<UChar32> vector_type;
- vector_type v;
- conv_type a(i, i, j), b(j, i, j);
- while (a != b)
- {
- v.push_back(*a);
- ++a;
- }
- if (v.size())
- return u32regex(&*v.begin(), v.size(), opt);
- return u32regex(static_cast<UChar32 const*>(0), static_cast<u32regex::size_type>(0), opt);
- }
-
- template <class InputIterator>
- inline u32regex do_make_u32regex(InputIterator i,
- InputIterator j,
- boost::regex_constants::syntax_option_type opt,
- const boost::mpl::int_<4>*)
- {
- typedef std::vector<UChar32> vector_type;
- vector_type v;
- while (i != j)
- {
- v.push_back((UChar32)(*i));
- ++i;
- }
- if (v.size())
- return u32regex(&*v.begin(), v.size(), opt);
- return u32regex(static_cast<UChar32 const*>(0), static_cast<u32regex::size_type>(0), opt);
- }
-#endif
- }
-
- // BOOST_REGEX_UCHAR_IS_WCHAR_T
- //
- // Source inspection of unicode/umachine.h in ICU version 59 indicates that:
- //
- // On version 59, UChar is always char16_t in C++ mode (and uint16_t in C mode)
- //
- // On earlier versions, the logic is
- //
- // #if U_SIZEOF_WCHAR_T==2
- // typedef wchar_t OldUChar;
- // #elif defined(__CHAR16_TYPE__)
- // typedef __CHAR16_TYPE__ OldUChar;
- // #else
- // typedef uint16_t OldUChar;
- // #endif
- //
- // That is, UChar is wchar_t only on versions below 59, when U_SIZEOF_WCHAR_T==2
- //
- // Hence,
-
-#define BOOST_REGEX_UCHAR_IS_WCHAR_T (U_ICU_VERSION_MAJOR_NUM < 59 && U_SIZEOF_WCHAR_T == 2)
-
-#if BOOST_REGEX_UCHAR_IS_WCHAR_T
- BOOST_STATIC_ASSERT((boost::is_same<UChar, wchar_t>::value));
-#else
- BOOST_STATIC_ASSERT(!(boost::is_same<UChar, wchar_t>::value));
-#endif
-
- //
- // Construction from an iterator pair:
- //
- template <class InputIterator>
- inline u32regex make_u32regex(InputIterator i,
- InputIterator j,
- boost::regex_constants::syntax_option_type opt)
- {
- return BOOST_REGEX_DETAIL_NS::do_make_u32regex(i, j, opt, static_cast<boost::mpl::int_<sizeof(*i)> const*>(0));
- }
- //
- // construction from UTF-8 nul-terminated strings:
- //
- inline u32regex make_u32regex(const char* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
- {
- return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + std::strlen(p), opt, static_cast<boost::mpl::int_<1> const*>(0));
- }
- inline u32regex make_u32regex(const unsigned char* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
- {
- return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + std::strlen(reinterpret_cast<const char*>(p)), opt, static_cast<boost::mpl::int_<1> const*>(0));
- }
- //
- // construction from UTF-16 nul-terminated strings:
- //
-#ifndef BOOST_NO_WREGEX
- inline u32regex make_u32regex(const wchar_t* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
- {
- return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + std::wcslen(p), opt, static_cast<boost::mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
-#if !BOOST_REGEX_UCHAR_IS_WCHAR_T
- inline u32regex make_u32regex(const UChar* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
- {
- return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + u_strlen(p), opt, static_cast<boost::mpl::int_<2> const*>(0));
- }
-#endif
- //
- // construction from basic_string class-template:
- //
- template<class C, class T, class A>
- inline u32regex make_u32regex(const std::basic_string<C, T, A>& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
- {
- return BOOST_REGEX_DETAIL_NS::do_make_u32regex(s.begin(), s.end(), opt, static_cast<boost::mpl::int_<sizeof(C)> const*>(0));
- }
- //
- // Construction from ICU string type:
- //
- inline u32regex make_u32regex(const U_NAMESPACE_QUALIFIER UnicodeString& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
- {
- return BOOST_REGEX_DETAIL_NS::do_make_u32regex(s.getBuffer(), s.getBuffer() + s.length(), opt, static_cast<boost::mpl::int_<2> const*>(0));
- }
-
- //
- // regex_match overloads that widen the character type as appropriate:
- //
- namespace BOOST_REGEX_DETAIL_NS {
- template<class MR1, class MR2, class NSubs>
- void copy_results(MR1& out, MR2 const& in, NSubs named_subs)
- {
- // copy results from an adapted MR2 match_results:
- out.set_size(in.size(), in.prefix().first.base(), in.suffix().second.base());
- out.set_base(in.base().base());
- out.set_named_subs(named_subs);
- for (int i = 0; i < (int)in.size(); ++i)
- {
- if (in[i].matched || !i)
- {
- out.set_first(in[i].first.base(), i);
- out.set_second(in[i].second.base(), i, in[i].matched);
- }
- }
-#ifdef BOOST_REGEX_MATCH_EXTRA
- // Copy full capture info as well:
- for (int i = 0; i < (int)in.size(); ++i)
- {
- if (in[i].captures().size())
- {
- out[i].get_captures().assign(in[i].captures().size(), typename MR1::value_type());
- for (int j = 0; j < (int)out[i].captures().size(); ++j)
- {
- out[i].get_captures()[j].first = in[i].captures()[j].first.base();
- out[i].get_captures()[j].second = in[i].captures()[j].second.base();
- out[i].get_captures()[j].matched = in[i].captures()[j].matched;
- }
- }
- }
-#endif
- }
-
- template <class BidiIterator, class Allocator>
- inline bool do_regex_match(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags,
- boost::mpl::int_<4> const*)
- {
- return ::boost::regex_match(first, last, m, e, flags);
- }
- template <class BidiIterator, class Allocator>
- bool do_regex_match(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags,
- boost::mpl::int_<2> const*)
- {
- typedef u16_to_u32_iterator<BidiIterator, UChar32> conv_type;
- typedef match_results<conv_type> match_type;
- //typedef typename match_type::allocator_type alloc_type;
- match_type what;
- bool result = ::boost::regex_match(conv_type(first, first, last), conv_type(last, first, last), what, e, flags);
- // copy results across to m:
- if (result) copy_results(m, what, e.get_named_subs());
- return result;
- }
- template <class BidiIterator, class Allocator>
- bool do_regex_match(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags,
- boost::mpl::int_<1> const*)
- {
- typedef u8_to_u32_iterator<BidiIterator, UChar32> conv_type;
- typedef match_results<conv_type> match_type;
- //typedef typename match_type::allocator_type alloc_type;
- match_type what;
- bool result = ::boost::regex_match(conv_type(first, first, last), conv_type(last, first, last), what, e, flags);
- // copy results across to m:
- if (result) copy_results(m, what, e.get_named_subs());
- return result;
- }
- } // namespace BOOST_REGEX_DETAIL_NS
-
- template <class BidiIterator, class Allocator>
- inline bool u32regex_match(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
- }
- inline bool u32regex_match(const UChar* p,
- match_results<const UChar*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
- }
-#if !BOOST_REGEX_UCHAR_IS_WCHAR_T && !defined(BOOST_NO_WREGEX)
- inline bool u32regex_match(const wchar_t* p,
- match_results<const wchar_t*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_match(const char* p,
- match_results<const char*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_match(const unsigned char* p,
- match_results<const unsigned char*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_match(const std::string& s,
- match_results<std::string::const_iterator>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
- }
-#ifndef BOOST_NO_STD_WSTRING
- inline bool u32regex_match(const std::wstring& s,
- match_results<std::wstring::const_iterator>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s,
- match_results<const UChar*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<2> const*>(0));
- }
- //
- // regex_match overloads that do not return what matched:
- //
- template <class BidiIterator>
- inline bool u32regex_match(BidiIterator first, BidiIterator last,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<BidiIterator> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
- }
- inline bool u32regex_match(const UChar* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const UChar*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
- }
-#if !BOOST_REGEX_UCHAR_IS_WCHAR_T && !defined(BOOST_NO_WREGEX)
- inline bool u32regex_match(const wchar_t* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const wchar_t*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_match(const char* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const char*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_match(const unsigned char* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const unsigned char*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p + std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_match(const std::string& s,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<std::string::const_iterator> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
- }
-#ifndef BOOST_NO_STD_WSTRING
- inline bool u32regex_match(const std::wstring& s,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<std::wstring::const_iterator> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const UChar*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<2> const*>(0));
- }
-
- //
- // regex_search overloads that widen the character type as appropriate:
- //
- namespace BOOST_REGEX_DETAIL_NS {
- template <class BidiIterator, class Allocator>
- inline bool do_regex_search(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags,
- BidiIterator base,
- boost::mpl::int_<4> const*)
- {
- return ::boost::regex_search(first, last, m, e, flags, base);
- }
- template <class BidiIterator, class Allocator>
- bool do_regex_search(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags,
- BidiIterator base,
- boost::mpl::int_<2> const*)
- {
- typedef u16_to_u32_iterator<BidiIterator, UChar32> conv_type;
- typedef match_results<conv_type> match_type;
- //typedef typename match_type::allocator_type alloc_type;
- match_type what;
- bool result = ::boost::regex_search(conv_type(first, first, last), conv_type(last, first, last), what, e, flags, conv_type(base));
- // copy results across to m:
- if (result) copy_results(m, what, e.get_named_subs());
- return result;
- }
- template <class BidiIterator, class Allocator>
- bool do_regex_search(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags,
- BidiIterator base,
- boost::mpl::int_<1> const*)
- {
- typedef u8_to_u32_iterator<BidiIterator, UChar32> conv_type;
- typedef match_results<conv_type> match_type;
- //typedef typename match_type::allocator_type alloc_type;
- match_type what;
- bool result = ::boost::regex_search(conv_type(first, first, last), conv_type(last, first, last), what, e, flags, conv_type(base));
- // copy results across to m:
- if (result) copy_results(m, what, e.get_named_subs());
- return result;
- }
- }
-
- template <class BidiIterator, class Allocator>
- inline bool u32regex_search(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
- }
- template <class BidiIterator, class Allocator>
- inline bool u32regex_search(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const u32regex& e,
- match_flag_type flags,
- BidiIterator base)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(first, last, m, e, flags, base, static_cast<mpl::int_<sizeof(*first)> const*>(0));
- }
- inline bool u32regex_search(const UChar* p,
- match_results<const UChar*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
- }
-#if !BOOST_REGEX_UCHAR_IS_WCHAR_T && !defined(BOOST_NO_WREGEX)
- inline bool u32regex_search(const wchar_t* p,
- match_results<const wchar_t*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_search(const char* p,
- match_results<const char*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_search(const unsigned char* p,
- match_results<const unsigned char*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_search(const std::string& s,
- match_results<std::string::const_iterator>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
- }
-#ifndef BOOST_NO_STD_WSTRING
- inline bool u32regex_search(const std::wstring& s,
- match_results<std::wstring::const_iterator>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s,
- match_results<const UChar*>& m,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<2> const*>(0));
- }
- template <class BidiIterator>
- inline bool u32regex_search(BidiIterator first, BidiIterator last,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<BidiIterator> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
- }
- inline bool u32regex_search(const UChar* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const UChar*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
- }
-#if !BOOST_REGEX_UCHAR_IS_WCHAR_T && !defined(BOOST_NO_WREGEX)
- inline bool u32regex_search(const wchar_t* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const wchar_t*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_search(const char* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const char*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_search(const unsigned char* p,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const unsigned char*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p + std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
- }
- inline bool u32regex_search(const std::string& s,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<std::string::const_iterator> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
- }
-#ifndef BOOST_NO_STD_WSTRING
- inline bool u32regex_search(const std::wstring& s,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<std::wstring::const_iterator> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
- }
-#endif
- inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s,
- const u32regex& e,
- match_flag_type flags = match_default)
- {
- match_results<const UChar*> m;
- return BOOST_REGEX_DETAIL_NS::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<2> const*>(0));
- }
-
- //
- // overloads for regex_replace with utf-8 and utf-16 data types:
- //
- namespace BOOST_REGEX_DETAIL_NS {
- template <class I>
- inline std::pair< boost::u8_to_u32_iterator<I>, boost::u8_to_u32_iterator<I> >
- make_utf32_seq(I i, I j, mpl::int_<1> const*)
- {
- return std::pair< boost::u8_to_u32_iterator<I>, boost::u8_to_u32_iterator<I> >(boost::u8_to_u32_iterator<I>(i, i, j), boost::u8_to_u32_iterator<I>(j, i, j));
- }
- template <class I>
- inline std::pair< boost::u16_to_u32_iterator<I>, boost::u16_to_u32_iterator<I> >
- make_utf32_seq(I i, I j, mpl::int_<2> const*)
- {
- return std::pair< boost::u16_to_u32_iterator<I>, boost::u16_to_u32_iterator<I> >(boost::u16_to_u32_iterator<I>(i, i, j), boost::u16_to_u32_iterator<I>(j, i, j));
- }
- template <class I>
- inline std::pair< I, I >
- make_utf32_seq(I i, I j, mpl::int_<4> const*)
- {
- return std::pair< I, I >(i, j);
- }
- template <class charT>
- inline std::pair< boost::u8_to_u32_iterator<const charT*>, boost::u8_to_u32_iterator<const charT*> >
- make_utf32_seq(const charT* p, mpl::int_<1> const*)
- {
- std::size_t len = std::strlen((const char*)p);
- return std::pair< boost::u8_to_u32_iterator<const charT*>, boost::u8_to_u32_iterator<const charT*> >(boost::u8_to_u32_iterator<const charT*>(p, p, p + len), boost::u8_to_u32_iterator<const charT*>(p + len, p, p + len));
- }
- template <class charT>
- inline std::pair< boost::u16_to_u32_iterator<const charT*>, boost::u16_to_u32_iterator<const charT*> >
- make_utf32_seq(const charT* p, mpl::int_<2> const*)
- {
- std::size_t len = u_strlen((const UChar*)p);
- return std::pair< boost::u16_to_u32_iterator<const charT*>, boost::u16_to_u32_iterator<const charT*> >(boost::u16_to_u32_iterator<const charT*>(p, p, p + len), boost::u16_to_u32_iterator<const charT*>(p + len, p, p + len));
- }
- template <class charT>
- inline std::pair< const charT*, const charT* >
- make_utf32_seq(const charT* p, mpl::int_<4> const*)
- {
- return std::pair< const charT*, const charT* >(p, p + icu_regex_traits::length((UChar32 const*)p));
- }
- template <class OutputIterator>
- inline OutputIterator make_utf32_out(OutputIterator o, mpl::int_<4> const*)
- {
- return o;
- }
- template <class OutputIterator>
- inline utf16_output_iterator<OutputIterator> make_utf32_out(OutputIterator o, mpl::int_<2> const*)
- {
- return o;
- }
- template <class OutputIterator>
- inline utf8_output_iterator<OutputIterator> make_utf32_out(OutputIterator o, mpl::int_<1> const*)
- {
- return o;
- }
-
- template <class OutputIterator, class I1, class I2>
- OutputIterator do_regex_replace(OutputIterator out,
- std::pair<I1, I1> const& in,
- const u32regex& e,
- const std::pair<I2, I2>& fmt,
- match_flag_type flags
- )
- {
- // unfortunately we have to copy the format string in order to pass in onward:
- std::vector<UChar32> f;
-#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
- f.assign(fmt.first, fmt.second);
-#else
- f.clear();
- I2 pos = fmt.first;
- while (pos != fmt.second)
- f.push_back(*pos++);
-#endif
-
- regex_iterator<I1, UChar32, icu_regex_traits> i(in.first, in.second, e, flags);
- regex_iterator<I1, UChar32, icu_regex_traits> j;
- if (i == j)
- {
- if (!(flags & regex_constants::format_no_copy))
- out = BOOST_REGEX_DETAIL_NS::copy(in.first, in.second, out);
- }
- else
- {
- I1 last_m = in.first;
- while (i != j)
- {
- if (!(flags & regex_constants::format_no_copy))
- out = BOOST_REGEX_DETAIL_NS::copy(i->prefix().first, i->prefix().second, out);
- if (!f.empty())
- out = ::boost::BOOST_REGEX_DETAIL_NS::regex_format_imp(out, *i, &*f.begin(), &*f.begin() + f.size(), flags, e.get_traits());
- else
- out = ::boost::BOOST_REGEX_DETAIL_NS::regex_format_imp(out, *i, static_cast<UChar32 const*>(0), static_cast<UChar32 const*>(0), flags, e.get_traits());
- last_m = (*i)[0].second;
- if (flags & regex_constants::format_first_only)
- break;
- ++i;
- }
- if (!(flags & regex_constants::format_no_copy))
- out = BOOST_REGEX_DETAIL_NS::copy(last_m, in.second, out);
- }
- return out;
- }
- template <class BaseIterator>
- inline const BaseIterator& extract_output_base(const BaseIterator& b)
- {
- return b;
- }
- template <class BaseIterator>
- inline BaseIterator extract_output_base(const utf8_output_iterator<BaseIterator>& b)
- {
- return b.base();
- }
- template <class BaseIterator>
- inline BaseIterator extract_output_base(const utf16_output_iterator<BaseIterator>& b)
- {
- return b.base();
- }
- } // BOOST_REGEX_DETAIL_NS
-
- template <class OutputIterator, class BidirectionalIterator, class charT>
- inline OutputIterator u32regex_replace(OutputIterator out,
- BidirectionalIterator first,
- BidirectionalIterator last,
- const u32regex& e,
- const charT* fmt,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::extract_output_base
- (
- BOOST_REGEX_DETAIL_NS::do_regex_replace(
- BOOST_REGEX_DETAIL_NS::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- e,
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt, static_cast<mpl::int_<sizeof(*fmt)> const*>(0)),
- flags)
- );
- }
-
- template <class OutputIterator, class Iterator, class charT>
- inline OutputIterator u32regex_replace(OutputIterator out,
- Iterator first,
- Iterator last,
- const u32regex& e,
- const std::basic_string<charT>& fmt,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::extract_output_base
- (
- BOOST_REGEX_DETAIL_NS::do_regex_replace(
- BOOST_REGEX_DETAIL_NS::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- e,
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt.begin(), fmt.end(), static_cast<mpl::int_<sizeof(charT)> const*>(0)),
- flags)
- );
- }
-
- template <class OutputIterator, class Iterator>
- inline OutputIterator u32regex_replace(OutputIterator out,
- Iterator first,
- Iterator last,
- const u32regex& e,
- const U_NAMESPACE_QUALIFIER UnicodeString& fmt,
- match_flag_type flags = match_default)
- {
- return BOOST_REGEX_DETAIL_NS::extract_output_base
- (
- BOOST_REGEX_DETAIL_NS::do_regex_replace(
- BOOST_REGEX_DETAIL_NS::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- e,
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
- flags)
- );
- }
-
- template <class charT>
- std::basic_string<charT> u32regex_replace(const std::basic_string<charT>& s,
- const u32regex& e,
- const charT* fmt,
- match_flag_type flags = match_default)
- {
- std::basic_string<charT> result;
- BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<charT> > i(result);
- u32regex_replace(i, s.begin(), s.end(), e, fmt, flags);
- return result;
- }
-
- template <class charT>
- std::basic_string<charT> u32regex_replace(const std::basic_string<charT>& s,
- const u32regex& e,
- const std::basic_string<charT>& fmt,
- match_flag_type flags = match_default)
- {
- std::basic_string<charT> result;
- BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<charT> > i(result);
- u32regex_replace(i, s.begin(), s.end(), e, fmt.c_str(), flags);
- return result;
- }
-
- namespace BOOST_REGEX_DETAIL_NS {
-
- class unicode_string_out_iterator
- {
- U_NAMESPACE_QUALIFIER UnicodeString* out;
- public:
- unicode_string_out_iterator(U_NAMESPACE_QUALIFIER UnicodeString& s) : out(&s) {}
- unicode_string_out_iterator& operator++() { return *this; }
- unicode_string_out_iterator& operator++(int) { return *this; }
- unicode_string_out_iterator& operator*() { return *this; }
- unicode_string_out_iterator& operator=(UChar v)
- {
- *out += v;
- return *this;
- }
- typedef std::ptrdiff_t difference_type;
- typedef UChar value_type;
- typedef value_type* pointer;
- typedef value_type& reference;
- typedef std::output_iterator_tag iterator_category;
- };
-
- }
-
- inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QUALIFIER UnicodeString& s,
- const u32regex& e,
- const UChar* fmt,
- match_flag_type flags = match_default)
- {
- U_NAMESPACE_QUALIFIER UnicodeString result;
- BOOST_REGEX_DETAIL_NS::unicode_string_out_iterator i(result);
- u32regex_replace(i, s.getBuffer(), s.getBuffer() + s.length(), e, fmt, flags);
- return result;
- }
-
- inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QUALIFIER UnicodeString& s,
- const u32regex& e,
- const U_NAMESPACE_QUALIFIER UnicodeString& fmt,
- match_flag_type flags = match_default)
- {
- U_NAMESPACE_QUALIFIER UnicodeString result;
- BOOST_REGEX_DETAIL_NS::unicode_string_out_iterator i(result);
- BOOST_REGEX_DETAIL_NS::do_regex_replace(
- BOOST_REGEX_DETAIL_NS::make_utf32_out(i, static_cast<mpl::int_<2> const*>(0)),
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(s.getBuffer(), s.getBuffer() + s.length(), static_cast<mpl::int_<2> const*>(0)),
- e,
- BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
- flags);
- return result;
- }
-
-} // namespace boost.
-
-#ifdef BOOST_MSVC
-#pragma warning (pop)
-#endif
-
-#include <boost/regex/v4/u32regex_iterator.hpp>
-#include <boost/regex/v4/u32regex_token_iterator.hpp>
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/indexed_bit_flag.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/indexed_bit_flag.hpp
deleted file mode 100644
index c9d32c59a1..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/indexed_bit_flag.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * Copyright (c) 2020
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE basic_regex_parser.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares template class basic_regex_parser.
- */
-
-#include <boost/regex/config.hpp>
-#include <set>
-
-#ifndef BOOST_REGEX_V4_INDEXED_BIT_FLAG_HPP
-#define BOOST_REGEX_V4_INDEXED_BIT_FLAG_HPP
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-class indexed_bit_flag
-{
- boost::uint64_t low_mask;
- std::set<std::size_t> mask_set;
-public:
- indexed_bit_flag() : low_mask(0) {}
- void set(std::size_t i)
- {
- if (i < std::numeric_limits<boost::uint64_t>::digits - 1)
- low_mask |= static_cast<boost::uint64_t>(1u) << i;
- else
- mask_set.insert(i);
- }
- bool test(std::size_t i)
- {
- if (i < std::numeric_limits<boost::uint64_t>::digits - 1)
- return low_mask & static_cast<boost::uint64_t>(1u) << i ? true : false;
- else
- return mask_set.find(i) != mask_set.end();
- }
-};
-
-} // namespace BOOST_REGEX_DETAIL_NS
-} // namespace boost
-
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/iterator_category.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/iterator_category.hpp
deleted file mode 100644
index 9e40142378..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/iterator_category.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *
- * Copyright (c) 2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_match.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Iterator traits for selecting an iterator type as
- * an integral constant expression.
- */
-
-
-#ifndef BOOST_REGEX_ITERATOR_CATEGORY_HPP
-#define BOOST_REGEX_ITERATOR_CATEGORY_HPP
-
-#include <iterator>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/is_pointer.hpp>
-
-namespace boost{
-namespace detail{
-
-template <class I>
-struct is_random_imp
-{
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
-private:
- typedef typename std::iterator_traits<I>::iterator_category cat;
-public:
- BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<cat*, std::random_access_iterator_tag*>::value));
-#else
- BOOST_STATIC_CONSTANT(bool, value = false);
-#endif
-};
-
-template <class I>
-struct is_random_pointer_imp
-{
- BOOST_STATIC_CONSTANT(bool, value = true);
-};
-
-template <bool is_pointer_type>
-struct is_random_imp_selector
-{
- template <class I>
- struct rebind
- {
- typedef is_random_imp<I> type;
- };
-};
-
-template <>
-struct is_random_imp_selector<true>
-{
- template <class I>
- struct rebind
- {
- typedef is_random_pointer_imp<I> type;
- };
-};
-
-}
-
-template <class I>
-struct is_random_access_iterator
-{
-private:
- typedef detail::is_random_imp_selector< ::boost::is_pointer<I>::value> selector;
- typedef typename selector::template rebind<I> bound_type;
- typedef typename bound_type::type answer;
-public:
- BOOST_STATIC_CONSTANT(bool, value = answer::value);
-};
-
-#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
-template <class I>
-const bool is_random_access_iterator<I>::value;
-#endif
-
-}
-
-#endif
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/iterator_traits.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/iterator_traits.hpp
deleted file mode 100644
index ae45ecb80c..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/iterator_traits.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE iterator_traits.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares iterator traits workarounds.
- */
-
-#ifndef BOOST_REGEX_V4_ITERATOR_TRAITS_HPP
-#define BOOST_REGEX_V4_ITERATOR_TRAITS_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-#if defined(BOOST_NO_STD_ITERATOR_TRAITS)
-
-template <class T>
-struct regex_iterator_traits
-{
- typedef typename T::iterator_category iterator_category;
- typedef typename T::value_type value_type;
-#if !defined(BOOST_NO_STD_ITERATOR)
- typedef typename T::difference_type difference_type;
- typedef typename T::pointer pointer;
- typedef typename T::reference reference;
-#else
- typedef std::ptrdiff_t difference_type;
- typedef value_type* pointer;
- typedef value_type& reference;
-#endif
-};
-
-template <class T>
-struct pointer_iterator_traits
-{
- typedef std::ptrdiff_t difference_type;
- typedef T value_type;
- typedef T* pointer;
- typedef T& reference;
- typedef std::random_access_iterator_tag iterator_category;
-};
-template <class T>
-struct const_pointer_iterator_traits
-{
- typedef std::ptrdiff_t difference_type;
- typedef T value_type;
- typedef const T* pointer;
- typedef const T& reference;
- typedef std::random_access_iterator_tag iterator_category;
-};
-
-template<>
-struct regex_iterator_traits<char*> : pointer_iterator_traits<char>{};
-template<>
-struct regex_iterator_traits<const char*> : const_pointer_iterator_traits<char>{};
-template<>
-struct regex_iterator_traits<wchar_t*> : pointer_iterator_traits<wchar_t>{};
-template<>
-struct regex_iterator_traits<const wchar_t*> : const_pointer_iterator_traits<wchar_t>{};
-//
-// the follwoing are needed for ICU support:
-//
-template<>
-struct regex_iterator_traits<unsigned char*> : pointer_iterator_traits<char>{};
-template<>
-struct regex_iterator_traits<const unsigned char*> : const_pointer_iterator_traits<char>{};
-template<>
-struct regex_iterator_traits<int*> : pointer_iterator_traits<int>{};
-template<>
-struct regex_iterator_traits<const int*> : const_pointer_iterator_traits<int>{};
-
-#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
-template<>
-struct regex_iterator_traits<unsigned short*> : pointer_iterator_traits<unsigned short>{};
-template<>
-struct regex_iterator_traits<const unsigned short*> : const_pointer_iterator_traits<unsigned short>{};
-#endif
-
-#if defined(__SGI_STL_PORT) && defined(__STL_DEBUG)
-template<>
-struct regex_iterator_traits<std::string::iterator> : pointer_iterator_traits<char>{};
-template<>
-struct regex_iterator_traits<std::string::const_iterator> : const_pointer_iterator_traits<char>{};
-#ifndef BOOST_NO_STD_WSTRING
-template<>
-struct regex_iterator_traits<std::wstring::iterator> : pointer_iterator_traits<wchar_t>{};
-template<>
-struct regex_iterator_traits<std::wstring::const_iterator> : const_pointer_iterator_traits<wchar_t>{};
-#endif // BOOST_NO_WSTRING
-#endif // stport
-
-#else
-
-template <class T>
-struct regex_iterator_traits : public std::iterator_traits<T> {};
-
-#endif
-
-} // namespace BOOST_REGEX_DETAIL_NS
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/match_flags.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/match_flags.hpp
deleted file mode 100644
index 5dc7265508..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/match_flags.hpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE match_flags.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares match_flags type.
- */
-
-#ifndef BOOST_REGEX_V4_MATCH_FLAGS
-#define BOOST_REGEX_V4_MATCH_FLAGS
-
-#ifdef __cplusplus
-# include <boost/cstdint.hpp>
-#endif
-
-#ifdef __cplusplus
-namespace boost{
- namespace regex_constants{
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable : 26812)
-#endif
-#endif
-
-typedef enum _match_flags
-{
- match_default = 0,
- match_not_bol = 1, /* first is not start of line */
- match_not_eol = match_not_bol << 1, /* last is not end of line */
- match_not_bob = match_not_eol << 1, /* first is not start of buffer */
- match_not_eob = match_not_bob << 1, /* last is not end of buffer */
- match_not_bow = match_not_eob << 1, /* first is not start of word */
- match_not_eow = match_not_bow << 1, /* last is not end of word */
- match_not_dot_newline = match_not_eow << 1, /* \n is not matched by '.' */
- match_not_dot_null = match_not_dot_newline << 1, /* '\0' is not matched by '.' */
- match_prev_avail = match_not_dot_null << 1, /* *--first is a valid expression */
- match_init = match_prev_avail << 1, /* internal use */
- match_any = match_init << 1, /* don't care what we match */
- match_not_null = match_any << 1, /* string can't be null */
- match_continuous = match_not_null << 1, /* each grep match must continue from */
- /* uninterrupted from the previous one */
- match_partial = match_continuous << 1, /* find partial matches */
-
- match_stop = match_partial << 1, /* stop after first match (grep) V3 only */
- match_not_initial_null = match_stop, /* don't match initial null, V4 only */
- match_all = match_stop << 1, /* must find the whole of input even if match_any is set */
- match_perl = match_all << 1, /* Use perl matching rules */
- match_posix = match_perl << 1, /* Use POSIX matching rules */
- match_nosubs = match_posix << 1, /* don't trap marked subs */
- match_extra = match_nosubs << 1, /* include full capture information for repeated captures */
- match_single_line = match_extra << 1, /* treat text as single line and ignore any \n's when matching ^ and $. */
- match_unused1 = match_single_line << 1, /* unused */
- match_unused2 = match_unused1 << 1, /* unused */
- match_unused3 = match_unused2 << 1, /* unused */
- match_max = match_unused3,
-
- format_perl = 0, /* perl style replacement */
- format_default = 0, /* ditto. */
- format_sed = match_max << 1, /* sed style replacement. */
- format_all = format_sed << 1, /* enable all extensions to syntax. */
- format_no_copy = format_all << 1, /* don't copy non-matching segments. */
- format_first_only = format_no_copy << 1, /* Only replace first occurrence. */
- format_is_if = format_first_only << 1, /* internal use only. */
- format_literal = format_is_if << 1, /* treat string as a literal */
-
- match_not_any = match_not_bol | match_not_eol | match_not_bob
- | match_not_eob | match_not_bow | match_not_eow | match_not_dot_newline
- | match_not_dot_null | match_prev_avail | match_init | match_not_null
- | match_continuous | match_partial | match_stop | match_not_initial_null
- | match_stop | match_all | match_perl | match_posix | match_nosubs
- | match_extra | match_single_line | match_unused1 | match_unused2
- | match_unused3 | match_max | format_perl | format_default | format_sed
- | format_all | format_no_copy | format_first_only | format_is_if
- | format_literal
-
-
-} match_flags;
-
-#if defined(BOOST_BORLANDC) || (defined(_MSC_VER) && (_MSC_VER <= 1310))
-typedef unsigned long match_flag_type;
-#else
-typedef match_flags match_flag_type;
-
-
-#ifdef __cplusplus
-inline match_flags operator&(match_flags m1, match_flags m2)
-{ return static_cast<match_flags>(static_cast<boost::int32_t>(m1) & static_cast<boost::int32_t>(m2)); }
-inline match_flags operator|(match_flags m1, match_flags m2)
-{ return static_cast<match_flags>(static_cast<boost::int32_t>(m1) | static_cast<boost::int32_t>(m2)); }
-inline match_flags operator^(match_flags m1, match_flags m2)
-{ return static_cast<match_flags>(static_cast<boost::int32_t>(m1) ^ static_cast<boost::int32_t>(m2)); }
-inline match_flags operator~(match_flags m1)
-{ return static_cast<match_flags>(~static_cast<boost::int32_t>(m1)); }
-inline match_flags& operator&=(match_flags& m1, match_flags m2)
-{ m1 = m1&m2; return m1; }
-inline match_flags& operator|=(match_flags& m1, match_flags m2)
-{ m1 = m1|m2; return m1; }
-inline match_flags& operator^=(match_flags& m1, match_flags m2)
-{ m1 = m1^m2; return m1; }
-#endif
-#endif
-
-#ifdef __cplusplus
-} /* namespace regex_constants */
-/*
- * import names into boost for backwards compatibility:
- */
-using regex_constants::match_flag_type;
-using regex_constants::match_default;
-using regex_constants::match_not_bol;
-using regex_constants::match_not_eol;
-using regex_constants::match_not_bob;
-using regex_constants::match_not_eob;
-using regex_constants::match_not_bow;
-using regex_constants::match_not_eow;
-using regex_constants::match_not_dot_newline;
-using regex_constants::match_not_dot_null;
-using regex_constants::match_prev_avail;
-/* using regex_constants::match_init; */
-using regex_constants::match_any;
-using regex_constants::match_not_null;
-using regex_constants::match_continuous;
-using regex_constants::match_partial;
-/*using regex_constants::match_stop; */
-using regex_constants::match_all;
-using regex_constants::match_perl;
-using regex_constants::match_posix;
-using regex_constants::match_nosubs;
-using regex_constants::match_extra;
-using regex_constants::match_single_line;
-/*using regex_constants::match_max; */
-using regex_constants::format_all;
-using regex_constants::format_sed;
-using regex_constants::format_perl;
-using regex_constants::format_default;
-using regex_constants::format_no_copy;
-using regex_constants::format_first_only;
-/*using regex_constants::format_is_if;*/
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-
-} /* namespace boost */
-#endif /* __cplusplus */
-#endif /* include guard */
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/match_results.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/match_results.hpp
deleted file mode 100644
index c580e4fcba..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/match_results.hpp
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2009
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE match_results.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares template class match_results.
- */
-
-#ifndef BOOST_REGEX_V4_MATCH_RESULTS_HPP
-#define BOOST_REGEX_V4_MATCH_RESULTS_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable : 4251)
-#if BOOST_MSVC < 1700
-# pragma warning(disable : 4231)
-#endif
-# if BOOST_MSVC < 1600
-# pragma warning(disable : 4660)
-# endif
-#endif
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-class named_subexpressions;
-
-}
-
-template <class BidiIterator, class Allocator>
-class match_results
-{
-private:
-#ifndef BOOST_NO_STD_ALLOCATOR
- typedef std::vector<sub_match<BidiIterator>, Allocator> vector_type;
-#else
- typedef std::vector<sub_match<BidiIterator> > vector_type;
-#endif
-public:
- typedef sub_match<BidiIterator> value_type;
-#ifndef BOOST_NO_CXX11_ALLOCATOR
- typedef typename std::allocator_traits<Allocator>::value_type const & const_reference;
-#elif !defined(BOOST_NO_STD_ALLOCATOR) && !(defined(BOOST_MSVC) && defined(_STLPORT_VERSION))
- typedef typename Allocator::const_reference const_reference;
-#else
- typedef const value_type& const_reference;
-#endif
- typedef const_reference reference;
- typedef typename vector_type::const_iterator const_iterator;
- typedef const_iterator iterator;
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<
- BidiIterator>::difference_type difference_type;
-#ifdef BOOST_NO_CXX11_ALLOCATOR
- typedef typename Allocator::size_type size_type;
-#else
- typedef typename std::allocator_traits<Allocator>::size_type size_type;
-#endif
- typedef Allocator allocator_type;
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<
- BidiIterator>::value_type char_type;
- typedef std::basic_string<char_type> string_type;
- typedef BOOST_REGEX_DETAIL_NS::named_subexpressions named_sub_type;
-
- // construct/copy/destroy:
- explicit match_results(const Allocator& a = Allocator())
-#ifndef BOOST_NO_STD_ALLOCATOR
- : m_subs(a), m_base(), m_null(), m_last_closed_paren(0), m_is_singular(true) {}
-#else
- : m_subs(), m_base(), m_null(), m_last_closed_paren(0), m_is_singular(true) { (void)a; }
-#endif
- //
- // IMPORTANT: in the code below, the crazy looking checks around m_is_singular are
- // all required because it is illegal to copy a singular iterator.
- // See https://svn.boost.org/trac/boost/ticket/3632.
- //
- match_results(const match_results& m)
- : m_subs(m.m_subs), m_base(), m_null(), m_named_subs(m.m_named_subs), m_last_closed_paren(m.m_last_closed_paren), m_is_singular(m.m_is_singular)
- {
- if(!m_is_singular)
- {
- m_base = m.m_base;
- m_null = m.m_null;
- }
- }
- match_results& operator=(const match_results& m)
- {
- m_subs = m.m_subs;
- m_named_subs = m.m_named_subs;
- m_last_closed_paren = m.m_last_closed_paren;
- m_is_singular = m.m_is_singular;
- if(!m_is_singular)
- {
- m_base = m.m_base;
- m_null = m.m_null;
- }
- return *this;
- }
- ~match_results(){}
-
- // size:
- size_type size() const
- { return empty() ? 0 : m_subs.size() - 2; }
- size_type max_size() const
- { return m_subs.max_size(); }
- bool empty() const
- { return m_subs.size() < 2; }
- // element access:
- difference_type length(int sub = 0) const
- {
- if(m_is_singular)
- raise_logic_error();
- sub += 2;
- if((sub < (int)m_subs.size()) && (sub > 0))
- return m_subs[sub].length();
- return 0;
- }
- difference_type length(const char_type* sub) const
- {
- if(m_is_singular)
- raise_logic_error();
- const char_type* sub_end = sub;
- while(*sub_end) ++sub_end;
- return length(named_subexpression_index(sub, sub_end));
- }
- template <class charT>
- difference_type length(const charT* sub) const
- {
- if(m_is_singular)
- raise_logic_error();
- const charT* sub_end = sub;
- while(*sub_end) ++sub_end;
- return length(named_subexpression_index(sub, sub_end));
- }
- template <class charT, class Traits, class A>
- difference_type length(const std::basic_string<charT, Traits, A>& sub) const
- {
- return length(sub.c_str());
- }
- difference_type position(size_type sub = 0) const
- {
- if(m_is_singular)
- raise_logic_error();
- sub += 2;
- if(sub < m_subs.size())
- {
- const sub_match<BidiIterator>& s = m_subs[sub];
- if(s.matched || (sub == 2))
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)(m_base), (BidiIterator)(s.first));
- }
- }
- return ~static_cast<difference_type>(0);
- }
- difference_type position(const char_type* sub) const
- {
- const char_type* sub_end = sub;
- while(*sub_end) ++sub_end;
- return position(named_subexpression_index(sub, sub_end));
- }
- template <class charT>
- difference_type position(const charT* sub) const
- {
- const charT* sub_end = sub;
- while(*sub_end) ++sub_end;
- return position(named_subexpression_index(sub, sub_end));
- }
- template <class charT, class Traits, class A>
- difference_type position(const std::basic_string<charT, Traits, A>& sub) const
- {
- return position(sub.c_str());
- }
- string_type str(int sub = 0) const
- {
- if(m_is_singular)
- raise_logic_error();
- sub += 2;
- string_type result;
- if(sub < (int)m_subs.size() && (sub > 0))
- {
- const sub_match<BidiIterator>& s = m_subs[sub];
- if(s.matched)
- {
- result = s.str();
- }
- }
- return result;
- }
- string_type str(const char_type* sub) const
- {
- return (*this)[sub].str();
- }
- template <class Traits, class A>
- string_type str(const std::basic_string<char_type, Traits, A>& sub) const
- {
- return (*this)[sub].str();
- }
- template <class charT>
- string_type str(const charT* sub) const
- {
- return (*this)[sub].str();
- }
- template <class charT, class Traits, class A>
- string_type str(const std::basic_string<charT, Traits, A>& sub) const
- {
- return (*this)[sub].str();
- }
- const_reference operator[](int sub) const
- {
- if(m_is_singular && m_subs.empty())
- raise_logic_error();
- sub += 2;
- if(sub < (int)m_subs.size() && (sub >= 0))
- {
- return m_subs[sub];
- }
- return m_null;
- }
- //
- // Named sub-expressions:
- //
- const_reference named_subexpression(const char_type* i, const char_type* j) const
- {
- //
- // Scan for the leftmost *matched* subexpression with the specified named:
- //
- if(m_is_singular)
- raise_logic_error();
- BOOST_REGEX_DETAIL_NS::named_subexpressions::range_type r = m_named_subs->equal_range(i, j);
- while((r.first != r.second) && ((*this)[r.first->index].matched == false))
- ++r.first;
- return r.first != r.second ? (*this)[r.first->index] : m_null;
- }
- template <class charT>
- const_reference named_subexpression(const charT* i, const charT* j) const
- {
- BOOST_STATIC_ASSERT(sizeof(charT) <= sizeof(char_type));
- if(i == j)
- return m_null;
- std::vector<char_type> s;
- while(i != j)
- s.insert(s.end(), *i++);
- return named_subexpression(&*s.begin(), &*s.begin() + s.size());
- }
- int named_subexpression_index(const char_type* i, const char_type* j) const
- {
- //
- // Scan for the leftmost *matched* subexpression with the specified named.
- // If none found then return the leftmost expression with that name,
- // otherwise an invalid index:
- //
- if(m_is_singular)
- raise_logic_error();
- BOOST_REGEX_DETAIL_NS::named_subexpressions::range_type s, r;
- s = r = m_named_subs->equal_range(i, j);
- while((r.first != r.second) && ((*this)[r.first->index].matched == false))
- ++r.first;
- if(r.first == r.second)
- r = s;
- return r.first != r.second ? r.first->index : -20;
- }
- template <class charT>
- int named_subexpression_index(const charT* i, const charT* j) const
- {
- BOOST_STATIC_ASSERT(sizeof(charT) <= sizeof(char_type));
- if(i == j)
- return -20;
- std::vector<char_type> s;
- while(i != j)
- s.insert(s.end(), *i++);
- return named_subexpression_index(&*s.begin(), &*s.begin() + s.size());
- }
- template <class Traits, class A>
- const_reference operator[](const std::basic_string<char_type, Traits, A>& s) const
- {
- return named_subexpression(s.c_str(), s.c_str() + s.size());
- }
- const_reference operator[](const char_type* p) const
- {
- const char_type* e = p;
- while(*e) ++e;
- return named_subexpression(p, e);
- }
-
- template <class charT>
- const_reference operator[](const charT* p) const
- {
- BOOST_STATIC_ASSERT(sizeof(charT) <= sizeof(char_type));
- if(*p == 0)
- return m_null;
- std::vector<char_type> s;
- while(*p)
- s.insert(s.end(), *p++);
- return named_subexpression(&*s.begin(), &*s.begin() + s.size());
- }
- template <class charT, class Traits, class A>
- const_reference operator[](const std::basic_string<charT, Traits, A>& ns) const
- {
- BOOST_STATIC_ASSERT(sizeof(charT) <= sizeof(char_type));
- if(ns.empty())
- return m_null;
- std::vector<char_type> s;
- for(unsigned i = 0; i < ns.size(); ++i)
- s.insert(s.end(), ns[i]);
- return named_subexpression(&*s.begin(), &*s.begin() + s.size());
- }
-
- const_reference prefix() const
- {
- if(m_is_singular)
- raise_logic_error();
- return (*this)[-1];
- }
-
- const_reference suffix() const
- {
- if(m_is_singular)
- raise_logic_error();
- return (*this)[-2];
- }
- const_iterator begin() const
- {
- return (m_subs.size() > 2) ? (m_subs.begin() + 2) : m_subs.end();
- }
- const_iterator end() const
- {
- return m_subs.end();
- }
- // format:
- template <class OutputIterator, class Functor>
- OutputIterator format(OutputIterator out,
- Functor fmt,
- match_flag_type flags = format_default) const
- {
- if(m_is_singular)
- raise_logic_error();
- typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, OutputIterator>::type F;
- F func(fmt);
- return func(*this, out, flags);
- }
- template <class Functor>
- string_type format(Functor fmt, match_flag_type flags = format_default) const
- {
- if(m_is_singular)
- raise_logic_error();
- std::basic_string<char_type> result;
- BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> > i(result);
-
- typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> > >::type F;
- F func(fmt);
-
- func(*this, i, flags);
- return result;
- }
- // format with locale:
- template <class OutputIterator, class Functor, class RegexT>
- OutputIterator format(OutputIterator out,
- Functor fmt,
- match_flag_type flags,
- const RegexT& re) const
- {
- if(m_is_singular)
- raise_logic_error();
- typedef ::boost::regex_traits_wrapper<typename RegexT::traits_type> traits_type;
- typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, OutputIterator, traits_type>::type F;
- F func(fmt);
- return func(*this, out, flags, re.get_traits());
- }
- template <class RegexT, class Functor>
- string_type format(Functor fmt,
- match_flag_type flags,
- const RegexT& re) const
- {
- if(m_is_singular)
- raise_logic_error();
- typedef ::boost::regex_traits_wrapper<typename RegexT::traits_type> traits_type;
- std::basic_string<char_type> result;
- BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> > i(result);
-
- typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> >, traits_type >::type F;
- F func(fmt);
-
- func(*this, i, flags, re.get_traits());
- return result;
- }
-
- const_reference get_last_closed_paren()const
- {
- if(m_is_singular)
- raise_logic_error();
- return m_last_closed_paren == 0 ? m_null : (*this)[m_last_closed_paren];
- }
-
- allocator_type get_allocator() const
- {
-#ifndef BOOST_NO_STD_ALLOCATOR
- return m_subs.get_allocator();
-#else
- return allocator_type();
-#endif
- }
- void swap(match_results& that)
- {
- std::swap(m_subs, that.m_subs);
- std::swap(m_named_subs, that.m_named_subs);
- std::swap(m_last_closed_paren, that.m_last_closed_paren);
- if(m_is_singular)
- {
- if(!that.m_is_singular)
- {
- m_base = that.m_base;
- m_null = that.m_null;
- }
- }
- else if(that.m_is_singular)
- {
- that.m_base = m_base;
- that.m_null = m_null;
- }
- else
- {
- std::swap(m_base, that.m_base);
- std::swap(m_null, that.m_null);
- }
- std::swap(m_is_singular, that.m_is_singular);
- }
- bool operator==(const match_results& that)const
- {
- if(m_is_singular)
- {
- return that.m_is_singular;
- }
- else if(that.m_is_singular)
- {
- return false;
- }
- return (m_subs == that.m_subs) && (m_base == that.m_base) && (m_last_closed_paren == that.m_last_closed_paren);
- }
- bool operator!=(const match_results& that)const
- { return !(*this == that); }
-
-#ifdef BOOST_REGEX_MATCH_EXTRA
- typedef typename sub_match<BidiIterator>::capture_sequence_type capture_sequence_type;
-
- const capture_sequence_type& captures(int i)const
- {
- if(m_is_singular)
- raise_logic_error();
- return (*this)[i].captures();
- }
-#endif
-
- //
- // private access functions:
- void BOOST_REGEX_CALL set_second(BidiIterator i)
- {
- BOOST_REGEX_ASSERT(m_subs.size() > 2);
- m_subs[2].second = i;
- m_subs[2].matched = true;
- m_subs[0].first = i;
- m_subs[0].matched = (m_subs[0].first != m_subs[0].second);
- m_null.first = i;
- m_null.second = i;
- m_null.matched = false;
- m_is_singular = false;
- }
-
- void BOOST_REGEX_CALL set_second(BidiIterator i, size_type pos, bool m = true, bool escape_k = false)
- {
- if(pos)
- m_last_closed_paren = static_cast<int>(pos);
- pos += 2;
- BOOST_REGEX_ASSERT(m_subs.size() > pos);
- m_subs[pos].second = i;
- m_subs[pos].matched = m;
- if((pos == 2) && !escape_k)
- {
- m_subs[0].first = i;
- m_subs[0].matched = (m_subs[0].first != m_subs[0].second);
- m_null.first = i;
- m_null.second = i;
- m_null.matched = false;
- m_is_singular = false;
- }
- }
- void BOOST_REGEX_CALL set_size(size_type n, BidiIterator i, BidiIterator j)
- {
- value_type v(j);
- size_type len = m_subs.size();
- if(len > n + 2)
- {
- m_subs.erase(m_subs.begin()+n+2, m_subs.end());
- std::fill(m_subs.begin(), m_subs.end(), v);
- }
- else
- {
- std::fill(m_subs.begin(), m_subs.end(), v);
- if(n+2 != len)
- m_subs.insert(m_subs.end(), n+2-len, v);
- }
- m_subs[1].first = i;
- m_last_closed_paren = 0;
- }
- void BOOST_REGEX_CALL set_base(BidiIterator pos)
- {
- m_base = pos;
- }
- BidiIterator base()const
- {
- return m_base;
- }
- void BOOST_REGEX_CALL set_first(BidiIterator i)
- {
- BOOST_REGEX_ASSERT(m_subs.size() > 2);
- // set up prefix:
- m_subs[1].second = i;
- m_subs[1].matched = (m_subs[1].first != i);
- // set up $0:
- m_subs[2].first = i;
- // zero out everything else:
- for(size_type n = 3; n < m_subs.size(); ++n)
- {
- m_subs[n].first = m_subs[n].second = m_subs[0].second;
- m_subs[n].matched = false;
- }
- }
- void BOOST_REGEX_CALL set_first(BidiIterator i, size_type pos, bool escape_k = false)
- {
- BOOST_REGEX_ASSERT(pos+2 < m_subs.size());
- if(pos || escape_k)
- {
- m_subs[pos+2].first = i;
- if(escape_k)
- {
- m_subs[1].second = i;
- m_subs[1].matched = (m_subs[1].first != m_subs[1].second);
- }
- }
- else
- set_first(i);
- }
- void BOOST_REGEX_CALL maybe_assign(const match_results<BidiIterator, Allocator>& m);
-
- void BOOST_REGEX_CALL set_named_subs(boost::shared_ptr<named_sub_type> subs)
- {
- m_named_subs = subs;
- }
-
-private:
- //
- // Error handler called when an uninitialized match_results is accessed:
- //
- static void raise_logic_error()
- {
- std::logic_error e("Attempt to access an uninitialized boost::match_results<> class.");
- boost::throw_exception(e);
- }
-
-
- vector_type m_subs; // subexpressions
- BidiIterator m_base; // where the search started from
- sub_match<BidiIterator> m_null; // a null match
- boost::shared_ptr<named_sub_type> m_named_subs; // Shared copy of named subs in the regex object
- int m_last_closed_paren; // Last ) to be seen - used for formatting
- bool m_is_singular; // True if our stored iterators are singular
-};
-
-template <class BidiIterator, class Allocator>
-void BOOST_REGEX_CALL match_results<BidiIterator, Allocator>::maybe_assign(const match_results<BidiIterator, Allocator>& m)
-{
- if(m_is_singular)
- {
- *this = m;
- return;
- }
- const_iterator p1, p2;
- p1 = begin();
- p2 = m.begin();
- //
- // Distances are measured from the start of *this* match, unless this isn't
- // a valid match in which case we use the start of the whole sequence. Note that
- // no subsequent match-candidate can ever be to the left of the first match found.
- // This ensures that when we are using bidirectional iterators, that distances
- // measured are as short as possible, and therefore as efficient as possible
- // to compute. Finally note that we don't use the "matched" data member to test
- // whether a sub-expression is a valid match, because partial matches set this
- // to false for sub-expression 0.
- //
- BidiIterator l_end = this->suffix().second;
- BidiIterator l_base = (p1->first == l_end) ? this->prefix().first : (*this)[0].first;
- difference_type len1 = 0;
- difference_type len2 = 0;
- difference_type base1 = 0;
- difference_type base2 = 0;
- std::size_t i;
- for(i = 0; i < size(); ++i, ++p1, ++p2)
- {
- //
- // Leftmost takes priority over longest; handle special cases
- // where distances need not be computed first (an optimisation
- // for bidirectional iterators: ensure that we don't accidently
- // compute the length of the whole sequence, as this can be really
- // expensive).
- //
- if(p1->first == l_end)
- {
- if(p2->first != l_end)
- {
- // p2 must be better than p1, and no need to calculate
- // actual distances:
- base1 = 1;
- base2 = 0;
- break;
- }
- else
- {
- // *p1 and *p2 are either unmatched or match end-of sequence,
- // either way no need to calculate distances:
- if((p1->matched == false) && (p2->matched == true))
- break;
- if((p1->matched == true) && (p2->matched == false))
- return;
- continue;
- }
- }
- else if(p2->first == l_end)
- {
- // p1 better than p2, and no need to calculate distances:
- return;
- }
- base1 = ::boost::BOOST_REGEX_DETAIL_NS::distance(l_base, p1->first);
- base2 = ::boost::BOOST_REGEX_DETAIL_NS::distance(l_base, p2->first);
- BOOST_REGEX_ASSERT(base1 >= 0);
- BOOST_REGEX_ASSERT(base2 >= 0);
- if(base1 < base2) return;
- if(base2 < base1) break;
-
- len1 = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)p1->first, (BidiIterator)p1->second);
- len2 = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)p2->first, (BidiIterator)p2->second);
- BOOST_REGEX_ASSERT(len1 >= 0);
- BOOST_REGEX_ASSERT(len2 >= 0);
- if((len1 != len2) || ((p1->matched == false) && (p2->matched == true)))
- break;
- if((p1->matched == true) && (p2->matched == false))
- return;
- }
- if(i == size())
- return;
- if(base2 < base1)
- *this = m;
- else if((len2 > len1) || ((p1->matched == false) && (p2->matched == true)) )
- *this = m;
-}
-
-template <class BidiIterator, class Allocator>
-void swap(match_results<BidiIterator, Allocator>& a, match_results<BidiIterator, Allocator>& b)
-{
- a.swap(b);
-}
-
-#ifndef BOOST_NO_STD_LOCALE
-template <class charT, class traits, class BidiIterator, class Allocator>
-std::basic_ostream<charT, traits>&
- operator << (std::basic_ostream<charT, traits>& os,
- const match_results<BidiIterator, Allocator>& s)
-{
- return (os << s.str());
-}
-#else
-template <class BidiIterator, class Allocator>
-std::ostream& operator << (std::ostream& os,
- const match_results<BidiIterator, Allocator>& s)
-{
- return (os << s.str());
-}
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/mem_block_cache.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/mem_block_cache.hpp
deleted file mode 100644
index 1996a512af..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/mem_block_cache.hpp
+++ /dev/null
@@ -1,183 +0,0 @@
- /*
- * Copyright (c) 2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE mem_block_cache.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: memory block cache used by the non-recursive matcher.
- */
-
-#ifndef BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP
-#define BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP
-
-#include <new>
-#ifdef BOOST_HAS_THREADS
-#include <boost/regex/pending/static_mutex.hpp>
-#endif
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-#ifndef BOOST_NO_CXX11_HDR_ATOMIC
- #include <atomic>
- #if ATOMIC_POINTER_LOCK_FREE == 2
- #define BOOST_REGEX_MEM_BLOCK_CACHE_LOCK_FREE
- #define BOOST_REGEX_ATOMIC_POINTER std::atomic
- #endif
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-#ifdef BOOST_REGEX_MEM_BLOCK_CACHE_LOCK_FREE /* lock free implementation */
-struct mem_block_cache
-{
- std::atomic<void*> cache[BOOST_REGEX_MAX_CACHE_BLOCKS];
-
- ~mem_block_cache()
- {
- for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) {
- if (cache[i].load()) ::operator delete(cache[i].load());
- }
- }
- void* get()
- {
- for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) {
- void* p = cache[i].load();
- if (p != NULL) {
- if (cache[i].compare_exchange_strong(p, NULL)) return p;
- }
- }
- return ::operator new(BOOST_REGEX_BLOCKSIZE);
- }
- void put(void* ptr)
- {
- for (size_t i = 0;i < BOOST_REGEX_MAX_CACHE_BLOCKS; ++i) {
- void* p = cache[i].load();
- if (p == NULL) {
- if (cache[i].compare_exchange_strong(p, ptr)) return;
- }
- }
- ::operator delete(ptr);
- }
-
- static mem_block_cache& instance()
- {
- static mem_block_cache block_cache = { { {nullptr} } };
- return block_cache;
- }
-};
-
-
-#else /* lock-based implementation */
-
-
-struct mem_block_node
-{
- mem_block_node* next;
-};
-
-struct mem_block_cache
-{
- // this member has to be statically initialsed:
- mem_block_node* next;
- unsigned cached_blocks;
-#ifdef BOOST_HAS_THREADS
- boost::static_mutex mut;
-#endif
-
- ~mem_block_cache()
- {
- while(next)
- {
- mem_block_node* old = next;
- next = next->next;
- ::operator delete(old);
- }
- }
- void* get()
- {
-#ifdef BOOST_HAS_THREADS
- boost::static_mutex::scoped_lock g(mut);
-#endif
- if(next)
- {
- mem_block_node* result = next;
- next = next->next;
- --cached_blocks;
- return result;
- }
- return ::operator new(BOOST_REGEX_BLOCKSIZE);
- }
- void put(void* p)
- {
-#ifdef BOOST_HAS_THREADS
- boost::static_mutex::scoped_lock g(mut);
-#endif
- if(cached_blocks >= BOOST_REGEX_MAX_CACHE_BLOCKS)
- {
- ::operator delete(p);
- }
- else
- {
- mem_block_node* old = static_cast<mem_block_node*>(p);
- old->next = next;
- next = old;
- ++cached_blocks;
- }
- }
- static mem_block_cache& instance()
- {
-#ifdef BOOST_HAS_THREADS
- static mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, };
-#else
- static mem_block_cache block_cache = { 0, 0, };
-#endif
- return block_cache;
- }
-};
-#endif
-
-#if BOOST_REGEX_MAX_CACHE_BLOCKS == 0
-
-inline void* BOOST_REGEX_CALL get_mem_block()
-{
- return ::operator new(BOOST_REGEX_BLOCKSIZE);
-}
-
-inline void BOOST_REGEX_CALL put_mem_block(void* p)
-{
- ::operator delete(p);
-}
-
-#else
-
-inline void* BOOST_REGEX_CALL get_mem_block()
-{
- return mem_block_cache::instance().get();
-}
-
-inline void BOOST_REGEX_CALL put_mem_block(void* p)
-{
- mem_block_cache::instance().put(p);
-}
-
-#endif
-}
-} // namespace boost
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-
-#endif
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/object_cache.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/object_cache.hpp
deleted file mode 100644
index 98ba4c19d3..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/object_cache.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE object_cache.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Implements a generic object cache.
- */
-
-#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
-#define BOOST_REGEX_OBJECT_CACHE_HPP
-
-#include <boost/regex/config.hpp>
-#include <boost/shared_ptr.hpp>
-#include <map>
-#include <list>
-#include <stdexcept>
-#include <string>
-#ifdef BOOST_HAS_THREADS
-#include <boost/regex/pending/static_mutex.hpp>
-#endif
-
-namespace boost{
-
-template <class Key, class Object>
-class object_cache
-{
-public:
- typedef std::pair< ::boost::shared_ptr<Object const>, Key const*> value_type;
- typedef std::list<value_type> list_type;
- typedef typename list_type::iterator list_iterator;
- typedef std::map<Key, list_iterator> map_type;
- typedef typename map_type::iterator map_iterator;
- typedef typename list_type::size_type size_type;
- static boost::shared_ptr<Object const> get(const Key& k, size_type l_max_cache_size);
-
-private:
- static boost::shared_ptr<Object const> do_get(const Key& k, size_type l_max_cache_size);
-
- struct data
- {
- list_type cont;
- map_type index;
- };
-
- // Needed by compilers not implementing the resolution to DR45. For reference,
- // see http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45.
- friend struct data;
-};
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4702)
-#endif
-template <class Key, class Object>
-boost::shared_ptr<Object const> object_cache<Key, Object>::get(const Key& k, size_type l_max_cache_size)
-{
-#ifdef BOOST_HAS_THREADS
- static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT;
- boost::static_mutex::scoped_lock l(mut);
- if (l)
- {
- return do_get(k, l_max_cache_size);
- }
- //
- // what do we do if the lock fails?
- // for now just throw, but we should never really get here...
- //
- ::boost::throw_exception(std::runtime_error("Error in thread safety code: could not acquire a lock"));
-#if defined(BOOST_NO_UNREACHABLE_RETURN_DETECTION) || defined(BOOST_NO_EXCEPTIONS)
- return boost::shared_ptr<Object>();
-#endif
-#else
- return do_get(k, l_max_cache_size);
-#endif
-}
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-template <class Key, class Object>
-boost::shared_ptr<Object const> object_cache<Key, Object>::do_get(const Key& k, size_type l_max_cache_size)
-{
- typedef typename object_cache<Key, Object>::data object_data;
- typedef typename map_type::size_type map_size_type;
- static object_data s_data;
-
- //
- // see if the object is already in the cache:
- //
- map_iterator mpos = s_data.index.find(k);
- if(mpos != s_data.index.end())
- {
- //
- // Eureka!
- // We have a cached item, bump it up the list and return it:
- //
- if(--(s_data.cont.end()) != mpos->second)
- {
- // splice out the item we want to move:
- list_type temp;
- temp.splice(temp.end(), s_data.cont, mpos->second);
- // and now place it at the end of the list:
- s_data.cont.splice(s_data.cont.end(), temp, temp.begin());
- BOOST_REGEX_ASSERT(*(s_data.cont.back().second) == k);
- // update index with new position:
- mpos->second = --(s_data.cont.end());
- BOOST_REGEX_ASSERT(&(mpos->first) == mpos->second->second);
- BOOST_REGEX_ASSERT(&(mpos->first) == s_data.cont.back().second);
- }
- return s_data.cont.back().first;
- }
- //
- // if we get here then the item is not in the cache,
- // so create it:
- //
- boost::shared_ptr<Object const> result(new Object(k));
- //
- // Add it to the list, and index it:
- //
- s_data.cont.push_back(value_type(result, static_cast<Key const*>(0)));
- s_data.index.insert(std::make_pair(k, --(s_data.cont.end())));
- s_data.cont.back().second = &(s_data.index.find(k)->first);
- map_size_type s = s_data.index.size();
- BOOST_REGEX_ASSERT(s_data.index[k]->first.get() == result.get());
- BOOST_REGEX_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
- BOOST_REGEX_ASSERT(s_data.index.find(k)->first == k);
- if(s > l_max_cache_size)
- {
- //
- // We have too many items in the list, so we need to start
- // popping them off the back of the list, but only if they're
- // being held uniquely by us:
- //
- list_iterator pos = s_data.cont.begin();
- list_iterator last = s_data.cont.end();
- while((pos != last) && (s > l_max_cache_size))
- {
- if(pos->first.unique())
- {
- list_iterator condemmed(pos);
- ++pos;
- // now remove the items from our containers,
- // then order has to be as follows:
- BOOST_REGEX_ASSERT(s_data.index.find(*(condemmed->second)) != s_data.index.end());
- s_data.index.erase(*(condemmed->second));
- s_data.cont.erase(condemmed);
- --s;
- }
- else
- ++pos;
- }
- BOOST_REGEX_ASSERT(s_data.index[k]->first.get() == result.get());
- BOOST_REGEX_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
- BOOST_REGEX_ASSERT(s_data.index.find(k)->first == k);
- }
- return result;
-}
-
-}
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/pattern_except.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/pattern_except.hpp
deleted file mode 100644
index 7aba564bbf..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/pattern_except.hpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE pattern_except.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares pattern-matching exception classes.
- */
-
-#ifndef BOOST_RE_V4_PAT_EXCEPT_HPP
-#define BOOST_RE_V4_PAT_EXCEPT_HPP
-
-#ifndef BOOST_REGEX_CONFIG_HPP
-#include <boost/regex/config.hpp>
-#endif
-
-#include <cstddef>
-#include <stdexcept>
-#include <boost/regex/v4/error_type.hpp>
-#include <boost/regex/v4/regex_traits_defaults.hpp>
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable : 4275)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable : 26812)
-#endif
-#endif
-class regex_error : public std::runtime_error
-{
-public:
- explicit regex_error(const std::string& s, regex_constants::error_type err = regex_constants::error_unknown, std::ptrdiff_t pos = 0)
- : std::runtime_error(s)
- , m_error_code(err)
- , m_position(pos)
- {
- }
- explicit regex_error(regex_constants::error_type err)
- : std::runtime_error(::boost::BOOST_REGEX_DETAIL_NS::get_default_error_string(err))
- , m_error_code(err)
- , m_position(0)
- {
- }
- ~regex_error() BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE {}
- regex_constants::error_type code()const
- { return m_error_code; }
- std::ptrdiff_t position()const
- { return m_position; }
- void raise()const
- {
-#ifndef BOOST_NO_EXCEPTIONS
-#ifndef BOOST_REGEX_STANDALONE
- ::boost::throw_exception(*this);
-#else
- throw* this;
-#endif
-#endif
- }
-private:
- regex_constants::error_type m_error_code;
- std::ptrdiff_t m_position;
-};
-
-typedef regex_error bad_pattern;
-typedef regex_error bad_expression;
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-template <class E>
-inline void raise_runtime_error(const E& ex)
-{
-#ifndef BOOST_REGEX_STANDALONE
- ::boost::throw_exception(ex);
-#else
- throw ex;
-#endif
-}
-
-template <class traits>
-void raise_error(const traits& t, regex_constants::error_type code)
-{
- (void)t; // warning suppression
- regex_error e(t.error_string(code), code, 0);
- ::boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(e);
-}
-
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher.hpp
deleted file mode 100644
index 4bd7d11463..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher.hpp
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- *
- * Copyright (c) 2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
-#ifndef BOOST_REGEX_MATCHER_HPP
-#define BOOST_REGEX_MATCHER_HPP
-
-#include <boost/regex/v4/iterator_category.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#pragma warning(disable : 4251)
-#if BOOST_MSVC < 1700
-# pragma warning(disable : 4231)
-#endif
-# if BOOST_MSVC < 1600
-# pragma warning(disable : 4660)
-# endif
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-//
-// error checking API:
-//
-inline void BOOST_REGEX_CALL verify_options(boost::regex_constants::syntax_option_type, match_flag_type mf)
-{
- //
- // can't mix match_extra with POSIX matching rules:
- //
- if ((mf & match_extra) && (mf & match_posix))
- {
- std::logic_error msg("Usage Error: Can't mix regular expression captures with POSIX matching rules");
- throw_exception(msg);
- }
-}
-//
-// function can_start:
-//
-template <class charT>
-inline bool can_start(charT c, const unsigned char* map, unsigned char mask)
-{
- return ((c < static_cast<charT>(0)) ? true : ((c >= static_cast<charT>(1 << CHAR_BIT)) ? true : map[c] & mask));
-}
-inline bool can_start(char c, const unsigned char* map, unsigned char mask)
-{
- return map[(unsigned char)c] & mask;
-}
-inline bool can_start(signed char c, const unsigned char* map, unsigned char mask)
-{
- return map[(unsigned char)c] & mask;
-}
-inline bool can_start(unsigned char c, const unsigned char* map, unsigned char mask)
-{
- return map[c] & mask;
-}
-inline bool can_start(unsigned short c, const unsigned char* map, unsigned char mask)
-{
- return ((c >= (1 << CHAR_BIT)) ? true : map[c] & mask);
-}
-#if !defined(__hpux) && !defined(__WINSCW__)// WCHAR_MIN not usable in pp-directives.
-#if defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
-inline bool can_start(wchar_t c, const unsigned char* map, unsigned char mask)
-{
- return ((c >= static_cast<wchar_t>(1u << CHAR_BIT)) ? true : map[c] & mask);
-}
-#endif
-#endif
-#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
-inline bool can_start(unsigned int c, const unsigned char* map, unsigned char mask)
-{
- return (((c >= static_cast<unsigned int>(1u << CHAR_BIT)) ? true : map[c] & mask));
-}
-#endif
-
-
-//
-// Unfortunately Rogue Waves standard library appears to have a bug
-// in std::basic_string::compare that results in erroneous answers
-// in some cases (tested with Borland C++ 5.1, Rogue Wave lib version
-// 0x020101) the test case was:
-// {39135,0} < {0xff,0}
-// which succeeds when it should not.
-//
-#ifndef _RWSTD_VER
-template <class C, class T, class A>
-inline int string_compare(const std::basic_string<C,T,A>& s, const C* p)
-{
- if(0 == *p)
- {
- if(s.empty() || ((s.size() == 1) && (s[0] == 0)))
- return 0;
- }
- return s.compare(p);
-}
-#else
-template <class C, class T, class A>
-inline int string_compare(const std::basic_string<C,T,A>& s, const C* p)
-{
- if(0 == *p)
- {
- if(s.empty() || ((s.size() == 1) && (s[0] == 0)))
- return 0;
- }
- return s.compare(p);
-}
-inline int string_compare(const std::string& s, const char* p)
-{ return std::strcmp(s.c_str(), p); }
-# ifndef BOOST_NO_WREGEX
-inline int string_compare(const std::wstring& s, const wchar_t* p)
-{ return std::wcscmp(s.c_str(), p); }
-#endif
-#endif
-template <class Seq, class C>
-inline int string_compare(const Seq& s, const C* p)
-{
- std::size_t i = 0;
- while((i < s.size()) && (p[i] == s[i]))
- {
- ++i;
- }
- return (i == s.size()) ? -(int)p[i] : (int)s[i] - (int)p[i];
-}
-# define STR_COMP(s,p) string_compare(s,p)
-
-template<class charT>
-inline const charT* re_skip_past_null(const charT* p)
-{
- while (*p != static_cast<charT>(0)) ++p;
- return ++p;
-}
-
-template <class iterator, class charT, class traits_type, class char_classT>
-iterator BOOST_REGEX_CALL re_is_set_member(iterator next,
- iterator last,
- const re_set_long<char_classT>* set_,
- const regex_data<charT, traits_type>& e, bool icase)
-{
- const charT* p = reinterpret_cast<const charT*>(set_+1);
- iterator ptr;
- unsigned int i;
- //bool icase = e.m_flags & regex_constants::icase;
-
- if(next == last) return next;
-
- typedef typename traits_type::string_type traits_string_type;
- const ::boost::regex_traits_wrapper<traits_type>& traits_inst = *(e.m_ptraits);
-
- // dwa 9/13/00 suppress incorrect MSVC warning - it claims this is never
- // referenced
- (void)traits_inst;
-
- // try and match a single character, could be a multi-character
- // collating element...
- for(i = 0; i < set_->csingles; ++i)
- {
- ptr = next;
- if(*p == static_cast<charT>(0))
- {
- // treat null string as special case:
- if(traits_inst.translate(*ptr, icase))
- {
- ++p;
- continue;
- }
- return set_->isnot ? next : (ptr == next) ? ++next : ptr;
- }
- else
- {
- while(*p && (ptr != last))
- {
- if(traits_inst.translate(*ptr, icase) != *p)
- break;
- ++p;
- ++ptr;
- }
-
- if(*p == static_cast<charT>(0)) // if null we've matched
- return set_->isnot ? next : (ptr == next) ? ++next : ptr;
-
- p = re_skip_past_null(p); // skip null
- }
- }
-
- charT col = traits_inst.translate(*next, icase);
-
-
- if(set_->cranges || set_->cequivalents)
- {
- traits_string_type s1;
- //
- // try and match a range, NB only a single character can match
- if(set_->cranges)
- {
- if((e.m_flags & regex_constants::collate) == 0)
- s1.assign(1, col);
- else
- {
- charT a[2] = { col, charT(0), };
- s1 = traits_inst.transform(a, a + 1);
- }
- for(i = 0; i < set_->cranges; ++i)
- {
- if(STR_COMP(s1, p) >= 0)
- {
- do{ ++p; }while(*p);
- ++p;
- if(STR_COMP(s1, p) <= 0)
- return set_->isnot ? next : ++next;
- }
- else
- {
- // skip first string
- do{ ++p; }while(*p);
- ++p;
- }
- // skip second string
- do{ ++p; }while(*p);
- ++p;
- }
- }
- //
- // try and match an equivalence class, NB only a single character can match
- if(set_->cequivalents)
- {
- charT a[2] = { col, charT(0), };
- s1 = traits_inst.transform_primary(a, a +1);
- for(i = 0; i < set_->cequivalents; ++i)
- {
- if(STR_COMP(s1, p) == 0)
- return set_->isnot ? next : ++next;
- // skip string
- do{ ++p; }while(*p);
- ++p;
- }
- }
- }
- if(traits_inst.isctype(col, set_->cclasses) == true)
- return set_->isnot ? next : ++next;
- if((set_->cnclasses != 0) && (traits_inst.isctype(col, set_->cnclasses) == false))
- return set_->isnot ? next : ++next;
- return set_->isnot ? ++next : next;
-}
-
-template <class BidiIterator>
-class repeater_count
-{
- repeater_count** stack;
- repeater_count* next;
- int state_id;
- std::size_t count; // the number of iterations so far
- BidiIterator start_pos; // where the last repeat started
-
- repeater_count* unwind_until(int n, repeater_count* p, int current_recursion_id)
- {
- while(p && (p->state_id != n))
- {
- if(-2 - current_recursion_id == p->state_id)
- return 0;
- p = p->next;
- if(p && (p->state_id < 0))
- {
- p = unwind_until(p->state_id, p, current_recursion_id);
- if(!p)
- return p;
- p = p->next;
- }
- }
- return p;
- }
-public:
- repeater_count(repeater_count** s) : stack(s), next(0), state_id(-1), count(0), start_pos() {}
-
- repeater_count(int i, repeater_count** s, BidiIterator start, int current_recursion_id)
- : start_pos(start)
- {
- state_id = i;
- stack = s;
- next = *stack;
- *stack = this;
- if((state_id > next->state_id) && (next->state_id >= 0))
- count = 0;
- else
- {
- repeater_count* p = next;
- p = unwind_until(state_id, p, current_recursion_id);
- if(p)
- {
- count = p->count;
- start_pos = p->start_pos;
- }
- else
- count = 0;
- }
- }
- ~repeater_count()
- {
- if(next)
- *stack = next;
- }
- std::size_t get_count() { return count; }
- int get_id() { return state_id; }
- std::size_t operator++() { return ++count; }
- bool check_null_repeat(const BidiIterator& pos, std::size_t max)
- {
- // this is called when we are about to start a new repeat,
- // if the last one was NULL move our count to max,
- // otherwise save the current position.
- bool result = (count == 0) ? false : (pos == start_pos);
- if(result)
- count = max;
- else
- start_pos = pos;
- return result;
- }
-};
-
-struct saved_state;
-
-enum saved_state_type
-{
- saved_type_end = 0,
- saved_type_paren = 1,
- saved_type_recurse = 2,
- saved_type_assertion = 3,
- saved_state_alt = 4,
- saved_state_repeater_count = 5,
- saved_state_extra_block = 6,
- saved_state_greedy_single_repeat = 7,
- saved_state_rep_slow_dot = 8,
- saved_state_rep_fast_dot = 9,
- saved_state_rep_char = 10,
- saved_state_rep_short_set = 11,
- saved_state_rep_long_set = 12,
- saved_state_non_greedy_long_repeat = 13,
- saved_state_count = 14
-};
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable:26495)
-#endif
-#endif
-template <class Results>
-struct recursion_info
-{
- typedef typename Results::value_type value_type;
- typedef typename value_type::iterator iterator;
- int idx;
- const re_syntax_base* preturn_address;
- Results results;
- repeater_count<iterator>* repeater_stack;
- iterator location_of_start;
-};
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-template <class BidiIterator, class Allocator, class traits>
-class perl_matcher
-{
-public:
- typedef typename traits::char_type char_type;
- typedef perl_matcher<BidiIterator, Allocator, traits> self_type;
- typedef bool (self_type::*matcher_proc_type)();
- typedef std::size_t traits_size_type;
- typedef typename is_byte<char_type>::width_type width_type;
- typedef typename regex_iterator_traits<BidiIterator>::difference_type difference_type;
- typedef match_results<BidiIterator, Allocator> results_type;
-
- perl_matcher(BidiIterator first, BidiIterator end,
- match_results<BidiIterator, Allocator>& what,
- const basic_regex<char_type, traits>& e,
- match_flag_type f,
- BidiIterator l_base)
- : m_result(what), base(first), last(end),
- position(first), backstop(l_base), re(e), traits_inst(e.get_traits()),
- m_independent(false), next_count(&rep_obj), rep_obj(&next_count)
-#ifdef BOOST_REGEX_NON_RECURSIVE
- , m_recursions(0)
-#endif
- {
- construct_init(e, f);
- }
-
- bool match();
- bool find();
-
- void setf(match_flag_type f)
- { m_match_flags |= f; }
- void unsetf(match_flag_type f)
- { m_match_flags &= ~f; }
-
-private:
- void construct_init(const basic_regex<char_type, traits>& e, match_flag_type f);
-
- bool find_imp();
- bool match_imp();
-#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
- typedef bool (perl_matcher::*protected_proc_type)();
- bool protected_call(protected_proc_type);
-#endif
- void estimate_max_state_count(std::random_access_iterator_tag*);
- void estimate_max_state_count(void*);
- bool match_prefix();
- bool match_all_states();
-
- // match procs, stored in s_match_vtable:
- bool match_startmark();
- bool match_endmark();
- bool match_literal();
- bool match_start_line();
- bool match_end_line();
- bool match_wild();
- bool match_match();
- bool match_word_boundary();
- bool match_within_word();
- bool match_word_start();
- bool match_word_end();
- bool match_buffer_start();
- bool match_buffer_end();
- bool match_backref();
- bool match_long_set();
- bool match_set();
- bool match_jump();
- bool match_alt();
- bool match_rep();
- bool match_combining();
- bool match_soft_buffer_end();
- bool match_restart_continue();
- bool match_long_set_repeat();
- bool match_set_repeat();
- bool match_char_repeat();
- bool match_dot_repeat_fast();
- bool match_dot_repeat_slow();
- bool match_dot_repeat_dispatch()
- {
- return ::boost::is_random_access_iterator<BidiIterator>::value ? match_dot_repeat_fast() : match_dot_repeat_slow();
- }
- bool match_backstep();
- bool match_assert_backref();
- bool match_toggle_case();
-#ifdef BOOST_REGEX_RECURSIVE
- bool backtrack_till_match(std::size_t count);
-#endif
- bool match_recursion();
- bool match_fail();
- bool match_accept();
- bool match_commit();
- bool match_then();
- bool skip_until_paren(int index, bool match = true);
-
- // find procs stored in s_find_vtable:
- bool find_restart_any();
- bool find_restart_word();
- bool find_restart_line();
- bool find_restart_buf();
- bool find_restart_lit();
-
-private:
- // final result structure to be filled in:
- match_results<BidiIterator, Allocator>& m_result;
- // temporary result for POSIX matches:
- scoped_ptr<match_results<BidiIterator, Allocator> > m_temp_match;
- // pointer to actual result structure to fill in:
- match_results<BidiIterator, Allocator>* m_presult;
- // start of sequence being searched:
- BidiIterator base;
- // end of sequence being searched:
- BidiIterator last;
- // current character being examined:
- BidiIterator position;
- // where to restart next search after failed match attempt:
- BidiIterator restart;
- // where the current search started from, acts as base for $` during grep:
- BidiIterator search_base;
- // how far we can go back when matching lookbehind:
- BidiIterator backstop;
- // the expression being examined:
- const basic_regex<char_type, traits>& re;
- // the expression's traits class:
- const ::boost::regex_traits_wrapper<traits>& traits_inst;
- // the next state in the machine being matched:
- const re_syntax_base* pstate;
- // matching flags in use:
- match_flag_type m_match_flags;
- // how many states we have examined so far:
- std::ptrdiff_t state_count;
- // max number of states to examine before giving up:
- std::ptrdiff_t max_state_count;
- // whether we should ignore case or not:
- bool icase;
- // set to true when (position == last), indicates that we may have a partial match:
- bool m_has_partial_match;
- // set to true whenever we get a match:
- bool m_has_found_match;
- // set to true whenever we're inside an independent sub-expression:
- bool m_independent;
- // the current repeat being examined:
- repeater_count<BidiIterator>* next_count;
- // the first repeat being examined (top of linked list):
- repeater_count<BidiIterator> rep_obj;
- // the mask to pass when matching word boundaries:
- typename traits::char_class_type m_word_mask;
- // the bitmask to use when determining whether a match_any matches a newline or not:
- unsigned char match_any_mask;
- // recursion information:
- std::vector<recursion_info<results_type> > recursion_stack;
-#ifdef BOOST_REGEX_RECURSIVE
- // Set to false by a (*COMMIT):
- bool m_can_backtrack;
- bool m_have_accept;
- bool m_have_then;
-#endif
-#ifdef BOOST_REGEX_NON_RECURSIVE
- //
- // additional members for non-recursive version:
- //
- typedef bool (self_type::*unwind_proc_type)(bool);
-
- void extend_stack();
- bool unwind(bool);
- bool unwind_end(bool);
- bool unwind_paren(bool);
- bool unwind_recursion_stopper(bool);
- bool unwind_assertion(bool);
- bool unwind_alt(bool);
- bool unwind_repeater_counter(bool);
- bool unwind_extra_block(bool);
- bool unwind_greedy_single_repeat(bool);
- bool unwind_slow_dot_repeat(bool);
- bool unwind_fast_dot_repeat(bool);
- bool unwind_char_repeat(bool);
- bool unwind_short_set_repeat(bool);
- bool unwind_long_set_repeat(bool);
- bool unwind_non_greedy_repeat(bool);
- bool unwind_recursion(bool);
- bool unwind_recursion_pop(bool);
- bool unwind_commit(bool);
- bool unwind_then(bool);
- bool unwind_case(bool);
- void destroy_single_repeat();
- void push_matched_paren(int index, const sub_match<BidiIterator>& sub);
- void push_recursion_stopper();
- void push_assertion(const re_syntax_base* ps, bool positive);
- void push_alt(const re_syntax_base* ps);
- void push_repeater_count(int i, repeater_count<BidiIterator>** s);
- void push_single_repeat(std::size_t c, const re_repeat* r, BidiIterator last_position, int state_id);
- void push_non_greedy_repeat(const re_syntax_base* ps);
- void push_recursion(int idx, const re_syntax_base* p, results_type* presults, results_type* presults2);
- void push_recursion_pop();
- void push_case_change(bool);
-
- // pointer to base of stack:
- saved_state* m_stack_base;
- // pointer to current stack position:
- saved_state* m_backup_state;
- // how many memory blocks have we used up?:
- unsigned used_block_count;
- // determines what value to return when unwinding from recursion,
- // allows for mixed recursive/non-recursive algorithm:
- bool m_recursive_result;
- // We have unwound to a lookahead/lookbehind, used by COMMIT/PRUNE/SKIP:
- bool m_unwound_lookahead;
- // We have unwound to an alternative, used by THEN:
- bool m_unwound_alt;
- // We are unwinding a commit - used by independent subs to determine whether to stop there or carry on unwinding:
- //bool m_unwind_commit;
- // Recursion limit:
- unsigned m_recursions;
-#endif
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable:26495)
-#endif
-#endif
- // these operations aren't allowed, so are declared private,
- // bodies are provided to keep explicit-instantiation requests happy:
- perl_matcher& operator=(const perl_matcher&)
- {
- return *this;
- }
- perl_matcher(const perl_matcher& that)
- : m_result(that.m_result), re(that.re), traits_inst(that.traits_inst), rep_obj(0) {}
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-};
-
-} // namespace BOOST_REGEX_DETAIL_NS
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-//
-// include the implementation of perl_matcher:
-//
-#ifdef BOOST_REGEX_RECURSIVE
-#include <boost/regex/v4/perl_matcher_recursive.hpp>
-#else
-#include <boost/regex/v4/perl_matcher_non_recursive.hpp>
-#endif
-// this one has to be last:
-#include <boost/regex/v4/perl_matcher_common.hpp>
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_common.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_common.hpp
deleted file mode 100644
index 7cf0574beb..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_common.hpp
+++ /dev/null
@@ -1,1030 +0,0 @@
-/*
- *
- * Copyright (c) 2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE perl_matcher_common.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Definitions of perl_matcher member functions that are
- * common to both the recursive and non-recursive versions.
- */
-
-#ifndef BOOST_REGEX_V4_PERL_MATCHER_COMMON_HPP
-#define BOOST_REGEX_V4_PERL_MATCHER_COMMON_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#if BOOST_MSVC >= 1800
-#pragma warning(disable: 26812)
-#endif
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_BORLANDC
-# pragma option push -w-8008 -w-8066
-#endif
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#pragma warning(disable:26812)
-#endif
- template <class BidiIterator, class Allocator, class traits>
-void perl_matcher<BidiIterator, Allocator, traits>::construct_init(const basic_regex<char_type, traits>& e, match_flag_type f)
-{
- typedef typename regex_iterator_traits<BidiIterator>::iterator_category category;
- typedef typename basic_regex<char_type, traits>::flag_type expression_flag_type;
-
- if(e.empty())
- {
- // precondition failure: e is not a valid regex.
- std::invalid_argument ex("Invalid regular expression object");
- boost::throw_exception(ex);
- }
- pstate = 0;
- m_match_flags = f;
- estimate_max_state_count(static_cast<category*>(0));
- expression_flag_type re_f = re.flags();
- icase = re_f & regex_constants::icase;
- if(!(m_match_flags & (match_perl|match_posix)))
- {
- if((re_f & (regbase::main_option_type|regbase::no_perl_ex)) == 0)
- m_match_flags |= match_perl;
- else if((re_f & (regbase::main_option_type|regbase::emacs_ex)) == (regbase::basic_syntax_group|regbase::emacs_ex))
- m_match_flags |= match_perl;
- else if((re_f & (regbase::main_option_type|regbase::literal)) == (regbase::literal))
- m_match_flags |= match_perl;
- else
- m_match_flags |= match_posix;
- }
- if(m_match_flags & match_posix)
- {
- m_temp_match.reset(new match_results<BidiIterator, Allocator>());
- m_presult = m_temp_match.get();
- }
- else
- m_presult = &m_result;
-#ifdef BOOST_REGEX_NON_RECURSIVE
- m_stack_base = 0;
- m_backup_state = 0;
-#elif defined(BOOST_REGEX_RECURSIVE)
- m_can_backtrack = true;
- m_have_accept = false;
-#endif
- // find the value to use for matching word boundaries:
- m_word_mask = re.get_data().m_word_mask;
- // find bitmask to use for matching '.':
- match_any_mask = static_cast<unsigned char>((f & match_not_dot_newline) ? BOOST_REGEX_DETAIL_NS::test_not_newline : BOOST_REGEX_DETAIL_NS::test_newline);
- // Disable match_any if requested in the state machine:
- if(e.get_data().m_disable_match_any)
- m_match_flags &= regex_constants::match_not_any;
-}
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-template <class BidiIterator, class Allocator, class traits>
-void perl_matcher<BidiIterator, Allocator, traits>::estimate_max_state_count(std::random_access_iterator_tag*)
-{
- //
- // How many states should we allow our machine to visit before giving up?
- // This is a heuristic: it takes the greater of O(N^2) and O(NS^2)
- // where N is the length of the string, and S is the number of states
- // in the machine. It's tempting to up this to O(N^2S) or even O(N^2S^2)
- // but these take unreasonably amounts of time to bale out in pathological
- // cases.
- //
- // Calculate NS^2 first:
- //
- static const std::ptrdiff_t k = 100000;
- std::ptrdiff_t dist = boost::BOOST_REGEX_DETAIL_NS::distance(base, last);
- if(dist == 0)
- dist = 1;
- std::ptrdiff_t states = re.size();
- if(states == 0)
- states = 1;
- if ((std::numeric_limits<std::ptrdiff_t>::max)() / states < states)
- {
- max_state_count = (std::min)((std::ptrdiff_t)BOOST_REGEX_MAX_STATE_COUNT, (std::numeric_limits<std::ptrdiff_t>::max)() - 2);
- return;
- }
- states *= states;
- if((std::numeric_limits<std::ptrdiff_t>::max)() / dist < states)
- {
- max_state_count = (std::min)((std::ptrdiff_t)BOOST_REGEX_MAX_STATE_COUNT, (std::numeric_limits<std::ptrdiff_t>::max)() - 2);
- return;
- }
- states *= dist;
- if((std::numeric_limits<std::ptrdiff_t>::max)() - k < states)
- {
- max_state_count = (std::min)((std::ptrdiff_t)BOOST_REGEX_MAX_STATE_COUNT, (std::numeric_limits<std::ptrdiff_t>::max)() - 2);
- return;
- }
- states += k;
-
- max_state_count = states;
-
- //
- // Now calculate N^2:
- //
- states = dist;
- if((std::numeric_limits<std::ptrdiff_t>::max)() / dist < states)
- {
- max_state_count = (std::min)((std::ptrdiff_t)BOOST_REGEX_MAX_STATE_COUNT, (std::numeric_limits<std::ptrdiff_t>::max)() - 2);
- return;
- }
- states *= dist;
- if((std::numeric_limits<std::ptrdiff_t>::max)() - k < states)
- {
- max_state_count = (std::min)((std::ptrdiff_t)BOOST_REGEX_MAX_STATE_COUNT, (std::numeric_limits<std::ptrdiff_t>::max)() - 2);
- return;
- }
- states += k;
- //
- // N^2 can be a very large number indeed, to prevent things getting out
- // of control, cap the max states:
- //
- if(states > BOOST_REGEX_MAX_STATE_COUNT)
- states = BOOST_REGEX_MAX_STATE_COUNT;
- //
- // If (the possibly capped) N^2 is larger than our first estimate,
- // use this instead:
- //
- if(states > max_state_count)
- max_state_count = states;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::estimate_max_state_count(void*)
-{
- // we don't know how long the sequence is:
- max_state_count = BOOST_REGEX_MAX_STATE_COUNT;
-}
-
-#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
-template <class BidiIterator, class Allocator, class traits>
-inline bool perl_matcher<BidiIterator, Allocator, traits>::protected_call(
- protected_proc_type proc)
-{
- ::boost::BOOST_REGEX_DETAIL_NS::concrete_protected_call
- <perl_matcher<BidiIterator, Allocator, traits> >
- obj(this, proc);
- return obj.execute();
-
-}
-#endif
-
-template <class BidiIterator, class Allocator, class traits>
-inline bool perl_matcher<BidiIterator, Allocator, traits>::match()
-{
-#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
- return protected_call(&perl_matcher<BidiIterator, Allocator, traits>::match_imp);
-#else
- return match_imp();
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_imp()
-{
- // initialise our stack if we are non-recursive:
-#ifdef BOOST_REGEX_NON_RECURSIVE
- save_state_init init(&m_stack_base, &m_backup_state);
- used_block_count = BOOST_REGEX_MAX_BLOCKS;
-#if !defined(BOOST_NO_EXCEPTIONS)
- try{
-#endif
-#endif
-
- // reset our state machine:
- position = base;
- search_base = base;
- state_count = 0;
- m_match_flags |= regex_constants::match_all;
- m_presult->set_size((m_match_flags & match_nosubs) ? 1u : static_cast<typename results_type::size_type>(1u + re.mark_count()), search_base, last);
- m_presult->set_base(base);
- m_presult->set_named_subs(this->re.get_named_subs());
- if(m_match_flags & match_posix)
- m_result = *m_presult;
- verify_options(re.flags(), m_match_flags);
- if(0 == match_prefix())
- return false;
- return (m_result[0].second == last) && (m_result[0].first == base);
-
-#if defined(BOOST_REGEX_NON_RECURSIVE) && !defined(BOOST_NO_EXCEPTIONS)
- }
- catch(...)
- {
- // unwind all pushed states, apart from anything else this
- // ensures that all the states are correctly destructed
- // not just the memory freed.
- while(unwind(true)){}
- throw;
- }
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline bool perl_matcher<BidiIterator, Allocator, traits>::find()
-{
-#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
- return protected_call(&perl_matcher<BidiIterator, Allocator, traits>::find_imp);
-#else
- return find_imp();
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::find_imp()
-{
- static matcher_proc_type const s_find_vtable[7] =
- {
- &perl_matcher<BidiIterator, Allocator, traits>::find_restart_any,
- &perl_matcher<BidiIterator, Allocator, traits>::find_restart_word,
- &perl_matcher<BidiIterator, Allocator, traits>::find_restart_line,
- &perl_matcher<BidiIterator, Allocator, traits>::find_restart_buf,
- &perl_matcher<BidiIterator, Allocator, traits>::match_prefix,
- &perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit,
- &perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit,
- };
-
- // initialise our stack if we are non-recursive:
-#ifdef BOOST_REGEX_NON_RECURSIVE
- save_state_init init(&m_stack_base, &m_backup_state);
- used_block_count = BOOST_REGEX_MAX_BLOCKS;
-#if !defined(BOOST_NO_EXCEPTIONS)
- try{
-#endif
-#endif
-
- state_count = 0;
- if((m_match_flags & regex_constants::match_init) == 0)
- {
- // reset our state machine:
- search_base = position = base;
- pstate = re.get_first_state();
- m_presult->set_size((m_match_flags & match_nosubs) ? 1u : static_cast<typename results_type::size_type>(1u + re.mark_count()), base, last);
- m_presult->set_base(base);
- m_presult->set_named_subs(this->re.get_named_subs());
- m_match_flags |= regex_constants::match_init;
- }
- else
- {
- // start again:
- search_base = position = m_result[0].second;
- // If last match was null and match_not_null was not set then increment
- // our start position, otherwise we go into an infinite loop:
- if(((m_match_flags & match_not_null) == 0) && (m_result.length() == 0))
- {
- if(position == last)
- return false;
- else
- ++position;
- }
- // reset $` start:
- m_presult->set_size((m_match_flags & match_nosubs) ? 1u : static_cast<typename results_type::size_type>(1u + re.mark_count()), search_base, last);
- //if((base != search_base) && (base == backstop))
- // m_match_flags |= match_prev_avail;
- }
- if(m_match_flags & match_posix)
- {
- m_result.set_size(static_cast<typename results_type::size_type>(1u + re.mark_count()), base, last);
- m_result.set_base(base);
- }
-
- verify_options(re.flags(), m_match_flags);
- // find out what kind of expression we have:
- unsigned type = (m_match_flags & match_continuous) ?
- static_cast<unsigned int>(regbase::restart_continue)
- : static_cast<unsigned int>(re.get_restart_type());
-
- // call the appropriate search routine:
- matcher_proc_type proc = s_find_vtable[type];
- return (this->*proc)();
-
-#if defined(BOOST_REGEX_NON_RECURSIVE) && !defined(BOOST_NO_EXCEPTIONS)
- }
- catch(...)
- {
- // unwind all pushed states, apart from anything else this
- // ensures that all the states are correctly destructed
- // not just the memory freed.
- while(unwind(true)){}
- throw;
- }
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_prefix()
-{
- m_has_partial_match = false;
- m_has_found_match = false;
- pstate = re.get_first_state();
- m_presult->set_first(position);
- restart = position;
- match_all_states();
- if(!m_has_found_match && m_has_partial_match && (m_match_flags & match_partial))
- {
- m_has_found_match = true;
- m_presult->set_second(last, 0, false);
- position = last;
- if((m_match_flags & match_posix) == match_posix)
- {
- m_result.maybe_assign(*m_presult);
- }
- }
-#ifdef BOOST_REGEX_MATCH_EXTRA
- if(m_has_found_match && (match_extra & m_match_flags))
- {
- //
- // we have a match, reverse the capture information:
- //
- for(unsigned i = 0; i < m_presult->size(); ++i)
- {
- typename sub_match<BidiIterator>::capture_sequence_type & seq = ((*m_presult)[i]).get_captures();
- std::reverse(seq.begin(), seq.end());
- }
- }
-#endif
- if(!m_has_found_match)
- position = restart; // reset search postion
-#ifdef BOOST_REGEX_RECURSIVE
- m_can_backtrack = true; // reset for further searches
-#endif
- return m_has_found_match;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_literal()
-{
- unsigned int len = static_cast<const re_literal*>(pstate)->length;
- const char_type* what = reinterpret_cast<const char_type*>(static_cast<const re_literal*>(pstate) + 1);
- //
- // compare string with what we stored in
- // our records:
- for(unsigned int i = 0; i < len; ++i, ++position)
- {
- if((position == last) || (traits_inst.translate(*position, icase) != what[i]))
- return false;
- }
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_start_line()
-{
- if(position == backstop)
- {
- if((m_match_flags & match_prev_avail) == 0)
- {
- if((m_match_flags & match_not_bol) == 0)
- {
- pstate = pstate->next.p;
- return true;
- }
- return false;
- }
- }
- else if(m_match_flags & match_single_line)
- return false;
-
- // check the previous value character:
- BidiIterator t(position);
- --t;
- if(position != last)
- {
- if(is_separator(*t) && !((*t == static_cast<char_type>('\r')) && (*position == static_cast<char_type>('\n'))) )
- {
- pstate = pstate->next.p;
- return true;
- }
- }
- else if(is_separator(*t))
- {
- pstate = pstate->next.p;
- return true;
- }
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_end_line()
-{
- if(position != last)
- {
- if(m_match_flags & match_single_line)
- return false;
- // we're not yet at the end so *first is always valid:
- if(is_separator(*position))
- {
- if((position != backstop) || (m_match_flags & match_prev_avail))
- {
- // check that we're not in the middle of \r\n sequence
- BidiIterator t(position);
- --t;
- if((*t == static_cast<char_type>('\r')) && (*position == static_cast<char_type>('\n')))
- {
- return false;
- }
- }
- pstate = pstate->next.p;
- return true;
- }
- }
- else if((m_match_flags & match_not_eol) == 0)
- {
- pstate = pstate->next.p;
- return true;
- }
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_wild()
-{
- if(position == last)
- return false;
- if(is_separator(*position) && ((match_any_mask & static_cast<const re_dot*>(pstate)->mask) == 0))
- return false;
- if((*position == char_type(0)) && (m_match_flags & match_not_dot_null))
- return false;
- pstate = pstate->next.p;
- ++position;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary()
-{
- bool b; // indcates whether next character is a word character
- if(position != last)
- {
- // prev and this character must be opposites:
- b = traits_inst.isctype(*position, m_word_mask);
- }
- else
- {
- if (m_match_flags & match_not_eow)
- return false;
- b = false;
- }
- if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))
- {
- if(m_match_flags & match_not_bow)
- return false;
- else
- b ^= false;
- }
- else
- {
- --position;
- b ^= traits_inst.isctype(*position, m_word_mask);
- ++position;
- }
- if(b)
- {
- pstate = pstate->next.p;
- return true;
- }
- return false; // no match if we get to here...
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_within_word()
-{
- if(position == last)
- return false;
- // both prev and this character must be m_word_mask:
- bool prev = traits_inst.isctype(*position, m_word_mask);
- {
- bool b;
- if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))
- return false;
- else
- {
- --position;
- b = traits_inst.isctype(*position, m_word_mask);
- ++position;
- }
- if(b == prev)
- {
- pstate = pstate->next.p;
- return true;
- }
- }
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_word_start()
-{
- if(position == last)
- return false; // can't be starting a word if we're already at the end of input
- if(!traits_inst.isctype(*position, m_word_mask))
- return false; // next character isn't a word character
- if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))
- {
- if(m_match_flags & match_not_bow)
- return false; // no previous input
- }
- else
- {
- // otherwise inside buffer:
- BidiIterator t(position);
- --t;
- if(traits_inst.isctype(*t, m_word_mask))
- return false; // previous character not non-word
- }
- // OK we have a match:
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_word_end()
-{
- if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))
- return false; // start of buffer can't be end of word
- BidiIterator t(position);
- --t;
- if(traits_inst.isctype(*t, m_word_mask) == false)
- return false; // previous character wasn't a word character
-
- if(position == last)
- {
- if(m_match_flags & match_not_eow)
- return false; // end of buffer but not end of word
- }
- else
- {
- // otherwise inside buffer:
- if(traits_inst.isctype(*position, m_word_mask))
- return false; // next character is a word character
- }
- pstate = pstate->next.p;
- return true; // if we fall through to here then we've succeeded
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start()
-{
- if((position != backstop) || (m_match_flags & match_not_bob))
- return false;
- // OK match:
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end()
-{
- if((position != last) || (m_match_flags & match_not_eob))
- return false;
- // OK match:
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_backref()
-{
- //
- // Compare with what we previously matched.
- // Note that this succeeds if the backref did not partisipate
- // in the match, this is in line with ECMAScript, but not Perl
- // or PCRE.
- //
- int index = static_cast<const re_brace*>(pstate)->index;
- if(index >= hash_value_mask)
- {
- named_subexpressions::range_type r = re.get_data().equal_range(index);
- BOOST_REGEX_ASSERT(r.first != r.second);
- do
- {
- index = r.first->index;
- ++r.first;
- }while((r.first != r.second) && ((*m_presult)[index].matched != true));
- }
-
- if((m_match_flags & match_perl) && !(*m_presult)[index].matched)
- return false;
-
- BidiIterator i = (*m_presult)[index].first;
- BidiIterator j = (*m_presult)[index].second;
- while(i != j)
- {
- if((position == last) || (traits_inst.translate(*position, icase) != traits_inst.translate(*i, icase)))
- return false;
- ++i;
- ++position;
- }
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set()
-{
- typedef typename traits::char_class_type char_class_type;
- // let the traits class do the work:
- if(position == last)
- return false;
- BidiIterator t = re_is_set_member(position, last, static_cast<const re_set_long<char_class_type>*>(pstate), re.get_data(), icase);
- if(t != position)
- {
- pstate = pstate->next.p;
- position = t;
- return true;
- }
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_set()
-{
- if(position == last)
- return false;
- if(static_cast<const re_set*>(pstate)->_map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- pstate = pstate->next.p;
- ++position;
- return true;
- }
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_jump()
-{
- pstate = static_cast<const re_jump*>(pstate)->alt.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_combining()
-{
- if(position == last)
- return false;
- if(is_combining(traits_inst.translate(*position, icase)))
- return false;
- ++position;
- while((position != last) && is_combining(traits_inst.translate(*position, icase)))
- ++position;
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end()
-{
- if(m_match_flags & match_not_eob)
- return false;
- BidiIterator p(position);
- while((p != last) && is_separator(traits_inst.translate(*p, icase)))++p;
- if(p != last)
- return false;
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue()
-{
- if(position == search_base)
- {
- pstate = pstate->next.p;
- return true;
- }
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_backstep()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- if( ::boost::is_random_access_iterator<BidiIterator>::value)
- {
- std::ptrdiff_t maxlen = ::boost::BOOST_REGEX_DETAIL_NS::distance(backstop, position);
- if(maxlen < static_cast<const re_brace*>(pstate)->index)
- return false;
- std::advance(position, -static_cast<const re_brace*>(pstate)->index);
- }
- else
- {
- int c = static_cast<const re_brace*>(pstate)->index;
- while(c--)
- {
- if(position == backstop)
- return false;
- --position;
- }
- }
- pstate = pstate->next.p;
- return true;
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline bool perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref()
-{
- // return true if marked sub-expression N has been matched:
- int index = static_cast<const re_brace*>(pstate)->index;
- bool result = false;
- if(index == 9999)
- {
- // Magic value for a (DEFINE) block:
- return false;
- }
- else if(index > 0)
- {
- // Have we matched subexpression "index"?
- // Check if index is a hash value:
- if(index >= hash_value_mask)
- {
- named_subexpressions::range_type r = re.get_data().equal_range(index);
- while(r.first != r.second)
- {
- if((*m_presult)[r.first->index].matched)
- {
- result = true;
- break;
- }
- ++r.first;
- }
- }
- else
- {
- result = (*m_presult)[index].matched;
- }
- pstate = pstate->next.p;
- }
- else
- {
- // Have we recursed into subexpression "index"?
- // If index == 0 then check for any recursion at all, otherwise for recursion to -index-1.
- int idx = -(index+1);
- if(idx >= hash_value_mask)
- {
- named_subexpressions::range_type r = re.get_data().equal_range(idx);
- int stack_index = recursion_stack.empty() ? -1 : recursion_stack.back().idx;
- while(r.first != r.second)
- {
- result |= (stack_index == r.first->index);
- if(result)break;
- ++r.first;
- }
- }
- else
- {
- result = !recursion_stack.empty() && ((recursion_stack.back().idx == idx) || (index == 0));
- }
- pstate = pstate->next.p;
- }
- return result;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_fail()
-{
- // Just force a backtrack:
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_accept()
-{
- if(!recursion_stack.empty())
- {
- return skip_until_paren(recursion_stack.back().idx);
- }
- else
- {
- return skip_until_paren(INT_MAX);
- }
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_any()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- const unsigned char* _map = re.get_map();
- while(true)
- {
- // skip everything we can't match:
- while((position != last) && !can_start(*position, _map, (unsigned char)mask_any) )
- ++position;
- if(position == last)
- {
- // run out of characters, try a null match if possible:
- if(re.can_be_null())
- return match_prefix();
- break;
- }
- // now try and obtain a match:
- if(match_prefix())
- return true;
- if(position == last)
- return false;
- ++position;
- }
- return false;
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_word()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- // do search optimised for word starts:
- const unsigned char* _map = re.get_map();
- if((m_match_flags & match_prev_avail) || (position != base))
- --position;
- else if(match_prefix())
- return true;
- do
- {
- while((position != last) && traits_inst.isctype(*position, m_word_mask))
- ++position;
- while((position != last) && !traits_inst.isctype(*position, m_word_mask))
- ++position;
- if(position == last)
- break;
-
- if(can_start(*position, _map, (unsigned char)mask_any) )
- {
- if(match_prefix())
- return true;
- }
- if(position == last)
- break;
- } while(true);
- return false;
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_line()
-{
- // do search optimised for line starts:
- const unsigned char* _map = re.get_map();
- if(match_prefix())
- return true;
- while(position != last)
- {
- while((position != last) && !is_separator(*position))
- ++position;
- if(position == last)
- return false;
- ++position;
- if(position == last)
- {
- if(re.can_be_null() && match_prefix())
- return true;
- return false;
- }
-
- if( can_start(*position, _map, (unsigned char)mask_any) )
- {
- if(match_prefix())
- return true;
- }
- if(position == last)
- return false;
- //++position;
- }
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_buf()
-{
- if((position == base) && ((m_match_flags & match_not_bob) == 0))
- return match_prefix();
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit()
-{
-#if 0
- if(position == last)
- return false; // can't possibly match if we're at the end already
-
- unsigned type = (m_match_flags & match_continuous) ?
- static_cast<unsigned int>(regbase::restart_continue)
- : static_cast<unsigned int>(re.get_restart_type());
-
- const kmp_info<char_type>* info = access::get_kmp(re);
- int len = info->len;
- const char_type* x = info->pstr;
- int j = 0;
- while (position != last)
- {
- while((j > -1) && (x[j] != traits_inst.translate(*position, icase)))
- j = info->kmp_next[j];
- ++position;
- ++j;
- if(j >= len)
- {
- if(type == regbase::restart_fixed_lit)
- {
- std::advance(position, -j);
- restart = position;
- std::advance(restart, len);
- m_result.set_first(position);
- m_result.set_second(restart);
- position = restart;
- return true;
- }
- else
- {
- restart = position;
- std::advance(position, -j);
- if(match_prefix())
- return true;
- else
- {
- for(int k = 0; (restart != position) && (k < j); ++k, --restart)
- {} // dwa 10/20/2000 - warning suppression for MWCW
- if(restart != last)
- ++restart;
- position = restart;
- j = 0; //we could do better than this...
- }
- }
- }
- }
- if((m_match_flags & match_partial) && (position == last) && j)
- {
- // we need to check for a partial match:
- restart = position;
- std::advance(position, -j);
- return match_prefix();
- }
-#endif
- return false;
-}
-
-} // namespace BOOST_REGEX_DETAIL_NS
-
-} // namespace boost
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-#ifdef BOOST_BORLANDC
-# pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp
deleted file mode 100644
index 670efbab07..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_non_recursive.hpp
+++ /dev/null
@@ -1,1947 +0,0 @@
-/*
- *
- * Copyright (c) 2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE perl_matcher_common.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Definitions of perl_matcher member functions that are
- * specific to the non-recursive implementation.
- */
-
-#ifndef BOOST_REGEX_V4_PERL_MATCHER_NON_RECURSIVE_HPP
-#define BOOST_REGEX_V4_PERL_MATCHER_NON_RECURSIVE_HPP
-
-#include <boost/regex/v4/mem_block_cache.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable: 4706)
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-template <class T>
-inline void inplace_destroy(T* p)
-{
- (void)p; // warning suppression
- p->~T();
-}
-
-struct saved_state
-{
- union{
- unsigned int state_id;
- // this padding ensures correct alignment on 64-bit platforms:
- std::size_t padding1;
- std::ptrdiff_t padding2;
- void* padding3;
- };
- saved_state(unsigned i) : state_id(i) {}
-};
-
-template <class BidiIterator>
-struct saved_matched_paren : public saved_state
-{
- int index;
- sub_match<BidiIterator> sub;
- saved_matched_paren(int i, const sub_match<BidiIterator>& s) : saved_state(1), index(i), sub(s){}
-};
-
-template <class BidiIterator>
-struct saved_position : public saved_state
-{
- const re_syntax_base* pstate;
- BidiIterator position;
- saved_position(const re_syntax_base* ps, BidiIterator pos, int i) : saved_state(i), pstate(ps), position(pos){}
-};
-
-template <class BidiIterator>
-struct saved_assertion : public saved_position<BidiIterator>
-{
- bool positive;
- saved_assertion(bool p, const re_syntax_base* ps, BidiIterator pos)
- : saved_position<BidiIterator>(ps, pos, saved_type_assertion), positive(p){}
-};
-
-template <class BidiIterator>
-struct saved_repeater : public saved_state
-{
- repeater_count<BidiIterator> count;
- saved_repeater(int i, repeater_count<BidiIterator>** s, BidiIterator start, int current_recursion_id)
- : saved_state(saved_state_repeater_count), count(i, s, start, current_recursion_id){}
-};
-
-struct saved_extra_block : public saved_state
-{
- saved_state *base, *end;
- saved_extra_block(saved_state* b, saved_state* e)
- : saved_state(saved_state_extra_block), base(b), end(e) {}
-};
-
-struct save_state_init
-{
- saved_state** stack;
- save_state_init(saved_state** base, saved_state** end)
- : stack(base)
- {
- *base = static_cast<saved_state*>(get_mem_block());
- *end = reinterpret_cast<saved_state*>(reinterpret_cast<char*>(*base)+BOOST_REGEX_BLOCKSIZE);
- --(*end);
- (void) new (*end)saved_state(0);
- BOOST_REGEX_ASSERT(*end > *base);
- }
- ~save_state_init()
- {
- put_mem_block(*stack);
- *stack = 0;
- }
-};
-
-template <class BidiIterator>
-struct saved_single_repeat : public saved_state
-{
- std::size_t count;
- const re_repeat* rep;
- BidiIterator last_position;
- saved_single_repeat(std::size_t c, const re_repeat* r, BidiIterator lp, int arg_id)
- : saved_state(arg_id), count(c), rep(r), last_position(lp){}
-};
-
-template <class Results>
-struct saved_recursion : public saved_state
-{
- saved_recursion(int idx, const re_syntax_base* p, Results* pr, Results* pr2)
- : saved_state(14), recursion_id(idx), preturn_address(p), internal_results(*pr), prior_results(*pr2) {}
- int recursion_id;
- const re_syntax_base* preturn_address;
- Results internal_results, prior_results;
-};
-
-struct saved_change_case : public saved_state
-{
- bool icase;
- saved_change_case(bool c) : saved_state(18), icase(c) {}
-};
-
-struct incrementer
-{
- incrementer(unsigned* pu) : m_pu(pu) { ++*m_pu; }
- ~incrementer() { --*m_pu; }
- bool operator > (unsigned i) { return *m_pu > i; }
-private:
- unsigned* m_pu;
-};
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
-{
- static matcher_proc_type const s_match_vtable[34] =
- {
- (&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
- &perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
- &perl_matcher<BidiIterator, Allocator, traits>::match_literal,
- &perl_matcher<BidiIterator, Allocator, traits>::match_start_line,
- &perl_matcher<BidiIterator, Allocator, traits>::match_end_line,
- &perl_matcher<BidiIterator, Allocator, traits>::match_wild,
- &perl_matcher<BidiIterator, Allocator, traits>::match_match,
- &perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary,
- &perl_matcher<BidiIterator, Allocator, traits>::match_within_word,
- &perl_matcher<BidiIterator, Allocator, traits>::match_word_start,
- &perl_matcher<BidiIterator, Allocator, traits>::match_word_end,
- &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start,
- &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end,
- &perl_matcher<BidiIterator, Allocator, traits>::match_backref,
- &perl_matcher<BidiIterator, Allocator, traits>::match_long_set,
- &perl_matcher<BidiIterator, Allocator, traits>::match_set,
- &perl_matcher<BidiIterator, Allocator, traits>::match_jump,
- &perl_matcher<BidiIterator, Allocator, traits>::match_alt,
- &perl_matcher<BidiIterator, Allocator, traits>::match_rep,
- &perl_matcher<BidiIterator, Allocator, traits>::match_combining,
- &perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end,
- &perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue,
- // Although this next line *should* be evaluated at compile time, in practice
- // some compilers (VC++) emit run-time initialisation which breaks thread
- // safety, so use a dispatch function instead:
- //(::boost::is_random_access_iterator<BidiIterator>::value ? &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast : &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow),
- &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_dispatch,
- &perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::match_backstep,
- &perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
- &perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
- &perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
- &perl_matcher<BidiIterator, Allocator, traits>::match_fail,
- &perl_matcher<BidiIterator, Allocator, traits>::match_accept,
- &perl_matcher<BidiIterator, Allocator, traits>::match_commit,
- &perl_matcher<BidiIterator, Allocator, traits>::match_then,
- };
- incrementer inc(&m_recursions);
- if(inc > 80)
- raise_error(traits_inst, regex_constants::error_complexity);
- push_recursion_stopper();
- do{
- while(pstate)
- {
- matcher_proc_type proc = s_match_vtable[pstate->type];
- ++state_count;
- if(!(this->*proc)())
- {
- if(state_count > max_state_count)
- raise_error(traits_inst, regex_constants::error_complexity);
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- bool successful_unwind = unwind(false);
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- if(!successful_unwind)
- return m_recursive_result;
- }
- }
- }while(unwind(true));
- return m_recursive_result;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-void perl_matcher<BidiIterator, Allocator, traits>::extend_stack()
-{
- if(used_block_count)
- {
- --used_block_count;
- saved_state* stack_base;
- saved_state* backup_state;
- stack_base = static_cast<saved_state*>(get_mem_block());
- backup_state = reinterpret_cast<saved_state*>(reinterpret_cast<char*>(stack_base)+BOOST_REGEX_BLOCKSIZE);
- saved_extra_block* block = static_cast<saved_extra_block*>(backup_state);
- --block;
- (void) new (block) saved_extra_block(m_stack_base, m_backup_state);
- m_stack_base = stack_base;
- m_backup_state = block;
- }
- else
- raise_error(traits_inst, regex_constants::error_stack);
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_matched_paren(int index, const sub_match<BidiIterator>& sub)
-{
- //BOOST_REGEX_ASSERT(index);
- saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_matched_paren<BidiIterator>(index, sub);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_case_change(bool c)
-{
- //BOOST_REGEX_ASSERT(index);
- saved_change_case* pmp = static_cast<saved_change_case*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_change_case*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_change_case(c);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_recursion_stopper()
-{
- saved_state* pmp = m_backup_state;
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = m_backup_state;
- --pmp;
- }
- (void) new (pmp)saved_state(saved_type_recurse);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_assertion(const re_syntax_base* ps, bool positive)
-{
- saved_assertion<BidiIterator>* pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_assertion<BidiIterator>(positive, ps, position);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_alt(const re_syntax_base* ps)
-{
- saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_position<BidiIterator>(ps, position, saved_state_alt);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_non_greedy_repeat(const re_syntax_base* ps)
-{
- saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_position<BidiIterator>(ps, position, saved_state_non_greedy_long_repeat);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_repeater_count(int i, repeater_count<BidiIterator>** s)
-{
- saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_repeater<BidiIterator>(i, s, position, this->recursion_stack.empty() ? (INT_MIN + 3) : this->recursion_stack.back().idx);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_single_repeat(std::size_t c, const re_repeat* r, BidiIterator last_position, int state_id)
-{
- saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_single_repeat<BidiIterator>(c, r, last_position, state_id);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_recursion(int idx, const re_syntax_base* p, results_type* presults, results_type* presults2)
-{
- saved_recursion<results_type>* pmp = static_cast<saved_recursion<results_type>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_recursion<results_type>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_recursion<results_type>(idx, p, presults, presults2);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case()
-{
- // change our case sensitivity:
- push_case_change(this->icase);
- this->icase = static_cast<const re_case*>(pstate)->icase;
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
-{
- int index = static_cast<const re_brace*>(pstate)->index;
- icase = static_cast<const re_brace*>(pstate)->icase;
- switch(index)
- {
- case 0:
- pstate = pstate->next.p;
- break;
- case -1:
- case -2:
- {
- // forward lookahead assert:
- const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
- pstate = pstate->next.p->next.p;
- push_assertion(next_pstate, index == -1);
- break;
- }
- case -3:
- {
- // independent sub-expression, currently this is always recursive:
- bool old_independent = m_independent;
- m_independent = true;
- const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
- pstate = pstate->next.p->next.p;
- bool r = false;
-#if !defined(BOOST_NO_EXCEPTIONS)
- try{
-#endif
- r = match_all_states();
- if(!r && !m_independent)
- {
- // Must be unwinding from a COMMIT/SKIP/PRUNE and the independent
- // sub failed, need to unwind everything else:
- while(unwind(false));
- return false;
- }
-#if !defined(BOOST_NO_EXCEPTIONS)
- }
- catch(...)
- {
- pstate = next_pstate;
- // unwind all pushed states, apart from anything else this
- // ensures that all the states are correctly destructed
- // not just the memory freed.
- while(unwind(true)) {}
- throw;
- }
-#endif
- pstate = next_pstate;
- m_independent = old_independent;
-#ifdef BOOST_REGEX_MATCH_EXTRA
- if(r && (m_match_flags & match_extra))
- {
- //
- // our captures have been stored in *m_presult
- // we need to unpack them, and insert them
- // back in the right order when we unwind the stack:
- //
- match_results<BidiIterator, Allocator> temp_match(*m_presult);
- unsigned i;
- for(i = 0; i < temp_match.size(); ++i)
- (*m_presult)[i].get_captures().clear();
- // match everything else:
-#if !defined(BOOST_NO_EXCEPTIONS)
- try{
-#endif
- r = match_all_states();
-#if !defined(BOOST_NO_EXCEPTIONS)
- }
- catch(...)
- {
- pstate = next_pstate;
- // unwind all pushed states, apart from anything else this
- // ensures that all the states are correctly destructed
- // not just the memory freed.
- while(unwind(true)) {}
- throw;
- }
-#endif
- // now place the stored captures back:
- for(i = 0; i < temp_match.size(); ++i)
- {
- typedef typename sub_match<BidiIterator>::capture_sequence_type seq;
- seq& s1 = (*m_presult)[i].get_captures();
- const seq& s2 = temp_match[i].captures();
- s1.insert(
- s1.end(),
- s2.begin(),
- s2.end());
- }
- }
-#endif
- return r;
- }
- case -4:
- {
- // conditional expression:
- const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
- BOOST_REGEX_ASSERT(alt->type == syntax_element_alt);
- pstate = alt->next.p;
- if(pstate->type == syntax_element_assert_backref)
- {
- if(!match_assert_backref())
- pstate = alt->alt.p;
- break;
- }
- else
- {
- // zero width assertion, have to match this recursively:
- BOOST_REGEX_ASSERT(pstate->type == syntax_element_startmark);
- bool negated = static_cast<const re_brace*>(pstate)->index == -2;
- BidiIterator saved_position = position;
- const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
- pstate = pstate->next.p->next.p;
-#if !defined(BOOST_NO_EXCEPTIONS)
- try{
-#endif
- bool r = match_all_states();
- position = saved_position;
- if(negated)
- r = !r;
- if(r)
- pstate = next_pstate;
- else
- pstate = alt->alt.p;
-#if !defined(BOOST_NO_EXCEPTIONS)
- }
- catch(...)
- {
- pstate = next_pstate;
- // unwind all pushed states, apart from anything else this
- // ensures that all the states are correctly destructed
- // not just the memory freed.
- while(unwind(true)){}
- throw;
- }
-#endif
- break;
- }
- }
- case -5:
- {
- push_matched_paren(0, (*m_presult)[0]);
- m_presult->set_first(position, 0, true);
- pstate = pstate->next.p;
- break;
- }
- default:
- {
- BOOST_REGEX_ASSERT(index > 0);
- if((m_match_flags & match_nosubs) == 0)
- {
- push_matched_paren(index, (*m_presult)[index]);
- m_presult->set_first(position, index);
- }
- pstate = pstate->next.p;
- break;
- }
- }
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
-{
- bool take_first, take_second;
- const re_alt* jmp = static_cast<const re_alt*>(pstate);
-
- // find out which of these two alternatives we need to take:
- if(position == last)
- {
- take_first = jmp->can_be_null & mask_take;
- take_second = jmp->can_be_null & mask_skip;
- }
- else
- {
- take_first = can_start(*position, jmp->_map, (unsigned char)mask_take);
- take_second = can_start(*position, jmp->_map, (unsigned char)mask_skip);
- }
-
- if(take_first)
- {
- // we can take the first alternative,
- // see if we need to push next alternative:
- if(take_second)
- {
- push_alt(jmp->alt.p);
- }
- pstate = pstate->next.p;
- return true;
- }
- if(take_second)
- {
- pstate = jmp->alt.p;
- return true;
- }
- return false; // neither option is possible
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127 4244)
-#endif
-#ifdef BOOST_BORLANDC
-#pragma option push -w-8008 -w-8066 -w-8004
-#endif
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
-
- // find out which of these two alternatives we need to take:
- bool take_first, take_second;
- if(position == last)
- {
- take_first = rep->can_be_null & mask_take;
- take_second = rep->can_be_null & mask_skip;
- }
- else
- {
- take_first = can_start(*position, rep->_map, (unsigned char)mask_take);
- take_second = can_start(*position, rep->_map, (unsigned char)mask_skip);
- }
-
- if((m_backup_state->state_id != saved_state_repeater_count)
- || (static_cast<saved_repeater<BidiIterator>*>(m_backup_state)->count.get_id() != rep->state_id)
- || (next_count->get_id() != rep->state_id))
- {
- // we're moving to a different repeat from the last
- // one, so set up a counter object:
- push_repeater_count(rep->state_id, &next_count);
- }
- //
- // If we've had at least one repeat already, and the last one
- // matched the NULL string then set the repeat count to
- // maximum:
- //
- next_count->check_null_repeat(position, rep->max);
-
- if(next_count->get_count() < rep->min)
- {
- // we must take the repeat:
- if(take_first)
- {
- // increase the counter:
- ++(*next_count);
- pstate = rep->next.p;
- return true;
- }
- return false;
- }
-
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- if(greedy)
- {
- // try and take the repeat if we can:
- if((next_count->get_count() < rep->max) && take_first)
- {
- if(take_second)
- {
- // store position in case we fail:
- push_alt(rep->alt.p);
- }
- // increase the counter:
- ++(*next_count);
- pstate = rep->next.p;
- return true;
- }
- else if(take_second)
- {
- pstate = rep->alt.p;
- return true;
- }
- return false; // can't take anything, fail...
- }
- else // non-greedy
- {
- // try and skip the repeat if we can:
- if(take_second)
- {
- if((next_count->get_count() < rep->max) && take_first)
- {
- // store position in case we fail:
- push_non_greedy_repeat(rep->next.p);
- }
- pstate = rep->alt.p;
- return true;
- }
- if((next_count->get_count() < rep->max) && take_first)
- {
- // increase the counter:
- ++(*next_count);
- pstate = rep->next.p;
- return true;
- }
- }
- return false;
-#ifdef BOOST_BORLANDC
-#pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
-{
- std::size_t count = 0;
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- re_syntax_base* psingle = rep->next.p;
- // match compulsory repeats first:
- while(count < rep->min)
- {
- pstate = psingle;
- if(!match_wild())
- return false;
- ++count;
- }
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- if(greedy)
- {
- // repeat for as long as we can:
- while(count < rep->max)
- {
- pstate = psingle;
- if(!match_wild())
- break;
- ++count;
- }
- // remember where we got to if this is a leading repeat:
- if((rep->leading) && (count < rep->max))
- restart = position;
- // push backtrack info if available:
- if(count - rep->min)
- push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
- // jump to next state:
- pstate = rep->alt.p;
- return true;
- }
- else
- {
- // non-greedy, push state and return true if we can skip:
- if(count < rep->max)
- push_single_repeat(count, rep, position, saved_state_rep_slow_dot);
- pstate = rep->alt.p;
- return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
- }
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
-{
- if(m_match_flags & match_not_dot_null)
- return match_dot_repeat_slow();
- if((static_cast<const re_dot*>(pstate->next.p)->mask & match_any_mask) == 0)
- return match_dot_repeat_slow();
-
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t count = static_cast<std::size_t>((std::min)(static_cast<std::size_t>(::boost::BOOST_REGEX_DETAIL_NS::distance(position, last)), greedy ? rep->max : rep->min));
- if(rep->min > count)
- {
- position = last;
- return false; // not enough text left to match
- }
- std::advance(position, count);
-
- if(greedy)
- {
- if((rep->leading) && (count < rep->max))
- restart = position;
- // push backtrack info if available:
- if(count - rep->min)
- push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
- // jump to next state:
- pstate = rep->alt.p;
- return true;
- }
- else
- {
- // non-greedy, push state and return true if we can skip:
- if(count < rep->max)
- push_single_repeat(count, rep, position, saved_state_rep_fast_dot);
- pstate = rep->alt.p;
- return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
- }
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
-#ifdef BOOST_BORLANDC
-#pragma option push -w-8008 -w-8066 -w-8004
-#endif
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- BOOST_REGEX_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
- const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);
- std::size_t count = 0;
- //
- // start by working out how much we can skip:
- //
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t desired = greedy ? rep->max : rep->min;
- if(::boost::is_random_access_iterator<BidiIterator>::value)
- {
- BidiIterator end = position;
- // Move end forward by "desired", preferably without using distance or advance if we can
- // as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
- if(desired >= len)
- end = last;
- else
- std::advance(end, desired);
- BidiIterator origin(position);
- while((position != end) && (traits_inst.translate(*position, icase) == what))
- {
- ++position;
- }
- count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
- }
- else
- {
- while((count < desired) && (position != last) && (traits_inst.translate(*position, icase) == what))
- {
- ++position;
- ++count;
- }
- }
-
- if(count < rep->min)
- return false;
-
- if(greedy)
- {
- if((rep->leading) && (count < rep->max))
- restart = position;
- // push backtrack info if available:
- if(count - rep->min)
- push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
- // jump to next state:
- pstate = rep->alt.p;
- return true;
- }
- else
- {
- // non-greedy, push state and return true if we can skip:
- if(count < rep->max)
- push_single_repeat(count, rep, position, saved_state_rep_char);
- pstate = rep->alt.p;
- return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
- }
-#ifdef BOOST_BORLANDC
-#pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
-#ifdef BOOST_BORLANDC
-#pragma option push -w-8008 -w-8066 -w-8004
-#endif
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
- std::size_t count = 0;
- //
- // start by working out how much we can skip:
- //
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t desired = greedy ? rep->max : rep->min;
- if(::boost::is_random_access_iterator<BidiIterator>::value)
- {
- BidiIterator end = position;
- // Move end forward by "desired", preferably without using distance or advance if we can
- // as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
- if(desired >= len)
- end = last;
- else
- std::advance(end, desired);
- BidiIterator origin(position);
- while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- ++position;
- }
- count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
- }
- else
- {
- while((count < desired) && (position != last) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- ++position;
- ++count;
- }
- }
-
- if(count < rep->min)
- return false;
-
- if(greedy)
- {
- if((rep->leading) && (count < rep->max))
- restart = position;
- // push backtrack info if available:
- if(count - rep->min)
- push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
- // jump to next state:
- pstate = rep->alt.p;
- return true;
- }
- else
- {
- // non-greedy, push state and return true if we can skip:
- if(count < rep->max)
- push_single_repeat(count, rep, position, saved_state_rep_short_set);
- pstate = rep->alt.p;
- return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
- }
-#ifdef BOOST_BORLANDC
-#pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
-#ifdef BOOST_BORLANDC
-#pragma option push -w-8008 -w-8066 -w-8004
-#endif
- typedef typename traits::char_class_type m_type;
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- const re_set_long<m_type>* set = static_cast<const re_set_long<m_type>*>(pstate->next.p);
- std::size_t count = 0;
- //
- // start by working out how much we can skip:
- //
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t desired = greedy ? rep->max : rep->min;
- if(::boost::is_random_access_iterator<BidiIterator>::value)
- {
- BidiIterator end = position;
- // Move end forward by "desired", preferably without using distance or advance if we can
- // as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
- if(desired >= len)
- end = last;
- else
- std::advance(end, desired);
- BidiIterator origin(position);
- while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
- {
- ++position;
- }
- count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
- }
- else
- {
- while((count < desired) && (position != last) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
- {
- ++position;
- ++count;
- }
- }
-
- if(count < rep->min)
- return false;
-
- if(greedy)
- {
- if((rep->leading) && (count < rep->max))
- restart = position;
- // push backtrack info if available:
- if(count - rep->min)
- push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
- // jump to next state:
- pstate = rep->alt.p;
- return true;
- }
- else
- {
- // non-greedy, push state and return true if we can skip:
- if(count < rep->max)
- push_single_repeat(count, rep, position, saved_state_rep_long_set);
- pstate = rep->alt.p;
- return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
- }
-#ifdef BOOST_BORLANDC
-#pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_recursion()
-{
- BOOST_REGEX_ASSERT(pstate->type == syntax_element_recurse);
- //
- // See if we've seen this recursion before at this location, if we have then
- // we need to prevent infinite recursion:
- //
- for(typename std::vector<recursion_info<results_type> >::reverse_iterator i = recursion_stack.rbegin(); i != recursion_stack.rend(); ++i)
- {
- if(i->idx == static_cast<const re_brace*>(static_cast<const re_jump*>(pstate)->alt.p)->index)
- {
- if(i->location_of_start == position)
- return false;
- break;
- }
- }
- //
- // Backup call stack:
- //
- push_recursion_pop();
- //
- // Set new call stack:
- //
- if(recursion_stack.capacity() == 0)
- {
- recursion_stack.reserve(50);
- }
- recursion_stack.push_back(recursion_info<results_type>());
- recursion_stack.back().preturn_address = pstate->next.p;
- recursion_stack.back().results = *m_presult;
- pstate = static_cast<const re_jump*>(pstate)->alt.p;
- recursion_stack.back().idx = static_cast<const re_brace*>(pstate)->index;
- recursion_stack.back().location_of_start = position;
- //if(static_cast<const re_recurse*>(pstate)->state_id > 0)
- {
- push_repeater_count(-(2 + static_cast<const re_brace*>(pstate)->index), &next_count);
- }
-
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_endmark()
-{
- int index = static_cast<const re_brace*>(pstate)->index;
- icase = static_cast<const re_brace*>(pstate)->icase;
- if(index > 0)
- {
- if((m_match_flags & match_nosubs) == 0)
- {
- m_presult->set_second(position, index);
- }
- if(!recursion_stack.empty())
- {
- if(index == recursion_stack.back().idx)
- {
- pstate = recursion_stack.back().preturn_address;
- *m_presult = recursion_stack.back().results;
- push_recursion(recursion_stack.back().idx, recursion_stack.back().preturn_address, m_presult, &recursion_stack.back().results);
- recursion_stack.pop_back();
- push_repeater_count(-(2 + index), &next_count);
- }
- }
- }
- else if((index < 0) && (index != -4))
- {
- // matched forward lookahead:
- pstate = 0;
- return true;
- }
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
-{
- if(!recursion_stack.empty())
- {
- BOOST_REGEX_ASSERT(0 == recursion_stack.back().idx);
- pstate = recursion_stack.back().preturn_address;
- push_recursion(recursion_stack.back().idx, recursion_stack.back().preturn_address, m_presult, &recursion_stack.back().results);
- *m_presult = recursion_stack.back().results;
- recursion_stack.pop_back();
- return true;
- }
- if((m_match_flags & match_not_null) && (position == (*m_presult)[0].first))
- return false;
- if((m_match_flags & match_all) && (position != last))
- return false;
- if((m_match_flags & regex_constants::match_not_initial_null) && (position == search_base))
- return false;
- m_presult->set_second(position);
- pstate = 0;
- m_has_found_match = true;
- if((m_match_flags & match_posix) == match_posix)
- {
- m_result.maybe_assign(*m_presult);
- if((m_match_flags & match_any) == 0)
- return false;
- }
-#ifdef BOOST_REGEX_MATCH_EXTRA
- if(match_extra & m_match_flags)
- {
- for(unsigned i = 0; i < m_presult->size(); ++i)
- if((*m_presult)[i].matched)
- ((*m_presult)[i]).get_captures().push_back((*m_presult)[i]);
- }
-#endif
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_commit()
-{
- // Ideally we would just junk all the states that are on the stack,
- // however we might not unwind correctly in that case, so for now,
- // just mark that we don't backtrack into whatever is left (or rather
- // we'll unwind it unconditionally without pausing to try other matches).
-
- switch(static_cast<const re_commit*>(pstate)->action)
- {
- case commit_commit:
- restart = last;
- break;
- case commit_skip:
- if(base != position)
- {
- restart = position;
- // Have to decrement restart since it will get incremented again later:
- --restart;
- }
- break;
- case commit_prune:
- break;
- }
-
- saved_state* pmp = m_backup_state;
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = m_backup_state;
- --pmp;
- }
- (void) new (pmp)saved_state(16);
- m_backup_state = pmp;
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_then()
-{
- // Just leave a mark that we need to skip to next alternative:
- saved_state* pmp = m_backup_state;
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = m_backup_state;
- --pmp;
- }
- (void) new (pmp)saved_state(17);
- m_backup_state = pmp;
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index, bool have_match)
-{
- while(pstate)
- {
- if(pstate->type == syntax_element_endmark)
- {
- if(static_cast<const re_brace*>(pstate)->index == index)
- {
- if(have_match)
- return this->match_endmark();
- pstate = pstate->next.p;
- return true;
- }
- else
- {
- // Unenclosed closing ), occurs when (*ACCEPT) is inside some other
- // parenthesis which may or may not have other side effects associated with it.
- const re_syntax_base* sp = pstate;
- match_endmark();
- if(!pstate)
- {
- unwind(true);
- // unwind may leave pstate NULL if we've unwound a forward lookahead, in which
- // case just move to the next state and keep looking...
- if (!pstate)
- pstate = sp->next.p;
- }
- }
- continue;
- }
- else if(pstate->type == syntax_element_match)
- return true;
- else if(pstate->type == syntax_element_startmark)
- {
- int idx = static_cast<const re_brace*>(pstate)->index;
- pstate = pstate->next.p;
- skip_until_paren(idx, false);
- continue;
- }
- pstate = pstate->next.p;
- }
- return true;
-}
-
-/****************************************************************************
-
-Unwind and associated procedures follow, these perform what normal stack
-unwinding does in the recursive implementation.
-
-****************************************************************************/
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind(bool have_match)
-{
- static unwind_proc_type const s_unwind_table[19] =
- {
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_end,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_paren,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_stopper,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_assertion,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_alt,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_extra_block,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_greedy_single_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_slow_dot_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_fast_dot_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_pop,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_commit,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_then,
- &perl_matcher<BidiIterator, Allocator, traits>::unwind_case,
- };
-
- m_recursive_result = have_match;
- m_unwound_lookahead = false;
- m_unwound_alt = false;
- unwind_proc_type unwinder;
- bool cont;
- //
- // keep unwinding our stack until we have something to do:
- //
- do
- {
- unwinder = s_unwind_table[m_backup_state->state_id];
- cont = (this->*unwinder)(m_recursive_result);
- }while(cont);
- //
- // return true if we have more states to try:
- //
- return pstate ? true : false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_end(bool)
-{
- pstate = 0; // nothing left to search
- return false; // end of stack nothing more to search
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_case(bool)
-{
- saved_change_case* pmp = static_cast<saved_change_case*>(m_backup_state);
- icase = pmp->icase;
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_paren(bool have_match)
-{
- saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
- // restore previous values if no match was found:
- if(!have_match)
- {
- m_presult->set_first(pmp->sub.first, pmp->index, pmp->index == 0);
- m_presult->set_second(pmp->sub.second, pmp->index, pmp->sub.matched, pmp->index == 0);
- }
-#ifdef BOOST_REGEX_MATCH_EXTRA
- //
- // we have a match, push the capture information onto the stack:
- //
- else if(pmp->sub.matched && (match_extra & m_match_flags))
- ((*m_presult)[pmp->index]).get_captures().push_back(pmp->sub);
-#endif
- // unwind stack:
- m_backup_state = pmp+1;
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp);
- return true; // keep looking
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_stopper(bool)
-{
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(m_backup_state++);
- pstate = 0; // nothing left to search
- return false; // end of stack nothing more to search
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_assertion(bool r)
-{
- saved_assertion<BidiIterator>* pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
- pstate = pmp->pstate;
- position = pmp->position;
- bool result = (r == pmp->positive);
- m_recursive_result = pmp->positive ? r : !r;
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- m_unwound_lookahead = true;
- return !result; // return false if the assertion was matched to stop search.
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_alt(bool r)
-{
- saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- if(!r)
- {
- pstate = pmp->pstate;
- position = pmp->position;
- }
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- m_unwound_alt = !r;
- return r;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter(bool)
-{
- ++used_block_count;
- saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- return true; // keep looking
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_extra_block(bool)
-{
- saved_extra_block* pmp = static_cast<saved_extra_block*>(m_backup_state);
- void* condemmed = m_stack_base;
- m_stack_base = pmp->base;
- m_backup_state = pmp->end;
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp);
- put_mem_block(condemmed);
- return true; // keep looking
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::destroy_single_repeat()
-{
- saved_single_repeat<BidiIterator>* p = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(p++);
- m_backup_state = p;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_greedy_single_repeat(bool r)
-{
- saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
-
- // if we have a match, just discard this state:
- if(r)
- {
- destroy_single_repeat();
- return true;
- }
-
- const re_repeat* rep = pmp->rep;
- std::size_t count = pmp->count;
- BOOST_REGEX_ASSERT(rep->next.p != 0);
- BOOST_REGEX_ASSERT(rep->alt.p != 0);
-
- count -= rep->min;
-
- if((m_match_flags & match_partial) && (position == last))
- m_has_partial_match = true;
-
- BOOST_REGEX_ASSERT(count);
- position = pmp->last_position;
-
- // backtrack till we can skip out:
- do
- {
- --position;
- --count;
- ++state_count;
- }while(count && !can_start(*position, rep->_map, mask_skip));
-
- // if we've hit base, destroy this state:
- if(count == 0)
- {
- destroy_single_repeat();
- if(!can_start(*position, rep->_map, mask_skip))
- return true;
- }
- else
- {
- pmp->count = count + rep->min;
- pmp->last_position = position;
- }
- pstate = rep->alt.p;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_slow_dot_repeat(bool r)
-{
- saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
-
- // if we have a match, just discard this state:
- if(r)
- {
- destroy_single_repeat();
- return true;
- }
-
- const re_repeat* rep = pmp->rep;
- std::size_t count = pmp->count;
- BOOST_REGEX_ASSERT(rep->type == syntax_element_dot_rep);
- BOOST_REGEX_ASSERT(rep->next.p != 0);
- BOOST_REGEX_ASSERT(rep->alt.p != 0);
- BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_wild);
-
- BOOST_REGEX_ASSERT(count < rep->max);
- pstate = rep->next.p;
- position = pmp->last_position;
-
- if(position != last)
- {
- // wind forward until we can skip out of the repeat:
- do
- {
- if(!match_wild())
- {
- // failed repeat match, discard this state and look for another:
- destroy_single_repeat();
- return true;
- }
- ++count;
- ++state_count;
- pstate = rep->next.p;
- }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
- }
- if(position == last)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- if(0 == (rep->can_be_null & mask_skip))
- return true;
- }
- else if(count == rep->max)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if(!can_start(*position, rep->_map, mask_skip))
- return true;
- }
- else
- {
- pmp->count = count;
- pmp->last_position = position;
- }
- pstate = rep->alt.p;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_fast_dot_repeat(bool r)
-{
- saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
-
- // if we have a match, just discard this state:
- if(r)
- {
- destroy_single_repeat();
- return true;
- }
-
- const re_repeat* rep = pmp->rep;
- std::size_t count = pmp->count;
-
- BOOST_REGEX_ASSERT(count < rep->max);
- position = pmp->last_position;
- if(position != last)
- {
-
- // wind forward until we can skip out of the repeat:
- do
- {
- ++position;
- ++count;
- ++state_count;
- }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
- }
-
- // remember where we got to if this is a leading repeat:
- if((rep->leading) && (count < rep->max))
- restart = position;
- if(position == last)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- if(0 == (rep->can_be_null & mask_skip))
- return true;
- }
- else if(count == rep->max)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if(!can_start(*position, rep->_map, mask_skip))
- return true;
- }
- else
- {
- pmp->count = count;
- pmp->last_position = position;
- }
- pstate = rep->alt.p;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat(bool r)
-{
- saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
-
- // if we have a match, just discard this state:
- if(r)
- {
- destroy_single_repeat();
- return true;
- }
-
- const re_repeat* rep = pmp->rep;
- std::size_t count = pmp->count;
- pstate = rep->next.p;
- const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(pstate) + 1);
- position = pmp->last_position;
-
- BOOST_REGEX_ASSERT(rep->type == syntax_element_char_rep);
- BOOST_REGEX_ASSERT(rep->next.p != 0);
- BOOST_REGEX_ASSERT(rep->alt.p != 0);
- BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_literal);
- BOOST_REGEX_ASSERT(count < rep->max);
-
- if(position != last)
- {
- // wind forward until we can skip out of the repeat:
- do
- {
- if(traits_inst.translate(*position, icase) != what)
- {
- // failed repeat match, discard this state and look for another:
- destroy_single_repeat();
- return true;
- }
- ++count;
- ++ position;
- ++state_count;
- pstate = rep->next.p;
- }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
- }
- // remember where we got to if this is a leading repeat:
- if((rep->leading) && (count < rep->max))
- restart = position;
- if(position == last)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- if(0 == (rep->can_be_null & mask_skip))
- return true;
- }
- else if(count == rep->max)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if(!can_start(*position, rep->_map, mask_skip))
- return true;
- }
- else
- {
- pmp->count = count;
- pmp->last_position = position;
- }
- pstate = rep->alt.p;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat(bool r)
-{
- saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
-
- // if we have a match, just discard this state:
- if(r)
- {
- destroy_single_repeat();
- return true;
- }
-
- const re_repeat* rep = pmp->rep;
- std::size_t count = pmp->count;
- pstate = rep->next.p;
- const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
- position = pmp->last_position;
-
- BOOST_REGEX_ASSERT(rep->type == syntax_element_short_set_rep);
- BOOST_REGEX_ASSERT(rep->next.p != 0);
- BOOST_REGEX_ASSERT(rep->alt.p != 0);
- BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_set);
- BOOST_REGEX_ASSERT(count < rep->max);
-
- if(position != last)
- {
- // wind forward until we can skip out of the repeat:
- do
- {
- if(!map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- // failed repeat match, discard this state and look for another:
- destroy_single_repeat();
- return true;
- }
- ++count;
- ++ position;
- ++state_count;
- pstate = rep->next.p;
- }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
- }
- // remember where we got to if this is a leading repeat:
- if((rep->leading) && (count < rep->max))
- restart = position;
- if(position == last)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- if(0 == (rep->can_be_null & mask_skip))
- return true;
- }
- else if(count == rep->max)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if(!can_start(*position, rep->_map, mask_skip))
- return true;
- }
- else
- {
- pmp->count = count;
- pmp->last_position = position;
- }
- pstate = rep->alt.p;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat(bool r)
-{
- typedef typename traits::char_class_type m_type;
- saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
-
- // if we have a match, just discard this state:
- if(r)
- {
- destroy_single_repeat();
- return true;
- }
-
- const re_repeat* rep = pmp->rep;
- std::size_t count = pmp->count;
- pstate = rep->next.p;
- const re_set_long<m_type>* set = static_cast<const re_set_long<m_type>*>(pstate);
- position = pmp->last_position;
-
- BOOST_REGEX_ASSERT(rep->type == syntax_element_long_set_rep);
- BOOST_REGEX_ASSERT(rep->next.p != 0);
- BOOST_REGEX_ASSERT(rep->alt.p != 0);
- BOOST_REGEX_ASSERT(rep->next.p->type == syntax_element_long_set);
- BOOST_REGEX_ASSERT(count < rep->max);
-
- if(position != last)
- {
- // wind forward until we can skip out of the repeat:
- do
- {
- if(position == re_is_set_member(position, last, set, re.get_data(), icase))
- {
- // failed repeat match, discard this state and look for another:
- destroy_single_repeat();
- return true;
- }
- ++position;
- ++count;
- ++state_count;
- pstate = rep->next.p;
- }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
- }
- // remember where we got to if this is a leading repeat:
- if((rep->leading) && (count < rep->max))
- restart = position;
- if(position == last)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- if(0 == (rep->can_be_null & mask_skip))
- return true;
- }
- else if(count == rep->max)
- {
- // can't repeat any more, remove the pushed state:
- destroy_single_repeat();
- if(!can_start(*position, rep->_map, mask_skip))
- return true;
- }
- else
- {
- pmp->count = count;
- pmp->last_position = position;
- }
- pstate = rep->alt.p;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat(bool r)
-{
- saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- if(!r)
- {
- position = pmp->position;
- pstate = pmp->pstate;
- ++(*next_count);
- }
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- return r;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion(bool r)
-{
- // We are backtracking back inside a recursion, need to push the info
- // back onto the recursion stack, and do so unconditionally, otherwise
- // we can get mismatched pushes and pops...
- saved_recursion<results_type>* pmp = static_cast<saved_recursion<results_type>*>(m_backup_state);
- if (!r)
- {
- recursion_stack.push_back(recursion_info<results_type>());
- recursion_stack.back().idx = pmp->recursion_id;
- recursion_stack.back().preturn_address = pmp->preturn_address;
- recursion_stack.back().results = pmp->prior_results;
- recursion_stack.back().location_of_start = position;
- *m_presult = pmp->internal_results;
- }
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_pop(bool r)
-{
- // Backtracking out of a recursion, we must pop state off the recursion
- // stack unconditionally to ensure matched pushes and pops:
- saved_state* pmp = static_cast<saved_state*>(m_backup_state);
- if (!r && !recursion_stack.empty())
- {
- *m_presult = recursion_stack.back().results;
- position = recursion_stack.back().location_of_start;
- recursion_stack.pop_back();
- }
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-void perl_matcher<BidiIterator, Allocator, traits>::push_recursion_pop()
-{
- saved_state* pmp = static_cast<saved_state*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_state*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_state(15);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_commit(bool b)
-{
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(m_backup_state++);
- while(unwind(b) && !m_unwound_lookahead){}
- if(m_unwound_lookahead && pstate)
- {
- //
- // If we stop because we just unwound an assertion, put the
- // commit state back on the stack again:
- //
- m_unwound_lookahead = false;
- saved_state* pmp = m_backup_state;
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = m_backup_state;
- --pmp;
- }
- (void) new (pmp)saved_state(16);
- m_backup_state = pmp;
- }
- // This prevents us from stopping when we exit from an independent sub-expression:
- m_independent = false;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_then(bool b)
-{
- // Unwind everything till we hit an alternative:
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(m_backup_state++);
- bool result = false;
- while((result = unwind(b)) && !m_unwound_alt){}
- // We're now pointing at the next alternative, need one more backtrack
- // since *all* the other alternatives must fail once we've reached a THEN clause:
- if(result && m_unwound_alt)
- unwind(b);
- return false;
-}
-
-/*
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_parenthesis_pop(bool r)
-{
- saved_state* pmp = static_cast<saved_state*>(m_backup_state);
- if(!r)
- {
- --parenthesis_stack_position;
- }
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-void perl_matcher<BidiIterator, Allocator, traits>::push_parenthesis_pop()
-{
- saved_state* pmp = static_cast<saved_state*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_state*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_state(16);
- m_backup_state = pmp;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::unwind_parenthesis_push(bool r)
-{
- saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- if(!r)
- {
- parenthesis_stack[parenthesis_stack_position++] = pmp->position;
- }
- boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
- m_backup_state = pmp;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-inline void perl_matcher<BidiIterator, Allocator, traits>::push_parenthesis_push(BidiIterator p)
-{
- saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- --pmp;
- if(pmp < m_stack_base)
- {
- extend_stack();
- pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
- --pmp;
- }
- (void) new (pmp)saved_position<BidiIterator>(0, p, 17);
- m_backup_state = pmp;
-}
-*/
-} // namespace BOOST_REGEX_DETAIL_NS
-} // namespace boost
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_recursive.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_recursive.hpp
deleted file mode 100644
index 7d262fe2f2..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/perl_matcher_recursive.hpp
+++ /dev/null
@@ -1,1131 +0,0 @@
-/*
- *
- * Copyright (c) 2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE perl_matcher_common.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Definitions of perl_matcher member functions that are
- * specific to the recursive implementation.
- */
-
-#ifndef BOOST_REGEX_V4_PERL_MATCHER_RECURSIVE_HPP
-#define BOOST_REGEX_V4_PERL_MATCHER_RECURSIVE_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4800)
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-template <class BidiIterator>
-class backup_subex
-{
- int index;
- sub_match<BidiIterator> sub;
-public:
- template <class A>
- backup_subex(const match_results<BidiIterator, A>& w, int i)
- : index(i), sub(w[i], false) {}
- template <class A>
- void restore(match_results<BidiIterator, A>& w)
- {
- w.set_first(sub.first, index, index == 0);
- w.set_second(sub.second, index, sub.matched, index == 0);
- }
- const sub_match<BidiIterator>& get() { return sub; }
-};
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
-{
- static matcher_proc_type const s_match_vtable[34] =
- {
- (&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
- &perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
- &perl_matcher<BidiIterator, Allocator, traits>::match_literal,
- &perl_matcher<BidiIterator, Allocator, traits>::match_start_line,
- &perl_matcher<BidiIterator, Allocator, traits>::match_end_line,
- &perl_matcher<BidiIterator, Allocator, traits>::match_wild,
- &perl_matcher<BidiIterator, Allocator, traits>::match_match,
- &perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary,
- &perl_matcher<BidiIterator, Allocator, traits>::match_within_word,
- &perl_matcher<BidiIterator, Allocator, traits>::match_word_start,
- &perl_matcher<BidiIterator, Allocator, traits>::match_word_end,
- &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start,
- &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end,
- &perl_matcher<BidiIterator, Allocator, traits>::match_backref,
- &perl_matcher<BidiIterator, Allocator, traits>::match_long_set,
- &perl_matcher<BidiIterator, Allocator, traits>::match_set,
- &perl_matcher<BidiIterator, Allocator, traits>::match_jump,
- &perl_matcher<BidiIterator, Allocator, traits>::match_alt,
- &perl_matcher<BidiIterator, Allocator, traits>::match_rep,
- &perl_matcher<BidiIterator, Allocator, traits>::match_combining,
- &perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end,
- &perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue,
- // Although this next line *should* be evaluated at compile time, in practice
- // some compilers (VC++) emit run-time initialisation which breaks thread
- // safety, so use a dispatch function instead:
- //(::boost::is_random_access_iterator<BidiIterator>::value ? &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast : &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow),
- &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_dispatch,
- &perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat,
- &perl_matcher<BidiIterator, Allocator, traits>::match_backstep,
- &perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
- &perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
- &perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
- &perl_matcher<BidiIterator, Allocator, traits>::match_fail,
- &perl_matcher<BidiIterator, Allocator, traits>::match_accept,
- &perl_matcher<BidiIterator, Allocator, traits>::match_commit,
- &perl_matcher<BidiIterator, Allocator, traits>::match_then,
- };
-
- if(state_count > max_state_count)
- raise_error(traits_inst, regex_constants::error_complexity);
- while(pstate)
- {
- matcher_proc_type proc = s_match_vtable[pstate->type];
- ++state_count;
- if(!(this->*proc)())
- {
- if((m_match_flags & match_partial) && (position == last) && (position != search_base))
- m_has_partial_match = true;
- return 0;
- }
- }
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
-{
- int index = static_cast<const re_brace*>(pstate)->index;
- icase = static_cast<const re_brace*>(pstate)->icase;
- bool r = true;
- switch(index)
- {
- case 0:
- pstate = pstate->next.p;
- break;
- case -1:
- case -2:
- {
- // forward lookahead assert:
- BidiIterator old_position(position);
- const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
- pstate = pstate->next.p->next.p;
- r = match_all_states();
- pstate = next_pstate;
- position = old_position;
- if((r && (index != -1)) || (!r && (index != -2)))
- r = false;
- else
- r = true;
- if(r && m_have_accept)
- r = skip_until_paren(INT_MAX);
- break;
- }
- case -3:
- {
- // independent sub-expression:
- bool old_independent = m_independent;
- m_independent = true;
- const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
- pstate = pstate->next.p->next.p;
- bool can_backtrack = m_can_backtrack;
- r = match_all_states();
- if(r)
- m_can_backtrack = can_backtrack;
- pstate = next_pstate;
- m_independent = old_independent;
-#ifdef BOOST_REGEX_MATCH_EXTRA
- if(r && (m_match_flags & match_extra))
- {
- //
- // our captures have been stored in *m_presult
- // we need to unpack them, and insert them
- // back in the right order when we unwind the stack:
- //
- unsigned i;
- match_results<BidiIterator, Allocator> tm(*m_presult);
- for(i = 0; i < tm.size(); ++i)
- (*m_presult)[i].get_captures().clear();
- // match everything else:
- r = match_all_states();
- // now place the stored captures back:
- for(i = 0; i < tm.size(); ++i)
- {
- typedef typename sub_match<BidiIterator>::capture_sequence_type seq;
- seq& s1 = (*m_presult)[i].get_captures();
- const seq& s2 = tm[i].captures();
- s1.insert(
- s1.end(),
- s2.begin(),
- s2.end());
- }
- }
-#endif
- if(r && m_have_accept)
- r = skip_until_paren(INT_MAX);
- break;
- }
- case -4:
- {
- // conditional expression:
- const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
- BOOST_REGEX_ASSERT(alt->type == syntax_element_alt);
- pstate = alt->next.p;
- if(pstate->type == syntax_element_assert_backref)
- {
- if(!match_assert_backref())
- pstate = alt->alt.p;
- break;
- }
- else
- {
- // zero width assertion, have to match this recursively:
- BOOST_REGEX_ASSERT(pstate->type == syntax_element_startmark);
- bool negated = static_cast<const re_brace*>(pstate)->index == -2;
- BidiIterator saved_position = position;
- const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
- pstate = pstate->next.p->next.p;
- bool res = match_all_states();
- position = saved_position;
- if(negated)
- res = !res;
- if(res)
- pstate = next_pstate;
- else
- pstate = alt->alt.p;
- break;
- }
- }
- case -5:
- {
- // Reset start of $0, since we have a \K escape
- backup_subex<BidiIterator> sub(*m_presult, 0);
- m_presult->set_first(position, 0, true);
- pstate = pstate->next.p;
- r = match_all_states();
- if(r == false)
- sub.restore(*m_presult);
- break;
- }
- default:
- {
- BOOST_REGEX_ASSERT(index > 0);
- if((m_match_flags & match_nosubs) == 0)
- {
- backup_subex<BidiIterator> sub(*m_presult, index);
- m_presult->set_first(position, index);
- pstate = pstate->next.p;
- r = match_all_states();
- if(r == false)
- sub.restore(*m_presult);
-#ifdef BOOST_REGEX_MATCH_EXTRA
- //
- // we have a match, push the capture information onto the stack:
- //
- else if(sub.get().matched && (match_extra & m_match_flags))
- ((*m_presult)[index]).get_captures().push_back(sub.get());
-#endif
- }
- else
- {
- pstate = pstate->next.p;
- }
- break;
- }
- }
- return r;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
-{
- bool take_first, take_second;
- const re_alt* jmp = static_cast<const re_alt*>(pstate);
-
- // find out which of these two alternatives we need to take:
- if(position == last)
- {
- take_first = jmp->can_be_null & mask_take;
- take_second = jmp->can_be_null & mask_skip;
- }
- else
- {
- take_first = can_start(*position, jmp->_map, (unsigned char)mask_take);
- take_second = can_start(*position, jmp->_map, (unsigned char)mask_skip);
- }
-
- if(take_first)
- {
- // we can take the first alternative,
- // see if we need to push next alternative:
- if(take_second)
- {
- BidiIterator oldposition(position);
- const re_syntax_base* old_pstate = jmp->alt.p;
- pstate = pstate->next.p;
- bool oldcase = icase;
- m_have_then = false;
- if(!match_all_states())
- {
- pstate = old_pstate;
- position = oldposition;
- icase = oldcase;
- if(m_have_then)
- {
- m_can_backtrack = true;
- m_have_then = false;
- return false;
- }
- }
- m_have_then = false;
- return m_can_backtrack;
- }
- pstate = pstate->next.p;
- return true;
- }
- if(take_second)
- {
- pstate = jmp->alt.p;
- return true;
- }
- return false; // neither option is possible
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127 4244)
-#endif
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- //
- // Always copy the repeat count, so that the state is restored
- // when we exit this scope:
- //
- repeater_count<BidiIterator> r(rep->state_id, &next_count, position, this->recursion_stack.size() ? this->recursion_stack.back().idx : INT_MIN + 3);
- //
- // If we've had at least one repeat already, and the last one
- // matched the NULL string then set the repeat count to
- // maximum:
- //
- next_count->check_null_repeat(position, rep->max);
-
- // find out which of these two alternatives we need to take:
- bool take_first, take_second;
- if(position == last)
- {
- take_first = rep->can_be_null & mask_take;
- take_second = rep->can_be_null & mask_skip;
- }
- else
- {
- take_first = can_start(*position, rep->_map, (unsigned char)mask_take);
- take_second = can_start(*position, rep->_map, (unsigned char)mask_skip);
- }
-
- if(next_count->get_count() < rep->min)
- {
- // we must take the repeat:
- if(take_first)
- {
- // increase the counter:
- ++(*next_count);
- pstate = rep->next.p;
- return match_all_states();
- }
- return false;
- }
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- if(greedy)
- {
- // try and take the repeat if we can:
- if((next_count->get_count() < rep->max) && take_first)
- {
- // store position in case we fail:
- BidiIterator pos = position;
- // increase the counter:
- ++(*next_count);
- pstate = rep->next.p;
- if(match_all_states())
- return true;
- if(!m_can_backtrack)
- return false;
- // failed repeat, reset posistion and fall through for alternative:
- position = pos;
- }
- if(take_second)
- {
- pstate = rep->alt.p;
- return true;
- }
- return false; // can't take anything, fail...
- }
- else // non-greedy
- {
- // try and skip the repeat if we can:
- if(take_second)
- {
- // store position in case we fail:
- BidiIterator pos = position;
- pstate = rep->alt.p;
- if(match_all_states())
- return true;
- if(!m_can_backtrack)
- return false;
- // failed alternative, reset posistion and fall through for repeat:
- position = pos;
- }
- if((next_count->get_count() < rep->max) && take_first)
- {
- // increase the counter:
- ++(*next_count);
- pstate = rep->next.p;
- return match_all_states();
- }
- }
- return false;
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- std::size_t count = 0;
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- re_syntax_base* psingle = rep->next.p;
- // match compulsary repeats first:
- while(count < rep->min)
- {
- pstate = psingle;
- if(!match_wild())
- return false;
- ++count;
- }
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- if(greedy)
- {
- // normal repeat:
- while(count < rep->max)
- {
- pstate = psingle;
- if(!match_wild())
- break;
- ++count;
- }
- if((rep->leading) && (count < rep->max))
- restart = position;
- pstate = rep;
- return backtrack_till_match(count - rep->min);
- }
- else
- {
- // non-greedy, keep trying till we get a match:
- BidiIterator save_pos;
- do
- {
- if((rep->leading) && (rep->max == UINT_MAX))
- restart = position;
- pstate = rep->alt.p;
- save_pos = position;
- ++state_count;
- if(match_all_states())
- return true;
- if((count >= rep->max) || !m_can_backtrack)
- return false;
- ++count;
- pstate = psingle;
- position = save_pos;
- if(!match_wild())
- return false;
- }while(true);
- }
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- if(m_match_flags & match_not_dot_null)
- return match_dot_repeat_slow();
- if((static_cast<const re_dot*>(pstate->next.p)->mask & match_any_mask) == 0)
- return match_dot_repeat_slow();
- //
- // start by working out how much we can skip:
- //
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4267)
-#endif
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t count = (std::min)(static_cast<std::size_t>(::boost::BOOST_REGEX_DETAIL_NS::distance(position, last)), greedy ? rep->max : rep->min);
- if(rep->min > count)
- {
- position = last;
- return false; // not enough text left to match
- }
- std::advance(position, count);
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
- if((rep->leading) && (count < rep->max) && greedy)
- restart = position;
- if(greedy)
- return backtrack_till_match(count - rep->min);
-
- // non-greedy, keep trying till we get a match:
- BidiIterator save_pos;
- do
- {
- while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
- {
- ++position;
- ++count;
- }
- if((rep->leading) && (rep->max == UINT_MAX))
- restart = position;
- pstate = rep->alt.p;
- save_pos = position;
- ++state_count;
- if(match_all_states())
- return true;
- if((count >= rep->max) || !m_can_backtrack)
- return false;
- if(save_pos == last)
- return false;
- position = ++save_pos;
- ++count;
- }while(true);
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#pragma warning(disable:4267)
-#endif
-#ifdef BOOST_BORLANDC
-#pragma option push -w-8008 -w-8066 -w-8004
-#endif
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- BOOST_REGEX_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
- const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);
- //
- // start by working out how much we can skip:
- //
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t count, desired;
- if(::boost::is_random_access_iterator<BidiIterator>::value)
- {
- desired =
- (std::min)(
- (std::size_t)(greedy ? rep->max : rep->min),
- (std::size_t)::boost::BOOST_REGEX_DETAIL_NS::distance(position, last));
- count = desired;
- ++desired;
- if(icase)
- {
- while(--desired && (traits_inst.translate_nocase(*position) == what))
- {
- ++position;
- }
- }
- else
- {
- while(--desired && (traits_inst.translate(*position) == what))
- {
- ++position;
- }
- }
- count = count - desired;
- }
- else
- {
- count = 0;
- desired = greedy ? rep->max : rep->min;
- while((count < desired) && (position != last) && (traits_inst.translate(*position, icase) == what))
- {
- ++position;
- ++count;
- }
- }
- if((rep->leading) && (count < rep->max) && greedy)
- restart = position;
- if(count < rep->min)
- return false;
-
- if(greedy)
- return backtrack_till_match(count - rep->min);
-
- // non-greedy, keep trying till we get a match:
- BidiIterator save_pos;
- do
- {
- while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
- {
- if((traits_inst.translate(*position, icase) == what))
- {
- ++position;
- ++count;
- }
- else
- return false; // counldn't repeat even though it was the only option
- }
- if((rep->leading) && (rep->max == UINT_MAX))
- restart = position;
- pstate = rep->alt.p;
- save_pos = position;
- ++state_count;
- if(match_all_states())
- return true;
- if((count >= rep->max) || !m_can_backtrack)
- return false;
- position = save_pos;
- if(position == last)
- return false;
- if(traits_inst.translate(*position, icase) == what)
- {
- ++position;
- ++count;
- }
- else
- {
- return false;
- }
- }while(true);
-#ifdef BOOST_BORLANDC
-#pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
-#ifdef BOOST_BORLANDC
-#pragma option push -w-8008 -w-8066 -w-8004
-#endif
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
- std::size_t count = 0;
- //
- // start by working out how much we can skip:
- //
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t desired = greedy ? rep->max : rep->min;
- if(::boost::is_random_access_iterator<BidiIterator>::value)
- {
- BidiIterator end = position;
- // Move end forward by "desired", preferably without using distance or advance if we can
- // as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
- if(desired >= len)
- end = last;
- else
- std::advance(end, desired);
- BidiIterator origin(position);
- while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- ++position;
- }
- count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
- }
- else
- {
- while((count < desired) && (position != last) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- ++position;
- ++count;
- }
- }
- if((rep->leading) && (count < rep->max) && greedy)
- restart = position;
- if(count < rep->min)
- return false;
-
- if(greedy)
- return backtrack_till_match(count - rep->min);
-
- // non-greedy, keep trying till we get a match:
- BidiIterator save_pos;
- do
- {
- while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
- {
- if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- ++position;
- ++count;
- }
- else
- return false; // counldn't repeat even though it was the only option
- }
- if((rep->leading) && (rep->max == UINT_MAX))
- restart = position;
- pstate = rep->alt.p;
- save_pos = position;
- ++state_count;
- if(match_all_states())
- return true;
- if((count >= rep->max) || !m_can_backtrack)
- return false;
- position = save_pos;
- if(position == last)
- return false;
- if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
- {
- ++position;
- ++count;
- }
- else
- {
- return false;
- }
- }while(true);
-#ifdef BOOST_BORLANDC
-#pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
-#ifdef BOOST_BORLANDC
-#pragma option push -w-8008 -w-8066 -w-8004
-#endif
- typedef typename traits::char_class_type char_class_type;
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- const re_set_long<char_class_type>* set = static_cast<const re_set_long<char_class_type>*>(pstate->next.p);
- std::size_t count = 0;
- //
- // start by working out how much we can skip:
- //
- bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t desired = greedy ? rep->max : rep->min;
- if(::boost::is_random_access_iterator<BidiIterator>::value)
- {
- BidiIterator end = position;
- // Move end forward by "desired", preferably without using distance or advance if we can
- // as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
- if(desired >= len)
- end = last;
- else
- std::advance(end, desired);
- BidiIterator origin(position);
- while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
- {
- ++position;
- }
- count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
- }
- else
- {
- while((count < desired) && (position != last) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
- {
- ++position;
- ++count;
- }
- }
- if((rep->leading) && (count < rep->max) && greedy)
- restart = position;
- if(count < rep->min)
- return false;
-
- if(greedy)
- return backtrack_till_match(count - rep->min);
-
- // non-greedy, keep trying till we get a match:
- BidiIterator save_pos;
- do
- {
- while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
- {
- if(position != re_is_set_member(position, last, set, re.get_data(), icase))
- {
- ++position;
- ++count;
- }
- else
- return false; // counldn't repeat even though it was the only option
- }
- if((rep->leading) && (rep->max == UINT_MAX))
- restart = position;
- pstate = rep->alt.p;
- save_pos = position;
- ++state_count;
- if(match_all_states())
- return true;
- if((count >= rep->max) || !m_can_backtrack)
- return false;
- position = save_pos;
- if(position == last)
- return false;
- if(position != re_is_set_member(position, last, set, re.get_data(), icase))
- {
- ++position;
- ++count;
- }
- else
- {
- return false;
- }
- }while(true);
-#ifdef BOOST_BORLANDC
-#pragma option pop
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::backtrack_till_match(std::size_t count)
-{
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
-#endif
- if(!m_can_backtrack)
- return false;
- if((m_match_flags & match_partial) && (position == last))
- m_has_partial_match = true;
-
- const re_repeat* rep = static_cast<const re_repeat*>(pstate);
- BidiIterator backtrack = position;
- if(position == last)
- {
- if(rep->can_be_null & mask_skip)
- {
- pstate = rep->alt.p;
- if(match_all_states())
- return true;
- }
- if(count)
- {
- position = --backtrack;
- --count;
- }
- else
- return false;
- }
- do
- {
- while(count && !can_start(*position, rep->_map, mask_skip))
- {
- --position;
- --count;
- ++state_count;
- }
- pstate = rep->alt.p;
- backtrack = position;
- if(match_all_states())
- return true;
- if(count == 0)
- return false;
- position = --backtrack;
- ++state_count;
- --count;
- }while(true);
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_recursion()
-{
- BOOST_REGEX_ASSERT(pstate->type == syntax_element_recurse);
- //
- // Set new call stack:
- //
- if(recursion_stack.capacity() == 0)
- {
- recursion_stack.reserve(50);
- }
- //
- // See if we've seen this recursion before at this location, if we have then
- // we need to prevent infinite recursion:
- //
- for(typename std::vector<recursion_info<results_type> >::reverse_iterator i = recursion_stack.rbegin(); i != recursion_stack.rend(); ++i)
- {
- if(i->idx == static_cast<const re_brace*>(static_cast<const re_jump*>(pstate)->alt.p)->index)
- {
- if(i->location_of_start == position)
- return false;
- break;
- }
- }
- //
- // Now get on with it:
- //
- recursion_stack.push_back(recursion_info<results_type>());
- recursion_stack.back().preturn_address = pstate->next.p;
- recursion_stack.back().results = *m_presult;
- recursion_stack.back().repeater_stack = next_count;
- recursion_stack.back().location_of_start = position;
- pstate = static_cast<const re_jump*>(pstate)->alt.p;
- recursion_stack.back().idx = static_cast<const re_brace*>(pstate)->index;
-
- repeater_count<BidiIterator>* saved = next_count;
- repeater_count<BidiIterator> r(&next_count); // resets all repeat counts since we're recursing and starting fresh on those
- next_count = &r;
- bool can_backtrack = m_can_backtrack;
- bool result = match_all_states();
- m_can_backtrack = can_backtrack;
- next_count = saved;
-
- if(!result)
- {
- next_count = recursion_stack.back().repeater_stack;
- *m_presult = recursion_stack.back().results;
- recursion_stack.pop_back();
- return false;
- }
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_endmark()
-{
- int index = static_cast<const re_brace*>(pstate)->index;
- icase = static_cast<const re_brace*>(pstate)->icase;
- if(index > 0)
- {
- if((m_match_flags & match_nosubs) == 0)
- {
- m_presult->set_second(position, index);
- }
- if(!recursion_stack.empty())
- {
- if(index == recursion_stack.back().idx)
- {
- recursion_info<results_type> saved = recursion_stack.back();
- recursion_stack.pop_back();
- pstate = saved.preturn_address;
- repeater_count<BidiIterator>* saved_count = next_count;
- next_count = saved.repeater_stack;
- *m_presult = saved.results;
- if(!match_all_states())
- {
- recursion_stack.push_back(saved);
- next_count = saved_count;
- return false;
- }
- }
- }
- }
- else if((index < 0) && (index != -4))
- {
- // matched forward lookahead:
- pstate = 0;
- return true;
- }
- pstate = pstate ? pstate->next.p : 0;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
-{
- if(!recursion_stack.empty())
- {
- BOOST_REGEX_ASSERT(0 == recursion_stack.back().idx);
- const re_syntax_base* saved_state = pstate = recursion_stack.back().preturn_address;
- *m_presult = recursion_stack.back().results;
- recursion_stack.pop_back();
- if(!match_all_states())
- {
- recursion_stack.push_back(recursion_info<results_type>());
- recursion_stack.back().preturn_address = saved_state;
- recursion_stack.back().results = *m_presult;
- recursion_stack.back().location_of_start = position;
- return false;
- }
- return true;
- }
- if((m_match_flags & match_not_null) && (position == (*m_presult)[0].first))
- return false;
- if((m_match_flags & match_all) && (position != last))
- return false;
- if((m_match_flags & regex_constants::match_not_initial_null) && (position == search_base))
- return false;
- m_presult->set_second(position);
- pstate = 0;
- m_has_found_match = true;
- if((m_match_flags & match_posix) == match_posix)
- {
- m_result.maybe_assign(*m_presult);
- if((m_match_flags & match_any) == 0)
- return false;
- }
-#ifdef BOOST_REGEX_MATCH_EXTRA
- if(match_extra & m_match_flags)
- {
- for(unsigned i = 0; i < m_presult->size(); ++i)
- if((*m_presult)[i].matched)
- ((*m_presult)[i]).get_captures().push_back((*m_presult)[i]);
- }
-#endif
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_commit()
-{
- m_can_backtrack = false;
- int action = static_cast<const re_commit*>(pstate)->action;
- switch(action)
- {
- case commit_commit:
- restart = last;
- break;
- case commit_skip:
- restart = position;
- break;
- }
- pstate = pstate->next.p;
- return true;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_then()
-{
- pstate = pstate->next.p;
- if(match_all_states())
- return true;
- m_can_backtrack = false;
- m_have_then = true;
- return false;
-}
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case()
-{
- // change our case sensitivity:
- bool oldcase = this->icase;
- this->icase = static_cast<const re_case*>(pstate)->icase;
- pstate = pstate->next.p;
- bool result = match_all_states();
- this->icase = oldcase;
- return result;
-}
-
-
-
-template <class BidiIterator, class Allocator, class traits>
-bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index, bool have_match)
-{
- while(pstate)
- {
- if(pstate->type == syntax_element_endmark)
- {
- if(static_cast<const re_brace*>(pstate)->index == index)
- {
- if(have_match)
- return this->match_endmark();
- pstate = pstate->next.p;
- return true;
- }
- else
- {
- // Unenclosed closing ), occurs when (*ACCEPT) is inside some other
- // parenthesis which may or may not have other side effects associated with it.
- bool r = match_endmark();
- m_have_accept = true;
- if(!pstate)
- return r;
- }
- continue;
- }
- else if(pstate->type == syntax_element_match)
- return true;
- else if(pstate->type == syntax_element_startmark)
- {
- int idx = static_cast<const re_brace*>(pstate)->index;
- pstate = pstate->next.p;
- skip_until_paren(idx, false);
- continue;
- }
- pstate = pstate->next.p;
- }
- return true;
-}
-
-
-} // namespace BOOST_REGEX_DETAIL_NS
-} // namespace boost
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/primary_transform.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/primary_transform.hpp
deleted file mode 100644
index 47d172aa80..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/primary_transform.hpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE: primary_transform.hpp
- * VERSION: see <boost/version.hpp>
- * DESCRIPTION: Heuristically determines the sort string format in use
- * by the current locale.
- */
-
-#ifndef BOOST_REGEX_PRIMARY_TRANSFORM
-#define BOOST_REGEX_PRIMARY_TRANSFORM
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
- namespace BOOST_REGEX_DETAIL_NS{
-
-
-enum{
- sort_C,
- sort_fixed,
- sort_delim,
- sort_unknown
-};
-
-template <class S, class charT>
-unsigned count_chars(const S& s, charT c)
-{
- //
- // Count how many occurrences of character c occur
- // in string s: if c is a delimeter between collation
- // fields, then this should be the same value for all
- // sort keys:
- //
- unsigned int count = 0;
- for(unsigned pos = 0; pos < s.size(); ++pos)
- {
- if(s[pos] == c) ++count;
- }
- return count;
-}
-
-
-template <class traits, class charT>
-unsigned find_sort_syntax(const traits* pt, charT* delim)
-{
- //
- // compare 'a' with 'A' to see how similar they are,
- // should really use a-accute but we can't portably do that,
- //
- typedef typename traits::string_type string_type;
- typedef typename traits::char_type char_type;
-
- // Suppress incorrect warning for MSVC
- (void)pt;
-
- char_type a[2] = {'a', '\0', };
- string_type sa(pt->transform(a, a+1));
- if(sa == a)
- {
- *delim = 0;
- return sort_C;
- }
- char_type A[2] = { 'A', '\0', };
- string_type sA(pt->transform(A, A+1));
- char_type c[2] = { ';', '\0', };
- string_type sc(pt->transform(c, c+1));
-
- int pos = 0;
- while((pos <= static_cast<int>(sa.size())) && (pos <= static_cast<int>(sA.size())) && (sa[pos] == sA[pos])) ++pos;
- --pos;
- if(pos < 0)
- {
- *delim = 0;
- return sort_unknown;
- }
- //
- // at this point sa[pos] is either the end of a fixed width field
- // or the character that acts as a delimiter:
- //
- charT maybe_delim = sa[pos];
- if((pos != 0) && (count_chars(sa, maybe_delim) == count_chars(sA, maybe_delim)) && (count_chars(sa, maybe_delim) == count_chars(sc, maybe_delim)))
- {
- *delim = maybe_delim;
- return sort_delim;
- }
- //
- // OK doen't look like a delimiter, try for fixed width field:
- //
- if((sa.size() == sA.size()) && (sa.size() == sc.size()))
- {
- // note assumes that the fixed width field is less than
- // (numeric_limits<charT>::max)(), should be true for all types
- // I can't imagine 127 character fields...
- *delim = static_cast<charT>(++pos);
- return sort_fixed;
- }
- //
- // don't know what it is:
- //
- *delim = 0;
- return sort_unknown;
-}
-
-
- } // namespace BOOST_REGEX_DETAIL_NS
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
-
-
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/protected_call.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/protected_call.hpp
deleted file mode 100644
index 451b2e34bd..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/protected_call.hpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE basic_regex_creator.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares template class basic_regex_creator which fills in
- * the data members of a regex_data object.
- */
-
-#ifndef BOOST_REGEX_V4_PROTECTED_CALL_HPP
-#define BOOST_REGEX_V4_PROTECTED_CALL_HPP
-
-#include <boost/config.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-class BOOST_REGEX_DECL abstract_protected_call
-{
-public:
- bool BOOST_REGEX_CALL execute()const;
- // this stops gcc-4 from complaining:
- virtual ~abstract_protected_call(){}
-private:
- virtual bool call()const = 0;
-};
-
-template <class T>
-class concrete_protected_call
- : public abstract_protected_call
-{
-public:
- typedef bool (T::*proc_type)();
- concrete_protected_call(T* o, proc_type p)
- : obj(o), proc(p) {}
-private:
- bool call()const BOOST_OVERRIDE;
- T* obj;
- proc_type proc;
-};
-
-template <class T>
-bool concrete_protected_call<T>::call()const
-{
- return (obj->*proc)();
-}
-
-}
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regbase.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regbase.hpp
deleted file mode 100644
index 2b737d5aba..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regbase.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regbase.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares class regbase.
- */
-
-#ifndef BOOST_REGEX_V4_REGBASE_HPP
-#define BOOST_REGEX_V4_REGBASE_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-//
-// class regbase
-// handles error codes and flags
-//
-class BOOST_REGEX_DECL regbase
-{
-public:
- enum flag_type_
- {
- //
- // Divide the flags up into logical groups:
- // bits 0-7 indicate main synatx type.
- // bits 8-15 indicate syntax subtype.
- // bits 16-31 indicate options that are common to all
- // regex syntaxes.
- // In all cases the default is 0.
- //
- // Main synatx group:
- //
- perl_syntax_group = 0, // default
- basic_syntax_group = 1, // POSIX basic
- literal = 2, // all characters are literals
- main_option_type = literal | basic_syntax_group | perl_syntax_group, // everything!
- //
- // options specific to perl group:
- //
- no_bk_refs = 1 << 8, // \d not allowed
- no_perl_ex = 1 << 9, // disable perl extensions
- no_mod_m = 1 << 10, // disable Perl m modifier
- mod_x = 1 << 11, // Perl x modifier
- mod_s = 1 << 12, // force s modifier on (overrides match_not_dot_newline)
- no_mod_s = 1 << 13, // force s modifier off (overrides match_not_dot_newline)
-
- //
- // options specific to basic group:
- //
- no_char_classes = 1 << 8, // [[:CLASS:]] not allowed
- no_intervals = 1 << 9, // {x,y} not allowed
- bk_plus_qm = 1 << 10, // uses \+ and \?
- bk_vbar = 1 << 11, // use \| for alternatives
- emacs_ex = 1 << 12, // enables emacs extensions
-
- //
- // options common to all groups:
- //
- no_escape_in_lists = 1 << 16, // '\' not special inside [...]
- newline_alt = 1 << 17, // \n is the same as |
- no_except = 1 << 18, // no exception on error
- failbit = 1 << 19, // error flag
- icase = 1 << 20, // characters are matched regardless of case
- nocollate = 0, // don't use locale specific collation (deprecated)
- collate = 1 << 21, // use locale specific collation
- nosubs = 1 << 22, // don't mark sub-expressions
- save_subexpression_location = 1 << 23, // save subexpression locations
- no_empty_expressions = 1 << 24, // no empty expressions allowed
- optimize = 0, // not really supported
-
-
-
- basic = basic_syntax_group | collate | no_escape_in_lists,
- extended = no_bk_refs | collate | no_perl_ex | no_escape_in_lists,
- normal = 0,
- emacs = basic_syntax_group | collate | emacs_ex | bk_vbar,
- awk = no_bk_refs | collate | no_perl_ex,
- grep = basic | newline_alt,
- egrep = extended | newline_alt,
- sed = basic,
- perl = normal,
- ECMAScript = normal,
- JavaScript = normal,
- JScript = normal
- };
- typedef unsigned int flag_type;
-
- enum restart_info
- {
- restart_any = 0,
- restart_word = 1,
- restart_line = 2,
- restart_buf = 3,
- restart_continue = 4,
- restart_lit = 5,
- restart_fixed_lit = 6,
- restart_count = 7
- };
-};
-
-//
-// provide std lib proposal compatible constants:
-//
-namespace regex_constants{
-
- enum flag_type_
- {
-
- no_except = ::boost::regbase::no_except,
- failbit = ::boost::regbase::failbit,
- literal = ::boost::regbase::literal,
- icase = ::boost::regbase::icase,
- nocollate = ::boost::regbase::nocollate,
- collate = ::boost::regbase::collate,
- nosubs = ::boost::regbase::nosubs,
- optimize = ::boost::regbase::optimize,
- bk_plus_qm = ::boost::regbase::bk_plus_qm,
- bk_vbar = ::boost::regbase::bk_vbar,
- no_intervals = ::boost::regbase::no_intervals,
- no_char_classes = ::boost::regbase::no_char_classes,
- no_escape_in_lists = ::boost::regbase::no_escape_in_lists,
- no_mod_m = ::boost::regbase::no_mod_m,
- mod_x = ::boost::regbase::mod_x,
- mod_s = ::boost::regbase::mod_s,
- no_mod_s = ::boost::regbase::no_mod_s,
- save_subexpression_location = ::boost::regbase::save_subexpression_location,
- no_empty_expressions = ::boost::regbase::no_empty_expressions,
-
- basic = ::boost::regbase::basic,
- extended = ::boost::regbase::extended,
- normal = ::boost::regbase::normal,
- emacs = ::boost::regbase::emacs,
- awk = ::boost::regbase::awk,
- grep = ::boost::regbase::grep,
- egrep = ::boost::regbase::egrep,
- sed = basic,
- perl = normal,
- ECMAScript = normal,
- JavaScript = normal,
- JScript = normal
- };
- typedef ::boost::regbase::flag_type syntax_option_type;
-
-} // namespace regex_constants
-
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex.hpp
deleted file mode 100644
index e8ce7e5e05..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares boost::basic_regex<> and associated
- * functions and classes. This header is the main
- * entry point for the template regex code.
- */
-
-#ifndef BOOST_RE_REGEX_HPP_INCLUDED
-#define BOOST_RE_REGEX_HPP_INCLUDED
-
-#ifdef __cplusplus
-
-// what follows is all C++ don't include in C builds!!
-
-#ifndef BOOST_REGEX_CONFIG_HPP
-#include <boost/regex/config.hpp>
-#endif
-#ifndef BOOST_REGEX_WORKAROUND_HPP
-#include <boost/regex/v4/regex_workaround.hpp>
-#endif
-
-#ifndef BOOST_REGEX_FWD_HPP
-#include <boost/regex_fwd.hpp>
-#endif
-#ifndef BOOST_REGEX_TRAITS_HPP
-#include <boost/regex/regex_traits.hpp>
-#endif
-#ifndef BOOST_REGEX_RAW_BUFFER_HPP
-#include <boost/regex/v4/error_type.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_MATCH_FLAGS
-#include <boost/regex/v4/match_flags.hpp>
-#endif
-#ifndef BOOST_REGEX_RAW_BUFFER_HPP
-#include <boost/regex/v4/regex_raw_buffer.hpp>
-#endif
-#ifndef BOOST_RE_PAT_EXCEPT_HPP
-#include <boost/regex/pattern_except.hpp>
-#endif
-
-#ifndef BOOST_REGEX_V4_CHAR_REGEX_TRAITS_HPP
-#include <boost/regex/v4/char_regex_traits.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_STATES_HPP
-#include <boost/regex/v4/states.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_REGBASE_HPP
-#include <boost/regex/v4/regbase.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_ITERATOR_TRAITS_HPP
-#include <boost/regex/v4/iterator_traits.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_BASIC_REGEX_HPP
-#include <boost/regex/v4/basic_regex.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
-#include <boost/regex/v4/basic_regex_creator.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
-#include <boost/regex/v4/basic_regex_parser.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_SUB_MATCH_HPP
-#include <boost/regex/v4/sub_match.hpp>
-#endif
-#ifndef BOOST_REGEX_FORMAT_HPP
-#include <boost/regex/v4/regex_format.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_MATCH_RESULTS_HPP
-#include <boost/regex/v4/match_results.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_PROTECTED_CALL_HPP
-#include <boost/regex/v4/protected_call.hpp>
-#endif
-#ifndef BOOST_REGEX_MATCHER_HPP
-#include <boost/regex/v4/perl_matcher.hpp>
-#endif
-
-
-namespace boost{
-#ifdef BOOST_REGEX_NO_FWD
-typedef basic_regex<char, regex_traits<char> > regex;
-#ifndef BOOST_NO_WREGEX
-typedef basic_regex<wchar_t, regex_traits<wchar_t> > wregex;
-#endif
-#endif
-
-typedef match_results<const char*> cmatch;
-typedef match_results<std::string::const_iterator> smatch;
-#ifndef BOOST_NO_WREGEX
-typedef match_results<const wchar_t*> wcmatch;
-typedef match_results<std::wstring::const_iterator> wsmatch;
-#endif
-
-} // namespace boost
-#ifndef BOOST_REGEX_MATCH_HPP
-#include <boost/regex/v4/regex_match.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_REGEX_SEARCH_HPP
-#include <boost/regex/v4/regex_search.hpp>
-#endif
-#ifndef BOOST_REGEX_ITERATOR_HPP
-#include <boost/regex/v4/regex_iterator.hpp>
-#endif
-#ifndef BOOST_REGEX_TOKEN_ITERATOR_HPP
-#include <boost/regex/v4/regex_token_iterator.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_REGEX_GREP_HPP
-#include <boost/regex/v4/regex_grep.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_REGEX_REPLACE_HPP
-#include <boost/regex/v4/regex_replace.hpp>
-#endif
-#ifndef BOOST_REGEX_V4_REGEX_MERGE_HPP
-#include <boost/regex/v4/regex_merge.hpp>
-#endif
-#ifndef BOOST_REGEX_SPLIT_HPP
-#include <boost/regex/v4/regex_split.hpp>
-#endif
-
-#endif // __cplusplus
-
-#endif // include
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_format.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_format.hpp
deleted file mode 100644
index 9401fa30de..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_format.hpp
+++ /dev/null
@@ -1,1158 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2009 John Maddock
- * Copyright 2008 Eric Niebler.
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_format.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides formatting output routines for search and replace
- * operations. Note this is an internal header file included
- * by regex.hpp, do not include on its own.
- */
-
-#ifndef BOOST_REGEX_FORMAT_HPP
-#define BOOST_REGEX_FORMAT_HPP
-
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/type_traits/is_function.hpp>
-#include <boost/type_traits/is_class.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/remove_pointer.hpp>
-#include <boost/type_traits/remove_cv.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/not.hpp>
-#ifndef BOOST_NO_SFINAE
-#include <boost/mpl/has_xxx.hpp>
-#endif
-#include <boost/ref.hpp>
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-//
-// Forward declaration:
-//
- template <class BidiIterator, class Allocator = BOOST_DEDUCED_TYPENAME std::vector<sub_match<BidiIterator> >::allocator_type >
-class match_results;
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-//
-// struct trivial_format_traits:
-// defines minimum localisation support for formatting
-// in the case that the actual regex traits is unavailable.
-//
-template <class charT>
-struct trivial_format_traits
-{
- typedef charT char_type;
-
- static std::ptrdiff_t length(const charT* p)
- {
- return global_length(p);
- }
- static charT tolower(charT c)
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::global_lower(c);
- }
- static charT toupper(charT c)
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::global_upper(c);
- }
- static int value(const charT c, int radix)
- {
- int result = global_value(c);
- return result >= radix ? -1 : result;
- }
- int toi(const charT*& p1, const charT* p2, int radix)const
- {
- return (int)global_toi(p1, p2, radix, *this);
- }
-};
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#pragma warning(disable:26812)
-#endif
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-class basic_regex_formatter
-{
-public:
- typedef typename traits::char_type char_type;
- basic_regex_formatter(OutputIterator o, const Results& r, const traits& t)
- : m_traits(t), m_results(r), m_out(o), m_position(), m_end(), m_flags(), m_state(output_copy), m_restore_state(output_copy), m_have_conditional(false) {}
- OutputIterator format(ForwardIter p1, ForwardIter p2, match_flag_type f);
- OutputIterator format(ForwardIter p1, match_flag_type f)
- {
- return format(p1, p1 + m_traits.length(p1), f);
- }
-private:
- typedef typename Results::value_type sub_match_type;
- enum output_state
- {
- output_copy,
- output_next_lower,
- output_next_upper,
- output_lower,
- output_upper,
- output_none
- };
-
- void put(char_type c);
- void put(const sub_match_type& sub);
- void format_all();
- void format_perl();
- void format_escape();
- void format_conditional();
- void format_until_scope_end();
- bool handle_perl_verb(bool have_brace);
-
- inline typename Results::value_type const& get_named_sub(ForwardIter i, ForwardIter j, const mpl::false_&)
- {
- std::vector<char_type> v(i, j);
- return (i != j) ? this->m_results.named_subexpression(&v[0], &v[0] + v.size())
- : this->m_results.named_subexpression(static_cast<const char_type*>(0), static_cast<const char_type*>(0));
- }
- inline typename Results::value_type const& get_named_sub(ForwardIter i, ForwardIter j, const mpl::true_&)
- {
- return this->m_results.named_subexpression(i, j);
- }
- inline typename Results::value_type const& get_named_sub(ForwardIter i, ForwardIter j)
- {
- typedef typename boost::is_convertible<ForwardIter, const char_type*>::type tag_type;
- return get_named_sub(i, j, tag_type());
- }
- inline int get_named_sub_index(ForwardIter i, ForwardIter j, const mpl::false_&)
- {
- std::vector<char_type> v(i, j);
- return (i != j) ? this->m_results.named_subexpression_index(&v[0], &v[0] + v.size())
- : this->m_results.named_subexpression_index(static_cast<const char_type*>(0), static_cast<const char_type*>(0));
- }
- inline int get_named_sub_index(ForwardIter i, ForwardIter j, const mpl::true_&)
- {
- return this->m_results.named_subexpression_index(i, j);
- }
- inline int get_named_sub_index(ForwardIter i, ForwardIter j)
- {
- typedef typename boost::is_convertible<ForwardIter, const char_type*>::type tag_type;
- return get_named_sub_index(i, j, tag_type());
- }
-#ifdef BOOST_MSVC
- // msvc-8.0 issues a spurious warning on the call to std::advance here:
-#pragma warning(push)
-#pragma warning(disable:4244)
-#endif
- inline int toi(ForwardIter& i, ForwardIter j, int base, const boost::mpl::false_&)
- {
- if(i != j)
- {
- std::vector<char_type> v(i, j);
- const char_type* start = &v[0];
- const char_type* pos = start;
- int r = (int)m_traits.toi(pos, &v[0] + v.size(), base);
- std::advance(i, pos - start);
- return r;
- }
- return -1;
- }
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
- inline int toi(ForwardIter& i, ForwardIter j, int base, const boost::mpl::true_&)
- {
- return m_traits.toi(i, j, base);
- }
- inline int toi(ForwardIter& i, ForwardIter j, int base)
- {
-#if defined(_MSC_VER) && defined(__INTEL_COMPILER) && ((__INTEL_COMPILER == 9999) || (__INTEL_COMPILER == 1210))
- // Workaround for Intel support issue #656654.
- // See also https://svn.boost.org/trac/boost/ticket/6359
- return toi(i, j, base, mpl::false_());
-#else
- typedef typename boost::is_convertible<ForwardIter, const char_type*&>::type tag_type;
- return toi(i, j, base, tag_type());
-#endif
- }
-
- const traits& m_traits; // the traits class for localised formatting operations
- const Results& m_results; // the match_results being used.
- OutputIterator m_out; // where to send output.
- ForwardIter m_position; // format string, current position
- ForwardIter m_end; // format string end
- match_flag_type m_flags; // format flags to use
- output_state m_state; // what to do with the next character
- output_state m_restore_state; // what state to restore to.
- bool m_have_conditional; // we are parsing a conditional
-private:
- basic_regex_formatter(const basic_regex_formatter&);
- basic_regex_formatter& operator=(const basic_regex_formatter&);
-};
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-OutputIterator basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format(ForwardIter p1, ForwardIter p2, match_flag_type f)
-{
- m_position = p1;
- m_end = p2;
- m_flags = f;
- format_all();
- return m_out;
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format_all()
-{
- // over and over:
- while(m_position != m_end)
- {
- switch(*m_position)
- {
- case '&':
- if(m_flags & ::boost::regex_constants::format_sed)
- {
- ++m_position;
- put(m_results[0]);
- break;
- }
- put(*m_position++);
- break;
- case '\\':
- format_escape();
- break;
- case '(':
- if(m_flags & boost::regex_constants::format_all)
- {
- ++m_position;
- bool have_conditional = m_have_conditional;
- m_have_conditional = false;
- format_until_scope_end();
- m_have_conditional = have_conditional;
- if(m_position == m_end)
- return;
- BOOST_REGEX_ASSERT(*m_position == static_cast<char_type>(')'));
- ++m_position; // skip the closing ')'
- break;
- }
- put(*m_position);
- ++m_position;
- break;
- case ')':
- if(m_flags & boost::regex_constants::format_all)
- {
- return;
- }
- put(*m_position);
- ++m_position;
- break;
- case ':':
- if((m_flags & boost::regex_constants::format_all) && m_have_conditional)
- {
- return;
- }
- put(*m_position);
- ++m_position;
- break;
- case '?':
- if(m_flags & boost::regex_constants::format_all)
- {
- ++m_position;
- format_conditional();
- break;
- }
- put(*m_position);
- ++m_position;
- break;
- case '$':
- if((m_flags & format_sed) == 0)
- {
- format_perl();
- break;
- }
- // not a special character:
- BOOST_FALLTHROUGH;
- default:
- put(*m_position);
- ++m_position;
- break;
- }
- }
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format_perl()
-{
- //
- // On entry *m_position points to a '$' character
- // output the information that goes with it:
- //
- BOOST_REGEX_ASSERT(*m_position == '$');
- //
- // see if this is a trailing '$':
- //
- if(++m_position == m_end)
- {
- --m_position;
- put(*m_position);
- ++m_position;
- return;
- }
- //
- // OK find out what kind it is:
- //
- bool have_brace = false;
- ForwardIter save_position = m_position;
- switch(*m_position)
- {
- case '&':
- ++m_position;
- put(this->m_results[0]);
- break;
- case '`':
- ++m_position;
- put(this->m_results.prefix());
- break;
- case '\'':
- ++m_position;
- put(this->m_results.suffix());
- break;
- case '$':
- put(*m_position++);
- break;
- case '+':
- if((++m_position != m_end) && (*m_position == '{'))
- {
- ForwardIter base = ++m_position;
- while((m_position != m_end) && (*m_position != '}')) ++m_position;
- if(m_position != m_end)
- {
- // Named sub-expression:
- put(get_named_sub(base, m_position));
- ++m_position;
- break;
- }
- else
- {
- m_position = --base;
- }
- }
- put((this->m_results)[this->m_results.size() > 1 ? static_cast<int>(this->m_results.size() - 1) : 1]);
- break;
- case '{':
- have_brace = true;
- ++m_position;
- BOOST_FALLTHROUGH;
- default:
- // see if we have a number:
- {
- std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
- //len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
- int v = this->toi(m_position, m_position + len, 10);
- if((v < 0) || (have_brace && ((m_position == m_end) || (*m_position != '}'))))
- {
- // Look for a Perl-5.10 verb:
- if(!handle_perl_verb(have_brace))
- {
- // leave the $ as is, and carry on:
- m_position = --save_position;
- put(*m_position);
- ++m_position;
- }
- break;
- }
- // otherwise output sub v:
- put(this->m_results[v]);
- if(have_brace)
- ++m_position;
- }
- }
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-bool basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::handle_perl_verb(bool have_brace)
-{
- //
- // We may have a capitalised string containing a Perl action:
- //
- static const char_type MATCH[] = { 'M', 'A', 'T', 'C', 'H' };
- static const char_type PREMATCH[] = { 'P', 'R', 'E', 'M', 'A', 'T', 'C', 'H' };
- static const char_type POSTMATCH[] = { 'P', 'O', 'S', 'T', 'M', 'A', 'T', 'C', 'H' };
- static const char_type LAST_PAREN_MATCH[] = { 'L', 'A', 'S', 'T', '_', 'P', 'A', 'R', 'E', 'N', '_', 'M', 'A', 'T', 'C', 'H' };
- static const char_type LAST_SUBMATCH_RESULT[] = { 'L', 'A', 'S', 'T', '_', 'S', 'U', 'B', 'M', 'A', 'T', 'C', 'H', '_', 'R', 'E', 'S', 'U', 'L', 'T' };
- static const char_type LAST_SUBMATCH_RESULT_ALT[] = { '^', 'N' };
-
- if(m_position == m_end)
- return false;
- if(have_brace && (*m_position == '^'))
- ++m_position;
-
- std::ptrdiff_t max_len = m_end - m_position;
-
- if((max_len >= 5) && std::equal(m_position, m_position + 5, MATCH))
- {
- m_position += 5;
- if(have_brace)
- {
- if((m_position != m_end) && (*m_position == '}'))
- ++m_position;
- else
- {
- m_position -= 5;
- return false;
- }
- }
- put(this->m_results[0]);
- return true;
- }
- if((max_len >= 8) && std::equal(m_position, m_position + 8, PREMATCH))
- {
- m_position += 8;
- if(have_brace)
- {
- if((m_position != m_end) && (*m_position == '}'))
- ++m_position;
- else
- {
- m_position -= 8;
- return false;
- }
- }
- put(this->m_results.prefix());
- return true;
- }
- if((max_len >= 9) && std::equal(m_position, m_position + 9, POSTMATCH))
- {
- m_position += 9;
- if(have_brace)
- {
- if((m_position != m_end) && (*m_position == '}'))
- ++m_position;
- else
- {
- m_position -= 9;
- return false;
- }
- }
- put(this->m_results.suffix());
- return true;
- }
- if((max_len >= 16) && std::equal(m_position, m_position + 16, LAST_PAREN_MATCH))
- {
- m_position += 16;
- if(have_brace)
- {
- if((m_position != m_end) && (*m_position == '}'))
- ++m_position;
- else
- {
- m_position -= 16;
- return false;
- }
- }
- put((this->m_results)[this->m_results.size() > 1 ? static_cast<int>(this->m_results.size() - 1) : 1]);
- return true;
- }
- if((max_len >= 20) && std::equal(m_position, m_position + 20, LAST_SUBMATCH_RESULT))
- {
- m_position += 20;
- if(have_brace)
- {
- if((m_position != m_end) && (*m_position == '}'))
- ++m_position;
- else
- {
- m_position -= 20;
- return false;
- }
- }
- put(this->m_results.get_last_closed_paren());
- return true;
- }
- if((max_len >= 2) && std::equal(m_position, m_position + 2, LAST_SUBMATCH_RESULT_ALT))
- {
- m_position += 2;
- if(have_brace)
- {
- if((m_position != m_end) && (*m_position == '}'))
- ++m_position;
- else
- {
- m_position -= 2;
- return false;
- }
- }
- put(this->m_results.get_last_closed_paren());
- return true;
- }
- return false;
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format_escape()
-{
- // skip the escape and check for trailing escape:
- if(++m_position == m_end)
- {
- put(static_cast<char_type>('\\'));
- return;
- }
- // now switch on the escape type:
- switch(*m_position)
- {
- case 'a':
- put(static_cast<char_type>('\a'));
- ++m_position;
- break;
- case 'f':
- put(static_cast<char_type>('\f'));
- ++m_position;
- break;
- case 'n':
- put(static_cast<char_type>('\n'));
- ++m_position;
- break;
- case 'r':
- put(static_cast<char_type>('\r'));
- ++m_position;
- break;
- case 't':
- put(static_cast<char_type>('\t'));
- ++m_position;
- break;
- case 'v':
- put(static_cast<char_type>('\v'));
- ++m_position;
- break;
- case 'x':
- if(++m_position == m_end)
- {
- put(static_cast<char_type>('x'));
- return;
- }
- // maybe have \x{ddd}
- if(*m_position == static_cast<char_type>('{'))
- {
- ++m_position;
- int val = this->toi(m_position, m_end, 16);
- if(val < 0)
- {
- // invalid value treat everything as literals:
- put(static_cast<char_type>('x'));
- put(static_cast<char_type>('{'));
- return;
- }
- if((m_position == m_end) || (*m_position != static_cast<char_type>('}')))
- {
- --m_position;
- while(*m_position != static_cast<char_type>('\\'))
- --m_position;
- ++m_position;
- put(*m_position++);
- return;
- }
- ++m_position;
- put(static_cast<char_type>(val));
- return;
- }
- else
- {
- std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
- len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
- int val = this->toi(m_position, m_position + len, 16);
- if(val < 0)
- {
- --m_position;
- put(*m_position++);
- return;
- }
- put(static_cast<char_type>(val));
- }
- break;
- case 'c':
- if(++m_position == m_end)
- {
- --m_position;
- put(*m_position++);
- return;
- }
- put(static_cast<char_type>(*m_position++ % 32));
- break;
- case 'e':
- put(static_cast<char_type>(27));
- ++m_position;
- break;
- default:
- // see if we have a perl specific escape:
- if((m_flags & boost::regex_constants::format_sed) == 0)
- {
- bool breakout = false;
- switch(*m_position)
- {
- case 'l':
- ++m_position;
- m_restore_state = m_state;
- m_state = output_next_lower;
- breakout = true;
- break;
- case 'L':
- ++m_position;
- m_state = output_lower;
- breakout = true;
- break;
- case 'u':
- ++m_position;
- m_restore_state = m_state;
- m_state = output_next_upper;
- breakout = true;
- break;
- case 'U':
- ++m_position;
- m_state = output_upper;
- breakout = true;
- break;
- case 'E':
- ++m_position;
- m_state = output_copy;
- breakout = true;
- break;
- }
- if(breakout)
- break;
- }
- // see if we have a \n sed style backreference:
- std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
- len = (std::min)(static_cast<std::ptrdiff_t>(1), len);
- int v = this->toi(m_position, m_position+len, 10);
- if((v > 0) || ((v == 0) && (m_flags & ::boost::regex_constants::format_sed)))
- {
- put(m_results[v]);
- break;
- }
- else if(v == 0)
- {
- // octal ecape sequence:
- --m_position;
- len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
- len = (std::min)(static_cast<std::ptrdiff_t>(4), len);
- v = this->toi(m_position, m_position + len, 8);
- BOOST_REGEX_ASSERT(v >= 0);
- put(static_cast<char_type>(v));
- break;
- }
- // Otherwise output the character "as is":
- put(*m_position++);
- break;
- }
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format_conditional()
-{
- if(m_position == m_end)
- {
- // oops trailing '?':
- put(static_cast<char_type>('?'));
- return;
- }
- int v;
- if(*m_position == '{')
- {
- ForwardIter base = m_position;
- ++m_position;
- v = this->toi(m_position, m_end, 10);
- if(v < 0)
- {
- // Try a named subexpression:
- while((m_position != m_end) && (*m_position != '}'))
- ++m_position;
- v = this->get_named_sub_index(base + 1, m_position);
- }
- if((v < 0) || (*m_position != '}'))
- {
- m_position = base;
- // oops trailing '?':
- put(static_cast<char_type>('?'));
- return;
- }
- // Skip trailing '}':
- ++m_position;
- }
- else
- {
- std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
- len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
- v = this->toi(m_position, m_position + len, 10);
- }
- if(v < 0)
- {
- // oops not a number:
- put(static_cast<char_type>('?'));
- return;
- }
-
- // output varies depending upon whether sub-expression v matched or not:
- if(m_results[v].matched)
- {
- m_have_conditional = true;
- format_all();
- m_have_conditional = false;
- if((m_position != m_end) && (*m_position == static_cast<char_type>(':')))
- {
- // skip the ':':
- ++m_position;
- // save output state, then turn it off:
- output_state saved_state = m_state;
- m_state = output_none;
- // format the rest of this scope:
- format_until_scope_end();
- // restore output state:
- m_state = saved_state;
- }
- }
- else
- {
- // save output state, then turn it off:
- output_state saved_state = m_state;
- m_state = output_none;
- // format until ':' or ')':
- m_have_conditional = true;
- format_all();
- m_have_conditional = false;
- // restore state:
- m_state = saved_state;
- if((m_position != m_end) && (*m_position == static_cast<char_type>(':')))
- {
- // skip the ':':
- ++m_position;
- // format the rest of this scope:
- format_until_scope_end();
- }
- }
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format_until_scope_end()
-{
- do
- {
- format_all();
- if((m_position == m_end) || (*m_position == static_cast<char_type>(')')))
- return;
- put(*m_position++);
- }while(m_position != m_end);
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::put(char_type c)
-{
- // write a single character to output
- // according to which case translation mode we are in:
- switch(this->m_state)
- {
- case output_none:
- return;
- case output_next_lower:
- c = m_traits.tolower(c);
- this->m_state = m_restore_state;
- break;
- case output_next_upper:
- c = m_traits.toupper(c);
- this->m_state = m_restore_state;
- break;
- case output_lower:
- c = m_traits.tolower(c);
- break;
- case output_upper:
- c = m_traits.toupper(c);
- break;
- default:
- break;
- }
- *m_out = c;
- ++m_out;
-}
-
-template <class OutputIterator, class Results, class traits, class ForwardIter>
-void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::put(const sub_match_type& sub)
-{
- typedef typename sub_match_type::iterator iterator_type;
- iterator_type i = sub.first;
- while(i != sub.second)
- {
- put(*i);
- ++i;
- }
-}
-
-template <class S>
-class string_out_iterator
-{
- S* out;
-public:
- string_out_iterator(S& s) : out(&s) {}
- string_out_iterator& operator++() { return *this; }
- string_out_iterator& operator++(int) { return *this; }
- string_out_iterator& operator*() { return *this; }
- string_out_iterator& operator=(typename S::value_type v)
- {
- out->append(1, v);
- return *this;
- }
-
- typedef std::ptrdiff_t difference_type;
- typedef typename S::value_type value_type;
- typedef value_type* pointer;
- typedef value_type& reference;
- typedef std::output_iterator_tag iterator_category;
-};
-
-template <class OutputIterator, class Iterator, class Alloc, class ForwardIter, class traits>
-OutputIterator regex_format_imp(OutputIterator out,
- const match_results<Iterator, Alloc>& m,
- ForwardIter p1, ForwardIter p2,
- match_flag_type flags,
- const traits& t
- )
-{
- if(flags & regex_constants::format_literal)
- {
- return BOOST_REGEX_DETAIL_NS::copy(p1, p2, out);
- }
-
- BOOST_REGEX_DETAIL_NS::basic_regex_formatter<
- OutputIterator,
- match_results<Iterator, Alloc>,
- traits, ForwardIter> f(out, m, t);
- return f.format(p1, p2, flags);
-}
-
-#ifndef BOOST_NO_SFINAE
-
-BOOST_MPL_HAS_XXX_TRAIT_DEF(const_iterator)
-
-struct any_type
-{
- template <class T>
- any_type(const T&);
- template <class T, class U>
- any_type(const T&, const U&);
- template <class T, class U, class V>
- any_type(const T&, const U&, const V&);
-};
-typedef char no_type;
-typedef char (&unary_type)[2];
-typedef char (&binary_type)[3];
-typedef char (&ternary_type)[4];
-
-no_type check_is_formatter(unary_type, binary_type, ternary_type);
-template<typename T>
-unary_type check_is_formatter(T const &, binary_type, ternary_type);
-template<typename T>
-binary_type check_is_formatter(unary_type, T const &, ternary_type);
-template<typename T, typename U>
-binary_type check_is_formatter(T const &, U const &, ternary_type);
-template<typename T>
-ternary_type check_is_formatter(unary_type, binary_type, T const &);
-template<typename T, typename U>
-ternary_type check_is_formatter(T const &, binary_type, U const &);
-template<typename T, typename U>
-ternary_type check_is_formatter(unary_type, T const &, U const &);
-template<typename T, typename U, typename V>
-ternary_type check_is_formatter(T const &, U const &, V const &);
-
-struct unary_binary_ternary
-{
- typedef unary_type (*unary_fun)(any_type);
- typedef binary_type (*binary_fun)(any_type, any_type);
- typedef ternary_type (*ternary_fun)(any_type, any_type, any_type);
- operator unary_fun();
- operator binary_fun();
- operator ternary_fun();
-};
-
-template<typename Formatter, bool IsFunction = boost::is_function<Formatter>::value>
-struct formatter_wrapper
- : Formatter
- , unary_binary_ternary
-{
- formatter_wrapper(){}
-};
-
-template<typename Formatter>
-struct formatter_wrapper<Formatter, true>
- : unary_binary_ternary
-{
- operator Formatter *();
-};
-
-template<typename Formatter>
-struct formatter_wrapper<Formatter *, false>
- : unary_binary_ternary
-{
- operator Formatter *();
-};
-
-template <class F, class M, class O>
-struct format_traits_imp
-{
-private:
- //
- // F must be a pointer, a function, or a class with a function call operator:
- //
- BOOST_STATIC_ASSERT((::boost::is_pointer<F>::value || ::boost::is_function<F>::value || ::boost::is_class<F>::value));
- static formatter_wrapper<typename unwrap_reference<F>::type> f;
- static M m;
- static O out;
- static boost::regex_constants::match_flag_type flags;
-public:
- BOOST_STATIC_CONSTANT(int, value = sizeof(check_is_formatter(f(m), f(m, out), f(m, out, flags))));
-};
-
-template <class F, class M, class O>
-struct format_traits
-{
-public:
- //
- // Type is mpl::int_<N> where N is one of:
- //
- // 0 : F is a pointer to a presumably null-terminated string.
- // 1 : F is a character-container such as a std::string.
- // 2 : F is a Unary Functor.
- // 3 : F is a Binary Functor.
- // 4 : F is a Ternary Functor.
- //
- typedef typename boost::mpl::if_<
- boost::mpl::and_<boost::is_pointer<F>, boost::mpl::not_<boost::is_function<typename boost::remove_pointer<F>::type> > >,
- boost::mpl::int_<0>,
- typename boost::mpl::if_<
- has_const_iterator<F>,
- boost::mpl::int_<1>,
- boost::mpl::int_<format_traits_imp<F, M, O>::value>
- >::type
- >::type type;
- //
- // This static assertion will fail if the functor passed does not accept
- // the same type of arguments passed.
- //
- BOOST_STATIC_ASSERT( boost::is_class<F>::value && !has_const_iterator<F>::value ? (type::value > 1) : true);
-};
-
-#else // BOOST_NO_SFINAE
-
-template <class F, class M, class O>
-struct format_traits
-{
-public:
- //
- // Type is mpl::int_<N> where N is one of:
- //
- // 0 : F is a pointer to a presumably null-terminated string.
- // 1 : F is a character-container such as a std::string.
- //
- // Other options such as F being a Functor are not supported without
- // SFINAE support.
- //
- typedef typename boost::mpl::if_<
- boost::is_pointer<F>,
- boost::mpl::int_<0>,
- boost::mpl::int_<1>
- >::type type;
-};
-
-#endif // BOOST_NO_SFINAE
-
-template <class Base, class Match>
-struct format_functor3
-{
- format_functor3(Base b) : func(b) {}
- template <class OutputIter>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type f)
- {
- return boost::unwrap_ref(func)(m, i, f);
- }
- template <class OutputIter, class Traits>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type f, const Traits&)
- {
- return (*this)(m, i, f);
- }
-private:
- Base func;
- format_functor3(const format_functor3&);
- format_functor3& operator=(const format_functor3&);
-};
-
-template <class Base, class Match>
-struct format_functor2
-{
- format_functor2(Base b) : func(b) {}
- template <class OutputIter>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type /*f*/)
- {
- return boost::unwrap_ref(func)(m, i);
- }
- template <class OutputIter, class Traits>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type f, const Traits&)
- {
- return (*this)(m, i, f);
- }
-private:
- Base func;
- format_functor2(const format_functor2&);
- format_functor2& operator=(const format_functor2&);
-};
-
-template <class Base, class Match>
-struct format_functor1
-{
- format_functor1(Base b) : func(b) {}
-
- template <class S, class OutputIter>
- OutputIter do_format_string(const S& s, OutputIter i)
- {
- return BOOST_REGEX_DETAIL_NS::copy(s.begin(), s.end(), i);
- }
- template <class S, class OutputIter>
- inline OutputIter do_format_string(const S* s, OutputIter i)
- {
- while(s && *s)
- {
- *i = *s;
- ++i;
- ++s;
- }
- return i;
- }
- template <class OutputIter>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type /*f*/)
- {
- return do_format_string(boost::unwrap_ref(func)(m), i);
- }
- template <class OutputIter, class Traits>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type f, const Traits&)
- {
- return (*this)(m, i, f);
- }
-private:
- Base func;
- format_functor1(const format_functor1&);
- format_functor1& operator=(const format_functor1&);
-};
-
-template <class charT, class Match, class Traits>
-struct format_functor_c_string
-{
- format_functor_c_string(const charT* ps) : func(ps) {}
-
- template <class OutputIter>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type f, const Traits& t = Traits())
- {
- //typedef typename Match::char_type char_type;
- const charT* end = func;
- while(*end) ++end;
- return regex_format_imp(i, m, func, end, f, t);
- }
-private:
- const charT* func;
- format_functor_c_string(const format_functor_c_string&);
- format_functor_c_string& operator=(const format_functor_c_string&);
-};
-
-template <class Container, class Match, class Traits>
-struct format_functor_container
-{
- format_functor_container(const Container& c) : func(c) {}
-
- template <class OutputIter>
- OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type f, const Traits& t = Traits())
- {
- //typedef typename Match::char_type char_type;
- return BOOST_REGEX_DETAIL_NS::regex_format_imp(i, m, func.begin(), func.end(), f, t);
- }
-private:
- const Container& func;
- format_functor_container(const format_functor_container&);
- format_functor_container& operator=(const format_functor_container&);
-};
-
-template <class Func, class Match, class OutputIterator, class Traits = BOOST_REGEX_DETAIL_NS::trivial_format_traits<typename Match::char_type> >
-struct compute_functor_type
-{
- typedef typename format_traits<Func, Match, OutputIterator>::type tag;
- typedef typename boost::remove_cv< typename boost::remove_pointer<Func>::type>::type maybe_char_type;
-
- typedef typename mpl::if_<
- ::boost::is_same<tag, mpl::int_<0> >, format_functor_c_string<maybe_char_type, Match, Traits>,
- typename mpl::if_<
- ::boost::is_same<tag, mpl::int_<1> >, format_functor_container<Func, Match, Traits>,
- typename mpl::if_<
- ::boost::is_same<tag, mpl::int_<2> >, format_functor1<Func, Match>,
- typename mpl::if_<
- ::boost::is_same<tag, mpl::int_<3> >, format_functor2<Func, Match>,
- format_functor3<Func, Match>
- >::type
- >::type
- >::type
- >::type type;
-};
-
-} // namespace BOOST_REGEX_DETAIL_NS
-
-template <class OutputIterator, class Iterator, class Allocator, class Functor>
-inline OutputIterator regex_format(OutputIterator out,
- const match_results<Iterator, Allocator>& m,
- Functor fmt,
- match_flag_type flags = format_all
- )
-{
- return m.format(out, fmt, flags);
-}
-
-template <class Iterator, class Allocator, class Functor>
-inline std::basic_string<typename match_results<Iterator, Allocator>::char_type> regex_format(const match_results<Iterator, Allocator>& m,
- Functor fmt,
- match_flag_type flags = format_all)
-{
- return m.format(fmt, flags);
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_FORMAT_HPP
-
-
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_fwd.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_fwd.hpp
deleted file mode 100644
index 3076b069ac..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_fwd.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_fwd.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Forward declares boost::basic_regex<> and
- * associated typedefs.
- */
-
-#ifndef BOOST_REGEX_FWD_HPP_INCLUDED
-#define BOOST_REGEX_FWD_HPP_INCLUDED
-
-#ifndef BOOST_REGEX_CONFIG_HPP
-#include <boost/regex/config.hpp>
-#endif
-
-//
-// define BOOST_REGEX_NO_FWD if this
-// header doesn't work!
-//
-#ifdef BOOST_REGEX_NO_FWD
-# ifndef BOOST_RE_REGEX_HPP
-# include <boost/regex.hpp>
-# endif
-#else
-
-namespace boost{
-
-template <class charT>
-class cpp_regex_traits;
-template <class charT>
-struct c_regex_traits;
-template <class charT>
-class w32_regex_traits;
-
-#ifdef BOOST_REGEX_USE_WIN32_LOCALE
-template <class charT, class implementationT = w32_regex_traits<charT> >
-struct regex_traits;
-#elif defined(BOOST_REGEX_USE_CPP_LOCALE)
-template <class charT, class implementationT = cpp_regex_traits<charT> >
-struct regex_traits;
-#else
-template <class charT, class implementationT = c_regex_traits<charT> >
-struct regex_traits;
-#endif
-
-template <class charT, class traits = regex_traits<charT> >
-class basic_regex;
-
-typedef basic_regex<char, regex_traits<char> > regex;
-#ifndef BOOST_NO_WREGEX
-typedef basic_regex<wchar_t, regex_traits<wchar_t> > wregex;
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_NO_FWD
-
-#endif
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_grep.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_grep.hpp
deleted file mode 100644
index c5cb054e58..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_grep.hpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_grep.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides regex_grep implementation.
- */
-
-#ifndef BOOST_REGEX_V4_REGEX_GREP_HPP
-#define BOOST_REGEX_V4_REGEX_GREP_HPP
-
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-//
-// regex_grep:
-// find all non-overlapping matches within the sequence first last:
-//
-template <class Predicate, class BidiIterator, class charT, class traits>
-inline unsigned int regex_grep(Predicate foo,
- BidiIterator first,
- BidiIterator last,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- if(e.flags() & regex_constants::failbit)
- return false;
-
- typedef typename match_results<BidiIterator>::allocator_type match_allocator_type;
-
- match_results<BidiIterator> m;
- BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, match_allocator_type, traits> matcher(first, last, m, e, flags, first);
- unsigned int count = 0;
- while(matcher.find())
- {
- ++count;
- if(0 == foo(m))
- return count; // caller doesn't want to go on
- if(m[0].second == last)
- return count; // we've reached the end, don't try and find an extra null match.
- if(m.length() == 0)
- {
- if(m[0].second == last)
- return count;
- // we found a NULL-match, now try to find
- // a non-NULL one at the same position:
- match_results<BidiIterator, match_allocator_type> m2(m);
- matcher.setf(match_not_null | match_continuous);
- if(matcher.find())
- {
- ++count;
- if(0 == foo(m))
- return count;
- }
- else
- {
- // reset match back to where it was:
- m = m2;
- }
- matcher.unsetf((match_not_null | match_continuous) & ~flags);
- }
- }
- return count;
-}
-
-//
-// regex_grep convenience interfaces:
-#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
-//
-// this isn't really a partial specialisation, but template function
-// overloading - if the compiler doesn't support partial specialisation
-// then it really won't support this either:
-template <class Predicate, class charT, class traits>
-inline unsigned int regex_grep(Predicate foo, const charT* str,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_grep(foo, str, str + traits::length(str), e, flags);
-}
-
-template <class Predicate, class ST, class SA, class charT, class traits>
-inline unsigned int regex_grep(Predicate foo, const std::basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_grep(foo, s.begin(), s.end(), e, flags);
-}
-#else // partial specialisation
-inline unsigned int regex_grep(bool (*foo)(const cmatch&), const char* str,
- const regex& e,
- match_flag_type flags = match_default)
-{
- return regex_grep(foo, str, str + regex::traits_type::length(str), e, flags);
-}
-#ifndef BOOST_NO_WREGEX
-inline unsigned int regex_grep(bool (*foo)(const wcmatch&), const wchar_t* str,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- return regex_grep(foo, str, str + wregex::traits_type::length(str), e, flags);
-}
-#endif
-inline unsigned int regex_grep(bool (*foo)(const match_results<std::string::const_iterator>&), const std::string& s,
- const regex& e,
- match_flag_type flags = match_default)
-{
- return regex_grep(foo, s.begin(), s.end(), e, flags);
-}
-#if !defined(BOOST_NO_WREGEX)
-inline unsigned int regex_grep(bool (*foo)(const match_results<std::basic_string<wchar_t>::const_iterator>&),
- const std::basic_string<wchar_t>& s,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- return regex_grep(foo, s.begin(), s.end(), e, flags);
-}
-#endif
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_GREP_HPP
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_iterator.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_iterator.hpp
deleted file mode 100644
index bbdeed5880..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_iterator.hpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- *
- * Copyright (c) 2003
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_iterator.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides regex_iterator implementation.
- */
-
-#ifndef BOOST_REGEX_V4_REGEX_ITERATOR_HPP
-#define BOOST_REGEX_V4_REGEX_ITERATOR_HPP
-
-#include <boost/shared_ptr.hpp>
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-template <class BidirectionalIterator,
- class charT,
- class traits>
-class regex_iterator_implementation
-{
- typedef basic_regex<charT, traits> regex_type;
-
- match_results<BidirectionalIterator> what; // current match
- BidirectionalIterator base; // start of sequence
- BidirectionalIterator end; // end of sequence
- const regex_type re; // the expression
- match_flag_type flags; // flags for matching
-
-public:
- regex_iterator_implementation(const regex_type* p, BidirectionalIterator last, match_flag_type f)
- : base(), end(last), re(*p), flags(f){}
- regex_iterator_implementation(const regex_iterator_implementation& other)
- :what(other.what), base(other.base), end(other.end), re(other.re), flags(other.flags){}
- bool init(BidirectionalIterator first)
- {
- base = first;
- return regex_search(first, end, what, re, flags);
- }
- bool compare(const regex_iterator_implementation& that)
- {
- if(this == &that) return true;
- return (&re.get_data() == &that.re.get_data()) && (end == that.end) && (flags == that.flags) && (what[0].first == that.what[0].first) && (what[0].second == that.what[0].second);
- }
- const match_results<BidirectionalIterator>& get()
- { return what; }
- bool next()
- {
- //if(what.prefix().first != what[0].second)
- // flags |= match_prev_avail;
- BidirectionalIterator next_start = what[0].second;
- match_flag_type f(flags);
- if(!what.length() || (f & regex_constants::match_posix))
- f |= regex_constants::match_not_initial_null;
- //if(base != next_start)
- // f |= regex_constants::match_not_bob;
- bool result = regex_search(next_start, end, what, re, f, base);
- if(result)
- what.set_base(base);
- return result;
- }
-private:
- regex_iterator_implementation& operator=(const regex_iterator_implementation&);
-};
-
-template <class BidirectionalIterator,
- class charT = BOOST_DEDUCED_TYPENAME BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::value_type,
- class traits = regex_traits<charT> >
-class regex_iterator
-{
-private:
- typedef regex_iterator_implementation<BidirectionalIterator, charT, traits> impl;
- typedef shared_ptr<impl> pimpl;
-public:
- typedef basic_regex<charT, traits> regex_type;
- typedef match_results<BidirectionalIterator> value_type;
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
- difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef std::forward_iterator_tag iterator_category;
-
- regex_iterator(){}
- regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re,
- match_flag_type m = match_default)
- : pdata(new impl(&re, b, m))
- {
- if(!pdata->init(a))
- {
- pdata.reset();
- }
- }
- regex_iterator(const regex_iterator& that)
- : pdata(that.pdata) {}
- regex_iterator& operator=(const regex_iterator& that)
- {
- pdata = that.pdata;
- return *this;
- }
- bool operator==(const regex_iterator& that)const
- {
- if((pdata.get() == 0) || (that.pdata.get() == 0))
- return pdata.get() == that.pdata.get();
- return pdata->compare(*(that.pdata.get()));
- }
- bool operator!=(const regex_iterator& that)const
- { return !(*this == that); }
- const value_type& operator*()const
- { return pdata->get(); }
- const value_type* operator->()const
- { return &(pdata->get()); }
- regex_iterator& operator++()
- {
- cow();
- if(0 == pdata->next())
- {
- pdata.reset();
- }
- return *this;
- }
- regex_iterator operator++(int)
- {
- regex_iterator result(*this);
- ++(*this);
- return result;
- }
-private:
-
- pimpl pdata;
-
- void cow()
- {
- // copy-on-write
- if(pdata.get() && !pdata.unique())
- {
- pdata.reset(new impl(*(pdata.get())));
- }
- }
-};
-
-typedef regex_iterator<const char*> cregex_iterator;
-typedef regex_iterator<std::string::const_iterator> sregex_iterator;
-#ifndef BOOST_NO_WREGEX
-typedef regex_iterator<const wchar_t*> wcregex_iterator;
-typedef regex_iterator<std::wstring::const_iterator> wsregex_iterator;
-#endif
-
-// make_regex_iterator:
-template <class charT, class traits>
-inline regex_iterator<const charT*, charT, traits> make_regex_iterator(const charT* p, const basic_regex<charT, traits>& e, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, m);
-}
-template <class charT, class traits, class ST, class SA>
-inline regex_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, m);
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_ITERATOR_HPP
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_match.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_match.hpp
deleted file mode 100644
index a50daa2aa5..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_match.hpp
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_match.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Regular expression matching algorithms.
- * Note this is an internal header file included
- * by regex.hpp, do not include on its own.
- */
-
-
-#ifndef BOOST_REGEX_MATCH_HPP
-#define BOOST_REGEX_MATCH_HPP
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-//
-// proc regex_match
-// returns true if the specified regular expression matches
-// the whole of the input. Fills in what matched in m.
-//
-template <class BidiIterator, class Allocator, class charT, class traits>
-bool regex_match(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, first);
- return matcher.match();
-}
-template <class iterator, class charT, class traits>
-bool regex_match(iterator first, iterator last,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- match_results<iterator> m;
- return regex_match(first, last, m, e, flags | regex_constants::match_any);
-}
-//
-// query_match convenience interfaces:
-#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
-//
-// this isn't really a partial specialisation, but template function
-// overloading - if the compiler doesn't support partial specialisation
-// then it really won't support this either:
-template <class charT, class Allocator, class traits>
-inline bool regex_match(const charT* str,
- match_results<const charT*, Allocator>& m,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + traits::length(str), m, e, flags);
-}
-
-template <class ST, class SA, class Allocator, class charT, class traits>
-inline bool regex_match(const std::basic_string<charT, ST, SA>& s,
- match_results<typename std::basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-template <class charT, class traits>
-inline bool regex_match(const charT* str,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- match_results<const charT*> m;
- return regex_match(str, str + traits::length(str), m, e, flags | regex_constants::match_any);
-}
-
-template <class ST, class SA, class charT, class traits>
-inline bool regex_match(const std::basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- typedef typename std::basic_string<charT, ST, SA>::const_iterator iterator;
- match_results<iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#else // partial ordering
-inline bool regex_match(const char* str,
- cmatch& m,
- const regex& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const char* str,
- const regex& e,
- match_flag_type flags = match_default)
-{
- match_results<const char*> m;
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#ifndef BOOST_NO_STD_LOCALE
-inline bool regex_match(const char* str,
- cmatch& m,
- const basic_regex<char, cpp_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const char* str,
- const basic_regex<char, cpp_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- match_results<const char*> m;
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#endif
-inline bool regex_match(const char* str,
- cmatch& m,
- const basic_regex<char, c_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const char* str,
- const basic_regex<char, c_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- match_results<const char*> m;
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
-inline bool regex_match(const char* str,
- cmatch& m,
- const basic_regex<char, w32_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const char* str,
- const basic_regex<char, w32_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- match_results<const char*> m;
- return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#endif
-#ifndef BOOST_NO_WREGEX
-inline bool regex_match(const wchar_t* str,
- wcmatch& m,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const wchar_t* str,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- match_results<const wchar_t*> m;
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#ifndef BOOST_NO_STD_LOCALE
-inline bool regex_match(const wchar_t* str,
- wcmatch& m,
- const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const wchar_t* str,
- const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- match_results<const wchar_t*> m;
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#endif
-inline bool regex_match(const wchar_t* str,
- wcmatch& m,
- const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const wchar_t* str,
- const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- match_results<const wchar_t*> m;
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
-inline bool regex_match(const wchar_t* str,
- wcmatch& m,
- const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_match(const wchar_t* str,
- const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- match_results<const wchar_t*> m;
- return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#endif
-#endif
-inline bool regex_match(const std::string& s,
- smatch& m,
- const regex& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::string& s,
- const regex& e,
- match_flag_type flags = match_default)
-{
- match_results<std::string::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#ifndef BOOST_NO_STD_LOCALE
-inline bool regex_match(const std::string& s,
- smatch& m,
- const basic_regex<char, cpp_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::string& s,
- const basic_regex<char, cpp_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- match_results<std::string::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#endif
-inline bool regex_match(const std::string& s,
- smatch& m,
- const basic_regex<char, c_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::string& s,
- const basic_regex<char, c_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- match_results<std::string::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
-inline bool regex_match(const std::string& s,
- smatch& m,
- const basic_regex<char, w32_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::string& s,
- const basic_regex<char, w32_regex_traits<char> >& e,
- match_flag_type flags = match_default)
-{
- match_results<std::string::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#endif
-#if !defined(BOOST_NO_WREGEX)
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- match_results<std::basic_string<wchar_t>::const_iterator>& m,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- match_results<std::basic_string<wchar_t>::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#ifndef BOOST_NO_STD_LOCALE
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- match_results<std::basic_string<wchar_t>::const_iterator>& m,
- const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- match_results<std::basic_string<wchar_t>::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#endif
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- match_results<std::basic_string<wchar_t>::const_iterator>& m,
- const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- match_results<std::basic_string<wchar_t>::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- match_results<std::basic_string<wchar_t>::const_iterator>& m,
- const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- return regex_match(s.begin(), s.end(), m, e, flags);
-}
-inline bool regex_match(const std::basic_string<wchar_t>& s,
- const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e,
- match_flag_type flags = match_default)
-{
- match_results<std::basic_string<wchar_t>::const_iterator> m;
- return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#endif
-#endif
-
-#endif
-
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_MATCH_HPP
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_merge.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_merge.hpp
deleted file mode 100644
index 404ca77501..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_merge.hpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_format.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides formatting output routines for search and replace
- * operations. Note this is an internal header file included
- * by regex.hpp, do not include on its own.
- */
-
-#ifndef BOOST_REGEX_V4_REGEX_MERGE_HPP
-#define BOOST_REGEX_V4_REGEX_MERGE_HPP
-
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-template <class OutputIterator, class Iterator, class traits, class charT>
-inline OutputIterator regex_merge(OutputIterator out,
- Iterator first,
- Iterator last,
- const basic_regex<charT, traits>& e,
- const charT* fmt,
- match_flag_type flags = match_default)
-{
- return regex_replace(out, first, last, e, fmt, flags);
-}
-
-template <class OutputIterator, class Iterator, class traits, class charT>
-inline OutputIterator regex_merge(OutputIterator out,
- Iterator first,
- Iterator last,
- const basic_regex<charT, traits>& e,
- const std::basic_string<charT>& fmt,
- match_flag_type flags = match_default)
-{
- return regex_merge(out, first, last, e, fmt.c_str(), flags);
-}
-
-template <class traits, class charT>
-inline std::basic_string<charT> regex_merge(const std::basic_string<charT>& s,
- const basic_regex<charT, traits>& e,
- const charT* fmt,
- match_flag_type flags = match_default)
-{
- return regex_replace(s, e, fmt, flags);
-}
-
-template <class traits, class charT>
-inline std::basic_string<charT> regex_merge(const std::basic_string<charT>& s,
- const basic_regex<charT, traits>& e,
- const std::basic_string<charT>& fmt,
- match_flag_type flags = match_default)
-{
- return regex_replace(s, e, fmt, flags);
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_MERGE_HPP
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_raw_buffer.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_raw_buffer.hpp
deleted file mode 100644
index ac27e1a29e..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_raw_buffer.hpp
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_raw_buffer.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Raw character buffer for regex code.
- * Note this is an internal header file included
- * by regex.hpp, do not include on its own.
- */
-
-#ifndef BOOST_REGEX_RAW_BUFFER_HPP
-#define BOOST_REGEX_RAW_BUFFER_HPP
-
-#ifndef BOOST_REGEX_CONFIG_HPP
-#include <boost/regex/config.hpp>
-#endif
-
-#include <algorithm>
-#include <cstddef>
-
-namespace boost{
- namespace BOOST_REGEX_DETAIL_NS{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-struct empty_padding{};
-
-union padding
-{
- void* p;
- unsigned int i;
-};
-
-template <int N>
-struct padding3
-{
- enum{
- padding_size = 8,
- padding_mask = 7
- };
-};
-
-template<>
-struct padding3<2>
-{
- enum{
- padding_size = 2,
- padding_mask = 1
- };
-};
-
-template<>
-struct padding3<4>
-{
- enum{
- padding_size = 4,
- padding_mask = 3
- };
-};
-
-template<>
-struct padding3<8>
-{
- enum{
- padding_size = 8,
- padding_mask = 7
- };
-};
-
-template<>
-struct padding3<16>
-{
- enum{
- padding_size = 16,
- padding_mask = 15
- };
-};
-
-enum{
- padding_size = padding3<sizeof(padding)>::padding_size,
- padding_mask = padding3<sizeof(padding)>::padding_mask
-};
-
-//
-// class raw_storage
-// basically this is a simplified vector<unsigned char>
-// this is used by basic_regex for expression storage
-//
-
-class raw_storage
-{
-public:
- typedef std::size_t size_type;
- typedef unsigned char* pointer;
-private:
- pointer last, start, end;
-public:
-
- raw_storage();
- raw_storage(size_type n);
-
- ~raw_storage()
- {
- ::operator delete(start);
- }
-
- void BOOST_REGEX_CALL resize(size_type n)
- {
- size_type newsize = start ? last - start : 1024;
- while (newsize < n)
- newsize *= 2;
- size_type datasize = end - start;
- // extend newsize to WORD/DWORD boundary:
- newsize = (newsize + padding_mask) & ~(padding_mask);
-
- // allocate and copy data:
- pointer ptr = static_cast<pointer>(::operator new(newsize));
- BOOST_REGEX_NOEH_ASSERT(ptr)
- if (start)
- std::memcpy(ptr, start, datasize);
-
- // get rid of old buffer:
- ::operator delete(start);
-
- // and set up pointers:
- start = ptr;
- end = ptr + datasize;
- last = ptr + newsize;
- }
-
- void* BOOST_REGEX_CALL extend(size_type n)
- {
- if(size_type(last - end) < n)
- resize(n + (end - start));
- pointer result = end;
- end += n;
- return result;
- }
-
- void* BOOST_REGEX_CALL insert(size_type pos, size_type n)
- {
- BOOST_REGEX_ASSERT(pos <= size_type(end - start));
- if (size_type(last - end) < n)
- resize(n + (end - start));
- void* result = start + pos;
- std::memmove(start + pos + n, start + pos, (end - start) - pos);
- end += n;
- return result;
- }
-
- size_type BOOST_REGEX_CALL size()
- {
- return size_type(end - start);
- }
-
- size_type BOOST_REGEX_CALL capacity()
- {
- return size_type(last - start);
- }
-
- void* BOOST_REGEX_CALL data()const
- {
- return start;
- }
-
- size_type BOOST_REGEX_CALL index(void* ptr)
- {
- return size_type(static_cast<pointer>(ptr) - static_cast<pointer>(data()));
- }
-
- void BOOST_REGEX_CALL clear()
- {
- end = start;
- }
-
- void BOOST_REGEX_CALL align()
- {
- // move end up to a boundary:
- end = start + (((end - start) + padding_mask) & ~padding_mask);
- }
- void swap(raw_storage& that)
- {
- std::swap(start, that.start);
- std::swap(end, that.end);
- std::swap(last, that.last);
- }
-};
-
-inline raw_storage::raw_storage()
-{
- last = start = end = 0;
-}
-
-inline raw_storage::raw_storage(size_type n)
-{
- start = end = static_cast<pointer>(::operator new(n));
- BOOST_REGEX_NOEH_ASSERT(start)
- last = start + n;
-}
-
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace BOOST_REGEX_DETAIL_NS
-} // namespace boost
-
-#endif
-
-
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_replace.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_replace.hpp
deleted file mode 100644
index 415c58b634..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_replace.hpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2009
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_format.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides formatting output routines for search and replace
- * operations. Note this is an internal header file included
- * by regex.hpp, do not include on its own.
- */
-
-#ifndef BOOST_REGEX_V4_REGEX_REPLACE_HPP
-#define BOOST_REGEX_V4_REGEX_REPLACE_HPP
-
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-template <class OutputIterator, class BidirectionalIterator, class traits, class charT, class Formatter>
-OutputIterator regex_replace(OutputIterator out,
- BidirectionalIterator first,
- BidirectionalIterator last,
- const basic_regex<charT, traits>& e,
- Formatter fmt,
- match_flag_type flags = match_default)
-{
- regex_iterator<BidirectionalIterator, charT, traits> i(first, last, e, flags);
- regex_iterator<BidirectionalIterator, charT, traits> j;
- if(i == j)
- {
- if(!(flags & regex_constants::format_no_copy))
- out = BOOST_REGEX_DETAIL_NS::copy(first, last, out);
- }
- else
- {
- BidirectionalIterator last_m(first);
- while(i != j)
- {
- if(!(flags & regex_constants::format_no_copy))
- out = BOOST_REGEX_DETAIL_NS::copy(i->prefix().first, i->prefix().second, out);
- out = i->format(out, fmt, flags, e);
- last_m = (*i)[0].second;
- if(flags & regex_constants::format_first_only)
- break;
- ++i;
- }
- if(!(flags & regex_constants::format_no_copy))
- out = BOOST_REGEX_DETAIL_NS::copy(last_m, last, out);
- }
- return out;
-}
-
-template <class traits, class charT, class Formatter>
-std::basic_string<charT> regex_replace(const std::basic_string<charT>& s,
- const basic_regex<charT, traits>& e,
- Formatter fmt,
- match_flag_type flags = match_default)
-{
- std::basic_string<charT> result;
- BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<charT> > i(result);
- regex_replace(i, s.begin(), s.end(), e, fmt, flags);
- return result;
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_REPLACE_HPP
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_search.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_search.hpp
deleted file mode 100644
index 0725d3ec3f..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_search.hpp
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_search.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides regex_search implementation.
- */
-
-#ifndef BOOST_REGEX_V4_REGEX_SEARCH_HPP
-#define BOOST_REGEX_V4_REGEX_SEARCH_HPP
-
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-template <class BidiIterator, class Allocator, class charT, class traits>
-bool regex_search(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_search(first, last, m, e, flags, first);
-}
-
-template <class BidiIterator, class Allocator, class charT, class traits>
-bool regex_search(BidiIterator first, BidiIterator last,
- match_results<BidiIterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- match_flag_type flags,
- BidiIterator base)
-{
- if(e.flags() & regex_constants::failbit)
- return false;
-
- BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, base);
- return matcher.find();
-}
-
-//
-// regex_search convenience interfaces:
-#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
-//
-// this isn't really a partial specialisation, but template function
-// overloading - if the compiler doesn't support partial specialisation
-// then it really won't support this either:
-template <class charT, class Allocator, class traits>
-inline bool regex_search(const charT* str,
- match_results<const charT*, Allocator>& m,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_search(str, str + traits::length(str), m, e, flags);
-}
-
-template <class ST, class SA, class Allocator, class charT, class traits>
-inline bool regex_search(const std::basic_string<charT, ST, SA>& s,
- match_results<typename std::basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_search(s.begin(), s.end(), m, e, flags);
-}
-#else // partial overloads:
-inline bool regex_search(const char* str,
- cmatch& m,
- const regex& e,
- match_flag_type flags = match_default)
-{
- return regex_search(str, str + regex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_search(const char* first, const char* last,
- const regex& e,
- match_flag_type flags = match_default)
-{
- cmatch m;
- return regex_search(first, last, m, e, flags | regex_constants::match_any);
-}
-
-#ifndef BOOST_NO_WREGEX
-inline bool regex_search(const wchar_t* str,
- wcmatch& m,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- return regex_search(str, str + wregex::traits_type::length(str), m, e, flags);
-}
-inline bool regex_search(const wchar_t* first, const wchar_t* last,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- wcmatch m;
- return regex_search(first, last, m, e, flags | regex_constants::match_any);
-}
-#endif
-inline bool regex_search(const std::string& s,
- smatch& m,
- const regex& e,
- match_flag_type flags = match_default)
-{
- return regex_search(s.begin(), s.end(), m, e, flags);
-}
-#if !defined(BOOST_NO_WREGEX)
-inline bool regex_search(const std::basic_string<wchar_t>& s,
- wsmatch& m,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- return regex_search(s.begin(), s.end(), m, e, flags);
-}
-#endif
-
-#endif
-
-template <class BidiIterator, class charT, class traits>
-bool regex_search(BidiIterator first, BidiIterator last,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- if(e.flags() & regex_constants::failbit)
- return false;
-
- match_results<BidiIterator> m;
- typedef typename match_results<BidiIterator>::allocator_type match_alloc_type;
- BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, match_alloc_type, traits> matcher(first, last, m, e, flags | regex_constants::match_any, first);
- return matcher.find();
-}
-
-#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
-
-template <class charT, class traits>
-inline bool regex_search(const charT* str,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_search(str, str + traits::length(str), e, flags);
-}
-
-template <class ST, class SA, class charT, class traits>
-inline bool regex_search(const std::basic_string<charT, ST, SA>& s,
- const basic_regex<charT, traits>& e,
- match_flag_type flags = match_default)
-{
- return regex_search(s.begin(), s.end(), e, flags);
-}
-#else // non-template function overloads
-inline bool regex_search(const char* str,
- const regex& e,
- match_flag_type flags = match_default)
-{
- cmatch m;
- return regex_search(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#ifndef BOOST_NO_WREGEX
-inline bool regex_search(const wchar_t* str,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- wcmatch m;
- return regex_search(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
-}
-#endif
-inline bool regex_search(const std::string& s,
- const regex& e,
- match_flag_type flags = match_default)
-{
- smatch m;
- return regex_search(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-#if !defined(BOOST_NO_WREGEX)
-inline bool regex_search(const std::basic_string<wchar_t>& s,
- const wregex& e,
- match_flag_type flags = match_default)
-{
- wsmatch m;
- return regex_search(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
-}
-
-#endif // BOOST_NO_WREGEX
-
-#endif // partial overload
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_SEARCH_HPP
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_split.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_split.hpp
deleted file mode 100644
index afa5659831..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_split.hpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_split.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Implements regex_split and associated functions.
- * Note this is an internal header file included
- * by regex.hpp, do not include on its own.
- */
-
-#ifndef BOOST_REGEX_SPLIT_HPP
-#define BOOST_REGEX_SPLIT_HPP
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-template <class charT>
-const basic_regex<charT>& get_default_expression(charT)
-{
- static const charT expression_text[4] = { '\\', 's', '+', '\00', };
- static const basic_regex<charT> e(expression_text);
- return e;
-}
-
-template <class OutputIterator, class charT, class Traits1, class Alloc1>
-class split_pred
-{
- typedef std::basic_string<charT, Traits1, Alloc1> string_type;
- typedef typename string_type::const_iterator iterator_type;
- iterator_type* p_last;
- OutputIterator* p_out;
- std::size_t* p_max;
- std::size_t initial_max;
-public:
- split_pred(iterator_type* a, OutputIterator* b, std::size_t* c)
- : p_last(a), p_out(b), p_max(c), initial_max(*c) {}
-
- bool operator()(const match_results<iterator_type>& what);
-};
-
-template <class OutputIterator, class charT, class Traits1, class Alloc1>
-bool split_pred<OutputIterator, charT, Traits1, Alloc1>::operator()
- (const match_results<iterator_type>& what)
-{
- *p_last = what[0].second;
- if(what.size() > 1)
- {
- // output sub-expressions only:
- for(unsigned i = 1; i < what.size(); ++i)
- {
- *(*p_out) = what.str(i);
- ++(*p_out);
- if(0 == --*p_max) return false;
- }
- return *p_max != 0;
- }
- else
- {
- // output $` only if it's not-null or not at the start of the input:
- const sub_match<iterator_type>& sub = what[-1];
- if((sub.first != sub.second) || (*p_max != initial_max))
- {
- *(*p_out) = sub.str();
- ++(*p_out);
- return --*p_max;
- }
- }
- //
- // initial null, do nothing:
- return true;
-}
-
-} // namespace BOOST_REGEX_DETAIL_NS
-
-template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
-std::size_t regex_split(OutputIterator out,
- std::basic_string<charT, Traits1, Alloc1>& s,
- const basic_regex<charT, Traits2>& e,
- match_flag_type flags,
- std::size_t max_split)
-{
- typedef typename std::basic_string<charT, Traits1, Alloc1>::const_iterator ci_t;
- //typedef typename match_results<ci_t>::allocator_type match_allocator;
- ci_t last = s.begin();
- std::size_t init_size = max_split;
- BOOST_REGEX_DETAIL_NS::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split);
- ci_t i, j;
- i = s.begin();
- j = s.end();
- regex_grep(pred, i, j, e, flags);
- //
- // if there is still input left, do a final push as long as max_split
- // is not exhausted, and we're not splitting sub-expressions rather
- // than whitespace:
- if(max_split && (last != s.end()) && (e.mark_count() == 0))
- {
- *out = std::basic_string<charT, Traits1, Alloc1>((ci_t)last, (ci_t)s.end());
- ++out;
- last = s.end();
- --max_split;
- }
- //
- // delete from the string everything that has been processed so far:
- s.erase(0, last - s.begin());
- //
- // return the number of new records pushed:
- return init_size - max_split;
-}
-
-template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
-inline std::size_t regex_split(OutputIterator out,
- std::basic_string<charT, Traits1, Alloc1>& s,
- const basic_regex<charT, Traits2>& e,
- match_flag_type flags = match_default)
-{
- return regex_split(out, s, e, flags, UINT_MAX);
-}
-
-template <class OutputIterator, class charT, class Traits1, class Alloc1>
-inline std::size_t regex_split(OutputIterator out,
- std::basic_string<charT, Traits1, Alloc1>& s)
-{
- return regex_split(out, s, BOOST_REGEX_DETAIL_NS::get_default_expression(charT(0)), match_default, UINT_MAX);
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_token_iterator.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_token_iterator.hpp
deleted file mode 100644
index fc54b3c97f..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_token_iterator.hpp
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- *
- * Copyright (c) 2003
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_token_iterator.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides regex_token_iterator implementation.
- */
-
-#ifndef BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
-#define BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
-
-#include <boost/shared_ptr.hpp>
-#include <boost/detail/workaround.hpp>
-#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
- || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
-//
-// Borland C++ Builder 6, and Visual C++ 6,
-// can't cope with the array template constructor
-// so we have a template member that will accept any type as
-// argument, and then assert that is really is an array:
-//
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_array.hpp>
-#endif
-
-namespace boost{
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#pragma warning(push)
-#pragma warning(disable:4700)
-#endif
-
-template <class BidirectionalIterator,
- class charT,
- class traits>
-class regex_token_iterator_implementation
-{
- typedef basic_regex<charT, traits> regex_type;
- typedef sub_match<BidirectionalIterator> value_type;
-
- match_results<BidirectionalIterator> what; // current match
- BidirectionalIterator base; // start of search area
- BidirectionalIterator end; // end of search area
- const regex_type re; // the expression
- match_flag_type flags; // match flags
- value_type result; // the current string result
- int N; // the current sub-expression being enumerated
- std::vector<int> subs; // the sub-expressions to enumerate
-
-public:
- regex_token_iterator_implementation(const regex_token_iterator_implementation& other)
- : what(other.what), base(other.base), end(other.end), re(other.re), flags(other.flags), result(other.result), N(other.N), subs(other.subs) {}
- regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, int sub, match_flag_type f)
- : end(last), re(*p), flags(f), N(0){ subs.push_back(sub); }
- regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const std::vector<int>& v, match_flag_type f)
- : end(last), re(*p), flags(f), N(0), subs(v){}
-#if !BOOST_WORKAROUND(__HP_aCC, < 60700)
-#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
- || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
- || BOOST_WORKAROUND(__HP_aCC, < 60700)
- template <class T>
- regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const T& submatches, match_flag_type f)
- : end(last), re(*p), flags(f), N(0)
- {
- // assert that T really is an array:
- BOOST_STATIC_ASSERT(::boost::is_array<T>::value);
- const std::size_t array_size = sizeof(T) / sizeof(submatches[0]);
- for(std::size_t i = 0; i < array_size; ++i)
- {
- subs.push_back(submatches[i]);
- }
- }
-#else
- template <std::size_t CN>
- regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const int (&submatches)[CN], match_flag_type f)
- : end(last), re(*p), flags(f), N(0)
- {
- for(std::size_t i = 0; i < CN; ++i)
- {
- subs.push_back(submatches[i]);
- }
- }
-#endif
-#endif
- bool init(BidirectionalIterator first)
- {
- N = 0;
- base = first;
- if(regex_search(first, end, what, re, flags, base) == true)
- {
- N = 0;
- result = ((subs[N] == -1) ? what.prefix() : what[(int)subs[N]]);
- return true;
- }
- else if((subs[N] == -1) && (first != end))
- {
- result.first = first;
- result.second = end;
- result.matched = (first != end);
- N = -1;
- return true;
- }
- return false;
- }
- bool compare(const regex_token_iterator_implementation& that)
- {
- if(this == &that) return true;
- return (&re.get_data() == &that.re.get_data())
- && (end == that.end)
- && (flags == that.flags)
- && (N == that.N)
- && (what[0].first == that.what[0].first)
- && (what[0].second == that.what[0].second);
- }
- const value_type& get()
- { return result; }
- bool next()
- {
- if(N == -1)
- return false;
- if(N+1 < (int)subs.size())
- {
- ++N;
- result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
- return true;
- }
- //if(what.prefix().first != what[0].second)
- // flags |= /*match_prev_avail |*/ regex_constants::match_not_bob;
- BidirectionalIterator last_end(what[0].second);
- if(regex_search(last_end, end, what, re, ((what[0].first == what[0].second) ? flags | regex_constants::match_not_initial_null : flags), base))
- {
- N =0;
- result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
- return true;
- }
- else if((last_end != end) && (subs[0] == -1))
- {
- N =-1;
- result.first = last_end;
- result.second = end;
- result.matched = (last_end != end);
- return true;
- }
- return false;
- }
-private:
- regex_token_iterator_implementation& operator=(const regex_token_iterator_implementation&);
-};
-
-template <class BidirectionalIterator,
- class charT = BOOST_DEDUCED_TYPENAME BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::value_type,
- class traits = regex_traits<charT> >
-class regex_token_iterator
-{
-private:
- typedef regex_token_iterator_implementation<BidirectionalIterator, charT, traits> impl;
- typedef shared_ptr<impl> pimpl;
-public:
- typedef basic_regex<charT, traits> regex_type;
- typedef sub_match<BidirectionalIterator> value_type;
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
- difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef std::forward_iterator_tag iterator_category;
-
- regex_token_iterator(){}
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- int submatch = 0, match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatch, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- const std::vector<int>& submatches, match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatches, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
-#if !BOOST_WORKAROUND(__HP_aCC, < 60700)
-#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
- || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
- || BOOST_WORKAROUND(__HP_aCC, < 60700)
- template <class T>
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- const T& submatches, match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatches, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
-#else
- template <std::size_t N>
- regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- const int (&submatches)[N], match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatches, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
-#endif
-#endif
- regex_token_iterator(const regex_token_iterator& that)
- : pdata(that.pdata) {}
- regex_token_iterator& operator=(const regex_token_iterator& that)
- {
- pdata = that.pdata;
- return *this;
- }
- bool operator==(const regex_token_iterator& that)const
- {
- if((pdata.get() == 0) || (that.pdata.get() == 0))
- return pdata.get() == that.pdata.get();
- return pdata->compare(*(that.pdata.get()));
- }
- bool operator!=(const regex_token_iterator& that)const
- { return !(*this == that); }
- const value_type& operator*()const
- { return pdata->get(); }
- const value_type* operator->()const
- { return &(pdata->get()); }
- regex_token_iterator& operator++()
- {
- cow();
- if(0 == pdata->next())
- {
- pdata.reset();
- }
- return *this;
- }
- regex_token_iterator operator++(int)
- {
- regex_token_iterator result(*this);
- ++(*this);
- return result;
- }
-private:
-
- pimpl pdata;
-
- void cow()
- {
- // copy-on-write
- if(pdata.get() && !pdata.unique())
- {
- pdata.reset(new impl(*(pdata.get())));
- }
- }
-};
-
-typedef regex_token_iterator<const char*> cregex_token_iterator;
-typedef regex_token_iterator<std::string::const_iterator> sregex_token_iterator;
-#ifndef BOOST_NO_WREGEX
-typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
-typedef regex_token_iterator<std::wstring::const_iterator> wsregex_token_iterator;
-#endif
-
-template <class charT, class traits>
-inline regex_token_iterator<const charT*, charT, traits> make_regex_token_iterator(const charT* p, const basic_regex<charT, traits>& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_token_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, submatch, m);
-}
-template <class charT, class traits, class ST, class SA>
-inline regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_token_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, submatch, m);
-}
-template <class charT, class traits, std::size_t N>
-inline regex_token_iterator<const charT*, charT, traits> make_regex_token_iterator(const charT* p, const basic_regex<charT, traits>& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_token_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, submatch, m);
-}
-template <class charT, class traits, class ST, class SA, std::size_t N>
-inline regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_token_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, submatch, m);
-}
-template <class charT, class traits>
-inline regex_token_iterator<const charT*, charT, traits> make_regex_token_iterator(const charT* p, const basic_regex<charT, traits>& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_token_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, submatch, m);
-}
-template <class charT, class traits, class ST, class SA>
-inline regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_token_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, submatch, m);
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits.hpp
deleted file mode 100644
index ffa2bb6871..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits.hpp
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *
- * Copyright (c) 2003
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_traits.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares regular expression traits classes.
- */
-
-#ifndef BOOST_REGEX_TRAITS_HPP_INCLUDED
-#define BOOST_REGEX_TRAITS_HPP_INCLUDED
-
-#ifndef BOOST_REGEX_CONFIG_HPP
-#include <boost/regex/config.hpp>
-#endif
-#ifndef BOOST_REGEX_WORKAROUND_HPP
-#include <boost/regex/v4/regex_workaround.hpp>
-#endif
-#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
-#include <boost/regex/v4/syntax_type.hpp>
-#endif
-#ifndef BOOST_REGEX_ERROR_TYPE_HPP
-#include <boost/regex/v4/error_type.hpp>
-#endif
-#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
-#include <boost/regex/v4/regex_traits_defaults.hpp>
-#endif
-#ifndef BOOST_NO_STD_LOCALE
-# ifndef BOOST_CPP_REGEX_TRAITS_HPP_INCLUDED
-# include <boost/regex/v4/cpp_regex_traits.hpp>
-# endif
-#endif
-#if !BOOST_WORKAROUND(BOOST_BORLANDC, < 0x560)
-# ifndef BOOST_C_REGEX_TRAITS_HPP_INCLUDED
-# include <boost/regex/v4/c_regex_traits.hpp>
-# endif
-#endif
-#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
-# ifndef BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
-# include <boost/regex/v4/w32_regex_traits.hpp>
-# endif
-#endif
-#ifndef BOOST_REGEX_FWD_HPP_INCLUDED
-#include <boost/regex_fwd.hpp>
-#endif
-
-#include "boost/mpl/has_xxx.hpp"
-#include <boost/static_assert.hpp>
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-
-template <class charT, class implementationT >
-struct regex_traits : public implementationT
-{
- regex_traits() : implementationT() {}
-};
-
-//
-// class regex_traits_wrapper.
-// this is what our implementation will actually store;
-// it provides default implementations of the "optional"
-// interfaces that we support, in addition to the
-// required "standard" ones:
-//
-namespace BOOST_REGEX_DETAIL_NS{
-#if !BOOST_WORKAROUND(__HP_aCC, < 60000)
-BOOST_MPL_HAS_XXX_TRAIT_DEF(boost_extensions_tag)
-#else
-template<class T>
-struct has_boost_extensions_tag
-{
- BOOST_STATIC_CONSTANT(bool, value = false);
-};
-#endif
-
-template <class BaseT>
-struct default_wrapper : public BaseT
-{
- typedef typename BaseT::char_type char_type;
- std::string error_string(::boost::regex_constants::error_type e)const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::get_default_error_string(e);
- }
- ::boost::regex_constants::syntax_type syntax_type(char_type c)const
- {
- return ((c & 0x7f) == c) ? get_default_syntax_type(static_cast<char>(c)) : ::boost::regex_constants::syntax_char;
- }
- ::boost::regex_constants::escape_syntax_type escape_syntax_type(char_type c)const
- {
- return ((c & 0x7f) == c) ? get_default_escape_syntax_type(static_cast<char>(c)) : ::boost::regex_constants::escape_type_identity;
- }
- boost::intmax_t toi(const char_type*& p1, const char_type* p2, int radix)const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
- }
- char_type translate(char_type c, bool icase)const
- {
- return (icase ? this->translate_nocase(c) : this->translate(c));
- }
- char_type translate(char_type c)const
- {
- return BaseT::translate(c);
- }
- char_type tolower(char_type c)const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::global_lower(c);
- }
- char_type toupper(char_type c)const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::global_upper(c);
- }
-};
-
-template <class BaseT, bool has_extensions>
-struct compute_wrapper_base
-{
- typedef BaseT type;
-};
-#if !BOOST_WORKAROUND(__HP_aCC, < 60000)
-template <class BaseT>
-struct compute_wrapper_base<BaseT, false>
-{
- typedef default_wrapper<BaseT> type;
-};
-#else
-template <>
-struct compute_wrapper_base<c_regex_traits<char>, false>
-{
- typedef default_wrapper<c_regex_traits<char> > type;
-};
-#ifndef BOOST_NO_WREGEX
-template <>
-struct compute_wrapper_base<c_regex_traits<wchar_t>, false>
-{
- typedef default_wrapper<c_regex_traits<wchar_t> > type;
-};
-#endif
-#endif
-
-} // namespace BOOST_REGEX_DETAIL_NS
-
-template <class BaseT>
-struct regex_traits_wrapper
- : public ::boost::BOOST_REGEX_DETAIL_NS::compute_wrapper_base<
- BaseT,
- ::boost::BOOST_REGEX_DETAIL_NS::has_boost_extensions_tag<BaseT>::value
- >::type
-{
- regex_traits_wrapper(){}
-private:
- regex_traits_wrapper(const regex_traits_wrapper&);
- regex_traits_wrapper& operator=(const regex_traits_wrapper&);
-};
-
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif // include
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits_defaults.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits_defaults.hpp
deleted file mode 100644
index 1dbb0bf9c5..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_traits_defaults.hpp
+++ /dev/null
@@ -1,997 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_traits_defaults.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares API's for access to regex_traits default properties.
- */
-
-#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
-#define BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#include <boost/regex/config.hpp>
-#include <boost/cstdint.hpp>
-
-#include <cctype>
-#include <cwctype>
-#include <locale>
-
-#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
-#include <boost/regex/v4/syntax_type.hpp>
-#endif
-#ifndef BOOST_REGEX_ERROR_TYPE_HPP
-#include <boost/regex/v4/error_type.hpp>
-#endif
-#include <boost/regex/v4/regex_workaround.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
-#include <boost/utility/enable_if.hpp>
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-namespace std{
- using ::strlen;
-}
-#endif
-
-namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
-
-
-//
-// helpers to suppress warnings:
-//
-template <class charT>
-inline bool is_extended(charT c)
-{
- typedef typename make_unsigned<charT>::type unsigned_type;
- return (sizeof(charT) > 1) && (static_cast<unsigned_type>(c) >= 256u);
-}
-inline bool is_extended(char)
-{ return false; }
-
-inline const char* BOOST_REGEX_CALL get_default_syntax(regex_constants::syntax_type n)
-{
- // if the user hasn't supplied a message catalog, then this supplies
- // default "messages" for us to load in the range 1-100.
- const char* messages[] = {
- "",
- "(",
- ")",
- "$",
- "^",
- ".",
- "*",
- "+",
- "?",
- "[",
- "]",
- "|",
- "\\",
- "#",
- "-",
- "{",
- "}",
- "0123456789",
- "b",
- "B",
- "<",
- ">",
- "",
- "",
- "A`",
- "z'",
- "\n",
- ",",
- "a",
- "f",
- "n",
- "r",
- "t",
- "v",
- "x",
- "c",
- ":",
- "=",
- "e",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "E",
- "Q",
- "X",
- "C",
- "Z",
- "G",
- "!",
- "p",
- "P",
- "N",
- "gk",
- "K",
- "R",
- };
-
- return ((n >= (sizeof(messages) / sizeof(messages[1]))) ? "" : messages[n]);
-}
-
-inline const char* BOOST_REGEX_CALL get_default_error_string(regex_constants::error_type n)
-{
- static const char* const s_default_error_messages[] = {
- "Success", /* REG_NOERROR 0 error_ok */
- "No match", /* REG_NOMATCH 1 error_no_match */
- "Invalid regular expression.", /* REG_BADPAT 2 error_bad_pattern */
- "Invalid collation character.", /* REG_ECOLLATE 3 error_collate */
- "Invalid character class name, collating name, or character range.", /* REG_ECTYPE 4 error_ctype */
- "Invalid or unterminated escape sequence.", /* REG_EESCAPE 5 error_escape */
- "Invalid back reference: specified capturing group does not exist.", /* REG_ESUBREG 6 error_backref */
- "Unmatched [ or [^ in character class declaration.", /* REG_EBRACK 7 error_brack */
- "Unmatched marking parenthesis ( or \\(.", /* REG_EPAREN 8 error_paren */
- "Unmatched quantified repeat operator { or \\{.", /* REG_EBRACE 9 error_brace */
- "Invalid content of repeat range.", /* REG_BADBR 10 error_badbrace */
- "Invalid range end in character class", /* REG_ERANGE 11 error_range */
- "Out of memory.", /* REG_ESPACE 12 error_space NOT USED */
- "Invalid preceding regular expression prior to repetition operator.", /* REG_BADRPT 13 error_badrepeat */
- "Premature end of regular expression", /* REG_EEND 14 error_end NOT USED */
- "Regular expression is too large.", /* REG_ESIZE 15 error_size NOT USED */
- "Unmatched ) or \\)", /* REG_ERPAREN 16 error_right_paren NOT USED */
- "Empty regular expression.", /* REG_EMPTY 17 error_empty */
- "The complexity of matching the regular expression exceeded predefined bounds. "
- "Try refactoring the regular expression to make each choice made by the state machine unambiguous. "
- "This exception is thrown to prevent \"eternal\" matches that take an "
- "indefinite period time to locate.", /* REG_ECOMPLEXITY 18 error_complexity */
- "Ran out of stack space trying to match the regular expression.", /* REG_ESTACK 19 error_stack */
- "Invalid or unterminated Perl (?...) sequence.", /* REG_E_PERL 20 error_perl */
- "Unknown error.", /* REG_E_UNKNOWN 21 error_unknown */
- };
-
- return (n > ::boost::regex_constants::error_unknown) ? s_default_error_messages[::boost::regex_constants::error_unknown] : s_default_error_messages[n];
-}
-
-inline regex_constants::syntax_type BOOST_REGEX_CALL get_default_syntax_type(char c)
-{
- //
- // char_syntax determines how the compiler treats a given character
- // in a regular expression.
- //
- static regex_constants::syntax_type char_syntax[] = {
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_newline, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /* */ // 32
- regex_constants::syntax_not, /*!*/
- regex_constants::syntax_char, /*"*/
- regex_constants::syntax_hash, /*#*/
- regex_constants::syntax_dollar, /*$*/
- regex_constants::syntax_char, /*%*/
- regex_constants::syntax_char, /*&*/
- regex_constants::escape_type_end_buffer, /*'*/
- regex_constants::syntax_open_mark, /*(*/
- regex_constants::syntax_close_mark, /*)*/
- regex_constants::syntax_star, /***/
- regex_constants::syntax_plus, /*+*/
- regex_constants::syntax_comma, /*,*/
- regex_constants::syntax_dash, /*-*/
- regex_constants::syntax_dot, /*.*/
- regex_constants::syntax_char, /*/*/
- regex_constants::syntax_digit, /*0*/
- regex_constants::syntax_digit, /*1*/
- regex_constants::syntax_digit, /*2*/
- regex_constants::syntax_digit, /*3*/
- regex_constants::syntax_digit, /*4*/
- regex_constants::syntax_digit, /*5*/
- regex_constants::syntax_digit, /*6*/
- regex_constants::syntax_digit, /*7*/
- regex_constants::syntax_digit, /*8*/
- regex_constants::syntax_digit, /*9*/
- regex_constants::syntax_colon, /*:*/
- regex_constants::syntax_char, /*;*/
- regex_constants::escape_type_left_word, /*<*/
- regex_constants::syntax_equal, /*=*/
- regex_constants::escape_type_right_word, /*>*/
- regex_constants::syntax_question, /*?*/
- regex_constants::syntax_char, /*@*/
- regex_constants::syntax_char, /*A*/
- regex_constants::syntax_char, /*B*/
- regex_constants::syntax_char, /*C*/
- regex_constants::syntax_char, /*D*/
- regex_constants::syntax_char, /*E*/
- regex_constants::syntax_char, /*F*/
- regex_constants::syntax_char, /*G*/
- regex_constants::syntax_char, /*H*/
- regex_constants::syntax_char, /*I*/
- regex_constants::syntax_char, /*J*/
- regex_constants::syntax_char, /*K*/
- regex_constants::syntax_char, /*L*/
- regex_constants::syntax_char, /*M*/
- regex_constants::syntax_char, /*N*/
- regex_constants::syntax_char, /*O*/
- regex_constants::syntax_char, /*P*/
- regex_constants::syntax_char, /*Q*/
- regex_constants::syntax_char, /*R*/
- regex_constants::syntax_char, /*S*/
- regex_constants::syntax_char, /*T*/
- regex_constants::syntax_char, /*U*/
- regex_constants::syntax_char, /*V*/
- regex_constants::syntax_char, /*W*/
- regex_constants::syntax_char, /*X*/
- regex_constants::syntax_char, /*Y*/
- regex_constants::syntax_char, /*Z*/
- regex_constants::syntax_open_set, /*[*/
- regex_constants::syntax_escape, /*\*/
- regex_constants::syntax_close_set, /*]*/
- regex_constants::syntax_caret, /*^*/
- regex_constants::syntax_char, /*_*/
- regex_constants::syntax_char, /*`*/
- regex_constants::syntax_char, /*a*/
- regex_constants::syntax_char, /*b*/
- regex_constants::syntax_char, /*c*/
- regex_constants::syntax_char, /*d*/
- regex_constants::syntax_char, /*e*/
- regex_constants::syntax_char, /*f*/
- regex_constants::syntax_char, /*g*/
- regex_constants::syntax_char, /*h*/
- regex_constants::syntax_char, /*i*/
- regex_constants::syntax_char, /*j*/
- regex_constants::syntax_char, /*k*/
- regex_constants::syntax_char, /*l*/
- regex_constants::syntax_char, /*m*/
- regex_constants::syntax_char, /*n*/
- regex_constants::syntax_char, /*o*/
- regex_constants::syntax_char, /*p*/
- regex_constants::syntax_char, /*q*/
- regex_constants::syntax_char, /*r*/
- regex_constants::syntax_char, /*s*/
- regex_constants::syntax_char, /*t*/
- regex_constants::syntax_char, /*u*/
- regex_constants::syntax_char, /*v*/
- regex_constants::syntax_char, /*w*/
- regex_constants::syntax_char, /*x*/
- regex_constants::syntax_char, /*y*/
- regex_constants::syntax_char, /*z*/
- regex_constants::syntax_open_brace, /*{*/
- regex_constants::syntax_or, /*|*/
- regex_constants::syntax_close_brace, /*}*/
- regex_constants::syntax_char, /*~*/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- regex_constants::syntax_char, /**/
- };
-
- return char_syntax[(unsigned char)c];
-}
-
-inline regex_constants::escape_syntax_type BOOST_REGEX_CALL get_default_escape_syntax_type(char c)
-{
- //
- // char_syntax determines how the compiler treats a given character
- // in a regular expression.
- //
- static regex_constants::escape_syntax_type char_syntax[] = {
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /* */ // 32
- regex_constants::escape_type_identity, /*!*/
- regex_constants::escape_type_identity, /*"*/
- regex_constants::escape_type_identity, /*#*/
- regex_constants::escape_type_identity, /*$*/
- regex_constants::escape_type_identity, /*%*/
- regex_constants::escape_type_identity, /*&*/
- regex_constants::escape_type_end_buffer, /*'*/
- regex_constants::syntax_open_mark, /*(*/
- regex_constants::syntax_close_mark, /*)*/
- regex_constants::escape_type_identity, /***/
- regex_constants::syntax_plus, /*+*/
- regex_constants::escape_type_identity, /*,*/
- regex_constants::escape_type_identity, /*-*/
- regex_constants::escape_type_identity, /*.*/
- regex_constants::escape_type_identity, /*/*/
- regex_constants::escape_type_decimal, /*0*/
- regex_constants::escape_type_backref, /*1*/
- regex_constants::escape_type_backref, /*2*/
- regex_constants::escape_type_backref, /*3*/
- regex_constants::escape_type_backref, /*4*/
- regex_constants::escape_type_backref, /*5*/
- regex_constants::escape_type_backref, /*6*/
- regex_constants::escape_type_backref, /*7*/
- regex_constants::escape_type_backref, /*8*/
- regex_constants::escape_type_backref, /*9*/
- regex_constants::escape_type_identity, /*:*/
- regex_constants::escape_type_identity, /*;*/
- regex_constants::escape_type_left_word, /*<*/
- regex_constants::escape_type_identity, /*=*/
- regex_constants::escape_type_right_word, /*>*/
- regex_constants::syntax_question, /*?*/
- regex_constants::escape_type_identity, /*@*/
- regex_constants::escape_type_start_buffer, /*A*/
- regex_constants::escape_type_not_word_assert, /*B*/
- regex_constants::escape_type_C, /*C*/
- regex_constants::escape_type_not_class, /*D*/
- regex_constants::escape_type_E, /*E*/
- regex_constants::escape_type_not_class, /*F*/
- regex_constants::escape_type_G, /*G*/
- regex_constants::escape_type_not_class, /*H*/
- regex_constants::escape_type_not_class, /*I*/
- regex_constants::escape_type_not_class, /*J*/
- regex_constants::escape_type_reset_start_mark, /*K*/
- regex_constants::escape_type_not_class, /*L*/
- regex_constants::escape_type_not_class, /*M*/
- regex_constants::escape_type_named_char, /*N*/
- regex_constants::escape_type_not_class, /*O*/
- regex_constants::escape_type_not_property, /*P*/
- regex_constants::escape_type_Q, /*Q*/
- regex_constants::escape_type_line_ending, /*R*/
- regex_constants::escape_type_not_class, /*S*/
- regex_constants::escape_type_not_class, /*T*/
- regex_constants::escape_type_not_class, /*U*/
- regex_constants::escape_type_not_class, /*V*/
- regex_constants::escape_type_not_class, /*W*/
- regex_constants::escape_type_X, /*X*/
- regex_constants::escape_type_not_class, /*Y*/
- regex_constants::escape_type_Z, /*Z*/
- regex_constants::escape_type_identity, /*[*/
- regex_constants::escape_type_identity, /*\*/
- regex_constants::escape_type_identity, /*]*/
- regex_constants::escape_type_identity, /*^*/
- regex_constants::escape_type_identity, /*_*/
- regex_constants::escape_type_start_buffer, /*`*/
- regex_constants::escape_type_control_a, /*a*/
- regex_constants::escape_type_word_assert, /*b*/
- regex_constants::escape_type_ascii_control, /*c*/
- regex_constants::escape_type_class, /*d*/
- regex_constants::escape_type_e, /*e*/
- regex_constants::escape_type_control_f, /*f*/
- regex_constants::escape_type_extended_backref, /*g*/
- regex_constants::escape_type_class, /*h*/
- regex_constants::escape_type_class, /*i*/
- regex_constants::escape_type_class, /*j*/
- regex_constants::escape_type_extended_backref, /*k*/
- regex_constants::escape_type_class, /*l*/
- regex_constants::escape_type_class, /*m*/
- regex_constants::escape_type_control_n, /*n*/
- regex_constants::escape_type_class, /*o*/
- regex_constants::escape_type_property, /*p*/
- regex_constants::escape_type_class, /*q*/
- regex_constants::escape_type_control_r, /*r*/
- regex_constants::escape_type_class, /*s*/
- regex_constants::escape_type_control_t, /*t*/
- regex_constants::escape_type_class, /*u*/
- regex_constants::escape_type_control_v, /*v*/
- regex_constants::escape_type_class, /*w*/
- regex_constants::escape_type_hex, /*x*/
- regex_constants::escape_type_class, /*y*/
- regex_constants::escape_type_end_buffer, /*z*/
- regex_constants::syntax_open_brace, /*{*/
- regex_constants::syntax_or, /*|*/
- regex_constants::syntax_close_brace, /*}*/
- regex_constants::escape_type_identity, /*~*/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- regex_constants::escape_type_identity, /**/
- };
-
- return char_syntax[(unsigned char)c];
-}
-
-// is charT c a combining character?
-inline bool BOOST_REGEX_CALL is_combining_implementation(boost::uint_least16_t c)
-{
- const boost::uint_least16_t combining_ranges[] = { 0x0300, 0x0361,
- 0x0483, 0x0486,
- 0x0903, 0x0903,
- 0x093E, 0x0940,
- 0x0949, 0x094C,
- 0x0982, 0x0983,
- 0x09BE, 0x09C0,
- 0x09C7, 0x09CC,
- 0x09D7, 0x09D7,
- 0x0A3E, 0x0A40,
- 0x0A83, 0x0A83,
- 0x0ABE, 0x0AC0,
- 0x0AC9, 0x0ACC,
- 0x0B02, 0x0B03,
- 0x0B3E, 0x0B3E,
- 0x0B40, 0x0B40,
- 0x0B47, 0x0B4C,
- 0x0B57, 0x0B57,
- 0x0B83, 0x0B83,
- 0x0BBE, 0x0BBF,
- 0x0BC1, 0x0BCC,
- 0x0BD7, 0x0BD7,
- 0x0C01, 0x0C03,
- 0x0C41, 0x0C44,
- 0x0C82, 0x0C83,
- 0x0CBE, 0x0CBE,
- 0x0CC0, 0x0CC4,
- 0x0CC7, 0x0CCB,
- 0x0CD5, 0x0CD6,
- 0x0D02, 0x0D03,
- 0x0D3E, 0x0D40,
- 0x0D46, 0x0D4C,
- 0x0D57, 0x0D57,
- 0x0F7F, 0x0F7F,
- 0x20D0, 0x20E1,
- 0x3099, 0x309A,
- 0xFE20, 0xFE23,
- 0xffff, 0xffff, };
-
- const boost::uint_least16_t* p = combining_ranges + 1;
- while (*p < c) p += 2;
- --p;
- if ((c >= *p) && (c <= *(p + 1)))
- return true;
- return false;
-}
-
-template <class charT>
-inline bool is_combining(charT c)
-{
- return (c <= static_cast<charT>(0)) ? false : ((c >= static_cast<charT>((std::numeric_limits<uint_least16_t>::max)())) ? false : is_combining_implementation(static_cast<unsigned short>(c)));
-}
-template <>
-inline bool is_combining<char>(char)
-{
- return false;
-}
-template <>
-inline bool is_combining<signed char>(signed char)
-{
- return false;
-}
-template <>
-inline bool is_combining<unsigned char>(unsigned char)
-{
- return false;
-}
-#if !defined(__hpux) && !defined(__WINSCW__) // can't use WCHAR_MAX/MIN in pp-directives
-#ifdef _MSC_VER
-template<>
-inline bool is_combining<wchar_t>(wchar_t c)
-{
- return is_combining_implementation(static_cast<unsigned short>(c));
-}
-#elif !defined(__DECCXX) && !defined(__osf__) && !defined(__OSF__) && defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
-#if defined(WCHAR_MAX) && (WCHAR_MAX <= USHRT_MAX)
-template<>
-inline bool is_combining<wchar_t>(wchar_t c)
-{
- return is_combining_implementation(static_cast<unsigned short>(c));
-}
-#else
-template<>
-inline bool is_combining<wchar_t>(wchar_t c)
-{
- return (c >= (std::numeric_limits<uint_least16_t>::max)()) ? false : is_combining_implementation(static_cast<unsigned short>(c));
-}
-#endif
-#endif
-#endif
-
-//
-// is a charT c a line separator?
-//
-template <class charT>
-inline bool is_separator(charT c)
-{
- return BOOST_REGEX_MAKE_BOOL(
- (c == static_cast<charT>('\n'))
- || (c == static_cast<charT>('\r'))
- || (c == static_cast<charT>('\f'))
- || (static_cast<boost::uint16_t>(c) == 0x2028u)
- || (static_cast<boost::uint16_t>(c) == 0x2029u)
- || (static_cast<boost::uint16_t>(c) == 0x85u));
-}
-template <>
-inline bool is_separator<char>(char c)
-{
- return BOOST_REGEX_MAKE_BOOL((c == '\n') || (c == '\r') || (c == '\f'));
-}
-
-//
-// get a default collating element:
-//
-inline std::string BOOST_REGEX_CALL lookup_default_collate_name(const std::string& name)
-{
- //
- // these are the POSIX collating names:
- //
- static const char* def_coll_names[] = {
- "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "alert", "backspace", "tab", "newline",
- "vertical-tab", "form-feed", "carriage-return", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK",
- "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "IS4", "IS3", "IS2", "IS1", "space", "exclamation-mark",
- "quotation-mark", "number-sign", "dollar-sign", "percent-sign", "ampersand", "apostrophe",
- "left-parenthesis", "right-parenthesis", "asterisk", "plus-sign", "comma", "hyphen",
- "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
- "colon", "semicolon", "less-than-sign", "equals-sign", "greater-than-sign",
- "question-mark", "commercial-at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
- "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "left-square-bracket", "backslash",
- "right-square-bracket", "circumflex", "underscore", "grave-accent", "a", "b", "c", "d", "e", "f",
- "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "left-curly-bracket",
- "vertical-line", "right-curly-bracket", "tilde", "DEL", "",
- };
-
- // these multi-character collating elements
- // should keep most Western-European locales
- // happy - we should really localise these a
- // little more - but this will have to do for
- // now:
-
- static const char* def_multi_coll[] = {
- "ae",
- "Ae",
- "AE",
- "ch",
- "Ch",
- "CH",
- "ll",
- "Ll",
- "LL",
- "ss",
- "Ss",
- "SS",
- "nj",
- "Nj",
- "NJ",
- "dz",
- "Dz",
- "DZ",
- "lj",
- "Lj",
- "LJ",
- "",
- };
-
- unsigned int i = 0;
- while (*def_coll_names[i])
- {
- if (def_coll_names[i] == name)
- {
- return std::string(1, char(i));
- }
- ++i;
- }
- i = 0;
- while (*def_multi_coll[i])
- {
- if (def_multi_coll[i] == name)
- {
- return def_multi_coll[i];
- }
- ++i;
- }
- return std::string();
-}
-
-//
-// get the state_id of a character classification, the individual
-// traits classes then transform that state_id into a bitmask:
-//
-template <class charT>
-struct character_pointer_range
-{
- const charT* p1;
- const charT* p2;
-
- bool operator < (const character_pointer_range& r)const
- {
- return std::lexicographical_compare(p1, p2, r.p1, r.p2);
- }
- bool operator == (const character_pointer_range& r)const
- {
- // Not only do we check that the ranges are of equal size before
- // calling std::equal, but there is no other algorithm available:
- // not even a non-standard MS one. So forward to unchecked_equal
- // in the MS case.
- return ((p2 - p1) == (r.p2 - r.p1)) && BOOST_REGEX_DETAIL_NS::equal(p1, p2, r.p1);
- }
-};
-template <class charT>
-int get_default_class_id(const charT* p1, const charT* p2)
-{
- static const charT data[73] = {
- 'a', 'l', 'n', 'u', 'm',
- 'a', 'l', 'p', 'h', 'a',
- 'b', 'l', 'a', 'n', 'k',
- 'c', 'n', 't', 'r', 'l',
- 'd', 'i', 'g', 'i', 't',
- 'g', 'r', 'a', 'p', 'h',
- 'l', 'o', 'w', 'e', 'r',
- 'p', 'r', 'i', 'n', 't',
- 'p', 'u', 'n', 'c', 't',
- 's', 'p', 'a', 'c', 'e',
- 'u', 'n', 'i', 'c', 'o', 'd', 'e',
- 'u', 'p', 'p', 'e', 'r',
- 'v',
- 'w', 'o', 'r', 'd',
- 'x', 'd', 'i', 'g', 'i', 't',
- };
-
- static const character_pointer_range<charT> ranges[21] =
- {
- {data+0, data+5,}, // alnum
- {data+5, data+10,}, // alpha
- {data+10, data+15,}, // blank
- {data+15, data+20,}, // cntrl
- {data+20, data+21,}, // d
- {data+20, data+25,}, // digit
- {data+25, data+30,}, // graph
- {data+29, data+30,}, // h
- {data+30, data+31,}, // l
- {data+30, data+35,}, // lower
- {data+35, data+40,}, // print
- {data+40, data+45,}, // punct
- {data+45, data+46,}, // s
- {data+45, data+50,}, // space
- {data+57, data+58,}, // u
- {data+50, data+57,}, // unicode
- {data+57, data+62,}, // upper
- {data+62, data+63,}, // v
- {data+63, data+64,}, // w
- {data+63, data+67,}, // word
- {data+67, data+73,}, // xdigit
- };
- const character_pointer_range<charT>* ranges_begin = ranges;
- const character_pointer_range<charT>* ranges_end = ranges + (sizeof(ranges)/sizeof(ranges[0]));
-
- character_pointer_range<charT> t = { p1, p2, };
- const character_pointer_range<charT>* p = std::lower_bound(ranges_begin, ranges_end, t);
- if((p != ranges_end) && (t == *p))
- return static_cast<int>(p - ranges);
- return -1;
-}
-
-//
-// helper functions:
-//
-template <class charT>
-std::ptrdiff_t global_length(const charT* p)
-{
- std::ptrdiff_t n = 0;
- while(*p)
- {
- ++p;
- ++n;
- }
- return n;
-}
-template<>
-inline std::ptrdiff_t global_length<char>(const char* p)
-{
- return (std::strlen)(p);
-}
-#ifndef BOOST_NO_WREGEX
-template<>
-inline std::ptrdiff_t global_length<wchar_t>(const wchar_t* p)
-{
- return (std::ptrdiff_t)(std::wcslen)(p);
-}
-#endif
-template <class charT>
-inline charT BOOST_REGEX_CALL global_lower(charT c)
-{
- return c;
-}
-template <class charT>
-inline charT BOOST_REGEX_CALL global_upper(charT c)
-{
- return c;
-}
-
-inline char BOOST_REGEX_CALL do_global_lower(char c)
-{
- return static_cast<char>((std::tolower)((unsigned char)c));
-}
-
-inline char BOOST_REGEX_CALL do_global_upper(char c)
-{
- return static_cast<char>((std::toupper)((unsigned char)c));
-}
-#ifndef BOOST_NO_WREGEX
-inline wchar_t BOOST_REGEX_CALL do_global_lower(wchar_t c)
-{
- return (std::towlower)(c);
-}
-
-inline wchar_t BOOST_REGEX_CALL do_global_upper(wchar_t c)
-{
- return (std::towupper)(c);
-}
-#endif
-//
-// This sucks: declare template specialisations of global_lower/global_upper
-// that just forward to the non-template implementation functions. We do
-// this because there is one compiler (Compaq Tru64 C++) that doesn't seem
-// to differentiate between templates and non-template overloads....
-// what's more, the primary template, plus all overloads have to be
-// defined in the same translation unit (if one is inline they all must be)
-// otherwise the "local template instantiation" compiler option can pick
-// the wrong instantiation when linking:
-//
-template<> inline char BOOST_REGEX_CALL global_lower<char>(char c) { return do_global_lower(c); }
-template<> inline char BOOST_REGEX_CALL global_upper<char>(char c) { return do_global_upper(c); }
-#ifndef BOOST_NO_WREGEX
-template<> inline wchar_t BOOST_REGEX_CALL global_lower<wchar_t>(wchar_t c) { return do_global_lower(c); }
-template<> inline wchar_t BOOST_REGEX_CALL global_upper<wchar_t>(wchar_t c) { return do_global_upper(c); }
-#endif
-
-template <class charT>
-int global_value(charT c)
-{
- static const charT zero = '0';
- static const charT nine = '9';
- static const charT a = 'a';
- static const charT f = 'f';
- static const charT A = 'A';
- static const charT F = 'F';
-
- if(c > f) return -1;
- if(c >= a) return 10 + (c - a);
- if(c > F) return -1;
- if(c >= A) return 10 + (c - A);
- if(c > nine) return -1;
- if(c >= zero) return c - zero;
- return -1;
-}
-template <class charT, class traits>
-boost::intmax_t global_toi(const charT*& p1, const charT* p2, int radix, const traits& t)
-{
- (void)t; // warning suppression
- boost::intmax_t limit = (std::numeric_limits<boost::intmax_t>::max)() / radix;
- boost::intmax_t next_value = t.value(*p1, radix);
- if((p1 == p2) || (next_value < 0) || (next_value >= radix))
- return -1;
- boost::intmax_t result = 0;
- while(p1 != p2)
- {
- next_value = t.value(*p1, radix);
- if((next_value < 0) || (next_value >= radix))
- break;
- result *= radix;
- result += next_value;
- ++p1;
- if (result > limit)
- return -1;
- }
- return result;
-}
-
-template <class charT>
-inline typename boost::enable_if_c<(sizeof(charT) > 1), const charT*>::type get_escape_R_string()
-{
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4309 4245)
-#endif
- static const charT e1[] = { '(', '?', '-', 'x', ':', '(', '?', '>', '\x0D', '\x0A', '?',
- '|', '[', '\x0A', '\x0B', '\x0C', static_cast<charT>(0x85), static_cast<charT>(0x2028),
- static_cast<charT>(0x2029), ']', ')', ')', '\0' };
- static const charT e2[] = { '(', '?', '-', 'x', ':', '(', '?', '>', '\x0D', '\x0A', '?',
- '|', '[', '\x0A', '\x0B', '\x0C', static_cast<charT>(0x85), ']', ')', ')', '\0' };
-
- charT c = static_cast<charT>(0x2029u);
- bool b = (static_cast<unsigned>(c) == 0x2029u);
-
- return (b ? e1 : e2);
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-}
-
-template <class charT>
-inline typename boost::disable_if_c<(sizeof(charT) > 1), const charT*>::type get_escape_R_string()
-{
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4309)
-#endif
- static const charT e2[] = { '(', '?', '-', 'x', ':', '(', '?', '>', '\x0D', '\x0A', '?',
- '|', '[', '\x0A', '\x0B', '\x0C', '\x85', ']', ')', ')', '\0' };
- return e2;
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-}
-
-} // BOOST_REGEX_DETAIL_NS
-} // boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_workaround.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/regex_workaround.hpp
deleted file mode 100644
index 324136e07b..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/regex_workaround.hpp
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2005
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE regex_workarounds.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares Misc workarounds.
- */
-
-#ifndef BOOST_REGEX_WORKAROUND_HPP
-#define BOOST_REGEX_WORKAROUND_HPP
-
-#include <boost/config.hpp>
-#include <new>
-#include <cstring>
-#include <cstdlib>
-#include <cstddef>
-#include <cassert>
-#include <cstdio>
-#include <climits>
-#include <string>
-#include <stdexcept>
-#include <iterator>
-#include <algorithm>
-#include <iosfwd>
-#include <vector>
-#include <set>
-#include <map>
-#include <boost/limits.hpp>
-#include <boost/assert.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/throw_exception.hpp>
-#include <boost/scoped_ptr.hpp>
-#include <boost/scoped_array.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/mpl/bool_fwd.hpp>
-#include <boost/regex/config.hpp>
-#ifndef BOOST_NO_STD_LOCALE
-# include <locale>
-#endif
-
-#if defined(BOOST_NO_STDC_NAMESPACE)
-namespace std{
- using ::sprintf; using ::strcpy; using ::strcat; using ::strlen;
-}
-#endif
-
-namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
-#ifdef BOOST_NO_STD_DISTANCE
-template <class T>
-std::ptrdiff_t distance(const T& x, const T& y)
-{ return y - x; }
-#else
-using std::distance;
-#endif
-}}
-
-
-#ifdef BOOST_REGEX_NO_BOOL
-# define BOOST_REGEX_MAKE_BOOL(x) static_cast<bool>((x) ? true : false)
-#else
-# define BOOST_REGEX_MAKE_BOOL(x) static_cast<bool>(x)
-#endif
-
-/*****************************************************************************
- *
- * Fix broken namespace support:
- *
- ****************************************************************************/
-
-#if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus)
-
-namespace std{
- using ::ptrdiff_t;
- using ::size_t;
- using ::abs;
- using ::memset;
- using ::memcpy;
-}
-
-#endif
-
-/*****************************************************************************
- *
- * helper functions pointer_construct/pointer_destroy:
- *
- ****************************************************************************/
-
-#ifdef __cplusplus
-namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
-
-#ifdef BOOST_MSVC
-#pragma warning (push)
-#pragma warning (disable : 4100)
-#endif
-
-template <class T>
-inline void pointer_destroy(T* p)
-{ p->~T(); (void)p; }
-
-#ifdef BOOST_MSVC
-#pragma warning (pop)
-#endif
-
-template <class T>
-inline void pointer_construct(T* p, const T& t)
-{ new (p) T(t); }
-
-}} // namespaces
-#endif
-
-/*****************************************************************************
- *
- * helper function copy:
- *
- ****************************************************************************/
-
-#ifdef __cplusplus
-namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
-#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && BOOST_WORKAROUND(BOOST_MSVC, <1600) && defined(_CPPLIB_VER) && defined(BOOST_DINKUMWARE_STDLIB) && !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION))
- //
- // MSVC 8 will either emit warnings or else refuse to compile
- // code that makes perfectly legitimate use of std::copy, when
- // the OutputIterator type is a user-defined class (apparently all user
- // defined iterators are "unsafe"). This code works around that:
- //
- template<class InputIterator, class OutputIterator>
- inline OutputIterator copy(
- InputIterator first,
- InputIterator last,
- OutputIterator dest
- )
- {
- return stdext::unchecked_copy(first, last, dest);
- }
- template<class InputIterator1, class InputIterator2>
- inline bool equal(
- InputIterator1 first,
- InputIterator1 last,
- InputIterator2 with
- )
- {
- return stdext::unchecked_equal(first, last, with);
- }
-#elif BOOST_WORKAROUND(BOOST_MSVC, > 1500)
- //
- // MSVC 10 will either emit warnings or else refuse to compile
- // code that makes perfectly legitimate use of std::copy, when
- // the OutputIterator type is a user-defined class (apparently all user
- // defined iterators are "unsafe"). What's more Microsoft have removed their
- // non-standard "unchecked" versions, even though their still in the MS
- // documentation!! Work around this as best we can:
- //
- template<class InputIterator, class OutputIterator>
- inline OutputIterator copy(
- InputIterator first,
- InputIterator last,
- OutputIterator dest
- )
- {
- while(first != last)
- *dest++ = *first++;
- return dest;
- }
- template<class InputIterator1, class InputIterator2>
- inline bool equal(
- InputIterator1 first,
- InputIterator1 last,
- InputIterator2 with
- )
- {
- while(first != last)
- if(*first++ != *with++) return false;
- return true;
- }
-#else
- using std::copy;
- using std::equal;
-#endif
-#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__
-
- // use safe versions of strcpy etc:
- using ::strcpy_s;
- using ::strcat_s;
-#else
- inline std::size_t strcpy_s(
- char *strDestination,
- std::size_t sizeInBytes,
- const char *strSource
- )
- {
- std::size_t lenSourceWithNull = std::strlen(strSource) + 1;
- if (lenSourceWithNull > sizeInBytes)
- return 1;
- std::memcpy(strDestination, strSource, lenSourceWithNull);
- return 0;
- }
- inline std::size_t strcat_s(
- char *strDestination,
- std::size_t sizeInBytes,
- const char *strSource
- )
- {
- std::size_t lenSourceWithNull = std::strlen(strSource) + 1;
- std::size_t lenDestination = std::strlen(strDestination);
- if (lenSourceWithNull + lenDestination > sizeInBytes)
- return 1;
- std::memcpy(strDestination + lenDestination, strSource, lenSourceWithNull);
- return 0;
- }
-
-#endif
-
- inline void overflow_error_if_not_zero(std::size_t i)
- {
- if(i)
- {
- std::overflow_error e("String buffer too small");
- boost::throw_exception(e);
- }
- }
-
-}} // namespaces
-
-#endif // __cplusplus
-
-#endif // include guard
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/states.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/states.hpp
deleted file mode 100644
index 86eb02b102..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/states.hpp
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE states.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares internal state machine structures.
- */
-
-#ifndef BOOST_REGEX_V4_STATES_HPP
-#define BOOST_REGEX_V4_STATES_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-namespace BOOST_REGEX_DETAIL_NS{
-
-/*** mask_type *******************************************************
-Whenever we have a choice of two alternatives, we use an array of bytes
-to indicate which of the two alternatives it is possible to take for any
-given input character. If mask_take is set, then we can take the next
-state, and if mask_skip is set then we can take the alternative.
-***********************************************************************/
-enum mask_type
-{
- mask_take = 1,
- mask_skip = 2,
- mask_init = 4,
- mask_any = mask_skip | mask_take,
- mask_all = mask_any
-};
-
-/*** helpers **********************************************************
-These helpers let us use function overload resolution to detect whether
-we have narrow or wide character strings:
-***********************************************************************/
-struct _narrow_type{};
-struct _wide_type{};
-template <class charT> struct is_byte;
-template<> struct is_byte<char> { typedef _narrow_type width_type; };
-template<> struct is_byte<unsigned char>{ typedef _narrow_type width_type; };
-template<> struct is_byte<signed char> { typedef _narrow_type width_type; };
-template <class charT> struct is_byte { typedef _wide_type width_type; };
-
-/*** enum syntax_element_type ******************************************
-Every record in the state machine falls into one of the following types:
-***********************************************************************/
-enum syntax_element_type
-{
- // start of a marked sub-expression, or perl-style (?...) extension
- syntax_element_startmark = 0,
- // end of a marked sub-expression, or perl-style (?...) extension
- syntax_element_endmark = syntax_element_startmark + 1,
- // any sequence of literal characters
- syntax_element_literal = syntax_element_endmark + 1,
- // start of line assertion: ^
- syntax_element_start_line = syntax_element_literal + 1,
- // end of line assertion $
- syntax_element_end_line = syntax_element_start_line + 1,
- // match any character: .
- syntax_element_wild = syntax_element_end_line + 1,
- // end of expression: we have a match when we get here
- syntax_element_match = syntax_element_wild + 1,
- // perl style word boundary: \b
- syntax_element_word_boundary = syntax_element_match + 1,
- // perl style within word boundary: \B
- syntax_element_within_word = syntax_element_word_boundary + 1,
- // start of word assertion: \<
- syntax_element_word_start = syntax_element_within_word + 1,
- // end of word assertion: \>
- syntax_element_word_end = syntax_element_word_start + 1,
- // start of buffer assertion: \`
- syntax_element_buffer_start = syntax_element_word_end + 1,
- // end of buffer assertion: \'
- syntax_element_buffer_end = syntax_element_buffer_start + 1,
- // backreference to previously matched sub-expression
- syntax_element_backref = syntax_element_buffer_end + 1,
- // either a wide character set [..] or one with multicharacter collating elements:
- syntax_element_long_set = syntax_element_backref + 1,
- // narrow character set: [...]
- syntax_element_set = syntax_element_long_set + 1,
- // jump to a new state in the machine:
- syntax_element_jump = syntax_element_set + 1,
- // choose between two production states:
- syntax_element_alt = syntax_element_jump + 1,
- // a repeat
- syntax_element_rep = syntax_element_alt + 1,
- // match a combining character sequence
- syntax_element_combining = syntax_element_rep + 1,
- // perl style soft buffer end: \z
- syntax_element_soft_buffer_end = syntax_element_combining + 1,
- // perl style continuation: \G
- syntax_element_restart_continue = syntax_element_soft_buffer_end + 1,
- // single character repeats:
- syntax_element_dot_rep = syntax_element_restart_continue + 1,
- syntax_element_char_rep = syntax_element_dot_rep + 1,
- syntax_element_short_set_rep = syntax_element_char_rep + 1,
- syntax_element_long_set_rep = syntax_element_short_set_rep + 1,
- // a backstep for lookbehind repeats:
- syntax_element_backstep = syntax_element_long_set_rep + 1,
- // an assertion that a mark was matched:
- syntax_element_assert_backref = syntax_element_backstep + 1,
- syntax_element_toggle_case = syntax_element_assert_backref + 1,
- // a recursive expression:
- syntax_element_recurse = syntax_element_toggle_case + 1,
- // Verbs:
- syntax_element_fail = syntax_element_recurse + 1,
- syntax_element_accept = syntax_element_fail + 1,
- syntax_element_commit = syntax_element_accept + 1,
- syntax_element_then = syntax_element_commit + 1
-};
-
-#ifdef BOOST_REGEX_DEBUG
-// dwa 09/26/00 - This is needed to suppress warnings about an ambiguous conversion
-std::ostream& operator<<(std::ostream&, syntax_element_type);
-#endif
-
-struct re_syntax_base;
-
-/*** union offset_type ************************************************
-Points to another state in the machine. During machine construction
-we use integral offsets, but these are converted to pointers before
-execution of the machine.
-***********************************************************************/
-union offset_type
-{
- re_syntax_base* p;
- std::ptrdiff_t i;
-};
-
-/*** struct re_syntax_base ********************************************
-Base class for all states in the machine.
-***********************************************************************/
-struct re_syntax_base
-{
- syntax_element_type type; // what kind of state this is
- offset_type next; // next state in the machine
-};
-
-/*** struct re_brace **************************************************
-A marked parenthesis.
-***********************************************************************/
-struct re_brace : public re_syntax_base
-{
- // The index to match, can be zero (don't mark the sub-expression)
- // or negative (for perl style (?...) extensions):
- int index;
- bool icase;
-};
-
-/*** struct re_dot **************************************************
-Match anything.
-***********************************************************************/
-enum
-{
- dont_care = 1,
- force_not_newline = 0,
- force_newline = 2,
-
- test_not_newline = 2,
- test_newline = 3
-};
-struct re_dot : public re_syntax_base
-{
- unsigned char mask;
-};
-
-/*** struct re_literal ************************************************
-A string of literals, following this structure will be an
-array of characters: charT[length]
-***********************************************************************/
-struct re_literal : public re_syntax_base
-{
- unsigned int length;
-};
-
-/*** struct re_case ************************************************
-Indicates whether we are moving to a case insensive block or not
-***********************************************************************/
-struct re_case : public re_syntax_base
-{
- bool icase;
-};
-
-/*** struct re_set_long ***********************************************
-A wide character set of characters, following this structure will be
-an array of type charT:
-First csingles null-terminated strings
-Then 2 * cranges NULL terminated strings
-Then cequivalents NULL terminated strings
-***********************************************************************/
-template <class mask_type>
-struct re_set_long : public re_syntax_base
-{
- unsigned int csingles, cranges, cequivalents;
- mask_type cclasses;
- mask_type cnclasses;
- bool isnot;
- bool singleton;
-};
-
-/*** struct re_set ****************************************************
-A set of narrow-characters, matches any of _map which is none-zero
-***********************************************************************/
-struct re_set : public re_syntax_base
-{
- unsigned char _map[1 << CHAR_BIT];
-};
-
-/*** struct re_jump ***************************************************
-Jump to a new location in the machine (not next).
-***********************************************************************/
-struct re_jump : public re_syntax_base
-{
- offset_type alt; // location to jump to
-};
-
-/*** struct re_alt ***************************************************
-Jump to a new location in the machine (possibly next).
-***********************************************************************/
-struct re_alt : public re_jump
-{
- unsigned char _map[1 << CHAR_BIT]; // which characters can take the jump
- unsigned int can_be_null; // true if we match a NULL string
-};
-
-/*** struct re_repeat *************************************************
-Repeat a section of the machine
-***********************************************************************/
-struct re_repeat : public re_alt
-{
- std::size_t min, max; // min and max allowable repeats
- int state_id; // Unique identifier for this repeat
- bool leading; // True if this repeat is at the start of the machine (lets us optimize some searches)
- bool greedy; // True if this is a greedy repeat
-};
-
-/*** struct re_recurse ************************************************
-Recurse to a particular subexpression.
-**********************************************************************/
-struct re_recurse : public re_jump
-{
- int state_id; // identifier of first nested repeat within the recursion.
-};
-
-/*** struct re_commit *************************************************
-Used for the PRUNE, SKIP and COMMIT verbs which basically differ only in what happens
-if no match is found and we start searching forward.
-**********************************************************************/
-enum commit_type
-{
- commit_prune,
- commit_skip,
- commit_commit
-};
-struct re_commit : public re_syntax_base
-{
- commit_type action;
-};
-
-/*** enum re_jump_size_type *******************************************
-Provides compiled size of re_jump structure (allowing for trailing alignment).
-We provide this so we know how manybytes to insert when constructing the machine
-(The value of padding_mask is defined in regex_raw_buffer.hpp).
-***********************************************************************/
-enum re_jump_size_type
-{
- re_jump_size = (sizeof(re_jump) + padding_mask) & ~(padding_mask),
- re_repeater_size = (sizeof(re_repeat) + padding_mask) & ~(padding_mask),
- re_alt_size = (sizeof(re_alt) + padding_mask) & ~(padding_mask)
-};
-
-/*** proc re_is_set_member *********************************************
-Forward declaration: we'll need this one later...
-***********************************************************************/
-
-template<class charT, class traits>
-struct regex_data;
-
-template <class iterator, class charT, class traits_type, class char_classT>
-iterator BOOST_REGEX_CALL re_is_set_member(iterator next,
- iterator last,
- const re_set_long<char_classT>* set_,
- const regex_data<charT, traits_type>& e, bool icase);
-
-} // namespace BOOST_REGEX_DETAIL_NS
-
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/sub_match.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/sub_match.hpp
deleted file mode 100644
index 30a580d523..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/sub_match.hpp
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- *
- * Copyright (c) 1998-2002
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE sub_match.cpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares template class sub_match.
- */
-
-#ifndef BOOST_REGEX_V4_SUB_MATCH_HPP
-#define BOOST_REGEX_V4_SUB_MATCH_HPP
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-namespace boost{
-
-template <class BidiIterator>
-struct sub_match : public std::pair<BidiIterator, BidiIterator>
-{
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidiIterator>::value_type value_type;
-#if defined(BOOST_NO_STD_ITERATOR_TRAITS)
- typedef std::ptrdiff_t difference_type;
-#else
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidiIterator>::difference_type difference_type;
-#endif
- typedef BidiIterator iterator_type;
- typedef BidiIterator iterator;
- typedef BidiIterator const_iterator;
-
- bool matched;
-
- sub_match() : std::pair<BidiIterator, BidiIterator>(), matched(false) {}
- sub_match(BidiIterator i) : std::pair<BidiIterator, BidiIterator>(i, i), matched(false) {}
-#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
- && !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)\
- && !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
- template <class T, class A>
- operator std::basic_string<value_type, T, A> ()const
- {
- return matched ? std::basic_string<value_type, T, A>(this->first, this->second) : std::basic_string<value_type, T, A>();
- }
-#else
- operator std::basic_string<value_type> ()const
- {
- return str();
- }
-#endif
- difference_type BOOST_REGEX_CALL length()const
- {
- difference_type n = matched ? ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)this->first, (BidiIterator)this->second) : 0;
- return n;
- }
- std::basic_string<value_type> str()const
- {
- std::basic_string<value_type> result;
- if(matched)
- {
- std::size_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)this->first, (BidiIterator)this->second);
- result.reserve(len);
- BidiIterator i = this->first;
- while(i != this->second)
- {
- result.append(1, *i);
- ++i;
- }
- }
- return result;
- }
- int compare(const sub_match& s)const
- {
- if(matched != s.matched)
- return static_cast<int>(matched) - static_cast<int>(s.matched);
- return str().compare(s.str());
- }
- int compare(const std::basic_string<value_type>& s)const
- {
- return str().compare(s);
- }
- int compare(const value_type* p)const
- {
- return str().compare(p);
- }
-
- bool operator==(const sub_match& that)const
- { return compare(that) == 0; }
- bool BOOST_REGEX_CALL operator !=(const sub_match& that)const
- { return compare(that) != 0; }
- bool operator<(const sub_match& that)const
- { return compare(that) < 0; }
- bool operator>(const sub_match& that)const
- { return compare(that) > 0; }
- bool operator<=(const sub_match& that)const
- { return compare(that) <= 0; }
- bool operator>=(const sub_match& that)const
- { return compare(that) >= 0; }
-
-#ifdef BOOST_REGEX_MATCH_EXTRA
- typedef std::vector<sub_match<BidiIterator> > capture_sequence_type;
-
- const capture_sequence_type& captures()const
- {
- if(!m_captures)
- m_captures.reset(new capture_sequence_type());
- return *m_captures;
- }
- //
- // Private implementation API: DO NOT USE!
- //
- capture_sequence_type& get_captures()const
- {
- if(!m_captures)
- m_captures.reset(new capture_sequence_type());
- return *m_captures;
- }
-
-private:
- mutable boost::scoped_ptr<capture_sequence_type> m_captures;
-public:
-
-#endif
- sub_match(const sub_match& that, bool
-#ifdef BOOST_REGEX_MATCH_EXTRA
- deep_copy
-#endif
- = true
- )
- : std::pair<BidiIterator, BidiIterator>(that),
- matched(that.matched)
- {
-#ifdef BOOST_REGEX_MATCH_EXTRA
- if(that.m_captures)
- if(deep_copy)
- m_captures.reset(new capture_sequence_type(*(that.m_captures)));
-#endif
- }
- sub_match& operator=(const sub_match& that)
- {
- this->first = that.first;
- this->second = that.second;
- matched = that.matched;
-#ifdef BOOST_REGEX_MATCH_EXTRA
- if(that.m_captures)
- get_captures() = *(that.m_captures);
-#endif
- return *this;
- }
- //
- // Make this type a range, for both Boost.Range, and C++11:
- //
- BidiIterator begin()const { return this->first; }
- BidiIterator end()const { return this->second; }
-
-
-#ifdef BOOST_OLD_REGEX_H
- //
- // the following are deprecated, do not use!!
- //
- operator int()const;
- operator unsigned int()const;
- operator short()const
- {
- return (short)(int)(*this);
- }
- operator unsigned short()const
- {
- return (unsigned short)(unsigned int)(*this);
- }
-#endif
-};
-
-typedef sub_match<const char*> csub_match;
-typedef sub_match<std::string::const_iterator> ssub_match;
-#ifndef BOOST_NO_WREGEX
-typedef sub_match<const wchar_t*> wcsub_match;
-typedef sub_match<std::wstring::const_iterator> wssub_match;
-#endif
-
-// comparison to std::basic_string<> part 1:
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator == (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
- const sub_match<RandomAccessIterator>& m)
-{ return s.compare(m.str()) == 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator != (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
- const sub_match<RandomAccessIterator>& m)
-{ return s.compare(m.str()) != 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator < (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
- const sub_match<RandomAccessIterator>& m)
-{ return s.compare(m.str()) < 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator <= (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
- const sub_match<RandomAccessIterator>& m)
-{ return s.compare(m.str()) <= 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator >= (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
- const sub_match<RandomAccessIterator>& m)
-{ return s.compare(m.str()) >= 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator > (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
- const sub_match<RandomAccessIterator>& m)
-{ return s.compare(m.str()) > 0; }
-// comparison to std::basic_string<> part 2:
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator == (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
-{ return m.str().compare(s) == 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator != (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
-{ return m.str().compare(s) != 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator < (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
-{ return m.str().compare(s) < 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator > (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
-{ return m.str().compare(s) > 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator <= (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
-{ return m.str().compare(s) <= 0; }
-template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator >= (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
-{ return m.str().compare(s) >= 0; }
-// comparison to const charT* part 1:
-template <class RandomAccessIterator>
-inline bool operator == (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
-{ return m.str().compare(s) == 0; }
-template <class RandomAccessIterator>
-inline bool operator != (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
-{ return m.str().compare(s) != 0; }
-template <class RandomAccessIterator>
-inline bool operator > (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
-{ return m.str().compare(s) > 0; }
-template <class RandomAccessIterator>
-inline bool operator < (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
-{ return m.str().compare(s) < 0; }
-template <class RandomAccessIterator>
-inline bool operator >= (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
-{ return m.str().compare(s) >= 0; }
-template <class RandomAccessIterator>
-inline bool operator <= (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
-{ return m.str().compare(s) <= 0; }
-// comparison to const charT* part 2:
-template <class RandomAccessIterator>
-inline bool operator == (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(s) == 0; }
-template <class RandomAccessIterator>
-inline bool operator != (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(s) != 0; }
-template <class RandomAccessIterator>
-inline bool operator < (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(s) > 0; }
-template <class RandomAccessIterator>
-inline bool operator > (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(s) < 0; }
-template <class RandomAccessIterator>
-inline bool operator <= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(s) >= 0; }
-template <class RandomAccessIterator>
-inline bool operator >= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(s) <= 0; }
-
-// comparison to const charT& part 1:
-template <class RandomAccessIterator>
-inline bool operator == (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
-{ return m.str().compare(0, m.length(), &s, 1) == 0; }
-template <class RandomAccessIterator>
-inline bool operator != (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
-{ return m.str().compare(0, m.length(), &s, 1) != 0; }
-template <class RandomAccessIterator>
-inline bool operator > (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
-{ return m.str().compare(0, m.length(), &s, 1) > 0; }
-template <class RandomAccessIterator>
-inline bool operator < (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
-{ return m.str().compare(0, m.length(), &s, 1) < 0; }
-template <class RandomAccessIterator>
-inline bool operator >= (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
-{ return m.str().compare(0, m.length(), &s, 1) >= 0; }
-template <class RandomAccessIterator>
-inline bool operator <= (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
-{ return m.str().compare(0, m.length(), &s, 1) <= 0; }
-// comparison to const charT* part 2:
-template <class RandomAccessIterator>
-inline bool operator == (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(0, m.length(), &s, 1) == 0; }
-template <class RandomAccessIterator>
-inline bool operator != (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(0, m.length(), &s, 1) != 0; }
-template <class RandomAccessIterator>
-inline bool operator < (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(0, m.length(), &s, 1) > 0; }
-template <class RandomAccessIterator>
-inline bool operator > (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(0, m.length(), &s, 1) < 0; }
-template <class RandomAccessIterator>
-inline bool operator <= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(0, m.length(), &s, 1) >= 0; }
-template <class RandomAccessIterator>
-inline bool operator >= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
- const sub_match<RandomAccessIterator>& m)
-{ return m.str().compare(0, m.length(), &s, 1) <= 0; }
-
-// addition operators:
-template <class RandomAccessIterator, class traits, class Allocator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
-operator + (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
- const sub_match<RandomAccessIterator>& m)
-{
- std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
- result.reserve(s.size() + m.length() + 1);
- return result.append(s).append(m.first, m.second);
-}
-template <class RandomAccessIterator, class traits, class Allocator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
-operator + (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
-{
- std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
- result.reserve(s.size() + m.length() + 1);
- return result.append(m.first, m.second).append(s);
-}
-#if !(defined(__GNUC__) && defined(BOOST_NO_STD_LOCALE))
-template <class RandomAccessIterator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{
- std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
- result.reserve(std::char_traits<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
- return result.append(s).append(m.first, m.second);
-}
-template <class RandomAccessIterator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
-{
- std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
- result.reserve(std::char_traits<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
- return result.append(m.first, m.second).append(s);
-}
-#else
-// worwaround versions:
-template <class RandomAccessIterator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
- const sub_match<RandomAccessIterator>& m)
-{
- return s + m.str();
-}
-template <class RandomAccessIterator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
-{
- return m.str() + s;
-}
-#endif
-template <class RandomAccessIterator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
- const sub_match<RandomAccessIterator>& m)
-{
- std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
- result.reserve(m.length() + 2);
- return result.append(1, s).append(m.first, m.second);
-}
-template <class RandomAccessIterator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (const sub_match<RandomAccessIterator>& m,
- typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
-{
- std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
- result.reserve(m.length() + 2);
- return result.append(m.first, m.second).append(1, s);
-}
-template <class RandomAccessIterator>
-inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (const sub_match<RandomAccessIterator>& m1,
- const sub_match<RandomAccessIterator>& m2)
-{
- std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
- result.reserve(m1.length() + m2.length() + 1);
- return result.append(m1.first, m1.second).append(m2.first, m2.second);
-}
-#ifndef BOOST_NO_STD_LOCALE
-template <class charT, class traits, class RandomAccessIterator>
-std::basic_ostream<charT, traits>&
- operator << (std::basic_ostream<charT, traits>& os,
- const sub_match<RandomAccessIterator>& s)
-{
- return (os << s.str());
-}
-#else
-template <class RandomAccessIterator>
-std::ostream& operator << (std::ostream& os,
- const sub_match<RandomAccessIterator>& s)
-{
- return (os << s.str());
-}
-#endif
-
-#ifdef BOOST_OLD_REGEX_H
-namespace BOOST_REGEX_DETAIL_NS{
-template <class BidiIterator, class charT>
-int do_toi(BidiIterator i, BidiIterator j, char c, int radix)
-{
- std::string s(i, j);
- char* p;
- int result = std::strtol(s.c_str(), &p, radix);
- if(*p)raise_regex_exception("Bad sub-expression");
- return result;
-}
-
-//
-// helper:
-template <class I, class charT>
-int do_toi(I& i, I j, charT c)
-{
- int result = 0;
- while((i != j) && (isdigit(*i)))
- {
- result = result*10 + (*i - '0');
- ++i;
- }
- return result;
-}
-}
-
-
-template <class BidiIterator>
-sub_match<BidiIterator>::operator int()const
-{
- BidiIterator i = first;
- BidiIterator j = second;
- if(i == j)raise_regex_exception("Bad sub-expression");
- int neg = 1;
- if((i != j) && (*i == '-'))
- {
- neg = -1;
- ++i;
- }
- neg *= BOOST_REGEX_DETAIL_NS::do_toi(i, j, *i);
- if(i != j)raise_regex_exception("Bad sub-expression");
- return neg;
-}
-template <class BidiIterator>
-sub_match<BidiIterator>::operator unsigned int()const
-{
- BidiIterator i = first;
- BidiIterator j = second;
- if(i == j)
- raise_regex_exception("Bad sub-expression");
- return BOOST_REGEX_DETAIL_NS::do_toi(i, j, *first);
-}
-#endif
-
-} // namespace boost
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/syntax_type.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/syntax_type.hpp
deleted file mode 100644
index 3efdf0b0f9..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/syntax_type.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *
- * Copyright (c) 2003
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE syntax_type.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares regular expression synatx type enumerator.
- */
-
-#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
-#define BOOST_REGEX_SYNTAX_TYPE_HPP
-
-namespace boost{
-namespace regex_constants{
-
-typedef unsigned char syntax_type;
-
-//
-// values chosen are binary compatible with previous version:
-//
-static const syntax_type syntax_char = 0;
-static const syntax_type syntax_open_mark = 1;
-static const syntax_type syntax_close_mark = 2;
-static const syntax_type syntax_dollar = 3;
-static const syntax_type syntax_caret = 4;
-static const syntax_type syntax_dot = 5;
-static const syntax_type syntax_star = 6;
-static const syntax_type syntax_plus = 7;
-static const syntax_type syntax_question = 8;
-static const syntax_type syntax_open_set = 9;
-static const syntax_type syntax_close_set = 10;
-static const syntax_type syntax_or = 11;
-static const syntax_type syntax_escape = 12;
-static const syntax_type syntax_dash = 14;
-static const syntax_type syntax_open_brace = 15;
-static const syntax_type syntax_close_brace = 16;
-static const syntax_type syntax_digit = 17;
-static const syntax_type syntax_comma = 27;
-static const syntax_type syntax_equal = 37;
-static const syntax_type syntax_colon = 36;
-static const syntax_type syntax_not = 53;
-
-// extensions:
-
-static const syntax_type syntax_hash = 13;
-static const syntax_type syntax_newline = 26;
-
-// escapes:
-
-typedef syntax_type escape_syntax_type;
-
-static const escape_syntax_type escape_type_word_assert = 18;
-static const escape_syntax_type escape_type_not_word_assert = 19;
-static const escape_syntax_type escape_type_control_f = 29;
-static const escape_syntax_type escape_type_control_n = 30;
-static const escape_syntax_type escape_type_control_r = 31;
-static const escape_syntax_type escape_type_control_t = 32;
-static const escape_syntax_type escape_type_control_v = 33;
-static const escape_syntax_type escape_type_ascii_control = 35;
-static const escape_syntax_type escape_type_hex = 34;
-static const escape_syntax_type escape_type_unicode = 0; // not used
-static const escape_syntax_type escape_type_identity = 0; // not used
-static const escape_syntax_type escape_type_backref = syntax_digit;
-static const escape_syntax_type escape_type_decimal = syntax_digit; // not used
-static const escape_syntax_type escape_type_class = 22;
-static const escape_syntax_type escape_type_not_class = 23;
-
-// extensions:
-
-static const escape_syntax_type escape_type_left_word = 20;
-static const escape_syntax_type escape_type_right_word = 21;
-static const escape_syntax_type escape_type_start_buffer = 24; // for \`
-static const escape_syntax_type escape_type_end_buffer = 25; // for \'
-static const escape_syntax_type escape_type_control_a = 28; // for \a
-static const escape_syntax_type escape_type_e = 38; // for \e
-static const escape_syntax_type escape_type_E = 47; // for \Q\E
-static const escape_syntax_type escape_type_Q = 48; // for \Q\E
-static const escape_syntax_type escape_type_X = 49; // for \X
-static const escape_syntax_type escape_type_C = 50; // for \C
-static const escape_syntax_type escape_type_Z = 51; // for \Z
-static const escape_syntax_type escape_type_G = 52; // for \G
-
-static const escape_syntax_type escape_type_property = 54; // for \p
-static const escape_syntax_type escape_type_not_property = 55; // for \P
-static const escape_syntax_type escape_type_named_char = 56; // for \N
-static const escape_syntax_type escape_type_extended_backref = 57; // for \g
-static const escape_syntax_type escape_type_reset_start_mark = 58; // for \K
-static const escape_syntax_type escape_type_line_ending = 59; // for \R
-
-static const escape_syntax_type syntax_max = 60;
-
-}
-}
-
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_iterator.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_iterator.hpp
deleted file mode 100644
index f8763a8d6a..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_iterator.hpp
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- *
- * Copyright (c) 2003
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE u32regex_iterator.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides u32regex_iterator implementation.
- */
-
-#ifndef BOOST_REGEX_V4_U32REGEX_ITERATOR_HPP
-#define BOOST_REGEX_V4_U32REGEX_ITERATOR_HPP
-
-namespace boost{
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-
-template <class BidirectionalIterator>
-class u32regex_iterator_implementation
-{
- typedef u32regex regex_type;
-
- match_results<BidirectionalIterator> what; // current match
- BidirectionalIterator base; // start of sequence
- BidirectionalIterator end; // end of sequence
- const regex_type re; // the expression
- match_flag_type flags; // flags for matching
-
-public:
- u32regex_iterator_implementation(const regex_type* p, BidirectionalIterator last, match_flag_type f)
- : base(), end(last), re(*p), flags(f){}
- bool init(BidirectionalIterator first)
- {
- base = first;
- return u32regex_search(first, end, what, re, flags, base);
- }
- bool compare(const u32regex_iterator_implementation& that)
- {
- if(this == &that) return true;
- return (&re.get_data() == &that.re.get_data()) && (end == that.end) && (flags == that.flags) && (what[0].first == that.what[0].first) && (what[0].second == that.what[0].second);
- }
- const match_results<BidirectionalIterator>& get()
- { return what; }
- bool next()
- {
- //if(what.prefix().first != what[0].second)
- // flags |= match_prev_avail;
- BidirectionalIterator next_start = what[0].second;
- match_flag_type f(flags);
- if(!what.length())
- f |= regex_constants::match_not_initial_null;
- //if(base != next_start)
- // f |= regex_constants::match_not_bob;
- bool result = u32regex_search(next_start, end, what, re, f, base);
- if(result)
- what.set_base(base);
- return result;
- }
-private:
- u32regex_iterator_implementation& operator=(const u32regex_iterator_implementation&);
-};
-
-template <class BidirectionalIterator>
-class u32regex_iterator
-{
-private:
- typedef u32regex_iterator_implementation<BidirectionalIterator> impl;
- typedef shared_ptr<impl> pimpl;
-public:
- typedef u32regex regex_type;
- typedef match_results<BidirectionalIterator> value_type;
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
- difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef std::forward_iterator_tag iterator_category;
-
- u32regex_iterator(){}
- u32regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
- const regex_type& re,
- match_flag_type m = match_default)
- : pdata(new impl(&re, b, m))
- {
- if(!pdata->init(a))
- {
- pdata.reset();
- }
- }
- u32regex_iterator(const u32regex_iterator& that)
- : pdata(that.pdata) {}
- u32regex_iterator& operator=(const u32regex_iterator& that)
- {
- pdata = that.pdata;
- return *this;
- }
- bool operator==(const u32regex_iterator& that)const
- {
- if((pdata.get() == 0) || (that.pdata.get() == 0))
- return pdata.get() == that.pdata.get();
- return pdata->compare(*(that.pdata.get()));
- }
- bool operator!=(const u32regex_iterator& that)const
- { return !(*this == that); }
- const value_type& operator*()const
- { return pdata->get(); }
- const value_type* operator->()const
- { return &(pdata->get()); }
- u32regex_iterator& operator++()
- {
- cow();
- if(0 == pdata->next())
- {
- pdata.reset();
- }
- return *this;
- }
- u32regex_iterator operator++(int)
- {
- u32regex_iterator result(*this);
- ++(*this);
- return result;
- }
-private:
-
- pimpl pdata;
-
- void cow()
- {
- // copy-on-write
- if(pdata.get() && !pdata.unique())
- {
- pdata.reset(new impl(*(pdata.get())));
- }
- }
-};
-
-typedef u32regex_iterator<const char*> utf8regex_iterator;
-typedef u32regex_iterator<const UChar*> utf16regex_iterator;
-typedef u32regex_iterator<const UChar32*> utf32regex_iterator;
-
-inline u32regex_iterator<const char*> make_u32regex_iterator(const char* p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_iterator<const char*>(p, p+std::strlen(p), e, m);
-}
-#ifndef BOOST_NO_WREGEX
-inline u32regex_iterator<const wchar_t*> make_u32regex_iterator(const wchar_t* p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_iterator<const wchar_t*>(p, p+std::wcslen(p), e, m);
-}
-#endif
-#if !defined(BOOST_REGEX_UCHAR_IS_WCHAR_T)
-inline u32regex_iterator<const UChar*> make_u32regex_iterator(const UChar* p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_iterator<const UChar*>(p, p+u_strlen(p), e, m);
-}
-#endif
-template <class charT, class Traits, class Alloc>
-inline u32regex_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
- return u32regex_iterator<iter_type>(p.begin(), p.end(), e, m);
-}
-inline u32regex_iterator<const UChar*> make_u32regex_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, m);
-}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_ITERATOR_HPP
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_token_iterator.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_token_iterator.hpp
deleted file mode 100644
index 2e04810dff..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/u32regex_token_iterator.hpp
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- *
- * Copyright (c) 2003
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE u32regex_token_iterator.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Provides u32regex_token_iterator implementation.
- */
-
-#ifndef BOOST_REGEX_V4_U32REGEX_TOKEN_ITERATOR_HPP
-#define BOOST_REGEX_V4_U32REGEX_TOKEN_ITERATOR_HPP
-
-#if (BOOST_WORKAROUND(BOOST_BORLANDC, >= 0x560) && BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x570)))\
- || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
-//
-// Borland C++ Builder 6, and Visual C++ 6,
-// can't cope with the array template constructor
-// so we have a template member that will accept any type as
-// argument, and then assert that is really is an array:
-//
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_array.hpp>
-#endif
-
-namespace boost{
-
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4700)
-#endif
-
-template <class BidirectionalIterator>
-class u32regex_token_iterator_implementation
-{
- typedef u32regex regex_type;
- typedef sub_match<BidirectionalIterator> value_type;
-
- match_results<BidirectionalIterator> what; // current match
- BidirectionalIterator end; // end of search area
- BidirectionalIterator base; // start of search area
- const regex_type re; // the expression
- match_flag_type flags; // match flags
- value_type result; // the current string result
- int N; // the current sub-expression being enumerated
- std::vector<int> subs; // the sub-expressions to enumerate
-
-public:
- u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, int sub, match_flag_type f)
- : end(last), re(*p), flags(f){ subs.push_back(sub); }
- u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const std::vector<int>& v, match_flag_type f)
- : end(last), re(*p), flags(f), subs(v){}
-#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
- || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
- || BOOST_WORKAROUND(__HP_aCC, < 60700)
- template <class T>
- u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const T& submatches, match_flag_type f)
- : end(last), re(*p), flags(f)
- {
- // assert that T really is an array:
- BOOST_STATIC_ASSERT(::boost::is_array<T>::value);
- const std::size_t array_size = sizeof(T) / sizeof(submatches[0]);
- for(std::size_t i = 0; i < array_size; ++i)
- {
- subs.push_back(submatches[i]);
- }
- }
-#else
- template <std::size_t CN>
- u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const int (&submatches)[CN], match_flag_type f)
- : end(last), re(*p), flags(f)
- {
- for(std::size_t i = 0; i < CN; ++i)
- {
- subs.push_back(submatches[i]);
- }
- }
-#endif
-
- bool init(BidirectionalIterator first)
- {
- base = first;
- N = 0;
- if(u32regex_search(first, end, what, re, flags, base) == true)
- {
- N = 0;
- result = ((subs[N] == -1) ? what.prefix() : what[(int)subs[N]]);
- return true;
- }
- else if((subs[N] == -1) && (first != end))
- {
- result.first = first;
- result.second = end;
- result.matched = (first != end);
- N = -1;
- return true;
- }
- return false;
- }
- bool compare(const u32regex_token_iterator_implementation& that)
- {
- if(this == &that) return true;
- return (&re.get_data() == &that.re.get_data())
- && (end == that.end)
- && (flags == that.flags)
- && (N == that.N)
- && (what[0].first == that.what[0].first)
- && (what[0].second == that.what[0].second);
- }
- const value_type& get()
- { return result; }
- bool next()
- {
- if(N == -1)
- return false;
- if(N+1 < (int)subs.size())
- {
- ++N;
- result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
- return true;
- }
- //if(what.prefix().first != what[0].second)
- // flags |= match_prev_avail | regex_constants::match_not_bob;
- BidirectionalIterator last_end(what[0].second);
- if(u32regex_search(last_end, end, what, re, ((what[0].first == what[0].second) ? flags | regex_constants::match_not_initial_null : flags), base))
- {
- N =0;
- result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
- return true;
- }
- else if((last_end != end) && (subs[0] == -1))
- {
- N =-1;
- result.first = last_end;
- result.second = end;
- result.matched = (last_end != end);
- return true;
- }
- return false;
- }
-private:
- u32regex_token_iterator_implementation& operator=(const u32regex_token_iterator_implementation&);
-};
-
-template <class BidirectionalIterator>
-class u32regex_token_iterator
-{
-private:
- typedef u32regex_token_iterator_implementation<BidirectionalIterator> impl;
- typedef shared_ptr<impl> pimpl;
-public:
- typedef u32regex regex_type;
- typedef sub_match<BidirectionalIterator> value_type;
- typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
- difference_type;
- typedef const value_type* pointer;
- typedef const value_type& reference;
- typedef std::forward_iterator_tag iterator_category;
-
- u32regex_token_iterator(){}
- u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- int submatch = 0, match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatch, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
- u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- const std::vector<int>& submatches, match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatches, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
-#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
- || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
- || BOOST_WORKAROUND(__HP_aCC, < 60700)
- template <class T>
- u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- const T& submatches, match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatches, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
-#else
- template <std::size_t N>
- u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
- const int (&submatches)[N], match_flag_type m = match_default)
- : pdata(new impl(&re, b, submatches, m))
- {
- if(!pdata->init(a))
- pdata.reset();
- }
-#endif
- u32regex_token_iterator(const u32regex_token_iterator& that)
- : pdata(that.pdata) {}
- u32regex_token_iterator& operator=(const u32regex_token_iterator& that)
- {
- pdata = that.pdata;
- return *this;
- }
- bool operator==(const u32regex_token_iterator& that)const
- {
- if((pdata.get() == 0) || (that.pdata.get() == 0))
- return pdata.get() == that.pdata.get();
- return pdata->compare(*(that.pdata.get()));
- }
- bool operator!=(const u32regex_token_iterator& that)const
- { return !(*this == that); }
- const value_type& operator*()const
- { return pdata->get(); }
- const value_type* operator->()const
- { return &(pdata->get()); }
- u32regex_token_iterator& operator++()
- {
- cow();
- if(0 == pdata->next())
- {
- pdata.reset();
- }
- return *this;
- }
- u32regex_token_iterator operator++(int)
- {
- u32regex_token_iterator result(*this);
- ++(*this);
- return result;
- }
-private:
-
- pimpl pdata;
-
- void cow()
- {
- // copy-on-write
- if(pdata.get() && !pdata.unique())
- {
- pdata.reset(new impl(*(pdata.get())));
- }
- }
-};
-
-typedef u32regex_token_iterator<const char*> utf8regex_token_iterator;
-typedef u32regex_token_iterator<const UChar*> utf16regex_token_iterator;
-typedef u32regex_token_iterator<const UChar32*> utf32regex_token_iterator;
-
-// construction from an integral sub_match state_id:
-inline u32regex_token_iterator<const char*> make_u32regex_token_iterator(const char* p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const char*>(p, p+std::strlen(p), e, submatch, m);
-}
-#ifndef BOOST_NO_WREGEX
-inline u32regex_token_iterator<const wchar_t*> make_u32regex_token_iterator(const wchar_t* p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const wchar_t*>(p, p+std::wcslen(p), e, submatch, m);
-}
-#endif
-#if !defined(BOOST_REGEX_UCHAR_IS_WCHAR_T)
-inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UChar* p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const UChar*>(p, p+u_strlen(p), e, submatch, m);
-}
-#endif
-template <class charT, class Traits, class Alloc>
-inline u32regex_token_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_token_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
- return u32regex_token_iterator<iter_type>(p.begin(), p.end(), e, submatch, m);
-}
-inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m);
-}
-
-// construction from a reference to an array:
-template <std::size_t N>
-inline u32regex_token_iterator<const char*> make_u32regex_token_iterator(const char* p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const char*>(p, p+std::strlen(p), e, submatch, m);
-}
-#ifndef BOOST_NO_WREGEX
-template <std::size_t N>
-inline u32regex_token_iterator<const wchar_t*> make_u32regex_token_iterator(const wchar_t* p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const wchar_t*>(p, p+std::wcslen(p), e, submatch, m);
-}
-#endif
-#if !defined(BOOST_REGEX_UCHAR_IS_WCHAR_T)
-template <std::size_t N>
-inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UChar* p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const UChar*>(p, p+u_strlen(p), e, submatch, m);
-}
-#endif
-template <class charT, class Traits, class Alloc, std::size_t N>
-inline u32regex_token_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_token_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
-{
- typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
- return u32regex_token_iterator<iter_type>(p.begin(), p.end(), e, submatch, m);
-}
-template <std::size_t N>
-inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m);
-}
-
-// construction from a vector of sub_match state_id's:
-inline u32regex_token_iterator<const char*> make_u32regex_token_iterator(const char* p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const char*>(p, p+std::strlen(p), e, submatch, m);
-}
-#ifndef BOOST_NO_WREGEX
-inline u32regex_token_iterator<const wchar_t*> make_u32regex_token_iterator(const wchar_t* p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const wchar_t*>(p, p+std::wcslen(p), e, submatch, m);
-}
-#endif
-#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2)
-inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UChar* p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const UChar*>(p, p+u_strlen(p), e, submatch, m);
-}
-#endif
-template <class charT, class Traits, class Alloc>
-inline u32regex_token_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_token_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
- return u32regex_token_iterator<iter_type>(p.begin(), p.end(), e, submatch, m);
-}
-inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
-{
- return u32regex_token_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m);
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-
-} // namespace boost
-
-#endif // BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
-
-
-
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/unicode_iterator.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/unicode_iterator.hpp
deleted file mode 100644
index 985aa72b20..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/unicode_iterator.hpp
+++ /dev/null
@@ -1,871 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE unicode_iterator.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Iterator adapters for converting between different Unicode encodings.
- */
-
-/****************************************************************************
-
-Contents:
-~~~~~~~~~
-
-1) Read Only, Input Adapters:
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-template <class BaseIterator, class U8Type = ::boost::uint8_t>
-class u32_to_u8_iterator;
-
-Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-8.
-
-template <class BaseIterator, class U32Type = ::boost::uint32_t>
-class u8_to_u32_iterator;
-
-Adapts sequence of UTF-8 code points to "look like" a sequence of UTF-32.
-
-template <class BaseIterator, class U16Type = ::boost::uint16_t>
-class u32_to_u16_iterator;
-
-Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-16.
-
-template <class BaseIterator, class U32Type = ::boost::uint32_t>
-class u16_to_u32_iterator;
-
-Adapts sequence of UTF-16 code points to "look like" a sequence of UTF-32.
-
-2) Single pass output iterator adapters:
-
-template <class BaseIterator>
-class utf8_output_iterator;
-
-Accepts UTF-32 code points and forwards them on as UTF-8 code points.
-
-template <class BaseIterator>
-class utf16_output_iterator;
-
-Accepts UTF-32 code points and forwards them on as UTF-16 code points.
-
-****************************************************************************/
-
-#ifndef BOOST_REGEX_V4_UNICODE_ITERATOR_HPP
-#define BOOST_REGEX_V4_UNICODE_ITERATOR_HPP
-#include <boost/cstdint.hpp>
-#include <boost/regex/config.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/throw_exception.hpp>
-#include <stdexcept>
-#ifndef BOOST_NO_STD_LOCALE
-#include <sstream>
-#include <ios>
-#endif
-#include <limits.h> // CHAR_BIT
-
-#ifdef BOOST_REGEX_CXX03
-
-#else
-#endif
-
-namespace boost{
-
-namespace detail{
-
-static const ::boost::uint16_t high_surrogate_base = 0xD7C0u;
-static const ::boost::uint16_t low_surrogate_base = 0xDC00u;
-static const ::boost::uint32_t ten_bit_mask = 0x3FFu;
-
-inline bool is_high_surrogate(::boost::uint16_t v)
-{
- return (v & 0xFFFFFC00u) == 0xd800u;
-}
-inline bool is_low_surrogate(::boost::uint16_t v)
-{
- return (v & 0xFFFFFC00u) == 0xdc00u;
-}
-template <class T>
-inline bool is_surrogate(T v)
-{
- return (v & 0xFFFFF800u) == 0xd800;
-}
-
-inline unsigned utf8_byte_count(boost::uint8_t c)
-{
- // if the most significant bit with a zero in it is in position
- // 8-N then there are N bytes in this UTF-8 sequence:
- boost::uint8_t mask = 0x80u;
- unsigned result = 0;
- while(c & mask)
- {
- ++result;
- mask >>= 1;
- }
- return (result == 0) ? 1 : ((result > 4) ? 4 : result);
-}
-
-inline unsigned utf8_trailing_byte_count(boost::uint8_t c)
-{
- return utf8_byte_count(c) - 1;
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4100)
-#endif
-#ifndef BOOST_NO_EXCEPTIONS
-BOOST_NORETURN
-#endif
-inline void invalid_utf32_code_point(::boost::uint32_t val)
-{
-#ifndef BOOST_NO_STD_LOCALE
- std::stringstream ss;
- ss << "Invalid UTF-32 code point U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-16 sequence";
- std::out_of_range e(ss.str());
-#else
- std::out_of_range e("Invalid UTF-32 code point encountered while trying to encode UTF-16 sequence");
-#endif
- boost::throw_exception(e);
-}
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-
-} // namespace detail
-
-template <class BaseIterator, class U16Type = ::boost::uint16_t>
-class u32_to_u16_iterator
-{
-#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
- typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
-
- BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
- BOOST_STATIC_ASSERT(sizeof(U16Type)*CHAR_BIT == 16);
-#endif
-
-public:
- typedef std::ptrdiff_t difference_type;
- typedef U16Type value_type;
- typedef value_type const* pointer;
- typedef value_type const reference;
- typedef std::bidirectional_iterator_tag iterator_category;
-
- reference operator*()const
- {
- if(m_current == 2)
- extract_current();
- return m_values[m_current];
- }
- bool operator==(const u32_to_u16_iterator& that)const
- {
- if(m_position == that.m_position)
- {
- // Both m_currents must be equal, or both even
- // this is the same as saying their sum must be even:
- return (m_current + that.m_current) & 1u ? false : true;
- }
- return false;
- }
- bool operator!=(const u32_to_u16_iterator& that)const
- {
- return !(*this == that);
- }
- u32_to_u16_iterator& operator++()
- {
- // if we have a pending read then read now, so that we know whether
- // to skip a position, or move to a low-surrogate:
- if(m_current == 2)
- {
- // pending read:
- extract_current();
- }
- // move to the next surrogate position:
- ++m_current;
- // if we've reached the end skip a position:
- if(m_values[m_current] == 0)
- {
- m_current = 2;
- ++m_position;
- }
- return *this;
- }
- u32_to_u16_iterator operator++(int)
- {
- u32_to_u16_iterator r(*this);
- ++(*this);
- return r;
- }
- u32_to_u16_iterator& operator--()
- {
- if(m_current != 1)
- {
- // decrementing an iterator always leads to a valid position:
- --m_position;
- extract_current();
- m_current = m_values[1] ? 1 : 0;
- }
- else
- {
- m_current = 0;
- }
- return *this;
- }
- u32_to_u16_iterator operator--(int)
- {
- u32_to_u16_iterator r(*this);
- --(*this);
- return r;
- }
- BaseIterator base()const
- {
- return m_position;
- }
- // construct:
- u32_to_u16_iterator() : m_position(), m_current(0)
- {
- m_values[0] = 0;
- m_values[1] = 0;
- m_values[2] = 0;
- }
- u32_to_u16_iterator(BaseIterator b) : m_position(b), m_current(2)
- {
- m_values[0] = 0;
- m_values[1] = 0;
- m_values[2] = 0;
- }
-private:
-
- void extract_current()const
- {
- // begin by checking for a code point out of range:
- ::boost::uint32_t v = *m_position;
- if(v >= 0x10000u)
- {
- if(v > 0x10FFFFu)
- detail::invalid_utf32_code_point(*m_position);
- // split into two surrogates:
- m_values[0] = static_cast<U16Type>(v >> 10) + detail::high_surrogate_base;
- m_values[1] = static_cast<U16Type>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
- m_current = 0;
- BOOST_REGEX_ASSERT(detail::is_high_surrogate(m_values[0]));
- BOOST_REGEX_ASSERT(detail::is_low_surrogate(m_values[1]));
- }
- else
- {
- // 16-bit code point:
- m_values[0] = static_cast<U16Type>(*m_position);
- m_values[1] = 0;
- m_current = 0;
- // value must not be a surrogate:
- if(detail::is_surrogate(m_values[0]))
- detail::invalid_utf32_code_point(*m_position);
- }
- }
- BaseIterator m_position;
- mutable U16Type m_values[3];
- mutable unsigned m_current;
-};
-
-template <class BaseIterator, class U32Type = ::boost::uint32_t>
-class u16_to_u32_iterator
-{
- // special values for pending iterator reads:
- BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
-
-#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
- typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
-
- BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 16);
- BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
-#endif
-
-public:
- typedef std::ptrdiff_t difference_type;
- typedef U32Type value_type;
- typedef value_type const* pointer;
- typedef value_type const reference;
- typedef std::bidirectional_iterator_tag iterator_category;
-
- reference operator*()const
- {
- if(m_value == pending_read)
- extract_current();
- return m_value;
- }
- bool operator==(const u16_to_u32_iterator& that)const
- {
- return m_position == that.m_position;
- }
- bool operator!=(const u16_to_u32_iterator& that)const
- {
- return !(*this == that);
- }
- u16_to_u32_iterator& operator++()
- {
- // skip high surrogate first if there is one:
- if(detail::is_high_surrogate(*m_position)) ++m_position;
- ++m_position;
- m_value = pending_read;
- return *this;
- }
- u16_to_u32_iterator operator++(int)
- {
- u16_to_u32_iterator r(*this);
- ++(*this);
- return r;
- }
- u16_to_u32_iterator& operator--()
- {
- --m_position;
- // if we have a low surrogate then go back one more:
- if(detail::is_low_surrogate(*m_position))
- --m_position;
- m_value = pending_read;
- return *this;
- }
- u16_to_u32_iterator operator--(int)
- {
- u16_to_u32_iterator r(*this);
- --(*this);
- return r;
- }
- BaseIterator base()const
- {
- return m_position;
- }
- // construct:
- u16_to_u32_iterator() : m_position()
- {
- m_value = pending_read;
- }
- u16_to_u32_iterator(BaseIterator b) : m_position(b)
- {
- m_value = pending_read;
- }
- //
- // Range checked version:
- //
- u16_to_u32_iterator(BaseIterator b, BaseIterator start, BaseIterator end) : m_position(b)
- {
- m_value = pending_read;
- //
- // The range must not start with a low surrogate, or end in a high surrogate,
- // otherwise we run the risk of running outside the underlying input range.
- // Likewise b must not be located at a low surrogate.
- //
- boost::uint16_t val;
- if(start != end)
- {
- if((b != start) && (b != end))
- {
- val = *b;
- if(detail::is_surrogate(val) && ((val & 0xFC00u) == 0xDC00u))
- invalid_code_point(val);
- }
- val = *start;
- if(detail::is_surrogate(val) && ((val & 0xFC00u) == 0xDC00u))
- invalid_code_point(val);
- val = *--end;
- if(detail::is_high_surrogate(val))
- invalid_code_point(val);
- }
- }
-private:
- static void invalid_code_point(::boost::uint16_t val)
- {
-#ifndef BOOST_NO_STD_LOCALE
- std::stringstream ss;
- ss << "Misplaced UTF-16 surrogate U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-32 sequence";
- std::out_of_range e(ss.str());
-#else
- std::out_of_range e("Misplaced UTF-16 surrogate encountered while trying to encode UTF-32 sequence");
-#endif
- boost::throw_exception(e);
- }
- void extract_current()const
- {
- m_value = static_cast<U32Type>(static_cast< ::boost::uint16_t>(*m_position));
- // if the last value is a high surrogate then adjust m_position and m_value as needed:
- if(detail::is_high_surrogate(*m_position))
- {
- // precondition; next value must have be a low-surrogate:
- BaseIterator next(m_position);
- ::boost::uint16_t t = *++next;
- if((t & 0xFC00u) != 0xDC00u)
- invalid_code_point(t);
- m_value = (m_value - detail::high_surrogate_base) << 10;
- m_value |= (static_cast<U32Type>(static_cast< ::boost::uint16_t>(t)) & detail::ten_bit_mask);
- }
- // postcondition; result must not be a surrogate:
- if(detail::is_surrogate(m_value))
- invalid_code_point(static_cast< ::boost::uint16_t>(m_value));
- }
- BaseIterator m_position;
- mutable U32Type m_value;
-};
-
-template <class BaseIterator, class U8Type = ::boost::uint8_t>
-class u32_to_u8_iterator
-{
-#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
- typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
-
- BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
- BOOST_STATIC_ASSERT(sizeof(U8Type)*CHAR_BIT == 8);
-#endif
-
-public:
- typedef std::ptrdiff_t difference_type;
- typedef U8Type value_type;
- typedef value_type const* pointer;
- typedef value_type const reference;
- typedef std::bidirectional_iterator_tag iterator_category;
-
- reference operator*()const
- {
- if(m_current == 4)
- extract_current();
- return m_values[m_current];
- }
- bool operator==(const u32_to_u8_iterator& that)const
- {
- if(m_position == that.m_position)
- {
- // either the m_current's must be equal, or one must be 0 and
- // the other 4: which means neither must have bits 1 or 2 set:
- return (m_current == that.m_current)
- || (((m_current | that.m_current) & 3) == 0);
- }
- return false;
- }
- bool operator!=(const u32_to_u8_iterator& that)const
- {
- return !(*this == that);
- }
- u32_to_u8_iterator& operator++()
- {
- // if we have a pending read then read now, so that we know whether
- // to skip a position, or move to a low-surrogate:
- if(m_current == 4)
- {
- // pending read:
- extract_current();
- }
- // move to the next surrogate position:
- ++m_current;
- // if we've reached the end skip a position:
- if(m_values[m_current] == 0)
- {
- m_current = 4;
- ++m_position;
- }
- return *this;
- }
- u32_to_u8_iterator operator++(int)
- {
- u32_to_u8_iterator r(*this);
- ++(*this);
- return r;
- }
- u32_to_u8_iterator& operator--()
- {
- if((m_current & 3) == 0)
- {
- --m_position;
- extract_current();
- m_current = 3;
- while(m_current && (m_values[m_current] == 0))
- --m_current;
- }
- else
- --m_current;
- return *this;
- }
- u32_to_u8_iterator operator--(int)
- {
- u32_to_u8_iterator r(*this);
- --(*this);
- return r;
- }
- BaseIterator base()const
- {
- return m_position;
- }
- // construct:
- u32_to_u8_iterator() : m_position(), m_current(0)
- {
- m_values[0] = 0;
- m_values[1] = 0;
- m_values[2] = 0;
- m_values[3] = 0;
- m_values[4] = 0;
- }
- u32_to_u8_iterator(BaseIterator b) : m_position(b), m_current(4)
- {
- m_values[0] = 0;
- m_values[1] = 0;
- m_values[2] = 0;
- m_values[3] = 0;
- m_values[4] = 0;
- }
-private:
-
- void extract_current()const
- {
- boost::uint32_t c = *m_position;
- if(c > 0x10FFFFu)
- detail::invalid_utf32_code_point(c);
- if(c < 0x80u)
- {
- m_values[0] = static_cast<unsigned char>(c);
- m_values[1] = static_cast<unsigned char>(0u);
- m_values[2] = static_cast<unsigned char>(0u);
- m_values[3] = static_cast<unsigned char>(0u);
- }
- else if(c < 0x800u)
- {
- m_values[0] = static_cast<unsigned char>(0xC0u + (c >> 6));
- m_values[1] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
- m_values[2] = static_cast<unsigned char>(0u);
- m_values[3] = static_cast<unsigned char>(0u);
- }
- else if(c < 0x10000u)
- {
- m_values[0] = static_cast<unsigned char>(0xE0u + (c >> 12));
- m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
- m_values[2] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
- m_values[3] = static_cast<unsigned char>(0u);
- }
- else
- {
- m_values[0] = static_cast<unsigned char>(0xF0u + (c >> 18));
- m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
- m_values[2] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
- m_values[3] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
- }
- m_current= 0;
- }
- BaseIterator m_position;
- mutable U8Type m_values[5];
- mutable unsigned m_current;
-};
-
-template <class BaseIterator, class U32Type = ::boost::uint32_t>
-class u8_to_u32_iterator
-{
- // special values for pending iterator reads:
- BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
-
-#if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
- typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
-
- BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 8);
- BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
-#endif
-
-public:
- typedef std::ptrdiff_t difference_type;
- typedef U32Type value_type;
- typedef value_type const* pointer;
- typedef value_type const reference;
- typedef std::bidirectional_iterator_tag iterator_category;
-
- reference operator*()const
- {
- if(m_value == pending_read)
- extract_current();
- return m_value;
- }
- bool operator==(const u8_to_u32_iterator& that)const
- {
- return m_position == that.m_position;
- }
- bool operator!=(const u8_to_u32_iterator& that)const
- {
- return !(*this == that);
- }
- u8_to_u32_iterator& operator++()
- {
- // We must not start with a continuation character:
- if((static_cast<boost::uint8_t>(*m_position) & 0xC0) == 0x80)
- invalid_sequence();
- // skip high surrogate first if there is one:
- unsigned c = detail::utf8_byte_count(*m_position);
- if(m_value == pending_read)
- {
- // Since we haven't read in a value, we need to validate the code points:
- for(unsigned i = 0; i < c; ++i)
- {
- ++m_position;
- // We must have a continuation byte:
- if((i != c - 1) && ((static_cast<boost::uint8_t>(*m_position) & 0xC0) != 0x80))
- invalid_sequence();
- }
- }
- else
- {
- std::advance(m_position, c);
- }
- m_value = pending_read;
- return *this;
- }
- u8_to_u32_iterator operator++(int)
- {
- u8_to_u32_iterator r(*this);
- ++(*this);
- return r;
- }
- u8_to_u32_iterator& operator--()
- {
- // Keep backtracking until we don't have a trailing character:
- unsigned count = 0;
- while((*--m_position & 0xC0u) == 0x80u) ++count;
- // now check that the sequence was valid:
- if(count != detail::utf8_trailing_byte_count(*m_position))
- invalid_sequence();
- m_value = pending_read;
- return *this;
- }
- u8_to_u32_iterator operator--(int)
- {
- u8_to_u32_iterator r(*this);
- --(*this);
- return r;
- }
- BaseIterator base()const
- {
- return m_position;
- }
- // construct:
- u8_to_u32_iterator() : m_position()
- {
- m_value = pending_read;
- }
- u8_to_u32_iterator(BaseIterator b) : m_position(b)
- {
- m_value = pending_read;
- }
- //
- // Checked constructor:
- //
- u8_to_u32_iterator(BaseIterator b, BaseIterator start, BaseIterator end) : m_position(b)
- {
- m_value = pending_read;
- //
- // We must not start with a continuation character, or end with a
- // truncated UTF-8 sequence otherwise we run the risk of going past
- // the start/end of the underlying sequence:
- //
- if(start != end)
- {
- unsigned char v = *start;
- if((v & 0xC0u) == 0x80u)
- invalid_sequence();
- if((b != start) && (b != end) && ((*b & 0xC0u) == 0x80u))
- invalid_sequence();
- BaseIterator pos = end;
- do
- {
- v = *--pos;
- }
- while((start != pos) && ((v & 0xC0u) == 0x80u));
- std::ptrdiff_t extra = detail::utf8_byte_count(v);
- if(std::distance(pos, end) < extra)
- invalid_sequence();
- }
- }
-private:
- static void invalid_sequence()
- {
- std::out_of_range e("Invalid UTF-8 sequence encountered while trying to encode UTF-32 character");
- boost::throw_exception(e);
- }
- void extract_current()const
- {
- m_value = static_cast<U32Type>(static_cast< ::boost::uint8_t>(*m_position));
- // we must not have a continuation character:
- if((m_value & 0xC0u) == 0x80u)
- invalid_sequence();
- // see how many extra bytes we have:
- unsigned extra = detail::utf8_trailing_byte_count(*m_position);
- // extract the extra bits, 6 from each extra byte:
- BaseIterator next(m_position);
- for(unsigned c = 0; c < extra; ++c)
- {
- ++next;
- m_value <<= 6;
- // We must have a continuation byte:
- if((static_cast<boost::uint8_t>(*next) & 0xC0) != 0x80)
- invalid_sequence();
- m_value += static_cast<boost::uint8_t>(*next) & 0x3Fu;
- }
- // we now need to remove a few of the leftmost bits, but how many depends
- // upon how many extra bytes we've extracted:
- static const boost::uint32_t masks[4] =
- {
- 0x7Fu,
- 0x7FFu,
- 0xFFFFu,
- 0x1FFFFFu,
- };
- m_value &= masks[extra];
- // check the result is in range:
- if(m_value > static_cast<U32Type>(0x10FFFFu))
- invalid_sequence();
- // The result must not be a surrogate:
- if((m_value >= static_cast<U32Type>(0xD800)) && (m_value <= static_cast<U32Type>(0xDFFF)))
- invalid_sequence();
- // We should not have had an invalidly encoded UTF8 sequence:
- if((extra > 0) && (m_value <= static_cast<U32Type>(masks[extra - 1])))
- invalid_sequence();
- }
- BaseIterator m_position;
- mutable U32Type m_value;
-};
-
-template <class BaseIterator>
-class utf16_output_iterator
-{
-public:
- typedef void difference_type;
- typedef void value_type;
- typedef boost::uint32_t* pointer;
- typedef boost::uint32_t& reference;
- typedef std::output_iterator_tag iterator_category;
-
- utf16_output_iterator(const BaseIterator& b)
- : m_position(b){}
- utf16_output_iterator(const utf16_output_iterator& that)
- : m_position(that.m_position){}
- utf16_output_iterator& operator=(const utf16_output_iterator& that)
- {
- m_position = that.m_position;
- return *this;
- }
- const utf16_output_iterator& operator*()const
- {
- return *this;
- }
- void operator=(boost::uint32_t val)const
- {
- push(val);
- }
- utf16_output_iterator& operator++()
- {
- return *this;
- }
- utf16_output_iterator& operator++(int)
- {
- return *this;
- }
- BaseIterator base()const
- {
- return m_position;
- }
-private:
- void push(boost::uint32_t v)const
- {
- if(v >= 0x10000u)
- {
- // begin by checking for a code point out of range:
- if(v > 0x10FFFFu)
- detail::invalid_utf32_code_point(v);
- // split into two surrogates:
- *m_position++ = static_cast<boost::uint16_t>(v >> 10) + detail::high_surrogate_base;
- *m_position++ = static_cast<boost::uint16_t>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
- }
- else
- {
- // 16-bit code point:
- // value must not be a surrogate:
- if(detail::is_surrogate(v))
- detail::invalid_utf32_code_point(v);
- *m_position++ = static_cast<boost::uint16_t>(v);
- }
- }
- mutable BaseIterator m_position;
-};
-
-template <class BaseIterator>
-class utf8_output_iterator
-{
-public:
- typedef void difference_type;
- typedef void value_type;
- typedef boost::uint32_t* pointer;
- typedef boost::uint32_t& reference;
- typedef std::output_iterator_tag iterator_category;
-
- utf8_output_iterator(const BaseIterator& b)
- : m_position(b){}
- utf8_output_iterator(const utf8_output_iterator& that)
- : m_position(that.m_position){}
- utf8_output_iterator& operator=(const utf8_output_iterator& that)
- {
- m_position = that.m_position;
- return *this;
- }
- const utf8_output_iterator& operator*()const
- {
- return *this;
- }
- void operator=(boost::uint32_t val)const
- {
- push(val);
- }
- utf8_output_iterator& operator++()
- {
- return *this;
- }
- utf8_output_iterator& operator++(int)
- {
- return *this;
- }
- BaseIterator base()const
- {
- return m_position;
- }
-private:
- void push(boost::uint32_t c)const
- {
- if(c > 0x10FFFFu)
- detail::invalid_utf32_code_point(c);
- if(c < 0x80u)
- {
- *m_position++ = static_cast<unsigned char>(c);
- }
- else if(c < 0x800u)
- {
- *m_position++ = static_cast<unsigned char>(0xC0u + (c >> 6));
- *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
- }
- else if(c < 0x10000u)
- {
- *m_position++ = static_cast<unsigned char>(0xE0u + (c >> 12));
- *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
- *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
- }
- else
- {
- *m_position++ = static_cast<unsigned char>(0xF0u + (c >> 18));
- *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
- *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
- *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
- }
- }
- mutable BaseIterator m_position;
-};
-
-} // namespace boost
-
-#endif // BOOST_REGEX_UNICODE_ITERATOR_HPP
-
diff --git a/contrib/restricted/boost/regex/include/boost/regex/v4/w32_regex_traits.hpp b/contrib/restricted/boost/regex/include/boost/regex/v4/w32_regex_traits.hpp
deleted file mode 100644
index e1ac5d5f55..0000000000
--- a/contrib/restricted/boost/regex/include/boost/regex/v4/w32_regex_traits.hpp
+++ /dev/null
@@ -1,1229 +0,0 @@
-/*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
-
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE w32_regex_traits.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Declares regular expression traits class w32_regex_traits.
- */
-
-#ifndef BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
-#define BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
-
-#ifndef BOOST_REGEX_NO_WIN32_LOCALE
-
-#ifndef BOOST_RE_PAT_EXCEPT_HPP
-#include <boost/regex/pattern_except.hpp>
-#endif
-#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
-#include <boost/regex/v4/regex_traits_defaults.hpp>
-#endif
-#ifdef BOOST_HAS_THREADS
-#include <boost/regex/pending/static_mutex.hpp>
-#endif
-#ifndef BOOST_REGEX_PRIMARY_TRANSFORM
-#include <boost/regex/v4/primary_transform.hpp>
-#endif
-#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
-#include <boost/regex/v4/object_cache.hpp>
-#endif
-
-#define VC_EXTRALEAN
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-
-#if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(UNDER_CE)
-#pragma comment(lib, "user32.lib")
-#endif
-
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_PREFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4786)
-#if BOOST_MSVC < 1910
-#pragma warning(disable:4800)
-#endif
-#endif
-
-namespace boost{
-
-//
-// forward declaration is needed by some compilers:
-//
-template <class charT>
-class w32_regex_traits;
-
-namespace BOOST_REGEX_DETAIL_NS{
-
-//
-// start by typedeffing the types we'll need:
-//
-typedef ::boost::uint32_t lcid_type; // placeholder for LCID.
-typedef ::boost::shared_ptr<void> cat_type; // placeholder for dll HANDLE.
-
-//
-// then add wrappers around the actual Win32 API's (ie implementation hiding):
-//
-lcid_type BOOST_REGEX_CALL w32_get_default_locale();
-bool BOOST_REGEX_CALL w32_is_lower(char, lcid_type);
-#ifndef BOOST_NO_WREGEX
-bool BOOST_REGEX_CALL w32_is_lower(wchar_t, lcid_type);
-#endif
-bool BOOST_REGEX_CALL w32_is_upper(char, lcid_type);
-#ifndef BOOST_NO_WREGEX
-bool BOOST_REGEX_CALL w32_is_upper(wchar_t, lcid_type);
-#endif
-cat_type BOOST_REGEX_CALL w32_cat_open(const std::string& name);
-std::string BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::string& def);
-#ifndef BOOST_NO_WREGEX
-std::wstring BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::wstring& def);
-#endif
-std::string BOOST_REGEX_CALL w32_transform(lcid_type state_id, const char* p1, const char* p2);
-#ifndef BOOST_NO_WREGEX
-std::wstring BOOST_REGEX_CALL w32_transform(lcid_type state_id, const wchar_t* p1, const wchar_t* p2);
-#endif
-char BOOST_REGEX_CALL w32_tolower(char c, lcid_type);
-#ifndef BOOST_NO_WREGEX
-wchar_t BOOST_REGEX_CALL w32_tolower(wchar_t c, lcid_type);
-#endif
-char BOOST_REGEX_CALL w32_toupper(char c, lcid_type);
-#ifndef BOOST_NO_WREGEX
-wchar_t BOOST_REGEX_CALL w32_toupper(wchar_t c, lcid_type);
-#endif
-bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, char c);
-#ifndef BOOST_NO_WREGEX
-bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, wchar_t c);
-#endif
-//
-// class w32_regex_traits_base:
-// acts as a container for locale and the facets we are using.
-//
-template <class charT>
-struct w32_regex_traits_base
-{
- w32_regex_traits_base(lcid_type l)
- { imbue(l); }
- lcid_type imbue(lcid_type l);
-
- lcid_type m_locale;
-};
-
-template <class charT>
-inline lcid_type w32_regex_traits_base<charT>::imbue(lcid_type l)
-{
- lcid_type result(m_locale);
- m_locale = l;
- return result;
-}
-
-//
-// class w32_regex_traits_char_layer:
-// implements methods that require specialisation for narrow characters:
-//
-template <class charT>
-class w32_regex_traits_char_layer : public w32_regex_traits_base<charT>
-{
- typedef std::basic_string<charT> string_type;
- typedef std::map<charT, regex_constants::syntax_type> map_type;
- typedef typename map_type::const_iterator map_iterator_type;
-public:
- w32_regex_traits_char_layer(const lcid_type l);
-
- regex_constants::syntax_type syntax_type(charT c)const
- {
- map_iterator_type i = m_char_map.find(c);
- return ((i == m_char_map.end()) ? 0 : i->second);
- }
- regex_constants::escape_syntax_type escape_syntax_type(charT c) const
- {
- map_iterator_type i = m_char_map.find(c);
- if(i == m_char_map.end())
- {
- if(::boost::BOOST_REGEX_DETAIL_NS::w32_is_lower(c, this->m_locale)) return regex_constants::escape_type_class;
- if(::boost::BOOST_REGEX_DETAIL_NS::w32_is_upper(c, this->m_locale)) return regex_constants::escape_type_not_class;
- return 0;
- }
- return i->second;
- }
- charT tolower(charT c)const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::w32_tolower(c, this->m_locale);
- }
- bool isctype(boost::uint32_t mask, charT c)const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::w32_is(this->m_locale, mask, c);
- }
-
-private:
- string_type get_default_message(regex_constants::syntax_type);
- // TODO: use a hash table when available!
- map_type m_char_map;
-};
-
-template <class charT>
-w32_regex_traits_char_layer<charT>::w32_regex_traits_char_layer(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
- : w32_regex_traits_base<charT>(l)
-{
- // we need to start by initialising our syntax map so we know which
- // character is used for which purpose:
- cat_type cat;
- std::string cat_name(w32_regex_traits<charT>::get_catalog_name());
- if(cat_name.size())
- {
- cat = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_open(cat_name);
- if(!cat)
- {
- std::string m("Unable to open message catalog: ");
- std::runtime_error err(m + cat_name);
- boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
- }
- }
- //
- // if we have a valid catalog then load our messages:
- //
- if(cat)
- {
- for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
- {
- string_type mss = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, i, get_default_message(i));
- for(typename string_type::size_type j = 0; j < mss.size(); ++j)
- {
- this->m_char_map[mss[j]] = i;
- }
- }
- }
- else
- {
- for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
- {
- const char* ptr = get_default_syntax(i);
- while(ptr && *ptr)
- {
- this->m_char_map[static_cast<charT>(*ptr)] = i;
- ++ptr;
- }
- }
- }
-}
-
-template <class charT>
-typename w32_regex_traits_char_layer<charT>::string_type
- w32_regex_traits_char_layer<charT>::get_default_message(regex_constants::syntax_type i)
-{
- const char* ptr = get_default_syntax(i);
- string_type result;
- while(ptr && *ptr)
- {
- result.append(1, static_cast<charT>(*ptr));
- ++ptr;
- }
- return result;
-}
-
-//
-// specialised version for narrow characters:
-//
-template <>
-class w32_regex_traits_char_layer<char> : public w32_regex_traits_base<char>
-{
- typedef std::string string_type;
-public:
- w32_regex_traits_char_layer(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
- : w32_regex_traits_base<char>(l)
- {
- init<char>();
- }
-
- regex_constants::syntax_type syntax_type(char c)const
- {
- return m_char_map[static_cast<unsigned char>(c)];
- }
- regex_constants::escape_syntax_type escape_syntax_type(char c) const
- {
- return m_char_map[static_cast<unsigned char>(c)];
- }
- char tolower(char c)const
- {
- return m_lower_map[static_cast<unsigned char>(c)];
- }
- bool isctype(boost::uint32_t mask, char c)const
- {
- return m_type_map[static_cast<unsigned char>(c)] & mask;
- }
-
-private:
- regex_constants::syntax_type m_char_map[1u << CHAR_BIT];
- char m_lower_map[1u << CHAR_BIT];
- boost::uint16_t m_type_map[1u << CHAR_BIT];
- template <class U>
- void init();
-};
-
-//
-// class w32_regex_traits_implementation:
-// provides pimpl implementation for w32_regex_traits.
-//
-template <class charT>
-class w32_regex_traits_implementation : public w32_regex_traits_char_layer<charT>
-{
-public:
- typedef typename w32_regex_traits<charT>::char_class_type char_class_type;
- BOOST_STATIC_CONSTANT(char_class_type, mask_word = 0x0400); // must be C1_DEFINED << 1
- BOOST_STATIC_CONSTANT(char_class_type, mask_unicode = 0x0800); // must be C1_DEFINED << 2
- BOOST_STATIC_CONSTANT(char_class_type, mask_horizontal = 0x1000); // must be C1_DEFINED << 3
- BOOST_STATIC_CONSTANT(char_class_type, mask_vertical = 0x2000); // must be C1_DEFINED << 4
- BOOST_STATIC_CONSTANT(char_class_type, mask_base = 0x3ff); // all the masks used by the CT_CTYPE1 group
-
- typedef std::basic_string<charT> string_type;
- typedef charT char_type;
- w32_regex_traits_implementation(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l);
- std::string error_string(regex_constants::error_type n) const
- {
- if(!m_error_strings.empty())
- {
- std::map<int, std::string>::const_iterator p = m_error_strings.find(n);
- return (p == m_error_strings.end()) ? std::string(get_default_error_string(n)) : p->second;
- }
- return get_default_error_string(n);
- }
- char_class_type lookup_classname(const charT* p1, const charT* p2) const
- {
- char_class_type result = lookup_classname_imp(p1, p2);
- if(result == 0)
- {
- typedef typename string_type::size_type size_type;
- string_type temp(p1, p2);
- for(size_type i = 0; i < temp.size(); ++i)
- temp[i] = this->tolower(temp[i]);
- result = lookup_classname_imp(&*temp.begin(), &*temp.begin() + temp.size());
- }
- return result;
- }
- string_type lookup_collatename(const charT* p1, const charT* p2) const;
- string_type transform_primary(const charT* p1, const charT* p2) const;
- string_type transform(const charT* p1, const charT* p2) const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::w32_transform(this->m_locale, p1, p2);
- }
-private:
- std::map<int, std::string> m_error_strings; // error messages indexed by numberic ID
- std::map<string_type, char_class_type> m_custom_class_names; // character class names
- std::map<string_type, string_type> m_custom_collate_names; // collating element names
- unsigned m_collate_type; // the form of the collation string
- charT m_collate_delim; // the collation group delimiter
- //
- // helpers:
- //
- char_class_type lookup_classname_imp(const charT* p1, const charT* p2) const;
-};
-
-template <class charT>
-typename w32_regex_traits_implementation<charT>::string_type
- w32_regex_traits_implementation<charT>::transform_primary(const charT* p1, const charT* p2) const
-{
- string_type result;
- //
- // What we do here depends upon the format of the sort key returned by
- // sort key returned by this->transform:
- //
- switch(m_collate_type)
- {
- case sort_C:
- case sort_unknown:
- // the best we can do is translate to lower case, then get a regular sort key:
- {
- result.assign(p1, p2);
- typedef typename string_type::size_type size_type;
- for(size_type i = 0; i < result.size(); ++i)
- result[i] = this->tolower(result[i]);
- result = this->transform(&*result.begin(), &*result.begin() + result.size());
- break;
- }
- case sort_fixed:
- {
- // get a regular sort key, and then truncate it:
- result.assign(this->transform(p1, p2));
- result.erase(this->m_collate_delim);
- break;
- }
- case sort_delim:
- // get a regular sort key, and then truncate everything after the delim:
- result.assign(this->transform(p1, p2));
- std::size_t i;
- for(i = 0; i < result.size(); ++i)
- {
- if(result[i] == m_collate_delim)
- break;
- }
- result.erase(i);
- break;
- }
- if(result.empty())
- result = string_type(1, charT(0));
- return result;
-}
-
-template <class charT>
-typename w32_regex_traits_implementation<charT>::string_type
- w32_regex_traits_implementation<charT>::lookup_collatename(const charT* p1, const charT* p2) const
-{
- typedef typename std::map<string_type, string_type>::const_iterator iter_type;
- if(m_custom_collate_names.size())
- {
- iter_type pos = m_custom_collate_names.find(string_type(p1, p2));
- if(pos != m_custom_collate_names.end())
- return pos->second;
- }
-#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
- && !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
- std::string name(p1, p2);
-#else
- std::string name;
- const charT* p0 = p1;
- while(p0 != p2)
- name.append(1, char(*p0++));
-#endif
- name = lookup_default_collate_name(name);
-#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
- && !BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x0551)
- if(name.size())
- return string_type(name.begin(), name.end());
-#else
- if(name.size())
- {
- string_type result;
- typedef std::string::const_iterator iter;
- iter b = name.begin();
- iter e = name.end();
- while(b != e)
- result.append(1, charT(*b++));
- return result;
- }
-#endif
- if(p2 - p1 == 1)
- return string_type(1, *p1);
- return string_type();
-}
-
-template <class charT>
-w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
-: w32_regex_traits_char_layer<charT>(l)
-{
- cat_type cat;
- std::string cat_name(w32_regex_traits<charT>::get_catalog_name());
- if(cat_name.size())
- {
- cat = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_open(cat_name);
- if(!cat)
- {
- std::string m("Unable to open message catalog: ");
- std::runtime_error err(m + cat_name);
- boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
- }
- }
- //
- // if we have a valid catalog then load our messages:
- //
- if(cat)
- {
- //
- // Error messages:
- //
- for(boost::regex_constants::error_type i = static_cast<boost::regex_constants::error_type>(0);
- i <= boost::regex_constants::error_unknown;
- i = static_cast<boost::regex_constants::error_type>(i + 1))
- {
- const char* p = get_default_error_string(i);
- string_type default_message;
- while(*p)
- {
- default_message.append(1, static_cast<charT>(*p));
- ++p;
- }
- string_type s = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, i+200, default_message);
- std::string result;
- for(std::string::size_type j = 0; j < s.size(); ++j)
- {
- result.append(1, static_cast<char>(s[j]));
- }
- m_error_strings[i] = result;
- }
- //
- // Custom class names:
- //
- static const char_class_type masks[14] =
- {
- 0x0104u, // C1_ALPHA | C1_DIGIT
- 0x0100u, // C1_ALPHA
- 0x0020u, // C1_CNTRL
- 0x0004u, // C1_DIGIT
- (~(0x0020u|0x0008u) & 0x01ffu) | 0x0400u, // not C1_CNTRL or C1_SPACE
- 0x0002u, // C1_LOWER
- (~0x0020u & 0x01ffu) | 0x0400, // not C1_CNTRL
- 0x0010u, // C1_PUNCT
- 0x0008u, // C1_SPACE
- 0x0001u, // C1_UPPER
- 0x0080u, // C1_XDIGIT
- 0x0040u, // C1_BLANK
- w32_regex_traits_implementation<charT>::mask_word,
- w32_regex_traits_implementation<charT>::mask_unicode,
- };
- static const string_type null_string;
- for(unsigned int j = 0; j <= 13; ++j)
- {
- string_type s(::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, j+300, null_string));
- if(s.size())
- this->m_custom_class_names[s] = masks[j];
- }
- }
- //
- // get the collation format used by m_pcollate:
- //
- m_collate_type = BOOST_REGEX_DETAIL_NS::find_sort_syntax(this, &m_collate_delim);
-}
-
-template <class charT>
-typename w32_regex_traits_implementation<charT>::char_class_type
- w32_regex_traits_implementation<charT>::lookup_classname_imp(const charT* p1, const charT* p2) const
-{
- static const char_class_type masks[22] =
- {
- 0,
- 0x0104u, // C1_ALPHA | C1_DIGIT
- 0x0100u, // C1_ALPHA
- 0x0040u, // C1_BLANK
- 0x0020u, // C1_CNTRL
- 0x0004u, // C1_DIGIT
- 0x0004u, // C1_DIGIT
- (~(0x0020u|0x0008u|0x0040) & 0x01ffu) | 0x0400u, // not C1_CNTRL or C1_SPACE or C1_BLANK
- w32_regex_traits_implementation<charT>::mask_horizontal,
- 0x0002u, // C1_LOWER
- 0x0002u, // C1_LOWER
- (~0x0020u & 0x01ffu) | 0x0400, // not C1_CNTRL
- 0x0010u, // C1_PUNCT
- 0x0008u, // C1_SPACE
- 0x0008u, // C1_SPACE
- 0x0001u, // C1_UPPER
- w32_regex_traits_implementation<charT>::mask_unicode,
- 0x0001u, // C1_UPPER
- w32_regex_traits_implementation<charT>::mask_vertical,
- 0x0104u | w32_regex_traits_implementation<charT>::mask_word,
- 0x0104u | w32_regex_traits_implementation<charT>::mask_word,
- 0x0080u, // C1_XDIGIT
- };
- if(m_custom_class_names.size())
- {
- typedef typename std::map<std::basic_string<charT>, char_class_type>::const_iterator map_iter;
- map_iter pos = m_custom_class_names.find(string_type(p1, p2));
- if(pos != m_custom_class_names.end())
- return pos->second;
- }
- std::size_t state_id = 1u + (std::size_t)BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
- if(state_id < sizeof(masks) / sizeof(masks[0]))
- return masks[state_id];
- return masks[0];
-}
-
-
-template <class charT>
-boost::shared_ptr<const w32_regex_traits_implementation<charT> > create_w32_regex_traits(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
-{
- // TODO: create a cache for previously constructed objects.
- return boost::object_cache< ::boost::BOOST_REGEX_DETAIL_NS::lcid_type, w32_regex_traits_implementation<charT> >::get(l, 5);
-}
-
-} // BOOST_REGEX_DETAIL_NS
-
-template <class charT>
-class w32_regex_traits
-{
-public:
- typedef charT char_type;
- typedef std::size_t size_type;
- typedef std::basic_string<char_type> string_type;
- typedef ::boost::BOOST_REGEX_DETAIL_NS::lcid_type locale_type;
- typedef boost::uint_least32_t char_class_type;
-
- struct boost_extensions_tag{};
-
- w32_regex_traits()
- : m_pimpl(BOOST_REGEX_DETAIL_NS::create_w32_regex_traits<charT>(::boost::BOOST_REGEX_DETAIL_NS::w32_get_default_locale()))
- { }
- static size_type length(const char_type* p)
- {
- return std::char_traits<charT>::length(p);
- }
- regex_constants::syntax_type syntax_type(charT c)const
- {
- return m_pimpl->syntax_type(c);
- }
- regex_constants::escape_syntax_type escape_syntax_type(charT c) const
- {
- return m_pimpl->escape_syntax_type(c);
- }
- charT translate(charT c) const
- {
- return c;
- }
- charT translate_nocase(charT c) const
- {
- return this->m_pimpl->tolower(c);
- }
- charT translate(charT c, bool icase) const
- {
- return icase ? this->m_pimpl->tolower(c) : c;
- }
- charT tolower(charT c) const
- {
- return this->m_pimpl->tolower(c);
- }
- charT toupper(charT c) const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::w32_toupper(c, this->m_pimpl->m_locale);
- }
- string_type transform(const charT* p1, const charT* p2) const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::w32_transform(this->m_pimpl->m_locale, p1, p2);
- }
- string_type transform_primary(const charT* p1, const charT* p2) const
- {
- return m_pimpl->transform_primary(p1, p2);
- }
- char_class_type lookup_classname(const charT* p1, const charT* p2) const
- {
- return m_pimpl->lookup_classname(p1, p2);
- }
- string_type lookup_collatename(const charT* p1, const charT* p2) const
- {
- return m_pimpl->lookup_collatename(p1, p2);
- }
- bool isctype(charT c, char_class_type f) const
- {
- if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_base)
- && (this->m_pimpl->isctype(f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_base, c)))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_unicode) && BOOST_REGEX_DETAIL_NS::is_extended(c))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_word) && (c == '_'))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_vertical)
- && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == '\v')))
- return true;
- else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_horizontal)
- && this->isctype(c, 0x0008u) && !this->isctype(c, BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_vertical))
- return true;
- return false;
- }
- boost::intmax_t toi(const charT*& p1, const charT* p2, int radix)const
- {
- return ::boost::BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
- }
- int value(charT c, int radix)const
- {
- int result = (int)::boost::BOOST_REGEX_DETAIL_NS::global_value(c);
- return result < radix ? result : -1;
- }
- locale_type imbue(locale_type l)
- {
- ::boost::BOOST_REGEX_DETAIL_NS::lcid_type result(getloc());
- m_pimpl = BOOST_REGEX_DETAIL_NS::create_w32_regex_traits<charT>(l);
- return result;
- }
- locale_type getloc()const
- {
- return m_pimpl->m_locale;
- }
- std::string error_string(regex_constants::error_type n) const
- {
- return m_pimpl->error_string(n);
- }
-
- //
- // extension:
- // set the name of the message catalog in use (defaults to "boost_regex").
- //
- static std::string catalog_name(const std::string& name);
- static std::string get_catalog_name();
-
-private:
- boost::shared_ptr<const BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT> > m_pimpl;
- //
- // catalog name handler:
- //
- static std::string& get_catalog_name_inst();
-
-#ifdef BOOST_HAS_THREADS
- static static_mutex& get_mutex_inst();
-#endif
-};
-
-template <class charT>
-std::string w32_regex_traits<charT>::catalog_name(const std::string& name)
-{
-#ifdef BOOST_HAS_THREADS
- static_mutex::scoped_lock lk(get_mutex_inst());
-#endif
- std::string result(get_catalog_name_inst());
- get_catalog_name_inst() = name;
- return result;
-}
-
-template <class charT>
-std::string& w32_regex_traits<charT>::get_catalog_name_inst()
-{
- static std::string s_name;
- return s_name;
-}
-
-template <class charT>
-std::string w32_regex_traits<charT>::get_catalog_name()
-{
-#ifdef BOOST_HAS_THREADS
- static_mutex::scoped_lock lk(get_mutex_inst());
-#endif
- std::string result(get_catalog_name_inst());
- return result;
-}
-
-#ifdef BOOST_HAS_THREADS
-template <class charT>
-static_mutex& w32_regex_traits<charT>::get_mutex_inst()
-{
- static static_mutex s_mutex = BOOST_STATIC_MUTEX_INIT;
- return s_mutex;
-}
-#endif
-
-namespace BOOST_REGEX_DETAIL_NS {
-
-#ifdef BOOST_NO_ANSI_APIS
- inline UINT get_code_page_for_locale_id(lcid_type idx)
- {
- WCHAR code_page_string[7];
- if (::GetLocaleInfoW(idx, LOCALE_IDEFAULTANSICODEPAGE, code_page_string, 7) == 0)
- return 0;
-
- return static_cast<UINT>(_wtol(code_page_string));
-}
-#endif
-
- template <class U>
- inline void w32_regex_traits_char_layer<char>::init()
- {
- // we need to start by initialising our syntax map so we know which
- // character is used for which purpose:
- std::memset(m_char_map, 0, sizeof(m_char_map));
- cat_type cat;
- std::string cat_name(w32_regex_traits<char>::get_catalog_name());
- if (cat_name.size())
- {
- cat = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_open(cat_name);
- if (!cat)
- {
- std::string m("Unable to open message catalog: ");
- std::runtime_error err(m + cat_name);
- ::boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
- }
- }
- //
- // if we have a valid catalog then load our messages:
- //
- if (cat)
- {
- for (regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
- {
- string_type mss = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, i, get_default_syntax(i));
- for (string_type::size_type j = 0; j < mss.size(); ++j)
- {
- m_char_map[static_cast<unsigned char>(mss[j])] = i;
- }
- }
- }
- else
- {
- for (regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
- {
- const char* ptr = get_default_syntax(i);
- while (ptr && *ptr)
- {
- m_char_map[static_cast<unsigned char>(*ptr)] = i;
- ++ptr;
- }
- }
- }
- //
- // finish off by calculating our escape types:
- //
- unsigned char i = 'A';
- do
- {
- if (m_char_map[i] == 0)
- {
- if (::boost::BOOST_REGEX_DETAIL_NS::w32_is(this->m_locale, 0x0002u, (char)i))
- m_char_map[i] = regex_constants::escape_type_class;
- else if (::boost::BOOST_REGEX_DETAIL_NS::w32_is(this->m_locale, 0x0001u, (char)i))
- m_char_map[i] = regex_constants::escape_type_not_class;
- }
- } while (0xFF != i++);
-
- //
- // fill in lower case map:
- //
- char char_map[1 << CHAR_BIT];
- for (int ii = 0; ii < (1 << CHAR_BIT); ++ii)
- char_map[ii] = static_cast<char>(ii);
-#ifndef BOOST_NO_ANSI_APIS
- int r = ::LCMapStringA(this->m_locale, LCMAP_LOWERCASE, char_map, 1 << CHAR_BIT, this->m_lower_map, 1 << CHAR_BIT);
- BOOST_REGEX_ASSERT(r != 0);
-#else
- UINT code_page = get_code_page_for_locale_id(this->m_locale);
- BOOST_REGEX_ASSERT(code_page != 0);
-
- WCHAR wide_char_map[1 << CHAR_BIT];
- int conv_r = ::MultiByteToWideChar(code_page, 0, char_map, 1 << CHAR_BIT, wide_char_map, 1 << CHAR_BIT);
- BOOST_REGEX_ASSERT(conv_r != 0);
-
- WCHAR wide_lower_map[1 << CHAR_BIT];
- int r = ::LCMapStringW(this->m_locale, LCMAP_LOWERCASE, wide_char_map, 1 << CHAR_BIT, wide_lower_map, 1 << CHAR_BIT);
- BOOST_REGEX_ASSERT(r != 0);
-
- conv_r = ::WideCharToMultiByte(code_page, 0, wide_lower_map, r, this->m_lower_map, 1 << CHAR_BIT, NULL, NULL);
- BOOST_REGEX_ASSERT(conv_r != 0);
-#endif
- if (r < (1 << CHAR_BIT))
- {
- // if we have multibyte characters then not all may have been given
- // a lower case mapping:
- for (int jj = r; jj < (1 << CHAR_BIT); ++jj)
- this->m_lower_map[jj] = static_cast<char>(jj);
- }
-
-#ifndef BOOST_NO_ANSI_APIS
- r = ::GetStringTypeExA(this->m_locale, CT_CTYPE1, char_map, 1 << CHAR_BIT, this->m_type_map);
-#else
- r = ::GetStringTypeExW(this->m_locale, CT_CTYPE1, wide_char_map, 1 << CHAR_BIT, this->m_type_map);
-#endif
- BOOST_REGEX_ASSERT(0 != r);
- }
-
- inline lcid_type BOOST_REGEX_CALL w32_get_default_locale()
- {
- return ::GetUserDefaultLCID();
- }
-
- inline bool BOOST_REGEX_CALL w32_is_lower(char c, lcid_type idx)
- {
-#ifndef BOOST_NO_ANSI_APIS
- WORD mask;
- if (::GetStringTypeExA(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_LOWER))
- return true;
- return false;
-#else
- UINT code_page = get_code_page_for_locale_id(idx);
- if (code_page == 0)
- return false;
-
- WCHAR wide_c;
- if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
- return false;
-
- WORD mask;
- if (::GetStringTypeExW(idx, CT_CTYPE1, &wide_c, 1, &mask) && (mask & C1_LOWER))
- return true;
- return false;
-#endif
- }
-
- inline bool BOOST_REGEX_CALL w32_is_lower(wchar_t c, lcid_type idx)
- {
- WORD mask;
- if (::GetStringTypeExW(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_LOWER))
- return true;
- return false;
- }
-
- inline bool BOOST_REGEX_CALL w32_is_upper(char c, lcid_type idx)
- {
-#ifndef BOOST_NO_ANSI_APIS
- WORD mask;
- if (::GetStringTypeExA(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_UPPER))
- return true;
- return false;
-#else
- UINT code_page = get_code_page_for_locale_id(idx);
- if (code_page == 0)
- return false;
-
- WCHAR wide_c;
- if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
- return false;
-
- WORD mask;
- if (::GetStringTypeExW(idx, CT_CTYPE1, &wide_c, 1, &mask) && (mask & C1_UPPER))
- return true;
- return false;
-#endif
- }
-
- inline bool BOOST_REGEX_CALL w32_is_upper(wchar_t c, lcid_type idx)
- {
- WORD mask;
- if (::GetStringTypeExW(idx, CT_CTYPE1, &c, 1, &mask) && (mask & C1_UPPER))
- return true;
- return false;
- }
-
- inline void free_module(void* mod)
- {
- ::FreeLibrary(static_cast<HMODULE>(mod));
- }
-
- inline cat_type BOOST_REGEX_CALL w32_cat_open(const std::string& name)
- {
-#ifndef BOOST_NO_ANSI_APIS
- cat_type result(::LoadLibraryA(name.c_str()), &free_module);
- return result;
-#else
- LPWSTR wide_name = (LPWSTR)_alloca((name.size() + 1) * sizeof(WCHAR));
- if (::MultiByteToWideChar(CP_ACP, 0, name.c_str(), name.size(), wide_name, name.size() + 1) == 0)
- return cat_type();
-
- cat_type result(::LoadLibraryW(wide_name), &free_module);
- return result;
-#endif
- }
-
- inline std::string BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type, int i, const std::string& def)
- {
-#ifndef BOOST_NO_ANSI_APIS
- char buf[256];
- if (0 == ::LoadStringA(
- static_cast<HMODULE>(cat.get()),
- i,
- buf,
- 256
- ))
- {
- return def;
- }
-#else
- WCHAR wbuf[256];
- int r = ::LoadStringW(
- static_cast<HMODULE>(cat.get()),
- i,
- wbuf,
- 256
- );
- if (r == 0)
- return def;
-
-
- int buf_size = 1 + ::WideCharToMultiByte(CP_ACP, 0, wbuf, r, NULL, 0, NULL, NULL);
- LPSTR buf = (LPSTR)_alloca(buf_size);
- if (::WideCharToMultiByte(CP_ACP, 0, wbuf, r, buf, buf_size, NULL, NULL) == 0)
- return def; // failed conversion.
-#endif
- return std::string(buf);
- }
-
-#ifndef BOOST_NO_WREGEX
- inline std::wstring BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type, int i, const std::wstring& def)
- {
- wchar_t buf[256];
- if (0 == ::LoadStringW(
- static_cast<HMODULE>(cat.get()),
- i,
- buf,
- 256
- ))
- {
- return def;
- }
- return std::wstring(buf);
- }
-#endif
- inline std::string BOOST_REGEX_CALL w32_transform(lcid_type idx, const char* p1, const char* p2)
- {
-#ifndef BOOST_NO_ANSI_APIS
- int bytes = ::LCMapStringA(
- idx, // locale identifier
- LCMAP_SORTKEY, // mapping transformation type
- p1, // source string
- static_cast<int>(p2 - p1), // number of characters in source string
- 0, // destination buffer
- 0 // size of destination buffer
- );
- if (!bytes)
- return std::string(p1, p2);
- std::string result(++bytes, '\0');
- bytes = ::LCMapStringA(
- idx, // locale identifier
- LCMAP_SORTKEY, // mapping transformation type
- p1, // source string
- static_cast<int>(p2 - p1), // number of characters in source string
- &*result.begin(), // destination buffer
- bytes // size of destination buffer
- );
-#else
- UINT code_page = get_code_page_for_locale_id(idx);
- if (code_page == 0)
- return std::string(p1, p2);
-
- int src_len = static_cast<int>(p2 - p1);
- LPWSTR wide_p1 = (LPWSTR)_alloca((src_len + 1) * 2);
- if (::MultiByteToWideChar(code_page, 0, p1, src_len, wide_p1, src_len + 1) == 0)
- return std::string(p1, p2);
-
- int bytes = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_SORTKEY, // mapping transformation type
- wide_p1, // source string
- src_len, // number of characters in source string
- 0, // destination buffer
- 0 // size of destination buffer
- );
- if (!bytes)
- return std::string(p1, p2);
- std::string result(++bytes, '\0');
- bytes = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_SORTKEY, // mapping transformation type
- wide_p1, // source string
- src_len, // number of characters in source string
- (LPWSTR) & *result.begin(), // destination buffer
- bytes // size of destination buffer
- );
-#endif
- if (bytes > static_cast<int>(result.size()))
- return std::string(p1, p2);
- while (result.size() && result[result.size() - 1] == '\0')
- {
- result.erase(result.size() - 1);
- }
- return result;
- }
-
-#ifndef BOOST_NO_WREGEX
- inline std::wstring BOOST_REGEX_CALL w32_transform(lcid_type idx, const wchar_t* p1, const wchar_t* p2)
- {
- int bytes = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_SORTKEY, // mapping transformation type
- p1, // source string
- static_cast<int>(p2 - p1), // number of characters in source string
- 0, // destination buffer
- 0 // size of destination buffer
- );
- if (!bytes)
- return std::wstring(p1, p2);
- std::string result(++bytes, '\0');
- bytes = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_SORTKEY, // mapping transformation type
- p1, // source string
- static_cast<int>(p2 - p1), // number of characters in source string
- reinterpret_cast<wchar_t*>(&*result.begin()), // destination buffer *of bytes*
- bytes // size of destination buffer
- );
- if (bytes > static_cast<int>(result.size()))
- return std::wstring(p1, p2);
- while (result.size() && result[result.size() - 1] == L'\0')
- {
- result.erase(result.size() - 1);
- }
- std::wstring r2;
- for (std::string::size_type i = 0; i < result.size(); ++i)
- r2.append(1, static_cast<wchar_t>(static_cast<unsigned char>(result[i])));
- return r2;
- }
-#endif
- inline char BOOST_REGEX_CALL w32_tolower(char c, lcid_type idx)
- {
- char result[2];
-#ifndef BOOST_NO_ANSI_APIS
- int b = ::LCMapStringA(
- idx, // locale identifier
- LCMAP_LOWERCASE, // mapping transformation type
- &c, // source string
- 1, // number of characters in source string
- result, // destination buffer
- 1); // size of destination buffer
- if (b == 0)
- return c;
-#else
- UINT code_page = get_code_page_for_locale_id(idx);
- if (code_page == 0)
- return c;
-
- WCHAR wide_c;
- if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
- return c;
-
- WCHAR wide_result;
- int b = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_LOWERCASE, // mapping transformation type
- &wide_c, // source string
- 1, // number of characters in source string
- &wide_result, // destination buffer
- 1); // size of destination buffer
- if (b == 0)
- return c;
-
- if (::WideCharToMultiByte(code_page, 0, &wide_result, 1, result, 2, NULL, NULL) == 0)
- return c; // No single byte lower case equivalent available
-#endif
- return result[0];
- }
-
-#ifndef BOOST_NO_WREGEX
- inline wchar_t BOOST_REGEX_CALL w32_tolower(wchar_t c, lcid_type idx)
- {
- wchar_t result[2];
- int b = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_LOWERCASE, // mapping transformation type
- &c, // source string
- 1, // number of characters in source string
- result, // destination buffer
- 1); // size of destination buffer
- if (b == 0)
- return c;
- return result[0];
- }
-#endif
- inline char BOOST_REGEX_CALL w32_toupper(char c, lcid_type idx)
- {
- char result[2];
-#ifndef BOOST_NO_ANSI_APIS
- int b = ::LCMapStringA(
- idx, // locale identifier
- LCMAP_UPPERCASE, // mapping transformation type
- &c, // source string
- 1, // number of characters in source string
- result, // destination buffer
- 1); // size of destination buffer
- if (b == 0)
- return c;
-#else
- UINT code_page = get_code_page_for_locale_id(idx);
- if (code_page == 0)
- return c;
-
- WCHAR wide_c;
- if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
- return c;
-
- WCHAR wide_result;
- int b = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_UPPERCASE, // mapping transformation type
- &wide_c, // source string
- 1, // number of characters in source string
- &wide_result, // destination buffer
- 1); // size of destination buffer
- if (b == 0)
- return c;
-
- if (::WideCharToMultiByte(code_page, 0, &wide_result, 1, result, 2, NULL, NULL) == 0)
- return c; // No single byte upper case equivalent available.
-#endif
- return result[0];
- }
-
-#ifndef BOOST_NO_WREGEX
- inline wchar_t BOOST_REGEX_CALL w32_toupper(wchar_t c, lcid_type idx)
- {
- wchar_t result[2];
- int b = ::LCMapStringW(
- idx, // locale identifier
- LCMAP_UPPERCASE, // mapping transformation type
- &c, // source string
- 1, // number of characters in source string
- result, // destination buffer
- 1); // size of destination buffer
- if (b == 0)
- return c;
- return result[0];
- }
-#endif
- inline bool BOOST_REGEX_CALL w32_is(lcid_type idx, boost::uint32_t m, char c)
- {
- WORD mask;
-#ifndef BOOST_NO_ANSI_APIS
- if (::GetStringTypeExA(idx, CT_CTYPE1, &c, 1, &mask) && (mask & m & w32_regex_traits_implementation<char>::mask_base))
- return true;
-#else
- UINT code_page = get_code_page_for_locale_id(idx);
- if (code_page == 0)
- return false;
-
- WCHAR wide_c;
- if (::MultiByteToWideChar(code_page, 0, &c, 1, &wide_c, 1) == 0)
- return false;
-
- if (::GetStringTypeExW(idx, CT_CTYPE1, &wide_c, 1, &mask) && (mask & m & w32_regex_traits_implementation<char>::mask_base))
- return true;
-#endif
- if ((m & w32_regex_traits_implementation<char>::mask_word) && (c == '_'))
- return true;
- return false;
- }
-
-#ifndef BOOST_NO_WREGEX
- inline bool BOOST_REGEX_CALL w32_is(lcid_type idx, boost::uint32_t m, wchar_t c)
- {
- WORD mask;
- if (::GetStringTypeExW(idx, CT_CTYPE1, &c, 1, &mask) && (mask & m & w32_regex_traits_implementation<wchar_t>::mask_base))
- return true;
- if ((m & w32_regex_traits_implementation<wchar_t>::mask_word) && (c == '_'))
- return true;
- if ((m & w32_regex_traits_implementation<wchar_t>::mask_unicode) && (c > 0xff))
- return true;
- return false;
- }
-#endif
-
-} // BOOST_REGEX_DETAIL_NS
-
-
-} // boost
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable: 4103)
-#endif
-#ifdef BOOST_HAS_ABI_HEADERS
-# include BOOST_ABI_SUFFIX
-#endif
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#endif // BOOST_REGEX_NO_WIN32_LOCALE
-
-#endif
diff --git a/contrib/restricted/boost/regex/include/boost/regex_fwd.hpp b/contrib/restricted/boost/regex/include/boost/regex_fwd.hpp
index 99371b8cae..5efd7b35d0 100644
--- a/contrib/restricted/boost/regex/include/boost/regex_fwd.hpp
+++ b/contrib/restricted/boost/regex/include/boost/regex_fwd.hpp
@@ -25,7 +25,7 @@
#endif
#ifdef BOOST_REGEX_CXX03
-#include <boost/regex/v4/regex_fwd.hpp>
+#error #include <boost/regex/v4/regex_fwd.hpp>
#else
#include <boost/regex/v5/regex_fwd.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/src/posix_api.cpp b/contrib/restricted/boost/regex/src/posix_api.cpp
index e30f9d8e1e..59f16ebcca 100644
--- a/contrib/restricted/boost/regex/src/posix_api.cpp
+++ b/contrib/restricted/boost/regex/src/posix_api.cpp
@@ -27,7 +27,7 @@
#endif
#ifndef BOOST_REGEX_STANDALONE
-#include <boost/core/snprintf.hpp>
+#error #include <boost/core/snprintf.hpp>
#else
namespace boost { namespace core { using std::snprintf; } }
#endif
diff --git a/contrib/restricted/boost/regex/src/regex.cpp b/contrib/restricted/boost/regex/src/regex.cpp
index 2d9239553c..8c251f60e1 100644
--- a/contrib/restricted/boost/regex/src/regex.cpp
+++ b/contrib/restricted/boost/regex/src/regex.cpp
@@ -36,7 +36,7 @@
#include <windows.h>
#include <stdexcept>
#include <boost/regex/pattern_except.hpp>
-#include <boost/regex/v4/protected_call.hpp>
+#error #include <boost/regex/v4/protected_call.hpp>
namespace boost {
namespace BOOST_REGEX_DETAIL_NS {
diff --git a/contrib/restricted/boost/regex/src/static_mutex.cpp b/contrib/restricted/boost/regex/src/static_mutex.cpp
index b238b44a41..2c6d4b0c1f 100644
--- a/contrib/restricted/boost/regex/src/static_mutex.cpp
+++ b/contrib/restricted/boost/regex/src/static_mutex.cpp
@@ -35,7 +35,7 @@
# define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
-#include <boost/static_assert.hpp>
+#error #include <boost/static_assert.hpp>
#endif
diff --git a/contrib/restricted/boost/regex/src/wide_posix_api.cpp b/contrib/restricted/boost/regex/src/wide_posix_api.cpp
index 993464f86b..ae95025131 100644
--- a/contrib/restricted/boost/regex/src/wide_posix_api.cpp
+++ b/contrib/restricted/boost/regex/src/wide_posix_api.cpp
@@ -26,7 +26,7 @@
#include <boost/cregex.hpp>
#ifndef BOOST_REGEX_STANDALONE
-#include <boost/core/snprintf.hpp>
+#error #include <boost/core/snprintf.hpp>
#else
namespace boost { namespace core { using std::swprintf; } }
#endif
diff --git a/contrib/restricted/boost/regex/ya.make b/contrib/restricted/boost/regex/ya.make
index a9f0211ed8..956cc1dd53 100644
--- a/contrib/restricted/boost/regex/ya.make
+++ b/contrib/restricted/boost/regex/ya.make
@@ -13,17 +13,9 @@ ORIGINAL_SOURCE(https://github.com/boostorg/regex/archive/boost-1.87.0.tar.gz)
PEERDIR(
contrib/libs/icu
contrib/restricted/boost/assert
- contrib/restricted/boost/concept_check
contrib/restricted/boost/config
- contrib/restricted/boost/container_hash
- contrib/restricted/boost/core
- contrib/restricted/boost/integer
- contrib/restricted/boost/mpl
contrib/restricted/boost/predef
- contrib/restricted/boost/smart_ptr
- contrib/restricted/boost/static_assert
contrib/restricted/boost/throw_exception
- contrib/restricted/boost/type_traits
)
ADDINCL(
@@ -37,6 +29,7 @@ NO_UTIL()
CFLAGS(
-DBOOST_HAS_ICU
-DBOOST_NO_CXX98_BINDERS
+ -DBOOST_REGEX_STANDALONE
)
IF (DYNAMIC_BOOST)
diff --git a/contrib/tools/python3/.yandex_meta/devtools.licenses.report b/contrib/tools/python3/.yandex_meta/devtools.licenses.report
index 017cad0d0c..f3d1534cd2 100644
--- a/contrib/tools/python3/.yandex_meta/devtools.licenses.report
+++ b/contrib/tools/python3/.yandex_meta/devtools.licenses.report
@@ -464,7 +464,7 @@ BELONGS ya.make
Match type : TAG
Links : http://docs.python.org/license.html, http://spdx.org/licenses/Python-2.0, https://spdx.org/licenses/Python-2.0
Files with this license:
- Python/deepfreeze/deepfreeze.c [127606:127606]
+ Python/deepfreeze/deepfreeze.c [127644:127644]
KEEP LicenseRef-scancode-warranty-disclaimer 50a3e16ca7c1aaf79e69114d558b25a0
BELONGS Lib/ya.make
@@ -1201,7 +1201,7 @@ BELONGS Lib/ya.make
Match type : TAG
Links : http://docs.python.org/license.html, http://spdx.org/licenses/Python-2.0, https://spdx.org/licenses/Python-2.0
Files with this license:
- Lib/site.py [442:442]
+ Lib/site.py [443:443]
KEEP LicenseRef-scancode-unknown-license-reference f488ff2759d4446215ccf983a020a815
BELONGS Lib/ya.make
diff --git a/contrib/tools/python3/.yandex_meta/override.nix b/contrib/tools/python3/.yandex_meta/override.nix
index 38414e7229..faea16f445 100644
--- a/contrib/tools/python3/.yandex_meta/override.nix
+++ b/contrib/tools/python3/.yandex_meta/override.nix
@@ -1,11 +1,11 @@
pkgs: attrs: with pkgs; with attrs; rec {
- version = "3.12.7";
+ version = "3.12.8";
src = fetchFromGitHub {
owner = "python";
repo = "cpython";
rev = "v${version}";
- hash = "sha256-do8N5njMyYapDRyjDWYsIifRlhJKVumSAE1HrWWHvdM=";
+ hash = "sha256-1Z2SMEut5YY9tTtrzPpmXcsIQKw5MGcGI4l0ysJbg28=";
};
patches = [];
diff --git a/contrib/tools/python3/Include/internal/pycore_object_state.h b/contrib/tools/python3/Include/internal/pycore_object_state.h
index 65feb5af96..6e07b1a01b 100644
--- a/contrib/tools/python3/Include/internal/pycore_object_state.h
+++ b/contrib/tools/python3/Include/internal/pycore_object_state.h
@@ -24,7 +24,13 @@ struct _py_object_state {
* together via the _ob_prev and _ob_next members of a PyObject, which
* exist only in a Py_TRACE_REFS build.
*/
- PyObject refchain;
+ PyObject *refchain;
+ /* In most cases, refchain points to _refchain_obj.
+ * In sub-interpreters that share objmalloc state with the main interp,
+ * refchain points to the main interpreter's _refchain_obj, and their own
+ * _refchain_obj is unused.
+ */
+ PyObject _refchain_obj;
#endif
int _not_used;
};
diff --git a/contrib/tools/python3/Include/internal/pycore_runtime_init.h b/contrib/tools/python3/Include/internal/pycore_runtime_init.h
index e5f9e17eff..ad90ea680a 100644
--- a/contrib/tools/python3/Include/internal/pycore_runtime_init.h
+++ b/contrib/tools/python3/Include/internal/pycore_runtime_init.h
@@ -132,15 +132,8 @@ extern PyTypeObject _PyExc_MemoryError;
.context_ver = 1, \
}
-#ifdef Py_TRACE_REFS
-# define _py_object_state_INIT(INTERP) \
- { \
- .refchain = {&INTERP.object_state.refchain, &INTERP.object_state.refchain}, \
- }
-#else
# define _py_object_state_INIT(INTERP) \
{ 0 }
-#endif
// global objects
diff --git a/contrib/tools/python3/Include/internal/pycore_typeobject.h b/contrib/tools/python3/Include/internal/pycore_typeobject.h
index 63f76fc55c..4fdbc91a1b 100644
--- a/contrib/tools/python3/Include/internal/pycore_typeobject.h
+++ b/contrib/tools/python3/Include/internal/pycore_typeobject.h
@@ -143,6 +143,8 @@ PyAPI_DATA(PyTypeObject) _PyBufferWrapper_Type;
PyObject *
_PySuper_Lookup(PyTypeObject *su_type, PyObject *su_obj, PyObject *name, int *meth_found);
+extern int _PyType_AddMethod(PyTypeObject *, PyMethodDef *);
+
#ifdef __cplusplus
}
#endif
diff --git a/contrib/tools/python3/Include/internal/pycore_unicodeobject.h b/contrib/tools/python3/Include/internal/pycore_unicodeobject.h
index 44eccdea55..cecdabe415 100644
--- a/contrib/tools/python3/Include/internal/pycore_unicodeobject.h
+++ b/contrib/tools/python3/Include/internal/pycore_unicodeobject.h
@@ -76,6 +76,9 @@ struct _Py_unicode_state {
extern void _PyUnicode_ClearInterned(PyInterpreterState *interp);
+// Like PyUnicode_AsUTF8(), but check for embedded null characters.
+extern const char* _PyUnicode_AsUTF8NoNUL(PyObject *);
+
#ifdef __cplusplus
}
diff --git a/contrib/tools/python3/Include/patchlevel.h b/contrib/tools/python3/Include/patchlevel.h
index 4f0c8fb1aa..6c597837da 100644
--- a/contrib/tools/python3/Include/patchlevel.h
+++ b/contrib/tools/python3/Include/patchlevel.h
@@ -18,12 +18,12 @@
/*--start constants--*/
#define PY_MAJOR_VERSION 3
#define PY_MINOR_VERSION 12
-#define PY_MICRO_VERSION 7
+#define PY_MICRO_VERSION 8
#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL
#define PY_RELEASE_SERIAL 0
/* Version as a string */
-#define PY_VERSION "3.12.7"
+#define PY_VERSION "3.12.8"
/*--end constants--*/
/* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2.
diff --git a/contrib/tools/python3/Lib/_collections_abc.py b/contrib/tools/python3/Lib/_collections_abc.py
index 601107d2d8..09745658de 100644
--- a/contrib/tools/python3/Lib/_collections_abc.py
+++ b/contrib/tools/python3/Lib/_collections_abc.py
@@ -973,7 +973,7 @@ class MutableMapping(Mapping):
def update(self, other=(), /, **kwds):
''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
- If E present and has a .keys() method, does: for k in E: D[k] = E[k]
+ If E present and has a .keys() method, does: for k in E.keys(): D[k] = E[k]
If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
In either case, this is followed by: for k, v in F.items(): D[k] = v
'''
diff --git a/contrib/tools/python3/Lib/_strptime.py b/contrib/tools/python3/Lib/_strptime.py
index 798cf9f9d3..dfd2bc5d8b 100644
--- a/contrib/tools/python3/Lib/_strptime.py
+++ b/contrib/tools/python3/Lib/_strptime.py
@@ -14,6 +14,7 @@ import time
import locale
import calendar
from re import compile as re_compile
+from re import sub as re_sub
from re import IGNORECASE
from re import escape as re_escape
from datetime import (date as datetime_date,
@@ -27,6 +28,18 @@ def _getlang():
# Figure out what the current language is set to.
return locale.getlocale(locale.LC_TIME)
+def _findall(haystack, needle):
+ # Find all positions of needle in haystack.
+ if not needle:
+ return
+ i = 0
+ while True:
+ i = haystack.find(needle, i)
+ if i < 0:
+ break
+ yield i
+ i += len(needle)
+
class LocaleTime(object):
"""Stores and handles locale-specific information related to time.
@@ -101,7 +114,8 @@ class LocaleTime(object):
am_pm = []
for hour in (1, 22):
time_tuple = time.struct_time((1999,3,17,hour,44,55,2,76,0))
- am_pm.append(time.strftime("%p", time_tuple).lower())
+ # br_FR has AM/PM info (' ',' ').
+ am_pm.append(time.strftime("%p", time_tuple).lower().strip())
self.am_pm = am_pm
def __calc_date_time(self):
@@ -113,42 +127,130 @@ class LocaleTime(object):
# values within the format string is very important; it eliminates
# possible ambiguity for what something represents.
time_tuple = time.struct_time((1999,3,17,22,44,55,2,76,0))
- date_time = [None, None, None]
- date_time[0] = time.strftime("%c", time_tuple).lower()
- date_time[1] = time.strftime("%x", time_tuple).lower()
- date_time[2] = time.strftime("%X", time_tuple).lower()
- replacement_pairs = [('%', '%%'), (self.f_weekday[2], '%A'),
- (self.f_month[3], '%B'), (self.a_weekday[2], '%a'),
- (self.a_month[3], '%b'), (self.am_pm[1], '%p'),
- ('1999', '%Y'), ('99', '%y'), ('22', '%H'),
- ('44', '%M'), ('55', '%S'), ('76', '%j'),
- ('17', '%d'), ('03', '%m'), ('3', '%m'),
- # '3' needed for when no leading zero.
- ('2', '%w'), ('10', '%I')]
- replacement_pairs.extend([(tz, "%Z") for tz_values in self.timezone
- for tz in tz_values])
- for offset,directive in ((0,'%c'), (1,'%x'), (2,'%X')):
- current_format = date_time[offset]
- for old, new in replacement_pairs:
+ time_tuple2 = time.struct_time((1999,1,3,1,1,1,6,3,0))
+ replacement_pairs = [
+ ('1999', '%Y'), ('99', '%y'), ('22', '%H'),
+ ('44', '%M'), ('55', '%S'), ('76', '%j'),
+ ('17', '%d'), ('03', '%m'), ('3', '%m'),
+ # '3' needed for when no leading zero.
+ ('2', '%w'), ('10', '%I'),
+ # Non-ASCII digits
+ ('\u0661\u0669\u0669\u0669', '%Y'),
+ ('\u0669\u0669', '%Oy'),
+ ('\u0662\u0662', '%OH'),
+ ('\u0664\u0664', '%OM'),
+ ('\u0665\u0665', '%OS'),
+ ('\u0661\u0667', '%Od'),
+ ('\u0660\u0663', '%Om'),
+ ('\u0663', '%Om'),
+ ('\u0662', '%Ow'),
+ ('\u0661\u0660', '%OI'),
+ ]
+ date_time = []
+ for directive in ('%c', '%x', '%X'):
+ current_format = time.strftime(directive, time_tuple).lower()
+ current_format = current_format.replace('%', '%%')
+ # The month and the day of the week formats are treated specially
+ # because of a possible ambiguity in some locales where the full
+ # and abbreviated names are equal or names of different types
+ # are equal. See doc of __find_month_format for more details.
+ lst, fmt = self.__find_weekday_format(directive)
+ if lst:
+ current_format = current_format.replace(lst[2], fmt, 1)
+ lst, fmt = self.__find_month_format(directive)
+ if lst:
+ current_format = current_format.replace(lst[3], fmt, 1)
+ if self.am_pm[1]:
# Must deal with possible lack of locale info
# manifesting itself as the empty string (e.g., Swedish's
# lack of AM/PM info) or a platform returning a tuple of empty
# strings (e.g., MacOS 9 having timezone as ('','')).
- if old:
- current_format = current_format.replace(old, new)
+ current_format = current_format.replace(self.am_pm[1], '%p')
+ for tz_values in self.timezone:
+ for tz in tz_values:
+ if tz:
+ current_format = current_format.replace(tz, "%Z")
+ # Transform all non-ASCII digits to digits in range U+0660 to U+0669.
+ current_format = re_sub(r'\d(?<![0-9])',
+ lambda m: chr(0x0660 + int(m[0])),
+ current_format)
+ for old, new in replacement_pairs:
+ current_format = current_format.replace(old, new)
# If %W is used, then Sunday, 2005-01-03 will fall on week 0 since
# 2005-01-03 occurs before the first Monday of the year. Otherwise
# %U is used.
- time_tuple = time.struct_time((1999,1,3,1,1,1,6,3,0))
- if '00' in time.strftime(directive, time_tuple):
+ if '00' in time.strftime(directive, time_tuple2):
U_W = '%W'
else:
U_W = '%U'
- date_time[offset] = current_format.replace('11', U_W)
+ current_format = current_format.replace('11', U_W)
+ date_time.append(current_format)
self.LC_date_time = date_time[0]
self.LC_date = date_time[1]
self.LC_time = date_time[2]
+ def __find_month_format(self, directive):
+ """Find the month format appropriate for the current locale.
+
+ In some locales (for example French and Hebrew), the default month
+ used in __calc_date_time has the same name in full and abbreviated
+ form. Also, the month name can by accident match other part of the
+ representation: the day of the week name (for example in Morisyen)
+ or the month number (for example in Japanese). Thus, cycle months
+ of the year and find all positions that match the month name for
+ each month, If no common positions are found, the representation
+ does not use the month name.
+ """
+ full_indices = abbr_indices = None
+ for m in range(1, 13):
+ time_tuple = time.struct_time((1999, m, 17, 22, 44, 55, 2, 76, 0))
+ datetime = time.strftime(directive, time_tuple).lower()
+ indices = set(_findall(datetime, self.f_month[m]))
+ if full_indices is None:
+ full_indices = indices
+ else:
+ full_indices &= indices
+ indices = set(_findall(datetime, self.a_month[m]))
+ if abbr_indices is None:
+ abbr_indices = indices
+ else:
+ abbr_indices &= indices
+ if not full_indices and not abbr_indices:
+ return None, None
+ if full_indices:
+ return self.f_month, '%B'
+ if abbr_indices:
+ return self.a_month, '%b'
+ return None, None
+
+ def __find_weekday_format(self, directive):
+ """Find the day of the week format appropriate for the current locale.
+
+ Similar to __find_month_format().
+ """
+ full_indices = abbr_indices = None
+ for wd in range(7):
+ time_tuple = time.struct_time((1999, 3, 17, 22, 44, 55, wd, 76, 0))
+ datetime = time.strftime(directive, time_tuple).lower()
+ indices = set(_findall(datetime, self.f_weekday[wd]))
+ if full_indices is None:
+ full_indices = indices
+ else:
+ full_indices &= indices
+ if self.f_weekday[wd] != self.a_weekday[wd]:
+ indices = set(_findall(datetime, self.a_weekday[wd]))
+ if abbr_indices is None:
+ abbr_indices = indices
+ else:
+ abbr_indices &= indices
+ if not full_indices and not abbr_indices:
+ return None, None
+ if full_indices:
+ return self.f_weekday, '%A'
+ if abbr_indices:
+ return self.a_weekday, '%a'
+ return None, None
+
def __calc_timezone(self):
# Set self.timezone by using time.tzname.
# Do not worry about possibility of time.tzname[0] == time.tzname[1]
@@ -181,12 +283,12 @@ class TimeRE(dict):
else:
self.locale_time = LocaleTime()
base = super()
- base.__init__({
+ mapping = {
# The " [1-9]" part of the regex is to make %c from ANSI C work
'd': r"(?P<d>3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])",
'f': r"(?P<f>[0-9]{1,6})",
'H': r"(?P<H>2[0-3]|[0-1]\d|\d)",
- 'I': r"(?P<I>1[0-2]|0[1-9]|[1-9])",
+ 'I': r"(?P<I>1[0-2]|0[1-9]|[1-9]| [1-9])",
'G': r"(?P<G>\d\d\d\d)",
'j': r"(?P<j>36[0-6]|3[0-5]\d|[1-2]\d\d|0[1-9]\d|00[1-9]|[1-9]\d|0[1-9]|[1-9])",
'm': r"(?P<m>1[0-2]|0[1-9]|[1-9])",
@@ -210,11 +312,15 @@ class TimeRE(dict):
'Z': self.__seqToRE((tz for tz_names in self.locale_time.timezone
for tz in tz_names),
'Z'),
- '%': '%'})
- base.__setitem__('W', base.__getitem__('U').replace('U', 'W'))
- base.__setitem__('c', self.pattern(self.locale_time.LC_date_time))
- base.__setitem__('x', self.pattern(self.locale_time.LC_date))
+ '%': '%'}
+ for d in 'dmyHIMS':
+ mapping['O' + d] = r'(?P<%s>\d\d|\d| \d)' % d
+ mapping['Ow'] = r'(?P<w>\d)'
+ mapping['W'] = mapping['U'].replace('U', 'W')
+ base.__init__(mapping)
base.__setitem__('X', self.pattern(self.locale_time.LC_time))
+ base.__setitem__('x', self.pattern(self.locale_time.LC_date))
+ base.__setitem__('c', self.pattern(self.locale_time.LC_date_time))
def __seqToRE(self, to_convert, directive):
"""Convert a list to a regex string for matching a directive.
@@ -242,21 +348,16 @@ class TimeRE(dict):
regex syntax are escaped.
"""
- processed_format = ''
# The sub() call escapes all characters that might be misconstrued
# as regex syntax. Cannot use re.escape since we have to deal with
# format directives (%m, etc.).
- regex_chars = re_compile(r"([\\.^$*+?\(\){}\[\]|])")
- format = regex_chars.sub(r"\\\1", format)
- whitespace_replacement = re_compile(r'\s+')
- format = whitespace_replacement.sub(r'\\s+', format)
- while '%' in format:
- directive_index = format.index('%')+1
- processed_format = "%s%s%s" % (processed_format,
- format[:directive_index-1],
- self[format[directive_index]])
- format = format[directive_index+1:]
- return "%s%s" % (processed_format, format)
+ format = re_sub(r"([\\.^$*+?\(\){}\[\]|])", r"\\\1", format)
+ format = re_sub(r'\s+', r'\\s+', format)
+ format = re_sub(r"'", "['\u02bc]", format) # needed for br_FR
+ def repl(m):
+ return self[m[1]]
+ format = re_sub(r'%(O?.)', repl, format)
+ return format
def compile(self, format):
"""Return a compiled re object for the format string."""
diff --git a/contrib/tools/python3/Lib/argparse.py b/contrib/tools/python3/Lib/argparse.py
index 3d01415fcf..2a8b501a44 100644
--- a/contrib/tools/python3/Lib/argparse.py
+++ b/contrib/tools/python3/Lib/argparse.py
@@ -564,8 +564,7 @@ class HelpFormatter(object):
def _format_action_invocation(self, action):
if not action.option_strings:
default = self._get_default_metavar_for_positional(action)
- metavar, = self._metavar_formatter(action, default)(1)
- return metavar
+ return ' '.join(self._metavar_formatter(action, default)(1))
else:
parts = []
@@ -589,8 +588,7 @@ class HelpFormatter(object):
if action.metavar is not None:
result = action.metavar
elif action.choices is not None:
- choice_strs = [str(choice) for choice in action.choices]
- result = '{%s}' % ','.join(choice_strs)
+ result = '{%s}' % ','.join(map(str, action.choices))
else:
result = default_metavar
@@ -638,8 +636,7 @@ class HelpFormatter(object):
if hasattr(params[name], '__name__'):
params[name] = params[name].__name__
if params.get('choices') is not None:
- choices_str = ', '.join([str(c) for c in params['choices']])
- params['choices'] = choices_str
+ params['choices'] = ', '.join(map(str, params['choices']))
return self._get_help_string(action) % params
def _iter_indented_subactions(self, action):
@@ -752,11 +749,19 @@ def _get_action_name(argument):
elif argument.option_strings:
return '/'.join(argument.option_strings)
elif argument.metavar not in (None, SUPPRESS):
- return argument.metavar
+ metavar = argument.metavar
+ if not isinstance(metavar, tuple):
+ return metavar
+ if argument.nargs == ZERO_OR_MORE and len(metavar) == 2:
+ return '%s[, %s]' % metavar
+ elif argument.nargs == ONE_OR_MORE:
+ return '%s[, %s]' % metavar
+ else:
+ return ', '.join(metavar)
elif argument.dest not in (None, SUPPRESS):
return argument.dest
elif argument.choices:
- return '{' + ','.join(argument.choices) + '}'
+ return '{%s}' % ','.join(map(str, argument.choices))
else:
return None
@@ -1557,7 +1562,11 @@ class _ActionsContainer(object):
# NOTE: if add_mutually_exclusive_group ever gains title= and
# description= then this code will need to be expanded as above
for group in container._mutually_exclusive_groups:
- mutex_group = self.add_mutually_exclusive_group(
+ if group._container is container:
+ cont = self
+ else:
+ cont = title_group_map[group._container.title]
+ mutex_group = cont.add_mutually_exclusive_group(
required=group.required)
# map the actions to their new mutex group
@@ -1902,6 +1911,9 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
return args
def parse_known_args(self, args=None, namespace=None):
+ return self._parse_known_args2(args, namespace, intermixed=False)
+
+ def _parse_known_args2(self, args, namespace, intermixed):
if args is None:
# args default to the system args
args = _sys.argv[1:]
@@ -1928,18 +1940,18 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# parse the arguments and exit if there are any errors
if self.exit_on_error:
try:
- namespace, args = self._parse_known_args(args, namespace)
+ namespace, args = self._parse_known_args(args, namespace, intermixed)
except ArgumentError as err:
self.error(str(err))
else:
- namespace, args = self._parse_known_args(args, namespace)
+ namespace, args = self._parse_known_args(args, namespace, intermixed)
if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
return namespace, args
- def _parse_known_args(self, arg_strings, namespace):
+ def _parse_known_args(self, arg_strings, namespace, intermixed):
# replace arg strings that are file references
if self.fromfile_prefix_chars is not None:
arg_strings = self._read_args_from_files(arg_strings)
@@ -2014,7 +2026,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
if len(option_tuples) > 1:
options = ', '.join([option_string
for action, option_string, sep, explicit_arg in option_tuples])
- args = {'option': arg_string, 'matches': options}
+ args = {'option': arg_strings[start_index], 'matches': options}
msg = _('ambiguous option: %(option)s could match %(matches)s')
raise ArgumentError(None, msg % args)
@@ -2029,6 +2041,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# if we found no optional action, skip it
if action is None:
extras.append(arg_strings[start_index])
+ extras_pattern.append('O')
return start_index + 1
# if there is an explicit argument, try to match the
@@ -2064,6 +2077,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
sep = ''
else:
extras.append(char + explicit_arg)
+ extras_pattern.append('O')
stop = start_index + 1
break
# if the action expect exactly one argument, we've
@@ -2134,6 +2148,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# consume Positionals and Optionals alternately, until we have
# passed the last option string
extras = []
+ extras_pattern = []
start_index = 0
if option_string_indices:
max_option_string_index = max(option_string_indices)
@@ -2146,7 +2161,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
index
for index in option_string_indices
if index >= start_index])
- if start_index != next_option_string_index:
+ if not intermixed and start_index != next_option_string_index:
positionals_end_index = consume_positionals(start_index)
# only try to parse the next optional if we didn't consume
@@ -2162,16 +2177,35 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
if start_index not in option_string_indices:
strings = arg_strings[start_index:next_option_string_index]
extras.extend(strings)
+ extras_pattern.extend(arg_strings_pattern[start_index:next_option_string_index])
start_index = next_option_string_index
# consume the next optional and any arguments for it
start_index = consume_optional(start_index)
- # consume any positionals following the last Optional
- stop_index = consume_positionals(start_index)
+ if not intermixed:
+ # consume any positionals following the last Optional
+ stop_index = consume_positionals(start_index)
- # if we didn't consume all the argument strings, there were extras
- extras.extend(arg_strings[stop_index:])
+ # if we didn't consume all the argument strings, there were extras
+ extras.extend(arg_strings[stop_index:])
+ else:
+ extras.extend(arg_strings[start_index:])
+ extras_pattern.extend(arg_strings_pattern[start_index:])
+ extras_pattern = ''.join(extras_pattern)
+ assert len(extras_pattern) == len(extras)
+ # consume all positionals
+ arg_strings = [s for s, c in zip(extras, extras_pattern) if c != 'O']
+ arg_strings_pattern = extras_pattern.replace('O', '')
+ stop_index = consume_positionals(0)
+ # leave unknown optionals and non-consumed positionals in extras
+ for i, c in enumerate(extras_pattern):
+ if not stop_index:
+ break
+ if c != 'O':
+ stop_index -= 1
+ extras[i] = None
+ extras = [s for s in extras if s is not None]
# make sure all required actions were present and also convert
# action defaults which were not given as arguments
@@ -2437,10 +2471,6 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# are then parsed. If the parser definition is incompatible with the
# intermixed assumptions (e.g. use of REMAINDER, subparsers) a
# TypeError is raised.
- #
- # positionals are 'deactivated' by setting nargs and default to
- # SUPPRESS. This blocks the addition of that positional to the
- # namespace
positionals = self._get_positional_actions()
a = [action for action in positionals
@@ -2449,59 +2479,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
raise TypeError('parse_intermixed_args: positional arg'
' with nargs=%s'%a[0].nargs)
- if [action.dest for group in self._mutually_exclusive_groups
- for action in group._group_actions if action in positionals]:
- raise TypeError('parse_intermixed_args: positional in'
- ' mutuallyExclusiveGroup')
-
- try:
- save_usage = self.usage
- try:
- if self.usage is None:
- # capture the full usage for use in error messages
- self.usage = self.format_usage()[7:]
- for action in positionals:
- # deactivate positionals
- action.save_nargs = action.nargs
- # action.nargs = 0
- action.nargs = SUPPRESS
- action.save_default = action.default
- action.default = SUPPRESS
- namespace, remaining_args = self.parse_known_args(args,
- namespace)
- for action in positionals:
- # remove the empty positional values from namespace
- if (hasattr(namespace, action.dest)
- and getattr(namespace, action.dest)==[]):
- from warnings import warn
- warn('Do not expect %s in %s' % (action.dest, namespace))
- delattr(namespace, action.dest)
- finally:
- # restore nargs and usage before exiting
- for action in positionals:
- action.nargs = action.save_nargs
- action.default = action.save_default
- optionals = self._get_optional_actions()
- try:
- # parse positionals. optionals aren't normally required, but
- # they could be, so make sure they aren't.
- for action in optionals:
- action.save_required = action.required
- action.required = False
- for group in self._mutually_exclusive_groups:
- group.save_required = group.required
- group.required = False
- namespace, extras = self.parse_known_args(remaining_args,
- namespace)
- finally:
- # restore parser values before exiting
- for action in optionals:
- action.required = action.save_required
- for group in self._mutually_exclusive_groups:
- group.required = group.save_required
- finally:
- self.usage = save_usage
- return namespace, extras
+ return self._parse_known_args2(args, namespace, intermixed=True)
# ========================
# Value conversion methods
@@ -2589,8 +2567,8 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
if isinstance(choices, str):
choices = iter(choices)
if value not in choices:
- args = {'value': value,
- 'choices': ', '.join(map(repr, action.choices))}
+ args = {'value': str(value),
+ 'choices': ', '.join(map(str, action.choices))}
msg = _('invalid choice: %(value)r (choose from %(choices)s)')
raise ArgumentError(action, msg % args)
diff --git a/contrib/tools/python3/Lib/asyncio/__main__.py b/contrib/tools/python3/Lib/asyncio/__main__.py
index 0465580115..29e528aeed 100644
--- a/contrib/tools/python3/Lib/asyncio/__main__.py
+++ b/contrib/tools/python3/Lib/asyncio/__main__.py
@@ -2,6 +2,7 @@ import ast
import asyncio
import code
import concurrent.futures
+import contextvars
import inspect
import sys
import threading
@@ -17,6 +18,7 @@ class AsyncIOInteractiveConsole(code.InteractiveConsole):
super().__init__(locals)
self.compile.compiler.flags |= ast.PyCF_ALLOW_TOP_LEVEL_AWAIT
self.loop = loop
+ self.context = contextvars.copy_context()
def runcode(self, code):
future = concurrent.futures.Future()
@@ -46,12 +48,12 @@ class AsyncIOInteractiveConsole(code.InteractiveConsole):
return
try:
- repl_future = self.loop.create_task(coro)
+ repl_future = self.loop.create_task(coro, context=self.context)
futures._chain_future(repl_future, future)
except BaseException as exc:
future.set_exception(exc)
- loop.call_soon_threadsafe(callback)
+ loop.call_soon_threadsafe(callback, context=self.context)
try:
return future.result()
diff --git a/contrib/tools/python3/Lib/asyncio/base_events.py b/contrib/tools/python3/Lib/asyncio/base_events.py
index cb037fd472..3146f7f3f6 100644
--- a/contrib/tools/python3/Lib/asyncio/base_events.py
+++ b/contrib/tools/python3/Lib/asyncio/base_events.py
@@ -17,7 +17,6 @@ import collections
import collections.abc
import concurrent.futures
import errno
-import functools
import heapq
import itertools
import os
@@ -1106,11 +1105,18 @@ class BaseEventLoop(events.AbstractEventLoop):
except OSError:
continue
else: # using happy eyeballs
- sock, _, _ = await staggered.staggered_race(
- (functools.partial(self._connect_sock,
- exceptions, addrinfo, laddr_infos)
- for addrinfo in infos),
- happy_eyeballs_delay, loop=self)
+ sock = (await staggered.staggered_race(
+ (
+ # can't use functools.partial as it keeps a reference
+ # to exceptions
+ lambda addrinfo=addrinfo: self._connect_sock(
+ exceptions, addrinfo, laddr_infos
+ )
+ for addrinfo in infos
+ ),
+ happy_eyeballs_delay,
+ loop=self,
+ ))[0] # can't use sock, _, _ as it keeks a reference to exceptions
if sock is None:
exceptions = [exc for sub in exceptions for exc in sub]
diff --git a/contrib/tools/python3/Lib/asyncio/futures.py b/contrib/tools/python3/Lib/asyncio/futures.py
index fd486f02c6..0c530bbdbc 100644
--- a/contrib/tools/python3/Lib/asyncio/futures.py
+++ b/contrib/tools/python3/Lib/asyncio/futures.py
@@ -194,8 +194,7 @@ class Future:
the future is done and has an exception set, this exception is raised.
"""
if self._state == _CANCELLED:
- exc = self._make_cancelled_error()
- raise exc
+ raise self._make_cancelled_error()
if self._state != _FINISHED:
raise exceptions.InvalidStateError('Result is not ready.')
self.__log_traceback = False
@@ -212,8 +211,7 @@ class Future:
InvalidStateError.
"""
if self._state == _CANCELLED:
- exc = self._make_cancelled_error()
- raise exc
+ raise self._make_cancelled_error()
if self._state != _FINISHED:
raise exceptions.InvalidStateError('Exception is not set.')
self.__log_traceback = False
diff --git a/contrib/tools/python3/Lib/asyncio/sslproto.py b/contrib/tools/python3/Lib/asyncio/sslproto.py
index e51669a2ab..29e72b1fd9 100644
--- a/contrib/tools/python3/Lib/asyncio/sslproto.py
+++ b/contrib/tools/python3/Lib/asyncio/sslproto.py
@@ -101,7 +101,7 @@ class _SSLProtocolTransport(transports._FlowControlMixin,
return self._ssl_protocol._app_protocol
def is_closing(self):
- return self._closed
+ return self._closed or self._ssl_protocol._is_transport_closing()
def close(self):
"""Close the transport.
@@ -379,6 +379,9 @@ class SSLProtocol(protocols.BufferedProtocol):
self._app_transport_created = True
return self._app_transport
+ def _is_transport_closing(self):
+ return self._transport is not None and self._transport.is_closing()
+
def connection_made(self, transport):
"""Called when the low-level connection is made.
diff --git a/contrib/tools/python3/Lib/asyncio/staggered.py b/contrib/tools/python3/Lib/asyncio/staggered.py
index c3a7441a7b..0f4df8855a 100644
--- a/contrib/tools/python3/Lib/asyncio/staggered.py
+++ b/contrib/tools/python3/Lib/asyncio/staggered.py
@@ -69,7 +69,11 @@ async def staggered_race(coro_fns, delay, *, loop=None):
exceptions = []
running_tasks = []
- async def run_one_coro(previous_failed) -> None:
+ async def run_one_coro(ok_to_start, previous_failed) -> None:
+ # in eager tasks this waits for the calling task to append this task
+ # to running_tasks, in regular tasks this wait is a no-op that does
+ # not yield a future. See gh-124309.
+ await ok_to_start.wait()
# Wait for the previous task to finish, or for delay seconds
if previous_failed is not None:
with contextlib.suppress(exceptions_mod.TimeoutError):
@@ -85,8 +89,12 @@ async def staggered_race(coro_fns, delay, *, loop=None):
return
# Start task that will run the next coroutine
this_failed = locks.Event()
- next_task = loop.create_task(run_one_coro(this_failed))
+ next_ok_to_start = locks.Event()
+ next_task = loop.create_task(run_one_coro(next_ok_to_start, this_failed))
running_tasks.append(next_task)
+ # next_task has been appended to running_tasks so next_task is ok to
+ # start.
+ next_ok_to_start.set()
assert len(running_tasks) == this_index + 2
# Prepare place to put this coroutine's exceptions if not won
exceptions.append(None)
@@ -116,8 +124,11 @@ async def staggered_race(coro_fns, delay, *, loop=None):
if i != this_index:
t.cancel()
- first_task = loop.create_task(run_one_coro(None))
+ ok_to_start = locks.Event()
+ first_task = loop.create_task(run_one_coro(ok_to_start, None))
running_tasks.append(first_task)
+ # first_task has been appended to running_tasks so first_task is ok to start.
+ ok_to_start.set()
try:
# Wait for a growing list of tasks to all finish: poor man's version of
# curio's TaskGroup or trio's nursery
@@ -133,6 +144,7 @@ async def staggered_race(coro_fns, delay, *, loop=None):
raise d.exception()
return winner_result, winner_index, exceptions
finally:
+ del exceptions
# Make sure no tasks are left running if we leave this function
for t in running_tasks:
t.cancel()
diff --git a/contrib/tools/python3/Lib/asyncio/taskgroups.py b/contrib/tools/python3/Lib/asyncio/taskgroups.py
index d264e51f1f..aada3ffa8e 100644
--- a/contrib/tools/python3/Lib/asyncio/taskgroups.py
+++ b/contrib/tools/python3/Lib/asyncio/taskgroups.py
@@ -66,6 +66,20 @@ class TaskGroup:
return self
async def __aexit__(self, et, exc, tb):
+ tb = None
+ try:
+ return await self._aexit(et, exc)
+ finally:
+ # Exceptions are heavy objects that can have object
+ # cycles (bad for GC); let's not keep a reference to
+ # a bunch of them. It would be nicer to use a try/finally
+ # in __aexit__ directly but that introduced some diff noise
+ self._parent_task = None
+ self._errors = None
+ self._base_error = None
+ exc = None
+
+ async def _aexit(self, et, exc):
self._exiting = True
if (exc is not None and
@@ -126,25 +140,34 @@ class TaskGroup:
assert not self._tasks
if self._base_error is not None:
- raise self._base_error
+ try:
+ raise self._base_error
+ finally:
+ exc = None
# Propagate CancelledError if there is one, except if there
# are other errors -- those have priority.
- if propagate_cancellation_error and not self._errors:
- raise propagate_cancellation_error
+ try:
+ if propagate_cancellation_error and not self._errors:
+ try:
+ raise propagate_cancellation_error
+ finally:
+ exc = None
+ finally:
+ propagate_cancellation_error = None
if et is not None and et is not exceptions.CancelledError:
self._errors.append(exc)
if self._errors:
- # Exceptions are heavy objects that can have object
- # cycles (bad for GC); let's not keep a reference to
- # a bunch of them.
try:
- me = BaseExceptionGroup('unhandled errors in a TaskGroup', self._errors)
- raise me from None
+ raise BaseExceptionGroup(
+ 'unhandled errors in a TaskGroup',
+ self._errors,
+ ) from None
finally:
- self._errors = None
+ exc = None
+
def create_task(self, coro, *, name=None, context=None):
"""Create a new task in this group and return it.
diff --git a/contrib/tools/python3/Lib/bdb.py b/contrib/tools/python3/Lib/bdb.py
index 564d6c5e53..196e6b178c 100644
--- a/contrib/tools/python3/Lib/bdb.py
+++ b/contrib/tools/python3/Lib/bdb.py
@@ -295,9 +295,10 @@ class Bdb:
# Issue #13183: pdb skips frames after hitting a breakpoint and running
# step commands.
# Restore the trace function in the caller (that may not have been set
- # for performance reasons) when returning from the current frame.
+ # for performance reasons) when returning from the current frame, unless
+ # the caller is the botframe.
caller_frame = current_frame.f_back
- if caller_frame and not caller_frame.f_trace:
+ if caller_frame and not caller_frame.f_trace and caller_frame is not self.botframe:
caller_frame.f_trace = self.trace_dispatch
# Derived classes and clients can call the following methods
diff --git a/contrib/tools/python3/Lib/calendar.py b/contrib/tools/python3/Lib/calendar.py
index ee3ec838c9..3509648435 100644
--- a/contrib/tools/python3/Lib/calendar.py
+++ b/contrib/tools/python3/Lib/calendar.py
@@ -28,7 +28,9 @@ __all__ = ["IllegalMonthError", "IllegalWeekdayError", "setfirstweekday",
error = ValueError
# Exceptions raised for bad input
-class IllegalMonthError(ValueError):
+# This is trick for backward compatibility. Since 3.13, we will raise IllegalMonthError instead of
+# IndexError for bad month number(out of 1-12). But we can't remove IndexError for backward compatibility.
+class IllegalMonthError(ValueError, IndexError):
def __init__(self, month):
self.month = month
def __str__(self):
@@ -158,11 +160,14 @@ def weekday(year, month, day):
return Day(datetime.date(year, month, day).weekday())
+def _validate_month(month):
+ if not 1 <= month <= 12:
+ raise IllegalMonthError(month)
+
def monthrange(year, month):
"""Return weekday of first day of month (0-6 ~ Mon-Sun)
and number of days (28-31) for year, month."""
- if not 1 <= month <= 12:
- raise IllegalMonthError(month)
+ _validate_month(month)
day1 = weekday(year, month, 1)
ndays = mdays[month] + (month == FEBRUARY and isleap(year))
return day1, ndays
@@ -370,6 +375,8 @@ class TextCalendar(Calendar):
"""
Return a formatted month name.
"""
+ _validate_month(themonth)
+
s = month_name[themonth]
if withyear:
s = "%s %r" % (s, theyear)
@@ -500,6 +507,7 @@ class HTMLCalendar(Calendar):
"""
Return a month name as a table row.
"""
+ _validate_month(themonth)
if withyear:
s = '%s %s' % (month_name[themonth], theyear)
else:
@@ -781,6 +789,8 @@ def main(args):
if options.month is None:
optdict["c"] = options.spacing
optdict["m"] = options.months
+ if options.month is not None:
+ _validate_month(options.month)
if options.year is None:
result = cal.formatyear(datetime.date.today().year, **optdict)
elif options.month is None:
diff --git a/contrib/tools/python3/Lib/concurrent/futures/process.py b/contrib/tools/python3/Lib/concurrent/futures/process.py
index 0e45288396..ff7c17efaa 100644
--- a/contrib/tools/python3/Lib/concurrent/futures/process.py
+++ b/contrib/tools/python3/Lib/concurrent/futures/process.py
@@ -68,27 +68,31 @@ _global_shutdown = False
class _ThreadWakeup:
def __init__(self):
self._closed = False
+ self._lock = threading.Lock()
self._reader, self._writer = mp.Pipe(duplex=False)
def close(self):
- # Please note that we do not take the shutdown lock when
+ # Please note that we do not take the self._lock when
# calling clear() (to avoid deadlocking) so this method can
# only be called safely from the same thread as all calls to
- # clear() even if you hold the shutdown lock. Otherwise we
+ # clear() even if you hold the lock. Otherwise we
# might try to read from the closed pipe.
- if not self._closed:
- self._closed = True
- self._writer.close()
- self._reader.close()
+ with self._lock:
+ if not self._closed:
+ self._closed = True
+ self._writer.close()
+ self._reader.close()
def wakeup(self):
- if not self._closed:
- self._writer.send_bytes(b"")
+ with self._lock:
+ if not self._closed:
+ self._writer.send_bytes(b"")
def clear(self):
- if not self._closed:
- while self._reader.poll():
- self._reader.recv_bytes()
+ if self._closed:
+ raise RuntimeError('operation on closed _ThreadWakeup')
+ while self._reader.poll():
+ self._reader.recv_bytes()
def _python_exit():
@@ -167,10 +171,8 @@ class _CallItem(object):
class _SafeQueue(Queue):
"""Safe Queue set exception to the future object linked to a job"""
- def __init__(self, max_size=0, *, ctx, pending_work_items, shutdown_lock,
- thread_wakeup):
+ def __init__(self, max_size=0, *, ctx, pending_work_items, thread_wakeup):
self.pending_work_items = pending_work_items
- self.shutdown_lock = shutdown_lock
self.thread_wakeup = thread_wakeup
super().__init__(max_size, ctx=ctx)
@@ -179,8 +181,7 @@ class _SafeQueue(Queue):
tb = format_exception(type(e), e, e.__traceback__)
e.__cause__ = _RemoteTraceback('\n"""\n{}"""'.format(''.join(tb)))
work_item = self.pending_work_items.pop(obj.work_id, None)
- with self.shutdown_lock:
- self.thread_wakeup.wakeup()
+ self.thread_wakeup.wakeup()
# work_item can be None if another process terminated. In this
# case, the executor_manager_thread fails all work_items
# with BrokenProcessPool
@@ -305,12 +306,10 @@ class _ExecutorManagerThread(threading.Thread):
# will wake up the queue management thread so that it can terminate
# if there is no pending work item.
def weakref_cb(_,
- thread_wakeup=self.thread_wakeup,
- shutdown_lock=self.shutdown_lock):
+ thread_wakeup=self.thread_wakeup):
mp.util.debug('Executor collected: triggering callback for'
' QueueManager wakeup')
- with shutdown_lock:
- thread_wakeup.wakeup()
+ thread_wakeup.wakeup()
self.executor_reference = weakref.ref(executor, weakref_cb)
@@ -438,11 +437,6 @@ class _ExecutorManagerThread(threading.Thread):
elif wakeup_reader in ready:
is_broken = False
- # No need to hold the _shutdown_lock here because:
- # 1. we're the only thread to use the wakeup reader
- # 2. we're also the only thread to call thread_wakeup.close()
- # 3. we want to avoid a possible deadlock when both reader and writer
- # would block (gh-105829)
self.thread_wakeup.clear()
return result_item, is_broken, cause
@@ -740,10 +734,9 @@ class ProcessPoolExecutor(_base.Executor):
# as it could result in a deadlock if a worker process dies with the
# _result_queue write lock still acquired.
#
- # _shutdown_lock must be locked to access _ThreadWakeup.close() and
- # .wakeup(). Care must also be taken to not call clear or close from
- # more than one thread since _ThreadWakeup.clear() is not protected by
- # the _shutdown_lock
+ # Care must be taken to only call clear and close from the
+ # executor_manager_thread, since _ThreadWakeup.clear() is not protected
+ # by a lock.
self._executor_manager_thread_wakeup = _ThreadWakeup()
# Create communication channels for the executor
@@ -754,7 +747,6 @@ class ProcessPoolExecutor(_base.Executor):
self._call_queue = _SafeQueue(
max_size=queue_size, ctx=self._mp_context,
pending_work_items=self._pending_work_items,
- shutdown_lock=self._shutdown_lock,
thread_wakeup=self._executor_manager_thread_wakeup)
# Killed worker processes can produce spurious "broken pipe"
# tracebacks in the queue's own worker thread. But we detect killed
diff --git a/contrib/tools/python3/Lib/concurrent/futures/thread.py b/contrib/tools/python3/Lib/concurrent/futures/thread.py
index 3b3a36a509..61dbff8a48 100644
--- a/contrib/tools/python3/Lib/concurrent/futures/thread.py
+++ b/contrib/tools/python3/Lib/concurrent/futures/thread.py
@@ -41,6 +41,7 @@ if hasattr(os, 'register_at_fork'):
os.register_at_fork(before=_global_shutdown_lock.acquire,
after_in_child=_global_shutdown_lock._at_fork_reinit,
after_in_parent=_global_shutdown_lock.release)
+ os.register_at_fork(after_in_child=_threads_queues.clear)
class _WorkItem:
diff --git a/contrib/tools/python3/Lib/email/_policybase.py b/contrib/tools/python3/Lib/email/_policybase.py
index 5f9aa9fb09..c9f0d74309 100644
--- a/contrib/tools/python3/Lib/email/_policybase.py
+++ b/contrib/tools/python3/Lib/email/_policybase.py
@@ -302,12 +302,12 @@ class Compat32(Policy):
"""+
The name is parsed as everything up to the ':' and returned unmodified.
The value is determined by stripping leading whitespace off the
- remainder of the first line, joining all subsequent lines together, and
+ remainder of the first line joined with all subsequent lines, and
stripping any trailing carriage return or linefeed characters.
"""
name, value = sourcelines[0].split(':', 1)
- value = value.lstrip(' \t') + ''.join(sourcelines[1:])
+ value = ''.join((value, *sourcelines[1:])).lstrip(' \t\r\n')
return (name, value.rstrip('\r\n'))
def header_store_parse(self, name, value):
diff --git a/contrib/tools/python3/Lib/email/policy.py b/contrib/tools/python3/Lib/email/policy.py
index 46b7de5bb6..6e109b6501 100644
--- a/contrib/tools/python3/Lib/email/policy.py
+++ b/contrib/tools/python3/Lib/email/policy.py
@@ -119,13 +119,13 @@ class EmailPolicy(Policy):
"""+
The name is parsed as everything up to the ':' and returned unmodified.
The value is determined by stripping leading whitespace off the
- remainder of the first line, joining all subsequent lines together, and
+ remainder of the first line joined with all subsequent lines, and
stripping any trailing carriage return or linefeed characters. (This
is the same as Compat32).
"""
name, value = sourcelines[0].split(':', 1)
- value = value.lstrip(' \t') + ''.join(sourcelines[1:])
+ value = ''.join((value, *sourcelines[1:])).lstrip(' \t\r\n')
return (name, value.rstrip('\r\n'))
def header_store_parse(self, name, value):
diff --git a/contrib/tools/python3/Lib/ensurepip/__init__.py b/contrib/tools/python3/Lib/ensurepip/__init__.py
index a7c8457238..35d04d2f8b 100644
--- a/contrib/tools/python3/Lib/ensurepip/__init__.py
+++ b/contrib/tools/python3/Lib/ensurepip/__init__.py
@@ -10,7 +10,7 @@ from importlib import resources
__all__ = ["version", "bootstrap"]
_PACKAGE_NAMES = ('pip',)
-_PIP_VERSION = "24.2"
+_PIP_VERSION = "24.3.1"
_PROJECTS = [
("pip", _PIP_VERSION, "py3"),
]
diff --git a/contrib/tools/python3/Lib/enum.py b/contrib/tools/python3/Lib/enum.py
index d9859b3c0a..eaa517e2fb 100644
--- a/contrib/tools/python3/Lib/enum.py
+++ b/contrib/tools/python3/Lib/enum.py
@@ -592,19 +592,13 @@ class EnumType(type):
classdict['_all_bits_'] = 0
classdict['_inverted_'] = None
try:
- exc = None
enum_class = super().__new__(metacls, cls, bases, classdict, **kwds)
except Exception as e:
- # since 3.12 the line "Error calling __set_name__ on '_proto_member' instance ..."
- # is tacked on to the error instead of raising a RuntimeError
- # recreate the exception to discard
- exc = type(e)(str(e))
- exc.__cause__ = e.__cause__
- exc.__context__ = e.__context__
- tb = e.__traceback__
- if exc is not None:
- raise exc.with_traceback(tb)
- #
+ # since 3.12 the note "Error calling __set_name__ on '_proto_member' instance ..."
+ # is tacked on to the error instead of raising a RuntimeError, so discard it
+ if hasattr(e, '__notes__'):
+ del e.__notes__
+ raise
# update classdict with any changes made by __init_subclass__
classdict.update(enum_class.__dict__)
#
diff --git a/contrib/tools/python3/Lib/functools.py b/contrib/tools/python3/Lib/functools.py
index 318efd04fd..f6849899e7 100644
--- a/contrib/tools/python3/Lib/functools.py
+++ b/contrib/tools/python3/Lib/functools.py
@@ -238,12 +238,14 @@ def reduce(function, sequence, initial=_initial_missing):
"""
reduce(function, iterable[, initial]) -> value
- Apply a function of two arguments cumulatively to the items of a sequence
- or iterable, from left to right, so as to reduce the iterable to a single
- value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
- ((((1+2)+3)+4)+5). If initial is present, it is placed before the items
- of the iterable in the calculation, and serves as a default when the
- iterable is empty.
+ Apply a function of two arguments cumulatively to the items of an iterable, from left to right.
+
+ This effectively reduces the iterable to a single value. If initial is present,
+ it is placed before the items of the iterable in the calculation, and serves as
+ a default when the iterable is empty.
+
+ For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
+ calculates ((((1 + 2) + 3) + 4) + 5).
"""
it = iter(sequence)
diff --git a/contrib/tools/python3/Lib/importlib/__init__.py b/contrib/tools/python3/Lib/importlib/__init__.py
index 707c081cb2..5b92442fc3 100644
--- a/contrib/tools/python3/Lib/importlib/__init__.py
+++ b/contrib/tools/python3/Lib/importlib/__init__.py
@@ -105,7 +105,7 @@ def reload(module):
try:
name = module.__name__
except AttributeError:
- raise TypeError("reload() argument must be a module")
+ raise TypeError("reload() argument must be a module") from None
if sys.modules.get(name) is not module:
raise ImportError(f"module {name} not in sys.modules", name=name)
diff --git a/contrib/tools/python3/Lib/importlib/_bootstrap_external.py b/contrib/tools/python3/Lib/importlib/_bootstrap_external.py
index 61dafc0f4c..9b8a8dfc5a 100644
--- a/contrib/tools/python3/Lib/importlib/_bootstrap_external.py
+++ b/contrib/tools/python3/Lib/importlib/_bootstrap_external.py
@@ -204,7 +204,11 @@ def _write_atomic(path, data, mode=0o666):
# We first write data to a temporary file, and then use os.replace() to
# perform an atomic rename.
with _io.FileIO(fd, 'wb') as file:
- file.write(data)
+ bytes_written = file.write(data)
+ if bytes_written != len(data):
+ # Raise an OSError so the 'except' below cleans up the partially
+ # written file.
+ raise OSError("os.write() didn't write the full pyc file")
_os.replace(path_tmp, path)
except OSError:
try:
diff --git a/contrib/tools/python3/Lib/inspect.py b/contrib/tools/python3/Lib/inspect.py
index c43faa7315..b630cb2835 100644
--- a/contrib/tools/python3/Lib/inspect.py
+++ b/contrib/tools/python3/Lib/inspect.py
@@ -1638,11 +1638,15 @@ def getclosurevars(func):
global_vars = {}
builtin_vars = {}
unbound_names = set()
- for name in code.co_names:
- if name in ("None", "True", "False"):
- # Because these used to be builtins instead of keywords, they
- # may still show up as name references. We ignore them.
- continue
+ global_names = set()
+ for instruction in dis.get_instructions(code):
+ opname = instruction.opname
+ name = instruction.argval
+ if opname == "LOAD_ATTR":
+ unbound_names.add(name)
+ elif opname == "LOAD_GLOBAL":
+ global_names.add(name)
+ for name in global_names:
try:
global_vars[name] = global_ns[name]
except KeyError:
diff --git a/contrib/tools/python3/Lib/json/decoder.py b/contrib/tools/python3/Lib/json/decoder.py
index c5d9ae2d0d..5e5effeac0 100644
--- a/contrib/tools/python3/Lib/json/decoder.py
+++ b/contrib/tools/python3/Lib/json/decoder.py
@@ -50,17 +50,18 @@ _CONSTANTS = {
}
+HEXDIGITS = re.compile(r'[0-9A-Fa-f]{4}', FLAGS)
STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS)
BACKSLASH = {
'"': '"', '\\': '\\', '/': '/',
'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t',
}
-def _decode_uXXXX(s, pos):
- esc = s[pos + 1:pos + 5]
- if len(esc) == 4 and esc[1] not in 'xX':
+def _decode_uXXXX(s, pos, _m=HEXDIGITS.match):
+ esc = _m(s, pos + 1)
+ if esc is not None:
try:
- return int(esc, 16)
+ return int(esc.group(), 16)
except ValueError:
pass
msg = "Invalid \\uXXXX escape"
diff --git a/contrib/tools/python3/Lib/json/scanner.py b/contrib/tools/python3/Lib/json/scanner.py
index 7a61cfc2d2..090897515f 100644
--- a/contrib/tools/python3/Lib/json/scanner.py
+++ b/contrib/tools/python3/Lib/json/scanner.py
@@ -9,7 +9,7 @@ except ImportError:
__all__ = ['make_scanner']
NUMBER_RE = re.compile(
- r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?',
+ r'(-?(?:0|[1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?',
(re.VERBOSE | re.MULTILINE | re.DOTALL))
def py_make_scanner(context):
diff --git a/contrib/tools/python3/Lib/logging/config.py b/contrib/tools/python3/Lib/logging/config.py
index ac90b537d8..c128bc7a61 100644
--- a/contrib/tools/python3/Lib/logging/config.py
+++ b/contrib/tools/python3/Lib/logging/config.py
@@ -502,7 +502,7 @@ class BaseConfigurator(object):
def _is_queue_like_object(obj):
"""Check that *obj* implements the Queue API."""
- if isinstance(obj, queue.Queue):
+ if isinstance(obj, (queue.Queue, queue.SimpleQueue)):
return True
# defer importing multiprocessing as much as possible
from multiprocessing.queues import Queue as MPQueue
@@ -519,13 +519,13 @@ def _is_queue_like_object(obj):
# Ideally, we would have wanted to simply use strict type checking
# instead of a protocol-based type checking since the latter does
# not check the method signatures.
- queue_interface = [
- 'empty', 'full', 'get', 'get_nowait',
- 'put', 'put_nowait', 'join', 'qsize',
- 'task_done',
- ]
+ #
+ # Note that only 'put_nowait' and 'get' are required by the logging
+ # queue handler and queue listener (see gh-124653) and that other
+ # methods are either optional or unused.
+ minimal_queue_interface = ['put_nowait', 'get']
return all(callable(getattr(obj, method, None))
- for method in queue_interface)
+ for method in minimal_queue_interface)
class DictConfigurator(BaseConfigurator):
"""
diff --git a/contrib/tools/python3/Lib/multiprocessing/connection.py b/contrib/tools/python3/Lib/multiprocessing/connection.py
index d0582e3cd5..fdbc3bda7d 100644
--- a/contrib/tools/python3/Lib/multiprocessing/connection.py
+++ b/contrib/tools/python3/Lib/multiprocessing/connection.py
@@ -956,7 +956,7 @@ def answer_challenge(connection, authkey: bytes):
f'Protocol error, expected challenge: {message=}')
message = message[len(_CHALLENGE):]
if len(message) < _MD5ONLY_MESSAGE_LENGTH:
- raise AuthenticationError('challenge too short: {len(message)} bytes')
+ raise AuthenticationError(f'challenge too short: {len(message)} bytes')
digest = _create_response(authkey, message)
connection.send_bytes(digest)
response = connection.recv_bytes(256) # reject large message
diff --git a/contrib/tools/python3/Lib/multiprocessing/forkserver.py b/contrib/tools/python3/Lib/multiprocessing/forkserver.py
index 4642707dae..9fb563276e 100644
--- a/contrib/tools/python3/Lib/multiprocessing/forkserver.py
+++ b/contrib/tools/python3/Lib/multiprocessing/forkserver.py
@@ -167,6 +167,8 @@ class ForkServer(object):
def main(listener_fd, alive_r, preload, main_path=None, sys_path=None):
'''Run forkserver.'''
if preload:
+ if sys_path is not None:
+ sys.path[:] = sys_path
if '__main__' in preload and main_path is not None:
process.current_process()._inheriting = True
try:
diff --git a/contrib/tools/python3/Lib/multiprocessing/managers.py b/contrib/tools/python3/Lib/multiprocessing/managers.py
index 75d9c18c20..010d16e149 100644
--- a/contrib/tools/python3/Lib/multiprocessing/managers.py
+++ b/contrib/tools/python3/Lib/multiprocessing/managers.py
@@ -755,22 +755,29 @@ class BaseProxy(object):
_address_to_local = {}
_mutex = util.ForkAwareThreadLock()
+ # Each instance gets a `_serial` number. Unlike `id(...)`, this number
+ # is never reused.
+ _next_serial = 1
+
def __init__(self, token, serializer, manager=None,
authkey=None, exposed=None, incref=True, manager_owned=False):
with BaseProxy._mutex:
- tls_idset = BaseProxy._address_to_local.get(token.address, None)
- if tls_idset is None:
- tls_idset = util.ForkAwareLocal(), ProcessLocalSet()
- BaseProxy._address_to_local[token.address] = tls_idset
+ tls_serials = BaseProxy._address_to_local.get(token.address, None)
+ if tls_serials is None:
+ tls_serials = util.ForkAwareLocal(), ProcessLocalSet()
+ BaseProxy._address_to_local[token.address] = tls_serials
+
+ self._serial = BaseProxy._next_serial
+ BaseProxy._next_serial += 1
# self._tls is used to record the connection used by this
# thread to communicate with the manager at token.address
- self._tls = tls_idset[0]
+ self._tls = tls_serials[0]
- # self._idset is used to record the identities of all shared
- # objects for which the current process owns references and
+ # self._all_serials is a set used to record the identities of all
+ # shared objects for which the current process owns references and
# which are in the manager at token.address
- self._idset = tls_idset[1]
+ self._all_serials = tls_serials[1]
self._token = token
self._id = self._token.id
@@ -850,20 +857,20 @@ class BaseProxy(object):
dispatch(conn, None, 'incref', (self._id,))
util.debug('INCREF %r', self._token.id)
- self._idset.add(self._id)
+ self._all_serials.add(self._serial)
state = self._manager and self._manager._state
self._close = util.Finalize(
self, BaseProxy._decref,
- args=(self._token, self._authkey, state,
- self._tls, self._idset, self._Client),
+ args=(self._token, self._serial, self._authkey, state,
+ self._tls, self._all_serials, self._Client),
exitpriority=10
)
@staticmethod
- def _decref(token, authkey, state, tls, idset, _Client):
- idset.discard(token.id)
+ def _decref(token, serial, authkey, state, tls, idset, _Client):
+ idset.discard(serial)
# check whether manager is still alive
if state is None or state.value == State.STARTED:
diff --git a/contrib/tools/python3/Lib/multiprocessing/synchronize.py b/contrib/tools/python3/Lib/multiprocessing/synchronize.py
index 3ccbfe311c..0f682b9a09 100644
--- a/contrib/tools/python3/Lib/multiprocessing/synchronize.py
+++ b/contrib/tools/python3/Lib/multiprocessing/synchronize.py
@@ -174,7 +174,7 @@ class Lock(SemLock):
name = process.current_process().name
if threading.current_thread().name != 'MainThread':
name += '|' + threading.current_thread().name
- elif self._semlock._get_value() == 1:
+ elif not self._semlock._is_zero():
name = 'None'
elif self._semlock._count() > 0:
name = 'SomeOtherThread'
@@ -200,7 +200,7 @@ class RLock(SemLock):
if threading.current_thread().name != 'MainThread':
name += '|' + threading.current_thread().name
count = self._semlock._count()
- elif self._semlock._get_value() == 1:
+ elif not self._semlock._is_zero():
name, count = 'None', 0
elif self._semlock._count() > 0:
name, count = 'SomeOtherThread', 'nonzero'
diff --git a/contrib/tools/python3/Lib/ntpath.py b/contrib/tools/python3/Lib/ntpath.py
index 2e290dcf9d..c05e965fcb 100644
--- a/contrib/tools/python3/Lib/ntpath.py
+++ b/contrib/tools/python3/Lib/ntpath.py
@@ -561,28 +561,21 @@ except ImportError:
return prefix + sep.join(comps)
-def _abspath_fallback(path):
- """Return the absolute version of a path as a fallback function in case
- `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for
- more.
-
- """
-
- path = os.fspath(path)
- if not isabs(path):
- if isinstance(path, bytes):
- cwd = os.getcwdb()
- else:
- cwd = os.getcwd()
- path = join(cwd, path)
- return normpath(path)
-
# Return an absolute path.
try:
from nt import _getfullpathname
except ImportError: # not running on Windows - mock up something sensible
- abspath = _abspath_fallback
+ def abspath(path):
+ """Return the absolute version of a path."""
+ path = os.fspath(path)
+ if not isabs(path):
+ if isinstance(path, bytes):
+ cwd = os.getcwdb()
+ else:
+ cwd = os.getcwd()
+ path = join(cwd, path)
+ return normpath(path)
else: # use native Windows method on Windows
def abspath(path):
@@ -590,7 +583,27 @@ else: # use native Windows method on Windows
try:
return _getfullpathname(normpath(path))
except (OSError, ValueError):
- return _abspath_fallback(path)
+ # See gh-75230, handle outside for cleaner traceback
+ pass
+ path = os.fspath(path)
+ if not isabs(path):
+ if isinstance(path, bytes):
+ sep = b'\\'
+ getcwd = os.getcwdb
+ else:
+ sep = '\\'
+ getcwd = os.getcwd
+ drive, root, path = splitroot(path)
+ # Either drive or root can be nonempty, but not both.
+ if drive or root:
+ try:
+ path = join(_getfullpathname(drive + root), path)
+ except (OSError, ValueError):
+ # Drive "\0:" cannot exist; use the root directory.
+ path = drive + sep + path
+ else:
+ path = join(getcwd(), path)
+ return normpath(path)
try:
from nt import _getfinalpathname, readlink as _nt_readlink
diff --git a/contrib/tools/python3/Lib/nturl2path.py b/contrib/tools/python3/Lib/nturl2path.py
index 61852aff58..757fd01bec 100644
--- a/contrib/tools/python3/Lib/nturl2path.py
+++ b/contrib/tools/python3/Lib/nturl2path.py
@@ -15,32 +15,29 @@ def url2pathname(url):
# become
# C:\foo\bar\spam.foo
import string, urllib.parse
+ if url[:3] == '///':
+ # URL has an empty authority section, so the path begins on the third
+ # character.
+ url = url[2:]
+ elif url[:12] == '//localhost/':
+ # Skip past 'localhost' authority.
+ url = url[11:]
+ if url[:3] == '///':
+ # Skip past extra slash before UNC drive in URL path.
+ url = url[1:]
# Windows itself uses ":" even in URLs.
url = url.replace(':', '|')
if not '|' in url:
# No drive specifier, just convert slashes
- if url[:4] == '////':
- # path is something like ////host/path/on/remote/host
- # convert this to \\host\path\on\remote\host
- # (notice halving of slashes at the start of the path)
- url = url[2:]
- components = url.split('/')
# make sure not to convert quoted slashes :-)
- return urllib.parse.unquote('\\'.join(components))
+ return urllib.parse.unquote(url.replace('/', '\\'))
comp = url.split('|')
if len(comp) != 2 or comp[0][-1] not in string.ascii_letters:
error = 'Bad URL: ' + url
raise OSError(error)
drive = comp[0][-1].upper()
- components = comp[1].split('/')
- path = drive + ':'
- for comp in components:
- if comp:
- path = path + '\\' + urllib.parse.unquote(comp)
- # Issue #11474 - handing url such as |c/|
- if path.endswith(':') and url.endswith('/'):
- path += '\\'
- return path
+ tail = urllib.parse.unquote(comp[1].replace('/', '\\'))
+ return drive + ':' + tail
def pathname2url(p):
"""OS-specific conversion from a file system path to a relative URL
@@ -52,30 +49,21 @@ def pathname2url(p):
import urllib.parse
# First, clean up some special forms. We are going to sacrifice
# the additional information anyway
- if p[:4] == '\\\\?\\':
+ p = p.replace('\\', '/')
+ if p[:4] == '//?/':
p = p[4:]
- if p[:4].upper() == 'UNC\\':
- p = '\\' + p[4:]
+ if p[:4].upper() == 'UNC/':
+ p = '//' + p[4:]
elif p[1:2] != ':':
raise OSError('Bad path: ' + p)
if not ':' in p:
- # No drive specifier, just convert slashes and quote the name
- if p[:2] == '\\\\':
- # path is something like \\host\path\on\remote\host
- # convert this to ////host/path/on/remote/host
- # (notice doubling of slashes at the start of the path)
- p = '\\\\' + p
- components = p.split('\\')
- return urllib.parse.quote('/'.join(components))
+ # No DOS drive specified, just quote the pathname
+ return urllib.parse.quote(p)
comp = p.split(':', maxsplit=2)
if len(comp) != 2 or len(comp[0]) > 1:
error = 'Bad path: ' + p
raise OSError(error)
drive = urllib.parse.quote(comp[0].upper())
- components = comp[1].split('\\')
- path = '///' + drive + ':'
- for comp in components:
- if comp:
- path = path + '/' + urllib.parse.quote(comp)
- return path
+ tail = urllib.parse.quote(comp[1])
+ return '///' + drive + ':' + tail
diff --git a/contrib/tools/python3/Lib/pathlib.py b/contrib/tools/python3/Lib/pathlib.py
index 65ff0ee197..02eb5c2598 100644
--- a/contrib/tools/python3/Lib/pathlib.py
+++ b/contrib/tools/python3/Lib/pathlib.py
@@ -359,9 +359,9 @@ class PurePath(object):
paths = []
for arg in args:
if isinstance(arg, PurePath):
- if arg._flavour is ntpath and self._flavour is posixpath:
+ if arg._flavour is not self._flavour:
# GH-103631: Convert separators for backwards compatibility.
- paths.extend(path.replace('\\', '/') for path in arg._raw_paths)
+ paths.append(arg.as_posix())
else:
paths.extend(arg._raw_paths)
else:
diff --git a/contrib/tools/python3/Lib/pdb.py b/contrib/tools/python3/Lib/pdb.py
index 89cf975164..1e1b5ea4f0 100755
--- a/contrib/tools/python3/Lib/pdb.py
+++ b/contrib/tools/python3/Lib/pdb.py
@@ -96,7 +96,7 @@ __all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
"post_mortem", "help"]
def find_function(funcname, filename):
- cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
+ cre = re.compile(r'def\s+%s(\s*\[.+\])?\s*[(]' % re.escape(funcname))
try:
fp = tokenize.open(filename)
except OSError:
@@ -321,8 +321,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
def user_line(self, frame):
"""This function is called when we stop or break at this line."""
if self._wait_for_mainpyfile:
- if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
- or frame.f_lineno <= 0):
+ if (self.mainpyfile != self.canonic(frame.f_code.co_filename)):
return
self._wait_for_mainpyfile = False
if self.bp_commands(frame):
diff --git a/contrib/tools/python3/Lib/pickle.py b/contrib/tools/python3/Lib/pickle.py
index 01c1a10279..ea5f1c5dc3 100644
--- a/contrib/tools/python3/Lib/pickle.py
+++ b/contrib/tools/python3/Lib/pickle.py
@@ -533,10 +533,11 @@ class _Pickler:
self.framer.commit_frame()
# Check for persistent id (defined by a subclass)
- pid = self.persistent_id(obj)
- if pid is not None and save_persistent_id:
- self.save_pers(pid)
- return
+ if save_persistent_id:
+ pid = self.persistent_id(obj)
+ if pid is not None:
+ self.save_pers(pid)
+ return
# Check the memo
x = self.memo.get(id(obj))
diff --git a/contrib/tools/python3/Lib/pickletools.py b/contrib/tools/python3/Lib/pickletools.py
index 51ee4a7a26..33a51492ea 100644
--- a/contrib/tools/python3/Lib/pickletools.py
+++ b/contrib/tools/python3/Lib/pickletools.py
@@ -312,7 +312,7 @@ uint8 = ArgumentDescriptor(
doc="Eight-byte unsigned integer, little-endian.")
-def read_stringnl(f, decode=True, stripquotes=True):
+def read_stringnl(f, decode=True, stripquotes=True, *, encoding='latin-1'):
r"""
>>> import io
>>> read_stringnl(io.BytesIO(b"'abcd'\nefg\n"))
@@ -356,7 +356,7 @@ def read_stringnl(f, decode=True, stripquotes=True):
raise ValueError("no string quotes around %r" % data)
if decode:
- data = codecs.escape_decode(data)[0].decode("ascii")
+ data = codecs.escape_decode(data)[0].decode(encoding)
return data
stringnl = ArgumentDescriptor(
@@ -370,7 +370,7 @@ stringnl = ArgumentDescriptor(
""")
def read_stringnl_noescape(f):
- return read_stringnl(f, stripquotes=False)
+ return read_stringnl(f, stripquotes=False, encoding='utf-8')
stringnl_noescape = ArgumentDescriptor(
name='stringnl_noescape',
@@ -2513,7 +2513,10 @@ def dis(pickle, out=None, memo=None, indentlevel=4, annotate=0):
# make a mild effort to align arguments
line += ' ' * (10 - len(opcode.name))
if arg is not None:
- line += ' ' + repr(arg)
+ if opcode.name in ("STRING", "BINSTRING", "SHORT_BINSTRING"):
+ line += ' ' + ascii(arg)
+ else:
+ line += ' ' + repr(arg)
if markmsg:
line += ' ' + markmsg
if annotate:
diff --git a/contrib/tools/python3/Lib/pydoc_data/topics.py b/contrib/tools/python3/Lib/pydoc_data/topics.py
index b5464cb4d0..12523999ca 100644
--- a/contrib/tools/python3/Lib/pydoc_data/topics.py
+++ b/contrib/tools/python3/Lib/pydoc_data/topics.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# Autogenerated by Sphinx on Tue Oct 1 04:02:04 2024
+# Autogenerated by Sphinx on Tue Dec 3 19:41:14 2024
# as part of the release process.
topics = {'assert': 'The "assert" statement\n'
'**********************\n'
@@ -29,13 +29,12 @@ topics = {'assert': 'The "assert" statement\n'
'(command\n'
'line option "-O"). The current code generator emits no code for '
'an\n'
- 'assert statement when optimization is requested at compile time. '
- 'Note\n'
- 'that it is unnecessary to include the source code for the '
- 'expression\n'
- 'that failed in the error message; it will be displayed as part of '
- 'the\n'
- 'stack trace.\n'
+ '"assert" statement when optimization is requested at compile '
+ 'time.\n'
+ 'Note that it is unnecessary to include the source code for the\n'
+ 'expression that failed in the error message; it will be displayed '
+ 'as\n'
+ 'part of the stack trace.\n'
'\n'
'Assignments to "__debug__" are illegal. The value for the '
'built-in\n'
@@ -673,7 +672,8 @@ topics = {'assert': 'The "assert" statement\n'
'should either\n'
' return the (computed) attribute value or raise an '
'"AttributeError"\n'
- ' exception.\n'
+ ' exception. The "object" class itself does not provide '
+ 'this method.\n'
'\n'
' Note that if the attribute is found through the '
'normal mechanism,\n'
@@ -856,7 +856,9 @@ topics = {'assert': 'The "assert" statement\n'
'parents). In the\n'
'examples below, “the attribute” refers to the attribute '
'whose name is\n'
- 'the key of the property in the owner class’ "__dict__".\n'
+ 'the key of the property in the owner class’ "__dict__". '
+ 'The "object"\n'
+ 'class itself does not implement any of these protocols.\n'
'\n'
'object.__get__(self, instance, owner=None)\n'
'\n'
@@ -1529,7 +1531,9 @@ topics = {'assert': 'The "assert" statement\n'
' Called when the instance is “called” as a function; if '
'this method\n'
' is defined, "x(arg1, arg2, ...)" roughly translates to\n'
- ' "type(x).__call__(x, arg1, ...)".\n',
+ ' "type(x).__call__(x, arg1, ...)". The "object" class '
+ 'itself does\n'
+ ' not provide this method.\n',
'calls': 'Calls\n'
'*****\n'
'\n'
@@ -1714,6 +1718,9 @@ topics = {'assert': 'The "assert" statement\n'
' Function definitions. When the code block executes a "return"\n'
' statement, this specifies the return value of the function '
'call.\n'
+ ' If execution reaches the end of the code block without executing '
+ 'a\n'
+ ' "return" statement, the return value is "None".\n'
'\n'
'a built-in function or method:\n'
' The result is up to the interpreter; see Built-in Functions for '
@@ -2762,18 +2769,15 @@ topics = {'assert': 'The "assert" statement\n'
' enter = type(manager).__enter__\n'
' exit = type(manager).__exit__\n'
' value = enter(manager)\n'
- ' hit_except = False\n'
'\n'
' try:\n'
' TARGET = value\n'
' SUITE\n'
' except:\n'
- ' hit_except = True\n'
' if not exit(manager, *sys.exc_info()):\n'
' raise\n'
- ' finally:\n'
- ' if not hit_except:\n'
- ' exit(manager, None, None, None)\n'
+ ' else:\n'
+ ' exit(manager, None, None, None)\n'
'\n'
'With more than one item, the context managers are processed as '
'if\n'
@@ -4389,6 +4393,9 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
'For more information on context managers, see Context '
'Manager Types.\n'
+ 'The "object" class itself does not provide the context '
+ 'manager\n'
+ 'methods.\n'
'\n'
'object.__enter__(self)\n'
'\n'
@@ -4658,17 +4665,20 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' This is typically used for debugging, so it is important '
'that the\n'
- ' representation is information-rich and unambiguous.\n'
+ ' representation is information-rich and unambiguous. A '
+ 'default\n'
+ ' implementation is provided by the "object" class '
+ 'itself.\n'
'\n'
'object.__str__(self)\n'
'\n'
- ' Called by "str(object)" and the built-in functions '
- '"format()" and\n'
- ' "print()" to compute the “informal” or nicely printable '
- 'string\n'
- ' representation of an object. The return value must be a '
- 'string\n'
- ' object.\n'
+ ' Called by "str(object)", the default "__format__()" '
+ 'implementation,\n'
+ ' and the built-in function "print()", to compute the '
+ '“informal” or\n'
+ ' nicely printable string representation of an object. '
+ 'The return\n'
+ ' value must be a str object.\n'
'\n'
' This method differs from "object.__repr__()" in that '
'there is no\n'
@@ -4684,7 +4694,9 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' Called by bytes to compute a byte-string representation '
'of an\n'
- ' object. This should return a "bytes" object.\n'
+ ' object. This should return a "bytes" object. The '
+ '"object" class\n'
+ ' itself does not provide this method.\n'
'\n'
'object.__format__(self, format_spec)\n'
'\n'
@@ -4712,6 +4724,11 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' The return value must be a string object.\n'
'\n'
+ ' The default implementation by the "object" class should '
+ 'be given an\n'
+ ' empty *format_spec* string. It delegates to '
+ '"__str__()".\n'
+ '\n'
' Changed in version 3.4: The __format__ method of '
'"object" itself\n'
' raises a "TypeError" if passed any non-empty string.\n'
@@ -4769,6 +4786,16 @@ topics = {'assert': 'The "assert" statement\n'
' ordering operations from a single root operation, see\n'
' "functools.total_ordering()".\n'
'\n'
+ ' By default, the "object" class provides implementations '
+ 'consistent\n'
+ ' with Value comparisons: equality compares according to '
+ 'object\n'
+ ' identity, and order comparisons raise "TypeError". Each '
+ 'default\n'
+ ' method may generate these results directly, but may also '
+ 'return\n'
+ ' "NotImplemented".\n'
+ '\n'
' See the paragraph on "__hash__()" for some important '
'notes on\n'
' creating *hashable* objects which support custom '
@@ -4855,12 +4882,13 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' User-defined classes have "__eq__()" and "__hash__()" '
'methods by\n'
- ' default; with them, all objects compare unequal (except '
- 'with\n'
- ' themselves) and "x.__hash__()" returns an appropriate '
- 'value such\n'
- ' that "x == y" implies both that "x is y" and "hash(x) == '
- 'hash(y)".\n'
+ ' default (inherited from the "object" class); with them, '
+ 'all objects\n'
+ ' compare unequal (except with themselves) and '
+ '"x.__hash__()" returns\n'
+ ' an appropriate value such that "x == y" implies both '
+ 'that "x is y"\n'
+ ' and "hash(x) == hash(y)".\n'
'\n'
' A class that overrides "__eq__()" and does not define '
'"__hash__()"\n'
@@ -4931,9 +4959,9 @@ topics = {'assert': 'The "assert" statement\n'
'the object is\n'
' considered true if its result is nonzero. If a class '
'defines\n'
- ' neither "__len__()" nor "__bool__()", all its instances '
- 'are\n'
- ' considered true.\n',
+ ' neither "__len__()" nor "__bool__()" (which is true of '
+ 'the "object"\n'
+ ' class itself), all its instances are considered true.\n',
'debugger': '"pdb" — The Python Debugger\n'
'***************************\n'
'\n'
@@ -6802,10 +6830,12 @@ topics = {'assert': 'The "assert" statement\n'
'printing fields |\n'
'| | in the form ‘+000000120’. This alignment '
'option is only |\n'
- '| | valid for numeric types. It becomes the '
- 'default for |\n'
- '| | numbers when ‘0’ immediately precedes the '
- 'field width. |\n'
+ '| | valid for numeric types, excluding "complex". '
+ 'It becomes |\n'
+ '| | the default for numbers when ‘0’ immediately '
+ 'precedes the |\n'
+ '| | field '
+ 'width. |\n'
'+-----------+------------------------------------------------------------+\n'
'| "\'^\'" | Forces the field to be centered within the '
'available |\n'
@@ -6912,9 +6942,9 @@ topics = {'assert': 'The "assert" statement\n'
'field by a\n'
'zero ("\'0\'") character enables sign-aware zero-padding '
'for numeric\n'
- 'types. This is equivalent to a *fill* character of "\'0\'" '
- 'with an\n'
- '*alignment* type of "\'=\'".\n'
+ 'types, excluding "complex". This is equivalent to a *fill* '
+ 'character\n'
+ 'of "\'0\'" with an *alignment* type of "\'=\'".\n'
'\n'
'Changed in version 3.10: Preceding the *width* field by '
'"\'0\'" no\n'
@@ -7045,12 +7075,10 @@ topics = {'assert': 'The "assert" statement\n'
'of "6" digits |\n'
' | | after the decimal point for "float", and '
'shows all |\n'
- ' | | coefficient digits for "Decimal". If no '
- 'digits follow the |\n'
- ' | | decimal point, the decimal point is also '
- 'removed unless |\n'
- ' | | the "#" option is '
- 'used. |\n'
+ ' | | coefficient digits for "Decimal". If '
+ '"p=0", the decimal |\n'
+ ' | | point is omitted unless the "#" option is '
+ 'used. |\n'
' '
'+-----------+------------------------------------------------------------+\n'
' | "\'E\'" | Scientific notation. Same as "\'e\'" '
@@ -7069,12 +7097,10 @@ topics = {'assert': 'The "assert" statement\n'
'decimal point for |\n'
' | | "float", and uses a precision large enough '
'to show all |\n'
- ' | | coefficient digits for "Decimal". If no '
- 'digits follow the |\n'
- ' | | decimal point, the decimal point is also '
- 'removed unless |\n'
- ' | | the "#" option is '
- 'used. |\n'
+ ' | | coefficient digits for "Decimal". If '
+ '"p=0", the decimal |\n'
+ ' | | point is omitted unless the "#" option is '
+ 'used. |\n'
' '
'+-----------+------------------------------------------------------------+\n'
' | "\'F\'" | Fixed-point notation. Same as "\'f\'", '
@@ -7184,6 +7210,32 @@ topics = {'assert': 'The "assert" statement\n'
' '
'+-----------+------------------------------------------------------------+\n'
'\n'
+ 'The result should be correctly rounded to a given precision '
+ '"p" of\n'
+ 'digits after the decimal point. The rounding mode for '
+ '"float" matches\n'
+ 'that of the "round()" builtin. For "Decimal", the rounding '
+ 'mode of\n'
+ 'the current context will be used.\n'
+ '\n'
+ 'The available presentation types for "complex" are the same '
+ 'as those\n'
+ 'for "float" ("\'%\'" is not allowed). Both the real and '
+ 'imaginary\n'
+ 'components of a complex number are formatted as '
+ 'floating-point\n'
+ 'numbers, according to the specified presentation type. '
+ 'They are\n'
+ 'separated by the mandatory sign of the imaginary part, the '
+ 'latter\n'
+ 'being terminated by a "j" suffix. If the presentation type '
+ 'is\n'
+ 'missing, the result will match the output of "str()" '
+ '(complex numbers\n'
+ 'with a non-zero real part are also surrounded by '
+ 'parentheses),\n'
+ 'possibly altered by other format modifiers.\n'
+ '\n'
'\n'
'Format examples\n'
'===============\n'
@@ -7577,33 +7629,17 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' global_stmt ::= "global" identifier ("," identifier)*\n'
'\n'
- 'The "global" statement is a declaration which holds for the '
- 'entire\n'
- 'current code block. It means that the listed identifiers are to '
- 'be\n'
- 'interpreted as globals. It would be impossible to assign to a '
- 'global\n'
- 'variable without "global", although free variables may refer to\n'
- 'globals without being declared global.\n'
- '\n'
- 'Names listed in a "global" statement must not be used in the same '
- 'code\n'
- 'block textually preceding that "global" statement.\n'
- '\n'
- 'Names listed in a "global" statement must not be defined as '
- 'formal\n'
- 'parameters, or as targets in "with" statements or "except" '
- 'clauses, or\n'
- 'in a "for" target list, "class" definition, function definition,\n'
- '"import" statement, or variable annotation.\n'
+ 'The "global" statement causes the listed identifiers to be '
+ 'interpreted\n'
+ 'as globals. It would be impossible to assign to a global variable\n'
+ 'without "global", although free variables may refer to globals '
+ 'without\n'
+ 'being declared global.\n'
'\n'
- '**CPython implementation detail:** The current implementation does '
- 'not\n'
- 'enforce some of these restrictions, but programs should not abuse '
- 'this\n'
- 'freedom, as future implementations may enforce them or silently '
- 'change\n'
- 'the meaning of the program.\n'
+ 'The "global" statement applies to the entire scope of a function '
+ 'or\n'
+ 'class body. A "SyntaxError" is raised if a variable is used or\n'
+ 'assigned to prior to its global declaration in the scope.\n'
'\n'
'**Programmer’s note:** "global" is a directive to the parser. It\n'
'applies only to code parsed at the same time as the "global"\n'
@@ -7690,19 +7726,16 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
'Within the ASCII range (U+0001..U+007F), the valid characters '
'for\n'
- 'identifiers are the same as in Python 2.x: the uppercase and '
- 'lowercase\n'
- 'letters "A" through "Z", the underscore "_" and, except for '
- 'the first\n'
- 'character, the digits "0" through "9".\n'
- '\n'
- 'Python 3.0 introduces additional characters from outside the '
- 'ASCII\n'
- 'range (see **PEP 3131**). For these characters, the '
- 'classification\n'
- 'uses the version of the Unicode Character Database as '
- 'included in the\n'
- '"unicodedata" module.\n'
+ 'identifiers include the uppercase and lowercase letters "A" '
+ 'through\n'
+ '"Z", the underscore "_" and, except for the first character, '
+ 'the\n'
+ 'digits "0" through "9". Python 3.0 introduced additional '
+ 'characters\n'
+ 'from outside the ASCII range (see **PEP 3131**). For these\n'
+ 'characters, the classification uses the version of the '
+ 'Unicode\n'
+ 'Character Database as included in the "unicodedata" module.\n'
'\n'
'Identifiers are unlimited in length. Case is significant.\n'
'\n'
@@ -8666,8 +8699,8 @@ topics = {'assert': 'The "assert" statement\n'
'scope,\n'
'or if there is no nonlocal scope, a "SyntaxError" is raised.\n'
'\n'
- 'The nonlocal statement applies to the entire scope of a function '
- 'or\n'
+ 'The "nonlocal" statement applies to the entire scope of a '
+ 'function or\n'
'class body. A "SyntaxError" is raised if a variable is used or\n'
'assigned to prior to its nonlocal declaration in the scope.\n'
'\n'
@@ -9425,56 +9458,58 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
'The following methods can be defined to implement '
'container objects.\n'
- 'Containers usually are *sequences* (such as "lists" or '
- '"tuples") or\n'
- '*mappings* (like "dictionaries"), but can represent other '
- 'containers\n'
- 'as well. The first set of methods is used either to '
- 'emulate a\n'
- 'sequence or to emulate a mapping; the difference is that '
- 'for a\n'
- 'sequence, the allowable keys should be the integers *k* '
- 'for which "0\n'
- '<= k < N" where *N* is the length of the sequence, or '
- '"slice" objects,\n'
- 'which define a range of items. It is also recommended '
- 'that mappings\n'
- 'provide the methods "keys()", "values()", "items()", '
- '"get()",\n'
- '"clear()", "setdefault()", "pop()", "popitem()", "copy()", '
+ 'None of them are provided by the "object" class itself. '
+ 'Containers\n'
+ 'usually are *sequences* (such as "lists" or "tuples") or '
+ '*mappings*\n'
+ '(like *dictionaries*), but can represent other containers '
+ 'as well.\n'
+ 'The first set of methods is used either to emulate a '
+ 'sequence or to\n'
+ 'emulate a mapping; the difference is that for a sequence, '
+ 'the\n'
+ 'allowable keys should be the integers *k* for which "0 <= '
+ 'k < N" where\n'
+ '*N* is the length of the sequence, or "slice" objects, '
+ 'which define a\n'
+ 'range of items. It is also recommended that mappings '
+ 'provide the\n'
+ 'methods "keys()", "values()", "items()", "get()", '
+ '"clear()",\n'
+ '"setdefault()", "pop()", "popitem()", "copy()", and '
+ '"update()"\n'
+ 'behaving similar to those for Python’s standard '
+ '"dictionary" objects.\n'
+ 'The "collections.abc" module provides a "MutableMapping" '
+ '*abstract\n'
+ 'base class* to help create those methods from a base set '
+ 'of\n'
+ '"__getitem__()", "__setitem__()", "__delitem__()", and '
+ '"keys()".\n'
+ 'Mutable sequences should provide methods "append()", '
+ '"count()",\n'
+ '"index()", "extend()", "insert()", "pop()", "remove()", '
+ '"reverse()"\n'
+ 'and "sort()", like Python standard "list" objects. '
+ 'Finally, sequence\n'
+ 'types should implement addition (meaning concatenation) '
'and\n'
- '"update()" behaving similar to those for Python’s '
- 'standard\n'
- '"dictionary" objects. The "collections.abc" module '
- 'provides a\n'
- '"MutableMapping" *abstract base class* to help create '
- 'those methods\n'
- 'from a base set of "__getitem__()", "__setitem__()", '
- '"__delitem__()",\n'
- 'and "keys()". Mutable sequences should provide methods '
- '"append()",\n'
- '"count()", "index()", "extend()", "insert()", "pop()", '
- '"remove()",\n'
- '"reverse()" and "sort()", like Python standard "list" '
- 'objects.\n'
- 'Finally, sequence types should implement addition '
- '(meaning\n'
- 'concatenation) and multiplication (meaning repetition) by '
- 'defining the\n'
- 'methods "__add__()", "__radd__()", "__iadd__()", '
- '"__mul__()",\n'
- '"__rmul__()" and "__imul__()" described below; they should '
- 'not define\n'
- 'other numerical operators. It is recommended that both '
- 'mappings and\n'
- 'sequences implement the "__contains__()" method to allow '
- 'efficient use\n'
- 'of the "in" operator; for mappings, "in" should search the '
- 'mapping’s\n'
- 'keys; for sequences, it should search through the values. '
- 'It is\n'
- 'further recommended that both mappings and sequences '
- 'implement the\n'
+ 'multiplication (meaning repetition) by defining the '
+ 'methods\n'
+ '"__add__()", "__radd__()", "__iadd__()", "__mul__()", '
+ '"__rmul__()" and\n'
+ '"__imul__()" described below; they should not define other '
+ 'numerical\n'
+ 'operators. It is recommended that both mappings and '
+ 'sequences\n'
+ 'implement the "__contains__()" method to allow efficient '
+ 'use of the\n'
+ '"in" operator; for mappings, "in" should search the '
+ 'mapping’s keys;\n'
+ 'for sequences, it should search through the values. It is '
+ 'further\n'
+ 'recommended that both mappings and sequences implement '
+ 'the\n'
'"__iter__()" method to allow efficient iteration through '
'the\n'
'container; for mappings, "__iter__()" should iterate '
@@ -10014,17 +10049,19 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' This is typically used for debugging, so it is important '
'that the\n'
- ' representation is information-rich and unambiguous.\n'
+ ' representation is information-rich and unambiguous. A '
+ 'default\n'
+ ' implementation is provided by the "object" class itself.\n'
'\n'
'object.__str__(self)\n'
'\n'
- ' Called by "str(object)" and the built-in functions '
- '"format()" and\n'
- ' "print()" to compute the “informal” or nicely printable '
- 'string\n'
- ' representation of an object. The return value must be a '
- 'string\n'
- ' object.\n'
+ ' Called by "str(object)", the default "__format__()" '
+ 'implementation,\n'
+ ' and the built-in function "print()", to compute the '
+ '“informal” or\n'
+ ' nicely printable string representation of an object. The '
+ 'return\n'
+ ' value must be a str object.\n'
'\n'
' This method differs from "object.__repr__()" in that '
'there is no\n'
@@ -10040,7 +10077,9 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' Called by bytes to compute a byte-string representation '
'of an\n'
- ' object. This should return a "bytes" object.\n'
+ ' object. This should return a "bytes" object. The "object" '
+ 'class\n'
+ ' itself does not provide this method.\n'
'\n'
'object.__format__(self, format_spec)\n'
'\n'
@@ -10068,6 +10107,10 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' The return value must be a string object.\n'
'\n'
+ ' The default implementation by the "object" class should '
+ 'be given an\n'
+ ' empty *format_spec* string. It delegates to "__str__()".\n'
+ '\n'
' Changed in version 3.4: The __format__ method of "object" '
'itself\n'
' raises a "TypeError" if passed any non-empty string.\n'
@@ -10125,6 +10168,16 @@ topics = {'assert': 'The "assert" statement\n'
' ordering operations from a single root operation, see\n'
' "functools.total_ordering()".\n'
'\n'
+ ' By default, the "object" class provides implementations '
+ 'consistent\n'
+ ' with Value comparisons: equality compares according to '
+ 'object\n'
+ ' identity, and order comparisons raise "TypeError". Each '
+ 'default\n'
+ ' method may generate these results directly, but may also '
+ 'return\n'
+ ' "NotImplemented".\n'
+ '\n'
' See the paragraph on "__hash__()" for some important '
'notes on\n'
' creating *hashable* objects which support custom '
@@ -10210,12 +10263,13 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' User-defined classes have "__eq__()" and "__hash__()" '
'methods by\n'
- ' default; with them, all objects compare unequal (except '
- 'with\n'
- ' themselves) and "x.__hash__()" returns an appropriate '
- 'value such\n'
- ' that "x == y" implies both that "x is y" and "hash(x) == '
- 'hash(y)".\n'
+ ' default (inherited from the "object" class); with them, '
+ 'all objects\n'
+ ' compare unequal (except with themselves) and '
+ '"x.__hash__()" returns\n'
+ ' an appropriate value such that "x == y" implies both that '
+ '"x is y"\n'
+ ' and "hash(x) == hash(y)".\n'
'\n'
' A class that overrides "__eq__()" and does not define '
'"__hash__()"\n'
@@ -10284,9 +10338,9 @@ topics = {'assert': 'The "assert" statement\n'
'object is\n'
' considered true if its result is nonzero. If a class '
'defines\n'
- ' neither "__len__()" nor "__bool__()", all its instances '
- 'are\n'
- ' considered true.\n'
+ ' neither "__len__()" nor "__bool__()" (which is true of '
+ 'the "object"\n'
+ ' class itself), all its instances are considered true.\n'
'\n'
'\n'
'Customizing attribute access\n'
@@ -10310,7 +10364,8 @@ topics = {'assert': 'The "assert" statement\n'
'either\n'
' return the (computed) attribute value or raise an '
'"AttributeError"\n'
- ' exception.\n'
+ ' exception. The "object" class itself does not provide '
+ 'this method.\n'
'\n'
' Note that if the attribute is found through the normal '
'mechanism,\n'
@@ -10490,7 +10545,9 @@ topics = {'assert': 'The "assert" statement\n'
'parents). In the\n'
'examples below, “the attribute” refers to the attribute '
'whose name is\n'
- 'the key of the property in the owner class’ "__dict__".\n'
+ 'the key of the property in the owner class’ "__dict__". The '
+ '"object"\n'
+ 'class itself does not implement any of these protocols.\n'
'\n'
'object.__get__(self, instance, owner=None)\n'
'\n'
@@ -11373,7 +11430,9 @@ topics = {'assert': 'The "assert" statement\n'
' Called when the instance is “called” as a function; if '
'this method\n'
' is defined, "x(arg1, arg2, ...)" roughly translates to\n'
- ' "type(x).__call__(x, arg1, ...)".\n'
+ ' "type(x).__call__(x, arg1, ...)". The "object" class '
+ 'itself does\n'
+ ' not provide this method.\n'
'\n'
'\n'
'Emulating container types\n'
@@ -11381,54 +11440,54 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
'The following methods can be defined to implement container '
'objects.\n'
- 'Containers usually are *sequences* (such as "lists" or '
- '"tuples") or\n'
- '*mappings* (like "dictionaries"), but can represent other '
- 'containers\n'
- 'as well. The first set of methods is used either to emulate '
- 'a\n'
- 'sequence or to emulate a mapping; the difference is that for '
- 'a\n'
- 'sequence, the allowable keys should be the integers *k* for '
- 'which "0\n'
- '<= k < N" where *N* is the length of the sequence, or '
- '"slice" objects,\n'
- 'which define a range of items. It is also recommended that '
- 'mappings\n'
- 'provide the methods "keys()", "values()", "items()", '
- '"get()",\n'
- '"clear()", "setdefault()", "pop()", "popitem()", "copy()", '
- 'and\n'
- '"update()" behaving similar to those for Python’s standard\n'
- '"dictionary" objects. The "collections.abc" module provides '
- 'a\n'
- '"MutableMapping" *abstract base class* to help create those '
- 'methods\n'
- 'from a base set of "__getitem__()", "__setitem__()", '
- '"__delitem__()",\n'
- 'and "keys()". Mutable sequences should provide methods '
- '"append()",\n'
- '"count()", "index()", "extend()", "insert()", "pop()", '
- '"remove()",\n'
- '"reverse()" and "sort()", like Python standard "list" '
+ 'None of them are provided by the "object" class itself. '
+ 'Containers\n'
+ 'usually are *sequences* (such as "lists" or "tuples") or '
+ '*mappings*\n'
+ '(like *dictionaries*), but can represent other containers as '
+ 'well.\n'
+ 'The first set of methods is used either to emulate a '
+ 'sequence or to\n'
+ 'emulate a mapping; the difference is that for a sequence, '
+ 'the\n'
+ 'allowable keys should be the integers *k* for which "0 <= k '
+ '< N" where\n'
+ '*N* is the length of the sequence, or "slice" objects, which '
+ 'define a\n'
+ 'range of items. It is also recommended that mappings '
+ 'provide the\n'
+ 'methods "keys()", "values()", "items()", "get()", '
+ '"clear()",\n'
+ '"setdefault()", "pop()", "popitem()", "copy()", and '
+ '"update()"\n'
+ 'behaving similar to those for Python’s standard "dictionary" '
'objects.\n'
- 'Finally, sequence types should implement addition (meaning\n'
- 'concatenation) and multiplication (meaning repetition) by '
- 'defining the\n'
- 'methods "__add__()", "__radd__()", "__iadd__()", '
- '"__mul__()",\n'
- '"__rmul__()" and "__imul__()" described below; they should '
- 'not define\n'
- 'other numerical operators. It is recommended that both '
- 'mappings and\n'
- 'sequences implement the "__contains__()" method to allow '
- 'efficient use\n'
- 'of the "in" operator; for mappings, "in" should search the '
- 'mapping’s\n'
- 'keys; for sequences, it should search through the values. '
- 'It is\n'
- 'further recommended that both mappings and sequences '
- 'implement the\n'
+ 'The "collections.abc" module provides a "MutableMapping" '
+ '*abstract\n'
+ 'base class* to help create those methods from a base set of\n'
+ '"__getitem__()", "__setitem__()", "__delitem__()", and '
+ '"keys()".\n'
+ 'Mutable sequences should provide methods "append()", '
+ '"count()",\n'
+ '"index()", "extend()", "insert()", "pop()", "remove()", '
+ '"reverse()"\n'
+ 'and "sort()", like Python standard "list" objects. Finally, '
+ 'sequence\n'
+ 'types should implement addition (meaning concatenation) and\n'
+ 'multiplication (meaning repetition) by defining the methods\n'
+ '"__add__()", "__radd__()", "__iadd__()", "__mul__()", '
+ '"__rmul__()" and\n'
+ '"__imul__()" described below; they should not define other '
+ 'numerical\n'
+ 'operators. It is recommended that both mappings and '
+ 'sequences\n'
+ 'implement the "__contains__()" method to allow efficient use '
+ 'of the\n'
+ '"in" operator; for mappings, "in" should search the '
+ 'mapping’s keys;\n'
+ 'for sequences, it should search through the values. It is '
+ 'further\n'
+ 'recommended that both mappings and sequences implement the\n'
'"__iter__()" method to allow efficient iteration through '
'the\n'
'container; for mappings, "__iter__()" should iterate through '
@@ -11844,6 +11903,9 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
'For more information on context managers, see Context '
'Manager Types.\n'
+ 'The "object" class itself does not provide the context '
+ 'manager\n'
+ 'methods.\n'
'\n'
'object.__enter__(self)\n'
'\n'
@@ -14348,43 +14410,254 @@ topics = {'assert': 'The "assert" statement\n'
'e.g.,\n'
'"m.x = 1" is equivalent to "m.__dict__["x"] = 1".\n'
'\n'
- 'Predefined (writable) attributes:\n'
'\n'
- ' "__name__"\n'
- ' The module’s name.\n'
+ 'Import-related attributes on module objects\n'
+ '-------------------------------------------\n'
+ '\n'
+ 'Module objects have the following attributes that relate to the '
+ 'import\n'
+ 'system. When a module is created using the machinery associated '
+ 'with\n'
+ 'the import system, these attributes are filled in based on the\n'
+ 'module’s *spec*, before the *loader* executes and loads the '
+ 'module.\n'
+ '\n'
+ 'To create a module dynamically rather than using the import '
+ 'system,\n'
+ 'it’s recommended to use "importlib.util.module_from_spec()", which\n'
+ 'will set the various import-controlled attributes to appropriate\n'
+ 'values. It’s also possible to use the "types.ModuleType" '
+ 'constructor\n'
+ 'to create modules directly, but this technique is more error-prone, '
+ 'as\n'
+ 'most attributes must be manually set on the module object after it '
+ 'has\n'
+ 'been created when using this approach.\n'
+ '\n'
+ 'Caution:\n'
+ '\n'
+ ' With the exception of "__name__", it is **strongly** recommended\n'
+ ' that you rely on "__spec__" and its attributes instead of any of '
+ 'the\n'
+ ' other individual attributes listed in this subsection. Note that\n'
+ ' updating an attribute on "__spec__" will not update the\n'
+ ' corresponding attribute on the module itself:\n'
+ '\n'
+ ' >>> import typing\n'
+ ' >>> typing.__name__, typing.__spec__.name\n'
+ " ('typing', 'typing')\n"
+ " >>> typing.__spec__.name = 'spelling'\n"
+ ' >>> typing.__name__, typing.__spec__.name\n'
+ " ('typing', 'spelling')\n"
+ " >>> typing.__name__ = 'keyboard_smashing'\n"
+ ' >>> typing.__name__, typing.__spec__.name\n'
+ " ('keyboard_smashing', 'spelling')\n"
+ '\n'
+ 'module.__name__\n'
+ '\n'
+ ' The name used to uniquely identify the module in the import '
+ 'system.\n'
+ ' For a directly executed module, this will be set to '
+ '""__main__"".\n'
+ '\n'
+ ' This attribute must be set to the fully qualified name of the\n'
+ ' module. It is expected to match the value of\n'
+ ' "module.__spec__.name".\n'
+ '\n'
+ 'module.__spec__\n'
+ '\n'
+ ' A record of the module’s import-system-related state.\n'
+ '\n'
+ ' Set to the "module spec" that was used when importing the '
+ 'module.\n'
+ ' See Module specs for more details.\n'
+ '\n'
+ ' Added in version 3.4.\n'
+ '\n'
+ 'module.__package__\n'
+ '\n'
+ ' The *package* a module belongs to.\n'
+ '\n'
+ ' If the module is top-level (that is, not a part of any specific\n'
+ ' package) then the attribute should be set to "\'\'" (the empty\n'
+ ' string). Otherwise, it should be set to the name of the '
+ 'module’s\n'
+ ' package (which can be equal to "module.__name__" if the module\n'
+ ' itself is a package). See **PEP 366** for further details.\n'
+ '\n'
+ ' This attribute is used instead of "__name__" to calculate '
+ 'explicit\n'
+ ' relative imports for main modules. It defaults to "None" for\n'
+ ' modules created dynamically using the "types.ModuleType"\n'
+ ' constructor; use "importlib.util.module_from_spec()" instead to\n'
+ ' ensure the attribute is set to a "str".\n'
+ '\n'
+ ' It is **strongly** recommended that you use\n'
+ ' "module.__spec__.parent" instead of "module.__package__".\n'
+ ' "__package__" is now only used as a fallback if '
+ '"__spec__.parent"\n'
+ ' is not set, and this fallback path is deprecated.\n'
+ '\n'
+ ' Changed in version 3.4: This attribute now defaults to "None" '
+ 'for\n'
+ ' modules created dynamically using the "types.ModuleType"\n'
+ ' constructor. Previously the attribute was optional.\n'
+ '\n'
+ ' Changed in version 3.6: The value of "__package__" is expected '
+ 'to\n'
+ ' be the same as "__spec__.parent". "__package__" is now only used '
+ 'as\n'
+ ' a fallback during import resolution if "__spec__.parent" is not\n'
+ ' defined.\n'
+ '\n'
+ ' Changed in version 3.10: "ImportWarning" is raised if an import\n'
+ ' resolution falls back to "__package__" instead of\n'
+ ' "__spec__.parent".\n'
+ '\n'
+ ' Changed in version 3.12: Raise "DeprecationWarning" instead of\n'
+ ' "ImportWarning" when falling back to "__package__" during '
+ 'import\n'
+ ' resolution.\n'
+ '\n'
+ 'module.__loader__\n'
'\n'
- ' "__doc__"\n'
- ' The module’s documentation string, or "None" if unavailable.\n'
+ ' The *loader* object that the import machinery used to load the\n'
+ ' module.\n'
+ '\n'
+ ' This attribute is mostly useful for introspection, but can be '
+ 'used\n'
+ ' for additional loader-specific functionality, for example '
+ 'getting\n'
+ ' data associated with a loader.\n'
+ '\n'
+ ' "__loader__" defaults to "None" for modules created dynamically\n'
+ ' using the "types.ModuleType" constructor; use\n'
+ ' "importlib.util.module_from_spec()" instead to ensure the '
+ 'attribute\n'
+ ' is set to a *loader* object.\n'
'\n'
- ' "__file__"\n'
- ' The pathname of the file from which the module was loaded, if '
- 'it\n'
- ' was loaded from a file. The "__file__" attribute may be '
- 'missing\n'
- ' for certain types of modules, such as C modules that are\n'
- ' statically linked into the interpreter. For extension '
+ ' It is **strongly** recommended that you use\n'
+ ' "module.__spec__.loader" instead of "module.__loader__".\n'
+ '\n'
+ ' Changed in version 3.4: This attribute now defaults to "None" '
+ 'for\n'
+ ' modules created dynamically using the "types.ModuleType"\n'
+ ' constructor. Previously the attribute was optional.\n'
+ '\n'
+ ' Deprecated since version 3.12, will be removed in version 3.16:\n'
+ ' Setting "__loader__" on a module while failing to set\n'
+ ' "__spec__.loader" is deprecated. In Python 3.16, "__loader__" '
+ 'will\n'
+ ' cease to be set or taken into consideration by the import system '
+ 'or\n'
+ ' the standard library.\n'
+ '\n'
+ 'module.__path__\n'
+ '\n'
+ ' A (possibly empty) *sequence* of strings enumerating the '
+ 'locations\n'
+ ' where the package’s submodules will be found. Non-package '
'modules\n'
- ' loaded dynamically from a shared library, it’s the pathname '
- 'of\n'
- ' the shared library file.\n'
+ ' should not have a "__path__" attribute. See __path__ attributes '
+ 'on\n'
+ ' modules for more details.\n'
+ '\n'
+ ' It is **strongly** recommended that you use\n'
+ ' "module.__spec__.submodule_search_locations" instead of\n'
+ ' "module.__path__".\n'
+ '\n'
+ 'module.__file__\n'
+ '\n'
+ 'module.__cached__\n'
+ '\n'
+ ' "__file__" and "__cached__" are both optional attributes that '
+ 'may\n'
+ ' or may not be set. Both attributes should be a "str" when they '
+ 'are\n'
+ ' available.\n'
+ '\n'
+ ' "__file__" indicates the pathname of the file from which the '
+ 'module\n'
+ ' was loaded (if loaded from a file), or the pathname of the '
+ 'shared\n'
+ ' library file for extension modules loaded dynamically from a '
+ 'shared\n'
+ ' library. It might be missing for certain types of modules, such '
+ 'as\n'
+ ' C modules that are statically linked into the interpreter, and '
+ 'the\n'
+ ' import system may opt to leave it unset if it has no semantic\n'
+ ' meaning (for example, a module loaded from a database).\n'
+ '\n'
+ ' If "__file__" is set then the "__cached__" attribute might also '
+ 'be\n'
+ ' set, which is the path to any compiled version of the code '
+ '(for\n'
+ ' example, a byte-compiled file). The file does not need to exist '
+ 'to\n'
+ ' set this attribute; the path can simply point to where the '
+ 'compiled\n'
+ ' file *would* exist (see **PEP 3147**).\n'
+ '\n'
+ ' Note that "__cached__" may be set even if "__file__" is not '
+ 'set.\n'
+ ' However, that scenario is quite atypical. Ultimately, the '
+ '*loader*\n'
+ ' is what makes use of the module spec provided by the *finder* '
+ '(from\n'
+ ' which "__file__" and "__cached__" are derived). So if a loader '
+ 'can\n'
+ ' load from a cached module but otherwise does not load from a '
+ 'file,\n'
+ ' that atypical scenario may be appropriate.\n'
+ '\n'
+ ' It is **strongly** recommended that you use\n'
+ ' "module.__spec__.cached" instead of "module.__cached__".\n'
+ '\n'
+ '\n'
+ 'Other writable attributes on module objects\n'
+ '-------------------------------------------\n'
+ '\n'
+ 'As well as the import-related attributes listed above, module '
+ 'objects\n'
+ 'also have the following writable attributes:\n'
+ '\n'
+ 'module.__doc__\n'
+ '\n'
+ ' The module’s documentation string, or "None" if unavailable. '
+ 'See\n'
+ ' also: "__doc__ attributes".\n'
'\n'
- ' "__annotations__"\n'
- ' A dictionary containing *variable annotations* collected '
- 'during\n'
- ' module body execution. For best practices on working with\n'
- ' "__annotations__", please see Annotations Best Practices.\n'
+ 'module.__annotations__\n'
'\n'
- 'Special read-only attribute: "__dict__" is the module’s namespace '
- 'as a\n'
- 'dictionary object.\n'
+ ' A dictionary containing *variable annotations* collected during\n'
+ ' module body execution. For best practices on working with\n'
+ ' "__annotations__", please see Annotations Best Practices.\n'
'\n'
- '**CPython implementation detail:** Because of the way CPython '
- 'clears\n'
- 'module dictionaries, the module dictionary will be cleared when '
+ '\n'
+ 'Module dictionaries\n'
+ '-------------------\n'
+ '\n'
+ 'Module objects also have the following special read-only '
+ 'attribute:\n'
+ '\n'
+ 'module.__dict__\n'
+ '\n'
+ ' The module’s namespace as a dictionary object. Uniquely among '
+ 'the\n'
+ ' attributes listed here, "__dict__" cannot be accessed as a '
+ 'global\n'
+ ' variable from within a module; it can only be accessed as an\n'
+ ' attribute on module objects.\n'
+ '\n'
+ ' **CPython implementation detail:** Because of the way CPython\n'
+ ' clears module dictionaries, the module dictionary will be '
+ 'cleared\n'
+ ' when the module falls out of scope even if the dictionary still '
+ 'has\n'
+ ' live references. To avoid this, copy the dictionary or keep '
'the\n'
- 'module falls out of scope even if the dictionary still has live\n'
- 'references. To avoid this, copy the dictionary or keep the module\n'
- 'around while using its dictionary directly.\n'
+ ' module around while using its dictionary directly.\n'
'\n'
'\n'
'Custom classes\n'
@@ -14719,7 +14992,7 @@ topics = {'assert': 'The "assert" statement\n'
'| | version '
'3.12: This attribute of code objects is |\n'
'| | deprecated, '
- 'and may be removed in Python 3.14. |\n'
+ 'and may be removed in Python 3.15. |\n'
'+----------------------------------------------------+----------------------------------------------------+\n'
'| codeobject.co_stacksize | The required '
'stack size of the code object |\n'
@@ -15174,21 +15447,23 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
' If no positional argument is given, an empty dictionary '
'is created.\n'
- ' If a positional argument is given and it is a mapping '
- 'object, a\n'
- ' dictionary is created with the same key-value pairs as '
- 'the mapping\n'
- ' object. Otherwise, the positional argument must be an '
- '*iterable*\n'
- ' object. Each item in the iterable must itself be an '
- 'iterable with\n'
- ' exactly two objects. The first object of each item '
- 'becomes a key\n'
- ' in the new dictionary, and the second object the '
- 'corresponding\n'
- ' value. If a key occurs more than once, the last value '
- 'for that key\n'
- ' becomes the corresponding value in the new dictionary.\n'
+ ' If a positional argument is given and it defines a '
+ '"keys()" method,\n'
+ ' a dictionary is created by calling "__getitem__()" on the '
+ 'argument\n'
+ ' with each returned key from the method. Otherwise, the '
+ 'positional\n'
+ ' argument must be an *iterable* object. Each item in the '
+ 'iterable\n'
+ ' must itself be an iterable with exactly two elements. '
+ 'The first\n'
+ ' element of each item becomes a key in the new dictionary, '
+ 'and the\n'
+ ' second element the corresponding value. If a key occurs '
+ 'more than\n'
+ ' once, the last value for that key becomes the '
+ 'corresponding value\n'
+ ' in the new dictionary.\n'
'\n'
' If keyword arguments are given, the keyword arguments and '
'their\n'
@@ -15383,15 +15658,17 @@ topics = {'assert': 'The "assert" statement\n'
'*other*,\n'
' overwriting existing keys. Return "None".\n'
'\n'
- ' "update()" accepts either another dictionary object or '
- 'an\n'
- ' iterable of key/value pairs (as tuples or other '
- 'iterables of\n'
- ' length two). If keyword arguments are specified, the '
- 'dictionary\n'
- ' is then updated with those key/value pairs: '
- '"d.update(red=1,\n'
- ' blue=2)".\n'
+ ' "update()" accepts either another object with a '
+ '"keys()" method\n'
+ ' (in which case "__getitem__()" is called with every '
+ 'key returned\n'
+ ' from the method) or an iterable of key/value pairs (as '
+ 'tuples or\n'
+ ' other iterables of length two). If keyword arguments '
+ 'are\n'
+ ' specified, the dictionary is then updated with those '
+ 'key/value\n'
+ ' pairs: "d.update(red=1, blue=2)".\n'
'\n'
' values()\n'
'\n'
@@ -16699,18 +16976,15 @@ topics = {'assert': 'The "assert" statement\n'
' enter = type(manager).__enter__\n'
' exit = type(manager).__exit__\n'
' value = enter(manager)\n'
- ' hit_except = False\n'
'\n'
' try:\n'
' TARGET = value\n'
' SUITE\n'
' except:\n'
- ' hit_except = True\n'
' if not exit(manager, *sys.exc_info()):\n'
' raise\n'
- ' finally:\n'
- ' if not hit_except:\n'
- ' exit(manager, None, None, None)\n'
+ ' else:\n'
+ ' exit(manager, None, None, None)\n'
'\n'
'With more than one item, the context managers are processed as if\n'
'multiple "with" statements were nested:\n'
@@ -16751,7 +17025,8 @@ topics = {'assert': 'The "assert" statement\n'
'\n'
'A "yield" statement is semantically equivalent to a yield '
'expression.\n'
- 'The yield statement can be used to omit the parentheses that would\n'
+ 'The "yield" statement can be used to omit the parentheses that '
+ 'would\n'
'otherwise be required in the equivalent yield expression '
'statement.\n'
'For example, the yield statements\n'
@@ -16767,10 +17042,9 @@ topics = {'assert': 'The "assert" statement\n'
'Yield expressions and statements are only used when defining a\n'
'*generator* function, and are only used in the body of the '
'generator\n'
- 'function. Using yield in a function definition is sufficient to '
- 'cause\n'
- 'that definition to create a generator function instead of a normal\n'
- 'function.\n'
+ 'function. Using "yield" in a function definition is sufficient to\n'
+ 'cause that definition to create a generator function instead of a\n'
+ 'normal function.\n'
'\n'
'For full details of "yield" semantics, refer to the Yield '
'expressions\n'
diff --git a/contrib/tools/python3/Lib/re/_compiler.py b/contrib/tools/python3/Lib/re/_compiler.py
index 285c21936f..bb97f9fdd1 100644
--- a/contrib/tools/python3/Lib/re/_compiler.py
+++ b/contrib/tools/python3/Lib/re/_compiler.py
@@ -250,11 +250,11 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None):
while True:
try:
if op is LITERAL:
- if fixup:
- lo = fixup(av)
- charmap[lo] = 1
- if fixes and lo in fixes:
- for k in fixes[lo]:
+ if fixup: # IGNORECASE and not LOCALE
+ av = fixup(av)
+ charmap[av] = 1
+ if fixes and av in fixes:
+ for k in fixes[av]:
charmap[k] = 1
if not hascased and iscased(av):
hascased = True
@@ -262,7 +262,7 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None):
charmap[av] = 1
elif op is RANGE:
r = range(av[0], av[1]+1)
- if fixup:
+ if fixup: # IGNORECASE and not LOCALE
if fixes:
for i in map(fixup, r):
charmap[i] = 1
@@ -289,8 +289,7 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None):
# Character set contains non-BMP character codes.
# For range, all BMP characters in the range are already
# proceeded.
- if fixup:
- hascased = True
+ if fixup: # IGNORECASE and not LOCALE
# For now, IN_UNI_IGNORE+LITERAL and
# IN_UNI_IGNORE+RANGE_UNI_IGNORE work for all non-BMP
# characters, because two characters (at least one of
@@ -301,7 +300,13 @@ def _optimize_charset(charset, iscased=None, fixup=None, fixes=None):
# Also, both c.lower() and c.lower().upper() are single
# characters for every non-BMP character.
if op is RANGE:
- op = RANGE_UNI_IGNORE
+ if fixes: # not ASCII
+ op = RANGE_UNI_IGNORE
+ hascased = True
+ else:
+ assert op is LITERAL
+ if not hascased and iscased(av):
+ hascased = True
tail.append((op, av))
break
diff --git a/contrib/tools/python3/Lib/reprlib.py b/contrib/tools/python3/Lib/reprlib.py
index a7b37630a4..85c1b94a0e 100644
--- a/contrib/tools/python3/Lib/reprlib.py
+++ b/contrib/tools/python3/Lib/reprlib.py
@@ -35,6 +35,17 @@ def recursive_repr(fillvalue='...'):
return decorating_function
class Repr:
+ _lookup = {
+ 'tuple': 'builtins',
+ 'list': 'builtins',
+ 'array': 'array',
+ 'set': 'builtins',
+ 'frozenset': 'builtins',
+ 'deque': 'collections',
+ 'dict': 'builtins',
+ 'str': 'builtins',
+ 'int': 'builtins'
+ }
def __init__(
self, *, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4,
@@ -59,14 +70,24 @@ class Repr:
return self.repr1(x, self.maxlevel)
def repr1(self, x, level):
- typename = type(x).__name__
+ cls = type(x)
+ typename = cls.__name__
+
if ' ' in typename:
parts = typename.split()
typename = '_'.join(parts)
- if hasattr(self, 'repr_' + typename):
- return getattr(self, 'repr_' + typename)(x, level)
- else:
- return self.repr_instance(x, level)
+
+ method = getattr(self, 'repr_' + typename, None)
+ if method:
+ # not defined in this class
+ if typename not in self._lookup:
+ return method(x, level)
+ module = getattr(cls, '__module__', None)
+ # defined in this class and is the module intended
+ if module == self._lookup[typename]:
+ return method(x, level)
+
+ return self.repr_instance(x, level)
def _join(self, pieces, level):
if self.indent is None:
diff --git a/contrib/tools/python3/Lib/shutil.py b/contrib/tools/python3/Lib/shutil.py
index 20ad1cb568..2d28569128 100644
--- a/contrib/tools/python3/Lib/shutil.py
+++ b/contrib/tools/python3/Lib/shutil.py
@@ -1534,21 +1534,21 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None):
if sys.platform == "win32":
# PATHEXT is necessary to check on Windows.
pathext_source = os.getenv("PATHEXT") or _WIN_DEFAULT_PATHEXT
- pathext = [ext for ext in pathext_source.split(os.pathsep) if ext]
+ pathext = pathext_source.split(os.pathsep)
+ pathext = [ext.rstrip('.') for ext in pathext if ext]
if use_bytes:
pathext = [os.fsencode(ext) for ext in pathext]
- files = ([cmd] + [cmd + ext for ext in pathext])
+ files = [cmd + ext for ext in pathext]
- # gh-109590. If we are looking for an executable, we need to look
- # for a PATHEXT match. The first cmd is the direct match
- # (e.g. python.exe instead of python)
- # Check that direct match first if and only if the extension is in PATHEXT
- # Otherwise check it last
- suffix = os.path.splitext(files[0])[1].upper()
- if mode & os.X_OK and not any(suffix == ext.upper() for ext in pathext):
- files.append(files.pop(0))
+ # If X_OK in mode, simulate the cmd.exe behavior: look at direct
+ # match if and only if the extension is in PATHEXT.
+ # If X_OK not in mode, simulate the first result of where.exe:
+ # always look at direct match before a PATHEXT match.
+ normcmd = cmd.upper()
+ if not (mode & os.X_OK) or any(normcmd.endswith(ext.upper()) for ext in pathext):
+ files.insert(0, cmd)
else:
# On other platforms you don't have things like PATHEXT to tell you
# what file suffixes are executable, so just pass on cmd as-is.
@@ -1557,7 +1557,7 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None):
seen = set()
for dir in path:
normdir = os.path.normcase(dir)
- if not normdir in seen:
+ if normdir not in seen:
seen.add(normdir)
for thefile in files:
name = os.path.join(dir, thefile)
diff --git a/contrib/tools/python3/Lib/site.py b/contrib/tools/python3/Lib/site.py
index a2ef1bbacd..5eeec5100f 100644
--- a/contrib/tools/python3/Lib/site.py
+++ b/contrib/tools/python3/Lib/site.py
@@ -426,8 +426,9 @@ def setcopyright():
"""Set 'copyright' and 'credits' in builtins"""
builtins.copyright = _sitebuiltins._Printer("copyright", sys.copyright)
builtins.credits = _sitebuiltins._Printer("credits", """\
- Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
- for supporting Python development. See www.python.org for more information.""")
+ Thanks to CWI, CNRI, BeOpen, Zope Corporation, the Python Software
+ Foundation, and a cast of thousands for supporting Python
+ development. See www.python.org for more information.""")
files, dirs = [], []
# Not all modules are required to have a __file__ attribute. See
# PEP 420 for more details.
diff --git a/contrib/tools/python3/Lib/sysconfig.py b/contrib/tools/python3/Lib/sysconfig.py
index 4fd5fbaab5..9bb81e7842 100644
--- a/contrib/tools/python3/Lib/sysconfig.py
+++ b/contrib/tools/python3/Lib/sysconfig.py
@@ -169,9 +169,7 @@ _SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
_PY_VERSION = sys.version.split()[0]
_PY_VERSION_SHORT = f'{sys.version_info[0]}.{sys.version_info[1]}'
_PY_VERSION_SHORT_NO_DOT = f'{sys.version_info[0]}{sys.version_info[1]}'
-_PREFIX = os.path.normpath(sys.prefix)
_BASE_PREFIX = os.path.normpath(sys.base_prefix)
-_EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
_BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix)
# Mutex guarding initialization of _CONFIG_VARS.
_CONFIG_VARS_LOCK = threading.RLock()
@@ -642,8 +640,10 @@ def _init_config_vars():
# Normalized versions of prefix and exec_prefix are handy to have;
# in fact, these are the standard versions used most places in the
# Distutils.
- _CONFIG_VARS['prefix'] = _PREFIX
- _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX
+ _PREFIX = os.path.normpath(sys.prefix)
+ _EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+ _CONFIG_VARS['prefix'] = _PREFIX # FIXME: This gets overwriten by _init_posix.
+ _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX # FIXME: This gets overwriten by _init_posix.
_CONFIG_VARS['py_version'] = _PY_VERSION
_CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT
_CONFIG_VARS['py_version_nodot'] = _PY_VERSION_SHORT_NO_DOT
@@ -711,6 +711,7 @@ def get_config_vars(*args):
With arguments, return a list of values that result from looking up
each argument in the configuration variable dictionary.
"""
+ global _CONFIG_VARS_INITIALIZED
# Avoid claiming the lock once initialization is complete.
if not _CONFIG_VARS_INITIALIZED:
@@ -721,6 +722,15 @@ def get_config_vars(*args):
# don't re-enter init_config_vars().
if _CONFIG_VARS is None:
_init_config_vars()
+ else:
+ # If the site module initialization happened after _CONFIG_VARS was
+ # initialized, a virtual environment might have been activated, resulting in
+ # variables like sys.prefix changing their value, so we need to re-init the
+ # config vars (see GH-126789).
+ if _CONFIG_VARS['base'] != os.path.normpath(sys.prefix):
+ with _CONFIG_VARS_LOCK:
+ _CONFIG_VARS_INITIALIZED = False
+ _init_config_vars()
if args:
vals = []
diff --git a/contrib/tools/python3/Lib/token.py b/contrib/tools/python3/Lib/token.py
index 487f6edd3c..e26d36bd64 100644
--- a/contrib/tools/python3/Lib/token.py
+++ b/contrib/tools/python3/Lib/token.py
@@ -1,7 +1,8 @@
"""Token constants."""
# Auto-generated by Tools/build/generate_token.py
-__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF']
+__all__ = ['tok_name', 'ISTERMINAL', 'ISNONTERMINAL', 'ISEOF',
+ 'EXACT_TOKEN_TYPES']
ENDMARKER = 0
NAME = 1
diff --git a/contrib/tools/python3/Lib/tokenize.py b/contrib/tools/python3/Lib/tokenize.py
index 7af7a5cc1c..b2dff8e696 100644
--- a/contrib/tools/python3/Lib/tokenize.py
+++ b/contrib/tools/python3/Lib/tokenize.py
@@ -202,7 +202,7 @@ class Untokenizer:
characters[-2::-1]
)
)
- if n_backslashes % 2 == 0:
+ if n_backslashes % 2 == 0 or characters[-1] != "N":
characters.append(character)
else:
consume_until_next_bracket = True
diff --git a/contrib/tools/python3/Lib/typing.py b/contrib/tools/python3/Lib/typing.py
index 94c211292e..a271416d46 100644
--- a/contrib/tools/python3/Lib/typing.py
+++ b/contrib/tools/python3/Lib/typing.py
@@ -1815,7 +1815,8 @@ def _allow_reckless_class_checks(depth=2):
_PROTO_ALLOWLIST = {
'collections.abc': [
'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
- 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 'Buffer',
+ 'AsyncIterator', 'Hashable', 'Sized', 'Container', 'Collection',
+ 'Reversible', 'Buffer',
],
'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
}
diff --git a/contrib/tools/python3/Lib/unittest/async_case.py b/contrib/tools/python3/Lib/unittest/async_case.py
index bd2a471156..2abfb79079 100644
--- a/contrib/tools/python3/Lib/unittest/async_case.py
+++ b/contrib/tools/python3/Lib/unittest/async_case.py
@@ -5,6 +5,7 @@ import warnings
from .case import TestCase
+__unittest = True
class IsolatedAsyncioTestCase(TestCase):
# Names intentionally have a long prefix
diff --git a/contrib/tools/python3/Lib/unittest/mock.py b/contrib/tools/python3/Lib/unittest/mock.py
index 3e9791b22d..c4ce8f8a3e 100644
--- a/contrib/tools/python3/Lib/unittest/mock.py
+++ b/contrib/tools/python3/Lib/unittest/mock.py
@@ -1329,6 +1329,7 @@ class _patch(object):
self.autospec = autospec
self.kwargs = kwargs
self.additional_patchers = []
+ self.is_started = False
def copy(self):
@@ -1441,6 +1442,9 @@ class _patch(object):
def __enter__(self):
"""Perform the patch."""
+ if self.is_started:
+ raise RuntimeError("Patch is already started")
+
new, spec, spec_set = self.new, self.spec, self.spec_set
autospec, kwargs = self.autospec, self.kwargs
new_callable = self.new_callable
@@ -1572,6 +1576,7 @@ class _patch(object):
self.temp_original = original
self.is_local = local
self._exit_stack = contextlib.ExitStack()
+ self.is_started = True
try:
setattr(self.target, self.attribute, new_attr)
if self.attribute_name is not None:
@@ -1591,6 +1596,9 @@ class _patch(object):
def __exit__(self, *exc_info):
"""Undo the patch."""
+ if not self.is_started:
+ return
+
if self.is_local and self.temp_original is not DEFAULT:
setattr(self.target, self.attribute, self.temp_original)
else:
@@ -1607,6 +1615,7 @@ class _patch(object):
del self.target
exit_stack = self._exit_stack
del self._exit_stack
+ self.is_started = False
return exit_stack.__exit__(*exc_info)
diff --git a/contrib/tools/python3/Lib/urllib/request.py b/contrib/tools/python3/Lib/urllib/request.py
index 7228a35534..9a559f4415 100644
--- a/contrib/tools/python3/Lib/urllib/request.py
+++ b/contrib/tools/python3/Lib/urllib/request.py
@@ -1681,12 +1681,27 @@ else:
def url2pathname(pathname):
"""OS-specific conversion from a relative URL of the 'file' scheme
to a file system path; not recommended for general use."""
- return unquote(pathname)
+ if pathname[:3] == '///':
+ # URL has an empty authority section, so the path begins on the
+ # third character.
+ pathname = pathname[2:]
+ elif pathname[:12] == '//localhost/':
+ # Skip past 'localhost' authority.
+ pathname = pathname[11:]
+ encoding = sys.getfilesystemencoding()
+ errors = sys.getfilesystemencodeerrors()
+ return unquote(pathname, encoding=encoding, errors=errors)
def pathname2url(pathname):
"""OS-specific conversion from a file system path to a relative URL
of the 'file' scheme; not recommended for general use."""
- return quote(pathname)
+ if pathname[:2] == '//':
+ # Add explicitly empty authority to avoid interpreting the path
+ # as authority.
+ pathname = '//' + pathname
+ encoding = sys.getfilesystemencoding()
+ errors = sys.getfilesystemencodeerrors()
+ return quote(pathname, encoding=encoding, errors=errors)
ftpcache = {}
diff --git a/contrib/tools/python3/Lib/venv/__init__.py b/contrib/tools/python3/Lib/venv/__init__.py
index d5dec4ab44..aeb522c319 100644
--- a/contrib/tools/python3/Lib/venv/__init__.py
+++ b/contrib/tools/python3/Lib/venv/__init__.py
@@ -11,6 +11,7 @@ import subprocess
import sys
import sysconfig
import types
+import shlex
CORE_VENV_DEPS = ('pip',)
@@ -422,11 +423,41 @@ class EnvBuilder:
:param context: The information for the environment creation request
being processed.
"""
- text = text.replace('__VENV_DIR__', context.env_dir)
- text = text.replace('__VENV_NAME__', context.env_name)
- text = text.replace('__VENV_PROMPT__', context.prompt)
- text = text.replace('__VENV_BIN_NAME__', context.bin_name)
- text = text.replace('__VENV_PYTHON__', context.env_exe)
+ replacements = {
+ '__VENV_DIR__': context.env_dir,
+ '__VENV_NAME__': context.env_name,
+ '__VENV_PROMPT__': context.prompt,
+ '__VENV_BIN_NAME__': context.bin_name,
+ '__VENV_PYTHON__': context.env_exe,
+ }
+
+ def quote_ps1(s):
+ """
+ This should satisfy PowerShell quoting rules [1], unless the quoted
+ string is passed directly to Windows native commands [2].
+ [1]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules
+ [2]: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parsing#passing-arguments-that-contain-quote-characters
+ """
+ s = s.replace("'", "''")
+ return f"'{s}'"
+
+ def quote_bat(s):
+ return s
+
+ # gh-124651: need to quote the template strings properly
+ quote = shlex.quote
+ script_path = context.script_path
+ if script_path.endswith('.ps1'):
+ quote = quote_ps1
+ elif script_path.endswith('.bat'):
+ quote = quote_bat
+ else:
+ # fallbacks to POSIX shell compliant quote
+ quote = shlex.quote
+
+ replacements = {key: quote(s) for key, s in replacements.items()}
+ for key, quoted in replacements.items():
+ text = text.replace(key, quoted)
return text
def install_scripts(self, context, path):
@@ -466,6 +497,7 @@ class EnvBuilder:
with open(srcfile, 'rb') as f:
data = f.read()
if not srcfile.endswith(('.exe', '.pdb')):
+ context.script_path = srcfile
try:
data = data.decode('utf-8')
data = self.replace_variables(data, context)
diff --git a/contrib/tools/python3/Lib/venv/scripts/common/activate b/contrib/tools/python3/Lib/venv/scripts/common/activate
index d5914e0cbb..74825877c3 100644
--- a/contrib/tools/python3/Lib/venv/scripts/common/activate
+++ b/contrib/tools/python3/Lib/venv/scripts/common/activate
@@ -14,8 +14,9 @@ deactivate () {
unset _OLD_VIRTUAL_PYTHONHOME
fi
- # Call hash to forget past commands. Without forgetting
- # past commands the $PATH changes we made may not be respected
+ # Call hash to forget past locations. Without forgetting
+ # past locations the $PATH changes we made may not be respected.
+ # See "man bash" for more details. hash is usually a builtin of your shell
hash -r 2> /dev/null
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
@@ -39,14 +40,14 @@ deactivate nondestructive
if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then
# transform D:\path\to\venv to /d/path/to/venv on MSYS
# and to /cygdrive/d/path/to/venv on Cygwin
- export VIRTUAL_ENV=$(cygpath "__VENV_DIR__")
+ export VIRTUAL_ENV=$(cygpath __VENV_DIR__)
else
# use the path as-is
- export VIRTUAL_ENV="__VENV_DIR__"
+ export VIRTUAL_ENV=__VENV_DIR__
fi
_OLD_VIRTUAL_PATH="$PATH"
-PATH="$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH"
+PATH="$VIRTUAL_ENV/"__VENV_BIN_NAME__":$PATH"
export PATH
# unset PYTHONHOME if set
@@ -59,9 +60,9 @@ fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1:-}"
- PS1="__VENV_PROMPT__${PS1:-}"
+ PS1=__VENV_PROMPT__"${PS1:-}"
export PS1
- VIRTUAL_ENV_PROMPT="__VENV_PROMPT__"
+ VIRTUAL_ENV_PROMPT=__VENV_PROMPT__
export VIRTUAL_ENV_PROMPT
fi
diff --git a/contrib/tools/python3/Lib/venv/scripts/nt/activate.bat b/contrib/tools/python3/Lib/venv/scripts/nt/activate.bat
index 5daa45afc9..c2c6dd29fe 100644
--- a/contrib/tools/python3/Lib/venv/scripts/nt/activate.bat
+++ b/contrib/tools/python3/Lib/venv/scripts/nt/activate.bat
@@ -8,7 +8,7 @@ if defined _OLD_CODEPAGE (
"%SystemRoot%\System32\chcp.com" 65001 > nul
)
-set VIRTUAL_ENV=__VENV_DIR__
+set "VIRTUAL_ENV=__VENV_DIR__"
if not defined PROMPT set PROMPT=$P$G
@@ -24,8 +24,8 @@ set PYTHONHOME=
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%
-set PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%
-set VIRTUAL_ENV_PROMPT=__VENV_PROMPT__
+set "PATH=%VIRTUAL_ENV%\__VENV_BIN_NAME__;%PATH%"
+set "VIRTUAL_ENV_PROMPT=__VENV_PROMPT__"
:END
if defined _OLD_CODEPAGE (
diff --git a/contrib/tools/python3/Lib/venv/scripts/posix/activate.csh b/contrib/tools/python3/Lib/venv/scripts/posix/activate.csh
index 5e8d66fa9e..08f79296f5 100644
--- a/contrib/tools/python3/Lib/venv/scripts/posix/activate.csh
+++ b/contrib/tools/python3/Lib/venv/scripts/posix/activate.csh
@@ -9,17 +9,17 @@ alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PA
# Unset irrelevant variables.
deactivate nondestructive
-setenv VIRTUAL_ENV "__VENV_DIR__"
+setenv VIRTUAL_ENV __VENV_DIR__
set _OLD_VIRTUAL_PATH="$PATH"
-setenv PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH"
+setenv PATH "$VIRTUAL_ENV/"__VENV_BIN_NAME__":$PATH"
set _OLD_VIRTUAL_PROMPT="$prompt"
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
- set prompt = "__VENV_PROMPT__$prompt"
- setenv VIRTUAL_ENV_PROMPT "__VENV_PROMPT__"
+ set prompt = __VENV_PROMPT__"$prompt"
+ setenv VIRTUAL_ENV_PROMPT __VENV_PROMPT__
endif
alias pydoc python -m pydoc
diff --git a/contrib/tools/python3/Lib/venv/scripts/posix/activate.fish b/contrib/tools/python3/Lib/venv/scripts/posix/activate.fish
index 91ad6442e0..508cab0db4 100644
--- a/contrib/tools/python3/Lib/venv/scripts/posix/activate.fish
+++ b/contrib/tools/python3/Lib/venv/scripts/posix/activate.fish
@@ -33,10 +33,10 @@ end
# Unset irrelevant variables.
deactivate nondestructive
-set -gx VIRTUAL_ENV "__VENV_DIR__"
+set -gx VIRTUAL_ENV __VENV_DIR__
set -gx _OLD_VIRTUAL_PATH $PATH
-set -gx PATH "$VIRTUAL_ENV/__VENV_BIN_NAME__" $PATH
+set -gx PATH "$VIRTUAL_ENV/"__VENV_BIN_NAME__ $PATH
# Unset PYTHONHOME if set.
if set -q PYTHONHOME
@@ -56,7 +56,7 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
set -l old_status $status
# Output the venv prompt; color taken from the blue of the Python logo.
- printf "%s%s%s" (set_color 4B8BBE) "__VENV_PROMPT__" (set_color normal)
+ printf "%s%s%s" (set_color 4B8BBE) __VENV_PROMPT__ (set_color normal)
# Restore the return status of the previous command.
echo "exit $old_status" | .
@@ -65,5 +65,5 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
- set -gx VIRTUAL_ENV_PROMPT "__VENV_PROMPT__"
+ set -gx VIRTUAL_ENV_PROMPT __VENV_PROMPT__
end
diff --git a/contrib/tools/python3/Lib/ya.make b/contrib/tools/python3/Lib/ya.make
index 30bec98478..ba53fefab3 100644
--- a/contrib/tools/python3/Lib/ya.make
+++ b/contrib/tools/python3/Lib/ya.make
@@ -4,9 +4,9 @@ ENABLE(PYBUILD_NO_PY)
PY3_LIBRARY()
-VERSION(3.12.7)
+VERSION(3.12.8)
-ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.7.tar.gz)
+ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.8.tar.gz)
LICENSE(Python-2.0)
diff --git a/contrib/tools/python3/Lib/zipfile/__init__.py b/contrib/tools/python3/Lib/zipfile/__init__.py
index 91358156bc..cf71c6dba2 100644
--- a/contrib/tools/python3/Lib/zipfile/__init__.py
+++ b/contrib/tools/python3/Lib/zipfile/__init__.py
@@ -295,7 +295,7 @@ def _EndRecData(fpin):
fpin.seek(-sizeEndCentDir, 2)
except OSError:
return None
- data = fpin.read()
+ data = fpin.read(sizeEndCentDir)
if (len(data) == sizeEndCentDir and
data[0:4] == stringEndArchive and
data[-2:] == b"\000\000"):
@@ -315,9 +315,9 @@ def _EndRecData(fpin):
# record signature. The comment is the last item in the ZIP file and may be
# up to 64K long. It is assumed that the "end of central directory" magic
# number does not appear in the comment.
- maxCommentStart = max(filesize - (1 << 16) - sizeEndCentDir, 0)
+ maxCommentStart = max(filesize - ZIP_MAX_COMMENT - sizeEndCentDir, 0)
fpin.seek(maxCommentStart, 0)
- data = fpin.read()
+ data = fpin.read(ZIP_MAX_COMMENT + sizeEndCentDir)
start = data.rfind(stringEndArchive)
if start >= 0:
# found the magic number; attempt to unpack and interpret
diff --git a/contrib/tools/python3/Lib/zipfile/_path/__init__.py b/contrib/tools/python3/Lib/zipfile/_path/__init__.py
index 8db5ef18d7..645cfafdd6 100644
--- a/contrib/tools/python3/Lib/zipfile/_path/__init__.py
+++ b/contrib/tools/python3/Lib/zipfile/_path/__init__.py
@@ -303,7 +303,7 @@ class Path:
if self.is_dir():
raise IsADirectoryError(self)
zip_mode = mode[0]
- if not self.exists() and zip_mode == 'r':
+ if zip_mode == 'r' and not self.exists():
raise FileNotFoundError(self)
stream = self.root.open(self.at, zip_mode, pwd=pwd)
if 'b' in mode:
diff --git a/contrib/tools/python3/Modules/_asynciomodule.c b/contrib/tools/python3/Modules/_asynciomodule.c
index da44bb6b71..2356b708ee 100644
--- a/contrib/tools/python3/Modules/_asynciomodule.c
+++ b/contrib/tools/python3/Modules/_asynciomodule.c
@@ -430,18 +430,22 @@ future_ensure_alive(FutureObj *fut)
static int
future_schedule_callbacks(asyncio_state *state, FutureObj *fut)
{
- Py_ssize_t len;
- Py_ssize_t i;
-
if (fut->fut_callback0 != NULL) {
/* There's a 1st callback */
- int ret = call_soon(state,
- fut->fut_loop, fut->fut_callback0,
- (PyObject *)fut, fut->fut_context0);
-
- Py_CLEAR(fut->fut_callback0);
- Py_CLEAR(fut->fut_context0);
+ // Beware: An evil call_soon could alter fut_callback0 or fut_context0.
+ // Since we are anyway clearing them after the call, whether call_soon
+ // succeeds or not, the idea is to transfer ownership so that external
+ // code is not able to alter them during the call.
+ PyObject *fut_callback0 = fut->fut_callback0;
+ fut->fut_callback0 = NULL;
+ PyObject *fut_context0 = fut->fut_context0;
+ fut->fut_context0 = NULL;
+
+ int ret = call_soon(state, fut->fut_loop, fut_callback0,
+ (PyObject *)fut, fut_context0);
+ Py_CLEAR(fut_callback0);
+ Py_CLEAR(fut_context0);
if (ret) {
/* If an error occurs in pure-Python implementation,
all callbacks are cleared. */
@@ -458,27 +462,25 @@ future_schedule_callbacks(asyncio_state *state, FutureObj *fut)
return 0;
}
- len = PyList_GET_SIZE(fut->fut_callbacks);
- if (len == 0) {
- /* The list of callbacks was empty; clear it and return. */
- Py_CLEAR(fut->fut_callbacks);
- return 0;
- }
-
- for (i = 0; i < len; i++) {
- PyObject *cb_tup = PyList_GET_ITEM(fut->fut_callbacks, i);
+ // Beware: An evil call_soon could change fut->fut_callbacks.
+ // The idea is to transfer the ownership of the callbacks list
+ // so that external code is not able to mutate the list during
+ // the iteration.
+ PyObject *callbacks = fut->fut_callbacks;
+ fut->fut_callbacks = NULL;
+ Py_ssize_t n = PyList_GET_SIZE(callbacks);
+ for (Py_ssize_t i = 0; i < n; i++) {
+ assert(PyList_GET_SIZE(callbacks) == n);
+ PyObject *cb_tup = PyList_GET_ITEM(callbacks, i);
PyObject *cb = PyTuple_GET_ITEM(cb_tup, 0);
PyObject *ctx = PyTuple_GET_ITEM(cb_tup, 1);
if (call_soon(state, fut->fut_loop, cb, (PyObject *)fut, ctx)) {
- /* If an error occurs in pure-Python implementation,
- all callbacks are cleared. */
- Py_CLEAR(fut->fut_callbacks);
+ Py_DECREF(callbacks);
return -1;
}
}
-
- Py_CLEAR(fut->fut_callbacks);
+ Py_DECREF(callbacks);
return 0;
}
@@ -1042,7 +1044,12 @@ _asyncio_Future_remove_done_callback_impl(FutureObj *self, PyTypeObject *cls,
ENSURE_FUTURE_ALIVE(state, self)
if (self->fut_callback0 != NULL) {
- int cmp = PyObject_RichCompareBool(self->fut_callback0, fn, Py_EQ);
+ // Beware: An evil PyObject_RichCompareBool could free fut_callback0
+ // before a recursive call is made with that same arg. For details, see
+ // https://github.com/python/cpython/pull/125967#discussion_r1816593340.
+ PyObject *fut_callback0 = Py_NewRef(self->fut_callback0);
+ int cmp = PyObject_RichCompareBool(fut_callback0, fn, Py_EQ);
+ Py_DECREF(fut_callback0);
if (cmp == -1) {
return NULL;
}
@@ -1066,8 +1073,10 @@ _asyncio_Future_remove_done_callback_impl(FutureObj *self, PyTypeObject *cls,
if (len == 1) {
PyObject *cb_tup = PyList_GET_ITEM(self->fut_callbacks, 0);
+ Py_INCREF(cb_tup);
int cmp = PyObject_RichCompareBool(
PyTuple_GET_ITEM(cb_tup, 0), fn, Py_EQ);
+ Py_DECREF(cb_tup);
if (cmp == -1) {
return NULL;
}
@@ -1290,52 +1299,49 @@ static PyObject *
FutureObj_get_callbacks(FutureObj *fut, void *Py_UNUSED(ignored))
{
asyncio_state *state = get_asyncio_state_by_def((PyObject *)fut);
- Py_ssize_t i;
-
ENSURE_FUTURE_ALIVE(state, fut)
- if (fut->fut_callback0 == NULL) {
- if (fut->fut_callbacks == NULL) {
- Py_RETURN_NONE;
- }
-
- return Py_NewRef(fut->fut_callbacks);
+ Py_ssize_t len = 0;
+ if (fut->fut_callback0 != NULL) {
+ len++;
}
-
- Py_ssize_t len = 1;
if (fut->fut_callbacks != NULL) {
len += PyList_GET_SIZE(fut->fut_callbacks);
}
-
- PyObject *new_list = PyList_New(len);
- if (new_list == NULL) {
- return NULL;
+ if (len == 0) {
+ Py_RETURN_NONE;
}
- PyObject *tup0 = PyTuple_New(2);
- if (tup0 == NULL) {
- Py_DECREF(new_list);
+ PyObject *callbacks = PyList_New(len);
+ if (callbacks == NULL) {
return NULL;
}
- Py_INCREF(fut->fut_callback0);
- PyTuple_SET_ITEM(tup0, 0, fut->fut_callback0);
- assert(fut->fut_context0 != NULL);
- Py_INCREF(fut->fut_context0);
- PyTuple_SET_ITEM(tup0, 1, (PyObject *)fut->fut_context0);
-
- PyList_SET_ITEM(new_list, 0, tup0);
+ Py_ssize_t i = 0;
+ if (fut->fut_callback0 != NULL) {
+ PyObject *tup0 = PyTuple_New(2);
+ if (tup0 == NULL) {
+ Py_DECREF(callbacks);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(tup0, 0, Py_NewRef(fut->fut_callback0));
+ assert(fut->fut_context0 != NULL);
+ PyTuple_SET_ITEM(tup0, 1, Py_NewRef(fut->fut_context0));
+ PyList_SET_ITEM(callbacks, i, tup0);
+ i++;
+ }
if (fut->fut_callbacks != NULL) {
- for (i = 0; i < PyList_GET_SIZE(fut->fut_callbacks); i++) {
- PyObject *cb = PyList_GET_ITEM(fut->fut_callbacks, i);
+ for (Py_ssize_t j = 0; j < PyList_GET_SIZE(fut->fut_callbacks); j++) {
+ PyObject *cb = PyList_GET_ITEM(fut->fut_callbacks, j);
Py_INCREF(cb);
- PyList_SET_ITEM(new_list, i + 1, cb);
+ PyList_SET_ITEM(callbacks, i, cb);
+ i++;
}
}
- return new_list;
+ return callbacks;
}
static PyObject *
@@ -2139,7 +2145,7 @@ _asyncio_Task___init___impl(TaskObj *self, PyObject *coro, PyObject *loop,
return -1;
}
} else {
- self->task_context = Py_NewRef(context);
+ Py_XSETREF(self->task_context, Py_NewRef(context));
}
Py_CLEAR(self->task_fut_waiter);
@@ -2747,7 +2753,11 @@ task_call_step_soon(asyncio_state *state, TaskObj *task, PyObject *arg)
return -1;
}
- int ret = call_soon(state, task->task_loop, cb, NULL, task->task_context);
+ // Beware: An evil call_soon could alter task_context.
+ // See: https://github.com/python/cpython/issues/126080.
+ PyObject *task_context = Py_NewRef(task->task_context);
+ int ret = call_soon(state, task->task_loop, cb, NULL, task_context);
+ Py_DECREF(task_context);
Py_DECREF(cb);
return ret;
}
@@ -2986,8 +2996,17 @@ task_step_handle_result_impl(asyncio_state *state, TaskObj *task, PyObject *resu
if (task->task_must_cancel) {
PyObject *r;
int is_true;
+
+ // Beware: An evil `__getattribute__` could
+ // prematurely delete task->task_cancel_msg before the
+ // task is cancelled, thereby causing a UAF crash.
+ //
+ // See https://github.com/python/cpython/issues/126138
+ PyObject *task_cancel_msg = Py_NewRef(task->task_cancel_msg);
r = PyObject_CallMethodOneArg(result, &_Py_ID(cancel),
- task->task_cancel_msg);
+ task_cancel_msg);
+ Py_DECREF(task_cancel_msg);
+
if (r == NULL) {
return NULL;
}
@@ -3079,8 +3098,17 @@ task_step_handle_result_impl(asyncio_state *state, TaskObj *task, PyObject *resu
if (task->task_must_cancel) {
PyObject *r;
int is_true;
+
+ // Beware: An evil `__getattribute__` could
+ // prematurely delete task->task_cancel_msg before the
+ // task is cancelled, thereby causing a UAF crash.
+ //
+ // See https://github.com/python/cpython/issues/126138
+ PyObject *task_cancel_msg = Py_NewRef(task->task_cancel_msg);
r = PyObject_CallMethodOneArg(result, &_Py_ID(cancel),
- task->task_cancel_msg);
+ task_cancel_msg);
+ Py_DECREF(task_cancel_msg);
+
if (r == NULL) {
return NULL;
}
diff --git a/contrib/tools/python3/Modules/_bisectmodule.c b/contrib/tools/python3/Modules/_bisectmodule.c
index 0773bbd191..d79946c840 100644
--- a/contrib/tools/python3/Modules/_bisectmodule.c
+++ b/contrib/tools/python3/Modules/_bisectmodule.c
@@ -66,7 +66,7 @@ internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t
if (sq_item == NULL) {
return -1;
}
- if (Py_EnterRecursiveCall("in _bisect.bisect_right")) {
+ if (Py_EnterRecursiveCall(" in _bisect.bisect_right")) {
return -1;
}
PyTypeObject *tp = Py_TYPE(item);
@@ -250,7 +250,7 @@ internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t h
if (sq_item == NULL) {
return -1;
}
- if (Py_EnterRecursiveCall("in _bisect.bisect_left")) {
+ if (Py_EnterRecursiveCall(" in _bisect.bisect_left")) {
return -1;
}
PyTypeObject *tp = Py_TYPE(item);
diff --git a/contrib/tools/python3/Modules/_ctypes/_ctypes.c b/contrib/tools/python3/Modules/_ctypes/_ctypes.c
index d72614d2b8..b6d45e9264 100644
--- a/contrib/tools/python3/Modules/_ctypes/_ctypes.c
+++ b/contrib/tools/python3/Modules/_ctypes/_ctypes.c
@@ -2269,7 +2269,7 @@ PyCSimpleType_from_param(PyObject *type, PyObject *value)
return NULL;
}
if (as_parameter) {
- if (_Py_EnterRecursiveCall("while processing _as_parameter_")) {
+ if (_Py_EnterRecursiveCall(" while processing _as_parameter_")) {
Py_DECREF(as_parameter);
Py_XDECREF(exc);
return NULL;
diff --git a/contrib/tools/python3/Modules/_datetimemodule.c b/contrib/tools/python3/Modules/_datetimemodule.c
index 5a062b9c8c..8535811a61 100644
--- a/contrib/tools/python3/Modules/_datetimemodule.c
+++ b/contrib/tools/python3/Modules/_datetimemodule.c
@@ -1501,7 +1501,7 @@ make_somezreplacement(PyObject *object, char *sep, PyObject *tzinfoarg)
PyObject *tzinfo = get_tzinfo_member(object);
if (tzinfo == Py_None || tzinfo == NULL) {
- return PyBytes_FromStringAndSize(NULL, 0);
+ return PyUnicode_FromStringAndSize(NULL, 0);
}
assert(tzinfoarg != NULL);
@@ -1512,7 +1512,7 @@ make_somezreplacement(PyObject *object, char *sep, PyObject *tzinfoarg)
tzinfoarg) < 0)
return NULL;
- return PyBytes_FromStringAndSize(buf, strlen(buf));
+ return PyUnicode_FromString(buf);
}
static PyObject *
@@ -1569,7 +1569,7 @@ make_freplacement(PyObject *object)
else
sprintf(freplacement, "%06d", 0);
- return PyBytes_FromStringAndSize(freplacement, strlen(freplacement));
+ return PyUnicode_FromString(freplacement);
}
/* I sure don't want to reproduce the strftime code from the time module,
@@ -1590,79 +1590,60 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
PyObject *Zreplacement = NULL; /* py string, replacement for %Z */
PyObject *freplacement = NULL; /* py string, replacement for %f */
- const char *pin; /* pointer to next char in input format */
- Py_ssize_t flen; /* length of input format */
- char ch; /* next char in input format */
-
- PyObject *newfmt = NULL; /* py string, the output format */
- char *pnew; /* pointer to available byte in output format */
- size_t totalnew; /* number bytes total in output format buffer,
- exclusive of trailing \0 */
- size_t usednew; /* number bytes used so far in output format buffer */
-
- const char *ptoappend; /* ptr to string to append to output buffer */
- Py_ssize_t ntoappend; /* # of bytes to append to output buffer */
-
assert(object && format && timetuple);
assert(PyUnicode_Check(format));
- /* Convert the input format to a C string and size */
- pin = PyUnicode_AsUTF8AndSize(format, &flen);
- if (!pin)
+
+ PyObject *strftime = _PyImport_GetModuleAttrString("time", "strftime");
+ if (strftime == NULL) {
return NULL;
+ }
/* Scan the input format, looking for %z/%Z/%f escapes, building
* a new format. Since computing the replacements for those codes
* is expensive, don't unless they're actually used.
*/
- if (flen > INT_MAX - 1) {
- PyErr_NoMemory();
- goto Done;
- }
- totalnew = flen + 1; /* realistic if no %z/%Z */
- newfmt = PyBytes_FromStringAndSize(NULL, totalnew);
- if (newfmt == NULL) goto Done;
- pnew = PyBytes_AsString(newfmt);
- usednew = 0;
-
- while ((ch = *pin++) != '\0') {
- if (ch != '%') {
- ptoappend = pin - 1;
- ntoappend = 1;
+ _PyUnicodeWriter writer;
+ _PyUnicodeWriter_Init(&writer);
+ writer.overallocate = 1;
+
+ Py_ssize_t flen = PyUnicode_GET_LENGTH(format);
+ Py_ssize_t i = 0;
+ Py_ssize_t start = 0;
+ Py_ssize_t end = 0;
+ while (i != flen) {
+ i = PyUnicode_FindChar(format, '%', i, flen, 1);
+ if (i < 0) {
+ assert(!PyErr_Occurred());
+ break;
}
- else if ((ch = *pin++) == '\0') {
- /* Null byte follows %, copy only '%'.
- *
- * Back the pin up one char so that we catch the null check
- * the next time through the loop.*/
- pin--;
- ptoappend = pin - 1;
- ntoappend = 1;
+ end = i;
+ i++;
+ if (i == flen) {
+ break;
}
+ Py_UCS4 ch = PyUnicode_READ_CHAR(format, i);
+ i++;
/* A % has been seen and ch is the character after it. */
- else if (ch == 'z') {
+ PyObject *replacement = NULL;
+ if (ch == 'z') {
/* %z -> +HHMM */
if (zreplacement == NULL) {
zreplacement = make_somezreplacement(object, "", tzinfoarg);
if (zreplacement == NULL)
- goto Done;
+ goto Error;
}
- assert(zreplacement != NULL);
- assert(PyBytes_Check(zreplacement));
- ptoappend = PyBytes_AS_STRING(zreplacement);
- ntoappend = PyBytes_GET_SIZE(zreplacement);
+ replacement = zreplacement;
}
- else if (ch == ':' && *pin == 'z' && pin++) {
+ else if (ch == ':' && i < flen && PyUnicode_READ_CHAR(format, i) == 'z') {
/* %:z -> +HH:MM */
+ i++;
if (colonzreplacement == NULL) {
colonzreplacement = make_somezreplacement(object, ":", tzinfoarg);
if (colonzreplacement == NULL)
- goto Done;
+ goto Error;
}
- assert(colonzreplacement != NULL);
- assert(PyBytes_Check(colonzreplacement));
- ptoappend = PyBytes_AS_STRING(colonzreplacement);
- ntoappend = PyBytes_GET_SIZE(colonzreplacement);
+ replacement = colonzreplacement;
}
else if (ch == 'Z') {
/* format tzname */
@@ -1670,79 +1651,63 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
Zreplacement = make_Zreplacement(object,
tzinfoarg);
if (Zreplacement == NULL)
- goto Done;
+ goto Error;
}
- assert(Zreplacement != NULL);
- assert(PyUnicode_Check(Zreplacement));
- ptoappend = PyUnicode_AsUTF8AndSize(Zreplacement,
- &ntoappend);
- if (ptoappend == NULL)
- goto Done;
+ replacement = Zreplacement;
}
else if (ch == 'f') {
/* format microseconds */
if (freplacement == NULL) {
freplacement = make_freplacement(object);
if (freplacement == NULL)
- goto Done;
+ goto Error;
}
- assert(freplacement != NULL);
- assert(PyBytes_Check(freplacement));
- ptoappend = PyBytes_AS_STRING(freplacement);
- ntoappend = PyBytes_GET_SIZE(freplacement);
+ replacement = freplacement;
}
else {
/* percent followed by something else */
- ptoappend = pin - 2;
- ntoappend = 2;
- }
-
- /* Append the ntoappend chars starting at ptoappend to
- * the new format.
- */
- if (ntoappend == 0)
continue;
- assert(ptoappend != NULL);
- assert(ntoappend > 0);
- while (usednew + ntoappend > totalnew) {
- if (totalnew > (PY_SSIZE_T_MAX >> 1)) { /* overflow */
- PyErr_NoMemory();
- goto Done;
- }
- totalnew <<= 1;
- if (_PyBytes_Resize(&newfmt, totalnew) < 0)
- goto Done;
- pnew = PyBytes_AsString(newfmt) + usednew;
}
- memcpy(pnew, ptoappend, ntoappend);
- pnew += ntoappend;
- usednew += ntoappend;
- assert(usednew <= totalnew);
+ assert(replacement != NULL);
+ assert(PyUnicode_Check(replacement));
+ if (_PyUnicodeWriter_WriteSubstring(&writer, format, start, end) < 0) {
+ goto Error;
+ }
+ start = i;
+ if (_PyUnicodeWriter_WriteStr(&writer, replacement) < 0) {
+ goto Error;
+ }
} /* end while() */
- if (_PyBytes_Resize(&newfmt, usednew) < 0)
- goto Done;
- {
- PyObject *format;
- PyObject *strftime = _PyImport_GetModuleAttrString("time", "strftime");
-
- if (strftime == NULL)
+ PyObject *newformat;
+ if (start == 0) {
+ _PyUnicodeWriter_Dealloc(&writer);
+ newformat = Py_NewRef(format);
+ }
+ else {
+ if (_PyUnicodeWriter_WriteSubstring(&writer, format, start, flen) < 0) {
+ goto Error;
+ }
+ newformat = _PyUnicodeWriter_Finish(&writer);
+ if (newformat == NULL) {
goto Done;
- format = PyUnicode_FromString(PyBytes_AS_STRING(newfmt));
- if (format != NULL) {
- result = PyObject_CallFunctionObjArgs(strftime,
- format, timetuple, NULL);
- Py_DECREF(format);
}
- Py_DECREF(strftime);
}
+ result = PyObject_CallFunctionObjArgs(strftime,
+ newformat, timetuple, NULL);
+ Py_DECREF(newformat);
+
Done:
Py_XDECREF(freplacement);
Py_XDECREF(zreplacement);
Py_XDECREF(colonzreplacement);
Py_XDECREF(Zreplacement);
- Py_XDECREF(newfmt);
+ Py_XDECREF(strftime);
return result;
+
+ Error:
+ _PyUnicodeWriter_Dealloc(&writer);
+ goto Done;
}
/* ---------------------------------------------------------------------------
diff --git a/contrib/tools/python3/Modules/_functoolsmodule.c b/contrib/tools/python3/Modules/_functoolsmodule.c
index a8001d7122..a6d1b83984 100644
--- a/contrib/tools/python3/Modules/_functoolsmodule.c
+++ b/contrib/tools/python3/Modules/_functoolsmodule.c
@@ -734,12 +734,14 @@ Fail:
PyDoc_STRVAR(functools_reduce_doc,
"reduce(function, iterable[, initial]) -> value\n\
\n\
-Apply a function of two arguments cumulatively to the items of a sequence\n\
-or iterable, from left to right, so as to reduce the iterable to a single\n\
-value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
-((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
-of the iterable in the calculation, and serves as a default when the\n\
-iterable is empty.");
+Apply a function of two arguments cumulatively to the items of an iterable, from left to right.\n\
+\n\
+This effectively reduces the iterable to a single value. If initial is present,\n\
+it is placed before the items of the iterable in the calculation, and serves as\n\
+a default when the iterable is empty.\n\
+\n\
+For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])\n\
+calculates ((((1 + 2) + 3) + 4) + 5).");
/* lru_cache object **********************************************************/
diff --git a/contrib/tools/python3/Modules/_io/stringio.c b/contrib/tools/python3/Modules/_io/stringio.c
index 568d0bd709..ed9cf0da91 100644
--- a/contrib/tools/python3/Modules/_io/stringio.c
+++ b/contrib/tools/python3/Modules/_io/stringio.c
@@ -884,23 +884,25 @@ stringio_setstate(stringio *self, PyObject *state)
once by __init__. So we do not take any chance and replace object's
buffer completely. */
{
- PyObject *item;
- Py_UCS4 *buf;
- Py_ssize_t bufsize;
-
- item = PyTuple_GET_ITEM(state, 0);
- buf = PyUnicode_AsUCS4Copy(item);
- if (buf == NULL)
- return NULL;
- bufsize = PyUnicode_GET_LENGTH(item);
+ PyObject *item = PyTuple_GET_ITEM(state, 0);
+ if (PyUnicode_Check(item)) {
+ Py_UCS4 *buf = PyUnicode_AsUCS4Copy(item);
+ if (buf == NULL)
+ return NULL;
+ Py_ssize_t bufsize = PyUnicode_GET_LENGTH(item);
- if (resize_buffer(self, bufsize) < 0) {
+ if (resize_buffer(self, bufsize) < 0) {
+ PyMem_Free(buf);
+ return NULL;
+ }
+ memcpy(self->buf, buf, bufsize * sizeof(Py_UCS4));
PyMem_Free(buf);
- return NULL;
+ self->string_size = bufsize;
+ }
+ else {
+ assert(item == Py_None);
+ self->string_size = 0;
}
- memcpy(self->buf, buf, bufsize * sizeof(Py_UCS4));
- PyMem_Free(buf);
- self->string_size = bufsize;
}
/* Set carefully the position value. Alternatively, we could use the seek
diff --git a/contrib/tools/python3/Modules/_io/winconsoleio.c b/contrib/tools/python3/Modules/_io/winconsoleio.c
index c2c365e080..da4907ec2d 100644
--- a/contrib/tools/python3/Modules/_io/winconsoleio.c
+++ b/contrib/tools/python3/Modules/_io/winconsoleio.c
@@ -135,19 +135,67 @@ char _PyIO_get_console_type(PyObject *path_or_fd) {
}
static DWORD
-_find_last_utf8_boundary(const char *buf, DWORD len)
+_find_last_utf8_boundary(const unsigned char *buf, DWORD len)
{
- /* This function never returns 0, returns the original len instead */
- DWORD count = 1;
- if (len == 0 || (buf[len - 1] & 0x80) == 0) {
- return len;
- }
- for (;; count++) {
- if (count > 3 || count >= len) {
+ for (DWORD count = 1; count < 4 && count <= len; count++) {
+ unsigned char c = buf[len - count];
+ if (c < 0x80) {
+ /* No starting byte found. */
return len;
}
- if ((buf[len - count] & 0xc0) != 0x80) {
- return len - count;
+ if (c >= 0xc0) {
+ if (c < 0xe0 /* 2-bytes sequence */ ? count < 2 :
+ c < 0xf0 /* 3-bytes sequence */ ? count < 3 :
+ c < 0xf8 /* 4-bytes sequence */)
+ {
+ /* Incomplete multibyte sequence. */
+ return len - count;
+ }
+ /* Either complete or invalid sequence. */
+ return len;
+ }
+ }
+ /* Either complete 4-bytes sequence or invalid sequence. */
+ return len;
+}
+
+/* Find the number of UTF-8 bytes that corresponds to the specified number of
+ * wchars.
+ * I.e. find x <= len so that MultiByteToWideChar(CP_UTF8, 0, s, x, NULL, 0) == n.
+ *
+ * WideCharToMultiByte() cannot be used for this, because the UTF-8 -> wchar
+ * conversion is not reversible (invalid UTF-8 byte produces \ufffd which
+ * will be converted back to 3-bytes UTF-8 sequence \xef\xbf\xbd).
+ * So we need to use binary search.
+ */
+static DWORD
+_wchar_to_utf8_count(const unsigned char *s, DWORD len, DWORD n)
+{
+ DWORD start = 0;
+ while (1) {
+ DWORD mid = 0;
+ for (DWORD i = len / 2; i <= len; i++) {
+ mid = _find_last_utf8_boundary(s, i);
+ if (mid != 0) {
+ break;
+ }
+ /* The middle could split the first multibytes sequence. */
+ }
+ if (mid == len) {
+ return start + len;
+ }
+ if (mid == 0) {
+ mid = len > 1 ? len - 1 : 1;
+ }
+ DWORD wlen = MultiByteToWideChar(CP_UTF8, 0, s, mid, NULL, 0);
+ if (wlen <= n) {
+ s += mid;
+ start += mid;
+ len -= mid;
+ n -= wlen;
+ }
+ else {
+ len = mid;
}
}
}
@@ -556,8 +604,10 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) {
int err = 0, sig = 0;
wchar_t *buf = (wchar_t*)PyMem_Malloc(maxlen * sizeof(wchar_t));
- if (!buf)
+ if (!buf) {
+ PyErr_NoMemory();
goto error;
+ }
*readlen = 0;
@@ -615,6 +665,7 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) {
Py_UNBLOCK_THREADS
if (!newbuf) {
sig = -1;
+ PyErr_NoMemory();
break;
}
buf = newbuf;
@@ -638,8 +689,10 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) {
if (*readlen > 0 && buf[0] == L'\x1a') {
PyMem_Free(buf);
buf = (wchar_t *)PyMem_Malloc(sizeof(wchar_t));
- if (!buf)
+ if (!buf) {
+ PyErr_NoMemory();
goto error;
+ }
buf[0] = L'\0';
*readlen = 0;
}
@@ -817,8 +870,10 @@ _io__WindowsConsoleIO_readall_impl(winconsoleio *self)
bufsize = BUFSIZ;
buf = (wchar_t*)PyMem_Malloc((bufsize + 1) * sizeof(wchar_t));
- if (buf == NULL)
+ if (buf == NULL) {
+ PyErr_NoMemory();
return NULL;
+ }
while (1) {
wchar_t *subbuf;
@@ -840,6 +895,7 @@ _io__WindowsConsoleIO_readall_impl(winconsoleio *self)
(bufsize + 1) * sizeof(wchar_t));
if (tmp == NULL) {
PyMem_Free(buf);
+ PyErr_NoMemory();
return NULL;
}
buf = tmp;
@@ -1015,43 +1071,49 @@ _io__WindowsConsoleIO_write_impl(winconsoleio *self, PyTypeObject *cls,
len = (DWORD)b->len;
Py_BEGIN_ALLOW_THREADS
- wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, NULL, 0);
-
/* issue11395 there is an unspecified upper bound on how many bytes
can be written at once. We cap at 32k - the caller will have to
handle partial writes.
Since we don't know how many input bytes are being ignored, we
have to reduce and recalculate. */
- while (wlen > 32766 / sizeof(wchar_t)) {
- len /= 2;
+ const DWORD max_wlen = 32766 / sizeof(wchar_t);
+ /* UTF-8 to wchar ratio is at most 3:1. */
+ len = Py_MIN(len, max_wlen * 3);
+ while (1) {
/* Fix for github issues gh-110913 and gh-82052. */
len = _find_last_utf8_boundary(b->buf, len);
wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, NULL, 0);
+ if (wlen <= max_wlen) {
+ break;
+ }
+ len /= 2;
}
Py_END_ALLOW_THREADS
- if (!wlen)
- return PyErr_SetFromWindowsErr(0);
+ if (!wlen) {
+ return PyLong_FromLong(0);
+ }
wbuf = (wchar_t*)PyMem_Malloc(wlen * sizeof(wchar_t));
+ if (!wbuf) {
+ PyErr_NoMemory();
+ return NULL;
+ }
Py_BEGIN_ALLOW_THREADS
wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len, wbuf, wlen);
if (wlen) {
res = WriteConsoleW(handle, wbuf, wlen, &n, NULL);
+#ifdef Py_DEBUG
+ if (res) {
+#else
if (res && n < wlen) {
+#endif
/* Wrote fewer characters than expected, which means our
* len value may be wrong. So recalculate it from the
- * characters that were written. As this could potentially
- * result in a different value, we also validate that value.
+ * characters that were written.
*/
- len = WideCharToMultiByte(CP_UTF8, 0, wbuf, n,
- NULL, 0, NULL, NULL);
- if (len) {
- wlen = MultiByteToWideChar(CP_UTF8, 0, b->buf, len,
- NULL, 0);
- assert(wlen == len);
- }
+ len = _wchar_to_utf8_count(b->buf, len, n);
}
} else
res = 0;
diff --git a/contrib/tools/python3/Modules/_localemodule.c b/contrib/tools/python3/Modules/_localemodule.c
index f080b97034..db8194372d 100644
--- a/contrib/tools/python3/Modules/_localemodule.c
+++ b/contrib/tools/python3/Modules/_localemodule.c
@@ -595,6 +595,37 @@ static struct langinfo_constant{
{0, 0}
};
+#ifdef __GLIBC__
+#if defined(ALT_DIGITS) || defined(ERA)
+static PyObject *
+decode_strings(const char *result, size_t max_count)
+{
+ /* Convert a sequence of NUL-separated C strings to a Python string
+ * containing semicolon separated items. */
+ size_t i = 0;
+ size_t count = 0;
+ for (; count < max_count && result[i]; count++) {
+ i += strlen(result + i) + 1;
+ }
+ char *buf = PyMem_Malloc(i);
+ if (buf == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ memcpy(buf, result, i);
+ /* Replace all NULs with semicolons. */
+ i = 0;
+ while (--count) {
+ i += strlen(buf + i);
+ buf[i++] = ';';
+ }
+ PyObject *pyresult = PyUnicode_DecodeLocale(buf, NULL);
+ PyMem_Free(buf);
+ return pyresult;
+}
+#endif
+#endif
+
/*[clinic input]
_locale.nl_langinfo
@@ -618,7 +649,28 @@ _locale_nl_langinfo_impl(PyObject *module, int item)
instead of an empty string for nl_langinfo(ERA). */
const char *result = nl_langinfo(item);
result = result != NULL ? result : "";
- return PyUnicode_DecodeLocale(result, NULL);
+ PyObject *pyresult;
+#ifdef __GLIBC__
+ /* According to the POSIX specification the result must be
+ * a sequence of semicolon-separated strings.
+ * But in Glibc they are NUL-separated. */
+#ifdef ALT_DIGITS
+ if (item == ALT_DIGITS && *result) {
+ pyresult = decode_strings(result, 100);
+ }
+ else
+#endif
+#ifdef ERA
+ if (item == ERA && *result) {
+ pyresult = decode_strings(result, SIZE_MAX);
+ }
+ else
+#endif
+#endif
+ {
+ pyresult = PyUnicode_DecodeLocale(result, NULL);
+ }
+ return pyresult;
}
PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant");
return NULL;
diff --git a/contrib/tools/python3/Modules/_lsprof.c b/contrib/tools/python3/Modules/_lsprof.c
index 2c82b18c0e..0464e7e8a4 100644
--- a/contrib/tools/python3/Modules/_lsprof.c
+++ b/contrib/tools/python3/Modules/_lsprof.c
@@ -604,6 +604,12 @@ setBuiltins(ProfilerObject *pObj, int nvalue)
PyObject* pystart_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size)
{
+ if (size < 2) {
+ PyErr_Format(PyExc_TypeError,
+ "_pystart_callback expected 2 arguments, got %zd",
+ size);
+ return NULL;
+ }
PyObject* code = args[0];
ptrace_enter_call((PyObject*)self, (void *)code, (PyObject *)code);
@@ -612,6 +618,12 @@ PyObject* pystart_callback(ProfilerObject* self, PyObject *const *args, Py_ssize
PyObject* pyreturn_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size)
{
+ if (size < 3) {
+ PyErr_Format(PyExc_TypeError,
+ "_pyreturn_callback expected 3 arguments, got %zd",
+ size);
+ return NULL;
+ }
PyObject* code = args[0];
ptrace_leave_call((PyObject*)self, (void *)code);
@@ -647,6 +659,12 @@ PyObject* get_cfunc_from_callable(PyObject* callable, PyObject* self_arg, PyObje
PyObject* ccall_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size)
{
+ if (size < 4) {
+ PyErr_Format(PyExc_TypeError,
+ "_ccall_callback expected 4 arguments, got %zd",
+ size);
+ return NULL;
+ }
if (self->flags & POF_BUILTINS) {
PyObject* callable = args[2];
PyObject* self_arg = args[3];
@@ -665,6 +683,12 @@ PyObject* ccall_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t
PyObject* creturn_callback(ProfilerObject* self, PyObject *const *args, Py_ssize_t size)
{
+ if (size < 4) {
+ PyErr_Format(PyExc_TypeError,
+ "_creturn_callback expected 4 arguments, got %zd",
+ size);
+ return NULL;
+ }
if (self->flags & POF_BUILTINS) {
PyObject* callable = args[2];
PyObject* self_arg = args[3];
@@ -726,34 +750,47 @@ profiler_enable(ProfilerObject *self, PyObject *args, PyObject *kwds)
return NULL;
}
- if (PyObject_CallMethod(monitoring, "use_tool_id", "is", self->tool_id, "cProfile") == NULL) {
+ PyObject *check = PyObject_CallMethod(monitoring,
+ "use_tool_id", "is",
+ self->tool_id, "cProfile");
+ if (check == NULL) {
PyErr_Format(PyExc_ValueError, "Another profiling tool is already active");
- Py_DECREF(monitoring);
- return NULL;
+ goto error;
}
+ Py_DECREF(check);
for (int i = 0; callback_table[i].callback_method; i++) {
+ int event = (1 << callback_table[i].event);
PyObject* callback = PyObject_GetAttrString((PyObject*)self, callback_table[i].callback_method);
if (!callback) {
- Py_DECREF(monitoring);
- return NULL;
+ goto error;
}
- Py_XDECREF(PyObject_CallMethod(monitoring, "register_callback", "iiO", self->tool_id,
- (1 << callback_table[i].event),
- callback));
+ PyObject *register_result = PyObject_CallMethod(monitoring, "register_callback",
+ "iiO", self->tool_id,
+ event, callback);
Py_DECREF(callback);
- all_events |= (1 << callback_table[i].event);
+ if (register_result == NULL) {
+ goto error;
+ }
+ Py_DECREF(register_result);
+ all_events |= event;
}
- if (!PyObject_CallMethod(monitoring, "set_events", "ii", self->tool_id, all_events)) {
- Py_DECREF(monitoring);
- return NULL;
+ PyObject *event_result = PyObject_CallMethod(monitoring, "set_events", "ii",
+ self->tool_id, all_events);
+ if (event_result == NULL) {
+ goto error;
}
+ Py_DECREF(event_result);
Py_DECREF(monitoring);
self->flags |= POF_ENABLED;
Py_RETURN_NONE;
+
+error:
+ Py_DECREF(monitoring);
+ return NULL;
}
static void
diff --git a/contrib/tools/python3/Modules/_pickle.c b/contrib/tools/python3/Modules/_pickle.c
index 879c18263d..b8f701c2af 100644
--- a/contrib/tools/python3/Modules/_pickle.c
+++ b/contrib/tools/python3/Modules/_pickle.c
@@ -1344,6 +1344,10 @@ _Unpickler_ReadFromFile(UnpicklerObject *self, Py_ssize_t n)
else {
read_size = _Unpickler_SetStringInput(self, data);
Py_DECREF(data);
+ if (read_size < 0) {
+ return -1;
+ }
+
self->prefetched_idx = 0;
if (n <= read_size)
return n;
@@ -6722,6 +6726,7 @@ load_build(PickleState *st, UnpicklerObject *self)
}
if (PyObject_SetItem(dict, d_key, d_value) < 0) {
Py_DECREF(d_key);
+ Py_DECREF(dict);
goto error;
}
Py_DECREF(d_key);
diff --git a/contrib/tools/python3/Modules/_sqlite/ya.make b/contrib/tools/python3/Modules/_sqlite/ya.make
index 9b0a2db882..bbafbaff85 100644
--- a/contrib/tools/python3/Modules/_sqlite/ya.make
+++ b/contrib/tools/python3/Modules/_sqlite/ya.make
@@ -2,9 +2,9 @@
PY3_LIBRARY()
-VERSION(3.12.7)
+VERSION(3.12.8)
-ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.7.tar.gz)
+ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.8.tar.gz)
LICENSE(Python-2.0)
diff --git a/contrib/tools/python3/Modules/_sre/clinic/sre.c.h b/contrib/tools/python3/Modules/_sre/clinic/sre.c.h
index 529c634e76..56a4e6048f 100644
--- a/contrib/tools/python3/Modules/_sre/clinic/sre.c.h
+++ b/contrib/tools/python3/Modules/_sre/clinic/sre.c.h
@@ -975,6 +975,44 @@ PyDoc_STRVAR(_sre_SRE_Pattern___deepcopy____doc__,
#define _SRE_SRE_PATTERN___DEEPCOPY___METHODDEF \
{"__deepcopy__", (PyCFunction)_sre_SRE_Pattern___deepcopy__, METH_O, _sre_SRE_Pattern___deepcopy____doc__},
+#if defined(Py_DEBUG)
+
+PyDoc_STRVAR(_sre_SRE_Pattern__fail_after__doc__,
+"_fail_after($self, count, exception, /)\n"
+"--\n"
+"\n"
+"For debugging.");
+
+#define _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF \
+ {"_fail_after", _PyCFunction_CAST(_sre_SRE_Pattern__fail_after), METH_FASTCALL, _sre_SRE_Pattern__fail_after__doc__},
+
+static PyObject *
+_sre_SRE_Pattern__fail_after_impl(PatternObject *self, int count,
+ PyObject *exception);
+
+static PyObject *
+_sre_SRE_Pattern__fail_after(PatternObject *self, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ int count;
+ PyObject *exception;
+
+ if (!_PyArg_CheckPositional("_fail_after", nargs, 2, 2)) {
+ goto exit;
+ }
+ count = _PyLong_AsInt(args[0]);
+ if (count == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ exception = args[1];
+ return_value = _sre_SRE_Pattern__fail_after_impl(self, count, exception);
+
+exit:
+ return return_value;
+}
+
+#endif /* defined(Py_DEBUG) */
+
PyDoc_STRVAR(_sre_compile__doc__,
"compile($module, /, pattern, flags, code, groups, groupindex,\n"
" indexgroup)\n"
@@ -1460,4 +1498,8 @@ _sre_SRE_Scanner_search(ScannerObject *self, PyTypeObject *cls, PyObject *const
}
return _sre_SRE_Scanner_search_impl(self, cls);
}
-/*[clinic end generated code: output=045de53cfe02dee0 input=a9049054013a1b77]*/
+
+#ifndef _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF
+ #define _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF
+#endif /* !defined(_SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF) */
+/*[clinic end generated code: output=2165ecf43a7c20e8 input=a9049054013a1b77]*/
diff --git a/contrib/tools/python3/Modules/_sre/sre.c b/contrib/tools/python3/Modules/_sre/sre.c
index 6d9843bb76..35c6058dac 100644
--- a/contrib/tools/python3/Modules/_sre/sre.c
+++ b/contrib/tools/python3/Modules/_sre/sre.c
@@ -218,6 +218,85 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size)
return 0;
}
+/* memory pool functions for SRE_REPEAT, this can avoid memory
+ leak when SRE(match) function terminates abruptly.
+ state->repeat_pool_used is a doubly-linked list, so that we
+ can remove a SRE_REPEAT node from it.
+ state->repeat_pool_unused is a singly-linked list, we put/get
+ node at the head. */
+static SRE_REPEAT *
+repeat_pool_malloc(SRE_STATE *state)
+{
+ SRE_REPEAT *repeat;
+
+ if (state->repeat_pool_unused) {
+ /* remove from unused pool (singly-linked list) */
+ repeat = state->repeat_pool_unused;
+ state->repeat_pool_unused = repeat->pool_next;
+ }
+ else {
+ repeat = PyObject_Malloc(sizeof(SRE_REPEAT));
+ if (!repeat) {
+ return NULL;
+ }
+ }
+
+ /* add to used pool (doubly-linked list) */
+ SRE_REPEAT *temp = state->repeat_pool_used;
+ if (temp) {
+ temp->pool_prev = repeat;
+ }
+ repeat->pool_prev = NULL;
+ repeat->pool_next = temp;
+ state->repeat_pool_used = repeat;
+
+ return repeat;
+}
+
+static void
+repeat_pool_free(SRE_STATE *state, SRE_REPEAT *repeat)
+{
+ SRE_REPEAT *prev = repeat->pool_prev;
+ SRE_REPEAT *next = repeat->pool_next;
+
+ /* remove from used pool (doubly-linked list) */
+ if (prev) {
+ prev->pool_next = next;
+ }
+ else {
+ state->repeat_pool_used = next;
+ }
+ if (next) {
+ next->pool_prev = prev;
+ }
+
+ /* add to unused pool (singly-linked list) */
+ repeat->pool_next = state->repeat_pool_unused;
+ state->repeat_pool_unused = repeat;
+}
+
+static void
+repeat_pool_clear(SRE_STATE *state)
+{
+ /* clear used pool */
+ SRE_REPEAT *next = state->repeat_pool_used;
+ state->repeat_pool_used = NULL;
+ while (next) {
+ SRE_REPEAT *temp = next;
+ next = temp->pool_next;
+ PyObject_Free(temp);
+ }
+
+ /* clear unused pool */
+ next = state->repeat_pool_unused;
+ state->repeat_pool_unused = NULL;
+ while (next) {
+ SRE_REPEAT *temp = next;
+ next = temp->pool_next;
+ PyObject_Free(temp);
+ }
+}
+
/* generate 8-bit version */
#define SRE_CHAR Py_UCS1
@@ -463,6 +542,11 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
state->pos = start;
state->endpos = end;
+#ifdef Py_DEBUG
+ state->fail_after_count = pattern->fail_after_count;
+ state->fail_after_exc = pattern->fail_after_exc; // borrowed ref
+#endif
+
return string;
err:
/* We add an explicit cast here because MSVC has a bug when
@@ -485,6 +569,8 @@ state_fini(SRE_STATE* state)
/* See above PyMem_Del for why we explicitly cast here. */
PyMem_Free((void*) state->mark);
state->mark = NULL;
+ /* SRE_REPEAT pool */
+ repeat_pool_clear(state);
}
/* calculate offset from start of string */
@@ -571,6 +657,9 @@ pattern_traverse(PatternObject *self, visitproc visit, void *arg)
Py_VISIT(self->groupindex);
Py_VISIT(self->indexgroup);
Py_VISIT(self->pattern);
+#ifdef Py_DEBUG
+ Py_VISIT(self->fail_after_exc);
+#endif
return 0;
}
@@ -580,6 +669,9 @@ pattern_clear(PatternObject *self)
Py_CLEAR(self->groupindex);
Py_CLEAR(self->indexgroup);
Py_CLEAR(self->pattern);
+#ifdef Py_DEBUG
+ Py_CLEAR(self->fail_after_exc);
+#endif
return 0;
}
@@ -642,7 +734,7 @@ _sre_SRE_Pattern_match_impl(PatternObject *self, PyTypeObject *cls,
Py_ssize_t status;
PyObject *match;
- if (!state_init(&state, (PatternObject *)self, string, pos, endpos))
+ if (!state_init(&state, self, string, pos, endpos))
return NULL;
state.ptr = state.start;
@@ -1330,6 +1422,29 @@ _sre_SRE_Pattern___deepcopy__(PatternObject *self, PyObject *memo)
return Py_NewRef(self);
}
+#ifdef Py_DEBUG
+/*[clinic input]
+_sre.SRE_Pattern._fail_after
+
+ count: int
+ exception: object
+ /
+
+For debugging.
+[clinic start generated code]*/
+
+static PyObject *
+_sre_SRE_Pattern__fail_after_impl(PatternObject *self, int count,
+ PyObject *exception)
+/*[clinic end generated code: output=9a6bf12135ac50c2 input=ef80a45c66c5499d]*/
+{
+ self->fail_after_count = count;
+ Py_INCREF(exception);
+ Py_XSETREF(self->fail_after_exc, exception);
+ Py_RETURN_NONE;
+}
+#endif /* Py_DEBUG */
+
static PyObject *
pattern_repr(PatternObject *obj)
{
@@ -1456,6 +1571,10 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
self->pattern = NULL;
self->groupindex = NULL;
self->indexgroup = NULL;
+#ifdef Py_DEBUG
+ self->fail_after_count = -1;
+ self->fail_after_exc = NULL;
+#endif
self->codesize = n;
@@ -2552,7 +2671,8 @@ pattern_new_match(_sremodulestate* module_state,
if (!match)
return NULL;
- match->pattern = (PatternObject*)Py_NewRef(pattern);
+ Py_INCREF(pattern);
+ match->pattern = pattern;
match->string = Py_NewRef(state->string);
@@ -2688,7 +2808,7 @@ _sre_SRE_Scanner_match_impl(ScannerObject *self, PyTypeObject *cls)
return NULL;
}
- match = pattern_new_match(module_state, (PatternObject*) self->pattern,
+ match = pattern_new_match(module_state, self->pattern,
state, status);
if (status == 0)
@@ -2738,7 +2858,7 @@ _sre_SRE_Scanner_search_impl(ScannerObject *self, PyTypeObject *cls)
return NULL;
}
- match = pattern_new_match(module_state, (PatternObject*) self->pattern,
+ match = pattern_new_match(module_state, self->pattern,
state, status);
if (status == 0)
@@ -2774,7 +2894,8 @@ pattern_scanner(_sremodulestate *module_state,
return NULL;
}
- scanner->pattern = Py_NewRef(self);
+ Py_INCREF(self);
+ scanner->pattern = self;
PyObject_GC_Track(scanner);
return (PyObject*) scanner;
@@ -2968,6 +3089,7 @@ static PyMethodDef pattern_methods[] = {
_SRE_SRE_PATTERN_SCANNER_METHODDEF
_SRE_SRE_PATTERN___COPY___METHODDEF
_SRE_SRE_PATTERN___DEEPCOPY___METHODDEF
+ _SRE_SRE_PATTERN__FAIL_AFTER_METHODDEF
{"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS,
PyDoc_STR("See PEP 585")},
{NULL, NULL}
diff --git a/contrib/tools/python3/Modules/_sre/sre.h b/contrib/tools/python3/Modules/_sre/sre.h
index a0f235606e..b8c6f8e3e6 100644
--- a/contrib/tools/python3/Modules/_sre/sre.h
+++ b/contrib/tools/python3/Modules/_sre/sre.h
@@ -34,6 +34,11 @@ typedef struct {
int flags; /* flags used when compiling pattern source */
PyObject *weakreflist; /* List of weak references */
int isbytes; /* pattern type (1 - bytes, 0 - string, -1 - None) */
+#ifdef Py_DEBUG
+ /* for simulation of user interruption */
+ int fail_after_count;
+ PyObject *fail_after_exc;
+#endif
/* pattern code */
Py_ssize_t codesize;
SRE_CODE code[1];
@@ -68,6 +73,9 @@ typedef struct SRE_REPEAT_T {
const SRE_CODE* pattern; /* points to REPEAT operator arguments */
const void* last_ptr; /* helper to check for infinite loops */
struct SRE_REPEAT_T *prev; /* points to previous repeat context */
+ /* for SRE_REPEAT pool */
+ struct SRE_REPEAT_T *pool_prev;
+ struct SRE_REPEAT_T *pool_next;
} SRE_REPEAT;
typedef struct {
@@ -94,12 +102,19 @@ typedef struct {
size_t data_stack_base;
/* current repeat context */
SRE_REPEAT *repeat;
+ /* SRE_REPEAT pool */
+ SRE_REPEAT *repeat_pool_used;
+ SRE_REPEAT *repeat_pool_unused;
unsigned int sigcount;
+#ifdef Py_DEBUG
+ int fail_after_count;
+ PyObject *fail_after_exc;
+#endif
} SRE_STATE;
typedef struct {
PyObject_HEAD
- PyObject* pattern;
+ PatternObject* pattern;
SRE_STATE state;
int executing;
} ScannerObject;
diff --git a/contrib/tools/python3/Modules/_sre/sre_lib.h b/contrib/tools/python3/Modules/_sre/sre_lib.h
index 95c1ada908..9e9a0ec926 100644
--- a/contrib/tools/python3/Modules/_sre/sre_lib.h
+++ b/contrib/tools/python3/Modules/_sre/sre_lib.h
@@ -524,13 +524,28 @@ typedef struct {
Py_ssize_t last_ctx_pos;
} SRE(match_context);
-#define MAYBE_CHECK_SIGNALS \
+#define _MAYBE_CHECK_SIGNALS \
do { \
if ((0 == (++sigcount & 0xfff)) && PyErr_CheckSignals()) { \
RETURN_ERROR(SRE_ERROR_INTERRUPTED); \
} \
} while (0)
+#ifdef Py_DEBUG
+# define MAYBE_CHECK_SIGNALS \
+ do { \
+ _MAYBE_CHECK_SIGNALS; \
+ if (state->fail_after_count >= 0) { \
+ if (state->fail_after_count-- == 0) { \
+ PyErr_SetNone(state->fail_after_exc); \
+ RETURN_ERROR(SRE_ERROR_INTERRUPTED); \
+ } \
+ } \
+ } while (0)
+#else
+# define MAYBE_CHECK_SIGNALS _MAYBE_CHECK_SIGNALS
+#endif /* Py_DEBUG */
+
#ifdef HAVE_COMPUTED_GOTOS
#ifndef USE_COMPUTED_GOTOS
#define USE_COMPUTED_GOTOS 1
@@ -1083,12 +1098,9 @@ dispatch:
pattern[1], pattern[2]));
/* install new repeat context */
- /* TODO(https://github.com/python/cpython/issues/67877): Fix this
- * potential memory leak. */
- ctx->u.rep = (SRE_REPEAT*) PyObject_Malloc(sizeof(*ctx->u.rep));
+ ctx->u.rep = repeat_pool_malloc(state);
if (!ctx->u.rep) {
- PyErr_NoMemory();
- RETURN_FAILURE;
+ RETURN_ERROR(SRE_ERROR_MEMORY);
}
ctx->u.rep->count = -1;
ctx->u.rep->pattern = pattern;
@@ -1099,7 +1111,7 @@ dispatch:
state->ptr = ptr;
DO_JUMP(JUMP_REPEAT, jump_repeat, pattern+pattern[0]);
state->repeat = ctx->u.rep->prev;
- PyObject_Free(ctx->u.rep);
+ repeat_pool_free(state, ctx->u.rep);
if (ret) {
RETURN_ON_ERROR(ret);
@@ -1257,6 +1269,17 @@ dispatch:
pointer */
state->ptr = ptr;
+ /* Set state->repeat to non-NULL */
+ ctx->u.rep = repeat_pool_malloc(state);
+ if (!ctx->u.rep) {
+ RETURN_ERROR(SRE_ERROR_MEMORY);
+ }
+ ctx->u.rep->count = -1;
+ ctx->u.rep->pattern = NULL;
+ ctx->u.rep->prev = state->repeat;
+ ctx->u.rep->last_ptr = NULL;
+ state->repeat = ctx->u.rep;
+
/* Initialize Count to 0 */
ctx->count = 0;
@@ -1271,6 +1294,9 @@ dispatch:
}
else {
state->ptr = ptr;
+ /* Restore state->repeat */
+ state->repeat = ctx->u.rep->prev;
+ repeat_pool_free(state, ctx->u.rep);
RETURN_FAILURE;
}
}
@@ -1343,6 +1369,10 @@ dispatch:
}
}
+ /* Restore state->repeat */
+ state->repeat = ctx->u.rep->prev;
+ repeat_pool_free(state, ctx->u.rep);
+
/* Evaluate Tail */
/* Jump to end of pattern indicated by skip, and then skip
the SUCCESS op code that follows it. */
diff --git a/contrib/tools/python3/Modules/_ssl.c b/contrib/tools/python3/Modules/_ssl.c
index 7a104bebb4..dbb4e8da78 100644
--- a/contrib/tools/python3/Modules/_ssl.c
+++ b/contrib/tools/python3/Modules/_ssl.c
@@ -2900,7 +2900,7 @@ static PyType_Spec PySSLSocket_spec = {
.name = "_ssl._SSLSocket",
.basicsize = sizeof(PySSLSocket),
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE |
- Py_TPFLAGS_HAVE_GC),
+ Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_DISALLOW_INSTANTIATION),
.slots = PySSLSocket_slots,
};
@@ -4951,14 +4951,14 @@ PySSLSession_dealloc(PySSLSession *self)
static PyObject *
PySSLSession_richcompare(PyObject *left, PyObject *right, int op)
{
- int result;
- PyTypeObject *sesstype = ((PySSLSession*)left)->ctx->state->PySSLSession_Type;
-
if (left == NULL || right == NULL) {
PyErr_BadInternalCall();
return NULL;
}
+ int result;
+ PyTypeObject *sesstype = ((PySSLSession*)left)->ctx->state->PySSLSession_Type;
+
if (!Py_IS_TYPE(left, sesstype) || !Py_IS_TYPE(right, sesstype)) {
Py_RETURN_NOTIMPLEMENTED;
}
diff --git a/contrib/tools/python3/Modules/_struct.c b/contrib/tools/python3/Modules/_struct.c
index 84474043b0..6532174a0b 100644
--- a/contrib/tools/python3/Modules/_struct.c
+++ b/contrib/tools/python3/Modules/_struct.c
@@ -483,9 +483,8 @@ nu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f)
static PyObject *
nu_bool(_structmodulestate *state, const char *p, const formatdef *f)
{
- _Bool x;
- memcpy((char *)&x, p, sizeof x);
- return PyBool_FromLong(x != 0);
+ const _Bool bool_false = 0;
+ return PyBool_FromLong(memcmp(p, &bool_false, sizeof(_Bool)));
}
diff --git a/contrib/tools/python3/Modules/_threadmodule.c b/contrib/tools/python3/Modules/_threadmodule.c
index 365f446008..366ee6186d 100644
--- a/contrib/tools/python3/Modules/_threadmodule.c
+++ b/contrib/tools/python3/Modules/_threadmodule.c
@@ -961,7 +961,7 @@ local_setattro(localobject *self, PyObject *name, PyObject *v)
}
if (r == 1) {
PyErr_Format(PyExc_AttributeError,
- "'%.100s' object attribute '%U' is read-only",
+ "'%.100s' object attribute %R is read-only",
Py_TYPE(self)->tp_name, name);
return -1;
}
@@ -1219,6 +1219,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
if (ident == PYTHREAD_INVALID_THREAD_ID) {
PyErr_SetString(ThreadError, "can't start new thread");
PyThreadState_Clear(boot->tstate);
+ PyThreadState_Delete(boot->tstate);
thread_bootstate_free(boot, 1);
return NULL;
}
diff --git a/contrib/tools/python3/Modules/clinic/_cursesmodule.c.h b/contrib/tools/python3/Modules/clinic/_cursesmodule.c.h
index 9d99d41af5..1d716bec89 100644
--- a/contrib/tools/python3/Modules/clinic/_cursesmodule.c.h
+++ b/contrib/tools/python3/Modules/clinic/_cursesmodule.c.h
@@ -3688,25 +3688,55 @@ PyDoc_STRVAR(_curses_resizeterm__doc__,
{"resizeterm", _PyCFunction_CAST(_curses_resizeterm), METH_FASTCALL, _curses_resizeterm__doc__},
static PyObject *
-_curses_resizeterm_impl(PyObject *module, int nlines, int ncols);
+_curses_resizeterm_impl(PyObject *module, short nlines, short ncols);
static PyObject *
_curses_resizeterm(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- int nlines;
- int ncols;
+ short nlines;
+ short ncols;
if (!_PyArg_CheckPositional("resizeterm", nargs, 2, 2)) {
goto exit;
}
- nlines = _PyLong_AsInt(args[0]);
- if (nlines == -1 && PyErr_Occurred()) {
- goto exit;
+ {
+ long ival = PyLong_AsLong(args[0]);
+ if (ival == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ else if (ival < SHRT_MIN) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is less than minimum");
+ goto exit;
+ }
+ else if (ival > SHRT_MAX) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is greater than maximum");
+ goto exit;
+ }
+ else {
+ nlines = (short) ival;
+ }
}
- ncols = _PyLong_AsInt(args[1]);
- if (ncols == -1 && PyErr_Occurred()) {
- goto exit;
+ {
+ long ival = PyLong_AsLong(args[1]);
+ if (ival == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ else if (ival < SHRT_MIN) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is less than minimum");
+ goto exit;
+ }
+ else if (ival > SHRT_MAX) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is greater than maximum");
+ goto exit;
+ }
+ else {
+ ncols = (short) ival;
+ }
}
return_value = _curses_resizeterm_impl(module, nlines, ncols);
@@ -3739,25 +3769,55 @@ PyDoc_STRVAR(_curses_resize_term__doc__,
{"resize_term", _PyCFunction_CAST(_curses_resize_term), METH_FASTCALL, _curses_resize_term__doc__},
static PyObject *
-_curses_resize_term_impl(PyObject *module, int nlines, int ncols);
+_curses_resize_term_impl(PyObject *module, short nlines, short ncols);
static PyObject *
_curses_resize_term(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
- int nlines;
- int ncols;
+ short nlines;
+ short ncols;
if (!_PyArg_CheckPositional("resize_term", nargs, 2, 2)) {
goto exit;
}
- nlines = _PyLong_AsInt(args[0]);
- if (nlines == -1 && PyErr_Occurred()) {
- goto exit;
+ {
+ long ival = PyLong_AsLong(args[0]);
+ if (ival == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ else if (ival < SHRT_MIN) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is less than minimum");
+ goto exit;
+ }
+ else if (ival > SHRT_MAX) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is greater than maximum");
+ goto exit;
+ }
+ else {
+ nlines = (short) ival;
+ }
}
- ncols = _PyLong_AsInt(args[1]);
- if (ncols == -1 && PyErr_Occurred()) {
- goto exit;
+ {
+ long ival = PyLong_AsLong(args[1]);
+ if (ival == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ else if (ival < SHRT_MIN) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is less than minimum");
+ goto exit;
+ }
+ else if (ival > SHRT_MAX) {
+ PyErr_SetString(PyExc_OverflowError,
+ "signed short integer is greater than maximum");
+ goto exit;
+ }
+ else {
+ ncols = (short) ival;
+ }
}
return_value = _curses_resize_term_impl(module, nlines, ncols);
@@ -4313,4 +4373,4 @@ _curses_has_extended_color_support(PyObject *module, PyObject *Py_UNUSED(ignored
#ifndef _CURSES_USE_DEFAULT_COLORS_METHODDEF
#define _CURSES_USE_DEFAULT_COLORS_METHODDEF
#endif /* !defined(_CURSES_USE_DEFAULT_COLORS_METHODDEF) */
-/*[clinic end generated code: output=27a2364193b503c1 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=764ee4c154c6d4a8 input=a9049054013a1b77]*/
diff --git a/contrib/tools/python3/Modules/clinic/posixmodule.c.h b/contrib/tools/python3/Modules/clinic/posixmodule.c.h
index f46aa65148..a33461dc56 100644
--- a/contrib/tools/python3/Modules/clinic/posixmodule.c.h
+++ b/contrib/tools/python3/Modules/clinic/posixmodule.c.h
@@ -1975,25 +1975,55 @@ exit:
#if defined(MS_WINDOWS)
PyDoc_STRVAR(os__path_exists__doc__,
-"_path_exists($module, path, /)\n"
+"_path_exists($module, /, path)\n"
"--\n"
"\n"
"Test whether a path exists. Returns False for broken symbolic links.");
#define OS__PATH_EXISTS_METHODDEF \
- {"_path_exists", (PyCFunction)os__path_exists, METH_O, os__path_exists__doc__},
+ {"_path_exists", _PyCFunction_CAST(os__path_exists), METH_FASTCALL|METH_KEYWORDS, os__path_exists__doc__},
static int
os__path_exists_impl(PyObject *module, path_t *path);
static PyObject *
-os__path_exists(PyObject *module, PyObject *arg)
+os__path_exists(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 1
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { &_Py_ID(path), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"path", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "_path_exists",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[1];
path_t path = PATH_T_INITIALIZE_P("_path_exists", "path", 0, 0, 1, 1);
int _return_value;
- if (!path_converter(arg, &path)) {
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ if (!path_converter(args[0], &path)) {
goto exit;
}
_return_value = os__path_exists_impl(module, &path);
@@ -12002,4 +12032,4 @@ exit:
#ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF
#define OS_WAITSTATUS_TO_EXITCODE_METHODDEF
#endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */
-/*[clinic end generated code: output=67c2e3d4537287c1 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=6d34c4564aca7725 input=a9049054013a1b77]*/
diff --git a/contrib/tools/python3/Modules/itertoolsmodule.c b/contrib/tools/python3/Modules/itertoolsmodule.c
index d42f9dd076..12708f49bd 100644
--- a/contrib/tools/python3/Modules/itertoolsmodule.c
+++ b/contrib/tools/python3/Modules/itertoolsmodule.c
@@ -1137,7 +1137,7 @@ itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n)
/*[clinic end generated code: output=1c64519cd859c2f0 input=c99a1472c425d66d]*/
{
Py_ssize_t i;
- PyObject *it, *copyable, *copyfunc, *result;
+ PyObject *it, *to, *result;
if (n < 0) {
PyErr_SetString(PyExc_ValueError, "n must be >= 0");
@@ -1154,41 +1154,24 @@ itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n)
return NULL;
}
- if (_PyObject_LookupAttr(it, &_Py_ID(__copy__), &copyfunc) < 0) {
- Py_DECREF(it);
+ (void)&_Py_ID(__copy__); // Retain a reference to __copy__
+ itertools_state *state = get_module_state(module);
+ to = tee_fromiterable(state, it);
+ Py_DECREF(it);
+ if (to == NULL) {
Py_DECREF(result);
return NULL;
}
- if (copyfunc != NULL) {
- copyable = it;
- }
- else {
- itertools_state *state = get_module_state(module);
- copyable = tee_fromiterable(state, it);
- Py_DECREF(it);
- if (copyable == NULL) {
- Py_DECREF(result);
- return NULL;
- }
- copyfunc = PyObject_GetAttr(copyable, &_Py_ID(__copy__));
- if (copyfunc == NULL) {
- Py_DECREF(copyable);
- Py_DECREF(result);
- return NULL;
- }
- }
- PyTuple_SET_ITEM(result, 0, copyable);
+ PyTuple_SET_ITEM(result, 0, to);
for (i = 1; i < n; i++) {
- copyable = _PyObject_CallNoArgs(copyfunc);
- if (copyable == NULL) {
- Py_DECREF(copyfunc);
+ to = tee_copy((teeobject *)to, NULL);
+ if (to == NULL) {
Py_DECREF(result);
return NULL;
}
- PyTuple_SET_ITEM(result, i, copyable);
+ PyTuple_SET_ITEM(result, i, to);
}
- Py_DECREF(copyfunc);
return result;
}
@@ -3998,7 +3981,7 @@ typedef struct {
fast_mode: when cnt an integer < PY_SSIZE_T_MAX and no step is specified.
- assert(cnt != PY_SSIZE_T_MAX && long_cnt == NULL && long_step==PyLong(1));
+ assert(long_cnt == NULL && long_step==PyLong(1));
Advances with: cnt += 1
When count hits Y_SSIZE_T_MAX, switch to slow_mode.
@@ -4085,7 +4068,7 @@ itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
else
cnt = PY_SSIZE_T_MAX;
- assert((cnt != PY_SSIZE_T_MAX && long_cnt == NULL && fast_mode) ||
+ assert((long_cnt == NULL && fast_mode) ||
(cnt == PY_SSIZE_T_MAX && long_cnt != NULL && !fast_mode));
assert(!fast_mode ||
(PyLong_Check(long_step) && PyLong_AS_LONG(long_step) == 1));
@@ -4157,7 +4140,7 @@ count_next(countobject *lz)
static PyObject *
count_repr(countobject *lz)
{
- if (lz->cnt != PY_SSIZE_T_MAX)
+ if (lz->long_cnt == NULL)
return PyUnicode_FromFormat("%s(%zd)",
_PyType_Name(Py_TYPE(lz)), lz->cnt);
diff --git a/contrib/tools/python3/Modules/posixmodule.c b/contrib/tools/python3/Modules/posixmodule.c
index e5680a9874..ce2c80e6da 100644
--- a/contrib/tools/python3/Modules/posixmodule.c
+++ b/contrib/tools/python3/Modules/posixmodule.c
@@ -24,6 +24,7 @@
#include "pycore_object.h" // _PyObject_LookupSpecial()
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_signal.h" // Py_NSIG
+#include "pycore_typeobject.h" // _PyType_AddMethod()
#ifdef MS_WINDOWS
# include <windows.h>
@@ -5210,7 +5211,6 @@ _testFileType(path_t *path, int testedType)
os._path_exists -> bool
path: path_t(allow_fd=True, suppress_value_error=True)
- /
Test whether a path exists. Returns False for broken symbolic links.
@@ -5218,7 +5218,7 @@ Test whether a path exists. Returns False for broken symbolic links.
static int
os__path_exists_impl(PyObject *module, path_t *path)
-/*[clinic end generated code: output=8da13acf666e16ba input=29198507a6082a57]*/
+/*[clinic end generated code: output=8da13acf666e16ba input=142beabfc66783eb]*/
{
return _testFileExists(path, TRUE);
}
@@ -7868,6 +7868,16 @@ os_sched_param_impl(PyTypeObject *type, PyObject *sched_priority)
return res;
}
+static PyObject *
+os_sched_param_reduce(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ return Py_BuildValue("(O(N))", Py_TYPE(self), PyStructSequence_GetItem(self, 0));
+}
+
+static PyMethodDef os_sched_param_reduce_method = {
+ "__reduce__", (PyCFunction)os_sched_param_reduce, METH_NOARGS|METH_COEXIST, NULL,
+};
+
PyDoc_VAR(os_sched_param__doc__);
static PyStructSequence_Field sched_param_fields[] = {
@@ -17006,6 +17016,12 @@ posixmodule_exec(PyObject *m)
return -1;
}
((PyTypeObject *)state->SchedParamType)->tp_new = os_sched_param;
+ if (_PyType_AddMethod((PyTypeObject *)state->SchedParamType,
+ &os_sched_param_reduce_method) < 0)
+ {
+ return -1;
+ }
+ PyType_Modified((PyTypeObject *)state->SchedParamType);
#endif
/* initialize TerminalSize_info */
diff --git a/contrib/tools/python3/Modules/socketmodule.c b/contrib/tools/python3/Modules/socketmodule.c
index 97248792c0..7f2ebba988 100644
--- a/contrib/tools/python3/Modules/socketmodule.c
+++ b/contrib/tools/python3/Modules/socketmodule.c
@@ -816,7 +816,9 @@ internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
/* s->sock_timeout is in seconds, timeout in ms */
ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
- assert(ms <= INT_MAX);
+ if (ms > INT_MAX) {
+ ms = INT_MAX;
+ }
/* On some OSes, typically BSD-based ones, the timeout parameter of the
poll() syscall, when negative, must be exactly INFTIM, where defined,
@@ -828,6 +830,7 @@ internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
ms = -1;
#endif
}
+ assert(INT_MIN <= ms && ms <= INT_MAX);
Py_BEGIN_ALLOW_THREADS;
n = poll(&pollfd, 1, (int)ms);
diff --git a/contrib/tools/python3/Modules/timemodule.c b/contrib/tools/python3/Modules/timemodule.c
index 8613fccfe0..5907826357 100644
--- a/contrib/tools/python3/Modules/timemodule.c
+++ b/contrib/tools/python3/Modules/timemodule.c
@@ -795,27 +795,100 @@ the C library strftime function.\n"
#endif
static PyObject *
-time_strftime(PyObject *module, PyObject *args)
+time_strftime1(time_char **outbuf, size_t *bufsize,
+ time_char *format, size_t fmtlen,
+ struct tm *tm)
{
- PyObject *tup = NULL;
- struct tm buf;
- const time_char *fmt;
+ size_t buflen;
+#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
+ /* check that the format string contains only valid directives */
+ for (const time_char *f = strchr(format, '%');
+ f != NULL;
+ f = strchr(f + 2, '%'))
+ {
+ if (f[1] == '#')
+ ++f; /* not documented by python, */
+ if (f[1] == '\0')
+ break;
+ if ((f[1] == 'y') && tm->tm_year < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "format %y requires year >= 1900 on Windows");
+ return NULL;
+ }
+ }
+#elif (defined(_AIX) || (defined(__sun) && defined(__SVR4))) && defined(HAVE_WCSFTIME)
+ for (const time_char *f = wcschr(format, '%');
+ f != NULL;
+ f = wcschr(f + 2, '%'))
+ {
+ if (f[1] == L'\0')
+ break;
+ /* Issue #19634: On AIX, wcsftime("y", (1899, 1, 1, 0, 0, 0, 0, 0, 0))
+ returns "0/" instead of "99" */
+ if (f[1] == L'y' && tm->tm_year < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "format %y requires year >= 1900 on AIX");
+ return NULL;
+ }
+ }
+#endif
+
+ /* I hate these functions that presume you know how big the output
+ * will be ahead of time...
+ */
+ while (1) {
+ if (*bufsize > PY_SSIZE_T_MAX/sizeof(time_char)) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+ *outbuf = (time_char *)PyMem_Realloc(*outbuf,
+ *bufsize*sizeof(time_char));
+ if (*outbuf == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
+ errno = 0;
+#endif
+ _Py_BEGIN_SUPPRESS_IPH
+ buflen = format_time(*outbuf, *bufsize, format, tm);
+ _Py_END_SUPPRESS_IPH
+#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
+ /* VisualStudio .NET 2005 does this properly */
+ if (buflen == 0 && errno == EINVAL) {
+ PyErr_SetString(PyExc_ValueError, "Invalid format string");
+ return NULL;
+ }
+#endif
+ if (buflen == 0 && *bufsize < 256 * fmtlen) {
+ *bufsize += *bufsize;
+ continue;
+ }
+ /* If the buffer is 256 times as long as the format,
+ it's probably not failing for lack of room!
+ More likely, the format yields an empty result,
+ e.g. an empty format, or %Z when the timezone
+ is unknown. */
#ifdef HAVE_WCSFTIME
- wchar_t *format;
+ return PyUnicode_FromWideChar(*outbuf, buflen);
#else
- PyObject *format;
+ return PyUnicode_DecodeLocaleAndSize(*outbuf, buflen, "surrogateescape");
#endif
+ }
+}
+
+static PyObject *
+time_strftime(PyObject *module, PyObject *args)
+{
+ PyObject *tup = NULL;
+ struct tm buf;
PyObject *format_arg;
- size_t fmtlen, buflen;
- time_char *outbuf = NULL;
- size_t i;
- PyObject *ret = NULL;
+ Py_ssize_t format_size;
+ time_char *format, *outbuf = NULL;
+ size_t fmtlen, bufsize = 1024;
memset((void *) &buf, '\0', sizeof(buf));
- /* Will always expect a unicode string to be passed as format.
- Given that there's no str type anymore in py3k this seems safe.
- */
if (!PyArg_ParseTuple(args, "U|O:strftime", &format_arg, &tup))
return NULL;
@@ -848,101 +921,65 @@ time_strftime(PyObject *module, PyObject *args)
else if (buf.tm_isdst > 1)
buf.tm_isdst = 1;
-#ifdef HAVE_WCSFTIME
- format = PyUnicode_AsWideCharString(format_arg, NULL);
- if (format == NULL)
+ format_size = PyUnicode_GET_LENGTH(format_arg);
+ if ((size_t)format_size > PY_SSIZE_T_MAX/sizeof(time_char) - 1) {
+ PyErr_NoMemory();
return NULL;
- fmt = format;
-#else
- /* Convert the unicode string to an ascii one */
- format = PyUnicode_EncodeLocale(format_arg, "surrogateescape");
- if (format == NULL)
+ }
+ format = PyMem_Malloc((format_size + 1)*sizeof(time_char));
+ if (format == NULL) {
+ PyErr_NoMemory();
return NULL;
- fmt = PyBytes_AS_STRING(format);
-#endif
-
-#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME)
- /* check that the format string contains only valid directives */
- for (outbuf = strchr(fmt, '%');
- outbuf != NULL;
- outbuf = strchr(outbuf+2, '%'))
- {
- if (outbuf[1] == '#')
- ++outbuf; /* not documented by python, */
- if (outbuf[1] == '\0')
- break;
- if ((outbuf[1] == 'y') && buf.tm_year < 0) {
- PyErr_SetString(PyExc_ValueError,
- "format %y requires year >= 1900 on Windows");
- Py_DECREF(format);
- return NULL;
- }
}
-#elif (defined(_AIX) || (defined(__sun) && defined(__SVR4))) && defined(HAVE_WCSFTIME)
- for (outbuf = wcschr(fmt, '%');
- outbuf != NULL;
- outbuf = wcschr(outbuf+2, '%'))
- {
- if (outbuf[1] == L'\0')
- break;
- /* Issue #19634: On AIX, wcsftime("y", (1899, 1, 1, 0, 0, 0, 0, 0, 0))
- returns "0/" instead of "99" */
- if (outbuf[1] == L'y' && buf.tm_year < 0) {
- PyErr_SetString(PyExc_ValueError,
- "format %y requires year >= 1900 on AIX");
- PyMem_Free(format);
- return NULL;
+ _PyUnicodeWriter writer;
+ _PyUnicodeWriter_Init(&writer);
+ writer.overallocate = 1;
+ Py_ssize_t i = 0;
+ while (i < format_size) {
+ fmtlen = 0;
+ for (; i < format_size; i++) {
+ Py_UCS4 c = PyUnicode_READ_CHAR(format_arg, i);
+ if (!c || c > 127) {
+ break;
+ }
+ format[fmtlen++] = (char)c;
}
- }
-#endif
-
- fmtlen = time_strlen(fmt);
-
- /* I hate these functions that presume you know how big the output
- * will be ahead of time...
- */
- for (i = 1024; ; i += i) {
- outbuf = (time_char *)PyMem_Malloc(i*sizeof(time_char));
- if (outbuf == NULL) {
- PyErr_NoMemory();
- break;
+ if (fmtlen) {
+ format[fmtlen] = 0;
+ PyObject *unicode = time_strftime1(&outbuf, &bufsize,
+ format, fmtlen, &buf);
+ if (unicode == NULL) {
+ goto error;
+ }
+ if (_PyUnicodeWriter_WriteStr(&writer, unicode) < 0) {
+ Py_DECREF(unicode);
+ goto error;
+ }
+ Py_DECREF(unicode);
}
-#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
- errno = 0;
-#endif
- _Py_BEGIN_SUPPRESS_IPH
- buflen = format_time(outbuf, i, fmt, &buf);
- _Py_END_SUPPRESS_IPH
-#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
- /* VisualStudio .NET 2005 does this properly */
- if (buflen == 0 && errno == EINVAL) {
- PyErr_SetString(PyExc_ValueError, "Invalid format string");
- PyMem_Free(outbuf);
- break;
+
+ Py_ssize_t start = i;
+ for (; i < format_size; i++) {
+ Py_UCS4 c = PyUnicode_READ_CHAR(format_arg, i);
+ if (c == '%') {
+ break;
+ }
}
-#endif
- if (buflen > 0 || i >= 256 * fmtlen) {
- /* If the buffer is 256 times as long as the format,
- it's probably not failing for lack of room!
- More likely, the format yields an empty result,
- e.g. an empty format, or %Z when the timezone
- is unknown. */
-#ifdef HAVE_WCSFTIME
- ret = PyUnicode_FromWideChar(outbuf, buflen);
-#else
- ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen, "surrogateescape");
-#endif
- PyMem_Free(outbuf);
- break;
+ if (start < i) {
+ if (_PyUnicodeWriter_WriteSubstring(&writer, format_arg, start, i) < 0) {
+ goto error;
+ }
}
- PyMem_Free(outbuf);
}
-#ifdef HAVE_WCSFTIME
+
+ PyMem_Free(outbuf);
PyMem_Free(format);
-#else
- Py_DECREF(format);
-#endif
- return ret;
+ return _PyUnicodeWriter_Finish(&writer);
+error:
+ PyMem_Free(outbuf);
+ PyMem_Free(format);
+ _PyUnicodeWriter_Dealloc(&writer);
+ return NULL;
}
#undef time_char
@@ -1292,8 +1329,14 @@ _PyTime_GetProcessTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
#else
/* clock_gettime */
+// gh-115714: Don't use CLOCK_PROCESS_CPUTIME_ID on WASI.
+/* CLOCK_PROF is defined on NetBSD, but not supported.
+ * CLOCK_PROCESS_CPUTIME_ID is broken on NetBSD for the same reason as
+ * CLOCK_THREAD_CPUTIME_ID (see comment below).
+ */
#if defined(HAVE_CLOCK_GETTIME) \
- && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF))
+ && (defined(CLOCK_PROCESS_CPUTIME_ID) || defined(CLOCK_PROF)) \
+ && !defined(__NetBSD__)
struct timespec ts;
if (HAVE_CLOCK_GETTIME_RUNTIME) {
@@ -1499,9 +1542,16 @@ _PyTime_GetThreadTimeWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
return 0;
}
+/* CLOCK_THREAD_CPUTIME_ID is broken on NetBSD: the result of clock_gettime()
+ * includes the sleeping time, that defeats the purpose of the clock.
+ * Also, clock_getres() does not support it.
+ * https://github.com/python/cpython/issues/123978
+ * https://gnats.netbsd.org/57512
+ */
#elif defined(HAVE_CLOCK_GETTIME) && \
- defined(CLOCK_PROCESS_CPUTIME_ID) && \
- !defined(__EMSCRIPTEN__) && !defined(__wasi__)
+ defined(CLOCK_THREAD_CPUTIME_ID) && \
+ !defined(__EMSCRIPTEN__) && !defined(__wasi__) && \
+ !defined(__NetBSD__)
#define HAVE_THREAD_TIME
#if defined(__APPLE__) && defined(__has_attribute) && __has_attribute(availability)
diff --git a/contrib/tools/python3/Objects/complexobject.c b/contrib/tools/python3/Objects/complexobject.c
index 7f7e7e6b08..eff1738029 100644
--- a/contrib/tools/python3/Objects/complexobject.c
+++ b/contrib/tools/python3/Objects/complexobject.c
@@ -146,7 +146,7 @@ _Py_c_pow(Py_complex a, Py_complex b)
at = atan2(a.imag, a.real);
phase = at*b.real;
if (b.imag != 0.0) {
- len /= exp(at*b.imag);
+ len *= exp(-at*b.imag);
phase += b.imag*log(vabs);
}
r.real = len*cos(phase);
diff --git a/contrib/tools/python3/Objects/dictobject.c b/contrib/tools/python3/Objects/dictobject.c
index 0712bedc83..4e96531494 100644
--- a/contrib/tools/python3/Objects/dictobject.c
+++ b/contrib/tools/python3/Objects/dictobject.c
@@ -3634,8 +3634,8 @@ PyDoc_STRVAR(sizeof__doc__,
"D.__sizeof__() -> size of D in memory, in bytes");
PyDoc_STRVAR(update__doc__,
-"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\
-If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\
+"D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.\n\
+If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k]\n\
If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\
In either case, this is followed by: for k in F: D[k] = F[k]");
diff --git a/contrib/tools/python3/Objects/exceptions.c b/contrib/tools/python3/Objects/exceptions.c
index 4f2153b193..c579563db7 100644
--- a/contrib/tools/python3/Objects/exceptions.c
+++ b/contrib/tools/python3/Objects/exceptions.c
@@ -2961,46 +2961,55 @@ UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
static PyObject *
UnicodeEncodeError_str(PyObject *self)
{
- PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
+ PyUnicodeErrorObject *exc = (PyUnicodeErrorObject *)self;
PyObject *result = NULL;
PyObject *reason_str = NULL;
PyObject *encoding_str = NULL;
- if (!uself->object)
+ if (exc->object == NULL) {
/* Not properly initialized. */
return PyUnicode_FromString("");
+ }
/* Get reason and encoding as strings, which they might not be if
they've been modified after we were constructed. */
- reason_str = PyObject_Str(uself->reason);
- if (reason_str == NULL)
+ reason_str = PyObject_Str(exc->reason);
+ if (reason_str == NULL) {
goto done;
- encoding_str = PyObject_Str(uself->encoding);
- if (encoding_str == NULL)
+ }
+ encoding_str = PyObject_Str(exc->encoding);
+ if (encoding_str == NULL) {
goto done;
+ }
+
+ Py_ssize_t len = PyUnicode_GET_LENGTH(exc->object);
+ Py_ssize_t start = exc->start, end = exc->end;
- if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
- Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
+ if ((start >= 0 && start < len) && (end >= 0 && end <= len) && end == start + 1) {
+ Py_UCS4 badchar = PyUnicode_ReadChar(exc->object, start);
const char *fmt;
- if (badchar <= 0xff)
+ if (badchar <= 0xff) {
fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
- else if (badchar <= 0xffff)
+ }
+ else if (badchar <= 0xffff) {
fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
- else
+ }
+ else {
fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
+ }
result = PyUnicode_FromFormat(
fmt,
encoding_str,
(int)badchar,
- uself->start,
+ start,
reason_str);
}
else {
result = PyUnicode_FromFormat(
"'%U' codec can't encode characters in position %zd-%zd: %U",
encoding_str,
- uself->start,
- uself->end-1,
+ start,
+ end - 1,
reason_str);
}
done:
@@ -3074,41 +3083,46 @@ error:
static PyObject *
UnicodeDecodeError_str(PyObject *self)
{
- PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
+ PyUnicodeErrorObject *exc = (PyUnicodeErrorObject *)self;
PyObject *result = NULL;
PyObject *reason_str = NULL;
PyObject *encoding_str = NULL;
- if (!uself->object)
+ if (exc->object == NULL) {
/* Not properly initialized. */
return PyUnicode_FromString("");
+ }
/* Get reason and encoding as strings, which they might not be if
they've been modified after we were constructed. */
- reason_str = PyObject_Str(uself->reason);
- if (reason_str == NULL)
+ reason_str = PyObject_Str(exc->reason);
+ if (reason_str == NULL) {
goto done;
- encoding_str = PyObject_Str(uself->encoding);
- if (encoding_str == NULL)
+ }
+ encoding_str = PyObject_Str(exc->encoding);
+ if (encoding_str == NULL) {
goto done;
+ }
+
+ Py_ssize_t len = PyBytes_GET_SIZE(exc->object);
+ Py_ssize_t start = exc->start, end = exc->end;
- if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
- int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
+ if ((start >= 0 && start < len) && (end >= 0 && end <= len) && end == start + 1) {
+ int badbyte = (int)(PyBytes_AS_STRING(exc->object)[start] & 0xff);
result = PyUnicode_FromFormat(
"'%U' codec can't decode byte 0x%02x in position %zd: %U",
encoding_str,
- byte,
- uself->start,
+ badbyte,
+ start,
reason_str);
}
else {
result = PyUnicode_FromFormat(
"'%U' codec can't decode bytes in position %zd-%zd: %U",
encoding_str,
- uself->start,
- uself->end-1,
- reason_str
- );
+ start,
+ end - 1,
+ reason_str);
}
done:
Py_XDECREF(reason_str);
@@ -3171,42 +3185,49 @@ UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
static PyObject *
UnicodeTranslateError_str(PyObject *self)
{
- PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
+ PyUnicodeErrorObject *exc = (PyUnicodeErrorObject *)self;
PyObject *result = NULL;
PyObject *reason_str = NULL;
- if (!uself->object)
+ if (exc->object == NULL) {
/* Not properly initialized. */
return PyUnicode_FromString("");
+ }
/* Get reason as a string, which it might not be if it's been
modified after we were constructed. */
- reason_str = PyObject_Str(uself->reason);
- if (reason_str == NULL)
+ reason_str = PyObject_Str(exc->reason);
+ if (reason_str == NULL) {
goto done;
+ }
+
+ Py_ssize_t len = PyUnicode_GET_LENGTH(exc->object);
+ Py_ssize_t start = exc->start, end = exc->end;
- if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
- Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
+ if ((start >= 0 && start < len) && (end >= 0 && end <= len) && end == start + 1) {
+ Py_UCS4 badchar = PyUnicode_ReadChar(exc->object, start);
const char *fmt;
- if (badchar <= 0xff)
+ if (badchar <= 0xff) {
fmt = "can't translate character '\\x%02x' in position %zd: %U";
- else if (badchar <= 0xffff)
+ }
+ else if (badchar <= 0xffff) {
fmt = "can't translate character '\\u%04x' in position %zd: %U";
- else
+ }
+ else {
fmt = "can't translate character '\\U%08x' in position %zd: %U";
+ }
result = PyUnicode_FromFormat(
fmt,
(int)badchar,
- uself->start,
- reason_str
- );
- } else {
+ start,
+ reason_str);
+ }
+ else {
result = PyUnicode_FromFormat(
"can't translate characters in position %zd-%zd: %U",
- uself->start,
- uself->end-1,
- reason_str
- );
+ start,
+ end - 1,
+ reason_str);
}
done:
Py_XDECREF(reason_str);
diff --git a/contrib/tools/python3/Objects/memoryobject.c b/contrib/tools/python3/Objects/memoryobject.c
index 26871612ea..9a5f9c665b 100644
--- a/contrib/tools/python3/Objects/memoryobject.c
+++ b/contrib/tools/python3/Objects/memoryobject.c
@@ -3322,6 +3322,7 @@ memory_iter(PyObject *seq)
PyErr_BadInternalCall();
return NULL;
}
+ CHECK_RELEASED(seq);
PyMemoryViewObject *obj = (PyMemoryViewObject *)seq;
int ndims = obj->view.ndim;
if (ndims == 0) {
diff --git a/contrib/tools/python3/Objects/object.c b/contrib/tools/python3/Objects/object.c
index 6b2e0aeaab..706719116d 100644
--- a/contrib/tools/python3/Objects/object.c
+++ b/contrib/tools/python3/Objects/object.c
@@ -159,11 +159,27 @@ _PyDebug_PrintTotalRefs(void) {
#ifdef Py_TRACE_REFS
-#define REFCHAIN(interp) &interp->object_state.refchain
+#define REFCHAIN(interp) interp->object_state.refchain
+
+static inline int
+has_own_refchain(PyInterpreterState *interp)
+{
+ if (interp->feature_flags & Py_RTFLAGS_USE_MAIN_OBMALLOC) {
+ return (_Py_IsMainInterpreter(interp)
+ || _PyInterpreterState_Main() == NULL);
+ }
+ return 1;
+}
static inline void
init_refchain(PyInterpreterState *interp)
{
+ if (!has_own_refchain(interp)) {
+ // Legacy subinterpreters share a refchain with the main interpreter.
+ REFCHAIN(interp) = REFCHAIN(_PyInterpreterState_Main());
+ return;
+ }
+ REFCHAIN(interp) = &interp->object_state._refchain_obj;
PyObject *refchain = REFCHAIN(interp);
refchain->_ob_prev = refchain;
refchain->_ob_next = refchain;
@@ -2010,9 +2026,7 @@ void
_PyObject_InitState(PyInterpreterState *interp)
{
#ifdef Py_TRACE_REFS
- if (!_Py_IsMainInterpreter(interp)) {
- init_refchain(interp);
- }
+ init_refchain(interp);
#endif
}
diff --git a/contrib/tools/python3/Objects/typeobject.c b/contrib/tools/python3/Objects/typeobject.c
index 017d951bdc..46d7a4b973 100644
--- a/contrib/tools/python3/Objects/typeobject.c
+++ b/contrib/tools/python3/Objects/typeobject.c
@@ -6656,6 +6656,12 @@ type_add_method(PyTypeObject *type, PyMethodDef *meth)
return 0;
}
+int
+_PyType_AddMethod(PyTypeObject *type, PyMethodDef *meth)
+{
+ return type_add_method(type, meth);
+}
+
/* Add the methods from tp_methods to the __dict__ in a type object */
static int
@@ -8212,13 +8218,13 @@ wrap_buffer(PyObject *self, PyObject *args, void *wrapped)
if (flags == -1 && PyErr_Occurred()) {
return NULL;
}
- if (flags > INT_MAX) {
+ if (flags > INT_MAX || flags < INT_MIN) {
PyErr_SetString(PyExc_OverflowError,
- "buffer flags too large");
+ "buffer flags out of range");
return NULL;
}
- return _PyMemoryView_FromBufferProc(self, Py_SAFE_DOWNCAST(flags, Py_ssize_t, int),
+ return _PyMemoryView_FromBufferProc(self, (int)flags,
(getbufferproc)wrapped);
}
diff --git a/contrib/tools/python3/Objects/unicodeobject.c b/contrib/tools/python3/Objects/unicodeobject.c
index 3235ae8ae0..8fe275d4c8 100644
--- a/contrib/tools/python3/Objects/unicodeobject.c
+++ b/contrib/tools/python3/Objects/unicodeobject.c
@@ -287,13 +287,37 @@ hashtable_unicode_compare(const void *key1, const void *key2)
}
}
+/* Return true if this interpreter should share the main interpreter's
+ intern_dict. That's important for interpreters which load basic
+ single-phase init extension modules (m_size == -1). There could be interned
+ immortal strings that are shared between interpreters, due to the
+ PyDict_Update(mdict, m_copy) call in import_find_extension().
+
+ It's not safe to deallocate those strings until all interpreters that
+ potentially use them are freed. By storing them in the main interpreter, we
+ ensure they get freed after all other interpreters are freed.
+*/
+static bool
+has_shared_intern_dict(PyInterpreterState *interp)
+{
+ PyInterpreterState *main_interp = _PyInterpreterState_Main();
+ return interp != main_interp && interp->feature_flags & Py_RTFLAGS_USE_MAIN_OBMALLOC;
+}
+
static int
init_interned_dict(PyInterpreterState *interp)
{
assert(get_interned_dict(interp) == NULL);
- PyObject *interned = interned = PyDict_New();
- if (interned == NULL) {
- return -1;
+ PyObject *interned;
+ if (has_shared_intern_dict(interp)) {
+ interned = get_interned_dict(_PyInterpreterState_Main());
+ Py_INCREF(interned);
+ }
+ else {
+ interned = PyDict_New();
+ if (interned == NULL) {
+ return -1;
+ }
}
_Py_INTERP_CACHED_OBJECT(interp, interned_strings) = interned;
return 0;
@@ -304,7 +328,10 @@ clear_interned_dict(PyInterpreterState *interp)
{
PyObject *interned = get_interned_dict(interp);
if (interned != NULL) {
- PyDict_Clear(interned);
+ if (!has_shared_intern_dict(interp)) {
+ // only clear if the dict belongs to this interpreter
+ PyDict_Clear(interned);
+ }
Py_DECREF(interned);
_Py_INTERP_CACHED_OBJECT(interp, interned_strings) = NULL;
}
@@ -1445,12 +1472,12 @@ _copy_characters(PyObject *to, Py_ssize_t to_start,
assert(PyUnicode_Check(from));
assert(from_start + how_many <= PyUnicode_GET_LENGTH(from));
- assert(PyUnicode_Check(to));
- assert(to_start + how_many <= PyUnicode_GET_LENGTH(to));
-
if (how_many == 0)
return 0;
+ assert(PyUnicode_Check(to));
+ assert(to_start + how_many <= PyUnicode_GET_LENGTH(to));
+
from_kind = PyUnicode_KIND(from);
from_data = PyUnicode_DATA(from);
to_kind = PyUnicode_KIND(to);
@@ -3996,6 +4023,18 @@ PyUnicode_AsUTF8(PyObject *unicode)
return PyUnicode_AsUTF8AndSize(unicode, NULL);
}
+const char *
+_PyUnicode_AsUTF8NoNUL(PyObject *unicode)
+{
+ Py_ssize_t size;
+ const char *s = PyUnicode_AsUTF8AndSize(unicode, &size);
+ if (s && strlen(s) != (size_t)size) {
+ PyErr_SetString(PyExc_ValueError, "embedded null character");
+ return NULL;
+ }
+ return s;
+}
+
/*
PyUnicode_GetSize() has been deprecated since Python 3.3
because it returned length of Py_UNICODE.
@@ -15145,6 +15184,13 @@ _PyUnicode_ClearInterned(PyInterpreterState *interp)
}
assert(PyDict_CheckExact(interned));
+ if (has_shared_intern_dict(interp)) {
+ // the dict doesn't belong to this interpreter, skip the debug
+ // checks on it and just clear the pointer to it
+ clear_interned_dict(interp);
+ return;
+ }
+
#ifdef INTERNED_STATS
fprintf(stderr, "releasing %zd interned strings\n",
PyDict_GET_SIZE(interned));
@@ -15439,7 +15485,7 @@ encode_wstr_utf8(wchar_t *wstr, char **str, const char *name)
int res;
res = _Py_EncodeUTF8Ex(wstr, str, NULL, NULL, 1, _Py_ERROR_STRICT);
if (res == -2) {
- PyErr_Format(PyExc_RuntimeWarning, "cannot decode %s", name);
+ PyErr_Format(PyExc_RuntimeError, "cannot encode %s", name);
return -1;
}
if (res < 0) {
@@ -15663,8 +15709,10 @@ _PyUnicode_Fini(PyInterpreterState *interp)
{
struct _Py_unicode_state *state = &interp->unicode;
- // _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini()
- assert(get_interned_dict(interp) == NULL);
+ if (!has_shared_intern_dict(interp)) {
+ // _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini()
+ assert(get_interned_dict(interp) == NULL);
+ }
_PyUnicode_FiniEncodings(&state->fs_codec);
diff --git a/contrib/tools/python3/Parser/action_helpers.c b/contrib/tools/python3/Parser/action_helpers.c
index 085622e655..be52d89495 100644
--- a/contrib/tools/python3/Parser/action_helpers.c
+++ b/contrib/tools/python3/Parser/action_helpers.c
@@ -1043,6 +1043,9 @@ expr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_expr_seq *a, asdl_seq *b,
}
asdl_expr_seq *args = _Py_asdl_expr_seq_new(total_len, arena);
+ if (args == NULL) {
+ return NULL;
+ }
Py_ssize_t i = 0;
for (i = 0; i < args_len; i++) {
@@ -1210,6 +1213,9 @@ unpack_top_level_joined_strs(Parser *p, asdl_expr_seq *raw_expressions) {
}
asdl_expr_seq *expressions = _Py_asdl_expr_seq_new(req_size, p->arena);
+ if (expressions == NULL) {
+ return NULL;
+ }
Py_ssize_t raw_index, req_index = 0;
for (raw_index = 0; raw_index < raw_size; raw_index++) {
@@ -1400,6 +1406,9 @@ expr_ty _PyPegen_formatted_value(Parser *p, expr_ty expression, Token *debug,
}
asdl_expr_seq *values = _Py_asdl_expr_seq_new(2, arena);
+ if (values == NULL) {
+ return NULL;
+ }
asdl_seq_SET(values, 0, debug_text);
asdl_seq_SET(values, 1, formatted_value);
return _PyAST_JoinedStr(values, lineno, col_offset, debug_end_line,
diff --git a/contrib/tools/python3/Python/Python-ast.c b/contrib/tools/python3/Python/Python-ast.c
index ecaff2041f..3d5aeff837 100644
--- a/contrib/tools/python3/Python/Python-ast.c
+++ b/contrib/tools/python3/Python/Python-ast.c
@@ -863,14 +863,15 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
Py_ssize_t i, numfields = 0;
int res = -1;
PyObject *key, *value, *fields;
- if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
+
+ fields = PyObject_GetAttr((PyObject*)Py_TYPE(self), state->_fields);
+ if (fields == NULL) {
goto cleanup;
}
- if (fields) {
- numfields = PySequence_Size(fields);
- if (numfields == -1) {
- goto cleanup;
- }
+
+ numfields = PySequence_Size(fields);
+ if (numfields == -1) {
+ goto cleanup;
}
res = 0; /* if no error occurs, this stays 0 to the end */
diff --git a/contrib/tools/python3/Python/compile.c b/contrib/tools/python3/Python/compile.c
index 49b2ebf003..56fdbfae6f 100644
--- a/contrib/tools/python3/Python/compile.c
+++ b/contrib/tools/python3/Python/compile.c
@@ -1835,7 +1835,7 @@ compiler_make_closure(struct compiler *c, location loc,
c->u->u_metadata.u_name,
co->co_name,
freevars);
- Py_DECREF(freevars);
+ Py_XDECREF(freevars);
return ERROR;
}
ADDOP_I(c, loc, LOAD_CLOSURE, arg);
@@ -5191,9 +5191,12 @@ ex_call:
}
-/* List and set comprehensions and generator expressions work by creating a
- nested function to perform the actual iteration. This means that the
- iteration variables don't leak into the current scope.
+/* List and set comprehensions work by being inlined at the location where
+ they are defined. The isolation of iteration variables is provided by
+ pushing/popping clashing locals on the stack. Generator expressions work
+ by creating a nested function to perform the actual iteration.
+ This means that the iteration variables don't leak into the current scope.
+ See https://peps.python.org/pep-0709/ for additional information.
The defined function is called immediately following its definition, with the
result of that call being the result of the expression.
The LC/SC version returns the populated container, while the GE version is
diff --git a/contrib/tools/python3/Python/deepfreeze/deepfreeze.c b/contrib/tools/python3/Python/deepfreeze/deepfreeze.c
index f7c18bf793..89be737a24 100644
--- a/contrib/tools/python3/Python/deepfreeze/deepfreeze.c
+++ b/contrib/tools/python3/Python/deepfreeze/deepfreeze.c
@@ -24020,10 +24020,32 @@ const_str_wb = {
};
static
struct {
+ PyASCIIObject _ascii;
+ uint8_t _data[42];
+ }
+importlib__bootstrap_external_toplevel_consts_25_consts_5 = {
+ ._ascii = {
+ .ob_base = {
+ .ob_refcnt = _Py_IMMORTAL_REFCNT,
+ .ob_type = &PyUnicode_Type,
+ },
+ .length = 41,
+ .hash = -1,
+ .state = {
+ .kind = 1,
+ .compact = 1,
+ .ascii = 1,
+ .statically_allocated = 1,
+ },
+ },
+ ._data = "os.write() didn't write the full pyc file",
+};
+static
+ struct {
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[5];
+ PyObject *ob_item[6];
}_object;
}
importlib__bootstrap_external_toplevel_consts_25_consts = {
@@ -24033,7 +24055,7 @@ importlib__bootstrap_external_toplevel_consts_25_consts = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 5,
+ .ob_size = 6,
},
.ob_item = {
& importlib__bootstrap_external_toplevel_consts_25_consts_0._ascii.ob_base,
@@ -24041,6 +24063,7 @@ importlib__bootstrap_external_toplevel_consts_25_consts = {
& const_int_438.ob_base,
& const_str_wb._ascii.ob_base,
Py_None,
+ & importlib__bootstrap_external_toplevel_consts_25_consts_5._ascii.ob_base,
},
},
};
@@ -24137,7 +24160,7 @@ static
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[12];
+ PyObject *ob_item[13];
}_object;
}
importlib__bootstrap_external_toplevel_consts_25_names = {
@@ -24147,7 +24170,7 @@ importlib__bootstrap_external_toplevel_consts_25_names = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 12,
+ .ob_size = 13,
},
.ob_item = {
&_Py_ID(id),
@@ -24159,8 +24182,9 @@ importlib__bootstrap_external_toplevel_consts_25_names = {
&_Py_ID(_io),
& const_str_FileIO._ascii.ob_base,
&_Py_ID(write),
- &_Py_ID(replace),
+ &_Py_ID(len),
& const_str_OSError._ascii.ob_base,
+ &_Py_ID(replace),
&_Py_ID(unlink),
},
},
@@ -24191,7 +24215,7 @@ static
struct {
PyObject_VAR_HEAD
Py_hash_t ob_shash;
- char ob_sval[197];
+ char ob_sval[225];
}
importlib__bootstrap_external_toplevel_consts_25_linetable = {
.ob_base = {
@@ -24199,10 +24223,10 @@ importlib__bootstrap_external_toplevel_consts_25_linetable = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyBytes_Type,
},
- .ob_size = 196,
+ .ob_size = 224,
},
.ob_shash = -1,
- .ob_sval = "\x80\x00\xf0\x0a\x00\x13\x17\x90\x16\x90\x71\x9c\x12\x98\x44\x9b\x18\x98\x0a\xd0\x0f\x23\x80\x48\xdc\x09\x0c\x8f\x18\x89\x18\x90\x28\xdc\x12\x15\x97\x2a\x91\x2a\x9c\x73\x9f\x7b\x99\x7b\xd1\x12\x2a\xac\x53\xaf\x5c\xa9\x5c\xd1\x12\x39\xb8\x34\xc0\x25\xb9\x3c\xf3\x03\x01\x0a\x49\x01\x80\x42\xf0\x04\x0b\x05\x0e\xf4\x06\x00\x0e\x11\x8f\x5a\x89\x5a\x98\x02\x98\x44\xd4\x0d\x21\xa0\x54\xd8\x0c\x10\x8f\x4a\x89\x4a\x90\x74\xd4\x0c\x1c\xf7\x03\x00\x0e\x22\xe4\x08\x0b\x8f\x0b\x89\x0b\x90\x48\x98\x64\xd5\x08\x23\xf7\x05\x00\x0e\x22\xd0\x0d\x21\xfb\xf4\x06\x00\x0c\x13\xf2\x00\x05\x05\x0e\xf0\x02\x03\x09\x11\xdc\x0c\x0f\x8f\x4a\x89\x4a\x90\x78\xd4\x0c\x20\xf0\x06\x00\x09\x0e\xf8\xf4\x05\x00\x10\x17\xf2\x00\x01\x09\x11\xd8\x0c\x10\xd8\x08\x0d\xf0\x05\x01\x09\x11\xfa\xf0\x07\x05\x05\x0e\xfa",
+ .ob_sval = "\x80\x00\xf0\x0a\x00\x13\x17\x90\x16\x90\x71\x9c\x12\x98\x44\x9b\x18\x98\x0a\xd0\x0f\x23\x80\x48\xdc\x09\x0c\x8f\x18\x89\x18\x90\x28\xdc\x12\x15\x97\x2a\x91\x2a\x9c\x73\x9f\x7b\x99\x7b\xd1\x12\x2a\xac\x53\xaf\x5c\xa9\x5c\xd1\x12\x39\xb8\x34\xc0\x25\xb9\x3c\xf3\x03\x01\x0a\x49\x01\x80\x42\xf0\x04\x0f\x05\x0e\xf4\x06\x00\x0e\x11\x8f\x5a\x89\x5a\x98\x02\x98\x44\xd4\x0d\x21\xa0\x54\xd8\x1c\x20\x9f\x4a\x99\x4a\xa0\x74\xd3\x1c\x2c\x88\x4d\xf7\x03\x00\x0e\x22\xe0\x0b\x18\x9c\x43\xa0\x04\x9b\x49\xd2\x0b\x25\xf4\x06\x00\x13\x1a\xd0\x1a\x45\xd3\x12\x46\xd0\x0c\x46\xdc\x08\x0b\x8f\x0b\x89\x0b\x90\x48\x98\x64\xd5\x08\x23\xf7\x0d\x00\x0e\x22\xd0\x0d\x21\xfb\xf4\x0e\x00\x0c\x13\xf2\x00\x05\x05\x0e\xf0\x02\x03\x09\x11\xdc\x0c\x0f\x8f\x4a\x89\x4a\x90\x78\xd4\x0c\x20\xf0\x06\x00\x09\x0e\xf8\xf4\x05\x00\x10\x17\xf2\x00\x01\x09\x11\xd8\x0c\x10\xd8\x08\x0d\xf0\x05\x01\x09\x11\xfa\xf0\x07\x05\x05\x0e\xfa",
};
static
struct {
@@ -24219,7 +24243,7 @@ importlib__bootstrap_external_toplevel_consts_25_exceptiontable = {
.ob_size = 72,
},
.ob_shash = -1,
- .ob_sval = "\xc1\x1c\x16\x42\x2f\x00\xc1\x32\x12\x42\x23\x03\xc2\x04\x1e\x42\x2f\x00\xc2\x23\x05\x42\x2c\x07\xc2\x28\x07\x42\x2f\x00\xc2\x2f\x09\x43\x1f\x03\xc2\x39\x15\x43\x0f\x02\xc3\x0e\x01\x43\x1f\x03\xc3\x0f\x09\x43\x1b\x05\xc3\x18\x02\x43\x1f\x03\xc3\x1a\x01\x43\x1b\x05\xc3\x1b\x04\x43\x1f\x03",
+ .ob_sval = "\xc1\x1c\x16\x43\x08\x00\xc1\x32\x12\x42\x3c\x03\xc2\x04\x37\x43\x08\x00\xc2\x3c\x05\x43\x05\x07\xc3\x01\x07\x43\x08\x00\xc3\x08\x09\x43\x38\x03\xc3\x12\x15\x43\x28\x02\xc3\x27\x01\x43\x38\x03\xc3\x28\x09\x43\x34\x05\xc3\x31\x02\x43\x38\x03\xc3\x33\x01\x43\x34\x05\xc3\x34\x04\x43\x38\x03",
};
static
struct {
@@ -24245,10 +24269,32 @@ const_str_path_tmp = {
};
static
struct {
+ PyASCIIObject _ascii;
+ uint8_t _data[14];
+ }
+const_str_bytes_written = {
+ ._ascii = {
+ .ob_base = {
+ .ob_refcnt = _Py_IMMORTAL_REFCNT,
+ .ob_type = &PyUnicode_Type,
+ },
+ .length = 13,
+ .hash = -1,
+ .state = {
+ .kind = 1,
+ .compact = 1,
+ .ascii = 1,
+ .statically_allocated = 1,
+ },
+ },
+ ._data = "bytes_written",
+};
+static
+ struct {
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[6];
+ PyObject *ob_item[7];
}_object;
}
importlib__bootstrap_external_toplevel_consts_25_localsplusnames = {
@@ -24258,7 +24304,7 @@ importlib__bootstrap_external_toplevel_consts_25_localsplusnames = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 6,
+ .ob_size = 7,
},
.ob_item = {
&_Py_ID(path),
@@ -24267,18 +24313,19 @@ importlib__bootstrap_external_toplevel_consts_25_localsplusnames = {
& const_str_path_tmp._ascii.ob_base,
&_Py_ID(fd),
&_Py_ID(file),
+ & const_str_bytes_written._ascii.ob_base,
},
},
};
static
- struct _PyCode_DEF(452)
+ struct _PyCode_DEF(502)
importlib__bootstrap_external_toplevel_consts_25 = {
.ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyCode_Type,
},
- .ob_size = 226,
+ .ob_size = 251,
},
.co_consts = & importlib__bootstrap_external_toplevel_consts_25_consts._object.ob_base.ob_base,
.co_names = & importlib__bootstrap_external_toplevel_consts_25_names._object.ob_base.ob_base,
@@ -24287,22 +24334,22 @@ importlib__bootstrap_external_toplevel_consts_25 = {
.co_argcount = 3,
.co_posonlyargcount = 0,
.co_kwonlyargcount = 0,
- .co_framesize = 12 + FRAME_SPECIALS_SIZE,
+ .co_framesize = 13 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
.co_firstlineno = 195,
- .co_nlocalsplus = 6,
- .co_nlocals = 6,
+ .co_nlocalsplus = 7,
+ .co_nlocals = 7,
.co_ncellvars = 0,
.co_nfreevars = 0,
.co_version = 117,
.co_localsplusnames = & importlib__bootstrap_external_toplevel_consts_25_localsplusnames._object.ob_base.ob_base,
- .co_localspluskinds = & importlib__bootstrap_toplevel_consts_30_consts_4_localspluskinds.ob_base.ob_base,
+ .co_localspluskinds = & importlib__bootstrap_toplevel_consts_46_consts_9_localspluskinds.ob_base.ob_base,
.co_filename = & importlib__bootstrap_external_toplevel_consts_6_filename._ascii.ob_base,
.co_name = & const_str__write_atomic._ascii.ob_base,
.co_qualname = & const_str__write_atomic._ascii.ob_base,
.co_linetable = & importlib__bootstrap_external_toplevel_consts_25_linetable.ob_base.ob_base,
._co_cached = NULL,
- .co_code_adaptive = "\x97\x00\x7c\x00\x9b\x00\x64\x01\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x9b\x00\x9d\x03\x7d\x03\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x03\x74\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x07\x00\x00\x74\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x07\x00\x00\x7c\x02\x64\x02\x7a\x01\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\x7d\x04\x09\x00\x74\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x04\x64\x03\xab\x02\x00\x00\x00\x00\x00\x00\x35\x00\x7d\x05\x7c\x05\x6a\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x01\xab\x01\x00\x00\x00\x00\x00\x00\x01\x00\x64\x04\x64\x04\x64\x04\xab\x02\x00\x00\x00\x00\x00\x00\x01\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x03\x7c\x00\xab\x02\x00\x00\x00\x00\x00\x00\x01\x00\x79\x04\x23\x00\x31\x00\x73\x01\x77\x02\x01\x00\x59\x00\x01\x00\x01\x00\x8c\x20\x78\x03\x59\x00\x77\x01\x23\x00\x74\x14\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x72\x27\x01\x00\x09\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x03\xab\x01\x00\x00\x00\x00\x00\x00\x01\x00\x82\x00\x23\x00\x74\x14\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x72\x03\x01\x00\x59\x00\x82\x00\x77\x00\x78\x03\x59\x00\x77\x01\x77\x00\x78\x03\x59\x00\x77\x01",
+ .co_code_adaptive = "\x97\x00\x7c\x00\x9b\x00\x64\x01\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x9b\x00\x9d\x03\x7d\x03\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x03\x74\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x07\x00\x00\x74\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x07\x00\x00\x7c\x02\x64\x02\x7a\x01\x00\x00\xab\x03\x00\x00\x00\x00\x00\x00\x7d\x04\x09\x00\x74\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x04\x64\x03\xab\x02\x00\x00\x00\x00\x00\x00\x35\x00\x7d\x05\x7c\x05\x6a\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x01\xab\x01\x00\x00\x00\x00\x00\x00\x7d\x06\x64\x04\x64\x04\x64\x04\xab\x02\x00\x00\x00\x00\x00\x00\x01\x00\x7f\x06\x74\x13\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x01\xab\x01\x00\x00\x00\x00\x00\x00\x6b\x37\x00\x00\x72\x0b\x74\x15\x00\x00\x00\x00\x00\x00\x00\x00\x64\x05\xab\x01\x00\x00\x00\x00\x00\x00\x82\x01\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x03\x7c\x00\xab\x02\x00\x00\x00\x00\x00\x00\x01\x00\x79\x04\x23\x00\x31\x00\x73\x01\x77\x02\x01\x00\x59\x00\x01\x00\x01\x00\x8c\x39\x78\x03\x59\x00\x77\x01\x23\x00\x74\x14\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x72\x27\x01\x00\x09\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x03\xab\x01\x00\x00\x00\x00\x00\x00\x01\x00\x82\x00\x23\x00\x74\x14\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x72\x03\x01\x00\x59\x00\x82\x00\x77\x00\x78\x03\x59\x00\x77\x01\x77\x00\x78\x03\x59\x00\x77\x01",
._co_firsttraceable = 0,
};
static
@@ -25030,7 +25077,7 @@ importlib__bootstrap_external_toplevel_consts_36 = {
.co_kwonlyargcount = 1,
.co_framesize = 18 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 482,
+ .co_firstlineno = 486,
.co_nlocalsplus = 12,
.co_nlocals = 12,
.co_ncellvars = 0,
@@ -25547,7 +25594,7 @@ importlib__bootstrap_external_toplevel_consts_37 = {
.co_kwonlyargcount = 0,
.co_framesize = 16 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 552,
+ .co_firstlineno = 556,
.co_nlocalsplus = 10,
.co_nlocals = 10,
.co_ncellvars = 0,
@@ -25830,7 +25877,7 @@ importlib__bootstrap_external_toplevel_consts_38 = {
.co_kwonlyargcount = 0,
.co_framesize = 9 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 592,
+ .co_firstlineno = 596,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -25970,7 +26017,7 @@ importlib__bootstrap_external_toplevel_consts_39 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 611,
+ .co_firstlineno = 615,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -26154,7 +26201,7 @@ importlib__bootstrap_external_toplevel_consts_40 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 623,
+ .co_firstlineno = 627,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -26390,7 +26437,7 @@ importlib__bootstrap_external_toplevel_consts_41_consts_1 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 643,
+ .co_firstlineno = 647,
.co_nlocalsplus = 5,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -26487,7 +26534,7 @@ importlib__bootstrap_external_toplevel_consts_41_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 12 + FRAME_SPECIALS_SIZE,
.co_stacksize = 9,
- .co_firstlineno = 656,
+ .co_firstlineno = 660,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -26650,7 +26697,7 @@ importlib__bootstrap_external_toplevel_consts_41 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 635,
+ .co_firstlineno = 639,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 1,
@@ -27054,7 +27101,7 @@ importlib__bootstrap_external_toplevel_consts_42 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 666,
+ .co_firstlineno = 670,
.co_nlocalsplus = 6,
.co_nlocals = 6,
.co_ncellvars = 0,
@@ -27297,7 +27344,7 @@ importlib__bootstrap_external_toplevel_consts_43 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 699,
+ .co_firstlineno = 703,
.co_nlocalsplus = 6,
.co_nlocals = 6,
.co_ncellvars = 0,
@@ -27510,7 +27557,7 @@ importlib__bootstrap_external_toplevel_consts_44 = {
.co_kwonlyargcount = 0,
.co_framesize = 9 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 727,
+ .co_firstlineno = 731,
.co_nlocalsplus = 4,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -27842,7 +27889,7 @@ importlib__bootstrap_external_toplevel_consts_45 = {
.co_kwonlyargcount = 0,
.co_framesize = 10 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 751,
+ .co_firstlineno = 755,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -28079,7 +28126,7 @@ importlib__bootstrap_external_toplevel_consts_46 = {
.co_kwonlyargcount = 0,
.co_framesize = 9 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 764,
+ .co_firstlineno = 768,
.co_nlocalsplus = 4,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -28275,7 +28322,7 @@ importlib__bootstrap_external_toplevel_consts_47 = {
.co_kwonlyargcount = 0,
.co_framesize = 10 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 774,
+ .co_firstlineno = 778,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -28604,7 +28651,7 @@ importlib__bootstrap_external_toplevel_consts_48 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 785,
+ .co_firstlineno = 789,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -28904,7 +28951,7 @@ importlib__bootstrap_external_toplevel_consts_50 = {
.co_kwonlyargcount = 2,
.co_framesize = 15 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 802,
+ .co_firstlineno = 806,
.co_nlocalsplus = 9,
.co_nlocals = 9,
.co_ncellvars = 0,
@@ -29174,7 +29221,7 @@ importlib__bootstrap_external_toplevel_consts_51 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 872,
+ .co_firstlineno = 876,
.co_nlocalsplus = 6,
.co_nlocals = 6,
.co_ncellvars = 0,
@@ -29511,7 +29558,7 @@ importlib__bootstrap_external_toplevel_consts_52_consts_5 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 934,
+ .co_firstlineno = 938,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -29929,7 +29976,7 @@ importlib__bootstrap_external_toplevel_consts_52_consts_6 = {
.co_kwonlyargcount = 0,
.co_framesize = 13 + FRAME_SPECIALS_SIZE,
.co_stacksize = 7,
- .co_firstlineno = 941,
+ .co_firstlineno = 945,
.co_nlocalsplus = 6,
.co_nlocals = 6,
.co_ncellvars = 0,
@@ -30078,7 +30125,7 @@ importlib__bootstrap_external_toplevel_consts_52_consts_8 = {
.co_kwonlyargcount = 0,
.co_framesize = 16 + FRAME_SPECIALS_SIZE,
.co_stacksize = 8,
- .co_firstlineno = 956,
+ .co_firstlineno = 960,
.co_nlocalsplus = 8,
.co_nlocals = 8,
.co_ncellvars = 0,
@@ -30240,7 +30287,7 @@ importlib__bootstrap_external_toplevel_consts_52 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 922,
+ .co_firstlineno = 926,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -30502,7 +30549,7 @@ importlib__bootstrap_external_toplevel_consts_54_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 10 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 978,
+ .co_firstlineno = 982,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -30644,7 +30691,7 @@ importlib__bootstrap_external_toplevel_consts_54_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 986,
+ .co_firstlineno = 990,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -30861,7 +30908,7 @@ importlib__bootstrap_external_toplevel_consts_54_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 8 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 989,
+ .co_firstlineno = 993,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -31025,7 +31072,7 @@ importlib__bootstrap_external_toplevel_consts_54_consts_5 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 997,
+ .co_firstlineno = 1001,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -31134,7 +31181,7 @@ importlib__bootstrap_external_toplevel_consts_54 = {
.co_kwonlyargcount = 0,
.co_framesize = 1 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 973,
+ .co_firstlineno = 977,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -31341,7 +31388,7 @@ importlib__bootstrap_external_toplevel_consts_56_consts_1 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 1005,
+ .co_firstlineno = 1009,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -31504,7 +31551,7 @@ importlib__bootstrap_external_toplevel_consts_56_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1013,
+ .co_firstlineno = 1017,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -31735,7 +31782,7 @@ importlib__bootstrap_external_toplevel_consts_56_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 8 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1027,
+ .co_firstlineno = 1031,
.co_nlocalsplus = 4,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -31861,7 +31908,7 @@ importlib__bootstrap_external_toplevel_consts_56_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1037,
+ .co_firstlineno = 1041,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -32095,7 +32142,7 @@ importlib__bootstrap_external_toplevel_consts_56_consts_5 = {
.co_kwonlyargcount = 0,
.co_framesize = 10 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1044,
+ .co_firstlineno = 1048,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -32376,7 +32423,7 @@ importlib__bootstrap_external_toplevel_consts_56_consts_8 = {
.co_kwonlyargcount = 1,
.co_framesize = 12 + FRAME_SPECIALS_SIZE,
.co_stacksize = 8,
- .co_firstlineno = 1054,
+ .co_firstlineno = 1058,
.co_nlocalsplus = 4,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -32937,7 +32984,7 @@ importlib__bootstrap_external_toplevel_consts_56_consts_9 = {
.co_kwonlyargcount = 0,
.co_framesize = 22 + FRAME_SPECIALS_SIZE,
.co_stacksize = 7,
- .co_firstlineno = 1062,
+ .co_firstlineno = 1066,
.co_nlocalsplus = 15,
.co_nlocals = 15,
.co_ncellvars = 0,
@@ -33052,7 +33099,7 @@ importlib__bootstrap_external_toplevel_consts_56 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1003,
+ .co_firstlineno = 1007,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -33239,7 +33286,7 @@ importlib__bootstrap_external_toplevel_consts_58_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1153,
+ .co_firstlineno = 1157,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -33359,7 +33406,7 @@ importlib__bootstrap_external_toplevel_consts_58_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 4 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1159,
+ .co_firstlineno = 1163,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -33479,7 +33526,7 @@ importlib__bootstrap_external_toplevel_consts_58_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1163,
+ .co_firstlineno = 1167,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -33645,7 +33692,7 @@ importlib__bootstrap_external_toplevel_consts_58_consts_5 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1166,
+ .co_firstlineno = 1170,
.co_nlocalsplus = 3,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -33763,7 +33810,7 @@ importlib__bootstrap_external_toplevel_consts_58_consts_6 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 1178,
+ .co_firstlineno = 1182,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -33997,7 +34044,7 @@ importlib__bootstrap_external_toplevel_consts_58_consts_7 = {
.co_kwonlyargcount = 0,
.co_framesize = 9 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 1183,
+ .co_firstlineno = 1187,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -34230,7 +34277,7 @@ importlib__bootstrap_external_toplevel_consts_58_consts_8 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1192,
+ .co_firstlineno = 1196,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -34368,7 +34415,7 @@ importlib__bootstrap_external_toplevel_consts_58 = {
.co_kwonlyargcount = 0,
.co_framesize = 4 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1148,
+ .co_firstlineno = 1152,
.co_nlocalsplus = 1,
.co_nlocals = 0,
.co_ncellvars = 1,
@@ -34646,7 +34693,7 @@ importlib__bootstrap_external_toplevel_consts_60_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1202,
+ .co_firstlineno = 1206,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -34836,7 +34883,7 @@ importlib__bootstrap_external_toplevel_consts_60_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 10 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1207,
+ .co_firstlineno = 1211,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -35125,7 +35172,7 @@ importlib__bootstrap_external_toplevel_consts_60_consts_6 = {
.co_kwonlyargcount = 1,
.co_framesize = 16 + FRAME_SPECIALS_SIZE,
.co_stacksize = 7,
- .co_firstlineno = 1212,
+ .co_firstlineno = 1216,
.co_nlocalsplus = 9,
.co_nlocals = 9,
.co_ncellvars = 0,
@@ -35234,7 +35281,7 @@ importlib__bootstrap_external_toplevel_consts_60 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1198,
+ .co_firstlineno = 1202,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -35452,7 +35499,7 @@ importlib__bootstrap_external_toplevel_consts_62_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 10 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1247,
+ .co_firstlineno = 1251,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -35571,7 +35618,7 @@ importlib__bootstrap_external_toplevel_consts_62_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1263,
+ .co_firstlineno = 1267,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -35676,7 +35723,7 @@ importlib__bootstrap_external_toplevel_consts_62 = {
.co_kwonlyargcount = 0,
.co_framesize = 1 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 1243,
+ .co_firstlineno = 1247,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -35796,7 +35843,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1276,
+ .co_firstlineno = 1280,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -35853,7 +35900,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 4 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1280,
+ .co_firstlineno = 1284,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -35910,7 +35957,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1284,
+ .co_firstlineno = 1288,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -36125,7 +36172,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_5 = {
.co_kwonlyargcount = 0,
.co_framesize = 8 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1287,
+ .co_firstlineno = 1291,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -36340,7 +36387,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_6 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1295,
+ .co_firstlineno = 1299,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -36544,7 +36591,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_7_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1304,
+ .co_firstlineno = 1308,
.co_nlocalsplus = 3,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -36713,7 +36760,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_7 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1301,
+ .co_firstlineno = 1305,
.co_nlocalsplus = 3,
.co_nlocals = 2,
.co_ncellvars = 1,
@@ -36815,7 +36862,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_8 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1307,
+ .co_firstlineno = 1311,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -36917,7 +36964,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_9 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1311,
+ .co_firstlineno = 1315,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -36974,7 +37021,7 @@ importlib__bootstrap_external_toplevel_consts_64_consts_10 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 1315,
+ .co_firstlineno = 1319,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -37094,7 +37141,7 @@ importlib__bootstrap_external_toplevel_consts_64 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1268,
+ .co_firstlineno = 1272,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -37398,7 +37445,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 8 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1332,
+ .co_firstlineno = 1336,
.co_nlocalsplus = 4,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -37657,7 +37704,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1339,
+ .co_firstlineno = 1343,
.co_nlocalsplus = 4,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -37824,7 +37871,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_5 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1349,
+ .co_firstlineno = 1353,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -37997,7 +38044,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_6 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1353,
+ .co_firstlineno = 1357,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -38094,7 +38141,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_7 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1367,
+ .co_firstlineno = 1371,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -38235,7 +38282,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_8 = {
.co_kwonlyargcount = 0,
.co_framesize = 4 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1370,
+ .co_firstlineno = 1374,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -38355,7 +38402,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_9 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1373,
+ .co_firstlineno = 1377,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -38452,7 +38499,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_10 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1376,
+ .co_firstlineno = 1380,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -38572,7 +38619,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_11 = {
.co_kwonlyargcount = 0,
.co_framesize = 4 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1379,
+ .co_firstlineno = 1383,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -38669,7 +38716,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_12 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1382,
+ .co_firstlineno = 1386,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -38766,7 +38813,7 @@ importlib__bootstrap_external_toplevel_consts_66_consts_13 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1385,
+ .co_firstlineno = 1389,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -38891,7 +38938,7 @@ importlib__bootstrap_external_toplevel_consts_66 = {
.co_kwonlyargcount = 0,
.co_framesize = 1 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 1321,
+ .co_firstlineno = 1325,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -38988,7 +39035,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_1 = {
.co_kwonlyargcount = 0,
.co_framesize = 9 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1393,
+ .co_firstlineno = 1397,
.co_nlocalsplus = 4,
.co_nlocals = 4,
.co_ncellvars = 0,
@@ -39085,7 +39132,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1396,
+ .co_firstlineno = 1400,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -39182,7 +39229,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1399,
+ .co_firstlineno = 1403,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -39327,7 +39374,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 8 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 1402,
+ .co_firstlineno = 1406,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -39384,7 +39431,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_5 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1405,
+ .co_firstlineno = 1409,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -39458,7 +39505,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_6 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 1408,
+ .co_firstlineno = 1412,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -39624,7 +39671,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_7 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1411,
+ .co_firstlineno = 1415,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -39814,7 +39861,7 @@ importlib__bootstrap_external_toplevel_consts_68_consts_8 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1423,
+ .co_firstlineno = 1427,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -39929,7 +39976,7 @@ importlib__bootstrap_external_toplevel_consts_68 = {
.co_kwonlyargcount = 0,
.co_framesize = 1 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 1392,
+ .co_firstlineno = 1396,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -40262,7 +40309,7 @@ importlib__bootstrap_external_toplevel_consts_70_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 8 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1438,
+ .co_firstlineno = 1442,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -40515,7 +40562,7 @@ importlib__bootstrap_external_toplevel_consts_70_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1456,
+ .co_firstlineno = 1460,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -40748,7 +40795,7 @@ importlib__bootstrap_external_toplevel_consts_70_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1469,
+ .co_firstlineno = 1473,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -41039,7 +41086,7 @@ importlib__bootstrap_external_toplevel_consts_70_consts_6 = {
.co_kwonlyargcount = 0,
.co_framesize = 14 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1491,
+ .co_firstlineno = 1495,
.co_nlocalsplus = 9,
.co_nlocals = 9,
.co_ncellvars = 0,
@@ -41213,7 +41260,7 @@ importlib__bootstrap_external_toplevel_consts_70_consts_7 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1520,
+ .co_firstlineno = 1524,
.co_nlocalsplus = 6,
.co_nlocals = 6,
.co_ncellvars = 0,
@@ -41403,7 +41450,7 @@ importlib__bootstrap_external_toplevel_consts_70_consts_8 = {
.co_kwonlyargcount = 0,
.co_framesize = 8 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1544,
+ .co_firstlineno = 1548,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -41520,7 +41567,7 @@ importlib__bootstrap_external_toplevel_consts_70 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1434,
+ .co_firstlineno = 1438,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -41701,7 +41748,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_2_consts_1 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1573,
+ .co_firstlineno = 1577,
.co_nlocalsplus = 3,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -42008,7 +42055,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_2 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1567,
+ .co_firstlineno = 1571,
.co_nlocalsplus = 6,
.co_nlocals = 5,
.co_ncellvars = 1,
@@ -42150,7 +42197,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_3 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1584,
+ .co_firstlineno = 1588,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -42297,7 +42344,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 13 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 1588,
+ .co_firstlineno = 1592,
.co_nlocalsplus = 7,
.co_nlocals = 7,
.co_ncellvars = 0,
@@ -42757,7 +42804,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_6 = {
.co_kwonlyargcount = 0,
.co_framesize = 22 + FRAME_SPECIALS_SIZE,
.co_stacksize = 8,
- .co_firstlineno = 1593,
+ .co_firstlineno = 1597,
.co_nlocalsplus = 14,
.co_nlocals = 14,
.co_ncellvars = 0,
@@ -43118,7 +43165,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_7 = {
.co_kwonlyargcount = 0,
.co_framesize = 15 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1644,
+ .co_firstlineno = 1648,
.co_nlocalsplus = 10,
.co_nlocals = 10,
.co_ncellvars = 0,
@@ -43368,7 +43415,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_8_consts_1 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 1685,
+ .co_firstlineno = 1689,
.co_nlocalsplus = 3,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -43528,7 +43575,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_8 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1675,
+ .co_firstlineno = 1679,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 2,
@@ -43648,7 +43695,7 @@ importlib__bootstrap_external_toplevel_consts_72_consts_9 = {
.co_kwonlyargcount = 0,
.co_framesize = 4 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1693,
+ .co_firstlineno = 1697,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -43765,7 +43812,7 @@ importlib__bootstrap_external_toplevel_consts_72 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 1558,
+ .co_firstlineno = 1562,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -43983,7 +44030,7 @@ importlib__bootstrap_external_toplevel_consts_74 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1699,
+ .co_firstlineno = 1703,
.co_nlocalsplus = 6,
.co_nlocals = 6,
.co_ncellvars = 0,
@@ -44197,7 +44244,7 @@ importlib__bootstrap_external_toplevel_consts_75 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 1724,
+ .co_firstlineno = 1728,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -44337,7 +44384,7 @@ importlib__bootstrap_external_toplevel_consts_76 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 1,
- .co_firstlineno = 1735,
+ .co_firstlineno = 1739,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -44510,7 +44557,7 @@ importlib__bootstrap_external_toplevel_consts_77 = {
.co_kwonlyargcount = 0,
.co_framesize = 7 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 1740,
+ .co_firstlineno = 1744,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -44998,7 +45045,7 @@ importlib__bootstrap_external_toplevel_linetable = {
.ob_size = 710,
},
.ob_shash = -1,
- .ob_sval = "\xf0\x03\x01\x01\x01\xf1\x02\x07\x01\x04\xf0\x2c\x00\x0e\x12\x80\x0a\xf3\x06\x00\x01\x0c\xdb\x00\x0a\xdb\x00\x0a\xdb\x00\x10\xdb\x00\x0e\xf0\x06\x00\x10\x13\x8f\x7c\x89\x7c\x98\x77\xd1\x0f\x26\x80\x0b\xd9\x03\x0e\xdb\x04\x14\xdc\x04\x11\xe3\x04\x17\xf1\x06\x00\x04\x0f\xd8\x17\x1b\x98\x53\x90\x6b\x81\x4f\xe0\x17\x1a\x90\x65\x80\x4f\xe1\x07\x0a\xd1\x0a\x34\xa1\x4f\xd3\x0a\x34\xd4\x07\x34\xd0\x00\x34\xd0\x07\x34\xd8\x0b\x1a\x98\x31\xd1\x0b\x1d\x80\x08\xd9\x11\x16\x90\x7f\xd3\x11\x27\x80\x0e\xd8\x12\x14\x97\x27\x91\x27\x98\x2f\xd3\x12\x2a\x80\x0f\xd9\x29\x38\xd3\x17\x39\xa9\x1f\xa0\x41\x98\x21\x98\x41\x98\x33\x9a\x07\xa8\x1f\xd1\x17\x39\xd0\x00\x14\xf0\x08\x00\x27\x2d\xd0\x00\x23\xd8\x28\x3a\xd0\x00\x25\xd8\x20\x45\xd8\x22\x45\xf1\x03\x01\x21\x46\x01\xd0\x00\x1b\xf2\x08\x0e\x01\x17\xf1\x20\x00\x0f\x1f\xd3\x0e\x20\x80\x0b\xf2\x06\x02\x01\x37\xf2\x0a\x03\x01\x2a\xf2\x0a\x03\x01\x2a\xf1\x0c\x00\x04\x0f\xf3\x02\x1b\x05\x2a\xf2\x3c\x03\x05\x3f\xf2\x0c\x05\x01\x22\xf2\x10\x07\x01\x1a\xf2\x14\x06\x01\x32\xf2\x12\x02\x01\x2e\xf2\x0a\x04\x01\x2e\xf1\x0e\x00\x04\x0f\xf3\x02\x05\x05\x52\x01\xf2\x10\x02\x05\x30\xf2\x0a\x07\x01\x14\xf3\x14\x13\x01\x0e\xf1\x2c\x00\x0e\x12\x90\x2d\xd7\x12\x28\xd1\x12\x28\xd3\x0d\x29\x80\x0a\xf0\x70\x07\x00\x11\x15\x8f\x7f\x89\x7f\x98\x71\xa0\x28\xd3\x0f\x2b\xa8\x67\xd1\x0f\x35\x80\x0c\xe0\x14\x17\x97\x4e\x91\x4e\xa0\x3c\xb0\x18\xd3\x14\x3a\xd0\x00\x11\xe0\x0b\x18\x80\x08\xd8\x07\x0d\x80\x04\xe0\x13\x18\x90\x27\x80\x0f\xd9\x03\x0e\xd8\x04\x13\xd7\x04\x1a\xd1\x04\x1a\x98\x36\xd4\x04\x22\xe0\x15\x2c\x90\x54\xd7\x15\x2c\xd1\x15\x2c\xd3\x15\x2e\xd0\x00\x12\xe0\x15\x1b\x90\x48\xd0\x00\x11\xe0\x38\x49\xd0\x00\x49\xd0\x00\x17\xd0\x1a\x35\xf0\x04\x43\x01\x01\x30\xc0\x14\xf4\x00\x43\x01\x01\x30\xf2\x4c\x02\x25\x01\x40\x01\xf2\x50\x01\x10\x01\x47\x01\xf2\x26\x09\x01\x14\xf2\x18\x09\x01\x10\xf2\x18\x1c\x01\x1f\xf2\x3e\x1e\x01\x11\xf2\x42\x01\x19\x01\x4c\x01\xf2\x38\x15\x01\x0a\xf3\x30\x0a\x01\x39\xf3\x1a\x07\x01\x10\xf3\x14\x08\x01\x10\xf2\x16\x09\x01\x44\x01\xf1\x1c\x00\x0d\x13\x8b\x48\x80\x09\xf0\x06\x43\x01\x01\x10\xb8\x34\xd8\x37\x40\xf4\x03\x43\x01\x01\x10\xf2\x4c\x02\x2d\x01\x17\xf7\x64\x01\x30\x01\x1c\xf1\x00\x30\x01\x1c\xf7\x66\x01\x1b\x01\x3c\xf1\x00\x1b\x01\x3c\xf4\x3c\x4e\x02\x01\x1b\x90\x3d\xf4\x00\x4e\x02\x01\x1b\xf7\x62\x04\x2f\x01\x20\xf1\x00\x2f\x01\x20\xf4\x64\x01\x2a\x01\x2d\x90\x7a\xa0\x3c\xf4\x00\x2a\x01\x2d\xf4\x5a\x01\x16\x01\x14\x98\x3a\xa0\x7d\xf4\x00\x16\x01\x14\xf4\x32\x32\x01\x19\x98\x2a\xa0\x6d\xf4\x00\x32\x01\x19\xf7\x6a\x01\x41\x01\x01\x20\xf1\x00\x41\x01\x01\x20\xf7\x4e\x02\x21\x01\x2b\xf1\x00\x21\x01\x2b\xf0\x4a\x01\x00\x14\x23\xd0\x00\x10\xf7\x0a\x79\x01\x01\x46\x01\xf1\x00\x79\x01\x01\x46\x01\xf7\x78\x03\x48\x02\x01\x2c\xf1\x00\x48\x02\x01\x2c\xf3\x5a\x04\x16\x01\x0d\xf2\x32\x08\x01\x2a\xf2\x16\x02\x01\x23\xf3\x0a\x05\x01\x25\xf9\xf2\x75\x34\x00\x18\x3a",
+ .ob_sval = "\xf0\x03\x01\x01\x01\xf1\x02\x07\x01\x04\xf0\x2c\x00\x0e\x12\x80\x0a\xf3\x06\x00\x01\x0c\xdb\x00\x0a\xdb\x00\x0a\xdb\x00\x10\xdb\x00\x0e\xf0\x06\x00\x10\x13\x8f\x7c\x89\x7c\x98\x77\xd1\x0f\x26\x80\x0b\xd9\x03\x0e\xdb\x04\x14\xdc\x04\x11\xe3\x04\x17\xf1\x06\x00\x04\x0f\xd8\x17\x1b\x98\x53\x90\x6b\x81\x4f\xe0\x17\x1a\x90\x65\x80\x4f\xe1\x07\x0a\xd1\x0a\x34\xa1\x4f\xd3\x0a\x34\xd4\x07\x34\xd0\x00\x34\xd0\x07\x34\xd8\x0b\x1a\x98\x31\xd1\x0b\x1d\x80\x08\xd9\x11\x16\x90\x7f\xd3\x11\x27\x80\x0e\xd8\x12\x14\x97\x27\x91\x27\x98\x2f\xd3\x12\x2a\x80\x0f\xd9\x29\x38\xd3\x17\x39\xa9\x1f\xa0\x41\x98\x21\x98\x41\x98\x33\x9a\x07\xa8\x1f\xd1\x17\x39\xd0\x00\x14\xf0\x08\x00\x27\x2d\xd0\x00\x23\xd8\x28\x3a\xd0\x00\x25\xd8\x20\x45\xd8\x22\x45\xf1\x03\x01\x21\x46\x01\xd0\x00\x1b\xf2\x08\x0e\x01\x17\xf1\x20\x00\x0f\x1f\xd3\x0e\x20\x80\x0b\xf2\x06\x02\x01\x37\xf2\x0a\x03\x01\x2a\xf2\x0a\x03\x01\x2a\xf1\x0c\x00\x04\x0f\xf3\x02\x1b\x05\x2a\xf2\x3c\x03\x05\x3f\xf2\x0c\x05\x01\x22\xf2\x10\x07\x01\x1a\xf2\x14\x06\x01\x32\xf2\x12\x02\x01\x2e\xf2\x0a\x04\x01\x2e\xf1\x0e\x00\x04\x0f\xf3\x02\x05\x05\x52\x01\xf2\x10\x02\x05\x30\xf2\x0a\x07\x01\x14\xf3\x14\x17\x01\x0e\xf1\x34\x00\x0e\x12\x90\x2d\xd7\x12\x28\xd1\x12\x28\xd3\x0d\x29\x80\x0a\xf0\x70\x07\x00\x11\x15\x8f\x7f\x89\x7f\x98\x71\xa0\x28\xd3\x0f\x2b\xa8\x67\xd1\x0f\x35\x80\x0c\xe0\x14\x17\x97\x4e\x91\x4e\xa0\x3c\xb0\x18\xd3\x14\x3a\xd0\x00\x11\xe0\x0b\x18\x80\x08\xd8\x07\x0d\x80\x04\xe0\x13\x18\x90\x27\x80\x0f\xd9\x03\x0e\xd8\x04\x13\xd7\x04\x1a\xd1\x04\x1a\x98\x36\xd4\x04\x22\xe0\x15\x2c\x90\x54\xd7\x15\x2c\xd1\x15\x2c\xd3\x15\x2e\xd0\x00\x12\xe0\x15\x1b\x90\x48\xd0\x00\x11\xe0\x38\x49\xd0\x00\x49\xd0\x00\x17\xd0\x1a\x35\xf0\x04\x43\x01\x01\x30\xc0\x14\xf4\x00\x43\x01\x01\x30\xf2\x4c\x02\x25\x01\x40\x01\xf2\x50\x01\x10\x01\x47\x01\xf2\x26\x09\x01\x14\xf2\x18\x09\x01\x10\xf2\x18\x1c\x01\x1f\xf2\x3e\x1e\x01\x11\xf2\x42\x01\x19\x01\x4c\x01\xf2\x38\x15\x01\x0a\xf3\x30\x0a\x01\x39\xf3\x1a\x07\x01\x10\xf3\x14\x08\x01\x10\xf2\x16\x09\x01\x44\x01\xf1\x1c\x00\x0d\x13\x8b\x48\x80\x09\xf0\x06\x43\x01\x01\x10\xb8\x34\xd8\x37\x40\xf4\x03\x43\x01\x01\x10\xf2\x4c\x02\x2d\x01\x17\xf7\x64\x01\x30\x01\x1c\xf1\x00\x30\x01\x1c\xf7\x66\x01\x1b\x01\x3c\xf1\x00\x1b\x01\x3c\xf4\x3c\x4e\x02\x01\x1b\x90\x3d\xf4\x00\x4e\x02\x01\x1b\xf7\x62\x04\x2f\x01\x20\xf1\x00\x2f\x01\x20\xf4\x64\x01\x2a\x01\x2d\x90\x7a\xa0\x3c\xf4\x00\x2a\x01\x2d\xf4\x5a\x01\x16\x01\x14\x98\x3a\xa0\x7d\xf4\x00\x16\x01\x14\xf4\x32\x32\x01\x19\x98\x2a\xa0\x6d\xf4\x00\x32\x01\x19\xf7\x6a\x01\x41\x01\x01\x20\xf1\x00\x41\x01\x01\x20\xf7\x4e\x02\x21\x01\x2b\xf1\x00\x21\x01\x2b\xf0\x4a\x01\x00\x14\x23\xd0\x00\x10\xf7\x0a\x79\x01\x01\x46\x01\xf1\x00\x79\x01\x01\x46\x01\xf7\x78\x03\x48\x02\x01\x2c\xf1\x00\x48\x02\x01\x2c\xf3\x5a\x04\x16\x01\x0d\xf2\x32\x08\x01\x2a\xf2\x16\x02\x01\x23\xf3\x0a\x05\x01\x25\xf9\xf2\x7d\x34\x00\x18\x3a",
};
static
struct {
@@ -86872,7 +86919,7 @@ _collections_abc_toplevel_consts_66_consts_7 = {
static
struct {
PyASCIIObject _ascii;
- uint8_t _data[332];
+ uint8_t _data[339];
}
_collections_abc_toplevel_consts_66_consts_8_consts_0 = {
._ascii = {
@@ -86880,7 +86927,7 @@ _collections_abc_toplevel_consts_66_consts_8_consts_0 = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyUnicode_Type,
},
- .length = 331,
+ .length = 338,
.hash = -1,
.state = {
.kind = 1,
@@ -86889,7 +86936,7 @@ _collections_abc_toplevel_consts_66_consts_8_consts_0 = {
.statically_allocated = 1,
},
},
- ._data = "\x20\x44\x2e\x75\x70\x64\x61\x74\x65\x28\x5b\x45\x2c\x20\x5d\x2a\x2a\x46\x29\x20\x2d\x3e\x20\x4e\x6f\x6e\x65\x2e\x20\x20\x55\x70\x64\x61\x74\x65\x20\x44\x20\x66\x72\x6f\x6d\x20\x6d\x61\x70\x70\x69\x6e\x67\x2f\x69\x74\x65\x72\x61\x62\x6c\x65\x20\x45\x20\x61\x6e\x64\x20\x46\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x66\x20\x45\x20\x70\x72\x65\x73\x65\x6e\x74\x20\x61\x6e\x64\x20\x68\x61\x73\x20\x61\x20\x2e\x6b\x65\x79\x73\x28\x29\x20\x6d\x65\x74\x68\x6f\x64\x2c\x20\x64\x6f\x65\x73\x3a\x20\x20\x20\x20\x20\x66\x6f\x72\x20\x6b\x20\x69\x6e\x20\x45\x3a\x20\x44\x5b\x6b\x5d\x20\x3d\x20\x45\x5b\x6b\x5d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x66\x20\x45\x20\x70\x72\x65\x73\x65\x6e\x74\x20\x61\x6e\x64\x20\x6c\x61\x63\x6b\x73\x20\x2e\x6b\x65\x79\x73\x28\x29\x20\x6d\x65\x74\x68\x6f\x64\x2c\x20\x64\x6f\x65\x73\x3a\x20\x20\x20\x20\x20\x66\x6f\x72\x20\x28\x6b\x2c\x20\x76\x29\x20\x69\x6e\x20\x45\x3a\x20\x44\x5b\x6b\x5d\x20\x3d\x20\x76\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x6e\x20\x65\x69\x74\x68\x65\x72\x20\x63\x61\x73\x65\x2c\x20\x74\x68\x69\x73\x20\x69\x73\x20\x66\x6f\x6c\x6c\x6f\x77\x65\x64\x20\x62\x79\x3a\x20\x66\x6f\x72\x20\x6b\x2c\x20\x76\x20\x69\x6e\x20\x46\x2e\x69\x74\x65\x6d\x73\x28\x29\x3a\x20\x44\x5b\x6b\x5d\x20\x3d\x20\x76\x0a\x20\x20\x20\x20\x20\x20\x20\x20",
+ ._data = "\x20\x44\x2e\x75\x70\x64\x61\x74\x65\x28\x5b\x45\x2c\x20\x5d\x2a\x2a\x46\x29\x20\x2d\x3e\x20\x4e\x6f\x6e\x65\x2e\x20\x20\x55\x70\x64\x61\x74\x65\x20\x44\x20\x66\x72\x6f\x6d\x20\x6d\x61\x70\x70\x69\x6e\x67\x2f\x69\x74\x65\x72\x61\x62\x6c\x65\x20\x45\x20\x61\x6e\x64\x20\x46\x2e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x66\x20\x45\x20\x70\x72\x65\x73\x65\x6e\x74\x20\x61\x6e\x64\x20\x68\x61\x73\x20\x61\x20\x2e\x6b\x65\x79\x73\x28\x29\x20\x6d\x65\x74\x68\x6f\x64\x2c\x20\x64\x6f\x65\x73\x3a\x20\x20\x20\x20\x20\x66\x6f\x72\x20\x6b\x20\x69\x6e\x20\x45\x2e\x6b\x65\x79\x73\x28\x29\x3a\x20\x44\x5b\x6b\x5d\x20\x3d\x20\x45\x5b\x6b\x5d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x66\x20\x45\x20\x70\x72\x65\x73\x65\x6e\x74\x20\x61\x6e\x64\x20\x6c\x61\x63\x6b\x73\x20\x2e\x6b\x65\x79\x73\x28\x29\x20\x6d\x65\x74\x68\x6f\x64\x2c\x20\x64\x6f\x65\x73\x3a\x20\x20\x20\x20\x20\x66\x6f\x72\x20\x28\x6b\x2c\x20\x76\x29\x20\x69\x6e\x20\x45\x3a\x20\x44\x5b\x6b\x5d\x20\x3d\x20\x76\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x6e\x20\x65\x69\x74\x68\x65\x72\x20\x63\x61\x73\x65\x2c\x20\x74\x68\x69\x73\x20\x69\x73\x20\x66\x6f\x6c\x6c\x6f\x77\x65\x64\x20\x62\x79\x3a\x20\x66\x6f\x72\x20\x6b\x2c\x20\x76\x20\x69\x6e\x20\x46\x2e\x69\x74\x65\x6d\x73\x28\x29\x3a\x20\x44\x5b\x6b\x5d\x20\x3d\x20\x76\x0a\x20\x20\x20\x20\x20\x20\x20\x20",
};
static
struct {
@@ -101242,15 +101289,15 @@ ntpath_toplevel_consts_33 = {
static
struct {
PyASCIIObject _ascii;
- uint8_t _data[165];
+ uint8_t _data[17];
}
-ntpath_toplevel_consts_34_consts_0 = {
+const_str__getfullpathname = {
._ascii = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyUnicode_Type,
},
- .length = 164,
+ .length = 16,
.hash = -1,
.state = {
.kind = 1,
@@ -101259,7 +101306,7 @@ ntpath_toplevel_consts_34_consts_0 = {
.statically_allocated = 1,
},
},
- ._data = "\x52\x65\x74\x75\x72\x6e\x20\x74\x68\x65\x20\x61\x62\x73\x6f\x6c\x75\x74\x65\x20\x76\x65\x72\x73\x69\x6f\x6e\x20\x6f\x66\x20\x61\x20\x70\x61\x74\x68\x20\x61\x73\x20\x61\x20\x66\x61\x6c\x6c\x62\x61\x63\x6b\x20\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x69\x6e\x20\x63\x61\x73\x65\x0a\x20\x20\x20\x20\x60\x6e\x74\x2e\x5f\x67\x65\x74\x66\x75\x6c\x6c\x70\x61\x74\x68\x6e\x61\x6d\x65\x60\x20\x69\x73\x20\x6e\x6f\x74\x20\x61\x76\x61\x69\x6c\x61\x62\x6c\x65\x20\x6f\x72\x20\x72\x61\x69\x73\x65\x73\x20\x4f\x53\x45\x72\x72\x6f\x72\x2e\x20\x53\x65\x65\x20\x62\x70\x6f\x2d\x33\x31\x30\x34\x37\x20\x66\x6f\x72\x0a\x20\x20\x20\x20\x6d\x6f\x72\x65\x2e\x0a\x0a\x20\x20\x20\x20",
+ ._data = "_getfullpathname",
};
static
struct {
@@ -101269,7 +101316,7 @@ static
PyObject *ob_item[1];
}_object;
}
-ntpath_toplevel_consts_34_consts = {
+ntpath_toplevel_consts_34 = {
._object = {
.ob_base = {
.ob_base = {
@@ -101279,22 +101326,22 @@ ntpath_toplevel_consts_34_consts = {
.ob_size = 1,
},
.ob_item = {
- & ntpath_toplevel_consts_34_consts_0._ascii.ob_base,
+ & const_str__getfullpathname._ascii.ob_base,
},
},
};
static
struct {
PyASCIIObject _ascii;
- uint8_t _data[8];
+ uint8_t _data[39];
}
-const_str_getcwdb = {
+ntpath_toplevel_consts_35_consts_0 = {
._ascii = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyUnicode_Type,
},
- .length = 7,
+ .length = 38,
.hash = -1,
.state = {
.kind = 1,
@@ -101303,50 +101350,44 @@ const_str_getcwdb = {
.statically_allocated = 1,
},
},
- ._data = "getcwdb",
+ ._data = "Return the absolute version of a path.",
};
static
struct {
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[9];
+ PyObject *ob_item[3];
}_object;
}
-ntpath_toplevel_consts_34_names = {
+ntpath_toplevel_consts_35_consts = {
._object = {
.ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 9,
+ .ob_size = 3,
},
.ob_item = {
- & const_str_os._ascii.ob_base,
- & const_str_fspath._ascii.ob_base,
- & const_str_isabs._ascii.ob_base,
- &_Py_ID(isinstance),
- &_Py_ID(bytes),
- & const_str_getcwdb._ascii.ob_base,
- & const_str_getcwd._ascii.ob_base,
- &_Py_ID(join),
- & const_str_normpath._ascii.ob_base,
+ & ntpath_toplevel_consts_35_consts_0._ascii.ob_base,
+ (PyObject *)&_Py_SINGLETON(bytes_characters[92]),
+ (PyObject *)&_Py_SINGLETON(strings).ascii[92],
},
},
};
static
struct {
PyASCIIObject _ascii;
- uint8_t _data[18];
+ uint8_t _data[8];
}
-const_str__abspath_fallback = {
+const_str_getcwdb = {
._ascii = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyUnicode_Type,
},
- .length = 17,
+ .length = 7,
.hash = -1,
.state = {
.kind = 1,
@@ -101355,148 +101396,136 @@ const_str__abspath_fallback = {
.statically_allocated = 1,
},
},
- ._data = "_abspath_fallback",
-};
-static
- struct {
- PyObject_VAR_HEAD
- Py_hash_t ob_shash;
- char ob_sval[78];
- }
-ntpath_toplevel_consts_34_linetable = {
- .ob_base = {
- .ob_base = {
- .ob_refcnt = _Py_IMMORTAL_REFCNT,
- .ob_type = &PyBytes_Type,
- },
- .ob_size = 77,
- },
- .ob_shash = -1,
- .ob_sval = "\x80\x00\xf4\x0e\x00\x0c\x0e\x8f\x39\x89\x39\x90\x54\x8b\x3f\x80\x44\xdc\x0b\x10\x90\x14\x8c\x3b\xdc\x0b\x15\x90\x64\x9c\x45\xd4\x0b\x22\xdc\x12\x14\x97\x2a\x91\x2a\x93\x2c\x89\x43\xe4\x12\x14\x97\x29\x91\x29\x93\x2b\x88\x43\xdc\x0f\x13\x90\x43\x98\x14\x8b\x7f\x88\x04\xdc\x0b\x13\x90\x44\x8b\x3e\xd0\x04\x19",
+ ._data = "getcwdb",
};
static
struct {
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[2];
+ PyObject *ob_item[13];
}_object;
}
-ntpath_toplevel_consts_34_localsplusnames = {
+ntpath_toplevel_consts_35_names = {
._object = {
.ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 2,
+ .ob_size = 13,
},
.ob_item = {
- &_Py_ID(path),
- &_Py_ID(cwd),
+ & const_str__getfullpathname._ascii.ob_base,
+ & const_str_normpath._ascii.ob_base,
+ & const_str_OSError._ascii.ob_base,
+ & const_str_ValueError._ascii.ob_base,
+ & const_str_os._ascii.ob_base,
+ & const_str_fspath._ascii.ob_base,
+ & const_str_isabs._ascii.ob_base,
+ &_Py_ID(isinstance),
+ &_Py_ID(bytes),
+ & const_str_getcwdb._ascii.ob_base,
+ & const_str_getcwd._ascii.ob_base,
+ & const_str_splitroot._ascii.ob_base,
+ &_Py_ID(join),
},
},
};
static
- struct _PyCode_DEF(226)
-ntpath_toplevel_consts_34 = {
+ struct {
+ PyObject_VAR_HEAD
+ Py_hash_t ob_shash;
+ char ob_sval[240];
+ }
+ntpath_toplevel_consts_35_linetable = {
.ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
- .ob_type = &PyCode_Type,
+ .ob_type = &PyBytes_Type,
},
- .ob_size = 113,
+ .ob_size = 239,
},
- .co_consts = & ntpath_toplevel_consts_34_consts._object.ob_base.ob_base,
- .co_names = & ntpath_toplevel_consts_34_names._object.ob_base.ob_base,
- .co_exceptiontable = (PyObject *)&_Py_SINGLETON(bytes_empty),
- .co_flags = 3,
- .co_argcount = 1,
- .co_posonlyargcount = 0,
- .co_kwonlyargcount = 0,
- .co_framesize = 6 + FRAME_SPECIALS_SIZE,
- .co_stacksize = 4,
- .co_firstlineno = 564,
- .co_nlocalsplus = 2,
- .co_nlocals = 2,
- .co_ncellvars = 0,
- .co_nfreevars = 0,
- .co_version = 566,
- .co_localsplusnames = & ntpath_toplevel_consts_34_localsplusnames._object.ob_base.ob_base,
- .co_localspluskinds = & importlib__bootstrap_toplevel_consts_14_consts_2_localspluskinds.ob_base.ob_base,
- .co_filename = & ntpath_toplevel_consts_12_filename._ascii.ob_base,
- .co_name = & const_str__abspath_fallback._ascii.ob_base,
- .co_qualname = & const_str__abspath_fallback._ascii.ob_base,
- .co_linetable = & ntpath_toplevel_consts_34_linetable.ob_base.ob_base,
- ._co_cached = NULL,
- .co_code_adaptive = "\x97\x00\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x7d\x00\x74\x05\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x73\x45\x74\x07\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x74\x08\x00\x00\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x72\x15\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x7d\x01\x6e\x14\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x7d\x01\x74\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x01\x7c\x00\xab\x02\x00\x00\x00\x00\x00\x00\x7d\x00\x74\x11\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x53\x00",
- ._co_firsttraceable = 0,
+ .ob_shash = -1,
+ .ob_sval = "\x80\x00\xf0\x04\x04\x09\x11\xdc\x13\x23\xa4\x48\xa8\x54\xa3\x4e\xd3\x13\x33\xd0\x0c\x33\xf8\xdc\x10\x17\x9c\x1a\xd0\x0f\x24\xf2\x00\x02\x09\x11\xe1\x0c\x10\xf0\x05\x02\x09\x11\xfa\xf4\x06\x00\x10\x12\x8f\x79\x89\x79\x98\x14\x8b\x7f\x88\x04\xdc\x0f\x14\x90\x54\x8c\x7b\xdc\x0f\x19\x98\x24\xa4\x05\xd4\x0f\x26\xd8\x16\x1b\x90\x03\xdc\x19\x1b\x9f\x1a\x99\x1a\x91\x06\xe0\x16\x1a\x90\x03\xdc\x19\x1b\x9f\x19\x99\x19\x90\x06\xdc\x20\x29\xa8\x24\xa3\x0f\xd1\x0c\x1d\x88\x45\x90\x34\x98\x14\xe1\x0f\x14\x99\x04\xf0\x02\x04\x11\x2e\xdc\x1b\x1f\xd4\x20\x30\xb0\x15\xb8\x14\xb1\x1c\xd3\x20\x3e\xc0\x04\xd3\x1b\x45\x90\x44\xf4\x0c\x00\x10\x18\x98\x04\x8b\x7e\xd0\x08\x1d\xf8\xf4\x0b\x00\x19\x20\xa4\x1a\xd0\x17\x2c\xf2\x00\x02\x11\x2e\xe0\x1b\x20\xa0\x33\x99\x3b\xa8\x14\xd1\x1b\x2d\x91\x44\xf4\x06\x00\x10\x18\x98\x04\x8b\x7e\xd0\x08\x1d\xf0\x0b\x02\x11\x2e\xfa\xf4\x08\x00\x18\x1c\x99\x46\x9b\x48\xa0\x64\xd3\x17\x2b\x90\x04\xdc\x0f\x17\x98\x04\x8b\x7e\xd0\x08\x1d",
};
static
struct {
- PyASCIIObject _ascii;
- uint8_t _data[17];
+ PyObject_VAR_HEAD
+ Py_hash_t ob_shash;
+ char ob_sval[31];
}
-const_str__getfullpathname = {
- ._ascii = {
+ntpath_toplevel_consts_35_exceptiontable = {
+ .ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
- .ob_type = &PyUnicode_Type,
- },
- .length = 16,
- .hash = -1,
- .state = {
- .kind = 1,
- .compact = 1,
- .ascii = 1,
- .statically_allocated = 1,
+ .ob_type = &PyBytes_Type,
},
+ .ob_size = 30,
},
- ._data = "_getfullpathname",
+ .ob_shash = -1,
+ .ob_sval = "\x82\x13\x16\x00\x96\x0f\x28\x03\xa7\x01\x28\x03\xc2\x14\x18\x42\x37\x00\xc2\x37\x17\x43\x1b\x03\xc3\x1a\x01\x43\x1b\x03",
};
static
struct {
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[1];
+ PyObject *ob_item[5];
}_object;
}
-ntpath_toplevel_consts_35 = {
+ntpath_toplevel_consts_35_localsplusnames = {
._object = {
.ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 1,
+ .ob_size = 5,
},
.ob_item = {
- & const_str__getfullpathname._ascii.ob_base,
+ &_Py_ID(path),
+ &_Py_ID(sep),
+ & const_str_getcwd._ascii.ob_base,
+ & const_str_drive._ascii.ob_base,
+ & const_str_root._ascii.ob_base,
},
},
};
static
- struct {
- PyASCIIObject _ascii;
- uint8_t _data[39];
- }
-ntpath_toplevel_consts_36_consts_0 = {
- ._ascii = {
+ struct _PyCode_DEF(500)
+ntpath_toplevel_consts_35 = {
+ .ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
- .ob_type = &PyUnicode_Type,
- },
- .length = 38,
- .hash = -1,
- .state = {
- .kind = 1,
- .compact = 1,
- .ascii = 1,
- .statically_allocated = 1,
+ .ob_type = &PyCode_Type,
},
+ .ob_size = 250,
},
- ._data = "Return the absolute version of a path.",
+ .co_consts = & ntpath_toplevel_consts_35_consts._object.ob_base.ob_base,
+ .co_names = & ntpath_toplevel_consts_35_names._object.ob_base.ob_base,
+ .co_exceptiontable = & ntpath_toplevel_consts_35_exceptiontable.ob_base.ob_base,
+ .co_flags = 3,
+ .co_argcount = 1,
+ .co_posonlyargcount = 0,
+ .co_kwonlyargcount = 0,
+ .co_framesize = 11 + FRAME_SPECIALS_SIZE,
+ .co_stacksize = 6,
+ .co_firstlineno = 581,
+ .co_nlocalsplus = 5,
+ .co_nlocals = 5,
+ .co_ncellvars = 0,
+ .co_nfreevars = 0,
+ .co_version = 566,
+ .co_localsplusnames = & ntpath_toplevel_consts_35_localsplusnames._object.ob_base.ob_base,
+ .co_localspluskinds = & importlib__bootstrap_toplevel_consts_7_consts_5_localspluskinds.ob_base.ob_base,
+ .co_filename = & ntpath_toplevel_consts_12_filename._ascii.ob_base,
+ .co_name = & const_str_abspath._ascii.ob_base,
+ .co_qualname = & const_str_abspath._ascii.ob_base,
+ .co_linetable = & ntpath_toplevel_consts_35_linetable.ob_base.ob_base,
+ ._co_cached = NULL,
+ .co_code_adaptive = "\x97\x00\x09\x00\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x53\x00\x23\x00\x74\x04\x00\x00\x00\x00\x00\x00\x00\x00\x74\x06\x00\x00\x00\x00\x00\x00\x00\x00\x66\x02\x24\x00\x72\x03\x01\x00\x59\x00\x6e\x04\x77\x00\x78\x03\x59\x00\x77\x01\x74\x09\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x7d\x00\x74\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x73\xa4\x74\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x74\x10\x00\x00\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x72\x13\x64\x01\x7d\x01\x74\x08\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x02\x6e\x12\x64\x02\x7d\x01\x74\x08\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x02\x74\x17\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x5c\x03\x00\x00\x7d\x03\x7d\x04\x7d\x00\x7c\x03\x73\x02\x7c\x04\x72\x4b\x09\x00\x74\x19\x00\x00\x00\x00\x00\x00\x00\x00\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x03\x7c\x04\x7a\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x02\x00\x00\x00\x00\x00\x00\x7d\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x53\x00\x23\x00\x74\x04\x00\x00\x00\x00\x00\x00\x00\x00\x74\x06\x00\x00\x00\x00\x00\x00\x00\x00\x66\x02\x24\x00\x72\x15\x01\x00\x7c\x03\x7c\x01\x7a\x00\x00\x00\x7c\x00\x7a\x00\x00\x00\x7d\x00\x59\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x53\x00\x77\x00\x78\x03\x59\x00\x77\x01\x74\x19\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x7c\x02\xab\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x02\x00\x00\x00\x00\x00\x00\x7d\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x53\x00",
+ ._co_firsttraceable = 0,
};
static
struct {
@@ -101516,7 +101545,7 @@ ntpath_toplevel_consts_36_consts = {
.ob_size = 1,
},
.ob_item = {
- & ntpath_toplevel_consts_36_consts_0._ascii.ob_base,
+ & ntpath_toplevel_consts_35_consts_0._ascii.ob_base,
},
},
};
@@ -101525,7 +101554,7 @@ static
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[5];
+ PyObject *ob_item[9];
}_object;
}
ntpath_toplevel_consts_36_names = {
@@ -101535,14 +101564,18 @@ ntpath_toplevel_consts_36_names = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 5,
+ .ob_size = 9,
},
.ob_item = {
- & const_str__getfullpathname._ascii.ob_base,
+ & const_str_os._ascii.ob_base,
+ & const_str_fspath._ascii.ob_base,
+ & const_str_isabs._ascii.ob_base,
+ &_Py_ID(isinstance),
+ &_Py_ID(bytes),
+ & const_str_getcwdb._ascii.ob_base,
+ & const_str_getcwd._ascii.ob_base,
+ &_Py_ID(join),
& const_str_normpath._ascii.ob_base,
- & const_str_OSError._ascii.ob_base,
- & const_str_ValueError._ascii.ob_base,
- & const_str__abspath_fallback._ascii.ob_base,
},
},
};
@@ -101550,7 +101583,7 @@ static
struct {
PyObject_VAR_HEAD
Py_hash_t ob_shash;
- char ob_sval[54];
+ char ob_sval[76];
}
ntpath_toplevel_consts_36_linetable = {
.ob_base = {
@@ -101558,61 +101591,67 @@ ntpath_toplevel_consts_36_linetable = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyBytes_Type,
},
- .ob_size = 53,
+ .ob_size = 75,
},
.ob_shash = -1,
- .ob_sval = "\x80\x00\xf0\x04\x03\x09\x2b\xdc\x13\x23\xa4\x48\xa8\x54\xa3\x4e\xd3\x13\x33\xd0\x0c\x33\xf8\xdc\x10\x17\x9c\x1a\xd0\x0f\x24\xf2\x00\x01\x09\x2b\xdc\x13\x24\xa0\x54\xd3\x13\x2a\xd2\x0c\x2a\xf0\x03\x01\x09\x2b\xfa",
+ .ob_sval = "\x80\x00\xe4\x0f\x11\x8f\x79\x89\x79\x98\x14\x8b\x7f\x88\x04\xdc\x0f\x14\x90\x54\x8c\x7b\xdc\x0f\x19\x98\x24\xa4\x05\xd4\x0f\x26\xdc\x16\x18\x97\x6a\x91\x6a\x93\x6c\x91\x03\xe4\x16\x18\x97\x69\x91\x69\x93\x6b\x90\x03\xdc\x13\x17\x98\x03\x98\x54\x93\x3f\x88\x44\xdc\x0f\x17\x98\x04\x8b\x7e\xd0\x08\x1d",
};
static
struct {
- PyObject_VAR_HEAD
- Py_hash_t ob_shash;
- char ob_sval[13];
+ PyGC_Head _gc_head;
+ struct {
+ PyObject_VAR_HEAD
+ PyObject *ob_item[2];
+ }_object;
}
-ntpath_toplevel_consts_36_exceptiontable = {
- .ob_base = {
+ntpath_toplevel_consts_36_localsplusnames = {
+ ._object = {
.ob_base = {
- .ob_refcnt = _Py_IMMORTAL_REFCNT,
- .ob_type = &PyBytes_Type,
+ .ob_base = {
+ .ob_refcnt = _Py_IMMORTAL_REFCNT,
+ .ob_type = &PyTuple_Type,
+ },
+ .ob_size = 2,
+ },
+ .ob_item = {
+ &_Py_ID(path),
+ &_Py_ID(cwd),
},
- .ob_size = 12,
},
- .ob_shash = -1,
- .ob_sval = "\x82\x13\x16\x00\x96\x1a\x33\x03\xb2\x01\x33\x03",
};
static
- struct _PyCode_DEF(108)
+ struct _PyCode_DEF(226)
ntpath_toplevel_consts_36 = {
.ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyCode_Type,
},
- .ob_size = 54,
+ .ob_size = 113,
},
.co_consts = & ntpath_toplevel_consts_36_consts._object.ob_base.ob_base,
.co_names = & ntpath_toplevel_consts_36_names._object.ob_base.ob_base,
- .co_exceptiontable = & ntpath_toplevel_consts_36_exceptiontable.ob_base.ob_base,
+ .co_exceptiontable = (PyObject *)&_Py_SINGLETON(bytes_empty),
.co_flags = 3,
.co_argcount = 1,
.co_posonlyargcount = 0,
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
- .co_stacksize = 5,
- .co_firstlineno = 588,
- .co_nlocalsplus = 1,
- .co_nlocals = 1,
+ .co_stacksize = 4,
+ .co_firstlineno = 569,
+ .co_nlocalsplus = 2,
+ .co_nlocals = 2,
.co_ncellvars = 0,
.co_nfreevars = 0,
.co_version = 567,
- .co_localsplusnames = & importlib__bootstrap_external_toplevel_consts_18_localsplusnames._object.ob_base.ob_base,
- .co_localspluskinds = (PyObject *)&_Py_SINGLETON(bytes_characters[32]),
+ .co_localsplusnames = & ntpath_toplevel_consts_36_localsplusnames._object.ob_base.ob_base,
+ .co_localspluskinds = & importlib__bootstrap_toplevel_consts_14_consts_2_localspluskinds.ob_base.ob_base,
.co_filename = & ntpath_toplevel_consts_12_filename._ascii.ob_base,
.co_name = & const_str_abspath._ascii.ob_base,
.co_qualname = & const_str_abspath._ascii.ob_base,
.co_linetable = & ntpath_toplevel_consts_36_linetable.ob_base.ob_base,
._co_cached = NULL,
- .co_code_adaptive = "\x97\x00\x09\x00\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x74\x03\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x53\x00\x23\x00\x74\x04\x00\x00\x00\x00\x00\x00\x00\x00\x74\x06\x00\x00\x00\x00\x00\x00\x00\x00\x66\x02\x24\x00\x72\x0e\x01\x00\x74\x09\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x63\x02\x59\x00\x53\x00\x77\x00\x78\x03\x59\x00\x77\x01",
+ .co_code_adaptive = "\x97\x00\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x7d\x00\x74\x05\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x73\x45\x74\x07\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x74\x08\x00\x00\x00\x00\x00\x00\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x72\x15\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x7d\x01\x6e\x14\x74\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x7d\x01\x74\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x01\x7c\x00\xab\x02\x00\x00\x00\x00\x00\x00\x7d\x00\x74\x11\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\xab\x01\x00\x00\x00\x00\x00\x00\x53\x00",
._co_firsttraceable = 0,
};
static
@@ -102046,7 +102085,7 @@ ntpath_toplevel_consts_38 = {
.co_kwonlyargcount = 0,
.co_framesize = 12 + FRAME_SPECIALS_SIZE,
.co_stacksize = 7,
- .co_firstlineno = 601,
+ .co_firstlineno = 614,
.co_nlocalsplus = 5,
.co_nlocals = 5,
.co_ncellvars = 0,
@@ -102301,7 +102340,7 @@ ntpath_toplevel_consts_39 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 643,
+ .co_firstlineno = 656,
.co_nlocalsplus = 6,
.co_nlocals = 6,
.co_ncellvars = 0,
@@ -102655,7 +102694,7 @@ ntpath_toplevel_consts_42 = {
.co_kwonlyargcount = 1,
.co_framesize = 16 + FRAME_SPECIALS_SIZE,
.co_stacksize = 6,
- .co_firstlineno = 692,
+ .co_firstlineno = 705,
.co_nlocalsplus = 10,
.co_nlocals = 10,
.co_ncellvars = 0,
@@ -103186,7 +103225,7 @@ ntpath_toplevel_consts_44 = {
.co_kwonlyargcount = 0,
.co_framesize = 26 + FRAME_SPECIALS_SIZE,
.co_stacksize = 7,
- .co_firstlineno = 758,
+ .co_firstlineno = 771,
.co_nlocalsplus = 19,
.co_nlocals = 19,
.co_ncellvars = 0,
@@ -103541,7 +103580,7 @@ ntpath_toplevel_consts_45 = {
.co_kwonlyargcount = 0,
.co_framesize = 28 + FRAME_SPECIALS_SIZE,
.co_stacksize = 10,
- .co_firstlineno = 814,
+ .co_firstlineno = 827,
.co_nlocalsplus = 18,
.co_nlocals = 18,
.co_ncellvars = 0,
@@ -103877,7 +103916,7 @@ ntpath_toplevel_consts_51 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 884,
+ .co_firstlineno = 897,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -103929,7 +103968,7 @@ ntpath_toplevel_consts_52 = {
.co_kwonlyargcount = 0,
.co_framesize = 1 + FRAME_SPECIALS_SIZE,
.co_stacksize = 0,
- .co_firstlineno = 879,
+ .co_firstlineno = 892,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -103997,8 +104036,8 @@ ntpath_toplevel_consts = {
& ntpath_toplevel_consts_31.ob_base.ob_base,
& ntpath_toplevel_consts_32._object.ob_base.ob_base,
& ntpath_toplevel_consts_33.ob_base.ob_base,
- & ntpath_toplevel_consts_34.ob_base.ob_base,
- & ntpath_toplevel_consts_35._object.ob_base.ob_base,
+ & ntpath_toplevel_consts_34._object.ob_base.ob_base,
+ & ntpath_toplevel_consts_35.ob_base.ob_base,
& ntpath_toplevel_consts_36.ob_base.ob_base,
& ntpath_toplevel_consts_37._object.ob_base.ob_base,
& ntpath_toplevel_consts_38.ob_base.ob_base,
@@ -104069,7 +104108,7 @@ static
PyGC_Head _gc_head;
struct {
PyObject_VAR_HEAD
- PyObject *ob_item[66];
+ PyObject *ob_item[65];
}_object;
}
ntpath_toplevel_names = {
@@ -104079,7 +104118,7 @@ ntpath_toplevel_names = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyTuple_Type,
},
- .ob_size = 66,
+ .ob_size = 65,
},
.ob_item = {
&_Py_ID(__doc__),
@@ -104126,7 +104165,6 @@ ntpath_toplevel_names = {
& const_str_expandvars._ascii.ob_base,
& const_str__path_normpath._ascii.ob_base,
& const_str_normpath._ascii.ob_base,
- & const_str__abspath_fallback._ascii.ob_base,
& const_str__getfullpathname._ascii.ob_base,
& const_str_abspath._ascii.ob_base,
& const_str__getfinalpathname._ascii.ob_base,
@@ -104155,7 +104193,7 @@ static
struct {
PyObject_VAR_HEAD
Py_hash_t ob_shash;
- char ob_sval[488];
+ char ob_sval[484];
}
ntpath_toplevel_linetable = {
.ob_base = {
@@ -104163,10 +104201,10 @@ ntpath_toplevel_linetable = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyBytes_Type,
},
- .ob_size = 487,
+ .ob_size = 483,
},
.ob_shash = -1,
- .ob_sval = "\xf0\x03\x01\x01\x01\xf1\x04\x04\x01\x04\xf0\x12\x00\x0a\x0d\x80\x06\xd8\x09\x0d\x80\x06\xd8\x09\x0c\x80\x06\xd8\x06\x0a\x80\x03\xd8\x0a\x0d\x80\x07\xd8\x09\x0c\x80\x06\xd8\x0a\x15\x80\x07\xd8\x0a\x0f\x80\x07\xe3\x00\x09\xdb\x00\x0a\xdb\x00\x0b\xdb\x00\x12\xdc\x00\x19\xf2\x06\x06\x0b\x4f\x01\x80\x07\xf2\x10\x04\x01\x15\xf0\x14\x21\x01\x2c\xf7\x02\x03\x05\x2d\xf1\x00\x03\x05\x2d\xf2\x0a\x11\x05\x38\xf2\x48\x01\x10\x01\x11\xf2\x28\x2b\x01\x0e\xf2\x62\x01\x14\x01\x1e\xf2\x2e\x31\x01\x1f\xf2\x72\x01\x0d\x01\x2b\xf2\x2a\x05\x01\x38\xf0\x0c\x00\x14\x1f\xd7\x13\x28\xd1\x13\x28\xd7\x13\x30\xd1\x13\x30\x80\x08\xd4\x00\x10\xf2\x0a\x02\x01\x17\xf2\x0e\x02\x01\x17\xf1\x0e\x00\x04\x0b\x88\x32\x8f\x3e\x89\x3e\xd0\x1b\x2b\xd4\x03\x2c\xf3\x02\x06\x05\x4a\x01\xf2\x10\x03\x05\x15\xf2\x10\x06\x01\x10\xf0\x24\x03\x01\x1e\xdd\x04\x25\xf2\x06\x11\x01\x15\xf2\x3a\x2d\x01\x1f\xf2\x7a\x01\x6a\x01\x01\x0f\xf0\x60\x03\x26\x01\x28\xdd\x04\x2d\xf2\x50\x01\x0e\x01\x1a\xf0\x22\x0c\x01\x2b\xdd\x04\x23\xf2\x0c\x05\x05\x2b\xf0\x0e\x5d\x02\x01\x14\xdf\x04\x3e\xf2\x0a\x28\x05\x14\xf2\x54\x01\x2f\x05\x14\xf0\x62\x01\x00\x22\x27\xf4\x00\x3c\x05\x14\xf0\x40\x02\x00\x1e\x22\xd0\x00\x1a\xf3\x04\x2b\x01\x0e\xf2\x70\x01\x2e\x01\x0e\xf0\x62\x01\x0a\x01\x09\xf5\x08\x00\x05\x28\xdd\x04\x29\xdd\x04\x29\xdd\x04\x29\xf0\x0c\x0d\x01\x19\xdd\x04\x23\xf3\x0e\x05\x05\x19\xf8\xf0\x5f\x19\x00\x08\x13\xf2\x00\x09\x01\x2c\xf4\x02\x08\x05\x2c\xf0\x03\x09\x01\x2c\xfb\xf0\x74\x07\x00\x08\x13\xf2\x00\x01\x01\x1e\xd8\x19\x1d\xd2\x04\x16\xf0\x03\x01\x01\x1e\xfb\xf0\x5e\x06\x00\x08\x13\xf2\x00\x23\x01\x28\xf4\x02\x22\x05\x28\xf0\x03\x23\x01\x28\xfb\xf0\x74\x01\x00\x08\x13\xf2\x00\x01\x01\x20\xd8\x0e\x1f\x82\x47\xf0\x03\x01\x01\x20\xfb\xf0\x1a\x00\x08\x13\xf2\x00\x02\x01\x17\xe0\x0f\x16\x82\x48\xf0\x05\x02\x01\x17\xfb\xf0\x64\x08\x00\x08\x13\xf2\x00\x02\x01\x09\xe1\x04\x08\xf0\x05\x02\x01\x09\xfb\xf0\x0e\x00\x08\x13\xf2\x00\x04\x01\x15\xf4\x02\x03\x05\x15\xf0\x03\x04\x01\x15\xfa",
+ .ob_sval = "\xf0\x03\x01\x01\x01\xf1\x04\x04\x01\x04\xf0\x12\x00\x0a\x0d\x80\x06\xd8\x09\x0d\x80\x06\xd8\x09\x0c\x80\x06\xd8\x06\x0a\x80\x03\xd8\x0a\x0d\x80\x07\xd8\x09\x0c\x80\x06\xd8\x0a\x15\x80\x07\xd8\x0a\x0f\x80\x07\xe3\x00\x09\xdb\x00\x0a\xdb\x00\x0b\xdb\x00\x12\xdc\x00\x19\xf2\x06\x06\x0b\x4f\x01\x80\x07\xf2\x10\x04\x01\x15\xf0\x14\x21\x01\x2c\xf7\x02\x03\x05\x2d\xf1\x00\x03\x05\x2d\xf2\x0a\x11\x05\x38\xf2\x48\x01\x10\x01\x11\xf2\x28\x2b\x01\x0e\xf2\x62\x01\x14\x01\x1e\xf2\x2e\x31\x01\x1f\xf2\x72\x01\x0d\x01\x2b\xf2\x2a\x05\x01\x38\xf0\x0c\x00\x14\x1f\xd7\x13\x28\xd1\x13\x28\xd7\x13\x30\xd1\x13\x30\x80\x08\xd4\x00\x10\xf2\x0a\x02\x01\x17\xf2\x0e\x02\x01\x17\xf1\x0e\x00\x04\x0b\x88\x32\x8f\x3e\x89\x3e\xd0\x1b\x2b\xd4\x03\x2c\xf3\x02\x06\x05\x4a\x01\xf2\x10\x03\x05\x15\xf2\x10\x06\x01\x10\xf0\x24\x03\x01\x1e\xdd\x04\x25\xf2\x06\x11\x01\x15\xf2\x3a\x2d\x01\x1f\xf2\x7a\x01\x6a\x01\x01\x0f\xf0\x60\x03\x26\x01\x28\xdd\x04\x2d\xf0\x52\x01\x29\x01\x1e\xdd\x04\x23\xf2\x1e\x19\x05\x1e\xf0\x36\x5d\x02\x01\x14\xdf\x04\x3e\xf2\x0a\x28\x05\x14\xf2\x54\x01\x2f\x05\x14\xf0\x62\x01\x00\x22\x27\xf4\x00\x3c\x05\x14\xf0\x40\x02\x00\x1e\x22\xd0\x00\x1a\xf3\x04\x2b\x01\x0e\xf2\x70\x01\x2e\x01\x0e\xf0\x62\x01\x0a\x01\x09\xf5\x08\x00\x05\x28\xdd\x04\x29\xdd\x04\x29\xdd\x04\x29\xf0\x0c\x0d\x01\x19\xdd\x04\x23\xf3\x0e\x05\x05\x19\xf8\xf0\x79\x19\x00\x08\x13\xf2\x00\x09\x01\x2c\xf4\x02\x08\x05\x2c\xf0\x03\x09\x01\x2c\xfb\xf0\x74\x07\x00\x08\x13\xf2\x00\x01\x01\x1e\xd8\x19\x1d\xd2\x04\x16\xf0\x03\x01\x01\x1e\xfb\xf0\x5e\x06\x00\x08\x13\xf2\x00\x23\x01\x28\xf4\x02\x22\x05\x28\xf0\x03\x23\x01\x28\xfb\xf0\x54\x01\x00\x08\x13\xf2\x00\x0a\x01\x1e\xf4\x02\x09\x05\x1e\xf0\x03\x0a\x01\x1e\xfb\xf0\x54\x01\x00\x08\x13\xf2\x00\x02\x01\x17\xe0\x0f\x16\x82\x48\xf0\x05\x02\x01\x17\xfb\xf0\x64\x08\x00\x08\x13\xf2\x00\x02\x01\x09\xe1\x04\x08\xf0\x05\x02\x01\x09\xfb\xf0\x0e\x00\x08\x13\xf2\x00\x04\x01\x15\xf4\x02\x03\x05\x15\xf0\x03\x04\x01\x15\xfa",
};
static
struct {
@@ -104183,17 +104221,17 @@ ntpath_toplevel_exceptiontable = {
.ob_size = 125,
},
.ob_shash = -1,
- .ob_sval = "\xb0\x0d\x43\x33\x00\xc2\x0e\x06\x44\x01\x00\xc2\x1e\x06\x44\x0e\x00\xc2\x28\x06\x44\x1c\x00\xc2\x32\x08\x44\x29\x00\xc3\x10\x18\x44\x36\x00\xc3\x29\x06\x45\x01\x00\xc3\x33\x08\x43\x3e\x03\xc3\x3d\x01\x43\x3e\x03\xc4\x01\x07\x44\x0b\x03\xc4\x0a\x01\x44\x0b\x03\xc4\x0e\x08\x44\x19\x03\xc4\x18\x01\x44\x19\x03\xc4\x1c\x07\x44\x26\x03\xc4\x25\x01\x44\x26\x03\xc4\x29\x07\x44\x33\x03\xc4\x32\x01\x44\x33\x03\xc4\x36\x05\x44\x3e\x03\xc4\x3d\x01\x44\x3e\x03\xc5\x01\x08\x45\x0c\x03\xc5\x0b\x01\x45\x0c\x03",
+ .ob_sval = "\xb0\x0d\x43\x30\x00\xc2\x0e\x06\x43\x3e\x00\xc2\x1e\x06\x44\x0b\x00\xc2\x25\x06\x44\x19\x00\xc2\x2f\x08\x44\x27\x00\xc3\x0d\x18\x44\x34\x00\xc3\x26\x06\x44\x3f\x00\xc3\x30\x08\x43\x3b\x03\xc3\x3a\x01\x43\x3b\x03\xc3\x3e\x07\x44\x08\x03\xc4\x07\x01\x44\x08\x03\xc4\x0b\x08\x44\x16\x03\xc4\x15\x01\x44\x16\x03\xc4\x19\x08\x44\x24\x03\xc4\x23\x01\x44\x24\x03\xc4\x27\x07\x44\x31\x03\xc4\x30\x01\x44\x31\x03\xc4\x34\x05\x44\x3c\x03\xc4\x3b\x01\x44\x3c\x03\xc4\x3f\x08\x45\x0a\x03\xc5\x09\x01\x45\x0a\x03",
};
static
- struct _PyCode_DEF(670)
+ struct _PyCode_DEF(666)
ntpath_toplevel = {
.ob_base = {
.ob_base = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyCode_Type,
},
- .ob_size = 335,
+ .ob_size = 333,
},
.co_consts = & ntpath_toplevel_consts._object.ob_base.ob_base,
.co_names = & ntpath_toplevel_names._object.ob_base.ob_base,
@@ -104217,7 +104255,7 @@ ntpath_toplevel = {
.co_qualname = &_Py_STR(anon_module),
.co_linetable = & ntpath_toplevel_linetable.ob_base.ob_base,
._co_cached = NULL,
- .co_code_adaptive = "\x97\x00\x64\x00\x5a\x00\x64\x01\x5a\x01\x64\x02\x5a\x02\x64\x01\x5a\x03\x64\x03\x5a\x04\x64\x04\x5a\x05\x64\x05\x5a\x06\x64\x06\x5a\x07\x64\x07\x5a\x08\x64\x08\x64\x09\x6c\x09\x5a\x09\x64\x08\x64\x09\x6c\x0a\x5a\x0a\x64\x08\x64\x09\x6c\x0b\x5a\x0b\x64\x08\x64\x09\x6c\x0c\x5a\x0c\x64\x08\x64\x0a\x6c\x0c\xad\x02\x01\x00\x67\x00\x64\x0b\xa2\x01\x5a\x0d\x64\x0c\x84\x00\x5a\x0e\x09\x00\x64\x08\x64\x0d\x6c\x0f\x6d\x10\x5a\x11\x6d\x12\x5a\x13\x6d\x14\x5a\x15\x01\x00\x64\x0e\x84\x00\x5a\x16\x64\x10\x84\x00\x5a\x18\x64\x11\x84\x00\x5a\x19\x64\x12\x84\x00\x5a\x1a\x64\x13\x84\x00\x5a\x1b\x64\x14\x84\x00\x5a\x1c\x64\x15\x84\x00\x5a\x1d\x65\x0c\x6a\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x1d\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x16\x84\x00\x5a\x1f\x64\x17\x84\x00\x5a\x20\x02\x00\x65\x21\x65\x09\x6a\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x18\xab\x02\x00\x00\x00\x00\x00\x00\x72\x04\x64\x19\x84\x00\x5a\x23\x6e\x03\x64\x1a\x84\x00\x5a\x23\x64\x1b\x84\x00\x5a\x24\x09\x00\x64\x08\x64\x1c\x6c\x25\x6d\x26\x5a\x26\x01\x00\x64\x1d\x84\x00\x5a\x27\x64\x1e\x84\x00\x5a\x28\x64\x1f\x84\x00\x5a\x29\x09\x00\x64\x08\x64\x20\x6c\x25\x6d\x2a\x5a\x2b\x01\x00\x64\x22\x84\x00\x5a\x2c\x09\x00\x64\x08\x64\x23\x6c\x25\x6d\x2d\x5a\x2d\x01\x00\x64\x24\x84\x00\x5a\x2e\x09\x00\x64\x08\x64\x25\x6c\x25\x6d\x2f\x5a\x2f\x6d\x30\x5a\x31\x01\x00\x64\x26\x84\x00\x5a\x32\x64\x27\x84\x00\x5a\x33\x64\x28\x64\x29\x9c\x01\x64\x2a\x84\x02\x5a\x34\x64\x2b\x5a\x35\x64\x35\x64\x2c\x84\x01\x5a\x36\x64\x2d\x84\x00\x5a\x37\x09\x00\x64\x08\x64\x2e\x6c\x25\x6d\x38\x5a\x39\x01\x00\x64\x08\x64\x2f\x6c\x25\x6d\x3a\x5a\x3b\x01\x00\x64\x08\x64\x30\x6c\x25\x6d\x3c\x5a\x3d\x01\x00\x64\x08\x64\x31\x6c\x25\x6d\x3e\x5a\x3f\x01\x00\x09\x00\x64\x08\x64\x32\x6c\x25\x6d\x40\x5a\x40\x01\x00\x64\x33\x84\x00\x5a\x41\x79\x09\x23\x00\x65\x17\x24\x00\x72\x06\x01\x00\x64\x0f\x84\x00\x5a\x16\x59\x00\x8c\xc0\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x05\x01\x00\x64\x09\x5a\x26\x59\x00\x8c\x76\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x06\x01\x00\x64\x21\x84\x00\x5a\x2b\x59\x00\x8c\x74\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x05\x01\x00\x65\x2c\x5a\x2e\x59\x00\x8c\x74\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x05\x01\x00\x65\x2e\x5a\x34\x59\x00\x8c\x6c\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x03\x01\x00\x59\x00\x8c\x55\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x06\x01\x00\x64\x34\x84\x00\x5a\x41\x59\x00\x79\x09\x77\x00\x78\x03\x59\x00\x77\x01",
+ .co_code_adaptive = "\x97\x00\x64\x00\x5a\x00\x64\x01\x5a\x01\x64\x02\x5a\x02\x64\x01\x5a\x03\x64\x03\x5a\x04\x64\x04\x5a\x05\x64\x05\x5a\x06\x64\x06\x5a\x07\x64\x07\x5a\x08\x64\x08\x64\x09\x6c\x09\x5a\x09\x64\x08\x64\x09\x6c\x0a\x5a\x0a\x64\x08\x64\x09\x6c\x0b\x5a\x0b\x64\x08\x64\x09\x6c\x0c\x5a\x0c\x64\x08\x64\x0a\x6c\x0c\xad\x02\x01\x00\x67\x00\x64\x0b\xa2\x01\x5a\x0d\x64\x0c\x84\x00\x5a\x0e\x09\x00\x64\x08\x64\x0d\x6c\x0f\x6d\x10\x5a\x11\x6d\x12\x5a\x13\x6d\x14\x5a\x15\x01\x00\x64\x0e\x84\x00\x5a\x16\x64\x10\x84\x00\x5a\x18\x64\x11\x84\x00\x5a\x19\x64\x12\x84\x00\x5a\x1a\x64\x13\x84\x00\x5a\x1b\x64\x14\x84\x00\x5a\x1c\x64\x15\x84\x00\x5a\x1d\x65\x0c\x6a\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x1d\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x16\x84\x00\x5a\x1f\x64\x17\x84\x00\x5a\x20\x02\x00\x65\x21\x65\x09\x6a\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x18\xab\x02\x00\x00\x00\x00\x00\x00\x72\x04\x64\x19\x84\x00\x5a\x23\x6e\x03\x64\x1a\x84\x00\x5a\x23\x64\x1b\x84\x00\x5a\x24\x09\x00\x64\x08\x64\x1c\x6c\x25\x6d\x26\x5a\x26\x01\x00\x64\x1d\x84\x00\x5a\x27\x64\x1e\x84\x00\x5a\x28\x64\x1f\x84\x00\x5a\x29\x09\x00\x64\x08\x64\x20\x6c\x25\x6d\x2a\x5a\x2b\x01\x00\x09\x00\x64\x08\x64\x22\x6c\x25\x6d\x2c\x5a\x2c\x01\x00\x64\x23\x84\x00\x5a\x2d\x09\x00\x64\x08\x64\x25\x6c\x25\x6d\x2e\x5a\x2e\x6d\x2f\x5a\x30\x01\x00\x64\x26\x84\x00\x5a\x31\x64\x27\x84\x00\x5a\x32\x64\x28\x64\x29\x9c\x01\x64\x2a\x84\x02\x5a\x33\x64\x2b\x5a\x34\x64\x35\x64\x2c\x84\x01\x5a\x35\x64\x2d\x84\x00\x5a\x36\x09\x00\x64\x08\x64\x2e\x6c\x25\x6d\x37\x5a\x38\x01\x00\x64\x08\x64\x2f\x6c\x25\x6d\x39\x5a\x3a\x01\x00\x64\x08\x64\x30\x6c\x25\x6d\x3b\x5a\x3c\x01\x00\x64\x08\x64\x31\x6c\x25\x6d\x3d\x5a\x3e\x01\x00\x09\x00\x64\x08\x64\x32\x6c\x25\x6d\x3f\x5a\x3f\x01\x00\x64\x33\x84\x00\x5a\x40\x79\x09\x23\x00\x65\x17\x24\x00\x72\x06\x01\x00\x64\x0f\x84\x00\x5a\x16\x59\x00\x8c\xbd\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x05\x01\x00\x64\x09\x5a\x26\x59\x00\x8c\x73\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x06\x01\x00\x64\x21\x84\x00\x5a\x2b\x59\x00\x8c\x71\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x06\x01\x00\x64\x24\x84\x00\x5a\x2d\x59\x00\x8c\x75\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x05\x01\x00\x65\x2d\x5a\x33\x59\x00\x8c\x6d\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x03\x01\x00\x59\x00\x8c\x56\x77\x00\x78\x03\x59\x00\x77\x01\x23\x00\x65\x17\x24\x00\x72\x06\x01\x00\x64\x34\x84\x00\x5a\x40\x59\x00\x79\x09\x77\x00\x78\x03\x59\x00\x77\x01",
._co_firsttraceable = 0,
};
@@ -107059,7 +107097,7 @@ posixpath_toplevel_consts_28 = {
.ob_size = 113,
},
.co_consts = & posixpath_toplevel_consts_28_consts._object.ob_base.ob_base,
- .co_names = & ntpath_toplevel_consts_34_names._object.ob_base.ob_base,
+ .co_names = & ntpath_toplevel_consts_36_names._object.ob_base.ob_base,
.co_exceptiontable = (PyObject *)&_Py_SINGLETON(bytes_empty),
.co_flags = 3,
.co_argcount = 1,
@@ -107073,7 +107111,7 @@ posixpath_toplevel_consts_28 = {
.co_ncellvars = 0,
.co_nfreevars = 0,
.co_version = 592,
- .co_localsplusnames = & ntpath_toplevel_consts_34_localsplusnames._object.ob_base.ob_base,
+ .co_localsplusnames = & ntpath_toplevel_consts_36_localsplusnames._object.ob_base.ob_base,
.co_localspluskinds = & importlib__bootstrap_toplevel_consts_14_consts_2_localspluskinds.ob_base.ob_base,
.co_filename = & posixpath_toplevel_consts_11_filename._ascii.ob_base,
.co_name = & const_str_abspath._ascii.ob_base,
@@ -127498,7 +127536,7 @@ const_str_credits = {
static
struct {
PyASCIIObject _ascii;
- uint8_t _data[159];
+ uint8_t _data[192];
}
site_toplevel_consts_19_consts_3 = {
._ascii = {
@@ -127506,7 +127544,7 @@ site_toplevel_consts_19_consts_3 = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyUnicode_Type,
},
- .length = 158,
+ .length = 191,
.hash = -1,
.state = {
.kind = 1,
@@ -127515,7 +127553,7 @@ site_toplevel_consts_19_consts_3 = {
.statically_allocated = 1,
},
},
- ._data = "\x20\x20\x20\x20\x54\x68\x61\x6e\x6b\x73\x20\x74\x6f\x20\x43\x57\x49\x2c\x20\x43\x4e\x52\x49\x2c\x20\x42\x65\x4f\x70\x65\x6e\x2e\x63\x6f\x6d\x2c\x20\x5a\x6f\x70\x65\x20\x43\x6f\x72\x70\x6f\x72\x61\x74\x69\x6f\x6e\x20\x61\x6e\x64\x20\x61\x20\x63\x61\x73\x74\x20\x6f\x66\x20\x74\x68\x6f\x75\x73\x61\x6e\x64\x73\x0a\x20\x20\x20\x20\x66\x6f\x72\x20\x73\x75\x70\x70\x6f\x72\x74\x69\x6e\x67\x20\x50\x79\x74\x68\x6f\x6e\x20\x64\x65\x76\x65\x6c\x6f\x70\x6d\x65\x6e\x74\x2e\x20\x20\x53\x65\x65\x20\x77\x77\x77\x2e\x70\x79\x74\x68\x6f\x6e\x2e\x6f\x72\x67\x20\x66\x6f\x72\x20\x6d\x6f\x72\x65\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\x2e",
+ ._data = "\x20\x20\x20\x20\x54\x68\x61\x6e\x6b\x73\x20\x74\x6f\x20\x43\x57\x49\x2c\x20\x43\x4e\x52\x49\x2c\x20\x42\x65\x4f\x70\x65\x6e\x2c\x20\x5a\x6f\x70\x65\x20\x43\x6f\x72\x70\x6f\x72\x61\x74\x69\x6f\x6e\x2c\x20\x74\x68\x65\x20\x50\x79\x74\x68\x6f\x6e\x20\x53\x6f\x66\x74\x77\x61\x72\x65\x0a\x20\x20\x20\x20\x46\x6f\x75\x6e\x64\x61\x74\x69\x6f\x6e\x2c\x20\x61\x6e\x64\x20\x61\x20\x63\x61\x73\x74\x20\x6f\x66\x20\x74\x68\x6f\x75\x73\x61\x6e\x64\x73\x20\x66\x6f\x72\x20\x73\x75\x70\x70\x6f\x72\x74\x69\x6e\x67\x20\x50\x79\x74\x68\x6f\x6e\x0a\x20\x20\x20\x20\x64\x65\x76\x65\x6c\x6f\x70\x6d\x65\x6e\x74\x2e\x20\x20\x53\x65\x65\x20\x77\x77\x77\x2e\x70\x79\x74\x68\x6f\x6e\x2e\x6f\x72\x67\x20\x66\x6f\x72\x20\x6d\x6f\x72\x65\x20\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\x2e",
};
static
struct {
@@ -127701,7 +127739,7 @@ static
struct {
PyObject_VAR_HEAD
Py_hash_t ob_shash;
- char ob_sval[209];
+ char ob_sval[207];
}
site_toplevel_consts_19_linetable = {
.ob_base = {
@@ -127709,10 +127747,10 @@ site_toplevel_consts_19_linetable = {
.ob_refcnt = _Py_IMMORTAL_REFCNT,
.ob_type = &PyBytes_Type,
},
- .ob_size = 208,
+ .ob_size = 206,
},
.ob_shash = -1,
- .ob_sval = "\x80\x00\xe4\x19\x26\xd7\x19\x2f\xd1\x19\x2f\xb0\x0b\xbc\x53\xbf\x5d\xb9\x5d\xd3\x19\x4b\x84\x48\xd4\x04\x16\xdc\x17\x24\xd7\x17\x2d\xd1\x17\x2d\xa8\x69\xf0\x00\x02\x3a\x54\x01\xf3\x00\x02\x18\x55\x01\x84\x48\xd4\x04\x14\xf0\x06\x00\x13\x15\x90\x62\x88\x34\x80\x45\xf4\x06\x00\x0c\x13\x94\x33\x98\x0d\xa0\x74\xd3\x0b\x2c\x80\x44\xd9\x0b\x0f\x94\x47\x9c\x42\xa0\x0a\xd4\x14\x2b\xdc\x0f\x11\x8f\x77\x89\x77\x8f\x7f\x89\x7f\x9c\x72\x9f\x7b\x99\x7b\xd3\x0f\x2b\x88\x04\xd9\x07\x0b\xd8\x08\x0d\x8f\x0c\x89\x0c\x90\x6d\xa0\x59\xd0\x15\x2f\xd4\x08\x30\xd8\x08\x0c\x8f\x0b\x89\x0b\x94\x52\x97\x57\x91\x57\x97\x5c\x91\x5c\xa0\x24\xac\x02\xaf\x09\xa9\x09\xd3\x15\x32\xb0\x44\xbc\x22\xbf\x29\xb9\x29\xd0\x14\x44\xd4\x08\x45\xdc\x17\x24\xd7\x17\x2d\xd1\x17\x2d\xd8\x08\x11\xd8\x08\x31\xd8\x08\x0d\x88\x74\xf3\x07\x03\x18\x15\x84\x48\xd5\x04\x14",
+ .ob_sval = "\x80\x00\xe4\x19\x26\xd7\x19\x2f\xd1\x19\x2f\xb0\x0b\xbc\x53\xbf\x5d\xb9\x5d\xd3\x19\x4b\x84\x48\xd4\x04\x16\xdc\x17\x24\xd7\x17\x2d\xd1\x17\x2d\xa8\x69\xf0\x00\x03\x3a\x3e\xf3\x00\x03\x18\x3f\x84\x48\xd4\x04\x14\xf0\x08\x00\x13\x15\x90\x62\x88\x34\x80\x45\xf4\x06\x00\x0c\x13\x94\x33\x98\x0d\xa0\x74\xd3\x0b\x2c\x80\x44\xd9\x0b\x0f\x94\x47\x9c\x42\xa0\x0a\xd4\x14\x2b\xdc\x0f\x11\x8f\x77\x89\x77\x8f\x7f\x89\x7f\x9c\x72\x9f\x7b\x99\x7b\xd3\x0f\x2b\x88\x04\xd9\x07\x0b\xd8\x08\x0d\x8f\x0c\x89\x0c\x90\x6d\xa0\x59\xd0\x15\x2f\xd4\x08\x30\xd8\x08\x0c\x8f\x0b\x89\x0b\x94\x52\x97\x57\x91\x57\x97\x5c\x91\x5c\xa0\x24\xac\x02\xaf\x09\xa9\x09\xd3\x15\x32\xb0\x44\xbc\x22\xbf\x29\xb9\x29\xd0\x14\x44\xd4\x08\x45\xdc\x17\x24\xd7\x17\x2d\xd1\x17\x2d\xd8\x08\x11\xd8\x08\x31\xd8\x08\x0d\x88\x74\xf3\x07\x03\x18\x15\x84\x48\xd5\x04\x14",
};
static
struct {
@@ -127878,7 +127916,7 @@ site_toplevel_consts_20 = {
.co_kwonlyargcount = 0,
.co_framesize = 2 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 446,
+ .co_firstlineno = 447,
.co_nlocalsplus = 0,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -128208,7 +128246,7 @@ site_toplevel_consts_21_consts_1_consts_9 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 496,
+ .co_firstlineno = 497,
.co_nlocalsplus = 2,
.co_nlocals = 0,
.co_ncellvars = 0,
@@ -128586,7 +128624,7 @@ site_toplevel_consts_21_consts_1 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 5,
- .co_firstlineno = 458,
+ .co_firstlineno = 459,
.co_nlocalsplus = 6,
.co_nlocals = 4,
.co_ncellvars = 2,
@@ -128751,7 +128789,7 @@ site_toplevel_consts_21 = {
.co_kwonlyargcount = 0,
.co_framesize = 3 + FRAME_SPECIALS_SIZE,
.co_stacksize = 2,
- .co_firstlineno = 449,
+ .co_firstlineno = 450,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -128938,7 +128976,7 @@ site_toplevel_consts_22_consts_4 = {
.co_kwonlyargcount = 0,
.co_framesize = 6 + FRAME_SPECIALS_SIZE,
.co_stacksize = 4,
- .co_firstlineno = 521,
+ .co_firstlineno = 522,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -129405,7 +129443,7 @@ site_toplevel_consts_22 = {
.co_kwonlyargcount = 0,
.co_framesize = 22 + FRAME_SPECIALS_SIZE,
.co_stacksize = 8,
- .co_firstlineno = 508,
+ .co_firstlineno = 509,
.co_nlocalsplus = 14,
.co_nlocals = 14,
.co_ncellvars = 0,
@@ -129670,7 +129708,7 @@ site_toplevel_consts_23 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 8,
- .co_firstlineno = 563,
+ .co_firstlineno = 564,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -129879,7 +129917,7 @@ site_toplevel_consts_24 = {
.co_kwonlyargcount = 0,
.co_framesize = 11 + FRAME_SPECIALS_SIZE,
.co_stacksize = 8,
- .co_firstlineno = 583,
+ .co_firstlineno = 584,
.co_nlocalsplus = 3,
.co_nlocals = 3,
.co_ncellvars = 0,
@@ -130103,7 +130141,7 @@ site_toplevel_consts_25 = {
.co_kwonlyargcount = 0,
.co_framesize = 5 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 603,
+ .co_firstlineno = 604,
.co_nlocalsplus = 2,
.co_nlocals = 2,
.co_ncellvars = 0,
@@ -130313,7 +130351,7 @@ site_toplevel_consts_26_consts_7 = {
.co_kwonlyargcount = 0,
.co_framesize = 4 + FRAME_SPECIALS_SIZE,
.co_stacksize = 3,
- .co_firstlineno = 660,
+ .co_firstlineno = 661,
.co_nlocalsplus = 1,
.co_nlocals = 1,
.co_ncellvars = 0,
@@ -130670,7 +130708,7 @@ site_toplevel_consts_26 = {
.co_kwonlyargcount = 0,
.co_framesize = 16 + FRAME_SPECIALS_SIZE,
.co_stacksize = 8,
- .co_firstlineno = 637,
+ .co_firstlineno = 638,
.co_nlocalsplus = 8,
.co_nlocals = 8,
.co_ncellvars = 0,
@@ -130834,7 +130872,7 @@ site_toplevel_linetable = {
.ob_size = 239,
},
.ob_shash = -1,
- .ob_sval = "\xf0\x03\x01\x01\x01\xf1\x02\x45\x01\x01\x04\xf3\x4e\x02\x00\x01\x0b\xdb\x00\x09\xdb\x00\x0f\xdb\x00\x14\xdb\x00\x09\xdb\x00\x0b\xf0\x06\x00\x0d\x10\x8f\x4a\x89\x4a\x98\x03\x9f\x0f\x99\x0f\xd0\x0b\x28\x80\x08\xf0\x06\x00\x14\x18\xd0\x00\x10\xf0\x0a\x00\x0d\x11\x80\x09\xd8\x0c\x10\x80\x09\xf2\x06\x02\x01\x28\xf2\x0a\x06\x01\x26\xf2\x12\x14\x01\x11\xf2\x2e\x10\x01\x17\xf2\x26\x0a\x01\x0d\xf2\x1a\x3f\x01\x17\xf3\x44\x02\x17\x01\x17\xf2\x34\x16\x01\x10\xf2\x40\x01\x14\x01\x23\xf2\x30\x0a\x01\x4b\x01\xf2\x1a\x0a\x01\x15\xf2\x1a\x0f\x01\x15\xf2\x22\x0d\x01\x17\xf3\x1e\x1f\x01\x18\xf3\x42\x01\x07\x01\x17\xf2\x12\x0d\x01\x37\xf2\x20\x12\x01\x15\xf2\x2a\x01\x01\x2c\xf2\x06\x39\x01\x30\xf2\x76\x01\x34\x01\x17\xf2\x6e\x01\x11\x01\x2f\xf2\x28\x11\x01\x2f\xf2\x28\x1b\x01\x1c\xf0\x3e\x00\x08\x0b\x87\x79\x81\x79\xd7\x07\x18\xd2\x07\x18\xd9\x04\x08\x84\x46\xf2\x04\x34\x01\x15\xf0\x6c\x01\x00\x04\x0c\x88\x7a\xd2\x03\x19\xd9\x04\x0b\x85\x49\xf0\x03\x00\x04\x1a",
+ .ob_sval = "\xf0\x03\x01\x01\x01\xf1\x02\x45\x01\x01\x04\xf3\x4e\x02\x00\x01\x0b\xdb\x00\x09\xdb\x00\x0f\xdb\x00\x14\xdb\x00\x09\xdb\x00\x0b\xf0\x06\x00\x0d\x10\x8f\x4a\x89\x4a\x98\x03\x9f\x0f\x99\x0f\xd0\x0b\x28\x80\x08\xf0\x06\x00\x14\x18\xd0\x00\x10\xf0\x0a\x00\x0d\x11\x80\x09\xd8\x0c\x10\x80\x09\xf2\x06\x02\x01\x28\xf2\x0a\x06\x01\x26\xf2\x12\x14\x01\x11\xf2\x2e\x10\x01\x17\xf2\x26\x0a\x01\x0d\xf2\x1a\x3f\x01\x17\xf3\x44\x02\x17\x01\x17\xf2\x34\x16\x01\x10\xf2\x40\x01\x14\x01\x23\xf2\x30\x0a\x01\x4b\x01\xf2\x1a\x0a\x01\x15\xf2\x1a\x0f\x01\x15\xf2\x22\x0d\x01\x17\xf3\x1e\x1f\x01\x18\xf3\x42\x01\x07\x01\x17\xf2\x12\x0d\x01\x37\xf2\x20\x13\x01\x15\xf2\x2c\x01\x01\x2c\xf2\x06\x39\x01\x30\xf2\x76\x01\x34\x01\x17\xf2\x6e\x01\x11\x01\x2f\xf2\x28\x11\x01\x2f\xf2\x28\x1b\x01\x1c\xf0\x3e\x00\x08\x0b\x87\x79\x81\x79\xd7\x07\x18\xd2\x07\x18\xd9\x04\x08\x84\x46\xf2\x04\x34\x01\x15\xf0\x6c\x01\x00\x04\x0c\x88\x7a\xd2\x03\x19\xd9\x04\x0b\x85\x49\xf0\x03\x00\x04\x1a",
};
static
struct _PyCode_DEF(350)
@@ -144791,7 +144829,7 @@ _Py_Deepfreeze_Fini(void) {
_PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_30);
_PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_31);
_PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_33);
- _PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_34);
+ _PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_35);
_PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_36);
_PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_38);
_PyStaticCode_Fini((PyCodeObject *)&ntpath_toplevel_consts_39);
@@ -146692,7 +146730,7 @@ _Py_Deepfreeze_Init(void) {
if (_PyStaticCode_Init((PyCodeObject *)&ntpath_toplevel_consts_33) < 0) {
return -1;
}
- if (_PyStaticCode_Init((PyCodeObject *)&ntpath_toplevel_consts_34) < 0) {
+ if (_PyStaticCode_Init((PyCodeObject *)&ntpath_toplevel_consts_35) < 0) {
return -1;
}
if (_PyStaticCode_Init((PyCodeObject *)&ntpath_toplevel_consts_36) < 0) {
diff --git a/contrib/tools/python3/Python/frozen_modules/_collections_abc.h b/contrib/tools/python3/Python/frozen_modules/_collections_abc.h
index c30a6104af..5e0263574f 100644
--- a/contrib/tools/python3/Python/frozen_modules/_collections_abc.h
+++ b/contrib/tools/python3/Python/frozen_modules/_collections_abc.h
@@ -2256,7 +2256,7 @@ const unsigned char _Py_M___collections_abc[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
0,0,0,0,0,0,0,68,0,93,10,0,0,92,2,0,
0,125,3,125,4,124,4,124,0,124,3,60,0,0,0,140,
- 12,4,0,121,2,41,3,97,75,1,0,0,32,68,46,117,
+ 12,4,0,121,2,41,3,97,82,1,0,0,32,68,46,117,
112,100,97,116,101,40,91,69,44,32,93,42,42,70,41,32,
45,62,32,78,111,110,101,46,32,32,85,112,100,97,116,101,
32,68,32,102,114,111,109,32,109,97,112,112,105,110,103,47,
@@ -2265,601 +2265,601 @@ const unsigned char _Py_M___collections_abc[] = {
32,69,32,112,114,101,115,101,110,116,32,97,110,100,32,104,
97,115,32,97,32,46,107,101,121,115,40,41,32,109,101,116,
104,111,100,44,32,100,111,101,115,58,32,32,32,32,32,102,
- 111,114,32,107,32,105,110,32,69,58,32,68,91,107,93,32,
- 61,32,69,91,107,93,10,32,32,32,32,32,32,32,32,32,
- 32,32,32,73,102,32,69,32,112,114,101,115,101,110,116,32,
- 97,110,100,32,108,97,99,107,115,32,46,107,101,121,115,40,
- 41,32,109,101,116,104,111,100,44,32,100,111,101,115,58,32,
- 32,32,32,32,102,111,114,32,40,107,44,32,118,41,32,105,
- 110,32,69,58,32,68,91,107,93,32,61,32,118,10,32,32,
- 32,32,32,32,32,32,32,32,32,32,73,110,32,101,105,116,
- 104,101,114,32,99,97,115,101,44,32,116,104,105,115,32,105,
- 115,32,102,111,108,108,111,119,101,100,32,98,121,58,32,102,
- 111,114,32,107,44,32,118,32,105,110,32,70,46,105,116,101,
- 109,115,40,41,58,32,68,91,107,93,32,61,32,118,10,32,
- 32,32,32,32,32,32,32,114,75,1,0,0,78,41,5,114,
- 177,0,0,0,114,27,0,0,0,218,7,104,97,115,97,116,
- 116,114,114,75,1,0,0,114,77,1,0,0,41,5,114,61,
- 0,0,0,114,235,0,0,0,114,227,0,0,0,114,66,1,
- 0,0,114,87,0,0,0,115,5,0,0,0,32,32,32,32,
- 32,114,9,0,0,0,218,6,117,112,100,97,116,101,122,21,
- 77,117,116,97,98,108,101,77,97,112,112,105,110,103,46,117,
- 112,100,97,116,101,206,3,0,0,115,130,0,0,0,128,0,
- 244,12,0,12,22,144,101,156,87,212,11,37,219,23,28,144,
- 3,216,28,33,160,35,153,74,144,4,144,83,146,9,241,3,
- 0,24,29,228,13,20,144,85,152,70,212,13,35,216,23,28,
- 151,122,145,122,150,124,144,3,216,28,33,160,35,153,74,144,
- 4,144,83,146,9,241,3,0,24,36,243,6,0,31,36,145,
- 10,144,3,144,85,216,28,33,144,4,144,83,146,9,240,3,
- 0,31,36,224,26,30,159,42,153,42,158,44,137,74,136,67,
- 144,21,216,24,29,136,68,144,19,138,73,241,3,0,27,39,
- 114,8,0,0,0,78,99,3,0,0,0,0,0,0,0,0,
- 0,0,0,4,0,0,0,3,0,0,0,243,56,0,0,0,
- 151,0,9,0,124,0,124,1,25,0,0,0,83,0,35,0,
- 116,0,0,0,0,0,0,0,0,0,36,0,114,9,1,0,
- 124,2,124,0,124,1,60,0,0,0,89,0,124,2,83,0,
- 119,0,120,3,89,0,119,1,41,1,122,64,68,46,115,101,
- 116,100,101,102,97,117,108,116,40,107,91,44,100,93,41,32,
- 45,62,32,68,46,103,101,116,40,107,44,100,41,44,32,97,
- 108,115,111,32,115,101,116,32,68,91,107,93,61,100,32,105,
- 102,32,107,32,110,111,116,32,105,110,32,68,114,64,1,0,
- 0,114,69,1,0,0,115,3,0,0,0,32,32,32,114,9,
- 0,0,0,218,10,115,101,116,100,101,102,97,117,108,116,122,
- 25,77,117,116,97,98,108,101,77,97,112,112,105,110,103,46,
- 115,101,116,100,101,102,97,117,108,116,224,3,0,0,115,46,
- 0,0,0,128,0,240,4,3,9,32,216,19,23,152,3,145,
- 57,208,12,28,248,220,15,23,242,0,1,9,32,216,24,31,
- 136,68,144,19,138,73,216,15,22,136,14,240,5,1,9,32,
- 250,115,12,0,0,0,130,4,7,0,135,14,25,3,152,1,
- 25,3,41,1,114,7,0,0,0,114,6,0,0,0,41,15,
+ 111,114,32,107,32,105,110,32,69,46,107,101,121,115,40,41,
+ 58,32,68,91,107,93,32,61,32,69,91,107,93,10,32,32,
+ 32,32,32,32,32,32,32,32,32,32,73,102,32,69,32,112,
+ 114,101,115,101,110,116,32,97,110,100,32,108,97,99,107,115,
+ 32,46,107,101,121,115,40,41,32,109,101,116,104,111,100,44,
+ 32,100,111,101,115,58,32,32,32,32,32,102,111,114,32,40,
+ 107,44,32,118,41,32,105,110,32,69,58,32,68,91,107,93,
+ 32,61,32,118,10,32,32,32,32,32,32,32,32,32,32,32,
+ 32,73,110,32,101,105,116,104,101,114,32,99,97,115,101,44,
+ 32,116,104,105,115,32,105,115,32,102,111,108,108,111,119,101,
+ 100,32,98,121,58,32,102,111,114,32,107,44,32,118,32,105,
+ 110,32,70,46,105,116,101,109,115,40,41,58,32,68,91,107,
+ 93,32,61,32,118,10,32,32,32,32,32,32,32,32,114,75,
+ 1,0,0,78,41,5,114,177,0,0,0,114,27,0,0,0,
+ 218,7,104,97,115,97,116,116,114,114,75,1,0,0,114,77,
+ 1,0,0,41,5,114,61,0,0,0,114,235,0,0,0,114,
+ 227,0,0,0,114,66,1,0,0,114,87,0,0,0,115,5,
+ 0,0,0,32,32,32,32,32,114,9,0,0,0,218,6,117,
+ 112,100,97,116,101,122,21,77,117,116,97,98,108,101,77,97,
+ 112,112,105,110,103,46,117,112,100,97,116,101,206,3,0,0,
+ 115,130,0,0,0,128,0,244,12,0,12,22,144,101,156,87,
+ 212,11,37,219,23,28,144,3,216,28,33,160,35,153,74,144,
+ 4,144,83,146,9,241,3,0,24,29,228,13,20,144,85,152,
+ 70,212,13,35,216,23,28,151,122,145,122,150,124,144,3,216,
+ 28,33,160,35,153,74,144,4,144,83,146,9,241,3,0,24,
+ 36,243,6,0,31,36,145,10,144,3,144,85,216,28,33,144,
+ 4,144,83,146,9,240,3,0,31,36,224,26,30,159,42,153,
+ 42,158,44,137,74,136,67,144,21,216,24,29,136,68,144,19,
+ 138,73,241,3,0,27,39,114,8,0,0,0,78,99,3,0,
+ 0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,
+ 0,0,243,56,0,0,0,151,0,9,0,124,0,124,1,25,
+ 0,0,0,83,0,35,0,116,0,0,0,0,0,0,0,0,
+ 0,36,0,114,9,1,0,124,2,124,0,124,1,60,0,0,
+ 0,89,0,124,2,83,0,119,0,120,3,89,0,119,1,41,
+ 1,122,64,68,46,115,101,116,100,101,102,97,117,108,116,40,
+ 107,91,44,100,93,41,32,45,62,32,68,46,103,101,116,40,
+ 107,44,100,41,44,32,97,108,115,111,32,115,101,116,32,68,
+ 91,107,93,61,100,32,105,102,32,107,32,110,111,116,32,105,
+ 110,32,68,114,64,1,0,0,114,69,1,0,0,115,3,0,
+ 0,0,32,32,32,114,9,0,0,0,218,10,115,101,116,100,
+ 101,102,97,117,108,116,122,25,77,117,116,97,98,108,101,77,
+ 97,112,112,105,110,103,46,115,101,116,100,101,102,97,117,108,
+ 116,224,3,0,0,115,46,0,0,0,128,0,240,4,3,9,
+ 32,216,19,23,152,3,145,57,208,12,28,248,220,15,23,242,
+ 0,1,9,32,216,24,31,136,68,144,19,138,73,216,15,22,
+ 136,14,240,5,1,9,32,250,115,12,0,0,0,130,4,7,
+ 0,135,14,25,3,152,1,25,3,41,1,114,7,0,0,0,
+ 114,6,0,0,0,41,15,114,69,0,0,0,114,70,0,0,
+ 0,114,71,0,0,0,114,204,0,0,0,114,72,0,0,0,
+ 114,4,0,0,0,114,111,1,0,0,114,113,1,0,0,218,
+ 6,111,98,106,101,99,116,114,115,1,0,0,114,49,1,0,
+ 0,114,117,1,0,0,114,51,1,0,0,114,121,1,0,0,
+ 114,123,1,0,0,114,7,0,0,0,114,8,0,0,0,114,
+ 9,0,0,0,114,28,0,0,0,114,28,0,0,0,151,3,
+ 0,0,115,89,0,0,0,132,0,241,2,6,5,8,240,16,
+ 0,17,19,128,73,224,5,19,241,2,1,5,23,243,3,0,
+ 6,20,240,2,1,5,23,240,6,0,6,20,241,2,1,5,
+ 23,243,3,0,6,20,240,2,1,5,23,241,6,0,16,22,
+ 139,120,128,72,224,31,39,243,0,12,5,25,242,28,10,5,
+ 26,242,24,6,5,17,243,16,16,5,30,244,36,6,5,23,
+ 114,8,0,0,0,114,28,0,0,0,99,0,0,0,0,0,
+ 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,243,
+ 72,0,0,0,151,0,101,0,90,1,100,0,90,2,100,1,
+ 90,3,100,2,90,4,100,3,90,5,101,6,100,4,132,0,
+ 171,0,0,0,0,0,0,0,90,7,100,5,132,0,90,8,
+ 100,6,132,0,90,9,100,7,132,0,90,10,100,11,100,9,
+ 132,1,90,11,100,10,132,0,90,12,121,8,41,12,114,33,
+ 0,0,0,122,138,65,108,108,32,116,104,101,32,111,112,101,
+ 114,97,116,105,111,110,115,32,111,110,32,97,32,114,101,97,
+ 100,45,111,110,108,121,32,115,101,113,117,101,110,99,101,46,
+ 10,10,32,32,32,32,67,111,110,99,114,101,116,101,32,115,
+ 117,98,99,108,97,115,115,101,115,32,109,117,115,116,32,111,
+ 118,101,114,114,105,100,101,32,95,95,110,101,119,95,95,32,
+ 111,114,32,95,95,105,110,105,116,95,95,44,10,32,32,32,
+ 32,95,95,103,101,116,105,116,101,109,95,95,44,32,97,110,
+ 100,32,95,95,108,101,110,95,95,46,10,32,32,32,32,114,
+ 7,0,0,0,233,32,0,0,0,99,2,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,3,0,0,0,243,14,
+ 0,0,0,151,0,116,0,0,0,0,0,0,0,0,0,130,
+ 1,114,6,0,0,0,169,1,218,10,73,110,100,101,120,69,
+ 114,114,111,114,169,2,114,61,0,0,0,218,5,105,110,100,
+ 101,120,115,2,0,0,0,32,32,114,9,0,0,0,114,201,
+ 0,0,0,122,20,83,101,113,117,101,110,99,101,46,95,95,
+ 103,101,116,105,116,101,109,95,95,250,3,0,0,243,8,0,
+ 0,0,128,0,228,14,24,208,8,24,114,8,0,0,0,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
+ 35,0,0,0,243,78,0,0,0,75,0,1,0,151,0,100,
+ 1,125,1,9,0,9,0,124,0,124,1,25,0,0,0,125,
+ 2,124,2,150,2,151,1,1,0,124,1,100,2,122,13,0,
+ 0,125,1,140,15,35,0,116,0,0,0,0,0,0,0,0,
+ 0,36,0,114,3,1,0,89,0,121,0,119,0,120,3,89,
+ 0,119,1,173,3,119,1,41,3,78,114,2,0,0,0,114,
+ 37,0,0,0,114,128,1,0,0,41,3,114,61,0,0,0,
+ 218,1,105,114,103,1,0,0,115,3,0,0,0,32,32,32,
+ 114,9,0,0,0,114,132,0,0,0,122,17,83,101,113,117,
+ 101,110,99,101,46,95,95,105,116,101,114,95,95,254,3,0,
+ 0,115,66,0,0,0,232,0,248,128,0,216,12,13,136,1,
+ 240,2,6,9,19,216,18,22,216,20,24,152,17,145,71,144,
+ 1,216,22,23,146,7,216,16,17,144,81,145,6,144,1,240,
+ 7,0,19,23,248,244,8,0,16,26,242,0,1,9,19,217,
+ 12,18,240,3,1,9,19,252,115,24,0,0,0,130,3,37,
+ 1,134,16,22,0,150,9,34,3,159,2,37,1,161,1,34,
+ 3,162,3,37,1,99,2,0,0,0,0,0,0,0,0,0,
+ 0,0,3,0,0,0,3,0,0,0,243,40,0,0,0,151,
+ 0,124,0,68,0,93,13,0,0,125,2,124,2,124,1,117,
+ 0,115,6,124,2,124,1,107,40,0,0,115,1,140,13,1,
+ 0,121,1,4,0,121,2,114,73,1,0,0,114,7,0,0,
+ 0,41,3,114,61,0,0,0,114,87,0,0,0,114,103,1,
+ 0,0,115,3,0,0,0,32,32,32,114,9,0,0,0,114,
+ 158,0,0,0,122,21,83,101,113,117,101,110,99,101,46,95,
+ 95,99,111,110,116,97,105,110,115,95,95,8,4,0,0,115,
+ 33,0,0,0,128,0,219,17,21,136,65,216,15,16,144,69,
+ 137,122,152,81,160,37,155,90,217,23,27,240,5,0,18,22,
+ 240,6,0,16,21,114,8,0,0,0,99,1,0,0,0,0,
+ 0,0,0,0,0,0,0,7,0,0,0,35,0,0,0,243,
+ 94,0,0,0,75,0,1,0,151,0,116,1,0,0,0,0,
+ 0,0,0,0,116,3,0,0,0,0,0,0,0,0,116,5,
+ 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
+ 0,0,171,1,0,0,0,0,0,0,171,1,0,0,0,0,
+ 0,0,68,0,93,9,0,0,125,1,124,0,124,1,25,0,
+ 0,0,150,1,151,1,1,0,140,11,4,0,121,0,173,3,
+ 119,1,114,6,0,0,0,41,3,218,8,114,101,118,101,114,
+ 115,101,100,218,5,114,97,110,103,101,114,179,0,0,0,41,
+ 2,114,61,0,0,0,114,134,1,0,0,115,2,0,0,0,
+ 32,32,114,9,0,0,0,114,142,0,0,0,122,21,83,101,
+ 113,117,101,110,99,101,46,95,95,114,101,118,101,114,115,101,
+ 100,95,95,14,4,0,0,115,39,0,0,0,232,0,248,128,
+ 0,220,17,25,156,37,164,3,160,68,163,9,211,26,42,214,
+ 17,43,136,65,216,18,22,144,113,145,39,139,77,241,3,0,
+ 18,44,249,115,4,0,0,0,130,43,45,1,78,99,4,0,
+ 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,
+ 0,0,243,238,0,0,0,151,0,124,2,129,29,124,2,100,
+ 1,107,2,0,0,114,24,116,1,0,0,0,0,0,0,0,
+ 0,116,3,0,0,0,0,0,0,0,0,124,0,171,1,0,
+ 0,0,0,0,0,124,2,122,0,0,0,100,1,171,2,0,
+ 0,0,0,0,0,125,2,124,3,129,19,124,3,100,1,107,
+ 2,0,0,114,14,124,3,116,3,0,0,0,0,0,0,0,
+ 0,124,0,171,1,0,0,0,0,0,0,122,13,0,0,125,
+ 3,124,2,125,4,124,3,129,5,124,4,124,3,107,2,0,
+ 0,114,31,9,0,124,0,124,4,25,0,0,0,125,5,124,
+ 5,124,1,117,0,115,5,124,5,124,1,107,40,0,0,114,
+ 2,124,4,83,0,124,4,100,2,122,13,0,0,125,4,124,
+ 3,128,1,140,25,124,4,124,3,107,2,0,0,114,1,140,
+ 31,116,6,0,0,0,0,0,0,0,0,130,1,35,0,116,
+ 4,0,0,0,0,0,0,0,0,36,0,114,8,1,0,89,
+ 0,116,6,0,0,0,0,0,0,0,0,130,1,119,0,120,
+ 3,89,0,119,1,41,3,122,230,83,46,105,110,100,101,120,
+ 40,118,97,108,117,101,44,32,91,115,116,97,114,116,44,32,
+ 91,115,116,111,112,93,93,41,32,45,62,32,105,110,116,101,
+ 103,101,114,32,45,45,32,114,101,116,117,114,110,32,102,105,
+ 114,115,116,32,105,110,100,101,120,32,111,102,32,118,97,108,
+ 117,101,46,10,32,32,32,32,32,32,32,32,32,32,32,82,
+ 97,105,115,101,115,32,86,97,108,117,101,69,114,114,111,114,
+ 32,105,102,32,116,104,101,32,118,97,108,117,101,32,105,115,
+ 32,110,111,116,32,112,114,101,115,101,110,116,46,10,10,32,
+ 32,32,32,32,32,32,32,32,32,32,83,117,112,112,111,114,
+ 116,105,110,103,32,115,116,97,114,116,32,97,110,100,32,115,
+ 116,111,112,32,97,114,103,117,109,101,110,116,115,32,105,115,
+ 32,111,112,116,105,111,110,97,108,44,32,98,117,116,10,32,
+ 32,32,32,32,32,32,32,32,32,32,114,101,99,111,109,109,
+ 101,110,100,101,100,46,10,32,32,32,32,32,32,32,32,114,
+ 2,0,0,0,114,37,0,0,0,41,4,218,3,109,97,120,
+ 114,179,0,0,0,114,129,1,0,0,218,10,86,97,108,117,
+ 101,69,114,114,111,114,41,6,114,61,0,0,0,114,87,0,
+ 0,0,218,5,115,116,97,114,116,218,4,115,116,111,112,114,
+ 134,1,0,0,114,103,1,0,0,115,6,0,0,0,32,32,
+ 32,32,32,32,114,9,0,0,0,114,131,1,0,0,122,14,
+ 83,101,113,117,101,110,99,101,46,105,110,100,101,120,18,4,
+ 0,0,115,171,0,0,0,128,0,240,14,0,12,17,208,11,
+ 28,160,21,168,17,162,25,220,20,23,156,3,152,68,155,9,
+ 160,69,209,24,41,168,49,211,20,45,136,69,216,11,15,208,
+ 11,27,160,4,160,113,162,8,216,12,16,148,67,152,4,147,
+ 73,209,12,29,136,68,224,12,17,136,1,216,14,18,136,108,
+ 152,97,160,36,154,104,240,2,3,13,22,216,20,24,152,17,
+ 145,71,144,1,240,6,0,16,17,144,69,137,122,152,81,160,
+ 37,154,90,216,23,24,144,8,216,12,13,144,17,137,70,136,
+ 65,240,15,0,15,19,137,108,152,97,160,36,155,104,244,16,
+ 0,15,25,208,8,24,248,244,11,0,20,30,242,0,1,13,
+ 22,216,16,21,244,8,0,15,25,208,8,24,240,11,1,13,
+ 22,250,115,17,0,0,0,191,5,65,35,0,193,35,9,65,
+ 52,3,193,51,1,65,52,3,99,2,0,0,0,0,0,0,
+ 0,0,0,0,0,4,0,0,0,3,0,0,0,243,44,0,
+ 0,0,135,1,151,0,116,1,0,0,0,0,0,0,0,0,
+ 136,1,102,1,100,1,132,8,124,0,68,0,171,0,0,0,
+ 0,0,0,0,171,1,0,0,0,0,0,0,83,0,41,2,
+ 122,66,83,46,99,111,117,110,116,40,118,97,108,117,101,41,
+ 32,45,62,32,105,110,116,101,103,101,114,32,45,45,32,114,
+ 101,116,117,114,110,32,110,117,109,98,101,114,32,111,102,32,
+ 111,99,99,117,114,114,101,110,99,101,115,32,111,102,32,118,
+ 97,108,117,101,99,1,0,0,0,0,0,0,0,0,0,0,
+ 0,3,0,0,0,51,0,0,0,243,54,0,0,0,149,1,
+ 75,0,1,0,151,0,124,0,93,16,0,0,125,1,124,1,
+ 137,2,117,0,115,6,124,1,137,2,107,40,0,0,115,1,
+ 140,13,100,0,150,1,151,1,1,0,140,18,4,0,121,1,
+ 173,3,119,1,41,2,114,37,0,0,0,78,114,7,0,0,
+ 0,41,3,114,212,0,0,0,114,103,1,0,0,114,87,0,
+ 0,0,115,3,0,0,0,32,32,128,114,9,0,0,0,114,
+ 215,0,0,0,122,33,83,101,113,117,101,110,99,101,46,99,
+ 111,117,110,116,46,60,108,111,99,97,108,115,62,46,60,103,
+ 101,110,101,120,112,114,62,43,4,0,0,115,30,0,0,0,
+ 248,232,0,248,128,0,208,18,63,153,100,152,17,160,97,168,
+ 53,161,106,176,65,184,21,179,74,148,49,153,100,249,115,8,
+ 0,0,0,131,14,25,1,146,7,25,1,41,1,218,3,115,
+ 117,109,114,86,0,0,0,115,2,0,0,0,32,96,114,9,
+ 0,0,0,218,5,99,111,117,110,116,122,14,83,101,113,117,
+ 101,110,99,101,46,99,111,117,110,116,41,4,0,0,115,20,
+ 0,0,0,248,128,0,228,15,18,211,18,63,153,100,211,18,
+ 63,211,15,63,208,8,63,114,8,0,0,0,41,2,114,2,
+ 0,0,0,78,41,13,114,69,0,0,0,114,70,0,0,0,
+ 114,71,0,0,0,114,204,0,0,0,114,72,0,0,0,114,
+ 82,1,0,0,114,4,0,0,0,114,201,0,0,0,114,132,
+ 0,0,0,114,158,0,0,0,114,142,0,0,0,114,131,1,
+ 0,0,114,147,1,0,0,114,7,0,0,0,114,8,0,0,
+ 0,114,9,0,0,0,114,33,0,0,0,114,33,0,0,0,
+ 238,3,0,0,115,65,0,0,0,132,0,241,2,4,5,8,
+ 240,12,0,17,19,128,73,240,6,0,23,29,128,79,224,5,
+ 19,241,2,1,5,25,243,3,0,6,20,240,2,1,5,25,
+ 242,6,8,5,19,242,20,4,5,21,242,12,2,5,26,243,
+ 8,21,5,25,243,46,2,5,64,1,114,8,0,0,0,114,
+ 33,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+ 0,2,0,0,0,0,0,0,0,243,40,0,0,0,135,0,
+ 151,0,101,0,90,1,100,0,90,2,136,0,102,1,100,1,
+ 132,8,90,3,136,0,102,1,100,2,132,8,90,4,136,0,
+ 120,1,90,5,83,0,41,3,218,24,95,68,101,112,114,101,
+ 99,97,116,101,66,121,116,101,83,116,114,105,110,103,77,101,
+ 116,97,99,4,0,0,0,0,0,0,0,0,0,0,0,6,
+ 0,0,0,11,0,0,0,243,98,0,0,0,149,1,151,0,
+ 124,1,100,1,107,55,0,0,114,23,100,2,100,0,108,0,
+ 125,5,124,5,106,3,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,100,3,100,4,172,5,171,2,
+ 0,0,0,0,0,0,1,0,116,5,0,0,0,0,0,0,
+ 0,0,137,6,124,0,141,12,0,0,124,0,124,1,124,2,
+ 124,3,102,4,105,0,124,4,164,1,142,1,83,0,41,6,
+ 78,114,35,0,0,0,114,2,0,0,0,250,26,99,111,108,
+ 108,101,99,116,105,111,110,115,46,97,98,99,46,66,121,116,
+ 101,83,116,114,105,110,103,169,2,233,3,0,0,0,233,14,
+ 0,0,0,169,1,114,44,1,0,0,41,4,218,8,119,97,
+ 114,110,105,110,103,115,218,11,95,100,101,112,114,101,99,97,
+ 116,101,100,114,183,0,0,0,114,184,0,0,0,41,7,114,
+ 66,0,0,0,114,213,0,0,0,218,5,98,97,115,101,115,
+ 218,9,110,97,109,101,115,112,97,99,101,218,6,107,119,97,
+ 114,103,115,114,156,1,0,0,114,189,0,0,0,115,7,0,
+ 0,0,32,32,32,32,32,32,128,114,9,0,0,0,114,184,
+ 0,0,0,122,32,95,68,101,112,114,101,99,97,116,101,66,
+ 121,116,101,83,116,114,105,110,103,77,101,116,97,46,95,95,
+ 110,101,119,95,95,51,4,0,0,115,67,0,0,0,248,128,
+ 0,216,11,15,144,60,210,11,31,219,12,27,224,12,20,215,
+ 12,32,209,12,32,216,16,44,216,23,30,240,5,0,13,33,
+ 244,0,3,13,14,244,8,0,16,21,137,119,137,127,152,115,
+ 160,68,168,37,176,25,209,15,69,184,102,209,15,69,208,8,
+ 69,114,8,0,0,0,99,2,0,0,0,0,0,0,0,0,
+ 0,0,0,4,0,0,0,3,0,0,0,243,80,0,0,0,
+ 149,1,151,0,100,1,100,0,108,0,125,2,124,2,106,3,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,100,2,100,3,172,4,171,2,0,0,0,0,0,0,
+ 1,0,116,4,0,0,0,0,0,0,0,0,137,3,124,0,
+ 141,13,0,0,124,1,171,1,0,0,0,0,0,0,83,0,
+ 41,5,78,114,2,0,0,0,114,151,1,0,0,114,152,1,
+ 0,0,114,155,1,0,0,41,4,114,156,1,0,0,114,157,
+ 1,0,0,114,183,0,0,0,218,17,95,95,105,110,115,116,
+ 97,110,99,101,99,104,101,99,107,95,95,41,4,114,66,0,
+ 0,0,218,8,105,110,115,116,97,110,99,101,114,156,1,0,
+ 0,114,189,0,0,0,115,4,0,0,0,32,32,32,128,114,
+ 9,0,0,0,114,162,1,0,0,122,42,95,68,101,112,114,
+ 101,99,97,116,101,66,121,116,101,83,116,114,105,110,103,77,
+ 101,116,97,46,95,95,105,110,115,116,97,110,99,101,99,104,
+ 101,99,107,95,95,61,4,0,0,115,49,0,0,0,248,128,
+ 0,219,8,23,224,8,16,215,8,28,209,8,28,216,12,40,
+ 216,19,26,240,5,0,9,29,244,0,3,9,10,244,8,0,
+ 16,21,137,119,209,15,40,168,24,211,15,50,208,8,50,114,
+ 8,0,0,0,41,6,114,69,0,0,0,114,70,0,0,0,
+ 114,71,0,0,0,114,184,0,0,0,114,162,1,0,0,114,
+ 205,0,0,0,114,206,0,0,0,115,1,0,0,0,64,114,
+ 9,0,0,0,114,149,1,0,0,114,149,1,0,0,50,4,
+ 0,0,115,19,0,0,0,248,132,0,244,2,8,5,70,1,
+ 247,20,7,5,51,240,0,7,5,51,114,8,0,0,0,114,
+ 149,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+ 0,1,0,0,0,0,0,0,0,243,20,0,0,0,151,0,
+ 101,0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,
+ 121,3,41,4,114,35,0,0,0,122,77,84,104,105,115,32,
+ 117,110,105,102,105,101,115,32,98,121,116,101,115,32,97,110,
+ 100,32,98,121,116,101,97,114,114,97,121,46,10,10,32,32,
+ 32,32,88,88,88,32,83,104,111,117,108,100,32,97,100,100,
+ 32,97,108,108,32,116,104,101,105,114,32,109,101,116,104,111,
+ 100,115,46,10,32,32,32,32,114,7,0,0,0,78,41,5,
114,69,0,0,0,114,70,0,0,0,114,71,0,0,0,114,
- 204,0,0,0,114,72,0,0,0,114,4,0,0,0,114,111,
- 1,0,0,114,113,1,0,0,218,6,111,98,106,101,99,116,
- 114,115,1,0,0,114,49,1,0,0,114,117,1,0,0,114,
- 51,1,0,0,114,121,1,0,0,114,123,1,0,0,114,7,
- 0,0,0,114,8,0,0,0,114,9,0,0,0,114,28,0,
- 0,0,114,28,0,0,0,151,3,0,0,115,89,0,0,0,
- 132,0,241,2,6,5,8,240,16,0,17,19,128,73,224,5,
- 19,241,2,1,5,23,243,3,0,6,20,240,2,1,5,23,
- 240,6,0,6,20,241,2,1,5,23,243,3,0,6,20,240,
- 2,1,5,23,241,6,0,16,22,139,120,128,72,224,31,39,
- 243,0,12,5,25,242,28,10,5,26,242,24,6,5,17,243,
- 16,16,5,30,244,36,6,5,23,114,8,0,0,0,114,28,
+ 204,0,0,0,114,72,0,0,0,114,7,0,0,0,114,8,
+ 0,0,0,114,9,0,0,0,114,35,0,0,0,114,35,0,
+ 0,0,70,4,0,0,115,14,0,0,0,132,0,241,2,3,
+ 5,8,240,10,0,17,19,129,73,114,8,0,0,0,114,35,
0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
- 2,0,0,0,0,0,0,0,243,72,0,0,0,151,0,101,
- 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100,
- 3,90,5,101,6,100,4,132,0,171,0,0,0,0,0,0,
- 0,90,7,100,5,132,0,90,8,100,6,132,0,90,9,100,
- 7,132,0,90,10,100,11,100,9,132,1,90,11,100,10,132,
- 0,90,12,121,8,41,12,114,33,0,0,0,122,138,65,108,
- 108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,115,
- 32,111,110,32,97,32,114,101,97,100,45,111,110,108,121,32,
- 115,101,113,117,101,110,99,101,46,10,10,32,32,32,32,67,
- 111,110,99,114,101,116,101,32,115,117,98,99,108,97,115,115,
- 101,115,32,109,117,115,116,32,111,118,101,114,114,105,100,101,
- 32,95,95,110,101,119,95,95,32,111,114,32,95,95,105,110,
- 105,116,95,95,44,10,32,32,32,32,95,95,103,101,116,105,
- 116,101,109,95,95,44,32,97,110,100,32,95,95,108,101,110,
- 95,95,46,10,32,32,32,32,114,7,0,0,0,233,32,0,
- 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,1,
- 0,0,0,3,0,0,0,243,14,0,0,0,151,0,116,0,
- 0,0,0,0,0,0,0,0,130,1,114,6,0,0,0,169,
- 1,218,10,73,110,100,101,120,69,114,114,111,114,169,2,114,
- 61,0,0,0,218,5,105,110,100,101,120,115,2,0,0,0,
- 32,32,114,9,0,0,0,114,201,0,0,0,122,20,83,101,
- 113,117,101,110,99,101,46,95,95,103,101,116,105,116,101,109,
- 95,95,250,3,0,0,243,8,0,0,0,128,0,228,14,24,
- 208,8,24,114,8,0,0,0,99,1,0,0,0,0,0,0,
- 0,0,0,0,0,4,0,0,0,35,0,0,0,243,78,0,
- 0,0,75,0,1,0,151,0,100,1,125,1,9,0,9,0,
- 124,0,124,1,25,0,0,0,125,2,124,2,150,2,151,1,
- 1,0,124,1,100,2,122,13,0,0,125,1,140,15,35,0,
- 116,0,0,0,0,0,0,0,0,0,36,0,114,3,1,0,
- 89,0,121,0,119,0,120,3,89,0,119,1,173,3,119,1,
- 41,3,78,114,2,0,0,0,114,37,0,0,0,114,128,1,
- 0,0,41,3,114,61,0,0,0,218,1,105,114,103,1,0,
- 0,115,3,0,0,0,32,32,32,114,9,0,0,0,114,132,
- 0,0,0,122,17,83,101,113,117,101,110,99,101,46,95,95,
- 105,116,101,114,95,95,254,3,0,0,115,66,0,0,0,232,
- 0,248,128,0,216,12,13,136,1,240,2,6,9,19,216,18,
- 22,216,20,24,152,17,145,71,144,1,216,22,23,146,7,216,
- 16,17,144,81,145,6,144,1,240,7,0,19,23,248,244,8,
- 0,16,26,242,0,1,9,19,217,12,18,240,3,1,9,19,
- 252,115,24,0,0,0,130,3,37,1,134,16,22,0,150,9,
- 34,3,159,2,37,1,161,1,34,3,162,3,37,1,99,2,
- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,
- 0,0,0,243,40,0,0,0,151,0,124,0,68,0,93,13,
- 0,0,125,2,124,2,124,1,117,0,115,6,124,2,124,1,
- 107,40,0,0,115,1,140,13,1,0,121,1,4,0,121,2,
- 114,73,1,0,0,114,7,0,0,0,41,3,114,61,0,0,
- 0,114,87,0,0,0,114,103,1,0,0,115,3,0,0,0,
- 32,32,32,114,9,0,0,0,114,158,0,0,0,122,21,83,
- 101,113,117,101,110,99,101,46,95,95,99,111,110,116,97,105,
- 110,115,95,95,8,4,0,0,115,33,0,0,0,128,0,219,
- 17,21,136,65,216,15,16,144,69,137,122,152,81,160,37,155,
- 90,217,23,27,240,5,0,18,22,240,6,0,16,21,114,8,
- 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
- 7,0,0,0,35,0,0,0,243,94,0,0,0,75,0,1,
- 0,151,0,116,1,0,0,0,0,0,0,0,0,116,3,0,
- 0,0,0,0,0,0,0,116,5,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,171,1,0,0,0,
- 0,0,0,171,1,0,0,0,0,0,0,68,0,93,9,0,
- 0,125,1,124,0,124,1,25,0,0,0,150,1,151,1,1,
- 0,140,11,4,0,121,0,173,3,119,1,114,6,0,0,0,
- 41,3,218,8,114,101,118,101,114,115,101,100,218,5,114,97,
- 110,103,101,114,179,0,0,0,41,2,114,61,0,0,0,114,
- 134,1,0,0,115,2,0,0,0,32,32,114,9,0,0,0,
- 114,142,0,0,0,122,21,83,101,113,117,101,110,99,101,46,
- 95,95,114,101,118,101,114,115,101,100,95,95,14,4,0,0,
- 115,39,0,0,0,232,0,248,128,0,220,17,25,156,37,164,
- 3,160,68,163,9,211,26,42,214,17,43,136,65,216,18,22,
- 144,113,145,39,139,77,241,3,0,18,44,249,115,4,0,0,
- 0,130,43,45,1,78,99,4,0,0,0,0,0,0,0,0,
- 0,0,0,5,0,0,0,3,0,0,0,243,238,0,0,0,
- 151,0,124,2,129,29,124,2,100,1,107,2,0,0,114,24,
- 116,1,0,0,0,0,0,0,0,0,116,3,0,0,0,0,
- 0,0,0,0,124,0,171,1,0,0,0,0,0,0,124,2,
- 122,0,0,0,100,1,171,2,0,0,0,0,0,0,125,2,
- 124,3,129,19,124,3,100,1,107,2,0,0,114,14,124,3,
- 116,3,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
- 0,0,0,0,122,13,0,0,125,3,124,2,125,4,124,3,
- 129,5,124,4,124,3,107,2,0,0,114,31,9,0,124,0,
- 124,4,25,0,0,0,125,5,124,5,124,1,117,0,115,5,
- 124,5,124,1,107,40,0,0,114,2,124,4,83,0,124,4,
- 100,2,122,13,0,0,125,4,124,3,128,1,140,25,124,4,
- 124,3,107,2,0,0,114,1,140,31,116,6,0,0,0,0,
- 0,0,0,0,130,1,35,0,116,4,0,0,0,0,0,0,
- 0,0,36,0,114,8,1,0,89,0,116,6,0,0,0,0,
- 0,0,0,0,130,1,119,0,120,3,89,0,119,1,41,3,
- 122,230,83,46,105,110,100,101,120,40,118,97,108,117,101,44,
- 32,91,115,116,97,114,116,44,32,91,115,116,111,112,93,93,
- 41,32,45,62,32,105,110,116,101,103,101,114,32,45,45,32,
- 114,101,116,117,114,110,32,102,105,114,115,116,32,105,110,100,
- 101,120,32,111,102,32,118,97,108,117,101,46,10,32,32,32,
- 32,32,32,32,32,32,32,32,82,97,105,115,101,115,32,86,
- 97,108,117,101,69,114,114,111,114,32,105,102,32,116,104,101,
- 32,118,97,108,117,101,32,105,115,32,110,111,116,32,112,114,
- 101,115,101,110,116,46,10,10,32,32,32,32,32,32,32,32,
- 32,32,32,83,117,112,112,111,114,116,105,110,103,32,115,116,
- 97,114,116,32,97,110,100,32,115,116,111,112,32,97,114,103,
- 117,109,101,110,116,115,32,105,115,32,111,112,116,105,111,110,
- 97,108,44,32,98,117,116,10,32,32,32,32,32,32,32,32,
- 32,32,32,114,101,99,111,109,109,101,110,100,101,100,46,10,
- 32,32,32,32,32,32,32,32,114,2,0,0,0,114,37,0,
- 0,0,41,4,218,3,109,97,120,114,179,0,0,0,114,129,
- 1,0,0,218,10,86,97,108,117,101,69,114,114,111,114,41,
- 6,114,61,0,0,0,114,87,0,0,0,218,5,115,116,97,
- 114,116,218,4,115,116,111,112,114,134,1,0,0,114,103,1,
- 0,0,115,6,0,0,0,32,32,32,32,32,32,114,9,0,
- 0,0,114,131,1,0,0,122,14,83,101,113,117,101,110,99,
- 101,46,105,110,100,101,120,18,4,0,0,115,171,0,0,0,
- 128,0,240,14,0,12,17,208,11,28,160,21,168,17,162,25,
- 220,20,23,156,3,152,68,155,9,160,69,209,24,41,168,49,
- 211,20,45,136,69,216,11,15,208,11,27,160,4,160,113,162,
- 8,216,12,16,148,67,152,4,147,73,209,12,29,136,68,224,
- 12,17,136,1,216,14,18,136,108,152,97,160,36,154,104,240,
- 2,3,13,22,216,20,24,152,17,145,71,144,1,240,6,0,
- 16,17,144,69,137,122,152,81,160,37,154,90,216,23,24,144,
- 8,216,12,13,144,17,137,70,136,65,240,15,0,15,19,137,
- 108,152,97,160,36,155,104,244,16,0,15,25,208,8,24,248,
- 244,11,0,20,30,242,0,1,13,22,216,16,21,244,8,0,
- 15,25,208,8,24,240,11,1,13,22,250,115,17,0,0,0,
- 191,5,65,35,0,193,35,9,65,52,3,193,51,1,65,52,
- 3,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,
- 0,0,3,0,0,0,243,44,0,0,0,135,1,151,0,116,
- 1,0,0,0,0,0,0,0,0,136,1,102,1,100,1,132,
- 8,124,0,68,0,171,0,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,83,0,41,2,122,66,83,46,99,111,117,
- 110,116,40,118,97,108,117,101,41,32,45,62,32,105,110,116,
- 101,103,101,114,32,45,45,32,114,101,116,117,114,110,32,110,
- 117,109,98,101,114,32,111,102,32,111,99,99,117,114,114,101,
- 110,99,101,115,32,111,102,32,118,97,108,117,101,99,1,0,
- 0,0,0,0,0,0,0,0,0,0,3,0,0,0,51,0,
- 0,0,243,54,0,0,0,149,1,75,0,1,0,151,0,124,
- 0,93,16,0,0,125,1,124,1,137,2,117,0,115,6,124,
- 1,137,2,107,40,0,0,115,1,140,13,100,0,150,1,151,
- 1,1,0,140,18,4,0,121,1,173,3,119,1,41,2,114,
- 37,0,0,0,78,114,7,0,0,0,41,3,114,212,0,0,
- 0,114,103,1,0,0,114,87,0,0,0,115,3,0,0,0,
- 32,32,128,114,9,0,0,0,114,215,0,0,0,122,33,83,
- 101,113,117,101,110,99,101,46,99,111,117,110,116,46,60,108,
- 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,
- 43,4,0,0,115,30,0,0,0,248,232,0,248,128,0,208,
- 18,63,153,100,152,17,160,97,168,53,161,106,176,65,184,21,
- 179,74,148,49,153,100,249,115,8,0,0,0,131,14,25,1,
- 146,7,25,1,41,1,218,3,115,117,109,114,86,0,0,0,
- 115,2,0,0,0,32,96,114,9,0,0,0,218,5,99,111,
- 117,110,116,122,14,83,101,113,117,101,110,99,101,46,99,111,
- 117,110,116,41,4,0,0,115,20,0,0,0,248,128,0,228,
- 15,18,211,18,63,153,100,211,18,63,211,15,63,208,8,63,
- 114,8,0,0,0,41,2,114,2,0,0,0,78,41,13,114,
- 69,0,0,0,114,70,0,0,0,114,71,0,0,0,114,204,
- 0,0,0,114,72,0,0,0,114,82,1,0,0,114,4,0,
- 0,0,114,201,0,0,0,114,132,0,0,0,114,158,0,0,
- 0,114,142,0,0,0,114,131,1,0,0,114,147,1,0,0,
- 114,7,0,0,0,114,8,0,0,0,114,9,0,0,0,114,
- 33,0,0,0,114,33,0,0,0,238,3,0,0,115,65,0,
- 0,0,132,0,241,2,4,5,8,240,12,0,17,19,128,73,
- 240,6,0,23,29,128,79,224,5,19,241,2,1,5,25,243,
- 3,0,6,20,240,2,1,5,25,242,6,8,5,19,242,20,
- 4,5,21,242,12,2,5,26,243,8,21,5,25,243,46,2,
- 5,64,1,114,8,0,0,0,114,33,0,0,0,99,0,0,
- 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,
- 0,0,243,40,0,0,0,135,0,151,0,101,0,90,1,100,
- 0,90,2,136,0,102,1,100,1,132,8,90,3,136,0,102,
- 1,100,2,132,8,90,4,136,0,120,1,90,5,83,0,41,
- 3,218,24,95,68,101,112,114,101,99,97,116,101,66,121,116,
- 101,83,116,114,105,110,103,77,101,116,97,99,4,0,0,0,
- 0,0,0,0,0,0,0,0,6,0,0,0,11,0,0,0,
- 243,98,0,0,0,149,1,151,0,124,1,100,1,107,55,0,
- 0,114,23,100,2,100,0,108,0,125,5,124,5,106,3,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,100,3,100,4,172,5,171,2,0,0,0,0,0,0,1,
- 0,116,5,0,0,0,0,0,0,0,0,137,6,124,0,141,
- 12,0,0,124,0,124,1,124,2,124,3,102,4,105,0,124,
- 4,164,1,142,1,83,0,41,6,78,114,35,0,0,0,114,
- 2,0,0,0,250,26,99,111,108,108,101,99,116,105,111,110,
- 115,46,97,98,99,46,66,121,116,101,83,116,114,105,110,103,
- 169,2,233,3,0,0,0,233,14,0,0,0,169,1,114,44,
- 1,0,0,41,4,218,8,119,97,114,110,105,110,103,115,218,
- 11,95,100,101,112,114,101,99,97,116,101,100,114,183,0,0,
- 0,114,184,0,0,0,41,7,114,66,0,0,0,114,213,0,
- 0,0,218,5,98,97,115,101,115,218,9,110,97,109,101,115,
- 112,97,99,101,218,6,107,119,97,114,103,115,114,156,1,0,
- 0,114,189,0,0,0,115,7,0,0,0,32,32,32,32,32,
- 32,128,114,9,0,0,0,114,184,0,0,0,122,32,95,68,
- 101,112,114,101,99,97,116,101,66,121,116,101,83,116,114,105,
- 110,103,77,101,116,97,46,95,95,110,101,119,95,95,51,4,
- 0,0,115,67,0,0,0,248,128,0,216,11,15,144,60,210,
- 11,31,219,12,27,224,12,20,215,12,32,209,12,32,216,16,
- 44,216,23,30,240,5,0,13,33,244,0,3,13,14,244,8,
- 0,16,21,137,119,137,127,152,115,160,68,168,37,176,25,209,
- 15,69,184,102,209,15,69,208,8,69,114,8,0,0,0,99,
- 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
- 3,0,0,0,243,80,0,0,0,149,1,151,0,100,1,100,
- 0,108,0,125,2,124,2,106,3,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,100,2,100,3,172,
- 4,171,2,0,0,0,0,0,0,1,0,116,4,0,0,0,
- 0,0,0,0,0,137,3,124,0,141,13,0,0,124,1,171,
- 1,0,0,0,0,0,0,83,0,41,5,78,114,2,0,0,
- 0,114,151,1,0,0,114,152,1,0,0,114,155,1,0,0,
- 41,4,114,156,1,0,0,114,157,1,0,0,114,183,0,0,
- 0,218,17,95,95,105,110,115,116,97,110,99,101,99,104,101,
- 99,107,95,95,41,4,114,66,0,0,0,218,8,105,110,115,
- 116,97,110,99,101,114,156,1,0,0,114,189,0,0,0,115,
- 4,0,0,0,32,32,32,128,114,9,0,0,0,114,162,1,
- 0,0,122,42,95,68,101,112,114,101,99,97,116,101,66,121,
- 116,101,83,116,114,105,110,103,77,101,116,97,46,95,95,105,
- 110,115,116,97,110,99,101,99,104,101,99,107,95,95,61,4,
- 0,0,115,49,0,0,0,248,128,0,219,8,23,224,8,16,
- 215,8,28,209,8,28,216,12,40,216,19,26,240,5,0,9,
- 29,244,0,3,9,10,244,8,0,16,21,137,119,209,15,40,
- 168,24,211,15,50,208,8,50,114,8,0,0,0,41,6,114,
- 69,0,0,0,114,70,0,0,0,114,71,0,0,0,114,184,
- 0,0,0,114,162,1,0,0,114,205,0,0,0,114,206,0,
- 0,0,115,1,0,0,0,64,114,9,0,0,0,114,149,1,
- 0,0,114,149,1,0,0,50,4,0,0,115,19,0,0,0,
- 248,132,0,244,2,8,5,70,1,247,20,7,5,51,240,0,
- 7,5,51,114,8,0,0,0,114,149,1,0,0,99,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
- 0,0,243,20,0,0,0,151,0,101,0,90,1,100,0,90,
- 2,100,1,90,3,100,2,90,4,121,3,41,4,114,35,0,
- 0,0,122,77,84,104,105,115,32,117,110,105,102,105,101,115,
- 32,98,121,116,101,115,32,97,110,100,32,98,121,116,101,97,
- 114,114,97,121,46,10,10,32,32,32,32,88,88,88,32,83,
- 104,111,117,108,100,32,97,100,100,32,97,108,108,32,116,104,
- 101,105,114,32,109,101,116,104,111,100,115,46,10,32,32,32,
- 32,114,7,0,0,0,78,41,5,114,69,0,0,0,114,70,
- 0,0,0,114,71,0,0,0,114,204,0,0,0,114,72,0,
- 0,0,114,7,0,0,0,114,8,0,0,0,114,9,0,0,
- 0,114,35,0,0,0,114,35,0,0,0,70,4,0,0,115,
- 14,0,0,0,132,0,241,2,3,5,8,240,10,0,17,19,
- 129,73,114,8,0,0,0,114,35,0,0,0,99,0,0,0,
- 0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
- 0,243,112,0,0,0,151,0,101,0,90,1,100,0,90,2,
- 100,1,90,3,100,2,90,4,101,5,100,3,132,0,171,0,
- 0,0,0,0,0,0,90,6,101,5,100,4,132,0,171,0,
- 0,0,0,0,0,0,90,7,101,5,100,5,132,0,171,0,
- 0,0,0,0,0,0,90,8,100,6,132,0,90,9,100,7,
- 132,0,90,10,100,8,132,0,90,11,100,9,132,0,90,12,
- 100,14,100,10,132,1,90,13,100,11,132,0,90,14,100,12,
- 132,0,90,15,121,13,41,15,114,34,0,0,0,122,174,65,
- 108,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,
- 115,32,111,110,32,97,32,114,101,97,100,45,119,114,105,116,
- 101,32,115,101,113,117,101,110,99,101,46,10,10,32,32,32,
- 32,67,111,110,99,114,101,116,101,32,115,117,98,99,108,97,
- 115,115,101,115,32,109,117,115,116,32,112,114,111,118,105,100,
- 101,32,95,95,110,101,119,95,95,32,111,114,32,95,95,105,
- 110,105,116,95,95,44,10,32,32,32,32,95,95,103,101,116,
- 105,116,101,109,95,95,44,32,95,95,115,101,116,105,116,101,
- 109,95,95,44,32,95,95,100,101,108,105,116,101,109,95,95,
- 44,32,95,95,108,101,110,95,95,44,32,97,110,100,32,105,
- 110,115,101,114,116,40,41,46,10,32,32,32,32,114,7,0,
- 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,1,
- 0,0,0,3,0,0,0,243,14,0,0,0,151,0,116,0,
- 0,0,0,0,0,0,0,0,130,1,114,6,0,0,0,114,
- 128,1,0,0,169,3,114,61,0,0,0,114,131,1,0,0,
- 114,87,0,0,0,115,3,0,0,0,32,32,32,114,9,0,
- 0,0,114,111,1,0,0,122,27,77,117,116,97,98,108,101,
- 83,101,113,117,101,110,99,101,46,95,95,115,101,116,105,116,
- 101,109,95,95,91,4,0,0,114,132,1,0,0,114,8,0,
- 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,1,
- 0,0,0,3,0,0,0,243,14,0,0,0,151,0,116,0,
- 0,0,0,0,0,0,0,0,130,1,114,6,0,0,0,114,
- 128,1,0,0,114,130,1,0,0,115,2,0,0,0,32,32,
- 114,9,0,0,0,114,113,1,0,0,122,27,77,117,116,97,
- 98,108,101,83,101,113,117,101,110,99,101,46,95,95,100,101,
- 108,105,116,101,109,95,95,95,4,0,0,114,132,1,0,0,
- 114,8,0,0,0,99,3,0,0,0,0,0,0,0,0,0,
- 0,0,1,0,0,0,3,0,0,0,243,14,0,0,0,151,
- 0,116,0,0,0,0,0,0,0,0,0,130,1,41,1,122,
- 51,83,46,105,110,115,101,114,116,40,105,110,100,101,120,44,
- 32,118,97,108,117,101,41,32,45,45,32,105,110,115,101,114,
- 116,32,118,97,108,117,101,32,98,101,102,111,114,101,32,105,
- 110,100,101,120,114,128,1,0,0,114,167,1,0,0,115,3,
- 0,0,0,32,32,32,114,9,0,0,0,218,6,105,110,115,
- 101,114,116,122,22,77,117,116,97,98,108,101,83,101,113,117,
- 101,110,99,101,46,105,110,115,101,114,116,99,4,0,0,115,
- 10,0,0,0,128,0,244,6,0,15,25,208,8,24,114,8,
- 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,
- 5,0,0,0,3,0,0,0,243,58,0,0,0,151,0,124,
- 0,106,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,116,3,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,124,1,171,2,0,0,0,
- 0,0,0,1,0,121,1,41,2,122,58,83,46,97,112,112,
- 101,110,100,40,118,97,108,117,101,41,32,45,45,32,97,112,
- 112,101,110,100,32,118,97,108,117,101,32,116,111,32,116,104,
- 101,32,101,110,100,32,111,102,32,116,104,101,32,115,101,113,
- 117,101,110,99,101,78,41,2,114,170,1,0,0,114,179,0,
- 0,0,114,86,0,0,0,115,2,0,0,0,32,32,114,9,
- 0,0,0,218,6,97,112,112,101,110,100,122,22,77,117,116,
- 97,98,108,101,83,101,113,117,101,110,99,101,46,97,112,112,
- 101,110,100,104,4,0,0,115,20,0,0,0,128,0,224,8,
- 12,143,11,137,11,148,67,152,4,147,73,152,117,213,8,37,
- 114,8,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,4,0,0,0,3,0,0,0,243,70,0,0,0,151,
- 0,9,0,9,0,124,0,106,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
- 0,0,0,1,0,140,17,35,0,116,2,0,0,0,0,0,
- 0,0,0,36,0,114,3,1,0,89,0,121,1,119,0,120,
- 3,89,0,119,1,41,2,122,44,83,46,99,108,101,97,114,
- 40,41,32,45,62,32,78,111,110,101,32,45,45,32,114,101,
- 109,111,118,101,32,97,108,108,32,105,116,101,109,115,32,102,
- 114,111,109,32,83,78,41,2,114,49,1,0,0,114,129,1,
- 0,0,114,60,0,0,0,115,1,0,0,0,32,114,9,0,
- 0,0,114,51,1,0,0,122,21,77,117,116,97,98,108,101,
- 83,101,113,117,101,110,99,101,46,99,108,101,97,114,108,4,
- 0,0,115,42,0,0,0,128,0,240,4,4,9,17,216,18,
- 22,216,16,20,151,8,145,8,148,10,240,3,0,19,23,248,
- 228,15,25,242,0,1,9,17,217,12,16,240,3,1,9,17,
- 250,114,52,1,0,0,99,1,0,0,0,0,0,0,0,0,
- 0,0,0,5,0,0,0,3,0,0,0,243,122,0,0,0,
- 151,0,116,1,0,0,0,0,0,0,0,0,124,0,171,1,
- 0,0,0,0,0,0,125,1,116,3,0,0,0,0,0,0,
- 0,0,124,1,100,1,122,2,0,0,171,1,0,0,0,0,
- 0,0,68,0,93,31,0,0,125,2,124,0,124,1,124,2,
- 122,10,0,0,100,2,122,10,0,0,25,0,0,0,124,0,
- 124,2,25,0,0,0,99,2,124,0,124,2,60,0,0,0,
- 124,0,124,1,124,2,122,10,0,0,100,2,122,10,0,0,
- 60,0,0,0,140,33,4,0,121,3,41,4,122,33,83,46,
- 114,101,118,101,114,115,101,40,41,32,45,45,32,114,101,118,
- 101,114,115,101,32,42,73,78,32,80,76,65,67,69,42,114,
- 176,0,0,0,114,37,0,0,0,78,41,2,114,179,0,0,
- 0,114,138,1,0,0,41,3,114,61,0,0,0,114,29,1,
- 0,0,114,134,1,0,0,115,3,0,0,0,32,32,32,114,
- 9,0,0,0,218,7,114,101,118,101,114,115,101,122,23,77,
- 117,116,97,98,108,101,83,101,113,117,101,110,99,101,46,114,
- 101,118,101,114,115,101,116,4,0,0,115,73,0,0,0,128,
- 0,228,12,15,144,4,139,73,136,1,220,17,22,144,113,152,
- 33,145,116,150,27,136,65,216,35,39,168,1,168,33,169,3,
- 168,65,169,5,161,59,176,4,176,81,177,7,208,12,32,136,
- 68,144,17,137,71,144,84,152,33,152,65,153,35,152,97,153,
- 37,146,91,241,3,0,18,29,114,8,0,0,0,99,2,0,
- 0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,
- 0,0,243,82,0,0,0,151,0,124,1,124,0,117,0,114,
- 11,116,1,0,0,0,0,0,0,0,0,124,1,171,1,0,
- 0,0,0,0,0,125,1,124,1,68,0,93,19,0,0,125,
- 2,124,0,106,3,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,
- 0,1,0,140,21,4,0,121,1,41,2,122,77,83,46,101,
- 120,116,101,110,100,40,105,116,101,114,97,98,108,101,41,32,
- 45,45,32,101,120,116,101,110,100,32,115,101,113,117,101,110,
- 99,101,32,98,121,32,97,112,112,101,110,100,105,110,103,32,
- 101,108,101,109,101,110,116,115,32,102,114,111,109,32,116,104,
- 101,32,105,116,101,114,97,98,108,101,78,41,2,114,181,0,
- 0,0,114,172,1,0,0,41,3,114,61,0,0,0,114,79,
- 1,0,0,114,103,1,0,0,115,3,0,0,0,32,32,32,
- 114,9,0,0,0,218,6,101,120,116,101,110,100,122,22,77,
- 117,116,97,98,108,101,83,101,113,117,101,110,99,101,46,101,
- 120,116,101,110,100,122,4,0,0,115,39,0,0,0,128,0,
- 224,11,17,144,84,137,62,220,21,25,152,38,147,92,136,70,
- 219,17,23,136,65,216,12,16,143,75,137,75,152,1,141,78,
- 241,3,0,18,24,114,8,0,0,0,99,2,0,0,0,0,
- 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,243,
- 22,0,0,0,151,0,124,0,124,1,25,0,0,0,125,2,
- 124,0,124,1,61,0,124,2,83,0,41,1,122,153,83,46,
- 112,111,112,40,91,105,110,100,101,120,93,41,32,45,62,32,
- 105,116,101,109,32,45,45,32,114,101,109,111,118,101,32,97,
- 110,100,32,114,101,116,117,114,110,32,105,116,101,109,32,97,
- 116,32,105,110,100,101,120,32,40,100,101,102,97,117,108,116,
- 32,108,97,115,116,41,46,10,32,32,32,32,32,32,32,32,
- 32,32,32,82,97,105,115,101,32,73,110,100,101,120,69,114,
- 114,111,114,32,105,102,32,108,105,115,116,32,105,115,32,101,
- 109,112,116,121,32,111,114,32,105,110,100,101,120,32,105,115,
- 32,111,117,116,32,111,102,32,114,97,110,103,101,46,10,32,
- 32,32,32,32,32,32,32,114,7,0,0,0,41,3,114,61,
- 0,0,0,114,131,1,0,0,114,103,1,0,0,115,3,0,
- 0,0,32,32,32,114,9,0,0,0,114,49,1,0,0,122,
- 19,77,117,116,97,98,108,101,83,101,113,117,101,110,99,101,
- 46,112,111,112,129,4,0,0,115,25,0,0,0,128,0,240,
- 8,0,13,17,144,21,137,75,136,1,216,12,16,144,21,136,
- 75,216,15,16,136,8,114,8,0,0,0,99,2,0,0,0,
- 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,
- 243,40,0,0,0,151,0,124,0,124,0,106,1,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
- 1,171,1,0,0,0,0,0,0,61,0,121,1,41,2,122,
- 118,83,46,114,101,109,111,118,101,40,118,97,108,117,101,41,
- 32,45,45,32,114,101,109,111,118,101,32,102,105,114,115,116,
- 32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,118,
- 97,108,117,101,46,10,32,32,32,32,32,32,32,32,32,32,
- 32,82,97,105,115,101,32,86,97,108,117,101,69,114,114,111,
- 114,32,105,102,32,116,104,101,32,118,97,108,117,101,32,105,
- 115,32,110,111,116,32,112,114,101,115,101,110,116,46,10,32,
- 32,32,32,32,32,32,32,78,41,1,114,131,1,0,0,114,
- 86,0,0,0,115,2,0,0,0,32,32,114,9,0,0,0,
- 114,44,1,0,0,122,22,77,117,116,97,98,108,101,83,101,
- 113,117,101,110,99,101,46,114,101,109,111,118,101,137,4,0,
- 0,115,21,0,0,0,128,0,240,8,0,13,17,144,20,151,
- 26,145,26,152,69,211,17,34,209,12,35,114,8,0,0,0,
- 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
- 0,3,0,0,0,243,40,0,0,0,151,0,124,0,106,1,
+ 2,0,0,0,0,0,0,0,243,112,0,0,0,151,0,101,
+ 0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,101,
+ 5,100,3,132,0,171,0,0,0,0,0,0,0,90,6,101,
+ 5,100,4,132,0,171,0,0,0,0,0,0,0,90,7,101,
+ 5,100,5,132,0,171,0,0,0,0,0,0,0,90,8,100,
+ 6,132,0,90,9,100,7,132,0,90,10,100,8,132,0,90,
+ 11,100,9,132,0,90,12,100,14,100,10,132,1,90,13,100,
+ 11,132,0,90,14,100,12,132,0,90,15,121,13,41,15,114,
+ 34,0,0,0,122,174,65,108,108,32,116,104,101,32,111,112,
+ 101,114,97,116,105,111,110,115,32,111,110,32,97,32,114,101,
+ 97,100,45,119,114,105,116,101,32,115,101,113,117,101,110,99,
+ 101,46,10,10,32,32,32,32,67,111,110,99,114,101,116,101,
+ 32,115,117,98,99,108,97,115,115,101,115,32,109,117,115,116,
+ 32,112,114,111,118,105,100,101,32,95,95,110,101,119,95,95,
+ 32,111,114,32,95,95,105,110,105,116,95,95,44,10,32,32,
+ 32,32,95,95,103,101,116,105,116,101,109,95,95,44,32,95,
+ 95,115,101,116,105,116,101,109,95,95,44,32,95,95,100,101,
+ 108,105,116,101,109,95,95,44,32,95,95,108,101,110,95,95,
+ 44,32,97,110,100,32,105,110,115,101,114,116,40,41,46,10,
+ 32,32,32,32,114,7,0,0,0,99,3,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,3,0,0,0,243,14,
+ 0,0,0,151,0,116,0,0,0,0,0,0,0,0,0,130,
+ 1,114,6,0,0,0,114,128,1,0,0,169,3,114,61,0,
+ 0,0,114,131,1,0,0,114,87,0,0,0,115,3,0,0,
+ 0,32,32,32,114,9,0,0,0,114,111,1,0,0,122,27,
+ 77,117,116,97,98,108,101,83,101,113,117,101,110,99,101,46,
+ 95,95,115,101,116,105,116,101,109,95,95,91,4,0,0,114,
+ 132,1,0,0,114,8,0,0,0,99,2,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,3,0,0,0,243,14,
+ 0,0,0,151,0,116,0,0,0,0,0,0,0,0,0,130,
+ 1,114,6,0,0,0,114,128,1,0,0,114,130,1,0,0,
+ 115,2,0,0,0,32,32,114,9,0,0,0,114,113,1,0,
+ 0,122,27,77,117,116,97,98,108,101,83,101,113,117,101,110,
+ 99,101,46,95,95,100,101,108,105,116,101,109,95,95,95,4,
+ 0,0,114,132,1,0,0,114,8,0,0,0,99,3,0,0,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,
+ 0,243,14,0,0,0,151,0,116,0,0,0,0,0,0,0,
+ 0,0,130,1,41,1,122,51,83,46,105,110,115,101,114,116,
+ 40,105,110,100,101,120,44,32,118,97,108,117,101,41,32,45,
+ 45,32,105,110,115,101,114,116,32,118,97,108,117,101,32,98,
+ 101,102,111,114,101,32,105,110,100,101,120,114,128,1,0,0,
+ 114,167,1,0,0,115,3,0,0,0,32,32,32,114,9,0,
+ 0,0,218,6,105,110,115,101,114,116,122,22,77,117,116,97,
+ 98,108,101,83,101,113,117,101,110,99,101,46,105,110,115,101,
+ 114,116,99,4,0,0,115,10,0,0,0,128,0,244,6,0,
+ 15,25,208,8,24,114,8,0,0,0,99,2,0,0,0,0,
+ 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,243,
+ 58,0,0,0,151,0,124,0,106,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,116,3,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 124,1,171,2,0,0,0,0,0,0,1,0,121,1,41,2,
+ 122,58,83,46,97,112,112,101,110,100,40,118,97,108,117,101,
+ 41,32,45,45,32,97,112,112,101,110,100,32,118,97,108,117,
+ 101,32,116,111,32,116,104,101,32,101,110,100,32,111,102,32,
+ 116,104,101,32,115,101,113,117,101,110,99,101,78,41,2,114,
+ 170,1,0,0,114,179,0,0,0,114,86,0,0,0,115,2,
+ 0,0,0,32,32,114,9,0,0,0,218,6,97,112,112,101,
+ 110,100,122,22,77,117,116,97,98,108,101,83,101,113,117,101,
+ 110,99,101,46,97,112,112,101,110,100,104,4,0,0,115,20,
+ 0,0,0,128,0,224,8,12,143,11,137,11,148,67,152,4,
+ 147,73,152,117,213,8,37,114,8,0,0,0,99,1,0,0,
+ 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
+ 0,243,70,0,0,0,151,0,9,0,9,0,124,0,106,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,1,171,1,0,0,0,0,0,0,1,0,124,0,
- 83,0,114,6,0,0,0,41,1,114,177,1,0,0,41,2,
- 114,61,0,0,0,114,79,1,0,0,115,2,0,0,0,32,
- 32,114,9,0,0,0,218,8,95,95,105,97,100,100,95,95,
- 122,24,77,117,116,97,98,108,101,83,101,113,117,101,110,99,
- 101,46,95,95,105,97,100,100,95,95,143,4,0,0,115,19,
- 0,0,0,128,0,216,8,12,143,11,137,11,144,70,212,8,
- 27,216,15,19,136,11,114,8,0,0,0,78,41,1,114,191,
- 0,0,0,41,16,114,69,0,0,0,114,70,0,0,0,114,
- 71,0,0,0,114,204,0,0,0,114,72,0,0,0,114,4,
- 0,0,0,114,111,1,0,0,114,113,1,0,0,114,170,1,
- 0,0,114,172,1,0,0,114,51,1,0,0,114,175,1,0,
- 0,114,177,1,0,0,114,49,1,0,0,114,44,1,0,0,
- 114,181,1,0,0,114,7,0,0,0,114,8,0,0,0,114,
- 9,0,0,0,114,34,0,0,0,114,34,0,0,0,82,4,
- 0,0,115,107,0,0,0,132,0,241,2,4,5,8,240,12,
- 0,17,19,128,73,224,5,19,241,2,1,5,25,243,3,0,
- 6,20,240,2,1,5,25,240,6,0,6,20,241,2,1,5,
- 25,243,3,0,6,20,240,2,1,5,25,240,6,0,6,20,
- 241,2,2,5,25,243,3,0,6,20,240,2,2,5,25,242,
- 8,2,5,38,242,8,6,5,17,242,16,4,5,56,242,12,
- 5,5,27,243,14,6,5,17,242,16,4,5,36,243,12,2,
- 5,20,114,8,0,0,0,114,34,0,0,0,41,85,114,204,
- 0,0,0,218,3,97,98,99,114,3,0,0,0,114,4,0,
- 0,0,114,24,1,0,0,114,217,0,0,0,114,181,0,0,
- 0,114,171,0,0,0,114,80,0,0,0,218,12,69,108,108,
- 105,112,115,105,115,84,121,112,101,114,10,0,0,0,114,223,
- 0,0,0,218,7,95,95,97,108,108,95,95,114,69,0,0,
- 0,114,46,1,0,0,218,14,98,121,116,101,115,95,105,116,
- 101,114,97,116,111,114,218,9,98,121,116,101,97,114,114,97,
- 121,218,18,98,121,116,101,97,114,114,97,121,95,105,116,101,
- 114,97,116,111,114,114,75,1,0,0,218,16,100,105,99,116,
- 95,107,101,121,105,116,101,114,97,116,111,114,114,79,1,0,
- 0,218,18,100,105,99,116,95,118,97,108,117,101,105,116,101,
- 114,97,116,111,114,114,77,1,0,0,218,17,100,105,99,116,
- 95,105,116,101,109,105,116,101,114,97,116,111,114,218,13,108,
- 105,115,116,95,105,116,101,114,97,116,111,114,114,137,1,0,
- 0,218,20,108,105,115,116,95,114,101,118,101,114,115,101,105,
- 116,101,114,97,116,111,114,114,138,1,0,0,218,14,114,97,
- 110,103,101,95,105,116,101,114,97,116,111,114,218,18,108,111,
- 110,103,114,97,110,103,101,95,105,116,101,114,97,116,111,114,
- 114,95,1,0,0,218,12,115,101,116,95,105,116,101,114,97,
- 116,111,114,218,12,115,116,114,95,105,116,101,114,97,116,111,
- 114,218,14,116,117,112,108,101,95,105,116,101,114,97,116,111,
- 114,218,3,122,105,112,218,12,122,105,112,95,105,116,101,114,
- 97,116,111,114,218,9,100,105,99,116,95,107,101,121,115,218,
- 11,100,105,99,116,95,118,97,108,117,101,115,218,10,100,105,
- 99,116,95,105,116,101,109,115,114,49,0,0,0,218,12,109,
- 97,112,112,105,110,103,112,114,111,120,121,218,9,103,101,110,
- 101,114,97,116,111,114,114,42,0,0,0,218,9,99,111,114,
- 111,117,116,105,110,101,114,104,0,0,0,114,45,0,0,0,
- 218,15,97,115,121,110,99,95,103,101,110,101,114,97,116,111,
- 114,114,56,0,0,0,114,16,0,0,0,114,11,0,0,0,
- 114,12,0,0,0,218,8,114,101,103,105,115,116,101,114,114,
- 13,0,0,0,114,14,0,0,0,114,15,0,0,0,114,17,
- 0,0,0,114,18,0,0,0,114,20,0,0,0,114,19,0,
- 0,0,114,21,0,0,0,114,22,0,0,0,114,24,0,0,
- 0,114,36,0,0,0,114,174,0,0,0,114,182,0,0,0,
- 114,196,0,0,0,114,23,0,0,0,114,25,0,0,0,218,
- 9,102,114,111,122,101,110,115,101,116,114,26,0,0,0,114,
- 27,0,0,0,114,29,0,0,0,114,30,0,0,0,114,31,
- 0,0,0,114,32,0,0,0,114,28,0,0,0,114,81,1,
- 0,0,114,33,0,0,0,114,178,0,0,0,218,3,115,116,
- 114,114,172,0,0,0,114,149,1,0,0,114,35,0,0,0,
- 218,5,98,121,116,101,115,114,34,0,0,0,114,7,0,0,
- 0,114,8,0,0,0,114,9,0,0,0,218,8,60,109,111,
- 100,117,108,101,62,114,211,1,0,0,1,0,0,0,115,1,
- 5,0,0,240,3,1,1,1,241,8,3,1,4,247,62,0,
- 1,40,219,0,10,225,15,19,144,68,152,19,145,73,139,127,
- 128,12,217,15,19,144,67,139,121,128,12,218,0,14,217,15,
- 19,144,66,139,120,128,12,216,4,6,242,4,9,11,13,128,
- 7,240,30,0,12,29,128,8,241,18,0,18,22,145,100,152,
- 51,147,105,147,31,128,14,217,21,25,153,36,153,121,155,123,
- 211,26,43,211,21,44,208,0,18,225,19,23,153,4,152,82,
- 159,87,153,87,155,89,155,15,211,19,40,208,0,16,217,21,
- 25,153,36,152,114,159,121,153,121,155,123,211,26,43,211,21,
- 44,208,0,18,217,20,24,153,20,152,98,159,104,153,104,155,
- 106,211,25,41,211,20,42,208,0,17,217,16,20,145,84,152,
- 34,147,88,147,14,128,13,217,23,27,153,68,161,24,168,34,
- 163,28,211,28,46,211,23,47,208,0,20,217,17,21,145,100,
- 153,53,160,17,155,56,147,110,211,17,37,128,14,217,21,25,
- 153,36,153,117,160,81,168,36,161,89,211,31,47,211,26,48,
- 211,21,49,208,0,18,217,15,19,145,68,153,19,155,21,147,
- 75,211,15,32,128,12,217,15,19,145,68,152,18,147,72,139,
- 126,128,12,217,17,21,145,100,152,50,147,104,147,30,128,14,
- 217,15,19,145,68,153,19,155,21,147,75,211,15,32,128,12,
- 225,12,16,144,18,151,23,145,23,147,25,139,79,128,9,217,
- 14,18,144,50,151,57,145,57,147,59,211,14,31,128,11,217,
- 13,17,144,34,151,40,145,40,147,42,211,13,29,128,10,225,
- 15,19,144,68,151,77,145,77,211,15,34,128,12,217,12,16,
- 146,47,211,17,36,211,12,37,128,9,226,0,23,217,8,13,
- 139,7,128,5,217,12,16,144,21,139,75,128,9,216,0,5,
- 135,11,129,11,132,13,216,4,9,226,0,22,217,6,9,131,
- 101,128,3,217,18,22,144,115,147,41,128,15,216,4,7,242,
- 10,10,1,16,244,24,12,1,30,152,23,245,0,12,1,30,
- 244,30,14,1,50,152,39,245,0,14,1,50,244,34,38,1,
- 30,144,9,244,0,38,1,30,240,82,1,0,1,10,215,0,
- 18,209,0,18,144,57,212,0,29,244,6,14,1,50,152,103,
- 245,0,14,1,50,244,34,16,1,30,144,77,244,0,16,1,
- 30,244,38,45,1,30,144,93,244,0,45,1,30,240,96,1,
- 0,1,15,215,0,23,209,0,23,152,15,212,0,40,244,6,
- 15,1,50,152,23,245,0,15,1,50,244,36,16,1,30,136,
- 120,244,0,16,1,30,240,38,0,1,9,215,0,17,209,0,
- 17,144,46,212,0,33,216,0,8,215,0,17,209,0,17,208,
- 18,36,212,0,37,224,0,8,215,0,17,209,0,17,208,18,
- 34,212,0,35,216,0,8,215,0,17,209,0,17,208,18,36,
- 212,0,37,216,0,8,215,0,17,209,0,17,208,18,35,212,
- 0,36,216,0,8,215,0,17,209,0,17,144,45,212,0,32,
- 216,0,8,215,0,17,209,0,17,208,18,38,212,0,39,216,
+ 0,0,171,0,0,0,0,0,0,0,1,0,140,17,35,0,
+ 116,2,0,0,0,0,0,0,0,0,36,0,114,3,1,0,
+ 89,0,121,1,119,0,120,3,89,0,119,1,41,2,122,44,
+ 83,46,99,108,101,97,114,40,41,32,45,62,32,78,111,110,
+ 101,32,45,45,32,114,101,109,111,118,101,32,97,108,108,32,
+ 105,116,101,109,115,32,102,114,111,109,32,83,78,41,2,114,
+ 49,1,0,0,114,129,1,0,0,114,60,0,0,0,115,1,
+ 0,0,0,32,114,9,0,0,0,114,51,1,0,0,122,21,
+ 77,117,116,97,98,108,101,83,101,113,117,101,110,99,101,46,
+ 99,108,101,97,114,108,4,0,0,115,42,0,0,0,128,0,
+ 240,4,4,9,17,216,18,22,216,16,20,151,8,145,8,148,
+ 10,240,3,0,19,23,248,228,15,25,242,0,1,9,17,217,
+ 12,16,240,3,1,9,17,250,114,52,1,0,0,99,1,0,
+ 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,
+ 0,0,243,122,0,0,0,151,0,116,1,0,0,0,0,0,
+ 0,0,0,124,0,171,1,0,0,0,0,0,0,125,1,116,
+ 3,0,0,0,0,0,0,0,0,124,1,100,1,122,2,0,
+ 0,171,1,0,0,0,0,0,0,68,0,93,31,0,0,125,
+ 2,124,0,124,1,124,2,122,10,0,0,100,2,122,10,0,
+ 0,25,0,0,0,124,0,124,2,25,0,0,0,99,2,124,
+ 0,124,2,60,0,0,0,124,0,124,1,124,2,122,10,0,
+ 0,100,2,122,10,0,0,60,0,0,0,140,33,4,0,121,
+ 3,41,4,122,33,83,46,114,101,118,101,114,115,101,40,41,
+ 32,45,45,32,114,101,118,101,114,115,101,32,42,73,78,32,
+ 80,76,65,67,69,42,114,176,0,0,0,114,37,0,0,0,
+ 78,41,2,114,179,0,0,0,114,138,1,0,0,41,3,114,
+ 61,0,0,0,114,29,1,0,0,114,134,1,0,0,115,3,
+ 0,0,0,32,32,32,114,9,0,0,0,218,7,114,101,118,
+ 101,114,115,101,122,23,77,117,116,97,98,108,101,83,101,113,
+ 117,101,110,99,101,46,114,101,118,101,114,115,101,116,4,0,
+ 0,115,73,0,0,0,128,0,228,12,15,144,4,139,73,136,
+ 1,220,17,22,144,113,152,33,145,116,150,27,136,65,216,35,
+ 39,168,1,168,33,169,3,168,65,169,5,161,59,176,4,176,
+ 81,177,7,208,12,32,136,68,144,17,137,71,144,84,152,33,
+ 152,65,153,35,152,97,153,37,146,91,241,3,0,18,29,114,
+ 8,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,
+ 0,4,0,0,0,3,0,0,0,243,82,0,0,0,151,0,
+ 124,1,124,0,117,0,114,11,116,1,0,0,0,0,0,0,
+ 0,0,124,1,171,1,0,0,0,0,0,0,125,1,124,1,
+ 68,0,93,19,0,0,125,2,124,0,106,3,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,2,
+ 171,1,0,0,0,0,0,0,1,0,140,21,4,0,121,1,
+ 41,2,122,77,83,46,101,120,116,101,110,100,40,105,116,101,
+ 114,97,98,108,101,41,32,45,45,32,101,120,116,101,110,100,
+ 32,115,101,113,117,101,110,99,101,32,98,121,32,97,112,112,
+ 101,110,100,105,110,103,32,101,108,101,109,101,110,116,115,32,
+ 102,114,111,109,32,116,104,101,32,105,116,101,114,97,98,108,
+ 101,78,41,2,114,181,0,0,0,114,172,1,0,0,41,3,
+ 114,61,0,0,0,114,79,1,0,0,114,103,1,0,0,115,
+ 3,0,0,0,32,32,32,114,9,0,0,0,218,6,101,120,
+ 116,101,110,100,122,22,77,117,116,97,98,108,101,83,101,113,
+ 117,101,110,99,101,46,101,120,116,101,110,100,122,4,0,0,
+ 115,39,0,0,0,128,0,224,11,17,144,84,137,62,220,21,
+ 25,152,38,147,92,136,70,219,17,23,136,65,216,12,16,143,
+ 75,137,75,152,1,141,78,241,3,0,18,24,114,8,0,0,
+ 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
+ 0,0,3,0,0,0,243,22,0,0,0,151,0,124,0,124,
+ 1,25,0,0,0,125,2,124,0,124,1,61,0,124,2,83,
+ 0,41,1,122,153,83,46,112,111,112,40,91,105,110,100,101,
+ 120,93,41,32,45,62,32,105,116,101,109,32,45,45,32,114,
+ 101,109,111,118,101,32,97,110,100,32,114,101,116,117,114,110,
+ 32,105,116,101,109,32,97,116,32,105,110,100,101,120,32,40,
+ 100,101,102,97,117,108,116,32,108,97,115,116,41,46,10,32,
+ 32,32,32,32,32,32,32,32,32,32,82,97,105,115,101,32,
+ 73,110,100,101,120,69,114,114,111,114,32,105,102,32,108,105,
+ 115,116,32,105,115,32,101,109,112,116,121,32,111,114,32,105,
+ 110,100,101,120,32,105,115,32,111,117,116,32,111,102,32,114,
+ 97,110,103,101,46,10,32,32,32,32,32,32,32,32,114,7,
+ 0,0,0,41,3,114,61,0,0,0,114,131,1,0,0,114,
+ 103,1,0,0,115,3,0,0,0,32,32,32,114,9,0,0,
+ 0,114,49,1,0,0,122,19,77,117,116,97,98,108,101,83,
+ 101,113,117,101,110,99,101,46,112,111,112,129,4,0,0,115,
+ 25,0,0,0,128,0,240,8,0,13,17,144,21,137,75,136,
+ 1,216,12,16,144,21,136,75,216,15,16,136,8,114,8,0,
+ 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,
+ 0,0,0,3,0,0,0,243,40,0,0,0,151,0,124,0,
+ 124,0,106,1,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
+ 61,0,121,1,41,2,122,118,83,46,114,101,109,111,118,101,
+ 40,118,97,108,117,101,41,32,45,45,32,114,101,109,111,118,
+ 101,32,102,105,114,115,116,32,111,99,99,117,114,114,101,110,
+ 99,101,32,111,102,32,118,97,108,117,101,46,10,32,32,32,
+ 32,32,32,32,32,32,32,32,82,97,105,115,101,32,86,97,
+ 108,117,101,69,114,114,111,114,32,105,102,32,116,104,101,32,
+ 118,97,108,117,101,32,105,115,32,110,111,116,32,112,114,101,
+ 115,101,110,116,46,10,32,32,32,32,32,32,32,32,78,41,
+ 1,114,131,1,0,0,114,86,0,0,0,115,2,0,0,0,
+ 32,32,114,9,0,0,0,114,44,1,0,0,122,22,77,117,
+ 116,97,98,108,101,83,101,113,117,101,110,99,101,46,114,101,
+ 109,111,118,101,137,4,0,0,115,21,0,0,0,128,0,240,
+ 8,0,13,17,144,20,151,26,145,26,152,69,211,17,34,209,
+ 12,35,114,8,0,0,0,99,2,0,0,0,0,0,0,0,
+ 0,0,0,0,3,0,0,0,3,0,0,0,243,40,0,0,
+ 0,151,0,124,0,106,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,
+ 0,0,0,1,0,124,0,83,0,114,6,0,0,0,41,1,
+ 114,177,1,0,0,41,2,114,61,0,0,0,114,79,1,0,
+ 0,115,2,0,0,0,32,32,114,9,0,0,0,218,8,95,
+ 95,105,97,100,100,95,95,122,24,77,117,116,97,98,108,101,
+ 83,101,113,117,101,110,99,101,46,95,95,105,97,100,100,95,
+ 95,143,4,0,0,115,19,0,0,0,128,0,216,8,12,143,
+ 11,137,11,144,70,212,8,27,216,15,19,136,11,114,8,0,
+ 0,0,78,41,1,114,191,0,0,0,41,16,114,69,0,0,
+ 0,114,70,0,0,0,114,71,0,0,0,114,204,0,0,0,
+ 114,72,0,0,0,114,4,0,0,0,114,111,1,0,0,114,
+ 113,1,0,0,114,170,1,0,0,114,172,1,0,0,114,51,
+ 1,0,0,114,175,1,0,0,114,177,1,0,0,114,49,1,
+ 0,0,114,44,1,0,0,114,181,1,0,0,114,7,0,0,
+ 0,114,8,0,0,0,114,9,0,0,0,114,34,0,0,0,
+ 114,34,0,0,0,82,4,0,0,115,107,0,0,0,132,0,
+ 241,2,4,5,8,240,12,0,17,19,128,73,224,5,19,241,
+ 2,1,5,25,243,3,0,6,20,240,2,1,5,25,240,6,
+ 0,6,20,241,2,1,5,25,243,3,0,6,20,240,2,1,
+ 5,25,240,6,0,6,20,241,2,2,5,25,243,3,0,6,
+ 20,240,2,2,5,25,242,8,2,5,38,242,8,6,5,17,
+ 242,16,4,5,56,242,12,5,5,27,243,14,6,5,17,242,
+ 16,4,5,36,243,12,2,5,20,114,8,0,0,0,114,34,
+ 0,0,0,41,85,114,204,0,0,0,218,3,97,98,99,114,
+ 3,0,0,0,114,4,0,0,0,114,24,1,0,0,114,217,
+ 0,0,0,114,181,0,0,0,114,171,0,0,0,114,80,0,
+ 0,0,218,12,69,108,108,105,112,115,105,115,84,121,112,101,
+ 114,10,0,0,0,114,223,0,0,0,218,7,95,95,97,108,
+ 108,95,95,114,69,0,0,0,114,46,1,0,0,218,14,98,
+ 121,116,101,115,95,105,116,101,114,97,116,111,114,218,9,98,
+ 121,116,101,97,114,114,97,121,218,18,98,121,116,101,97,114,
+ 114,97,121,95,105,116,101,114,97,116,111,114,114,75,1,0,
+ 0,218,16,100,105,99,116,95,107,101,121,105,116,101,114,97,
+ 116,111,114,114,79,1,0,0,218,18,100,105,99,116,95,118,
+ 97,108,117,101,105,116,101,114,97,116,111,114,114,77,1,0,
+ 0,218,17,100,105,99,116,95,105,116,101,109,105,116,101,114,
+ 97,116,111,114,218,13,108,105,115,116,95,105,116,101,114,97,
+ 116,111,114,114,137,1,0,0,218,20,108,105,115,116,95,114,
+ 101,118,101,114,115,101,105,116,101,114,97,116,111,114,114,138,
+ 1,0,0,218,14,114,97,110,103,101,95,105,116,101,114,97,
+ 116,111,114,218,18,108,111,110,103,114,97,110,103,101,95,105,
+ 116,101,114,97,116,111,114,114,95,1,0,0,218,12,115,101,
+ 116,95,105,116,101,114,97,116,111,114,218,12,115,116,114,95,
+ 105,116,101,114,97,116,111,114,218,14,116,117,112,108,101,95,
+ 105,116,101,114,97,116,111,114,218,3,122,105,112,218,12,122,
+ 105,112,95,105,116,101,114,97,116,111,114,218,9,100,105,99,
+ 116,95,107,101,121,115,218,11,100,105,99,116,95,118,97,108,
+ 117,101,115,218,10,100,105,99,116,95,105,116,101,109,115,114,
+ 49,0,0,0,218,12,109,97,112,112,105,110,103,112,114,111,
+ 120,121,218,9,103,101,110,101,114,97,116,111,114,114,42,0,
+ 0,0,218,9,99,111,114,111,117,116,105,110,101,114,104,0,
+ 0,0,114,45,0,0,0,218,15,97,115,121,110,99,95,103,
+ 101,110,101,114,97,116,111,114,114,56,0,0,0,114,16,0,
+ 0,0,114,11,0,0,0,114,12,0,0,0,218,8,114,101,
+ 103,105,115,116,101,114,114,13,0,0,0,114,14,0,0,0,
+ 114,15,0,0,0,114,17,0,0,0,114,18,0,0,0,114,
+ 20,0,0,0,114,19,0,0,0,114,21,0,0,0,114,22,
+ 0,0,0,114,24,0,0,0,114,36,0,0,0,114,174,0,
+ 0,0,114,182,0,0,0,114,196,0,0,0,114,23,0,0,
+ 0,114,25,0,0,0,218,9,102,114,111,122,101,110,115,101,
+ 116,114,26,0,0,0,114,27,0,0,0,114,29,0,0,0,
+ 114,30,0,0,0,114,31,0,0,0,114,32,0,0,0,114,
+ 28,0,0,0,114,81,1,0,0,114,33,0,0,0,114,178,
+ 0,0,0,218,3,115,116,114,114,172,0,0,0,114,149,1,
+ 0,0,114,35,0,0,0,218,5,98,121,116,101,115,114,34,
+ 0,0,0,114,7,0,0,0,114,8,0,0,0,114,9,0,
+ 0,0,218,8,60,109,111,100,117,108,101,62,114,211,1,0,
+ 0,1,0,0,0,115,1,5,0,0,240,3,1,1,1,241,
+ 8,3,1,4,247,62,0,1,40,219,0,10,225,15,19,144,
+ 68,152,19,145,73,139,127,128,12,217,15,19,144,67,139,121,
+ 128,12,218,0,14,217,15,19,144,66,139,120,128,12,216,4,
+ 6,242,4,9,11,13,128,7,240,30,0,12,29,128,8,241,
+ 18,0,18,22,145,100,152,51,147,105,147,31,128,14,217,21,
+ 25,153,36,153,121,155,123,211,26,43,211,21,44,208,0,18,
+ 225,19,23,153,4,152,82,159,87,153,87,155,89,155,15,211,
+ 19,40,208,0,16,217,21,25,153,36,152,114,159,121,153,121,
+ 155,123,211,26,43,211,21,44,208,0,18,217,20,24,153,20,
+ 152,98,159,104,153,104,155,106,211,25,41,211,20,42,208,0,
+ 17,217,16,20,145,84,152,34,147,88,147,14,128,13,217,23,
+ 27,153,68,161,24,168,34,163,28,211,28,46,211,23,47,208,
+ 0,20,217,17,21,145,100,153,53,160,17,155,56,147,110,211,
+ 17,37,128,14,217,21,25,153,36,153,117,160,81,168,36,161,
+ 89,211,31,47,211,26,48,211,21,49,208,0,18,217,15,19,
+ 145,68,153,19,155,21,147,75,211,15,32,128,12,217,15,19,
+ 145,68,152,18,147,72,139,126,128,12,217,17,21,145,100,152,
+ 50,147,104,147,30,128,14,217,15,19,145,68,153,19,155,21,
+ 147,75,211,15,32,128,12,225,12,16,144,18,151,23,145,23,
+ 147,25,139,79,128,9,217,14,18,144,50,151,57,145,57,147,
+ 59,211,14,31,128,11,217,13,17,144,34,151,40,145,40,147,
+ 42,211,13,29,128,10,225,15,19,144,68,151,77,145,77,211,
+ 15,34,128,12,217,12,16,146,47,211,17,36,211,12,37,128,
+ 9,226,0,23,217,8,13,139,7,128,5,217,12,16,144,21,
+ 139,75,128,9,216,0,5,135,11,129,11,132,13,216,4,9,
+ 226,0,22,217,6,9,131,101,128,3,217,18,22,144,115,147,
+ 41,128,15,216,4,7,242,10,10,1,16,244,24,12,1,30,
+ 152,23,245,0,12,1,30,244,30,14,1,50,152,39,245,0,
+ 14,1,50,244,34,38,1,30,144,9,244,0,38,1,30,240,
+ 82,1,0,1,10,215,0,18,209,0,18,144,57,212,0,29,
+ 244,6,14,1,50,152,103,245,0,14,1,50,244,34,16,1,
+ 30,144,77,244,0,16,1,30,244,38,45,1,30,144,93,244,
+ 0,45,1,30,240,96,1,0,1,15,215,0,23,209,0,23,
+ 152,15,212,0,40,244,6,15,1,50,152,23,245,0,15,1,
+ 50,244,36,16,1,30,136,120,244,0,16,1,30,240,38,0,
+ 1,9,215,0,17,209,0,17,144,46,212,0,33,216,0,8,
+ 215,0,17,209,0,17,208,18,36,212,0,37,224,0,8,215,
+ 0,17,209,0,17,208,18,34,212,0,35,216,0,8,215,0,
+ 17,209,0,17,208,18,36,212,0,37,216,0,8,215,0,17,
+ 209,0,17,208,18,35,212,0,36,216,0,8,215,0,17,209,
+ 0,17,144,45,212,0,32,216,0,8,215,0,17,209,0,17,
+ 208,18,38,212,0,39,216,0,8,215,0,17,209,0,17,144,
+ 46,212,0,33,216,0,8,215,0,17,209,0,17,208,18,36,
+ 212,0,37,216,0,8,215,0,17,209,0,17,144,44,212,0,
+ 31,216,0,8,215,0,17,209,0,17,144,44,212,0,31,216,
0,8,215,0,17,209,0,17,144,46,212,0,33,216,0,8,
- 215,0,17,209,0,17,208,18,36,212,0,37,216,0,8,215,
- 0,17,209,0,17,144,44,212,0,31,216,0,8,215,0,17,
- 209,0,17,144,44,212,0,31,216,0,8,215,0,17,209,0,
- 17,144,46,212,0,33,216,0,8,215,0,17,209,0,17,144,
- 44,212,0,31,244,6,13,1,30,144,24,244,0,13,1,30,
- 244,32,45,1,30,144,8,244,0,45,1,30,240,96,1,0,
- 1,10,215,0,18,209,0,18,144,57,212,0,29,244,6,12,
- 1,30,144,103,245,0,12,1,30,244,30,14,1,50,152,39,
- 245,0,14,1,50,244,34,8,1,30,144,21,152,8,160,41,
- 244,0,8,1,30,244,22,12,1,30,144,119,245,0,12,1,
- 30,244,30,52,1,64,1,152,76,244,0,52,1,64,1,242,
- 108,1,10,1,86,1,242,24,15,1,21,244,36,14,1,59,
- 152,23,245,0,14,1,59,244,40,71,2,1,17,136,42,244,
- 0,71,2,1,17,240,84,4,0,1,4,135,12,129,12,136,
- 89,212,0,23,244,6,77,1,1,20,144,19,244,0,77,1,
- 1,20,240,96,2,0,1,11,215,0,19,209,0,19,144,67,
- 212,0,24,244,10,49,1,24,136,106,244,0,49,1,24,240,
- 102,1,0,1,8,215,0,16,209,0,16,144,28,212,0,30,
- 244,6,13,1,50,144,37,244,0,13,1,50,244,32,12,1,
- 33,136,123,152,67,244,0,12,1,33,240,30,0,1,9,215,
- 0,17,209,0,17,144,41,212,0,28,244,6,19,1,44,144,
- 11,152,83,244,0,19,1,44,240,44,0,1,10,215,0,18,
- 209,0,18,144,58,212,0,30,244,6,13,1,37,144,27,152,
- 106,244,0,13,1,37,240,32,0,1,11,215,0,19,209,0,
- 19,144,75,212,0,32,244,6,79,1,1,23,144,87,244,0,
- 79,1,1,23,240,100,2,0,1,15,215,0,23,209,0,23,
- 152,4,212,0,29,244,10,61,1,64,1,136,122,152,58,244,
- 0,61,1,64,1,240,126,1,0,1,9,215,0,17,209,0,
- 17,144,37,212,0,24,216,0,8,215,0,17,209,0,17,144,
- 35,212,0,22,216,0,8,215,0,17,209,0,17,144,37,212,
- 0,24,216,0,8,215,0,17,209,0,17,144,42,212,0,29,
- 244,4,18,1,51,152,119,244,0,18,1,51,244,40,6,1,
- 19,144,24,208,37,61,245,0,6,1,19,240,16,0,1,11,
- 215,0,19,209,0,19,144,69,212,0,26,216,0,10,215,0,
- 19,209,0,19,144,73,212,0,30,244,6,63,1,20,144,104,
- 244,0,63,1,20,240,68,2,0,1,16,215,0,24,209,0,
- 24,152,20,212,0,30,216,0,15,215,0,24,209,0,24,152,
- 25,213,0,35,114,8,0,0,0,
+ 215,0,17,209,0,17,144,44,212,0,31,244,6,13,1,30,
+ 144,24,244,0,13,1,30,244,32,45,1,30,144,8,244,0,
+ 45,1,30,240,96,1,0,1,10,215,0,18,209,0,18,144,
+ 57,212,0,29,244,6,12,1,30,144,103,245,0,12,1,30,
+ 244,30,14,1,50,152,39,245,0,14,1,50,244,34,8,1,
+ 30,144,21,152,8,160,41,244,0,8,1,30,244,22,12,1,
+ 30,144,119,245,0,12,1,30,244,30,52,1,64,1,152,76,
+ 244,0,52,1,64,1,242,108,1,10,1,86,1,242,24,15,
+ 1,21,244,36,14,1,59,152,23,245,0,14,1,59,244,40,
+ 71,2,1,17,136,42,244,0,71,2,1,17,240,84,4,0,
+ 1,4,135,12,129,12,136,89,212,0,23,244,6,77,1,1,
+ 20,144,19,244,0,77,1,1,20,240,96,2,0,1,11,215,
+ 0,19,209,0,19,144,67,212,0,24,244,10,49,1,24,136,
+ 106,244,0,49,1,24,240,102,1,0,1,8,215,0,16,209,
+ 0,16,144,28,212,0,30,244,6,13,1,50,144,37,244,0,
+ 13,1,50,244,32,12,1,33,136,123,152,67,244,0,12,1,
+ 33,240,30,0,1,9,215,0,17,209,0,17,144,41,212,0,
+ 28,244,6,19,1,44,144,11,152,83,244,0,19,1,44,240,
+ 44,0,1,10,215,0,18,209,0,18,144,58,212,0,30,244,
+ 6,13,1,37,144,27,152,106,244,0,13,1,37,240,32,0,
+ 1,11,215,0,19,209,0,19,144,75,212,0,32,244,6,79,
+ 1,1,23,144,87,244,0,79,1,1,23,240,100,2,0,1,
+ 15,215,0,23,209,0,23,152,4,212,0,29,244,10,61,1,
+ 64,1,136,122,152,58,244,0,61,1,64,1,240,126,1,0,
+ 1,9,215,0,17,209,0,17,144,37,212,0,24,216,0,8,
+ 215,0,17,209,0,17,144,35,212,0,22,216,0,8,215,0,
+ 17,209,0,17,144,37,212,0,24,216,0,8,215,0,17,209,
+ 0,17,144,42,212,0,29,244,4,18,1,51,152,119,244,0,
+ 18,1,51,244,40,6,1,19,144,24,208,37,61,245,0,6,
+ 1,19,240,16,0,1,11,215,0,19,209,0,19,144,69,212,
+ 0,26,216,0,10,215,0,19,209,0,19,144,73,212,0,30,
+ 244,6,63,1,20,144,104,244,0,63,1,20,240,68,2,0,
+ 1,16,215,0,24,209,0,24,152,20,212,0,30,216,0,15,
+ 215,0,24,209,0,24,152,25,213,0,35,114,8,0,0,0,
};
diff --git a/contrib/tools/python3/Python/frozen_modules/importlib._bootstrap_external.h b/contrib/tools/python3/Python/frozen_modules/importlib._bootstrap_external.h
index 742a31e268..4affed7e68 100644
--- a/contrib/tools/python3/Python/frozen_modules/importlib._bootstrap_external.h
+++ b/contrib/tools/python3/Python/frozen_modules/importlib._bootstrap_external.h
@@ -471,7 +471,7 @@ const unsigned char _Py_M__importlib__bootstrap_external[] = {
137,68,240,3,0,20,35,228,15,25,156,35,159,42,153,42,
155,44,168,4,211,15,45,208,8,45,224,15,19,136,11,114,
28,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,
- 0,6,0,0,0,3,0,0,0,243,196,1,0,0,151,0,
+ 0,6,0,0,0,3,0,0,0,243,246,1,0,0,151,0,
124,0,155,0,100,1,116,1,0,0,0,0,0,0,0,0,
124,0,171,1,0,0,0,0,0,0,155,0,157,3,125,3,
116,3,0,0,0,0,0,0,0,0,106,4,0,0,0,0,
@@ -488,3359 +488,3368 @@ const unsigned char _Py_M__importlib__bootstrap_external[] = {
0,0,0,0,124,4,100,3,171,2,0,0,0,0,0,0,
53,0,125,5,124,5,106,17,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
- 0,0,0,0,1,0,100,4,100,4,100,4,171,2,0,0,
- 0,0,0,0,1,0,116,3,0,0,0,0,0,0,0,0,
- 106,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,3,124,0,171,2,0,0,0,0,0,0,
- 1,0,121,4,35,0,49,0,115,1,119,2,1,0,89,0,
- 1,0,1,0,140,32,120,3,89,0,119,1,35,0,116,20,
- 0,0,0,0,0,0,0,0,36,0,114,39,1,0,9,0,
- 116,3,0,0,0,0,0,0,0,0,106,22,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,3,
- 171,1,0,0,0,0,0,0,1,0,130,0,35,0,116,20,
- 0,0,0,0,0,0,0,0,36,0,114,3,1,0,89,0,
- 130,0,119,0,120,3,89,0,119,1,119,0,120,3,89,0,
- 119,1,41,5,122,162,66,101,115,116,45,101,102,102,111,114,
- 116,32,102,117,110,99,116,105,111,110,32,116,111,32,119,114,
- 105,116,101,32,100,97,116,97,32,116,111,32,97,32,112,97,
- 116,104,32,97,116,111,109,105,99,97,108,108,121,46,10,32,
- 32,32,32,66,101,32,112,114,101,112,97,114,101,100,32,116,
- 111,32,104,97,110,100,108,101,32,97,32,70,105,108,101,69,
- 120,105,115,116,115,69,114,114,111,114,32,105,102,32,99,111,
- 110,99,117,114,114,101,110,116,32,119,114,105,116,105,110,103,
- 32,111,102,32,116,104,101,10,32,32,32,32,116,101,109,112,
- 111,114,97,114,121,32,102,105,108,101,32,105,115,32,97,116,
- 116,101,109,112,116,101,100,46,114,103,0,0,0,233,182,1,
- 0,0,218,2,119,98,78,41,12,218,2,105,100,114,23,0,
- 0,0,218,4,111,112,101,110,218,6,79,95,69,88,67,76,
- 218,7,79,95,67,82,69,65,84,218,8,79,95,87,82,79,
- 78,76,89,218,3,95,105,111,218,6,70,105,108,101,73,79,
- 218,5,119,114,105,116,101,114,99,0,0,0,114,87,0,0,
- 0,218,6,117,110,108,105,110,107,41,6,114,68,0,0,0,
- 114,48,0,0,0,114,89,0,0,0,218,8,112,97,116,104,
- 95,116,109,112,218,2,102,100,218,4,102,105,108,101,115,6,
- 0,0,0,32,32,32,32,32,32,114,10,0,0,0,218,13,
- 95,119,114,105,116,101,95,97,116,111,109,105,99,114,121,0,
- 0,0,195,0,0,0,115,196,0,0,0,128,0,240,10,0,
- 19,23,144,22,144,113,156,18,152,68,155,24,152,10,208,15,
- 35,128,72,220,9,12,143,24,137,24,144,40,220,18,21,151,
- 42,145,42,156,115,159,123,153,123,209,18,42,172,83,175,92,
- 169,92,209,18,57,184,52,192,37,185,60,243,3,1,10,73,
- 1,128,66,240,4,11,5,14,244,6,0,14,17,143,90,137,
- 90,152,2,152,68,212,13,33,160,84,216,12,16,143,74,137,
- 74,144,116,212,12,28,247,3,0,14,34,228,8,11,143,11,
- 137,11,144,72,152,100,213,8,35,247,5,0,14,34,208,13,
- 33,251,244,6,0,12,19,242,0,5,5,14,240,2,3,9,
- 17,220,12,15,143,74,137,74,144,120,212,12,32,240,6,0,
- 9,14,248,244,5,0,16,23,242,0,1,9,17,216,12,16,
- 216,8,13,240,5,1,9,17,250,240,7,5,5,14,250,115,
- 72,0,0,0,193,28,22,66,47,0,193,50,18,66,35,3,
- 194,4,30,66,47,0,194,35,5,66,44,7,194,40,7,66,
- 47,0,194,47,9,67,31,3,194,57,21,67,15,2,195,14,
- 1,67,31,3,195,15,9,67,27,5,195,24,2,67,31,3,
- 195,26,1,67,27,5,195,27,4,67,31,3,105,203,13,0,
- 0,114,52,0,0,0,114,39,0,0,0,115,2,0,0,0,
- 13,10,218,11,95,95,112,121,99,97,99,104,101,95,95,122,
- 4,111,112,116,45,122,3,46,112,121,122,4,46,112,121,119,
- 122,4,46,112,121,99,41,1,218,12,111,112,116,105,109,105,
- 122,97,116,105,111,110,99,2,0,0,0,0,0,0,0,1,
- 0,0,0,6,0,0,0,3,0,0,0,243,60,3,0,0,
- 151,0,124,1,129,47,116,1,0,0,0,0,0,0,0,0,
- 106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,100,2,116,4,0,0,0,0,0,0,0,0,
- 171,2,0,0,0,0,0,0,1,0,124,2,129,13,100,3,
- 125,3,116,7,0,0,0,0,0,0,0,0,124,3,171,1,
- 0,0,0,0,0,0,130,1,124,1,114,2,100,4,110,1,
- 100,5,125,2,116,9,0,0,0,0,0,0,0,0,106,10,
+ 0,0,0,0,125,6,100,4,100,4,100,4,171,2,0,0,
+ 0,0,0,0,1,0,127,6,116,19,0,0,0,0,0,0,
+ 0,0,124,1,171,1,0,0,0,0,0,0,107,55,0,0,
+ 114,11,116,21,0,0,0,0,0,0,0,0,100,5,171,1,
+ 0,0,0,0,0,0,130,1,116,3,0,0,0,0,0,0,
+ 0,0,106,22,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,3,124,0,171,2,0,0,0,0,
+ 0,0,1,0,121,4,35,0,49,0,115,1,119,2,1,0,
+ 89,0,1,0,1,0,140,57,120,3,89,0,119,1,35,0,
+ 116,20,0,0,0,0,0,0,0,0,36,0,114,39,1,0,
+ 9,0,116,3,0,0,0,0,0,0,0,0,106,24,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,3,171,1,0,0,0,0,0,0,1,0,130,0,35,0,
+ 116,20,0,0,0,0,0,0,0,0,36,0,114,3,1,0,
+ 89,0,130,0,119,0,120,3,89,0,119,1,119,0,120,3,
+ 89,0,119,1,41,6,122,162,66,101,115,116,45,101,102,102,
+ 111,114,116,32,102,117,110,99,116,105,111,110,32,116,111,32,
+ 119,114,105,116,101,32,100,97,116,97,32,116,111,32,97,32,
+ 112,97,116,104,32,97,116,111,109,105,99,97,108,108,121,46,
+ 10,32,32,32,32,66,101,32,112,114,101,112,97,114,101,100,
+ 32,116,111,32,104,97,110,100,108,101,32,97,32,70,105,108,
+ 101,69,120,105,115,116,115,69,114,114,111,114,32,105,102,32,
+ 99,111,110,99,117,114,114,101,110,116,32,119,114,105,116,105,
+ 110,103,32,111,102,32,116,104,101,10,32,32,32,32,116,101,
+ 109,112,111,114,97,114,121,32,102,105,108,101,32,105,115,32,
+ 97,116,116,101,109,112,116,101,100,46,114,103,0,0,0,233,
+ 182,1,0,0,218,2,119,98,78,122,41,111,115,46,119,114,
+ 105,116,101,40,41,32,100,105,100,110,39,116,32,119,114,105,
+ 116,101,32,116,104,101,32,102,117,108,108,32,112,121,99,32,
+ 102,105,108,101,41,13,218,2,105,100,114,23,0,0,0,218,
+ 4,111,112,101,110,218,6,79,95,69,88,67,76,218,7,79,
+ 95,67,82,69,65,84,218,8,79,95,87,82,79,78,76,89,
+ 218,3,95,105,111,218,6,70,105,108,101,73,79,218,5,119,
+ 114,105,116,101,114,7,0,0,0,114,87,0,0,0,114,99,
+ 0,0,0,218,6,117,110,108,105,110,107,41,7,114,68,0,
+ 0,0,114,48,0,0,0,114,89,0,0,0,218,8,112,97,
+ 116,104,95,116,109,112,218,2,102,100,218,4,102,105,108,101,
+ 218,13,98,121,116,101,115,95,119,114,105,116,116,101,110,115,
+ 7,0,0,0,32,32,32,32,32,32,32,114,10,0,0,0,
+ 218,13,95,119,114,105,116,101,95,97,116,111,109,105,99,114,
+ 122,0,0,0,195,0,0,0,115,224,0,0,0,128,0,240,
+ 10,0,19,23,144,22,144,113,156,18,152,68,155,24,152,10,
+ 208,15,35,128,72,220,9,12,143,24,137,24,144,40,220,18,
+ 21,151,42,145,42,156,115,159,123,153,123,209,18,42,172,83,
+ 175,92,169,92,209,18,57,184,52,192,37,185,60,243,3,1,
+ 10,73,1,128,66,240,4,15,5,14,244,6,0,14,17,143,
+ 90,137,90,152,2,152,68,212,13,33,160,84,216,28,32,159,
+ 74,153,74,160,116,211,28,44,136,77,247,3,0,14,34,224,
+ 11,24,156,67,160,4,155,73,210,11,37,244,6,0,19,26,
+ 208,26,69,211,18,70,208,12,70,220,8,11,143,11,137,11,
+ 144,72,152,100,213,8,35,247,13,0,14,34,208,13,33,251,
+ 244,14,0,12,19,242,0,5,5,14,240,2,3,9,17,220,
+ 12,15,143,74,137,74,144,120,212,12,32,240,6,0,9,14,
+ 248,244,5,0,16,23,242,0,1,9,17,216,12,16,216,8,
+ 13,240,5,1,9,17,250,240,7,5,5,14,250,115,72,0,
+ 0,0,193,28,22,67,8,0,193,50,18,66,60,3,194,4,
+ 55,67,8,0,194,60,5,67,5,7,195,1,7,67,8,0,
+ 195,8,9,67,56,3,195,18,21,67,40,2,195,39,1,67,
+ 56,3,195,40,9,67,52,5,195,49,2,67,56,3,195,51,
+ 1,67,52,5,195,52,4,67,56,3,105,203,13,0,0,114,
+ 52,0,0,0,114,39,0,0,0,115,2,0,0,0,13,10,
+ 218,11,95,95,112,121,99,97,99,104,101,95,95,122,4,111,
+ 112,116,45,122,3,46,112,121,122,4,46,112,121,119,122,4,
+ 46,112,121,99,41,1,218,12,111,112,116,105,109,105,122,97,
+ 116,105,111,110,99,2,0,0,0,0,0,0,0,1,0,0,
+ 0,6,0,0,0,3,0,0,0,243,60,3,0,0,151,0,
+ 124,1,129,47,116,1,0,0,0,0,0,0,0,0,106,2,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,100,2,116,4,0,0,0,0,0,0,0,0,171,2,
+ 0,0,0,0,0,0,1,0,124,2,129,13,100,3,125,3,
+ 116,7,0,0,0,0,0,0,0,0,124,3,171,1,0,0,
+ 0,0,0,0,130,1,124,1,114,2,100,4,110,1,100,5,
+ 125,2,116,9,0,0,0,0,0,0,0,0,106,10,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,0,171,1,0,0,0,0,0,0,125,0,116,13,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 92,2,0,0,125,4,125,5,124,5,106,15,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,6,
+ 171,1,0,0,0,0,0,0,92,3,0,0,125,6,125,7,
+ 125,8,116,16,0,0,0,0,0,0,0,0,106,18,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,0,171,1,0,0,0,0,0,0,125,0,116,13,
- 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
- 0,0,92,2,0,0,125,4,125,5,124,5,106,15,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 100,6,171,1,0,0,0,0,0,0,92,3,0,0,125,6,
- 125,7,125,8,116,16,0,0,0,0,0,0,0,0,106,18,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,106,20,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,125,9,124,9,128,11,116,23,0,0,
- 0,0,0,0,0,0,100,7,171,1,0,0,0,0,0,0,
- 130,1,100,4,106,25,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,6,114,2,124,6,110,1,
- 124,8,124,7,124,9,103,3,171,1,0,0,0,0,0,0,
- 125,10,124,2,128,58,116,16,0,0,0,0,0,0,0,0,
- 106,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,106,28,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,100,8,107,40,0,0,114,3,
- 100,4,125,2,110,26,116,16,0,0,0,0,0,0,0,0,
- 106,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,106,28,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,125,2,116,31,0,0,0,0,
- 0,0,0,0,124,2,171,1,0,0,0,0,0,0,125,2,
- 124,2,100,4,107,55,0,0,114,43,124,2,106,33,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 171,0,0,0,0,0,0,0,115,14,116,35,0,0,0,0,
- 0,0,0,0,124,2,155,2,100,9,157,2,171,1,0,0,
- 0,0,0,0,130,1,124,10,155,0,100,6,116,36,0,0,
- 0,0,0,0,0,0,155,0,124,2,155,0,157,4,125,10,
- 124,10,116,38,0,0,0,0,0,0,0,0,100,8,25,0,
- 0,0,122,0,0,0,125,11,116,16,0,0,0,0,0,0,
- 0,0,106,40,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,129,81,116,43,0,0,0,0,0,0,
- 0,0,124,4,171,1,0,0,0,0,0,0,125,4,124,4,
- 100,5,25,0,0,0,100,10,107,40,0,0,114,16,124,4,
- 100,8,25,0,0,0,116,44,0,0,0,0,0,0,0,0,
- 118,1,114,5,124,4,100,11,100,1,26,0,125,4,116,47,
- 0,0,0,0,0,0,0,0,116,16,0,0,0,0,0,0,
- 0,0,106,40,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,124,4,106,49,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,116,44,0,0,
- 0,0,0,0,0,0,171,1,0,0,0,0,0,0,124,11,
- 171,3,0,0,0,0,0,0,83,0,116,47,0,0,0,0,
- 0,0,0,0,124,4,116,50,0,0,0,0,0,0,0,0,
- 124,11,171,3,0,0,0,0,0,0,83,0,41,12,97,254,
- 2,0,0,71,105,118,101,110,32,116,104,101,32,112,97,116,
- 104,32,116,111,32,97,32,46,112,121,32,102,105,108,101,44,
- 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104,
- 32,116,111,32,105,116,115,32,46,112,121,99,32,102,105,108,
- 101,46,10,10,32,32,32,32,84,104,101,32,46,112,121,32,
- 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101,
- 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105,
- 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115,
- 32,116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,
- 10,32,32,32,32,46,112,121,99,32,102,105,108,101,32,99,
- 97,108,99,117,108,97,116,101,100,32,97,115,32,105,102,32,
- 116,104,101,32,46,112,121,32,102,105,108,101,32,119,101,114,
- 101,32,105,109,112,111,114,116,101,100,46,10,10,32,32,32,
- 32,84,104,101,32,39,111,112,116,105,109,105,122,97,116,105,
- 111,110,39,32,112,97,114,97,109,101,116,101,114,32,99,111,
- 110,116,114,111,108,115,32,116,104,101,32,112,114,101,115,117,
- 109,101,100,32,111,112,116,105,109,105,122,97,116,105,111,110,
- 32,108,101,118,101,108,32,111,102,10,32,32,32,32,116,104,
- 101,32,98,121,116,101,99,111,100,101,32,102,105,108,101,46,
- 32,73,102,32,39,111,112,116,105,109,105,122,97,116,105,111,
- 110,39,32,105,115,32,110,111,116,32,78,111,110,101,44,32,
- 116,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,
- 115,101,110,116,97,116,105,111,110,10,32,32,32,32,111,102,
- 32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,
- 32,116,97,107,101,110,32,97,110,100,32,118,101,114,105,102,
- 105,101,100,32,116,111,32,98,101,32,97,108,112,104,97,110,
- 117,109,101,114,105,99,32,40,101,108,115,101,32,86,97,108,
- 117,101,69,114,114,111,114,10,32,32,32,32,105,115,32,114,
- 97,105,115,101,100,41,46,10,10,32,32,32,32,84,104,101,
- 32,100,101,98,117,103,95,111,118,101,114,114,105,100,101,32,
- 112,97,114,97,109,101,116,101,114,32,105,115,32,100,101,112,
- 114,101,99,97,116,101,100,46,32,73,102,32,100,101,98,117,
- 103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111,
- 116,32,78,111,110,101,44,10,32,32,32,32,97,32,84,114,
- 117,101,32,118,97,108,117,101,32,105,115,32,116,104,101,32,
- 115,97,109,101,32,97,115,32,115,101,116,116,105,110,103,32,
- 39,111,112,116,105,109,105,122,97,116,105,111,110,39,32,116,
- 111,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,
- 110,103,10,32,32,32,32,119,104,105,108,101,32,97,32,70,
- 97,108,115,101,32,118,97,108,117,101,32,105,115,32,101,113,
- 117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,
- 105,110,103,32,39,111,112,116,105,109,105,122,97,116,105,111,
- 110,39,32,116,111,32,39,49,39,46,10,10,32,32,32,32,
- 73,102,32,115,121,115,46,105,109,112,108,101,109,101,110,116,
- 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32,
- 105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,116,
- 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,
+ 106,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,125,9,124,9,128,11,116,23,0,0,0,0,
+ 0,0,0,0,100,7,171,1,0,0,0,0,0,0,130,1,
+ 100,4,106,25,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,6,114,2,124,6,110,1,124,8,
+ 124,7,124,9,103,3,171,1,0,0,0,0,0,0,125,10,
+ 124,2,128,58,116,16,0,0,0,0,0,0,0,0,106,26,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,106,28,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,100,8,107,40,0,0,114,3,100,4,
+ 125,2,110,26,116,16,0,0,0,0,0,0,0,0,106,26,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,106,28,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,125,2,116,31,0,0,0,0,0,0,
+ 0,0,124,2,171,1,0,0,0,0,0,0,125,2,124,2,
+ 100,4,107,55,0,0,114,43,124,2,106,33,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,
+ 0,0,0,0,0,0,115,14,116,35,0,0,0,0,0,0,
+ 0,0,124,2,155,2,100,9,157,2,171,1,0,0,0,0,
+ 0,0,130,1,124,10,155,0,100,6,116,36,0,0,0,0,
+ 0,0,0,0,155,0,124,2,155,0,157,4,125,10,124,10,
+ 116,38,0,0,0,0,0,0,0,0,100,8,25,0,0,0,
+ 122,0,0,0,125,11,116,16,0,0,0,0,0,0,0,0,
+ 106,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,129,81,116,43,0,0,0,0,0,0,0,0,
+ 124,4,171,1,0,0,0,0,0,0,125,4,124,4,100,5,
+ 25,0,0,0,100,10,107,40,0,0,114,16,124,4,100,8,
+ 25,0,0,0,116,44,0,0,0,0,0,0,0,0,118,1,
+ 114,5,124,4,100,11,100,1,26,0,125,4,116,47,0,0,
+ 0,0,0,0,0,0,116,16,0,0,0,0,0,0,0,0,
+ 106,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,124,4,106,49,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,116,44,0,0,0,0,
+ 0,0,0,0,171,1,0,0,0,0,0,0,124,11,171,3,
+ 0,0,0,0,0,0,83,0,116,47,0,0,0,0,0,0,
+ 0,0,124,4,116,50,0,0,0,0,0,0,0,0,124,11,
+ 171,3,0,0,0,0,0,0,83,0,41,12,97,254,2,0,
+ 0,71,105,118,101,110,32,116,104,101,32,112,97,116,104,32,
+ 116,111,32,97,32,46,112,121,32,102,105,108,101,44,32,114,
+ 101,116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,
+ 111,32,105,116,115,32,46,112,121,99,32,102,105,108,101,46,
+ 10,10,32,32,32,32,84,104,101,32,46,112,121,32,102,105,
+ 108,101,32,100,111,101,115,32,110,111,116,32,110,101,101,100,
+ 32,116,111,32,101,120,105,115,116,59,32,116,104,105,115,32,
+ 115,105,109,112,108,121,32,114,101,116,117,114,110,115,32,116,
+ 104,101,32,112,97,116,104,32,116,111,32,116,104,101,10,32,
+ 32,32,32,46,112,121,99,32,102,105,108,101,32,99,97,108,
+ 99,117,108,97,116,101,100,32,97,115,32,105,102,32,116,104,
+ 101,32,46,112,121,32,102,105,108,101,32,119,101,114,101,32,
+ 105,109,112,111,114,116,101,100,46,10,10,32,32,32,32,84,
+ 104,101,32,39,111,112,116,105,109,105,122,97,116,105,111,110,
+ 39,32,112,97,114,97,109,101,116,101,114,32,99,111,110,116,
+ 114,111,108,115,32,116,104,101,32,112,114,101,115,117,109,101,
+ 100,32,111,112,116,105,109,105,122,97,116,105,111,110,32,108,
+ 101,118,101,108,32,111,102,10,32,32,32,32,116,104,101,32,
+ 98,121,116,101,99,111,100,101,32,102,105,108,101,46,32,73,
+ 102,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,
+ 32,105,115,32,110,111,116,32,78,111,110,101,44,32,116,104,
+ 101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,
+ 110,116,97,116,105,111,110,10,32,32,32,32,111,102,32,116,
+ 104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,116,
+ 97,107,101,110,32,97,110,100,32,118,101,114,105,102,105,101,
+ 100,32,116,111,32,98,101,32,97,108,112,104,97,110,117,109,
+ 101,114,105,99,32,40,101,108,115,101,32,86,97,108,117,101,
+ 69,114,114,111,114,10,32,32,32,32,105,115,32,114,97,105,
+ 115,101,100,41,46,10,10,32,32,32,32,84,104,101,32,100,
+ 101,98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,
+ 114,97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,
+ 99,97,116,101,100,46,32,73,102,32,100,101,98,117,103,95,
+ 111,118,101,114,114,105,100,101,32,105,115,32,110,111,116,32,
+ 78,111,110,101,44,10,32,32,32,32,97,32,84,114,117,101,
+ 32,118,97,108,117,101,32,105,115,32,116,104,101,32,115,97,
+ 109,101,32,97,115,32,115,101,116,116,105,110,103,32,39,111,
+ 112,116,105,109,105,122,97,116,105,111,110,39,32,116,111,32,
+ 116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,
+ 10,32,32,32,32,119,104,105,108,101,32,97,32,70,97,108,
+ 115,101,32,118,97,108,117,101,32,105,115,32,101,113,117,105,
+ 118,97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,
+ 103,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,
+ 32,116,111,32,39,49,39,46,10,10,32,32,32,32,73,102,
+ 32,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116,
+ 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115,
+ 32,78,111,110,101,32,116,104,101,110,32,78,111,116,73,109,
+ 112,108,101,109,101,110,116,101,100,69,114,114,111,114,32,105,
+ 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,78,
+ 122,70,116,104,101,32,100,101,98,117,103,95,111,118,101,114,
+ 114,105,100,101,32,112,97,114,97,109,101,116,101,114,32,105,
+ 115,32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,
+ 101,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39,
+ 32,105,110,115,116,101,97,100,122,50,100,101,98,117,103,95,
+ 111,118,101,114,114,105,100,101,32,111,114,32,111,112,116,105,
+ 109,105,122,97,116,105,111,110,32,109,117,115,116,32,98,101,
+ 32,115,101,116,32,116,111,32,78,111,110,101,114,12,0,0,
+ 0,114,6,0,0,0,114,103,0,0,0,250,36,115,121,115,
+ 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,
+ 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110,
+ 101,114,1,0,0,0,122,20,32,105,115,32,110,111,116,32,
+ 97,108,112,104,97,110,117,109,101,114,105,99,114,13,0,0,
+ 0,114,52,0,0,0,41,26,218,9,95,119,97,114,110,105,
+ 110,103,115,218,4,119,97,114,110,218,18,68,101,112,114,101,
+ 99,97,116,105,111,110,87,97,114,110,105,110,103,218,9,84,
+ 121,112,101,69,114,114,111,114,114,23,0,0,0,218,6,102,
+ 115,112,97,116,104,114,81,0,0,0,218,10,114,112,97,114,
+ 116,105,116,105,111,110,114,20,0,0,0,218,14,105,109,112,
+ 108,101,109,101,110,116,97,116,105,111,110,218,9,99,97,99,
+ 104,101,95,116,97,103,218,19,78,111,116,73,109,112,108,101,
+ 109,101,110,116,101,100,69,114,114,111,114,114,65,0,0,0,
+ 114,21,0,0,0,218,8,111,112,116,105,109,105,122,101,218,
+ 3,115,116,114,218,7,105,115,97,108,110,117,109,218,10,86,
+ 97,108,117,101,69,114,114,111,114,218,4,95,79,80,84,218,
+ 17,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,
+ 69,83,218,14,112,121,99,97,99,104,101,95,112,114,101,102,
+ 105,120,114,105,0,0,0,114,61,0,0,0,114,72,0,0,
+ 0,218,6,108,115,116,114,105,112,218,8,95,80,89,67,65,
+ 67,72,69,41,12,114,68,0,0,0,218,14,100,101,98,117,
+ 103,95,111,118,101,114,114,105,100,101,114,124,0,0,0,218,
+ 7,109,101,115,115,97,103,101,218,4,104,101,97,100,114,70,
+ 0,0,0,218,4,98,97,115,101,114,9,0,0,0,218,4,
+ 114,101,115,116,218,3,116,97,103,218,15,97,108,109,111,115,
+ 116,95,102,105,108,101,110,97,109,101,218,8,102,105,108,101,
+ 110,97,109,101,115,12,0,0,0,32,32,32,32,32,32,32,
+ 32,32,32,32,32,114,10,0,0,0,218,17,99,97,99,104,
+ 101,95,102,114,111,109,95,115,111,117,114,99,101,114,153,0,
+ 0,0,230,1,0,0,115,159,1,0,0,128,0,240,36,0,
+ 8,22,208,7,33,220,8,17,143,14,137,14,240,0,1,24,
+ 48,220,49,67,244,3,1,9,69,1,224,11,23,208,11,35,
+ 216,22,74,136,71,220,18,27,152,71,211,18,36,208,12,36,
+ 217,29,43,145,114,176,17,136,12,220,11,14,143,58,137,58,
+ 144,100,211,11,27,128,68,220,17,28,152,84,211,17,34,129,
+ 74,128,68,136,36,216,22,26,151,111,145,111,160,99,211,22,
+ 42,129,79,128,68,136,35,136,116,220,10,13,215,10,28,209,
+ 10,28,215,10,38,209,10,38,128,67,216,7,10,128,123,220,
+ 14,33,208,34,72,211,14,73,208,8,73,216,22,24,151,103,
+ 145,103,169,4,161,4,176,36,184,19,184,99,208,30,66,211,
+ 22,67,128,79,216,7,19,208,7,27,220,11,14,143,57,137,
+ 57,215,11,29,209,11,29,160,17,210,11,34,216,27,29,137,
+ 76,228,27,30,159,57,153,57,215,27,45,209,27,45,136,76,
+ 220,19,22,144,124,211,19,36,128,76,216,7,19,144,114,210,
+ 7,25,216,15,27,215,15,35,209,15,35,212,15,37,220,18,
+ 28,160,12,208,31,47,208,47,67,208,29,68,211,18,69,208,
+ 12,69,216,29,44,208,28,45,168,81,172,116,168,102,176,92,
+ 176,78,208,26,67,136,15,216,15,30,212,33,50,176,49,209,
+ 33,53,209,15,53,128,72,220,7,10,215,7,25,209,7,25,
+ 208,7,37,244,18,0,16,29,152,84,211,15,34,136,4,240,
+ 10,0,12,16,144,1,137,55,144,99,138,62,152,100,160,49,
+ 153,103,172,95,209,30,60,216,19,23,152,1,152,2,144,56,
+ 136,68,244,8,0,16,26,220,12,15,215,12,30,209,12,30,
+ 216,12,16,143,75,137,75,156,15,211,12,40,216,12,20,243,
+ 7,4,16,10,240,0,4,9,10,244,10,0,12,22,144,100,
+ 156,72,160,104,211,11,47,208,4,47,114,28,0,0,0,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,
+ 3,0,0,0,243,36,3,0,0,151,0,116,0,0,0,0,
+ 0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,106,4,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,128,11,116,
+ 7,0,0,0,0,0,0,0,0,100,2,171,1,0,0,0,
+ 0,0,0,130,1,116,9,0,0,0,0,0,0,0,0,106,
+ 10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,0,171,1,0,0,0,0,0,0,125,0,116,
+ 13,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
+ 0,0,0,92,2,0,0,125,1,125,2,100,3,125,3,116,
+ 0,0,0,0,0,0,0,0,0,106,14,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,129,75,116,
+ 0,0,0,0,0,0,0,0,0,106,14,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,106,17,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,116,18,0,0,0,0,0,0,0,0,171,1,0,0,0,
+ 0,0,0,125,4,124,1,106,21,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,124,4,116,22,0,
+ 0,0,0,0,0,0,0,122,0,0,0,171,1,0,0,0,
+ 0,0,0,114,16,124,1,116,25,0,0,0,0,0,0,0,
+ 0,124,4,171,1,0,0,0,0,0,0,100,1,26,0,125,
+ 1,100,4,125,3,124,3,115,43,116,13,0,0,0,0,0,
+ 0,0,0,124,1,171,1,0,0,0,0,0,0,92,2,0,
+ 0,125,1,125,5,124,5,116,26,0,0,0,0,0,0,0,
+ 0,107,55,0,0,114,20,116,29,0,0,0,0,0,0,0,
+ 0,116,26,0,0,0,0,0,0,0,0,155,0,100,5,124,
+ 0,155,2,157,3,171,1,0,0,0,0,0,0,130,1,124,
+ 2,106,31,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,100,6,171,1,0,0,0,0,0,0,125,
+ 6,124,6,100,7,118,1,114,14,116,29,0,0,0,0,0,
+ 0,0,0,100,8,124,2,155,2,157,2,171,1,0,0,0,
+ 0,0,0,130,1,124,6,100,9,107,40,0,0,114,109,124,
+ 2,106,33,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,100,6,100,10,171,2,0,0,0,0,0,
+ 0,100,11,25,0,0,0,125,7,124,7,106,21,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,
+ 34,0,0,0,0,0,0,0,0,171,1,0,0,0,0,0,
+ 0,115,18,116,29,0,0,0,0,0,0,0,0,100,12,116,
+ 34,0,0,0,0,0,0,0,0,155,2,157,2,171,1,0,
+ 0,0,0,0,0,130,1,124,7,116,25,0,0,0,0,0,
+ 0,0,0,116,34,0,0,0,0,0,0,0,0,171,1,0,
+ 0,0,0,0,0,100,1,26,0,125,8,124,8,106,37,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,171,0,0,0,0,0,0,0,115,15,116,29,0,0,0,
+ 0,0,0,0,0,100,13,124,7,155,2,100,14,157,3,171,
+ 1,0,0,0,0,0,0,130,1,124,2,106,39,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,
+ 6,171,1,0,0,0,0,0,0,100,15,25,0,0,0,125,
+ 9,116,41,0,0,0,0,0,0,0,0,124,1,124,9,116,
+ 42,0,0,0,0,0,0,0,0,100,15,25,0,0,0,122,
+ 0,0,0,171,2,0,0,0,0,0,0,83,0,41,16,97,
+ 110,1,0,0,71,105,118,101,110,32,116,104,101,32,112,97,
+ 116,104,32,116,111,32,97,32,46,112,121,99,46,32,102,105,
+ 108,101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,
+ 97,116,104,32,116,111,32,105,116,115,32,46,112,121,32,102,
+ 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112,
+ 121,99,32,102,105,108,101,32,100,111,101,115,32,110,111,116,
+ 32,110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,
+ 116,104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,
+ 114,110,115,32,116,104,101,32,112,97,116,104,32,116,111,10,
+ 32,32,32,32,116,104,101,32,46,112,121,32,102,105,108,101,
+ 32,99,97,108,99,117,108,97,116,101,100,32,116,111,32,99,
+ 111,114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,
+ 32,46,112,121,99,32,102,105,108,101,46,32,32,73,102,32,
+ 112,97,116,104,32,100,111,101,115,10,32,32,32,32,110,111,
+ 116,32,99,111,110,102,111,114,109,32,116,111,32,80,69,80,
+ 32,51,49,52,55,47,52,56,56,32,102,111,114,109,97,116,
+ 44,32,86,97,108,117,101,69,114,114,111,114,32,119,105,108,
+ 108,32,98,101,32,114,97,105,115,101,100,46,32,73,102,10,
+ 32,32,32,32,115,121,115,46,105,109,112,108,101,109,101,110,
+ 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,
+ 32,105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,
+ 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,
+ 114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,
+ 32,32,78,114,126,0,0,0,70,84,122,31,32,110,111,116,
+ 32,98,111,116,116,111,109,45,108,101,118,101,108,32,100,105,
+ 114,101,99,116,111,114,121,32,105,110,32,114,103,0,0,0,
+ 62,2,0,0,0,114,52,0,0,0,233,3,0,0,0,122,
+ 29,101,120,112,101,99,116,101,100,32,111,110,108,121,32,50,
+ 32,111,114,32,51,32,100,111,116,115,32,105,110,32,114,155,
+ 0,0,0,114,52,0,0,0,233,254,255,255,255,122,53,111,
+ 112,116,105,109,105,122,97,116,105,111,110,32,112,111,114,116,
+ 105,111,110,32,111,102,32,102,105,108,101,110,97,109,101,32,
+ 100,111,101,115,32,110,111,116,32,115,116,97,114,116,32,119,
+ 105,116,104,32,122,19,111,112,116,105,109,105,122,97,116,105,
+ 111,110,32,108,101,118,101,108,32,122,29,32,105,115,32,110,
+ 111,116,32,97,110,32,97,108,112,104,97,110,117,109,101,114,
+ 105,99,32,118,97,108,117,101,114,1,0,0,0,41,22,114,
+ 20,0,0,0,114,133,0,0,0,114,134,0,0,0,114,135,
+ 0,0,0,114,23,0,0,0,114,131,0,0,0,114,81,0,
+ 0,0,114,142,0,0,0,114,60,0,0,0,114,61,0,0,
+ 0,114,32,0,0,0,114,62,0,0,0,114,7,0,0,0,
+ 114,144,0,0,0,114,139,0,0,0,218,5,99,111,117,110,
+ 116,218,6,114,115,112,108,105,116,114,140,0,0,0,114,138,
+ 0,0,0,218,9,112,97,114,116,105,116,105,111,110,114,72,
+ 0,0,0,218,15,83,79,85,82,67,69,95,83,85,70,70,
+ 73,88,69,83,41,10,114,68,0,0,0,114,147,0,0,0,
+ 218,16,112,121,99,97,99,104,101,95,102,105,108,101,110,97,
+ 109,101,218,23,102,111,117,110,100,95,105,110,95,112,121,99,
+ 97,99,104,101,95,112,114,101,102,105,120,218,13,115,116,114,
+ 105,112,112,101,100,95,112,97,116,104,218,7,112,121,99,97,
+ 99,104,101,218,9,100,111,116,95,99,111,117,110,116,114,124,
+ 0,0,0,218,9,111,112,116,95,108,101,118,101,108,218,13,
+ 98,97,115,101,95,102,105,108,101,110,97,109,101,115,10,0,
+ 0,0,32,32,32,32,32,32,32,32,32,32,114,10,0,0,
+ 0,218,17,115,111,117,114,99,101,95,102,114,111,109,95,99,
+ 97,99,104,101,114,168,0,0,0,44,2,0,0,115,165,1,
+ 0,0,128,0,244,18,0,8,11,215,7,25,209,7,25,215,
+ 7,35,209,7,35,208,7,43,220,14,33,208,34,72,211,14,
+ 73,208,8,73,220,11,14,143,58,137,58,144,100,211,11,27,
+ 128,68,220,29,40,168,20,211,29,46,209,4,26,128,68,208,
+ 10,26,216,30,35,208,4,27,220,7,10,215,7,25,209,7,
+ 25,208,7,37,220,24,27,215,24,42,209,24,42,215,24,49,
+ 209,24,49,180,47,211,24,66,136,13,216,11,15,143,63,137,
+ 63,152,61,172,56,209,27,51,212,11,52,216,19,23,156,3,
+ 152,77,211,24,42,208,24,43,208,19,44,136,68,216,38,42,
+ 208,12,35,217,11,34,220,24,35,160,68,211,24,41,137,13,
+ 136,4,136,103,216,11,18,148,104,210,11,30,220,18,28,164,
+ 8,152,122,208,41,72,216,32,36,152,120,240,3,1,30,41,
+ 243,0,1,19,42,240,0,1,13,42,224,16,32,215,16,38,
+ 209,16,38,160,115,211,16,43,128,73,216,7,16,152,6,209,
+ 7,30,220,14,24,208,27,56,208,57,73,208,56,76,208,25,
+ 77,211,14,78,208,8,78,216,9,18,144,97,138,30,216,23,
+ 39,215,23,46,209,23,46,168,115,176,65,211,23,54,176,114,
+ 209,23,58,136,12,216,15,27,215,15,38,209,15,38,164,116,
+ 212,15,44,220,18,28,240,0,1,30,37,220,37,41,160,72,
+ 240,3,1,30,46,243,0,1,19,47,240,0,1,13,47,224,
+ 20,32,164,19,164,84,163,25,160,26,208,20,44,136,9,216,
+ 15,24,215,15,32,209,15,32,212,15,34,220,18,28,208,31,
+ 50,176,60,208,50,66,240,0,1,67,1,50,240,0,1,30,
+ 50,243,0,1,19,51,240,0,1,13,51,224,20,36,215,20,
+ 46,209,20,46,168,115,211,20,51,176,65,209,20,54,128,77,
+ 220,11,21,144,100,152,77,172,79,184,65,209,44,62,209,28,
+ 62,211,11,63,208,4,63,114,28,0,0,0,99,1,0,0,
+ 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
+ 0,243,232,0,0,0,151,0,116,1,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,100,1,107,40,
+ 0,0,114,1,121,2,124,0,106,3,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,100,3,171,1,
+ 0,0,0,0,0,0,92,3,0,0,125,1,125,2,125,3,
+ 124,1,114,22,124,3,106,5,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,
+ 0,0,100,4,100,5,26,0,100,6,107,55,0,0,114,2,
+ 124,0,83,0,9,0,116,7,0,0,0,0,0,0,0,0,
+ 124,0,171,1,0,0,0,0,0,0,125,4,116,13,0,0,
+ 0,0,0,0,0,0,124,4,171,1,0,0,0,0,0,0,
+ 114,2,124,4,83,0,124,0,83,0,35,0,116,8,0,0,
+ 0,0,0,0,0,0,116,10,0,0,0,0,0,0,0,0,
+ 102,2,36,0,114,8,1,0,124,0,100,2,100,5,26,0,
+ 125,4,89,0,140,37,119,0,120,3,89,0,119,1,41,7,
+ 122,188,67,111,110,118,101,114,116,32,97,32,98,121,116,101,
+ 99,111,100,101,32,102,105,108,101,32,112,97,116,104,32,116,
+ 111,32,97,32,115,111,117,114,99,101,32,112,97,116,104,32,
+ 40,105,102,32,112,111,115,115,105,98,108,101,41,46,10,10,
+ 32,32,32,32,84,104,105,115,32,102,117,110,99,116,105,111,
+ 110,32,101,120,105,115,116,115,32,112,117,114,101,108,121,32,
+ 102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,111,
+ 109,112,97,116,105,98,105,108,105,116,121,32,102,111,114,10,
+ 32,32,32,32,80,121,73,109,112,111,114,116,95,69,120,101,
+ 99,67,111,100,101,77,111,100,117,108,101,87,105,116,104,70,
+ 105,108,101,110,97,109,101,115,40,41,32,105,110,32,116,104,
+ 101,32,67,32,65,80,73,46,10,10,32,32,32,32,114,1,
+ 0,0,0,78,114,103,0,0,0,233,253,255,255,255,233,255,
+ 255,255,255,218,2,112,121,41,7,114,7,0,0,0,114,132,
+ 0,0,0,218,5,108,111,119,101,114,114,168,0,0,0,114,
+ 135,0,0,0,114,139,0,0,0,114,93,0,0,0,41,5,
+ 218,13,98,121,116,101,99,111,100,101,95,112,97,116,104,114,
+ 149,0,0,0,218,1,95,218,9,101,120,116,101,110,115,105,
+ 111,110,218,11,115,111,117,114,99,101,95,112,97,116,104,115,
+ 5,0,0,0,32,32,32,32,32,114,10,0,0,0,218,15,
+ 95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,114,
+ 178,0,0,0,84,2,0,0,115,142,0,0,0,128,0,244,
+ 14,0,8,11,136,61,211,7,25,152,81,210,7,30,216,15,
+ 19,216,25,38,215,25,49,209,25,49,176,35,211,25,54,209,
+ 4,22,128,68,136,33,136,89,217,11,15,144,57,151,63,145,
+ 63,211,19,36,160,82,168,2,208,19,43,168,116,210,19,51,
+ 216,15,28,208,8,28,240,2,3,5,41,220,22,39,168,13,
+ 211,22,54,136,11,244,6,0,27,39,160,123,212,26,51,136,
+ 59,208,4,70,184,29,208,4,70,248,244,5,0,13,32,164,
+ 26,208,11,44,242,0,1,5,41,216,22,35,160,67,160,82,
+ 208,22,40,138,11,240,3,1,5,41,250,115,18,0,0,0,
+ 193,0,11,65,26,0,193,26,20,65,49,3,193,48,1,65,
+ 49,3,99,1,0,0,0,0,0,0,0,0,0,0,0,5,
+ 0,0,0,3,0,0,0,243,182,0,0,0,151,0,124,0,
+ 106,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,116,3,0,0,0,0,0,0,0,0,116,4,
+ 0,0,0,0,0,0,0,0,171,1,0,0,0,0,0,0,
+ 171,1,0,0,0,0,0,0,114,12,9,0,116,7,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 83,0,124,0,106,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,116,3,0,0,0,0,0,0,
+ 0,0,116,10,0,0,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,171,1,0,0,0,0,0,0,114,2,124,0,
+ 83,0,121,0,35,0,116,8,0,0,0,0,0,0,0,0,
+ 36,0,114,3,1,0,89,0,121,0,119,0,120,3,89,0,
+ 119,1,114,77,0,0,0,41,6,114,59,0,0,0,218,5,
+ 116,117,112,108,101,114,160,0,0,0,114,153,0,0,0,114,
+ 135,0,0,0,114,141,0,0,0,41,1,114,152,0,0,0,
+ 115,1,0,0,0,32,114,10,0,0,0,218,11,95,103,101,
+ 116,95,99,97,99,104,101,100,114,181,0,0,0,103,2,0,
+ 0,115,87,0,0,0,128,0,216,7,15,215,7,24,209,7,
+ 24,156,21,156,127,211,25,47,212,7,48,240,2,3,9,17,
+ 220,19,36,160,88,211,19,46,208,12,46,240,6,0,10,18,
+ 215,9,26,209,9,26,156,53,212,33,50,211,27,51,212,9,
+ 52,216,15,23,136,15,224,15,19,248,244,11,0,16,35,242,
+ 0,1,9,17,217,12,16,240,3,1,9,17,250,115,17,0,
+ 0,0,160,10,65,12,0,193,12,9,65,24,3,193,23,1,
+ 65,24,3,99,1,0,0,0,0,0,0,0,0,0,0,0,
+ 4,0,0,0,3,0,0,0,243,94,0,0,0,151,0,9,
+ 0,116,1,0,0,0,0,0,0,0,0,124,0,171,1,0,
+ 0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,125,1,124,1,100,2,122,
+ 20,0,0,125,1,124,1,83,0,35,0,116,4,0,0,0,
+ 0,0,0,0,0,36,0,114,5,1,0,100,1,125,1,89,
+ 0,140,20,119,0,120,3,89,0,119,1,41,3,122,51,67,
+ 97,108,99,117,108,97,116,101,32,116,104,101,32,109,111,100,
+ 101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,
+ 114,32,97,32,98,121,116,101,99,111,100,101,32,102,105,108,
+ 101,46,114,107,0,0,0,233,128,0,0,0,41,3,114,85,
+ 0,0,0,114,88,0,0,0,114,87,0,0,0,41,2,114,
+ 68,0,0,0,114,89,0,0,0,115,2,0,0,0,32,32,
+ 114,10,0,0,0,218,10,95,99,97,108,99,95,109,111,100,
+ 101,114,184,0,0,0,115,2,0,0,115,61,0,0,0,128,
+ 0,240,4,3,5,21,220,15,25,152,36,211,15,31,215,15,
+ 39,209,15,39,136,4,240,10,0,5,9,136,69,129,77,128,
+ 68,216,11,15,128,75,248,244,11,0,12,19,242,0,1,5,
+ 21,216,15,20,138,4,240,3,1,5,21,250,115,12,0,0,
+ 0,130,21,30,0,158,11,44,3,171,1,44,3,99,1,0,
+ 0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,
+ 0,0,243,90,0,0,0,135,0,151,0,100,3,136,0,102,
+ 1,100,1,132,9,125,1,116,0,0,0,0,0,0,0,0,
+ 0,129,17,116,0,0,0,0,0,0,0,0,0,106,2,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,125,2,110,3,100,2,132,0,125,2,2,0,124,2,124,
+ 1,137,0,171,2,0,0,0,0,0,0,1,0,124,1,83,
+ 0,41,4,122,252,68,101,99,111,114,97,116,111,114,32,116,
+ 111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104,
+ 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,114,
+ 101,113,117,101,115,116,101,100,32,109,97,116,99,104,101,115,
+ 32,116,104,101,32,111,110,101,32,116,104,101,10,32,32,32,
+ 32,108,111,97,100,101,114,32,99,97,110,32,104,97,110,100,
+ 108,101,46,10,10,32,32,32,32,84,104,101,32,102,105,114,
+ 115,116,32,97,114,103,117,109,101,110,116,32,40,115,101,108,
+ 102,41,32,109,117,115,116,32,100,101,102,105,110,101,32,95,
+ 110,97,109,101,32,119,104,105,99,104,32,116,104,101,32,115,
+ 101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,
+ 115,10,32,32,32,32,99,111,109,112,97,114,101,100,32,97,
+ 103,97,105,110,115,116,46,32,73,102,32,116,104,101,32,99,
+ 111,109,112,97,114,105,115,111,110,32,102,97,105,108,115,32,
+ 116,104,101,110,32,73,109,112,111,114,116,69,114,114,111,114,
32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32,
- 32,78,122,70,116,104,101,32,100,101,98,117,103,95,111,118,
- 101,114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,
- 32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,
- 117,115,101,32,39,111,112,116,105,109,105,122,97,116,105,111,
- 110,39,32,105,110,115,116,101,97,100,122,50,100,101,98,117,
- 103,95,111,118,101,114,114,105,100,101,32,111,114,32,111,112,
- 116,105,109,105,122,97,116,105,111,110,32,109,117,115,116,32,
- 98,101,32,115,101,116,32,116,111,32,78,111,110,101,114,12,
- 0,0,0,114,6,0,0,0,114,103,0,0,0,250,36,115,
- 121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,111,
- 110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,78,
- 111,110,101,114,1,0,0,0,122,20,32,105,115,32,110,111,
- 116,32,97,108,112,104,97,110,117,109,101,114,105,99,114,13,
- 0,0,0,114,52,0,0,0,41,26,218,9,95,119,97,114,
- 110,105,110,103,115,218,4,119,97,114,110,218,18,68,101,112,
- 114,101,99,97,116,105,111,110,87,97,114,110,105,110,103,218,
- 9,84,121,112,101,69,114,114,111,114,114,23,0,0,0,218,
- 6,102,115,112,97,116,104,114,81,0,0,0,218,10,114,112,
- 97,114,116,105,116,105,111,110,114,20,0,0,0,218,14,105,
- 109,112,108,101,109,101,110,116,97,116,105,111,110,218,9,99,
- 97,99,104,101,95,116,97,103,218,19,78,111,116,73,109,112,
- 108,101,109,101,110,116,101,100,69,114,114,111,114,114,65,0,
- 0,0,114,21,0,0,0,218,8,111,112,116,105,109,105,122,
- 101,218,3,115,116,114,218,7,105,115,97,108,110,117,109,218,
- 10,86,97,108,117,101,69,114,114,111,114,218,4,95,79,80,
- 84,218,17,66,89,84,69,67,79,68,69,95,83,85,70,70,
- 73,88,69,83,218,14,112,121,99,97,99,104,101,95,112,114,
- 101,102,105,120,114,105,0,0,0,114,61,0,0,0,114,72,
- 0,0,0,218,6,108,115,116,114,105,112,218,8,95,80,89,
- 67,65,67,72,69,41,12,114,68,0,0,0,218,14,100,101,
- 98,117,103,95,111,118,101,114,114,105,100,101,114,123,0,0,
- 0,218,7,109,101,115,115,97,103,101,218,4,104,101,97,100,
- 114,70,0,0,0,218,4,98,97,115,101,114,9,0,0,0,
- 218,4,114,101,115,116,218,3,116,97,103,218,15,97,108,109,
- 111,115,116,95,102,105,108,101,110,97,109,101,218,8,102,105,
- 108,101,110,97,109,101,115,12,0,0,0,32,32,32,32,32,
- 32,32,32,32,32,32,32,114,10,0,0,0,218,17,99,97,
- 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,114,
- 152,0,0,0,226,1,0,0,115,159,1,0,0,128,0,240,
- 36,0,8,22,208,7,33,220,8,17,143,14,137,14,240,0,
- 1,24,48,220,49,67,244,3,1,9,69,1,224,11,23,208,
- 11,35,216,22,74,136,71,220,18,27,152,71,211,18,36,208,
- 12,36,217,29,43,145,114,176,17,136,12,220,11,14,143,58,
- 137,58,144,100,211,11,27,128,68,220,17,28,152,84,211,17,
- 34,129,74,128,68,136,36,216,22,26,151,111,145,111,160,99,
- 211,22,42,129,79,128,68,136,35,136,116,220,10,13,215,10,
- 28,209,10,28,215,10,38,209,10,38,128,67,216,7,10,128,
- 123,220,14,33,208,34,72,211,14,73,208,8,73,216,22,24,
- 151,103,145,103,169,4,161,4,176,36,184,19,184,99,208,30,
- 66,211,22,67,128,79,216,7,19,208,7,27,220,11,14,143,
- 57,137,57,215,11,29,209,11,29,160,17,210,11,34,216,27,
- 29,137,76,228,27,30,159,57,153,57,215,27,45,209,27,45,
- 136,76,220,19,22,144,124,211,19,36,128,76,216,7,19,144,
- 114,210,7,25,216,15,27,215,15,35,209,15,35,212,15,37,
- 220,18,28,160,12,208,31,47,208,47,67,208,29,68,211,18,
- 69,208,12,69,216,29,44,208,28,45,168,81,172,116,168,102,
- 176,92,176,78,208,26,67,136,15,216,15,30,212,33,50,176,
- 49,209,33,53,209,15,53,128,72,220,7,10,215,7,25,209,
- 7,25,208,7,37,244,18,0,16,29,152,84,211,15,34,136,
- 4,240,10,0,12,16,144,1,137,55,144,99,138,62,152,100,
- 160,49,153,103,172,95,209,30,60,216,19,23,152,1,152,2,
- 144,56,136,68,244,8,0,16,26,220,12,15,215,12,30,209,
- 12,30,216,12,16,143,75,137,75,156,15,211,12,40,216,12,
- 20,243,7,4,16,10,240,0,4,9,10,244,10,0,12,22,
- 144,100,156,72,160,104,211,11,47,208,4,47,114,28,0,0,
- 0,99,1,0,0,0,0,0,0,0,0,0,0,0,6,0,
- 0,0,3,0,0,0,243,36,3,0,0,151,0,116,0,0,
- 0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,106,4,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,
- 11,116,7,0,0,0,0,0,0,0,0,100,2,171,1,0,
- 0,0,0,0,0,130,1,116,9,0,0,0,0,0,0,0,
- 0,106,10,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,125,
- 0,116,13,0,0,0,0,0,0,0,0,124,0,171,1,0,
- 0,0,0,0,0,92,2,0,0,125,1,125,2,100,3,125,
- 3,116,0,0,0,0,0,0,0,0,0,106,14,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,
- 75,116,0,0,0,0,0,0,0,0,0,106,14,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
- 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,116,18,0,0,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,125,4,124,1,106,21,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,4,116,
- 22,0,0,0,0,0,0,0,0,122,0,0,0,171,1,0,
- 0,0,0,0,0,114,16,124,1,116,25,0,0,0,0,0,
- 0,0,0,124,4,171,1,0,0,0,0,0,0,100,1,26,
- 0,125,1,100,4,125,3,124,3,115,43,116,13,0,0,0,
- 0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,92,
- 2,0,0,125,1,125,5,124,5,116,26,0,0,0,0,0,
- 0,0,0,107,55,0,0,114,20,116,29,0,0,0,0,0,
- 0,0,0,116,26,0,0,0,0,0,0,0,0,155,0,100,
- 5,124,0,155,2,157,3,171,1,0,0,0,0,0,0,130,
- 1,124,2,106,31,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,100,6,171,1,0,0,0,0,0,
- 0,125,6,124,6,100,7,118,1,114,14,116,29,0,0,0,
- 0,0,0,0,0,100,8,124,2,155,2,157,2,171,1,0,
- 0,0,0,0,0,130,1,124,6,100,9,107,40,0,0,114,
- 109,124,2,106,33,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,100,6,100,10,171,2,0,0,0,
- 0,0,0,100,11,25,0,0,0,125,7,124,7,106,21,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,116,34,0,0,0,0,0,0,0,0,171,1,0,0,0,
- 0,0,0,115,18,116,29,0,0,0,0,0,0,0,0,100,
- 12,116,34,0,0,0,0,0,0,0,0,155,2,157,2,171,
- 1,0,0,0,0,0,0,130,1,124,7,116,25,0,0,0,
- 0,0,0,0,0,116,34,0,0,0,0,0,0,0,0,171,
- 1,0,0,0,0,0,0,100,1,26,0,125,8,124,8,106,
- 37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,171,0,0,0,0,0,0,0,115,15,116,29,0,
- 0,0,0,0,0,0,0,100,13,124,7,155,2,100,14,157,
- 3,171,1,0,0,0,0,0,0,130,1,124,2,106,39,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,100,6,171,1,0,0,0,0,0,0,100,15,25,0,0,
- 0,125,9,116,41,0,0,0,0,0,0,0,0,124,1,124,
- 9,116,42,0,0,0,0,0,0,0,0,100,15,25,0,0,
- 0,122,0,0,0,171,2,0,0,0,0,0,0,83,0,41,
- 16,97,110,1,0,0,71,105,118,101,110,32,116,104,101,32,
- 112,97,116,104,32,116,111,32,97,32,46,112,121,99,46,32,
- 102,105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,
- 32,112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,
- 32,102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,
- 46,112,121,99,32,102,105,108,101,32,100,111,101,115,32,110,
- 111,116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,
- 59,32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,
- 116,117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,
- 111,10,32,32,32,32,116,104,101,32,46,112,121,32,102,105,
- 108,101,32,99,97,108,99,117,108,97,116,101,100,32,116,111,
- 32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,
- 104,101,32,46,112,121,99,32,102,105,108,101,46,32,32,73,
- 102,32,112,97,116,104,32,100,111,101,115,10,32,32,32,32,
- 110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,80,
- 69,80,32,51,49,52,55,47,52,56,56,32,102,111,114,109,
- 97,116,44,32,86,97,108,117,101,69,114,114,111,114,32,119,
- 105,108,108,32,98,101,32,114,97,105,115,101,100,46,32,73,
- 102,10,32,32,32,32,115,121,115,46,105,109,112,108,101,109,
- 101,110,116,97,116,105,111,110,46,99,97,99,104,101,95,116,
- 97,103,32,105,115,32,78,111,110,101,32,116,104,101,110,32,
- 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,
- 114,111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,
- 32,32,32,32,78,114,125,0,0,0,70,84,122,31,32,110,
- 111,116,32,98,111,116,116,111,109,45,108,101,118,101,108,32,
- 100,105,114,101,99,116,111,114,121,32,105,110,32,114,103,0,
- 0,0,62,2,0,0,0,114,52,0,0,0,233,3,0,0,
- 0,122,29,101,120,112,101,99,116,101,100,32,111,110,108,121,
- 32,50,32,111,114,32,51,32,100,111,116,115,32,105,110,32,
- 114,154,0,0,0,114,52,0,0,0,233,254,255,255,255,122,
- 53,111,112,116,105,109,105,122,97,116,105,111,110,32,112,111,
- 114,116,105,111,110,32,111,102,32,102,105,108,101,110,97,109,
- 101,32,100,111,101,115,32,110,111,116,32,115,116,97,114,116,
- 32,119,105,116,104,32,122,19,111,112,116,105,109,105,122,97,
- 116,105,111,110,32,108,101,118,101,108,32,122,29,32,105,115,
- 32,110,111,116,32,97,110,32,97,108,112,104,97,110,117,109,
- 101,114,105,99,32,118,97,108,117,101,114,1,0,0,0,41,
- 22,114,20,0,0,0,114,132,0,0,0,114,133,0,0,0,
- 114,134,0,0,0,114,23,0,0,0,114,130,0,0,0,114,
- 81,0,0,0,114,141,0,0,0,114,60,0,0,0,114,61,
- 0,0,0,114,32,0,0,0,114,62,0,0,0,114,7,0,
- 0,0,114,143,0,0,0,114,138,0,0,0,218,5,99,111,
- 117,110,116,218,6,114,115,112,108,105,116,114,139,0,0,0,
- 114,137,0,0,0,218,9,112,97,114,116,105,116,105,111,110,
- 114,72,0,0,0,218,15,83,79,85,82,67,69,95,83,85,
- 70,70,73,88,69,83,41,10,114,68,0,0,0,114,146,0,
- 0,0,218,16,112,121,99,97,99,104,101,95,102,105,108,101,
- 110,97,109,101,218,23,102,111,117,110,100,95,105,110,95,112,
- 121,99,97,99,104,101,95,112,114,101,102,105,120,218,13,115,
- 116,114,105,112,112,101,100,95,112,97,116,104,218,7,112,121,
- 99,97,99,104,101,218,9,100,111,116,95,99,111,117,110,116,
- 114,123,0,0,0,218,9,111,112,116,95,108,101,118,101,108,
- 218,13,98,97,115,101,95,102,105,108,101,110,97,109,101,115,
- 10,0,0,0,32,32,32,32,32,32,32,32,32,32,114,10,
- 0,0,0,218,17,115,111,117,114,99,101,95,102,114,111,109,
- 95,99,97,99,104,101,114,167,0,0,0,40,2,0,0,115,
- 165,1,0,0,128,0,244,18,0,8,11,215,7,25,209,7,
- 25,215,7,35,209,7,35,208,7,43,220,14,33,208,34,72,
- 211,14,73,208,8,73,220,11,14,143,58,137,58,144,100,211,
- 11,27,128,68,220,29,40,168,20,211,29,46,209,4,26,128,
- 68,208,10,26,216,30,35,208,4,27,220,7,10,215,7,25,
- 209,7,25,208,7,37,220,24,27,215,24,42,209,24,42,215,
- 24,49,209,24,49,180,47,211,24,66,136,13,216,11,15,143,
- 63,137,63,152,61,172,56,209,27,51,212,11,52,216,19,23,
- 156,3,152,77,211,24,42,208,24,43,208,19,44,136,68,216,
- 38,42,208,12,35,217,11,34,220,24,35,160,68,211,24,41,
- 137,13,136,4,136,103,216,11,18,148,104,210,11,30,220,18,
- 28,164,8,152,122,208,41,72,216,32,36,152,120,240,3,1,
- 30,41,243,0,1,19,42,240,0,1,13,42,224,16,32,215,
- 16,38,209,16,38,160,115,211,16,43,128,73,216,7,16,152,
- 6,209,7,30,220,14,24,208,27,56,208,57,73,208,56,76,
- 208,25,77,211,14,78,208,8,78,216,9,18,144,97,138,30,
- 216,23,39,215,23,46,209,23,46,168,115,176,65,211,23,54,
- 176,114,209,23,58,136,12,216,15,27,215,15,38,209,15,38,
- 164,116,212,15,44,220,18,28,240,0,1,30,37,220,37,41,
- 160,72,240,3,1,30,46,243,0,1,19,47,240,0,1,13,
- 47,224,20,32,164,19,164,84,163,25,160,26,208,20,44,136,
- 9,216,15,24,215,15,32,209,15,32,212,15,34,220,18,28,
- 208,31,50,176,60,208,50,66,240,0,1,67,1,50,240,0,
- 1,30,50,243,0,1,19,51,240,0,1,13,51,224,20,36,
- 215,20,46,209,20,46,168,115,211,20,51,176,65,209,20,54,
- 128,77,220,11,21,144,100,152,77,172,79,184,65,209,44,62,
- 209,28,62,211,11,63,208,4,63,114,28,0,0,0,99,1,
- 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,
- 0,0,0,243,232,0,0,0,151,0,116,1,0,0,0,0,
- 0,0,0,0,124,0,171,1,0,0,0,0,0,0,100,1,
- 107,40,0,0,114,1,121,2,124,0,106,3,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,3,
- 171,1,0,0,0,0,0,0,92,3,0,0,125,1,125,2,
- 125,3,124,1,114,22,124,3,106,5,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,
- 0,0,0,0,100,4,100,5,26,0,100,6,107,55,0,0,
- 114,2,124,0,83,0,9,0,116,7,0,0,0,0,0,0,
- 0,0,124,0,171,1,0,0,0,0,0,0,125,4,116,13,
- 0,0,0,0,0,0,0,0,124,4,171,1,0,0,0,0,
- 0,0,114,2,124,4,83,0,124,0,83,0,35,0,116,8,
- 0,0,0,0,0,0,0,0,116,10,0,0,0,0,0,0,
- 0,0,102,2,36,0,114,8,1,0,124,0,100,2,100,5,
- 26,0,125,4,89,0,140,37,119,0,120,3,89,0,119,1,
- 41,7,122,188,67,111,110,118,101,114,116,32,97,32,98,121,
- 116,101,99,111,100,101,32,102,105,108,101,32,112,97,116,104,
- 32,116,111,32,97,32,115,111,117,114,99,101,32,112,97,116,
- 104,32,40,105,102,32,112,111,115,115,105,98,108,101,41,46,
- 10,10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,
- 105,111,110,32,101,120,105,115,116,115,32,112,117,114,101,108,
- 121,32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,
- 99,111,109,112,97,116,105,98,105,108,105,116,121,32,102,111,
- 114,10,32,32,32,32,80,121,73,109,112,111,114,116,95,69,
- 120,101,99,67,111,100,101,77,111,100,117,108,101,87,105,116,
- 104,70,105,108,101,110,97,109,101,115,40,41,32,105,110,32,
- 116,104,101,32,67,32,65,80,73,46,10,10,32,32,32,32,
- 114,1,0,0,0,78,114,103,0,0,0,233,253,255,255,255,
- 233,255,255,255,255,218,2,112,121,41,7,114,7,0,0,0,
- 114,131,0,0,0,218,5,108,111,119,101,114,114,167,0,0,
- 0,114,134,0,0,0,114,138,0,0,0,114,93,0,0,0,
- 41,5,218,13,98,121,116,101,99,111,100,101,95,112,97,116,
- 104,114,148,0,0,0,218,1,95,218,9,101,120,116,101,110,
- 115,105,111,110,218,11,115,111,117,114,99,101,95,112,97,116,
- 104,115,5,0,0,0,32,32,32,32,32,114,10,0,0,0,
- 218,15,95,103,101,116,95,115,111,117,114,99,101,102,105,108,
- 101,114,177,0,0,0,80,2,0,0,115,142,0,0,0,128,
- 0,244,14,0,8,11,136,61,211,7,25,152,81,210,7,30,
- 216,15,19,216,25,38,215,25,49,209,25,49,176,35,211,25,
- 54,209,4,22,128,68,136,33,136,89,217,11,15,144,57,151,
- 63,145,63,211,19,36,160,82,168,2,208,19,43,168,116,210,
- 19,51,216,15,28,208,8,28,240,2,3,5,41,220,22,39,
- 168,13,211,22,54,136,11,244,6,0,27,39,160,123,212,26,
- 51,136,59,208,4,70,184,29,208,4,70,248,244,5,0,13,
- 32,164,26,208,11,44,242,0,1,5,41,216,22,35,160,67,
- 160,82,208,22,40,138,11,240,3,1,5,41,250,115,18,0,
- 0,0,193,0,11,65,26,0,193,26,20,65,49,3,193,48,
- 1,65,49,3,99,1,0,0,0,0,0,0,0,0,0,0,
- 0,5,0,0,0,3,0,0,0,243,182,0,0,0,151,0,
- 124,0,106,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,116,3,0,0,0,0,0,0,0,0,
- 116,4,0,0,0,0,0,0,0,0,171,1,0,0,0,0,
- 0,0,171,1,0,0,0,0,0,0,114,12,9,0,116,7,
- 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
- 0,0,83,0,124,0,106,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,116,3,0,0,0,0,
- 0,0,0,0,116,10,0,0,0,0,0,0,0,0,171,1,
- 0,0,0,0,0,0,171,1,0,0,0,0,0,0,114,2,
- 124,0,83,0,121,0,35,0,116,8,0,0,0,0,0,0,
- 0,0,36,0,114,3,1,0,89,0,121,0,119,0,120,3,
- 89,0,119,1,114,77,0,0,0,41,6,114,59,0,0,0,
- 218,5,116,117,112,108,101,114,159,0,0,0,114,152,0,0,
- 0,114,134,0,0,0,114,140,0,0,0,41,1,114,151,0,
- 0,0,115,1,0,0,0,32,114,10,0,0,0,218,11,95,
- 103,101,116,95,99,97,99,104,101,100,114,180,0,0,0,99,
- 2,0,0,115,87,0,0,0,128,0,216,7,15,215,7,24,
- 209,7,24,156,21,156,127,211,25,47,212,7,48,240,2,3,
- 9,17,220,19,36,160,88,211,19,46,208,12,46,240,6,0,
- 10,18,215,9,26,209,9,26,156,53,212,33,50,211,27,51,
- 212,9,52,216,15,23,136,15,224,15,19,248,244,11,0,16,
- 35,242,0,1,9,17,217,12,16,240,3,1,9,17,250,115,
- 17,0,0,0,160,10,65,12,0,193,12,9,65,24,3,193,
- 23,1,65,24,3,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,4,0,0,0,3,0,0,0,243,94,0,0,0,151,
- 0,9,0,116,1,0,0,0,0,0,0,0,0,124,0,171,
- 1,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,125,1,124,1,100,
- 2,122,20,0,0,125,1,124,1,83,0,35,0,116,4,0,
- 0,0,0,0,0,0,0,36,0,114,5,1,0,100,1,125,
- 1,89,0,140,20,119,0,120,3,89,0,119,1,41,3,122,
- 51,67,97,108,99,117,108,97,116,101,32,116,104,101,32,109,
- 111,100,101,32,112,101,114,109,105,115,115,105,111,110,115,32,
- 102,111,114,32,97,32,98,121,116,101,99,111,100,101,32,102,
- 105,108,101,46,114,107,0,0,0,233,128,0,0,0,41,3,
- 114,85,0,0,0,114,88,0,0,0,114,87,0,0,0,41,
- 2,114,68,0,0,0,114,89,0,0,0,115,2,0,0,0,
- 32,32,114,10,0,0,0,218,10,95,99,97,108,99,95,109,
- 111,100,101,114,183,0,0,0,111,2,0,0,115,61,0,0,
- 0,128,0,240,4,3,5,21,220,15,25,152,36,211,15,31,
- 215,15,39,209,15,39,136,4,240,10,0,5,9,136,69,129,
- 77,128,68,216,11,15,128,75,248,244,11,0,12,19,242,0,
- 1,5,21,216,15,20,138,4,240,3,1,5,21,250,115,12,
- 0,0,0,130,21,30,0,158,11,44,3,171,1,44,3,99,
- 1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
- 3,0,0,0,243,90,0,0,0,135,0,151,0,100,3,136,
- 0,102,1,100,1,132,9,125,1,116,0,0,0,0,0,0,
- 0,0,0,129,17,116,0,0,0,0,0,0,0,0,0,106,
- 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,125,2,110,3,100,2,132,0,125,2,2,0,124,
- 2,124,1,137,0,171,2,0,0,0,0,0,0,1,0,124,
- 1,83,0,41,4,122,252,68,101,99,111,114,97,116,111,114,
- 32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32,
- 116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,
- 32,114,101,113,117,101,115,116,101,100,32,109,97,116,99,104,
- 101,115,32,116,104,101,32,111,110,101,32,116,104,101,10,32,
- 32,32,32,108,111,97,100,101,114,32,99,97,110,32,104,97,
- 110,100,108,101,46,10,10,32,32,32,32,84,104,101,32,102,
- 105,114,115,116,32,97,114,103,117,109,101,110,116,32,40,115,
- 101,108,102,41,32,109,117,115,116,32,100,101,102,105,110,101,
- 32,95,110,97,109,101,32,119,104,105,99,104,32,116,104,101,
- 32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,
- 32,105,115,10,32,32,32,32,99,111,109,112,97,114,101,100,
- 32,97,103,97,105,110,115,116,46,32,73,102,32,116,104,101,
- 32,99,111,109,112,97,114,105,115,111,110,32,102,97,105,108,
- 115,32,116,104,101,110,32,73,109,112,111,114,116,69,114,114,
- 111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,
- 32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,0,
- 6,0,0,0,31,0,0,0,243,148,0,0,0,149,1,151,
- 0,124,1,128,13,124,0,106,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,125,1,110,44,124,
- 0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,107,55,0,0,114,29,116,3,0,
- 0,0,0,0,0,0,0,100,1,124,0,106,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,
- 1,100,2,124,1,155,1,157,4,124,1,172,3,171,2,0,
- 0,0,0,0,0,130,1,2,0,137,4,124,0,124,1,103,
- 2,124,2,162,1,173,6,105,0,124,3,164,1,142,1,83,
- 0,41,4,78,122,11,108,111,97,100,101,114,32,102,111,114,
- 32,122,15,32,99,97,110,110,111,116,32,104,97,110,100,108,
- 101,32,169,1,218,4,110,97,109,101,41,2,114,187,0,0,
- 0,218,11,73,109,112,111,114,116,69,114,114,111,114,41,5,
- 218,4,115,101,108,102,114,187,0,0,0,218,4,97,114,103,
- 115,218,6,107,119,97,114,103,115,218,6,109,101,116,104,111,
- 100,115,5,0,0,0,32,32,32,32,128,114,10,0,0,0,
- 218,19,95,99,104,101,99,107,95,110,97,109,101,95,119,114,
- 97,112,112,101,114,122,40,95,99,104,101,99,107,95,110,97,
- 109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,101,
- 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,131,
- 2,0,0,115,82,0,0,0,248,128,0,216,11,15,136,60,
- 216,19,23,151,57,145,57,137,68,216,13,17,143,89,137,89,
- 152,36,210,13,30,221,18,29,216,33,37,167,25,163,25,169,
- 68,240,3,1,31,50,216,56,60,244,3,1,19,62,240,0,
- 1,13,62,225,15,21,144,100,152,68,208,15,50,160,52,210,
- 15,50,168,54,209,15,50,208,8,50,114,28,0,0,0,99,
- 2,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,
- 19,0,0,0,243,164,0,0,0,151,0,100,1,68,0,93,
- 38,0,0,125,2,116,1,0,0,0,0,0,0,0,0,124,
- 1,124,2,171,2,0,0,0,0,0,0,115,1,140,16,116,
- 3,0,0,0,0,0,0,0,0,124,0,124,2,116,5,0,
- 0,0,0,0,0,0,0,124,1,124,2,171,2,0,0,0,
- 0,0,0,171,3,0,0,0,0,0,0,1,0,140,40,4,
- 0,124,0,106,6,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,106,9,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,1,106,6,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,1,0,121,0,41,2,78,
- 41,4,218,10,95,95,109,111,100,117,108,101,95,95,218,8,
- 95,95,110,97,109,101,95,95,218,12,95,95,113,117,97,108,
- 110,97,109,101,95,95,218,7,95,95,100,111,99,95,95,41,
- 5,218,7,104,97,115,97,116,116,114,218,7,115,101,116,97,
- 116,116,114,218,7,103,101,116,97,116,116,114,218,8,95,95,
- 100,105,99,116,95,95,218,6,117,112,100,97,116,101,41,3,
- 218,3,110,101,119,218,3,111,108,100,114,99,0,0,0,115,
- 3,0,0,0,32,32,32,114,10,0,0,0,218,5,95,119,
- 114,97,112,122,26,95,99,104,101,99,107,95,110,97,109,101,
- 46,60,108,111,99,97,108,115,62,46,95,119,114,97,112,144,
- 2,0,0,115,66,0,0,0,128,0,219,27,80,144,7,220,
- 19,26,152,51,160,7,213,19,40,220,20,27,152,67,160,23,
- 172,39,176,35,176,119,211,42,63,213,20,64,240,5,0,28,
- 81,1,240,6,0,13,16,143,76,137,76,215,12,31,209,12,
- 31,160,3,167,12,161,12,213,12,45,114,28,0,0,0,114,
- 77,0,0,0,41,2,218,10,95,98,111,111,116,115,116,114,
- 97,112,114,206,0,0,0,41,3,114,192,0,0,0,114,193,
- 0,0,0,114,206,0,0,0,115,3,0,0,0,96,32,32,
- 114,10,0,0,0,218,11,95,99,104,101,99,107,95,110,97,
- 109,101,114,208,0,0,0,123,2,0,0,115,51,0,0,0,
- 248,128,0,245,16,6,5,51,244,20,0,8,18,208,7,29,
- 220,16,26,215,16,32,209,16,32,137,5,242,4,4,9,46,
- 241,12,0,5,10,208,10,29,152,118,212,4,38,216,11,30,
- 208,4,30,114,28,0,0,0,99,3,0,0,0,0,0,0,
- 0,0,0,0,0,5,0,0,0,3,0,0,0,243,44,1,
- 0,0,151,0,124,0,100,1,100,2,26,0,125,3,124,3,
- 116,0,0,0,0,0,0,0,0,0,107,55,0,0,114,42,
- 100,3,124,1,155,2,100,4,124,3,155,2,157,4,125,4,
- 116,2,0,0,0,0,0,0,0,0,106,5,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,5,
- 124,4,171,2,0,0,0,0,0,0,1,0,116,7,0,0,
- 0,0,0,0,0,0,124,4,102,1,105,0,124,2,164,1,
- 142,1,130,1,116,9,0,0,0,0,0,0,0,0,124,0,
- 171,1,0,0,0,0,0,0,100,6,107,2,0,0,114,38,
- 100,7,124,1,155,2,157,2,125,4,116,2,0,0,0,0,
- 0,0,0,0,106,5,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,100,5,124,4,171,2,0,0,
- 0,0,0,0,1,0,116,11,0,0,0,0,0,0,0,0,
- 124,4,171,1,0,0,0,0,0,0,130,1,116,13,0,0,
- 0,0,0,0,0,0,124,0,100,2,100,8,26,0,171,1,
- 0,0,0,0,0,0,125,5,124,5,100,9,122,1,0,0,
- 114,20,100,10,124,5,155,2,100,11,124,1,155,2,157,4,
- 125,4,116,7,0,0,0,0,0,0,0,0,124,4,102,1,
- 105,0,124,2,164,1,142,1,130,1,124,5,83,0,41,12,
- 97,84,2,0,0,80,101,114,102,111,114,109,32,98,97,115,
- 105,99,32,118,97,108,105,100,105,116,121,32,99,104,101,99,
- 107,105,110,103,32,111,102,32,97,32,112,121,99,32,104,101,
- 97,100,101,114,32,97,110,100,32,114,101,116,117,114,110,32,
- 116,104,101,32,102,108,97,103,115,32,102,105,101,108,100,44,
- 10,32,32,32,32,119,104,105,99,104,32,100,101,116,101,114,
- 109,105,110,101,115,32,104,111,119,32,116,104,101,32,112,121,
- 99,32,115,104,111,117,108,100,32,98,101,32,102,117,114,116,
- 104,101,114,32,118,97,108,105,100,97,116,101,100,32,97,103,
- 97,105,110,115,116,32,116,104,101,32,115,111,117,114,99,101,
- 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,
- 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,
- 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,
- 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,
- 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,
- 114,101,113,117,105,114,101,100,44,32,116,104,111,117,103,104,
- 46,41,10,10,32,32,32,32,42,110,97,109,101,42,32,105,
- 115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,
- 101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,
- 109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,
- 115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,
- 10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,
- 108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,
- 97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,
- 112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,
- 114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,
- 109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,
- 103,46,10,10,32,32,32,32,73,109,112,111,114,116,69,114,
- 114,111,114,32,105,115,32,114,97,105,115,101,100,32,119,104,
- 101,110,32,116,104,101,32,109,97,103,105,99,32,110,117,109,
- 98,101,114,32,105,115,32,105,110,99,111,114,114,101,99,116,
- 32,111,114,32,119,104,101,110,32,116,104,101,32,102,108,97,
- 103,115,10,32,32,32,32,102,105,101,108,100,32,105,115,32,
- 105,110,118,97,108,105,100,46,32,69,79,70,69,114,114,111,
+ 32,99,2,0,0,0,0,0,0,0,0,0,0,0,6,0,
+ 0,0,31,0,0,0,243,148,0,0,0,149,1,151,0,124,
+ 1,128,13,124,0,106,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,125,1,110,44,124,0,106,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,1,107,55,0,0,114,29,116,3,0,0,0,
+ 0,0,0,0,0,100,1,124,0,106,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,155,1,100,
+ 2,124,1,155,1,157,4,124,1,172,3,171,2,0,0,0,
+ 0,0,0,130,1,2,0,137,4,124,0,124,1,103,2,124,
+ 2,162,1,173,6,105,0,124,3,164,1,142,1,83,0,41,
+ 4,78,122,11,108,111,97,100,101,114,32,102,111,114,32,122,
+ 15,32,99,97,110,110,111,116,32,104,97,110,100,108,101,32,
+ 169,1,218,4,110,97,109,101,41,2,114,188,0,0,0,218,
+ 11,73,109,112,111,114,116,69,114,114,111,114,41,5,218,4,
+ 115,101,108,102,114,188,0,0,0,218,4,97,114,103,115,218,
+ 6,107,119,97,114,103,115,218,6,109,101,116,104,111,100,115,
+ 5,0,0,0,32,32,32,32,128,114,10,0,0,0,218,19,
+ 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,
+ 112,101,114,122,40,95,99,104,101,99,107,95,110,97,109,101,
+ 46,60,108,111,99,97,108,115,62,46,95,99,104,101,99,107,
+ 95,110,97,109,101,95,119,114,97,112,112,101,114,135,2,0,
+ 0,115,82,0,0,0,248,128,0,216,11,15,136,60,216,19,
+ 23,151,57,145,57,137,68,216,13,17,143,89,137,89,152,36,
+ 210,13,30,221,18,29,216,33,37,167,25,163,25,169,68,240,
+ 3,1,31,50,216,56,60,244,3,1,19,62,240,0,1,13,
+ 62,225,15,21,144,100,152,68,208,15,50,160,52,210,15,50,
+ 168,54,209,15,50,208,8,50,114,28,0,0,0,99,2,0,
+ 0,0,0,0,0,0,0,0,0,0,9,0,0,0,19,0,
+ 0,0,243,164,0,0,0,151,0,100,1,68,0,93,38,0,
+ 0,125,2,116,1,0,0,0,0,0,0,0,0,124,1,124,
+ 2,171,2,0,0,0,0,0,0,115,1,140,16,116,3,0,
+ 0,0,0,0,0,0,0,124,0,124,2,116,5,0,0,0,
+ 0,0,0,0,0,124,1,124,2,171,2,0,0,0,0,0,
+ 0,171,3,0,0,0,0,0,0,1,0,140,40,4,0,124,
+ 0,106,6,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,106,9,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,106,6,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
+ 1,0,0,0,0,0,0,1,0,121,0,41,2,78,41,4,
+ 218,10,95,95,109,111,100,117,108,101,95,95,218,8,95,95,
+ 110,97,109,101,95,95,218,12,95,95,113,117,97,108,110,97,
+ 109,101,95,95,218,7,95,95,100,111,99,95,95,41,5,218,
+ 7,104,97,115,97,116,116,114,218,7,115,101,116,97,116,116,
+ 114,218,7,103,101,116,97,116,116,114,218,8,95,95,100,105,
+ 99,116,95,95,218,6,117,112,100,97,116,101,41,3,218,3,
+ 110,101,119,218,3,111,108,100,114,99,0,0,0,115,3,0,
+ 0,0,32,32,32,114,10,0,0,0,218,5,95,119,114,97,
+ 112,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60,
+ 108,111,99,97,108,115,62,46,95,119,114,97,112,148,2,0,
+ 0,115,66,0,0,0,128,0,219,27,80,144,7,220,19,26,
+ 152,51,160,7,213,19,40,220,20,27,152,67,160,23,172,39,
+ 176,35,176,119,211,42,63,213,20,64,240,5,0,28,81,1,
+ 240,6,0,13,16,143,76,137,76,215,12,31,209,12,31,160,
+ 3,167,12,161,12,213,12,45,114,28,0,0,0,114,77,0,
+ 0,0,41,2,218,10,95,98,111,111,116,115,116,114,97,112,
+ 114,207,0,0,0,41,3,114,193,0,0,0,114,194,0,0,
+ 0,114,207,0,0,0,115,3,0,0,0,96,32,32,114,10,
+ 0,0,0,218,11,95,99,104,101,99,107,95,110,97,109,101,
+ 114,209,0,0,0,127,2,0,0,115,51,0,0,0,248,128,
+ 0,245,16,6,5,51,244,20,0,8,18,208,7,29,220,16,
+ 26,215,16,32,209,16,32,137,5,242,4,4,9,46,241,12,
+ 0,5,10,208,10,29,152,118,212,4,38,216,11,30,208,4,
+ 30,114,28,0,0,0,99,3,0,0,0,0,0,0,0,0,
+ 0,0,0,5,0,0,0,3,0,0,0,243,44,1,0,0,
+ 151,0,124,0,100,1,100,2,26,0,125,3,124,3,116,0,
+ 0,0,0,0,0,0,0,0,107,55,0,0,114,42,100,3,
+ 124,1,155,2,100,4,124,3,155,2,157,4,125,4,116,2,
+ 0,0,0,0,0,0,0,0,106,5,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,100,5,124,4,
+ 171,2,0,0,0,0,0,0,1,0,116,7,0,0,0,0,
+ 0,0,0,0,124,4,102,1,105,0,124,2,164,1,142,1,
+ 130,1,116,9,0,0,0,0,0,0,0,0,124,0,171,1,
+ 0,0,0,0,0,0,100,6,107,2,0,0,114,38,100,7,
+ 124,1,155,2,157,2,125,4,116,2,0,0,0,0,0,0,
+ 0,0,106,5,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,100,5,124,4,171,2,0,0,0,0,
+ 0,0,1,0,116,11,0,0,0,0,0,0,0,0,124,4,
+ 171,1,0,0,0,0,0,0,130,1,116,13,0,0,0,0,
+ 0,0,0,0,124,0,100,2,100,8,26,0,171,1,0,0,
+ 0,0,0,0,125,5,124,5,100,9,122,1,0,0,114,20,
+ 100,10,124,5,155,2,100,11,124,1,155,2,157,4,125,4,
+ 116,7,0,0,0,0,0,0,0,0,124,4,102,1,105,0,
+ 124,2,164,1,142,1,130,1,124,5,83,0,41,12,97,84,
+ 2,0,0,80,101,114,102,111,114,109,32,98,97,115,105,99,
+ 32,118,97,108,105,100,105,116,121,32,99,104,101,99,107,105,
+ 110,103,32,111,102,32,97,32,112,121,99,32,104,101,97,100,
+ 101,114,32,97,110,100,32,114,101,116,117,114,110,32,116,104,
+ 101,32,102,108,97,103,115,32,102,105,101,108,100,44,10,32,
+ 32,32,32,119,104,105,99,104,32,100,101,116,101,114,109,105,
+ 110,101,115,32,104,111,119,32,116,104,101,32,112,121,99,32,
+ 115,104,111,117,108,100,32,98,101,32,102,117,114,116,104,101,
+ 114,32,118,97,108,105,100,97,116,101,100,32,97,103,97,105,
+ 110,115,116,32,116,104,101,32,115,111,117,114,99,101,46,10,
+ 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,
+ 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,
+ 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,
+ 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,
+ 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,
+ 113,117,105,114,101,100,44,32,116,104,111,117,103,104,46,41,
+ 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32,
+ 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,
+ 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112,
+ 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101,
+ 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10,
+ 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115,
+ 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114,
+ 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111,
+ 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97,
+ 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112,
+ 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46,
+ 10,10,32,32,32,32,73,109,112,111,114,116,69,114,114,111,
114,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,
- 32,116,104,101,32,100,97,116,97,32,105,115,32,102,111,117,
- 110,100,32,116,111,32,98,101,32,116,114,117,110,99,97,116,
- 101,100,46,10,10,32,32,32,32,78,114,38,0,0,0,122,
- 20,98,97,100,32,109,97,103,105,99,32,110,117,109,98,101,
- 114,32,105,110,32,122,2,58,32,250,2,123,125,233,16,0,
- 0,0,122,40,114,101,97,99,104,101,100,32,69,79,70,32,
- 119,104,105,108,101,32,114,101,97,100,105,110,103,32,112,121,
- 99,32,104,101,97,100,101,114,32,111,102,32,233,8,0,0,
- 0,233,252,255,255,255,122,14,105,110,118,97,108,105,100,32,
- 102,108,97,103,115,32,122,4,32,105,110,32,41,7,218,12,
- 77,65,71,73,67,95,78,85,77,66,69,82,114,207,0,0,
- 0,218,16,95,118,101,114,98,111,115,101,95,109,101,115,115,
- 97,103,101,114,188,0,0,0,114,7,0,0,0,218,8,69,
- 79,70,69,114,114,111,114,114,49,0,0,0,41,6,114,48,
- 0,0,0,114,187,0,0,0,218,11,101,120,99,95,100,101,
- 116,97,105,108,115,218,5,109,97,103,105,99,114,145,0,0,
- 0,114,21,0,0,0,115,6,0,0,0,32,32,32,32,32,
- 32,114,10,0,0,0,218,13,95,99,108,97,115,115,105,102,
- 121,95,112,121,99,114,219,0,0,0,154,2,0,0,115,185,
- 0,0,0,128,0,240,32,0,13,17,144,18,144,33,136,72,
- 128,69,216,7,12,148,12,210,7,28,216,20,40,168,20,168,
- 8,176,2,176,53,176,41,208,18,60,136,7,220,8,18,215,
- 8,35,209,8,35,160,68,168,39,212,8,50,220,14,25,152,
- 39,209,14,49,160,91,209,14,49,208,8,49,220,7,10,136,
- 52,131,121,144,50,130,126,216,20,60,184,84,184,72,208,18,
- 69,136,7,220,8,18,215,8,35,209,8,35,160,68,168,39,
- 212,8,50,220,14,22,144,119,211,14,31,208,8,31,220,12,
- 26,152,52,160,1,160,33,152,57,211,12,37,128,69,224,7,
- 12,136,117,130,125,216,20,34,160,53,160,41,168,52,176,4,
- 168,120,208,18,56,136,7,220,14,25,152,39,209,14,49,160,
- 91,209,14,49,208,8,49,216,11,16,128,76,114,28,0,0,
- 0,99,5,0,0,0,0,0,0,0,0,0,0,0,5,0,
- 0,0,3,0,0,0,243,198,0,0,0,151,0,116,1,0,
- 0,0,0,0,0,0,0,124,0,100,1,100,2,26,0,171,
- 1,0,0,0,0,0,0,124,1,100,3,122,1,0,0,107,
- 55,0,0,114,39,100,4,124,3,155,2,157,2,125,5,116,
- 2,0,0,0,0,0,0,0,0,106,5,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,100,5,124,
- 5,171,2,0,0,0,0,0,0,1,0,116,7,0,0,0,
- 0,0,0,0,0,124,5,102,1,105,0,124,4,164,1,142,
- 1,130,1,124,2,129,36,116,1,0,0,0,0,0,0,0,
- 0,124,0,100,2,100,7,26,0,171,1,0,0,0,0,0,
- 0,124,2,100,3,122,1,0,0,107,55,0,0,114,15,116,
- 7,0,0,0,0,0,0,0,0,100,4,124,3,155,2,157,
- 2,102,1,105,0,124,4,164,1,142,1,130,1,121,6,121,
- 6,41,8,97,7,2,0,0,86,97,108,105,100,97,116,101,
- 32,97,32,112,121,99,32,97,103,97,105,110,115,116,32,116,
- 104,101,32,115,111,117,114,99,101,32,108,97,115,116,45,109,
- 111,100,105,102,105,101,100,32,116,105,109,101,46,10,10,32,
- 32,32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,
- 32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,
- 32,112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,
- 32,116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,
- 116,101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,
- 105,114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,
- 114,99,101,95,109,116,105,109,101,42,32,105,115,32,116,104,
- 101,32,108,97,115,116,32,109,111,100,105,102,105,101,100,32,
- 116,105,109,101,115,116,97,109,112,32,111,102,32,116,104,101,
- 32,115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,
- 32,32,32,42,115,111,117,114,99,101,95,115,105,122,101,42,
- 32,105,115,32,78,111,110,101,32,111,114,32,116,104,101,32,
- 115,105,122,101,32,111,102,32,116,104,101,32,115,111,117,114,
- 99,101,32,102,105,108,101,32,105,110,32,98,121,116,101,115,
- 46,10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,
- 32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,
- 32,109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,
- 112,111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,
- 101,100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,
- 10,32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,
- 115,42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,
- 114,121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,
- 111,114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,
- 97,105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,
- 112,114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,
- 46,10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,
- 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,
- 105,102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,
- 105,115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,
- 212,0,0,0,233,12,0,0,0,114,37,0,0,0,122,22,
- 98,121,116,101,99,111,100,101,32,105,115,32,115,116,97,108,
- 101,32,102,111,114,32,114,210,0,0,0,78,114,211,0,0,
- 0,41,4,114,49,0,0,0,114,207,0,0,0,114,215,0,
- 0,0,114,188,0,0,0,41,6,114,48,0,0,0,218,12,
- 115,111,117,114,99,101,95,109,116,105,109,101,218,11,115,111,
- 117,114,99,101,95,115,105,122,101,114,187,0,0,0,114,217,
- 0,0,0,114,145,0,0,0,115,6,0,0,0,32,32,32,
- 32,32,32,114,10,0,0,0,218,23,95,118,97,108,105,100,
- 97,116,101,95,116,105,109,101,115,116,97,109,112,95,112,121,
- 99,114,224,0,0,0,187,2,0,0,115,137,0,0,0,128,
- 0,244,38,0,8,22,144,100,152,49,152,82,144,106,211,7,
- 33,160,108,176,90,209,38,63,210,7,64,216,20,42,168,52,
- 168,40,208,18,51,136,7,220,8,18,215,8,35,209,8,35,
- 160,68,168,39,212,8,50,220,14,25,152,39,209,14,49,160,
- 91,209,14,49,208,8,49,216,8,19,208,8,31,220,8,22,
- 144,116,152,66,152,114,144,123,211,8,35,168,11,176,106,209,
- 40,64,210,8,65,220,14,25,208,28,50,176,52,176,40,208,
- 26,59,209,14,75,184,123,209,14,75,208,8,75,240,3,0,
- 9,66,1,240,3,0,9,32,114,28,0,0,0,99,4,0,
- 0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,
- 0,0,243,50,0,0,0,151,0,124,0,100,1,100,2,26,
- 0,124,1,107,55,0,0,114,15,116,1,0,0,0,0,0,
- 0,0,0,100,3,124,2,155,2,157,2,102,1,105,0,124,
- 3,164,1,142,1,130,1,121,4,41,5,97,243,1,0,0,
- 86,97,108,105,100,97,116,101,32,97,32,104,97,115,104,45,
- 98,97,115,101,100,32,112,121,99,32,98,121,32,99,104,101,
- 99,107,105,110,103,32,116,104,101,32,114,101,97,108,32,115,
- 111,117,114,99,101,32,104,97,115,104,32,97,103,97,105,110,
- 115,116,32,116,104,101,32,111,110,101,32,105,110,10,32,32,
- 32,32,116,104,101,32,112,121,99,32,104,101,97,100,101,114,
- 46,10,10,32,32,32,32,42,100,97,116,97,42,32,105,115,
- 32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,
- 32,116,104,101,32,112,121,99,32,102,105,108,101,46,32,40,
- 79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,49,
- 54,32,98,121,116,101,115,32,97,114,101,10,32,32,32,32,
- 114,101,113,117,105,114,101,100,46,41,10,10,32,32,32,32,
- 42,115,111,117,114,99,101,95,104,97,115,104,42,32,105,115,
- 32,116,104,101,32,105,109,112,111,114,116,108,105,98,46,117,
- 116,105,108,46,115,111,117,114,99,101,95,104,97,115,104,40,
- 41,32,111,102,32,116,104,101,32,115,111,117,114,99,101,32,
- 102,105,108,101,46,10,10,32,32,32,32,42,110,97,109,101,
- 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,
- 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110,
- 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105,
- 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105,
- 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101,
- 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116,
- 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111,
- 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32,
- 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32,
- 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103,
- 103,105,110,103,46,10,10,32,32,32,32,65,110,32,73,109,
- 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105,
- 115,101,100,32,105,102,32,116,104,101,32,98,121,116,101,99,
- 111,100,101,32,105,115,32,115,116,97,108,101,46,10,10,32,
- 32,32,32,114,212,0,0,0,114,211,0,0,0,122,46,104,
- 97,115,104,32,105,110,32,98,121,116,101,99,111,100,101,32,
- 100,111,101,115,110,39,116,32,109,97,116,99,104,32,104,97,
- 115,104,32,111,102,32,115,111,117,114,99,101,32,78,41,1,
- 114,188,0,0,0,41,4,114,48,0,0,0,218,11,115,111,
- 117,114,99,101,95,104,97,115,104,114,187,0,0,0,114,217,
- 0,0,0,115,4,0,0,0,32,32,32,32,114,10,0,0,
- 0,218,18,95,118,97,108,105,100,97,116,101,95,104,97,115,
- 104,95,112,121,99,114,227,0,0,0,215,2,0,0,115,54,
- 0,0,0,128,0,240,34,0,8,12,136,65,136,98,128,122,
- 144,91,210,7,32,220,14,25,216,14,61,184,100,184,88,208,
- 12,70,241,3,3,15,10,224,14,25,241,5,3,15,10,240,
- 0,3,9,10,240,3,0,8,33,114,28,0,0,0,99,4,
- 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,
- 0,0,0,243,206,0,0,0,151,0,116,1,0,0,0,0,
- 0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
- 0,0,125,4,116,5,0,0,0,0,0,0,0,0,124,4,
- 116,6,0,0,0,0,0,0,0,0,171,2,0,0,0,0,
- 0,0,114,48,116,8,0,0,0,0,0,0,0,0,106,11,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,100,1,124,2,171,2,0,0,0,0,0,0,1,0,
- 124,3,129,22,116,13,0,0,0,0,0,0,0,0,106,14,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,4,124,3,171,2,0,0,0,0,0,0,1,0,
- 124,4,83,0,116,17,0,0,0,0,0,0,0,0,100,2,
- 124,2,155,2,157,2,124,1,124,2,172,3,171,3,0,0,
- 0,0,0,0,130,1,41,4,122,35,67,111,109,112,105,108,
- 101,32,98,121,116,101,99,111,100,101,32,97,115,32,102,111,
- 117,110,100,32,105,110,32,97,32,112,121,99,46,122,21,99,
- 111,100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,
- 123,33,114,125,122,19,78,111,110,45,99,111,100,101,32,111,
- 98,106,101,99,116,32,105,110,32,169,2,114,187,0,0,0,
- 114,68,0,0,0,41,9,218,7,109,97,114,115,104,97,108,
- 218,5,108,111,97,100,115,218,10,105,115,105,110,115,116,97,
- 110,99,101,218,10,95,99,111,100,101,95,116,121,112,101,114,
- 207,0,0,0,114,215,0,0,0,218,4,95,105,109,112,218,
- 16,95,102,105,120,95,99,111,95,102,105,108,101,110,97,109,
- 101,114,188,0,0,0,41,5,114,48,0,0,0,114,187,0,
- 0,0,114,173,0,0,0,114,176,0,0,0,218,4,99,111,
- 100,101,115,5,0,0,0,32,32,32,32,32,114,10,0,0,
- 0,218,17,95,99,111,109,112,105,108,101,95,98,121,116,101,
- 99,111,100,101,114,237,0,0,0,239,2,0,0,115,99,0,
- 0,0,128,0,228,11,18,143,61,137,61,152,20,211,11,30,
- 128,68,220,7,17,144,36,156,10,212,7,35,220,8,18,215,
- 8,35,209,8,35,208,36,59,184,93,212,8,75,216,11,22,
- 208,11,34,220,12,16,215,12,33,209,12,33,160,36,168,11,
- 212,12,52,216,15,19,136,11,228,14,25,208,28,47,176,13,
- 208,47,64,208,26,65,216,31,35,168,45,244,3,1,15,57,
- 240,0,1,9,57,114,28,0,0,0,99,3,0,0,0,0,
- 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,243,
- 8,1,0,0,151,0,116,1,0,0,0,0,0,0,0,0,
- 116,2,0,0,0,0,0,0,0,0,171,1,0,0,0,0,
- 0,0,125,3,124,3,106,5,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,116,7,0,0,0,0,
- 0,0,0,0,100,1,171,1,0,0,0,0,0,0,171,1,
- 0,0,0,0,0,0,1,0,124,3,106,5,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,7,
- 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
- 0,0,171,1,0,0,0,0,0,0,1,0,124,3,106,5,
+ 32,116,104,101,32,109,97,103,105,99,32,110,117,109,98,101,
+ 114,32,105,115,32,105,110,99,111,114,114,101,99,116,32,111,
+ 114,32,119,104,101,110,32,116,104,101,32,102,108,97,103,115,
+ 10,32,32,32,32,102,105,101,108,100,32,105,115,32,105,110,
+ 118,97,108,105,100,46,32,69,79,70,69,114,114,111,114,32,
+ 105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,
+ 104,101,32,100,97,116,97,32,105,115,32,102,111,117,110,100,
+ 32,116,111,32,98,101,32,116,114,117,110,99,97,116,101,100,
+ 46,10,10,32,32,32,32,78,114,38,0,0,0,122,20,98,
+ 97,100,32,109,97,103,105,99,32,110,117,109,98,101,114,32,
+ 105,110,32,122,2,58,32,250,2,123,125,233,16,0,0,0,
+ 122,40,114,101,97,99,104,101,100,32,69,79,70,32,119,104,
+ 105,108,101,32,114,101,97,100,105,110,103,32,112,121,99,32,
+ 104,101,97,100,101,114,32,111,102,32,233,8,0,0,0,233,
+ 252,255,255,255,122,14,105,110,118,97,108,105,100,32,102,108,
+ 97,103,115,32,122,4,32,105,110,32,41,7,218,12,77,65,
+ 71,73,67,95,78,85,77,66,69,82,114,208,0,0,0,218,
+ 16,95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,
+ 101,114,189,0,0,0,114,7,0,0,0,218,8,69,79,70,
+ 69,114,114,111,114,114,49,0,0,0,41,6,114,48,0,0,
+ 0,114,188,0,0,0,218,11,101,120,99,95,100,101,116,97,
+ 105,108,115,218,5,109,97,103,105,99,114,146,0,0,0,114,
+ 21,0,0,0,115,6,0,0,0,32,32,32,32,32,32,114,
+ 10,0,0,0,218,13,95,99,108,97,115,115,105,102,121,95,
+ 112,121,99,114,220,0,0,0,158,2,0,0,115,185,0,0,
+ 0,128,0,240,32,0,13,17,144,18,144,33,136,72,128,69,
+ 216,7,12,148,12,210,7,28,216,20,40,168,20,168,8,176,
+ 2,176,53,176,41,208,18,60,136,7,220,8,18,215,8,35,
+ 209,8,35,160,68,168,39,212,8,50,220,14,25,152,39,209,
+ 14,49,160,91,209,14,49,208,8,49,220,7,10,136,52,131,
+ 121,144,50,130,126,216,20,60,184,84,184,72,208,18,69,136,
+ 7,220,8,18,215,8,35,209,8,35,160,68,168,39,212,8,
+ 50,220,14,22,144,119,211,14,31,208,8,31,220,12,26,152,
+ 52,160,1,160,33,152,57,211,12,37,128,69,224,7,12,136,
+ 117,130,125,216,20,34,160,53,160,41,168,52,176,4,168,120,
+ 208,18,56,136,7,220,14,25,152,39,209,14,49,160,91,209,
+ 14,49,208,8,49,216,11,16,128,76,114,28,0,0,0,99,
+ 5,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,
+ 3,0,0,0,243,198,0,0,0,151,0,116,1,0,0,0,
+ 0,0,0,0,0,124,0,100,1,100,2,26,0,171,1,0,
+ 0,0,0,0,0,124,1,100,3,122,1,0,0,107,55,0,
+ 0,114,39,100,4,124,3,155,2,157,2,125,5,116,2,0,
+ 0,0,0,0,0,0,0,106,5,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,100,5,124,5,171,
+ 2,0,0,0,0,0,0,1,0,116,7,0,0,0,0,0,
+ 0,0,0,124,5,102,1,105,0,124,4,164,1,142,1,130,
+ 1,124,2,129,36,116,1,0,0,0,0,0,0,0,0,124,
+ 0,100,2,100,7,26,0,171,1,0,0,0,0,0,0,124,
+ 2,100,3,122,1,0,0,107,55,0,0,114,15,116,7,0,
+ 0,0,0,0,0,0,0,100,4,124,3,155,2,157,2,102,
+ 1,105,0,124,4,164,1,142,1,130,1,121,6,121,6,41,
+ 8,97,7,2,0,0,86,97,108,105,100,97,116,101,32,97,
+ 32,112,121,99,32,97,103,97,105,110,115,116,32,116,104,101,
+ 32,115,111,117,114,99,101,32,108,97,115,116,45,109,111,100,
+ 105,102,105,101,100,32,116,105,109,101,46,10,10,32,32,32,
+ 32,42,100,97,116,97,42,32,105,115,32,116,104,101,32,99,
+ 111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,112,
+ 121,99,32,102,105,108,101,46,32,40,79,110,108,121,32,116,
+ 104,101,32,102,105,114,115,116,32,49,54,32,98,121,116,101,
+ 115,32,97,114,101,10,32,32,32,32,114,101,113,117,105,114,
+ 101,100,46,41,10,10,32,32,32,32,42,115,111,117,114,99,
+ 101,95,109,116,105,109,101,42,32,105,115,32,116,104,101,32,
+ 108,97,115,116,32,109,111,100,105,102,105,101,100,32,116,105,
+ 109,101,115,116,97,109,112,32,111,102,32,116,104,101,32,115,
+ 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32,
+ 32,42,115,111,117,114,99,101,95,115,105,122,101,42,32,105,
+ 115,32,78,111,110,101,32,111,114,32,116,104,101,32,115,105,
+ 122,101,32,111,102,32,116,104,101,32,115,111,117,114,99,101,
+ 32,102,105,108,101,32,105,110,32,98,121,116,101,115,46,10,
+ 10,32,32,32,32,42,110,97,109,101,42,32,105,115,32,116,
+ 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,
+ 111,100,117,108,101,32,98,101,105,110,103,32,105,109,112,111,
+ 114,116,101,100,46,32,73,116,32,105,115,32,117,115,101,100,
+ 32,102,111,114,32,108,111,103,103,105,110,103,46,10,10,32,
+ 32,32,32,42,101,120,99,95,100,101,116,97,105,108,115,42,
+ 32,105,115,32,97,32,100,105,99,116,105,111,110,97,114,121,
+ 32,112,97,115,115,101,100,32,116,111,32,73,109,112,111,114,
+ 116,69,114,114,111,114,32,105,102,32,105,116,32,114,97,105,
+ 115,101,100,32,102,111,114,10,32,32,32,32,105,109,112,114,
+ 111,118,101,100,32,100,101,98,117,103,103,105,110,103,46,10,
+ 10,32,32,32,32,65,110,32,73,109,112,111,114,116,69,114,
+ 114,111,114,32,105,115,32,114,97,105,115,101,100,32,105,102,
+ 32,116,104,101,32,98,121,116,101,99,111,100,101,32,105,115,
+ 32,115,116,97,108,101,46,10,10,32,32,32,32,114,213,0,
+ 0,0,233,12,0,0,0,114,37,0,0,0,122,22,98,121,
+ 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32,
+ 102,111,114,32,114,211,0,0,0,78,114,212,0,0,0,41,
+ 4,114,49,0,0,0,114,208,0,0,0,114,216,0,0,0,
+ 114,189,0,0,0,41,6,114,48,0,0,0,218,12,115,111,
+ 117,114,99,101,95,109,116,105,109,101,218,11,115,111,117,114,
+ 99,101,95,115,105,122,101,114,188,0,0,0,114,218,0,0,
+ 0,114,146,0,0,0,115,6,0,0,0,32,32,32,32,32,
+ 32,114,10,0,0,0,218,23,95,118,97,108,105,100,97,116,
+ 101,95,116,105,109,101,115,116,97,109,112,95,112,121,99,114,
+ 225,0,0,0,191,2,0,0,115,137,0,0,0,128,0,244,
+ 38,0,8,22,144,100,152,49,152,82,144,106,211,7,33,160,
+ 108,176,90,209,38,63,210,7,64,216,20,42,168,52,168,40,
+ 208,18,51,136,7,220,8,18,215,8,35,209,8,35,160,68,
+ 168,39,212,8,50,220,14,25,152,39,209,14,49,160,91,209,
+ 14,49,208,8,49,216,8,19,208,8,31,220,8,22,144,116,
+ 152,66,152,114,144,123,211,8,35,168,11,176,106,209,40,64,
+ 210,8,65,220,14,25,208,28,50,176,52,176,40,208,26,59,
+ 209,14,75,184,123,209,14,75,208,8,75,240,3,0,9,66,
+ 1,240,3,0,9,32,114,28,0,0,0,99,4,0,0,0,
+ 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,
+ 243,50,0,0,0,151,0,124,0,100,1,100,2,26,0,124,
+ 1,107,55,0,0,114,15,116,1,0,0,0,0,0,0,0,
+ 0,100,3,124,2,155,2,157,2,102,1,105,0,124,3,164,
+ 1,142,1,130,1,121,4,41,5,97,243,1,0,0,86,97,
+ 108,105,100,97,116,101,32,97,32,104,97,115,104,45,98,97,
+ 115,101,100,32,112,121,99,32,98,121,32,99,104,101,99,107,
+ 105,110,103,32,116,104,101,32,114,101,97,108,32,115,111,117,
+ 114,99,101,32,104,97,115,104,32,97,103,97,105,110,115,116,
+ 32,116,104,101,32,111,110,101,32,105,110,10,32,32,32,32,
+ 116,104,101,32,112,121,99,32,104,101,97,100,101,114,46,10,
+ 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116,
+ 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,
+ 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110,
+ 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32,
+ 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101,
+ 113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,115,
+ 111,117,114,99,101,95,104,97,115,104,42,32,105,115,32,116,
+ 104,101,32,105,109,112,111,114,116,108,105,98,46,117,116,105,
+ 108,46,115,111,117,114,99,101,95,104,97,115,104,40,41,32,
+ 111,102,32,116,104,101,32,115,111,117,114,99,101,32,102,105,
+ 108,101,46,10,10,32,32,32,32,42,110,97,109,101,42,32,
+ 105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,
+ 104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,32,
+ 105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,32,
+ 117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,103,
+ 46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,97,
+ 105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,111,
+ 110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,73,
+ 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116,
+ 32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,32,
+ 105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,105,
+ 110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,111,
+ 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,
+ 100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,100,
+ 101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,32,
+ 32,114,213,0,0,0,114,212,0,0,0,122,46,104,97,115,
+ 104,32,105,110,32,98,121,116,101,99,111,100,101,32,100,111,
+ 101,115,110,39,116,32,109,97,116,99,104,32,104,97,115,104,
+ 32,111,102,32,115,111,117,114,99,101,32,78,41,1,114,189,
+ 0,0,0,41,4,114,48,0,0,0,218,11,115,111,117,114,
+ 99,101,95,104,97,115,104,114,188,0,0,0,114,218,0,0,
+ 0,115,4,0,0,0,32,32,32,32,114,10,0,0,0,218,
+ 18,95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,
+ 112,121,99,114,228,0,0,0,219,2,0,0,115,54,0,0,
+ 0,128,0,240,34,0,8,12,136,65,136,98,128,122,144,91,
+ 210,7,32,220,14,25,216,14,61,184,100,184,88,208,12,70,
+ 241,3,3,15,10,224,14,25,241,5,3,15,10,240,0,3,
+ 9,10,240,3,0,8,33,114,28,0,0,0,99,4,0,0,
+ 0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,
+ 0,243,206,0,0,0,151,0,116,1,0,0,0,0,0,0,
+ 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 125,4,116,5,0,0,0,0,0,0,0,0,124,4,116,6,
+ 0,0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,
+ 114,48,116,8,0,0,0,0,0,0,0,0,106,11,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 100,1,124,2,171,2,0,0,0,0,0,0,1,0,124,3,
+ 129,22,116,13,0,0,0,0,0,0,0,0,106,14,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,4,124,3,171,2,0,0,0,0,0,0,1,0,124,4,
+ 83,0,116,17,0,0,0,0,0,0,0,0,100,2,124,2,
+ 155,2,157,2,124,1,124,2,172,3,171,3,0,0,0,0,
+ 0,0,130,1,41,4,122,35,67,111,109,112,105,108,101,32,
+ 98,121,116,101,99,111,100,101,32,97,115,32,102,111,117,110,
+ 100,32,105,110,32,97,32,112,121,99,46,122,21,99,111,100,
+ 101,32,111,98,106,101,99,116,32,102,114,111,109,32,123,33,
+ 114,125,122,19,78,111,110,45,99,111,100,101,32,111,98,106,
+ 101,99,116,32,105,110,32,169,2,114,188,0,0,0,114,68,
+ 0,0,0,41,9,218,7,109,97,114,115,104,97,108,218,5,
+ 108,111,97,100,115,218,10,105,115,105,110,115,116,97,110,99,
+ 101,218,10,95,99,111,100,101,95,116,121,112,101,114,208,0,
+ 0,0,114,216,0,0,0,218,4,95,105,109,112,218,16,95,
+ 102,105,120,95,99,111,95,102,105,108,101,110,97,109,101,114,
+ 189,0,0,0,41,5,114,48,0,0,0,114,188,0,0,0,
+ 114,174,0,0,0,114,177,0,0,0,218,4,99,111,100,101,
+ 115,5,0,0,0,32,32,32,32,32,114,10,0,0,0,218,
+ 17,95,99,111,109,112,105,108,101,95,98,121,116,101,99,111,
+ 100,101,114,238,0,0,0,243,2,0,0,115,99,0,0,0,
+ 128,0,228,11,18,143,61,137,61,152,20,211,11,30,128,68,
+ 220,7,17,144,36,156,10,212,7,35,220,8,18,215,8,35,
+ 209,8,35,208,36,59,184,93,212,8,75,216,11,22,208,11,
+ 34,220,12,16,215,12,33,209,12,33,160,36,168,11,212,12,
+ 52,216,15,19,136,11,228,14,25,208,28,47,176,13,208,47,
+ 64,208,26,65,216,31,35,168,45,244,3,1,15,57,240,0,
+ 1,9,57,114,28,0,0,0,99,3,0,0,0,0,0,0,
+ 0,0,0,0,0,5,0,0,0,3,0,0,0,243,8,1,
+ 0,0,151,0,116,1,0,0,0,0,0,0,0,0,116,2,
+ 0,0,0,0,0,0,0,0,171,1,0,0,0,0,0,0,
+ 125,3,124,3,106,5,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,116,7,0,0,0,0,0,0,
+ 0,0,100,1,171,1,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,1,0,124,3,106,5,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,116,7,0,0,
+ 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
+ 171,1,0,0,0,0,0,0,1,0,124,3,106,5,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,116,7,0,0,0,0,0,0,0,0,124,2,171,1,
- 0,0,0,0,0,0,171,1,0,0,0,0,0,0,1,0,
- 124,3,106,5,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,116,9,0,0,0,0,0,0,0,0,
- 106,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,0,171,1,0,0,0,0,0,0,171,1,
- 0,0,0,0,0,0,1,0,124,3,83,0,41,2,122,43,
- 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97,
- 32,102,111,114,32,97,32,116,105,109,101,115,116,97,109,112,
- 45,98,97,115,101,100,32,112,121,99,46,114,1,0,0,0,
- 41,6,218,9,98,121,116,101,97,114,114,97,121,114,214,0,
- 0,0,218,6,101,120,116,101,110,100,114,43,0,0,0,114,
- 230,0,0,0,218,5,100,117,109,112,115,41,4,114,236,0,
- 0,0,218,5,109,116,105,109,101,114,223,0,0,0,114,48,
- 0,0,0,115,4,0,0,0,32,32,32,32,114,10,0,0,
- 0,218,22,95,99,111,100,101,95,116,111,95,116,105,109,101,
- 115,116,97,109,112,95,112,121,99,114,243,0,0,0,252,2,
- 0,0,115,88,0,0,0,128,0,228,11,20,148,92,211,11,
- 34,128,68,216,4,8,135,75,129,75,148,12,152,81,147,15,
- 212,4,32,216,4,8,135,75,129,75,148,12,152,85,211,16,
- 35,212,4,36,216,4,8,135,75,129,75,148,12,152,91,211,
- 16,41,212,4,42,216,4,8,135,75,129,75,148,7,151,13,
- 145,13,152,100,211,16,35,212,4,36,216,11,15,128,75,114,
- 28,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,
- 0,5,0,0,0,3,0,0,0,243,242,0,0,0,151,0,
- 116,1,0,0,0,0,0,0,0,0,116,2,0,0,0,0,
- 0,0,0,0,171,1,0,0,0,0,0,0,125,3,100,1,
- 124,2,100,1,122,3,0,0,122,7,0,0,125,4,124,3,
+ 116,7,0,0,0,0,0,0,0,0,124,2,171,1,0,0,
+ 0,0,0,0,171,1,0,0,0,0,0,0,1,0,124,3,
106,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,116,7,0,0,0,0,0,0,0,0,124,4,
- 171,1,0,0,0,0,0,0,171,1,0,0,0,0,0,0,
- 1,0,116,9,0,0,0,0,0,0,0,0,124,1,171,1,
- 0,0,0,0,0,0,100,2,107,40,0,0,115,2,74,0,
- 130,1,124,3,106,5,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
- 0,0,1,0,124,3,106,5,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,116,11,0,0,0,0,
- 0,0,0,0,106,12,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
- 0,0,171,1,0,0,0,0,0,0,1,0,124,3,83,0,
- 41,3,122,38,80,114,111,100,117,99,101,32,116,104,101,32,
- 100,97,116,97,32,102,111,114,32,97,32,104,97,115,104,45,
- 98,97,115,101,100,32,112,121,99,46,114,6,0,0,0,114,
- 212,0,0,0,41,7,114,239,0,0,0,114,214,0,0,0,
- 114,240,0,0,0,114,43,0,0,0,114,7,0,0,0,114,
- 230,0,0,0,114,241,0,0,0,41,5,114,236,0,0,0,
- 114,226,0,0,0,218,7,99,104,101,99,107,101,100,114,48,
- 0,0,0,114,21,0,0,0,115,5,0,0,0,32,32,32,
- 32,32,114,10,0,0,0,218,17,95,99,111,100,101,95,116,
- 111,95,104,97,115,104,95,112,121,99,114,246,0,0,0,6,
- 3,0,0,115,100,0,0,0,128,0,228,11,20,148,92,211,
- 11,34,128,68,216,12,15,144,39,152,81,145,44,209,12,30,
- 128,69,216,4,8,135,75,129,75,148,12,152,85,211,16,35,
- 212,4,36,220,11,14,136,123,211,11,27,152,113,210,11,32,
- 208,4,32,208,11,32,216,4,8,135,75,129,75,144,11,212,
- 4,28,216,4,8,135,75,129,75,148,7,151,13,145,13,152,
- 100,211,16,35,212,4,36,216,11,15,128,75,114,28,0,0,
- 0,99,1,0,0,0,0,0,0,0,0,0,0,0,6,0,
- 0,0,3,0,0,0,243,220,0,0,0,151,0,100,1,100,
- 2,108,0,125,1,116,3,0,0,0,0,0,0,0,0,106,
- 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,124,0,171,1,0,0,0,0,0,0,106,6,0,
+ 0,0,0,0,116,9,0,0,0,0,0,0,0,0,106,10,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,1,0,124,3,83,0,41,2,122,43,80,114,
+ 111,100,117,99,101,32,116,104,101,32,100,97,116,97,32,102,
+ 111,114,32,97,32,116,105,109,101,115,116,97,109,112,45,98,
+ 97,115,101,100,32,112,121,99,46,114,1,0,0,0,41,6,
+ 218,9,98,121,116,101,97,114,114,97,121,114,215,0,0,0,
+ 218,6,101,120,116,101,110,100,114,43,0,0,0,114,231,0,
+ 0,0,218,5,100,117,109,112,115,41,4,114,237,0,0,0,
+ 218,5,109,116,105,109,101,114,224,0,0,0,114,48,0,0,
+ 0,115,4,0,0,0,32,32,32,32,114,10,0,0,0,218,
+ 22,95,99,111,100,101,95,116,111,95,116,105,109,101,115,116,
+ 97,109,112,95,112,121,99,114,244,0,0,0,0,3,0,0,
+ 115,88,0,0,0,128,0,228,11,20,148,92,211,11,34,128,
+ 68,216,4,8,135,75,129,75,148,12,152,81,147,15,212,4,
+ 32,216,4,8,135,75,129,75,148,12,152,85,211,16,35,212,
+ 4,36,216,4,8,135,75,129,75,148,12,152,91,211,16,41,
+ 212,4,42,216,4,8,135,75,129,75,148,7,151,13,145,13,
+ 152,100,211,16,35,212,4,36,216,11,15,128,75,114,28,0,
+ 0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,5,
+ 0,0,0,3,0,0,0,243,242,0,0,0,151,0,116,1,
+ 0,0,0,0,0,0,0,0,116,2,0,0,0,0,0,0,
+ 0,0,171,1,0,0,0,0,0,0,125,3,100,1,124,2,
+ 100,1,122,3,0,0,122,7,0,0,125,4,124,3,106,5,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,125,2,124,1,106,9,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,124,2,171,1,0,0,0,
- 0,0,0,125,3,116,3,0,0,0,0,0,0,0,0,106,
- 10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,100,2,100,3,171,2,0,0,0,0,0,0,125,
- 4,124,4,106,13,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,0,106,13,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,3,100,
- 1,25,0,0,0,171,1,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,83,0,41,4,122,121,68,101,99,111,100,
- 101,32,98,121,116,101,115,32,114,101,112,114,101,115,101,110,
- 116,105,110,103,32,115,111,117,114,99,101,32,99,111,100,101,
- 32,97,110,100,32,114,101,116,117,114,110,32,116,104,101,32,
- 115,116,114,105,110,103,46,10,10,32,32,32,32,85,110,105,
- 118,101,114,115,97,108,32,110,101,119,108,105,110,101,32,115,
- 117,112,112,111,114,116,32,105,115,32,117,115,101,100,32,105,
- 110,32,116,104,101,32,100,101,99,111,100,105,110,103,46,10,
- 32,32,32,32,114,1,0,0,0,78,84,41,7,218,8,116,
- 111,107,101,110,105,122,101,114,114,0,0,0,218,7,66,121,
- 116,101,115,73,79,218,8,114,101,97,100,108,105,110,101,218,
- 15,100,101,116,101,99,116,95,101,110,99,111,100,105,110,103,
- 218,25,73,110,99,114,101,109,101,110,116,97,108,78,101,119,
- 108,105,110,101,68,101,99,111,100,101,114,218,6,100,101,99,
- 111,100,101,41,5,218,12,115,111,117,114,99,101,95,98,121,
- 116,101,115,114,248,0,0,0,218,21,115,111,117,114,99,101,
- 95,98,121,116,101,115,95,114,101,97,100,108,105,110,101,218,
- 8,101,110,99,111,100,105,110,103,218,15,110,101,119,108,105,
- 110,101,95,100,101,99,111,100,101,114,115,5,0,0,0,32,
- 32,32,32,32,114,10,0,0,0,218,13,100,101,99,111,100,
- 101,95,115,111,117,114,99,101,114,2,1,0,0,17,3,0,
- 0,115,95,0,0,0,128,0,243,10,0,5,20,220,28,31,
- 159,75,153,75,168,12,211,28,53,215,28,62,209,28,62,208,
- 4,25,216,15,23,215,15,39,209,15,39,208,40,61,211,15,
- 62,128,72,220,22,25,215,22,51,209,22,51,176,68,184,36,
- 211,22,63,128,79,216,11,26,215,11,33,209,11,33,160,44,
- 215,34,53,209,34,53,176,104,184,113,177,107,211,34,66,211,
- 11,67,208,4,67,114,28,0,0,0,169,2,218,6,108,111,
- 97,100,101,114,218,26,115,117,98,109,111,100,117,108,101,95,
- 115,101,97,114,99,104,95,108,111,99,97,116,105,111,110,115,
- 99,2,0,0,0,0,0,0,0,2,0,0,0,6,0,0,
- 0,3,0,0,0,243,138,2,0,0,151,0,124,1,128,33,
- 100,2,125,1,116,1,0,0,0,0,0,0,0,0,124,2,
- 100,3,171,2,0,0,0,0,0,0,114,52,9,0,124,2,
- 106,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,0,171,1,0,0,0,0,0,0,125,1,
- 110,33,116,7,0,0,0,0,0,0,0,0,106,8,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 124,1,171,1,0,0,0,0,0,0,125,1,9,0,116,11,
- 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
- 0,0,125,1,116,14,0,0,0,0,0,0,0,0,106,17,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,0,124,2,124,1,172,4,171,3,0,0,0,0,
- 0,0,125,4,100,5,124,4,95,9,0,0,0,0,0,0,
- 0,0,124,2,128,63,116,21,0,0,0,0,0,0,0,0,
- 171,0,0,0,0,0,0,0,68,0,93,49,0,0,92,2,
- 0,0,125,5,125,6,124,1,106,23,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,116,25,0,0,
- 0,0,0,0,0,0,124,6,171,1,0,0,0,0,0,0,
- 171,1,0,0,0,0,0,0,115,1,140,33,2,0,124,5,
- 124,0,124,1,171,2,0,0,0,0,0,0,125,2,124,2,
- 124,4,95,13,0,0,0,0,0,0,0,0,1,0,110,2,
- 4,0,121,1,124,3,116,28,0,0,0,0,0,0,0,0,
- 117,0,114,40,116,1,0,0,0,0,0,0,0,0,124,2,
- 100,6,171,2,0,0,0,0,0,0,114,35,9,0,124,2,
- 106,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,0,171,1,0,0,0,0,0,0,125,7,
- 124,7,114,15,103,0,124,4,95,16,0,0,0,0,0,0,
- 0,0,110,7,124,3,124,4,95,16,0,0,0,0,0,0,
- 0,0,124,4,106,32,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,103,0,107,40,0,0,114,43,
- 124,1,114,41,116,35,0,0,0,0,0,0,0,0,124,1,
- 171,1,0,0,0,0,0,0,100,7,25,0,0,0,125,8,
+ 0,0,116,7,0,0,0,0,0,0,0,0,124,4,171,1,
+ 0,0,0,0,0,0,171,1,0,0,0,0,0,0,1,0,
+ 116,9,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
+ 0,0,0,0,100,2,107,40,0,0,115,2,74,0,130,1,
+ 124,3,106,5,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
+ 1,0,124,3,106,5,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,116,11,0,0,0,0,0,0,
+ 0,0,106,12,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 171,1,0,0,0,0,0,0,1,0,124,3,83,0,41,3,
+ 122,38,80,114,111,100,117,99,101,32,116,104,101,32,100,97,
+ 116,97,32,102,111,114,32,97,32,104,97,115,104,45,98,97,
+ 115,101,100,32,112,121,99,46,114,6,0,0,0,114,213,0,
+ 0,0,41,7,114,240,0,0,0,114,215,0,0,0,114,241,
+ 0,0,0,114,43,0,0,0,114,7,0,0,0,114,231,0,
+ 0,0,114,242,0,0,0,41,5,114,237,0,0,0,114,227,
+ 0,0,0,218,7,99,104,101,99,107,101,100,114,48,0,0,
+ 0,114,21,0,0,0,115,5,0,0,0,32,32,32,32,32,
+ 114,10,0,0,0,218,17,95,99,111,100,101,95,116,111,95,
+ 104,97,115,104,95,112,121,99,114,247,0,0,0,10,3,0,
+ 0,115,100,0,0,0,128,0,228,11,20,148,92,211,11,34,
+ 128,68,216,12,15,144,39,152,81,145,44,209,12,30,128,69,
+ 216,4,8,135,75,129,75,148,12,152,85,211,16,35,212,4,
+ 36,220,11,14,136,123,211,11,27,152,113,210,11,32,208,4,
+ 32,208,11,32,216,4,8,135,75,129,75,144,11,212,4,28,
+ 216,4,8,135,75,129,75,148,7,151,13,145,13,152,100,211,
+ 16,35,212,4,36,216,11,15,128,75,114,28,0,0,0,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,
+ 3,0,0,0,243,220,0,0,0,151,0,100,1,100,2,108,
+ 0,125,1,116,3,0,0,0,0,0,0,0,0,106,4,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,124,0,171,1,0,0,0,0,0,0,106,6,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,
+ 2,124,1,106,9,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,
+ 0,125,3,116,3,0,0,0,0,0,0,0,0,106,10,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,100,2,100,3,171,2,0,0,0,0,0,0,125,4,124,
+ 4,106,13,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,124,0,106,13,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,124,3,100,1,25,
+ 0,0,0,171,1,0,0,0,0,0,0,171,1,0,0,0,
+ 0,0,0,83,0,41,4,122,121,68,101,99,111,100,101,32,
+ 98,121,116,101,115,32,114,101,112,114,101,115,101,110,116,105,
+ 110,103,32,115,111,117,114,99,101,32,99,111,100,101,32,97,
+ 110,100,32,114,101,116,117,114,110,32,116,104,101,32,115,116,
+ 114,105,110,103,46,10,10,32,32,32,32,85,110,105,118,101,
+ 114,115,97,108,32,110,101,119,108,105,110,101,32,115,117,112,
+ 112,111,114,116,32,105,115,32,117,115,101,100,32,105,110,32,
+ 116,104,101,32,100,101,99,111,100,105,110,103,46,10,32,32,
+ 32,32,114,1,0,0,0,78,84,41,7,218,8,116,111,107,
+ 101,110,105,122,101,114,114,0,0,0,218,7,66,121,116,101,
+ 115,73,79,218,8,114,101,97,100,108,105,110,101,218,15,100,
+ 101,116,101,99,116,95,101,110,99,111,100,105,110,103,218,25,
+ 73,110,99,114,101,109,101,110,116,97,108,78,101,119,108,105,
+ 110,101,68,101,99,111,100,101,114,218,6,100,101,99,111,100,
+ 101,41,5,218,12,115,111,117,114,99,101,95,98,121,116,101,
+ 115,114,249,0,0,0,218,21,115,111,117,114,99,101,95,98,
+ 121,116,101,115,95,114,101,97,100,108,105,110,101,218,8,101,
+ 110,99,111,100,105,110,103,218,15,110,101,119,108,105,110,101,
+ 95,100,101,99,111,100,101,114,115,5,0,0,0,32,32,32,
+ 32,32,114,10,0,0,0,218,13,100,101,99,111,100,101,95,
+ 115,111,117,114,99,101,114,3,1,0,0,21,3,0,0,115,
+ 95,0,0,0,128,0,243,10,0,5,20,220,28,31,159,75,
+ 153,75,168,12,211,28,53,215,28,62,209,28,62,208,4,25,
+ 216,15,23,215,15,39,209,15,39,208,40,61,211,15,62,128,
+ 72,220,22,25,215,22,51,209,22,51,176,68,184,36,211,22,
+ 63,128,79,216,11,26,215,11,33,209,11,33,160,44,215,34,
+ 53,209,34,53,176,104,184,113,177,107,211,34,66,211,11,67,
+ 208,4,67,114,28,0,0,0,169,2,218,6,108,111,97,100,
+ 101,114,218,26,115,117,98,109,111,100,117,108,101,95,115,101,
+ 97,114,99,104,95,108,111,99,97,116,105,111,110,115,99,2,
+ 0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,3,
+ 0,0,0,243,138,2,0,0,151,0,124,1,128,33,100,2,
+ 125,1,116,1,0,0,0,0,0,0,0,0,124,2,100,3,
+ 171,2,0,0,0,0,0,0,114,52,9,0,124,2,106,3,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,125,1,110,33,
+ 116,7,0,0,0,0,0,0,0,0,106,8,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,
+ 171,1,0,0,0,0,0,0,125,1,9,0,116,11,0,0,
+ 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
+ 125,1,116,14,0,0,0,0,0,0,0,0,106,17,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,0,124,2,124,1,172,4,171,3,0,0,0,0,0,0,
+ 125,4,100,5,124,4,95,9,0,0,0,0,0,0,0,0,
+ 124,2,128,63,116,21,0,0,0,0,0,0,0,0,171,0,
+ 0,0,0,0,0,0,68,0,93,49,0,0,92,2,0,0,
+ 125,5,125,6,124,1,106,23,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,116,25,0,0,0,0,
+ 0,0,0,0,124,6,171,1,0,0,0,0,0,0,171,1,
+ 0,0,0,0,0,0,115,1,140,33,2,0,124,5,124,0,
+ 124,1,171,2,0,0,0,0,0,0,125,2,124,2,124,4,
+ 95,13,0,0,0,0,0,0,0,0,1,0,110,2,4,0,
+ 121,1,124,3,116,28,0,0,0,0,0,0,0,0,117,0,
+ 114,40,116,1,0,0,0,0,0,0,0,0,124,2,100,6,
+ 171,2,0,0,0,0,0,0,114,35,9,0,124,2,106,31,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,125,7,124,7,
+ 114,15,103,0,124,4,95,16,0,0,0,0,0,0,0,0,
+ 110,7,124,3,124,4,95,16,0,0,0,0,0,0,0,0,
124,4,106,32,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,106,37,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,8,171,1,0,0,
- 0,0,0,0,1,0,124,4,83,0,35,0,116,4,0,0,
- 0,0,0,0,0,0,36,0,114,3,1,0,89,0,140,222,
- 119,0,120,3,89,0,119,1,35,0,116,12,0,0,0,0,
- 0,0,0,0,36,0,114,3,1,0,89,0,140,237,119,0,
- 120,3,89,0,119,1,35,0,116,4,0,0,0,0,0,0,
- 0,0,36,0,114,3,1,0,89,0,140,101,119,0,120,3,
- 89,0,119,1,41,8,97,61,1,0,0,82,101,116,117,114,
- 110,32,97,32,109,111,100,117,108,101,32,115,112,101,99,32,
- 98,97,115,101,100,32,111,110,32,97,32,102,105,108,101,32,
- 108,111,99,97,116,105,111,110,46,10,10,32,32,32,32,84,
- 111,32,105,110,100,105,99,97,116,101,32,116,104,97,116,32,
- 116,104,101,32,109,111,100,117,108,101,32,105,115,32,97,32,
- 112,97,99,107,97,103,101,44,32,115,101,116,10,32,32,32,
- 32,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,
- 104,95,108,111,99,97,116,105,111,110,115,32,116,111,32,97,
- 32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,
- 114,121,32,112,97,116,104,115,46,32,32,65,110,10,32,32,
- 32,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,
- 115,117,102,102,105,99,105,101,110,116,44,32,116,104,111,117,
- 103,104,32,105,116,115,32,110,111,116,32,111,116,104,101,114,
- 119,105,115,101,32,117,115,101,102,117,108,32,116,111,32,116,
- 104,101,10,32,32,32,32,105,109,112,111,114,116,32,115,121,
- 115,116,101,109,46,10,10,32,32,32,32,84,104,101,32,108,
- 111,97,100,101,114,32,109,117,115,116,32,116,97,107,101,32,
- 97,32,115,112,101,99,32,97,115,32,105,116,115,32,111,110,
- 108,121,32,95,95,105,110,105,116,95,95,40,41,32,97,114,
- 103,46,10,10,32,32,32,32,78,122,9,60,117,110,107,110,
- 111,119,110,62,218,12,103,101,116,95,102,105,108,101,110,97,
- 109,101,169,1,218,6,111,114,105,103,105,110,84,218,10,105,
- 115,95,112,97,99,107,97,103,101,114,1,0,0,0,41,19,
- 114,199,0,0,0,114,7,1,0,0,114,188,0,0,0,114,
- 23,0,0,0,114,130,0,0,0,114,105,0,0,0,114,87,
- 0,0,0,114,207,0,0,0,218,10,77,111,100,117,108,101,
- 83,112,101,99,218,13,95,115,101,116,95,102,105,108,101,97,
- 116,116,114,218,27,95,103,101,116,95,115,117,112,112,111,114,
- 116,101,100,95,102,105,108,101,95,108,111,97,100,101,114,115,
- 114,59,0,0,0,114,179,0,0,0,114,4,1,0,0,218,
- 9,95,80,79,80,85,76,65,84,69,114,10,1,0,0,114,
- 5,1,0,0,114,81,0,0,0,114,64,0,0,0,41,9,
- 114,187,0,0,0,218,8,108,111,99,97,116,105,111,110,114,
- 4,1,0,0,114,5,1,0,0,218,4,115,112,101,99,218,
- 12,108,111,97,100,101,114,95,99,108,97,115,115,218,8,115,
- 117,102,102,105,120,101,115,114,10,1,0,0,218,7,100,105,
- 114,110,97,109,101,115,9,0,0,0,32,32,32,32,32,32,
- 32,32,32,114,10,0,0,0,218,23,115,112,101,99,95,102,
- 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111,
- 110,114,20,1,0,0,34,3,0,0,115,105,1,0,0,128,
- 0,240,24,0,8,16,208,7,23,240,8,0,20,31,136,8,
- 220,11,18,144,54,152,62,212,11,42,240,4,3,13,21,216,
- 27,33,215,27,46,209,27,46,168,116,211,27,52,145,8,244,
- 8,0,20,23,151,58,145,58,152,104,211,19,39,136,8,240,
- 2,3,9,17,220,23,36,160,88,211,23,46,136,72,244,20,
- 0,12,22,215,11,32,209,11,32,160,20,160,118,176,104,208,
- 11,32,211,11,63,128,68,216,25,29,128,68,212,4,22,240,
- 6,0,8,14,128,126,220,38,65,214,38,67,209,12,34,136,
- 76,152,40,216,15,23,215,15,32,209,15,32,164,21,160,120,
- 163,31,213,15,49,217,25,37,160,100,168,72,211,25,53,144,
- 6,216,30,36,144,4,148,11,217,16,21,240,9,0,39,68,
- 1,240,12,0,20,24,240,6,0,8,34,164,89,209,7,46,
- 228,11,18,144,54,152,60,212,11,40,240,2,6,13,57,216,
- 29,35,215,29,46,209,29,46,168,116,211,29,52,144,10,241,
- 8,0,20,30,216,54,56,144,68,213,20,51,224,42,68,136,
- 4,212,8,39,216,7,11,215,7,38,209,7,38,168,34,210,
- 7,44,217,11,19,220,22,33,160,40,211,22,43,168,65,209,
- 22,46,136,71,216,12,16,215,12,43,209,12,43,215,12,50,
- 209,12,50,176,55,212,12,59,224,11,15,128,75,248,244,93,
- 1,0,20,31,242,0,1,13,21,217,16,20,240,3,1,13,
- 21,251,244,12,0,16,23,242,0,1,9,17,217,12,16,240,
- 3,1,9,17,251,244,56,0,20,31,242,0,1,13,21,217,
- 16,20,240,3,1,13,21,250,115,52,0,0,0,146,17,68,
- 24,0,186,11,68,39,0,194,58,17,68,54,0,196,24,9,
- 68,36,3,196,35,1,68,36,3,196,39,9,68,51,3,196,
- 50,1,68,51,3,196,54,9,69,2,3,197,1,1,69,2,
- 3,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,
- 0,0,3,0,0,0,243,140,1,0,0,151,0,116,1,0,
- 0,0,0,0,0,0,0,124,0,116,2,0,0,0,0,0,
- 0,0,0,171,2,0,0,0,0,0,0,115,1,121,1,116,
- 5,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,
- 0,125,1,124,0,106,7,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,100,2,100,1,171,2,0,
- 0,0,0,0,0,125,2,124,0,106,7,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,100,3,124,
- 1,171,2,0,0,0,0,0,0,125,3,124,2,128,18,124,
- 3,124,1,117,0,114,1,121,1,124,3,128,11,116,9,0,
- 0,0,0,0,0,0,0,100,4,171,1,0,0,0,0,0,
- 0,130,1,116,11,0,0,0,0,0,0,0,0,124,3,100,
- 5,124,1,171,3,0,0,0,0,0,0,125,4,124,4,124,
- 1,100,1,102,2,118,0,114,54,124,2,128,24,124,4,124,
- 1,117,0,114,6,116,12,0,0,0,0,0,0,0,0,110,
- 5,116,8,0,0,0,0,0,0,0,0,125,5,2,0,124,
- 5,100,4,171,1,0,0,0,0,0,0,130,1,116,15,0,
- 0,0,0,0,0,0,0,106,16,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,100,4,116,18,0,
- 0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,1,
- 0,124,2,125,4,124,4,128,2,74,0,130,1,124,2,129,
- 33,124,2,124,4,107,55,0,0,114,28,116,15,0,0,0,
+ 0,0,0,0,0,0,103,0,107,40,0,0,114,43,124,1,
+ 114,41,116,35,0,0,0,0,0,0,0,0,124,1,171,1,
+ 0,0,0,0,0,0,100,7,25,0,0,0,125,8,124,4,
+ 106,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,106,37,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,8,171,1,0,0,0,0,
+ 0,0,1,0,124,4,83,0,35,0,116,4,0,0,0,0,
+ 0,0,0,0,36,0,114,3,1,0,89,0,140,222,119,0,
+ 120,3,89,0,119,1,35,0,116,12,0,0,0,0,0,0,
+ 0,0,36,0,114,3,1,0,89,0,140,237,119,0,120,3,
+ 89,0,119,1,35,0,116,4,0,0,0,0,0,0,0,0,
+ 36,0,114,3,1,0,89,0,140,101,119,0,120,3,89,0,
+ 119,1,41,8,97,61,1,0,0,82,101,116,117,114,110,32,
+ 97,32,109,111,100,117,108,101,32,115,112,101,99,32,98,97,
+ 115,101,100,32,111,110,32,97,32,102,105,108,101,32,108,111,
+ 99,97,116,105,111,110,46,10,10,32,32,32,32,84,111,32,
+ 105,110,100,105,99,97,116,101,32,116,104,97,116,32,116,104,
+ 101,32,109,111,100,117,108,101,32,105,115,32,97,32,112,97,
+ 99,107,97,103,101,44,32,115,101,116,10,32,32,32,32,115,
+ 117,98,109,111,100,117,108,101,95,115,101,97,114,99,104,95,
+ 108,111,99,97,116,105,111,110,115,32,116,111,32,97,32,108,
+ 105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,
+ 32,112,97,116,104,115,46,32,32,65,110,10,32,32,32,32,
+ 101,109,112,116,121,32,108,105,115,116,32,105,115,32,115,117,
+ 102,102,105,99,105,101,110,116,44,32,116,104,111,117,103,104,
+ 32,105,116,115,32,110,111,116,32,111,116,104,101,114,119,105,
+ 115,101,32,117,115,101,102,117,108,32,116,111,32,116,104,101,
+ 10,32,32,32,32,105,109,112,111,114,116,32,115,121,115,116,
+ 101,109,46,10,10,32,32,32,32,84,104,101,32,108,111,97,
+ 100,101,114,32,109,117,115,116,32,116,97,107,101,32,97,32,
+ 115,112,101,99,32,97,115,32,105,116,115,32,111,110,108,121,
+ 32,95,95,105,110,105,116,95,95,40,41,32,97,114,103,46,
+ 10,10,32,32,32,32,78,122,9,60,117,110,107,110,111,119,
+ 110,62,218,12,103,101,116,95,102,105,108,101,110,97,109,101,
+ 169,1,218,6,111,114,105,103,105,110,84,218,10,105,115,95,
+ 112,97,99,107,97,103,101,114,1,0,0,0,41,19,114,200,
+ 0,0,0,114,8,1,0,0,114,189,0,0,0,114,23,0,
+ 0,0,114,131,0,0,0,114,105,0,0,0,114,87,0,0,
+ 0,114,208,0,0,0,218,10,77,111,100,117,108,101,83,112,
+ 101,99,218,13,95,115,101,116,95,102,105,108,101,97,116,116,
+ 114,218,27,95,103,101,116,95,115,117,112,112,111,114,116,101,
+ 100,95,102,105,108,101,95,108,111,97,100,101,114,115,114,59,
+ 0,0,0,114,180,0,0,0,114,5,1,0,0,218,9,95,
+ 80,79,80,85,76,65,84,69,114,11,1,0,0,114,6,1,
+ 0,0,114,81,0,0,0,114,64,0,0,0,41,9,114,188,
+ 0,0,0,218,8,108,111,99,97,116,105,111,110,114,5,1,
+ 0,0,114,6,1,0,0,218,4,115,112,101,99,218,12,108,
+ 111,97,100,101,114,95,99,108,97,115,115,218,8,115,117,102,
+ 102,105,120,101,115,114,11,1,0,0,218,7,100,105,114,110,
+ 97,109,101,115,9,0,0,0,32,32,32,32,32,32,32,32,
+ 32,114,10,0,0,0,218,23,115,112,101,99,95,102,114,111,
+ 109,95,102,105,108,101,95,108,111,99,97,116,105,111,110,114,
+ 21,1,0,0,38,3,0,0,115,105,1,0,0,128,0,240,
+ 24,0,8,16,208,7,23,240,8,0,20,31,136,8,220,11,
+ 18,144,54,152,62,212,11,42,240,4,3,13,21,216,27,33,
+ 215,27,46,209,27,46,168,116,211,27,52,145,8,244,8,0,
+ 20,23,151,58,145,58,152,104,211,19,39,136,8,240,2,3,
+ 9,17,220,23,36,160,88,211,23,46,136,72,244,20,0,12,
+ 22,215,11,32,209,11,32,160,20,160,118,176,104,208,11,32,
+ 211,11,63,128,68,216,25,29,128,68,212,4,22,240,6,0,
+ 8,14,128,126,220,38,65,214,38,67,209,12,34,136,76,152,
+ 40,216,15,23,215,15,32,209,15,32,164,21,160,120,163,31,
+ 213,15,49,217,25,37,160,100,168,72,211,25,53,144,6,216,
+ 30,36,144,4,148,11,217,16,21,240,9,0,39,68,1,240,
+ 12,0,20,24,240,6,0,8,34,164,89,209,7,46,228,11,
+ 18,144,54,152,60,212,11,40,240,2,6,13,57,216,29,35,
+ 215,29,46,209,29,46,168,116,211,29,52,144,10,241,8,0,
+ 20,30,216,54,56,144,68,213,20,51,224,42,68,136,4,212,
+ 8,39,216,7,11,215,7,38,209,7,38,168,34,210,7,44,
+ 217,11,19,220,22,33,160,40,211,22,43,168,65,209,22,46,
+ 136,71,216,12,16,215,12,43,209,12,43,215,12,50,209,12,
+ 50,176,55,212,12,59,224,11,15,128,75,248,244,93,1,0,
+ 20,31,242,0,1,13,21,217,16,20,240,3,1,13,21,251,
+ 244,12,0,16,23,242,0,1,9,17,217,12,16,240,3,1,
+ 9,17,251,244,56,0,20,31,242,0,1,13,21,217,16,20,
+ 240,3,1,13,21,250,115,52,0,0,0,146,17,68,24,0,
+ 186,11,68,39,0,194,58,17,68,54,0,196,24,9,68,36,
+ 3,196,35,1,68,36,3,196,39,9,68,51,3,196,50,1,
+ 68,51,3,196,54,9,69,2,3,197,1,1,69,2,3,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,
+ 3,0,0,0,243,140,1,0,0,151,0,116,1,0,0,0,
+ 0,0,0,0,0,124,0,116,2,0,0,0,0,0,0,0,
+ 0,171,2,0,0,0,0,0,0,115,1,121,1,116,5,0,
+ 0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,125,
+ 1,124,0,106,7,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,100,2,100,1,171,2,0,0,0,
+ 0,0,0,125,2,124,0,106,7,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,100,3,124,1,171,
+ 2,0,0,0,0,0,0,125,3,124,2,128,18,124,3,124,
+ 1,117,0,114,1,121,1,124,3,128,11,116,9,0,0,0,
+ 0,0,0,0,0,100,4,171,1,0,0,0,0,0,0,130,
+ 1,116,11,0,0,0,0,0,0,0,0,124,3,100,5,124,
+ 1,171,3,0,0,0,0,0,0,125,4,124,4,124,1,100,
+ 1,102,2,118,0,114,54,124,2,128,24,124,4,124,1,117,
+ 0,114,6,116,12,0,0,0,0,0,0,0,0,110,5,116,
+ 8,0,0,0,0,0,0,0,0,125,5,2,0,124,5,100,
+ 4,171,1,0,0,0,0,0,0,130,1,116,15,0,0,0,
0,0,0,0,0,106,16,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,100,6,116,18,0,0,0,
+ 0,0,0,0,0,0,0,0,0,100,4,116,18,0,0,0,
0,0,0,0,0,171,2,0,0,0,0,0,0,1,0,124,
- 2,83,0,124,4,83,0,41,7,122,67,72,101,108,112,101,
- 114,32,102,117,110,99,116,105,111,110,32,102,111,114,32,95,
- 119,97,114,110,105,110,103,115,46,99,10,10,32,32,32,32,
- 83,101,101,32,71,72,35,57,55,56,53,48,32,102,111,114,
- 32,100,101,116,97,105,108,115,46,10,32,32,32,32,78,218,
- 10,95,95,108,111,97,100,101,114,95,95,218,8,95,95,115,
- 112,101,99,95,95,122,43,77,111,100,117,108,101,32,103,108,
- 111,98,97,108,115,32,105,115,32,109,105,115,115,105,110,103,
- 32,97,32,95,95,115,112,101,99,95,95,46,108,111,97,100,
- 101,114,114,4,1,0,0,122,45,77,111,100,117,108,101,32,
- 103,108,111,98,97,108,115,59,32,95,95,108,111,97,100,101,
- 114,95,95,32,33,61,32,95,95,115,112,101,99,95,95,46,
- 108,111,97,100,101,114,41,10,114,232,0,0,0,218,4,100,
- 105,99,116,218,6,111,98,106,101,99,116,218,3,103,101,116,
- 114,138,0,0,0,114,201,0,0,0,218,14,65,116,116,114,
- 105,98,117,116,101,69,114,114,111,114,114,126,0,0,0,114,
- 127,0,0,0,114,128,0,0,0,41,6,218,14,109,111,100,
- 117,108,101,95,103,108,111,98,97,108,115,218,7,109,105,115,
- 115,105,110,103,114,4,1,0,0,114,16,1,0,0,218,11,
- 115,112,101,99,95,108,111,97,100,101,114,218,3,101,120,99,
- 115,6,0,0,0,32,32,32,32,32,32,114,10,0,0,0,
- 218,16,95,98,108,101,115,115,95,109,121,95,108,111,97,100,
- 101,114,114,32,1,0,0,104,3,0,0,115,232,0,0,0,
- 128,0,244,24,0,12,22,144,110,164,100,212,11,43,216,15,
- 19,228,14,20,139,104,128,71,216,13,27,215,13,31,209,13,
- 31,160,12,168,100,211,13,51,128,70,216,11,25,215,11,29,
- 209,11,29,152,106,168,39,211,11,50,128,68,224,7,13,128,
- 126,216,11,15,144,55,137,63,240,6,0,20,24,216,13,17,
- 136,92,220,18,28,208,29,74,211,18,75,208,12,75,228,18,
- 25,152,36,160,8,168,39,211,18,50,128,75,224,7,18,144,
- 119,160,4,144,111,209,7,37,216,11,17,136,62,216,36,47,
- 176,55,209,36,58,149,46,196,10,136,67,217,18,21,208,22,
- 67,211,18,68,208,12,68,220,8,17,143,14,137,14,216,12,
- 57,220,12,30,244,5,2,9,32,240,6,0,23,29,136,11,
- 224,11,22,208,11,34,208,4,34,208,11,34,216,7,13,208,
- 7,25,152,102,168,11,210,30,51,220,8,17,143,14,137,14,
- 216,12,59,220,12,30,244,5,2,9,32,240,6,0,16,22,
- 136,13,224,11,22,208,4,22,114,28,0,0,0,99,0,0,
- 0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,
- 0,0,243,90,0,0,0,151,0,101,0,90,1,100,0,90,
- 2,100,1,90,3,100,2,90,4,100,3,90,5,101,6,120,
- 1,114,4,1,0,100,4,101,7,118,0,90,8,101,9,100,
- 5,132,0,171,0,0,0,0,0,0,0,90,10,101,11,100,
- 6,132,0,171,0,0,0,0,0,0,0,90,12,101,11,100,
- 9,100,8,132,1,171,0,0,0,0,0,0,0,90,13,121,
- 7,41,10,218,21,87,105,110,100,111,119,115,82,101,103,105,
- 115,116,114,121,70,105,110,100,101,114,122,62,77,101,116,97,
- 32,112,97,116,104,32,102,105,110,100,101,114,32,102,111,114,
- 32,109,111,100,117,108,101,115,32,100,101,99,108,97,114,101,
- 100,32,105,110,32,116,104,101,32,87,105,110,100,111,119,115,
- 32,114,101,103,105,115,116,114,121,46,122,59,83,111,102,116,
- 119,97,114,101,92,80,121,116,104,111,110,92,80,121,116,104,
- 111,110,67,111,114,101,92,123,115,121,115,95,118,101,114,115,
- 105,111,110,125,92,77,111,100,117,108,101,115,92,123,102,117,
- 108,108,110,97,109,101,125,122,65,83,111,102,116,119,97,114,
- 101,92,80,121,116,104,111,110,92,80,121,116,104,111,110,67,
- 111,114,101,92,123,115,121,115,95,118,101,114,115,105,111,110,
- 125,92,77,111,100,117,108,101,115,92,123,102,117,108,108,110,
- 97,109,101,125,92,68,101,98,117,103,122,6,95,100,46,112,
- 121,100,99,1,0,0,0,0,0,0,0,0,0,0,0,5,
- 0,0,0,3,0,0,0,243,178,0,0,0,151,0,9,0,
- 116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,0,
- 0,0,0,0,0,0,0,0,106,4,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,0,171,2,
- 0,0,0,0,0,0,83,0,35,0,116,6,0,0,0,0,
- 0,0,0,0,36,0,114,39,1,0,116,1,0,0,0,0,
- 0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,116,0,0,0,0,0,0,0,
- 0,0,106,8,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,124,0,171,2,0,0,0,0,0,0,
- 99,2,89,0,83,0,119,0,120,3,89,0,119,1,114,77,
- 0,0,0,41,5,218,6,119,105,110,114,101,103,218,7,79,
- 112,101,110,75,101,121,218,17,72,75,69,89,95,67,85,82,
- 82,69,78,84,95,85,83,69,82,114,87,0,0,0,218,18,
- 72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,73,
- 78,69,114,25,0,0,0,115,1,0,0,0,32,114,10,0,
- 0,0,218,14,95,111,112,101,110,95,114,101,103,105,115,116,
- 114,121,122,36,87,105,110,100,111,119,115,82,101,103,105,115,
- 116,114,121,70,105,110,100,101,114,46,95,111,112,101,110,95,
- 114,101,103,105,115,116,114,121,166,3,0,0,115,71,0,0,
- 0,128,0,240,4,3,9,66,1,220,19,25,151,62,145,62,
- 164,38,215,34,58,209,34,58,184,67,211,19,64,208,12,64,
- 248,220,15,22,242,0,1,9,66,1,220,19,25,151,62,145,
- 62,164,38,215,34,59,209,34,59,184,83,211,19,65,210,12,
- 65,240,3,1,9,66,1,250,115,15,0,0,0,130,35,38,
- 0,166,45,65,22,3,193,21,1,65,22,3,99,2,0,0,
- 0,0,0,0,0,0,0,0,0,7,0,0,0,3,0,0,
- 0,243,56,1,0,0,151,0,124,0,106,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,13,
- 124,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,125,2,110,12,124,0,106,4,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 125,2,124,2,106,7,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,1,100,1,116,8,0,0,
- 0,0,0,0,0,0,106,10,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,100,0,100,2,26,0,
- 122,6,0,0,172,3,171,2,0,0,0,0,0,0,125,3,
- 9,0,124,0,106,13,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,3,171,1,0,0,0,0,
- 0,0,53,0,125,4,116,15,0,0,0,0,0,0,0,0,
- 106,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,4,100,4,171,2,0,0,0,0,0,0,
- 125,5,100,0,100,0,100,0,171,2,0,0,0,0,0,0,
- 1,0,124,5,83,0,35,0,49,0,115,1,119,2,1,0,
- 89,0,1,0,1,0,127,5,83,0,120,3,89,0,119,1,
- 35,0,116,18,0,0,0,0,0,0,0,0,36,0,114,3,
- 1,0,89,0,121,0,119,0,120,3,89,0,119,1,41,5,
- 78,122,5,37,100,46,37,100,114,52,0,0,0,41,2,218,
- 8,102,117,108,108,110,97,109,101,218,11,115,121,115,95,118,
- 101,114,115,105,111,110,114,12,0,0,0,41,10,218,11,68,
- 69,66,85,71,95,66,85,73,76,68,218,18,82,69,71,73,
- 83,84,82,89,95,75,69,89,95,68,69,66,85,71,218,12,
- 82,69,71,73,83,84,82,89,95,75,69,89,218,6,102,111,
- 114,109,97,116,114,20,0,0,0,218,12,118,101,114,115,105,
- 111,110,95,105,110,102,111,114,40,1,0,0,114,36,1,0,
- 0,218,10,81,117,101,114,121,86,97,108,117,101,114,87,0,
- 0,0,41,6,218,3,99,108,115,114,42,1,0,0,218,12,
- 114,101,103,105,115,116,114,121,95,107,101,121,114,26,0,0,
- 0,218,4,104,107,101,121,218,8,102,105,108,101,112,97,116,
- 104,115,6,0,0,0,32,32,32,32,32,32,114,10,0,0,
- 0,218,16,95,115,101,97,114,99,104,95,114,101,103,105,115,
- 116,114,121,122,38,87,105,110,100,111,119,115,82,101,103,105,
- 115,116,114,121,70,105,110,100,101,114,46,95,115,101,97,114,
- 99,104,95,114,101,103,105,115,116,114,121,173,3,0,0,115,
- 159,0,0,0,128,0,224,11,14,143,63,138,63,216,27,30,
- 215,27,49,209,27,49,137,76,224,27,30,215,27,43,209,27,
- 43,136,76,216,14,26,215,14,33,209,14,33,168,56,216,46,
- 53,188,3,215,56,72,209,56,72,200,18,200,33,208,56,76,
- 209,46,76,240,3,0,15,34,243,0,1,15,78,1,136,3,
- 240,4,4,9,24,216,17,20,215,17,35,209,17,35,160,67,
- 212,17,40,168,68,220,27,33,215,27,44,209,27,44,168,84,
- 176,50,211,27,54,144,8,247,3,0,18,41,240,8,0,16,
- 24,136,15,247,9,0,18,41,240,8,0,16,24,136,15,251,
- 244,5,0,16,23,242,0,1,9,24,217,19,23,240,3,1,
- 9,24,250,115,48,0,0,0,193,14,17,66,13,0,193,31,
- 23,66,0,3,193,54,8,66,13,0,194,0,5,66,10,7,
- 194,5,3,66,13,0,194,10,3,66,13,0,194,13,9,66,
- 25,3,194,24,1,66,25,3,78,99,4,0,0,0,0,0,
- 0,0,0,0,0,0,8,0,0,0,3,0,0,0,243,0,
- 1,0,0,151,0,124,0,106,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,1,171,1,0,
- 0,0,0,0,0,125,4,124,4,128,1,121,0,9,0,116,
- 3,0,0,0,0,0,0,0,0,124,4,171,1,0,0,0,
- 0,0,0,1,0,116,7,0,0,0,0,0,0,0,0,171,
- 0,0,0,0,0,0,0,68,0,93,66,0,0,92,2,0,
- 0,125,5,125,6,124,4,106,9,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,116,11,0,0,0,
- 0,0,0,0,0,124,6,171,1,0,0,0,0,0,0,171,
- 1,0,0,0,0,0,0,115,1,140,33,116,12,0,0,0,
- 0,0,0,0,0,106,15,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,124,1,2,0,124,5,124,
- 1,124,4,171,2,0,0,0,0,0,0,124,4,172,1,171,
- 3,0,0,0,0,0,0,125,7,124,7,99,2,1,0,83,
- 0,4,0,121,0,35,0,116,4,0,0,0,0,0,0,0,
- 0,36,0,114,3,1,0,89,0,121,0,119,0,120,3,89,
- 0,119,1,41,2,78,114,8,1,0,0,41,8,114,54,1,
- 0,0,114,85,0,0,0,114,87,0,0,0,114,13,1,0,
- 0,114,59,0,0,0,114,179,0,0,0,114,207,0,0,0,
- 218,16,115,112,101,99,95,102,114,111,109,95,108,111,97,100,
- 101,114,41,8,114,50,1,0,0,114,42,1,0,0,114,68,
- 0,0,0,218,6,116,97,114,103,101,116,114,53,1,0,0,
- 114,4,1,0,0,114,18,1,0,0,114,16,1,0,0,115,
- 8,0,0,0,32,32,32,32,32,32,32,32,114,10,0,0,
- 0,218,9,102,105,110,100,95,115,112,101,99,122,31,87,105,
- 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,
- 100,101,114,46,102,105,110,100,95,115,112,101,99,188,3,0,
- 0,115,142,0,0,0,128,0,224,19,22,215,19,39,209,19,
- 39,168,8,211,19,49,136,8,216,11,19,208,11,27,216,19,
- 23,240,2,3,9,24,220,12,22,144,120,212,12,32,244,6,
- 0,33,60,214,32,61,209,12,28,136,70,144,72,216,15,23,
- 215,15,32,209,15,32,164,21,160,120,163,31,213,15,49,220,
- 23,33,215,23,50,209,23,50,176,56,217,51,57,184,40,192,
- 72,211,51,77,216,58,66,240,5,0,24,51,243,0,2,24,
- 68,1,144,4,240,6,0,24,28,146,11,241,11,0,33,62,
- 248,244,5,0,16,23,242,0,1,9,24,217,19,23,240,3,
- 1,9,24,250,115,17,0,0,0,150,11,65,49,0,193,49,
- 9,65,61,3,193,60,1,65,61,3,169,2,78,78,41,14,
- 114,196,0,0,0,114,195,0,0,0,114,197,0,0,0,114,
- 198,0,0,0,114,46,1,0,0,114,45,1,0,0,218,11,
- 95,77,83,95,87,73,78,68,79,87,83,218,18,69,88,84,
- 69,78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,
- 44,1,0,0,218,12,115,116,97,116,105,99,109,101,116,104,
- 111,100,114,40,1,0,0,218,11,99,108,97,115,115,109,101,
- 116,104,111,100,114,54,1,0,0,114,58,1,0,0,114,30,
- 0,0,0,114,28,0,0,0,114,10,0,0,0,114,34,1,
- 0,0,114,34,1,0,0,154,3,0,0,115,103,0,0,0,
- 132,0,225,4,72,240,6,1,9,32,240,3,0,5,17,240,
- 8,1,9,39,240,3,0,5,23,240,6,0,20,31,210,19,
- 65,160,56,208,47,65,208,35,65,128,75,224,5,17,241,2,
- 4,5,66,1,243,3,0,6,18,240,2,4,5,66,1,240,
- 12,0,6,17,241,2,12,5,24,243,3,0,6,17,240,2,
- 12,5,24,240,28,0,6,17,242,2,13,5,28,243,3,0,
- 6,17,241,2,13,5,28,114,28,0,0,0,114,34,1,0,
- 0,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
- 0,0,0,0,0,0,243,40,0,0,0,151,0,101,0,90,
- 1,100,0,90,2,100,1,90,3,100,2,132,0,90,4,100,
- 3,132,0,90,5,100,4,132,0,90,6,100,5,132,0,90,
- 7,121,6,41,7,218,13,95,76,111,97,100,101,114,66,97,
- 115,105,99,115,122,83,66,97,115,101,32,99,108,97,115,115,
- 32,111,102,32,99,111,109,109,111,110,32,99,111,100,101,32,
- 110,101,101,100,101,100,32,98,121,32,98,111,116,104,32,83,
- 111,117,114,99,101,76,111,97,100,101,114,32,97,110,100,10,
- 32,32,32,32,83,111,117,114,99,101,108,101,115,115,70,105,
- 108,101,76,111,97,100,101,114,46,99,2,0,0,0,0,0,
- 0,0,0,0,0,0,5,0,0,0,3,0,0,0,243,166,
- 0,0,0,151,0,116,1,0,0,0,0,0,0,0,0,124,
- 0,106,3,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,171,
- 1,0,0,0,0,0,0,100,1,25,0,0,0,125,2,124,
- 2,106,5,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,100,2,100,1,171,2,0,0,0,0,0,
- 0,100,3,25,0,0,0,125,3,124,1,106,7,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,
- 2,171,1,0,0,0,0,0,0,100,4,25,0,0,0,125,
- 4,124,3,100,5,107,40,0,0,120,1,114,5,1,0,124,
- 4,100,5,107,55,0,0,83,0,41,6,122,141,67,111,110,
- 99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,
- 116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,
- 111,97,100,101,114,46,105,115,95,112,97,99,107,97,103,101,
- 32,98,121,32,99,104,101,99,107,105,110,103,32,105,102,10,
- 32,32,32,32,32,32,32,32,116,104,101,32,112,97,116,104,
- 32,114,101,116,117,114,110,101,100,32,98,121,32,103,101,116,
- 95,102,105,108,101,110,97,109,101,32,104,97,115,32,97,32,
- 102,105,108,101,110,97,109,101,32,111,102,32,39,95,95,105,
- 110,105,116,95,95,46,112,121,39,46,114,6,0,0,0,114,
- 103,0,0,0,114,1,0,0,0,114,52,0,0,0,218,8,
- 95,95,105,110,105,116,95,95,41,4,114,81,0,0,0,114,
- 7,1,0,0,114,157,0,0,0,114,131,0,0,0,41,5,
- 114,189,0,0,0,114,42,1,0,0,114,151,0,0,0,218,
- 13,102,105,108,101,110,97,109,101,95,98,97,115,101,218,9,
- 116,97,105,108,95,110,97,109,101,115,5,0,0,0,32,32,
- 32,32,32,114,10,0,0,0,114,10,1,0,0,122,24,95,
- 76,111,97,100,101,114,66,97,115,105,99,115,46,105,115,95,
- 112,97,99,107,97,103,101,210,3,0,0,115,93,0,0,0,
- 128,0,244,6,0,20,31,152,116,215,31,48,209,31,48,176,
- 24,211,31,58,211,19,59,184,65,209,19,62,136,8,216,24,
- 32,159,15,153,15,168,3,168,81,211,24,47,176,1,209,24,
- 50,136,13,216,20,28,215,20,39,209,20,39,168,3,211,20,
- 44,168,81,209,20,47,136,9,216,15,28,160,10,209,15,42,
- 210,15,70,168,121,184,74,209,47,70,208,8,70,114,28,0,
- 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,3,0,0,0,243,4,0,0,0,151,0,121,1,
- 169,2,122,42,85,115,101,32,100,101,102,97,117,108,116,32,
- 115,101,109,97,110,116,105,99,115,32,102,111,114,32,109,111,
- 100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,114,
- 30,0,0,0,169,2,114,189,0,0,0,114,16,1,0,0,
- 115,2,0,0,0,32,32,114,10,0,0,0,218,13,99,114,
- 101,97,116,101,95,109,111,100,117,108,101,122,27,95,76,111,
- 97,100,101,114,66,97,115,105,99,115,46,99,114,101,97,116,
- 101,95,109,111,100,117,108,101,218,3,0,0,243,2,0,0,
- 0,129,0,114,28,0,0,0,99,2,0,0,0,0,0,0,
- 0,0,0,0,0,5,0,0,0,3,0,0,0,243,186,0,
- 0,0,151,0,124,0,106,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,1,106,2,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 171,1,0,0,0,0,0,0,125,2,124,2,128,25,116,5,
- 0,0,0,0,0,0,0,0,100,2,124,1,106,2,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 155,2,100,3,157,3,171,1,0,0,0,0,0,0,130,1,
- 116,6,0,0,0,0,0,0,0,0,106,9,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,10,
- 0,0,0,0,0,0,0,0,124,2,124,1,106,12,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 171,3,0,0,0,0,0,0,1,0,121,1,41,4,122,19,
- 69,120,101,99,117,116,101,32,116,104,101,32,109,111,100,117,
- 108,101,46,78,122,19,99,97,110,110,111,116,32,108,111,97,
- 100,32,109,111,100,117,108,101,32,122,29,32,119,104,101,110,
- 32,103,101,116,95,99,111,100,101,40,41,32,114,101,116,117,
- 114,110,115,32,78,111,110,101,41,7,218,8,103,101,116,95,
- 99,111,100,101,114,196,0,0,0,114,188,0,0,0,114,207,
- 0,0,0,218,25,95,99,97,108,108,95,119,105,116,104,95,
- 102,114,97,109,101,115,95,114,101,109,111,118,101,100,218,4,
- 101,120,101,99,114,202,0,0,0,41,3,114,189,0,0,0,
- 218,6,109,111,100,117,108,101,114,236,0,0,0,115,3,0,
- 0,0,32,32,32,114,10,0,0,0,218,11,101,120,101,99,
- 95,109,111,100,117,108,101,122,25,95,76,111,97,100,101,114,
- 66,97,115,105,99,115,46,101,120,101,99,95,109,111,100,117,
- 108,101,221,3,0,0,115,83,0,0,0,128,0,224,15,19,
- 143,125,137,125,152,86,159,95,153,95,211,15,45,136,4,216,
- 11,15,136,60,220,18,29,208,32,51,176,70,183,79,177,79,
- 208,51,70,240,0,1,71,1,56,240,0,1,31,56,243,0,
- 1,19,57,240,0,1,13,57,228,8,18,215,8,44,209,8,
- 44,172,84,176,52,184,22,191,31,185,31,213,8,73,114,28,
- 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,
- 4,0,0,0,3,0,0,0,243,46,0,0,0,151,0,116,
- 0,0,0,0,0,0,0,0,0,106,3,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,124,
- 1,171,2,0,0,0,0,0,0,83,0,41,1,122,26,84,
- 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,
- 112,114,101,99,97,116,101,100,46,41,2,114,207,0,0,0,
- 218,17,95,108,111,97,100,95,109,111,100,117,108,101,95,115,
- 104,105,109,169,2,114,189,0,0,0,114,42,1,0,0,115,
- 2,0,0,0,32,32,114,10,0,0,0,218,11,108,111,97,
- 100,95,109,111,100,117,108,101,122,25,95,76,111,97,100,101,
- 114,66,97,115,105,99,115,46,108,111,97,100,95,109,111,100,
- 117,108,101,229,3,0,0,115,23,0,0,0,128,0,244,6,
- 0,16,26,215,15,43,209,15,43,168,68,176,40,211,15,59,
- 208,8,59,114,28,0,0,0,78,41,8,114,196,0,0,0,
- 114,195,0,0,0,114,197,0,0,0,114,198,0,0,0,114,
- 10,1,0,0,114,73,1,0,0,114,80,1,0,0,114,84,
- 1,0,0,114,30,0,0,0,114,28,0,0,0,114,10,0,
- 0,0,114,65,1,0,0,114,65,1,0,0,205,3,0,0,
- 115,29,0,0,0,132,0,241,4,1,5,29,242,6,6,5,
- 71,1,242,16,1,5,57,242,6,6,5,74,1,243,16,3,
- 5,60,114,28,0,0,0,114,65,1,0,0,99,0,0,0,
- 0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,
- 0,243,60,0,0,0,151,0,101,0,90,1,100,0,90,2,
- 100,1,132,0,90,3,100,2,132,0,90,4,100,3,132,0,
- 90,5,100,4,132,0,90,6,100,5,132,0,90,7,100,6,
- 100,7,156,1,100,8,132,2,90,8,100,9,132,0,90,9,
- 121,10,41,11,218,12,83,111,117,114,99,101,76,111,97,100,
- 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,1,
- 0,0,0,3,0,0,0,243,14,0,0,0,151,0,116,0,
- 0,0,0,0,0,0,0,0,130,1,41,1,122,165,79,112,
- 116,105,111,110,97,108,32,109,101,116,104,111,100,32,116,104,
- 97,116,32,114,101,116,117,114,110,115,32,116,104,101,32,109,
- 111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101,
- 32,40,97,110,32,105,110,116,41,32,102,111,114,32,116,104,
- 101,10,32,32,32,32,32,32,32,32,115,112,101,99,105,102,
- 105,101,100,32,112,97,116,104,32,40,97,32,115,116,114,41,
- 46,10,10,32,32,32,32,32,32,32,32,82,97,105,115,101,
+ 2,125,4,124,4,128,2,74,0,130,1,124,2,129,33,124,
+ 2,124,4,107,55,0,0,114,28,116,15,0,0,0,0,0,
+ 0,0,0,106,16,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,100,6,116,18,0,0,0,0,0,
+ 0,0,0,171,2,0,0,0,0,0,0,1,0,124,2,83,
+ 0,124,4,83,0,41,7,122,67,72,101,108,112,101,114,32,
+ 102,117,110,99,116,105,111,110,32,102,111,114,32,95,119,97,
+ 114,110,105,110,103,115,46,99,10,10,32,32,32,32,83,101,
+ 101,32,71,72,35,57,55,56,53,48,32,102,111,114,32,100,
+ 101,116,97,105,108,115,46,10,32,32,32,32,78,218,10,95,
+ 95,108,111,97,100,101,114,95,95,218,8,95,95,115,112,101,
+ 99,95,95,122,43,77,111,100,117,108,101,32,103,108,111,98,
+ 97,108,115,32,105,115,32,109,105,115,115,105,110,103,32,97,
+ 32,95,95,115,112,101,99,95,95,46,108,111,97,100,101,114,
+ 114,5,1,0,0,122,45,77,111,100,117,108,101,32,103,108,
+ 111,98,97,108,115,59,32,95,95,108,111,97,100,101,114,95,
+ 95,32,33,61,32,95,95,115,112,101,99,95,95,46,108,111,
+ 97,100,101,114,41,10,114,233,0,0,0,218,4,100,105,99,
+ 116,218,6,111,98,106,101,99,116,218,3,103,101,116,114,139,
+ 0,0,0,114,202,0,0,0,218,14,65,116,116,114,105,98,
+ 117,116,101,69,114,114,111,114,114,127,0,0,0,114,128,0,
+ 0,0,114,129,0,0,0,41,6,218,14,109,111,100,117,108,
+ 101,95,103,108,111,98,97,108,115,218,7,109,105,115,115,105,
+ 110,103,114,5,1,0,0,114,17,1,0,0,218,11,115,112,
+ 101,99,95,108,111,97,100,101,114,218,3,101,120,99,115,6,
+ 0,0,0,32,32,32,32,32,32,114,10,0,0,0,218,16,
+ 95,98,108,101,115,115,95,109,121,95,108,111,97,100,101,114,
+ 114,33,1,0,0,108,3,0,0,115,232,0,0,0,128,0,
+ 244,24,0,12,22,144,110,164,100,212,11,43,216,15,19,228,
+ 14,20,139,104,128,71,216,13,27,215,13,31,209,13,31,160,
+ 12,168,100,211,13,51,128,70,216,11,25,215,11,29,209,11,
+ 29,152,106,168,39,211,11,50,128,68,224,7,13,128,126,216,
+ 11,15,144,55,137,63,240,6,0,20,24,216,13,17,136,92,
+ 220,18,28,208,29,74,211,18,75,208,12,75,228,18,25,152,
+ 36,160,8,168,39,211,18,50,128,75,224,7,18,144,119,160,
+ 4,144,111,209,7,37,216,11,17,136,62,216,36,47,176,55,
+ 209,36,58,149,46,196,10,136,67,217,18,21,208,22,67,211,
+ 18,68,208,12,68,220,8,17,143,14,137,14,216,12,57,220,
+ 12,30,244,5,2,9,32,240,6,0,23,29,136,11,224,11,
+ 22,208,11,34,208,4,34,208,11,34,216,7,13,208,7,25,
+ 152,102,168,11,210,30,51,220,8,17,143,14,137,14,216,12,
+ 59,220,12,30,244,5,2,9,32,240,6,0,16,22,136,13,
+ 224,11,22,208,4,22,114,28,0,0,0,99,0,0,0,0,
+ 0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,
+ 243,90,0,0,0,151,0,101,0,90,1,100,0,90,2,100,
+ 1,90,3,100,2,90,4,100,3,90,5,101,6,120,1,114,
+ 4,1,0,100,4,101,7,118,0,90,8,101,9,100,5,132,
+ 0,171,0,0,0,0,0,0,0,90,10,101,11,100,6,132,
+ 0,171,0,0,0,0,0,0,0,90,12,101,11,100,9,100,
+ 8,132,1,171,0,0,0,0,0,0,0,90,13,121,7,41,
+ 10,218,21,87,105,110,100,111,119,115,82,101,103,105,115,116,
+ 114,121,70,105,110,100,101,114,122,62,77,101,116,97,32,112,
+ 97,116,104,32,102,105,110,100,101,114,32,102,111,114,32,109,
+ 111,100,117,108,101,115,32,100,101,99,108,97,114,101,100,32,
+ 105,110,32,116,104,101,32,87,105,110,100,111,119,115,32,114,
+ 101,103,105,115,116,114,121,46,122,59,83,111,102,116,119,97,
+ 114,101,92,80,121,116,104,111,110,92,80,121,116,104,111,110,
+ 67,111,114,101,92,123,115,121,115,95,118,101,114,115,105,111,
+ 110,125,92,77,111,100,117,108,101,115,92,123,102,117,108,108,
+ 110,97,109,101,125,122,65,83,111,102,116,119,97,114,101,92,
+ 80,121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,
+ 101,92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,
+ 77,111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,
+ 101,125,92,68,101,98,117,103,122,6,95,100,46,112,121,100,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,
+ 0,3,0,0,0,243,178,0,0,0,151,0,9,0,116,1,
+ 0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,116,0,0,0,
+ 0,0,0,0,0,0,106,4,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,171,2,0,0,
+ 0,0,0,0,83,0,35,0,116,6,0,0,0,0,0,0,
+ 0,0,36,0,114,39,1,0,116,1,0,0,0,0,0,0,
+ 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,116,0,0,0,0,0,0,0,0,0,
+ 106,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,124,0,171,2,0,0,0,0,0,0,99,2,
+ 89,0,83,0,119,0,120,3,89,0,119,1,114,77,0,0,
+ 0,41,5,218,6,119,105,110,114,101,103,218,7,79,112,101,
+ 110,75,101,121,218,17,72,75,69,89,95,67,85,82,82,69,
+ 78,84,95,85,83,69,82,114,87,0,0,0,218,18,72,75,
+ 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69,
+ 114,25,0,0,0,115,1,0,0,0,32,114,10,0,0,0,
+ 218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,121,
+ 122,36,87,105,110,100,111,119,115,82,101,103,105,115,116,114,
+ 121,70,105,110,100,101,114,46,95,111,112,101,110,95,114,101,
+ 103,105,115,116,114,121,170,3,0,0,115,71,0,0,0,128,
+ 0,240,4,3,9,66,1,220,19,25,151,62,145,62,164,38,
+ 215,34,58,209,34,58,184,67,211,19,64,208,12,64,248,220,
+ 15,22,242,0,1,9,66,1,220,19,25,151,62,145,62,164,
+ 38,215,34,59,209,34,59,184,83,211,19,65,210,12,65,240,
+ 3,1,9,66,1,250,115,15,0,0,0,130,35,38,0,166,
+ 45,65,22,3,193,21,1,65,22,3,99,2,0,0,0,0,
+ 0,0,0,0,0,0,0,7,0,0,0,3,0,0,0,243,
+ 56,1,0,0,151,0,124,0,106,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,114,13,124,0,
+ 106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,125,2,110,12,124,0,106,4,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,2,
+ 124,2,106,7,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,1,100,1,116,8,0,0,0,0,
+ 0,0,0,0,106,10,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,100,0,100,2,26,0,122,6,
+ 0,0,172,3,171,2,0,0,0,0,0,0,125,3,9,0,
+ 124,0,106,13,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,3,171,1,0,0,0,0,0,0,
+ 53,0,125,4,116,15,0,0,0,0,0,0,0,0,106,16,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,4,100,4,171,2,0,0,0,0,0,0,125,5,
+ 100,0,100,0,100,0,171,2,0,0,0,0,0,0,1,0,
+ 124,5,83,0,35,0,49,0,115,1,119,2,1,0,89,0,
+ 1,0,1,0,127,5,83,0,120,3,89,0,119,1,35,0,
+ 116,18,0,0,0,0,0,0,0,0,36,0,114,3,1,0,
+ 89,0,121,0,119,0,120,3,89,0,119,1,41,5,78,122,
+ 5,37,100,46,37,100,114,52,0,0,0,41,2,218,8,102,
+ 117,108,108,110,97,109,101,218,11,115,121,115,95,118,101,114,
+ 115,105,111,110,114,12,0,0,0,41,10,218,11,68,69,66,
+ 85,71,95,66,85,73,76,68,218,18,82,69,71,73,83,84,
+ 82,89,95,75,69,89,95,68,69,66,85,71,218,12,82,69,
+ 71,73,83,84,82,89,95,75,69,89,218,6,102,111,114,109,
+ 97,116,114,20,0,0,0,218,12,118,101,114,115,105,111,110,
+ 95,105,110,102,111,114,41,1,0,0,114,37,1,0,0,218,
+ 10,81,117,101,114,121,86,97,108,117,101,114,87,0,0,0,
+ 41,6,218,3,99,108,115,114,43,1,0,0,218,12,114,101,
+ 103,105,115,116,114,121,95,107,101,121,114,26,0,0,0,218,
+ 4,104,107,101,121,218,8,102,105,108,101,112,97,116,104,115,
+ 6,0,0,0,32,32,32,32,32,32,114,10,0,0,0,218,
+ 16,95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,
+ 121,122,38,87,105,110,100,111,119,115,82,101,103,105,115,116,
+ 114,121,70,105,110,100,101,114,46,95,115,101,97,114,99,104,
+ 95,114,101,103,105,115,116,114,121,177,3,0,0,115,159,0,
+ 0,0,128,0,224,11,14,143,63,138,63,216,27,30,215,27,
+ 49,209,27,49,137,76,224,27,30,215,27,43,209,27,43,136,
+ 76,216,14,26,215,14,33,209,14,33,168,56,216,46,53,188,
+ 3,215,56,72,209,56,72,200,18,200,33,208,56,76,209,46,
+ 76,240,3,0,15,34,243,0,1,15,78,1,136,3,240,4,
+ 4,9,24,216,17,20,215,17,35,209,17,35,160,67,212,17,
+ 40,168,68,220,27,33,215,27,44,209,27,44,168,84,176,50,
+ 211,27,54,144,8,247,3,0,18,41,240,8,0,16,24,136,
+ 15,247,9,0,18,41,240,8,0,16,24,136,15,251,244,5,
+ 0,16,23,242,0,1,9,24,217,19,23,240,3,1,9,24,
+ 250,115,48,0,0,0,193,14,17,66,13,0,193,31,23,66,
+ 0,3,193,54,8,66,13,0,194,0,5,66,10,7,194,5,
+ 3,66,13,0,194,10,3,66,13,0,194,13,9,66,25,3,
+ 194,24,1,66,25,3,78,99,4,0,0,0,0,0,0,0,
+ 0,0,0,0,8,0,0,0,3,0,0,0,243,0,1,0,
+ 0,151,0,124,0,106,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,
+ 0,0,0,125,4,124,4,128,1,121,0,9,0,116,3,0,
+ 0,0,0,0,0,0,0,124,4,171,1,0,0,0,0,0,
+ 0,1,0,116,7,0,0,0,0,0,0,0,0,171,0,0,
+ 0,0,0,0,0,68,0,93,66,0,0,92,2,0,0,125,
+ 5,125,6,124,4,106,9,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,116,11,0,0,0,0,0,
+ 0,0,0,124,6,171,1,0,0,0,0,0,0,171,1,0,
+ 0,0,0,0,0,115,1,140,33,116,12,0,0,0,0,0,
+ 0,0,0,106,15,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,124,1,2,0,124,5,124,1,124,
+ 4,171,2,0,0,0,0,0,0,124,4,172,1,171,3,0,
+ 0,0,0,0,0,125,7,124,7,99,2,1,0,83,0,4,
+ 0,121,0,35,0,116,4,0,0,0,0,0,0,0,0,36,
+ 0,114,3,1,0,89,0,121,0,119,0,120,3,89,0,119,
+ 1,41,2,78,114,9,1,0,0,41,8,114,55,1,0,0,
+ 114,85,0,0,0,114,87,0,0,0,114,14,1,0,0,114,
+ 59,0,0,0,114,180,0,0,0,114,208,0,0,0,218,16,
+ 115,112,101,99,95,102,114,111,109,95,108,111,97,100,101,114,
+ 41,8,114,51,1,0,0,114,43,1,0,0,114,68,0,0,
+ 0,218,6,116,97,114,103,101,116,114,54,1,0,0,114,5,
+ 1,0,0,114,19,1,0,0,114,17,1,0,0,115,8,0,
+ 0,0,32,32,32,32,32,32,32,32,114,10,0,0,0,218,
+ 9,102,105,110,100,95,115,112,101,99,122,31,87,105,110,100,
+ 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,
+ 114,46,102,105,110,100,95,115,112,101,99,192,3,0,0,115,
+ 142,0,0,0,128,0,224,19,22,215,19,39,209,19,39,168,
+ 8,211,19,49,136,8,216,11,19,208,11,27,216,19,23,240,
+ 2,3,9,24,220,12,22,144,120,212,12,32,244,6,0,33,
+ 60,214,32,61,209,12,28,136,70,144,72,216,15,23,215,15,
+ 32,209,15,32,164,21,160,120,163,31,213,15,49,220,23,33,
+ 215,23,50,209,23,50,176,56,217,51,57,184,40,192,72,211,
+ 51,77,216,58,66,240,5,0,24,51,243,0,2,24,68,1,
+ 144,4,240,6,0,24,28,146,11,241,11,0,33,62,248,244,
+ 5,0,16,23,242,0,1,9,24,217,19,23,240,3,1,9,
+ 24,250,115,17,0,0,0,150,11,65,49,0,193,49,9,65,
+ 61,3,193,60,1,65,61,3,169,2,78,78,41,14,114,197,
+ 0,0,0,114,196,0,0,0,114,198,0,0,0,114,199,0,
+ 0,0,114,47,1,0,0,114,46,1,0,0,218,11,95,77,
+ 83,95,87,73,78,68,79,87,83,218,18,69,88,84,69,78,
+ 83,73,79,78,95,83,85,70,70,73,88,69,83,114,45,1,
+ 0,0,218,12,115,116,97,116,105,99,109,101,116,104,111,100,
+ 114,41,1,0,0,218,11,99,108,97,115,115,109,101,116,104,
+ 111,100,114,55,1,0,0,114,59,1,0,0,114,30,0,0,
+ 0,114,28,0,0,0,114,10,0,0,0,114,35,1,0,0,
+ 114,35,1,0,0,158,3,0,0,115,103,0,0,0,132,0,
+ 225,4,72,240,6,1,9,32,240,3,0,5,17,240,8,1,
+ 9,39,240,3,0,5,23,240,6,0,20,31,210,19,65,160,
+ 56,208,47,65,208,35,65,128,75,224,5,17,241,2,4,5,
+ 66,1,243,3,0,6,18,240,2,4,5,66,1,240,12,0,
+ 6,17,241,2,12,5,24,243,3,0,6,17,240,2,12,5,
+ 24,240,28,0,6,17,242,2,13,5,28,243,3,0,6,17,
+ 241,2,13,5,28,114,28,0,0,0,114,35,1,0,0,99,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
+ 0,0,0,0,243,40,0,0,0,151,0,101,0,90,1,100,
+ 0,90,2,100,1,90,3,100,2,132,0,90,4,100,3,132,
+ 0,90,5,100,4,132,0,90,6,100,5,132,0,90,7,121,
+ 6,41,7,218,13,95,76,111,97,100,101,114,66,97,115,105,
+ 99,115,122,83,66,97,115,101,32,99,108,97,115,115,32,111,
+ 102,32,99,111,109,109,111,110,32,99,111,100,101,32,110,101,
+ 101,100,101,100,32,98,121,32,98,111,116,104,32,83,111,117,
+ 114,99,101,76,111,97,100,101,114,32,97,110,100,10,32,32,
+ 32,32,83,111,117,114,99,101,108,101,115,115,70,105,108,101,
+ 76,111,97,100,101,114,46,99,2,0,0,0,0,0,0,0,
+ 0,0,0,0,5,0,0,0,3,0,0,0,243,166,0,0,
+ 0,151,0,116,1,0,0,0,0,0,0,0,0,124,0,106,
+ 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,1,171,1,0,0,0,0,0,0,171,1,0,
+ 0,0,0,0,0,100,1,25,0,0,0,125,2,124,2,106,
+ 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,100,2,100,1,171,2,0,0,0,0,0,0,100,
+ 3,25,0,0,0,125,3,124,1,106,7,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,100,2,171,
+ 1,0,0,0,0,0,0,100,4,25,0,0,0,125,4,124,
+ 3,100,5,107,40,0,0,120,1,114,5,1,0,124,4,100,
+ 5,107,55,0,0,83,0,41,6,122,141,67,111,110,99,114,
+ 101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,
+ 111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,97,
+ 100,101,114,46,105,115,95,112,97,99,107,97,103,101,32,98,
+ 121,32,99,104,101,99,107,105,110,103,32,105,102,10,32,32,
+ 32,32,32,32,32,32,116,104,101,32,112,97,116,104,32,114,
+ 101,116,117,114,110,101,100,32,98,121,32,103,101,116,95,102,
+ 105,108,101,110,97,109,101,32,104,97,115,32,97,32,102,105,
+ 108,101,110,97,109,101,32,111,102,32,39,95,95,105,110,105,
+ 116,95,95,46,112,121,39,46,114,6,0,0,0,114,103,0,
+ 0,0,114,1,0,0,0,114,52,0,0,0,218,8,95,95,
+ 105,110,105,116,95,95,41,4,114,81,0,0,0,114,8,1,
+ 0,0,114,158,0,0,0,114,132,0,0,0,41,5,114,190,
+ 0,0,0,114,43,1,0,0,114,152,0,0,0,218,13,102,
+ 105,108,101,110,97,109,101,95,98,97,115,101,218,9,116,97,
+ 105,108,95,110,97,109,101,115,5,0,0,0,32,32,32,32,
+ 32,114,10,0,0,0,114,11,1,0,0,122,24,95,76,111,
+ 97,100,101,114,66,97,115,105,99,115,46,105,115,95,112,97,
+ 99,107,97,103,101,214,3,0,0,115,93,0,0,0,128,0,
+ 244,6,0,20,31,152,116,215,31,48,209,31,48,176,24,211,
+ 31,58,211,19,59,184,65,209,19,62,136,8,216,24,32,159,
+ 15,153,15,168,3,168,81,211,24,47,176,1,209,24,50,136,
+ 13,216,20,28,215,20,39,209,20,39,168,3,211,20,44,168,
+ 81,209,20,47,136,9,216,15,28,160,10,209,15,42,210,15,
+ 70,168,121,184,74,209,47,70,208,8,70,114,28,0,0,0,
+ 99,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,3,0,0,0,243,4,0,0,0,151,0,121,1,169,2,
+ 122,42,85,115,101,32,100,101,102,97,117,108,116,32,115,101,
+ 109,97,110,116,105,99,115,32,102,111,114,32,109,111,100,117,
+ 108,101,32,99,114,101,97,116,105,111,110,46,78,114,30,0,
+ 0,0,169,2,114,190,0,0,0,114,17,1,0,0,115,2,
+ 0,0,0,32,32,114,10,0,0,0,218,13,99,114,101,97,
+ 116,101,95,109,111,100,117,108,101,122,27,95,76,111,97,100,
+ 101,114,66,97,115,105,99,115,46,99,114,101,97,116,101,95,
+ 109,111,100,117,108,101,222,3,0,0,243,2,0,0,0,129,
+ 0,114,28,0,0,0,99,2,0,0,0,0,0,0,0,0,
+ 0,0,0,5,0,0,0,3,0,0,0,243,186,0,0,0,
+ 151,0,124,0,106,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,1,106,2,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,1,
+ 0,0,0,0,0,0,125,2,124,2,128,25,116,5,0,0,
+ 0,0,0,0,0,0,100,2,124,1,106,2,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,2,
+ 100,3,157,3,171,1,0,0,0,0,0,0,130,1,116,6,
+ 0,0,0,0,0,0,0,0,106,9,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,116,10,0,0,
+ 0,0,0,0,0,0,124,2,124,1,106,12,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,3,
+ 0,0,0,0,0,0,1,0,121,1,41,4,122,19,69,120,
+ 101,99,117,116,101,32,116,104,101,32,109,111,100,117,108,101,
+ 46,78,122,19,99,97,110,110,111,116,32,108,111,97,100,32,
+ 109,111,100,117,108,101,32,122,29,32,119,104,101,110,32,103,
+ 101,116,95,99,111,100,101,40,41,32,114,101,116,117,114,110,
+ 115,32,78,111,110,101,41,7,218,8,103,101,116,95,99,111,
+ 100,101,114,197,0,0,0,114,189,0,0,0,114,208,0,0,
+ 0,218,25,95,99,97,108,108,95,119,105,116,104,95,102,114,
+ 97,109,101,115,95,114,101,109,111,118,101,100,218,4,101,120,
+ 101,99,114,203,0,0,0,41,3,114,190,0,0,0,218,6,
+ 109,111,100,117,108,101,114,237,0,0,0,115,3,0,0,0,
+ 32,32,32,114,10,0,0,0,218,11,101,120,101,99,95,109,
+ 111,100,117,108,101,122,25,95,76,111,97,100,101,114,66,97,
+ 115,105,99,115,46,101,120,101,99,95,109,111,100,117,108,101,
+ 225,3,0,0,115,83,0,0,0,128,0,224,15,19,143,125,
+ 137,125,152,86,159,95,153,95,211,15,45,136,4,216,11,15,
+ 136,60,220,18,29,208,32,51,176,70,183,79,177,79,208,51,
+ 70,240,0,1,71,1,56,240,0,1,31,56,243,0,1,19,
+ 57,240,0,1,13,57,228,8,18,215,8,44,209,8,44,172,
+ 84,176,52,184,22,191,31,185,31,213,8,73,114,28,0,0,
+ 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,
+ 0,0,3,0,0,0,243,46,0,0,0,151,0,116,0,0,
+ 0,0,0,0,0,0,0,106,3,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,124,0,124,1,171,
+ 2,0,0,0,0,0,0,83,0,41,1,122,26,84,104,105,
+ 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,
+ 101,99,97,116,101,100,46,41,2,114,208,0,0,0,218,17,
+ 95,108,111,97,100,95,109,111,100,117,108,101,95,115,104,105,
+ 109,169,2,114,190,0,0,0,114,43,1,0,0,115,2,0,
+ 0,0,32,32,114,10,0,0,0,218,11,108,111,97,100,95,
+ 109,111,100,117,108,101,122,25,95,76,111,97,100,101,114,66,
+ 97,115,105,99,115,46,108,111,97,100,95,109,111,100,117,108,
+ 101,233,3,0,0,115,23,0,0,0,128,0,244,6,0,16,
+ 26,215,15,43,209,15,43,168,68,176,40,211,15,59,208,8,
+ 59,114,28,0,0,0,78,41,8,114,197,0,0,0,114,196,
+ 0,0,0,114,198,0,0,0,114,199,0,0,0,114,11,1,
+ 0,0,114,74,1,0,0,114,81,1,0,0,114,85,1,0,
+ 0,114,30,0,0,0,114,28,0,0,0,114,10,0,0,0,
+ 114,66,1,0,0,114,66,1,0,0,209,3,0,0,115,29,
+ 0,0,0,132,0,241,4,1,5,29,242,6,6,5,71,1,
+ 242,16,1,5,57,242,6,6,5,74,1,243,16,3,5,60,
+ 114,28,0,0,0,114,66,1,0,0,99,0,0,0,0,0,
+ 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,243,
+ 60,0,0,0,151,0,101,0,90,1,100,0,90,2,100,1,
+ 132,0,90,3,100,2,132,0,90,4,100,3,132,0,90,5,
+ 100,4,132,0,90,6,100,5,132,0,90,7,100,6,100,7,
+ 156,1,100,8,132,2,90,8,100,9,132,0,90,9,121,10,
+ 41,11,218,12,83,111,117,114,99,101,76,111,97,100,101,114,
+ 99,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
+ 0,3,0,0,0,243,14,0,0,0,151,0,116,0,0,0,
+ 0,0,0,0,0,0,130,1,41,1,122,165,79,112,116,105,
+ 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116,
+ 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100,
+ 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40,
+ 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10,
+ 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101,
+ 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,
+ 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32,
+ 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101,
+ 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32,
+ 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32,
+ 32,41,1,114,87,0,0,0,169,2,114,190,0,0,0,114,
+ 68,0,0,0,115,2,0,0,0,32,32,114,10,0,0,0,
+ 218,10,112,97,116,104,95,109,116,105,109,101,122,23,83,111,
+ 117,114,99,101,76,111,97,100,101,114,46,112,97,116,104,95,
+ 109,116,105,109,101,241,3,0,0,115,9,0,0,0,128,0,
+ 244,12,0,15,22,136,13,114,28,0,0,0,99,2,0,0,
+ 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
+ 0,243,40,0,0,0,151,0,100,1,124,0,106,1,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,1,171,1,0,0,0,0,0,0,105,1,83,0,41,2,
+ 97,158,1,0,0,79,112,116,105,111,110,97,108,32,109,101,
+ 116,104,111,100,32,114,101,116,117,114,110,105,110,103,32,97,
+ 32,109,101,116,97,100,97,116,97,32,100,105,99,116,32,102,
+ 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,
+ 10,32,32,32,32,32,32,32,32,112,97,116,104,32,40,97,
+ 32,115,116,114,41,46,10,10,32,32,32,32,32,32,32,32,
+ 80,111,115,115,105,98,108,101,32,107,101,121,115,58,10,32,
+ 32,32,32,32,32,32,32,45,32,39,109,116,105,109,101,39,
+ 32,40,109,97,110,100,97,116,111,114,121,41,32,105,115,32,
+ 116,104,101,32,110,117,109,101,114,105,99,32,116,105,109,101,
+ 115,116,97,109,112,32,111,102,32,108,97,115,116,32,115,111,
+ 117,114,99,101,10,32,32,32,32,32,32,32,32,32,32,99,
+ 111,100,101,32,109,111,100,105,102,105,99,97,116,105,111,110,
+ 59,10,32,32,32,32,32,32,32,32,45,32,39,115,105,122,
+ 101,39,32,40,111,112,116,105,111,110,97,108,41,32,105,115,
+ 32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,
+ 101,115,32,111,102,32,116,104,101,32,115,111,117,114,99,101,
+ 32,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32,
+ 73,109,112,108,101,109,101,110,116,105,110,103,32,116,104,105,
+ 115,32,109,101,116,104,111,100,32,97,108,108,111,119,115,32,
+ 116,104,101,32,108,111,97,100,101,114,32,116,111,32,114,101,
+ 97,100,32,98,121,116,101,99,111,100,101,32,102,105,108,101,
+ 115,46,10,32,32,32,32,32,32,32,32,82,97,105,115,101,
115,32,79,83,69,114,114,111,114,32,119,104,101,110,32,116,
104,101,32,112,97,116,104,32,99,97,110,110,111,116,32,98,
101,32,104,97,110,100,108,101,100,46,10,32,32,32,32,32,
- 32,32,32,41,1,114,87,0,0,0,169,2,114,189,0,0,
- 0,114,68,0,0,0,115,2,0,0,0,32,32,114,10,0,
- 0,0,218,10,112,97,116,104,95,109,116,105,109,101,122,23,
- 83,111,117,114,99,101,76,111,97,100,101,114,46,112,97,116,
- 104,95,109,116,105,109,101,237,3,0,0,115,9,0,0,0,
- 128,0,244,12,0,15,22,136,13,114,28,0,0,0,99,2,
- 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,
- 0,0,0,243,40,0,0,0,151,0,100,1,124,0,106,1,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,1,171,1,0,0,0,0,0,0,105,1,83,0,
- 41,2,97,158,1,0,0,79,112,116,105,111,110,97,108,32,
- 109,101,116,104,111,100,32,114,101,116,117,114,110,105,110,103,
- 32,97,32,109,101,116,97,100,97,116,97,32,100,105,99,116,
- 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,
- 101,100,10,32,32,32,32,32,32,32,32,112,97,116,104,32,
- 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,
- 32,32,80,111,115,115,105,98,108,101,32,107,101,121,115,58,
- 10,32,32,32,32,32,32,32,32,45,32,39,109,116,105,109,
- 101,39,32,40,109,97,110,100,97,116,111,114,121,41,32,105,
- 115,32,116,104,101,32,110,117,109,101,114,105,99,32,116,105,
- 109,101,115,116,97,109,112,32,111,102,32,108,97,115,116,32,
- 115,111,117,114,99,101,10,32,32,32,32,32,32,32,32,32,
- 32,99,111,100,101,32,109,111,100,105,102,105,99,97,116,105,
- 111,110,59,10,32,32,32,32,32,32,32,32,45,32,39,115,
- 105,122,101,39,32,40,111,112,116,105,111,110,97,108,41,32,
- 105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,
- 121,116,101,115,32,111,102,32,116,104,101,32,115,111,117,114,
- 99,101,32,99,111,100,101,46,10,10,32,32,32,32,32,32,
- 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116,
- 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119,
- 115,32,116,104,101,32,108,111,97,100,101,114,32,116,111,32,
- 114,101,97,100,32,98,121,116,101,99,111,100,101,32,102,105,
- 108,101,115,46,10,32,32,32,32,32,32,32,32,82,97,105,
- 115,101,115,32,79,83,69,114,114,111,114,32,119,104,101,110,
- 32,116,104,101,32,112,97,116,104,32,99,97,110,110,111,116,
- 32,98,101,32,104,97,110,100,108,101,100,46,10,32,32,32,
- 32,32,32,32,32,114,242,0,0,0,41,1,114,89,1,0,
- 0,114,88,1,0,0,115,2,0,0,0,32,32,114,10,0,
- 0,0,218,10,112,97,116,104,95,115,116,97,116,115,122,23,
- 83,111,117,114,99,101,76,111,97,100,101,114,46,112,97,116,
- 104,95,115,116,97,116,115,245,3,0,0,115,24,0,0,0,
- 128,0,240,24,0,17,24,152,20,159,31,153,31,168,20,211,
- 25,46,208,15,47,208,8,47,114,28,0,0,0,99,4,0,
- 0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,
- 0,0,243,38,0,0,0,151,0,124,0,106,1,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
- 2,124,3,171,2,0,0,0,0,0,0,83,0,41,1,122,
- 228,79,112,116,105,111,110,97,108,32,109,101,116,104,111,100,
- 32,119,104,105,99,104,32,119,114,105,116,101,115,32,100,97,
- 116,97,32,40,98,121,116,101,115,41,32,116,111,32,97,32,
- 102,105,108,101,32,112,97,116,104,32,40,97,32,115,116,114,
- 41,46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,
- 101,109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,
- 116,104,111,100,32,97,108,108,111,119,115,32,102,111,114,32,
- 116,104,101,32,119,114,105,116,105,110,103,32,111,102,32,98,
- 121,116,101,99,111,100,101,32,102,105,108,101,115,46,10,10,
- 32,32,32,32,32,32,32,32,84,104,101,32,115,111,117,114,
- 99,101,32,112,97,116,104,32,105,115,32,110,101,101,100,101,
- 100,32,105,110,32,111,114,100,101,114,32,116,111,32,99,111,
- 114,114,101,99,116,108,121,32,116,114,97,110,115,102,101,114,
- 32,112,101,114,109,105,115,115,105,111,110,115,10,32,32,32,
- 32,32,32,32,32,41,1,218,8,115,101,116,95,100,97,116,
- 97,41,4,114,189,0,0,0,114,176,0,0,0,218,10,99,
- 97,99,104,101,95,112,97,116,104,114,48,0,0,0,115,4,
- 0,0,0,32,32,32,32,114,10,0,0,0,218,15,95,99,
- 97,99,104,101,95,98,121,116,101,99,111,100,101,122,28,83,
- 111,117,114,99,101,76,111,97,100,101,114,46,95,99,97,99,
- 104,101,95,98,121,116,101,99,111,100,101,3,4,0,0,115,
- 21,0,0,0,128,0,240,16,0,16,20,143,125,137,125,152,
- 90,168,20,211,15,46,208,8,46,114,28,0,0,0,99,3,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
- 0,0,0,243,4,0,0,0,151,0,121,1,41,2,122,150,
- 79,112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,
- 119,104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,
- 97,32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,
- 105,108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,
- 46,10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,
- 109,101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,
- 104,111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,
- 104,101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,
- 116,101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,
- 32,32,32,32,32,32,78,114,30,0,0,0,41,3,114,189,
- 0,0,0,114,68,0,0,0,114,48,0,0,0,115,3,0,
- 0,0,32,32,32,114,10,0,0,0,114,93,1,0,0,122,
- 21,83,111,117,114,99,101,76,111,97,100,101,114,46,115,101,
- 116,95,100,97,116,97,13,4,0,0,114,74,1,0,0,114,
- 28,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,
- 0,5,0,0,0,3,0,0,0,243,156,0,0,0,151,0,
- 124,0,106,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
- 125,2,9,0,124,0,106,3,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,2,171,1,0,0,
- 0,0,0,0,125,3,116,9,0,0,0,0,0,0,0,0,
- 124,3,171,1,0,0,0,0,0,0,83,0,35,0,116,4,
- 0,0,0,0,0,0,0,0,36,0,114,19,125,4,116,7,
- 0,0,0,0,0,0,0,0,100,1,124,1,172,2,171,2,
- 0,0,0,0,0,0,124,4,130,2,100,3,125,4,126,4,
- 119,1,119,0,120,3,89,0,119,1,41,4,122,52,67,111,
- 110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,
- 97,116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,
- 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,
- 101,46,122,39,115,111,117,114,99,101,32,110,111,116,32,97,
- 118,97,105,108,97,98,108,101,32,116,104,114,111,117,103,104,
- 32,103,101,116,95,100,97,116,97,40,41,114,186,0,0,0,
- 78,41,5,114,7,1,0,0,218,8,103,101,116,95,100,97,
- 116,97,114,87,0,0,0,114,188,0,0,0,114,2,1,0,
- 0,41,5,114,189,0,0,0,114,42,1,0,0,114,68,0,
- 0,0,114,254,0,0,0,114,31,1,0,0,115,5,0,0,
- 0,32,32,32,32,32,114,10,0,0,0,218,10,103,101,116,
- 95,115,111,117,114,99,101,122,23,83,111,117,114,99,101,76,
- 111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,
- 20,4,0,0,115,90,0,0,0,128,0,224,15,19,215,15,
- 32,209,15,32,160,24,211,15,42,136,4,240,2,4,9,54,
- 216,27,31,159,61,153,61,168,20,211,27,46,136,76,244,8,
- 0,16,29,152,92,211,15,42,208,8,42,248,244,7,0,16,
- 23,242,0,2,9,54,220,18,29,208,30,71,216,35,43,244,
- 3,1,19,45,216,50,53,240,3,1,13,54,251,240,3,2,
- 9,54,250,115,20,0,0,0,147,17,47,0,175,9,65,11,
- 3,184,14,65,6,3,193,6,5,65,11,3,114,170,0,0,
- 0,41,1,218,9,95,111,112,116,105,109,105,122,101,99,3,
- 0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,3,
- 0,0,0,243,64,0,0,0,151,0,116,0,0,0,0,0,
- 0,0,0,0,106,3,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,116,4,0,0,0,0,0,0,
- 0,0,124,1,124,2,100,1,100,2,124,3,172,3,171,6,
- 0,0,0,0,0,0,83,0,41,4,122,130,82,101,116,117,
- 114,110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,
- 99,116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,
- 32,115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,
- 32,32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,
- 117,109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,
- 32,111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,
- 116,32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,
- 111,114,116,115,46,10,32,32,32,32,32,32,32,32,114,78,
- 1,0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,
- 101,114,105,116,114,135,0,0,0,41,3,114,207,0,0,0,
- 114,77,1,0,0,218,7,99,111,109,112,105,108,101,41,4,
- 114,189,0,0,0,114,48,0,0,0,114,68,0,0,0,114,
- 100,1,0,0,115,4,0,0,0,32,32,32,32,114,10,0,
- 0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,111,
- 100,101,122,27,83,111,117,114,99,101,76,111,97,100,101,114,
- 46,115,111,117,114,99,101,95,116,111,95,99,111,100,101,30,
- 4,0,0,115,43,0,0,0,128,0,244,10,0,16,26,215,
- 15,51,209,15,51,180,71,184,84,192,52,200,22,216,53,57,
- 192,73,240,3,0,16,52,243,0,1,16,79,1,240,0,1,
- 9,79,1,114,28,0,0,0,99,2,0,0,0,0,0,0,
- 0,0,0,0,0,7,0,0,0,3,0,0,0,243,72,4,
- 0,0,151,0,124,0,106,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
- 0,0,0,0,125,2,100,1,125,3,100,1,125,4,100,1,
- 125,5,100,2,125,6,100,3,125,7,9,0,116,3,0,0,
- 0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,0,
- 125,8,9,0,124,0,106,5,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,2,171,1,0,0,
- 0,0,0,0,125,9,116,7,0,0,0,0,0,0,0,0,
- 124,9,100,4,25,0,0,0,171,1,0,0,0,0,0,0,
- 125,3,9,0,124,0,106,9,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,8,171,1,0,0,
- 0,0,0,0,125,10,124,1,124,8,100,5,156,2,125,11,
- 9,0,116,11,0,0,0,0,0,0,0,0,124,10,124,1,
- 124,11,171,3,0,0,0,0,0,0,125,12,116,13,0,0,
- 0,0,0,0,0,0,124,10,171,1,0,0,0,0,0,0,
- 100,6,100,1,26,0,125,13,124,12,100,7,122,1,0,0,
- 100,8,107,55,0,0,125,6,124,6,114,106,124,12,100,9,
- 122,1,0,0,100,8,107,55,0,0,125,7,116,14,0,0,
- 0,0,0,0,0,0,106,16,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,100,10,107,55,0,0,
- 114,97,124,7,115,19,116,14,0,0,0,0,0,0,0,0,
- 106,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,100,11,107,40,0,0,114,76,124,0,106,9,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,2,171,1,0,0,0,0,0,0,125,4,116,15,
- 0,0,0,0,0,0,0,0,106,18,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,116,20,0,0,
- 0,0,0,0,0,0,124,4,171,2,0,0,0,0,0,0,
- 125,5,116,23,0,0,0,0,0,0,0,0,124,10,124,5,
- 124,1,124,11,171,4,0,0,0,0,0,0,1,0,110,18,
- 116,25,0,0,0,0,0,0,0,0,124,10,124,3,124,9,
- 100,12,25,0,0,0,124,1,124,11,171,5,0,0,0,0,
- 0,0,1,0,116,26,0,0,0,0,0,0,0,0,106,29,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,100,13,124,8,124,2,171,3,0,0,0,0,0,0,
- 1,0,116,31,0,0,0,0,0,0,0,0,124,13,124,1,
- 124,8,124,2,172,14,171,4,0,0,0,0,0,0,83,0,
- 35,0,116,32,0,0,0,0,0,0,0,0,116,34,0,0,
- 0,0,0,0,0,0,102,2,36,0,114,3,1,0,89,0,
- 110,51,119,0,120,3,89,0,119,1,35,0,116,36,0,0,
- 0,0,0,0,0,0,36,0,114,3,1,0,89,0,110,36,
+ 32,32,32,114,243,0,0,0,41,1,114,90,1,0,0,114,
+ 89,1,0,0,115,2,0,0,0,32,32,114,10,0,0,0,
+ 218,10,112,97,116,104,95,115,116,97,116,115,122,23,83,111,
+ 117,114,99,101,76,111,97,100,101,114,46,112,97,116,104,95,
+ 115,116,97,116,115,249,3,0,0,115,24,0,0,0,128,0,
+ 240,24,0,17,24,152,20,159,31,153,31,168,20,211,25,46,
+ 208,15,47,208,8,47,114,28,0,0,0,99,4,0,0,0,
+ 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,
+ 243,38,0,0,0,151,0,124,0,106,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,124,2,124,
+ 3,171,2,0,0,0,0,0,0,83,0,41,1,122,228,79,
+ 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,
+ 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,
+ 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,
+ 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,
+ 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,
+ 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,
+ 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,
+ 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,
+ 101,99,111,100,101,32,102,105,108,101,115,46,10,10,32,32,
+ 32,32,32,32,32,32,84,104,101,32,115,111,117,114,99,101,
+ 32,112,97,116,104,32,105,115,32,110,101,101,100,101,100,32,
+ 105,110,32,111,114,100,101,114,32,116,111,32,99,111,114,114,
+ 101,99,116,108,121,32,116,114,97,110,115,102,101,114,32,112,
+ 101,114,109,105,115,115,105,111,110,115,10,32,32,32,32,32,
+ 32,32,32,41,1,218,8,115,101,116,95,100,97,116,97,41,
+ 4,114,190,0,0,0,114,177,0,0,0,218,10,99,97,99,
+ 104,101,95,112,97,116,104,114,48,0,0,0,115,4,0,0,
+ 0,32,32,32,32,114,10,0,0,0,218,15,95,99,97,99,
+ 104,101,95,98,121,116,101,99,111,100,101,122,28,83,111,117,
+ 114,99,101,76,111,97,100,101,114,46,95,99,97,99,104,101,
+ 95,98,121,116,101,99,111,100,101,7,4,0,0,115,21,0,
+ 0,0,128,0,240,16,0,16,20,143,125,137,125,152,90,168,
+ 20,211,15,46,208,8,46,114,28,0,0,0,99,3,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+ 0,243,4,0,0,0,151,0,121,1,41,2,122,150,79,112,
+ 116,105,111,110,97,108,32,109,101,116,104,111,100,32,119,104,
+ 105,99,104,32,119,114,105,116,101,115,32,100,97,116,97,32,
+ 40,98,121,116,101,115,41,32,116,111,32,97,32,102,105,108,
+ 101,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10,
+ 10,32,32,32,32,32,32,32,32,73,109,112,108,101,109,101,
+ 110,116,105,110,103,32,116,104,105,115,32,109,101,116,104,111,
+ 100,32,97,108,108,111,119,115,32,102,111,114,32,116,104,101,
+ 32,119,114,105,116,105,110,103,32,111,102,32,98,121,116,101,
+ 99,111,100,101,32,102,105,108,101,115,46,10,32,32,32,32,
+ 32,32,32,32,78,114,30,0,0,0,41,3,114,190,0,0,
+ 0,114,68,0,0,0,114,48,0,0,0,115,3,0,0,0,
+ 32,32,32,114,10,0,0,0,114,94,1,0,0,122,21,83,
+ 111,117,114,99,101,76,111,97,100,101,114,46,115,101,116,95,
+ 100,97,116,97,17,4,0,0,114,75,1,0,0,114,28,0,
+ 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,5,
+ 0,0,0,3,0,0,0,243,156,0,0,0,151,0,124,0,
+ 106,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,124,1,171,1,0,0,0,0,0,0,125,2,
+ 9,0,124,0,106,3,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,
+ 0,0,125,3,116,9,0,0,0,0,0,0,0,0,124,3,
+ 171,1,0,0,0,0,0,0,83,0,35,0,116,4,0,0,
+ 0,0,0,0,0,0,36,0,114,19,125,4,116,7,0,0,
+ 0,0,0,0,0,0,100,1,124,1,172,2,171,2,0,0,
+ 0,0,0,0,124,4,130,2,100,3,125,4,126,4,119,1,
+ 119,0,120,3,89,0,119,1,41,4,122,52,67,111,110,99,
+ 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,
+ 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,
+ 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,46,
+ 122,39,115,111,117,114,99,101,32,110,111,116,32,97,118,97,
+ 105,108,97,98,108,101,32,116,104,114,111,117,103,104,32,103,
+ 101,116,95,100,97,116,97,40,41,114,187,0,0,0,78,41,
+ 5,114,8,1,0,0,218,8,103,101,116,95,100,97,116,97,
+ 114,87,0,0,0,114,189,0,0,0,114,3,1,0,0,41,
+ 5,114,190,0,0,0,114,43,1,0,0,114,68,0,0,0,
+ 114,255,0,0,0,114,32,1,0,0,115,5,0,0,0,32,
+ 32,32,32,32,114,10,0,0,0,218,10,103,101,116,95,115,
+ 111,117,114,99,101,122,23,83,111,117,114,99,101,76,111,97,
+ 100,101,114,46,103,101,116,95,115,111,117,114,99,101,24,4,
+ 0,0,115,90,0,0,0,128,0,224,15,19,215,15,32,209,
+ 15,32,160,24,211,15,42,136,4,240,2,4,9,54,216,27,
+ 31,159,61,153,61,168,20,211,27,46,136,76,244,8,0,16,
+ 29,152,92,211,15,42,208,8,42,248,244,7,0,16,23,242,
+ 0,2,9,54,220,18,29,208,30,71,216,35,43,244,3,1,
+ 19,45,216,50,53,240,3,1,13,54,251,240,3,2,9,54,
+ 250,115,20,0,0,0,147,17,47,0,175,9,65,11,3,184,
+ 14,65,6,3,193,6,5,65,11,3,114,171,0,0,0,41,
+ 1,218,9,95,111,112,116,105,109,105,122,101,99,3,0,0,
+ 0,0,0,0,0,1,0,0,0,8,0,0,0,3,0,0,
+ 0,243,64,0,0,0,151,0,116,0,0,0,0,0,0,0,
+ 0,0,106,3,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,116,4,0,0,0,0,0,0,0,0,
+ 124,1,124,2,100,1,100,2,124,3,172,3,171,6,0,0,
+ 0,0,0,0,83,0,41,4,122,130,82,101,116,117,114,110,
+ 32,116,104,101,32,99,111,100,101,32,111,98,106,101,99,116,
+ 32,99,111,109,112,105,108,101,100,32,102,114,111,109,32,115,
+ 111,117,114,99,101,46,10,10,32,32,32,32,32,32,32,32,
+ 84,104,101,32,39,100,97,116,97,39,32,97,114,103,117,109,
+ 101,110,116,32,99,97,110,32,98,101,32,97,110,121,32,111,
+ 98,106,101,99,116,32,116,121,112,101,32,116,104,97,116,32,
+ 99,111,109,112,105,108,101,40,41,32,115,117,112,112,111,114,
+ 116,115,46,10,32,32,32,32,32,32,32,32,114,79,1,0,
+ 0,84,41,2,218,12,100,111,110,116,95,105,110,104,101,114,
+ 105,116,114,136,0,0,0,41,3,114,208,0,0,0,114,78,
+ 1,0,0,218,7,99,111,109,112,105,108,101,41,4,114,190,
+ 0,0,0,114,48,0,0,0,114,68,0,0,0,114,101,1,
+ 0,0,115,4,0,0,0,32,32,32,32,114,10,0,0,0,
+ 218,14,115,111,117,114,99,101,95,116,111,95,99,111,100,101,
+ 122,27,83,111,117,114,99,101,76,111,97,100,101,114,46,115,
+ 111,117,114,99,101,95,116,111,95,99,111,100,101,34,4,0,
+ 0,115,43,0,0,0,128,0,244,10,0,16,26,215,15,51,
+ 209,15,51,180,71,184,84,192,52,200,22,216,53,57,192,73,
+ 240,3,0,16,52,243,0,1,16,79,1,240,0,1,9,79,
+ 1,114,28,0,0,0,99,2,0,0,0,0,0,0,0,0,
+ 0,0,0,7,0,0,0,3,0,0,0,243,72,4,0,0,
+ 151,0,124,0,106,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
+ 0,0,125,2,100,1,125,3,100,1,125,4,100,1,125,5,
+ 100,2,125,6,100,3,125,7,9,0,116,3,0,0,0,0,
+ 0,0,0,0,124,2,171,1,0,0,0,0,0,0,125,8,
+ 9,0,124,0,106,5,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,
+ 0,0,125,9,116,7,0,0,0,0,0,0,0,0,124,9,
+ 100,4,25,0,0,0,171,1,0,0,0,0,0,0,125,3,
+ 9,0,124,0,106,9,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,8,171,1,0,0,0,0,
+ 0,0,125,10,124,1,124,8,100,5,156,2,125,11,9,0,
+ 116,11,0,0,0,0,0,0,0,0,124,10,124,1,124,11,
+ 171,3,0,0,0,0,0,0,125,12,116,13,0,0,0,0,
+ 0,0,0,0,124,10,171,1,0,0,0,0,0,0,100,6,
+ 100,1,26,0,125,13,124,12,100,7,122,1,0,0,100,8,
+ 107,55,0,0,125,6,124,6,114,106,124,12,100,9,122,1,
+ 0,0,100,8,107,55,0,0,125,7,116,14,0,0,0,0,
+ 0,0,0,0,106,16,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,100,10,107,55,0,0,114,97,
+ 124,7,115,19,116,14,0,0,0,0,0,0,0,0,106,16,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,100,11,107,40,0,0,114,76,124,0,106,9,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,2,171,1,0,0,0,0,0,0,125,4,116,15,0,0,
+ 0,0,0,0,0,0,106,18,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,116,20,0,0,0,0,
+ 0,0,0,0,124,4,171,2,0,0,0,0,0,0,125,5,
+ 116,23,0,0,0,0,0,0,0,0,124,10,124,5,124,1,
+ 124,11,171,4,0,0,0,0,0,0,1,0,110,18,116,25,
+ 0,0,0,0,0,0,0,0,124,10,124,3,124,9,100,12,
+ 25,0,0,0,124,1,124,11,171,5,0,0,0,0,0,0,
+ 1,0,116,26,0,0,0,0,0,0,0,0,106,29,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 100,13,124,8,124,2,171,3,0,0,0,0,0,0,1,0,
+ 116,31,0,0,0,0,0,0,0,0,124,13,124,1,124,8,
+ 124,2,172,14,171,4,0,0,0,0,0,0,83,0,35,0,
+ 116,32,0,0,0,0,0,0,0,0,116,34,0,0,0,0,
+ 0,0,0,0,102,2,36,0,114,3,1,0,89,0,110,51,
119,0,120,3,89,0,119,1,35,0,116,36,0,0,0,0,
- 0,0,0,0,36,0,114,3,1,0,89,0,110,21,119,0,
- 120,3,89,0,119,1,35,0,116,38,0,0,0,0,0,0,
- 0,0,36,0,114,5,1,0,100,1,125,8,89,0,110,4,
- 119,0,120,3,89,0,119,1,124,4,128,17,124,0,106,9,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,2,171,1,0,0,0,0,0,0,125,4,124,0,
- 106,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,4,124,2,171,2,0,0,0,0,0,0,
- 125,14,116,26,0,0,0,0,0,0,0,0,106,29,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 100,15,124,2,171,2,0,0,0,0,0,0,1,0,116,42,
- 0,0,0,0,0,0,0,0,106,44,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,115,108,124,8,
- 129,106,124,3,129,104,124,6,114,42,124,5,128,26,116,15,
- 0,0,0,0,0,0,0,0,106,18,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,116,20,0,0,
- 0,0,0,0,0,0,124,4,171,2,0,0,0,0,0,0,
- 125,5,116,47,0,0,0,0,0,0,0,0,124,14,124,5,
- 124,7,171,3,0,0,0,0,0,0,125,10,110,22,116,49,
- 0,0,0,0,0,0,0,0,124,14,124,3,116,51,0,0,
- 0,0,0,0,0,0,124,4,171,1,0,0,0,0,0,0,
- 171,3,0,0,0,0,0,0,125,10,9,0,124,0,106,53,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,2,124,8,124,10,171,3,0,0,0,0,0,0,
- 1,0,124,14,83,0,35,0,116,38,0,0,0,0,0,0,
- 0,0,36,0,114,4,1,0,89,0,124,14,83,0,119,0,
- 120,3,89,0,119,1,124,14,83,0,41,16,122,190,67,111,
- 110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,
- 97,116,105,111,110,32,111,102,32,73,110,115,112,101,99,116,
- 76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,46,
- 10,10,32,32,32,32,32,32,32,32,82,101,97,100,105,110,
- 103,32,111,102,32,98,121,116,101,99,111,100,101,32,114,101,
- 113,117,105,114,101,115,32,112,97,116,104,95,115,116,97,116,
- 115,32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,
- 116,101,100,46,32,84,111,32,119,114,105,116,101,10,32,32,
- 32,32,32,32,32,32,98,121,116,101,99,111,100,101,44,32,
- 115,101,116,95,100,97,116,97,32,109,117,115,116,32,97,108,
- 115,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,
- 100,46,10,10,32,32,32,32,32,32,32,32,78,70,84,114,
- 242,0,0,0,114,229,0,0,0,114,211,0,0,0,114,6,
- 0,0,0,114,1,0,0,0,114,52,0,0,0,218,5,110,
- 101,118,101,114,218,6,97,108,119,97,121,115,218,4,115,105,
- 122,101,122,13,123,125,32,109,97,116,99,104,101,115,32,123,
- 125,41,3,114,187,0,0,0,114,173,0,0,0,114,176,0,
- 0,0,122,19,99,111,100,101,32,111,98,106,101,99,116,32,
- 102,114,111,109,32,123,125,41,27,114,7,1,0,0,114,152,
- 0,0,0,114,91,1,0,0,114,40,0,0,0,114,98,1,
- 0,0,114,219,0,0,0,218,10,109,101,109,111,114,121,118,
- 105,101,119,114,234,0,0,0,218,21,99,104,101,99,107,95,
- 104,97,115,104,95,98,97,115,101,100,95,112,121,99,115,114,
- 226,0,0,0,218,17,95,82,65,87,95,77,65,71,73,67,
- 95,78,85,77,66,69,82,114,227,0,0,0,114,224,0,0,
- 0,114,207,0,0,0,114,215,0,0,0,114,237,0,0,0,
- 114,188,0,0,0,114,216,0,0,0,114,87,0,0,0,114,
- 134,0,0,0,114,104,1,0,0,114,20,0,0,0,218,19,
- 100,111,110,116,95,119,114,105,116,101,95,98,121,116,101,99,
- 111,100,101,114,246,0,0,0,114,243,0,0,0,114,7,0,
- 0,0,114,95,1,0,0,41,15,114,189,0,0,0,114,42,
- 1,0,0,114,176,0,0,0,114,222,0,0,0,114,254,0,
- 0,0,114,226,0,0,0,218,10,104,97,115,104,95,98,97,
- 115,101,100,218,12,99,104,101,99,107,95,115,111,117,114,99,
- 101,114,173,0,0,0,218,2,115,116,114,48,0,0,0,114,
- 217,0,0,0,114,21,0,0,0,218,10,98,121,116,101,115,
- 95,100,97,116,97,218,11,99,111,100,101,95,111,98,106,101,
- 99,116,115,15,0,0,0,32,32,32,32,32,32,32,32,32,
- 32,32,32,32,32,32,114,10,0,0,0,114,76,1,0,0,
- 122,21,83,111,117,114,99,101,76,111,97,100,101,114,46,103,
- 101,116,95,99,111,100,101,38,4,0,0,115,147,2,0,0,
- 128,0,240,14,0,23,27,215,22,39,209,22,39,168,8,211,
- 22,49,136,11,216,23,27,136,12,216,23,27,136,12,216,22,
- 26,136,11,216,21,26,136,10,216,23,27,136,12,240,2,51,
- 9,74,1,220,28,45,168,107,211,28,58,136,77,240,8,46,
- 13,74,1,216,21,25,151,95,145,95,160,91,211,21,49,144,
- 2,244,8,0,32,35,160,50,160,103,161,59,211,31,47,144,
- 12,240,2,40,17,74,1,216,27,31,159,61,153,61,168,29,
- 211,27,55,144,68,240,10,0,33,41,216,32,45,241,5,3,
- 35,22,144,75,240,8,31,21,74,1,220,32,45,168,100,176,
- 72,184,107,211,32,74,152,5,220,37,47,176,4,211,37,53,
- 176,98,176,99,208,37,58,152,10,216,37,42,168,83,161,91,
- 176,65,209,37,53,152,10,217,27,37,216,43,48,176,52,169,
- 60,184,49,209,43,60,152,76,220,32,36,215,32,58,209,32,
- 58,184,103,210,32,69,217,33,45,220,33,37,215,33,59,209,
- 33,59,184,120,210,33,71,216,47,51,175,125,169,125,184,91,
- 211,47,73,160,12,220,46,50,215,46,62,209,46,62,220,36,
- 53,216,36,48,243,5,3,47,34,160,11,244,8,0,33,51,
- 176,52,184,27,192,104,216,51,62,245,3,1,33,64,1,244,
- 6,0,29,52,216,32,36,216,32,44,216,32,34,160,54,161,
- 10,216,32,40,216,32,43,244,11,6,29,30,244,20,0,25,
- 35,215,24,51,209,24,51,176,79,192,93,216,52,63,244,3,
- 1,25,65,1,228,31,48,176,26,192,40,216,63,76,216,61,
- 72,244,5,2,32,74,1,240,0,2,25,74,1,248,244,11,
- 0,29,40,172,24,208,27,50,242,0,1,21,29,217,24,28,
- 240,3,1,21,29,251,244,63,0,24,31,242,0,1,17,25,
- 217,20,24,240,3,1,17,25,251,244,13,0,20,27,242,0,
- 1,13,21,217,16,20,240,3,1,13,21,251,244,11,0,16,
- 35,242,0,1,9,33,216,28,32,138,77,240,3,1,9,33,
- 250,240,100,1,0,12,24,208,11,31,216,27,31,159,61,153,
- 61,168,27,211,27,53,136,76,216,22,26,215,22,41,209,22,
- 41,168,44,184,11,211,22,68,136,11,220,8,18,215,8,35,
- 209,8,35,208,36,57,184,59,212,8,71,220,16,19,215,16,
- 39,210,16,39,168,77,208,44,69,216,16,28,208,16,40,217,
- 15,25,216,19,30,208,19,38,220,34,38,215,34,50,209,34,
- 50,212,51,68,216,51,63,243,3,1,35,65,1,144,75,228,
- 23,40,168,27,176,107,192,60,211,23,80,145,4,228,23,45,
- 168,107,184,60,220,46,49,176,44,211,46,63,243,3,1,24,
- 65,1,144,4,240,4,3,13,21,216,16,20,215,16,36,209,
- 16,36,160,91,176,45,192,20,212,16,70,240,6,0,16,27,
- 208,8,26,248,244,5,0,20,39,242,0,1,13,21,216,16,
- 20,216,15,26,208,8,26,240,5,1,13,21,250,224,15,26,
- 208,8,26,115,89,0,0,0,157,11,69,26,0,169,17,69,
- 11,0,193,9,17,68,60,0,193,32,66,33,68,39,0,196,
- 39,15,68,57,3,196,56,1,68,57,3,196,60,9,69,8,
- 3,197,7,1,69,8,3,197,11,9,69,23,3,197,22,1,
- 69,23,3,197,26,11,69,40,3,197,39,1,69,40,3,199,
- 61,19,72,18,0,200,18,9,72,31,3,200,30,1,72,31,
- 3,78,41,10,114,196,0,0,0,114,195,0,0,0,114,197,
- 0,0,0,114,89,1,0,0,114,91,1,0,0,114,95,1,
- 0,0,114,93,1,0,0,114,99,1,0,0,114,104,1,0,
- 0,114,76,1,0,0,114,30,0,0,0,114,28,0,0,0,
- 114,10,0,0,0,114,86,1,0,0,114,86,1,0,0,235,
- 3,0,0,115,44,0,0,0,132,0,242,4,6,5,22,242,
- 16,12,5,48,242,28,8,5,47,242,20,4,5,12,242,14,
- 8,5,43,240,20,0,55,57,244,0,6,5,79,1,243,16,
- 83,1,5,27,114,28,0,0,0,114,86,1,0,0,99,0,
- 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,
- 0,0,0,243,100,0,0,0,135,0,151,0,101,0,90,1,
- 100,0,90,2,100,1,90,3,100,2,132,0,90,4,100,3,
- 132,0,90,5,100,4,132,0,90,6,101,7,136,0,102,1,
- 100,5,132,8,171,0,0,0,0,0,0,0,90,8,101,7,
- 100,6,132,0,171,0,0,0,0,0,0,0,90,9,100,7,
- 132,0,90,10,101,7,100,8,132,0,171,0,0,0,0,0,
- 0,0,90,11,136,0,120,1,90,12,83,0,41,9,218,10,
- 70,105,108,101,76,111,97,100,101,114,122,103,66,97,115,101,
- 32,102,105,108,101,32,108,111,97,100,101,114,32,99,108,97,
- 115,115,32,119,104,105,99,104,32,105,109,112,108,101,109,101,
- 110,116,115,32,116,104,101,32,108,111,97,100,101,114,32,112,
- 114,111,116,111,99,111,108,32,109,101,116,104,111,100,115,32,
- 116,104,97,116,10,32,32,32,32,114,101,113,117,105,114,101,
- 32,102,105,108,101,32,115,121,115,116,101,109,32,117,115,97,
- 103,101,46,99,3,0,0,0,0,0,0,0,0,0,0,0,
- 2,0,0,0,3,0,0,0,243,32,0,0,0,151,0,124,
- 1,124,0,95,0,0,0,0,0,0,0,0,0,124,2,124,
- 0,95,1,0,0,0,0,0,0,0,0,121,1,41,2,122,
- 75,67,97,99,104,101,32,116,104,101,32,109,111,100,117,108,
- 101,32,110,97,109,101,32,97,110,100,32,116,104,101,32,112,
- 97,116,104,32,116,111,32,116,104,101,32,102,105,108,101,32,
- 102,111,117,110,100,32,98,121,32,116,104,101,10,32,32,32,
- 32,32,32,32,32,102,105,110,100,101,114,46,78,114,229,0,
- 0,0,41,3,114,189,0,0,0,114,42,1,0,0,114,68,
- 0,0,0,115,3,0,0,0,32,32,32,114,10,0,0,0,
- 114,67,1,0,0,122,19,70,105,108,101,76,111,97,100,101,
- 114,46,95,95,105,110,105,116,95,95,129,4,0,0,115,18,
- 0,0,0,128,0,240,6,0,21,29,136,4,140,9,216,20,
- 24,136,4,141,9,114,28,0,0,0,99,2,0,0,0,0,
- 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,243,
- 106,0,0,0,151,0,124,0,106,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,1,106,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,107,40,0,0,120,1,114,25,1,0,124,0,106,2,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,1,106,2,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,107,40,0,0,83,0,114,77,
- 0,0,0,169,2,218,9,95,95,99,108,97,115,115,95,95,
- 114,202,0,0,0,169,2,114,189,0,0,0,218,5,111,116,
- 104,101,114,115,2,0,0,0,32,32,114,10,0,0,0,218,
- 6,95,95,101,113,95,95,122,17,70,105,108,101,76,111,97,
- 100,101,114,46,95,95,101,113,95,95,135,4,0,0,243,44,
- 0,0,0,128,0,216,16,20,151,14,145,14,160,37,167,47,
- 161,47,209,16,49,242,0,1,17,48,216,16,20,151,13,145,
- 13,160,21,167,30,161,30,209,16,47,240,3,1,9,49,114,
- 28,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
- 0,4,0,0,0,3,0,0,0,243,88,0,0,0,151,0,
- 116,1,0,0,0,0,0,0,0,0,124,0,106,2,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 171,1,0,0,0,0,0,0,116,1,0,0,0,0,0,0,
- 0,0,124,0,106,4,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,171,1,0,0,0,0,0,0,
- 122,12,0,0,83,0,114,77,0,0,0,169,3,218,4,104,
- 97,115,104,114,187,0,0,0,114,68,0,0,0,169,1,114,
- 189,0,0,0,115,1,0,0,0,32,114,10,0,0,0,218,
- 8,95,95,104,97,115,104,95,95,122,19,70,105,108,101,76,
- 111,97,100,101,114,46,95,95,104,97,115,104,95,95,139,4,
- 0,0,243,29,0,0,0,128,0,220,15,19,144,68,151,73,
- 145,73,139,127,164,20,160,100,167,105,161,105,163,31,209,15,
- 48,208,8,48,114,28,0,0,0,99,2,0,0,0,0,0,
- 0,0,0,0,0,0,3,0,0,0,3,0,0,0,243,42,
- 0,0,0,149,1,151,0,116,0,0,0,0,0,0,0,0,
- 0,116,2,0,0,0,0,0,0,0,0,124,0,141,11,0,
- 0,124,1,171,1,0,0,0,0,0,0,83,0,41,1,122,
- 100,76,111,97,100,32,97,32,109,111,100,117,108,101,32,102,
- 114,111,109,32,97,32,102,105,108,101,46,10,10,32,32,32,
- 32,32,32,32,32,84,104,105,115,32,109,101,116,104,111,100,
- 32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,
- 32,85,115,101,32,101,120,101,99,95,109,111,100,117,108,101,
- 40,41,32,105,110,115,116,101,97,100,46,10,10,32,32,32,
- 32,32,32,32,32,41,3,218,5,115,117,112,101,114,114,119,
- 1,0,0,114,84,1,0,0,41,3,114,189,0,0,0,114,
- 42,1,0,0,114,123,1,0,0,115,3,0,0,0,32,32,
- 128,114,10,0,0,0,114,84,1,0,0,122,22,70,105,108,
- 101,76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,
- 117,108,101,142,4,0,0,115,23,0,0,0,248,128,0,244,
- 20,0,16,21,148,90,160,20,209,15,50,176,56,211,15,60,
- 208,8,60,114,28,0,0,0,99,2,0,0,0,0,0,0,
- 0,0,0,0,0,1,0,0,0,3,0,0,0,243,26,0,
+ 0,0,0,0,36,0,114,3,1,0,89,0,110,36,119,0,
+ 120,3,89,0,119,1,35,0,116,36,0,0,0,0,0,0,
+ 0,0,36,0,114,3,1,0,89,0,110,21,119,0,120,3,
+ 89,0,119,1,35,0,116,38,0,0,0,0,0,0,0,0,
+ 36,0,114,5,1,0,100,1,125,8,89,0,110,4,119,0,
+ 120,3,89,0,119,1,124,4,128,17,124,0,106,9,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,2,171,1,0,0,0,0,0,0,125,4,124,0,106,41,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,4,124,2,171,2,0,0,0,0,0,0,125,14,
+ 116,26,0,0,0,0,0,0,0,0,106,29,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,15,
+ 124,2,171,2,0,0,0,0,0,0,1,0,116,42,0,0,
+ 0,0,0,0,0,0,106,44,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,115,108,124,8,129,106,
+ 124,3,129,104,124,6,114,42,124,5,128,26,116,15,0,0,
+ 0,0,0,0,0,0,106,18,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,116,20,0,0,0,0,
+ 0,0,0,0,124,4,171,2,0,0,0,0,0,0,125,5,
+ 116,47,0,0,0,0,0,0,0,0,124,14,124,5,124,7,
+ 171,3,0,0,0,0,0,0,125,10,110,22,116,49,0,0,
+ 0,0,0,0,0,0,124,14,124,3,116,51,0,0,0,0,
+ 0,0,0,0,124,4,171,1,0,0,0,0,0,0,171,3,
+ 0,0,0,0,0,0,125,10,9,0,124,0,106,53,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,2,124,8,124,10,171,3,0,0,0,0,0,0,1,0,
+ 124,14,83,0,35,0,116,38,0,0,0,0,0,0,0,0,
+ 36,0,114,4,1,0,89,0,124,14,83,0,119,0,120,3,
+ 89,0,119,1,124,14,83,0,41,16,122,190,67,111,110,99,
+ 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,
+ 105,111,110,32,111,102,32,73,110,115,112,101,99,116,76,111,
+ 97,100,101,114,46,103,101,116,95,99,111,100,101,46,10,10,
+ 32,32,32,32,32,32,32,32,82,101,97,100,105,110,103,32,
+ 111,102,32,98,121,116,101,99,111,100,101,32,114,101,113,117,
+ 105,114,101,115,32,112,97,116,104,95,115,116,97,116,115,32,
+ 116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,
+ 100,46,32,84,111,32,119,114,105,116,101,10,32,32,32,32,
+ 32,32,32,32,98,121,116,101,99,111,100,101,44,32,115,101,
+ 116,95,100,97,116,97,32,109,117,115,116,32,97,108,115,111,
+ 32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,46,
+ 10,10,32,32,32,32,32,32,32,32,78,70,84,114,243,0,
+ 0,0,114,230,0,0,0,114,212,0,0,0,114,6,0,0,
+ 0,114,1,0,0,0,114,52,0,0,0,218,5,110,101,118,
+ 101,114,218,6,97,108,119,97,121,115,218,4,115,105,122,101,
+ 122,13,123,125,32,109,97,116,99,104,101,115,32,123,125,41,
+ 3,114,188,0,0,0,114,174,0,0,0,114,177,0,0,0,
+ 122,19,99,111,100,101,32,111,98,106,101,99,116,32,102,114,
+ 111,109,32,123,125,41,27,114,8,1,0,0,114,153,0,0,
+ 0,114,92,1,0,0,114,40,0,0,0,114,99,1,0,0,
+ 114,220,0,0,0,218,10,109,101,109,111,114,121,118,105,101,
+ 119,114,235,0,0,0,218,21,99,104,101,99,107,95,104,97,
+ 115,104,95,98,97,115,101,100,95,112,121,99,115,114,227,0,
+ 0,0,218,17,95,82,65,87,95,77,65,71,73,67,95,78,
+ 85,77,66,69,82,114,228,0,0,0,114,225,0,0,0,114,
+ 208,0,0,0,114,216,0,0,0,114,238,0,0,0,114,189,
+ 0,0,0,114,217,0,0,0,114,87,0,0,0,114,135,0,
+ 0,0,114,105,1,0,0,114,20,0,0,0,218,19,100,111,
+ 110,116,95,119,114,105,116,101,95,98,121,116,101,99,111,100,
+ 101,114,247,0,0,0,114,244,0,0,0,114,7,0,0,0,
+ 114,96,1,0,0,41,15,114,190,0,0,0,114,43,1,0,
+ 0,114,177,0,0,0,114,223,0,0,0,114,255,0,0,0,
+ 114,227,0,0,0,218,10,104,97,115,104,95,98,97,115,101,
+ 100,218,12,99,104,101,99,107,95,115,111,117,114,99,101,114,
+ 174,0,0,0,218,2,115,116,114,48,0,0,0,114,218,0,
+ 0,0,114,21,0,0,0,218,10,98,121,116,101,115,95,100,
+ 97,116,97,218,11,99,111,100,101,95,111,98,106,101,99,116,
+ 115,15,0,0,0,32,32,32,32,32,32,32,32,32,32,32,
+ 32,32,32,32,114,10,0,0,0,114,77,1,0,0,122,21,
+ 83,111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,
+ 95,99,111,100,101,42,4,0,0,115,147,2,0,0,128,0,
+ 240,14,0,23,27,215,22,39,209,22,39,168,8,211,22,49,
+ 136,11,216,23,27,136,12,216,23,27,136,12,216,22,26,136,
+ 11,216,21,26,136,10,216,23,27,136,12,240,2,51,9,74,
+ 1,220,28,45,168,107,211,28,58,136,77,240,8,46,13,74,
+ 1,216,21,25,151,95,145,95,160,91,211,21,49,144,2,244,
+ 8,0,32,35,160,50,160,103,161,59,211,31,47,144,12,240,
+ 2,40,17,74,1,216,27,31,159,61,153,61,168,29,211,27,
+ 55,144,68,240,10,0,33,41,216,32,45,241,5,3,35,22,
+ 144,75,240,8,31,21,74,1,220,32,45,168,100,176,72,184,
+ 107,211,32,74,152,5,220,37,47,176,4,211,37,53,176,98,
+ 176,99,208,37,58,152,10,216,37,42,168,83,161,91,176,65,
+ 209,37,53,152,10,217,27,37,216,43,48,176,52,169,60,184,
+ 49,209,43,60,152,76,220,32,36,215,32,58,209,32,58,184,
+ 103,210,32,69,217,33,45,220,33,37,215,33,59,209,33,59,
+ 184,120,210,33,71,216,47,51,175,125,169,125,184,91,211,47,
+ 73,160,12,220,46,50,215,46,62,209,46,62,220,36,53,216,
+ 36,48,243,5,3,47,34,160,11,244,8,0,33,51,176,52,
+ 184,27,192,104,216,51,62,245,3,1,33,64,1,244,6,0,
+ 29,52,216,32,36,216,32,44,216,32,34,160,54,161,10,216,
+ 32,40,216,32,43,244,11,6,29,30,244,20,0,25,35,215,
+ 24,51,209,24,51,176,79,192,93,216,52,63,244,3,1,25,
+ 65,1,228,31,48,176,26,192,40,216,63,76,216,61,72,244,
+ 5,2,32,74,1,240,0,2,25,74,1,248,244,11,0,29,
+ 40,172,24,208,27,50,242,0,1,21,29,217,24,28,240,3,
+ 1,21,29,251,244,63,0,24,31,242,0,1,17,25,217,20,
+ 24,240,3,1,17,25,251,244,13,0,20,27,242,0,1,13,
+ 21,217,16,20,240,3,1,13,21,251,244,11,0,16,35,242,
+ 0,1,9,33,216,28,32,138,77,240,3,1,9,33,250,240,
+ 100,1,0,12,24,208,11,31,216,27,31,159,61,153,61,168,
+ 27,211,27,53,136,76,216,22,26,215,22,41,209,22,41,168,
+ 44,184,11,211,22,68,136,11,220,8,18,215,8,35,209,8,
+ 35,208,36,57,184,59,212,8,71,220,16,19,215,16,39,210,
+ 16,39,168,77,208,44,69,216,16,28,208,16,40,217,15,25,
+ 216,19,30,208,19,38,220,34,38,215,34,50,209,34,50,212,
+ 51,68,216,51,63,243,3,1,35,65,1,144,75,228,23,40,
+ 168,27,176,107,192,60,211,23,80,145,4,228,23,45,168,107,
+ 184,60,220,46,49,176,44,211,46,63,243,3,1,24,65,1,
+ 144,4,240,4,3,13,21,216,16,20,215,16,36,209,16,36,
+ 160,91,176,45,192,20,212,16,70,240,6,0,16,27,208,8,
+ 26,248,244,5,0,20,39,242,0,1,13,21,216,16,20,216,
+ 15,26,208,8,26,240,5,1,13,21,250,224,15,26,208,8,
+ 26,115,89,0,0,0,157,11,69,26,0,169,17,69,11,0,
+ 193,9,17,68,60,0,193,32,66,33,68,39,0,196,39,15,
+ 68,57,3,196,56,1,68,57,3,196,60,9,69,8,3,197,
+ 7,1,69,8,3,197,11,9,69,23,3,197,22,1,69,23,
+ 3,197,26,11,69,40,3,197,39,1,69,40,3,199,61,19,
+ 72,18,0,200,18,9,72,31,3,200,30,1,72,31,3,78,
+ 41,10,114,197,0,0,0,114,196,0,0,0,114,198,0,0,
+ 0,114,90,1,0,0,114,92,1,0,0,114,96,1,0,0,
+ 114,94,1,0,0,114,100,1,0,0,114,105,1,0,0,114,
+ 77,1,0,0,114,30,0,0,0,114,28,0,0,0,114,10,
+ 0,0,0,114,87,1,0,0,114,87,1,0,0,239,3,0,
+ 0,115,44,0,0,0,132,0,242,4,6,5,22,242,16,12,
+ 5,48,242,28,8,5,47,242,20,4,5,12,242,14,8,5,
+ 43,240,20,0,55,57,244,0,6,5,79,1,243,16,83,1,
+ 5,27,114,28,0,0,0,114,87,1,0,0,99,0,0,0,
+ 0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,
+ 0,243,100,0,0,0,135,0,151,0,101,0,90,1,100,0,
+ 90,2,100,1,90,3,100,2,132,0,90,4,100,3,132,0,
+ 90,5,100,4,132,0,90,6,101,7,136,0,102,1,100,5,
+ 132,8,171,0,0,0,0,0,0,0,90,8,101,7,100,6,
+ 132,0,171,0,0,0,0,0,0,0,90,9,100,7,132,0,
+ 90,10,101,7,100,8,132,0,171,0,0,0,0,0,0,0,
+ 90,11,136,0,120,1,90,12,83,0,41,9,218,10,70,105,
+ 108,101,76,111,97,100,101,114,122,103,66,97,115,101,32,102,
+ 105,108,101,32,108,111,97,100,101,114,32,99,108,97,115,115,
+ 32,119,104,105,99,104,32,105,109,112,108,101,109,101,110,116,
+ 115,32,116,104,101,32,108,111,97,100,101,114,32,112,114,111,
+ 116,111,99,111,108,32,109,101,116,104,111,100,115,32,116,104,
+ 97,116,10,32,32,32,32,114,101,113,117,105,114,101,32,102,
+ 105,108,101,32,115,121,115,116,101,109,32,117,115,97,103,101,
+ 46,99,3,0,0,0,0,0,0,0,0,0,0,0,2,0,
+ 0,0,3,0,0,0,243,32,0,0,0,151,0,124,1,124,
+ 0,95,0,0,0,0,0,0,0,0,0,124,2,124,0,95,
+ 1,0,0,0,0,0,0,0,0,121,1,41,2,122,75,67,
+ 97,99,104,101,32,116,104,101,32,109,111,100,117,108,101,32,
+ 110,97,109,101,32,97,110,100,32,116,104,101,32,112,97,116,
+ 104,32,116,111,32,116,104,101,32,102,105,108,101,32,102,111,
+ 117,110,100,32,98,121,32,116,104,101,10,32,32,32,32,32,
+ 32,32,32,102,105,110,100,101,114,46,78,114,230,0,0,0,
+ 41,3,114,190,0,0,0,114,43,1,0,0,114,68,0,0,
+ 0,115,3,0,0,0,32,32,32,114,10,0,0,0,114,68,
+ 1,0,0,122,19,70,105,108,101,76,111,97,100,101,114,46,
+ 95,95,105,110,105,116,95,95,133,4,0,0,115,18,0,0,
+ 0,128,0,240,6,0,21,29,136,4,140,9,216,20,24,136,
+ 4,141,9,114,28,0,0,0,99,2,0,0,0,0,0,0,
+ 0,0,0,0,0,2,0,0,0,3,0,0,0,243,106,0,
0,0,151,0,124,0,106,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,83,0,169,1,122,58,
- 82,101,116,117,114,110,32,116,104,101,32,112,97,116,104,32,
- 116,111,32,116,104,101,32,115,111,117,114,99,101,32,102,105,
- 108,101,32,97,115,32,102,111,117,110,100,32,98,121,32,116,
- 104,101,32,102,105,110,100,101,114,46,114,84,0,0,0,114,
- 83,1,0,0,115,2,0,0,0,32,32,114,10,0,0,0,
- 114,7,1,0,0,122,23,70,105,108,101,76,111,97,100,101,
- 114,46,103,101,116,95,102,105,108,101,110,97,109,101,154,4,
- 0,0,243,14,0,0,0,128,0,240,6,0,16,20,143,121,
- 137,121,208,8,24,114,28,0,0,0,99,2,0,0,0,0,
- 0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,243,
- 46,1,0,0,151,0,116,1,0,0,0,0,0,0,0,0,
- 124,0,116,2,0,0,0,0,0,0,0,0,116,4,0,0,
- 0,0,0,0,0,0,102,2,171,2,0,0,0,0,0,0,
- 114,56,116,7,0,0,0,0,0,0,0,0,106,8,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 116,11,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
- 0,0,0,0,171,1,0,0,0,0,0,0,53,0,125,2,
- 124,2,106,13,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,171,0,0,0,0,0,0,0,99,2,
- 100,1,100,1,100,1,171,2,0,0,0,0,0,0,1,0,
- 83,0,116,7,0,0,0,0,0,0,0,0,106,14,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 124,1,100,2,171,2,0,0,0,0,0,0,53,0,125,2,
- 124,2,106,13,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,171,0,0,0,0,0,0,0,99,2,
- 100,1,100,1,100,1,171,2,0,0,0,0,0,0,1,0,
- 83,0,35,0,49,0,115,1,119,2,1,0,89,0,1,0,
- 1,0,121,1,120,3,89,0,119,1,35,0,49,0,115,1,
- 119,2,1,0,89,0,1,0,1,0,121,1,120,3,89,0,
- 119,1,41,3,122,39,82,101,116,117,114,110,32,116,104,101,
- 32,100,97,116,97,32,102,114,111,109,32,112,97,116,104,32,
- 97,115,32,114,97,119,32,98,121,116,101,115,46,78,218,1,
- 114,41,8,114,232,0,0,0,114,86,1,0,0,218,19,69,
- 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
- 101,114,114,114,0,0,0,218,9,111,112,101,110,95,99,111,
- 100,101,114,136,0,0,0,218,4,114,101,97,100,114,115,0,
- 0,0,41,3,114,189,0,0,0,114,68,0,0,0,114,120,
- 0,0,0,115,3,0,0,0,32,32,32,114,10,0,0,0,
- 114,98,1,0,0,122,19,70,105,108,101,76,111,97,100,101,
- 114,46,103,101,116,95,100,97,116,97,159,4,0,0,115,106,
- 0,0,0,128,0,228,11,21,144,100,156,92,212,43,62,208,
- 28,63,212,11,64,220,17,20,151,29,145,29,156,115,160,52,
- 155,121,212,17,41,168,84,216,23,27,151,121,145,121,147,123,
- 247,3,0,18,42,209,17,41,244,6,0,18,21,151,26,145,
- 26,152,68,160,35,212,17,38,168,36,216,23,27,151,121,145,
- 121,147,123,247,3,0,18,39,209,17,38,247,7,0,18,42,
- 208,17,41,250,247,6,0,18,39,208,17,38,250,115,23,0,
- 0,0,181,16,65,63,3,193,37,16,66,11,3,193,63,5,
- 66,8,7,194,11,5,66,20,7,99,2,0,0,0,0,0,
- 0,0,0,0,0,0,3,0,0,0,3,0,0,0,243,30,
- 0,0,0,151,0,100,1,100,2,108,0,109,1,125,2,1,
- 0,2,0,124,2,124,0,171,1,0,0,0,0,0,0,83,
- 0,41,3,78,114,1,0,0,0,41,1,218,10,70,105,108,
- 101,82,101,97,100,101,114,41,2,218,17,105,109,112,111,114,
- 116,108,105,98,46,114,101,97,100,101,114,115,114,145,1,0,
- 0,41,3,114,189,0,0,0,114,79,1,0,0,114,145,1,
- 0,0,115,3,0,0,0,32,32,32,114,10,0,0,0,218,
- 19,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,
- 97,100,101,114,122,30,70,105,108,101,76,111,97,100,101,114,
- 46,103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,
- 97,100,101,114,168,4,0,0,115,16,0,0,0,128,0,229,
- 8,48,217,15,25,152,36,211,15,31,208,8,31,114,28,0,
- 0,0,41,13,114,196,0,0,0,114,195,0,0,0,114,197,
- 0,0,0,114,198,0,0,0,114,67,1,0,0,114,126,1,
- 0,0,114,132,1,0,0,114,208,0,0,0,114,84,1,0,
- 0,114,7,1,0,0,114,98,1,0,0,114,147,1,0,0,
- 218,13,95,95,99,108,97,115,115,99,101,108,108,95,95,41,
- 1,114,123,1,0,0,115,1,0,0,0,64,114,10,0,0,
- 0,114,119,1,0,0,114,119,1,0,0,124,4,0,0,115,
- 88,0,0,0,248,132,0,241,4,1,5,34,242,6,4,5,
- 25,242,12,2,5,49,242,8,1,5,49,240,6,0,6,17,
- 243,2,9,5,61,243,3,0,6,17,240,2,9,5,61,240,
- 22,0,6,17,241,2,2,5,25,243,3,0,6,17,240,2,
- 2,5,25,242,8,7,5,35,240,18,0,6,17,241,2,2,
- 5,32,243,3,0,6,17,244,2,2,5,32,114,28,0,0,
- 0,114,119,1,0,0,99,0,0,0,0,0,0,0,0,0,
- 0,0,0,2,0,0,0,0,0,0,0,243,40,0,0,0,
- 151,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
- 132,0,90,4,100,3,132,0,90,5,100,4,100,5,156,1,
- 100,6,132,2,90,6,121,7,41,8,218,16,83,111,117,114,
- 99,101,70,105,108,101,76,111,97,100,101,114,122,62,67,111,
- 110,99,114,101,116,101,32,105,109,112,108,101,109,101,110,116,
- 97,116,105,111,110,32,111,102,32,83,111,117,114,99,101,76,
- 111,97,100,101,114,32,117,115,105,110,103,32,116,104,101,32,
- 102,105,108,101,32,115,121,115,116,101,109,46,99,2,0,0,
- 0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,
- 0,243,74,0,0,0,151,0,116,1,0,0,0,0,0,0,
- 0,0,124,1,171,1,0,0,0,0,0,0,125,2,124,2,
- 106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,2,106,4,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,100,1,156,2,83,0,
- 41,2,122,33,82,101,116,117,114,110,32,116,104,101,32,109,
- 101,116,97,100,97,116,97,32,102,111,114,32,116,104,101,32,
- 112,97,116,104,46,41,2,114,242,0,0,0,114,108,1,0,
- 0,41,3,114,85,0,0,0,218,8,115,116,95,109,116,105,
- 109,101,218,7,115,116,95,115,105,122,101,41,3,114,189,0,
- 0,0,114,68,0,0,0,114,115,1,0,0,115,3,0,0,
- 0,32,32,32,114,10,0,0,0,114,91,1,0,0,122,27,
- 83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,114,
- 46,112,97,116,104,95,115,116,97,116,115,178,4,0,0,115,
- 31,0,0,0,128,0,228,13,23,152,4,211,13,29,136,2,
- 216,25,27,159,27,153,27,168,98,175,106,169,106,209,15,57,
- 208,8,57,114,28,0,0,0,99,4,0,0,0,0,0,0,
- 0,0,0,0,0,5,0,0,0,3,0,0,0,243,64,0,
- 0,0,151,0,116,1,0,0,0,0,0,0,0,0,124,1,
- 171,1,0,0,0,0,0,0,125,4,124,0,106,3,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 124,2,124,3,124,4,172,1,171,3,0,0,0,0,0,0,
- 83,0,41,2,78,169,1,218,5,95,109,111,100,101,41,2,
- 114,183,0,0,0,114,93,1,0,0,41,5,114,189,0,0,
- 0,114,176,0,0,0,114,173,0,0,0,114,48,0,0,0,
- 114,89,0,0,0,115,5,0,0,0,32,32,32,32,32,114,
- 10,0,0,0,114,95,1,0,0,122,32,83,111,117,114,99,
- 101,70,105,108,101,76,111,97,100,101,114,46,95,99,97,99,
- 104,101,95,98,121,116,101,99,111,100,101,183,4,0,0,115,
- 33,0,0,0,128,0,228,15,25,152,43,211,15,38,136,4,
- 216,15,19,143,125,137,125,152,93,168,68,184,4,136,125,211,
- 15,61,208,8,61,114,28,0,0,0,114,107,0,0,0,114,
- 155,1,0,0,99,3,0,0,0,0,0,0,0,1,0,0,
- 0,7,0,0,0,3,0,0,0,243,14,2,0,0,151,0,
- 116,1,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
- 0,0,0,0,92,2,0,0,125,4,125,5,103,0,125,6,
- 124,4,114,56,116,3,0,0,0,0,0,0,0,0,124,4,
- 171,1,0,0,0,0,0,0,115,45,116,1,0,0,0,0,
- 0,0,0,0,124,4,171,1,0,0,0,0,0,0,92,2,
- 0,0,125,4,125,7,124,6,106,5,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,7,171,1,
- 0,0,0,0,0,0,1,0,124,4,114,12,116,3,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,1,106,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 107,40,0,0,120,1,114,25,1,0,124,0,106,2,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,1,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,107,40,0,0,83,0,114,77,0,0,
+ 0,169,2,218,9,95,95,99,108,97,115,115,95,95,114,203,
+ 0,0,0,169,2,114,190,0,0,0,218,5,111,116,104,101,
+ 114,115,2,0,0,0,32,32,114,10,0,0,0,218,6,95,
+ 95,101,113,95,95,122,17,70,105,108,101,76,111,97,100,101,
+ 114,46,95,95,101,113,95,95,139,4,0,0,243,44,0,0,
+ 0,128,0,216,16,20,151,14,145,14,160,37,167,47,161,47,
+ 209,16,49,242,0,1,17,48,216,16,20,151,13,145,13,160,
+ 21,167,30,161,30,209,16,47,240,3,1,9,49,114,28,0,
+ 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,4,
+ 0,0,0,3,0,0,0,243,88,0,0,0,151,0,116,1,
+ 0,0,0,0,0,0,0,0,124,0,106,2,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,1,
+ 0,0,0,0,0,0,116,1,0,0,0,0,0,0,0,0,
+ 124,0,106,4,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,171,1,0,0,0,0,0,0,122,12,
+ 0,0,83,0,114,77,0,0,0,169,3,218,4,104,97,115,
+ 104,114,188,0,0,0,114,68,0,0,0,169,1,114,190,0,
+ 0,0,115,1,0,0,0,32,114,10,0,0,0,218,8,95,
+ 95,104,97,115,104,95,95,122,19,70,105,108,101,76,111,97,
+ 100,101,114,46,95,95,104,97,115,104,95,95,143,4,0,0,
+ 243,29,0,0,0,128,0,220,15,19,144,68,151,73,145,73,
+ 139,127,164,20,160,100,167,105,161,105,163,31,209,15,48,208,
+ 8,48,114,28,0,0,0,99,2,0,0,0,0,0,0,0,
+ 0,0,0,0,3,0,0,0,3,0,0,0,243,42,0,0,
+ 0,149,1,151,0,116,0,0,0,0,0,0,0,0,0,116,
+ 2,0,0,0,0,0,0,0,0,124,0,141,11,0,0,124,
+ 1,171,1,0,0,0,0,0,0,83,0,41,1,122,100,76,
+ 111,97,100,32,97,32,109,111,100,117,108,101,32,102,114,111,
+ 109,32,97,32,102,105,108,101,46,10,10,32,32,32,32,32,
+ 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,
+ 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,
+ 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41,
+ 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32,
+ 32,32,32,41,3,218,5,115,117,112,101,114,114,120,1,0,
+ 0,114,85,1,0,0,41,3,114,190,0,0,0,114,43,1,
+ 0,0,114,124,1,0,0,115,3,0,0,0,32,32,128,114,
+ 10,0,0,0,114,85,1,0,0,122,22,70,105,108,101,76,
+ 111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,108,
+ 101,146,4,0,0,115,23,0,0,0,248,128,0,244,20,0,
+ 16,21,148,90,160,20,209,15,50,176,56,211,15,60,208,8,
+ 60,114,28,0,0,0,99,2,0,0,0,0,0,0,0,0,
+ 0,0,0,1,0,0,0,3,0,0,0,243,26,0,0,0,
+ 151,0,124,0,106,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,83,0,169,1,122,58,82,101,
+ 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111,
+ 32,116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,
+ 32,97,115,32,102,111,117,110,100,32,98,121,32,116,104,101,
+ 32,102,105,110,100,101,114,46,114,84,0,0,0,114,84,1,
+ 0,0,115,2,0,0,0,32,32,114,10,0,0,0,114,8,
+ 1,0,0,122,23,70,105,108,101,76,111,97,100,101,114,46,
+ 103,101,116,95,102,105,108,101,110,97,109,101,158,4,0,0,
+ 243,14,0,0,0,128,0,240,6,0,16,20,143,121,137,121,
+ 208,8,24,114,28,0,0,0,99,2,0,0,0,0,0,0,
+ 0,0,0,0,0,6,0,0,0,3,0,0,0,243,46,1,
+ 0,0,151,0,116,1,0,0,0,0,0,0,0,0,124,0,
+ 116,2,0,0,0,0,0,0,0,0,116,4,0,0,0,0,
+ 0,0,0,0,102,2,171,2,0,0,0,0,0,0,114,56,
+ 116,7,0,0,0,0,0,0,0,0,106,8,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,11,
+ 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
+ 0,0,171,1,0,0,0,0,0,0,53,0,125,2,124,2,
+ 106,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,99,2,100,1,
+ 100,1,100,1,171,2,0,0,0,0,0,0,1,0,83,0,
+ 116,7,0,0,0,0,0,0,0,0,106,14,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,
+ 100,2,171,2,0,0,0,0,0,0,53,0,125,2,124,2,
+ 106,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,99,2,100,1,
+ 100,1,100,1,171,2,0,0,0,0,0,0,1,0,83,0,
+ 35,0,49,0,115,1,119,2,1,0,89,0,1,0,1,0,
+ 121,1,120,3,89,0,119,1,35,0,49,0,115,1,119,2,
+ 1,0,89,0,1,0,1,0,121,1,120,3,89,0,119,1,
+ 41,3,122,39,82,101,116,117,114,110,32,116,104,101,32,100,
+ 97,116,97,32,102,114,111,109,32,112,97,116,104,32,97,115,
+ 32,114,97,119,32,98,121,116,101,115,46,78,218,1,114,41,
+ 8,114,233,0,0,0,114,87,1,0,0,218,19,69,120,116,
+ 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
+ 114,114,0,0,0,218,9,111,112,101,110,95,99,111,100,101,
+ 114,137,0,0,0,218,4,114,101,97,100,114,115,0,0,0,
+ 41,3,114,190,0,0,0,114,68,0,0,0,114,120,0,0,
+ 0,115,3,0,0,0,32,32,32,114,10,0,0,0,114,99,
+ 1,0,0,122,19,70,105,108,101,76,111,97,100,101,114,46,
+ 103,101,116,95,100,97,116,97,163,4,0,0,115,106,0,0,
+ 0,128,0,228,11,21,144,100,156,92,212,43,62,208,28,63,
+ 212,11,64,220,17,20,151,29,145,29,156,115,160,52,155,121,
+ 212,17,41,168,84,216,23,27,151,121,145,121,147,123,247,3,
+ 0,18,42,209,17,41,244,6,0,18,21,151,26,145,26,152,
+ 68,160,35,212,17,38,168,36,216,23,27,151,121,145,121,147,
+ 123,247,3,0,18,39,209,17,38,247,7,0,18,42,208,17,
+ 41,250,247,6,0,18,39,208,17,38,250,115,23,0,0,0,
+ 181,16,65,63,3,193,37,16,66,11,3,193,63,5,66,8,
+ 7,194,11,5,66,20,7,99,2,0,0,0,0,0,0,0,
+ 0,0,0,0,3,0,0,0,3,0,0,0,243,30,0,0,
+ 0,151,0,100,1,100,2,108,0,109,1,125,2,1,0,2,
+ 0,124,2,124,0,171,1,0,0,0,0,0,0,83,0,41,
+ 3,78,114,1,0,0,0,41,1,218,10,70,105,108,101,82,
+ 101,97,100,101,114,41,2,218,17,105,109,112,111,114,116,108,
+ 105,98,46,114,101,97,100,101,114,115,114,146,1,0,0,41,
+ 3,114,190,0,0,0,114,80,1,0,0,114,146,1,0,0,
+ 115,3,0,0,0,32,32,32,114,10,0,0,0,218,19,103,
+ 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,
+ 101,114,122,30,70,105,108,101,76,111,97,100,101,114,46,103,
+ 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,
+ 101,114,172,4,0,0,115,16,0,0,0,128,0,229,8,48,
+ 217,15,25,152,36,211,15,31,208,8,31,114,28,0,0,0,
+ 41,13,114,197,0,0,0,114,196,0,0,0,114,198,0,0,
+ 0,114,199,0,0,0,114,68,1,0,0,114,127,1,0,0,
+ 114,133,1,0,0,114,209,0,0,0,114,85,1,0,0,114,
+ 8,1,0,0,114,99,1,0,0,114,148,1,0,0,218,13,
+ 95,95,99,108,97,115,115,99,101,108,108,95,95,41,1,114,
+ 124,1,0,0,115,1,0,0,0,64,114,10,0,0,0,114,
+ 120,1,0,0,114,120,1,0,0,128,4,0,0,115,88,0,
+ 0,0,248,132,0,241,4,1,5,34,242,6,4,5,25,242,
+ 12,2,5,49,242,8,1,5,49,240,6,0,6,17,243,2,
+ 9,5,61,243,3,0,6,17,240,2,9,5,61,240,22,0,
+ 6,17,241,2,2,5,25,243,3,0,6,17,240,2,2,5,
+ 25,242,8,7,5,35,240,18,0,6,17,241,2,2,5,32,
+ 243,3,0,6,17,244,2,2,5,32,114,28,0,0,0,114,
+ 120,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+ 0,2,0,0,0,0,0,0,0,243,40,0,0,0,151,0,
+ 101,0,90,1,100,0,90,2,100,1,90,3,100,2,132,0,
+ 90,4,100,3,132,0,90,5,100,4,100,5,156,1,100,6,
+ 132,2,90,6,121,7,41,8,218,16,83,111,117,114,99,101,
+ 70,105,108,101,76,111,97,100,101,114,122,62,67,111,110,99,
+ 114,101,116,101,32,105,109,112,108,101,109,101,110,116,97,116,
+ 105,111,110,32,111,102,32,83,111,117,114,99,101,76,111,97,
+ 100,101,114,32,117,115,105,110,103,32,116,104,101,32,102,105,
+ 108,101,32,115,121,115,116,101,109,46,99,2,0,0,0,0,
+ 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,243,
+ 74,0,0,0,151,0,116,1,0,0,0,0,0,0,0,0,
+ 124,1,171,1,0,0,0,0,0,0,125,2,124,2,106,2,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,2,106,4,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,100,1,156,2,83,0,41,2,
+ 122,33,82,101,116,117,114,110,32,116,104,101,32,109,101,116,
+ 97,100,97,116,97,32,102,111,114,32,116,104,101,32,112,97,
+ 116,104,46,41,2,114,243,0,0,0,114,109,1,0,0,41,
+ 3,114,85,0,0,0,218,8,115,116,95,109,116,105,109,101,
+ 218,7,115,116,95,115,105,122,101,41,3,114,190,0,0,0,
+ 114,68,0,0,0,114,116,1,0,0,115,3,0,0,0,32,
+ 32,32,114,10,0,0,0,114,92,1,0,0,122,27,83,111,
+ 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,112,
+ 97,116,104,95,115,116,97,116,115,182,4,0,0,115,31,0,
+ 0,0,128,0,228,13,23,152,4,211,13,29,136,2,216,25,
+ 27,159,27,153,27,168,98,175,106,169,106,209,15,57,208,8,
+ 57,114,28,0,0,0,99,4,0,0,0,0,0,0,0,0,
+ 0,0,0,5,0,0,0,3,0,0,0,243,64,0,0,0,
+ 151,0,116,1,0,0,0,0,0,0,0,0,124,1,171,1,
+ 0,0,0,0,0,0,125,4,124,0,106,3,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,2,
+ 124,3,124,4,172,1,171,3,0,0,0,0,0,0,83,0,
+ 41,2,78,169,1,218,5,95,109,111,100,101,41,2,114,184,
+ 0,0,0,114,94,1,0,0,41,5,114,190,0,0,0,114,
+ 177,0,0,0,114,174,0,0,0,114,48,0,0,0,114,89,
+ 0,0,0,115,5,0,0,0,32,32,32,32,32,114,10,0,
+ 0,0,114,96,1,0,0,122,32,83,111,117,114,99,101,70,
+ 105,108,101,76,111,97,100,101,114,46,95,99,97,99,104,101,
+ 95,98,121,116,101,99,111,100,101,187,4,0,0,115,33,0,
+ 0,0,128,0,228,15,25,152,43,211,15,38,136,4,216,15,
+ 19,143,125,137,125,152,93,168,68,184,4,136,125,211,15,61,
+ 208,8,61,114,28,0,0,0,114,107,0,0,0,114,156,1,
+ 0,0,99,3,0,0,0,0,0,0,0,1,0,0,0,7,
+ 0,0,0,3,0,0,0,243,14,2,0,0,151,0,116,1,
+ 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
+ 0,0,92,2,0,0,125,4,125,5,103,0,125,6,124,4,
+ 114,56,116,3,0,0,0,0,0,0,0,0,124,4,171,1,
+ 0,0,0,0,0,0,115,45,116,1,0,0,0,0,0,0,
+ 0,0,124,4,171,1,0,0,0,0,0,0,92,2,0,0,
+ 125,4,125,7,124,6,106,5,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,7,171,1,0,0,
+ 0,0,0,0,1,0,124,4,114,12,116,3,0,0,0,0,
+ 0,0,0,0,124,4,171,1,0,0,0,0,0,0,115,1,
+ 140,45,116,7,0,0,0,0,0,0,0,0,124,6,171,1,
+ 0,0,0,0,0,0,68,0,93,36,0,0,125,7,116,9,
+ 0,0,0,0,0,0,0,0,124,4,124,7,171,2,0,0,
+ 0,0,0,0,125,4,9,0,116,11,0,0,0,0,0,0,
+ 0,0,106,12,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,124,4,171,1,0,0,0,0,0,0,
- 115,1,140,45,116,7,0,0,0,0,0,0,0,0,124,6,
- 171,1,0,0,0,0,0,0,68,0,93,36,0,0,125,7,
- 116,9,0,0,0,0,0,0,0,0,124,4,124,7,171,2,
- 0,0,0,0,0,0,125,4,9,0,116,11,0,0,0,0,
- 0,0,0,0,106,12,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,4,171,1,0,0,0,0,
- 0,0,1,0,140,38,4,0,9,0,116,23,0,0,0,0,
- 0,0,0,0,124,1,124,2,124,3,171,3,0,0,0,0,
- 0,0,1,0,116,18,0,0,0,0,0,0,0,0,106,21,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,100,3,124,1,171,2,0,0,0,0,0,0,1,0,
- 121,2,35,0,116,14,0,0,0,0,0,0,0,0,36,0,
- 114,3,1,0,89,0,140,87,116,16,0,0,0,0,0,0,
- 0,0,36,0,114,34,125,8,116,18,0,0,0,0,0,0,
- 0,0,106,21,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,100,1,124,4,124,8,171,3,0,0,
- 0,0,0,0,1,0,89,0,100,2,125,8,126,8,1,0,
- 121,2,100,2,125,8,126,8,119,1,119,0,120,3,89,0,
- 119,1,35,0,116,16,0,0,0,0,0,0,0,0,36,0,
- 114,33,125,8,116,18,0,0,0,0,0,0,0,0,106,21,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,100,1,124,1,124,8,171,3,0,0,0,0,0,0,
- 1,0,89,0,100,2,125,8,126,8,121,2,100,2,125,8,
- 126,8,119,1,119,0,120,3,89,0,119,1,41,4,122,27,
- 87,114,105,116,101,32,98,121,116,101,115,32,100,97,116,97,
- 32,116,111,32,97,32,102,105,108,101,46,122,27,99,111,117,
- 108,100,32,110,111,116,32,99,114,101,97,116,101,32,123,33,
- 114,125,58,32,123,33,114,125,78,122,12,99,114,101,97,116,
- 101,100,32,123,33,114,125,41,12,114,81,0,0,0,114,96,
- 0,0,0,114,64,0,0,0,218,8,114,101,118,101,114,115,
- 101,100,114,72,0,0,0,114,23,0,0,0,218,5,109,107,
- 100,105,114,218,15,70,105,108,101,69,120,105,115,116,115,69,
- 114,114,111,114,114,87,0,0,0,114,207,0,0,0,114,215,
- 0,0,0,114,121,0,0,0,41,9,114,189,0,0,0,114,
- 68,0,0,0,114,48,0,0,0,114,156,1,0,0,218,6,
- 112,97,114,101,110,116,114,151,0,0,0,114,66,0,0,0,
- 114,74,0,0,0,114,31,1,0,0,115,9,0,0,0,32,
- 32,32,32,32,32,32,32,32,114,10,0,0,0,114,93,1,
- 0,0,122,25,83,111,117,114,99,101,70,105,108,101,76,111,
- 97,100,101,114,46,115,101,116,95,100,97,116,97,188,4,0,
- 0,115,251,0,0,0,128,0,228,27,38,160,116,211,27,44,
- 209,8,24,136,6,144,8,216,21,23,136,10,225,14,20,156,
- 91,168,22,212,29,48,220,27,38,160,118,211,27,46,137,76,
- 136,70,144,68,216,12,22,215,12,29,209,12,29,152,100,212,
- 12,35,241,5,0,15,21,156,91,168,22,213,29,48,244,8,
- 0,21,29,152,90,214,20,40,136,68,220,21,31,160,6,168,
- 4,211,21,45,136,70,240,2,10,13,23,220,16,19,151,9,
- 145,9,152,38,213,16,33,240,7,0,21,41,240,26,6,9,
- 45,220,12,25,152,36,160,4,160,101,212,12,44,220,12,22,
- 215,12,39,209,12,39,168,14,184,4,213,12,61,248,244,23,
- 0,20,35,242,0,2,13,25,225,16,24,220,19,26,242,0,
- 5,13,23,244,6,0,17,27,215,16,43,209,16,43,208,44,
- 73,216,44,50,176,67,244,3,1,17,57,229,16,22,251,240,
- 11,5,13,23,251,244,18,0,16,23,242,0,3,9,45,228,
- 12,22,215,12,39,209,12,39,208,40,69,192,116,216,40,43,
- 247,3,1,13,45,241,0,1,13,45,251,240,5,3,9,45,
- 250,115,54,0,0,0,193,38,21,66,34,2,193,62,35,67,
- 26,0,194,34,9,67,23,5,194,45,8,67,23,5,194,53,
- 23,67,18,5,195,18,5,67,23,5,195,26,9,68,4,3,
- 195,35,23,67,63,3,195,63,5,68,4,3,78,41,7,114,
- 196,0,0,0,114,195,0,0,0,114,197,0,0,0,114,198,
- 0,0,0,114,91,1,0,0,114,95,1,0,0,114,93,1,
- 0,0,114,30,0,0,0,114,28,0,0,0,114,10,0,0,
- 0,114,150,1,0,0,114,150,1,0,0,174,4,0,0,115,
- 25,0,0,0,132,0,225,4,72,242,4,3,5,58,242,10,
- 3,5,62,240,10,0,45,50,245,0,28,5,45,114,28,0,
- 0,0,114,150,1,0,0,99,0,0,0,0,0,0,0,0,
- 0,0,0,0,1,0,0,0,0,0,0,0,243,28,0,0,
- 0,151,0,101,0,90,1,100,0,90,2,100,1,90,3,100,
- 2,132,0,90,4,100,3,132,0,90,5,121,4,41,5,218,
- 20,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,
- 111,97,100,101,114,122,45,76,111,97,100,101,114,32,119,104,
- 105,99,104,32,104,97,110,100,108,101,115,32,115,111,117,114,
- 99,101,108,101,115,115,32,102,105,108,101,32,105,109,112,111,
- 114,116,115,46,99,2,0,0,0,0,0,0,0,0,0,0,
- 0,5,0,0,0,3,0,0,0,243,158,0,0,0,151,0,
- 124,0,106,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
- 125,2,124,0,106,3,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,
- 0,0,125,3,124,1,124,2,100,1,156,2,125,4,116,5,
- 0,0,0,0,0,0,0,0,124,3,124,1,124,4,171,3,
- 0,0,0,0,0,0,1,0,116,7,0,0,0,0,0,0,
- 0,0,116,9,0,0,0,0,0,0,0,0,124,3,171,1,
- 0,0,0,0,0,0,100,2,100,0,26,0,124,1,124,2,
- 172,3,171,3,0,0,0,0,0,0,83,0,41,4,78,114,
- 229,0,0,0,114,211,0,0,0,41,2,114,187,0,0,0,
- 114,173,0,0,0,41,5,114,7,1,0,0,114,98,1,0,
- 0,114,219,0,0,0,114,237,0,0,0,114,109,1,0,0,
- 41,5,114,189,0,0,0,114,42,1,0,0,114,68,0,0,
- 0,114,48,0,0,0,114,217,0,0,0,115,5,0,0,0,
- 32,32,32,32,32,114,10,0,0,0,114,76,1,0,0,122,
- 29,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,
- 111,97,100,101,114,46,103,101,116,95,99,111,100,101,223,4,
- 0,0,115,95,0,0,0,128,0,216,15,19,215,15,32,209,
- 15,32,160,24,211,15,42,136,4,216,15,19,143,125,137,125,
- 152,84,211,15,34,136,4,240,8,0,21,29,216,20,24,241,
- 5,3,23,10,136,11,244,8,0,9,22,144,100,152,72,160,
- 107,212,8,50,220,15,32,220,12,22,144,116,211,12,28,152,
- 82,152,83,208,12,33,216,17,25,216,26,30,244,7,4,16,
- 10,240,0,4,9,10,114,28,0,0,0,99,2,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
- 243,4,0,0,0,151,0,121,1,41,2,122,39,82,101,116,
- 117,114,110,32,78,111,110,101,32,97,115,32,116,104,101,114,
- 101,32,105,115,32,110,111,32,115,111,117,114,99,101,32,99,
- 111,100,101,46,78,114,30,0,0,0,114,83,1,0,0,115,
- 2,0,0,0,32,32,114,10,0,0,0,114,99,1,0,0,
- 122,31,83,111,117,114,99,101,108,101,115,115,70,105,108,101,
- 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,
- 101,239,4,0,0,243,5,0,0,0,128,0,224,15,19,114,
- 28,0,0,0,78,41,6,114,196,0,0,0,114,195,0,0,
- 0,114,197,0,0,0,114,198,0,0,0,114,76,1,0,0,
- 114,99,1,0,0,114,30,0,0,0,114,28,0,0,0,114,
- 10,0,0,0,114,163,1,0,0,114,163,1,0,0,219,4,
- 0,0,115,15,0,0,0,132,0,225,4,55,242,4,14,5,
- 10,243,32,2,5,20,114,28,0,0,0,114,163,1,0,0,
- 99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
- 0,0,0,0,0,243,80,0,0,0,151,0,101,0,90,1,
- 100,0,90,2,100,1,90,3,100,2,132,0,90,4,100,3,
- 132,0,90,5,100,4,132,0,90,6,100,5,132,0,90,7,
- 100,6,132,0,90,8,100,7,132,0,90,9,100,8,132,0,
- 90,10,100,9,132,0,90,11,101,12,100,10,132,0,171,0,
- 0,0,0,0,0,0,90,13,121,11,41,12,114,141,1,0,
- 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120,
- 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46,
- 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114,
- 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101,
- 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70,
- 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32,
- 99,3,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
- 0,3,0,0,0,243,32,0,0,0,151,0,124,1,124,0,
- 95,0,0,0,0,0,0,0,0,0,124,2,124,0,95,1,
- 0,0,0,0,0,0,0,0,121,0,114,77,0,0,0,114,
- 229,0,0,0,41,3,114,189,0,0,0,114,187,0,0,0,
- 114,68,0,0,0,115,3,0,0,0,32,32,32,114,10,0,
- 0,0,114,67,1,0,0,122,28,69,120,116,101,110,115,105,
- 111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,
- 110,105,116,95,95,252,4,0,0,115,16,0,0,0,128,0,
- 216,20,24,136,4,140,9,216,20,24,136,4,141,9,114,28,
- 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,
- 2,0,0,0,3,0,0,0,243,106,0,0,0,151,0,124,
- 0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,106,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,107,40,0,0,120,
- 1,114,25,1,0,124,0,106,2,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,1,106,2,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,107,40,0,0,83,0,114,77,0,0,0,114,122,1,0,
- 0,114,124,1,0,0,115,2,0,0,0,32,32,114,10,0,
- 0,0,114,126,1,0,0,122,26,69,120,116,101,110,115,105,
- 111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,101,
- 113,95,95,0,5,0,0,114,127,1,0,0,114,28,0,0,
- 0,99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,
- 0,0,3,0,0,0,243,88,0,0,0,151,0,116,1,0,
- 0,0,0,0,0,0,0,124,0,106,2,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,116,1,0,0,0,0,0,0,0,0,124,
- 0,106,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,171,1,0,0,0,0,0,0,122,12,0,
- 0,83,0,114,77,0,0,0,114,129,1,0,0,114,131,1,
- 0,0,115,1,0,0,0,32,114,10,0,0,0,114,132,1,
- 0,0,122,28,69,120,116,101,110,115,105,111,110,70,105,108,
- 101,76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,
- 4,5,0,0,114,133,1,0,0,114,28,0,0,0,99,2,
- 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,
- 0,0,0,243,164,0,0,0,151,0,116,0,0,0,0,0,
- 0,0,0,0,106,3,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,116,4,0,0,0,0,0,0,
- 0,0,106,6,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,124,1,171,2,0,0,0,0,0,0,
- 125,2,116,0,0,0,0,0,0,0,0,0,106,9,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 100,1,124,1,106,10,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,0,106,12,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,3,
- 0,0,0,0,0,0,1,0,124,2,83,0,41,2,122,40,
- 67,114,101,97,116,101,32,97,110,32,117,110,105,110,105,116,
- 105,97,108,105,122,101,100,32,101,120,116,101,110,115,105,111,
- 110,32,109,111,100,117,108,101,122,38,101,120,116,101,110,115,
- 105,111,110,32,109,111,100,117,108,101,32,123,33,114,125,32,
- 108,111,97,100,101,100,32,102,114,111,109,32,123,33,114,125,
- 41,7,114,207,0,0,0,114,77,1,0,0,114,234,0,0,
- 0,218,14,99,114,101,97,116,101,95,100,121,110,97,109,105,
- 99,114,215,0,0,0,114,187,0,0,0,114,68,0,0,0,
- 41,3,114,189,0,0,0,114,16,1,0,0,114,79,1,0,
- 0,115,3,0,0,0,32,32,32,114,10,0,0,0,114,73,
- 1,0,0,122,33,69,120,116,101,110,115,105,111,110,70,105,
- 108,101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,
- 109,111,100,117,108,101,7,5,0,0,115,64,0,0,0,128,
- 0,228,17,27,215,17,53,209,17,53,220,12,16,215,12,31,
- 209,12,31,160,20,243,3,1,18,39,136,6,228,8,18,215,
- 8,35,209,8,35,208,36,76,216,25,29,159,25,153,25,160,
- 68,167,73,161,73,244,3,1,9,47,224,15,21,136,13,114,
- 28,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,
- 0,5,0,0,0,3,0,0,0,243,162,0,0,0,151,0,
- 116,0,0,0,0,0,0,0,0,0,106,3,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,4,
- 0,0,0,0,0,0,0,0,106,6,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,1,171,2,
- 0,0,0,0,0,0,1,0,116,0,0,0,0,0,0,0,
- 0,0,106,9,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,100,1,124,0,106,10,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
- 106,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,171,3,0,0,0,0,0,0,1,0,121,2,
- 41,3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,
- 110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
- 108,101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,
- 100,117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,
- 101,100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,
- 207,0,0,0,114,77,1,0,0,114,234,0,0,0,218,12,
- 101,120,101,99,95,100,121,110,97,109,105,99,114,215,0,0,
- 0,114,187,0,0,0,114,68,0,0,0,169,2,114,189,0,
- 0,0,114,79,1,0,0,115,2,0,0,0,32,32,114,10,
- 0,0,0,114,80,1,0,0,122,31,69,120,116,101,110,115,
- 105,111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,
- 101,99,95,109,111,100,117,108,101,15,5,0,0,115,54,0,
- 0,0,128,0,228,8,18,215,8,44,209,8,44,172,84,215,
- 45,62,209,45,62,192,6,212,8,71,220,8,18,215,8,35,
- 209,8,35,208,36,78,216,25,29,159,25,153,25,160,68,167,
- 73,161,73,245,3,1,9,47,114,28,0,0,0,99,2,0,
- 0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,
- 0,0,243,100,0,0,0,135,2,151,0,116,1,0,0,0,
+ 1,0,140,38,4,0,9,0,116,23,0,0,0,0,0,0,
+ 0,0,124,1,124,2,124,3,171,3,0,0,0,0,0,0,
+ 1,0,116,18,0,0,0,0,0,0,0,0,106,21,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 100,3,124,1,171,2,0,0,0,0,0,0,1,0,121,2,
+ 35,0,116,14,0,0,0,0,0,0,0,0,36,0,114,3,
+ 1,0,89,0,140,87,116,16,0,0,0,0,0,0,0,0,
+ 36,0,114,34,125,8,116,18,0,0,0,0,0,0,0,0,
+ 106,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,1,124,4,124,8,171,3,0,0,0,0,
+ 0,0,1,0,89,0,100,2,125,8,126,8,1,0,121,2,
+ 100,2,125,8,126,8,119,1,119,0,120,3,89,0,119,1,
+ 35,0,116,16,0,0,0,0,0,0,0,0,36,0,114,33,
+ 125,8,116,18,0,0,0,0,0,0,0,0,106,21,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 100,1,124,1,124,8,171,3,0,0,0,0,0,0,1,0,
+ 89,0,100,2,125,8,126,8,121,2,100,2,125,8,126,8,
+ 119,1,119,0,120,3,89,0,119,1,41,4,122,27,87,114,
+ 105,116,101,32,98,121,116,101,115,32,100,97,116,97,32,116,
+ 111,32,97,32,102,105,108,101,46,122,27,99,111,117,108,100,
+ 32,110,111,116,32,99,114,101,97,116,101,32,123,33,114,125,
+ 58,32,123,33,114,125,78,122,12,99,114,101,97,116,101,100,
+ 32,123,33,114,125,41,12,114,81,0,0,0,114,96,0,0,
+ 0,114,64,0,0,0,218,8,114,101,118,101,114,115,101,100,
+ 114,72,0,0,0,114,23,0,0,0,218,5,109,107,100,105,
+ 114,218,15,70,105,108,101,69,120,105,115,116,115,69,114,114,
+ 111,114,114,87,0,0,0,114,208,0,0,0,114,216,0,0,
+ 0,114,122,0,0,0,41,9,114,190,0,0,0,114,68,0,
+ 0,0,114,48,0,0,0,114,157,1,0,0,218,6,112,97,
+ 114,101,110,116,114,152,0,0,0,114,66,0,0,0,114,74,
+ 0,0,0,114,32,1,0,0,115,9,0,0,0,32,32,32,
+ 32,32,32,32,32,32,114,10,0,0,0,114,94,1,0,0,
+ 122,25,83,111,117,114,99,101,70,105,108,101,76,111,97,100,
+ 101,114,46,115,101,116,95,100,97,116,97,192,4,0,0,115,
+ 251,0,0,0,128,0,228,27,38,160,116,211,27,44,209,8,
+ 24,136,6,144,8,216,21,23,136,10,225,14,20,156,91,168,
+ 22,212,29,48,220,27,38,160,118,211,27,46,137,76,136,70,
+ 144,68,216,12,22,215,12,29,209,12,29,152,100,212,12,35,
+ 241,5,0,15,21,156,91,168,22,213,29,48,244,8,0,21,
+ 29,152,90,214,20,40,136,68,220,21,31,160,6,168,4,211,
+ 21,45,136,70,240,2,10,13,23,220,16,19,151,9,145,9,
+ 152,38,213,16,33,240,7,0,21,41,240,26,6,9,45,220,
+ 12,25,152,36,160,4,160,101,212,12,44,220,12,22,215,12,
+ 39,209,12,39,168,14,184,4,213,12,61,248,244,23,0,20,
+ 35,242,0,2,13,25,225,16,24,220,19,26,242,0,5,13,
+ 23,244,6,0,17,27,215,16,43,209,16,43,208,44,73,216,
+ 44,50,176,67,244,3,1,17,57,229,16,22,251,240,11,5,
+ 13,23,251,244,18,0,16,23,242,0,3,9,45,228,12,22,
+ 215,12,39,209,12,39,208,40,69,192,116,216,40,43,247,3,
+ 1,13,45,241,0,1,13,45,251,240,5,3,9,45,250,115,
+ 54,0,0,0,193,38,21,66,34,2,193,62,35,67,26,0,
+ 194,34,9,67,23,5,194,45,8,67,23,5,194,53,23,67,
+ 18,5,195,18,5,67,23,5,195,26,9,68,4,3,195,35,
+ 23,67,63,3,195,63,5,68,4,3,78,41,7,114,197,0,
+ 0,0,114,196,0,0,0,114,198,0,0,0,114,199,0,0,
+ 0,114,92,1,0,0,114,96,1,0,0,114,94,1,0,0,
+ 114,30,0,0,0,114,28,0,0,0,114,10,0,0,0,114,
+ 151,1,0,0,114,151,1,0,0,178,4,0,0,115,25,0,
+ 0,0,132,0,225,4,72,242,4,3,5,58,242,10,3,5,
+ 62,240,10,0,45,50,245,0,28,5,45,114,28,0,0,0,
+ 114,151,1,0,0,99,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,0,0,0,243,28,0,0,0,151,
+ 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,132,
+ 0,90,4,100,3,132,0,90,5,121,4,41,5,218,20,83,
+ 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+ 100,101,114,122,45,76,111,97,100,101,114,32,119,104,105,99,
+ 104,32,104,97,110,100,108,101,115,32,115,111,117,114,99,101,
+ 108,101,115,115,32,102,105,108,101,32,105,109,112,111,114,116,
+ 115,46,99,2,0,0,0,0,0,0,0,0,0,0,0,5,
+ 0,0,0,3,0,0,0,243,158,0,0,0,151,0,124,0,
+ 106,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,124,1,171,1,0,0,0,0,0,0,125,2,
+ 124,0,106,3,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,0,
+ 125,3,124,1,124,2,100,1,156,2,125,4,116,5,0,0,
+ 0,0,0,0,0,0,124,3,124,1,124,4,171,3,0,0,
+ 0,0,0,0,1,0,116,7,0,0,0,0,0,0,0,0,
+ 116,9,0,0,0,0,0,0,0,0,124,3,171,1,0,0,
+ 0,0,0,0,100,2,100,0,26,0,124,1,124,2,172,3,
+ 171,3,0,0,0,0,0,0,83,0,41,4,78,114,230,0,
+ 0,0,114,212,0,0,0,41,2,114,188,0,0,0,114,174,
+ 0,0,0,41,5,114,8,1,0,0,114,99,1,0,0,114,
+ 220,0,0,0,114,238,0,0,0,114,110,1,0,0,41,5,
+ 114,190,0,0,0,114,43,1,0,0,114,68,0,0,0,114,
+ 48,0,0,0,114,218,0,0,0,115,5,0,0,0,32,32,
+ 32,32,32,114,10,0,0,0,114,77,1,0,0,122,29,83,
+ 111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,97,
+ 100,101,114,46,103,101,116,95,99,111,100,101,227,4,0,0,
+ 115,95,0,0,0,128,0,216,15,19,215,15,32,209,15,32,
+ 160,24,211,15,42,136,4,216,15,19,143,125,137,125,152,84,
+ 211,15,34,136,4,240,8,0,21,29,216,20,24,241,5,3,
+ 23,10,136,11,244,8,0,9,22,144,100,152,72,160,107,212,
+ 8,50,220,15,32,220,12,22,144,116,211,12,28,152,82,152,
+ 83,208,12,33,216,17,25,216,26,30,244,7,4,16,10,240,
+ 0,4,9,10,114,28,0,0,0,99,2,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,3,0,0,0,243,4,
+ 0,0,0,151,0,121,1,41,2,122,39,82,101,116,117,114,
+ 110,32,78,111,110,101,32,97,115,32,116,104,101,114,101,32,
+ 105,115,32,110,111,32,115,111,117,114,99,101,32,99,111,100,
+ 101,46,78,114,30,0,0,0,114,84,1,0,0,115,2,0,
+ 0,0,32,32,114,10,0,0,0,114,100,1,0,0,122,31,
+ 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
+ 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,243,
+ 4,0,0,243,5,0,0,0,128,0,224,15,19,114,28,0,
+ 0,0,78,41,6,114,197,0,0,0,114,196,0,0,0,114,
+ 198,0,0,0,114,199,0,0,0,114,77,1,0,0,114,100,
+ 1,0,0,114,30,0,0,0,114,28,0,0,0,114,10,0,
+ 0,0,114,164,1,0,0,114,164,1,0,0,223,4,0,0,
+ 115,15,0,0,0,132,0,225,4,55,242,4,14,5,10,243,
+ 32,2,5,20,114,28,0,0,0,114,164,1,0,0,99,0,
+ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,
+ 0,0,0,243,80,0,0,0,151,0,101,0,90,1,100,0,
+ 90,2,100,1,90,3,100,2,132,0,90,4,100,3,132,0,
+ 90,5,100,4,132,0,90,6,100,5,132,0,90,7,100,6,
+ 132,0,90,8,100,7,132,0,90,9,100,8,132,0,90,10,
+ 100,9,132,0,90,11,101,12,100,10,132,0,171,0,0,0,
+ 0,0,0,0,90,13,121,11,41,12,114,142,1,0,0,122,
+ 93,76,111,97,100,101,114,32,102,111,114,32,101,120,116,101,
+ 110,115,105,111,110,32,109,111,100,117,108,101,115,46,10,10,
+ 32,32,32,32,84,104,101,32,99,111,110,115,116,114,117,99,
+ 116,111,114,32,105,115,32,100,101,115,105,103,110,101,100,32,
+ 116,111,32,119,111,114,107,32,119,105,116,104,32,70,105,108,
+ 101,70,105,110,100,101,114,46,10,10,32,32,32,32,99,3,
+ 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,
+ 0,0,0,243,32,0,0,0,151,0,124,1,124,0,95,0,
+ 0,0,0,0,0,0,0,0,124,2,124,0,95,1,0,0,
+ 0,0,0,0,0,0,121,0,114,77,0,0,0,114,230,0,
+ 0,0,41,3,114,190,0,0,0,114,188,0,0,0,114,68,
+ 0,0,0,115,3,0,0,0,32,32,32,114,10,0,0,0,
+ 114,68,1,0,0,122,28,69,120,116,101,110,115,105,111,110,
+ 70,105,108,101,76,111,97,100,101,114,46,95,95,105,110,105,
+ 116,95,95,0,5,0,0,115,16,0,0,0,128,0,216,20,
+ 24,136,4,140,9,216,20,24,136,4,141,9,114,28,0,0,
+ 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
+ 0,0,3,0,0,0,243,106,0,0,0,151,0,124,0,106,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,1,106,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,107,40,0,0,120,1,114,
+ 25,1,0,124,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,106,2,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,
+ 40,0,0,83,0,114,77,0,0,0,114,123,1,0,0,114,
+ 125,1,0,0,115,2,0,0,0,32,32,114,10,0,0,0,
+ 114,127,1,0,0,122,26,69,120,116,101,110,115,105,111,110,
+ 70,105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,
+ 95,4,5,0,0,114,128,1,0,0,114,28,0,0,0,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
+ 3,0,0,0,243,88,0,0,0,151,0,116,1,0,0,0,
0,0,0,0,0,124,0,106,2,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,171,1,0,0,0,
- 0,0,0,100,1,25,0,0,0,138,2,116,5,0,0,0,
- 0,0,0,0,0,136,2,102,1,100,2,132,8,116,6,0,
- 0,0,0,0,0,0,0,68,0,171,0,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,83,0,41,3,122,49,82,
- 101,116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,
- 101,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
- 108,101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,
- 114,6,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,4,0,0,0,51,0,0,0,243,46,0,0,0,149,
- 1,75,0,1,0,151,0,124,0,93,12,0,0,125,1,137,
- 2,100,0,124,1,122,0,0,0,107,40,0,0,150,1,151,
- 1,1,0,140,14,4,0,121,1,173,3,119,1,41,2,114,
- 67,1,0,0,78,114,30,0,0,0,41,3,114,8,0,0,
- 0,218,6,115,117,102,102,105,120,218,9,102,105,108,101,95,
- 110,97,109,101,115,3,0,0,0,32,32,128,114,10,0,0,
- 0,114,11,0,0,0,122,49,69,120,116,101,110,115,105,111,
- 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,
- 97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,
- 60,103,101,110,101,120,112,114,62,24,5,0,0,115,35,0,
- 0,0,248,232,0,248,128,0,240,0,1,19,53,217,33,51,
- 144,118,240,3,0,20,29,160,10,168,86,209,32,51,213,19,
- 51,217,33,51,249,115,4,0,0,0,131,18,21,1,41,4,
- 114,81,0,0,0,114,68,0,0,0,218,3,97,110,121,114,
- 61,1,0,0,41,3,114,189,0,0,0,114,42,1,0,0,
- 114,179,1,0,0,115,3,0,0,0,32,32,64,114,10,0,
- 0,0,114,10,1,0,0,122,30,69,120,116,101,110,115,105,
- 111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,
- 112,97,99,107,97,103,101,21,5,0,0,115,48,0,0,0,
- 248,128,0,228,20,31,160,4,167,9,161,9,211,20,42,168,
- 49,209,20,45,136,9,220,15,18,243,0,1,19,53,221,33,
- 51,243,3,1,19,53,243,0,1,16,53,240,0,1,9,53,
- 114,28,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,3,0,0,0,243,4,0,0,0,151,
- 0,121,1,41,2,122,63,82,101,116,117,114,110,32,78,111,
- 110,101,32,97,115,32,97,110,32,101,120,116,101,110,115,105,
- 111,110,32,109,111,100,117,108,101,32,99,97,110,110,111,116,
- 32,99,114,101,97,116,101,32,97,32,99,111,100,101,32,111,
- 98,106,101,99,116,46,78,114,30,0,0,0,114,83,1,0,
- 0,115,2,0,0,0,32,32,114,10,0,0,0,114,76,1,
- 0,0,122,28,69,120,116,101,110,115,105,111,110,70,105,108,
- 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,
- 27,5,0,0,114,166,1,0,0,114,28,0,0,0,99,2,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
- 0,0,0,243,4,0,0,0,151,0,121,1,41,2,122,53,
- 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,101,
- 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,
- 32,104,97,118,101,32,110,111,32,115,111,117,114,99,101,32,
- 99,111,100,101,46,78,114,30,0,0,0,114,83,1,0,0,
- 115,2,0,0,0,32,32,114,10,0,0,0,114,99,1,0,
- 0,122,30,69,120,116,101,110,115,105,111,110,70,105,108,101,
- 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,
- 101,31,5,0,0,114,166,1,0,0,114,28,0,0,0,99,
- 2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
- 3,0,0,0,243,26,0,0,0,151,0,124,0,106,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,83,0,114,137,1,0,0,114,84,0,0,0,114,83,1,
- 0,0,115,2,0,0,0,32,32,114,10,0,0,0,114,7,
- 1,0,0,122,32,69,120,116,101,110,115,105,111,110,70,105,
- 108,101,76,111,97,100,101,114,46,103,101,116,95,102,105,108,
- 101,110,97,109,101,35,5,0,0,114,138,1,0,0,114,28,
- 0,0,0,78,41,14,114,196,0,0,0,114,195,0,0,0,
- 114,197,0,0,0,114,198,0,0,0,114,67,1,0,0,114,
- 126,1,0,0,114,132,1,0,0,114,73,1,0,0,114,80,
- 1,0,0,114,10,1,0,0,114,76,1,0,0,114,99,1,
- 0,0,114,208,0,0,0,114,7,1,0,0,114,30,0,0,
- 0,114,28,0,0,0,114,10,0,0,0,114,141,1,0,0,
- 114,141,1,0,0,244,4,0,0,115,67,0,0,0,132,0,
- 241,4,4,5,8,242,12,2,5,25,242,8,2,5,49,242,
- 8,1,5,49,242,6,6,5,22,242,16,4,5,47,242,12,
- 4,5,53,242,12,2,5,20,242,8,2,5,20,240,8,0,
- 6,17,241,2,2,5,25,243,3,0,6,17,241,2,2,5,
- 25,114,28,0,0,0,114,141,1,0,0,99,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
- 243,86,0,0,0,151,0,101,0,90,1,100,0,90,2,100,
- 1,90,3,100,2,90,4,100,3,132,0,90,5,100,4,132,
- 0,90,6,100,5,132,0,90,7,100,6,132,0,90,8,100,
- 7,132,0,90,9,100,8,132,0,90,10,100,9,132,0,90,
- 11,100,10,132,0,90,12,100,11,132,0,90,13,100,12,132,
- 0,90,14,100,13,132,0,90,15,121,14,41,15,218,14,95,
- 78,97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,
- 0,0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,
- 97,109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,
- 39,115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,
- 115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,
- 101,10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,
- 115,32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,
- 32,97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,
- 105,116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,
- 112,97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,
- 97,116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,
- 115,32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,
- 111,100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,
- 32,105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,
- 32,32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,
- 105,110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,
- 108,101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,
- 104,101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,
- 39,115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,
- 121,115,46,112,97,116,104,46,114,1,0,0,0,99,4,0,
- 0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,
- 0,0,243,140,0,0,0,151,0,124,1,124,0,95,0,0,
- 0,0,0,0,0,0,0,124,2,124,0,95,1,0,0,0,
- 0,0,0,0,0,116,5,0,0,0,0,0,0,0,0,124,
- 0,106,7,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,171,0,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,124,0,95,4,0,0,0,0,0,0,0,
- 0,124,0,106,10,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,0,95,6,0,0,0,0,0,
- 0,0,0,124,3,124,0,95,7,0,0,0,0,0,0,0,
- 0,121,0,114,77,0,0,0,41,8,218,5,95,110,97,109,
- 101,218,5,95,112,97,116,104,114,179,0,0,0,218,16,95,
- 103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,218,
- 17,95,108,97,115,116,95,112,97,114,101,110,116,95,112,97,
- 116,104,218,6,95,101,112,111,99,104,218,11,95,108,97,115,
- 116,95,101,112,111,99,104,218,12,95,112,97,116,104,95,102,
- 105,110,100,101,114,169,4,114,189,0,0,0,114,187,0,0,
- 0,114,68,0,0,0,218,11,112,97,116,104,95,102,105,110,
- 100,101,114,115,4,0,0,0,32,32,32,32,114,10,0,0,
- 0,114,67,1,0,0,122,23,95,78,97,109,101,115,112,97,
- 99,101,80,97,116,104,46,95,95,105,110,105,116,95,95,52,
- 5,0,0,115,58,0,0,0,128,0,216,21,25,136,4,140,
- 10,216,21,25,136,4,140,10,220,33,38,160,116,215,39,60,
- 209,39,60,211,39,62,211,33,63,136,4,212,8,30,216,27,
- 31,159,59,153,59,136,4,212,8,24,216,28,39,136,4,213,
- 8,25,114,28,0,0,0,99,1,0,0,0,0,0,0,0,
- 0,0,0,0,3,0,0,0,3,0,0,0,243,84,0,0,
- 0,151,0,124,0,106,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,106,3,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,100,1,171,
- 1,0,0,0,0,0,0,92,3,0,0,125,1,125,2,125,
- 3,124,2,100,2,107,40,0,0,114,1,121,3,124,1,100,
- 4,102,2,83,0,41,5,122,62,82,101,116,117,114,110,115,
- 32,97,32,116,117,112,108,101,32,111,102,32,40,112,97,114,
- 101,110,116,45,109,111,100,117,108,101,45,110,97,109,101,44,
- 32,112,97,114,101,110,116,45,112,97,116,104,45,97,116,116,
- 114,45,110,97,109,101,41,114,103,0,0,0,114,12,0,0,
- 0,41,2,114,20,0,0,0,114,68,0,0,0,218,8,95,
- 95,112,97,116,104,95,95,41,2,114,187,1,0,0,114,131,
- 0,0,0,41,4,114,189,0,0,0,114,161,1,0,0,218,
- 3,100,111,116,218,2,109,101,115,4,0,0,0,32,32,32,
- 32,114,10,0,0,0,218,23,95,102,105,110,100,95,112,97,
- 114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,122,
- 38,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
- 95,102,105,110,100,95,112,97,114,101,110,116,95,112,97,116,
- 104,95,110,97,109,101,115,59,5,0,0,115,51,0,0,0,
- 128,0,224,26,30,159,42,153,42,215,26,47,209,26,47,176,
- 3,211,26,52,137,15,136,6,144,3,144,82,216,11,14,144,
- 34,138,57,224,19,32,240,6,0,16,22,144,122,208,15,33,
- 208,8,33,114,28,0,0,0,99,1,0,0,0,0,0,0,
- 0,0,0,0,0,4,0,0,0,3,0,0,0,243,98,0,
- 0,0,151,0,124,0,106,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,
- 0,0,92,2,0,0,125,1,125,2,116,3,0,0,0,0,
- 0,0,0,0,116,4,0,0,0,0,0,0,0,0,106,6,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,1,25,0,0,0,124,2,171,2,0,0,0,0,
- 0,0,83,0,114,77,0,0,0,41,4,114,200,1,0,0,
- 114,201,0,0,0,114,20,0,0,0,218,7,109,111,100,117,
- 108,101,115,41,3,114,189,0,0,0,218,18,112,97,114,101,
- 110,116,95,109,111,100,117,108,101,95,110,97,109,101,218,14,
- 112,97,116,104,95,97,116,116,114,95,110,97,109,101,115,3,
- 0,0,0,32,32,32,114,10,0,0,0,114,189,1,0,0,
- 122,31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,
- 46,95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,
- 104,69,5,0,0,115,45,0,0,0,128,0,216,45,49,215,
- 45,73,209,45,73,211,45,75,209,8,42,208,8,26,152,78,
- 220,15,22,148,115,151,123,145,123,208,35,53,209,23,54,184,
- 14,211,15,71,208,8,71,114,28,0,0,0,99,1,0,0,
- 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
- 0,243,90,1,0,0,151,0,116,1,0,0,0,0,0,0,
- 0,0,124,0,106,3,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,
- 171,1,0,0,0,0,0,0,125,1,124,1,124,0,106,4,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,107,55,0,0,115,25,124,0,106,6,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
- 106,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,107,55,0,0,114,95,124,0,106,11,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 124,0,106,12,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,124,1,171,2,0,0,0,0,0,0,
- 125,2,124,2,129,41,124,2,106,14,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,128,29,124,2,
- 106,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,114,17,124,2,106,16,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,0,95,9,
- 0,0,0,0,0,0,0,0,124,1,124,0,95,2,0,0,
- 0,0,0,0,0,0,124,0,106,6,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,0,95,4,
- 0,0,0,0,0,0,0,0,124,0,106,18,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,0,
- 114,77,0,0,0,41,10,114,179,0,0,0,114,189,1,0,
- 0,114,190,1,0,0,114,191,1,0,0,114,192,1,0,0,
- 114,193,1,0,0,114,187,1,0,0,114,4,1,0,0,114,
- 5,1,0,0,114,188,1,0,0,41,3,114,189,0,0,0,
- 218,11,112,97,114,101,110,116,95,112,97,116,104,114,16,1,
- 0,0,115,3,0,0,0,32,32,32,114,10,0,0,0,218,
- 12,95,114,101,99,97,108,99,117,108,97,116,101,122,27,95,
- 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,
- 101,99,97,108,99,117,108,97,116,101,73,5,0,0,115,143,
- 0,0,0,128,0,228,22,27,152,68,215,28,49,209,28,49,
- 211,28,51,211,22,52,136,11,216,11,22,152,36,215,26,48,
- 209,26,48,210,11,48,176,68,183,75,177,75,192,52,215,67,
- 83,209,67,83,210,52,83,216,19,23,215,19,36,209,19,36,
- 160,84,167,90,161,90,176,27,211,19,61,136,68,240,6,0,
- 16,20,208,15,31,160,68,167,75,161,75,208,36,55,216,19,
- 23,215,19,50,210,19,50,216,33,37,215,33,64,209,33,64,
- 144,68,148,74,216,37,48,136,68,212,12,34,216,31,35,159,
- 123,153,123,136,68,212,12,28,216,15,19,143,122,137,122,208,
- 8,25,114,28,0,0,0,99,1,0,0,0,0,0,0,0,
- 0,0,0,0,4,0,0,0,3,0,0,0,243,52,0,0,
- 0,151,0,116,1,0,0,0,0,0,0,0,0,124,0,106,
- 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,171,0,0,0,0,0,0,0,171,1,0,0,0,
- 0,0,0,83,0,114,77,0,0,0,41,2,218,4,105,116,
- 101,114,114,207,1,0,0,114,131,1,0,0,115,1,0,0,
- 0,32,114,10,0,0,0,218,8,95,95,105,116,101,114,95,
- 95,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116,
- 104,46,95,95,105,116,101,114,95,95,87,5,0,0,115,22,
- 0,0,0,128,0,220,15,19,144,68,215,20,37,209,20,37,
- 211,20,39,211,15,40,208,8,40,114,28,0,0,0,99,2,
- 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,
- 0,0,0,243,40,0,0,0,151,0,124,0,106,1,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 171,0,0,0,0,0,0,0,124,1,25,0,0,0,83,0,
- 114,77,0,0,0,169,1,114,207,1,0,0,41,2,114,189,
- 0,0,0,218,5,105,110,100,101,120,115,2,0,0,0,32,
- 32,114,10,0,0,0,218,11,95,95,103,101,116,105,116,101,
- 109,95,95,122,26,95,78,97,109,101,115,112,97,99,101,80,
- 97,116,104,46,95,95,103,101,116,105,116,101,109,95,95,90,
- 5,0,0,115,22,0,0,0,128,0,216,15,19,215,15,32,
- 209,15,32,211,15,34,160,53,209,15,41,208,8,41,114,28,
- 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0,
- 3,0,0,0,3,0,0,0,243,34,0,0,0,151,0,124,
- 2,124,0,106,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,1,60,0,0,0,121,0,114,
- 77,0,0,0,169,1,114,188,1,0,0,41,3,114,189,0,
- 0,0,114,213,1,0,0,114,68,0,0,0,115,3,0,0,
- 0,32,32,32,114,10,0,0,0,218,11,95,95,115,101,116,
- 105,116,101,109,95,95,122,26,95,78,97,109,101,115,112,97,
- 99,101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,
- 95,95,93,5,0,0,115,16,0,0,0,128,0,216,28,32,
- 136,4,143,10,137,10,144,53,210,8,25,114,28,0,0,0,
- 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
- 0,3,0,0,0,243,52,0,0,0,151,0,116,1,0,0,
- 0,0,0,0,0,0,124,0,106,3,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,
- 0,0,0,0,171,1,0,0,0,0,0,0,83,0,114,77,
- 0,0,0,41,2,114,7,0,0,0,114,207,1,0,0,114,
- 131,1,0,0,115,1,0,0,0,32,114,10,0,0,0,218,
- 7,95,95,108,101,110,95,95,122,22,95,78,97,109,101,115,
- 112,97,99,101,80,97,116,104,46,95,95,108,101,110,95,95,
- 96,5,0,0,115,22,0,0,0,128,0,220,15,18,144,52,
- 215,19,36,209,19,36,211,19,38,211,15,39,208,8,39,114,
- 28,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
- 0,3,0,0,0,3,0,0,0,243,34,0,0,0,151,0,
- 100,1,124,0,106,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,155,2,100,2,157,3,83,0,
- 41,3,78,122,15,95,78,97,109,101,115,112,97,99,101,80,
- 97,116,104,40,218,1,41,114,216,1,0,0,114,131,1,0,
- 0,115,1,0,0,0,32,114,10,0,0,0,218,8,95,95,
- 114,101,112,114,95,95,122,23,95,78,97,109,101,115,112,97,
- 99,101,80,97,116,104,46,95,95,114,101,112,114,95,95,99,
- 5,0,0,115,21,0,0,0,128,0,216,17,32,160,20,167,
- 26,161,26,160,14,168,97,208,15,48,208,8,48,114,28,0,
- 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
- 0,0,0,3,0,0,0,243,38,0,0,0,151,0,124,1,
- 124,0,106,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,171,0,0,0,0,0,0,0,118,0,
- 83,0,114,77,0,0,0,114,212,1,0,0,169,2,114,189,
- 0,0,0,218,4,105,116,101,109,115,2,0,0,0,32,32,
- 114,10,0,0,0,218,12,95,95,99,111,110,116,97,105,110,
- 115,95,95,122,27,95,78,97,109,101,115,112,97,99,101,80,
- 97,116,104,46,95,95,99,111,110,116,97,105,110,115,95,95,
- 102,5,0,0,115,22,0,0,0,128,0,216,15,19,144,116,
- 215,23,40,209,23,40,211,23,42,208,15,42,208,8,42,114,
- 28,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,
- 0,3,0,0,0,3,0,0,0,243,58,0,0,0,151,0,
- 124,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,106,3,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
- 0,0,0,0,1,0,121,0,114,77,0,0,0,41,2,114,
- 188,1,0,0,114,64,0,0,0,114,224,1,0,0,115,2,
- 0,0,0,32,32,114,10,0,0,0,114,64,0,0,0,122,
- 21,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
- 97,112,112,101,110,100,105,5,0,0,115,20,0,0,0,128,
- 0,216,8,12,143,10,137,10,215,8,25,209,8,25,152,36,
- 213,8,31,114,28,0,0,0,78,41,16,114,196,0,0,0,
- 114,195,0,0,0,114,197,0,0,0,114,198,0,0,0,114,
- 191,1,0,0,114,67,1,0,0,114,200,1,0,0,114,189,
- 1,0,0,114,207,1,0,0,114,210,1,0,0,114,214,1,
- 0,0,114,217,1,0,0,114,219,1,0,0,114,222,1,0,
- 0,114,226,1,0,0,114,64,0,0,0,114,30,0,0,0,
- 114,28,0,0,0,114,10,0,0,0,114,185,1,0,0,114,
- 185,1,0,0,41,5,0,0,115,70,0,0,0,132,0,241,
- 2,4,5,20,240,16,0,14,15,128,70,242,4,5,5,40,
- 242,14,8,5,34,242,20,2,5,72,1,242,8,12,5,26,
- 242,28,1,5,41,242,6,1,5,42,242,6,1,5,33,242,
- 6,1,5,40,242,6,1,5,49,242,6,1,5,43,243,6,
- 1,5,32,114,28,0,0,0,114,185,1,0,0,99,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
- 0,0,243,60,0,0,0,151,0,101,0,90,1,100,0,90,
- 2,100,1,132,0,90,3,100,2,132,0,90,4,100,3,132,
- 0,90,5,100,4,132,0,90,6,100,5,132,0,90,7,100,
- 6,132,0,90,8,100,7,132,0,90,9,100,8,132,0,90,
- 10,121,9,41,10,218,15,78,97,109,101,115,112,97,99,101,
- 76,111,97,100,101,114,99,4,0,0,0,0,0,0,0,0,
- 0,0,0,5,0,0,0,3,0,0,0,243,40,0,0,0,
- 151,0,116,1,0,0,0,0,0,0,0,0,124,1,124,2,
- 124,3,171,3,0,0,0,0,0,0,124,0,95,1,0,0,
- 0,0,0,0,0,0,121,0,114,77,0,0,0,41,2,114,
- 185,1,0,0,114,188,1,0,0,114,194,1,0,0,115,4,
- 0,0,0,32,32,32,32,114,10,0,0,0,114,67,1,0,
- 0,122,24,78,97,109,101,115,112,97,99,101,76,111,97,100,
- 101,114,46,95,95,105,110,105,116,95,95,113,5,0,0,115,
- 18,0,0,0,128,0,220,21,35,160,68,168,36,176,11,211,
- 21,60,136,4,141,10,114,28,0,0,0,99,2,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
- 243,4,0,0,0,151,0,121,1,41,2,78,84,114,30,0,
- 0,0,114,83,1,0,0,115,2,0,0,0,32,32,114,10,
- 0,0,0,114,10,1,0,0,122,26,78,97,109,101,115,112,
- 97,99,101,76,111,97,100,101,114,46,105,115,95,112,97,99,
- 107,97,103,101,116,5,0,0,115,5,0,0,0,128,0,216,
- 15,19,114,28,0,0,0,99,2,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,3,0,0,0,243,4,0,0,
- 0,151,0,121,1,41,2,78,114,12,0,0,0,114,30,0,
- 0,0,114,83,1,0,0,115,2,0,0,0,32,32,114,10,
- 0,0,0,114,99,1,0,0,122,26,78,97,109,101,115,112,
- 97,99,101,76,111,97,100,101,114,46,103,101,116,95,115,111,
- 117,114,99,101,119,5,0,0,115,5,0,0,0,128,0,216,
- 15,17,114,28,0,0,0,99,2,0,0,0,0,0,0,0,
- 0,0,0,0,6,0,0,0,3,0,0,0,243,32,0,0,
- 0,151,0,116,1,0,0,0,0,0,0,0,0,100,1,100,
- 2,100,3,100,4,172,5,171,4,0,0,0,0,0,0,83,
- 0,41,6,78,114,12,0,0,0,122,8,60,115,116,114,105,
- 110,103,62,114,78,1,0,0,84,41,1,114,102,1,0,0,
- 41,1,114,103,1,0,0,114,83,1,0,0,115,2,0,0,
- 0,32,32,114,10,0,0,0,114,76,1,0,0,122,24,78,
- 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103,
- 101,116,95,99,111,100,101,122,5,0,0,115,19,0,0,0,
- 128,0,220,15,22,144,114,152,58,160,118,184,68,212,15,65,
- 208,8,65,114,28,0,0,0,99,2,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,3,0,0,0,243,4,0,
- 0,0,151,0,121,1,114,71,1,0,0,114,30,0,0,0,
- 114,72,1,0,0,115,2,0,0,0,32,32,114,10,0,0,
- 0,114,73,1,0,0,122,29,78,97,109,101,115,112,97,99,
- 101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,
- 111,100,117,108,101,125,5,0,0,114,74,1,0,0,114,28,
+ 0,0,0,116,1,0,0,0,0,0,0,0,0,124,0,106,
+ 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,171,1,0,0,0,0,0,0,122,12,0,0,83,
+ 0,114,77,0,0,0,114,130,1,0,0,114,132,1,0,0,
+ 115,1,0,0,0,32,114,10,0,0,0,114,133,1,0,0,
+ 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76,
+ 111,97,100,101,114,46,95,95,104,97,115,104,95,95,8,5,
+ 0,0,114,134,1,0,0,114,28,0,0,0,99,2,0,0,
+ 0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,
+ 0,243,164,0,0,0,151,0,116,0,0,0,0,0,0,0,
+ 0,0,106,3,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,116,4,0,0,0,0,0,0,0,0,
+ 106,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,124,1,171,2,0,0,0,0,0,0,125,2,
+ 116,0,0,0,0,0,0,0,0,0,106,9,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,1,
+ 124,1,106,10,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,0,106,12,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,171,3,0,0,
+ 0,0,0,0,1,0,124,2,83,0,41,2,122,40,67,114,
+ 101,97,116,101,32,97,110,32,117,110,105,110,105,116,105,97,
+ 108,105,122,101,100,32,101,120,116,101,110,115,105,111,110,32,
+ 109,111,100,117,108,101,122,38,101,120,116,101,110,115,105,111,
+ 110,32,109,111,100,117,108,101,32,123,33,114,125,32,108,111,
+ 97,100,101,100,32,102,114,111,109,32,123,33,114,125,41,7,
+ 114,208,0,0,0,114,78,1,0,0,114,235,0,0,0,218,
+ 14,99,114,101,97,116,101,95,100,121,110,97,109,105,99,114,
+ 216,0,0,0,114,188,0,0,0,114,68,0,0,0,41,3,
+ 114,190,0,0,0,114,17,1,0,0,114,80,1,0,0,115,
+ 3,0,0,0,32,32,32,114,10,0,0,0,114,74,1,0,
+ 0,122,33,69,120,116,101,110,115,105,111,110,70,105,108,101,
+ 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111,
+ 100,117,108,101,11,5,0,0,115,64,0,0,0,128,0,228,
+ 17,27,215,17,53,209,17,53,220,12,16,215,12,31,209,12,
+ 31,160,20,243,3,1,18,39,136,6,228,8,18,215,8,35,
+ 209,8,35,208,36,76,216,25,29,159,25,153,25,160,68,167,
+ 73,161,73,244,3,1,9,47,224,15,21,136,13,114,28,0,
+ 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,5,
+ 0,0,0,3,0,0,0,243,162,0,0,0,151,0,116,0,
+ 0,0,0,0,0,0,0,0,106,3,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,116,4,0,0,
+ 0,0,0,0,0,0,106,6,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,1,171,2,0,0,
+ 0,0,0,0,1,0,116,0,0,0,0,0,0,0,0,0,
+ 106,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,1,124,0,106,10,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,124,0,106,12,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,171,3,0,0,0,0,0,0,1,0,121,2,41,3,
+ 122,30,73,110,105,116,105,97,108,105,122,101,32,97,110,32,
+ 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+ 122,40,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
+ 108,101,32,123,33,114,125,32,101,120,101,99,117,116,101,100,
+ 32,102,114,111,109,32,123,33,114,125,78,41,7,114,208,0,
+ 0,0,114,78,1,0,0,114,235,0,0,0,218,12,101,120,
+ 101,99,95,100,121,110,97,109,105,99,114,216,0,0,0,114,
+ 188,0,0,0,114,68,0,0,0,169,2,114,190,0,0,0,
+ 114,80,1,0,0,115,2,0,0,0,32,32,114,10,0,0,
+ 0,114,81,1,0,0,122,31,69,120,116,101,110,115,105,111,
+ 110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99,
+ 95,109,111,100,117,108,101,19,5,0,0,115,54,0,0,0,
+ 128,0,228,8,18,215,8,44,209,8,44,172,84,215,45,62,
+ 209,45,62,192,6,212,8,71,220,8,18,215,8,35,209,8,
+ 35,208,36,78,216,25,29,159,25,153,25,160,68,167,73,161,
+ 73,245,3,1,9,47,114,28,0,0,0,99,2,0,0,0,
+ 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,
+ 243,100,0,0,0,135,2,151,0,116,1,0,0,0,0,0,
+ 0,0,0,124,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,171,1,0,0,0,0,0,
+ 0,100,1,25,0,0,0,138,2,116,5,0,0,0,0,0,
+ 0,0,0,136,2,102,1,100,2,132,8,116,6,0,0,0,
+ 0,0,0,0,0,68,0,171,0,0,0,0,0,0,0,171,
+ 1,0,0,0,0,0,0,83,0,41,3,122,49,82,101,116,
+ 117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,
+ 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+ 32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,6,
+ 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
+ 4,0,0,0,51,0,0,0,243,46,0,0,0,149,1,75,
+ 0,1,0,151,0,124,0,93,12,0,0,125,1,137,2,100,
+ 0,124,1,122,0,0,0,107,40,0,0,150,1,151,1,1,
+ 0,140,14,4,0,121,1,173,3,119,1,41,2,114,68,1,
+ 0,0,78,114,30,0,0,0,41,3,114,8,0,0,0,218,
+ 6,115,117,102,102,105,120,218,9,102,105,108,101,95,110,97,
+ 109,101,115,3,0,0,0,32,32,128,114,10,0,0,0,114,
+ 11,0,0,0,122,49,69,120,116,101,110,115,105,111,110,70,
+ 105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,99,
+ 107,97,103,101,46,60,108,111,99,97,108,115,62,46,60,103,
+ 101,110,101,120,112,114,62,28,5,0,0,115,35,0,0,0,
+ 248,232,0,248,128,0,240,0,1,19,53,217,33,51,144,118,
+ 240,3,0,20,29,160,10,168,86,209,32,51,213,19,51,217,
+ 33,51,249,115,4,0,0,0,131,18,21,1,41,4,114,81,
+ 0,0,0,114,68,0,0,0,218,3,97,110,121,114,62,1,
+ 0,0,41,3,114,190,0,0,0,114,43,1,0,0,114,180,
+ 1,0,0,115,3,0,0,0,32,32,64,114,10,0,0,0,
+ 114,11,1,0,0,122,30,69,120,116,101,110,115,105,111,110,
+ 70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,
+ 99,107,97,103,101,25,5,0,0,115,48,0,0,0,248,128,
+ 0,228,20,31,160,4,167,9,161,9,211,20,42,168,49,209,
+ 20,45,136,9,220,15,18,243,0,1,19,53,221,33,51,243,
+ 3,1,19,53,243,0,1,16,53,240,0,1,9,53,114,28,
0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,3,0,0,0,243,4,0,0,0,151,0,121,
- 0,114,77,0,0,0,114,30,0,0,0,114,175,1,0,0,
- 115,2,0,0,0,32,32,114,10,0,0,0,114,80,1,0,
- 0,122,27,78,97,109,101,115,112,97,99,101,76,111,97,100,
- 101,114,46,101,120,101,99,95,109,111,100,117,108,101,128,5,
- 0,0,115,5,0,0,0,128,0,216,8,12,114,28,0,0,
- 0,99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,
- 0,0,3,0,0,0,243,110,0,0,0,151,0,116,0,0,
+ 1,41,2,122,63,82,101,116,117,114,110,32,78,111,110,101,
+ 32,97,115,32,97,110,32,101,120,116,101,110,115,105,111,110,
+ 32,109,111,100,117,108,101,32,99,97,110,110,111,116,32,99,
+ 114,101,97,116,101,32,97,32,99,111,100,101,32,111,98,106,
+ 101,99,116,46,78,114,30,0,0,0,114,84,1,0,0,115,
+ 2,0,0,0,32,32,114,10,0,0,0,114,77,1,0,0,
+ 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76,
+ 111,97,100,101,114,46,103,101,116,95,99,111,100,101,31,5,
+ 0,0,114,167,1,0,0,114,28,0,0,0,99,2,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+ 0,243,4,0,0,0,151,0,121,1,41,2,122,53,82,101,
+ 116,117,114,110,32,78,111,110,101,32,97,115,32,101,120,116,
+ 101,110,115,105,111,110,32,109,111,100,117,108,101,115,32,104,
+ 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111,
+ 100,101,46,78,114,30,0,0,0,114,84,1,0,0,115,2,
+ 0,0,0,32,32,114,10,0,0,0,114,100,1,0,0,122,
+ 30,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,
+ 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,35,
+ 5,0,0,114,167,1,0,0,114,28,0,0,0,99,2,0,
+ 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,
+ 0,0,243,26,0,0,0,151,0,124,0,106,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,
+ 0,114,138,1,0,0,114,84,0,0,0,114,84,1,0,0,
+ 115,2,0,0,0,32,32,114,10,0,0,0,114,8,1,0,
+ 0,122,32,69,120,116,101,110,115,105,111,110,70,105,108,101,
+ 76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,110,
+ 97,109,101,39,5,0,0,114,139,1,0,0,114,28,0,0,
+ 0,78,41,14,114,197,0,0,0,114,196,0,0,0,114,198,
+ 0,0,0,114,199,0,0,0,114,68,1,0,0,114,127,1,
+ 0,0,114,133,1,0,0,114,74,1,0,0,114,81,1,0,
+ 0,114,11,1,0,0,114,77,1,0,0,114,100,1,0,0,
+ 114,209,0,0,0,114,8,1,0,0,114,30,0,0,0,114,
+ 28,0,0,0,114,10,0,0,0,114,142,1,0,0,114,142,
+ 1,0,0,248,4,0,0,115,67,0,0,0,132,0,241,4,
+ 4,5,8,242,12,2,5,25,242,8,2,5,49,242,8,1,
+ 5,49,242,6,6,5,22,242,16,4,5,47,242,12,4,5,
+ 53,242,12,2,5,20,242,8,2,5,20,240,8,0,6,17,
+ 241,2,2,5,25,243,3,0,6,17,241,2,2,5,25,114,
+ 28,0,0,0,114,142,1,0,0,99,0,0,0,0,0,0,
+ 0,0,0,0,0,0,1,0,0,0,0,0,0,0,243,86,
+ 0,0,0,151,0,101,0,90,1,100,0,90,2,100,1,90,
+ 3,100,2,90,4,100,3,132,0,90,5,100,4,132,0,90,
+ 6,100,5,132,0,90,7,100,6,132,0,90,8,100,7,132,
+ 0,90,9,100,8,132,0,90,10,100,9,132,0,90,11,100,
+ 10,132,0,90,12,100,11,132,0,90,13,100,12,132,0,90,
+ 14,100,13,132,0,90,15,121,14,41,15,218,14,95,78,97,
+ 109,101,115,112,97,99,101,80,97,116,104,97,38,1,0,0,
+ 82,101,112,114,101,115,101,110,116,115,32,97,32,110,97,109,
+ 101,115,112,97,99,101,32,112,97,99,107,97,103,101,39,115,
+ 32,112,97,116,104,46,32,32,73,116,32,117,115,101,115,32,
+ 116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,10,
+ 32,32,32,32,116,111,32,102,105,110,100,32,105,116,115,32,
+ 112,97,114,101,110,116,32,109,111,100,117,108,101,44,32,97,
+ 110,100,32,102,114,111,109,32,116,104,101,114,101,32,105,116,
+ 32,108,111,111,107,115,32,117,112,32,116,104,101,32,112,97,
+ 114,101,110,116,39,115,10,32,32,32,32,95,95,112,97,116,
+ 104,95,95,46,32,32,87,104,101,110,32,116,104,105,115,32,
+ 99,104,97,110,103,101,115,44,32,116,104,101,32,109,111,100,
+ 117,108,101,39,115,32,111,119,110,32,112,97,116,104,32,105,
+ 115,32,114,101,99,111,109,112,117,116,101,100,44,10,32,32,
+ 32,32,117,115,105,110,103,32,112,97,116,104,95,102,105,110,
+ 100,101,114,46,32,32,70,111,114,32,116,111,112,45,108,101,
+ 118,101,108,32,109,111,100,117,108,101,115,44,32,116,104,101,
+ 32,112,97,114,101,110,116,32,109,111,100,117,108,101,39,115,
+ 32,112,97,116,104,10,32,32,32,32,105,115,32,115,121,115,
+ 46,112,97,116,104,46,114,1,0,0,0,99,4,0,0,0,
+ 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,
+ 243,140,0,0,0,151,0,124,1,124,0,95,0,0,0,0,
+ 0,0,0,0,0,124,2,124,0,95,1,0,0,0,0,0,
+ 0,0,0,116,5,0,0,0,0,0,0,0,0,124,0,106,
+ 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,171,0,0,0,0,0,0,0,171,1,0,0,0,
+ 0,0,0,124,0,95,4,0,0,0,0,0,0,0,0,124,
+ 0,106,10,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,124,0,95,6,0,0,0,0,0,0,0,
+ 0,124,3,124,0,95,7,0,0,0,0,0,0,0,0,121,
+ 0,114,77,0,0,0,41,8,218,5,95,110,97,109,101,218,
+ 5,95,112,97,116,104,114,180,0,0,0,218,16,95,103,101,
+ 116,95,112,97,114,101,110,116,95,112,97,116,104,218,17,95,
+ 108,97,115,116,95,112,97,114,101,110,116,95,112,97,116,104,
+ 218,6,95,101,112,111,99,104,218,11,95,108,97,115,116,95,
+ 101,112,111,99,104,218,12,95,112,97,116,104,95,102,105,110,
+ 100,101,114,169,4,114,190,0,0,0,114,188,0,0,0,114,
+ 68,0,0,0,218,11,112,97,116,104,95,102,105,110,100,101,
+ 114,115,4,0,0,0,32,32,32,32,114,10,0,0,0,114,
+ 68,1,0,0,122,23,95,78,97,109,101,115,112,97,99,101,
+ 80,97,116,104,46,95,95,105,110,105,116,95,95,56,5,0,
+ 0,115,58,0,0,0,128,0,216,21,25,136,4,140,10,216,
+ 21,25,136,4,140,10,220,33,38,160,116,215,39,60,209,39,
+ 60,211,39,62,211,33,63,136,4,212,8,30,216,27,31,159,
+ 59,153,59,136,4,212,8,24,216,28,39,136,4,213,8,25,
+ 114,28,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
+ 0,0,3,0,0,0,3,0,0,0,243,84,0,0,0,151,
+ 0,124,0,106,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,106,3,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,100,1,124,0,106,
- 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,171,2,0,0,0,0,0,0,1,0,116,0,0,
- 0,0,0,0,0,0,0,106,7,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,0,124,1,171,
- 2,0,0,0,0,0,0,83,0,41,2,122,98,76,111,97,
- 100,32,97,32,110,97,109,101,115,112,97,99,101,32,109,111,
- 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,
- 104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,
- 112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,
- 120,101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,
- 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,122,
- 38,110,97,109,101,115,112,97,99,101,32,109,111,100,117,108,
- 101,32,108,111,97,100,101,100,32,119,105,116,104,32,112,97,
- 116,104,32,123,33,114,125,41,4,114,207,0,0,0,114,215,
- 0,0,0,114,188,1,0,0,114,82,1,0,0,114,83,1,
- 0,0,115,2,0,0,0,32,32,114,10,0,0,0,114,84,
- 1,0,0,122,27,78,97,109,101,115,112,97,99,101,76,111,
- 97,100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,
- 131,5,0,0,115,49,0,0,0,128,0,244,14,0,9,19,
- 215,8,35,209,8,35,208,36,76,216,36,40,167,74,161,74,
- 244,3,1,9,48,244,6,0,16,26,215,15,43,209,15,43,
- 168,68,176,40,211,15,59,208,8,59,114,28,0,0,0,99,
- 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
- 3,0,0,0,243,50,0,0,0,151,0,100,1,100,2,108,
- 0,109,1,125,2,1,0,2,0,124,2,124,0,106,4,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,83,0,41,3,78,114,1,
- 0,0,0,41,1,218,15,78,97,109,101,115,112,97,99,101,
- 82,101,97,100,101,114,41,3,114,146,1,0,0,114,238,1,
- 0,0,114,188,1,0,0,41,3,114,189,0,0,0,114,79,
- 1,0,0,114,238,1,0,0,115,3,0,0,0,32,32,32,
- 114,10,0,0,0,114,147,1,0,0,122,35,78,97,109,101,
- 115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,95,
- 114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,143,
- 5,0,0,115,20,0,0,0,128,0,221,8,53,217,15,30,
- 152,116,159,122,153,122,211,15,42,208,8,42,114,28,0,0,
- 0,78,41,11,114,196,0,0,0,114,195,0,0,0,114,197,
- 0,0,0,114,67,1,0,0,114,10,1,0,0,114,99,1,
- 0,0,114,76,1,0,0,114,73,1,0,0,114,80,1,0,
- 0,114,84,1,0,0,114,147,1,0,0,114,30,0,0,0,
- 114,28,0,0,0,114,10,0,0,0,114,229,1,0,0,114,
- 229,1,0,0,112,5,0,0,115,43,0,0,0,132,0,242,
- 2,1,5,61,242,6,1,5,20,242,6,1,5,18,242,6,
- 1,5,66,1,242,6,1,5,57,242,6,1,5,13,242,6,
- 10,5,60,243,24,2,5,43,114,28,0,0,0,114,229,1,
- 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,3,
- 0,0,0,0,0,0,0,243,116,0,0,0,151,0,101,0,
- 90,1,100,0,90,2,100,1,90,3,101,4,100,2,132,0,
- 171,0,0,0,0,0,0,0,90,5,101,4,100,3,132,0,
- 171,0,0,0,0,0,0,0,90,6,101,7,100,4,132,0,
- 171,0,0,0,0,0,0,0,90,8,101,7,100,9,100,6,
- 132,1,171,0,0,0,0,0,0,0,90,9,101,7,100,10,
- 100,7,132,1,171,0,0,0,0,0,0,0,90,10,101,4,
- 100,8,132,0,171,0,0,0,0,0,0,0,90,11,121,5,
- 41,11,218,10,80,97,116,104,70,105,110,100,101,114,122,62,
- 77,101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,
- 32,102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,
- 100,32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,
- 95,95,32,97,116,116,114,105,98,117,116,101,115,46,99,0,
- 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,
- 0,0,0,243,56,1,0,0,151,0,116,1,0,0,0,0,
- 0,0,0,0,116,2,0,0,0,0,0,0,0,0,106,4,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,106,7,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,100,1,171,1,0,
+ 0,0,0,0,0,92,3,0,0,125,1,125,2,125,3,124,
+ 2,100,2,107,40,0,0,114,1,121,3,124,1,100,4,102,
+ 2,83,0,41,5,122,62,82,101,116,117,114,110,115,32,97,
+ 32,116,117,112,108,101,32,111,102,32,40,112,97,114,101,110,
+ 116,45,109,111,100,117,108,101,45,110,97,109,101,44,32,112,
+ 97,114,101,110,116,45,112,97,116,104,45,97,116,116,114,45,
+ 110,97,109,101,41,114,103,0,0,0,114,12,0,0,0,41,
+ 2,114,20,0,0,0,114,68,0,0,0,218,8,95,95,112,
+ 97,116,104,95,95,41,2,114,188,1,0,0,114,132,0,0,
+ 0,41,4,114,190,0,0,0,114,162,1,0,0,218,3,100,
+ 111,116,218,2,109,101,115,4,0,0,0,32,32,32,32,114,
+ 10,0,0,0,218,23,95,102,105,110,100,95,112,97,114,101,
+ 110,116,95,112,97,116,104,95,110,97,109,101,115,122,38,95,
+ 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,102,
+ 105,110,100,95,112,97,114,101,110,116,95,112,97,116,104,95,
+ 110,97,109,101,115,63,5,0,0,115,51,0,0,0,128,0,
+ 224,26,30,159,42,153,42,215,26,47,209,26,47,176,3,211,
+ 26,52,137,15,136,6,144,3,144,82,216,11,14,144,34,138,
+ 57,224,19,32,240,6,0,16,22,144,122,208,15,33,208,8,
+ 33,114,28,0,0,0,99,1,0,0,0,0,0,0,0,0,
+ 0,0,0,4,0,0,0,3,0,0,0,243,98,0,0,0,
+ 151,0,124,0,106,1,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,
+ 92,2,0,0,125,1,125,2,116,3,0,0,0,0,0,0,
+ 0,0,116,4,0,0,0,0,0,0,0,0,106,6,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,1,25,0,0,0,124,2,171,2,0,0,0,0,0,0,
+ 83,0,114,77,0,0,0,41,4,114,201,1,0,0,114,202,
+ 0,0,0,114,20,0,0,0,218,7,109,111,100,117,108,101,
+ 115,41,3,114,190,0,0,0,218,18,112,97,114,101,110,116,
+ 95,109,111,100,117,108,101,95,110,97,109,101,218,14,112,97,
+ 116,104,95,97,116,116,114,95,110,97,109,101,115,3,0,0,
+ 0,32,32,32,114,10,0,0,0,114,190,1,0,0,122,31,
+ 95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
+ 103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,73,
+ 5,0,0,115,45,0,0,0,128,0,216,45,49,215,45,73,
+ 209,45,73,211,45,75,209,8,42,208,8,26,152,78,220,15,
+ 22,148,115,151,123,145,123,208,35,53,209,23,54,184,14,211,
+ 15,71,208,8,71,114,28,0,0,0,99,1,0,0,0,0,
+ 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,243,
+ 90,1,0,0,151,0,116,1,0,0,0,0,0,0,0,0,
+ 124,0,106,3,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,171,0,0,0,0,0,0,0,171,1,
- 0,0,0,0,0,0,68,0,93,65,0,0,92,2,0,0,
- 125,0,125,1,124,1,129,11,116,9,0,0,0,0,0,0,
- 0,0,124,0,171,1,0,0,0,0,0,0,115,18,116,2,
- 0,0,0,0,0,0,0,0,106,4,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,0,61,0,
- 140,37,116,11,0,0,0,0,0,0,0,0,124,1,100,2,
- 171,2,0,0,0,0,0,0,115,1,140,50,124,1,106,13,
+ 0,0,0,0,0,0,125,1,124,1,124,0,106,4,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,171,0,0,0,0,0,0,0,1,0,140,67,4,0,
- 116,14,0,0,0,0,0,0,0,0,120,1,106,16,0,0,
+ 107,55,0,0,115,25,124,0,106,6,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,124,0,106,8,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 100,3,122,13,0,0,99,2,95,8,0,0,0,0,0,0,
- 0,0,100,4,100,5,108,9,109,10,125,2,1,0,124,2,
- 106,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,171,0,0,0,0,0,0,0,1,0,121,1,
- 41,6,122,125,67,97,108,108,32,116,104,101,32,105,110,118,
- 97,108,105,100,97,116,101,95,99,97,99,104,101,115,40,41,
- 32,109,101,116,104,111,100,32,111,110,32,97,108,108,32,112,
- 97,116,104,32,101,110,116,114,121,32,102,105,110,100,101,114,
- 115,10,32,32,32,32,32,32,32,32,115,116,111,114,101,100,
- 32,105,110,32,115,121,115,46,112,97,116,104,95,105,109,112,
- 111,114,116,101,114,95,99,97,99,104,101,115,32,40,119,104,
- 101,114,101,32,105,109,112,108,101,109,101,110,116,101,100,41,
- 46,78,218,17,105,110,118,97,108,105,100,97,116,101,95,99,
- 97,99,104,101,115,114,6,0,0,0,114,1,0,0,0,169,
- 1,218,18,77,101,116,97,100,97,116,97,80,97,116,104,70,
- 105,110,100,101,114,41,11,218,4,108,105,115,116,114,20,0,
- 0,0,218,19,112,97,116,104,95,105,109,112,111,114,116,101,
- 114,95,99,97,99,104,101,218,5,105,116,101,109,115,114,100,
- 0,0,0,114,199,0,0,0,114,242,1,0,0,114,185,1,
- 0,0,114,191,1,0,0,218,18,105,109,112,111,114,116,108,
- 105,98,46,109,101,116,97,100,97,116,97,114,244,1,0,0,
- 41,3,114,187,0,0,0,218,6,102,105,110,100,101,114,114,
- 244,1,0,0,115,3,0,0,0,32,32,32,114,10,0,0,
- 0,114,242,1,0,0,122,28,80,97,116,104,70,105,110,100,
- 101,114,46,105,110,118,97,108,105,100,97,116,101,95,99,97,
- 99,104,101,115,158,5,0,0,115,124,0,0,0,128,0,244,
- 8,0,29,33,164,19,215,33,56,209,33,56,215,33,62,209,
- 33,62,211,33,64,214,28,65,137,76,136,68,144,38,240,6,
- 0,16,22,136,126,164,91,176,20,212,37,54,220,20,23,215,
- 20,43,209,20,43,168,68,209,20,49,220,17,24,152,22,208,
- 33,52,213,17,53,216,16,22,215,16,40,209,16,40,213,16,
- 42,240,13,0,29,66,1,244,18,0,9,23,215,8,29,210,
- 8,29,160,17,209,8,34,213,8,29,229,8,57,216,8,26,
- 215,8,44,209,8,44,213,8,46,114,28,0,0,0,99,1,
- 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,
- 0,0,0,243,212,0,0,0,151,0,116,0,0,0,0,0,
- 0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,129,42,116,0,0,0,0,0,
- 0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,115,26,116,5,0,0,0,0,
- 0,0,0,0,106,6,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,100,2,116,8,0,0,0,0,
- 0,0,0,0,171,2,0,0,0,0,0,0,1,0,116,0,
- 0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,68,0,93,12,
- 0,0,125,1,9,0,2,0,124,1,124,0,171,1,0,0,
- 0,0,0,0,99,2,1,0,83,0,4,0,121,1,35,0,
- 116,10,0,0,0,0,0,0,0,0,36,0,114,3,1,0,
- 89,0,140,27,119,0,120,3,89,0,119,1,41,3,122,46,
- 83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,95,
- 104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,100,
- 101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,122,
- 23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,
- 105,115,32,101,109,112,116,121,41,6,114,20,0,0,0,218,
- 10,112,97,116,104,95,104,111,111,107,115,114,126,0,0,0,
- 114,127,0,0,0,218,13,73,109,112,111,114,116,87,97,114,
- 110,105,110,103,114,188,0,0,0,41,2,114,68,0,0,0,
- 218,4,104,111,111,107,115,2,0,0,0,32,32,114,10,0,
- 0,0,218,11,95,112,97,116,104,95,104,111,111,107,115,122,
- 22,80,97,116,104,70,105,110,100,101,114,46,95,112,97,116,
- 104,95,104,111,111,107,115,176,5,0,0,115,89,0,0,0,
- 128,0,244,6,0,12,15,143,62,137,62,208,11,37,172,99,
- 175,110,170,110,220,12,21,143,78,137,78,208,27,52,180,109,
- 212,12,68,220,20,23,151,78,148,78,136,68,240,2,3,13,
- 25,217,23,27,152,68,147,122,210,16,33,240,5,0,21,35,
- 240,12,0,20,24,248,244,7,0,20,31,242,0,1,13,25,
- 217,16,24,240,3,1,13,25,250,115,18,0,0,0,193,15,
- 7,65,27,2,193,27,9,65,39,5,193,38,1,65,39,5,
- 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
- 0,3,0,0,0,243,232,0,0,0,151,0,124,1,100,1,
- 107,40,0,0,114,21,9,0,116,1,0,0,0,0,0,0,
- 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,171,0,0,0,0,0,0,0,125,1,
- 9,0,116,6,0,0,0,0,0,0,0,0,106,8,0,0,
+ 0,0,107,55,0,0,114,95,124,0,106,11,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
+ 106,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,124,1,171,2,0,0,0,0,0,0,125,2,
+ 124,2,129,41,124,2,106,14,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,128,29,124,2,106,16,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,114,17,124,2,106,16,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,95,9,0,0,
+ 0,0,0,0,0,0,124,1,124,0,95,2,0,0,0,0,
+ 0,0,0,0,124,0,106,6,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,95,4,0,0,
+ 0,0,0,0,0,0,124,0,106,18,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,83,0,114,77,
+ 0,0,0,41,10,114,180,0,0,0,114,190,1,0,0,114,
+ 191,1,0,0,114,192,1,0,0,114,193,1,0,0,114,194,
+ 1,0,0,114,188,1,0,0,114,5,1,0,0,114,6,1,
+ 0,0,114,189,1,0,0,41,3,114,190,0,0,0,218,11,
+ 112,97,114,101,110,116,95,112,97,116,104,114,17,1,0,0,
+ 115,3,0,0,0,32,32,32,114,10,0,0,0,218,12,95,
+ 114,101,99,97,108,99,117,108,97,116,101,122,27,95,78,97,
+ 109,101,115,112,97,99,101,80,97,116,104,46,95,114,101,99,
+ 97,108,99,117,108,97,116,101,77,5,0,0,115,143,0,0,
+ 0,128,0,228,22,27,152,68,215,28,49,209,28,49,211,28,
+ 51,211,22,52,136,11,216,11,22,152,36,215,26,48,209,26,
+ 48,210,11,48,176,68,183,75,177,75,192,52,215,67,83,209,
+ 67,83,210,52,83,216,19,23,215,19,36,209,19,36,160,84,
+ 167,90,161,90,176,27,211,19,61,136,68,240,6,0,16,20,
+ 208,15,31,160,68,167,75,161,75,208,36,55,216,19,23,215,
+ 19,50,210,19,50,216,33,37,215,33,64,209,33,64,144,68,
+ 148,74,216,37,48,136,68,212,12,34,216,31,35,159,123,153,
+ 123,136,68,212,12,28,216,15,19,143,122,137,122,208,8,25,
+ 114,28,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
+ 0,0,4,0,0,0,3,0,0,0,243,52,0,0,0,151,
+ 0,116,1,0,0,0,0,0,0,0,0,124,0,106,3,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 124,1,25,0,0,0,125,2,124,2,83,0,35,0,116,4,
+ 0,171,0,0,0,0,0,0,0,171,1,0,0,0,0,0,
+ 0,83,0,114,77,0,0,0,41,2,218,4,105,116,101,114,
+ 114,208,1,0,0,114,132,1,0,0,115,1,0,0,0,32,
+ 114,10,0,0,0,218,8,95,95,105,116,101,114,95,95,122,
+ 23,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
+ 95,95,105,116,101,114,95,95,91,5,0,0,115,22,0,0,
+ 0,128,0,220,15,19,144,68,215,20,37,209,20,37,211,20,
+ 39,211,15,40,208,8,40,114,28,0,0,0,99,2,0,0,
+ 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,
+ 0,243,40,0,0,0,151,0,124,0,106,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,
+ 0,0,0,0,0,0,124,1,25,0,0,0,83,0,114,77,
+ 0,0,0,169,1,114,208,1,0,0,41,2,114,190,0,0,
+ 0,218,5,105,110,100,101,120,115,2,0,0,0,32,32,114,
+ 10,0,0,0,218,11,95,95,103,101,116,105,116,101,109,95,
+ 95,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,
+ 104,46,95,95,103,101,116,105,116,101,109,95,95,94,5,0,
+ 0,115,22,0,0,0,128,0,216,15,19,215,15,32,209,15,
+ 32,211,15,34,160,53,209,15,41,208,8,41,114,28,0,0,
+ 0,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,
+ 0,0,3,0,0,0,243,34,0,0,0,151,0,124,2,124,
+ 0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,124,1,60,0,0,0,121,0,114,77,0,
+ 0,0,169,1,114,189,1,0,0,41,3,114,190,0,0,0,
+ 114,214,1,0,0,114,68,0,0,0,115,3,0,0,0,32,
+ 32,32,114,10,0,0,0,218,11,95,95,115,101,116,105,116,
+ 101,109,95,95,122,26,95,78,97,109,101,115,112,97,99,101,
+ 80,97,116,104,46,95,95,115,101,116,105,116,101,109,95,95,
+ 97,5,0,0,115,16,0,0,0,128,0,216,28,32,136,4,
+ 143,10,137,10,144,53,210,8,25,114,28,0,0,0,99,1,
+ 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,
+ 0,0,0,243,52,0,0,0,151,0,116,1,0,0,0,0,
+ 0,0,0,0,124,0,106,3,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,
+ 0,0,171,1,0,0,0,0,0,0,83,0,114,77,0,0,
+ 0,41,2,114,7,0,0,0,114,208,1,0,0,114,132,1,
+ 0,0,115,1,0,0,0,32,114,10,0,0,0,218,7,95,
+ 95,108,101,110,95,95,122,22,95,78,97,109,101,115,112,97,
+ 99,101,80,97,116,104,46,95,95,108,101,110,95,95,100,5,
+ 0,0,115,22,0,0,0,128,0,220,15,18,144,52,215,19,
+ 36,209,19,36,211,19,38,211,15,39,208,8,39,114,28,0,
+ 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,3,0,0,0,243,34,0,0,0,151,0,100,1,
+ 124,0,106,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,155,2,100,2,157,3,83,0,41,3,
+ 78,122,15,95,78,97,109,101,115,112,97,99,101,80,97,116,
+ 104,40,218,1,41,114,217,1,0,0,114,132,1,0,0,115,
+ 1,0,0,0,32,114,10,0,0,0,218,8,95,95,114,101,
+ 112,114,95,95,122,23,95,78,97,109,101,115,112,97,99,101,
+ 80,97,116,104,46,95,95,114,101,112,114,95,95,103,5,0,
+ 0,115,21,0,0,0,128,0,216,17,32,160,20,167,26,161,
+ 26,160,14,168,97,208,15,48,208,8,48,114,28,0,0,0,
+ 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+ 0,3,0,0,0,243,38,0,0,0,151,0,124,1,124,0,
+ 106,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,118,0,83,0,
+ 114,77,0,0,0,114,213,1,0,0,169,2,114,190,0,0,
+ 0,218,4,105,116,101,109,115,2,0,0,0,32,32,114,10,
+ 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95,
+ 95,122,27,95,78,97,109,101,115,112,97,99,101,80,97,116,
+ 104,46,95,95,99,111,110,116,97,105,110,115,95,95,106,5,
+ 0,0,115,22,0,0,0,128,0,216,15,19,144,116,215,23,
+ 40,209,23,40,211,23,42,208,15,42,208,8,42,114,28,0,
+ 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,3,0,0,0,243,58,0,0,0,151,0,124,0,
+ 106,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,106,3,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
+ 0,0,1,0,121,0,114,77,0,0,0,41,2,114,189,1,
+ 0,0,114,64,0,0,0,114,225,1,0,0,115,2,0,0,
+ 0,32,32,114,10,0,0,0,114,64,0,0,0,122,21,95,
+ 78,97,109,101,115,112,97,99,101,80,97,116,104,46,97,112,
+ 112,101,110,100,109,5,0,0,115,20,0,0,0,128,0,216,
+ 8,12,143,10,137,10,215,8,25,209,8,25,152,36,213,8,
+ 31,114,28,0,0,0,78,41,16,114,197,0,0,0,114,196,
+ 0,0,0,114,198,0,0,0,114,199,0,0,0,114,192,1,
+ 0,0,114,68,1,0,0,114,201,1,0,0,114,190,1,0,
+ 0,114,208,1,0,0,114,211,1,0,0,114,215,1,0,0,
+ 114,218,1,0,0,114,220,1,0,0,114,223,1,0,0,114,
+ 227,1,0,0,114,64,0,0,0,114,30,0,0,0,114,28,
+ 0,0,0,114,10,0,0,0,114,186,1,0,0,114,186,1,
+ 0,0,45,5,0,0,115,70,0,0,0,132,0,241,2,4,
+ 5,20,240,16,0,14,15,128,70,242,4,5,5,40,242,14,
+ 8,5,34,242,20,2,5,72,1,242,8,12,5,26,242,28,
+ 1,5,41,242,6,1,5,42,242,6,1,5,33,242,6,1,
+ 5,40,242,6,1,5,49,242,6,1,5,43,243,6,1,5,
+ 32,114,28,0,0,0,114,186,1,0,0,99,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 243,60,0,0,0,151,0,101,0,90,1,100,0,90,2,100,
+ 1,132,0,90,3,100,2,132,0,90,4,100,3,132,0,90,
+ 5,100,4,132,0,90,6,100,5,132,0,90,7,100,6,132,
+ 0,90,8,100,7,132,0,90,9,100,8,132,0,90,10,121,
+ 9,41,10,218,15,78,97,109,101,115,112,97,99,101,76,111,
+ 97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0,
+ 0,5,0,0,0,3,0,0,0,243,40,0,0,0,151,0,
+ 116,1,0,0,0,0,0,0,0,0,124,1,124,2,124,3,
+ 171,3,0,0,0,0,0,0,124,0,95,1,0,0,0,0,
+ 0,0,0,0,121,0,114,77,0,0,0,41,2,114,186,1,
+ 0,0,114,189,1,0,0,114,195,1,0,0,115,4,0,0,
+ 0,32,32,32,32,114,10,0,0,0,114,68,1,0,0,122,
+ 24,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,
+ 46,95,95,105,110,105,116,95,95,117,5,0,0,115,18,0,
+ 0,0,128,0,220,21,35,160,68,168,36,176,11,211,21,60,
+ 136,4,141,10,114,28,0,0,0,99,2,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,3,0,0,0,243,4,
+ 0,0,0,151,0,121,1,41,2,78,84,114,30,0,0,0,
+ 114,84,1,0,0,115,2,0,0,0,32,32,114,10,0,0,
+ 0,114,11,1,0,0,122,26,78,97,109,101,115,112,97,99,
+ 101,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97,
+ 103,101,120,5,0,0,115,5,0,0,0,128,0,216,15,19,
+ 114,28,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,3,0,0,0,243,4,0,0,0,151,
+ 0,121,1,41,2,78,114,12,0,0,0,114,30,0,0,0,
+ 114,84,1,0,0,115,2,0,0,0,32,32,114,10,0,0,
+ 0,114,100,1,0,0,122,26,78,97,109,101,115,112,97,99,
+ 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,
+ 99,101,123,5,0,0,115,5,0,0,0,128,0,216,15,17,
+ 114,28,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
+ 0,0,6,0,0,0,3,0,0,0,243,32,0,0,0,151,
+ 0,116,1,0,0,0,0,0,0,0,0,100,1,100,2,100,
+ 3,100,4,172,5,171,4,0,0,0,0,0,0,83,0,41,
+ 6,78,114,12,0,0,0,122,8,60,115,116,114,105,110,103,
+ 62,114,79,1,0,0,84,41,1,114,103,1,0,0,41,1,
+ 114,104,1,0,0,114,84,1,0,0,115,2,0,0,0,32,
+ 32,114,10,0,0,0,114,77,1,0,0,122,24,78,97,109,
+ 101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,
+ 95,99,111,100,101,126,5,0,0,115,19,0,0,0,128,0,
+ 220,15,22,144,114,152,58,160,118,184,68,212,15,65,208,8,
+ 65,114,28,0,0,0,99,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,3,0,0,0,243,4,0,0,0,
+ 151,0,121,1,114,72,1,0,0,114,30,0,0,0,114,73,
+ 1,0,0,115,2,0,0,0,32,32,114,10,0,0,0,114,
+ 74,1,0,0,122,29,78,97,109,101,115,112,97,99,101,76,
+ 111,97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,
+ 117,108,101,129,5,0,0,114,75,1,0,0,114,28,0,0,
+ 0,99,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,3,0,0,0,243,4,0,0,0,151,0,121,0,114,
+ 77,0,0,0,114,30,0,0,0,114,176,1,0,0,115,2,
+ 0,0,0,32,32,114,10,0,0,0,114,81,1,0,0,122,
+ 27,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,
+ 46,101,120,101,99,95,109,111,100,117,108,101,132,5,0,0,
+ 115,5,0,0,0,128,0,216,8,12,114,28,0,0,0,99,
+ 2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
+ 3,0,0,0,243,110,0,0,0,151,0,116,0,0,0,0,
+ 0,0,0,0,0,106,3,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,100,1,124,0,106,4,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,171,2,0,0,0,0,0,0,1,0,116,0,0,0,0,
+ 0,0,0,0,0,106,7,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,0,124,1,171,2,0,
+ 0,0,0,0,0,83,0,41,2,122,98,76,111,97,100,32,
+ 97,32,110,97,109,101,115,112,97,99,101,32,109,111,100,117,
+ 108,101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,
+ 115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,
+ 101,99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,
+ 99,95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,
+ 97,100,46,10,10,32,32,32,32,32,32,32,32,122,38,110,
+ 97,109,101,115,112,97,99,101,32,109,111,100,117,108,101,32,
+ 108,111,97,100,101,100,32,119,105,116,104,32,112,97,116,104,
+ 32,123,33,114,125,41,4,114,208,0,0,0,114,216,0,0,
+ 0,114,189,1,0,0,114,83,1,0,0,114,84,1,0,0,
+ 115,2,0,0,0,32,32,114,10,0,0,0,114,85,1,0,
+ 0,122,27,78,97,109,101,115,112,97,99,101,76,111,97,100,
+ 101,114,46,108,111,97,100,95,109,111,100,117,108,101,135,5,
+ 0,0,115,49,0,0,0,128,0,244,14,0,9,19,215,8,
+ 35,209,8,35,208,36,76,216,36,40,167,74,161,74,244,3,
+ 1,9,48,244,6,0,16,26,215,15,43,209,15,43,168,68,
+ 176,40,211,15,59,208,8,59,114,28,0,0,0,99,2,0,
+ 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,
+ 0,0,243,50,0,0,0,151,0,100,1,100,2,108,0,109,
+ 1,125,2,1,0,2,0,124,2,124,0,106,4,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
+ 1,0,0,0,0,0,0,83,0,41,3,78,114,1,0,0,
+ 0,41,1,218,15,78,97,109,101,115,112,97,99,101,82,101,
+ 97,100,101,114,41,3,114,147,1,0,0,114,239,1,0,0,
+ 114,189,1,0,0,41,3,114,190,0,0,0,114,80,1,0,
+ 0,114,239,1,0,0,115,3,0,0,0,32,32,32,114,10,
+ 0,0,0,114,148,1,0,0,122,35,78,97,109,101,115,112,
+ 97,99,101,76,111,97,100,101,114,46,103,101,116,95,114,101,
+ 115,111,117,114,99,101,95,114,101,97,100,101,114,147,5,0,
+ 0,115,20,0,0,0,128,0,221,8,53,217,15,30,152,116,
+ 159,122,153,122,211,15,42,208,8,42,114,28,0,0,0,78,
+ 41,11,114,197,0,0,0,114,196,0,0,0,114,198,0,0,
+ 0,114,68,1,0,0,114,11,1,0,0,114,100,1,0,0,
+ 114,77,1,0,0,114,74,1,0,0,114,81,1,0,0,114,
+ 85,1,0,0,114,148,1,0,0,114,30,0,0,0,114,28,
+ 0,0,0,114,10,0,0,0,114,230,1,0,0,114,230,1,
+ 0,0,116,5,0,0,115,43,0,0,0,132,0,242,2,1,
+ 5,61,242,6,1,5,20,242,6,1,5,18,242,6,1,5,
+ 66,1,242,6,1,5,57,242,6,1,5,13,242,6,10,5,
+ 60,243,24,2,5,43,114,28,0,0,0,114,230,1,0,0,
+ 99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+ 0,0,0,0,0,243,116,0,0,0,151,0,101,0,90,1,
+ 100,0,90,2,100,1,90,3,101,4,100,2,132,0,171,0,
+ 0,0,0,0,0,0,90,5,101,4,100,3,132,0,171,0,
+ 0,0,0,0,0,0,90,6,101,7,100,4,132,0,171,0,
+ 0,0,0,0,0,0,90,8,101,7,100,9,100,6,132,1,
+ 171,0,0,0,0,0,0,0,90,9,101,7,100,10,100,7,
+ 132,1,171,0,0,0,0,0,0,0,90,10,101,4,100,8,
+ 132,0,171,0,0,0,0,0,0,0,90,11,121,5,41,11,
+ 218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101,
+ 116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102,
+ 111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32,
+ 112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95,
+ 32,97,116,116,114,105,98,117,116,101,115,46,99,0,0,0,
+ 0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,
+ 0,243,56,1,0,0,151,0,116,1,0,0,0,0,0,0,
+ 0,0,116,2,0,0,0,0,0,0,0,0,106,4,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 106,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,68,0,93,65,0,0,92,2,0,0,125,0,
+ 125,1,124,1,129,11,116,9,0,0,0,0,0,0,0,0,
+ 124,0,171,1,0,0,0,0,0,0,115,18,116,2,0,0,
+ 0,0,0,0,0,0,106,4,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,61,0,140,37,
+ 116,11,0,0,0,0,0,0,0,0,124,1,100,2,171,2,
+ 0,0,0,0,0,0,115,1,140,50,124,1,106,13,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 171,0,0,0,0,0,0,0,1,0,140,67,4,0,116,14,
+ 0,0,0,0,0,0,0,0,120,1,106,16,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,3,
+ 122,13,0,0,99,2,95,8,0,0,0,0,0,0,0,0,
+ 100,4,100,5,108,9,109,10,125,2,1,0,124,2,106,13,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,171,0,0,0,0,0,0,0,1,0,121,1,41,6,
+ 122,125,67,97,108,108,32,116,104,101,32,105,110,118,97,108,
+ 105,100,97,116,101,95,99,97,99,104,101,115,40,41,32,109,
+ 101,116,104,111,100,32,111,110,32,97,108,108,32,112,97,116,
+ 104,32,101,110,116,114,121,32,102,105,110,100,101,114,115,10,
+ 32,32,32,32,32,32,32,32,115,116,111,114,101,100,32,105,
+ 110,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,
+ 116,101,114,95,99,97,99,104,101,115,32,40,119,104,101,114,
+ 101,32,105,109,112,108,101,109,101,110,116,101,100,41,46,78,
+ 218,17,105,110,118,97,108,105,100,97,116,101,95,99,97,99,
+ 104,101,115,114,6,0,0,0,114,1,0,0,0,169,1,218,
+ 18,77,101,116,97,100,97,116,97,80,97,116,104,70,105,110,
+ 100,101,114,41,11,218,4,108,105,115,116,114,20,0,0,0,
+ 218,19,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
+ 99,97,99,104,101,218,5,105,116,101,109,115,114,100,0,0,
+ 0,114,200,0,0,0,114,243,1,0,0,114,186,1,0,0,
+ 114,192,1,0,0,218,18,105,109,112,111,114,116,108,105,98,
+ 46,109,101,116,97,100,97,116,97,114,245,1,0,0,41,3,
+ 114,188,0,0,0,218,6,102,105,110,100,101,114,114,245,1,
+ 0,0,115,3,0,0,0,32,32,32,114,10,0,0,0,114,
+ 243,1,0,0,122,28,80,97,116,104,70,105,110,100,101,114,
+ 46,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104,
+ 101,115,162,5,0,0,115,124,0,0,0,128,0,244,8,0,
+ 29,33,164,19,215,33,56,209,33,56,215,33,62,209,33,62,
+ 211,33,64,214,28,65,137,76,136,68,144,38,240,6,0,16,
+ 22,136,126,164,91,176,20,212,37,54,220,20,23,215,20,43,
+ 209,20,43,168,68,209,20,49,220,17,24,152,22,208,33,52,
+ 213,17,53,216,16,22,215,16,40,209,16,40,213,16,42,240,
+ 13,0,29,66,1,244,18,0,9,23,215,8,29,210,8,29,
+ 160,17,209,8,34,213,8,29,229,8,57,216,8,26,215,8,
+ 44,209,8,44,213,8,46,114,28,0,0,0,99,1,0,0,
+ 0,0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,
+ 0,243,212,0,0,0,151,0,116,0,0,0,0,0,0,0,
+ 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,129,42,116,0,0,0,0,0,0,0,
+ 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,115,26,116,5,0,0,0,0,0,0,
+ 0,0,106,6,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,100,2,116,8,0,0,0,0,0,0,
+ 0,0,171,2,0,0,0,0,0,0,1,0,116,0,0,0,
+ 0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,68,0,93,12,0,0,
+ 125,1,9,0,2,0,124,1,124,0,171,1,0,0,0,0,
+ 0,0,99,2,1,0,83,0,4,0,121,1,35,0,116,10,
0,0,0,0,0,0,0,0,36,0,114,3,1,0,89,0,
- 121,2,119,0,120,3,89,0,119,1,35,0,116,10,0,0,
- 0,0,0,0,0,0,36,0,114,40,1,0,124,0,106,13,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,1,171,1,0,0,0,0,0,0,125,2,124,2,
+ 140,27,119,0,120,3,89,0,119,1,41,3,122,46,83,101,
+ 97,114,99,104,32,115,121,115,46,112,97,116,104,95,104,111,
+ 111,107,115,32,102,111,114,32,97,32,102,105,110,100,101,114,
+ 32,102,111,114,32,39,112,97,116,104,39,46,78,122,23,115,
+ 121,115,46,112,97,116,104,95,104,111,111,107,115,32,105,115,
+ 32,101,109,112,116,121,41,6,114,20,0,0,0,218,10,112,
+ 97,116,104,95,104,111,111,107,115,114,127,0,0,0,114,128,
+ 0,0,0,218,13,73,109,112,111,114,116,87,97,114,110,105,
+ 110,103,114,189,0,0,0,41,2,114,68,0,0,0,218,4,
+ 104,111,111,107,115,2,0,0,0,32,32,114,10,0,0,0,
+ 218,11,95,112,97,116,104,95,104,111,111,107,115,122,22,80,
+ 97,116,104,70,105,110,100,101,114,46,95,112,97,116,104,95,
+ 104,111,111,107,115,180,5,0,0,115,89,0,0,0,128,0,
+ 244,6,0,12,15,143,62,137,62,208,11,37,172,99,175,110,
+ 170,110,220,12,21,143,78,137,78,208,27,52,180,109,212,12,
+ 68,220,20,23,151,78,148,78,136,68,240,2,3,13,25,217,
+ 23,27,152,68,147,122,210,16,33,240,5,0,21,35,240,12,
+ 0,20,24,248,244,7,0,20,31,242,0,1,13,25,217,16,
+ 24,240,3,1,13,25,250,115,18,0,0,0,193,15,7,65,
+ 27,2,193,27,9,65,39,5,193,38,1,65,39,5,99,2,
+ 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,
+ 0,0,0,243,232,0,0,0,151,0,124,1,100,1,107,40,
+ 0,0,114,21,9,0,116,1,0,0,0,0,0,0,0,0,
+ 106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,125,1,9,0,
116,6,0,0,0,0,0,0,0,0,106,8,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,
- 60,0,0,0,89,0,124,2,83,0,119,0,120,3,89,0,
- 119,1,41,3,122,210,71,101,116,32,116,104,101,32,102,105,
- 110,100,101,114,32,102,111,114,32,116,104,101,32,112,97,116,
- 104,32,101,110,116,114,121,32,102,114,111,109,32,115,121,115,
- 46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,
- 97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,73,
- 102,32,116,104,101,32,112,97,116,104,32,101,110,116,114,121,
- 32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,99,
- 97,99,104,101,44,32,102,105,110,100,32,116,104,101,32,97,
- 112,112,114,111,112,114,105,97,116,101,32,102,105,110,100,101,
- 114,10,32,32,32,32,32,32,32,32,97,110,100,32,99,97,
- 99,104,101,32,105,116,46,32,73,102,32,110,111,32,102,105,
- 110,100,101,114,32,105,115,32,97,118,97,105,108,97,98,108,
- 101,44,32,115,116,111,114,101,32,78,111,110,101,46,10,10,
- 32,32,32,32,32,32,32,32,114,12,0,0,0,78,41,7,
- 114,23,0,0,0,114,95,0,0,0,218,17,70,105,108,101,
- 78,111,116,70,111,117,110,100,69,114,114,111,114,114,20,0,
- 0,0,114,246,1,0,0,218,8,75,101,121,69,114,114,111,
- 114,114,254,1,0,0,41,3,114,50,1,0,0,114,68,0,
- 0,0,114,249,1,0,0,115,3,0,0,0,32,32,32,114,
- 10,0,0,0,218,20,95,112,97,116,104,95,105,109,112,111,
- 114,116,101,114,95,99,97,99,104,101,122,31,80,97,116,104,
- 70,105,110,100,101,114,46,95,112,97,116,104,95,105,109,112,
- 111,114,116,101,114,95,99,97,99,104,101,189,5,0,0,115,
- 128,0,0,0,128,0,240,16,0,12,16,144,50,138,58,240,
- 2,5,13,28,220,23,26,151,122,145,122,147,124,144,4,240,
- 10,4,9,51,220,21,24,215,21,44,209,21,44,168,84,209,
- 21,50,136,70,240,8,0,16,22,136,13,248,244,19,0,20,
- 37,242,0,3,13,28,241,6,0,24,28,240,7,3,13,28,
- 251,244,12,0,16,24,242,0,2,9,51,216,21,24,151,95,
- 145,95,160,84,211,21,42,136,70,216,44,50,140,67,215,12,
- 35,209,12,35,160,68,210,12,41,216,15,21,136,13,240,7,
- 2,9,51,250,115,29,0,0,0,135,20,49,0,156,19,65,
- 0,0,177,9,61,3,188,1,61,3,193,0,45,65,49,3,
- 193,48,1,65,49,3,78,99,4,0,0,0,0,0,0,0,
- 0,0,0,0,5,0,0,0,3,0,0,0,243,58,1,0,
- 0,151,0,103,0,125,4,124,2,68,0,93,118,0,0,125,
- 5,116,1,0,0,0,0,0,0,0,0,124,5,116,2,0,
- 0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,115,
- 1,140,20,124,0,106,5,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,124,5,171,1,0,0,0,
- 0,0,0,125,6,124,6,128,1,140,40,124,6,106,7,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,124,1,124,3,171,2,0,0,0,0,0,0,125,7,124,
- 7,128,1,140,61,124,7,106,8,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,129,4,124,7,99,
- 2,1,0,83,0,124,7,106,10,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,125,8,124,8,128,
- 11,116,13,0,0,0,0,0,0,0,0,100,2,171,1,0,
- 0,0,0,0,0,130,1,124,4,106,15,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,8,171,
- 1,0,0,0,0,0,0,1,0,140,120,4,0,116,16,0,
- 0,0,0,0,0,0,0,106,19,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,1,100,1,171,
- 2,0,0,0,0,0,0,125,7,124,4,124,7,95,5,0,
- 0,0,0,0,0,0,0,124,7,83,0,41,3,122,63,70,
- 105,110,100,32,116,104,101,32,108,111,97,100,101,114,32,111,
- 114,32,110,97,109,101,115,112,97,99,101,95,112,97,116,104,
- 32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,
- 47,112,97,99,107,97,103,101,32,110,97,109,101,46,78,122,
- 19,115,112,101,99,32,109,105,115,115,105,110,103,32,108,111,
- 97,100,101,114,41,10,114,232,0,0,0,114,136,0,0,0,
- 114,2,2,0,0,114,58,1,0,0,114,4,1,0,0,114,
- 5,1,0,0,114,188,0,0,0,114,240,0,0,0,114,207,
- 0,0,0,114,11,1,0,0,41,9,114,50,1,0,0,114,
- 42,1,0,0,114,68,0,0,0,114,57,1,0,0,218,14,
- 110,97,109,101,115,112,97,99,101,95,112,97,116,104,218,5,
- 101,110,116,114,121,114,249,1,0,0,114,16,1,0,0,218,
- 8,112,111,114,116,105,111,110,115,115,9,0,0,0,32,32,
- 32,32,32,32,32,32,32,114,10,0,0,0,218,9,95,103,
- 101,116,95,115,112,101,99,122,20,80,97,116,104,70,105,110,
- 100,101,114,46,95,103,101,116,95,115,112,101,99,211,5,0,
- 0,115,173,0,0,0,128,0,240,10,0,26,28,136,14,219,
- 21,25,136,69,220,19,29,152,101,164,83,212,19,41,216,16,
- 24,216,21,24,215,21,45,209,21,45,168,101,211,21,52,136,
- 70,216,15,21,209,15,33,216,23,29,215,23,39,209,23,39,
- 168,8,176,38,211,23,57,144,4,216,19,23,144,60,216,20,
- 28,216,19,23,151,59,145,59,208,19,42,216,27,31,146,75,
- 216,27,31,215,27,58,209,27,58,144,8,216,19,27,208,19,
- 35,220,26,37,208,38,59,211,26,60,208,20,60,240,10,0,
- 17,31,215,16,37,209,16,37,160,104,213,16,47,240,35,0,
- 22,26,244,38,0,20,30,215,19,40,209,19,40,168,24,176,
- 52,211,19,56,136,68,216,46,60,136,68,212,12,43,216,19,
- 23,136,75,114,28,0,0,0,99,4,0,0,0,0,0,0,
- 0,0,0,0,0,5,0,0,0,3,0,0,0,243,214,0,
- 0,0,151,0,124,2,128,16,116,0,0,0,0,0,0,0,
- 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,125,2,124,0,106,5,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,
- 124,2,124,3,171,3,0,0,0,0,0,0,125,4,124,4,
- 128,1,121,1,124,4,106,6,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,128,52,124,4,106,8,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,125,5,124,5,114,37,100,1,124,4,95,5,0,0,
- 0,0,0,0,0,0,116,13,0,0,0,0,0,0,0,0,
- 124,1,124,5,124,0,106,4,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,171,3,0,0,0,0,
- 0,0,124,4,95,4,0,0,0,0,0,0,0,0,124,4,
- 83,0,121,1,124,4,83,0,41,2,122,141,84,114,121,32,
- 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102,
- 111,114,32,39,102,117,108,108,110,97,109,101,39,32,111,110,
- 32,115,121,115,46,112,97,116,104,32,111,114,32,39,112,97,
- 116,104,39,46,10,10,32,32,32,32,32,32,32,32,84,104,
- 101,32,115,101,97,114,99,104,32,105,115,32,98,97,115,101,
- 100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,111,
- 111,107,115,32,97,110,100,32,115,121,115,46,112,97,116,104,
- 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,46,
- 10,32,32,32,32,32,32,32,32,78,41,7,114,20,0,0,
- 0,114,68,0,0,0,114,7,2,0,0,114,4,1,0,0,
- 114,5,1,0,0,114,9,1,0,0,114,185,1,0,0,41,
- 6,114,50,1,0,0,114,42,1,0,0,114,68,0,0,0,
- 114,57,1,0,0,114,16,1,0,0,114,4,2,0,0,115,
- 6,0,0,0,32,32,32,32,32,32,114,10,0,0,0,114,
- 58,1,0,0,122,20,80,97,116,104,70,105,110,100,101,114,
- 46,102,105,110,100,95,115,112,101,99,240,5,0,0,115,114,
- 0,0,0,128,0,240,12,0,12,16,136,60,220,19,22,151,
- 56,145,56,136,68,216,15,18,143,125,137,125,152,88,160,116,
- 168,86,211,15,52,136,4,216,11,15,136,60,216,19,23,216,
- 13,17,143,91,137,91,208,13,32,216,29,33,215,29,60,209,
- 29,60,136,78,217,15,29,240,6,0,31,35,144,4,148,11,
- 220,50,64,192,24,200,62,208,91,94,215,91,104,209,91,104,
- 211,50,105,144,4,212,16,47,216,23,27,144,11,224,23,27,
- 224,19,23,136,75,114,28,0,0,0,99,0,0,0,0,0,
- 0,0,0,0,0,0,0,5,0,0,0,15,0,0,0,243,
- 50,0,0,0,151,0,100,1,100,2,108,0,109,1,125,2,
- 1,0,2,0,124,2,106,4,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,0,105,0,124,1,
- 164,1,142,1,83,0,41,3,97,32,1,0,0,10,32,32,
- 32,32,32,32,32,32,70,105,110,100,32,100,105,115,116,114,
- 105,98,117,116,105,111,110,115,46,10,10,32,32,32,32,32,
- 32,32,32,82,101,116,117,114,110,32,97,110,32,105,116,101,
- 114,97,98,108,101,32,111,102,32,97,108,108,32,68,105,115,
- 116,114,105,98,117,116,105,111,110,32,105,110,115,116,97,110,
- 99,101,115,32,99,97,112,97,98,108,101,32,111,102,10,32,
- 32,32,32,32,32,32,32,108,111,97,100,105,110,103,32,116,
- 104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,32,
- 112,97,99,107,97,103,101,115,32,109,97,116,99,104,105,110,
- 103,32,96,96,99,111,110,116,101,120,116,46,110,97,109,101,
- 96,96,10,32,32,32,32,32,32,32,32,40,111,114,32,97,
- 108,108,32,110,97,109,101,115,32,105,102,32,96,96,78,111,
- 110,101,96,96,32,105,110,100,105,99,97,116,101,100,41,32,
- 97,108,111,110,103,32,116,104,101,32,112,97,116,104,115,32,
- 105,110,32,116,104,101,32,108,105,115,116,10,32,32,32,32,
- 32,32,32,32,111,102,32,100,105,114,101,99,116,111,114,105,
- 101,115,32,96,96,99,111,110,116,101,120,116,46,112,97,116,
- 104,96,96,46,10,32,32,32,32,32,32,32,32,114,1,0,
- 0,0,114,243,1,0,0,41,3,114,248,1,0,0,114,244,
- 1,0,0,218,18,102,105,110,100,95,100,105,115,116,114,105,
- 98,117,116,105,111,110,115,41,3,114,190,0,0,0,114,191,
- 0,0,0,114,244,1,0,0,115,3,0,0,0,32,32,32,
- 114,10,0,0,0,114,10,2,0,0,122,29,80,97,116,104,
- 70,105,110,100,101,114,46,102,105,110,100,95,100,105,115,116,
- 114,105,98,117,116,105,111,110,115,8,6,0,0,115,32,0,
- 0,0,128,0,245,20,0,9,58,216,15,52,208,15,33,215,
- 15,52,209,15,52,176,100,208,15,69,184,102,209,15,69,208,
- 8,69,114,28,0,0,0,114,77,0,0,0,114,59,1,0,
- 0,41,12,114,196,0,0,0,114,195,0,0,0,114,197,0,
- 0,0,114,198,0,0,0,114,62,1,0,0,114,242,1,0,
- 0,114,254,1,0,0,114,63,1,0,0,114,2,2,0,0,
- 114,7,2,0,0,114,58,1,0,0,114,10,2,0,0,114,
- 30,0,0,0,114,28,0,0,0,114,10,0,0,0,114,240,
- 1,0,0,114,240,1,0,0,154,5,0,0,115,125,0,0,
- 0,132,0,225,4,72,224,5,17,241,2,15,5,47,243,3,
- 0,6,18,240,2,15,5,47,240,34,0,6,18,241,2,10,
- 5,24,243,3,0,6,18,240,2,10,5,24,240,24,0,6,
- 17,241,2,19,5,22,243,3,0,6,17,240,2,19,5,22,
- 240,42,0,6,17,242,2,26,5,24,243,3,0,6,17,240,
- 2,26,5,24,240,56,0,6,17,242,2,21,5,24,243,3,
- 0,6,17,240,2,21,5,24,240,46,0,6,18,241,2,10,
- 5,70,1,243,3,0,6,18,241,2,10,5,70,1,114,28,
- 0,0,0,114,240,1,0,0,99,0,0,0,0,0,0,0,
- 0,0,0,0,0,2,0,0,0,0,0,0,0,243,70,0,
- 0,0,151,0,101,0,90,1,100,0,90,2,100,1,90,3,
- 100,2,132,0,90,4,100,3,132,0,90,5,100,4,132,0,
- 90,6,100,10,100,6,132,1,90,7,100,7,132,0,90,8,
- 101,9,100,8,132,0,171,0,0,0,0,0,0,0,90,10,
- 100,9,132,0,90,11,121,5,41,11,218,10,70,105,108,101,
- 70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,115,
- 101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,32,
- 73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,116,
- 104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,
- 109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,114,
- 32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,101,
- 105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,101,
- 100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,99,
- 116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,32,
- 105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,32,
- 98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,10,
- 32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,0,
- 0,5,0,0,0,7,0,0,0,243,12,1,0,0,135,5,
- 151,0,103,0,125,3,124,2,68,0,93,31,0,0,92,2,
- 0,0,138,5,125,4,124,3,106,1,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,136,5,102,1,
- 100,1,132,8,124,4,68,0,171,0,0,0,0,0,0,0,
- 171,1,0,0,0,0,0,0,1,0,140,33,4,0,124,3,
- 124,0,95,1,0,0,0,0,0,0,0,0,124,1,114,5,
- 124,1,100,2,107,40,0,0,114,26,116,5,0,0,0,0,
- 0,0,0,0,106,6,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,
- 124,0,95,4,0,0,0,0,0,0,0,0,110,16,116,11,
- 0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,
- 0,0,124,0,95,4,0,0,0,0,0,0,0,0,100,3,
- 124,0,95,6,0,0,0,0,0,0,0,0,116,15,0,0,
+ 25,0,0,0,125,2,124,2,83,0,35,0,116,4,0,0,
+ 0,0,0,0,0,0,36,0,114,3,1,0,89,0,121,2,
+ 119,0,120,3,89,0,119,1,35,0,116,10,0,0,0,0,
+ 0,0,0,0,36,0,114,40,1,0,124,0,106,13,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,1,171,1,0,0,0,0,0,0,125,2,124,2,116,6,
+ 0,0,0,0,0,0,0,0,106,8,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,124,1,60,0,
+ 0,0,89,0,124,2,83,0,119,0,120,3,89,0,119,1,
+ 41,3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,
+ 101,114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,
+ 101,110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,
+ 97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
+ 104,101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,
+ 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,
+ 115,32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,
+ 104,101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,
+ 114,111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,
+ 32,32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,
+ 101,32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,
+ 101,114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,
+ 32,115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,
+ 32,32,32,32,32,32,114,12,0,0,0,78,41,7,114,23,
+ 0,0,0,114,95,0,0,0,218,17,70,105,108,101,78,111,
+ 116,70,111,117,110,100,69,114,114,111,114,114,20,0,0,0,
+ 114,247,1,0,0,218,8,75,101,121,69,114,114,111,114,114,
+ 255,1,0,0,41,3,114,51,1,0,0,114,68,0,0,0,
+ 114,250,1,0,0,115,3,0,0,0,32,32,32,114,10,0,
+ 0,0,218,20,95,112,97,116,104,95,105,109,112,111,114,116,
+ 101,114,95,99,97,99,104,101,122,31,80,97,116,104,70,105,
+ 110,100,101,114,46,95,112,97,116,104,95,105,109,112,111,114,
+ 116,101,114,95,99,97,99,104,101,193,5,0,0,115,128,0,
+ 0,0,128,0,240,16,0,12,16,144,50,138,58,240,2,5,
+ 13,28,220,23,26,151,122,145,122,147,124,144,4,240,10,4,
+ 9,51,220,21,24,215,21,44,209,21,44,168,84,209,21,50,
+ 136,70,240,8,0,16,22,136,13,248,244,19,0,20,37,242,
+ 0,3,13,28,241,6,0,24,28,240,7,3,13,28,251,244,
+ 12,0,16,24,242,0,2,9,51,216,21,24,151,95,145,95,
+ 160,84,211,21,42,136,70,216,44,50,140,67,215,12,35,209,
+ 12,35,160,68,210,12,41,216,15,21,136,13,240,7,2,9,
+ 51,250,115,29,0,0,0,135,20,49,0,156,19,65,0,0,
+ 177,9,61,3,188,1,61,3,193,0,45,65,49,3,193,48,
+ 1,65,49,3,78,99,4,0,0,0,0,0,0,0,0,0,
+ 0,0,5,0,0,0,3,0,0,0,243,58,1,0,0,151,
+ 0,103,0,125,4,124,2,68,0,93,118,0,0,125,5,116,
+ 1,0,0,0,0,0,0,0,0,124,5,116,2,0,0,0,
+ 0,0,0,0,0,171,2,0,0,0,0,0,0,115,1,140,
+ 20,124,0,106,5,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,124,5,171,1,0,0,0,0,0,
+ 0,125,6,124,6,128,1,140,40,124,6,106,7,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
+ 1,124,3,171,2,0,0,0,0,0,0,125,7,124,7,128,
+ 1,140,61,124,7,106,8,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,129,4,124,7,99,2,1,
+ 0,83,0,124,7,106,10,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,125,8,124,8,128,11,116,
+ 13,0,0,0,0,0,0,0,0,100,2,171,1,0,0,0,
+ 0,0,0,130,1,124,4,106,15,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,124,8,171,1,0,
+ 0,0,0,0,0,1,0,140,120,4,0,116,16,0,0,0,
+ 0,0,0,0,0,106,19,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,100,1,171,2,0,
+ 0,0,0,0,0,125,7,124,4,124,7,95,5,0,0,0,
+ 0,0,0,0,0,124,7,83,0,41,3,122,63,70,105,110,
+ 100,32,116,104,101,32,108,111,97,100,101,114,32,111,114,32,
+ 110,97,109,101,115,112,97,99,101,95,112,97,116,104,32,102,
+ 111,114,32,116,104,105,115,32,109,111,100,117,108,101,47,112,
+ 97,99,107,97,103,101,32,110,97,109,101,46,78,122,19,115,
+ 112,101,99,32,109,105,115,115,105,110,103,32,108,111,97,100,
+ 101,114,41,10,114,233,0,0,0,114,137,0,0,0,114,3,
+ 2,0,0,114,59,1,0,0,114,5,1,0,0,114,6,1,
+ 0,0,114,189,0,0,0,114,241,0,0,0,114,208,0,0,
+ 0,114,12,1,0,0,41,9,114,51,1,0,0,114,43,1,
+ 0,0,114,68,0,0,0,114,58,1,0,0,218,14,110,97,
+ 109,101,115,112,97,99,101,95,112,97,116,104,218,5,101,110,
+ 116,114,121,114,250,1,0,0,114,17,1,0,0,218,8,112,
+ 111,114,116,105,111,110,115,115,9,0,0,0,32,32,32,32,
+ 32,32,32,32,32,114,10,0,0,0,218,9,95,103,101,116,
+ 95,115,112,101,99,122,20,80,97,116,104,70,105,110,100,101,
+ 114,46,95,103,101,116,95,115,112,101,99,215,5,0,0,115,
+ 173,0,0,0,128,0,240,10,0,26,28,136,14,219,21,25,
+ 136,69,220,19,29,152,101,164,83,212,19,41,216,16,24,216,
+ 21,24,215,21,45,209,21,45,168,101,211,21,52,136,70,216,
+ 15,21,209,15,33,216,23,29,215,23,39,209,23,39,168,8,
+ 176,38,211,23,57,144,4,216,19,23,144,60,216,20,28,216,
+ 19,23,151,59,145,59,208,19,42,216,27,31,146,75,216,27,
+ 31,215,27,58,209,27,58,144,8,216,19,27,208,19,35,220,
+ 26,37,208,38,59,211,26,60,208,20,60,240,10,0,17,31,
+ 215,16,37,209,16,37,160,104,213,16,47,240,35,0,22,26,
+ 244,38,0,20,30,215,19,40,209,19,40,168,24,176,52,211,
+ 19,56,136,68,216,46,60,136,68,212,12,43,216,19,23,136,
+ 75,114,28,0,0,0,99,4,0,0,0,0,0,0,0,0,
+ 0,0,0,5,0,0,0,3,0,0,0,243,214,0,0,0,
+ 151,0,124,2,128,16,116,0,0,0,0,0,0,0,0,0,
+ 106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,125,2,124,0,106,5,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,124,1,124,2,
+ 124,3,171,3,0,0,0,0,0,0,125,4,124,4,128,1,
+ 121,1,124,4,106,6,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,128,52,124,4,106,8,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 125,5,124,5,114,37,100,1,124,4,95,5,0,0,0,0,
+ 0,0,0,0,116,13,0,0,0,0,0,0,0,0,124,1,
+ 124,5,124,0,106,4,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,171,3,0,0,0,0,0,0,
+ 124,4,95,4,0,0,0,0,0,0,0,0,124,4,83,0,
+ 121,1,124,4,83,0,41,2,122,141,84,114,121,32,116,111,
+ 32,102,105,110,100,32,97,32,115,112,101,99,32,102,111,114,
+ 32,39,102,117,108,108,110,97,109,101,39,32,111,110,32,115,
+ 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104,
+ 39,46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,
+ 115,101,97,114,99,104,32,105,115,32,98,97,115,101,100,32,
+ 111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,
+ 115,32,97,110,100,32,115,121,115,46,112,97,116,104,95,105,
+ 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,32,
+ 32,32,32,32,32,32,32,78,41,7,114,20,0,0,0,114,
+ 68,0,0,0,114,8,2,0,0,114,5,1,0,0,114,6,
+ 1,0,0,114,10,1,0,0,114,186,1,0,0,41,6,114,
+ 51,1,0,0,114,43,1,0,0,114,68,0,0,0,114,58,
+ 1,0,0,114,17,1,0,0,114,5,2,0,0,115,6,0,
+ 0,0,32,32,32,32,32,32,114,10,0,0,0,114,59,1,
+ 0,0,122,20,80,97,116,104,70,105,110,100,101,114,46,102,
+ 105,110,100,95,115,112,101,99,244,5,0,0,115,114,0,0,
+ 0,128,0,240,12,0,12,16,136,60,220,19,22,151,56,145,
+ 56,136,68,216,15,18,143,125,137,125,152,88,160,116,168,86,
+ 211,15,52,136,4,216,11,15,136,60,216,19,23,216,13,17,
+ 143,91,137,91,208,13,32,216,29,33,215,29,60,209,29,60,
+ 136,78,217,15,29,240,6,0,31,35,144,4,148,11,220,50,
+ 64,192,24,200,62,208,91,94,215,91,104,209,91,104,211,50,
+ 105,144,4,212,16,47,216,23,27,144,11,224,23,27,224,19,
+ 23,136,75,114,28,0,0,0,99,0,0,0,0,0,0,0,
+ 0,0,0,0,0,5,0,0,0,15,0,0,0,243,50,0,
+ 0,0,151,0,100,1,100,2,108,0,109,1,125,2,1,0,
+ 2,0,124,2,106,4,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,0,105,0,124,1,164,1,
+ 142,1,83,0,41,3,97,32,1,0,0,10,32,32,32,32,
+ 32,32,32,32,70,105,110,100,32,100,105,115,116,114,105,98,
+ 117,116,105,111,110,115,46,10,10,32,32,32,32,32,32,32,
+ 32,82,101,116,117,114,110,32,97,110,32,105,116,101,114,97,
+ 98,108,101,32,111,102,32,97,108,108,32,68,105,115,116,114,
+ 105,98,117,116,105,111,110,32,105,110,115,116,97,110,99,101,
+ 115,32,99,97,112,97,98,108,101,32,111,102,10,32,32,32,
+ 32,32,32,32,32,108,111,97,100,105,110,103,32,116,104,101,
+ 32,109,101,116,97,100,97,116,97,32,102,111,114,32,112,97,
+ 99,107,97,103,101,115,32,109,97,116,99,104,105,110,103,32,
+ 96,96,99,111,110,116,101,120,116,46,110,97,109,101,96,96,
+ 10,32,32,32,32,32,32,32,32,40,111,114,32,97,108,108,
+ 32,110,97,109,101,115,32,105,102,32,96,96,78,111,110,101,
+ 96,96,32,105,110,100,105,99,97,116,101,100,41,32,97,108,
+ 111,110,103,32,116,104,101,32,112,97,116,104,115,32,105,110,
+ 32,116,104,101,32,108,105,115,116,10,32,32,32,32,32,32,
+ 32,32,111,102,32,100,105,114,101,99,116,111,114,105,101,115,
+ 32,96,96,99,111,110,116,101,120,116,46,112,97,116,104,96,
+ 96,46,10,32,32,32,32,32,32,32,32,114,1,0,0,0,
+ 114,244,1,0,0,41,3,114,249,1,0,0,114,245,1,0,
+ 0,218,18,102,105,110,100,95,100,105,115,116,114,105,98,117,
+ 116,105,111,110,115,41,3,114,191,0,0,0,114,192,0,0,
+ 0,114,245,1,0,0,115,3,0,0,0,32,32,32,114,10,
+ 0,0,0,114,11,2,0,0,122,29,80,97,116,104,70,105,
+ 110,100,101,114,46,102,105,110,100,95,100,105,115,116,114,105,
+ 98,117,116,105,111,110,115,12,6,0,0,115,32,0,0,0,
+ 128,0,245,20,0,9,58,216,15,52,208,15,33,215,15,52,
+ 209,15,52,176,100,208,15,69,184,102,209,15,69,208,8,69,
+ 114,28,0,0,0,114,77,0,0,0,114,60,1,0,0,41,
+ 12,114,197,0,0,0,114,196,0,0,0,114,198,0,0,0,
+ 114,199,0,0,0,114,63,1,0,0,114,243,1,0,0,114,
+ 255,1,0,0,114,64,1,0,0,114,3,2,0,0,114,8,
+ 2,0,0,114,59,1,0,0,114,11,2,0,0,114,30,0,
+ 0,0,114,28,0,0,0,114,10,0,0,0,114,241,1,0,
+ 0,114,241,1,0,0,158,5,0,0,115,125,0,0,0,132,
+ 0,225,4,72,224,5,17,241,2,15,5,47,243,3,0,6,
+ 18,240,2,15,5,47,240,34,0,6,18,241,2,10,5,24,
+ 243,3,0,6,18,240,2,10,5,24,240,24,0,6,17,241,
+ 2,19,5,22,243,3,0,6,17,240,2,19,5,22,240,42,
+ 0,6,17,242,2,26,5,24,243,3,0,6,17,240,2,26,
+ 5,24,240,56,0,6,17,242,2,21,5,24,243,3,0,6,
+ 17,240,2,21,5,24,240,46,0,6,18,241,2,10,5,70,
+ 1,243,3,0,6,18,241,2,10,5,70,1,114,28,0,0,
+ 0,114,241,1,0,0,99,0,0,0,0,0,0,0,0,0,
+ 0,0,0,2,0,0,0,0,0,0,0,243,70,0,0,0,
+ 151,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
+ 132,0,90,4,100,3,132,0,90,5,100,4,132,0,90,6,
+ 100,10,100,6,132,1,90,7,100,7,132,0,90,8,101,9,
+ 100,8,132,0,171,0,0,0,0,0,0,0,90,10,100,9,
+ 132,0,90,11,121,5,41,11,218,10,70,105,108,101,70,105,
+ 110,100,101,114,122,172,70,105,108,101,45,98,97,115,101,100,
+ 32,102,105,110,100,101,114,46,10,10,32,32,32,32,73,110,
+ 116,101,114,97,99,116,105,111,110,115,32,119,105,116,104,32,
+ 116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,
+ 97,114,101,32,99,97,99,104,101,100,32,102,111,114,32,112,
+ 101,114,102,111,114,109,97,110,99,101,44,32,98,101,105,110,
+ 103,10,32,32,32,32,114,101,102,114,101,115,104,101,100,32,
+ 119,104,101,110,32,116,104,101,32,100,105,114,101,99,116,111,
+ 114,121,32,116,104,101,32,102,105,110,100,101,114,32,105,115,
+ 32,104,97,110,100,108,105,110,103,32,104,97,115,32,98,101,
+ 101,110,32,109,111,100,105,102,105,101,100,46,10,10,32,32,
+ 32,32,99,2,0,0,0,0,0,0,0,0,0,0,0,5,
+ 0,0,0,7,0,0,0,243,12,1,0,0,135,5,151,0,
+ 103,0,125,3,124,2,68,0,93,31,0,0,92,2,0,0,
+ 138,5,125,4,124,3,106,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,136,5,102,1,100,1,
+ 132,8,124,4,68,0,171,0,0,0,0,0,0,0,171,1,
+ 0,0,0,0,0,0,1,0,140,33,4,0,124,3,124,0,
+ 95,1,0,0,0,0,0,0,0,0,124,1,114,5,124,1,
+ 100,2,107,40,0,0,114,26,116,5,0,0,0,0,0,0,
+ 0,0,106,6,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,171,0,0,0,0,0,0,0,124,0,
- 95,8,0,0,0,0,0,0,0,0,116,15,0,0,0,0,
- 0,0,0,0,171,0,0,0,0,0,0,0,124,0,95,9,
- 0,0,0,0,0,0,0,0,121,4,41,5,122,154,73,110,
- 105,116,105,97,108,105,122,101,32,119,105,116,104,32,116,104,
- 101,32,112,97,116,104,32,116,111,32,115,101,97,114,99,104,
- 32,111,110,32,97,110,100,32,97,32,118,97,114,105,97,98,
- 108,101,32,110,117,109,98,101,114,32,111,102,10,32,32,32,
- 32,32,32,32,32,50,45,116,117,112,108,101,115,32,99,111,
- 110,116,97,105,110,105,110,103,32,116,104,101,32,108,111,97,
- 100,101,114,32,97,110,100,32,116,104,101,32,102,105,108,101,
- 32,115,117,102,102,105,120,101,115,32,116,104,101,32,108,111,
- 97,100,101,114,10,32,32,32,32,32,32,32,32,114,101,99,
- 111,103,110,105,122,101,115,46,99,1,0,0,0,0,0,0,
- 0,0,0,0,0,3,0,0,0,51,0,0,0,243,38,0,
- 0,0,149,1,75,0,1,0,151,0,124,0,93,8,0,0,
- 125,1,124,1,137,2,102,2,150,1,151,1,1,0,140,10,
- 4,0,121,0,173,3,119,1,114,77,0,0,0,114,30,0,
- 0,0,41,3,114,8,0,0,0,114,178,1,0,0,114,4,
- 1,0,0,115,3,0,0,0,32,32,128,114,10,0,0,0,
- 114,11,0,0,0,122,38,70,105,108,101,70,105,110,100,101,
- 114,46,95,95,105,110,105,116,95,95,46,60,108,111,99,97,
- 108,115,62,46,60,103,101,110,101,120,112,114,62,37,6,0,
- 0,115,23,0,0,0,248,232,0,248,128,0,208,26,67,185,
- 40,176,6,152,70,160,70,212,27,43,185,40,249,115,4,0,
- 0,0,131,14,17,1,114,103,0,0,0,114,170,0,0,0,
- 78,41,10,114,240,0,0,0,218,8,95,108,111,97,100,101,
- 114,115,114,23,0,0,0,114,95,0,0,0,114,68,0,0,
- 0,114,105,0,0,0,218,11,95,112,97,116,104,95,109,116,
- 105,109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,
- 99,97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,
- 112,97,116,104,95,99,97,99,104,101,41,6,114,189,0,0,
- 0,114,68,0,0,0,218,14,108,111,97,100,101,114,95,100,
- 101,116,97,105,108,115,218,7,108,111,97,100,101,114,115,114,
- 18,1,0,0,114,4,1,0,0,115,6,0,0,0,32,32,
- 32,32,32,64,114,10,0,0,0,114,67,1,0,0,122,19,
- 70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,105,
- 116,95,95,31,6,0,0,115,112,0,0,0,248,128,0,240,
- 8,0,19,21,136,7,219,32,46,209,12,28,136,70,144,72,
- 216,12,19,143,78,137,78,211,26,67,185,40,211,26,67,213,
- 12,67,240,3,0,33,47,224,24,31,136,4,140,13,225,15,
- 19,144,116,152,115,146,123,220,24,27,159,10,153,10,155,12,
- 136,68,141,73,228,24,37,160,100,211,24,43,136,68,140,73,
- 216,27,29,136,4,212,8,24,220,27,30,155,53,136,4,212,
- 8,24,220,35,38,163,53,136,4,213,8,32,114,28,0,0,
- 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,
- 0,0,3,0,0,0,243,18,0,0,0,151,0,100,1,124,
- 0,95,0,0,0,0,0,0,0,0,0,121,2,41,3,122,
- 31,73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,
- 100,105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,
- 114,170,0,0,0,78,41,1,114,16,2,0,0,114,131,1,
- 0,0,115,1,0,0,0,32,114,10,0,0,0,114,242,1,
- 0,0,122,28,70,105,108,101,70,105,110,100,101,114,46,105,
- 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,
- 48,6,0,0,115,10,0,0,0,128,0,224,27,29,136,4,
- 213,8,24,114,28,0,0,0,99,6,0,0,0,0,0,0,
- 0,0,0,0,0,6,0,0,0,3,0,0,0,243,50,0,
- 0,0,151,0,2,0,124,1,124,2,124,3,171,2,0,0,
- 0,0,0,0,125,6,116,1,0,0,0,0,0,0,0,0,
- 124,2,124,3,124,6,124,4,172,1,171,4,0,0,0,0,
- 0,0,83,0,41,2,78,114,3,1,0,0,41,1,114,20,
- 1,0,0,41,7,114,189,0,0,0,114,17,1,0,0,114,
- 42,1,0,0,114,68,0,0,0,218,4,115,109,115,108,114,
- 57,1,0,0,114,4,1,0,0,115,7,0,0,0,32,32,
- 32,32,32,32,32,114,10,0,0,0,114,7,2,0,0,122,
- 20,70,105,108,101,70,105,110,100,101,114,46,95,103,101,116,
- 95,115,112,101,99,52,6,0,0,115,38,0,0,0,128,0,
- 217,17,29,152,104,168,4,211,17,45,136,6,220,15,38,160,
- 120,176,20,184,102,216,66,70,244,3,1,16,72,1,240,0,
- 1,9,72,1,114,28,0,0,0,78,99,3,0,0,0,0,
- 0,0,0,0,0,0,0,8,0,0,0,3,0,0,0,243,
- 192,3,0,0,151,0,100,1,125,3,124,1,106,1,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 100,2,171,1,0,0,0,0,0,0,100,3,25,0,0,0,
- 125,4,9,0,116,3,0,0,0,0,0,0,0,0,124,0,
- 106,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,120,1,115,20,1,0,116,7,0,0,0,0,
- 0,0,0,0,106,8,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,
- 171,1,0,0,0,0,0,0,106,10,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,125,5,124,5,
- 124,0,106,14,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,107,55,0,0,114,23,124,0,106,17,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,171,0,0,0,0,0,0,0,1,0,124,5,124,0,
- 95,7,0,0,0,0,0,0,0,0,116,19,0,0,0,0,
- 0,0,0,0,171,0,0,0,0,0,0,0,114,29,124,0,
- 106,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,125,6,124,4,106,23,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,
- 0,0,0,0,125,7,110,14,124,0,106,24,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,6,
- 124,4,125,7,124,7,124,6,118,0,114,105,116,27,0,0,
- 0,0,0,0,0,0,124,0,106,4,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,4,171,2,
- 0,0,0,0,0,0,125,8,124,0,106,28,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,
- 93,57,0,0,92,2,0,0,125,9,125,10,100,5,124,9,
- 122,0,0,0,125,11,116,27,0,0,0,0,0,0,0,0,
- 124,8,124,11,171,2,0,0,0,0,0,0,125,12,116,31,
- 0,0,0,0,0,0,0,0,124,12,171,1,0,0,0,0,
- 0,0,115,1,140,35,124,0,106,33,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,10,124,1,
- 124,12,124,8,103,1,124,2,171,5,0,0,0,0,0,0,
- 99,2,1,0,83,0,4,0,116,35,0,0,0,0,0,0,
- 0,0,124,8,171,1,0,0,0,0,0,0,125,3,124,0,
- 106,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,68,0,93,97,0,0,92,2,0,0,125,9,
- 125,10,9,0,116,27,0,0,0,0,0,0,0,0,124,0,
- 106,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,4,124,9,122,0,0,0,171,2,0,0,
- 0,0,0,0,125,12,116,38,0,0,0,0,0,0,0,0,
- 106,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,100,7,124,12,100,3,172,8,171,3,0,0,
- 0,0,0,0,1,0,124,7,124,9,122,0,0,0,124,6,
- 118,0,115,1,140,64,116,31,0,0,0,0,0,0,0,0,
- 124,12,171,1,0,0,0,0,0,0,115,1,140,76,124,0,
- 106,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,10,124,1,124,12,100,6,124,2,171,5,
- 0,0,0,0,0,0,99,2,1,0,83,0,4,0,124,3,
- 114,54,116,38,0,0,0,0,0,0,0,0,106,41,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 100,9,127,8,171,2,0,0,0,0,0,0,1,0,116,38,
- 0,0,0,0,0,0,0,0,106,43,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,1,100,6,
- 171,2,0,0,0,0,0,0,125,13,124,8,103,1,124,13,
- 95,22,0,0,0,0,0,0,0,0,124,13,83,0,121,6,
- 35,0,116,12,0,0,0,0,0,0,0,0,36,0,114,6,
- 1,0,100,4,125,5,89,0,144,1,140,127,119,0,120,3,
- 89,0,119,1,35,0,116,36,0,0,0,0,0,0,0,0,
- 36,0,114,4,1,0,89,0,1,0,121,6,119,0,120,3,
- 89,0,119,1,41,10,122,111,84,114,121,32,116,111,32,102,
- 105,110,100,32,97,32,115,112,101,99,32,102,111,114,32,116,
- 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100,
- 117,108,101,46,10,10,32,32,32,32,32,32,32,32,82,101,
- 116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,105,
- 110,103,32,115,112,101,99,44,32,111,114,32,78,111,110,101,
- 32,105,102,32,110,111,116,32,102,111,117,110,100,46,10,32,
- 32,32,32,32,32,32,32,70,114,103,0,0,0,114,52,0,
- 0,0,114,170,0,0,0,114,67,1,0,0,78,122,9,116,
- 114,121,105,110,103,32,123,125,41,1,218,9,118,101,114,98,
- 111,115,105,116,121,122,25,112,111,115,115,105,98,108,101,32,
- 110,97,109,101,115,112,97,99,101,32,102,111,114,32,123,125,
- 41,23,114,131,0,0,0,114,85,0,0,0,114,68,0,0,
- 0,114,23,0,0,0,114,95,0,0,0,114,152,1,0,0,
- 114,87,0,0,0,114,16,2,0,0,218,11,95,102,105,108,
- 108,95,99,97,99,104,101,114,27,0,0,0,114,19,2,0,
- 0,114,172,0,0,0,114,18,2,0,0,114,72,0,0,0,
- 114,15,2,0,0,114,93,0,0,0,114,7,2,0,0,114,
- 96,0,0,0,114,138,0,0,0,114,207,0,0,0,114,215,
- 0,0,0,114,11,1,0,0,114,5,1,0,0,41,14,114,
- 189,0,0,0,114,42,1,0,0,114,57,1,0,0,218,12,
- 105,115,95,110,97,109,101,115,112,97,99,101,218,11,116,97,
- 105,108,95,109,111,100,117,108,101,114,242,0,0,0,218,5,
- 99,97,99,104,101,218,12,99,97,99,104,101,95,109,111,100,
- 117,108,101,218,9,98,97,115,101,95,112,97,116,104,114,178,
- 1,0,0,114,17,1,0,0,218,13,105,110,105,116,95,102,
- 105,108,101,110,97,109,101,218,9,102,117,108,108,95,112,97,
- 116,104,114,16,1,0,0,115,14,0,0,0,32,32,32,32,
- 32,32,32,32,32,32,32,32,32,32,114,10,0,0,0,114,
- 58,1,0,0,122,20,70,105,108,101,70,105,110,100,101,114,
- 46,102,105,110,100,95,115,112,101,99,57,6,0,0,115,220,
- 1,0,0,128,0,240,10,0,24,29,136,12,216,22,30,215,
- 22,41,209,22,41,168,35,211,22,46,168,113,209,22,49,136,
- 11,240,2,3,9,23,220,20,30,152,116,159,121,153,121,210,
- 31,56,172,67,175,74,169,74,171,76,211,20,57,215,20,66,
- 209,20,66,136,69,240,6,0,12,17,144,68,215,20,36,209,
- 20,36,210,11,36,216,12,16,215,12,28,209,12,28,212,12,
- 30,216,31,36,136,68,212,12,28,228,11,22,140,61,216,20,
- 24,215,20,44,209,20,44,136,69,216,27,38,215,27,44,209,
- 27,44,211,27,46,137,76,224,20,24,215,20,36,209,20,36,
- 136,69,216,27,38,136,76,224,11,23,152,53,209,11,32,220,
- 24,34,160,52,167,57,161,57,168,107,211,24,58,136,73,216,
- 40,44,175,13,172,13,209,16,36,144,6,152,12,216,32,42,
- 168,86,209,32,51,144,13,220,28,38,160,121,176,45,211,28,
- 64,144,9,220,19,31,160,9,213,19,42,216,27,31,159,62,
- 153,62,168,44,184,8,192,41,200,105,200,91,208,90,96,211,
- 27,97,210,20,97,240,9,0,41,54,244,16,0,32,43,168,
- 57,211,31,53,144,12,224,36,40,167,77,164,77,209,12,32,
- 136,70,144,76,240,2,3,13,28,220,28,38,160,116,167,121,
- 161,121,176,43,192,6,209,50,70,211,28,71,144,9,244,6,
- 0,13,23,215,12,39,209,12,39,168,11,176,89,200,33,208,
- 12,39,212,12,76,216,15,27,152,102,209,15,36,168,5,210,
- 15,45,220,19,31,160,9,213,19,42,216,27,31,159,62,153,
- 62,168,44,184,8,192,41,216,42,46,176,6,243,3,1,28,
- 56,242,0,1,21,56,240,17,0,37,50,241,20,0,12,24,
- 220,12,22,215,12,39,209,12,39,208,40,67,192,89,212,12,
- 79,220,19,29,215,19,40,209,19,40,168,24,176,52,211,19,
- 56,136,68,216,47,56,168,107,136,68,212,12,43,216,19,23,
- 136,75,216,15,19,248,244,81,1,0,16,23,242,0,1,9,
- 23,216,20,22,139,69,240,3,1,9,23,251,244,56,0,20,
- 30,242,0,1,13,28,218,23,27,240,3,1,13,28,250,115,
- 35,0,0,0,152,53,70,62,0,196,40,25,71,16,2,198,
- 62,11,71,13,3,199,12,1,71,13,3,199,16,9,71,29,
- 5,199,28,1,71,29,5,99,1,0,0,0,0,0,0,0,
- 0,0,0,0,5,0,0,0,3,0,0,0,243,84,2,0,
- 0,151,0,124,0,106,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,125,1,9,0,116,3,0,
- 0,0,0,0,0,0,0,106,4,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,1,120,1,115,
- 20,1,0,116,3,0,0,0,0,0,0,0,0,106,6,0,
+ 95,4,0,0,0,0,0,0,0,0,110,16,116,11,0,0,
+ 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
+ 124,0,95,4,0,0,0,0,0,0,0,0,100,3,124,0,
+ 95,6,0,0,0,0,0,0,0,0,116,15,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,124,0,95,8,
+ 0,0,0,0,0,0,0,0,116,15,0,0,0,0,0,0,
+ 0,0,171,0,0,0,0,0,0,0,124,0,95,9,0,0,
+ 0,0,0,0,0,0,121,4,41,5,122,154,73,110,105,116,
+ 105,97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,
+ 112,97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,
+ 110,32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,
+ 32,110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,
+ 32,32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,
+ 97,105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,
+ 114,32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,
+ 117,102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,
+ 101,114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,
+ 110,105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,
+ 0,0,0,3,0,0,0,51,0,0,0,243,38,0,0,0,
+ 149,1,75,0,1,0,151,0,124,0,93,8,0,0,125,1,
+ 124,1,137,2,102,2,150,1,151,1,1,0,140,10,4,0,
+ 121,0,173,3,119,1,114,77,0,0,0,114,30,0,0,0,
+ 41,3,114,8,0,0,0,114,179,1,0,0,114,5,1,0,
+ 0,115,3,0,0,0,32,32,128,114,10,0,0,0,114,11,
+ 0,0,0,122,38,70,105,108,101,70,105,110,100,101,114,46,
+ 95,95,105,110,105,116,95,95,46,60,108,111,99,97,108,115,
+ 62,46,60,103,101,110,101,120,112,114,62,41,6,0,0,115,
+ 23,0,0,0,248,232,0,248,128,0,208,26,67,185,40,176,
+ 6,152,70,160,70,212,27,43,185,40,249,115,4,0,0,0,
+ 131,14,17,1,114,103,0,0,0,114,171,0,0,0,78,41,
+ 10,114,241,0,0,0,218,8,95,108,111,97,100,101,114,115,
+ 114,23,0,0,0,114,95,0,0,0,114,68,0,0,0,114,
+ 105,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,
+ 101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,
+ 99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,
+ 116,104,95,99,97,99,104,101,41,6,114,190,0,0,0,114,
+ 68,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,
+ 97,105,108,115,218,7,108,111,97,100,101,114,115,114,19,1,
+ 0,0,114,5,1,0,0,115,6,0,0,0,32,32,32,32,
+ 32,64,114,10,0,0,0,114,68,1,0,0,122,19,70,105,
+ 108,101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,
+ 95,35,6,0,0,115,112,0,0,0,248,128,0,240,8,0,
+ 19,21,136,7,219,32,46,209,12,28,136,70,144,72,216,12,
+ 19,143,78,137,78,211,26,67,185,40,211,26,67,213,12,67,
+ 240,3,0,33,47,224,24,31,136,4,140,13,225,15,19,144,
+ 116,152,115,146,123,220,24,27,159,10,153,10,155,12,136,68,
+ 141,73,228,24,37,160,100,211,24,43,136,68,140,73,216,27,
+ 29,136,4,212,8,24,220,27,30,155,53,136,4,212,8,24,
+ 220,35,38,163,53,136,4,213,8,32,114,28,0,0,0,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
+ 3,0,0,0,243,18,0,0,0,151,0,100,1,124,0,95,
+ 0,0,0,0,0,0,0,0,0,121,2,41,3,122,31,73,
+ 110,118,97,108,105,100,97,116,101,32,116,104,101,32,100,105,
+ 114,101,99,116,111,114,121,32,109,116,105,109,101,46,114,171,
+ 0,0,0,78,41,1,114,17,2,0,0,114,132,1,0,0,
+ 115,1,0,0,0,32,114,10,0,0,0,114,243,1,0,0,
+ 122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,118,
+ 97,108,105,100,97,116,101,95,99,97,99,104,101,115,52,6,
+ 0,0,115,10,0,0,0,128,0,224,27,29,136,4,213,8,
+ 24,114,28,0,0,0,99,6,0,0,0,0,0,0,0,0,
+ 0,0,0,6,0,0,0,3,0,0,0,243,50,0,0,0,
+ 151,0,2,0,124,1,124,2,124,3,171,2,0,0,0,0,
+ 0,0,125,6,116,1,0,0,0,0,0,0,0,0,124,2,
+ 124,3,124,6,124,4,172,1,171,4,0,0,0,0,0,0,
+ 83,0,41,2,78,114,4,1,0,0,41,1,114,21,1,0,
+ 0,41,7,114,190,0,0,0,114,18,1,0,0,114,43,1,
+ 0,0,114,68,0,0,0,218,4,115,109,115,108,114,58,1,
+ 0,0,114,5,1,0,0,115,7,0,0,0,32,32,32,32,
+ 32,32,32,114,10,0,0,0,114,8,2,0,0,122,20,70,
+ 105,108,101,70,105,110,100,101,114,46,95,103,101,116,95,115,
+ 112,101,99,56,6,0,0,115,38,0,0,0,128,0,217,17,
+ 29,152,104,168,4,211,17,45,136,6,220,15,38,160,120,176,
+ 20,184,102,216,66,70,244,3,1,16,72,1,240,0,1,9,
+ 72,1,114,28,0,0,0,78,99,3,0,0,0,0,0,0,
+ 0,0,0,0,0,8,0,0,0,3,0,0,0,243,192,3,
+ 0,0,151,0,100,1,125,3,124,1,106,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,2,
+ 171,1,0,0,0,0,0,0,100,3,25,0,0,0,125,4,
+ 9,0,116,3,0,0,0,0,0,0,0,0,124,0,106,4,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,171,0,0,0,0,0,0,0,171,1,0,0,0,0,0,
- 0,125,2,116,14,0,0,0,0,0,0,0,0,106,16,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,106,19,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,100,1,171,1,0,0,0,0,0,0,115,
- 17,116,21,0,0,0,0,0,0,0,0,124,2,171,1,0,
- 0,0,0,0,0,124,0,95,11,0,0,0,0,0,0,0,
- 0,110,88,116,21,0,0,0,0,0,0,0,0,171,0,0,
- 0,0,0,0,0,125,3,124,2,68,0,93,66,0,0,125,
- 4,124,4,106,25,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,100,2,171,1,0,0,0,0,0,
- 0,92,3,0,0,125,5,125,6,125,7,124,6,114,22,124,
- 5,155,0,100,2,124,7,106,27,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
- 0,0,0,155,0,157,3,125,8,110,2,124,5,125,8,124,
- 3,106,29,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,8,171,1,0,0,0,0,0,0,1,
- 0,140,68,4,0,124,3,124,0,95,11,0,0,0,0,0,
- 0,0,0,116,14,0,0,0,0,0,0,0,0,106,16,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,106,19,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,116,30,0,0,0,0,0,0,0,0,171,
- 1,0,0,0,0,0,0,114,36,124,2,68,0,143,9,99,
- 2,104,0,99,2,93,18,0,0,125,9,124,9,106,27,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,171,0,0,0,0,0,0,0,146,2,140,20,4,0,99,
- 2,125,9,124,0,95,16,0,0,0,0,0,0,0,0,121,
- 3,121,3,35,0,116,8,0,0,0,0,0,0,0,0,116,
- 10,0,0,0,0,0,0,0,0,116,12,0,0,0,0,0,
- 0,0,0,102,3,36,0,114,5,1,0,103,0,125,2,89,
- 0,140,232,119,0,120,3,89,0,119,1,99,2,1,0,99,
- 2,125,9,119,0,41,4,122,68,70,105,108,108,32,116,104,
- 101,32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,
- 116,105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,
- 32,112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,
- 105,115,32,100,105,114,101,99,116,111,114,121,46,114,14,0,
- 0,0,114,103,0,0,0,78,41,17,114,68,0,0,0,114,
- 23,0,0,0,218,7,108,105,115,116,100,105,114,114,95,0,
- 0,0,114,0,2,0,0,218,15,80,101,114,109,105,115,115,
- 105,111,110,69,114,114,111,114,218,18,78,111,116,65,68,105,
- 114,101,99,116,111,114,121,69,114,114,111,114,114,20,0,0,
- 0,114,31,0,0,0,114,32,0,0,0,114,17,2,0,0,
- 114,18,2,0,0,114,158,0,0,0,114,172,0,0,0,218,
- 3,97,100,100,114,33,0,0,0,114,19,2,0,0,41,10,
- 114,189,0,0,0,114,68,0,0,0,218,8,99,111,110,116,
- 101,110,116,115,218,21,108,111,119,101,114,95,115,117,102,102,
- 105,120,95,99,111,110,116,101,110,116,115,114,225,1,0,0,
- 114,187,0,0,0,114,198,1,0,0,114,178,1,0,0,218,
- 8,110,101,119,95,110,97,109,101,218,2,102,110,115,10,0,
- 0,0,32,32,32,32,32,32,32,32,32,32,114,10,0,0,
- 0,114,27,2,0,0,122,22,70,105,108,101,70,105,110,100,
- 101,114,46,95,102,105,108,108,95,99,97,99,104,101,108,6,
- 0,0,115,4,1,0,0,128,0,224,15,19,143,121,137,121,
- 136,4,240,2,5,9,26,220,23,26,151,123,145,123,160,52,
- 210,35,55,172,51,175,58,169,58,171,60,211,23,56,136,72,
- 244,14,0,16,19,143,124,137,124,215,15,38,209,15,38,160,
- 117,212,15,45,220,31,34,160,56,155,125,136,68,213,12,28,
- 244,14,0,37,40,163,69,208,12,33,219,24,32,144,4,216,
- 36,40,167,78,161,78,176,51,211,36,55,209,16,33,144,4,
- 144,99,152,54,217,19,22,216,34,38,160,22,160,113,168,22,
- 175,28,169,28,171,30,208,40,56,208,31,57,145,72,224,31,
- 35,144,72,216,16,37,215,16,41,209,16,41,168,40,213,16,
- 51,240,13,0,25,33,240,14,0,32,53,136,68,212,12,28,
- 220,11,14,143,60,137,60,215,11,34,209,11,34,212,35,62,
- 212,11,63,217,61,69,211,39,70,185,88,176,114,168,2,175,
- 8,169,8,173,10,184,88,209,39,70,136,68,213,12,36,240,
- 3,0,12,64,1,248,244,47,0,17,34,164,63,212,52,70,
- 208,15,71,242,0,3,9,26,240,6,0,24,26,138,72,240,
- 7,3,9,26,252,242,48,0,40,71,1,115,23,0,0,0,
- 142,43,68,9,0,195,40,23,68,37,4,196,9,22,68,34,
- 3,196,33,1,68,34,3,99,1,0,0,0,0,0,0,0,
- 0,0,0,0,2,0,0,0,7,0,0,0,243,22,0,0,
- 0,135,0,135,1,151,0,136,0,136,1,102,2,100,1,132,
- 8,125,2,124,2,83,0,41,2,97,20,1,0,0,65,32,
- 99,108,97,115,115,32,109,101,116,104,111,100,32,119,104,105,
- 99,104,32,114,101,116,117,114,110,115,32,97,32,99,108,111,
- 115,117,114,101,32,116,111,32,117,115,101,32,111,110,32,115,
- 121,115,46,112,97,116,104,95,104,111,111,107,10,32,32,32,
- 32,32,32,32,32,119,104,105,99,104,32,119,105,108,108,32,
- 114,101,116,117,114,110,32,97,110,32,105,110,115,116,97,110,
- 99,101,32,117,115,105,110,103,32,116,104,101,32,115,112,101,
- 99,105,102,105,101,100,32,108,111,97,100,101,114,115,32,97,
- 110,100,32,116,104,101,32,112,97,116,104,10,32,32,32,32,
- 32,32,32,32,99,97,108,108,101,100,32,111,110,32,116,104,
- 101,32,99,108,111,115,117,114,101,46,10,10,32,32,32,32,
- 32,32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,
- 99,97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,
- 111,115,117,114,101,32,105,115,32,110,111,116,32,97,32,100,
- 105,114,101,99,116,111,114,121,44,32,73,109,112,111,114,116,
- 69,114,114,111,114,32,105,115,10,32,32,32,32,32,32,32,
- 32,114,97,105,115,101,100,46,10,10,32,32,32,32,32,32,
- 32,32,99,1,0,0,0,0,0,0,0,0,0,0,0,4,
- 0,0,0,19,0,0,0,243,70,0,0,0,149,2,151,0,
- 116,1,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
- 0,0,0,0,115,13,116,3,0,0,0,0,0,0,0,0,
- 100,1,124,0,172,2,171,2,0,0,0,0,0,0,130,1,
- 2,0,137,1,124,0,103,1,137,2,162,1,173,6,142,0,
- 83,0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,
- 102,111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,
- 99,104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,
- 101,114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,
- 111,114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,
- 116,101,100,114,84,0,0,0,41,2,114,96,0,0,0,114,
- 188,0,0,0,41,3,114,68,0,0,0,114,50,1,0,0,
- 114,20,2,0,0,115,3,0,0,0,32,128,128,114,10,0,
- 0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111,
- 114,95,70,105,108,101,70,105,110,100,101,114,122,54,70,105,
- 108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,
- 111,107,46,60,108,111,99,97,108,115,62,46,112,97,116,104,
- 95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,
- 110,100,101,114,149,6,0,0,115,41,0,0,0,248,128,0,
- 228,19,30,152,116,212,19,36,220,22,33,208,34,66,200,20,
- 212,22,78,208,16,78,217,19,22,144,116,208,19,45,152,110,
- 210,19,45,208,12,45,114,28,0,0,0,114,30,0,0,0,
- 41,3,114,50,1,0,0,114,20,2,0,0,114,46,2,0,
- 0,115,3,0,0,0,96,96,32,114,10,0,0,0,218,9,
- 112,97,116,104,95,104,111,111,107,122,20,70,105,108,101,70,
- 105,110,100,101,114,46,112,97,116,104,95,104,111,111,107,139,
- 6,0,0,115,16,0,0,0,249,128,0,245,20,4,9,46,
- 240,12,0,16,40,208,8,39,114,28,0,0,0,99,1,0,
- 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,
- 0,0,243,34,0,0,0,151,0,100,1,124,0,106,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,155,2,100,2,157,3,83,0,41,3,78,122,11,70,105,
- 108,101,70,105,110,100,101,114,40,114,221,1,0,0,114,84,
- 0,0,0,114,131,1,0,0,115,1,0,0,0,32,114,10,
- 0,0,0,114,222,1,0,0,122,19,70,105,108,101,70,105,
- 110,100,101,114,46,95,95,114,101,112,114,95,95,157,6,0,
- 0,115,21,0,0,0,128,0,216,17,28,152,84,159,89,153,
- 89,152,77,168,17,208,15,43,208,8,43,114,28,0,0,0,
- 114,77,0,0,0,41,12,114,196,0,0,0,114,195,0,0,
- 0,114,197,0,0,0,114,198,0,0,0,114,67,1,0,0,
- 114,242,1,0,0,114,7,2,0,0,114,58,1,0,0,114,
- 27,2,0,0,114,63,1,0,0,114,47,2,0,0,114,222,
- 1,0,0,114,30,0,0,0,114,28,0,0,0,114,10,0,
- 0,0,114,12,2,0,0,114,12,2,0,0,22,6,0,0,
- 115,60,0,0,0,132,0,241,4,5,5,8,242,14,15,5,
- 41,242,34,2,5,30,242,8,3,5,72,1,243,10,49,5,
- 20,242,102,1,29,5,71,1,240,62,0,6,17,241,2,15,
- 5,40,243,3,0,6,17,240,2,15,5,40,243,34,1,5,
- 44,114,28,0,0,0,114,12,2,0,0,99,4,0,0,0,
- 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,
- 243,50,1,0,0,151,0,124,0,106,1,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,100,1,171,
- 1,0,0,0,0,0,0,125,4,124,0,106,1,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,
- 2,171,1,0,0,0,0,0,0,125,5,124,4,115,45,124,
- 5,114,13,124,5,106,2,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,125,4,110,30,124,2,124,
- 3,107,40,0,0,114,13,116,5,0,0,0,0,0,0,0,
- 0,124,1,124,2,171,2,0,0,0,0,0,0,125,4,110,
- 12,116,7,0,0,0,0,0,0,0,0,124,1,124,2,171,
- 2,0,0,0,0,0,0,125,4,124,5,115,32,116,9,0,
- 0,0,0,0,0,0,0,124,1,124,2,124,4,172,3,171,
- 3,0,0,0,0,0,0,125,5,124,3,114,16,116,11,0,
- 0,0,0,0,0,0,0,124,3,171,1,0,0,0,0,0,
- 0,124,5,95,6,0,0,0,0,0,0,0,0,9,0,124,
- 5,124,0,100,2,60,0,0,0,124,4,124,0,100,1,60,
- 0,0,0,124,2,124,0,100,4,60,0,0,0,124,3,124,
- 0,100,5,60,0,0,0,121,0,35,0,116,14,0,0,0,
- 0,0,0,0,0,36,0,114,3,1,0,89,0,121,0,119,
- 0,120,3,89,0,119,1,41,6,78,114,22,1,0,0,114,
- 23,1,0,0,41,1,114,4,1,0,0,218,8,95,95,102,
- 105,108,101,95,95,218,10,95,95,99,97,99,104,101,100,95,
- 95,41,8,114,26,1,0,0,114,4,1,0,0,114,163,1,
- 0,0,114,150,1,0,0,114,20,1,0,0,114,105,0,0,
- 0,218,6,99,97,99,104,101,100,218,9,69,120,99,101,112,
- 116,105,111,110,41,6,218,2,110,115,114,187,0,0,0,218,
- 8,112,97,116,104,110,97,109,101,218,9,99,112,97,116,104,
- 110,97,109,101,114,4,1,0,0,114,16,1,0,0,115,6,
- 0,0,0,32,32,32,32,32,32,114,10,0,0,0,218,14,
- 95,102,105,120,95,117,112,95,109,111,100,117,108,101,114,57,
- 2,0,0,163,6,0,0,115,170,0,0,0,128,0,224,13,
- 15,143,86,137,86,144,76,211,13,33,128,70,216,11,13,143,
- 54,137,54,144,42,211,11,29,128,68,217,11,17,217,11,15,
- 216,21,25,151,91,145,91,137,70,216,13,21,152,25,210,13,
- 34,220,21,41,168,36,176,8,211,21,57,137,70,228,21,37,
- 160,100,168,72,211,21,53,136,70,217,11,15,220,15,38,160,
- 116,168,88,184,102,212,15,69,136,4,217,11,20,220,26,39,
- 168,9,211,26,50,136,68,140,75,240,2,7,5,13,216,25,
- 29,136,2,136,58,137,14,216,27,33,136,2,136,60,209,8,
- 24,216,25,33,136,2,136,58,137,14,216,27,36,136,2,136,
- 60,210,8,24,248,220,11,20,242,0,2,5,13,225,8,12,
- 240,5,2,5,13,250,115,18,0,0,0,193,53,20,66,10,
- 0,194,10,9,66,22,3,194,21,1,66,22,3,99,0,0,
- 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,
- 0,0,243,112,0,0,0,151,0,116,0,0,0,0,0,0,
- 0,0,0,116,3,0,0,0,0,0,0,0,0,106,4,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,171,0,0,0,0,0,0,0,102,2,125,0,116,6,0,
- 0,0,0,0,0,0,0,116,8,0,0,0,0,0,0,0,
- 0,102,2,125,1,116,10,0,0,0,0,0,0,0,0,116,
- 12,0,0,0,0,0,0,0,0,102,2,125,2,124,0,124,
- 1,124,2,103,3,83,0,41,1,122,95,82,101,116,117,114,
- 110,115,32,97,32,108,105,115,116,32,111,102,32,102,105,108,
- 101,45,98,97,115,101,100,32,109,111,100,117,108,101,32,108,
- 111,97,100,101,114,115,46,10,10,32,32,32,32,69,97,99,
- 104,32,105,116,101,109,32,105,115,32,97,32,116,117,112,108,
- 101,32,40,108,111,97,100,101,114,44,32,115,117,102,102,105,
- 120,101,115,41,46,10,32,32,32,32,41,7,114,141,1,0,
- 0,114,234,0,0,0,218,18,101,120,116,101,110,115,105,111,
- 110,95,115,117,102,102,105,120,101,115,114,150,1,0,0,114,
- 159,0,0,0,114,163,1,0,0,114,140,0,0,0,41,3,
- 218,10,101,120,116,101,110,115,105,111,110,115,218,6,115,111,
- 117,114,99,101,218,8,98,121,116,101,99,111,100,101,115,3,
- 0,0,0,32,32,32,114,10,0,0,0,114,13,1,0,0,
- 114,13,1,0,0,188,6,0,0,115,57,0,0,0,128,0,
- 244,10,0,18,37,164,100,215,38,61,209,38,61,211,38,63,
- 208,17,63,128,74,220,13,29,156,127,208,13,46,128,70,220,
- 15,35,212,37,54,208,15,54,128,72,216,12,22,152,6,160,
- 8,208,11,41,208,4,41,114,28,0,0,0,99,1,0,0,
- 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,
- 0,243,8,0,0,0,151,0,124,0,97,0,121,0,114,77,
- 0,0,0,41,1,114,207,0,0,0,41,1,218,17,95,98,
- 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,115,
- 1,0,0,0,32,114,10,0,0,0,218,21,95,115,101,116,
- 95,98,111,111,116,115,116,114,97,112,95,109,111,100,117,108,
- 101,114,65,2,0,0,199,6,0,0,115,7,0,0,0,128,
- 0,224,17,34,129,74,114,28,0,0,0,99,1,0,0,0,
- 0,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,
- 243,212,0,0,0,151,0,116,1,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,1,0,116,3,0,
- 0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,125,
- 1,116,4,0,0,0,0,0,0,0,0,106,6,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
- 9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,116,11,0,0,0,0,0,0,0,0,106,12,0,
+ 0,0,120,1,115,20,1,0,116,7,0,0,0,0,0,0,
+ 0,0,106,8,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,171,0,0,0,0,0,0,0,171,1,
+ 0,0,0,0,0,0,106,10,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,125,5,124,5,124,0,
+ 106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,107,55,0,0,114,23,124,0,106,17,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,124,1,142,0,103,1,171,1,0,0,0,0,0,0,1,
- 0,116,4,0,0,0,0,0,0,0,0,106,14,0,0,0,
+ 171,0,0,0,0,0,0,0,1,0,124,5,124,0,95,7,
+ 0,0,0,0,0,0,0,0,116,19,0,0,0,0,0,0,
+ 0,0,171,0,0,0,0,0,0,0,114,29,124,0,106,20,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,125,6,124,4,106,23,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,
+ 0,0,125,7,110,14,124,0,106,24,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,125,6,124,4,
+ 125,7,124,7,124,6,118,0,114,105,116,27,0,0,0,0,
+ 0,0,0,0,124,0,106,4,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,4,171,2,0,0,
+ 0,0,0,0,125,8,124,0,106,28,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,68,0,93,57,
+ 0,0,92,2,0,0,125,9,125,10,100,5,124,9,122,0,
+ 0,0,125,11,116,27,0,0,0,0,0,0,0,0,124,8,
+ 124,11,171,2,0,0,0,0,0,0,125,12,116,31,0,0,
+ 0,0,0,0,0,0,124,12,171,1,0,0,0,0,0,0,
+ 115,1,140,35,124,0,106,33,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,10,124,1,124,12,
+ 124,8,103,1,124,2,171,5,0,0,0,0,0,0,99,2,
+ 1,0,83,0,4,0,116,35,0,0,0,0,0,0,0,0,
+ 124,8,171,1,0,0,0,0,0,0,125,3,124,0,106,28,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,68,0,93,97,0,0,92,2,0,0,125,9,125,10,
+ 9,0,116,27,0,0,0,0,0,0,0,0,124,0,106,4,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,4,124,9,122,0,0,0,171,2,0,0,0,0,
+ 0,0,125,12,116,38,0,0,0,0,0,0,0,0,106,41,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,100,7,124,12,100,3,172,8,171,3,0,0,0,0,
+ 0,0,1,0,124,7,124,9,122,0,0,0,124,6,118,0,
+ 115,1,140,64,116,31,0,0,0,0,0,0,0,0,124,12,
+ 171,1,0,0,0,0,0,0,115,1,140,76,124,0,106,33,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,10,124,1,124,12,100,6,124,2,171,5,0,0,
+ 0,0,0,0,99,2,1,0,83,0,4,0,124,3,114,54,
+ 116,38,0,0,0,0,0,0,0,0,106,41,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,9,
+ 127,8,171,2,0,0,0,0,0,0,1,0,116,38,0,0,
+ 0,0,0,0,0,0,106,43,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,1,100,6,171,2,
+ 0,0,0,0,0,0,125,13,124,8,103,1,124,13,95,22,
+ 0,0,0,0,0,0,0,0,124,13,83,0,121,6,35,0,
+ 116,12,0,0,0,0,0,0,0,0,36,0,114,6,1,0,
+ 100,4,125,5,89,0,144,1,140,127,119,0,120,3,89,0,
+ 119,1,35,0,116,36,0,0,0,0,0,0,0,0,36,0,
+ 114,4,1,0,89,0,1,0,121,6,119,0,120,3,89,0,
+ 119,1,41,10,122,111,84,114,121,32,116,111,32,102,105,110,
+ 100,32,97,32,115,112,101,99,32,102,111,114,32,116,104,101,
+ 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108,
+ 101,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117,
+ 114,110,115,32,116,104,101,32,109,97,116,99,104,105,110,103,
+ 32,115,112,101,99,44,32,111,114,32,78,111,110,101,32,105,
+ 102,32,110,111,116,32,102,111,117,110,100,46,10,32,32,32,
+ 32,32,32,32,32,70,114,103,0,0,0,114,52,0,0,0,
+ 114,171,0,0,0,114,68,1,0,0,78,122,9,116,114,121,
+ 105,110,103,32,123,125,41,1,218,9,118,101,114,98,111,115,
+ 105,116,121,122,25,112,111,115,115,105,98,108,101,32,110,97,
+ 109,101,115,112,97,99,101,32,102,111,114,32,123,125,41,23,
+ 114,132,0,0,0,114,85,0,0,0,114,68,0,0,0,114,
+ 23,0,0,0,114,95,0,0,0,114,153,1,0,0,114,87,
+ 0,0,0,114,17,2,0,0,218,11,95,102,105,108,108,95,
+ 99,97,99,104,101,114,27,0,0,0,114,20,2,0,0,114,
+ 173,0,0,0,114,19,2,0,0,114,72,0,0,0,114,16,
+ 2,0,0,114,93,0,0,0,114,8,2,0,0,114,96,0,
+ 0,0,114,139,0,0,0,114,208,0,0,0,114,216,0,0,
+ 0,114,12,1,0,0,114,6,1,0,0,41,14,114,190,0,
+ 0,0,114,43,1,0,0,114,58,1,0,0,218,12,105,115,
+ 95,110,97,109,101,115,112,97,99,101,218,11,116,97,105,108,
+ 95,109,111,100,117,108,101,114,243,0,0,0,218,5,99,97,
+ 99,104,101,218,12,99,97,99,104,101,95,109,111,100,117,108,
+ 101,218,9,98,97,115,101,95,112,97,116,104,114,179,1,0,
+ 0,114,18,1,0,0,218,13,105,110,105,116,95,102,105,108,
+ 101,110,97,109,101,218,9,102,117,108,108,95,112,97,116,104,
+ 114,17,1,0,0,115,14,0,0,0,32,32,32,32,32,32,
+ 32,32,32,32,32,32,32,32,114,10,0,0,0,114,59,1,
+ 0,0,122,20,70,105,108,101,70,105,110,100,101,114,46,102,
+ 105,110,100,95,115,112,101,99,61,6,0,0,115,220,1,0,
+ 0,128,0,240,10,0,24,29,136,12,216,22,30,215,22,41,
+ 209,22,41,168,35,211,22,46,168,113,209,22,49,136,11,240,
+ 2,3,9,23,220,20,30,152,116,159,121,153,121,210,31,56,
+ 172,67,175,74,169,74,171,76,211,20,57,215,20,66,209,20,
+ 66,136,69,240,6,0,12,17,144,68,215,20,36,209,20,36,
+ 210,11,36,216,12,16,215,12,28,209,12,28,212,12,30,216,
+ 31,36,136,68,212,12,28,228,11,22,140,61,216,20,24,215,
+ 20,44,209,20,44,136,69,216,27,38,215,27,44,209,27,44,
+ 211,27,46,137,76,224,20,24,215,20,36,209,20,36,136,69,
+ 216,27,38,136,76,224,11,23,152,53,209,11,32,220,24,34,
+ 160,52,167,57,161,57,168,107,211,24,58,136,73,216,40,44,
+ 175,13,172,13,209,16,36,144,6,152,12,216,32,42,168,86,
+ 209,32,51,144,13,220,28,38,160,121,176,45,211,28,64,144,
+ 9,220,19,31,160,9,213,19,42,216,27,31,159,62,153,62,
+ 168,44,184,8,192,41,200,105,200,91,208,90,96,211,27,97,
+ 210,20,97,240,9,0,41,54,244,16,0,32,43,168,57,211,
+ 31,53,144,12,224,36,40,167,77,164,77,209,12,32,136,70,
+ 144,76,240,2,3,13,28,220,28,38,160,116,167,121,161,121,
+ 176,43,192,6,209,50,70,211,28,71,144,9,244,6,0,13,
+ 23,215,12,39,209,12,39,168,11,176,89,200,33,208,12,39,
+ 212,12,76,216,15,27,152,102,209,15,36,168,5,210,15,45,
+ 220,19,31,160,9,213,19,42,216,27,31,159,62,153,62,168,
+ 44,184,8,192,41,216,42,46,176,6,243,3,1,28,56,242,
+ 0,1,21,56,240,17,0,37,50,241,20,0,12,24,220,12,
+ 22,215,12,39,209,12,39,208,40,67,192,89,212,12,79,220,
+ 19,29,215,19,40,209,19,40,168,24,176,52,211,19,56,136,
+ 68,216,47,56,168,107,136,68,212,12,43,216,19,23,136,75,
+ 216,15,19,248,244,81,1,0,16,23,242,0,1,9,23,216,
+ 20,22,139,69,240,3,1,9,23,251,244,56,0,20,30,242,
+ 0,1,13,28,218,23,27,240,3,1,13,28,250,115,35,0,
+ 0,0,152,53,70,62,0,196,40,25,71,16,2,198,62,11,
+ 71,13,3,199,12,1,71,13,3,199,16,9,71,29,5,199,
+ 28,1,71,29,5,99,1,0,0,0,0,0,0,0,0,0,
+ 0,0,5,0,0,0,3,0,0,0,243,84,2,0,0,151,
+ 0,124,0,106,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,125,1,9,0,116,3,0,0,0,
+ 0,0,0,0,0,106,4,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,120,1,115,20,1,
+ 0,116,3,0,0,0,0,0,0,0,0,106,6,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
+ 0,0,0,0,0,0,0,171,1,0,0,0,0,0,0,125,
+ 2,116,14,0,0,0,0,0,0,0,0,106,16,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
+ 19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,100,1,171,1,0,0,0,0,0,0,115,17,116,
+ 21,0,0,0,0,0,0,0,0,124,2,171,1,0,0,0,
+ 0,0,0,124,0,95,11,0,0,0,0,0,0,0,0,110,
+ 88,116,21,0,0,0,0,0,0,0,0,171,0,0,0,0,
+ 0,0,0,125,3,124,2,68,0,93,66,0,0,125,4,124,
+ 4,106,25,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,100,2,171,1,0,0,0,0,0,0,92,
+ 3,0,0,125,5,125,6,125,7,124,6,114,22,124,5,155,
+ 0,100,2,124,7,106,27,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,
+ 0,155,0,157,3,125,8,110,2,124,5,125,8,124,3,106,
+ 29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,8,171,1,0,0,0,0,0,0,1,0,140,
+ 68,4,0,124,3,124,0,95,11,0,0,0,0,0,0,0,
+ 0,116,14,0,0,0,0,0,0,0,0,106,16,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
- 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,116,18,0,0,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,1,0,121,1,41,2,122,41,73,110,115,
- 116,97,108,108,32,116,104,101,32,112,97,116,104,45,98,97,
- 115,101,100,32,105,109,112,111,114,116,32,99,111,109,112,111,
- 110,101,110,116,115,46,78,41,10,114,65,2,0,0,114,13,
- 1,0,0,114,20,0,0,0,114,251,1,0,0,114,240,0,
- 0,0,114,12,2,0,0,114,47,2,0,0,218,9,109,101,
- 116,97,95,112,97,116,104,114,64,0,0,0,114,240,1,0,
- 0,41,2,114,64,2,0,0,218,17,115,117,112,112,111,114,
- 116,101,100,95,108,111,97,100,101,114,115,115,2,0,0,0,
- 32,32,114,10,0,0,0,218,8,95,105,110,115,116,97,108,
- 108,114,69,2,0,0,204,6,0,0,115,71,0,0,0,128,
- 0,228,4,25,208,26,43,212,4,44,220,24,51,211,24,53,
- 208,4,21,220,4,7,135,78,129,78,215,4,25,209,4,25,
- 156,58,215,27,47,209,27,47,208,49,66,208,27,67,208,26,
- 68,212,4,69,220,4,7,135,77,129,77,215,4,24,209,4,
- 24,156,26,213,4,36,114,28,0,0,0,41,1,114,107,0,
- 0,0,114,77,0,0,0,41,3,78,78,78,41,2,114,1,
- 0,0,0,114,1,0,0,0,41,1,84,41,87,114,198,0,
- 0,0,114,207,0,0,0,114,234,0,0,0,114,114,0,0,
- 0,114,20,0,0,0,114,126,0,0,0,114,230,0,0,0,
- 114,31,0,0,0,114,60,1,0,0,218,2,110,116,114,23,
- 0,0,0,114,36,1,0,0,218,5,112,111,115,105,120,114,
- 61,0,0,0,218,3,97,108,108,114,62,0,0,0,114,179,
- 0,0,0,114,58,0,0,0,114,65,0,0,0,218,20,95,
- 112,97,116,104,115,101,112,115,95,119,105,116,104,95,99,111,
- 108,111,110,114,34,0,0,0,218,37,95,67,65,83,69,95,
- 73,78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,
- 70,79,82,77,83,95,66,89,84,69,83,95,75,69,89,114,
- 33,0,0,0,114,35,0,0,0,114,27,0,0,0,114,43,
- 0,0,0,114,49,0,0,0,114,53,0,0,0,114,72,0,
- 0,0,114,81,0,0,0,114,85,0,0,0,114,91,0,0,
- 0,114,93,0,0,0,114,96,0,0,0,114,100,0,0,0,
- 114,105,0,0,0,114,121,0,0,0,218,4,116,121,112,101,
- 218,8,95,95,99,111,100,101,95,95,114,233,0,0,0,114,
- 41,0,0,0,114,214,0,0,0,114,40,0,0,0,114,46,
- 0,0,0,114,111,1,0,0,114,143,0,0,0,114,139,0,
- 0,0,114,159,0,0,0,114,64,0,0,0,114,59,2,0,
- 0,114,61,1,0,0,114,140,0,0,0,218,23,68,69,66,
- 85,71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,
- 73,88,69,83,218,27,79,80,84,73,77,73,90,69,68,95,
- 66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,
- 83,114,152,0,0,0,114,167,0,0,0,114,177,0,0,0,
- 114,180,0,0,0,114,183,0,0,0,114,208,0,0,0,114,
- 219,0,0,0,114,224,0,0,0,114,227,0,0,0,114,237,
- 0,0,0,114,243,0,0,0,114,246,0,0,0,114,2,1,
- 0,0,114,25,1,0,0,114,14,1,0,0,114,20,1,0,
- 0,114,32,1,0,0,114,34,1,0,0,114,65,1,0,0,
- 114,86,1,0,0,114,119,1,0,0,114,150,1,0,0,114,
- 163,1,0,0,114,141,1,0,0,114,185,1,0,0,114,229,
- 1,0,0,218,16,95,78,97,109,101,115,112,97,99,101,76,
- 111,97,100,101,114,114,240,1,0,0,114,12,2,0,0,114,
- 57,2,0,0,114,13,1,0,0,114,65,2,0,0,114,69,
- 2,0,0,41,1,218,1,115,115,1,0,0,0,48,114,10,
- 0,0,0,218,8,60,109,111,100,117,108,101,62,114,81,2,
- 0,0,1,0,0,0,115,198,2,0,0,240,3,1,1,1,
- 241,2,7,1,4,240,44,0,14,18,128,10,243,6,0,1,
- 12,219,0,10,219,0,10,219,0,16,219,0,14,240,6,0,
- 16,19,143,124,137,124,152,119,209,15,38,128,11,217,3,14,
- 219,4,20,220,4,17,227,4,23,241,6,0,4,15,216,23,
- 27,152,83,144,107,129,79,224,23,26,144,101,128,79,225,7,
- 10,209,10,52,161,79,211,10,52,212,7,52,208,0,52,208,
- 7,52,216,11,26,152,49,209,11,29,128,8,217,17,22,144,
- 127,211,17,39,128,14,216,18,20,151,39,145,39,152,47,211,
- 18,42,128,15,217,41,56,211,23,57,169,31,160,65,152,33,
- 152,65,152,51,154,7,168,31,209,23,57,208,0,20,240,8,
- 0,39,45,208,0,35,216,40,58,208,0,37,216,32,69,216,
- 34,69,241,3,1,33,70,1,208,0,27,242,8,14,1,23,
- 241,32,0,15,31,211,14,32,128,11,242,6,2,1,55,242,
- 10,3,1,42,242,10,3,1,42,241,12,0,4,15,243,2,
- 27,5,42,242,60,3,5,63,242,12,5,1,34,242,16,7,
- 1,26,242,20,6,1,50,242,18,2,1,46,242,10,4,1,
- 46,241,14,0,4,15,243,2,5,5,82,1,242,16,2,5,
- 48,242,10,7,1,20,243,20,19,1,14,241,44,0,14,18,
- 144,45,215,18,40,209,18,40,211,13,41,128,10,240,112,7,
- 0,17,21,143,127,137,127,152,113,160,40,211,15,43,168,103,
- 209,15,53,128,12,224,20,23,151,78,145,78,160,60,176,24,
- 211,20,58,208,0,17,224,11,24,128,8,216,7,13,128,4,
- 224,19,24,144,39,128,15,217,3,14,216,4,19,215,4,26,
- 209,4,26,152,54,212,4,34,224,21,44,144,84,215,21,44,
- 209,21,44,211,21,46,208,0,18,224,21,27,144,72,208,0,
- 17,224,56,73,208,0,73,208,0,23,208,26,53,240,4,67,
- 1,1,48,192,20,244,0,67,1,1,48,242,76,2,37,1,
- 64,1,242,80,1,16,1,71,1,242,38,9,1,20,242,24,
- 9,1,16,242,24,28,1,31,242,62,30,1,17,242,66,1,
- 25,1,76,1,242,56,21,1,10,243,48,10,1,57,243,26,
- 7,1,16,243,20,8,1,16,242,22,9,1,68,1,241,28,
- 0,13,19,139,72,128,9,240,6,67,1,1,16,184,52,216,
- 55,64,244,3,67,1,1,16,242,76,2,45,1,23,247,100,
- 1,48,1,28,241,0,48,1,28,247,102,1,27,1,60,241,
- 0,27,1,60,244,60,78,2,1,27,144,61,244,0,78,2,
- 1,27,247,98,4,47,1,32,241,0,47,1,32,244,100,1,
- 42,1,45,144,122,160,60,244,0,42,1,45,244,90,1,22,
- 1,20,152,58,160,125,244,0,22,1,20,244,50,50,1,25,
- 152,42,160,109,244,0,50,1,25,247,106,1,65,1,1,32,
- 241,0,65,1,1,32,247,78,2,33,1,43,241,0,33,1,
- 43,240,74,1,0,20,35,208,0,16,247,10,121,1,1,70,
- 1,241,0,121,1,1,70,1,247,120,3,72,2,1,44,241,
- 0,72,2,1,44,243,90,4,22,1,13,242,50,8,1,42,
- 242,22,2,1,35,243,10,5,1,37,249,242,117,52,0,24,
- 58,115,6,0,0,0,193,52,12,71,55,4,
+ 19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,116,30,0,0,0,0,0,0,0,0,171,1,0,
+ 0,0,0,0,0,114,36,124,2,68,0,143,9,99,2,104,
+ 0,99,2,93,18,0,0,125,9,124,9,106,27,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
+ 0,0,0,0,0,0,0,146,2,140,20,4,0,99,2,125,
+ 9,124,0,95,16,0,0,0,0,0,0,0,0,121,3,121,
+ 3,35,0,116,8,0,0,0,0,0,0,0,0,116,10,0,
+ 0,0,0,0,0,0,0,116,12,0,0,0,0,0,0,0,
+ 0,102,3,36,0,114,5,1,0,103,0,125,2,89,0,140,
+ 232,119,0,120,3,89,0,119,1,99,2,1,0,99,2,125,
+ 9,119,0,41,4,122,68,70,105,108,108,32,116,104,101,32,
+ 99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105,
+ 97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112,
+ 97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115,
+ 32,100,105,114,101,99,116,111,114,121,46,114,14,0,0,0,
+ 114,103,0,0,0,78,41,17,114,68,0,0,0,114,23,0,
+ 0,0,218,7,108,105,115,116,100,105,114,114,95,0,0,0,
+ 114,1,2,0,0,218,15,80,101,114,109,105,115,115,105,111,
+ 110,69,114,114,111,114,218,18,78,111,116,65,68,105,114,101,
+ 99,116,111,114,121,69,114,114,111,114,114,20,0,0,0,114,
+ 31,0,0,0,114,32,0,0,0,114,18,2,0,0,114,19,
+ 2,0,0,114,159,0,0,0,114,173,0,0,0,218,3,97,
+ 100,100,114,33,0,0,0,114,20,2,0,0,41,10,114,190,
+ 0,0,0,114,68,0,0,0,218,8,99,111,110,116,101,110,
+ 116,115,218,21,108,111,119,101,114,95,115,117,102,102,105,120,
+ 95,99,111,110,116,101,110,116,115,114,226,1,0,0,114,188,
+ 0,0,0,114,199,1,0,0,114,179,1,0,0,218,8,110,
+ 101,119,95,110,97,109,101,218,2,102,110,115,10,0,0,0,
+ 32,32,32,32,32,32,32,32,32,32,114,10,0,0,0,114,
+ 28,2,0,0,122,22,70,105,108,101,70,105,110,100,101,114,
+ 46,95,102,105,108,108,95,99,97,99,104,101,112,6,0,0,
+ 115,4,1,0,0,128,0,224,15,19,143,121,137,121,136,4,
+ 240,2,5,9,26,220,23,26,151,123,145,123,160,52,210,35,
+ 55,172,51,175,58,169,58,171,60,211,23,56,136,72,244,14,
+ 0,16,19,143,124,137,124,215,15,38,209,15,38,160,117,212,
+ 15,45,220,31,34,160,56,155,125,136,68,213,12,28,244,14,
+ 0,37,40,163,69,208,12,33,219,24,32,144,4,216,36,40,
+ 167,78,161,78,176,51,211,36,55,209,16,33,144,4,144,99,
+ 152,54,217,19,22,216,34,38,160,22,160,113,168,22,175,28,
+ 169,28,171,30,208,40,56,208,31,57,145,72,224,31,35,144,
+ 72,216,16,37,215,16,41,209,16,41,168,40,213,16,51,240,
+ 13,0,25,33,240,14,0,32,53,136,68,212,12,28,220,11,
+ 14,143,60,137,60,215,11,34,209,11,34,212,35,62,212,11,
+ 63,217,61,69,211,39,70,185,88,176,114,168,2,175,8,169,
+ 8,173,10,184,88,209,39,70,136,68,213,12,36,240,3,0,
+ 12,64,1,248,244,47,0,17,34,164,63,212,52,70,208,15,
+ 71,242,0,3,9,26,240,6,0,24,26,138,72,240,7,3,
+ 9,26,252,242,48,0,40,71,1,115,23,0,0,0,142,43,
+ 68,9,0,195,40,23,68,37,4,196,9,22,68,34,3,196,
+ 33,1,68,34,3,99,1,0,0,0,0,0,0,0,0,0,
+ 0,0,2,0,0,0,7,0,0,0,243,22,0,0,0,135,
+ 0,135,1,151,0,136,0,136,1,102,2,100,1,132,8,125,
+ 2,124,2,83,0,41,2,97,20,1,0,0,65,32,99,108,
+ 97,115,115,32,109,101,116,104,111,100,32,119,104,105,99,104,
+ 32,114,101,116,117,114,110,115,32,97,32,99,108,111,115,117,
+ 114,101,32,116,111,32,117,115,101,32,111,110,32,115,121,115,
+ 46,112,97,116,104,95,104,111,111,107,10,32,32,32,32,32,
+ 32,32,32,119,104,105,99,104,32,119,105,108,108,32,114,101,
+ 116,117,114,110,32,97,110,32,105,110,115,116,97,110,99,101,
+ 32,117,115,105,110,103,32,116,104,101,32,115,112,101,99,105,
+ 102,105,101,100,32,108,111,97,100,101,114,115,32,97,110,100,
+ 32,116,104,101,32,112,97,116,104,10,32,32,32,32,32,32,
+ 32,32,99,97,108,108,101,100,32,111,110,32,116,104,101,32,
+ 99,108,111,115,117,114,101,46,10,10,32,32,32,32,32,32,
+ 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,97,
+ 108,108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,
+ 117,114,101,32,105,115,32,110,111,116,32,97,32,100,105,114,
+ 101,99,116,111,114,121,44,32,73,109,112,111,114,116,69,114,
+ 114,111,114,32,105,115,10,32,32,32,32,32,32,32,32,114,
+ 97,105,115,101,100,46,10,10,32,32,32,32,32,32,32,32,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
+ 0,19,0,0,0,243,70,0,0,0,149,2,151,0,116,1,
+ 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
+ 0,0,115,13,116,3,0,0,0,0,0,0,0,0,100,1,
+ 124,0,172,2,171,2,0,0,0,0,0,0,130,1,2,0,
+ 137,1,124,0,103,1,137,2,162,1,173,6,142,0,83,0,
+ 41,3,122,45,80,97,116,104,32,104,111,111,107,32,102,111,
+ 114,32,105,109,112,111,114,116,108,105,98,46,109,97,99,104,
+ 105,110,101,114,121,46,70,105,108,101,70,105,110,100,101,114,
+ 46,122,30,111,110,108,121,32,100,105,114,101,99,116,111,114,
+ 105,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,
+ 100,114,84,0,0,0,41,2,114,96,0,0,0,114,189,0,
+ 0,0,41,3,114,68,0,0,0,114,51,1,0,0,114,21,
+ 2,0,0,115,3,0,0,0,32,128,128,114,10,0,0,0,
+ 218,24,112,97,116,104,95,104,111,111,107,95,102,111,114,95,
+ 70,105,108,101,70,105,110,100,101,114,122,54,70,105,108,101,
+ 70,105,110,100,101,114,46,112,97,116,104,95,104,111,111,107,
+ 46,60,108,111,99,97,108,115,62,46,112,97,116,104,95,104,
+ 111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100,
+ 101,114,153,6,0,0,115,41,0,0,0,248,128,0,228,19,
+ 30,152,116,212,19,36,220,22,33,208,34,66,200,20,212,22,
+ 78,208,16,78,217,19,22,144,116,208,19,45,152,110,210,19,
+ 45,208,12,45,114,28,0,0,0,114,30,0,0,0,41,3,
+ 114,51,1,0,0,114,21,2,0,0,114,47,2,0,0,115,
+ 3,0,0,0,96,96,32,114,10,0,0,0,218,9,112,97,
+ 116,104,95,104,111,111,107,122,20,70,105,108,101,70,105,110,
+ 100,101,114,46,112,97,116,104,95,104,111,111,107,143,6,0,
+ 0,115,16,0,0,0,249,128,0,245,20,4,9,46,240,12,
+ 0,16,40,208,8,39,114,28,0,0,0,99,1,0,0,0,
+ 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
+ 243,34,0,0,0,151,0,100,1,124,0,106,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,
+ 2,100,2,157,3,83,0,41,3,78,122,11,70,105,108,101,
+ 70,105,110,100,101,114,40,114,222,1,0,0,114,84,0,0,
+ 0,114,132,1,0,0,115,1,0,0,0,32,114,10,0,0,
+ 0,114,223,1,0,0,122,19,70,105,108,101,70,105,110,100,
+ 101,114,46,95,95,114,101,112,114,95,95,161,6,0,0,115,
+ 21,0,0,0,128,0,216,17,28,152,84,159,89,153,89,152,
+ 77,168,17,208,15,43,208,8,43,114,28,0,0,0,114,77,
+ 0,0,0,41,12,114,197,0,0,0,114,196,0,0,0,114,
+ 198,0,0,0,114,199,0,0,0,114,68,1,0,0,114,243,
+ 1,0,0,114,8,2,0,0,114,59,1,0,0,114,28,2,
+ 0,0,114,64,1,0,0,114,48,2,0,0,114,223,1,0,
+ 0,114,30,0,0,0,114,28,0,0,0,114,10,0,0,0,
+ 114,13,2,0,0,114,13,2,0,0,26,6,0,0,115,60,
+ 0,0,0,132,0,241,4,5,5,8,242,14,15,5,41,242,
+ 34,2,5,30,242,8,3,5,72,1,243,10,49,5,20,242,
+ 102,1,29,5,71,1,240,62,0,6,17,241,2,15,5,40,
+ 243,3,0,6,17,240,2,15,5,40,243,34,1,5,44,114,
+ 28,0,0,0,114,13,2,0,0,99,4,0,0,0,0,0,
+ 0,0,0,0,0,0,5,0,0,0,3,0,0,0,243,50,
+ 1,0,0,151,0,124,0,106,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,100,1,171,1,0,
+ 0,0,0,0,0,125,4,124,0,106,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,100,2,171,
+ 1,0,0,0,0,0,0,125,5,124,4,115,45,124,5,114,
+ 13,124,5,106,2,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,125,4,110,30,124,2,124,3,107,
+ 40,0,0,114,13,116,5,0,0,0,0,0,0,0,0,124,
+ 1,124,2,171,2,0,0,0,0,0,0,125,4,110,12,116,
+ 7,0,0,0,0,0,0,0,0,124,1,124,2,171,2,0,
+ 0,0,0,0,0,125,4,124,5,115,32,116,9,0,0,0,
+ 0,0,0,0,0,124,1,124,2,124,4,172,3,171,3,0,
+ 0,0,0,0,0,125,5,124,3,114,16,116,11,0,0,0,
+ 0,0,0,0,0,124,3,171,1,0,0,0,0,0,0,124,
+ 5,95,6,0,0,0,0,0,0,0,0,9,0,124,5,124,
+ 0,100,2,60,0,0,0,124,4,124,0,100,1,60,0,0,
+ 0,124,2,124,0,100,4,60,0,0,0,124,3,124,0,100,
+ 5,60,0,0,0,121,0,35,0,116,14,0,0,0,0,0,
+ 0,0,0,36,0,114,3,1,0,89,0,121,0,119,0,120,
+ 3,89,0,119,1,41,6,78,114,23,1,0,0,114,24,1,
+ 0,0,41,1,114,5,1,0,0,218,8,95,95,102,105,108,
+ 101,95,95,218,10,95,95,99,97,99,104,101,100,95,95,41,
+ 8,114,27,1,0,0,114,5,1,0,0,114,164,1,0,0,
+ 114,151,1,0,0,114,21,1,0,0,114,105,0,0,0,218,
+ 6,99,97,99,104,101,100,218,9,69,120,99,101,112,116,105,
+ 111,110,41,6,218,2,110,115,114,188,0,0,0,218,8,112,
+ 97,116,104,110,97,109,101,218,9,99,112,97,116,104,110,97,
+ 109,101,114,5,1,0,0,114,17,1,0,0,115,6,0,0,
+ 0,32,32,32,32,32,32,114,10,0,0,0,218,14,95,102,
+ 105,120,95,117,112,95,109,111,100,117,108,101,114,58,2,0,
+ 0,167,6,0,0,115,170,0,0,0,128,0,224,13,15,143,
+ 86,137,86,144,76,211,13,33,128,70,216,11,13,143,54,137,
+ 54,144,42,211,11,29,128,68,217,11,17,217,11,15,216,21,
+ 25,151,91,145,91,137,70,216,13,21,152,25,210,13,34,220,
+ 21,41,168,36,176,8,211,21,57,137,70,228,21,37,160,100,
+ 168,72,211,21,53,136,70,217,11,15,220,15,38,160,116,168,
+ 88,184,102,212,15,69,136,4,217,11,20,220,26,39,168,9,
+ 211,26,50,136,68,140,75,240,2,7,5,13,216,25,29,136,
+ 2,136,58,137,14,216,27,33,136,2,136,60,209,8,24,216,
+ 25,33,136,2,136,58,137,14,216,27,36,136,2,136,60,210,
+ 8,24,248,220,11,20,242,0,2,5,13,225,8,12,240,5,
+ 2,5,13,250,115,18,0,0,0,193,53,20,66,10,0,194,
+ 10,9,66,22,3,194,21,1,66,22,3,99,0,0,0,0,
+ 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
+ 243,112,0,0,0,151,0,116,0,0,0,0,0,0,0,0,
+ 0,116,3,0,0,0,0,0,0,0,0,106,4,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
+ 0,0,0,0,0,0,0,102,2,125,0,116,6,0,0,0,
+ 0,0,0,0,0,116,8,0,0,0,0,0,0,0,0,102,
+ 2,125,1,116,10,0,0,0,0,0,0,0,0,116,12,0,
+ 0,0,0,0,0,0,0,102,2,125,2,124,0,124,1,124,
+ 2,103,3,83,0,41,1,122,95,82,101,116,117,114,110,115,
+ 32,97,32,108,105,115,116,32,111,102,32,102,105,108,101,45,
+ 98,97,115,101,100,32,109,111,100,117,108,101,32,108,111,97,
+ 100,101,114,115,46,10,10,32,32,32,32,69,97,99,104,32,
+ 105,116,101,109,32,105,115,32,97,32,116,117,112,108,101,32,
+ 40,108,111,97,100,101,114,44,32,115,117,102,102,105,120,101,
+ 115,41,46,10,32,32,32,32,41,7,114,142,1,0,0,114,
+ 235,0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,
+ 115,117,102,102,105,120,101,115,114,151,1,0,0,114,160,0,
+ 0,0,114,164,1,0,0,114,141,0,0,0,41,3,218,10,
+ 101,120,116,101,110,115,105,111,110,115,218,6,115,111,117,114,
+ 99,101,218,8,98,121,116,101,99,111,100,101,115,3,0,0,
+ 0,32,32,32,114,10,0,0,0,114,14,1,0,0,114,14,
+ 1,0,0,192,6,0,0,115,57,0,0,0,128,0,244,10,
+ 0,18,37,164,100,215,38,61,209,38,61,211,38,63,208,17,
+ 63,128,74,220,13,29,156,127,208,13,46,128,70,220,15,35,
+ 212,37,54,208,15,54,128,72,216,12,22,152,6,160,8,208,
+ 11,41,208,4,41,114,28,0,0,0,99,1,0,0,0,0,
+ 0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,243,
+ 8,0,0,0,151,0,124,0,97,0,121,0,114,77,0,0,
+ 0,41,1,114,208,0,0,0,41,1,218,17,95,98,111,111,
+ 116,115,116,114,97,112,95,109,111,100,117,108,101,115,1,0,
+ 0,0,32,114,10,0,0,0,218,21,95,115,101,116,95,98,
+ 111,111,116,115,116,114,97,112,95,109,111,100,117,108,101,114,
+ 66,2,0,0,203,6,0,0,115,7,0,0,0,128,0,224,
+ 17,34,129,74,114,28,0,0,0,99,1,0,0,0,0,0,
+ 0,0,0,0,0,0,5,0,0,0,3,0,0,0,243,212,
+ 0,0,0,151,0,116,1,0,0,0,0,0,0,0,0,124,
+ 0,171,1,0,0,0,0,0,0,1,0,116,3,0,0,0,
+ 0,0,0,0,0,171,0,0,0,0,0,0,0,125,1,116,
+ 4,0,0,0,0,0,0,0,0,106,6,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,106,9,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,116,11,0,0,0,0,0,0,0,0,106,12,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
+ 1,142,0,103,1,171,1,0,0,0,0,0,0,1,0,116,
+ 4,0,0,0,0,0,0,0,0,106,14,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,106,17,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,116,18,0,0,0,0,0,0,0,0,171,1,0,0,0,
+ 0,0,0,1,0,121,1,41,2,122,41,73,110,115,116,97,
+ 108,108,32,116,104,101,32,112,97,116,104,45,98,97,115,101,
+ 100,32,105,109,112,111,114,116,32,99,111,109,112,111,110,101,
+ 110,116,115,46,78,41,10,114,66,2,0,0,114,14,1,0,
+ 0,114,20,0,0,0,114,252,1,0,0,114,241,0,0,0,
+ 114,13,2,0,0,114,48,2,0,0,218,9,109,101,116,97,
+ 95,112,97,116,104,114,64,0,0,0,114,241,1,0,0,41,
+ 2,114,65,2,0,0,218,17,115,117,112,112,111,114,116,101,
+ 100,95,108,111,97,100,101,114,115,115,2,0,0,0,32,32,
+ 114,10,0,0,0,218,8,95,105,110,115,116,97,108,108,114,
+ 70,2,0,0,208,6,0,0,115,71,0,0,0,128,0,228,
+ 4,25,208,26,43,212,4,44,220,24,51,211,24,53,208,4,
+ 21,220,4,7,135,78,129,78,215,4,25,209,4,25,156,58,
+ 215,27,47,209,27,47,208,49,66,208,27,67,208,26,68,212,
+ 4,69,220,4,7,135,77,129,77,215,4,24,209,4,24,156,
+ 26,213,4,36,114,28,0,0,0,41,1,114,107,0,0,0,
+ 114,77,0,0,0,41,3,78,78,78,41,2,114,1,0,0,
+ 0,114,1,0,0,0,41,1,84,41,87,114,199,0,0,0,
+ 114,208,0,0,0,114,235,0,0,0,114,114,0,0,0,114,
+ 20,0,0,0,114,127,0,0,0,114,231,0,0,0,114,31,
+ 0,0,0,114,61,1,0,0,218,2,110,116,114,23,0,0,
+ 0,114,37,1,0,0,218,5,112,111,115,105,120,114,61,0,
+ 0,0,218,3,97,108,108,114,62,0,0,0,114,180,0,0,
+ 0,114,58,0,0,0,114,65,0,0,0,218,20,95,112,97,
+ 116,104,115,101,112,115,95,119,105,116,104,95,99,111,108,111,
+ 110,114,34,0,0,0,218,37,95,67,65,83,69,95,73,78,
+ 83,69,78,83,73,84,73,86,69,95,80,76,65,84,70,79,
+ 82,77,83,95,66,89,84,69,83,95,75,69,89,114,33,0,
+ 0,0,114,35,0,0,0,114,27,0,0,0,114,43,0,0,
+ 0,114,49,0,0,0,114,53,0,0,0,114,72,0,0,0,
+ 114,81,0,0,0,114,85,0,0,0,114,91,0,0,0,114,
+ 93,0,0,0,114,96,0,0,0,114,100,0,0,0,114,105,
+ 0,0,0,114,122,0,0,0,218,4,116,121,112,101,218,8,
+ 95,95,99,111,100,101,95,95,114,234,0,0,0,114,41,0,
+ 0,0,114,215,0,0,0,114,40,0,0,0,114,46,0,0,
+ 0,114,112,1,0,0,114,144,0,0,0,114,140,0,0,0,
+ 114,160,0,0,0,114,64,0,0,0,114,60,2,0,0,114,
+ 62,1,0,0,114,141,0,0,0,218,23,68,69,66,85,71,
+ 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,
+ 69,83,218,27,79,80,84,73,77,73,90,69,68,95,66,89,
+ 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,114,
+ 153,0,0,0,114,168,0,0,0,114,178,0,0,0,114,181,
+ 0,0,0,114,184,0,0,0,114,209,0,0,0,114,220,0,
+ 0,0,114,225,0,0,0,114,228,0,0,0,114,238,0,0,
+ 0,114,244,0,0,0,114,247,0,0,0,114,3,1,0,0,
+ 114,26,1,0,0,114,15,1,0,0,114,21,1,0,0,114,
+ 33,1,0,0,114,35,1,0,0,114,66,1,0,0,114,87,
+ 1,0,0,114,120,1,0,0,114,151,1,0,0,114,164,1,
+ 0,0,114,142,1,0,0,114,186,1,0,0,114,230,1,0,
+ 0,218,16,95,78,97,109,101,115,112,97,99,101,76,111,97,
+ 100,101,114,114,241,1,0,0,114,13,2,0,0,114,58,2,
+ 0,0,114,14,1,0,0,114,66,2,0,0,114,70,2,0,
+ 0,41,1,218,1,115,115,1,0,0,0,48,114,10,0,0,
+ 0,218,8,60,109,111,100,117,108,101,62,114,82,2,0,0,
+ 1,0,0,0,115,198,2,0,0,240,3,1,1,1,241,2,
+ 7,1,4,240,44,0,14,18,128,10,243,6,0,1,12,219,
+ 0,10,219,0,10,219,0,16,219,0,14,240,6,0,16,19,
+ 143,124,137,124,152,119,209,15,38,128,11,217,3,14,219,4,
+ 20,220,4,17,227,4,23,241,6,0,4,15,216,23,27,152,
+ 83,144,107,129,79,224,23,26,144,101,128,79,225,7,10,209,
+ 10,52,161,79,211,10,52,212,7,52,208,0,52,208,7,52,
+ 216,11,26,152,49,209,11,29,128,8,217,17,22,144,127,211,
+ 17,39,128,14,216,18,20,151,39,145,39,152,47,211,18,42,
+ 128,15,217,41,56,211,23,57,169,31,160,65,152,33,152,65,
+ 152,51,154,7,168,31,209,23,57,208,0,20,240,8,0,39,
+ 45,208,0,35,216,40,58,208,0,37,216,32,69,216,34,69,
+ 241,3,1,33,70,1,208,0,27,242,8,14,1,23,241,32,
+ 0,15,31,211,14,32,128,11,242,6,2,1,55,242,10,3,
+ 1,42,242,10,3,1,42,241,12,0,4,15,243,2,27,5,
+ 42,242,60,3,5,63,242,12,5,1,34,242,16,7,1,26,
+ 242,20,6,1,50,242,18,2,1,46,242,10,4,1,46,241,
+ 14,0,4,15,243,2,5,5,82,1,242,16,2,5,48,242,
+ 10,7,1,20,243,20,23,1,14,241,52,0,14,18,144,45,
+ 215,18,40,209,18,40,211,13,41,128,10,240,112,7,0,17,
+ 21,143,127,137,127,152,113,160,40,211,15,43,168,103,209,15,
+ 53,128,12,224,20,23,151,78,145,78,160,60,176,24,211,20,
+ 58,208,0,17,224,11,24,128,8,216,7,13,128,4,224,19,
+ 24,144,39,128,15,217,3,14,216,4,19,215,4,26,209,4,
+ 26,152,54,212,4,34,224,21,44,144,84,215,21,44,209,21,
+ 44,211,21,46,208,0,18,224,21,27,144,72,208,0,17,224,
+ 56,73,208,0,73,208,0,23,208,26,53,240,4,67,1,1,
+ 48,192,20,244,0,67,1,1,48,242,76,2,37,1,64,1,
+ 242,80,1,16,1,71,1,242,38,9,1,20,242,24,9,1,
+ 16,242,24,28,1,31,242,62,30,1,17,242,66,1,25,1,
+ 76,1,242,56,21,1,10,243,48,10,1,57,243,26,7,1,
+ 16,243,20,8,1,16,242,22,9,1,68,1,241,28,0,13,
+ 19,139,72,128,9,240,6,67,1,1,16,184,52,216,55,64,
+ 244,3,67,1,1,16,242,76,2,45,1,23,247,100,1,48,
+ 1,28,241,0,48,1,28,247,102,1,27,1,60,241,0,27,
+ 1,60,244,60,78,2,1,27,144,61,244,0,78,2,1,27,
+ 247,98,4,47,1,32,241,0,47,1,32,244,100,1,42,1,
+ 45,144,122,160,60,244,0,42,1,45,244,90,1,22,1,20,
+ 152,58,160,125,244,0,22,1,20,244,50,50,1,25,152,42,
+ 160,109,244,0,50,1,25,247,106,1,65,1,1,32,241,0,
+ 65,1,1,32,247,78,2,33,1,43,241,0,33,1,43,240,
+ 74,1,0,20,35,208,0,16,247,10,121,1,1,70,1,241,
+ 0,121,1,1,70,1,247,120,3,72,2,1,44,241,0,72,
+ 2,1,44,243,90,4,22,1,13,242,50,8,1,42,242,22,
+ 2,1,35,243,10,5,1,37,249,242,125,52,0,24,58,115,
+ 6,0,0,0,193,52,12,71,55,4,
};
diff --git a/contrib/tools/python3/Python/frozen_modules/ntpath.h b/contrib/tools/python3/Python/frozen_modules/ntpath.h
index eadc882495..2ca7a45419 100644
--- a/contrib/tools/python3/Python/frozen_modules/ntpath.h
+++ b/contrib/tools/python3/Python/frozen_modules/ntpath.h
@@ -1,7 +1,7 @@
/* Auto-generated by Programs/_freeze_module.py */
const unsigned char _Py_M__ntpath[] = {
227,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
- 0,0,0,0,0,243,158,2,0,0,151,0,100,0,90,0,
+ 0,0,0,0,0,243,154,2,0,0,151,0,100,0,90,0,
100,1,90,1,100,2,90,2,100,1,90,3,100,3,90,4,
100,4,90,5,100,5,90,6,100,6,90,7,100,7,90,8,
100,8,100,9,108,9,90,9,100,8,100,9,108,10,90,10,
@@ -22,775 +22,810 @@ const unsigned char _Py_M__ntpath[] = {
132,0,90,36,9,0,100,8,100,28,108,37,109,38,90,38,
1,0,100,29,132,0,90,39,100,30,132,0,90,40,100,31,
132,0,90,41,9,0,100,8,100,32,108,37,109,42,90,43,
- 1,0,100,34,132,0,90,44,9,0,100,8,100,35,108,37,
- 109,45,90,45,1,0,100,36,132,0,90,46,9,0,100,8,
- 100,37,108,37,109,47,90,47,109,48,90,49,1,0,100,38,
- 132,0,90,50,100,39,132,0,90,51,100,40,100,41,156,1,
- 100,42,132,2,90,52,100,43,90,53,100,53,100,44,132,1,
- 90,54,100,45,132,0,90,55,9,0,100,8,100,46,108,37,
- 109,56,90,57,1,0,100,8,100,47,108,37,109,58,90,59,
- 1,0,100,8,100,48,108,37,109,60,90,61,1,0,100,8,
- 100,49,108,37,109,62,90,63,1,0,9,0,100,8,100,50,
- 108,37,109,64,90,64,1,0,100,51,132,0,90,65,121,9,
- 35,0,101,23,36,0,114,6,1,0,100,15,132,0,90,22,
- 89,0,140,192,119,0,120,3,89,0,119,1,35,0,101,23,
- 36,0,114,5,1,0,100,9,90,38,89,0,140,118,119,0,
- 120,3,89,0,119,1,35,0,101,23,36,0,114,6,1,0,
- 100,33,132,0,90,43,89,0,140,116,119,0,120,3,89,0,
- 119,1,35,0,101,23,36,0,114,5,1,0,101,44,90,46,
- 89,0,140,116,119,0,120,3,89,0,119,1,35,0,101,23,
- 36,0,114,5,1,0,101,46,90,52,89,0,140,108,119,0,
- 120,3,89,0,119,1,35,0,101,23,36,0,114,3,1,0,
- 89,0,140,85,119,0,120,3,89,0,119,1,35,0,101,23,
- 36,0,114,6,1,0,100,52,132,0,90,65,89,0,121,9,
- 119,0,120,3,89,0,119,1,41,54,122,144,67,111,109,109,
- 111,110,32,112,97,116,104,110,97,109,101,32,109,97,110,105,
- 112,117,108,97,116,105,111,110,115,44,32,87,105,110,100,111,
- 119,115,78,84,47,57,53,32,118,101,114,115,105,111,110,46,
- 10,10,73,110,115,116,101,97,100,32,111,102,32,105,109,112,
- 111,114,116,105,110,103,32,116,104,105,115,32,109,111,100,117,
- 108,101,32,100,105,114,101,99,116,108,121,44,32,105,109,112,
- 111,114,116,32,111,115,32,97,110,100,32,114,101,102,101,114,
- 32,116,111,32,116,104,105,115,10,109,111,100,117,108,101,32,
- 97,115,32,111,115,46,112,97,116,104,46,10,218,1,46,250,
- 2,46,46,218,1,92,218,1,59,218,1,47,122,8,46,59,
- 67,58,92,98,105,110,218,3,110,117,108,233,0,0,0,0,
- 78,41,1,218,1,42,41,40,218,8,110,111,114,109,99,97,
- 115,101,218,5,105,115,97,98,115,218,4,106,111,105,110,218,
- 10,115,112,108,105,116,100,114,105,118,101,218,9,115,112,108,
- 105,116,114,111,111,116,218,5,115,112,108,105,116,218,8,115,
- 112,108,105,116,101,120,116,218,8,98,97,115,101,110,97,109,
- 101,218,7,100,105,114,110,97,109,101,218,12,99,111,109,109,
- 111,110,112,114,101,102,105,120,218,7,103,101,116,115,105,122,
- 101,218,8,103,101,116,109,116,105,109,101,218,8,103,101,116,
- 97,116,105,109,101,218,8,103,101,116,99,116,105,109,101,218,
- 6,105,115,108,105,110,107,218,6,101,120,105,115,116,115,218,
- 7,108,101,120,105,115,116,115,218,5,105,115,100,105,114,218,
- 6,105,115,102,105,108,101,218,7,105,115,109,111,117,110,116,
- 218,10,101,120,112,97,110,100,117,115,101,114,218,10,101,120,
- 112,97,110,100,118,97,114,115,218,8,110,111,114,109,112,97,
- 116,104,218,7,97,98,115,112,97,116,104,218,6,99,117,114,
- 100,105,114,218,6,112,97,114,100,105,114,218,3,115,101,112,
- 218,7,112,97,116,104,115,101,112,218,7,100,101,102,112,97,
- 116,104,218,6,97,108,116,115,101,112,218,6,101,120,116,115,
- 101,112,218,7,100,101,118,110,117,108,108,218,8,114,101,97,
- 108,112,97,116,104,218,26,115,117,112,112,111,114,116,115,95,
- 117,110,105,99,111,100,101,95,102,105,108,101,110,97,109,101,
- 115,218,7,114,101,108,112,97,116,104,218,8,115,97,109,101,
- 102,105,108,101,218,12,115,97,109,101,111,112,101,110,102,105,
- 108,101,218,8,115,97,109,101,115,116,97,116,218,10,99,111,
- 109,109,111,110,112,97,116,104,218,10,105,115,106,117,110,99,
- 116,105,111,110,99,1,0,0,0,0,0,0,0,0,0,0,
- 0,4,0,0,0,3,0,0,0,243,38,0,0,0,151,0,
- 116,1,0,0,0,0,0,0,0,0,124,0,116,2,0,0,
- 0,0,0,0,0,0,171,2,0,0,0,0,0,0,114,1,
- 121,1,121,2,41,3,78,243,2,0,0,0,92,47,250,2,
- 92,47,41,2,218,10,105,115,105,110,115,116,97,110,99,101,
- 218,5,98,121,116,101,115,169,1,218,4,112,97,116,104,115,
- 1,0,0,0,32,250,15,60,102,114,111,122,101,110,32,110,
- 116,112,97,116,104,62,218,13,95,103,101,116,95,98,111,116,
- 104,115,101,112,115,114,58,0,0,0,35,0,0,0,115,18,
- 0,0,0,128,0,220,7,17,144,36,156,5,212,7,30,216,
- 15,21,224,15,20,243,0,0,0,0,41,3,218,13,76,67,
- 77,97,112,83,116,114,105,110,103,69,120,218,21,76,79,67,
- 65,76,69,95,78,65,77,69,95,73,78,86,65,82,73,65,
- 78,84,218,15,76,67,77,65,80,95,76,79,87,69,82,67,
- 65,83,69,99,1,0,0,0,0,0,0,0,0,0,0,0,
- 8,0,0,0,3,0,0,0,243,88,1,0,0,151,0,116,
- 1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,171,
- 1,0,0,0,0,0,0,125,0,124,0,115,2,124,0,83,
- 0,116,5,0,0,0,0,0,0,0,0,124,0,116,6,0,
- 0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,114,
- 93,116,9,0,0,0,0,0,0,0,0,106,10,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
- 0,0,0,0,0,0,0,125,1,124,0,106,13,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
- 1,100,1,171,2,0,0,0,0,0,0,106,15,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,
- 2,100,3,171,2,0,0,0,0,0,0,125,0,116,17,0,
- 0,0,0,0,0,0,0,116,18,0,0,0,0,0,0,0,
- 0,116,20,0,0,0,0,0,0,0,0,124,0,171,3,0,
- 0,0,0,0,0,125,0,124,0,106,23,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,100,
- 1,171,2,0,0,0,0,0,0,83,0,116,17,0,0,0,
- 0,0,0,0,0,116,18,0,0,0,0,0,0,0,0,116,
- 20,0,0,0,0,0,0,0,0,124,0,106,15,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,
- 2,100,3,171,2,0,0,0,0,0,0,171,3,0,0,0,
- 0,0,0,83,0,41,4,250,110,78,111,114,109,97,108,105,
- 122,101,32,99,97,115,101,32,111,102,32,112,97,116,104,110,
- 97,109,101,46,10,10,32,32,32,32,32,32,32,32,77,97,
- 107,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,
- 114,115,32,108,111,119,101,114,99,97,115,101,32,97,110,100,
- 32,97,108,108,32,115,108,97,115,104,101,115,32,105,110,116,
- 111,32,98,97,99,107,115,108,97,115,104,101,115,46,10,32,
- 32,32,32,32,32,32,32,218,15,115,117,114,114,111,103,97,
- 116,101,101,115,99,97,112,101,114,6,0,0,0,114,4,0,
- 0,0,41,12,218,2,111,115,218,6,102,115,112,97,116,104,
- 114,53,0,0,0,114,54,0,0,0,218,3,115,121,115,218,
- 21,103,101,116,102,105,108,101,115,121,115,116,101,109,101,110,
- 99,111,100,105,110,103,218,6,100,101,99,111,100,101,218,7,
- 114,101,112,108,97,99,101,218,14,95,76,67,77,97,112,83,
- 116,114,105,110,103,69,120,218,22,95,76,79,67,65,76,69,
- 95,78,65,77,69,95,73,78,86,65,82,73,65,78,84,218,
- 16,95,76,67,77,65,80,95,76,79,87,69,82,67,65,83,
- 69,218,6,101,110,99,111,100,101,41,2,218,1,115,218,8,
- 101,110,99,111,100,105,110,103,115,2,0,0,0,32,32,114,
- 57,0,0,0,114,10,0,0,0,114,10,0,0,0,51,0,
- 0,0,115,148,0,0,0,128,0,244,10,0,13,15,143,73,
- 137,73,144,97,139,76,136,1,217,15,16,216,19,20,136,72,
- 220,11,21,144,97,156,21,212,11,31,220,23,26,215,23,48,
- 209,23,48,211,23,50,136,72,216,16,17,151,8,145,8,152,
- 24,208,35,52,211,16,53,215,16,61,209,16,61,184,99,192,
- 52,211,16,72,136,65,220,16,30,212,31,53,220,31,47,176,
- 17,243,3,1,17,52,136,65,224,19,20,151,56,145,56,152,
- 72,208,38,55,211,19,56,208,12,56,228,19,33,212,34,56,
- 220,34,50,216,34,35,167,41,161,41,168,67,176,20,211,34,
- 54,243,5,2,20,56,240,0,2,13,56,114,59,0,0,0,
- 99,1,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
- 0,3,0,0,0,243,24,1,0,0,151,0,116,1,0,0,
- 0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
- 0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,0,
- 124,0,116,6,0,0,0,0,0,0,0,0,171,2,0,0,
- 0,0,0,0,114,70,116,1,0,0,0,0,0,0,0,0,
- 106,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,116,1,0,0,0,0,0,0,0,0,106,10,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,0,171,1,0,0,0,0,0,0,106,13,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 100,1,100,2,171,2,0,0,0,0,0,0,106,15,0,0,
+ 1,0,9,0,100,8,100,34,108,37,109,44,90,44,1,0,
+ 100,35,132,0,90,45,9,0,100,8,100,37,108,37,109,46,
+ 90,46,109,47,90,48,1,0,100,38,132,0,90,49,100,39,
+ 132,0,90,50,100,40,100,41,156,1,100,42,132,2,90,51,
+ 100,43,90,52,100,53,100,44,132,1,90,53,100,45,132,0,
+ 90,54,9,0,100,8,100,46,108,37,109,55,90,56,1,0,
+ 100,8,100,47,108,37,109,57,90,58,1,0,100,8,100,48,
+ 108,37,109,59,90,60,1,0,100,8,100,49,108,37,109,61,
+ 90,62,1,0,9,0,100,8,100,50,108,37,109,63,90,63,
+ 1,0,100,51,132,0,90,64,121,9,35,0,101,23,36,0,
+ 114,6,1,0,100,15,132,0,90,22,89,0,140,189,119,0,
+ 120,3,89,0,119,1,35,0,101,23,36,0,114,5,1,0,
+ 100,9,90,38,89,0,140,115,119,0,120,3,89,0,119,1,
+ 35,0,101,23,36,0,114,6,1,0,100,33,132,0,90,43,
+ 89,0,140,113,119,0,120,3,89,0,119,1,35,0,101,23,
+ 36,0,114,6,1,0,100,36,132,0,90,45,89,0,140,117,
+ 119,0,120,3,89,0,119,1,35,0,101,23,36,0,114,5,
+ 1,0,101,45,90,51,89,0,140,109,119,0,120,3,89,0,
+ 119,1,35,0,101,23,36,0,114,3,1,0,89,0,140,86,
+ 119,0,120,3,89,0,119,1,35,0,101,23,36,0,114,6,
+ 1,0,100,52,132,0,90,64,89,0,121,9,119,0,120,3,
+ 89,0,119,1,41,54,122,144,67,111,109,109,111,110,32,112,
+ 97,116,104,110,97,109,101,32,109,97,110,105,112,117,108,97,
+ 116,105,111,110,115,44,32,87,105,110,100,111,119,115,78,84,
+ 47,57,53,32,118,101,114,115,105,111,110,46,10,10,73,110,
+ 115,116,101,97,100,32,111,102,32,105,109,112,111,114,116,105,
+ 110,103,32,116,104,105,115,32,109,111,100,117,108,101,32,100,
+ 105,114,101,99,116,108,121,44,32,105,109,112,111,114,116,32,
+ 111,115,32,97,110,100,32,114,101,102,101,114,32,116,111,32,
+ 116,104,105,115,10,109,111,100,117,108,101,32,97,115,32,111,
+ 115,46,112,97,116,104,46,10,218,1,46,250,2,46,46,218,
+ 1,92,218,1,59,218,1,47,122,8,46,59,67,58,92,98,
+ 105,110,218,3,110,117,108,233,0,0,0,0,78,41,1,218,
+ 1,42,41,40,218,8,110,111,114,109,99,97,115,101,218,5,
+ 105,115,97,98,115,218,4,106,111,105,110,218,10,115,112,108,
+ 105,116,100,114,105,118,101,218,9,115,112,108,105,116,114,111,
+ 111,116,218,5,115,112,108,105,116,218,8,115,112,108,105,116,
+ 101,120,116,218,8,98,97,115,101,110,97,109,101,218,7,100,
+ 105,114,110,97,109,101,218,12,99,111,109,109,111,110,112,114,
+ 101,102,105,120,218,7,103,101,116,115,105,122,101,218,8,103,
+ 101,116,109,116,105,109,101,218,8,103,101,116,97,116,105,109,
+ 101,218,8,103,101,116,99,116,105,109,101,218,6,105,115,108,
+ 105,110,107,218,6,101,120,105,115,116,115,218,7,108,101,120,
+ 105,115,116,115,218,5,105,115,100,105,114,218,6,105,115,102,
+ 105,108,101,218,7,105,115,109,111,117,110,116,218,10,101,120,
+ 112,97,110,100,117,115,101,114,218,10,101,120,112,97,110,100,
+ 118,97,114,115,218,8,110,111,114,109,112,97,116,104,218,7,
+ 97,98,115,112,97,116,104,218,6,99,117,114,100,105,114,218,
+ 6,112,97,114,100,105,114,218,3,115,101,112,218,7,112,97,
+ 116,104,115,101,112,218,7,100,101,102,112,97,116,104,218,6,
+ 97,108,116,115,101,112,218,6,101,120,116,115,101,112,218,7,
+ 100,101,118,110,117,108,108,218,8,114,101,97,108,112,97,116,
+ 104,218,26,115,117,112,112,111,114,116,115,95,117,110,105,99,
+ 111,100,101,95,102,105,108,101,110,97,109,101,115,218,7,114,
+ 101,108,112,97,116,104,218,8,115,97,109,101,102,105,108,101,
+ 218,12,115,97,109,101,111,112,101,110,102,105,108,101,218,8,
+ 115,97,109,101,115,116,97,116,218,10,99,111,109,109,111,110,
+ 112,97,116,104,218,10,105,115,106,117,110,99,116,105,111,110,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
+ 0,3,0,0,0,243,38,0,0,0,151,0,116,1,0,0,
+ 0,0,0,0,0,0,124,0,116,2,0,0,0,0,0,0,
+ 0,0,171,2,0,0,0,0,0,0,114,1,121,1,121,2,
+ 41,3,78,243,2,0,0,0,92,47,250,2,92,47,41,2,
+ 218,10,105,115,105,110,115,116,97,110,99,101,218,5,98,121,
+ 116,101,115,169,1,218,4,112,97,116,104,115,1,0,0,0,
+ 32,250,15,60,102,114,111,122,101,110,32,110,116,112,97,116,
+ 104,62,218,13,95,103,101,116,95,98,111,116,104,115,101,112,
+ 115,114,58,0,0,0,35,0,0,0,115,18,0,0,0,128,
+ 0,220,7,17,144,36,156,5,212,7,30,216,15,21,224,15,
+ 20,243,0,0,0,0,41,3,218,13,76,67,77,97,112,83,
+ 116,114,105,110,103,69,120,218,21,76,79,67,65,76,69,95,
+ 78,65,77,69,95,73,78,86,65,82,73,65,78,84,218,15,
+ 76,67,77,65,80,95,76,79,87,69,82,67,65,83,69,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,
+ 3,0,0,0,243,88,1,0,0,151,0,116,1,0,0,0,
+ 0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
+ 0,0,0,125,0,124,0,115,2,124,0,83,0,116,5,0,
+ 0,0,0,0,0,0,0,124,0,116,6,0,0,0,0,0,
+ 0,0,0,171,2,0,0,0,0,0,0,114,93,116,9,0,
+ 0,0,0,0,0,0,0,106,10,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
+ 0,0,0,125,1,124,0,106,13,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,124,1,100,1,171,
+ 2,0,0,0,0,0,0,106,15,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,100,2,100,3,171,
+ 2,0,0,0,0,0,0,125,0,116,17,0,0,0,0,0,
+ 0,0,0,116,18,0,0,0,0,0,0,0,0,116,20,0,
+ 0,0,0,0,0,0,0,124,0,171,3,0,0,0,0,0,
+ 0,125,0,124,0,106,23,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,100,1,171,2,0,
+ 0,0,0,0,0,83,0,116,17,0,0,0,0,0,0,0,
+ 0,116,18,0,0,0,0,0,0,0,0,116,20,0,0,0,
+ 0,0,0,0,0,124,0,106,15,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,100,2,100,3,171,
+ 2,0,0,0,0,0,0,171,3,0,0,0,0,0,0,83,
+ 0,41,4,250,110,78,111,114,109,97,108,105,122,101,32,99,
+ 97,115,101,32,111,102,32,112,97,116,104,110,97,109,101,46,
+ 10,10,32,32,32,32,32,32,32,32,77,97,107,101,115,32,
+ 97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,108,
+ 111,119,101,114,99,97,115,101,32,97,110,100,32,97,108,108,
+ 32,115,108,97,115,104,101,115,32,105,110,116,111,32,98,97,
+ 99,107,115,108,97,115,104,101,115,46,10,32,32,32,32,32,
+ 32,32,32,218,15,115,117,114,114,111,103,97,116,101,101,115,
+ 99,97,112,101,114,6,0,0,0,114,4,0,0,0,41,12,
+ 218,2,111,115,218,6,102,115,112,97,116,104,114,53,0,0,
+ 0,114,54,0,0,0,218,3,115,121,115,218,21,103,101,116,
+ 102,105,108,101,115,121,115,116,101,109,101,110,99,111,100,105,
+ 110,103,218,6,100,101,99,111,100,101,218,7,114,101,112,108,
+ 97,99,101,218,14,95,76,67,77,97,112,83,116,114,105,110,
+ 103,69,120,218,22,95,76,79,67,65,76,69,95,78,65,77,
+ 69,95,73,78,86,65,82,73,65,78,84,218,16,95,76,67,
+ 77,65,80,95,76,79,87,69,82,67,65,83,69,218,6,101,
+ 110,99,111,100,101,41,2,218,1,115,218,8,101,110,99,111,
+ 100,105,110,103,115,2,0,0,0,32,32,114,57,0,0,0,
+ 114,10,0,0,0,114,10,0,0,0,51,0,0,0,115,148,
+ 0,0,0,128,0,244,10,0,13,15,143,73,137,73,144,97,
+ 139,76,136,1,217,15,16,216,19,20,136,72,220,11,21,144,
+ 97,156,21,212,11,31,220,23,26,215,23,48,209,23,48,211,
+ 23,50,136,72,216,16,17,151,8,145,8,152,24,208,35,52,
+ 211,16,53,215,16,61,209,16,61,184,99,192,52,211,16,72,
+ 136,65,220,16,30,212,31,53,220,31,47,176,17,243,3,1,
+ 17,52,136,65,224,19,20,151,56,145,56,152,72,208,38,55,
+ 211,19,56,208,12,56,228,19,33,212,34,56,220,34,50,216,
+ 34,35,167,41,161,41,168,67,176,20,211,34,54,243,5,2,
+ 20,56,240,0,2,13,56,114,59,0,0,0,99,1,0,0,
+ 0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,
+ 0,243,24,1,0,0,151,0,116,1,0,0,0,0,0,0,
+ 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 125,0,116,5,0,0,0,0,0,0,0,0,124,0,116,6,
+ 0,0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,
+ 114,70,116,1,0,0,0,0,0,0,0,0,106,8,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 171,0,0,0,0,0,0,0,171,1,0,0,0,0,0,0,
- 83,0,124,0,106,13,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,100,1,100,2,171,2,0,0,
- 0,0,0,0,106,15,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,
- 83,0,41,3,114,64,0,0,0,114,6,0,0,0,114,4,
- 0,0,0,41,8,114,66,0,0,0,114,67,0,0,0,114,
- 53,0,0,0,114,54,0,0,0,218,8,102,115,101,110,99,
- 111,100,101,218,8,102,115,100,101,99,111,100,101,114,71,0,
- 0,0,218,5,108,111,119,101,114,41,1,114,76,0,0,0,
- 115,1,0,0,0,32,114,57,0,0,0,114,10,0,0,0,
- 114,10,0,0,0,70,0,0,0,115,98,0,0,0,128,0,
- 244,10,0,13,15,143,73,137,73,144,97,139,76,136,1,220,
- 11,21,144,97,156,21,212,11,31,220,19,21,151,59,145,59,
- 156,114,159,123,153,123,168,49,155,126,215,31,53,209,31,53,
- 176,99,184,52,211,31,64,215,31,70,209,31,70,211,31,72,
- 211,19,73,208,12,73,216,15,16,143,121,137,121,152,19,152,
- 100,211,15,35,215,15,41,209,15,41,211,15,43,208,8,43,
- 114,59,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,4,0,0,0,3,0,0,0,243,218,0,0,0,151,
- 0,116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,125,0,116,5,0,0,0,
- 0,0,0,0,0,124,0,116,6,0,0,0,0,0,0,0,
- 0,171,2,0,0,0,0,0,0,114,7,100,1,125,1,100,
- 2,125,2,100,3,125,3,110,6,100,4,125,1,100,5,125,
- 2,100,6,125,3,124,0,100,7,100,8,26,0,106,9,0,
+ 116,1,0,0,0,0,0,0,0,0,106,10,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
+ 171,1,0,0,0,0,0,0,106,13,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,100,1,100,2,
+ 171,2,0,0,0,0,0,0,106,15,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,
+ 0,0,0,0,171,1,0,0,0,0,0,0,83,0,124,0,
+ 106,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,1,100,2,171,2,0,0,0,0,0,0,
+ 106,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,83,0,41,3,
+ 114,64,0,0,0,114,6,0,0,0,114,4,0,0,0,41,
+ 8,114,66,0,0,0,114,67,0,0,0,114,53,0,0,0,
+ 114,54,0,0,0,218,8,102,115,101,110,99,111,100,101,218,
+ 8,102,115,100,101,99,111,100,101,114,71,0,0,0,218,5,
+ 108,111,119,101,114,41,1,114,76,0,0,0,115,1,0,0,
+ 0,32,114,57,0,0,0,114,10,0,0,0,114,10,0,0,
+ 0,70,0,0,0,115,98,0,0,0,128,0,244,10,0,13,
+ 15,143,73,137,73,144,97,139,76,136,1,220,11,21,144,97,
+ 156,21,212,11,31,220,19,21,151,59,145,59,156,114,159,123,
+ 153,123,168,49,155,126,215,31,53,209,31,53,176,99,184,52,
+ 211,31,64,215,31,70,209,31,70,211,31,72,211,19,73,208,
+ 12,73,216,15,16,143,121,137,121,152,19,152,100,211,15,35,
+ 215,15,41,209,15,41,211,15,43,208,8,43,114,59,0,0,
+ 0,99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,
+ 0,0,3,0,0,0,243,218,0,0,0,151,0,116,1,0,
+ 0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,
+ 0,0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,
+ 0,124,0,116,6,0,0,0,0,0,0,0,0,171,2,0,
+ 0,0,0,0,0,114,7,100,1,125,1,100,2,125,2,100,
+ 3,125,3,110,6,100,4,125,1,100,5,125,2,100,6,125,
+ 3,124,0,100,7,100,8,26,0,106,9,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,124,2,124,
+ 1,171,2,0,0,0,0,0,0,125,0,124,0,106,11,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,124,2,124,1,171,2,0,0,0,0,0,0,125,0,124,
- 0,106,11,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,115,
- 18,124,0,106,11,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,3,100,9,171,2,0,0,0,
- 0,0,0,114,1,121,10,121,11,41,12,122,31,84,101,115,
- 116,32,119,104,101,116,104,101,114,32,97,32,112,97,116,104,
- 32,105,115,32,97,98,115,111,108,117,116,101,243,1,0,0,
- 0,92,243,1,0,0,0,47,115,2,0,0,0,58,92,114,
- 4,0,0,0,114,6,0,0,0,122,2,58,92,78,233,3,
- 0,0,0,233,1,0,0,0,84,70,41,6,114,66,0,0,
- 0,114,67,0,0,0,114,53,0,0,0,114,54,0,0,0,
- 114,71,0,0,0,218,10,115,116,97,114,116,115,119,105,116,
- 104,41,4,114,76,0,0,0,114,36,0,0,0,114,39,0,
- 0,0,218,9,99,111,108,111,110,95,115,101,112,115,4,0,
- 0,0,32,32,32,32,114,57,0,0,0,114,11,0,0,0,
- 114,11,0,0,0,87,0,0,0,115,110,0,0,0,128,0,
- 228,8,10,143,9,137,9,144,33,139,12,128,65,220,7,17,
- 144,33,148,85,212,7,27,216,14,19,136,3,216,17,21,136,
- 6,216,20,26,137,9,224,14,18,136,3,216,17,20,136,6,
- 216,20,25,136,9,216,8,9,136,34,136,49,136,5,143,13,
- 137,13,144,102,152,99,211,8,34,128,65,240,6,0,8,9,
- 135,124,129,124,144,67,212,7,24,152,65,159,76,153,76,168,
- 25,176,65,212,28,54,216,15,19,216,11,16,114,59,0,0,
+ 0,124,1,171,1,0,0,0,0,0,0,115,18,124,0,106,
+ 11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,3,100,9,171,2,0,0,0,0,0,0,114,
+ 1,121,10,121,11,41,12,122,31,84,101,115,116,32,119,104,
+ 101,116,104,101,114,32,97,32,112,97,116,104,32,105,115,32,
+ 97,98,115,111,108,117,116,101,243,1,0,0,0,92,243,1,
+ 0,0,0,47,115,2,0,0,0,58,92,114,4,0,0,0,
+ 114,6,0,0,0,122,2,58,92,78,233,3,0,0,0,233,
+ 1,0,0,0,84,70,41,6,114,66,0,0,0,114,67,0,
+ 0,0,114,53,0,0,0,114,54,0,0,0,114,71,0,0,
+ 0,218,10,115,116,97,114,116,115,119,105,116,104,41,4,114,
+ 76,0,0,0,114,36,0,0,0,114,39,0,0,0,218,9,
+ 99,111,108,111,110,95,115,101,112,115,4,0,0,0,32,32,
+ 32,32,114,57,0,0,0,114,11,0,0,0,114,11,0,0,
+ 0,87,0,0,0,115,110,0,0,0,128,0,228,8,10,143,
+ 9,137,9,144,33,139,12,128,65,220,7,17,144,33,148,85,
+ 212,7,27,216,14,19,136,3,216,17,21,136,6,216,20,26,
+ 137,9,224,14,18,136,3,216,17,20,136,6,216,20,25,136,
+ 9,216,8,9,136,34,136,49,136,5,143,13,137,13,144,102,
+ 152,99,211,8,34,128,65,240,6,0,8,9,135,124,129,124,
+ 144,67,212,7,24,152,65,159,76,153,76,168,25,176,65,212,
+ 28,54,216,15,19,216,11,16,114,59,0,0,0,99,1,0,
+ 0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,
+ 0,0,243,56,2,0,0,151,0,116,1,0,0,0,0,0,
+ 0,0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,
+ 0,125,0,116,5,0,0,0,0,0,0,0,0,124,0,116,
+ 6,0,0,0,0,0,0,0,0,171,2,0,0,0,0,0,
+ 0,114,7,100,1,125,2,100,2,125,3,100,3,125,4,110,
+ 6,100,4,125,2,100,5,125,3,100,6,125,4,9,0,124,
+ 1,115,8,124,0,100,0,100,7,26,0,124,2,122,0,0,
+ 0,1,0,116,9,0,0,0,0,0,0,0,0,124,0,171,
+ 1,0,0,0,0,0,0,92,3,0,0,125,5,125,6,125,
+ 7,116,11,0,0,0,0,0,0,0,0,116,0,0,0,0,
+ 0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,171,2,0,0,0,
+ 0,0,0,68,0,93,98,0,0,125,8,116,9,0,0,0,
+ 0,0,0,0,0,124,8,171,1,0,0,0,0,0,0,92,
+ 3,0,0,125,9,125,10,125,11,124,10,114,11,124,9,115,
+ 2,124,5,115,2,124,9,125,5,124,10,125,6,124,11,125,
+ 7,140,31,124,9,114,47,124,9,124,5,107,55,0,0,114,
+ 42,124,9,106,13,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,124,
+ 5,106,13,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,171,0,0,0,0,0,0,0,107,55,0,
+ 0,114,7,124,9,125,5,124,10,125,6,124,11,125,7,140,
+ 78,124,9,125,5,124,7,114,12,124,7,100,8,25,0,0,
+ 0,124,3,118,1,114,5,124,7,124,2,122,0,0,0,125,
+ 7,124,7,124,11,122,0,0,0,125,7,140,100,4,0,124,
+ 7,114,22,124,6,115,20,124,5,114,18,124,5,100,8,100,
+ 0,26,0,124,4,124,3,122,0,0,0,118,1,114,8,124,
+ 5,124,2,122,0,0,0,124,7,122,0,0,0,83,0,124,
+ 5,124,6,122,0,0,0,124,7,122,0,0,0,83,0,35,
+ 0,116,14,0,0,0,0,0,0,0,0,116,16,0,0,0,
+ 0,0,0,0,0,116,18,0,0,0,0,0,0,0,0,102,
+ 3,36,0,114,25,1,0,116,21,0,0,0,0,0,0,0,
+ 0,106,22,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,100,9,124,0,103,2,124,1,162,1,173,
+ 6,142,0,1,0,130,0,119,0,120,3,89,0,119,1,41,
+ 10,78,114,83,0,0,0,114,51,0,0,0,243,1,0,0,
+ 0,58,114,4,0,0,0,114,52,0,0,0,218,1,58,114,
+ 8,0,0,0,233,255,255,255,255,114,12,0,0,0,41,12,
+ 114,66,0,0,0,114,67,0,0,0,114,53,0,0,0,114,
+ 54,0,0,0,114,14,0,0,0,218,3,109,97,112,114,81,
+ 0,0,0,218,9,84,121,112,101,69,114,114,111,114,218,14,
+ 65,116,116,114,105,98,117,116,101,69,114,114,111,114,218,12,
+ 66,121,116,101,115,87,97,114,110,105,110,103,218,11,103,101,
+ 110,101,114,105,99,112,97,116,104,218,16,95,99,104,101,99,
+ 107,95,97,114,103,95,116,121,112,101,115,41,12,114,56,0,
+ 0,0,218,5,112,97,116,104,115,114,36,0,0,0,218,4,
+ 115,101,112,115,218,5,99,111,108,111,110,218,12,114,101,115,
+ 117,108,116,95,100,114,105,118,101,218,11,114,101,115,117,108,
+ 116,95,114,111,111,116,218,11,114,101,115,117,108,116,95,112,
+ 97,116,104,218,1,112,218,7,112,95,100,114,105,118,101,218,
+ 6,112,95,114,111,111,116,218,6,112,95,112,97,116,104,115,
+ 12,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,
+ 114,57,0,0,0,114,12,0,0,0,114,12,0,0,0,107,
+ 0,0,0,115,95,1,0,0,128,0,220,11,13,143,57,137,
+ 57,144,84,139,63,128,68,220,7,17,144,36,156,5,212,7,
+ 30,216,14,19,136,3,216,15,21,136,4,216,16,20,137,5,
+ 224,14,18,136,3,216,15,20,136,4,216,16,19,136,5,240,
+ 2,33,5,14,217,15,20,216,12,16,144,18,144,33,136,72,
+ 144,115,138,78,220,49,58,184,52,179,31,209,8,46,136,12,
+ 144,107,160,59,220,17,20,148,82,151,89,145,89,160,5,214,
+ 17,38,136,65,220,38,47,176,1,163,108,209,12,35,136,71,
+ 144,86,152,86,217,15,21,225,19,26,161,44,216,35,42,144,
+ 76,216,30,36,144,11,216,30,36,144,11,216,16,24,217,17,
+ 24,152,87,168,12,210,29,52,216,19,26,151,61,145,61,147,
+ 63,160,108,215,38,56,209,38,56,211,38,58,210,19,58,224,
+ 35,42,144,76,216,34,40,144,75,216,34,40,144,75,216,20,
+ 28,224,31,38,144,12,225,15,26,152,123,168,50,153,127,176,
+ 100,209,31,58,216,30,41,168,67,209,30,47,144,11,216,26,
+ 37,168,6,209,26,46,137,75,240,43,0,18,39,241,46,0,
+ 13,24,161,11,217,12,24,152,92,168,34,168,35,208,29,46,
+ 176,101,184,100,177,108,209,29,66,216,19,31,160,35,209,19,
+ 37,168,11,209,19,51,208,12,51,216,15,27,152,107,209,15,
+ 41,168,75,209,15,55,208,8,55,248,220,12,21,148,126,164,
+ 124,208,11,52,242,0,2,5,14,220,8,19,215,8,36,209,
+ 8,36,160,86,168,84,208,8,58,176,69,211,8,58,216,8,
+ 13,240,5,2,5,14,250,115,18,0,0,0,180,66,47,67,
+ 44,0,195,36,7,67,44,0,195,44,45,68,25,3,99,1,
+ 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,
+ 0,0,0,243,46,0,0,0,151,0,116,1,0,0,0,0,
+ 0,0,0,0,124,0,171,1,0,0,0,0,0,0,92,3,
+ 0,0,125,1,125,2,125,3,124,1,124,2,124,3,122,0,
+ 0,0,102,2,83,0,41,1,97,218,2,0,0,83,112,108,
+ 105,116,32,97,32,112,97,116,104,110,97,109,101,32,105,110,
+ 116,111,32,100,114,105,118,101,47,85,78,67,32,115,104,97,
+ 114,101,112,111,105,110,116,32,97,110,100,32,114,101,108,97,
+ 116,105,118,101,32,112,97,116,104,32,115,112,101,99,105,102,
+ 105,101,114,115,46,10,32,32,32,32,82,101,116,117,114,110,
+ 115,32,97,32,50,45,116,117,112,108,101,32,40,100,114,105,
+ 118,101,95,111,114,95,117,110,99,44,32,112,97,116,104,41,
+ 59,32,101,105,116,104,101,114,32,112,97,114,116,32,109,97,
+ 121,32,98,101,32,101,109,112,116,121,46,10,10,32,32,32,
+ 32,73,102,32,121,111,117,32,97,115,115,105,103,110,10,32,
+ 32,32,32,32,32,32,32,114,101,115,117,108,116,32,61,32,
+ 115,112,108,105,116,100,114,105,118,101,40,112,41,10,32,32,
+ 32,32,73,116,32,105,115,32,97,108,119,97,121,115,32,116,
+ 114,117,101,32,116,104,97,116,58,10,32,32,32,32,32,32,
+ 32,32,114,101,115,117,108,116,91,48,93,32,43,32,114,101,
+ 115,117,108,116,91,49,93,32,61,61,32,112,10,10,32,32,
+ 32,32,73,102,32,116,104,101,32,112,97,116,104,32,99,111,
+ 110,116,97,105,110,101,100,32,97,32,100,114,105,118,101,32,
+ 108,101,116,116,101,114,44,32,100,114,105,118,101,95,111,114,
+ 95,117,110,99,32,119,105,108,108,32,99,111,110,116,97,105,
+ 110,32,101,118,101,114,121,116,104,105,110,103,10,32,32,32,
+ 32,117,112,32,116,111,32,97,110,100,32,105,110,99,108,117,
+ 100,105,110,103,32,116,104,101,32,99,111,108,111,110,46,32,
+ 32,101,46,103,46,32,115,112,108,105,116,100,114,105,118,101,
+ 40,34,99,58,47,100,105,114,34,41,32,114,101,116,117,114,
+ 110,115,32,40,34,99,58,34,44,32,34,47,100,105,114,34,
+ 41,10,10,32,32,32,32,73,102,32,116,104,101,32,112,97,
+ 116,104,32,99,111,110,116,97,105,110,101,100,32,97,32,85,
+ 78,67,32,112,97,116,104,44,32,116,104,101,32,100,114,105,
+ 118,101,95,111,114,95,117,110,99,32,119,105,108,108,32,99,
+ 111,110,116,97,105,110,32,116,104,101,32,104,111,115,116,32,
+ 110,97,109,101,10,32,32,32,32,97,110,100,32,115,104,97,
+ 114,101,32,117,112,32,116,111,32,98,117,116,32,110,111,116,
+ 32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,102,
+ 111,117,114,116,104,32,100,105,114,101,99,116,111,114,121,32,
+ 115,101,112,97,114,97,116,111,114,32,99,104,97,114,97,99,
+ 116,101,114,46,10,32,32,32,32,101,46,103,46,32,115,112,
+ 108,105,116,100,114,105,118,101,40,34,47,47,104,111,115,116,
+ 47,99,111,109,112,117,116,101,114,47,100,105,114,34,41,32,
+ 114,101,116,117,114,110,115,32,40,34,47,47,104,111,115,116,
+ 47,99,111,109,112,117,116,101,114,34,44,32,34,47,100,105,
+ 114,34,41,10,10,32,32,32,32,80,97,116,104,115,32,99,
+ 97,110,110,111,116,32,99,111,110,116,97,105,110,32,98,111,
+ 116,104,32,97,32,100,114,105,118,101,32,108,101,116,116,101,
+ 114,32,97,110,100,32,97,32,85,78,67,32,112,97,116,104,
+ 46,10,10,32,32,32,32,41,1,114,14,0,0,0,41,4,
+ 114,105,0,0,0,218,5,100,114,105,118,101,218,4,114,111,
+ 111,116,218,4,116,97,105,108,115,4,0,0,0,32,32,32,
+ 32,114,57,0,0,0,114,13,0,0,0,114,13,0,0,0,
+ 156,0,0,0,115,35,0,0,0,128,0,244,38,0,25,34,
+ 160,33,155,12,209,4,21,128,69,136,52,144,20,216,11,16,
+ 144,36,152,20,145,43,208,11,29,208,4,29,114,59,0,0,
0,99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,
- 0,0,7,0,0,0,243,56,2,0,0,151,0,116,1,0,
+ 0,0,3,0,0,0,243,254,1,0,0,151,0,116,1,0,
0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,
0,0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,
0,124,0,116,6,0,0,0,0,0,0,0,0,171,2,0,
- 0,0,0,0,0,114,7,100,1,125,2,100,2,125,3,100,
- 3,125,4,110,6,100,4,125,2,100,5,125,3,100,6,125,
- 4,9,0,124,1,115,8,124,0,100,0,100,7,26,0,124,
- 2,122,0,0,0,1,0,116,9,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,92,3,0,0,125,
- 5,125,6,125,7,116,11,0,0,0,0,0,0,0,0,116,
- 0,0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,171,
- 2,0,0,0,0,0,0,68,0,93,98,0,0,125,8,116,
- 9,0,0,0,0,0,0,0,0,124,8,171,1,0,0,0,
- 0,0,0,92,3,0,0,125,9,125,10,125,11,124,10,114,
- 11,124,9,115,2,124,5,115,2,124,9,125,5,124,10,125,
- 6,124,11,125,7,140,31,124,9,114,47,124,9,124,5,107,
- 55,0,0,114,42,124,9,106,13,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
- 0,0,0,124,5,106,13,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,
- 0,107,55,0,0,114,7,124,9,125,5,124,10,125,6,124,
- 11,125,7,140,78,124,9,125,5,124,7,114,12,124,7,100,
- 8,25,0,0,0,124,3,118,1,114,5,124,7,124,2,122,
- 0,0,0,125,7,124,7,124,11,122,0,0,0,125,7,140,
- 100,4,0,124,7,114,22,124,6,115,20,124,5,114,18,124,
- 5,100,8,100,0,26,0,124,4,124,3,122,0,0,0,118,
- 1,114,8,124,5,124,2,122,0,0,0,124,7,122,0,0,
- 0,83,0,124,5,124,6,122,0,0,0,124,7,122,0,0,
- 0,83,0,35,0,116,14,0,0,0,0,0,0,0,0,116,
- 16,0,0,0,0,0,0,0,0,116,18,0,0,0,0,0,
- 0,0,0,102,3,36,0,114,25,1,0,116,21,0,0,0,
- 0,0,0,0,0,106,22,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,100,9,124,0,103,2,124,
- 1,162,1,173,6,142,0,1,0,130,0,119,0,120,3,89,
- 0,119,1,41,10,78,114,83,0,0,0,114,51,0,0,0,
- 243,1,0,0,0,58,114,4,0,0,0,114,52,0,0,0,
- 218,1,58,114,8,0,0,0,233,255,255,255,255,114,12,0,
- 0,0,41,12,114,66,0,0,0,114,67,0,0,0,114,53,
- 0,0,0,114,54,0,0,0,114,14,0,0,0,218,3,109,
- 97,112,114,81,0,0,0,218,9,84,121,112,101,69,114,114,
- 111,114,218,14,65,116,116,114,105,98,117,116,101,69,114,114,
- 111,114,218,12,66,121,116,101,115,87,97,114,110,105,110,103,
- 218,11,103,101,110,101,114,105,99,112,97,116,104,218,16,95,
- 99,104,101,99,107,95,97,114,103,95,116,121,112,101,115,41,
- 12,114,56,0,0,0,218,5,112,97,116,104,115,114,36,0,
- 0,0,218,4,115,101,112,115,218,5,99,111,108,111,110,218,
- 12,114,101,115,117,108,116,95,100,114,105,118,101,218,11,114,
- 101,115,117,108,116,95,114,111,111,116,218,11,114,101,115,117,
- 108,116,95,112,97,116,104,218,1,112,218,7,112,95,100,114,
- 105,118,101,218,6,112,95,114,111,111,116,218,6,112,95,112,
- 97,116,104,115,12,0,0,0,32,32,32,32,32,32,32,32,
- 32,32,32,32,114,57,0,0,0,114,12,0,0,0,114,12,
- 0,0,0,107,0,0,0,115,95,1,0,0,128,0,220,11,
- 13,143,57,137,57,144,84,139,63,128,68,220,7,17,144,36,
- 156,5,212,7,30,216,14,19,136,3,216,15,21,136,4,216,
- 16,20,137,5,224,14,18,136,3,216,15,20,136,4,216,16,
- 19,136,5,240,2,33,5,14,217,15,20,216,12,16,144,18,
- 144,33,136,72,144,115,138,78,220,49,58,184,52,179,31,209,
- 8,46,136,12,144,107,160,59,220,17,20,148,82,151,89,145,
- 89,160,5,214,17,38,136,65,220,38,47,176,1,163,108,209,
- 12,35,136,71,144,86,152,86,217,15,21,225,19,26,161,44,
- 216,35,42,144,76,216,30,36,144,11,216,30,36,144,11,216,
- 16,24,217,17,24,152,87,168,12,210,29,52,216,19,26,151,
- 61,145,61,147,63,160,108,215,38,56,209,38,56,211,38,58,
- 210,19,58,224,35,42,144,76,216,34,40,144,75,216,34,40,
- 144,75,216,20,28,224,31,38,144,12,225,15,26,152,123,168,
- 50,153,127,176,100,209,31,58,216,30,41,168,67,209,30,47,
- 144,11,216,26,37,168,6,209,26,46,137,75,240,43,0,18,
- 39,241,46,0,13,24,161,11,217,12,24,152,92,168,34,168,
- 35,208,29,46,176,101,184,100,177,108,209,29,66,216,19,31,
- 160,35,209,19,37,168,11,209,19,51,208,12,51,216,15,27,
- 152,107,209,15,41,168,75,209,15,55,208,8,55,248,220,12,
- 21,148,126,164,124,208,11,52,242,0,2,5,14,220,8,19,
- 215,8,36,209,8,36,160,86,168,84,208,8,58,176,69,211,
- 8,58,216,8,13,240,5,2,5,14,250,115,18,0,0,0,
- 180,66,47,67,44,0,195,36,7,67,44,0,195,44,45,68,
- 25,3,99,1,0,0,0,0,0,0,0,0,0,0,0,3,
- 0,0,0,3,0,0,0,243,46,0,0,0,151,0,116,1,
- 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
- 0,0,92,3,0,0,125,1,125,2,125,3,124,1,124,2,
- 124,3,122,0,0,0,102,2,83,0,41,1,97,218,2,0,
- 0,83,112,108,105,116,32,97,32,112,97,116,104,110,97,109,
- 101,32,105,110,116,111,32,100,114,105,118,101,47,85,78,67,
- 32,115,104,97,114,101,112,111,105,110,116,32,97,110,100,32,
- 114,101,108,97,116,105,118,101,32,112,97,116,104,32,115,112,
- 101,99,105,102,105,101,114,115,46,10,32,32,32,32,82,101,
- 116,117,114,110,115,32,97,32,50,45,116,117,112,108,101,32,
- 40,100,114,105,118,101,95,111,114,95,117,110,99,44,32,112,
- 97,116,104,41,59,32,101,105,116,104,101,114,32,112,97,114,
- 116,32,109,97,121,32,98,101,32,101,109,112,116,121,46,10,
- 10,32,32,32,32,73,102,32,121,111,117,32,97,115,115,105,
- 103,110,10,32,32,32,32,32,32,32,32,114,101,115,117,108,
- 116,32,61,32,115,112,108,105,116,100,114,105,118,101,40,112,
- 41,10,32,32,32,32,73,116,32,105,115,32,97,108,119,97,
- 121,115,32,116,114,117,101,32,116,104,97,116,58,10,32,32,
- 32,32,32,32,32,32,114,101,115,117,108,116,91,48,93,32,
- 43,32,114,101,115,117,108,116,91,49,93,32,61,61,32,112,
- 10,10,32,32,32,32,73,102,32,116,104,101,32,112,97,116,
- 104,32,99,111,110,116,97,105,110,101,100,32,97,32,100,114,
- 105,118,101,32,108,101,116,116,101,114,44,32,100,114,105,118,
- 101,95,111,114,95,117,110,99,32,119,105,108,108,32,99,111,
- 110,116,97,105,110,32,101,118,101,114,121,116,104,105,110,103,
- 10,32,32,32,32,117,112,32,116,111,32,97,110,100,32,105,
- 110,99,108,117,100,105,110,103,32,116,104,101,32,99,111,108,
- 111,110,46,32,32,101,46,103,46,32,115,112,108,105,116,100,
- 114,105,118,101,40,34,99,58,47,100,105,114,34,41,32,114,
- 101,116,117,114,110,115,32,40,34,99,58,34,44,32,34,47,
- 100,105,114,34,41,10,10,32,32,32,32,73,102,32,116,104,
- 101,32,112,97,116,104,32,99,111,110,116,97,105,110,101,100,
- 32,97,32,85,78,67,32,112,97,116,104,44,32,116,104,101,
- 32,100,114,105,118,101,95,111,114,95,117,110,99,32,119,105,
- 108,108,32,99,111,110,116,97,105,110,32,116,104,101,32,104,
- 111,115,116,32,110,97,109,101,10,32,32,32,32,97,110,100,
- 32,115,104,97,114,101,32,117,112,32,116,111,32,98,117,116,
- 32,110,111,116,32,105,110,99,108,117,100,105,110,103,32,116,
- 104,101,32,102,111,117,114,116,104,32,100,105,114,101,99,116,
- 111,114,121,32,115,101,112,97,114,97,116,111,114,32,99,104,
- 97,114,97,99,116,101,114,46,10,32,32,32,32,101,46,103,
- 46,32,115,112,108,105,116,100,114,105,118,101,40,34,47,47,
- 104,111,115,116,47,99,111,109,112,117,116,101,114,47,100,105,
- 114,34,41,32,114,101,116,117,114,110,115,32,40,34,47,47,
- 104,111,115,116,47,99,111,109,112,117,116,101,114,34,44,32,
- 34,47,100,105,114,34,41,10,10,32,32,32,32,80,97,116,
- 104,115,32,99,97,110,110,111,116,32,99,111,110,116,97,105,
- 110,32,98,111,116,104,32,97,32,100,114,105,118,101,32,108,
- 101,116,116,101,114,32,97,110,100,32,97,32,85,78,67,32,
- 112,97,116,104,46,10,10,32,32,32,32,41,1,114,14,0,
- 0,0,41,4,114,105,0,0,0,218,5,100,114,105,118,101,
- 218,4,114,111,111,116,218,4,116,97,105,108,115,4,0,0,
- 0,32,32,32,32,114,57,0,0,0,114,13,0,0,0,114,
- 13,0,0,0,156,0,0,0,115,35,0,0,0,128,0,244,
- 38,0,25,34,160,33,155,12,209,4,21,128,69,136,52,144,
- 20,216,11,16,144,36,152,20,145,43,208,11,29,208,4,29,
- 114,59,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,5,0,0,0,3,0,0,0,243,254,1,0,0,151,
- 0,116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,
+ 0,0,0,0,0,114,11,100,1,125,1,100,2,125,2,100,
+ 3,125,3,100,4,125,4,100,5,125,5,110,10,100,6,125,
+ 1,100,7,125,2,100,8,125,3,100,9,125,4,100,10,125,
+ 5,124,0,106,9,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,124,2,124,1,171,2,0,0,0,
+ 0,0,0,125,6,124,6,100,11,100,12,26,0,124,1,107,
+ 40,0,0,114,124,124,6,100,12,100,13,26,0,124,1,107,
+ 40,0,0,114,105,124,6,100,11,100,14,26,0,106,11,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,171,0,0,0,0,0,0,0,124,4,107,40,0,0,114,
+ 2,100,14,110,1,100,13,125,7,124,6,106,13,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,125,0,116,5,0,0,0,
- 0,0,0,0,0,124,0,116,6,0,0,0,0,0,0,0,
- 0,171,2,0,0,0,0,0,0,114,11,100,1,125,1,100,
- 2,125,2,100,3,125,3,100,4,125,4,100,5,125,5,110,
- 10,100,6,125,1,100,7,125,2,100,8,125,3,100,9,125,
- 4,100,10,125,5,124,0,106,9,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,2,124,1,171,
- 2,0,0,0,0,0,0,125,6,124,6,100,11,100,12,26,
- 0,124,1,107,40,0,0,114,124,124,6,100,12,100,13,26,
- 0,124,1,107,40,0,0,114,105,124,6,100,11,100,14,26,
- 0,106,11,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,171,0,0,0,0,0,0,0,124,4,107,
- 40,0,0,114,2,100,14,110,1,100,13,125,7,124,6,106,
- 13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,124,1,124,7,171,2,0,0,0,0,0,0,125,
- 8,124,8,100,15,107,40,0,0,114,5,124,0,124,5,124,
- 5,102,3,83,0,124,6,106,13,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,1,124,8,100,
- 12,122,0,0,0,171,2,0,0,0,0,0,0,125,9,124,
- 9,100,15,107,40,0,0,114,5,124,0,124,5,124,5,102,
- 3,83,0,124,0,100,11,124,9,26,0,124,0,124,9,124,
- 9,100,12,122,0,0,0,26,0,124,0,124,9,100,12,122,
- 0,0,0,100,11,26,0,102,3,83,0,124,5,124,0,100,
- 11,100,12,26,0,124,0,100,12,100,11,26,0,102,3,83,
- 0,124,6,100,12,100,13,26,0,124,3,107,40,0,0,114,
- 33,124,6,100,13,100,16,26,0,124,1,107,40,0,0,114,
- 14,124,0,100,11,100,13,26,0,124,0,100,13,100,16,26,
- 0,124,0,100,16,100,11,26,0,102,3,83,0,124,0,100,
- 11,100,13,26,0,124,5,124,0,100,13,100,11,26,0,102,
- 3,83,0,124,5,124,5,124,0,102,3,83,0,41,17,97,
- 254,1,0,0,83,112,108,105,116,32,97,32,112,97,116,104,
- 110,97,109,101,32,105,110,116,111,32,100,114,105,118,101,44,
- 32,114,111,111,116,32,97,110,100,32,116,97,105,108,46,32,
- 84,104,101,32,100,114,105,118,101,32,105,115,32,100,101,102,
- 105,110,101,100,10,32,32,32,32,101,120,97,99,116,108,121,
- 32,97,115,32,105,110,32,115,112,108,105,116,100,114,105,118,
- 101,40,41,46,32,79,110,32,87,105,110,100,111,119,115,44,
- 32,116,104,101,32,114,111,111,116,32,109,97,121,32,98,101,
- 32,97,32,115,105,110,103,108,101,32,112,97,116,104,10,32,
- 32,32,32,115,101,112,97,114,97,116,111,114,32,111,114,32,
- 97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,46,
- 32,84,104,101,32,116,97,105,108,32,99,111,110,116,97,105,
- 110,115,32,97,110,121,116,104,105,110,103,32,97,102,116,101,
- 114,32,116,104,101,32,114,111,111,116,46,10,32,32,32,32,
- 70,111,114,32,101,120,97,109,112,108,101,58,10,10,32,32,
+ 1,124,7,171,2,0,0,0,0,0,0,125,8,124,8,100,
+ 15,107,40,0,0,114,5,124,0,124,5,124,5,102,3,83,
+ 0,124,6,106,13,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,124,1,124,8,100,12,122,0,0,
+ 0,171,2,0,0,0,0,0,0,125,9,124,9,100,15,107,
+ 40,0,0,114,5,124,0,124,5,124,5,102,3,83,0,124,
+ 0,100,11,124,9,26,0,124,0,124,9,124,9,100,12,122,
+ 0,0,0,26,0,124,0,124,9,100,12,122,0,0,0,100,
+ 11,26,0,102,3,83,0,124,5,124,0,100,11,100,12,26,
+ 0,124,0,100,12,100,11,26,0,102,3,83,0,124,6,100,
+ 12,100,13,26,0,124,3,107,40,0,0,114,33,124,6,100,
+ 13,100,16,26,0,124,1,107,40,0,0,114,14,124,0,100,
+ 11,100,13,26,0,124,0,100,13,100,16,26,0,124,0,100,
+ 16,100,11,26,0,102,3,83,0,124,0,100,11,100,13,26,
+ 0,124,5,124,0,100,13,100,11,26,0,102,3,83,0,124,
+ 5,124,5,124,0,102,3,83,0,41,17,97,254,1,0,0,
+ 83,112,108,105,116,32,97,32,112,97,116,104,110,97,109,101,
+ 32,105,110,116,111,32,100,114,105,118,101,44,32,114,111,111,
+ 116,32,97,110,100,32,116,97,105,108,46,32,84,104,101,32,
+ 100,114,105,118,101,32,105,115,32,100,101,102,105,110,101,100,
+ 10,32,32,32,32,101,120,97,99,116,108,121,32,97,115,32,
+ 105,110,32,115,112,108,105,116,100,114,105,118,101,40,41,46,
+ 32,79,110,32,87,105,110,100,111,119,115,44,32,116,104,101,
+ 32,114,111,111,116,32,109,97,121,32,98,101,32,97,32,115,
+ 105,110,103,108,101,32,112,97,116,104,10,32,32,32,32,115,
+ 101,112,97,114,97,116,111,114,32,111,114,32,97,110,32,101,
+ 109,112,116,121,32,115,116,114,105,110,103,46,32,84,104,101,
+ 32,116,97,105,108,32,99,111,110,116,97,105,110,115,32,97,
+ 110,121,116,104,105,110,103,32,97,102,116,101,114,32,116,104,
+ 101,32,114,111,111,116,46,10,32,32,32,32,70,111,114,32,
+ 101,120,97,109,112,108,101,58,10,10,32,32,32,32,32,32,
+ 32,32,115,112,108,105,116,114,111,111,116,40,39,47,47,115,
+ 101,114,118,101,114,47,115,104,97,114,101,47,39,41,32,61,
+ 61,32,40,39,47,47,115,101,114,118,101,114,47,115,104,97,
+ 114,101,39,44,32,39,47,39,44,32,39,39,41,10,32,32,
32,32,32,32,32,32,115,112,108,105,116,114,111,111,116,40,
- 39,47,47,115,101,114,118,101,114,47,115,104,97,114,101,47,
- 39,41,32,61,61,32,40,39,47,47,115,101,114,118,101,114,
- 47,115,104,97,114,101,39,44,32,39,47,39,44,32,39,39,
+ 39,67,58,47,85,115,101,114,115,47,66,97,114,110,101,121,
+ 39,41,32,61,61,32,40,39,67,58,39,44,32,39,47,39,
+ 44,32,39,85,115,101,114,115,47,66,97,114,110,101,121,39,
41,10,32,32,32,32,32,32,32,32,115,112,108,105,116,114,
- 111,111,116,40,39,67,58,47,85,115,101,114,115,47,66,97,
- 114,110,101,121,39,41,32,61,61,32,40,39,67,58,39,44,
- 32,39,47,39,44,32,39,85,115,101,114,115,47,66,97,114,
- 110,101,121,39,41,10,32,32,32,32,32,32,32,32,115,112,
- 108,105,116,114,111,111,116,40,39,67,58,47,47,47,115,112,
- 97,109,47,47,47,104,97,109,39,41,32,61,61,32,40,39,
- 67,58,39,44,32,39,47,39,44,32,39,47,47,115,112,97,
- 109,47,47,47,104,97,109,39,41,10,32,32,32,32,32,32,
- 32,32,115,112,108,105,116,114,111,111,116,40,39,87,105,110,
- 100,111,119,115,47,110,111,116,101,112,97,100,39,41,32,61,
- 61,32,40,39,39,44,32,39,39,44,32,39,87,105,110,100,
- 111,119,115,47,110,111,116,101,112,97,100,39,41,10,32,32,
- 32,32,114,83,0,0,0,114,84,0,0,0,114,90,0,0,
- 0,243,8,0,0,0,92,92,63,92,85,78,67,92,114,59,
- 0,0,0,114,4,0,0,0,114,6,0,0,0,114,91,0,
- 0,0,250,8,92,92,63,92,85,78,67,92,218,0,78,114,
- 86,0,0,0,233,2,0,0,0,233,8,0,0,0,114,92,
- 0,0,0,114,85,0,0,0,41,7,114,66,0,0,0,114,
- 67,0,0,0,114,53,0,0,0,114,54,0,0,0,114,71,
- 0,0,0,218,5,117,112,112,101,114,218,4,102,105,110,100,
- 41,10,114,105,0,0,0,114,36,0,0,0,114,39,0,0,
- 0,114,101,0,0,0,218,10,117,110,99,95,112,114,101,102,
- 105,120,218,5,101,109,112,116,121,218,5,110,111,114,109,112,
- 218,5,115,116,97,114,116,218,5,105,110,100,101,120,218,6,
- 105,110,100,101,120,50,115,10,0,0,0,32,32,32,32,32,
- 32,32,32,32,32,114,57,0,0,0,114,14,0,0,0,114,
- 14,0,0,0,179,0,0,0,115,135,1,0,0,128,0,244,
- 22,0,9,11,143,9,137,9,144,33,139,12,128,65,220,7,
- 17,144,33,148,85,212,7,27,216,14,19,136,3,216,17,21,
- 136,6,216,16,20,136,5,216,21,36,136,10,216,16,19,137,
- 5,224,14,18,136,3,216,17,20,136,6,216,16,19,136,5,
- 216,21,35,136,10,216,16,18,136,5,216,12,13,143,73,137,
- 73,144,102,152,99,211,12,34,128,69,216,7,12,136,82,136,
- 97,128,121,144,67,210,7,23,216,11,16,144,17,144,49,136,
- 58,152,19,210,11,28,240,6,0,26,31,152,114,160,1,152,
- 25,159,31,153,31,211,25,42,168,106,210,25,56,145,65,184,
- 97,136,69,216,20,25,151,74,145,74,152,115,160,69,211,20,
- 42,136,69,216,15,20,152,2,138,123,216,23,24,152,37,160,
- 21,144,127,208,16,38,216,21,26,151,90,145,90,160,3,160,
- 85,168,81,161,89,211,21,47,136,70,216,15,21,152,18,138,
- 124,216,23,24,152,37,160,21,144,127,208,16,38,216,19,20,
- 144,87,144,102,144,58,152,113,160,22,168,6,176,17,169,10,
- 208,31,51,176,81,176,118,192,1,177,122,176,123,176,94,208,
- 19,67,208,12,67,240,6,0,20,25,152,33,152,66,152,81,
- 152,37,160,17,160,49,160,50,160,21,208,19,38,208,12,38,
- 216,9,14,136,113,144,17,136,26,144,117,210,9,28,216,11,
- 16,144,17,144,49,136,58,152,19,210,11,28,224,19,20,144,
- 82,144,97,144,53,152,33,152,65,152,97,152,38,160,33,160,
- 65,160,66,160,37,208,19,39,208,12,39,240,6,0,20,21,
- 144,82,144,97,144,53,152,37,160,17,160,49,160,50,160,21,
- 208,19,38,208,12,38,240,6,0,16,21,144,101,152,81,136,
- 127,208,8,30,114,59,0,0,0,99,1,0,0,0,0,0,
- 0,0,0,0,0,0,4,0,0,0,3,0,0,0,243,248,
- 0,0,0,151,0,116,1,0,0,0,0,0,0,0,0,106,
- 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,124,0,171,1,0,0,0,0,0,0,125,0,116,
- 5,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
- 0,0,0,125,1,116,7,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,92,3,0,0,125,2,125,
- 3,125,0,116,9,0,0,0,0,0,0,0,0,124,0,171,
- 1,0,0,0,0,0,0,125,4,124,4,114,28,124,0,124,
- 4,100,1,122,10,0,0,25,0,0,0,124,1,118,1,114,
- 18,124,4,100,1,122,23,0,0,125,4,124,4,114,11,124,
- 0,124,4,100,1,122,10,0,0,25,0,0,0,124,1,118,
- 1,114,1,140,18,124,0,100,2,124,4,26,0,124,0,124,
- 4,100,2,26,0,125,6,125,5,124,2,124,3,122,0,0,
- 0,124,5,106,11,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,
- 0,122,0,0,0,124,6,102,2,83,0,41,3,122,126,83,
- 112,108,105,116,32,97,32,112,97,116,104,110,97,109,101,46,
- 10,10,32,32,32,32,82,101,116,117,114,110,32,116,117,112,
- 108,101,32,40,104,101,97,100,44,32,116,97,105,108,41,32,
- 119,104,101,114,101,32,116,97,105,108,32,105,115,32,101,118,
- 101,114,121,116,104,105,110,103,32,97,102,116,101,114,32,116,
- 104,101,32,102,105,110,97,108,32,115,108,97,115,104,46,10,
- 32,32,32,32,69,105,116,104,101,114,32,112,97,114,116,32,
- 109,97,121,32,98,101,32,101,109,112,116,121,46,114,86,0,
- 0,0,78,41,6,114,66,0,0,0,114,67,0,0,0,114,
- 58,0,0,0,114,14,0,0,0,218,3,108,101,110,218,6,
- 114,115,116,114,105,112,41,7,114,105,0,0,0,114,100,0,
- 0,0,218,1,100,218,1,114,218,1,105,218,4,104,101,97,
- 100,114,112,0,0,0,115,7,0,0,0,32,32,32,32,32,
- 32,32,114,57,0,0,0,114,15,0,0,0,114,15,0,0,
- 0,236,0,0,0,115,148,0,0,0,128,0,244,10,0,9,
- 11,143,9,137,9,144,33,139,12,128,65,220,11,24,152,17,
- 211,11,27,128,68,220,14,23,152,1,139,108,129,71,128,65,
- 128,113,136,33,228,8,11,136,65,139,6,128,65,217,10,11,
- 144,1,144,33,144,65,145,35,145,6,152,100,209,16,34,216,
- 8,9,136,81,137,6,136,1,241,3,0,11,12,144,1,144,
- 33,144,65,145,35,145,6,152,100,210,16,34,224,17,18,144,
- 50,144,65,144,21,152,1,152,33,152,34,152,5,136,36,128,
- 68,216,11,12,136,113,137,53,144,52,151,59,145,59,152,116,
- 211,19,36,209,11,36,160,100,208,11,42,208,4,42,114,59,
- 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
- 6,0,0,0,3,0,0,0,243,172,0,0,0,151,0,116,
- 1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,171,
- 1,0,0,0,0,0,0,125,0,116,5,0,0,0,0,0,
- 0,0,0,124,0,116,6,0,0,0,0,0,0,0,0,171,
- 2,0,0,0,0,0,0,114,24,116,9,0,0,0,0,0,
- 0,0,0,106,10,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,0,100,1,100,2,100,3,171,
- 4,0,0,0,0,0,0,83,0,116,9,0,0,0,0,0,
- 0,0,0,106,10,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,0,100,4,100,5,100,6,171,
- 4,0,0,0,0,0,0,83,0,41,7,78,114,83,0,0,
- 0,114,84,0,0,0,243,1,0,0,0,46,114,4,0,0,
- 0,114,6,0,0,0,114,2,0,0,0,41,6,114,66,0,
- 0,0,114,67,0,0,0,114,53,0,0,0,114,54,0,0,
- 0,114,97,0,0,0,218,9,95,115,112,108,105,116,101,120,
- 116,169,1,114,105,0,0,0,115,1,0,0,0,32,114,57,
- 0,0,0,114,16,0,0,0,114,16,0,0,0,1,1,0,
- 0,115,71,0,0,0,128,0,220,8,10,143,9,137,9,144,
- 33,139,12,128,65,220,7,17,144,33,148,85,212,7,27,220,
- 15,26,215,15,36,209,15,36,160,81,168,5,168,116,176,84,
- 211,15,58,208,8,58,228,15,26,215,15,36,209,15,36,160,
- 81,168,4,168,99,176,51,211,15,55,208,8,55,114,59,0,
- 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3,
- 0,0,0,3,0,0,0,243,30,0,0,0,151,0,116,1,
- 0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
- 0,0,100,1,25,0,0,0,83,0,41,2,122,41,82,101,
- 116,117,114,110,115,32,116,104,101,32,102,105,110,97,108,32,
- 99,111,109,112,111,110,101,110,116,32,111,102,32,97,32,112,
- 97,116,104,110,97,109,101,114,86,0,0,0,169,1,114,15,
- 0,0,0,114,137,0,0,0,115,1,0,0,0,32,114,57,
- 0,0,0,114,17,0,0,0,114,17,0,0,0,12,1,0,
- 0,243,16,0,0,0,128,0,228,11,16,144,17,139,56,144,
- 65,137,59,208,4,22,114,59,0,0,0,99,1,0,0,0,
- 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
- 243,30,0,0,0,151,0,116,1,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,100,1,25,0,0,
- 0,83,0,41,2,122,45,82,101,116,117,114,110,115,32,116,
- 104,101,32,100,105,114,101,99,116,111,114,121,32,99,111,109,
- 112,111,110,101,110,116,32,111,102,32,97,32,112,97,116,104,
- 110,97,109,101,114,8,0,0,0,114,139,0,0,0,114,137,
- 0,0,0,115,1,0,0,0,32,114,57,0,0,0,114,18,
- 0,0,0,114,18,0,0,0,19,1,0,0,114,140,0,0,
- 0,114,59,0,0,0,218,14,115,116,95,114,101,112,97,114,
- 115,101,95,116,97,103,99,1,0,0,0,0,0,0,0,0,
- 0,0,0,5,0,0,0,3,0,0,0,243,174,0,0,0,
- 151,0,9,0,116,1,0,0,0,0,0,0,0,0,106,2,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,0,171,1,0,0,0,0,0,0,125,1,116,11,
- 0,0,0,0,0,0,0,0,124,1,106,12,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,14,
- 0,0,0,0,0,0,0,0,106,16,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,107,40,0,0,
- 171,1,0,0,0,0,0,0,83,0,35,0,116,4,0,0,
- 0,0,0,0,0,0,116,6,0,0,0,0,0,0,0,0,
- 116,8,0,0,0,0,0,0,0,0,102,3,36,0,114,3,
- 1,0,89,0,121,1,119,0,120,3,89,0,119,1,169,2,
- 122,33,84,101,115,116,32,119,104,101,116,104,101,114,32,97,
- 32,112,97,116,104,32,105,115,32,97,32,106,117,110,99,116,
- 105,111,110,70,41,9,114,66,0,0,0,218,5,108,115,116,
- 97,116,218,7,79,83,69,114,114,111,114,218,10,86,97,108,
- 117,101,69,114,114,111,114,114,95,0,0,0,218,4,98,111,
- 111,108,114,142,0,0,0,218,4,115,116,97,116,218,26,73,
- 79,95,82,69,80,65,82,83,69,95,84,65,71,95,77,79,
- 85,78,84,95,80,79,73,78,84,169,2,114,56,0,0,0,
- 218,2,115,116,115,2,0,0,0,32,32,114,57,0,0,0,
- 114,49,0,0,0,114,49,0,0,0,27,1,0,0,115,77,
- 0,0,0,128,0,240,4,3,9,25,220,17,19,151,24,145,
- 24,152,36,147,30,136,66,244,6,0,16,20,144,66,215,20,
- 37,209,20,37,172,20,215,41,72,209,41,72,209,20,72,211,
- 15,73,208,8,73,248,244,5,0,17,24,156,26,164,94,208,
- 15,52,242,0,1,9,25,217,19,24,240,3,1,9,25,250,
- 115,15,0,0,0,130,21,61,0,189,20,65,20,3,193,19,
- 1,65,20,3,99,1,0,0,0,0,0,0,0,0,0,0,
- 0,3,0,0,0,3,0,0,0,243,46,0,0,0,151,0,
- 116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
- 171,1,0,0,0,0,0,0,1,0,121,1,114,144,0,0,
- 0,41,2,114,66,0,0,0,114,67,0,0,0,114,55,0,
- 0,0,115,1,0,0,0,32,114,57,0,0,0,114,49,0,
- 0,0,114,49,0,0,0,35,1,0,0,115,16,0,0,0,
- 128,0,228,8,10,143,9,137,9,144,36,140,15,216,15,20,
+ 111,111,116,40,39,67,58,47,47,47,115,112,97,109,47,47,
+ 47,104,97,109,39,41,32,61,61,32,40,39,67,58,39,44,
+ 32,39,47,39,44,32,39,47,47,115,112,97,109,47,47,47,
+ 104,97,109,39,41,10,32,32,32,32,32,32,32,32,115,112,
+ 108,105,116,114,111,111,116,40,39,87,105,110,100,111,119,115,
+ 47,110,111,116,101,112,97,100,39,41,32,61,61,32,40,39,
+ 39,44,32,39,39,44,32,39,87,105,110,100,111,119,115,47,
+ 110,111,116,101,112,97,100,39,41,10,32,32,32,32,114,83,
+ 0,0,0,114,84,0,0,0,114,90,0,0,0,243,8,0,
+ 0,0,92,92,63,92,85,78,67,92,114,59,0,0,0,114,
+ 4,0,0,0,114,6,0,0,0,114,91,0,0,0,250,8,
+ 92,92,63,92,85,78,67,92,218,0,78,114,86,0,0,0,
+ 233,2,0,0,0,233,8,0,0,0,114,92,0,0,0,114,
+ 85,0,0,0,41,7,114,66,0,0,0,114,67,0,0,0,
+ 114,53,0,0,0,114,54,0,0,0,114,71,0,0,0,218,
+ 5,117,112,112,101,114,218,4,102,105,110,100,41,10,114,105,
+ 0,0,0,114,36,0,0,0,114,39,0,0,0,114,101,0,
+ 0,0,218,10,117,110,99,95,112,114,101,102,105,120,218,5,
+ 101,109,112,116,121,218,5,110,111,114,109,112,218,5,115,116,
+ 97,114,116,218,5,105,110,100,101,120,218,6,105,110,100,101,
+ 120,50,115,10,0,0,0,32,32,32,32,32,32,32,32,32,
+ 32,114,57,0,0,0,114,14,0,0,0,114,14,0,0,0,
+ 179,0,0,0,115,135,1,0,0,128,0,244,22,0,9,11,
+ 143,9,137,9,144,33,139,12,128,65,220,7,17,144,33,148,
+ 85,212,7,27,216,14,19,136,3,216,17,21,136,6,216,16,
+ 20,136,5,216,21,36,136,10,216,16,19,137,5,224,14,18,
+ 136,3,216,17,20,136,6,216,16,19,136,5,216,21,35,136,
+ 10,216,16,18,136,5,216,12,13,143,73,137,73,144,102,152,
+ 99,211,12,34,128,69,216,7,12,136,82,136,97,128,121,144,
+ 67,210,7,23,216,11,16,144,17,144,49,136,58,152,19,210,
+ 11,28,240,6,0,26,31,152,114,160,1,152,25,159,31,153,
+ 31,211,25,42,168,106,210,25,56,145,65,184,97,136,69,216,
+ 20,25,151,74,145,74,152,115,160,69,211,20,42,136,69,216,
+ 15,20,152,2,138,123,216,23,24,152,37,160,21,144,127,208,
+ 16,38,216,21,26,151,90,145,90,160,3,160,85,168,81,161,
+ 89,211,21,47,136,70,216,15,21,152,18,138,124,216,23,24,
+ 152,37,160,21,144,127,208,16,38,216,19,20,144,87,144,102,
+ 144,58,152,113,160,22,168,6,176,17,169,10,208,31,51,176,
+ 81,176,118,192,1,177,122,176,123,176,94,208,19,67,208,12,
+ 67,240,6,0,20,25,152,33,152,66,152,81,152,37,160,17,
+ 160,49,160,50,160,21,208,19,38,208,12,38,216,9,14,136,
+ 113,144,17,136,26,144,117,210,9,28,216,11,16,144,17,144,
+ 49,136,58,152,19,210,11,28,224,19,20,144,82,144,97,144,
+ 53,152,33,152,65,152,97,152,38,160,33,160,65,160,66,160,
+ 37,208,19,39,208,12,39,240,6,0,20,21,144,82,144,97,
+ 144,53,152,37,160,17,160,49,160,50,160,21,208,19,38,208,
+ 12,38,240,6,0,16,21,144,101,152,81,136,127,208,8,30,
114,59,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,4,0,0,0,3,0,0,0,243,90,0,0,0,151,
- 0,9,0,116,1,0,0,0,0,0,0,0,0,106,2,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,125,1,121,2,35,
- 0,116,4,0,0,0,0,0,0,0,0,116,6,0,0,0,
- 0,0,0,0,0,102,2,36,0,114,3,1,0,89,0,121,
- 1,119,0,120,3,89,0,119,1,41,3,122,67,84,101,115,
- 116,32,119,104,101,116,104,101,114,32,97,32,112,97,116,104,
- 32,101,120,105,115,116,115,46,32,32,82,101,116,117,114,110,
- 115,32,84,114,117,101,32,102,111,114,32,98,114,111,107,101,
- 110,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,
- 70,84,41,4,114,66,0,0,0,114,145,0,0,0,114,146,
- 0,0,0,114,147,0,0,0,114,151,0,0,0,115,2,0,
- 0,0,32,32,114,57,0,0,0,114,26,0,0,0,114,26,
- 0,0,0,43,1,0,0,115,50,0,0,0,128,0,240,4,
- 3,5,21,220,13,15,143,88,137,88,144,100,139,94,136,2,
- 240,6,0,12,16,248,244,5,0,13,20,148,90,208,11,32,
- 242,0,1,5,21,217,15,20,240,3,1,5,21,250,115,12,
- 0,0,0,130,21,24,0,152,15,42,3,169,1,42,3,41,
- 1,218,18,95,103,101,116,118,111,108,117,109,101,112,97,116,
- 104,110,97,109,101,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,3,0,0,0,3,0,0,0,243,62,1,0,0,151,
+ 0,0,4,0,0,0,3,0,0,0,243,248,0,0,0,151,
0,116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
0,171,1,0,0,0,0,0,0,125,0,116,5,0,0,0,
0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,125,
1,116,7,0,0,0,0,0,0,0,0,124,0,171,1,0,
- 0,0,0,0,0,125,0,116,9,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,92,3,0,0,125,
- 2,125,3,125,4,124,2,114,10,124,2,100,1,25,0,0,
- 0,124,1,118,0,114,3,124,4,12,0,83,0,124,3,114,
- 3,124,4,115,1,121,2,116,10,0,0,0,0,0,0,0,
- 0,114,76,124,0,106,13,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,
- 0,0,0,125,5,116,11,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,106,13,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,171,
- 1,0,0,0,0,0,0,125,6,124,5,106,15,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
- 0,0,0,0,0,0,0,124,6,106,15,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,
- 0,0,0,0,0,107,40,0,0,83,0,121,3,41,4,122,
- 97,84,101,115,116,32,119,104,101,116,104,101,114,32,97,32,
- 112,97,116,104,32,105,115,32,97,32,109,111,117,110,116,32,
- 112,111,105,110,116,32,40,97,32,100,114,105,118,101,32,114,
- 111,111,116,44,32,116,104,101,32,114,111,111,116,32,111,102,
- 32,97,10,32,32,32,32,115,104,97,114,101,44,32,111,114,
- 32,97,32,109,111,117,110,116,101,100,32,118,111,108,117,109,
- 101,41,114,8,0,0,0,84,70,41,8,114,66,0,0,0,
- 114,67,0,0,0,114,58,0,0,0,114,33,0,0,0,114,
- 14,0,0,0,114,155,0,0,0,114,129,0,0,0,218,8,
- 99,97,115,101,102,111,108,100,41,7,114,56,0,0,0,114,
- 100,0,0,0,114,110,0,0,0,114,111,0,0,0,218,4,
- 114,101,115,116,218,1,120,218,1,121,115,7,0,0,0,32,
- 32,32,32,32,32,32,114,57,0,0,0,114,29,0,0,0,
- 114,29,0,0,0,65,1,0,0,115,145,0,0,0,128,0,
- 244,6,0,12,14,143,57,137,57,144,84,139,63,128,68,220,
- 11,24,152,20,211,11,30,128,68,220,11,18,144,52,139,61,
- 128,68,220,24,33,160,36,155,15,209,4,21,128,69,136,52,
- 144,20,217,7,12,144,21,144,113,145,24,152,84,209,17,33,
- 216,19,23,136,120,136,15,217,7,11,145,68,216,15,19,229,
- 7,25,216,12,16,143,75,137,75,152,4,211,12,29,136,1,
- 220,11,29,152,100,211,11,35,215,11,42,209,11,42,168,52,
- 211,11,48,136,1,216,15,16,143,122,137,122,139,124,152,113,
- 159,122,153,122,155,124,209,15,43,208,8,43,224,15,20,114,
- 59,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
- 0,5,0,0,0,3,0,0,0,243,56,3,0,0,151,0,
+ 0,0,0,0,0,92,3,0,0,125,2,125,3,125,0,116,
+ 9,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
+ 0,0,0,125,4,124,4,114,28,124,0,124,4,100,1,122,
+ 10,0,0,25,0,0,0,124,1,118,1,114,18,124,4,100,
+ 1,122,23,0,0,125,4,124,4,114,11,124,0,124,4,100,
+ 1,122,10,0,0,25,0,0,0,124,1,118,1,114,1,140,
+ 18,124,0,100,2,124,4,26,0,124,0,124,4,100,2,26,
+ 0,125,6,125,5,124,2,124,3,122,0,0,0,124,5,106,
+ 11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,1,171,1,0,0,0,0,0,0,122,0,0,
+ 0,124,6,102,2,83,0,41,3,122,126,83,112,108,105,116,
+ 32,97,32,112,97,116,104,110,97,109,101,46,10,10,32,32,
+ 32,32,82,101,116,117,114,110,32,116,117,112,108,101,32,40,
+ 104,101,97,100,44,32,116,97,105,108,41,32,119,104,101,114,
+ 101,32,116,97,105,108,32,105,115,32,101,118,101,114,121,116,
+ 104,105,110,103,32,97,102,116,101,114,32,116,104,101,32,102,
+ 105,110,97,108,32,115,108,97,115,104,46,10,32,32,32,32,
+ 69,105,116,104,101,114,32,112,97,114,116,32,109,97,121,32,
+ 98,101,32,101,109,112,116,121,46,114,86,0,0,0,78,41,
+ 6,114,66,0,0,0,114,67,0,0,0,114,58,0,0,0,
+ 114,14,0,0,0,218,3,108,101,110,218,6,114,115,116,114,
+ 105,112,41,7,114,105,0,0,0,114,100,0,0,0,218,1,
+ 100,218,1,114,218,1,105,218,4,104,101,97,100,114,112,0,
+ 0,0,115,7,0,0,0,32,32,32,32,32,32,32,114,57,
+ 0,0,0,114,15,0,0,0,114,15,0,0,0,236,0,0,
+ 0,115,148,0,0,0,128,0,244,10,0,9,11,143,9,137,
+ 9,144,33,139,12,128,65,220,11,24,152,17,211,11,27,128,
+ 68,220,14,23,152,1,139,108,129,71,128,65,128,113,136,33,
+ 228,8,11,136,65,139,6,128,65,217,10,11,144,1,144,33,
+ 144,65,145,35,145,6,152,100,209,16,34,216,8,9,136,81,
+ 137,6,136,1,241,3,0,11,12,144,1,144,33,144,65,145,
+ 35,145,6,152,100,210,16,34,224,17,18,144,50,144,65,144,
+ 21,152,1,152,33,152,34,152,5,136,36,128,68,216,11,12,
+ 136,113,137,53,144,52,151,59,145,59,152,116,211,19,36,209,
+ 11,36,160,100,208,11,42,208,4,42,114,59,0,0,0,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,
+ 3,0,0,0,243,172,0,0,0,151,0,116,1,0,0,0,
+ 0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
+ 0,0,0,125,0,116,5,0,0,0,0,0,0,0,0,124,
+ 0,116,6,0,0,0,0,0,0,0,0,171,2,0,0,0,
+ 0,0,0,114,24,116,9,0,0,0,0,0,0,0,0,106,
+ 10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,0,100,1,100,2,100,3,171,4,0,0,0,
+ 0,0,0,83,0,116,9,0,0,0,0,0,0,0,0,106,
+ 10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,0,100,4,100,5,100,6,171,4,0,0,0,
+ 0,0,0,83,0,41,7,78,114,83,0,0,0,114,84,0,
+ 0,0,243,1,0,0,0,46,114,4,0,0,0,114,6,0,
+ 0,0,114,2,0,0,0,41,6,114,66,0,0,0,114,67,
+ 0,0,0,114,53,0,0,0,114,54,0,0,0,114,97,0,
+ 0,0,218,9,95,115,112,108,105,116,101,120,116,169,1,114,
+ 105,0,0,0,115,1,0,0,0,32,114,57,0,0,0,114,
+ 16,0,0,0,114,16,0,0,0,1,1,0,0,115,71,0,
+ 0,0,128,0,220,8,10,143,9,137,9,144,33,139,12,128,
+ 65,220,7,17,144,33,148,85,212,7,27,220,15,26,215,15,
+ 36,209,15,36,160,81,168,5,168,116,176,84,211,15,58,208,
+ 8,58,228,15,26,215,15,36,209,15,36,160,81,168,4,168,
+ 99,176,51,211,15,55,208,8,55,114,59,0,0,0,99,1,
+ 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,
+ 0,0,0,243,30,0,0,0,151,0,116,1,0,0,0,0,
+ 0,0,0,0,124,0,171,1,0,0,0,0,0,0,100,1,
+ 25,0,0,0,83,0,41,2,122,41,82,101,116,117,114,110,
+ 115,32,116,104,101,32,102,105,110,97,108,32,99,111,109,112,
+ 111,110,101,110,116,32,111,102,32,97,32,112,97,116,104,110,
+ 97,109,101,114,86,0,0,0,169,1,114,15,0,0,0,114,
+ 137,0,0,0,115,1,0,0,0,32,114,57,0,0,0,114,
+ 17,0,0,0,114,17,0,0,0,12,1,0,0,243,16,0,
+ 0,0,128,0,228,11,16,144,17,139,56,144,65,137,59,208,
+ 4,22,114,59,0,0,0,99,1,0,0,0,0,0,0,0,
+ 0,0,0,0,3,0,0,0,3,0,0,0,243,30,0,0,
+ 0,151,0,116,1,0,0,0,0,0,0,0,0,124,0,171,
+ 1,0,0,0,0,0,0,100,1,25,0,0,0,83,0,41,
+ 2,122,45,82,101,116,117,114,110,115,32,116,104,101,32,100,
+ 105,114,101,99,116,111,114,121,32,99,111,109,112,111,110,101,
+ 110,116,32,111,102,32,97,32,112,97,116,104,110,97,109,101,
+ 114,8,0,0,0,114,139,0,0,0,114,137,0,0,0,115,
+ 1,0,0,0,32,114,57,0,0,0,114,18,0,0,0,114,
+ 18,0,0,0,19,1,0,0,114,140,0,0,0,114,59,0,
+ 0,0,218,14,115,116,95,114,101,112,97,114,115,101,95,116,
+ 97,103,99,1,0,0,0,0,0,0,0,0,0,0,0,5,
+ 0,0,0,3,0,0,0,243,174,0,0,0,151,0,9,0,
116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
- 171,1,0,0,0,0,0,0,125,0,116,5,0,0,0,0,
- 0,0,0,0,124,0,116,6,0,0,0,0,0,0,0,0,
- 171,2,0,0,0,0,0,0,114,3,100,1,125,1,110,2,
- 100,2,125,1,124,0,106,9,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
- 0,0,0,0,115,2,124,0,83,0,100,3,116,11,0,0,
- 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
- 125,3,125,2,124,2,124,3,107,2,0,0,114,43,124,0,
+ 171,1,0,0,0,0,0,0,125,1,116,11,0,0,0,0,
+ 0,0,0,0,124,1,106,12,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,116,14,0,0,0,0,
+ 0,0,0,0,106,16,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,107,40,0,0,171,1,0,0,
+ 0,0,0,0,83,0,35,0,116,4,0,0,0,0,0,0,
+ 0,0,116,6,0,0,0,0,0,0,0,0,116,8,0,0,
+ 0,0,0,0,0,0,102,3,36,0,114,3,1,0,89,0,
+ 121,1,119,0,120,3,89,0,119,1,169,2,122,33,84,101,
+ 115,116,32,119,104,101,116,104,101,114,32,97,32,112,97,116,
+ 104,32,105,115,32,97,32,106,117,110,99,116,105,111,110,70,
+ 41,9,114,66,0,0,0,218,5,108,115,116,97,116,218,7,
+ 79,83,69,114,114,111,114,218,10,86,97,108,117,101,69,114,
+ 114,111,114,114,95,0,0,0,218,4,98,111,111,108,114,142,
+ 0,0,0,218,4,115,116,97,116,218,26,73,79,95,82,69,
+ 80,65,82,83,69,95,84,65,71,95,77,79,85,78,84,95,
+ 80,79,73,78,84,169,2,114,56,0,0,0,218,2,115,116,
+ 115,2,0,0,0,32,32,114,57,0,0,0,114,49,0,0,
+ 0,114,49,0,0,0,27,1,0,0,115,77,0,0,0,128,
+ 0,240,4,3,9,25,220,17,19,151,24,145,24,152,36,147,
+ 30,136,66,244,6,0,16,20,144,66,215,20,37,209,20,37,
+ 172,20,215,41,72,209,41,72,209,20,72,211,15,73,208,8,
+ 73,248,244,5,0,17,24,156,26,164,94,208,15,52,242,0,
+ 1,9,25,217,19,24,240,3,1,9,25,250,115,15,0,0,
+ 0,130,21,61,0,189,20,65,20,3,193,19,1,65,20,3,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+ 0,3,0,0,0,243,46,0,0,0,151,0,116,1,0,0,
+ 0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
+ 0,0,0,0,1,0,121,1,114,144,0,0,0,41,2,114,
+ 66,0,0,0,114,67,0,0,0,114,55,0,0,0,115,1,
+ 0,0,0,32,114,57,0,0,0,114,49,0,0,0,114,49,
+ 0,0,0,35,1,0,0,115,16,0,0,0,128,0,228,8,
+ 10,143,9,137,9,144,36,140,15,216,15,20,114,59,0,0,
+ 0,99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,
+ 0,0,3,0,0,0,243,90,0,0,0,151,0,9,0,116,
+ 1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,171,
+ 1,0,0,0,0,0,0,125,1,121,2,35,0,116,4,0,
+ 0,0,0,0,0,0,0,116,6,0,0,0,0,0,0,0,
+ 0,102,2,36,0,114,3,1,0,89,0,121,1,119,0,120,
+ 3,89,0,119,1,41,3,122,67,84,101,115,116,32,119,104,
+ 101,116,104,101,114,32,97,32,112,97,116,104,32,101,120,105,
+ 115,116,115,46,32,32,82,101,116,117,114,110,115,32,84,114,
+ 117,101,32,102,111,114,32,98,114,111,107,101,110,32,115,121,
+ 109,98,111,108,105,99,32,108,105,110,107,115,70,84,41,4,
+ 114,66,0,0,0,114,145,0,0,0,114,146,0,0,0,114,
+ 147,0,0,0,114,151,0,0,0,115,2,0,0,0,32,32,
+ 114,57,0,0,0,114,26,0,0,0,114,26,0,0,0,43,
+ 1,0,0,115,50,0,0,0,128,0,240,4,3,5,21,220,
+ 13,15,143,88,137,88,144,100,139,94,136,2,240,6,0,12,
+ 16,248,244,5,0,13,20,148,90,208,11,32,242,0,1,5,
+ 21,217,15,20,240,3,1,5,21,250,115,12,0,0,0,130,
+ 21,24,0,152,15,42,3,169,1,42,3,41,1,218,18,95,
+ 103,101,116,118,111,108,117,109,101,112,97,116,104,110,97,109,
+ 101,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,
+ 0,0,3,0,0,0,243,62,1,0,0,151,0,116,1,0,
+ 0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,
+ 0,0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,
+ 0,124,0,171,1,0,0,0,0,0,0,125,1,116,7,0,
+ 0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,
+ 0,125,0,116,9,0,0,0,0,0,0,0,0,124,0,171,
+ 1,0,0,0,0,0,0,92,3,0,0,125,2,125,3,125,
+ 4,124,2,114,10,124,2,100,1,25,0,0,0,124,1,118,
+ 0,114,3,124,4,12,0,83,0,124,3,114,3,124,4,115,
+ 1,121,2,116,10,0,0,0,0,0,0,0,0,114,76,124,
+ 0,106,13,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,125,
+ 5,116,11,0,0,0,0,0,0,0,0,124,0,171,1,0,
+ 0,0,0,0,0,106,13,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,
+ 0,0,0,125,6,124,5,106,15,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
+ 0,0,0,124,6,106,15,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,
+ 0,107,40,0,0,83,0,121,3,41,4,122,97,84,101,115,
+ 116,32,119,104,101,116,104,101,114,32,97,32,112,97,116,104,
+ 32,105,115,32,97,32,109,111,117,110,116,32,112,111,105,110,
+ 116,32,40,97,32,100,114,105,118,101,32,114,111,111,116,44,
+ 32,116,104,101,32,114,111,111,116,32,111,102,32,97,10,32,
+ 32,32,32,115,104,97,114,101,44,32,111,114,32,97,32,109,
+ 111,117,110,116,101,100,32,118,111,108,117,109,101,41,114,8,
+ 0,0,0,84,70,41,8,114,66,0,0,0,114,67,0,0,
+ 0,114,58,0,0,0,114,33,0,0,0,114,14,0,0,0,
+ 114,155,0,0,0,114,129,0,0,0,218,8,99,97,115,101,
+ 102,111,108,100,41,7,114,56,0,0,0,114,100,0,0,0,
+ 114,110,0,0,0,114,111,0,0,0,218,4,114,101,115,116,
+ 218,1,120,218,1,121,115,7,0,0,0,32,32,32,32,32,
+ 32,32,114,57,0,0,0,114,29,0,0,0,114,29,0,0,
+ 0,65,1,0,0,115,145,0,0,0,128,0,244,6,0,12,
+ 14,143,57,137,57,144,84,139,63,128,68,220,11,24,152,20,
+ 211,11,30,128,68,220,11,18,144,52,139,61,128,68,220,24,
+ 33,160,36,155,15,209,4,21,128,69,136,52,144,20,217,7,
+ 12,144,21,144,113,145,24,152,84,209,17,33,216,19,23,136,
+ 120,136,15,217,7,11,145,68,216,15,19,229,7,25,216,12,
+ 16,143,75,137,75,152,4,211,12,29,136,1,220,11,29,152,
+ 100,211,11,35,215,11,42,209,11,42,168,52,211,11,48,136,
+ 1,216,15,16,143,122,137,122,139,124,152,113,159,122,153,122,
+ 155,124,209,15,43,208,8,43,224,15,20,114,59,0,0,0,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,
+ 0,3,0,0,0,243,56,3,0,0,151,0,116,1,0,0,
+ 0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
+ 0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,0,
+ 124,0,116,6,0,0,0,0,0,0,0,0,171,2,0,0,
+ 0,0,0,0,114,3,100,1,125,1,110,2,100,2,125,1,
+ 124,0,106,9,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
+ 115,2,124,0,83,0,100,3,116,11,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,125,3,125,2,
+ 124,2,124,3,107,2,0,0,114,43,124,0,124,2,25,0,
+ 0,0,116,13,0,0,0,0,0,0,0,0,124,0,171,1,
+ 0,0,0,0,0,0,118,1,114,27,124,2,100,3,122,13,
+ 0,0,125,2,124,2,124,3,107,2,0,0,114,17,124,0,
124,2,25,0,0,0,116,13,0,0,0,0,0,0,0,0,
- 124,0,171,1,0,0,0,0,0,0,118,1,114,27,124,2,
- 100,3,122,13,0,0,125,2,124,2,124,3,107,2,0,0,
- 114,17,124,0,124,2,25,0,0,0,116,13,0,0,0,0,
- 0,0,0,0,124,0,171,1,0,0,0,0,0,0,118,1,
- 114,1,140,27,100,4,116,0,0,0,0,0,0,0,0,0,
- 106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,118,0,114,20,116,0,0,0,0,0,0,0,
- 0,0,106,14,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,100,4,25,0,0,0,125,4,110,69,
- 100,5,116,0,0,0,0,0,0,0,0,0,106,14,0,0,
+ 124,0,171,1,0,0,0,0,0,0,118,1,114,1,140,27,
+ 100,4,116,0,0,0,0,0,0,0,0,0,106,14,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 118,1,114,2,124,0,83,0,9,0,116,0,0,0,0,0,
- 0,0,0,0,106,14,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,100,6,25,0,0,0,125,5,
- 116,19,0,0,0,0,0,0,0,0,124,5,116,0,0,0,
- 0,0,0,0,0,0,106,14,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,100,5,25,0,0,0,
- 171,2,0,0,0,0,0,0,125,4,124,2,100,3,107,55,
- 0,0,114,115,124,0,100,3,124,2,26,0,125,6,116,5,
- 0,0,0,0,0,0,0,0,124,6,116,6,0,0,0,0,
- 0,0,0,0,171,2,0,0,0,0,0,0,114,21,116,1,
- 0,0,0,0,0,0,0,0,106,20,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,124,6,171,1,
- 0,0,0,0,0,0,125,6,116,0,0,0,0,0,0,0,
+ 118,0,114,20,116,0,0,0,0,0,0,0,0,0,106,14,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,100,4,25,0,0,0,125,4,110,69,100,5,116,0,
+ 0,0,0,0,0,0,0,0,106,14,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,118,1,114,2,
+ 124,0,83,0,9,0,116,0,0,0,0,0,0,0,0,0,
+ 106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,6,25,0,0,0,125,5,116,19,0,0,
+ 0,0,0,0,0,0,124,5,116,0,0,0,0,0,0,0,
0,0,106,14,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,106,23,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,100,8,171,1,0,0,
- 0,0,0,0,125,7,124,6,124,7,107,55,0,0,114,37,
- 124,7,116,25,0,0,0,0,0,0,0,0,124,4,171,1,
- 0,0,0,0,0,0,107,55,0,0,114,2,124,0,83,0,
- 116,19,0,0,0,0,0,0,0,0,116,27,0,0,0,0,
- 0,0,0,0,124,4,171,1,0,0,0,0,0,0,124,6,
- 171,2,0,0,0,0,0,0,125,4,116,5,0,0,0,0,
- 0,0,0,0,124,0,116,6,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,100,5,25,0,0,0,171,2,0,0,
+ 0,0,0,0,125,4,124,2,100,3,107,55,0,0,114,115,
+ 124,0,100,3,124,2,26,0,125,6,116,5,0,0,0,0,
+ 0,0,0,0,124,6,116,6,0,0,0,0,0,0,0,0,
171,2,0,0,0,0,0,0,114,21,116,1,0,0,0,0,
- 0,0,0,0,106,28,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,106,20,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,124,6,171,1,0,0,0,0,
+ 0,0,125,6,116,0,0,0,0,0,0,0,0,0,106,14,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,106,23,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,100,8,171,1,0,0,0,0,0,0,
+ 125,7,124,6,124,7,107,55,0,0,114,37,124,7,116,25,
0,0,0,0,0,0,0,0,124,4,171,1,0,0,0,0,
- 0,0,125,4,124,4,124,0,124,2,100,9,26,0,122,0,
- 0,0,83,0,35,0,116,16,0,0,0,0,0,0,0,0,
- 36,0,114,5,1,0,100,7,125,5,89,0,140,207,119,0,
- 120,3,89,0,119,1,41,10,122,76,69,120,112,97,110,100,
- 32,126,32,97,110,100,32,126,117,115,101,114,32,99,111,110,
- 115,116,114,117,99,116,115,46,10,10,32,32,32,32,73,102,
- 32,117,115,101,114,32,111,114,32,36,72,79,77,69,32,105,
- 115,32,117,110,107,110,111,119,110,44,32,100,111,32,110,111,
- 116,104,105,110,103,46,243,1,0,0,0,126,218,1,126,114,
- 86,0,0,0,218,11,85,83,69,82,80,82,79,70,73,76,
- 69,218,8,72,79,77,69,80,65,84,72,218,9,72,79,77,
- 69,68,82,73,86,69,114,116,0,0,0,218,8,85,83,69,
- 82,78,65,77,69,78,41,15,114,66,0,0,0,114,67,0,
- 0,0,114,53,0,0,0,114,54,0,0,0,114,87,0,0,
- 0,114,128,0,0,0,114,58,0,0,0,218,7,101,110,118,
- 105,114,111,110,218,8,75,101,121,69,114,114,111,114,114,12,
- 0,0,0,114,80,0,0,0,218,3,103,101,116,114,17,0,
- 0,0,114,18,0,0,0,114,79,0,0,0,41,8,114,56,
- 0,0,0,218,5,116,105,108,100,101,114,132,0,0,0,218,
- 1,110,218,8,117,115,101,114,104,111,109,101,114,110,0,0,
- 0,218,11,116,97,114,103,101,116,95,117,115,101,114,218,12,
- 99,117,114,114,101,110,116,95,117,115,101,114,115,8,0,0,
- 0,32,32,32,32,32,32,32,32,114,57,0,0,0,114,30,
- 0,0,0,114,30,0,0,0,94,1,0,0,115,123,1,0,
- 0,128,0,244,8,0,12,14,143,57,137,57,144,84,139,63,
- 128,68,220,7,17,144,36,156,5,212,7,30,216,16,20,137,
- 5,224,16,19,136,5,216,11,15,143,63,137,63,152,53,212,
- 11,33,216,15,19,136,11,216,11,12,140,99,144,36,139,105,
- 128,113,128,65,216,10,11,136,97,138,37,144,68,152,17,145,
- 71,164,61,176,20,211,35,54,209,20,54,216,8,9,136,81,
- 137,6,136,1,240,3,0,11,12,136,97,138,37,144,68,152,
- 17,145,71,164,61,176,20,211,35,54,210,20,54,240,6,0,
- 8,21,156,2,159,10,153,10,209,7,34,220,19,21,151,58,
- 145,58,152,109,209,19,44,137,8,216,13,23,156,50,159,58,
- 153,58,209,13,37,216,15,19,136,11,240,4,3,9,23,220,
- 20,22,151,74,145,74,152,123,209,20,43,136,69,244,6,0,
- 20,24,152,5,156,114,159,122,153,122,168,42,209,31,53,211,
- 19,54,136,8,224,7,8,136,65,130,118,216,22,26,152,49,
- 152,81,144,105,136,11,220,11,21,144,107,164,53,212,11,41,
- 220,26,28,159,43,153,43,160,107,211,26,50,136,75,220,23,
- 25,151,122,145,122,151,126,145,126,160,106,211,23,49,136,12,
- 224,11,22,152,44,210,11,38,240,12,0,16,28,156,120,168,
- 8,211,31,49,210,15,49,216,23,27,144,11,220,23,27,156,
- 71,160,72,211,28,45,168,123,211,23,59,136,72,228,7,17,
- 144,36,156,5,212,7,30,220,19,21,151,59,145,59,152,120,
- 211,19,40,136,8,224,11,19,144,100,152,49,152,50,144,104,
- 209,11,30,208,4,30,248,244,47,0,16,24,242,0,1,9,
- 23,216,20,22,138,69,240,3,1,9,23,250,115,18,0,0,
- 0,194,54,19,70,11,0,198,11,11,70,25,3,198,24,1,
- 70,25,3,99,1,0,0,0,0,0,0,0,0,0,0,0,
- 6,0,0,0,3,0,0,0,243,236,6,0,0,151,0,116,
- 1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,171,
- 1,0,0,0,0,0,0,125,0,116,5,0,0,0,0,0,
- 0,0,0,124,0,116,6,0,0,0,0,0,0,0,0,171,
- 2,0,0,0,0,0,0,114,80,100,1,124,0,118,1,114,
- 6,100,2,124,0,118,1,114,2,124,0,83,0,100,3,100,
- 4,108,4,125,1,116,7,0,0,0,0,0,0,0,0,124,
- 1,106,10,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,106,12,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,122,0,0,0,100,
- 5,122,0,0,0,100,6,171,2,0,0,0,0,0,0,125,
- 2,100,7,125,3,100,2,125,4,100,8,125,5,100,9,125,
- 6,100,1,125,7,116,15,0,0,0,0,0,0,0,0,116,
- 0,0,0,0,0,0,0,0,0,100,10,100,4,171,3,0,
- 0,0,0,0,0,125,8,110,68,100,11,124,0,118,1,114,
- 6,100,12,124,0,118,1,114,2,124,0,83,0,100,3,100,
- 4,108,4,125,1,124,1,106,10,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,1,106,12,0,
+ 0,0,107,55,0,0,114,2,124,0,83,0,116,19,0,0,
+ 0,0,0,0,0,0,116,27,0,0,0,0,0,0,0,0,
+ 124,4,171,1,0,0,0,0,0,0,124,6,171,2,0,0,
+ 0,0,0,0,125,4,116,5,0,0,0,0,0,0,0,0,
+ 124,0,116,6,0,0,0,0,0,0,0,0,171,2,0,0,
+ 0,0,0,0,114,21,116,1,0,0,0,0,0,0,0,0,
+ 106,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,124,4,171,1,0,0,0,0,0,0,125,4,
+ 124,4,124,0,124,2,100,9,26,0,122,0,0,0,83,0,
+ 35,0,116,16,0,0,0,0,0,0,0,0,36,0,114,5,
+ 1,0,100,7,125,5,89,0,140,207,119,0,120,3,89,0,
+ 119,1,41,10,122,76,69,120,112,97,110,100,32,126,32,97,
+ 110,100,32,126,117,115,101,114,32,99,111,110,115,116,114,117,
+ 99,116,115,46,10,10,32,32,32,32,73,102,32,117,115,101,
+ 114,32,111,114,32,36,72,79,77,69,32,105,115,32,117,110,
+ 107,110,111,119,110,44,32,100,111,32,110,111,116,104,105,110,
+ 103,46,243,1,0,0,0,126,218,1,126,114,86,0,0,0,
+ 218,11,85,83,69,82,80,82,79,70,73,76,69,218,8,72,
+ 79,77,69,80,65,84,72,218,9,72,79,77,69,68,82,73,
+ 86,69,114,116,0,0,0,218,8,85,83,69,82,78,65,77,
+ 69,78,41,15,114,66,0,0,0,114,67,0,0,0,114,53,
+ 0,0,0,114,54,0,0,0,114,87,0,0,0,114,128,0,
+ 0,0,114,58,0,0,0,218,7,101,110,118,105,114,111,110,
+ 218,8,75,101,121,69,114,114,111,114,114,12,0,0,0,114,
+ 80,0,0,0,218,3,103,101,116,114,17,0,0,0,114,18,
+ 0,0,0,114,79,0,0,0,41,8,114,56,0,0,0,218,
+ 5,116,105,108,100,101,114,132,0,0,0,218,1,110,218,8,
+ 117,115,101,114,104,111,109,101,114,110,0,0,0,218,11,116,
+ 97,114,103,101,116,95,117,115,101,114,218,12,99,117,114,114,
+ 101,110,116,95,117,115,101,114,115,8,0,0,0,32,32,32,
+ 32,32,32,32,32,114,57,0,0,0,114,30,0,0,0,114,
+ 30,0,0,0,94,1,0,0,115,123,1,0,0,128,0,244,
+ 8,0,12,14,143,57,137,57,144,84,139,63,128,68,220,7,
+ 17,144,36,156,5,212,7,30,216,16,20,137,5,224,16,19,
+ 136,5,216,11,15,143,63,137,63,152,53,212,11,33,216,15,
+ 19,136,11,216,11,12,140,99,144,36,139,105,128,113,128,65,
+ 216,10,11,136,97,138,37,144,68,152,17,145,71,164,61,176,
+ 20,211,35,54,209,20,54,216,8,9,136,81,137,6,136,1,
+ 240,3,0,11,12,136,97,138,37,144,68,152,17,145,71,164,
+ 61,176,20,211,35,54,210,20,54,240,6,0,8,21,156,2,
+ 159,10,153,10,209,7,34,220,19,21,151,58,145,58,152,109,
+ 209,19,44,137,8,216,13,23,156,50,159,58,153,58,209,13,
+ 37,216,15,19,136,11,240,4,3,9,23,220,20,22,151,74,
+ 145,74,152,123,209,20,43,136,69,244,6,0,20,24,152,5,
+ 156,114,159,122,153,122,168,42,209,31,53,211,19,54,136,8,
+ 224,7,8,136,65,130,118,216,22,26,152,49,152,81,144,105,
+ 136,11,220,11,21,144,107,164,53,212,11,41,220,26,28,159,
+ 43,153,43,160,107,211,26,50,136,75,220,23,25,151,122,145,
+ 122,151,126,145,126,160,106,211,23,49,136,12,224,11,22,152,
+ 44,210,11,38,240,12,0,16,28,156,120,168,8,211,31,49,
+ 210,15,49,216,23,27,144,11,220,23,27,156,71,160,72,211,
+ 28,45,168,123,211,23,59,136,72,228,7,17,144,36,156,5,
+ 212,7,30,220,19,21,151,59,145,59,152,120,211,19,40,136,
+ 8,224,11,19,144,100,152,49,152,50,144,104,209,11,30,208,
+ 4,30,248,244,47,0,16,24,242,0,1,9,23,216,20,22,
+ 138,69,240,3,1,9,23,250,115,18,0,0,0,194,54,19,
+ 70,11,0,198,11,11,70,25,3,198,24,1,70,25,3,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,
+ 3,0,0,0,243,236,6,0,0,151,0,116,1,0,0,0,
+ 0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
+ 0,0,0,125,0,116,5,0,0,0,0,0,0,0,0,124,
+ 0,116,6,0,0,0,0,0,0,0,0,171,2,0,0,0,
+ 0,0,0,114,80,100,1,124,0,118,1,114,6,100,2,124,
+ 0,118,1,114,2,124,0,83,0,100,3,100,4,108,4,125,
+ 1,116,7,0,0,0,0,0,0,0,0,124,1,106,10,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,122,0,0,0,100,5,122,0,0,0,125,2,100,13,125,
- 3,100,12,125,4,100,14,125,5,100,15,125,6,100,11,125,
- 7,116,0,0,0,0,0,0,0,0,0,106,16,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,
- 8,124,0,100,4,100,3,26,0,125,9,100,3,125,10,116,
- 19,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
- 0,0,0,125,11,124,10,124,11,107,2,0,0,144,2,114,
- 5,124,0,124,10,124,10,100,16,122,0,0,0,26,0,125,
- 12,124,12,124,3,107,40,0,0,114,53,124,0,124,10,100,
- 16,122,0,0,0,100,4,26,0,125,0,116,19,0,0,0,
+ 0,124,1,106,12,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,122,0,0,0,100,5,122,0,0,
+ 0,100,6,171,2,0,0,0,0,0,0,125,2,100,7,125,
+ 3,100,2,125,4,100,8,125,5,100,9,125,6,100,1,125,
+ 7,116,15,0,0,0,0,0,0,0,0,116,0,0,0,0,
+ 0,0,0,0,0,100,10,100,4,171,3,0,0,0,0,0,
+ 0,125,8,110,68,100,11,124,0,118,1,114,6,100,12,124,
+ 0,118,1,114,2,124,0,83,0,100,3,100,4,108,4,125,
+ 1,124,1,106,10,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,124,1,106,12,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,122,0,0,
+ 0,100,5,122,0,0,0,125,2,100,13,125,3,100,12,125,
+ 4,100,14,125,5,100,15,125,6,100,11,125,7,116,0,0,
+ 0,0,0,0,0,0,0,106,16,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,125,8,124,0,100,
+ 4,100,3,26,0,125,9,100,3,125,10,116,19,0,0,0,
0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,125,
- 11,9,0,124,0,106,21,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,124,12,171,1,0,0,0,
- 0,0,0,125,10,124,9,124,12,124,0,100,4,124,10,100,
- 16,122,0,0,0,26,0,122,0,0,0,122,13,0,0,125,
- 9,144,1,110,183,124,12,124,4,107,40,0,0,114,141,124,
- 0,124,10,100,16,122,0,0,0,124,10,100,17,122,0,0,
- 0,26,0,124,4,107,40,0,0,114,12,124,9,124,12,122,
- 13,0,0,125,9,124,10,100,16,122,13,0,0,125,10,144,
- 1,110,152,124,0,124,10,100,16,122,0,0,0,100,4,26,
- 0,125,0,116,19,0,0,0,0,0,0,0,0,124,0,171,
- 1,0,0,0,0,0,0,125,11,9,0,124,0,106,21,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,124,4,171,1,0,0,0,0,0,0,125,10,124,0,100,
- 4,124,10,26,0,125,13,9,0,124,8,128,58,116,1,0,
+ 11,124,10,124,11,107,2,0,0,144,2,114,5,124,0,124,
+ 10,124,10,100,16,122,0,0,0,26,0,125,12,124,12,124,
+ 3,107,40,0,0,114,53,124,0,124,10,100,16,122,0,0,
+ 0,100,4,26,0,125,0,116,19,0,0,0,0,0,0,0,
+ 0,124,0,171,1,0,0,0,0,0,0,125,11,9,0,124,
+ 0,106,21,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,124,12,171,1,0,0,0,0,0,0,125,
+ 10,124,9,124,12,124,0,100,4,124,10,100,16,122,0,0,
+ 0,26,0,122,0,0,0,122,13,0,0,125,9,144,1,110,
+ 183,124,12,124,4,107,40,0,0,114,141,124,0,124,10,100,
+ 16,122,0,0,0,124,10,100,17,122,0,0,0,26,0,124,
+ 4,107,40,0,0,114,12,124,9,124,12,122,13,0,0,125,
+ 9,124,10,100,16,122,13,0,0,125,10,144,1,110,152,124,
+ 0,124,10,100,16,122,0,0,0,100,4,26,0,125,0,116,
+ 19,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
+ 0,0,0,125,11,9,0,124,0,106,21,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,124,4,171,
+ 1,0,0,0,0,0,0,125,10,124,0,100,4,124,10,26,
+ 0,125,13,9,0,124,8,128,58,116,1,0,0,0,0,0,
+ 0,0,0,106,24,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,116,0,0,0,0,0,0,0,0,
+ 0,106,16,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,116,1,0,0,0,0,0,0,0,0,106,
+ 26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,13,171,1,0,0,0,0,0,0,25,0,0,
+ 0,171,1,0,0,0,0,0,0,125,14,110,5,124,8,124,
+ 13,25,0,0,0,125,14,124,9,124,14,122,13,0,0,125,
+ 9,144,1,110,37,124,12,124,7,107,40,0,0,144,1,114,
+ 26,124,0,124,10,100,16,122,0,0,0,124,10,100,17,122,
+ 0,0,0,26,0,124,7,107,40,0,0,114,12,124,9,124,
+ 12,122,13,0,0,125,9,124,10,100,16,122,13,0,0,125,
+ 10,144,1,110,5,124,0,124,10,100,16,122,0,0,0,124,
+ 10,100,17,122,0,0,0,26,0,124,5,107,40,0,0,114,
+ 114,124,0,124,10,100,17,122,0,0,0,100,4,26,0,125,
+ 0,116,19,0,0,0,0,0,0,0,0,124,0,171,1,0,
+ 0,0,0,0,0,125,11,9,0,124,0,106,21,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
+ 6,171,1,0,0,0,0,0,0,125,10,124,0,100,4,124,
+ 10,26,0,125,13,9,0,124,8,128,58,116,1,0,0,0,
+ 0,0,0,0,0,106,24,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,116,0,0,0,0,0,0,
+ 0,0,0,106,16,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,116,1,0,0,0,0,0,0,0,
+ 0,106,26,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,124,13,171,1,0,0,0,0,0,0,25,
+ 0,0,0,171,1,0,0,0,0,0,0,125,14,110,5,124,
+ 8,124,13,25,0,0,0,125,14,124,9,124,14,122,13,0,
+ 0,125,9,110,133,124,0,100,4,100,3,26,0,125,13,124,
+ 10,100,16,122,13,0,0,125,10,124,0,124,10,124,10,100,
+ 16,122,0,0,0,26,0,125,12,124,12,114,29,124,12,124,
+ 2,118,0,114,25,124,13,124,12,122,13,0,0,125,13,124,
+ 10,100,16,122,13,0,0,125,10,124,0,124,10,124,10,100,
+ 16,122,0,0,0,26,0,125,12,124,12,114,5,124,12,124,
+ 2,118,0,114,1,140,25,9,0,124,8,128,58,116,1,0,
0,0,0,0,0,0,0,106,24,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,116,0,0,0,0,
0,0,0,0,0,106,16,0,0,0,0,0,0,0,0,0,
@@ -799,871 +834,866 @@ const unsigned char _Py_M__ntpath[] = {
0,0,0,0,0,0,0,124,13,171,1,0,0,0,0,0,
0,25,0,0,0,171,1,0,0,0,0,0,0,125,14,110,
5,124,8,124,13,25,0,0,0,125,14,124,9,124,14,122,
- 13,0,0,125,9,144,1,110,37,124,12,124,7,107,40,0,
- 0,144,1,114,26,124,0,124,10,100,16,122,0,0,0,124,
- 10,100,17,122,0,0,0,26,0,124,7,107,40,0,0,114,
- 12,124,9,124,12,122,13,0,0,125,9,124,10,100,16,122,
- 13,0,0,125,10,144,1,110,5,124,0,124,10,100,16,122,
- 0,0,0,124,10,100,17,122,0,0,0,26,0,124,5,107,
- 40,0,0,114,114,124,0,124,10,100,17,122,0,0,0,100,
- 4,26,0,125,0,116,19,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,125,11,9,0,124,0,106,
- 21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,124,6,171,1,0,0,0,0,0,0,125,10,124,
- 0,100,4,124,10,26,0,125,13,9,0,124,8,128,58,116,
- 1,0,0,0,0,0,0,0,0,106,24,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,116,0,0,
- 0,0,0,0,0,0,0,106,16,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,116,1,0,0,0,
- 0,0,0,0,0,106,26,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,124,13,171,1,0,0,0,
- 0,0,0,25,0,0,0,171,1,0,0,0,0,0,0,125,
- 14,110,5,124,8,124,13,25,0,0,0,125,14,124,9,124,
- 14,122,13,0,0,125,9,110,133,124,0,100,4,100,3,26,
- 0,125,13,124,10,100,16,122,13,0,0,125,10,124,0,124,
- 10,124,10,100,16,122,0,0,0,26,0,125,12,124,12,114,
- 29,124,12,124,2,118,0,114,25,124,13,124,12,122,13,0,
- 0,125,13,124,10,100,16,122,13,0,0,125,10,124,0,124,
- 10,124,10,100,16,122,0,0,0,26,0,125,12,124,12,114,
- 5,124,12,124,2,118,0,114,1,140,25,9,0,124,8,128,
- 58,116,1,0,0,0,0,0,0,0,0,106,24,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,
- 0,0,0,0,0,0,0,0,0,106,16,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,116,1,0,
- 0,0,0,0,0,0,0,106,26,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,13,171,1,0,
- 0,0,0,0,0,25,0,0,0,171,1,0,0,0,0,0,
- 0,125,14,110,5,124,8,124,13,25,0,0,0,125,14,124,
- 9,124,14,122,13,0,0,125,9,124,12,114,11,124,10,100,
- 16,122,23,0,0,125,10,110,5,124,9,124,12,122,13,0,
- 0,125,9,124,10,100,16,122,13,0,0,125,10,124,10,124,
- 11,107,2,0,0,114,2,144,2,140,5,124,9,83,0,35,
- 0,116,22,0,0,0,0,0,0,0,0,36,0,114,16,1,
- 0,124,9,124,12,124,0,122,0,0,0,122,13,0,0,125,
- 9,124,11,100,16,122,10,0,0,125,10,89,0,140,38,119,
- 0,120,3,89,0,119,1,35,0,116,28,0,0,0,0,0,
- 0,0,0,36,0,114,12,1,0,124,4,124,13,122,0,0,
- 0,124,4,122,0,0,0,125,14,89,0,144,1,140,106,119,
- 0,120,3,89,0,119,1,35,0,116,22,0,0,0,0,0,
- 0,0,0,36,0,114,16,1,0,124,9,124,4,124,0,122,
- 0,0,0,122,13,0,0,125,9,124,11,100,16,122,10,0,
- 0,125,10,89,0,140,90,119,0,120,3,89,0,119,1,35,
- 0,116,28,0,0,0,0,0,0,0,0,36,0,114,14,1,
- 0,124,7,124,5,122,0,0,0,124,13,122,0,0,0,124,
- 6,122,0,0,0,125,14,89,0,140,255,119,0,120,3,89,
+ 13,0,0,125,9,124,12,114,11,124,10,100,16,122,23,0,
+ 0,125,10,110,5,124,9,124,12,122,13,0,0,125,9,124,
+ 10,100,16,122,13,0,0,125,10,124,10,124,11,107,2,0,
+ 0,114,2,144,2,140,5,124,9,83,0,35,0,116,22,0,
+ 0,0,0,0,0,0,0,36,0,114,16,1,0,124,9,124,
+ 12,124,0,122,0,0,0,122,13,0,0,125,9,124,11,100,
+ 16,122,10,0,0,125,10,89,0,140,38,119,0,120,3,89,
+ 0,119,1,35,0,116,28,0,0,0,0,0,0,0,0,36,
+ 0,114,12,1,0,124,4,124,13,122,0,0,0,124,4,122,
+ 0,0,0,125,14,89,0,144,1,140,106,119,0,120,3,89,
0,119,1,35,0,116,22,0,0,0,0,0,0,0,0,36,
- 0,114,19,1,0,124,9,124,7,124,5,122,0,0,0,124,
- 0,122,0,0,0,122,13,0,0,125,9,124,11,100,16,122,
- 10,0,0,125,10,89,0,140,147,119,0,120,3,89,0,119,
- 1,35,0,116,28,0,0,0,0,0,0,0,0,36,0,114,
- 8,1,0,124,7,124,13,122,0,0,0,125,14,89,0,140,
- 185,119,0,120,3,89,0,119,1,41,18,122,102,69,120,112,
- 97,110,100,32,115,104,101,108,108,32,118,97,114,105,97,98,
- 108,101,115,32,111,102,32,116,104,101,32,102,111,114,109,115,
- 32,36,118,97,114,44,32,36,123,118,97,114,125,32,97,110,
- 100,32,37,118,97,114,37,46,10,10,32,32,32,32,85,110,
- 107,110,111,119,110,32,118,97,114,105,97,98,108,101,115,32,
- 97,114,101,32,108,101,102,116,32,117,110,99,104,97,110,103,
- 101,100,46,243,1,0,0,0,36,243,1,0,0,0,37,114,
- 8,0,0,0,78,122,2,95,45,218,5,97,115,99,105,105,
- 243,1,0,0,0,39,243,1,0,0,0,123,243,1,0,0,
- 0,125,218,8,101,110,118,105,114,111,110,98,218,1,36,218,
- 1,37,218,1,39,218,1,123,218,1,125,114,86,0,0,0,
- 114,117,0,0,0,41,15,114,66,0,0,0,114,67,0,0,
- 0,114,53,0,0,0,114,54,0,0,0,218,6,115,116,114,
- 105,110,103,218,13,97,115,99,105,105,95,108,101,116,116,101,
- 114,115,218,6,100,105,103,105,116,115,218,7,103,101,116,97,
- 116,116,114,114,168,0,0,0,114,128,0,0,0,114,125,0,
- 0,0,114,147,0,0,0,114,79,0,0,0,114,80,0,0,
- 0,114,169,0,0,0,41,15,114,56,0,0,0,114,189,0,
- 0,0,218,8,118,97,114,99,104,97,114,115,218,5,113,117,
- 111,116,101,218,7,112,101,114,99,101,110,116,218,5,98,114,
- 97,99,101,218,6,114,98,114,97,99,101,218,6,100,111,108,
- 108,97,114,114,168,0,0,0,218,3,114,101,115,114,125,0,
- 0,0,218,7,112,97,116,104,108,101,110,218,1,99,218,3,
- 118,97,114,218,5,118,97,108,117,101,115,15,0,0,0,32,
- 32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,57,
- 0,0,0,114,31,0,0,0,114,31,0,0,0,155,1,0,
- 0,115,72,4,0,0,128,0,244,8,0,12,14,143,57,137,
- 57,144,84,139,63,128,68,220,7,17,144,36,156,5,212,7,
- 30,216,11,15,144,116,209,11,27,160,4,168,68,209,32,48,
- 216,19,23,136,75,219,8,21,220,19,24,152,22,215,25,45,
- 209,25,45,176,6,183,13,177,13,209,25,61,192,4,209,25,
- 68,192,103,211,19,78,136,8,216,16,21,136,5,216,18,22,
- 136,7,216,16,20,136,5,216,17,21,136,6,216,17,21,136,
- 6,220,18,25,156,34,152,106,168,36,211,18,47,137,7,224,
- 11,14,144,100,137,63,152,115,168,36,153,127,216,19,23,136,
- 75,219,8,21,216,19,25,215,19,39,209,19,39,168,38,175,
- 45,169,45,209,19,55,184,36,209,19,62,136,8,216,16,20,
- 136,5,216,18,21,136,7,216,16,19,136,5,216,17,20,136,
- 6,216,17,20,136,6,220,18,20,151,42,145,42,136,7,216,
- 10,14,136,114,144,1,136,40,128,67,216,12,13,128,69,220,
- 14,17,144,36,139,105,128,71,216,10,15,144,39,139,47,216,
- 12,16,144,21,144,117,152,81,145,119,208,12,31,136,1,216,
- 11,12,144,5,138,58,216,19,23,152,5,160,1,153,9,152,
- 10,208,19,35,136,68,220,22,25,152,36,147,105,136,71,240,
- 2,5,13,36,216,24,28,159,10,153,10,160,49,155,13,144,
- 5,216,16,19,144,113,152,52,160,10,160,21,168,17,161,25,
- 208,27,43,209,23,43,209,16,43,146,3,240,8,0,14,15,
- 144,39,138,92,216,15,19,144,69,152,65,145,73,152,101,160,
- 97,153,105,208,15,40,168,71,210,15,51,216,16,19,144,113,
- 145,8,144,3,216,16,21,152,17,145,10,146,5,224,23,27,
- 152,69,160,33,153,71,152,72,144,126,144,4,220,26,29,152,
- 100,155,41,144,7,240,2,14,17,33,216,28,32,159,74,153,
- 74,160,119,211,28,47,144,69,240,10,0,27,31,152,118,160,
- 5,152,44,144,67,240,2,6,21,56,216,27,34,152,63,220,
- 36,38,167,75,161,75,180,2,183,10,177,10,188,50,191,59,
- 185,59,192,115,211,59,75,209,48,76,211,36,77,153,69,224,
- 36,43,168,67,161,76,152,69,240,6,0,21,24,152,53,145,
- 76,146,67,216,13,14,144,38,139,91,216,15,19,144,69,152,
- 65,145,73,152,101,160,97,153,105,208,15,40,168,70,210,15,
- 50,216,16,19,144,113,145,8,144,3,216,16,21,152,17,145,
- 10,146,5,216,17,21,144,101,152,97,145,105,160,5,168,1,
- 161,9,208,17,42,168,101,210,17,51,216,23,27,152,69,160,
- 33,153,71,152,72,144,126,144,4,220,26,29,152,100,155,41,
- 144,7,240,2,14,17,33,216,28,32,159,74,153,74,160,118,
- 211,28,46,144,69,240,10,0,27,31,152,118,160,5,152,44,
- 144,67,240,2,6,21,62,216,27,34,152,63,220,36,38,167,
- 75,161,75,180,2,183,10,177,10,188,50,191,59,185,59,192,
- 115,211,59,75,209,48,76,211,36,77,153,69,224,36,43,168,
- 67,161,76,152,69,240,6,0,21,24,152,53,145,76,145,67,
- 224,22,26,152,50,152,65,144,104,144,3,216,16,21,152,17,
- 145,10,144,5,216,20,24,152,21,152,117,160,113,153,121,208,
- 20,41,144,1,217,22,23,152,65,160,24,153,77,216,20,23,
- 152,49,145,72,144,67,216,20,25,152,81,145,74,144,69,216,
- 24,28,152,85,160,53,168,49,161,57,208,24,45,144,65,241,
- 7,0,23,24,152,65,160,24,154,77,240,8,6,17,41,216,
- 23,30,144,127,220,32,34,167,11,161,11,172,66,175,74,169,
- 74,180,114,183,123,177,123,192,51,211,55,71,209,44,72,211,
- 32,73,153,5,224,32,39,168,3,161,12,152,5,240,6,0,
- 17,20,144,117,145,12,144,3,217,19,20,216,20,25,152,81,
- 145,74,145,69,224,12,15,144,49,137,72,136,67,216,8,13,
- 144,17,137,10,136,5,240,87,2,0,11,16,144,39,140,47,
- 240,88,2,0,12,15,128,74,248,244,73,2,0,20,30,242,
- 0,2,13,36,216,16,19,144,113,152,52,145,120,145,15,144,
- 3,216,24,31,160,33,153,11,146,5,240,5,2,13,36,251,
- 244,44,0,28,36,242,0,1,21,56,216,32,39,168,35,161,
- 13,176,7,209,32,55,155,5,240,3,1,21,56,251,244,21,
- 0,24,34,242,0,2,17,40,216,20,23,152,55,160,84,153,
- 62,209,20,41,144,67,216,28,35,160,97,153,75,146,69,240,
- 5,2,17,40,251,244,64,1,0,28,36,242,0,1,21,62,
- 216,32,38,168,21,161,14,176,19,209,32,52,176,118,209,32,
- 61,154,5,240,3,1,21,62,251,244,21,0,24,34,242,0,
- 2,17,40,216,20,23,152,54,160,69,153,62,168,68,209,27,
- 48,209,20,48,144,67,216,28,35,160,97,153,75,146,69,240,
- 5,2,17,40,251,244,52,0,24,32,242,0,1,17,41,216,
- 28,34,160,83,153,76,146,69,240,3,1,17,41,250,115,111,
- 0,0,0,195,51,31,75,25,0,197,7,17,76,13,0,197,
- 30,65,1,75,53,0,199,40,17,77,3,0,199,63,65,1,
- 76,41,0,201,56,65,1,77,34,0,203,25,22,75,50,3,
- 203,49,1,75,50,3,203,53,17,76,10,3,204,9,1,76,
- 10,3,204,13,22,76,38,3,204,37,1,76,38,3,204,41,
- 20,77,0,3,204,63,1,77,0,3,205,3,25,77,31,3,
- 205,30,1,77,31,3,205,34,14,77,51,3,205,50,1,77,
- 51,3,41,1,218,14,95,112,97,116,104,95,110,111,114,109,
- 112,97,116,104,99,1,0,0,0,0,0,0,0,0,0,0,
- 0,4,0,0,0,3,0,0,0,243,12,2,0,0,151,0,
- 116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
- 171,1,0,0,0,0,0,0,125,0,116,5,0,0,0,0,
- 0,0,0,0,124,0,116,6,0,0,0,0,0,0,0,0,
- 171,2,0,0,0,0,0,0,114,9,100,1,125,1,100,2,
- 125,2,100,3,125,3,100,4,125,4,110,8,100,5,125,1,
- 100,6,125,2,100,7,125,3,100,8,125,4,124,0,106,9,
+ 0,114,16,1,0,124,9,124,4,124,0,122,0,0,0,122,
+ 13,0,0,125,9,124,11,100,16,122,10,0,0,125,10,89,
+ 0,140,90,119,0,120,3,89,0,119,1,35,0,116,28,0,
+ 0,0,0,0,0,0,0,36,0,114,14,1,0,124,7,124,
+ 5,122,0,0,0,124,13,122,0,0,0,124,6,122,0,0,
+ 0,125,14,89,0,140,255,119,0,120,3,89,0,119,1,35,
+ 0,116,22,0,0,0,0,0,0,0,0,36,0,114,19,1,
+ 0,124,9,124,7,124,5,122,0,0,0,124,0,122,0,0,
+ 0,122,13,0,0,125,9,124,11,100,16,122,10,0,0,125,
+ 10,89,0,140,147,119,0,120,3,89,0,119,1,35,0,116,
+ 28,0,0,0,0,0,0,0,0,36,0,114,8,1,0,124,
+ 7,124,13,122,0,0,0,125,14,89,0,140,185,119,0,120,
+ 3,89,0,119,1,41,18,122,102,69,120,112,97,110,100,32,
+ 115,104,101,108,108,32,118,97,114,105,97,98,108,101,115,32,
+ 111,102,32,116,104,101,32,102,111,114,109,115,32,36,118,97,
+ 114,44,32,36,123,118,97,114,125,32,97,110,100,32,37,118,
+ 97,114,37,46,10,10,32,32,32,32,85,110,107,110,111,119,
+ 110,32,118,97,114,105,97,98,108,101,115,32,97,114,101,32,
+ 108,101,102,116,32,117,110,99,104,97,110,103,101,100,46,243,
+ 1,0,0,0,36,243,1,0,0,0,37,114,8,0,0,0,
+ 78,122,2,95,45,218,5,97,115,99,105,105,243,1,0,0,
+ 0,39,243,1,0,0,0,123,243,1,0,0,0,125,218,8,
+ 101,110,118,105,114,111,110,98,218,1,36,218,1,37,218,1,
+ 39,218,1,123,218,1,125,114,86,0,0,0,114,117,0,0,
+ 0,41,15,114,66,0,0,0,114,67,0,0,0,114,53,0,
+ 0,0,114,54,0,0,0,218,6,115,116,114,105,110,103,218,
+ 13,97,115,99,105,105,95,108,101,116,116,101,114,115,218,6,
+ 100,105,103,105,116,115,218,7,103,101,116,97,116,116,114,114,
+ 168,0,0,0,114,128,0,0,0,114,125,0,0,0,114,147,
+ 0,0,0,114,79,0,0,0,114,80,0,0,0,114,169,0,
+ 0,0,41,15,114,56,0,0,0,114,189,0,0,0,218,8,
+ 118,97,114,99,104,97,114,115,218,5,113,117,111,116,101,218,
+ 7,112,101,114,99,101,110,116,218,5,98,114,97,99,101,218,
+ 6,114,98,114,97,99,101,218,6,100,111,108,108,97,114,114,
+ 168,0,0,0,218,3,114,101,115,114,125,0,0,0,218,7,
+ 112,97,116,104,108,101,110,218,1,99,218,3,118,97,114,218,
+ 5,118,97,108,117,101,115,15,0,0,0,32,32,32,32,32,
+ 32,32,32,32,32,32,32,32,32,32,114,57,0,0,0,114,
+ 31,0,0,0,114,31,0,0,0,155,1,0,0,115,72,4,
+ 0,0,128,0,244,8,0,12,14,143,57,137,57,144,84,139,
+ 63,128,68,220,7,17,144,36,156,5,212,7,30,216,11,15,
+ 144,116,209,11,27,160,4,168,68,209,32,48,216,19,23,136,
+ 75,219,8,21,220,19,24,152,22,215,25,45,209,25,45,176,
+ 6,183,13,177,13,209,25,61,192,4,209,25,68,192,103,211,
+ 19,78,136,8,216,16,21,136,5,216,18,22,136,7,216,16,
+ 20,136,5,216,17,21,136,6,216,17,21,136,6,220,18,25,
+ 156,34,152,106,168,36,211,18,47,137,7,224,11,14,144,100,
+ 137,63,152,115,168,36,153,127,216,19,23,136,75,219,8,21,
+ 216,19,25,215,19,39,209,19,39,168,38,175,45,169,45,209,
+ 19,55,184,36,209,19,62,136,8,216,16,20,136,5,216,18,
+ 21,136,7,216,16,19,136,5,216,17,20,136,6,216,17,20,
+ 136,6,220,18,20,151,42,145,42,136,7,216,10,14,136,114,
+ 144,1,136,40,128,67,216,12,13,128,69,220,14,17,144,36,
+ 139,105,128,71,216,10,15,144,39,139,47,216,12,16,144,21,
+ 144,117,152,81,145,119,208,12,31,136,1,216,11,12,144,5,
+ 138,58,216,19,23,152,5,160,1,153,9,152,10,208,19,35,
+ 136,68,220,22,25,152,36,147,105,136,71,240,2,5,13,36,
+ 216,24,28,159,10,153,10,160,49,155,13,144,5,216,16,19,
+ 144,113,152,52,160,10,160,21,168,17,161,25,208,27,43,209,
+ 23,43,209,16,43,146,3,240,8,0,14,15,144,39,138,92,
+ 216,15,19,144,69,152,65,145,73,152,101,160,97,153,105,208,
+ 15,40,168,71,210,15,51,216,16,19,144,113,145,8,144,3,
+ 216,16,21,152,17,145,10,146,5,224,23,27,152,69,160,33,
+ 153,71,152,72,144,126,144,4,220,26,29,152,100,155,41,144,
+ 7,240,2,14,17,33,216,28,32,159,74,153,74,160,119,211,
+ 28,47,144,69,240,10,0,27,31,152,118,160,5,152,44,144,
+ 67,240,2,6,21,56,216,27,34,152,63,220,36,38,167,75,
+ 161,75,180,2,183,10,177,10,188,50,191,59,185,59,192,115,
+ 211,59,75,209,48,76,211,36,77,153,69,224,36,43,168,67,
+ 161,76,152,69,240,6,0,21,24,152,53,145,76,146,67,216,
+ 13,14,144,38,139,91,216,15,19,144,69,152,65,145,73,152,
+ 101,160,97,153,105,208,15,40,168,70,210,15,50,216,16,19,
+ 144,113,145,8,144,3,216,16,21,152,17,145,10,146,5,216,
+ 17,21,144,101,152,97,145,105,160,5,168,1,161,9,208,17,
+ 42,168,101,210,17,51,216,23,27,152,69,160,33,153,71,152,
+ 72,144,126,144,4,220,26,29,152,100,155,41,144,7,240,2,
+ 14,17,33,216,28,32,159,74,153,74,160,118,211,28,46,144,
+ 69,240,10,0,27,31,152,118,160,5,152,44,144,67,240,2,
+ 6,21,62,216,27,34,152,63,220,36,38,167,75,161,75,180,
+ 2,183,10,177,10,188,50,191,59,185,59,192,115,211,59,75,
+ 209,48,76,211,36,77,153,69,224,36,43,168,67,161,76,152,
+ 69,240,6,0,21,24,152,53,145,76,145,67,224,22,26,152,
+ 50,152,65,144,104,144,3,216,16,21,152,17,145,10,144,5,
+ 216,20,24,152,21,152,117,160,113,153,121,208,20,41,144,1,
+ 217,22,23,152,65,160,24,153,77,216,20,23,152,49,145,72,
+ 144,67,216,20,25,152,81,145,74,144,69,216,24,28,152,85,
+ 160,53,168,49,161,57,208,24,45,144,65,241,7,0,23,24,
+ 152,65,160,24,154,77,240,8,6,17,41,216,23,30,144,127,
+ 220,32,34,167,11,161,11,172,66,175,74,169,74,180,114,183,
+ 123,177,123,192,51,211,55,71,209,44,72,211,32,73,153,5,
+ 224,32,39,168,3,161,12,152,5,240,6,0,17,20,144,117,
+ 145,12,144,3,217,19,20,216,20,25,152,81,145,74,145,69,
+ 224,12,15,144,49,137,72,136,67,216,8,13,144,17,137,10,
+ 136,5,240,87,2,0,11,16,144,39,140,47,240,88,2,0,
+ 12,15,128,74,248,244,73,2,0,20,30,242,0,2,13,36,
+ 216,16,19,144,113,152,52,145,120,145,15,144,3,216,24,31,
+ 160,33,153,11,146,5,240,5,2,13,36,251,244,44,0,28,
+ 36,242,0,1,21,56,216,32,39,168,35,161,13,176,7,209,
+ 32,55,155,5,240,3,1,21,56,251,244,21,0,24,34,242,
+ 0,2,17,40,216,20,23,152,55,160,84,153,62,209,20,41,
+ 144,67,216,28,35,160,97,153,75,146,69,240,5,2,17,40,
+ 251,244,64,1,0,28,36,242,0,1,21,62,216,32,38,168,
+ 21,161,14,176,19,209,32,52,176,118,209,32,61,154,5,240,
+ 3,1,21,62,251,244,21,0,24,34,242,0,2,17,40,216,
+ 20,23,152,54,160,69,153,62,168,68,209,27,48,209,20,48,
+ 144,67,216,28,35,160,97,153,75,146,69,240,5,2,17,40,
+ 251,244,52,0,24,32,242,0,1,17,41,216,28,34,160,83,
+ 153,76,146,69,240,3,1,17,41,250,115,111,0,0,0,195,
+ 51,31,75,25,0,197,7,17,76,13,0,197,30,65,1,75,
+ 53,0,199,40,17,77,3,0,199,63,65,1,76,41,0,201,
+ 56,65,1,77,34,0,203,25,22,75,50,3,203,49,1,75,
+ 50,3,203,53,17,76,10,3,204,9,1,76,10,3,204,13,
+ 22,76,38,3,204,37,1,76,38,3,204,41,20,77,0,3,
+ 204,63,1,77,0,3,205,3,25,77,31,3,205,30,1,77,
+ 31,3,205,34,14,77,51,3,205,50,1,77,51,3,41,1,
+ 218,14,95,112,97,116,104,95,110,111,114,109,112,97,116,104,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
+ 0,3,0,0,0,243,12,2,0,0,151,0,116,1,0,0,
+ 0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
+ 0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,0,
+ 124,0,116,6,0,0,0,0,0,0,0,0,171,2,0,0,
+ 0,0,0,0,114,9,100,1,125,1,100,2,125,2,100,3,
+ 125,3,100,4,125,4,110,8,100,5,125,1,100,6,125,2,
+ 100,7,125,3,100,8,125,4,124,0,106,9,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,2,
+ 124,1,171,2,0,0,0,0,0,0,125,0,116,11,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 92,3,0,0,125,5,125,6,125,0,124,5,124,6,122,0,
+ 0,0,125,7,124,0,106,13,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
+ 0,0,0,0,125,8,100,9,125,9,124,9,116,15,0,0,
+ 0,0,0,0,0,0,124,8,171,1,0,0,0,0,0,0,
+ 107,2,0,0,114,95,124,8,124,9,25,0,0,0,114,8,
+ 124,8,124,9,25,0,0,0,124,3,107,40,0,0,114,4,
+ 124,8,124,9,61,0,110,63,124,8,124,9,25,0,0,0,
+ 124,4,107,40,0,0,114,50,124,9,100,9,107,68,0,0,
+ 114,28,124,8,124,9,100,10,122,10,0,0,25,0,0,0,
+ 124,4,107,55,0,0,114,17,124,8,124,9,100,10,122,10,
+ 0,0,124,9,100,10,122,0,0,0,133,2,61,0,124,9,
+ 100,10,122,23,0,0,125,9,110,22,124,9,100,9,107,40,
+ 0,0,114,6,124,6,114,4,124,8,124,9,61,0,110,11,
+ 124,9,100,10,122,13,0,0,125,9,110,5,124,9,100,10,
+ 122,13,0,0,125,9,124,9,116,15,0,0,0,0,0,0,
+ 0,0,124,8,171,1,0,0,0,0,0,0,107,2,0,0,
+ 114,1,140,95,124,7,115,19,124,8,115,17,124,8,106,17,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,2,124,1,171,2,0,0,0,0,0,0,125,0,
- 116,11,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
- 0,0,0,0,92,3,0,0,125,5,125,6,125,0,124,5,
- 124,6,122,0,0,0,125,7,124,0,106,13,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,
- 171,1,0,0,0,0,0,0,125,8,100,9,125,9,124,9,
- 116,15,0,0,0,0,0,0,0,0,124,8,171,1,0,0,
- 0,0,0,0,107,2,0,0,114,95,124,8,124,9,25,0,
- 0,0,114,8,124,8,124,9,25,0,0,0,124,3,107,40,
- 0,0,114,4,124,8,124,9,61,0,110,63,124,8,124,9,
- 25,0,0,0,124,4,107,40,0,0,114,50,124,9,100,9,
- 107,68,0,0,114,28,124,8,124,9,100,10,122,10,0,0,
- 25,0,0,0,124,4,107,55,0,0,114,17,124,8,124,9,
- 100,10,122,10,0,0,124,9,100,10,122,0,0,0,133,2,
- 61,0,124,9,100,10,122,23,0,0,125,9,110,22,124,9,
- 100,9,107,40,0,0,114,6,124,6,114,4,124,8,124,9,
- 61,0,110,11,124,9,100,10,122,13,0,0,125,9,110,5,
- 124,9,100,10,122,13,0,0,125,9,124,9,116,15,0,0,
+ 0,0,124,3,171,1,0,0,0,0,0,0,1,0,124,7,
+ 124,1,106,19,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,124,8,171,1,0,0,0,0,0,0,
- 107,2,0,0,114,1,140,95,124,7,115,19,124,8,115,17,
- 124,8,106,17,0,0,0,0,0,0,0,0,0,0,0,0,
+ 122,0,0,0,83,0,41,11,122,48,78,111,114,109,97,108,
+ 105,122,101,32,112,97,116,104,44,32,101,108,105,109,105,110,
+ 97,116,105,110,103,32,100,111,117,98,108,101,32,115,108,97,
+ 115,104,101,115,44,32,101,116,99,46,114,83,0,0,0,114,
+ 84,0,0,0,114,135,0,0,0,243,2,0,0,0,46,46,
+ 114,4,0,0,0,114,6,0,0,0,114,2,0,0,0,114,
+ 3,0,0,0,114,8,0,0,0,114,86,0,0,0,41,10,
+ 114,66,0,0,0,114,67,0,0,0,114,53,0,0,0,114,
+ 54,0,0,0,114,71,0,0,0,114,14,0,0,0,114,15,
+ 0,0,0,114,128,0,0,0,218,6,97,112,112,101,110,100,
+ 114,12,0,0,0,41,10,114,56,0,0,0,114,36,0,0,
+ 0,114,39,0,0,0,114,34,0,0,0,114,35,0,0,0,
+ 114,110,0,0,0,114,111,0,0,0,218,6,112,114,101,102,
+ 105,120,218,5,99,111,109,112,115,114,132,0,0,0,115,10,
+ 0,0,0,32,32,32,32,32,32,32,32,32,32,114,57,0,
+ 0,0,114,32,0,0,0,114,32,0,0,0,15,2,0,0,
+ 115,51,1,0,0,128,0,228,15,17,143,121,137,121,152,20,
+ 139,127,136,4,220,11,21,144,100,156,69,212,11,34,216,18,
+ 23,136,67,216,21,25,136,70,216,21,25,136,70,216,21,26,
+ 137,70,224,18,22,136,67,216,21,24,136,70,216,21,24,136,
+ 70,216,21,25,136,70,216,15,19,143,124,137,124,152,70,160,
+ 67,211,15,40,136,4,220,28,37,160,100,155,79,209,8,25,
+ 136,5,136,116,144,84,216,17,22,152,20,145,28,136,6,216,
+ 16,20,151,10,145,10,152,51,147,15,136,5,216,12,13,136,
+ 1,216,14,15,148,35,144,101,147,42,138,110,216,19,24,152,
+ 17,146,56,152,117,160,81,153,120,168,54,210,31,49,216,20,
+ 25,152,33,145,72,216,17,22,144,113,145,24,152,86,210,17,
+ 35,216,19,20,144,113,146,53,152,85,160,49,160,81,161,51,
+ 153,90,168,54,210,29,49,216,24,29,152,97,160,1,153,99,
+ 160,33,160,65,161,35,152,103,152,14,216,20,21,152,17,145,
+ 70,145,65,216,21,22,152,33,146,86,161,4,216,24,29,152,
+ 97,153,8,224,20,21,152,17,145,70,145,65,224,16,17,144,
+ 81,145,6,144,1,240,25,0,15,16,148,35,144,101,147,42,
+ 139,110,241,28,0,16,22,153,101,216,12,17,143,76,137,76,
+ 152,22,212,12,32,216,15,21,152,3,159,8,153,8,160,21,
+ 155,15,209,15,39,208,8,39,114,59,0,0,0,41,1,218,
+ 16,95,103,101,116,102,117,108,108,112,97,116,104,110,97,109,
+ 101,99,1,0,0,0,0,0,0,0,0,0,0,0,6,0,
+ 0,0,3,0,0,0,243,244,1,0,0,151,0,9,0,116,
+ 1,0,0,0,0,0,0,0,0,116,3,0,0,0,0,0,
+ 0,0,0,124,0,171,1,0,0,0,0,0,0,171,1,0,
+ 0,0,0,0,0,83,0,35,0,116,4,0,0,0,0,0,
+ 0,0,0,116,6,0,0,0,0,0,0,0,0,102,2,36,
+ 0,114,3,1,0,89,0,110,4,119,0,120,3,89,0,119,
+ 1,116,9,0,0,0,0,0,0,0,0,106,10,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
+ 0,171,1,0,0,0,0,0,0,125,0,116,13,0,0,0,
+ 0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,115,
+ 164,116,15,0,0,0,0,0,0,0,0,124,0,116,16,0,
+ 0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,114,
+ 19,100,1,125,1,116,8,0,0,0,0,0,0,0,0,106,
+ 18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,125,2,110,18,100,2,125,1,116,8,0,0,0,
+ 0,0,0,0,0,106,20,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,125,2,116,23,0,0,0,
+ 0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,92,
+ 3,0,0,125,3,125,4,125,0,124,3,115,2,124,4,114,
+ 75,9,0,116,25,0,0,0,0,0,0,0,0,116,1,0,
+ 0,0,0,0,0,0,0,124,3,124,4,122,0,0,0,171,
+ 1,0,0,0,0,0,0,124,0,171,2,0,0,0,0,0,
+ 0,125,0,116,3,0,0,0,0,0,0,0,0,124,0,171,
+ 1,0,0,0,0,0,0,83,0,35,0,116,4,0,0,0,
+ 0,0,0,0,0,116,6,0,0,0,0,0,0,0,0,102,
+ 2,36,0,114,21,1,0,124,3,124,1,122,0,0,0,124,
+ 0,122,0,0,0,125,0,89,0,116,3,0,0,0,0,0,
+ 0,0,0,124,0,171,1,0,0,0,0,0,0,83,0,119,
+ 0,120,3,89,0,119,1,116,25,0,0,0,0,0,0,0,
+ 0,2,0,124,2,171,0,0,0,0,0,0,0,124,0,171,
+ 2,0,0,0,0,0,0,125,0,116,3,0,0,0,0,0,
+ 0,0,0,124,0,171,1,0,0,0,0,0,0,83,0,41,
+ 3,250,38,82,101,116,117,114,110,32,116,104,101,32,97,98,
+ 115,111,108,117,116,101,32,118,101,114,115,105,111,110,32,111,
+ 102,32,97,32,112,97,116,104,46,114,83,0,0,0,114,4,
+ 0,0,0,41,13,114,210,0,0,0,114,32,0,0,0,114,
+ 146,0,0,0,114,147,0,0,0,114,66,0,0,0,114,67,
+ 0,0,0,114,11,0,0,0,114,53,0,0,0,114,54,0,
+ 0,0,218,7,103,101,116,99,119,100,98,218,6,103,101,116,
+ 99,119,100,114,14,0,0,0,114,12,0,0,0,41,5,114,
+ 56,0,0,0,114,36,0,0,0,114,214,0,0,0,114,110,
+ 0,0,0,114,111,0,0,0,115,5,0,0,0,32,32,32,
+ 32,32,114,57,0,0,0,114,33,0,0,0,114,33,0,0,
+ 0,69,2,0,0,115,239,0,0,0,128,0,240,4,4,9,
+ 17,220,19,35,164,72,168,84,163,78,211,19,51,208,12,51,
+ 248,220,16,23,156,26,208,15,36,242,0,2,9,17,225,12,
+ 16,240,5,2,9,17,250,244,6,0,16,18,143,121,137,121,
+ 152,20,139,127,136,4,220,15,20,144,84,140,123,220,15,25,
+ 152,36,164,5,212,15,38,216,22,27,144,3,220,25,27,159,
+ 26,153,26,145,6,224,22,26,144,3,220,25,27,159,25,153,
+ 25,144,6,220,32,41,168,36,163,15,209,12,29,136,69,144,
+ 52,152,20,225,15,20,153,4,240,2,4,17,46,220,27,31,
+ 212,32,48,176,21,184,20,177,28,211,32,62,192,4,211,27,
+ 69,144,68,244,12,0,16,24,152,4,139,126,208,8,29,248,
+ 244,11,0,25,32,164,26,208,23,44,242,0,2,17,46,224,
+ 27,32,160,51,153,59,168,20,209,27,45,145,68,244,6,0,
+ 16,24,152,4,139,126,208,8,29,240,11,2,17,46,250,244,
+ 8,0,24,28,153,70,155,72,160,100,211,23,43,144,4,220,
+ 15,23,152,4,139,126,208,8,29,115,30,0,0,0,130,19,
+ 22,0,150,15,40,3,167,1,40,3,194,20,24,66,55,0,
+ 194,55,23,67,27,3,195,26,1,67,27,3,99,1,0,0,
+ 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,
+ 0,243,226,0,0,0,151,0,116,1,0,0,0,0,0,0,
+ 0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 125,0,116,5,0,0,0,0,0,0,0,0,124,0,171,1,
+ 0,0,0,0,0,0,115,69,116,7,0,0,0,0,0,0,
+ 0,0,124,0,116,8,0,0,0,0,0,0,0,0,171,2,
+ 0,0,0,0,0,0,114,21,116,1,0,0,0,0,0,0,
+ 0,0,106,10,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,171,0,0,0,0,0,0,0,125,1,
+ 110,20,116,1,0,0,0,0,0,0,0,0,106,12,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 171,0,0,0,0,0,0,0,125,1,116,15,0,0,0,0,
+ 0,0,0,0,124,1,124,0,171,2,0,0,0,0,0,0,
+ 125,0,116,17,0,0,0,0,0,0,0,0,124,0,171,1,
+ 0,0,0,0,0,0,83,0,41,1,114,212,0,0,0,41,
+ 9,114,66,0,0,0,114,67,0,0,0,114,11,0,0,0,
+ 114,53,0,0,0,114,54,0,0,0,114,213,0,0,0,114,
+ 214,0,0,0,114,12,0,0,0,114,32,0,0,0,41,2,
+ 114,56,0,0,0,218,3,99,119,100,115,2,0,0,0,32,
+ 32,114,57,0,0,0,114,33,0,0,0,114,33,0,0,0,
+ 57,2,0,0,115,75,0,0,0,128,0,228,15,17,143,121,
+ 137,121,152,20,139,127,136,4,220,15,20,144,84,140,123,220,
+ 15,25,152,36,164,5,212,15,38,220,22,24,151,106,145,106,
+ 147,108,145,3,228,22,24,151,105,145,105,147,107,144,3,220,
+ 19,23,152,3,152,84,147,63,136,68,220,15,23,152,4,139,
+ 126,208,8,29,114,59,0,0,0,41,2,218,17,95,103,101,
+ 116,102,105,110,97,108,112,97,116,104,110,97,109,101,218,8,
+ 114,101,97,100,108,105,110,107,99,1,0,0,0,0,0,0,
+ 0,0,0,0,0,7,0,0,0,3,0,0,0,243,120,1,
+ 0,0,151,0,100,1,125,1,116,1,0,0,0,0,0,0,
+ 0,0,171,0,0,0,0,0,0,0,125,2,116,3,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 124,2,118,1,114,111,124,2,106,5,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,116,3,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 171,1,0,0,0,0,0,0,1,0,9,0,124,0,125,3,
+ 116,7,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
+ 0,0,0,0,125,0,116,9,0,0,0,0,0,0,0,0,
+ 124,0,171,1,0,0,0,0,0,0,115,46,116,11,0,0,
0,0,0,0,0,0,124,3,171,1,0,0,0,0,0,0,
- 1,0,124,7,124,1,106,19,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,8,171,1,0,0,
- 0,0,0,0,122,0,0,0,83,0,41,11,122,48,78,111,
- 114,109,97,108,105,122,101,32,112,97,116,104,44,32,101,108,
- 105,109,105,110,97,116,105,110,103,32,100,111,117,98,108,101,
- 32,115,108,97,115,104,101,115,44,32,101,116,99,46,114,83,
- 0,0,0,114,84,0,0,0,114,135,0,0,0,243,2,0,
- 0,0,46,46,114,4,0,0,0,114,6,0,0,0,114,2,
- 0,0,0,114,3,0,0,0,114,8,0,0,0,114,86,0,
- 0,0,41,10,114,66,0,0,0,114,67,0,0,0,114,53,
- 0,0,0,114,54,0,0,0,114,71,0,0,0,114,14,0,
- 0,0,114,15,0,0,0,114,128,0,0,0,218,6,97,112,
- 112,101,110,100,114,12,0,0,0,41,10,114,56,0,0,0,
- 114,36,0,0,0,114,39,0,0,0,114,34,0,0,0,114,
- 35,0,0,0,114,110,0,0,0,114,111,0,0,0,218,6,
- 112,114,101,102,105,120,218,5,99,111,109,112,115,114,132,0,
- 0,0,115,10,0,0,0,32,32,32,32,32,32,32,32,32,
- 32,114,57,0,0,0,114,32,0,0,0,114,32,0,0,0,
- 15,2,0,0,115,51,1,0,0,128,0,228,15,17,143,121,
- 137,121,152,20,139,127,136,4,220,11,21,144,100,156,69,212,
- 11,34,216,18,23,136,67,216,21,25,136,70,216,21,25,136,
- 70,216,21,26,137,70,224,18,22,136,67,216,21,24,136,70,
- 216,21,24,136,70,216,21,25,136,70,216,15,19,143,124,137,
- 124,152,70,160,67,211,15,40,136,4,220,28,37,160,100,155,
- 79,209,8,25,136,5,136,116,144,84,216,17,22,152,20,145,
- 28,136,6,216,16,20,151,10,145,10,152,51,147,15,136,5,
- 216,12,13,136,1,216,14,15,148,35,144,101,147,42,138,110,
- 216,19,24,152,17,146,56,152,117,160,81,153,120,168,54,210,
- 31,49,216,20,25,152,33,145,72,216,17,22,144,113,145,24,
- 152,86,210,17,35,216,19,20,144,113,146,53,152,85,160,49,
- 160,81,161,51,153,90,168,54,210,29,49,216,24,29,152,97,
- 160,1,153,99,160,33,160,65,161,35,152,103,152,14,216,20,
- 21,152,17,145,70,145,65,216,21,22,152,33,146,86,161,4,
- 216,24,29,152,97,153,8,224,20,21,152,17,145,70,145,65,
- 224,16,17,144,81,145,6,144,1,240,25,0,15,16,148,35,
- 144,101,147,42,139,110,241,28,0,16,22,153,101,216,12,17,
- 143,76,137,76,152,22,212,12,32,216,15,21,152,3,159,8,
- 153,8,160,21,155,15,209,15,39,208,8,39,114,59,0,0,
- 0,99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,
- 0,0,3,0,0,0,243,226,0,0,0,151,0,116,1,0,
- 0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,
- 0,0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,115,69,116,7,0,
- 0,0,0,0,0,0,0,124,0,116,8,0,0,0,0,0,
- 0,0,0,171,2,0,0,0,0,0,0,114,21,116,1,0,
- 0,0,0,0,0,0,0,106,10,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
- 0,0,0,125,1,110,20,116,1,0,0,0,0,0,0,0,
- 0,106,12,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,171,0,0,0,0,0,0,0,125,1,116,
- 15,0,0,0,0,0,0,0,0,124,1,124,0,171,2,0,
- 0,0,0,0,0,125,0,116,17,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,83,0,41,1,122,
- 164,82,101,116,117,114,110,32,116,104,101,32,97,98,115,111,
- 108,117,116,101,32,118,101,114,115,105,111,110,32,111,102,32,
- 97,32,112,97,116,104,32,97,115,32,97,32,102,97,108,108,
- 98,97,99,107,32,102,117,110,99,116,105,111,110,32,105,110,
- 32,99,97,115,101,10,32,32,32,32,96,110,116,46,95,103,
- 101,116,102,117,108,108,112,97,116,104,110,97,109,101,96,32,
- 105,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,
- 32,111,114,32,114,97,105,115,101,115,32,79,83,69,114,114,
- 111,114,46,32,83,101,101,32,98,112,111,45,51,49,48,52,
- 55,32,102,111,114,10,32,32,32,32,109,111,114,101,46,10,
- 10,32,32,32,32,41,9,114,66,0,0,0,114,67,0,0,
- 0,114,11,0,0,0,114,53,0,0,0,114,54,0,0,0,
- 218,7,103,101,116,99,119,100,98,218,6,103,101,116,99,119,
- 100,114,12,0,0,0,114,32,0,0,0,41,2,114,56,0,
- 0,0,218,3,99,119,100,115,2,0,0,0,32,32,114,57,
- 0,0,0,218,17,95,97,98,115,112,97,116,104,95,102,97,
- 108,108,98,97,99,107,114,214,0,0,0,52,2,0,0,115,
- 77,0,0,0,128,0,244,14,0,12,14,143,57,137,57,144,
- 84,139,63,128,68,220,11,16,144,20,140,59,220,11,21,144,
- 100,156,69,212,11,34,220,18,20,151,42,145,42,147,44,137,
- 67,228,18,20,151,41,145,41,147,43,136,67,220,15,19,144,
- 67,152,20,139,127,136,4,220,11,19,144,68,139,62,208,4,
- 25,114,59,0,0,0,41,1,218,16,95,103,101,116,102,117,
- 108,108,112,97,116,104,110,97,109,101,99,1,0,0,0,0,
- 0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,243,
- 108,0,0,0,151,0,9,0,116,1,0,0,0,0,0,0,
- 0,0,116,3,0,0,0,0,0,0,0,0,124,0,171,1,
- 0,0,0,0,0,0,171,1,0,0,0,0,0,0,83,0,
- 35,0,116,4,0,0,0,0,0,0,0,0,116,6,0,0,
- 0,0,0,0,0,0,102,2,36,0,114,14,1,0,116,9,
+ 115,5,124,3,125,0,9,0,124,0,83,0,116,13,0,0,
+ 0,0,0,0,0,0,116,15,0,0,0,0,0,0,0,0,
+ 116,17,0,0,0,0,0,0,0,0,124,3,171,1,0,0,
+ 0,0,0,0,124,0,171,2,0,0,0,0,0,0,171,1,
+ 0,0,0,0,0,0,125,0,116,3,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,124,2,118,1,
+ 114,1,140,111,124,0,83,0,35,0,116,18,0,0,0,0,
+ 0,0,0,0,36,0,114,26,125,4,124,4,106,20,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,1,118,0,114,6,89,0,100,0,125,4,126,4,124,0,
+ 83,0,130,0,100,0,125,4,126,4,119,1,116,22,0,0,
+ 0,0,0,0,0,0,36,0,114,4,1,0,89,0,124,0,
+ 83,0,119,0,120,3,89,0,119,1,41,2,78,41,12,114,
+ 86,0,0,0,114,117,0,0,0,114,85,0,0,0,233,5,
+ 0,0,0,233,21,0,0,0,233,32,0,0,0,233,50,0,
+ 0,0,233,67,0,0,0,233,87,0,0,0,105,38,17,0,
+ 0,105,40,17,0,0,105,41,17,0,0,41,12,218,3,115,
+ 101,116,114,10,0,0,0,218,3,97,100,100,218,12,95,110,
+ 116,95,114,101,97,100,108,105,110,107,114,11,0,0,0,114,
+ 24,0,0,0,114,32,0,0,0,114,12,0,0,0,114,18,
+ 0,0,0,114,146,0,0,0,218,8,119,105,110,101,114,114,
+ 111,114,114,147,0,0,0,41,5,114,56,0,0,0,218,16,
+ 97,108,108,111,119,101,100,95,119,105,110,101,114,114,111,114,
+ 218,4,115,101,101,110,218,8,111,108,100,95,112,97,116,104,
+ 218,2,101,120,115,5,0,0,0,32,32,32,32,32,114,57,
+ 0,0,0,218,14,95,114,101,97,100,108,105,110,107,95,100,
+ 101,101,112,114,234,0,0,0,102,2,0,0,115,207,0,0,
+ 0,128,0,240,30,0,28,76,1,208,8,24,228,15,18,139,
+ 117,136,4,220,14,22,144,116,139,110,160,68,209,14,40,216,
+ 12,16,143,72,137,72,148,88,152,100,147,94,212,12,36,240,
+ 2,19,13,22,216,27,31,144,8,220,23,35,160,68,211,23,
+ 41,144,4,244,6,0,24,29,152,84,148,123,244,8,0,28,
+ 34,160,40,212,27,43,216,31,39,152,4,216,24,29,240,18,
+ 0,16,20,136,11,244,17,0,28,36,164,68,172,23,176,24,
+ 211,41,58,184,68,211,36,65,211,27,66,144,68,244,29,0,
+ 15,23,144,116,139,110,160,68,210,14,40,240,44,0,16,20,
+ 136,11,248,244,15,0,20,27,242,0,3,13,22,216,19,21,
+ 151,59,145,59,208,34,50,209,19,50,219,20,25,240,10,0,
+ 16,20,136,11,240,9,0,17,22,251,220,19,29,242,0,2,
+ 13,22,224,16,21,216,15,19,136,11,240,7,2,13,22,250,
+ 115,41,0,0,0,181,37,66,11,0,193,29,30,66,11,0,
+ 194,11,9,66,57,3,194,20,14,66,41,3,194,40,1,66,
+ 41,3,194,41,12,66,57,3,194,56,1,66,57,3,99,1,
+ 0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,3,
+ 0,0,0,243,102,1,0,0,151,0,100,1,125,1,124,0,
+ 100,0,100,2,26,0,125,2,124,0,114,28,9,0,116,1,
0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,
- 0,0,99,2,89,0,83,0,119,0,120,3,89,0,119,1,
- 41,1,122,38,82,101,116,117,114,110,32,116,104,101,32,97,
- 98,115,111,108,117,116,101,32,118,101,114,115,105,111,110,32,
- 111,102,32,97,32,112,97,116,104,46,41,5,114,215,0,0,
- 0,114,32,0,0,0,114,146,0,0,0,114,147,0,0,0,
- 114,214,0,0,0,114,55,0,0,0,115,1,0,0,0,32,
- 114,57,0,0,0,114,33,0,0,0,114,33,0,0,0,76,
- 2,0,0,115,53,0,0,0,128,0,240,4,3,9,43,220,
- 19,35,164,72,168,84,163,78,211,19,51,208,12,51,248,220,
- 16,23,156,26,208,15,36,242,0,1,9,43,220,19,36,160,
- 84,211,19,42,210,12,42,240,3,1,9,43,250,115,12,0,
- 0,0,130,19,22,0,150,26,51,3,178,1,51,3,41,2,
- 218,17,95,103,101,116,102,105,110,97,108,112,97,116,104,110,
- 97,109,101,218,8,114,101,97,100,108,105,110,107,99,1,0,
- 0,0,0,0,0,0,0,0,0,0,7,0,0,0,3,0,
- 0,0,243,120,1,0,0,151,0,100,1,125,1,116,1,0,
- 0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,125,
- 2,116,3,0,0,0,0,0,0,0,0,124,0,171,1,0,
- 0,0,0,0,0,124,2,118,1,114,111,124,2,106,5,0,
+ 0,0,125,0,124,2,114,12,116,3,0,0,0,0,0,0,
+ 0,0,124,0,124,2,171,2,0,0,0,0,0,0,83,0,
+ 124,0,83,0,124,2,83,0,35,0,116,4,0,0,0,0,
+ 0,0,0,0,36,0,114,123,125,3,124,3,106,6,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,116,3,0,0,0,0,0,0,0,0,124,0,171,1,0,
- 0,0,0,0,0,171,1,0,0,0,0,0,0,1,0,9,
- 0,124,0,125,3,116,7,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,125,0,116,9,0,0,0,
- 0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,115,
- 46,116,11,0,0,0,0,0,0,0,0,124,3,171,1,0,
- 0,0,0,0,0,115,5,124,3,125,0,9,0,124,0,83,
- 0,116,13,0,0,0,0,0,0,0,0,116,15,0,0,0,
- 0,0,0,0,0,116,17,0,0,0,0,0,0,0,0,124,
- 3,171,1,0,0,0,0,0,0,124,0,171,2,0,0,0,
- 0,0,0,171,1,0,0,0,0,0,0,125,0,116,3,0,
- 0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,
- 0,124,2,118,1,114,1,140,111,124,0,83,0,35,0,116,
- 18,0,0,0,0,0,0,0,0,36,0,114,26,125,4,124,
- 4,106,20,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,118,0,114,6,89,0,100,0,125,
- 4,126,4,124,0,83,0,130,0,100,0,125,4,126,4,119,
- 1,116,22,0,0,0,0,0,0,0,0,36,0,114,4,1,
- 0,89,0,124,0,83,0,119,0,120,3,89,0,119,1,41,
- 2,78,41,12,114,86,0,0,0,114,117,0,0,0,114,85,
- 0,0,0,233,5,0,0,0,233,21,0,0,0,233,32,0,
- 0,0,233,50,0,0,0,233,67,0,0,0,233,87,0,0,
- 0,105,38,17,0,0,105,40,17,0,0,105,41,17,0,0,
- 41,12,218,3,115,101,116,114,10,0,0,0,218,3,97,100,
- 100,218,12,95,110,116,95,114,101,97,100,108,105,110,107,114,
- 11,0,0,0,114,24,0,0,0,114,32,0,0,0,114,12,
- 0,0,0,114,18,0,0,0,114,146,0,0,0,218,8,119,
- 105,110,101,114,114,111,114,114,147,0,0,0,41,5,114,56,
- 0,0,0,218,16,97,108,108,111,119,101,100,95,119,105,110,
- 101,114,114,111,114,218,4,115,101,101,110,218,8,111,108,100,
- 95,112,97,116,104,218,2,101,120,115,5,0,0,0,32,32,
- 32,32,32,114,57,0,0,0,218,14,95,114,101,97,100,108,
- 105,110,107,95,100,101,101,112,114,234,0,0,0,89,2,0,
- 0,115,207,0,0,0,128,0,240,30,0,28,76,1,208,8,
- 24,228,15,18,139,117,136,4,220,14,22,144,116,139,110,160,
- 68,209,14,40,216,12,16,143,72,137,72,148,88,152,100,147,
- 94,212,12,36,240,2,19,13,22,216,27,31,144,8,220,23,
- 35,160,68,211,23,41,144,4,244,6,0,24,29,152,84,148,
- 123,244,8,0,28,34,160,40,212,27,43,216,31,39,152,4,
- 216,24,29,240,18,0,16,20,136,11,244,17,0,28,36,164,
- 68,172,23,176,24,211,41,58,184,68,211,36,65,211,27,66,
- 144,68,244,29,0,15,23,144,116,139,110,160,68,210,14,40,
- 240,44,0,16,20,136,11,248,244,15,0,20,27,242,0,3,
- 13,22,216,19,21,151,59,145,59,208,34,50,209,19,50,219,
- 20,25,240,10,0,16,20,136,11,240,9,0,17,22,251,220,
- 19,29,242,0,2,13,22,224,16,21,216,15,19,136,11,240,
- 7,2,13,22,250,115,41,0,0,0,181,37,66,11,0,193,
- 29,30,66,11,0,194,11,9,66,57,3,194,20,14,66,41,
- 3,194,40,1,66,41,3,194,41,12,66,57,3,194,56,1,
- 66,57,3,99,1,0,0,0,0,0,0,0,0,0,0,0,
- 5,0,0,0,3,0,0,0,243,102,1,0,0,151,0,100,
- 1,125,1,124,0,100,0,100,2,26,0,125,2,124,0,114,
- 28,9,0,116,1,0,0,0,0,0,0,0,0,124,0,171,
- 1,0,0,0,0,0,0,125,0,124,2,114,12,116,3,0,
- 0,0,0,0,0,0,0,124,0,124,2,171,2,0,0,0,
- 0,0,0,83,0,124,0,83,0,124,2,83,0,35,0,116,
- 4,0,0,0,0,0,0,0,0,36,0,114,123,125,3,124,
- 3,106,6,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,118,1,114,1,130,0,9,0,116,
- 9,0,0,0,0,0,0,0,0,124,0,171,1,0,0,0,
- 0,0,0,125,4,124,4,124,0,107,55,0,0,114,21,124,
- 2,114,12,116,3,0,0,0,0,0,0,0,0,124,4,124,
- 2,171,2,0,0,0,0,0,0,110,1,124,4,99,2,89,
- 0,100,0,125,3,126,3,83,0,110,15,35,0,116,4,0,
- 0,0,0,0,0,0,0,36,0,114,3,1,0,89,0,110,
- 4,119,0,120,3,89,0,119,1,116,11,0,0,0,0,0,
- 0,0,0,124,0,171,1,0,0,0,0,0,0,92,2,0,
- 0,125,0,125,5,124,0,114,12,124,5,115,10,124,0,124,
- 2,122,0,0,0,99,2,89,0,100,0,125,3,126,3,83,
- 0,124,2,114,12,116,3,0,0,0,0,0,0,0,0,124,
- 5,124,2,171,2,0,0,0,0,0,0,110,1,124,5,125,
- 2,89,0,100,0,125,3,126,3,110,8,100,0,125,3,126,
- 3,119,1,119,0,120,3,89,0,119,1,124,0,114,1,140,
- 168,140,141,41,3,78,41,15,114,86,0,0,0,114,117,0,
- 0,0,114,85,0,0,0,114,220,0,0,0,114,221,0,0,
- 0,114,222,0,0,0,114,223,0,0,0,233,53,0,0,0,
- 233,65,0,0,0,114,224,0,0,0,114,225,0,0,0,233,
- 123,0,0,0,233,161,0,0,0,105,128,7,0,0,105,129,
- 7,0,0,114,8,0,0,0,41,6,114,217,0,0,0,114,
- 12,0,0,0,114,146,0,0,0,114,229,0,0,0,114,234,
- 0,0,0,114,15,0,0,0,41,6,114,56,0,0,0,114,
- 230,0,0,0,114,112,0,0,0,114,233,0,0,0,218,8,
- 110,101,119,95,112,97,116,104,218,4,110,97,109,101,115,6,
- 0,0,0,32,32,32,32,32,32,114,57,0,0,0,218,27,
- 95,103,101,116,102,105,110,97,108,112,97,116,104,110,97,109,
- 101,95,110,111,110,115,116,114,105,99,116,114,242,0,0,0,
- 131,2,0,0,115,222,0,0,0,128,0,240,36,0,28,88,
- 1,208,8,24,240,8,0,16,20,144,66,144,81,136,120,136,
- 4,217,14,18,240,2,22,13,58,220,23,40,168,20,211,23,
- 46,144,4,217,43,47,148,116,152,68,160,36,211,23,39,208,
- 16,57,176,84,208,16,57,240,42,0,16,20,136,11,248,244,
- 41,0,20,27,242,0,19,13,58,216,19,21,151,59,145,59,
- 208,38,54,209,19,54,216,20,25,240,2,9,17,25,244,8,
- 0,32,46,168,100,211,31,51,144,72,216,23,31,160,52,210,
- 23,39,217,55,59,156,116,160,72,168,100,212,31,51,192,24,
- 213,24,73,240,3,0,24,40,248,228,23,30,242,0,2,17,
- 25,225,20,24,240,5,2,17,25,250,244,6,0,30,35,160,
- 52,155,91,145,10,144,4,144,100,241,8,0,20,24,161,4,
- 216,27,31,160,36,153,59,213,20,38,217,43,47,148,116,152,
- 68,160,36,212,23,39,176,84,149,4,251,240,39,19,13,58,
- 250,242,9,0,15,19,248,115,78,0,0,0,139,24,40,0,
- 164,1,40,0,168,9,66,44,3,177,15,66,39,3,193,1,
- 31,65,39,2,193,32,1,66,44,3,193,38,1,66,39,3,
- 193,39,9,65,51,5,193,48,2,66,39,3,193,50,1,65,
- 51,5,193,51,25,66,39,3,194,12,1,66,44,3,194,18,
- 16,66,39,3,194,39,5,66,44,3,70,41,1,218,6,115,
- 116,114,105,99,116,99,1,0,0,0,0,0,0,0,1,0,
- 0,0,6,0,0,0,3,0,0,0,243,146,3,0,0,151,
- 0,116,1,0,0,0,0,0,0,0,0,124,0,171,1,0,
- 0,0,0,0,0,125,0,116,3,0,0,0,0,0,0,0,
- 0,124,0,116,4,0,0,0,0,0,0,0,0,171,2,0,
- 0,0,0,0,0,114,73,100,1,125,2,100,2,125,3,100,
- 3,125,4,116,7,0,0,0,0,0,0,0,0,106,8,0,
+ 124,1,118,1,114,1,130,0,9,0,116,9,0,0,0,0,
+ 0,0,0,0,124,0,171,1,0,0,0,0,0,0,125,4,
+ 124,4,124,0,107,55,0,0,114,21,124,2,114,12,116,3,
+ 0,0,0,0,0,0,0,0,124,4,124,2,171,2,0,0,
+ 0,0,0,0,110,1,124,4,99,2,89,0,100,0,125,3,
+ 126,3,83,0,110,15,35,0,116,4,0,0,0,0,0,0,
+ 0,0,36,0,114,3,1,0,89,0,110,4,119,0,120,3,
+ 89,0,119,1,116,11,0,0,0,0,0,0,0,0,124,0,
+ 171,1,0,0,0,0,0,0,92,2,0,0,125,0,125,5,
+ 124,0,114,12,124,5,115,10,124,0,124,2,122,0,0,0,
+ 99,2,89,0,100,0,125,3,126,3,83,0,124,2,114,12,
+ 116,3,0,0,0,0,0,0,0,0,124,5,124,2,171,2,
+ 0,0,0,0,0,0,110,1,124,5,125,2,89,0,100,0,
+ 125,3,126,3,110,8,100,0,125,3,126,3,119,1,119,0,
+ 120,3,89,0,119,1,124,0,114,1,140,168,140,141,41,3,
+ 78,41,15,114,86,0,0,0,114,117,0,0,0,114,85,0,
+ 0,0,114,220,0,0,0,114,221,0,0,0,114,222,0,0,
+ 0,114,223,0,0,0,233,53,0,0,0,233,65,0,0,0,
+ 114,224,0,0,0,114,225,0,0,0,233,123,0,0,0,233,
+ 161,0,0,0,105,128,7,0,0,105,129,7,0,0,114,8,
+ 0,0,0,41,6,114,217,0,0,0,114,12,0,0,0,114,
+ 146,0,0,0,114,229,0,0,0,114,234,0,0,0,114,15,
+ 0,0,0,41,6,114,56,0,0,0,114,230,0,0,0,114,
+ 112,0,0,0,114,233,0,0,0,218,8,110,101,119,95,112,
+ 97,116,104,218,4,110,97,109,101,115,6,0,0,0,32,32,
+ 32,32,32,32,114,57,0,0,0,218,27,95,103,101,116,102,
+ 105,110,97,108,112,97,116,104,110,97,109,101,95,110,111,110,
+ 115,116,114,105,99,116,114,242,0,0,0,144,2,0,0,115,
+ 222,0,0,0,128,0,240,36,0,28,88,1,208,8,24,240,
+ 8,0,16,20,144,66,144,81,136,120,136,4,217,14,18,240,
+ 2,22,13,58,220,23,40,168,20,211,23,46,144,4,217,43,
+ 47,148,116,152,68,160,36,211,23,39,208,16,57,176,84,208,
+ 16,57,240,42,0,16,20,136,11,248,244,41,0,20,27,242,
+ 0,19,13,58,216,19,21,151,59,145,59,208,38,54,209,19,
+ 54,216,20,25,240,2,9,17,25,244,8,0,32,46,168,100,
+ 211,31,51,144,72,216,23,31,160,52,210,23,39,217,55,59,
+ 156,116,160,72,168,100,212,31,51,192,24,213,24,73,240,3,
+ 0,24,40,248,228,23,30,242,0,2,17,25,225,20,24,240,
+ 5,2,17,25,250,244,6,0,30,35,160,52,155,91,145,10,
+ 144,4,144,100,241,8,0,20,24,161,4,216,27,31,160,36,
+ 153,59,213,20,38,217,43,47,148,116,152,68,160,36,212,23,
+ 39,176,84,149,4,251,240,39,19,13,58,250,242,9,0,15,
+ 19,248,115,78,0,0,0,139,24,40,0,164,1,40,0,168,
+ 9,66,44,3,177,15,66,39,3,193,1,31,65,39,2,193,
+ 32,1,66,44,3,193,38,1,66,39,3,193,39,9,65,51,
+ 5,193,48,2,66,39,3,193,50,1,65,51,5,193,51,25,
+ 66,39,3,194,12,1,66,44,3,194,18,16,66,39,3,194,
+ 39,5,66,44,3,70,41,1,218,6,115,116,114,105,99,116,
+ 99,1,0,0,0,0,0,0,0,1,0,0,0,6,0,0,
+ 0,3,0,0,0,243,146,3,0,0,151,0,116,1,0,0,
+ 0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,
+ 125,0,116,3,0,0,0,0,0,0,0,0,124,0,116,4,
+ 0,0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,
+ 114,73,100,1,125,2,100,2,125,3,100,3,125,4,116,7,
+ 0,0,0,0,0,0,0,0,106,8,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,
+ 0,0,0,0,125,5,116,11,0,0,0,0,0,0,0,0,
+ 124,0,171,1,0,0,0,0,0,0,116,11,0,0,0,0,
+ 0,0,0,0,116,7,0,0,0,0,0,0,0,0,106,12,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,171,0,0,0,0,0,0,0,125,5,116,11,0,0,0,
- 0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,116,
- 11,0,0,0,0,0,0,0,0,116,7,0,0,0,0,0,
- 0,0,0,106,12,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,116,14,0,0,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,171,1,0,0,0,0,0,
- 0,107,40,0,0,114,55,121,4,100,5,125,2,100,6,125,
- 3,100,7,125,4,116,7,0,0,0,0,0,0,0,0,106,
- 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,171,0,0,0,0,0,0,0,125,5,116,11,0,
- 0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,
- 0,116,11,0,0,0,0,0,0,0,0,116,14,0,0,0,
- 0,0,0,0,0,171,1,0,0,0,0,0,0,107,40,0,
- 0,114,1,121,8,124,0,106,19,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,2,171,1,0,
- 0,0,0,0,0,125,6,124,6,115,23,116,21,0,0,0,
- 0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,115,
- 12,116,23,0,0,0,0,0,0,0,0,124,5,124,0,171,
- 2,0,0,0,0,0,0,125,0,9,0,116,25,0,0,0,
- 0,0,0,0,0,124,0,171,1,0,0,0,0,0,0,125,
- 0,100,9,125,7,124,6,115,85,124,0,106,19,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
- 2,171,1,0,0,0,0,0,0,114,68,124,0,106,19,0,
+ 0,0,116,14,0,0,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,171,1,0,0,0,0,0,0,107,40,0,0,
+ 114,55,121,4,100,5,125,2,100,6,125,3,100,7,125,4,
+ 116,7,0,0,0,0,0,0,0,0,106,16,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,
+ 0,0,0,0,0,0,125,5,116,11,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,116,11,0,0,
+ 0,0,0,0,0,0,116,14,0,0,0,0,0,0,0,0,
+ 171,1,0,0,0,0,0,0,107,40,0,0,114,1,121,8,
+ 124,0,106,19,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,0,
+ 125,6,124,6,115,23,116,21,0,0,0,0,0,0,0,0,
+ 124,0,171,1,0,0,0,0,0,0,115,12,116,23,0,0,
+ 0,0,0,0,0,0,124,5,124,0,171,2,0,0,0,0,
+ 0,0,125,0,9,0,116,25,0,0,0,0,0,0,0,0,
+ 124,0,171,1,0,0,0,0,0,0,125,0,100,9,125,7,
+ 124,6,115,85,124,0,106,19,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,2,171,1,0,0,
+ 0,0,0,0,114,68,124,0,106,19,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,124,3,171,1,
+ 0,0,0,0,0,0,114,18,124,4,124,0,116,37,0,0,
+ 0,0,0,0,0,0,124,3,171,1,0,0,0,0,0,0,
+ 100,0,26,0,122,0,0,0,125,9,110,14,124,0,116,37,
+ 0,0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,
+ 0,0,100,0,26,0,125,9,9,0,116,25,0,0,0,0,
+ 0,0,0,0,124,9,171,1,0,0,0,0,0,0,124,0,
+ 107,40,0,0,114,2,124,9,125,0,124,0,83,0,124,0,
+ 83,0,35,0,116,26,0,0,0,0,0,0,0,0,36,0,
+ 114,44,125,8,124,1,114,21,116,29,0,0,0,0,0,0,
+ 0,0,116,31,0,0,0,0,0,0,0,0,124,8,171,1,
+ 0,0,0,0,0,0,171,1,0,0,0,0,0,0,100,0,
+ 130,2,116,1,0,0,0,0,0,0,0,0,124,0,171,1,
+ 0,0,0,0,0,0,125,0,89,0,100,0,125,8,126,8,
+ 140,137,100,0,125,8,126,8,119,1,116,28,0,0,0,0,
+ 0,0,0,0,36,0,114,36,125,8,124,1,114,1,130,0,
+ 124,8,106,32,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,125,7,116,35,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,125,0,89,0,
+ 100,0,125,8,126,8,140,180,100,0,125,8,126,8,119,1,
+ 119,0,120,3,89,0,119,1,35,0,116,26,0,0,0,0,
+ 0,0,0,0,36,0,114,11,125,8,89,0,100,0,125,8,
+ 126,8,124,0,83,0,100,0,125,8,126,8,119,1,116,28,
+ 0,0,0,0,0,0,0,0,36,0,114,28,125,8,124,8,
+ 106,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,127,7,107,40,0,0,114,2,124,9,125,0,
+ 89,0,100,0,125,8,126,8,124,0,83,0,100,0,125,8,
+ 126,8,119,1,119,0,120,3,89,0,119,1,41,10,78,115,
+ 4,0,0,0,92,92,63,92,114,114,0,0,0,115,2,0,
+ 0,0,92,92,115,7,0,0,0,92,92,46,92,78,85,76,
+ 122,4,92,92,63,92,114,115,0,0,0,122,2,92,92,122,
+ 7,92,92,46,92,78,85,76,114,8,0,0,0,41,19,114,
+ 32,0,0,0,114,53,0,0,0,114,54,0,0,0,114,66,
+ 0,0,0,114,213,0,0,0,114,10,0,0,0,114,79,0,
+ 0,0,114,41,0,0,0,114,214,0,0,0,114,87,0,0,
+ 0,114,11,0,0,0,114,12,0,0,0,114,217,0,0,0,
+ 114,147,0,0,0,114,146,0,0,0,218,3,115,116,114,114,
+ 229,0,0,0,114,242,0,0,0,114,128,0,0,0,41,10,
+ 114,56,0,0,0,114,243,0,0,0,114,208,0,0,0,114,
+ 121,0,0,0,218,14,110,101,119,95,117,110,99,95,112,114,
+ 101,102,105,120,114,216,0,0,0,218,10,104,97,100,95,112,
+ 114,101,102,105,120,218,16,105,110,105,116,105,97,108,95,119,
+ 105,110,101,114,114,111,114,114,233,0,0,0,218,5,115,112,
+ 97,116,104,115,10,0,0,0,32,32,32,32,32,32,32,32,
+ 32,32,114,57,0,0,0,114,42,0,0,0,114,42,0,0,
+ 0,193,2,0,0,115,174,1,0,0,128,0,220,15,23,152,
+ 4,139,126,136,4,220,11,21,144,100,156,69,212,11,34,216,
+ 21,31,136,70,216,25,40,136,74,216,29,36,136,78,220,18,
+ 20,151,42,145,42,147,44,136,67,228,15,23,152,4,139,126,
+ 164,24,172,34,175,43,169,43,180,103,211,42,62,211,33,63,
+ 210,15,63,216,23,36,224,21,30,136,70,216,25,39,136,74,
+ 216,29,35,136,78,220,18,20,151,41,145,41,147,43,136,67,
+ 228,15,23,152,4,139,126,164,24,172,39,211,33,50,210,15,
+ 50,216,23,35,216,21,25,151,95,145,95,160,86,211,21,44,
+ 136,10,217,15,25,164,37,168,4,164,43,220,19,23,152,3,
+ 152,84,147,63,136,68,240,2,15,9,53,220,19,36,160,84,
+ 211,19,42,136,68,216,31,32,208,12,28,241,34,0,16,26,
+ 152,100,159,111,153,111,168,102,212,30,53,240,6,0,16,20,
+ 143,127,137,127,152,122,212,15,42,216,24,38,168,20,172,99,
+ 176,42,171,111,208,46,62,208,41,63,209,24,63,145,5,224,
+ 24,28,156,83,160,22,155,91,152,92,208,24,42,144,5,240,
+ 4,11,13,33,220,19,36,160,85,211,19,43,168,116,210,19,
+ 51,216,27,32,144,68,240,20,0,16,20,136,11,136,116,136,
+ 11,248,244,73,1,0,16,26,242,0,7,9,34,241,10,0,
+ 16,22,220,22,29,156,99,160,34,155,103,211,22,38,168,68,
+ 208,16,48,220,19,27,152,68,147,62,141,68,251,220,15,22,
+ 242,0,4,9,53,217,15,21,216,16,21,216,31,33,159,123,
+ 153,123,208,12,28,220,19,46,168,116,211,19,52,141,68,251,
+ 240,9,4,9,53,251,244,38,0,20,30,242,0,3,13,21,
+ 243,6,0,17,21,240,12,0,16,20,136,11,251,244,11,0,
+ 20,27,242,0,4,13,33,240,6,0,20,22,151,59,145,59,
+ 208,34,50,210,19,50,216,27,32,144,68,251,216,15,19,136,
+ 11,251,240,11,4,13,33,250,115,66,0,0,0,195,6,13,
+ 68,44,0,196,24,16,70,15,0,196,44,9,70,12,3,196,
+ 53,34,69,28,3,197,28,12,70,12,3,197,40,26,70,7,
+ 3,198,7,5,70,12,3,198,15,9,71,6,3,198,30,12,
+ 71,6,3,198,42,17,71,1,3,199,1,5,71,6,3,84,
+ 99,2,0,0,0,0,0,0,0,0,0,0,0,7,0,0,
+ 0,3,0,0,0,243,76,3,0,0,151,0,116,1,0,0,
+ 0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
+ 0,0,0,0,125,0,116,5,0,0,0,0,0,0,0,0,
+ 124,0,116,6,0,0,0,0,0,0,0,0,171,2,0,0,
+ 0,0,0,0,114,7,100,1,125,2,100,2,125,3,100,3,
+ 125,4,110,6,100,4,125,2,100,5,125,3,100,6,125,4,
+ 124,1,128,2,124,3,125,1,124,0,115,11,116,9,0,0,
+ 0,0,0,0,0,0,100,8,171,1,0,0,0,0,0,0,
+ 130,1,116,1,0,0,0,0,0,0,0,0,106,2,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,124,3,171,1,0,0,0,0,0,0,114,18,124,4,124,
- 0,116,37,0,0,0,0,0,0,0,0,124,3,171,1,0,
- 0,0,0,0,0,100,0,26,0,122,0,0,0,125,9,110,
- 14,124,0,116,37,0,0,0,0,0,0,0,0,124,2,171,
- 1,0,0,0,0,0,0,100,0,26,0,125,9,9,0,116,
- 25,0,0,0,0,0,0,0,0,124,9,171,1,0,0,0,
- 0,0,0,124,0,107,40,0,0,114,2,124,9,125,0,124,
- 0,83,0,124,0,83,0,35,0,116,26,0,0,0,0,0,
- 0,0,0,36,0,114,44,125,8,124,1,114,21,116,29,0,
- 0,0,0,0,0,0,0,116,31,0,0,0,0,0,0,0,
- 0,124,8,171,1,0,0,0,0,0,0,171,1,0,0,0,
- 0,0,0,100,0,130,2,116,1,0,0,0,0,0,0,0,
- 0,124,0,171,1,0,0,0,0,0,0,125,0,89,0,100,
- 0,125,8,126,8,140,137,100,0,125,8,126,8,119,1,116,
- 28,0,0,0,0,0,0,0,0,36,0,114,36,125,8,124,
- 1,114,1,130,0,124,8,106,32,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,125,7,116,35,0,
- 0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,
- 0,125,0,89,0,100,0,125,8,126,8,140,180,100,0,125,
- 8,126,8,119,1,119,0,120,3,89,0,119,1,35,0,116,
- 26,0,0,0,0,0,0,0,0,36,0,114,11,125,8,89,
- 0,100,0,125,8,126,8,124,0,83,0,100,0,125,8,126,
- 8,119,1,116,28,0,0,0,0,0,0,0,0,36,0,114,
- 28,125,8,124,8,106,32,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,127,7,107,40,0,0,114,
- 2,124,9,125,0,89,0,100,0,125,8,126,8,124,0,83,
- 0,100,0,125,8,126,8,119,1,119,0,120,3,89,0,119,
- 1,41,10,78,115,4,0,0,0,92,92,63,92,114,114,0,
- 0,0,115,2,0,0,0,92,92,115,7,0,0,0,92,92,
- 46,92,78,85,76,122,4,92,92,63,92,114,115,0,0,0,
- 122,2,92,92,122,7,92,92,46,92,78,85,76,114,8,0,
- 0,0,41,19,114,32,0,0,0,114,53,0,0,0,114,54,
- 0,0,0,114,66,0,0,0,114,211,0,0,0,114,10,0,
- 0,0,114,79,0,0,0,114,41,0,0,0,114,212,0,0,
- 0,114,87,0,0,0,114,11,0,0,0,114,12,0,0,0,
- 114,217,0,0,0,114,147,0,0,0,114,146,0,0,0,218,
- 3,115,116,114,114,229,0,0,0,114,242,0,0,0,114,128,
- 0,0,0,41,10,114,56,0,0,0,114,243,0,0,0,114,
- 208,0,0,0,114,121,0,0,0,218,14,110,101,119,95,117,
- 110,99,95,112,114,101,102,105,120,114,213,0,0,0,218,10,
- 104,97,100,95,112,114,101,102,105,120,218,16,105,110,105,116,
- 105,97,108,95,119,105,110,101,114,114,111,114,114,233,0,0,
- 0,218,5,115,112,97,116,104,115,10,0,0,0,32,32,32,
- 32,32,32,32,32,32,32,114,57,0,0,0,114,42,0,0,
- 0,114,42,0,0,0,180,2,0,0,115,174,1,0,0,128,
- 0,220,15,23,152,4,139,126,136,4,220,11,21,144,100,156,
- 69,212,11,34,216,21,31,136,70,216,25,40,136,74,216,29,
- 36,136,78,220,18,20,151,42,145,42,147,44,136,67,228,15,
- 23,152,4,139,126,164,24,172,34,175,43,169,43,180,103,211,
- 42,62,211,33,63,210,15,63,216,23,36,224,21,30,136,70,
- 216,25,39,136,74,216,29,35,136,78,220,18,20,151,41,145,
- 41,147,43,136,67,228,15,23,152,4,139,126,164,24,172,39,
- 211,33,50,210,15,50,216,23,35,216,21,25,151,95,145,95,
- 160,86,211,21,44,136,10,217,15,25,164,37,168,4,164,43,
- 220,19,23,152,3,152,84,147,63,136,68,240,2,15,9,53,
- 220,19,36,160,84,211,19,42,136,68,216,31,32,208,12,28,
- 241,34,0,16,26,152,100,159,111,153,111,168,102,212,30,53,
- 240,6,0,16,20,143,127,137,127,152,122,212,15,42,216,24,
- 38,168,20,172,99,176,42,171,111,208,46,62,208,41,63,209,
- 24,63,145,5,224,24,28,156,83,160,22,155,91,152,92,208,
- 24,42,144,5,240,4,11,13,33,220,19,36,160,85,211,19,
- 43,168,116,210,19,51,216,27,32,144,68,240,20,0,16,20,
- 136,11,136,116,136,11,248,244,73,1,0,16,26,242,0,7,
- 9,34,241,10,0,16,22,220,22,29,156,99,160,34,155,103,
- 211,22,38,168,68,208,16,48,220,19,27,152,68,147,62,141,
- 68,251,220,15,22,242,0,4,9,53,217,15,21,216,16,21,
- 216,31,33,159,123,153,123,208,12,28,220,19,46,168,116,211,
- 19,52,141,68,251,240,9,4,9,53,251,244,38,0,20,30,
- 242,0,3,13,21,243,6,0,17,21,240,12,0,16,20,136,
- 11,251,244,11,0,20,27,242,0,4,13,33,240,6,0,20,
- 22,151,59,145,59,208,34,50,210,19,50,216,27,32,144,68,
- 251,216,15,19,136,11,251,240,11,4,13,33,250,115,66,0,
- 0,0,195,6,13,68,44,0,196,24,16,70,15,0,196,44,
- 9,70,12,3,196,53,34,69,28,3,197,28,12,70,12,3,
- 197,40,26,70,7,3,198,7,5,70,12,3,198,15,9,71,
- 6,3,198,30,12,71,6,3,198,42,17,71,1,3,199,1,
- 5,71,6,3,84,99,2,0,0,0,0,0,0,0,0,0,
- 0,0,7,0,0,0,3,0,0,0,243,76,3,0,0,151,
- 0,116,1,0,0,0,0,0,0,0,0,106,2,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,125,0,116,5,0,0,0,
- 0,0,0,0,0,124,0,116,6,0,0,0,0,0,0,0,
- 0,171,2,0,0,0,0,0,0,114,7,100,1,125,2,100,
- 2,125,3,100,3,125,4,110,6,100,4,125,2,100,5,125,
- 3,100,6,125,4,124,1,128,2,124,3,125,1,124,0,115,
- 11,116,9,0,0,0,0,0,0,0,0,100,8,171,1,0,
- 0,0,0,0,0,130,1,116,1,0,0,0,0,0,0,0,
- 0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,125,
- 1,9,0,116,11,0,0,0,0,0,0,0,0,116,13,0,
- 0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,125,5,116,11,0,0,0,
- 0,0,0,0,0,116,13,0,0,0,0,0,0,0,0,124,
- 0,171,1,0,0,0,0,0,0,171,1,0,0,0,0,0,
- 0,125,6,116,15,0,0,0,0,0,0,0,0,124,5,171,
- 1,0,0,0,0,0,0,92,3,0,0,125,7,125,8,125,
- 9,116,15,0,0,0,0,0,0,0,0,124,6,171,1,0,
- 0,0,0,0,0,92,3,0,0,125,10,125,8,125,11,116,
- 17,0,0,0,0,0,0,0,0,124,7,171,1,0,0,0,
- 0,0,0,116,17,0,0,0,0,0,0,0,0,124,10,171,
- 1,0,0,0,0,0,0,107,55,0,0,114,17,116,9,0,
- 0,0,0,0,0,0,0,100,9,124,10,155,2,100,10,124,
- 7,155,2,157,4,171,1,0,0,0,0,0,0,130,1,124,
- 9,106,19,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,124,2,171,1,0,0,0,0,0,0,68,
- 0,143,12,99,2,103,0,99,2,93,7,0,0,125,12,124,
- 12,115,1,140,6,124,12,145,2,140,9,4,0,125,13,125,
- 12,124,11,106,19,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,
- 0,68,0,143,12,99,2,103,0,99,2,93,7,0,0,125,
- 12,124,12,115,1,140,6,124,12,145,2,140,9,4,0,125,
- 14,125,12,100,11,125,15,116,21,0,0,0,0,0,0,0,
- 0,124,13,124,14,171,2,0,0,0,0,0,0,68,0,93,
- 35,0,0,92,2,0,0,125,16,125,17,116,17,0,0,0,
- 0,0,0,0,0,124,16,171,1,0,0,0,0,0,0,116,
- 17,0,0,0,0,0,0,0,0,124,17,171,1,0,0,0,
- 0,0,0,107,55,0,0,114,2,1,0,110,7,124,15,100,
- 12,122,13,0,0,125,15,140,37,4,0,124,4,103,1,116,
- 23,0,0,0,0,0,0,0,0,124,13,171,1,0,0,0,
- 0,0,0,124,15,122,10,0,0,122,5,0,0,124,14,124,
- 15,100,7,26,0,122,0,0,0,125,18,124,18,115,2,124,
- 3,83,0,116,25,0,0,0,0,0,0,0,0,124,18,142,
- 0,83,0,99,2,1,0,99,2,125,12,119,0,99,2,1,
- 0,99,2,125,12,119,0,35,0,116,26,0,0,0,0,0,
- 0,0,0,116,8,0,0,0,0,0,0,0,0,116,28,0,
- 0,0,0,0,0,0,0,116,30,0,0,0,0,0,0,0,
- 0,116,32,0,0,0,0,0,0,0,0,102,5,36,0,114,
- 25,1,0,116,35,0,0,0,0,0,0,0,0,106,36,0,
+ 124,1,171,1,0,0,0,0,0,0,125,1,9,0,116,11,
+ 0,0,0,0,0,0,0,0,116,13,0,0,0,0,0,0,
+ 0,0,124,1,171,1,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,125,5,116,11,0,0,0,0,0,0,0,0,
+ 116,13,0,0,0,0,0,0,0,0,124,0,171,1,0,0,
+ 0,0,0,0,171,1,0,0,0,0,0,0,125,6,116,15,
+ 0,0,0,0,0,0,0,0,124,5,171,1,0,0,0,0,
+ 0,0,92,3,0,0,125,7,125,8,125,9,116,15,0,0,
+ 0,0,0,0,0,0,124,6,171,1,0,0,0,0,0,0,
+ 92,3,0,0,125,10,125,8,125,11,116,17,0,0,0,0,
+ 0,0,0,0,124,7,171,1,0,0,0,0,0,0,116,17,
+ 0,0,0,0,0,0,0,0,124,10,171,1,0,0,0,0,
+ 0,0,107,55,0,0,114,17,116,9,0,0,0,0,0,0,
+ 0,0,100,9,124,10,155,2,100,10,124,7,155,2,157,4,
+ 171,1,0,0,0,0,0,0,130,1,124,9,106,19,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,100,13,124,0,124,1,171,3,0,0,0,0,0,0,1,
- 0,130,0,119,0,120,3,89,0,119,1,41,14,122,35,82,
- 101,116,117,114,110,32,97,32,114,101,108,97,116,105,118,101,
- 32,118,101,114,115,105,111,110,32,111,102,32,97,32,112,97,
- 116,104,114,83,0,0,0,114,135,0,0,0,114,206,0,0,
- 0,114,4,0,0,0,114,2,0,0,0,114,3,0,0,0,
- 78,122,17,110,111,32,112,97,116,104,32,115,112,101,99,105,
- 102,105,101,100,122,17,112,97,116,104,32,105,115,32,111,110,
- 32,109,111,117,110,116,32,122,17,44,32,115,116,97,114,116,
- 32,111,110,32,109,111,117,110,116,32,114,8,0,0,0,114,
- 86,0,0,0,114,44,0,0,0,41,19,114,66,0,0,0,
- 114,67,0,0,0,114,53,0,0,0,114,54,0,0,0,114,
- 147,0,0,0,114,33,0,0,0,114,32,0,0,0,114,14,
- 0,0,0,114,10,0,0,0,114,15,0,0,0,218,3,122,
- 105,112,114,128,0,0,0,114,12,0,0,0,114,94,0,0,
- 0,114,95,0,0,0,114,96,0,0,0,218,18,68,101,112,
- 114,101,99,97,116,105,111,110,87,97,114,110,105,110,103,114,
- 97,0,0,0,114,98,0,0,0,41,19,114,56,0,0,0,
- 114,124,0,0,0,114,36,0,0,0,114,34,0,0,0,114,
- 35,0,0,0,218,9,115,116,97,114,116,95,97,98,115,218,
- 8,112,97,116,104,95,97,98,115,218,11,115,116,97,114,116,
- 95,100,114,105,118,101,218,1,95,218,10,115,116,97,114,116,
- 95,114,101,115,116,218,10,112,97,116,104,95,100,114,105,118,
- 101,218,9,112,97,116,104,95,114,101,115,116,114,159,0,0,
- 0,218,10,115,116,97,114,116,95,108,105,115,116,218,9,112,
- 97,116,104,95,108,105,115,116,114,132,0,0,0,218,2,101,
- 49,218,2,101,50,218,8,114,101,108,95,108,105,115,116,115,
- 19,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,
- 32,32,32,32,32,32,32,114,57,0,0,0,114,44,0,0,
- 0,114,44,0,0,0,246,2,0,0,115,180,1,0,0,128,
- 0,228,11,13,143,57,137,57,144,84,139,63,128,68,220,7,
- 17,144,36,156,5,212,7,30,216,14,19,136,3,216,17,21,
- 136,6,216,17,22,137,6,224,14,18,136,3,216,17,20,136,
- 6,216,17,21,136,6,224,7,12,128,125,216,16,22,136,5,
- 225,11,15,220,14,24,208,25,44,211,14,45,208,8,45,228,
- 12,14,143,73,137,73,144,101,211,12,28,128,69,240,2,24,
- 5,14,220,20,27,156,72,160,85,155,79,211,20,44,136,9,
- 220,19,26,156,56,160,68,155,62,211,19,42,136,8,220,37,
- 46,168,121,211,37,57,209,8,34,136,11,144,81,152,10,220,
- 35,44,168,88,211,35,54,209,8,32,136,10,144,65,144,121,
- 220,11,19,144,75,211,11,32,164,72,168,90,211,36,56,210,
- 11,56,221,18,28,218,16,26,153,75,240,3,1,30,41,243,
- 0,1,19,42,240,0,1,13,42,240,6,0,34,44,215,33,
- 49,209,33,49,176,35,212,33,54,211,21,60,209,33,54,152,
- 65,186,33,146,97,208,33,54,136,10,208,21,60,216,32,41,
- 167,15,161,15,176,3,212,32,52,211,20,58,209,32,52,152,
- 49,186,1,146,81,208,32,52,136,9,208,20,58,224,12,13,
- 136,1,220,22,25,152,42,160,105,214,22,48,137,70,136,66,
- 144,2,220,15,23,152,2,139,124,156,120,168,2,155,124,210,
- 15,43,217,16,21,216,12,13,144,17,137,70,137,65,240,7,
- 0,23,49,240,10,0,21,27,144,56,156,115,160,58,155,127,
- 168,113,209,31,48,209,19,49,176,73,184,97,184,98,176,77,
- 209,19,65,136,8,217,15,23,216,19,25,136,77,220,15,19,
- 144,88,136,127,208,8,30,249,242,25,0,22,61,249,218,20,
- 58,248,244,24,0,13,22,148,122,164,62,180,60,212,65,83,
- 208,11,84,242,0,2,5,14,220,8,19,215,8,36,209,8,
- 36,160,89,176,4,176,101,212,8,60,216,8,13,240,5,2,
- 5,14,250,115,62,0,0,0,193,26,66,1,69,44,0,195,
- 27,7,69,34,4,195,35,4,69,34,4,195,39,21,69,44,
- 0,195,60,7,69,39,4,196,4,4,69,39,4,196,8,65,
- 17,69,44,0,197,26,7,69,44,0,197,34,10,69,44,0,
- 197,44,55,70,35,3,99,1,0,0,0,0,0,0,0,0,
- 0,0,0,10,0,0,0,3,0,0,0,243,96,4,0,0,
- 151,0,124,0,115,11,116,1,0,0,0,0,0,0,0,0,
- 100,1,171,1,0,0,0,0,0,0,130,1,116,3,0,0,
- 0,0,0,0,0,0,116,5,0,0,0,0,0,0,0,0,
- 116,6,0,0,0,0,0,0,0,0,106,8,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
- 171,2,0,0,0,0,0,0,171,1,0,0,0,0,0,0,
- 125,0,116,11,0,0,0,0,0,0,0,0,124,0,100,2,
- 25,0,0,0,116,12,0,0,0,0,0,0,0,0,171,2,
- 0,0,0,0,0,0,114,7,100,3,125,1,100,4,125,2,
- 100,5,125,3,110,6,100,6,125,1,100,7,125,2,100,8,
- 125,3,9,0,124,0,68,0,143,4,99,2,103,0,99,2,
- 93,43,0,0,125,4,116,15,0,0,0,0,0,0,0,0,
- 124,4,106,17,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,124,2,124,1,171,2,0,0,0,0,
- 0,0,106,19,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,171,0,0,0,0,0,0,0,171,1,
- 0,0,0,0,0,0,145,2,140,45,4,0,125,5,125,4,
- 124,5,68,0,143,6,143,7,143,4,99,4,103,0,99,2,
- 93,23,0,0,92,3,0,0,125,6,125,7,125,4,124,4,
- 106,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,124,1,171,1,0,0,0,0,0,0,145,2,
- 140,25,4,0,125,8,125,7,125,6,125,4,116,23,0,0,
- 0,0,0,0,0,0,124,5,68,0,143,6,143,7,143,4,
- 99,4,104,0,99,2,93,8,0,0,92,3,0,0,125,6,
- 125,7,125,4,124,7,146,2,140,10,4,0,99,4,125,4,
- 125,7,125,6,171,1,0,0,0,0,0,0,100,9,107,55,
- 0,0,114,11,116,1,0,0,0,0,0,0,0,0,100,10,
- 171,1,0,0,0,0,0,0,130,1,116,23,0,0,0,0,
- 0,0,0,0,124,5,68,0,143,6,143,7,143,4,99,4,
- 104,0,99,2,93,8,0,0,92,3,0,0,125,6,125,7,
- 125,4,124,6,146,2,140,10,4,0,99,4,125,4,125,7,
- 125,6,171,1,0,0,0,0,0,0,100,9,107,55,0,0,
- 114,11,116,1,0,0,0,0,0,0,0,0,100,11,171,1,
- 0,0,0,0,0,0,130,1,116,15,0,0,0,0,0,0,
- 0,0,124,0,100,2,25,0,0,0,106,17,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,2,
- 124,1,171,2,0,0,0,0,0,0,171,1,0,0,0,0,
- 0,0,92,3,0,0,125,9,125,10,125,11,124,11,106,21,
+ 124,2,171,1,0,0,0,0,0,0,68,0,143,12,99,2,
+ 103,0,99,2,93,7,0,0,125,12,124,12,115,1,140,6,
+ 124,12,145,2,140,9,4,0,125,13,125,12,124,11,106,19,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,124,1,171,1,0,0,0,0,0,0,125,12,124,12,
- 68,0,143,13,99,2,103,0,99,2,93,13,0,0,125,13,
- 124,13,115,1,140,6,124,13,124,3,107,55,0,0,115,1,
- 140,12,124,13,145,2,140,15,4,0,125,12,125,13,124,8,
- 68,0,143,14,143,13,99,3,103,0,99,2,93,27,0,0,
- 125,14,124,14,68,0,143,13,99,2,103,0,99,2,93,13,
- 0,0,125,13,124,13,115,1,140,6,124,13,124,3,107,55,
- 0,0,115,1,140,12,124,13,145,2,140,15,4,0,99,2,
- 125,13,145,2,140,29,4,0,125,8,125,14,125,13,116,25,
- 0,0,0,0,0,0,0,0,124,8,171,1,0,0,0,0,
- 0,0,125,15,116,27,0,0,0,0,0,0,0,0,124,8,
- 171,1,0,0,0,0,0,0,125,16,116,29,0,0,0,0,
- 0,0,0,0,124,15,171,1,0,0,0,0,0,0,68,0,
- 93,20,0,0,92,2,0,0,125,17,125,13,124,13,124,16,
- 124,17,25,0,0,0,107,55,0,0,115,1,140,15,124,12,
- 100,12,124,17,26,0,125,12,1,0,110,15,4,0,124,12,
- 100,12,116,23,0,0,0,0,0,0,0,0,124,15,171,1,
- 0,0,0,0,0,0,26,0,125,12,124,9,124,10,122,0,
- 0,0,124,1,106,31,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,124,12,171,1,0,0,0,0,
- 0,0,122,0,0,0,83,0,99,2,1,0,99,2,125,4,
- 119,0,99,2,1,0,99,4,125,4,125,7,125,6,119,0,
- 99,2,1,0,99,4,125,4,125,7,125,6,119,0,99,2,
- 1,0,99,4,125,4,125,7,125,6,119,0,99,2,1,0,
- 99,2,125,13,119,0,99,2,1,0,99,2,125,13,119,0,
- 99,2,1,0,99,3,125,13,125,14,119,0,35,0,116,32,
- 0,0,0,0,0,0,0,0,116,34,0,0,0,0,0,0,
- 0,0,102,2,36,0,114,24,1,0,116,37,0,0,0,0,
- 0,0,0,0,106,38,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,100,13,103,1,124,0,162,1,
- 173,6,142,0,1,0,130,0,119,0,120,3,89,0,119,1,
- 41,14,122,68,71,105,118,101,110,32,97,32,115,101,113,117,
- 101,110,99,101,32,111,102,32,112,97,116,104,32,110,97,109,
- 101,115,44,32,114,101,116,117,114,110,115,32,116,104,101,32,
- 108,111,110,103,101,115,116,32,99,111,109,109,111,110,32,115,
- 117,98,45,112,97,116,104,46,122,37,99,111,109,109,111,110,
- 112,97,116,104,40,41,32,97,114,103,32,105,115,32,97,110,
- 32,101,109,112,116,121,32,115,101,113,117,101,110,99,101,114,
- 8,0,0,0,114,83,0,0,0,114,84,0,0,0,114,135,
- 0,0,0,114,4,0,0,0,114,6,0,0,0,114,2,0,
- 0,0,114,86,0,0,0,122,37,67,97,110,39,116,32,109,
- 105,120,32,97,98,115,111,108,117,116,101,32,97,110,100,32,
- 114,101,108,97,116,105,118,101,32,112,97,116,104,115,122,31,
- 80,97,116,104,115,32,100,111,110,39,116,32,104,97,118,101,
- 32,116,104,101,32,115,97,109,101,32,100,114,105,118,101,78,
- 114,48,0,0,0,41,20,114,147,0,0,0,218,5,116,117,
- 112,108,101,114,93,0,0,0,114,66,0,0,0,114,67,0,
- 0,0,114,53,0,0,0,114,54,0,0,0,114,14,0,0,
- 0,114,71,0,0,0,114,81,0,0,0,114,15,0,0,0,
- 114,128,0,0,0,218,3,109,105,110,218,3,109,97,120,218,
- 9,101,110,117,109,101,114,97,116,101,114,12,0,0,0,114,
- 94,0,0,0,114,95,0,0,0,114,97,0,0,0,114,98,
- 0,0,0,41,18,114,99,0,0,0,114,36,0,0,0,114,
- 39,0,0,0,114,34,0,0,0,114,105,0,0,0,218,11,
- 100,114,105,118,101,115,112,108,105,116,115,114,130,0,0,0,
- 114,131,0,0,0,218,11,115,112,108,105,116,95,112,97,116,
- 104,115,114,110,0,0,0,114,111,0,0,0,114,56,0,0,
- 0,218,6,99,111,109,109,111,110,114,201,0,0,0,114,76,
- 0,0,0,218,2,115,49,218,2,115,50,114,132,0,0,0,
- 115,18,0,0,0,32,32,32,32,32,32,32,32,32,32,32,
- 32,32,32,32,32,32,32,114,57,0,0,0,114,48,0,0,
- 0,114,48,0,0,0,46,3,0,0,115,45,2,0,0,128,
- 0,241,6,0,12,17,220,14,24,208,25,64,211,14,65,208,
- 8,65,228,12,17,148,35,148,98,151,105,145,105,160,21,211,
- 18,39,211,12,40,128,69,220,7,17,144,37,152,1,145,40,
- 156,69,212,7,34,216,14,19,136,3,216,17,21,136,6,216,
- 17,21,137,6,224,14,18,136,3,216,17,20,136,6,216,17,
- 20,136,6,240,4,30,5,14,217,74,79,211,22,80,201,37,
- 192,81,148,121,160,17,167,25,161,25,168,54,176,51,211,33,
- 55,215,33,61,209,33,61,211,33,63,213,23,64,200,37,136,
- 11,208,22,80,217,51,62,213,22,63,177,59,169,7,168,1,
- 168,49,168,97,144,113,151,119,145,119,152,115,149,124,176,59,
- 136,11,210,22,63,228,11,14,161,27,213,15,45,161,27,145,
- 103,144,97,152,17,152,65,146,1,160,27,211,15,45,211,11,
- 46,176,33,210,11,51,220,18,28,208,29,68,211,18,69,208,
- 12,69,244,10,0,12,15,161,27,213,15,45,161,27,145,103,
- 144,97,152,17,152,65,146,1,160,27,211,15,45,211,11,46,
- 176,33,210,11,51,220,18,28,208,29,62,211,18,63,208,12,
- 63,228,28,37,160,101,168,65,161,104,215,38,54,209,38,54,
- 176,118,184,115,211,38,67,211,28,68,209,8,25,136,5,136,
- 116,144,84,216,17,21,151,26,145,26,152,67,147,31,136,6,
- 217,29,35,211,17,57,153,86,152,1,162,113,168,81,176,38,
- 171,91,146,33,152,86,136,6,208,17,57,225,68,79,212,22,
- 80,193,75,184,113,161,49,211,23,58,161,49,152,97,170,1,
- 168,97,176,54,171,107,154,1,160,49,211,23,58,192,75,136,
- 11,209,22,80,220,13,16,144,27,211,13,29,136,2,220,13,
- 16,144,27,211,13,29,136,2,220,20,29,152,98,150,77,137,
- 68,136,65,136,113,216,15,16,144,66,144,113,145,69,139,122,
- 216,25,31,160,2,160,17,152,26,144,6,217,16,21,240,7,
- 0,21,34,240,10,0,22,28,152,72,156,83,160,18,155,87,
- 208,21,37,136,70,224,15,20,144,116,137,124,152,99,159,104,
- 153,104,160,118,211,30,46,209,15,46,208,8,46,249,242,53,
- 0,23,81,1,249,220,22,63,249,228,15,45,249,244,12,0,
- 16,46,249,242,10,0,18,58,249,226,23,58,249,211,22,80,
- 248,244,22,0,13,22,148,126,208,11,38,242,0,2,5,14,
- 220,8,19,215,8,36,209,8,36,160,92,208,8,58,176,69,
- 211,8,58,216,8,13,240,5,2,5,14,250,115,145,0,0,
- 0,193,18,4,72,6,0,193,22,48,71,28,4,194,6,8,
- 72,6,0,194,14,28,71,33,8,194,42,15,72,6,0,194,
- 57,13,71,40,12,195,6,34,72,6,0,195,40,13,71,47,
- 12,195,53,65,14,72,6,0,197,3,7,71,54,4,197,11,
- 5,71,54,4,197,17,4,71,54,4,197,21,7,72,6,0,
- 197,28,9,72,0,6,197,37,7,71,59,12,197,45,5,71,
- 59,12,197,51,4,71,59,12,197,55,5,72,0,6,197,60,
- 50,72,6,0,198,47,44,72,6,0,199,28,31,72,6,0,
- 199,59,5,72,0,6,200,0,6,72,6,0,200,6,39,72,
- 45,3,41,1,218,11,95,112,97,116,104,95,105,115,100,105,
- 114,41,1,218,12,95,112,97,116,104,95,105,115,102,105,108,
- 101,41,1,218,12,95,112,97,116,104,95,105,115,108,105,110,
- 107,41,1,218,12,95,112,97,116,104,95,101,120,105,115,116,
- 115,41,1,218,16,95,112,97,116,104,95,105,115,100,101,118,
- 100,114,105,118,101,99,1,0,0,0,0,0,0,0,0,0,
- 0,0,5,0,0,0,3,0,0,0,243,74,0,0,0,151,
- 0,9,0,116,1,0,0,0,0,0,0,0,0,116,3,0,
- 0,0,0,0,0,0,0,124,0,171,1,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,83,0,35,0,116,4,0,
- 0,0,0,0,0,0,0,36,0,114,3,1,0,89,0,121,
- 1,119,0,120,3,89,0,119,1,169,2,122,64,68,101,116,
- 101,114,109,105,110,101,115,32,119,104,101,116,104,101,114,32,
- 116,104,101,32,115,112,101,99,105,102,105,101,100,32,112,97,
- 116,104,32,105,115,32,111,110,32,97,32,87,105,110,100,111,
- 119,115,32,68,101,118,32,68,114,105,118,101,46,70,41,3,
- 114,23,1,0,0,114,33,0,0,0,114,146,0,0,0,114,
- 55,0,0,0,115,1,0,0,0,32,114,57,0,0,0,218,
- 10,105,115,100,101,118,100,114,105,118,101,114,26,1,0,0,
- 116,3,0,0,115,40,0,0,0,128,0,240,4,3,9,25,
- 220,19,35,164,71,168,68,163,77,211,19,50,208,12,50,248,
- 220,15,22,242,0,1,9,25,217,19,24,240,3,1,9,25,
- 250,115,12,0,0,0,130,19,22,0,150,9,34,3,161,1,
- 34,3,99,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,3,0,0,0,243,4,0,0,0,151,0,121,1,
- 114,25,1,0,0,169,0,114,55,0,0,0,115,1,0,0,
- 0,32,114,57,0,0,0,114,26,1,0,0,114,26,1,0,
- 0,111,3,0,0,115,7,0,0,0,128,0,240,6,0,16,
- 21,114,59,0,0,0,41,1,78,41,66,218,7,95,95,100,
- 111,99,95,95,114,34,0,0,0,114,35,0,0,0,114,40,
- 0,0,0,114,36,0,0,0,114,37,0,0,0,114,39,0,
- 0,0,114,38,0,0,0,114,41,0,0,0,114,66,0,0,
- 0,114,68,0,0,0,114,149,0,0,0,114,97,0,0,0,
- 218,7,95,95,97,108,108,95,95,114,58,0,0,0,218,7,
- 95,119,105,110,97,112,105,114,60,0,0,0,114,72,0,0,
- 0,114,61,0,0,0,114,73,0,0,0,114,62,0,0,0,
- 114,74,0,0,0,114,10,0,0,0,218,11,73,109,112,111,
- 114,116,69,114,114,111,114,114,11,0,0,0,114,12,0,0,
- 0,114,13,0,0,0,114,14,0,0,0,114,15,0,0,0,
- 114,16,0,0,0,114,136,0,0,0,114,17,0,0,0,114,
- 18,0,0,0,218,7,104,97,115,97,116,116,114,218,11,115,
- 116,97,116,95,114,101,115,117,108,116,114,49,0,0,0,114,
- 26,0,0,0,218,2,110,116,114,155,0,0,0,114,29,0,
- 0,0,114,30,0,0,0,114,31,0,0,0,114,204,0,0,
- 0,114,32,0,0,0,114,214,0,0,0,114,215,0,0,0,
- 114,33,0,0,0,114,217,0,0,0,114,218,0,0,0,114,
- 228,0,0,0,114,234,0,0,0,114,242,0,0,0,114,42,
- 0,0,0,114,43,0,0,0,114,44,0,0,0,114,48,0,
- 0,0,114,19,1,0,0,114,27,0,0,0,114,20,1,0,
- 0,114,28,0,0,0,114,21,1,0,0,114,24,0,0,0,
- 114,22,1,0,0,114,25,0,0,0,114,23,1,0,0,114,
- 26,1,0,0,114,28,1,0,0,114,59,0,0,0,114,57,
- 0,0,0,218,8,60,109,111,100,117,108,101,62,114,36,1,
- 0,0,1,0,0,0,115,231,1,0,0,240,3,1,1,1,
- 241,4,4,1,4,240,18,0,10,13,128,6,216,9,13,128,
- 6,216,9,12,128,6,216,6,10,128,3,216,10,13,128,7,
- 216,9,12,128,6,216,10,21,128,7,216,10,15,128,7,227,
- 0,9,219,0,10,219,0,11,219,0,18,220,0,25,242,6,
- 6,11,79,1,128,7,242,16,4,1,21,240,20,33,1,44,
- 247,2,3,5,45,241,0,3,5,45,242,10,17,5,56,242,
- 72,1,16,1,17,242,40,43,1,14,242,98,1,20,1,30,
- 242,46,49,1,31,242,114,1,13,1,43,242,42,5,1,56,
- 240,12,0,20,31,215,19,40,209,19,40,215,19,48,209,19,
- 48,128,8,212,0,16,242,10,2,1,23,242,14,2,1,23,
- 241,14,0,4,11,136,50,143,62,137,62,208,27,43,212,3,
- 44,243,2,6,5,74,1,242,16,3,5,21,242,16,6,1,
- 16,240,36,3,1,30,221,4,37,242,6,17,1,21,242,58,
- 45,1,31,242,122,1,106,1,1,15,240,96,3,38,1,40,
- 221,4,45,242,80,1,14,1,26,240,34,12,1,43,221,4,
- 35,242,12,5,5,43,240,14,93,2,1,20,223,4,62,242,
- 10,40,5,20,242,84,1,47,5,20,240,98,1,0,34,39,
- 244,0,60,5,20,240,64,2,0,30,34,208,0,26,243,4,
- 43,1,14,242,112,1,46,1,14,240,98,1,10,1,9,245,
- 8,0,5,40,221,4,41,221,4,41,221,4,41,240,12,13,
- 1,25,221,4,35,243,14,5,5,25,248,240,95,25,0,8,
- 19,242,0,9,1,44,244,2,8,5,44,240,3,9,1,44,
- 251,240,116,7,0,8,19,242,0,1,1,30,216,25,29,210,
- 4,22,240,3,1,1,30,251,240,94,6,0,8,19,242,0,
- 35,1,40,244,2,34,5,40,240,3,35,1,40,251,240,116,
- 1,0,8,19,242,0,1,1,32,216,14,31,130,71,240,3,
- 1,1,32,251,240,26,0,8,19,242,0,2,1,23,224,15,
- 22,130,72,240,5,2,1,23,251,240,100,8,0,8,19,242,
- 0,2,1,9,225,4,8,240,5,2,1,9,251,240,14,0,
- 8,19,242,0,4,1,21,244,2,3,5,21,240,3,4,1,
- 21,250,115,125,0,0,0,176,13,67,51,0,194,14,6,68,
- 1,0,194,30,6,68,14,0,194,40,6,68,28,0,194,50,
- 8,68,41,0,195,16,24,68,54,0,195,41,6,69,1,0,
- 195,51,8,67,62,3,195,61,1,67,62,3,196,1,7,68,
- 11,3,196,10,1,68,11,3,196,14,8,68,25,3,196,24,
- 1,68,25,3,196,28,7,68,38,3,196,37,1,68,38,3,
- 196,41,7,68,51,3,196,50,1,68,51,3,196,54,5,68,
- 62,3,196,61,1,68,62,3,197,1,8,69,12,3,197,11,
- 1,69,12,3,
+ 0,0,124,2,171,1,0,0,0,0,0,0,68,0,143,12,
+ 99,2,103,0,99,2,93,7,0,0,125,12,124,12,115,1,
+ 140,6,124,12,145,2,140,9,4,0,125,14,125,12,100,11,
+ 125,15,116,21,0,0,0,0,0,0,0,0,124,13,124,14,
+ 171,2,0,0,0,0,0,0,68,0,93,35,0,0,92,2,
+ 0,0,125,16,125,17,116,17,0,0,0,0,0,0,0,0,
+ 124,16,171,1,0,0,0,0,0,0,116,17,0,0,0,0,
+ 0,0,0,0,124,17,171,1,0,0,0,0,0,0,107,55,
+ 0,0,114,2,1,0,110,7,124,15,100,12,122,13,0,0,
+ 125,15,140,37,4,0,124,4,103,1,116,23,0,0,0,0,
+ 0,0,0,0,124,13,171,1,0,0,0,0,0,0,124,15,
+ 122,10,0,0,122,5,0,0,124,14,124,15,100,7,26,0,
+ 122,0,0,0,125,18,124,18,115,2,124,3,83,0,116,25,
+ 0,0,0,0,0,0,0,0,124,18,142,0,83,0,99,2,
+ 1,0,99,2,125,12,119,0,99,2,1,0,99,2,125,12,
+ 119,0,35,0,116,26,0,0,0,0,0,0,0,0,116,8,
+ 0,0,0,0,0,0,0,0,116,28,0,0,0,0,0,0,
+ 0,0,116,30,0,0,0,0,0,0,0,0,116,32,0,0,
+ 0,0,0,0,0,0,102,5,36,0,114,25,1,0,116,35,
+ 0,0,0,0,0,0,0,0,106,36,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,100,13,124,0,
+ 124,1,171,3,0,0,0,0,0,0,1,0,130,0,119,0,
+ 120,3,89,0,119,1,41,14,122,35,82,101,116,117,114,110,
+ 32,97,32,114,101,108,97,116,105,118,101,32,118,101,114,115,
+ 105,111,110,32,111,102,32,97,32,112,97,116,104,114,83,0,
+ 0,0,114,135,0,0,0,114,206,0,0,0,114,4,0,0,
+ 0,114,2,0,0,0,114,3,0,0,0,78,122,17,110,111,
+ 32,112,97,116,104,32,115,112,101,99,105,102,105,101,100,122,
+ 17,112,97,116,104,32,105,115,32,111,110,32,109,111,117,110,
+ 116,32,122,17,44,32,115,116,97,114,116,32,111,110,32,109,
+ 111,117,110,116,32,114,8,0,0,0,114,86,0,0,0,114,
+ 44,0,0,0,41,19,114,66,0,0,0,114,67,0,0,0,
+ 114,53,0,0,0,114,54,0,0,0,114,147,0,0,0,114,
+ 33,0,0,0,114,32,0,0,0,114,14,0,0,0,114,10,
+ 0,0,0,114,15,0,0,0,218,3,122,105,112,114,128,0,
+ 0,0,114,12,0,0,0,114,94,0,0,0,114,95,0,0,
+ 0,114,96,0,0,0,218,18,68,101,112,114,101,99,97,116,
+ 105,111,110,87,97,114,110,105,110,103,114,97,0,0,0,114,
+ 98,0,0,0,41,19,114,56,0,0,0,114,124,0,0,0,
+ 114,36,0,0,0,114,34,0,0,0,114,35,0,0,0,218,
+ 9,115,116,97,114,116,95,97,98,115,218,8,112,97,116,104,
+ 95,97,98,115,218,11,115,116,97,114,116,95,100,114,105,118,
+ 101,218,1,95,218,10,115,116,97,114,116,95,114,101,115,116,
+ 218,10,112,97,116,104,95,100,114,105,118,101,218,9,112,97,
+ 116,104,95,114,101,115,116,114,159,0,0,0,218,10,115,116,
+ 97,114,116,95,108,105,115,116,218,9,112,97,116,104,95,108,
+ 105,115,116,114,132,0,0,0,218,2,101,49,218,2,101,50,
+ 218,8,114,101,108,95,108,105,115,116,115,19,0,0,0,32,
+ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+ 32,32,114,57,0,0,0,114,44,0,0,0,114,44,0,0,
+ 0,3,3,0,0,115,180,1,0,0,128,0,228,11,13,143,
+ 57,137,57,144,84,139,63,128,68,220,7,17,144,36,156,5,
+ 212,7,30,216,14,19,136,3,216,17,21,136,6,216,17,22,
+ 137,6,224,14,18,136,3,216,17,20,136,6,216,17,21,136,
+ 6,224,7,12,128,125,216,16,22,136,5,225,11,15,220,14,
+ 24,208,25,44,211,14,45,208,8,45,228,12,14,143,73,137,
+ 73,144,101,211,12,28,128,69,240,2,24,5,14,220,20,27,
+ 156,72,160,85,155,79,211,20,44,136,9,220,19,26,156,56,
+ 160,68,155,62,211,19,42,136,8,220,37,46,168,121,211,37,
+ 57,209,8,34,136,11,144,81,152,10,220,35,44,168,88,211,
+ 35,54,209,8,32,136,10,144,65,144,121,220,11,19,144,75,
+ 211,11,32,164,72,168,90,211,36,56,210,11,56,221,18,28,
+ 218,16,26,153,75,240,3,1,30,41,243,0,1,19,42,240,
+ 0,1,13,42,240,6,0,34,44,215,33,49,209,33,49,176,
+ 35,212,33,54,211,21,60,209,33,54,152,65,186,33,146,97,
+ 208,33,54,136,10,208,21,60,216,32,41,167,15,161,15,176,
+ 3,212,32,52,211,20,58,209,32,52,152,49,186,1,146,81,
+ 208,32,52,136,9,208,20,58,224,12,13,136,1,220,22,25,
+ 152,42,160,105,214,22,48,137,70,136,66,144,2,220,15,23,
+ 152,2,139,124,156,120,168,2,155,124,210,15,43,217,16,21,
+ 216,12,13,144,17,137,70,137,65,240,7,0,23,49,240,10,
+ 0,21,27,144,56,156,115,160,58,155,127,168,113,209,31,48,
+ 209,19,49,176,73,184,97,184,98,176,77,209,19,65,136,8,
+ 217,15,23,216,19,25,136,77,220,15,19,144,88,136,127,208,
+ 8,30,249,242,25,0,22,61,249,218,20,58,248,244,24,0,
+ 13,22,148,122,164,62,180,60,212,65,83,208,11,84,242,0,
+ 2,5,14,220,8,19,215,8,36,209,8,36,160,89,176,4,
+ 176,101,212,8,60,216,8,13,240,5,2,5,14,250,115,62,
+ 0,0,0,193,26,66,1,69,44,0,195,27,7,69,34,4,
+ 195,35,4,69,34,4,195,39,21,69,44,0,195,60,7,69,
+ 39,4,196,4,4,69,39,4,196,8,65,17,69,44,0,197,
+ 26,7,69,44,0,197,34,10,69,44,0,197,44,55,70,35,
+ 3,99,1,0,0,0,0,0,0,0,0,0,0,0,10,0,
+ 0,0,3,0,0,0,243,96,4,0,0,151,0,124,0,115,
+ 11,116,1,0,0,0,0,0,0,0,0,100,1,171,1,0,
+ 0,0,0,0,0,130,1,116,3,0,0,0,0,0,0,0,
+ 0,116,5,0,0,0,0,0,0,0,0,116,6,0,0,0,
+ 0,0,0,0,0,106,8,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,0,171,2,0,0,0,
+ 0,0,0,171,1,0,0,0,0,0,0,125,0,116,11,0,
+ 0,0,0,0,0,0,0,124,0,100,2,25,0,0,0,116,
+ 12,0,0,0,0,0,0,0,0,171,2,0,0,0,0,0,
+ 0,114,7,100,3,125,1,100,4,125,2,100,5,125,3,110,
+ 6,100,6,125,1,100,7,125,2,100,8,125,3,9,0,124,
+ 0,68,0,143,4,99,2,103,0,99,2,93,43,0,0,125,
+ 4,116,15,0,0,0,0,0,0,0,0,124,4,106,17,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,124,2,124,1,171,2,0,0,0,0,0,0,106,19,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,171,0,0,0,0,0,0,0,171,1,0,0,0,0,0,
+ 0,145,2,140,45,4,0,125,5,125,4,124,5,68,0,143,
+ 6,143,7,143,4,99,4,103,0,99,2,93,23,0,0,92,
+ 3,0,0,125,6,125,7,125,4,124,4,106,21,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,
+ 1,171,1,0,0,0,0,0,0,145,2,140,25,4,0,125,
+ 8,125,7,125,6,125,4,116,23,0,0,0,0,0,0,0,
+ 0,124,5,68,0,143,6,143,7,143,4,99,4,104,0,99,
+ 2,93,8,0,0,92,3,0,0,125,6,125,7,125,4,124,
+ 7,146,2,140,10,4,0,99,4,125,4,125,7,125,6,171,
+ 1,0,0,0,0,0,0,100,9,107,55,0,0,114,11,116,
+ 1,0,0,0,0,0,0,0,0,100,10,171,1,0,0,0,
+ 0,0,0,130,1,116,23,0,0,0,0,0,0,0,0,124,
+ 5,68,0,143,6,143,7,143,4,99,4,104,0,99,2,93,
+ 8,0,0,92,3,0,0,125,6,125,7,125,4,124,6,146,
+ 2,140,10,4,0,99,4,125,4,125,7,125,6,171,1,0,
+ 0,0,0,0,0,100,9,107,55,0,0,114,11,116,1,0,
+ 0,0,0,0,0,0,0,100,11,171,1,0,0,0,0,0,
+ 0,130,1,116,15,0,0,0,0,0,0,0,0,124,0,100,
+ 2,25,0,0,0,106,17,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,2,124,1,171,2,0,
+ 0,0,0,0,0,171,1,0,0,0,0,0,0,92,3,0,
+ 0,125,9,125,10,125,11,124,11,106,21,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,124,1,171,
+ 1,0,0,0,0,0,0,125,12,124,12,68,0,143,13,99,
+ 2,103,0,99,2,93,13,0,0,125,13,124,13,115,1,140,
+ 6,124,13,124,3,107,55,0,0,115,1,140,12,124,13,145,
+ 2,140,15,4,0,125,12,125,13,124,8,68,0,143,14,143,
+ 13,99,3,103,0,99,2,93,27,0,0,125,14,124,14,68,
+ 0,143,13,99,2,103,0,99,2,93,13,0,0,125,13,124,
+ 13,115,1,140,6,124,13,124,3,107,55,0,0,115,1,140,
+ 12,124,13,145,2,140,15,4,0,99,2,125,13,145,2,140,
+ 29,4,0,125,8,125,14,125,13,116,25,0,0,0,0,0,
+ 0,0,0,124,8,171,1,0,0,0,0,0,0,125,15,116,
+ 27,0,0,0,0,0,0,0,0,124,8,171,1,0,0,0,
+ 0,0,0,125,16,116,29,0,0,0,0,0,0,0,0,124,
+ 15,171,1,0,0,0,0,0,0,68,0,93,20,0,0,92,
+ 2,0,0,125,17,125,13,124,13,124,16,124,17,25,0,0,
+ 0,107,55,0,0,115,1,140,15,124,12,100,12,124,17,26,
+ 0,125,12,1,0,110,15,4,0,124,12,100,12,116,23,0,
+ 0,0,0,0,0,0,0,124,15,171,1,0,0,0,0,0,
+ 0,26,0,125,12,124,9,124,10,122,0,0,0,124,1,106,
+ 31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,124,12,171,1,0,0,0,0,0,0,122,0,0,
+ 0,83,0,99,2,1,0,99,2,125,4,119,0,99,2,1,
+ 0,99,4,125,4,125,7,125,6,119,0,99,2,1,0,99,
+ 4,125,4,125,7,125,6,119,0,99,2,1,0,99,4,125,
+ 4,125,7,125,6,119,0,99,2,1,0,99,2,125,13,119,
+ 0,99,2,1,0,99,2,125,13,119,0,99,2,1,0,99,
+ 3,125,13,125,14,119,0,35,0,116,32,0,0,0,0,0,
+ 0,0,0,116,34,0,0,0,0,0,0,0,0,102,2,36,
+ 0,114,24,1,0,116,37,0,0,0,0,0,0,0,0,106,
+ 38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,100,13,103,1,124,0,162,1,173,6,142,0,1,
+ 0,130,0,119,0,120,3,89,0,119,1,41,14,122,68,71,
+ 105,118,101,110,32,97,32,115,101,113,117,101,110,99,101,32,
+ 111,102,32,112,97,116,104,32,110,97,109,101,115,44,32,114,
+ 101,116,117,114,110,115,32,116,104,101,32,108,111,110,103,101,
+ 115,116,32,99,111,109,109,111,110,32,115,117,98,45,112,97,
+ 116,104,46,122,37,99,111,109,109,111,110,112,97,116,104,40,
+ 41,32,97,114,103,32,105,115,32,97,110,32,101,109,112,116,
+ 121,32,115,101,113,117,101,110,99,101,114,8,0,0,0,114,
+ 83,0,0,0,114,84,0,0,0,114,135,0,0,0,114,4,
+ 0,0,0,114,6,0,0,0,114,2,0,0,0,114,86,0,
+ 0,0,122,37,67,97,110,39,116,32,109,105,120,32,97,98,
+ 115,111,108,117,116,101,32,97,110,100,32,114,101,108,97,116,
+ 105,118,101,32,112,97,116,104,115,122,31,80,97,116,104,115,
+ 32,100,111,110,39,116,32,104,97,118,101,32,116,104,101,32,
+ 115,97,109,101,32,100,114,105,118,101,78,114,48,0,0,0,
+ 41,20,114,147,0,0,0,218,5,116,117,112,108,101,114,93,
+ 0,0,0,114,66,0,0,0,114,67,0,0,0,114,53,0,
+ 0,0,114,54,0,0,0,114,14,0,0,0,114,71,0,0,
+ 0,114,81,0,0,0,114,15,0,0,0,114,128,0,0,0,
+ 218,3,109,105,110,218,3,109,97,120,218,9,101,110,117,109,
+ 101,114,97,116,101,114,12,0,0,0,114,94,0,0,0,114,
+ 95,0,0,0,114,97,0,0,0,114,98,0,0,0,41,18,
+ 114,99,0,0,0,114,36,0,0,0,114,39,0,0,0,114,
+ 34,0,0,0,114,105,0,0,0,218,11,100,114,105,118,101,
+ 115,112,108,105,116,115,114,130,0,0,0,114,131,0,0,0,
+ 218,11,115,112,108,105,116,95,112,97,116,104,115,114,110,0,
+ 0,0,114,111,0,0,0,114,56,0,0,0,218,6,99,111,
+ 109,109,111,110,114,201,0,0,0,114,76,0,0,0,218,2,
+ 115,49,218,2,115,50,114,132,0,0,0,115,18,0,0,0,
+ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+ 32,32,114,57,0,0,0,114,48,0,0,0,114,48,0,0,
+ 0,59,3,0,0,115,45,2,0,0,128,0,241,6,0,12,
+ 17,220,14,24,208,25,64,211,14,65,208,8,65,228,12,17,
+ 148,35,148,98,151,105,145,105,160,21,211,18,39,211,12,40,
+ 128,69,220,7,17,144,37,152,1,145,40,156,69,212,7,34,
+ 216,14,19,136,3,216,17,21,136,6,216,17,21,137,6,224,
+ 14,18,136,3,216,17,20,136,6,216,17,20,136,6,240,4,
+ 30,5,14,217,74,79,211,22,80,201,37,192,81,148,121,160,
+ 17,167,25,161,25,168,54,176,51,211,33,55,215,33,61,209,
+ 33,61,211,33,63,213,23,64,200,37,136,11,208,22,80,217,
+ 51,62,213,22,63,177,59,169,7,168,1,168,49,168,97,144,
+ 113,151,119,145,119,152,115,149,124,176,59,136,11,210,22,63,
+ 228,11,14,161,27,213,15,45,161,27,145,103,144,97,152,17,
+ 152,65,146,1,160,27,211,15,45,211,11,46,176,33,210,11,
+ 51,220,18,28,208,29,68,211,18,69,208,12,69,244,10,0,
+ 12,15,161,27,213,15,45,161,27,145,103,144,97,152,17,152,
+ 65,146,1,160,27,211,15,45,211,11,46,176,33,210,11,51,
+ 220,18,28,208,29,62,211,18,63,208,12,63,228,28,37,160,
+ 101,168,65,161,104,215,38,54,209,38,54,176,118,184,115,211,
+ 38,67,211,28,68,209,8,25,136,5,136,116,144,84,216,17,
+ 21,151,26,145,26,152,67,147,31,136,6,217,29,35,211,17,
+ 57,153,86,152,1,162,113,168,81,176,38,171,91,146,33,152,
+ 86,136,6,208,17,57,225,68,79,212,22,80,193,75,184,113,
+ 161,49,211,23,58,161,49,152,97,170,1,168,97,176,54,171,
+ 107,154,1,160,49,211,23,58,192,75,136,11,209,22,80,220,
+ 13,16,144,27,211,13,29,136,2,220,13,16,144,27,211,13,
+ 29,136,2,220,20,29,152,98,150,77,137,68,136,65,136,113,
+ 216,15,16,144,66,144,113,145,69,139,122,216,25,31,160,2,
+ 160,17,152,26,144,6,217,16,21,240,7,0,21,34,240,10,
+ 0,22,28,152,72,156,83,160,18,155,87,208,21,37,136,70,
+ 224,15,20,144,116,137,124,152,99,159,104,153,104,160,118,211,
+ 30,46,209,15,46,208,8,46,249,242,53,0,23,81,1,249,
+ 220,22,63,249,228,15,45,249,244,12,0,16,46,249,242,10,
+ 0,18,58,249,226,23,58,249,211,22,80,248,244,22,0,13,
+ 22,148,126,208,11,38,242,0,2,5,14,220,8,19,215,8,
+ 36,209,8,36,160,92,208,8,58,176,69,211,8,58,216,8,
+ 13,240,5,2,5,14,250,115,145,0,0,0,193,18,4,72,
+ 6,0,193,22,48,71,28,4,194,6,8,72,6,0,194,14,
+ 28,71,33,8,194,42,15,72,6,0,194,57,13,71,40,12,
+ 195,6,34,72,6,0,195,40,13,71,47,12,195,53,65,14,
+ 72,6,0,197,3,7,71,54,4,197,11,5,71,54,4,197,
+ 17,4,71,54,4,197,21,7,72,6,0,197,28,9,72,0,
+ 6,197,37,7,71,59,12,197,45,5,71,59,12,197,51,4,
+ 71,59,12,197,55,5,72,0,6,197,60,50,72,6,0,198,
+ 47,44,72,6,0,199,28,31,72,6,0,199,59,5,72,0,
+ 6,200,0,6,72,6,0,200,6,39,72,45,3,41,1,218,
+ 11,95,112,97,116,104,95,105,115,100,105,114,41,1,218,12,
+ 95,112,97,116,104,95,105,115,102,105,108,101,41,1,218,12,
+ 95,112,97,116,104,95,105,115,108,105,110,107,41,1,218,12,
+ 95,112,97,116,104,95,101,120,105,115,116,115,41,1,218,16,
+ 95,112,97,116,104,95,105,115,100,101,118,100,114,105,118,101,
+ 99,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,
+ 0,3,0,0,0,243,74,0,0,0,151,0,9,0,116,1,
+ 0,0,0,0,0,0,0,0,116,3,0,0,0,0,0,0,
+ 0,0,124,0,171,1,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,83,0,35,0,116,4,0,0,0,0,0,0,
+ 0,0,36,0,114,3,1,0,89,0,121,1,119,0,120,3,
+ 89,0,119,1,169,2,122,64,68,101,116,101,114,109,105,110,
+ 101,115,32,119,104,101,116,104,101,114,32,116,104,101,32,115,
+ 112,101,99,105,102,105,101,100,32,112,97,116,104,32,105,115,
+ 32,111,110,32,97,32,87,105,110,100,111,119,115,32,68,101,
+ 118,32,68,114,105,118,101,46,70,41,3,114,23,1,0,0,
+ 114,33,0,0,0,114,146,0,0,0,114,55,0,0,0,115,
+ 1,0,0,0,32,114,57,0,0,0,218,10,105,115,100,101,
+ 118,100,114,105,118,101,114,26,1,0,0,129,3,0,0,115,
+ 40,0,0,0,128,0,240,4,3,9,25,220,19,35,164,71,
+ 168,68,163,77,211,19,50,208,12,50,248,220,15,22,242,0,
+ 1,9,25,217,19,24,240,3,1,9,25,250,115,12,0,0,
+ 0,130,19,22,0,150,9,34,3,161,1,34,3,99,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,
+ 0,0,243,4,0,0,0,151,0,121,1,114,25,1,0,0,
+ 169,0,114,55,0,0,0,115,1,0,0,0,32,114,57,0,
+ 0,0,114,26,1,0,0,114,26,1,0,0,124,3,0,0,
+ 115,7,0,0,0,128,0,240,6,0,16,21,114,59,0,0,
+ 0,41,1,78,41,65,218,7,95,95,100,111,99,95,95,114,
+ 34,0,0,0,114,35,0,0,0,114,40,0,0,0,114,36,
+ 0,0,0,114,37,0,0,0,114,39,0,0,0,114,38,0,
+ 0,0,114,41,0,0,0,114,66,0,0,0,114,68,0,0,
+ 0,114,149,0,0,0,114,97,0,0,0,218,7,95,95,97,
+ 108,108,95,95,114,58,0,0,0,218,7,95,119,105,110,97,
+ 112,105,114,60,0,0,0,114,72,0,0,0,114,61,0,0,
+ 0,114,73,0,0,0,114,62,0,0,0,114,74,0,0,0,
+ 114,10,0,0,0,218,11,73,109,112,111,114,116,69,114,114,
+ 111,114,114,11,0,0,0,114,12,0,0,0,114,13,0,0,
+ 0,114,14,0,0,0,114,15,0,0,0,114,16,0,0,0,
+ 114,136,0,0,0,114,17,0,0,0,114,18,0,0,0,218,
+ 7,104,97,115,97,116,116,114,218,11,115,116,97,116,95,114,
+ 101,115,117,108,116,114,49,0,0,0,114,26,0,0,0,218,
+ 2,110,116,114,155,0,0,0,114,29,0,0,0,114,30,0,
+ 0,0,114,31,0,0,0,114,204,0,0,0,114,32,0,0,
+ 0,114,210,0,0,0,114,33,0,0,0,114,217,0,0,0,
+ 114,218,0,0,0,114,228,0,0,0,114,234,0,0,0,114,
+ 242,0,0,0,114,42,0,0,0,114,43,0,0,0,114,44,
+ 0,0,0,114,48,0,0,0,114,19,1,0,0,114,27,0,
+ 0,0,114,20,1,0,0,114,28,0,0,0,114,21,1,0,
+ 0,114,24,0,0,0,114,22,1,0,0,114,25,0,0,0,
+ 114,23,1,0,0,114,26,1,0,0,114,28,1,0,0,114,
+ 59,0,0,0,114,57,0,0,0,218,8,60,109,111,100,117,
+ 108,101,62,114,36,1,0,0,1,0,0,0,115,227,1,0,
+ 0,240,3,1,1,1,241,4,4,1,4,240,18,0,10,13,
+ 128,6,216,9,13,128,6,216,9,12,128,6,216,6,10,128,
+ 3,216,10,13,128,7,216,9,12,128,6,216,10,21,128,7,
+ 216,10,15,128,7,227,0,9,219,0,10,219,0,11,219,0,
+ 18,220,0,25,242,6,6,11,79,1,128,7,242,16,4,1,
+ 21,240,20,33,1,44,247,2,3,5,45,241,0,3,5,45,
+ 242,10,17,5,56,242,72,1,16,1,17,242,40,43,1,14,
+ 242,98,1,20,1,30,242,46,49,1,31,242,114,1,13,1,
+ 43,242,42,5,1,56,240,12,0,20,31,215,19,40,209,19,
+ 40,215,19,48,209,19,48,128,8,212,0,16,242,10,2,1,
+ 23,242,14,2,1,23,241,14,0,4,11,136,50,143,62,137,
+ 62,208,27,43,212,3,44,243,2,6,5,74,1,242,16,3,
+ 5,21,242,16,6,1,16,240,36,3,1,30,221,4,37,242,
+ 6,17,1,21,242,58,45,1,31,242,122,1,106,1,1,15,
+ 240,96,3,38,1,40,221,4,45,240,82,1,41,1,30,221,
+ 4,35,242,30,25,5,30,240,54,93,2,1,20,223,4,62,
+ 242,10,40,5,20,242,84,1,47,5,20,240,98,1,0,34,
+ 39,244,0,60,5,20,240,64,2,0,30,34,208,0,26,243,
+ 4,43,1,14,242,112,1,46,1,14,240,98,1,10,1,9,
+ 245,8,0,5,40,221,4,41,221,4,41,221,4,41,240,12,
+ 13,1,25,221,4,35,243,14,5,5,25,248,240,121,25,0,
+ 8,19,242,0,9,1,44,244,2,8,5,44,240,3,9,1,
+ 44,251,240,116,7,0,8,19,242,0,1,1,30,216,25,29,
+ 210,4,22,240,3,1,1,30,251,240,94,6,0,8,19,242,
+ 0,35,1,40,244,2,34,5,40,240,3,35,1,40,251,240,
+ 84,1,0,8,19,242,0,10,1,30,244,2,9,5,30,240,
+ 3,10,1,30,251,240,84,1,0,8,19,242,0,2,1,23,
+ 224,15,22,130,72,240,5,2,1,23,251,240,100,8,0,8,
+ 19,242,0,2,1,9,225,4,8,240,5,2,1,9,251,240,
+ 14,0,8,19,242,0,4,1,21,244,2,3,5,21,240,3,
+ 4,1,21,250,115,125,0,0,0,176,13,67,48,0,194,14,
+ 6,67,62,0,194,30,6,68,11,0,194,37,6,68,25,0,
+ 194,47,8,68,39,0,195,13,24,68,52,0,195,38,6,68,
+ 63,0,195,48,8,67,59,3,195,58,1,67,59,3,195,62,
+ 7,68,8,3,196,7,1,68,8,3,196,11,8,68,22,3,
+ 196,21,1,68,22,3,196,25,8,68,36,3,196,35,1,68,
+ 36,3,196,39,7,68,49,3,196,48,1,68,49,3,196,52,
+ 5,68,60,3,196,59,1,68,60,3,196,63,8,69,10,3,
+ 197,9,1,69,10,3,
};
diff --git a/contrib/tools/python3/Python/frozen_modules/site.h b/contrib/tools/python3/Python/frozen_modules/site.h
index 7de3b27654..b91a82ef21 100644
--- a/contrib/tools/python3/Python/frozen_modules/site.h
+++ b/contrib/tools/python3/Python/frozen_modules/site.h
@@ -1110,664 +1110,666 @@ const unsigned char _Py_M__site[] = {
114,105,103,104,116,39,32,97,110,100,32,39,99,114,101,100,
105,116,115,39,32,105,110,32,98,117,105,108,116,105,110,115,
218,9,99,111,112,121,114,105,103,104,116,218,7,99,114,101,
- 100,105,116,115,122,158,32,32,32,32,84,104,97,110,107,115,
+ 100,105,116,115,122,191,32,32,32,32,84,104,97,110,107,115,
32,116,111,32,67,87,73,44,32,67,78,82,73,44,32,66,
- 101,79,112,101,110,46,99,111,109,44,32,90,111,112,101,32,
- 67,111,114,112,111,114,97,116,105,111,110,32,97,110,100,32,
- 97,32,99,97,115,116,32,111,102,32,116,104,111,117,115,97,
- 110,100,115,10,32,32,32,32,102,111,114,32,115,117,112,112,
- 111,114,116,105,110,103,32,80,121,116,104,111,110,32,100,101,
- 118,101,108,111,112,109,101,110,116,46,32,32,83,101,101,32,
- 119,119,119,46,112,121,116,104,111,110,46,111,114,103,32,102,
- 111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,
- 105,111,110,46,218,11,95,115,116,100,108,105,98,95,100,105,
- 114,78,114,37,0,0,0,122,11,76,73,67,69,78,83,69,
- 46,116,120,116,218,7,76,73,67,69,78,83,69,218,7,108,
- 105,99,101,110,115,101,122,39,83,101,101,32,104,116,116,112,
- 115,58,47,47,119,119,119,46,112,121,116,104,111,110,46,111,
- 114,103,47,112,115,102,47,108,105,99,101,110,115,101,47,41,
- 17,114,175,0,0,0,218,8,95,80,114,105,110,116,101,114,
- 114,6,0,0,0,114,181,0,0,0,114,177,0,0,0,114,
- 182,0,0,0,114,64,0,0,0,114,110,0,0,0,114,17,
- 0,0,0,114,18,0,0,0,218,7,100,105,114,110,97,109,
- 101,114,37,0,0,0,218,6,101,120,116,101,110,100,114,19,
- 0,0,0,218,6,112,97,114,100,105,114,218,6,99,117,114,
- 100,105,114,114,185,0,0,0,41,3,218,5,102,105,108,101,
- 115,218,4,100,105,114,115,218,4,104,101,114,101,115,3,0,
- 0,0,32,32,32,114,12,0,0,0,218,12,115,101,116,99,
- 111,112,121,114,105,103,104,116,114,194,0,0,0,169,1,0,
- 0,115,208,0,0,0,128,0,228,25,38,215,25,47,209,25,
- 47,176,11,188,83,191,93,185,93,211,25,75,132,72,212,4,
- 22,220,23,36,215,23,45,209,23,45,168,105,240,0,2,58,
- 84,1,243,0,2,24,85,1,132,72,212,4,20,240,6,0,
- 19,21,144,98,136,52,128,69,244,6,0,12,19,148,51,152,
- 13,160,116,211,11,44,128,68,217,11,15,148,71,156,66,160,
- 10,212,20,43,220,15,17,143,119,137,119,143,127,137,127,156,
- 114,159,123,153,123,211,15,43,136,4,217,7,11,216,8,13,
- 143,12,137,12,144,109,160,89,208,21,47,212,8,48,216,8,
- 12,143,11,137,11,148,82,151,87,145,87,151,92,145,92,160,
- 36,172,2,175,9,169,9,211,21,50,176,68,188,34,191,41,
- 185,41,208,20,68,212,8,69,220,23,36,215,23,45,209,23,
- 45,216,8,17,216,8,49,216,8,13,136,116,243,7,3,24,
- 21,132,72,213,4,20,114,14,0,0,0,99,0,0,0,0,
- 0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,
- 243,62,0,0,0,151,0,116,1,0,0,0,0,0,0,0,
- 0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,171,0,0,0,0,0,0,0,116,4,0,
- 0,0,0,0,0,0,0,95,3,0,0,0,0,0,0,0,
- 0,121,0,114,16,0,0,0,41,4,114,175,0,0,0,218,
- 7,95,72,101,108,112,101,114,114,177,0,0,0,218,4,104,
- 101,108,112,114,111,0,0,0,114,14,0,0,0,114,12,0,
- 0,0,218,9,115,101,116,104,101,108,112,101,114,114,198,0,
- 0,0,190,1,0,0,115,18,0,0,0,128,0,220,20,33,
- 215,20,41,209,20,41,211,20,43,132,72,133,77,114,14,0,
- 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,2,
- 0,0,0,3,0,0,0,243,32,0,0,0,151,0,100,1,
- 132,0,125,0,124,0,116,0,0,0,0,0,0,0,0,0,
- 95,1,0,0,0,0,0,0,0,0,121,2,41,3,97,106,
- 1,0,0,69,110,97,98,108,101,32,100,101,102,97,117,108,
- 116,32,114,101,97,100,108,105,110,101,32,99,111,110,102,105,
- 103,117,114,97,116,105,111,110,32,111,110,32,105,110,116,101,
- 114,97,99,116,105,118,101,32,112,114,111,109,112,116,115,44,
- 32,98,121,10,32,32,32,32,114,101,103,105,115,116,101,114,
- 105,110,103,32,97,32,115,121,115,46,95,95,105,110,116,101,
- 114,97,99,116,105,118,101,104,111,111,107,95,95,46,10,10,
- 32,32,32,32,73,102,32,116,104,101,32,114,101,97,100,108,
- 105,110,101,32,109,111,100,117,108,101,32,99,97,110,32,98,
- 101,32,105,109,112,111,114,116,101,100,44,32,116,104,101,32,
- 104,111,111,107,32,119,105,108,108,32,115,101,116,32,116,104,
- 101,32,84,97,98,32,107,101,121,10,32,32,32,32,97,115,
- 32,99,111,109,112,108,101,116,105,111,110,32,107,101,121,32,
- 97,110,100,32,114,101,103,105,115,116,101,114,32,126,47,46,
- 112,121,116,104,111,110,95,104,105,115,116,111,114,121,32,97,
- 115,32,104,105,115,116,111,114,121,32,102,105,108,101,46,10,
- 32,32,32,32,84,104,105,115,32,99,97,110,32,98,101,32,
- 111,118,101,114,114,105,100,100,101,110,32,105,110,32,116,104,
- 101,32,115,105,116,101,99,117,115,116,111,109,105,122,101,32,
- 111,114,32,117,115,101,114,99,117,115,116,111,109,105,122,101,
- 32,109,111,100,117,108,101,44,10,32,32,32,32,111,114,32,
- 105,110,32,97,32,80,89,84,72,79,78,83,84,65,82,84,
- 85,80,32,102,105,108,101,46,10,32,32,32,32,99,0,0,
- 0,0,0,0,0,0,0,0,0,0,5,0,0,0,19,0,
- 0,0,243,254,1,0,0,135,4,135,5,151,0,100,1,100,
- 0,108,0,125,0,9,0,100,1,100,0,108,1,138,5,100,
- 1,100,0,108,2,125,1,116,9,0,0,0,0,0,0,0,
- 0,137,5,100,2,100,3,171,3,0,0,0,0,0,0,125,
- 2,124,2,129,22,100,4,124,2,118,0,114,18,137,5,106,
- 11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,100,5,171,1,0,0,0,0,0,0,1,0,110,
- 17,137,5,106,11,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,100,6,171,1,0,0,0,0,0,
- 0,1,0,9,0,137,5,106,13,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
- 0,0,0,1,0,137,5,106,17,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,
- 0,0,0,100,1,107,40,0,0,114,103,116,18,0,0,0,
- 0,0,0,0,0,106,20,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,106,23,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,116,18,0,
- 0,0,0,0,0,0,0,106,20,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,106,25,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,
- 7,171,1,0,0,0,0,0,0,100,8,171,2,0,0,0,
- 0,0,0,138,4,9,0,137,5,106,27,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,137,4,171,
- 1,0,0,0,0,0,0,1,0,136,4,136,5,102,2,100,
- 9,132,8,125,3,124,0,106,29,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,3,171,1,0,
- 0,0,0,0,0,1,0,121,0,121,0,35,0,116,6,0,
- 0,0,0,0,0,0,0,36,0,114,3,1,0,89,0,121,
- 0,119,0,120,3,89,0,119,1,35,0,116,14,0,0,0,
- 0,0,0,0,0,36,0,114,3,1,0,89,0,140,149,119,
- 0,120,3,89,0,119,1,35,0,116,14,0,0,0,0,0,
- 0,0,0,36,0,114,3,1,0,89,0,140,66,119,0,120,
- 3,89,0,119,1,41,10,78,114,2,0,0,0,218,7,95,
- 95,100,111,99,95,95,114,62,0,0,0,218,7,108,105,98,
- 101,100,105,116,122,19,98,105,110,100,32,94,73,32,114,108,
- 95,99,111,109,112,108,101,116,101,122,13,116,97,98,58,32,
- 99,111,109,112,108,101,116,101,114,124,0,0,0,122,15,46,
- 112,121,116,104,111,110,95,104,105,115,116,111,114,121,99,0,
- 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,19,
- 0,0,0,243,72,0,0,0,149,2,151,0,9,0,137,1,
- 106,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,137,0,171,1,0,0,0,0,0,0,1,0,
- 121,0,35,0,116,2,0,0,0,0,0,0,0,0,36,0,
- 114,3,1,0,89,0,121,0,119,0,120,3,89,0,119,1,
- 114,16,0,0,0,41,2,218,18,119,114,105,116,101,95,104,
- 105,115,116,111,114,121,95,102,105,108,101,114,21,0,0,0,
- 41,2,218,7,104,105,115,116,111,114,121,218,8,114,101,97,
- 100,108,105,110,101,115,2,0,0,0,128,128,114,12,0,0,
- 0,218,13,119,114,105,116,101,95,104,105,115,116,111,114,121,
- 122,67,101,110,97,98,108,101,114,108,99,111,109,112,108,101,
- 116,101,114,46,60,108,111,99,97,108,115,62,46,114,101,103,
- 105,115,116,101,114,95,114,101,97,100,108,105,110,101,46,60,
- 108,111,99,97,108,115,62,46,119,114,105,116,101,95,104,105,
- 115,116,111,114,121,240,1,0,0,115,42,0,0,0,248,128,
- 0,240,2,5,17,25,216,20,28,215,20,47,209,20,47,176,
- 7,213,20,56,248,220,23,30,242,0,3,17,25,241,6,0,
- 21,25,240,7,3,17,25,250,115,12,0,0,0,131,17,21,
- 0,149,9,33,3,160,1,33,3,41,15,218,6,97,116,101,
- 120,105,116,114,206,0,0,0,218,11,114,108,99,111,109,112,
- 108,101,116,101,114,218,11,73,109,112,111,114,116,69,114,114,
- 111,114,114,64,0,0,0,218,14,112,97,114,115,101,95,97,
- 110,100,95,98,105,110,100,218,14,114,101,97,100,95,105,110,
- 105,116,95,102,105,108,101,114,21,0,0,0,218,26,103,101,
- 116,95,99,117,114,114,101,110,116,95,104,105,115,116,111,114,
- 121,95,108,101,110,103,116,104,114,17,0,0,0,114,18,0,
- 0,0,114,19,0,0,0,114,119,0,0,0,218,17,114,101,
- 97,100,95,104,105,115,116,111,114,121,95,102,105,108,101,218,
- 8,114,101,103,105,115,116,101,114,41,6,114,208,0,0,0,
- 114,209,0,0,0,218,12,114,101,97,100,108,105,110,101,95,
- 100,111,99,114,207,0,0,0,114,205,0,0,0,114,206,0,
- 0,0,115,6,0,0,0,32,32,32,32,64,64,114,12,0,
- 0,0,218,17,114,101,103,105,115,116,101,114,95,114,101,97,
- 100,108,105,110,101,122,44,101,110,97,98,108,101,114,108,99,
- 111,109,112,108,101,116,101,114,46,60,108,111,99,97,108,115,
- 62,46,114,101,103,105,115,116,101,114,95,114,101,97,100,108,
- 105,110,101,202,1,0,0,115,254,0,0,0,249,128,0,219,
- 8,21,240,2,4,9,19,219,12,27,219,12,30,244,12,0,
- 24,31,152,120,168,25,176,66,211,23,55,136,12,216,11,23,
- 208,11,35,168,9,176,92,209,40,65,216,12,20,215,12,35,
- 209,12,35,208,36,57,213,12,58,224,12,20,215,12,35,209,
- 12,35,160,79,212,12,52,240,4,7,9,17,216,12,20,215,
- 12,35,209,12,35,212,12,37,240,16,0,12,20,215,11,46,
- 209,11,46,211,11,48,176,65,210,11,53,244,12,0,23,25,
- 151,103,145,103,151,108,145,108,164,50,167,55,161,55,215,35,
- 53,209,35,53,176,99,211,35,58,216,35,52,243,3,1,23,
- 54,136,71,240,4,3,13,21,216,16,24,215,16,42,209,16,
- 42,168,55,212,16,51,245,8,6,13,25,240,16,0,13,19,
- 143,79,137,79,152,77,213,12,42,240,43,0,12,54,248,244,
- 41,0,16,27,242,0,1,9,19,217,12,18,240,3,1,9,
- 19,251,244,26,0,16,23,242,0,5,9,17,241,10,0,13,
- 17,240,11,5,9,17,251,244,34,0,20,27,242,0,1,13,
- 21,217,16,20,240,3,1,13,21,250,115,53,0,0,0,136,
- 8,67,18,0,193,7,16,67,33,0,194,40,17,67,48,0,
- 195,18,9,67,30,3,195,29,1,67,30,3,195,33,9,67,
- 45,3,195,44,1,67,45,3,195,48,9,67,60,3,195,59,
- 1,67,60,3,78,41,2,114,6,0,0,0,218,19,95,95,
- 105,110,116,101,114,97,99,116,105,118,101,104,111,111,107,95,
- 95,41,1,114,217,0,0,0,115,1,0,0,0,32,114,12,
- 0,0,0,218,17,101,110,97,98,108,101,114,108,99,111,109,
- 112,108,101,116,101,114,114,219,0,0,0,193,1,0,0,115,
- 18,0,0,0,128,0,242,18,46,5,43,240,96,1,0,31,
- 48,132,67,213,4,27,114,14,0,0,0,99,1,0,0,0,
- 0,0,0,0,0,0,0,0,8,0,0,0,3,0,0,0,
- 243,66,4,0,0,151,0,116,0,0,0,0,0,0,0,0,
- 0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,125,1,116,4,0,0,0,0,0,0,0,
- 0,106,6,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,100,1,107,40,0,0,114,35,100,2,124,
- 1,118,0,114,31,116,0,0,0,0,0,0,0,0,0,106,
- 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,100,2,25,0,0,0,120,1,125,2,116,4,0,
- 0,0,0,0,0,0,0,95,4,0,0,0,0,0,0,0,
- 0,110,16,116,4,0,0,0,0,0,0,0,0,106,10,0,
+ 101,79,112,101,110,44,32,90,111,112,101,32,67,111,114,112,
+ 111,114,97,116,105,111,110,44,32,116,104,101,32,80,121,116,
+ 104,111,110,32,83,111,102,116,119,97,114,101,10,32,32,32,
+ 32,70,111,117,110,100,97,116,105,111,110,44,32,97,110,100,
+ 32,97,32,99,97,115,116,32,111,102,32,116,104,111,117,115,
+ 97,110,100,115,32,102,111,114,32,115,117,112,112,111,114,116,
+ 105,110,103,32,80,121,116,104,111,110,10,32,32,32,32,100,
+ 101,118,101,108,111,112,109,101,110,116,46,32,32,83,101,101,
+ 32,119,119,119,46,112,121,116,104,111,110,46,111,114,103,32,
+ 102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,
+ 116,105,111,110,46,218,11,95,115,116,100,108,105,98,95,100,
+ 105,114,78,114,37,0,0,0,122,11,76,73,67,69,78,83,
+ 69,46,116,120,116,218,7,76,73,67,69,78,83,69,218,7,
+ 108,105,99,101,110,115,101,122,39,83,101,101,32,104,116,116,
+ 112,115,58,47,47,119,119,119,46,112,121,116,104,111,110,46,
+ 111,114,103,47,112,115,102,47,108,105,99,101,110,115,101,47,
+ 41,17,114,175,0,0,0,218,8,95,80,114,105,110,116,101,
+ 114,114,6,0,0,0,114,181,0,0,0,114,177,0,0,0,
+ 114,182,0,0,0,114,64,0,0,0,114,110,0,0,0,114,
+ 17,0,0,0,114,18,0,0,0,218,7,100,105,114,110,97,
+ 109,101,114,37,0,0,0,218,6,101,120,116,101,110,100,114,
+ 19,0,0,0,218,6,112,97,114,100,105,114,218,6,99,117,
+ 114,100,105,114,114,185,0,0,0,41,3,218,5,102,105,108,
+ 101,115,218,4,100,105,114,115,218,4,104,101,114,101,115,3,
+ 0,0,0,32,32,32,114,12,0,0,0,218,12,115,101,116,
+ 99,111,112,121,114,105,103,104,116,114,194,0,0,0,169,1,
+ 0,0,115,206,0,0,0,128,0,228,25,38,215,25,47,209,
+ 25,47,176,11,188,83,191,93,185,93,211,25,75,132,72,212,
+ 4,22,220,23,36,215,23,45,209,23,45,168,105,240,0,3,
+ 58,62,243,0,3,24,63,132,72,212,4,20,240,8,0,19,
+ 21,144,98,136,52,128,69,244,6,0,12,19,148,51,152,13,
+ 160,116,211,11,44,128,68,217,11,15,148,71,156,66,160,10,
+ 212,20,43,220,15,17,143,119,137,119,143,127,137,127,156,114,
+ 159,123,153,123,211,15,43,136,4,217,7,11,216,8,13,143,
+ 12,137,12,144,109,160,89,208,21,47,212,8,48,216,8,12,
+ 143,11,137,11,148,82,151,87,145,87,151,92,145,92,160,36,
+ 172,2,175,9,169,9,211,21,50,176,68,188,34,191,41,185,
+ 41,208,20,68,212,8,69,220,23,36,215,23,45,209,23,45,
+ 216,8,17,216,8,49,216,8,13,136,116,243,7,3,24,21,
+ 132,72,213,4,20,114,14,0,0,0,99,0,0,0,0,0,
+ 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,243,
+ 62,0,0,0,151,0,116,1,0,0,0,0,0,0,0,0,
+ 106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,116,4,0,0,
+ 0,0,0,0,0,0,95,3,0,0,0,0,0,0,0,0,
+ 121,0,114,16,0,0,0,41,4,114,175,0,0,0,218,7,
+ 95,72,101,108,112,101,114,114,177,0,0,0,218,4,104,101,
+ 108,112,114,111,0,0,0,114,14,0,0,0,114,12,0,0,
+ 0,218,9,115,101,116,104,101,108,112,101,114,114,198,0,0,
+ 0,191,1,0,0,115,18,0,0,0,128,0,220,20,33,215,
+ 20,41,209,20,41,211,20,43,132,72,133,77,114,14,0,0,
+ 0,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,
+ 0,0,3,0,0,0,243,32,0,0,0,151,0,100,1,132,
+ 0,125,0,124,0,116,0,0,0,0,0,0,0,0,0,95,
+ 1,0,0,0,0,0,0,0,0,121,2,41,3,97,106,1,
+ 0,0,69,110,97,98,108,101,32,100,101,102,97,117,108,116,
+ 32,114,101,97,100,108,105,110,101,32,99,111,110,102,105,103,
+ 117,114,97,116,105,111,110,32,111,110,32,105,110,116,101,114,
+ 97,99,116,105,118,101,32,112,114,111,109,112,116,115,44,32,
+ 98,121,10,32,32,32,32,114,101,103,105,115,116,101,114,105,
+ 110,103,32,97,32,115,121,115,46,95,95,105,110,116,101,114,
+ 97,99,116,105,118,101,104,111,111,107,95,95,46,10,10,32,
+ 32,32,32,73,102,32,116,104,101,32,114,101,97,100,108,105,
+ 110,101,32,109,111,100,117,108,101,32,99,97,110,32,98,101,
+ 32,105,109,112,111,114,116,101,100,44,32,116,104,101,32,104,
+ 111,111,107,32,119,105,108,108,32,115,101,116,32,116,104,101,
+ 32,84,97,98,32,107,101,121,10,32,32,32,32,97,115,32,
+ 99,111,109,112,108,101,116,105,111,110,32,107,101,121,32,97,
+ 110,100,32,114,101,103,105,115,116,101,114,32,126,47,46,112,
+ 121,116,104,111,110,95,104,105,115,116,111,114,121,32,97,115,
+ 32,104,105,115,116,111,114,121,32,102,105,108,101,46,10,32,
+ 32,32,32,84,104,105,115,32,99,97,110,32,98,101,32,111,
+ 118,101,114,114,105,100,100,101,110,32,105,110,32,116,104,101,
+ 32,115,105,116,101,99,117,115,116,111,109,105,122,101,32,111,
+ 114,32,117,115,101,114,99,117,115,116,111,109,105,122,101,32,
+ 109,111,100,117,108,101,44,10,32,32,32,32,111,114,32,105,
+ 110,32,97,32,80,89,84,72,79,78,83,84,65,82,84,85,
+ 80,32,102,105,108,101,46,10,32,32,32,32,99,0,0,0,
+ 0,0,0,0,0,0,0,0,0,5,0,0,0,19,0,0,
+ 0,243,254,1,0,0,135,4,135,5,151,0,100,1,100,0,
+ 108,0,125,0,9,0,100,1,100,0,108,1,138,5,100,1,
+ 100,0,108,2,125,1,116,9,0,0,0,0,0,0,0,0,
+ 137,5,100,2,100,3,171,3,0,0,0,0,0,0,125,2,
+ 124,2,129,22,100,4,124,2,118,0,114,18,137,5,106,11,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,125,2,116,0,0,0,0,0,0,0,0,0,106,12,0,
+ 0,0,100,5,171,1,0,0,0,0,0,0,1,0,110,17,
+ 137,5,106,11,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,100,6,171,1,0,0,0,0,0,0,
+ 1,0,9,0,137,5,106,13,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,
+ 0,0,1,0,137,5,106,17,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,
+ 0,0,100,1,107,40,0,0,114,103,116,18,0,0,0,0,
+ 0,0,0,0,106,20,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,106,23,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,116,18,0,0,
+ 0,0,0,0,0,0,106,20,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,106,25,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,7,
+ 171,1,0,0,0,0,0,0,100,8,171,2,0,0,0,0,
+ 0,0,138,4,9,0,137,5,106,27,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,137,4,171,1,
+ 0,0,0,0,0,0,1,0,136,4,136,5,102,2,100,9,
+ 132,8,125,3,124,0,106,29,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,3,171,1,0,0,
+ 0,0,0,0,1,0,121,0,121,0,35,0,116,6,0,0,
+ 0,0,0,0,0,0,36,0,114,3,1,0,89,0,121,0,
+ 119,0,120,3,89,0,119,1,35,0,116,14,0,0,0,0,
+ 0,0,0,0,36,0,114,3,1,0,89,0,140,149,119,0,
+ 120,3,89,0,119,1,35,0,116,14,0,0,0,0,0,0,
+ 0,0,36,0,114,3,1,0,89,0,140,66,119,0,120,3,
+ 89,0,119,1,41,10,78,114,2,0,0,0,218,7,95,95,
+ 100,111,99,95,95,114,62,0,0,0,218,7,108,105,98,101,
+ 100,105,116,122,19,98,105,110,100,32,94,73,32,114,108,95,
+ 99,111,109,112,108,101,116,101,122,13,116,97,98,58,32,99,
+ 111,109,112,108,101,116,101,114,124,0,0,0,122,15,46,112,
+ 121,116,104,111,110,95,104,105,115,116,111,114,121,99,0,0,
+ 0,0,0,0,0,0,0,0,0,0,4,0,0,0,19,0,
+ 0,0,243,72,0,0,0,149,2,151,0,9,0,137,1,106,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,137,0,171,1,0,0,0,0,0,0,1,0,121,
+ 0,35,0,116,2,0,0,0,0,0,0,0,0,36,0,114,
+ 3,1,0,89,0,121,0,119,0,120,3,89,0,119,1,114,
+ 16,0,0,0,41,2,218,18,119,114,105,116,101,95,104,105,
+ 115,116,111,114,121,95,102,105,108,101,114,21,0,0,0,41,
+ 2,218,7,104,105,115,116,111,114,121,218,8,114,101,97,100,
+ 108,105,110,101,115,2,0,0,0,128,128,114,12,0,0,0,
+ 218,13,119,114,105,116,101,95,104,105,115,116,111,114,121,122,
+ 67,101,110,97,98,108,101,114,108,99,111,109,112,108,101,116,
+ 101,114,46,60,108,111,99,97,108,115,62,46,114,101,103,105,
+ 115,116,101,114,95,114,101,97,100,108,105,110,101,46,60,108,
+ 111,99,97,108,115,62,46,119,114,105,116,101,95,104,105,115,
+ 116,111,114,121,241,1,0,0,115,42,0,0,0,248,128,0,
+ 240,2,5,17,25,216,20,28,215,20,47,209,20,47,176,7,
+ 213,20,56,248,220,23,30,242,0,3,17,25,241,6,0,21,
+ 25,240,7,3,17,25,250,115,12,0,0,0,131,17,21,0,
+ 149,9,33,3,160,1,33,3,41,15,218,6,97,116,101,120,
+ 105,116,114,206,0,0,0,218,11,114,108,99,111,109,112,108,
+ 101,116,101,114,218,11,73,109,112,111,114,116,69,114,114,111,
+ 114,114,64,0,0,0,218,14,112,97,114,115,101,95,97,110,
+ 100,95,98,105,110,100,218,14,114,101,97,100,95,105,110,105,
+ 116,95,102,105,108,101,114,21,0,0,0,218,26,103,101,116,
+ 95,99,117,114,114,101,110,116,95,104,105,115,116,111,114,121,
+ 95,108,101,110,103,116,104,114,17,0,0,0,114,18,0,0,
+ 0,114,19,0,0,0,114,119,0,0,0,218,17,114,101,97,
+ 100,95,104,105,115,116,111,114,121,95,102,105,108,101,218,8,
+ 114,101,103,105,115,116,101,114,41,6,114,208,0,0,0,114,
+ 209,0,0,0,218,12,114,101,97,100,108,105,110,101,95,100,
+ 111,99,114,207,0,0,0,114,205,0,0,0,114,206,0,0,
+ 0,115,6,0,0,0,32,32,32,32,64,64,114,12,0,0,
+ 0,218,17,114,101,103,105,115,116,101,114,95,114,101,97,100,
+ 108,105,110,101,122,44,101,110,97,98,108,101,114,108,99,111,
+ 109,112,108,101,116,101,114,46,60,108,111,99,97,108,115,62,
+ 46,114,101,103,105,115,116,101,114,95,114,101,97,100,108,105,
+ 110,101,203,1,0,0,115,254,0,0,0,249,128,0,219,8,
+ 21,240,2,4,9,19,219,12,27,219,12,30,244,12,0,24,
+ 31,152,120,168,25,176,66,211,23,55,136,12,216,11,23,208,
+ 11,35,168,9,176,92,209,40,65,216,12,20,215,12,35,209,
+ 12,35,208,36,57,213,12,58,224,12,20,215,12,35,209,12,
+ 35,160,79,212,12,52,240,4,7,9,17,216,12,20,215,12,
+ 35,209,12,35,212,12,37,240,16,0,12,20,215,11,46,209,
+ 11,46,211,11,48,176,65,210,11,53,244,12,0,23,25,151,
+ 103,145,103,151,108,145,108,164,50,167,55,161,55,215,35,53,
+ 209,35,53,176,99,211,35,58,216,35,52,243,3,1,23,54,
+ 136,71,240,4,3,13,21,216,16,24,215,16,42,209,16,42,
+ 168,55,212,16,51,245,8,6,13,25,240,16,0,13,19,143,
+ 79,137,79,152,77,213,12,42,240,43,0,12,54,248,244,41,
+ 0,16,27,242,0,1,9,19,217,12,18,240,3,1,9,19,
+ 251,244,26,0,16,23,242,0,5,9,17,241,10,0,13,17,
+ 240,11,5,9,17,251,244,34,0,20,27,242,0,1,13,21,
+ 217,16,20,240,3,1,13,21,250,115,53,0,0,0,136,8,
+ 67,18,0,193,7,16,67,33,0,194,40,17,67,48,0,195,
+ 18,9,67,30,3,195,29,1,67,30,3,195,33,9,67,45,
+ 3,195,44,1,67,45,3,195,48,9,67,60,3,195,59,1,
+ 67,60,3,78,41,2,114,6,0,0,0,218,19,95,95,105,
+ 110,116,101,114,97,99,116,105,118,101,104,111,111,107,95,95,
+ 41,1,114,217,0,0,0,115,1,0,0,0,32,114,12,0,
+ 0,0,218,17,101,110,97,98,108,101,114,108,99,111,109,112,
+ 108,101,116,101,114,114,219,0,0,0,194,1,0,0,115,18,
+ 0,0,0,128,0,242,18,46,5,43,240,96,1,0,31,48,
+ 132,67,213,4,27,114,14,0,0,0,99,1,0,0,0,0,
+ 0,0,0,0,0,0,0,8,0,0,0,3,0,0,0,243,
+ 66,4,0,0,151,0,116,0,0,0,0,0,0,0,0,0,
+ 106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,125,1,116,4,0,0,0,0,0,0,0,0,
+ 106,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,1,107,40,0,0,114,35,100,2,124,1,
+ 118,0,114,31,116,0,0,0,0,0,0,0,0,0,106,2,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,106,15,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,116,0,0,0,0,0,0,0,0,0,106,
- 12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,106,17,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,125,3,116,0,0,0,0,
- 0,0,0,0,0,106,12,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,106,15,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,124,3,171,
- 1,0,0,0,0,0,0,125,4,100,0,116,4,0,0,0,
- 0,0,0,0,0,95,9,0,0,0,0,0,0,0,0,100,
- 3,125,5,116,21,0,0,0,0,0,0,0,0,100,4,132,
- 0,116,0,0,0,0,0,0,0,0,0,106,12,0,0,0,
+ 0,0,100,2,25,0,0,0,120,1,125,2,116,4,0,0,
+ 0,0,0,0,0,0,95,4,0,0,0,0,0,0,0,0,
+ 110,16,116,4,0,0,0,0,0,0,0,0,106,10,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 125,2,116,0,0,0,0,0,0,0,0,0,106,12,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 106,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,116,0,0,0,0,0,0,0,0,0,106,12,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,106,17,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,2,171,1,0,0,0,0,0,0,
+ 171,1,0,0,0,0,0,0,125,3,116,0,0,0,0,0,
+ 0,0,0,0,106,12,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,106,15,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,124,3,171,1,
+ 0,0,0,0,0,0,125,4,100,0,116,4,0,0,0,0,
+ 0,0,0,0,95,9,0,0,0,0,0,0,0,0,100,3,
+ 125,5,116,21,0,0,0,0,0,0,0,0,100,4,132,0,
+ 116,0,0,0,0,0,0,0,0,0,106,12,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,23,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,124,3,124,5,171,2,0,0,0,0,0,0,116,0,
+ 0,0,0,0,0,0,0,0,106,12,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,106,23,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 124,4,124,5,171,2,0,0,0,0,0,0,102,2,68,0,
+ 171,0,0,0,0,0,0,0,100,0,171,2,0,0,0,0,
+ 0,0,125,6,124,6,144,1,114,0,124,6,125,7,100,5,
+ 125,8,116,25,0,0,0,0,0,0,0,0,124,7,100,6,
+ 172,7,171,2,0,0,0,0,0,0,53,0,125,9,124,9,
+ 68,0,93,113,0,0,125,10,100,8,124,10,118,0,115,1,
+ 140,8,124,10,106,27,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,100,8,171,1,0,0,0,0,
+ 0,0,92,3,0,0,125,11,125,12,125,13,124,11,106,29,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,171,0,0,0,0,0,0,0,106,31,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,
+ 0,0,0,0,0,0,125,11,124,13,106,29,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,0,
+ 0,0,0,0,0,0,125,13,124,11,100,9,107,40,0,0,
+ 114,17,124,13,106,31,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,
+ 125,8,140,97,124,11,100,10,107,40,0,0,115,1,140,103,
+ 124,13,116,4,0,0,0,0,0,0,0,0,95,9,0,0,
+ 0,0,0,0,0,0,140,115,4,0,9,0,100,0,100,0,
+ 100,0,171,2,0,0,0,0,0,0,1,0,124,4,120,1,
+ 116,4,0,0,0,0,0,0,0,0,95,16,0,0,0,0,
+ 0,0,0,0,116,4,0,0,0,0,0,0,0,0,95,17,
+ 0,0,0,0,0,0,0,0,116,37,0,0,0,0,0,0,
+ 0,0,124,0,116,4,0,0,0,0,0,0,0,0,106,32,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,103,1,171,2,0,0,0,0,0,0,1,0,124,8,
+ 100,5,107,40,0,0,114,38,116,38,0,0,0,0,0,0,
+ 0,0,106,41,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,100,11,116,4,0,0,0,0,0,0,
+ 0,0,106,32,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,171,2,0,0,0,0,0,0,1,0,
+ 124,0,83,0,116,4,0,0,0,0,0,0,0,0,106,32,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,103,1,97,19,100,12,97,21,124,0,83,0,35,0,
+ 49,0,115,1,119,2,1,0,89,0,1,0,1,0,140,122,
+ 120,3,89,0,119,1,41,13,78,114,126,0,0,0,218,19,
+ 95,95,80,89,86,69,78,86,95,76,65,85,78,67,72,69,
+ 82,95,95,122,10,112,121,118,101,110,118,46,99,102,103,99,
+ 1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
+ 51,0,0,0,243,94,0,0,0,75,0,1,0,151,0,124,
+ 0,93,37,0,0,125,1,116,0,0,0,0,0,0,0,0,
+ 0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,106,5,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,0,
+ 0,0,0,114,4,124,1,150,1,151,1,1,0,140,39,4,
+ 0,121,0,173,3,119,1,114,16,0,0,0,41,3,114,17,
+ 0,0,0,114,18,0,0,0,218,6,105,115,102,105,108,101,
+ 41,2,218,2,46,48,218,8,99,111,110,102,102,105,108,101,
+ 115,2,0,0,0,32,32,114,12,0,0,0,218,9,60,103,
+ 101,110,101,120,112,114,62,122,23,118,101,110,118,46,60,108,
+ 111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,62,
+ 10,2,0,0,115,46,0,0,0,232,0,248,128,0,240,0,
+ 6,9,10,241,2,3,38,14,152,24,244,8,0,16,18,143,
+ 119,137,119,143,126,137,126,152,104,212,15,39,244,9,0,13,
+ 21,241,0,3,38,14,249,115,4,0,0,0,130,43,45,1,
+ 218,4,116,114,117,101,122,5,117,116,102,45,56,41,1,218,
+ 8,101,110,99,111,100,105,110,103,218,1,61,122,28,105,110,
+ 99,108,117,100,101,45,115,121,115,116,101,109,45,115,105,116,
+ 101,45,112,97,99,107,97,103,101,115,218,4,104,111,109,101,
+ 114,2,0,0,0,70,41,22,114,17,0,0,0,114,129,0,
+ 0,0,114,6,0,0,0,114,131,0,0,0,218,16,95,98,
+ 97,115,101,95,101,120,101,99,117,116,97,98,108,101,218,10,
+ 101,120,101,99,117,116,97,98,108,101,114,18,0,0,0,114,
+ 187,0,0,0,114,20,0,0,0,218,5,95,104,111,109,101,
+ 218,4,110,101,120,116,114,19,0,0,0,218,4,111,112,101,
+ 110,218,9,112,97,114,116,105,116,105,111,110,114,78,0,0,
+ 0,218,5,108,111,119,101,114,114,165,0,0,0,218,11,101,
+ 120,101,99,95,112,114,101,102,105,120,114,170,0,0,0,114,
+ 159,0,0,0,218,6,105,110,115,101,114,116,114,149,0,0,
+ 0,41,14,114,47,0,0,0,218,3,101,110,118,114,232,0,
+ 0,0,218,7,101,120,101,95,100,105,114,218,11,115,105,116,
+ 101,95,112,114,101,102,105,120,218,13,99,111,110,102,95,98,
+ 97,115,101,110,97,109,101,218,14,99,97,110,100,105,100,97,
+ 116,101,95,99,111,110,102,218,12,118,105,114,116,117,97,108,
+ 95,99,111,110,102,218,11,115,121,115,116,101,109,95,115,105,
+ 116,101,114,89,0,0,0,114,92,0,0,0,218,3,107,101,
+ 121,114,54,0,0,0,218,5,118,97,108,117,101,115,14,0,
+ 0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+ 114,12,0,0,0,218,4,118,101,110,118,114,249,0,0,0,
+ 253,1,0,0,115,176,1,0,0,128,0,244,6,0,11,13,
+ 143,42,137,42,128,67,220,7,10,135,124,129,124,144,120,210,
+ 7,31,208,36,57,184,83,209,36,64,220,44,46,175,74,169,
+ 74,208,55,76,209,44,77,208,8,77,136,10,148,83,213,21,
+ 41,228,21,24,151,94,145,94,136,10,220,14,16,143,103,137,
+ 103,143,111,137,111,156,98,159,103,153,103,159,111,153,111,168,
+ 106,211,30,57,211,14,58,128,71,220,18,20,151,39,145,39,
+ 151,47,145,47,160,39,211,18,42,128,75,216,16,20,132,67,
+ 132,73,216,20,32,128,77,220,21,25,241,2,6,9,10,228,
+ 16,18,151,7,145,7,151,12,145,12,152,87,160,109,211,16,
+ 52,220,16,18,151,7,145,7,151,12,145,12,152,91,168,45,
+ 211,16,56,241,5,3,38,14,243,3,6,9,10,240,14,0,
+ 9,13,243,17,9,22,6,128,78,242,22,0,8,22,216,23,
+ 37,136,12,216,22,28,136,11,244,6,0,14,18,144,44,168,
+ 23,213,13,49,176,81,219,24,25,144,4,216,19,22,152,36,
+ 146,59,216,36,40,167,78,161,78,176,51,211,36,55,145,77,
+ 144,67,152,17,152,69,216,26,29,159,41,153,41,155,43,215,
+ 26,43,209,26,43,211,26,45,144,67,216,28,33,159,75,153,
+ 75,155,77,144,69,216,23,26,208,30,60,210,23,60,216,38,
+ 43,167,107,161,107,163,109,153,11,216,25,28,160,6,155,29,
+ 216,36,41,156,3,157,9,241,17,0,25,26,247,3,0,14,
+ 50,240,22,0,40,51,208,8,50,140,3,140,10,148,83,148,
+ 95,244,6,0,9,24,152,11,164,99,167,106,161,106,160,92,
+ 212,8,50,240,8,0,12,23,152,38,210,11,32,220,12,20,
+ 143,79,137,79,152,65,156,115,159,122,153,122,212,12,42,240,
+ 10,0,12,23,208,4,22,244,7,0,25,28,159,10,153,10,
+ 144,124,136,72,216,31,36,208,12,28,224,11,22,208,4,22,
+ 247,49,0,14,50,208,13,49,250,115,25,0,0,0,196,36,
+ 10,72,21,3,196,47,65,30,72,21,3,198,14,13,72,21,
+ 3,200,21,5,72,30,7,99,0,0,0,0,0,0,0,0,
+ 0,0,0,0,8,0,0,0,3,0,0,0,243,134,1,0,
+ 0,151,0,9,0,9,0,100,1,100,2,108,0,125,0,121,
+ 2,35,0,116,2,0,0,0,0,0,0,0,0,36,0,114,
+ 27,125,1,124,1,106,4,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,100,3,107,40,0,0,114,
+ 1,110,1,130,0,89,0,100,2,125,1,126,1,121,2,100,
+ 2,125,1,126,1,119,1,119,0,120,3,89,0,119,1,35,
+ 0,116,6,0,0,0,0,0,0,0,0,36,0,114,136,125,
+ 2,116,8,0,0,0,0,0,0,0,0,106,10,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,
- 23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,124,3,124,5,171,2,0,0,0,0,0,0,116,
- 0,0,0,0,0,0,0,0,0,106,12,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,106,23,0,
+ 12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,114,37,116,9,0,0,0,0,0,0,0,0,106,
+ 14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,116,9,0,0,0,0,0,0,0,0,106,16,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,124,4,124,5,171,2,0,0,0,0,0,0,102,2,68,
- 0,171,0,0,0,0,0,0,0,100,0,171,2,0,0,0,
- 0,0,0,125,6,124,6,144,1,114,0,124,6,125,7,100,
- 5,125,8,116,25,0,0,0,0,0,0,0,0,124,7,100,
- 6,172,7,171,2,0,0,0,0,0,0,53,0,125,9,124,
- 9,68,0,93,113,0,0,125,10,100,8,124,10,118,0,115,
- 1,140,8,124,10,106,27,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,100,8,171,1,0,0,0,
- 0,0,0,92,3,0,0,125,11,125,12,125,13,124,11,106,
- 29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,171,0,0,0,0,0,0,0,106,31,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
- 0,0,0,0,0,0,0,125,11,124,13,106,29,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,
- 0,0,0,0,0,0,0,125,13,124,11,100,9,107,40,0,
- 0,114,17,124,13,106,31,0,0,0,0,0,0,0,0,0,
+ 0,171,0,0,0,0,0,0,0,142,0,1,0,110,63,116,
+ 8,0,0,0,0,0,0,0,0,106,18,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,106,21,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,100,4,124,2,106,22,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,106,24,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,155,1,100,
+ 5,124,2,155,1,100,6,157,5,171,1,0,0,0,0,0,
+ 0,1,0,89,0,100,2,125,2,126,2,121,2,89,0,100,
+ 2,125,2,126,2,121,2,100,2,125,2,126,2,119,1,119,
+ 0,120,3,89,0,119,1,41,7,122,44,82,117,110,32,99,
+ 117,115,116,111,109,32,115,105,116,101,32,115,112,101,99,105,
+ 102,105,99,32,99,111,100,101,44,32,105,102,32,97,118,97,
+ 105,108,97,98,108,101,46,114,2,0,0,0,78,218,13,115,
+ 105,116,101,99,117,115,116,111,109,105,122,101,122,57,69,114,
+ 114,111,114,32,105,110,32,115,105,116,101,99,117,115,116,111,
+ 109,105,122,101,59,32,115,101,116,32,80,89,84,72,79,78,
+ 86,69,82,66,79,83,69,32,102,111,114,32,116,114,97,99,
+ 101,98,97,99,107,58,10,250,2,58,32,218,1,10,41,13,
+ 114,251,0,0,0,114,210,0,0,0,114,85,0,0,0,114,
+ 81,0,0,0,114,6,0,0,0,114,7,0,0,0,114,8,
+ 0,0,0,218,10,101,120,99,101,112,116,104,111,111,107,218,
+ 8,101,120,99,95,105,110,102,111,114,10,0,0,0,218,5,
+ 119,114,105,116,101,218,9,95,95,99,108,97,115,115,95,95,
+ 218,8,95,95,110,97,109,101,95,95,41,3,114,251,0,0,
+ 0,114,93,0,0,0,218,3,101,114,114,115,3,0,0,0,
+ 32,32,32,114,12,0,0,0,218,17,101,120,101,99,115,105,
+ 116,101,99,117,115,116,111,109,105,122,101,114,4,1,0,0,
+ 52,2,0,0,243,152,0,0,0,128,0,240,4,15,5,47,
+ 240,2,6,9,22,220,12,32,248,220,15,26,242,0,4,9,
+ 22,216,15,18,143,120,137,120,152,63,210,15,42,216,16,20,
+ 224,16,21,244,5,0,17,21,251,240,5,4,9,22,251,244,
+ 10,0,12,21,242,0,7,5,47,220,11,14,143,57,137,57,
+ 215,11,28,210,11,28,220,12,15,143,78,137,78,156,67,159,
+ 76,153,76,155,78,210,12,43,228,12,15,143,74,137,74,215,
+ 12,28,210,12,28,240,6,0,18,21,151,29,145,29,215,17,
+ 39,211,17,39,170,19,240,5,2,17,46,247,3,3,13,47,
+ 241,0,3,13,47,244,5,0,13,44,251,240,5,7,5,47,
+ 250,243,41,0,0,0,131,4,8,0,136,9,44,3,145,17,
+ 39,3,162,4,47,0,167,5,44,3,172,3,47,0,175,9,
+ 67,0,3,184,65,57,66,59,3,194,59,5,67,0,3,99,
+ 0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,
+ 3,0,0,0,243,134,1,0,0,151,0,9,0,9,0,100,
+ 1,100,2,108,0,125,0,121,2,35,0,116,2,0,0,0,
+ 0,0,0,0,0,36,0,114,27,125,1,124,1,106,4,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,100,3,107,40,0,0,114,1,110,1,130,0,89,0,100,
+ 2,125,1,126,1,121,2,100,2,125,1,126,1,119,1,119,
+ 0,120,3,89,0,119,1,35,0,116,6,0,0,0,0,0,
+ 0,0,0,36,0,114,136,125,2,116,8,0,0,0,0,0,
+ 0,0,0,106,10,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,106,12,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,114,37,116,9,0,
+ 0,0,0,0,0,0,0,106,14,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,116,9,0,0,0,
+ 0,0,0,0,0,106,16,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,
- 0,125,8,140,97,124,11,100,10,107,40,0,0,115,1,140,
- 103,124,13,116,4,0,0,0,0,0,0,0,0,95,9,0,
- 0,0,0,0,0,0,0,140,115,4,0,9,0,100,0,100,
- 0,100,0,171,2,0,0,0,0,0,0,1,0,124,4,120,
- 1,116,4,0,0,0,0,0,0,0,0,95,16,0,0,0,
- 0,0,0,0,0,116,4,0,0,0,0,0,0,0,0,95,
- 17,0,0,0,0,0,0,0,0,116,37,0,0,0,0,0,
- 0,0,0,124,0,116,4,0,0,0,0,0,0,0,0,106,
- 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,103,1,171,2,0,0,0,0,0,0,1,0,124,
- 8,100,5,107,40,0,0,114,38,116,38,0,0,0,0,0,
- 0,0,0,106,41,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,100,11,116,4,0,0,0,0,0,
- 0,0,0,106,32,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,171,2,0,0,0,0,0,0,1,
- 0,124,0,83,0,116,4,0,0,0,0,0,0,0,0,106,
- 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,103,1,97,19,100,12,97,21,124,0,83,0,35,
- 0,49,0,115,1,119,2,1,0,89,0,1,0,1,0,140,
- 122,120,3,89,0,119,1,41,13,78,114,126,0,0,0,218,
- 19,95,95,80,89,86,69,78,86,95,76,65,85,78,67,72,
- 69,82,95,95,122,10,112,121,118,101,110,118,46,99,102,103,
- 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
- 0,51,0,0,0,243,94,0,0,0,75,0,1,0,151,0,
- 124,0,93,37,0,0,125,1,116,0,0,0,0,0,0,0,
+ 0,142,0,1,0,110,63,116,8,0,0,0,0,0,0,0,
+ 0,106,18,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,106,21,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,100,4,124,2,106,22,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,106,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,155,1,100,5,124,2,155,1,100,6,157,
+ 5,171,1,0,0,0,0,0,0,1,0,89,0,100,2,125,
+ 2,126,2,121,2,89,0,100,2,125,2,126,2,121,2,100,
+ 2,125,2,126,2,119,1,119,0,120,3,89,0,119,1,41,
+ 7,122,44,82,117,110,32,99,117,115,116,111,109,32,117,115,
+ 101,114,32,115,112,101,99,105,102,105,99,32,99,111,100,101,
+ 44,32,105,102,32,97,118,97,105,108,97,98,108,101,46,114,
+ 2,0,0,0,78,218,13,117,115,101,114,99,117,115,116,111,
+ 109,105,122,101,122,57,69,114,114,111,114,32,105,110,32,117,
+ 115,101,114,99,117,115,116,111,109,105,122,101,59,32,115,101,
+ 116,32,80,89,84,72,79,78,86,69,82,66,79,83,69,32,
+ 102,111,114,32,116,114,97,99,101,98,97,99,107,58,10,114,
+ 252,0,0,0,114,253,0,0,0,41,13,114,8,1,0,0,
+ 114,210,0,0,0,114,85,0,0,0,114,81,0,0,0,114,
+ 6,0,0,0,114,7,0,0,0,114,8,0,0,0,114,254,
+ 0,0,0,114,255,0,0,0,114,10,0,0,0,114,0,1,
+ 0,0,114,1,1,0,0,114,2,1,0,0,41,3,114,8,
+ 1,0,0,114,93,0,0,0,114,3,1,0,0,115,3,0,
+ 0,0,32,32,32,114,12,0,0,0,218,17,101,120,101,99,
+ 117,115,101,114,99,117,115,116,111,109,105,122,101,114,9,1,
+ 0,0,72,2,0,0,114,5,1,0,0,114,6,1,0,0,
+ 99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+ 0,3,0,0,0,243,148,1,0,0,151,0,116,0,0,0,
+ 0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,100,1,100,1,26,0,
+ 125,0,116,5,0,0,0,0,0,0,0,0,171,0,0,0,
+ 0,0,0,0,125,1,124,0,116,0,0,0,0,0,0,0,
0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,106,5,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
- 0,0,0,0,114,4,124,1,150,1,151,1,1,0,140,39,
- 4,0,121,0,173,3,119,1,114,16,0,0,0,41,3,114,
- 17,0,0,0,114,18,0,0,0,218,6,105,115,102,105,108,
- 101,41,2,218,2,46,48,218,8,99,111,110,102,102,105,108,
- 101,115,2,0,0,0,32,32,114,12,0,0,0,218,9,60,
- 103,101,110,101,120,112,114,62,122,23,118,101,110,118,46,60,
- 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114,
- 62,9,2,0,0,115,46,0,0,0,232,0,248,128,0,240,
- 0,6,9,10,241,2,3,38,14,152,24,244,8,0,16,18,
- 143,119,137,119,143,126,137,126,152,104,212,15,39,244,9,0,
- 13,21,241,0,3,38,14,249,115,4,0,0,0,130,43,45,
- 1,218,4,116,114,117,101,122,5,117,116,102,45,56,41,1,
- 218,8,101,110,99,111,100,105,110,103,218,1,61,122,28,105,
- 110,99,108,117,100,101,45,115,121,115,116,101,109,45,115,105,
- 116,101,45,112,97,99,107,97,103,101,115,218,4,104,111,109,
- 101,114,2,0,0,0,70,41,22,114,17,0,0,0,114,129,
- 0,0,0,114,6,0,0,0,114,131,0,0,0,218,16,95,
- 98,97,115,101,95,101,120,101,99,117,116,97,98,108,101,218,
- 10,101,120,101,99,117,116,97,98,108,101,114,18,0,0,0,
- 114,187,0,0,0,114,20,0,0,0,218,5,95,104,111,109,
- 101,218,4,110,101,120,116,114,19,0,0,0,218,4,111,112,
- 101,110,218,9,112,97,114,116,105,116,105,111,110,114,78,0,
- 0,0,218,5,108,111,119,101,114,114,165,0,0,0,218,11,
- 101,120,101,99,95,112,114,101,102,105,120,114,170,0,0,0,
- 114,159,0,0,0,218,6,105,110,115,101,114,116,114,149,0,
- 0,0,41,14,114,47,0,0,0,218,3,101,110,118,114,232,
- 0,0,0,218,7,101,120,101,95,100,105,114,218,11,115,105,
- 116,101,95,112,114,101,102,105,120,218,13,99,111,110,102,95,
- 98,97,115,101,110,97,109,101,218,14,99,97,110,100,105,100,
- 97,116,101,95,99,111,110,102,218,12,118,105,114,116,117,97,
- 108,95,99,111,110,102,218,11,115,121,115,116,101,109,95,115,
- 105,116,101,114,89,0,0,0,114,92,0,0,0,218,3,107,
- 101,121,114,54,0,0,0,218,5,118,97,108,117,101,115,14,
- 0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,
- 32,114,12,0,0,0,218,4,118,101,110,118,114,249,0,0,
- 0,252,1,0,0,115,176,1,0,0,128,0,244,6,0,11,
- 13,143,42,137,42,128,67,220,7,10,135,124,129,124,144,120,
- 210,7,31,208,36,57,184,83,209,36,64,220,44,46,175,74,
- 169,74,208,55,76,209,44,77,208,8,77,136,10,148,83,213,
- 21,41,228,21,24,151,94,145,94,136,10,220,14,16,143,103,
- 137,103,143,111,137,111,156,98,159,103,153,103,159,111,153,111,
- 168,106,211,30,57,211,14,58,128,71,220,18,20,151,39,145,
- 39,151,47,145,47,160,39,211,18,42,128,75,216,16,20,132,
- 67,132,73,216,20,32,128,77,220,21,25,241,2,6,9,10,
- 228,16,18,151,7,145,7,151,12,145,12,152,87,160,109,211,
- 16,52,220,16,18,151,7,145,7,151,12,145,12,152,91,168,
- 45,211,16,56,241,5,3,38,14,243,3,6,9,10,240,14,
- 0,9,13,243,17,9,22,6,128,78,242,22,0,8,22,216,
- 23,37,136,12,216,22,28,136,11,244,6,0,14,18,144,44,
- 168,23,213,13,49,176,81,219,24,25,144,4,216,19,22,152,
- 36,146,59,216,36,40,167,78,161,78,176,51,211,36,55,145,
- 77,144,67,152,17,152,69,216,26,29,159,41,153,41,155,43,
- 215,26,43,209,26,43,211,26,45,144,67,216,28,33,159,75,
- 153,75,155,77,144,69,216,23,26,208,30,60,210,23,60,216,
- 38,43,167,107,161,107,163,109,153,11,216,25,28,160,6,155,
- 29,216,36,41,156,3,157,9,241,17,0,25,26,247,3,0,
- 14,50,240,22,0,40,51,208,8,50,140,3,140,10,148,83,
- 148,95,244,6,0,9,24,152,11,164,99,167,106,161,106,160,
- 92,212,8,50,240,8,0,12,23,152,38,210,11,32,220,12,
- 20,143,79,137,79,152,65,156,115,159,122,153,122,212,12,42,
- 240,10,0,12,23,208,4,22,244,7,0,25,28,159,10,153,
- 10,144,124,136,72,216,31,36,208,12,28,224,11,22,208,4,
- 22,247,49,0,14,50,208,13,49,250,115,25,0,0,0,196,
- 36,10,72,21,3,196,47,65,30,72,21,3,198,14,13,72,
- 21,3,200,21,5,72,30,7,99,0,0,0,0,0,0,0,
- 0,0,0,0,0,8,0,0,0,3,0,0,0,243,134,1,
- 0,0,151,0,9,0,9,0,100,1,100,2,108,0,125,0,
- 121,2,35,0,116,2,0,0,0,0,0,0,0,0,36,0,
- 114,27,125,1,124,1,106,4,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,100,3,107,40,0,0,
- 114,1,110,1,130,0,89,0,100,2,125,1,126,1,121,2,
- 100,2,125,1,126,1,119,1,119,0,120,3,89,0,119,1,
- 35,0,116,6,0,0,0,0,0,0,0,0,36,0,114,136,
- 125,2,116,8,0,0,0,0,0,0,0,0,106,10,0,0,
+ 0,0,0,0,0,0,107,55,0,0,114,10,116,7,0,0,
+ 0,0,0,0,0,0,171,0,0,0,0,0,0,0,1,0,
+ 116,9,0,0,0,0,0,0,0,0,124,1,171,1,0,0,
+ 0,0,0,0,125,1,116,10,0,0,0,0,0,0,0,0,
+ 128,10,116,13,0,0,0,0,0,0,0,0,171,0,0,0,
+ 0,0,0,0,97,5,116,15,0,0,0,0,0,0,0,0,
+ 124,1,171,1,0,0,0,0,0,0,125,1,116,17,0,0,
+ 0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,0,
+ 125,1,116,19,0,0,0,0,0,0,0,0,171,0,0,0,
+ 0,0,0,0,1,0,116,21,0,0,0,0,0,0,0,0,
+ 171,0,0,0,0,0,0,0,1,0,116,23,0,0,0,0,
+ 0,0,0,0,171,0,0,0,0,0,0,0,1,0,116,0,
+ 0,0,0,0,0,0,0,0,106,24,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,106,26,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 106,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,114,37,116,9,0,0,0,0,0,0,0,0,
- 106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,116,9,0,0,0,0,0,0,0,0,106,16,
+ 115,10,116,29,0,0,0,0,0,0,0,0,171,0,0,0,
+ 0,0,0,0,1,0,116,31,0,0,0,0,0,0,0,0,
+ 171,0,0,0,0,0,0,0,1,0,116,10,0,0,0,0,
+ 0,0,0,0,114,11,116,33,0,0,0,0,0,0,0,0,
+ 171,0,0,0,0,0,0,0,1,0,121,1,121,1,41,2,
+ 122,207,65,100,100,32,115,116,97,110,100,97,114,100,32,115,
+ 105,116,101,45,115,112,101,99,105,102,105,99,32,100,105,114,
+ 101,99,116,111,114,105,101,115,32,116,111,32,116,104,101,32,
+ 109,111,100,117,108,101,32,115,101,97,114,99,104,32,112,97,
+ 116,104,46,10,10,32,32,32,32,84,104,105,115,32,102,117,
+ 110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,
+ 32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,119,
+ 104,101,110,32,116,104,105,115,32,109,111,100,117,108,101,32,
+ 105,115,32,105,109,112,111,114,116,101,100,44,10,32,32,32,
+ 32,117,110,108,101,115,115,32,116,104,101,32,112,121,116,104,
+ 111,110,32,105,110,116,101,114,112,114,101,116,101,114,32,119,
+ 97,115,32,115,116,97,114,116,101,100,32,119,105,116,104,32,
+ 116,104,101,32,45,83,32,102,108,97,103,46,10,32,32,32,
+ 32,78,41,17,114,6,0,0,0,114,18,0,0,0,114,49,
+ 0,0,0,114,42,0,0,0,114,249,0,0,0,114,149,0,
+ 0,0,114,112,0,0,0,114,154,0,0,0,114,170,0,0,
+ 0,114,179,0,0,0,114,194,0,0,0,114,198,0,0,0,
+ 114,7,0,0,0,218,8,105,115,111,108,97,116,101,100,114,
+ 219,0,0,0,114,4,1,0,0,114,9,1,0,0,41,2,
+ 218,9,111,114,105,103,95,112,97,116,104,114,47,0,0,0,
+ 115,2,0,0,0,32,32,114,12,0,0,0,218,4,109,97,
+ 105,110,114,13,1,0,0,92,2,0,0,115,143,0,0,0,
+ 128,0,244,16,0,17,20,151,8,145,8,153,17,144,11,128,
+ 73,220,18,32,211,18,34,128,75,216,7,16,148,67,151,72,
+ 145,72,210,7,28,244,6,0,9,18,140,11,228,18,22,144,
+ 123,211,18,35,128,75,220,7,23,208,7,31,220,27,47,211,
+ 27,49,208,8,24,220,18,37,160,107,211,18,50,128,75,220,
+ 18,33,160,43,211,18,46,128,75,220,4,11,132,73,220,4,
+ 16,132,78,220,4,13,132,75,220,11,14,143,57,137,57,215,
+ 11,29,210,11,29,220,8,25,212,8,27,220,4,21,212,4,
+ 23,221,7,23,220,8,25,213,8,27,240,3,0,8,24,114,
+ 14,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+ 0,8,0,0,0,3,0,0,0,243,196,3,0,0,151,0,
+ 100,1,125,0,116,0,0,0,0,0,0,0,0,0,106,2,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,171,0,0,0,0,0,0,0,142,0,1,0,110,63,
- 116,8,0,0,0,0,0,0,0,0,106,18,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,21,
+ 0,0,100,2,100,0,26,0,125,1,124,1,115,168,116,5,
+ 0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,
+ 125,2,116,7,0,0,0,0,0,0,0,0,171,0,0,0,
+ 0,0,0,0,125,3,116,9,0,0,0,0,0,0,0,0,
+ 100,3,171,1,0,0,0,0,0,0,1,0,116,0,0,0,
+ 0,0,0,0,0,0,106,10,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,68,0,93,17,0,0,
+ 125,4,116,9,0,0,0,0,0,0,0,0,100,4,124,4,
+ 155,2,100,5,157,3,171,1,0,0,0,0,0,0,1,0,
+ 140,19,4,0,116,9,0,0,0,0,0,0,0,0,100,6,
+ 171,1,0,0,0,0,0,0,1,0,100,7,132,0,125,5,
+ 116,9,0,0,0,0,0,0,0,0,100,8,124,2,155,2,
+ 100,9,2,0,124,5,124,2,171,1,0,0,0,0,0,0,
+ 155,0,100,10,157,5,171,1,0,0,0,0,0,0,1,0,
+ 116,9,0,0,0,0,0,0,0,0,100,11,124,3,155,2,
+ 100,9,2,0,124,5,124,3,171,1,0,0,0,0,0,0,
+ 155,0,100,10,157,5,171,1,0,0,0,0,0,0,1,0,
+ 116,9,0,0,0,0,0,0,0,0,100,12,116,12,0,0,
+ 0,0,0,0,0,0,155,2,157,2,171,1,0,0,0,0,
+ 0,0,1,0,116,1,0,0,0,0,0,0,0,0,106,14,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,100,4,124,2,106,22,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,106,24,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,1,
- 100,5,124,2,155,1,100,6,157,5,171,1,0,0,0,0,
- 0,0,1,0,89,0,100,2,125,2,126,2,121,2,89,0,
- 100,2,125,2,126,2,121,2,100,2,125,2,126,2,119,1,
- 119,0,120,3,89,0,119,1,41,7,122,44,82,117,110,32,
- 99,117,115,116,111,109,32,115,105,116,101,32,115,112,101,99,
- 105,102,105,99,32,99,111,100,101,44,32,105,102,32,97,118,
- 97,105,108,97,98,108,101,46,114,2,0,0,0,78,218,13,
- 115,105,116,101,99,117,115,116,111,109,105,122,101,122,57,69,
- 114,114,111,114,32,105,110,32,115,105,116,101,99,117,115,116,
- 111,109,105,122,101,59,32,115,101,116,32,80,89,84,72,79,
- 78,86,69,82,66,79,83,69,32,102,111,114,32,116,114,97,
- 99,101,98,97,99,107,58,10,250,2,58,32,218,1,10,41,
- 13,114,251,0,0,0,114,210,0,0,0,114,85,0,0,0,
- 114,81,0,0,0,114,6,0,0,0,114,7,0,0,0,114,
- 8,0,0,0,218,10,101,120,99,101,112,116,104,111,111,107,
- 218,8,101,120,99,95,105,110,102,111,114,10,0,0,0,218,
- 5,119,114,105,116,101,218,9,95,95,99,108,97,115,115,95,
- 95,218,8,95,95,110,97,109,101,95,95,41,3,114,251,0,
- 0,0,114,93,0,0,0,218,3,101,114,114,115,3,0,0,
- 0,32,32,32,114,12,0,0,0,218,17,101,120,101,99,115,
- 105,116,101,99,117,115,116,111,109,105,122,101,114,4,1,0,
- 0,51,2,0,0,243,152,0,0,0,128,0,240,4,15,5,
- 47,240,2,6,9,22,220,12,32,248,220,15,26,242,0,4,
- 9,22,216,15,18,143,120,137,120,152,63,210,15,42,216,16,
- 20,224,16,21,244,5,0,17,21,251,240,5,4,9,22,251,
- 244,10,0,12,21,242,0,7,5,47,220,11,14,143,57,137,
- 57,215,11,28,210,11,28,220,12,15,143,78,137,78,156,67,
- 159,76,153,76,155,78,210,12,43,228,12,15,143,74,137,74,
- 215,12,28,210,12,28,240,6,0,18,21,151,29,145,29,215,
- 17,39,211,17,39,170,19,240,5,2,17,46,247,3,3,13,
- 47,241,0,3,13,47,244,5,0,13,44,251,240,5,7,5,
- 47,250,243,41,0,0,0,131,4,8,0,136,9,44,3,145,
- 17,39,3,162,4,47,0,167,5,44,3,172,3,47,0,175,
- 9,67,0,3,184,65,57,66,59,3,194,59,5,67,0,3,
- 99,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,
- 0,3,0,0,0,243,134,1,0,0,151,0,9,0,9,0,
- 100,1,100,2,108,0,125,0,121,2,35,0,116,2,0,0,
- 0,0,0,0,0,0,36,0,114,27,125,1,124,1,106,4,
+ 0,0,100,13,171,1,0,0,0,0,0,0,1,0,103,0,
+ 125,6,100,14,124,1,118,0,114,21,124,6,106,17,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,100,3,107,40,0,0,114,1,110,1,130,0,89,0,
- 100,2,125,1,126,1,121,2,100,2,125,1,126,1,119,1,
- 119,0,120,3,89,0,119,1,35,0,116,6,0,0,0,0,
- 0,0,0,0,36,0,114,136,125,2,116,8,0,0,0,0,
- 0,0,0,0,106,10,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,106,12,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,114,37,116,9,
- 0,0,0,0,0,0,0,0,106,14,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,116,9,0,0,
- 0,0,0,0,0,0,106,16,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,171,0,0,0,0,0,
- 0,0,142,0,1,0,110,63,116,8,0,0,0,0,0,0,
- 0,0,106,18,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,106,21,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,100,4,124,2,106,22,
+ 116,18,0,0,0,0,0,0,0,0,171,1,0,0,0,0,
+ 0,0,1,0,100,15,124,1,118,0,114,21,124,6,106,17,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,106,24,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,155,1,100,5,124,2,155,1,100,6,
- 157,5,171,1,0,0,0,0,0,0,1,0,89,0,100,2,
- 125,2,126,2,121,2,89,0,100,2,125,2,126,2,121,2,
- 100,2,125,2,126,2,119,1,119,0,120,3,89,0,119,1,
- 41,7,122,44,82,117,110,32,99,117,115,116,111,109,32,117,
- 115,101,114,32,115,112,101,99,105,102,105,99,32,99,111,100,
- 101,44,32,105,102,32,97,118,97,105,108,97,98,108,101,46,
- 114,2,0,0,0,78,218,13,117,115,101,114,99,117,115,116,
- 111,109,105,122,101,122,57,69,114,114,111,114,32,105,110,32,
- 117,115,101,114,99,117,115,116,111,109,105,122,101,59,32,115,
- 101,116,32,80,89,84,72,79,78,86,69,82,66,79,83,69,
- 32,102,111,114,32,116,114,97,99,101,98,97,99,107,58,10,
- 114,252,0,0,0,114,253,0,0,0,41,13,114,8,1,0,
- 0,114,210,0,0,0,114,85,0,0,0,114,81,0,0,0,
- 114,6,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
- 254,0,0,0,114,255,0,0,0,114,10,0,0,0,114,0,
- 1,0,0,114,1,1,0,0,114,2,1,0,0,41,3,114,
- 8,1,0,0,114,93,0,0,0,114,3,1,0,0,115,3,
- 0,0,0,32,32,32,114,12,0,0,0,218,17,101,120,101,
- 99,117,115,101,114,99,117,115,116,111,109,105,122,101,114,9,
- 1,0,0,71,2,0,0,114,5,1,0,0,114,6,1,0,
- 0,99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,
- 0,0,3,0,0,0,243,148,1,0,0,151,0,116,0,0,
- 0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,100,1,100,1,26,
- 0,125,0,116,5,0,0,0,0,0,0,0,0,171,0,0,
- 0,0,0,0,0,125,1,124,0,116,0,0,0,0,0,0,
- 0,0,0,106,2,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,107,55,0,0,114,10,116,7,0,
- 0,0,0,0,0,0,0,171,0,0,0,0,0,0,0,1,
- 0,116,9,0,0,0,0,0,0,0,0,124,1,171,1,0,
- 0,0,0,0,0,125,1,116,10,0,0,0,0,0,0,0,
- 0,128,10,116,13,0,0,0,0,0,0,0,0,171,0,0,
- 0,0,0,0,0,97,5,116,15,0,0,0,0,0,0,0,
- 0,124,1,171,1,0,0,0,0,0,0,125,1,116,17,0,
- 0,0,0,0,0,0,0,124,1,171,1,0,0,0,0,0,
- 0,125,1,116,19,0,0,0,0,0,0,0,0,171,0,0,
- 0,0,0,0,0,1,0,116,21,0,0,0,0,0,0,0,
- 0,171,0,0,0,0,0,0,0,1,0,116,23,0,0,0,
- 0,0,0,0,0,171,0,0,0,0,0,0,0,1,0,116,
- 0,0,0,0,0,0,0,0,0,106,24,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,106,26,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,115,10,116,29,0,0,0,0,0,0,0,0,171,0,0,
- 0,0,0,0,0,1,0,116,31,0,0,0,0,0,0,0,
- 0,171,0,0,0,0,0,0,0,1,0,116,10,0,0,0,
- 0,0,0,0,0,114,11,116,33,0,0,0,0,0,0,0,
- 0,171,0,0,0,0,0,0,0,1,0,121,1,121,1,41,
- 2,122,207,65,100,100,32,115,116,97,110,100,97,114,100,32,
- 115,105,116,101,45,115,112,101,99,105,102,105,99,32,100,105,
- 114,101,99,116,111,114,105,101,115,32,116,111,32,116,104,101,
- 32,109,111,100,117,108,101,32,115,101,97,114,99,104,32,112,
- 97,116,104,46,10,10,32,32,32,32,84,104,105,115,32,102,
- 117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,
- 100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,
- 119,104,101,110,32,116,104,105,115,32,109,111,100,117,108,101,
- 32,105,115,32,105,109,112,111,114,116,101,100,44,10,32,32,
- 32,32,117,110,108,101,115,115,32,116,104,101,32,112,121,116,
- 104,111,110,32,105,110,116,101,114,112,114,101,116,101,114,32,
- 119,97,115,32,115,116,97,114,116,101,100,32,119,105,116,104,
- 32,116,104,101,32,45,83,32,102,108,97,103,46,10,32,32,
- 32,32,78,41,17,114,6,0,0,0,114,18,0,0,0,114,
- 49,0,0,0,114,42,0,0,0,114,249,0,0,0,114,149,
- 0,0,0,114,112,0,0,0,114,154,0,0,0,114,170,0,
- 0,0,114,179,0,0,0,114,194,0,0,0,114,198,0,0,
- 0,114,7,0,0,0,218,8,105,115,111,108,97,116,101,100,
- 114,219,0,0,0,114,4,1,0,0,114,9,1,0,0,41,
- 2,218,9,111,114,105,103,95,112,97,116,104,114,47,0,0,
- 0,115,2,0,0,0,32,32,114,12,0,0,0,218,4,109,
- 97,105,110,114,13,1,0,0,91,2,0,0,115,143,0,0,
- 0,128,0,244,16,0,17,20,151,8,145,8,153,17,144,11,
- 128,73,220,18,32,211,18,34,128,75,216,7,16,148,67,151,
- 72,145,72,210,7,28,244,6,0,9,18,140,11,228,18,22,
- 144,123,211,18,35,128,75,220,7,23,208,7,31,220,27,47,
- 211,27,49,208,8,24,220,18,37,160,107,211,18,50,128,75,
- 220,18,33,160,43,211,18,46,128,75,220,4,11,132,73,220,
- 4,16,132,78,220,4,13,132,75,220,11,14,143,57,137,57,
- 215,11,29,210,11,29,220,8,25,212,8,27,220,4,21,212,
- 4,23,221,7,23,220,8,25,213,8,27,240,3,0,8,24,
- 114,14,0,0,0,99,0,0,0,0,0,0,0,0,0,0,
- 0,0,8,0,0,0,3,0,0,0,243,196,3,0,0,151,
- 0,100,1,125,0,116,0,0,0,0,0,0,0,0,0,106,
- 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,100,2,100,0,26,0,125,1,124,1,115,168,116,
- 5,0,0,0,0,0,0,0,0,171,0,0,0,0,0,0,
- 0,125,2,116,7,0,0,0,0,0,0,0,0,171,0,0,
- 0,0,0,0,0,125,3,116,9,0,0,0,0,0,0,0,
- 0,100,3,171,1,0,0,0,0,0,0,1,0,116,0,0,
- 0,0,0,0,0,0,0,106,10,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,68,0,93,17,0,
- 0,125,4,116,9,0,0,0,0,0,0,0,0,100,4,124,
- 4,155,2,100,5,157,3,171,1,0,0,0,0,0,0,1,
- 0,140,19,4,0,116,9,0,0,0,0,0,0,0,0,100,
- 6,171,1,0,0,0,0,0,0,1,0,100,7,132,0,125,
- 5,116,9,0,0,0,0,0,0,0,0,100,8,124,2,155,
- 2,100,9,2,0,124,5,124,2,171,1,0,0,0,0,0,
- 0,155,0,100,10,157,5,171,1,0,0,0,0,0,0,1,
- 0,116,9,0,0,0,0,0,0,0,0,100,11,124,3,155,
- 2,100,9,2,0,124,5,124,3,171,1,0,0,0,0,0,
- 0,155,0,100,10,157,5,171,1,0,0,0,0,0,0,1,
- 0,116,9,0,0,0,0,0,0,0,0,100,12,116,12,0,
- 0,0,0,0,0,0,0,155,2,157,2,171,1,0,0,0,
- 0,0,0,1,0,116,1,0,0,0,0,0,0,0,0,106,
- 14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,100,13,171,1,0,0,0,0,0,0,1,0,103,
- 0,125,6,100,14,124,1,118,0,114,21,124,6,106,17,0,
+ 0,0,116,20,0,0,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,1,0,124,6,114,148,116,9,0,0,0,0,
+ 0,0,0,0,116,22,0,0,0,0,0,0,0,0,106,24,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,116,18,0,0,0,0,0,0,0,0,171,1,0,0,0,
- 0,0,0,1,0,100,15,124,1,118,0,114,21,124,6,106,
- 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,116,20,0,0,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,1,0,124,6,114,148,116,9,0,0,0,
- 0,0,0,0,0,116,22,0,0,0,0,0,0,0,0,106,
- 24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,106,27,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,124,6,171,1,0,0,0,0,0,
- 0,171,1,0,0,0,0,0,0,1,0,116,12,0,0,0,
- 0,0,0,0,0,114,22,116,1,0,0,0,0,0,0,0,
- 0,106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,100,13,171,1,0,0,0,0,0,0,1,
- 0,121,0,116,12,0,0,0,0,0,0,0,0,100,16,117,
- 0,114,22,116,1,0,0,0,0,0,0,0,0,106,14,0,
+ 0,0,106,27,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,124,6,171,1,0,0,0,0,0,0,
+ 171,1,0,0,0,0,0,0,1,0,116,12,0,0,0,0,
+ 0,0,0,0,114,22,116,1,0,0,0,0,0,0,0,0,
+ 106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,13,171,1,0,0,0,0,0,0,1,0,
+ 121,0,116,12,0,0,0,0,0,0,0,0,100,16,117,0,
+ 114,22,116,1,0,0,0,0,0,0,0,0,106,14,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,100,2,171,1,0,0,0,0,0,0,1,0,121,0,116,
- 12,0,0,0,0,0,0,0,0,128,22,116,1,0,0,0,
- 0,0,0,0,0,106,14,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,100,17,171,1,0,0,0,
- 0,0,0,1,0,121,0,116,1,0,0,0,0,0,0,0,
- 0,106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,100,18,171,1,0,0,0,0,0,0,1,
- 0,121,0,100,13,100,0,108,14,125,7,116,9,0,0,0,
- 0,0,0,0,0,124,7,106,31,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,124,0,116,0,0,
- 0,0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,100,13,25,0,0,
- 0,116,22,0,0,0,0,0,0,0,0,106,24,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,
- 2,122,6,0,0,171,1,0,0,0,0,0,0,171,1,0,
- 0,0,0,0,0,1,0,116,1,0,0,0,0,0,0,0,
- 0,106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,100,19,171,1,0,0,0,0,0,0,1,
- 0,121,0,41,20,78,97,178,1,0,0,32,32,32,32,37,
- 115,32,91,45,45,117,115,101,114,45,98,97,115,101,93,32,
- 91,45,45,117,115,101,114,45,115,105,116,101,93,10,10,32,
- 32,32,32,87,105,116,104,111,117,116,32,97,114,103,117,109,
- 101,110,116,115,32,112,114,105,110,116,32,115,111,109,101,32,
- 117,115,101,102,117,108,32,105,110,102,111,114,109,97,116,105,
- 111,110,10,32,32,32,32,87,105,116,104,32,97,114,103,117,
- 109,101,110,116,115,32,112,114,105,110,116,32,116,104,101,32,
- 118,97,108,117,101,32,111,102,32,85,83,69,82,95,66,65,
- 83,69,32,97,110,100,47,111,114,32,85,83,69,82,95,83,
- 73,84,69,32,115,101,112,97,114,97,116,101,100,10,32,32,
- 32,32,98,121,32,39,37,115,39,46,10,10,32,32,32,32,
- 69,120,105,116,32,99,111,100,101,115,32,119,105,116,104,32,
- 45,45,117,115,101,114,45,98,97,115,101,32,111,114,32,45,
- 45,117,115,101,114,45,115,105,116,101,58,10,32,32,32,32,
- 32,32,48,32,45,32,117,115,101,114,32,115,105,116,101,32,
- 100,105,114,101,99,116,111,114,121,32,105,115,32,101,110,97,
- 98,108,101,100,10,32,32,32,32,32,32,49,32,45,32,117,
- 115,101,114,32,115,105,116,101,32,100,105,114,101,99,116,111,
- 114,121,32,105,115,32,100,105,115,97,98,108,101,100,32,98,
- 121,32,117,115,101,114,10,32,32,32,32,32,32,50,32,45,
- 32,117,115,101,114,32,115,105,116,101,32,100,105,114,101,99,
- 116,111,114,121,32,105,115,32,100,105,115,97,98,108,101,100,
- 32,98,121,32,115,117,112,101,114,32,117,115,101,114,10,32,
- 32,32,32,32,32,32,32,32,32,111,114,32,102,111,114,32,
- 115,101,99,117,114,105,116,121,32,114,101,97,115,111,110,115,
- 10,32,32,32,32,32,62,50,32,45,32,117,110,107,110,111,
- 119,110,32,101,114,114,111,114,10,32,32,32,32,114,60,0,
- 0,0,122,12,115,121,115,46,112,97,116,104,32,61,32,91,
- 122,4,32,32,32,32,218,1,44,218,1,93,99,1,0,0,
- 0,0,0,0,0,0,0,0,0,3,0,0,0,19,0,0,
- 0,243,72,0,0,0,151,0,124,0,129,32,116,0,0,0,
+ 100,2,171,1,0,0,0,0,0,0,1,0,121,0,116,12,
+ 0,0,0,0,0,0,0,0,128,22,116,1,0,0,0,0,
+ 0,0,0,0,106,14,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,100,17,171,1,0,0,0,0,
+ 0,0,1,0,121,0,116,1,0,0,0,0,0,0,0,0,
+ 106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,18,171,1,0,0,0,0,0,0,1,0,
+ 121,0,100,13,100,0,108,14,125,7,116,9,0,0,0,0,
+ 0,0,0,0,124,7,106,31,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,124,0,116,0,0,0,
0,0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,106,5,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,
- 171,1,0,0,0,0,0,0,114,1,121,1,121,2,41,3,
- 78,114,51,0,0,0,122,13,100,111,101,115,110,39,116,32,
- 101,120,105,115,116,41,3,114,17,0,0,0,114,18,0,0,
- 0,114,152,0,0,0,41,1,114,18,0,0,0,115,1,0,
- 0,0,32,114,12,0,0,0,114,51,0,0,0,122,23,95,
- 115,99,114,105,112,116,46,60,108,111,99,97,108,115,62,46,
- 101,120,105,115,116,115,148,2,0,0,115,29,0,0,0,128,
- 0,216,15,19,208,15,31,164,66,167,71,161,71,167,77,161,
- 77,176,36,212,36,55,216,23,31,224,23,38,114,14,0,0,
- 0,122,11,85,83,69,82,95,66,65,83,69,58,32,122,2,
- 32,40,218,1,41,122,11,85,83,69,82,95,83,73,84,69,
- 58,32,122,18,69,78,65,66,76,69,95,85,83,69,82,95,
- 83,73,84,69,58,32,114,2,0,0,0,122,11,45,45,117,
- 115,101,114,45,98,97,115,101,122,11,45,45,117,115,101,114,
- 45,115,105,116,101,70,114,128,0,0,0,233,3,0,0,0,
- 233,10,0,0,0,41,16,114,6,0,0,0,218,4,97,114,
- 103,118,114,146,0,0,0,114,150,0,0,0,114,9,0,0,
- 0,114,18,0,0,0,114,149,0,0,0,114,174,0,0,0,
- 114,44,0,0,0,114,145,0,0,0,114,148,0,0,0,114,
- 17,0,0,0,218,7,112,97,116,104,115,101,112,114,19,0,
- 0,0,218,8,116,101,120,116,119,114,97,112,218,6,100,101,
- 100,101,110,116,41,8,114,197,0,0,0,114,120,0,0,0,
- 218,9,117,115,101,114,95,98,97,115,101,114,153,0,0,0,
- 114,24,0,0,0,114,51,0,0,0,218,6,98,117,102,102,
- 101,114,114,23,1,0,0,115,8,0,0,0,32,32,32,32,
- 32,32,32,32,114,12,0,0,0,218,7,95,115,99,114,105,
- 112,116,114,27,1,0,0,125,2,0,0,115,105,1,0,0,
- 128,0,240,2,13,12,8,128,68,244,28,0,12,15,143,56,
- 137,56,144,65,144,66,136,60,128,68,217,11,15,220,20,31,
- 147,77,136,9,220,20,39,211,20,41,136,9,220,8,13,136,
- 110,212,8,29,220,19,22,151,56,148,56,136,67,221,12,17,
- 154,115,208,18,36,213,12,37,240,3,0,20,28,228,8,13,
- 136,99,140,10,242,2,4,9,39,244,10,0,9,14,144,11,
- 152,73,152,61,168,2,169,54,176,41,211,43,60,208,42,61,
- 184,81,208,14,63,212,8,64,220,8,13,144,11,152,73,152,
- 61,168,2,169,54,176,41,211,43,60,208,42,61,184,81,208,
- 14,63,212,8,64,220,8,13,208,16,34,212,35,51,208,34,
- 54,208,14,55,212,8,56,220,8,11,143,8,137,8,144,17,
- 140,11,224,13,15,128,70,216,7,20,152,4,209,7,28,216,
- 8,14,143,13,137,13,148,105,212,8,32,216,7,20,152,4,
- 209,7,28,216,8,14,143,13,137,13,148,105,212,8,32,225,
- 7,13,220,8,13,140,98,143,106,137,106,143,111,137,111,152,
- 102,211,14,37,212,8,38,221,11,27,220,12,15,143,72,137,
- 72,144,81,141,75,220,13,29,160,21,209,13,38,220,12,15,
- 143,72,137,72,144,81,141,75,220,13,29,208,13,37,220,12,
- 15,143,72,137,72,144,81,141,75,228,12,15,143,72,137,72,
- 144,81,141,75,227,8,23,220,8,13,136,104,143,111,137,111,
- 152,100,164,99,167,104,161,104,168,113,161,107,180,50,183,58,
- 177,58,208,37,62,209,30,62,211,14,63,212,8,64,220,8,
- 11,143,8,137,8,144,18,141,12,114,14,0,0,0,218,8,
- 95,95,109,97,105,110,95,95,114,16,0,0,0,41,40,114,
- 201,0,0,0,114,6,0,0,0,114,17,0,0,0,114,177,
- 0,0,0,114,175,0,0,0,114,68,0,0,0,114,65,0,
- 0,0,114,165,0,0,0,114,238,0,0,0,114,159,0,0,
- 0,114,149,0,0,0,114,148,0,0,0,114,145,0,0,0,
- 114,13,0,0,0,114,25,0,0,0,114,42,0,0,0,114,
- 49,0,0,0,114,56,0,0,0,114,95,0,0,0,114,103,
- 0,0,0,114,112,0,0,0,114,136,0,0,0,114,143,0,
- 0,0,114,146,0,0,0,114,150,0,0,0,114,154,0,0,
- 0,114,168,0,0,0,114,170,0,0,0,114,179,0,0,0,
- 114,194,0,0,0,114,198,0,0,0,114,219,0,0,0,114,
- 249,0,0,0,114,4,1,0,0,114,9,1,0,0,114,13,
- 1,0,0,114,7,0,0,0,218,7,110,111,95,115,105,116,
- 101,114,27,1,0,0,114,2,1,0,0,114,111,0,0,0,
- 114,14,0,0,0,114,12,0,0,0,218,8,60,109,111,100,
- 117,108,101,62,114,30,1,0,0,1,0,0,0,115,239,0,
- 0,0,240,3,1,1,1,241,2,69,1,1,4,243,78,2,
- 0,1,11,219,0,9,219,0,15,219,0,20,219,0,9,219,
- 0,11,240,6,0,13,16,143,74,137,74,152,3,159,15,153,
- 15,208,11,40,128,8,240,6,0,20,24,208,0,16,240,10,
- 0,13,17,128,9,216,12,16,128,9,242,6,2,1,40,242,
- 10,6,1,38,242,18,20,1,17,242,46,16,1,23,242,38,
- 10,1,13,242,26,63,1,23,243,68,2,23,1,23,242,52,
- 22,1,16,242,64,1,20,1,35,242,48,10,1,75,1,242,
- 26,10,1,21,242,26,15,1,21,242,34,13,1,23,243,30,
- 31,1,24,243,66,1,7,1,23,242,18,13,1,55,242,32,
- 18,1,21,242,42,1,1,44,242,6,57,1,48,242,118,1,
- 52,1,23,242,110,1,17,1,47,242,40,17,1,47,242,40,
- 27,1,28,240,62,0,8,11,135,121,129,121,215,7,24,210,
- 7,24,217,4,8,132,70,242,4,52,1,21,240,108,1,0,
- 4,12,136,122,210,3,25,217,4,11,133,73,240,3,0,4,
- 26,114,14,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,100,13,25,0,0,0,
+ 116,22,0,0,0,0,0,0,0,0,106,24,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,2,
+ 122,6,0,0,171,1,0,0,0,0,0,0,171,1,0,0,
+ 0,0,0,0,1,0,116,1,0,0,0,0,0,0,0,0,
+ 106,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,100,19,171,1,0,0,0,0,0,0,1,0,
+ 121,0,41,20,78,97,178,1,0,0,32,32,32,32,37,115,
+ 32,91,45,45,117,115,101,114,45,98,97,115,101,93,32,91,
+ 45,45,117,115,101,114,45,115,105,116,101,93,10,10,32,32,
+ 32,32,87,105,116,104,111,117,116,32,97,114,103,117,109,101,
+ 110,116,115,32,112,114,105,110,116,32,115,111,109,101,32,117,
+ 115,101,102,117,108,32,105,110,102,111,114,109,97,116,105,111,
+ 110,10,32,32,32,32,87,105,116,104,32,97,114,103,117,109,
+ 101,110,116,115,32,112,114,105,110,116,32,116,104,101,32,118,
+ 97,108,117,101,32,111,102,32,85,83,69,82,95,66,65,83,
+ 69,32,97,110,100,47,111,114,32,85,83,69,82,95,83,73,
+ 84,69,32,115,101,112,97,114,97,116,101,100,10,32,32,32,
+ 32,98,121,32,39,37,115,39,46,10,10,32,32,32,32,69,
+ 120,105,116,32,99,111,100,101,115,32,119,105,116,104,32,45,
+ 45,117,115,101,114,45,98,97,115,101,32,111,114,32,45,45,
+ 117,115,101,114,45,115,105,116,101,58,10,32,32,32,32,32,
+ 32,48,32,45,32,117,115,101,114,32,115,105,116,101,32,100,
+ 105,114,101,99,116,111,114,121,32,105,115,32,101,110,97,98,
+ 108,101,100,10,32,32,32,32,32,32,49,32,45,32,117,115,
+ 101,114,32,115,105,116,101,32,100,105,114,101,99,116,111,114,
+ 121,32,105,115,32,100,105,115,97,98,108,101,100,32,98,121,
+ 32,117,115,101,114,10,32,32,32,32,32,32,50,32,45,32,
+ 117,115,101,114,32,115,105,116,101,32,100,105,114,101,99,116,
+ 111,114,121,32,105,115,32,100,105,115,97,98,108,101,100,32,
+ 98,121,32,115,117,112,101,114,32,117,115,101,114,10,32,32,
+ 32,32,32,32,32,32,32,32,111,114,32,102,111,114,32,115,
+ 101,99,117,114,105,116,121,32,114,101,97,115,111,110,115,10,
+ 32,32,32,32,32,62,50,32,45,32,117,110,107,110,111,119,
+ 110,32,101,114,114,111,114,10,32,32,32,32,114,60,0,0,
+ 0,122,12,115,121,115,46,112,97,116,104,32,61,32,91,122,
+ 4,32,32,32,32,218,1,44,218,1,93,99,1,0,0,0,
+ 0,0,0,0,0,0,0,0,3,0,0,0,19,0,0,0,
+ 243,72,0,0,0,151,0,124,0,129,32,116,0,0,0,0,
+ 0,0,0,0,0,106,2,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,106,5,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,171,
+ 1,0,0,0,0,0,0,114,1,121,1,121,2,41,3,78,
+ 114,51,0,0,0,122,13,100,111,101,115,110,39,116,32,101,
+ 120,105,115,116,41,3,114,17,0,0,0,114,18,0,0,0,
+ 114,152,0,0,0,41,1,114,18,0,0,0,115,1,0,0,
+ 0,32,114,12,0,0,0,114,51,0,0,0,122,23,95,115,
+ 99,114,105,112,116,46,60,108,111,99,97,108,115,62,46,101,
+ 120,105,115,116,115,149,2,0,0,115,29,0,0,0,128,0,
+ 216,15,19,208,15,31,164,66,167,71,161,71,167,77,161,77,
+ 176,36,212,36,55,216,23,31,224,23,38,114,14,0,0,0,
+ 122,11,85,83,69,82,95,66,65,83,69,58,32,122,2,32,
+ 40,218,1,41,122,11,85,83,69,82,95,83,73,84,69,58,
+ 32,122,18,69,78,65,66,76,69,95,85,83,69,82,95,83,
+ 73,84,69,58,32,114,2,0,0,0,122,11,45,45,117,115,
+ 101,114,45,98,97,115,101,122,11,45,45,117,115,101,114,45,
+ 115,105,116,101,70,114,128,0,0,0,233,3,0,0,0,233,
+ 10,0,0,0,41,16,114,6,0,0,0,218,4,97,114,103,
+ 118,114,146,0,0,0,114,150,0,0,0,114,9,0,0,0,
+ 114,18,0,0,0,114,149,0,0,0,114,174,0,0,0,114,
+ 44,0,0,0,114,145,0,0,0,114,148,0,0,0,114,17,
+ 0,0,0,218,7,112,97,116,104,115,101,112,114,19,0,0,
+ 0,218,8,116,101,120,116,119,114,97,112,218,6,100,101,100,
+ 101,110,116,41,8,114,197,0,0,0,114,120,0,0,0,218,
+ 9,117,115,101,114,95,98,97,115,101,114,153,0,0,0,114,
+ 24,0,0,0,114,51,0,0,0,218,6,98,117,102,102,101,
+ 114,114,23,1,0,0,115,8,0,0,0,32,32,32,32,32,
+ 32,32,32,114,12,0,0,0,218,7,95,115,99,114,105,112,
+ 116,114,27,1,0,0,126,2,0,0,115,105,1,0,0,128,
+ 0,240,2,13,12,8,128,68,244,28,0,12,15,143,56,137,
+ 56,144,65,144,66,136,60,128,68,217,11,15,220,20,31,147,
+ 77,136,9,220,20,39,211,20,41,136,9,220,8,13,136,110,
+ 212,8,29,220,19,22,151,56,148,56,136,67,221,12,17,154,
+ 115,208,18,36,213,12,37,240,3,0,20,28,228,8,13,136,
+ 99,140,10,242,2,4,9,39,244,10,0,9,14,144,11,152,
+ 73,152,61,168,2,169,54,176,41,211,43,60,208,42,61,184,
+ 81,208,14,63,212,8,64,220,8,13,144,11,152,73,152,61,
+ 168,2,169,54,176,41,211,43,60,208,42,61,184,81,208,14,
+ 63,212,8,64,220,8,13,208,16,34,212,35,51,208,34,54,
+ 208,14,55,212,8,56,220,8,11,143,8,137,8,144,17,140,
+ 11,224,13,15,128,70,216,7,20,152,4,209,7,28,216,8,
+ 14,143,13,137,13,148,105,212,8,32,216,7,20,152,4,209,
+ 7,28,216,8,14,143,13,137,13,148,105,212,8,32,225,7,
+ 13,220,8,13,140,98,143,106,137,106,143,111,137,111,152,102,
+ 211,14,37,212,8,38,221,11,27,220,12,15,143,72,137,72,
+ 144,81,141,75,220,13,29,160,21,209,13,38,220,12,15,143,
+ 72,137,72,144,81,141,75,220,13,29,208,13,37,220,12,15,
+ 143,72,137,72,144,81,141,75,228,12,15,143,72,137,72,144,
+ 81,141,75,227,8,23,220,8,13,136,104,143,111,137,111,152,
+ 100,164,99,167,104,161,104,168,113,161,107,180,50,183,58,177,
+ 58,208,37,62,209,30,62,211,14,63,212,8,64,220,8,11,
+ 143,8,137,8,144,18,141,12,114,14,0,0,0,218,8,95,
+ 95,109,97,105,110,95,95,114,16,0,0,0,41,40,114,201,
+ 0,0,0,114,6,0,0,0,114,17,0,0,0,114,177,0,
+ 0,0,114,175,0,0,0,114,68,0,0,0,114,65,0,0,
+ 0,114,165,0,0,0,114,238,0,0,0,114,159,0,0,0,
+ 114,149,0,0,0,114,148,0,0,0,114,145,0,0,0,114,
+ 13,0,0,0,114,25,0,0,0,114,42,0,0,0,114,49,
+ 0,0,0,114,56,0,0,0,114,95,0,0,0,114,103,0,
+ 0,0,114,112,0,0,0,114,136,0,0,0,114,143,0,0,
+ 0,114,146,0,0,0,114,150,0,0,0,114,154,0,0,0,
+ 114,168,0,0,0,114,170,0,0,0,114,179,0,0,0,114,
+ 194,0,0,0,114,198,0,0,0,114,219,0,0,0,114,249,
+ 0,0,0,114,4,1,0,0,114,9,1,0,0,114,13,1,
+ 0,0,114,7,0,0,0,218,7,110,111,95,115,105,116,101,
+ 114,27,1,0,0,114,2,1,0,0,114,111,0,0,0,114,
+ 14,0,0,0,114,12,0,0,0,218,8,60,109,111,100,117,
+ 108,101,62,114,30,1,0,0,1,0,0,0,115,239,0,0,
+ 0,240,3,1,1,1,241,2,69,1,1,4,243,78,2,0,
+ 1,11,219,0,9,219,0,15,219,0,20,219,0,9,219,0,
+ 11,240,6,0,13,16,143,74,137,74,152,3,159,15,153,15,
+ 208,11,40,128,8,240,6,0,20,24,208,0,16,240,10,0,
+ 13,17,128,9,216,12,16,128,9,242,6,2,1,40,242,10,
+ 6,1,38,242,18,20,1,17,242,46,16,1,23,242,38,10,
+ 1,13,242,26,63,1,23,243,68,2,23,1,23,242,52,22,
+ 1,16,242,64,1,20,1,35,242,48,10,1,75,1,242,26,
+ 10,1,21,242,26,15,1,21,242,34,13,1,23,243,30,31,
+ 1,24,243,66,1,7,1,23,242,18,13,1,55,242,32,19,
+ 1,21,242,44,1,1,44,242,6,57,1,48,242,118,1,52,
+ 1,23,242,110,1,17,1,47,242,40,17,1,47,242,40,27,
+ 1,28,240,62,0,8,11,135,121,129,121,215,7,24,210,7,
+ 24,217,4,8,132,70,242,4,52,1,21,240,108,1,0,4,
+ 12,136,122,210,3,25,217,4,11,133,73,240,3,0,4,26,
+ 114,14,0,0,0,
};
diff --git a/contrib/tools/python3/Python/future.c b/contrib/tools/python3/Python/future.c
index d56f733096..998a7f740e 100644
--- a/contrib/tools/python3/Python/future.c
+++ b/contrib/tools/python3/Python/future.c
@@ -39,12 +39,20 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename)
} else if (strcmp(feature, "braces") == 0) {
PyErr_SetString(PyExc_SyntaxError,
"not a chance");
- PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1);
+ PyErr_RangedSyntaxLocationObject(filename,
+ name->lineno,
+ name->col_offset + 1,
+ name->end_lineno,
+ name->end_col_offset + 1);
return 0;
} else {
PyErr_Format(PyExc_SyntaxError,
UNDEFINED_FUTURE_FEATURE, feature);
- PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1);
+ PyErr_RangedSyntaxLocationObject(filename,
+ name->lineno,
+ name->col_offset + 1,
+ name->end_lineno,
+ name->end_col_offset + 1);
return 0;
}
}
diff --git a/contrib/tools/python3/Python/import.c b/contrib/tools/python3/Python/import.c
index 76b418840e..daac00593d 100644
--- a/contrib/tools/python3/Python/import.c
+++ b/contrib/tools/python3/Python/import.c
@@ -917,12 +917,14 @@ extensions_lock_release(void)
static void *
hashtable_key_from_2_strings(PyObject *str1, PyObject *str2, const char sep)
{
- Py_ssize_t str1_len, str2_len;
- const char *str1_data = PyUnicode_AsUTF8AndSize(str1, &str1_len);
- const char *str2_data = PyUnicode_AsUTF8AndSize(str2, &str2_len);
+ const char *str1_data = _PyUnicode_AsUTF8NoNUL(str1);
+ const char *str2_data = _PyUnicode_AsUTF8NoNUL(str2);
if (str1_data == NULL || str2_data == NULL) {
return NULL;
}
+ Py_ssize_t str1_len = strlen(str1_data);
+ Py_ssize_t str2_len = strlen(str2_data);
+
/* Make sure sep and the NULL byte won't cause an overflow. */
assert(SIZE_MAX - str1_len - str2_len > 2);
size_t size = str1_len + 1 + str2_len + 1;
@@ -3548,7 +3550,7 @@ _imp_find_frozen_impl(PyObject *module, PyObject *name, int withdata)
if (info.origname != NULL && info.origname[0] != '\0') {
origname = PyUnicode_FromString(info.origname);
if (origname == NULL) {
- Py_DECREF(data);
+ Py_XDECREF(data);
return NULL;
}
}
diff --git a/contrib/tools/python3/Python/pylifecycle.c b/contrib/tools/python3/Python/pylifecycle.c
index 6d580c6d48..e9c1a0d72d 100644
--- a/contrib/tools/python3/Python/pylifecycle.c
+++ b/contrib/tools/python3/Python/pylifecycle.c
@@ -650,6 +650,10 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
return status;
}
+ // This could be done in init_interpreter() (in pystate.c) if it
+ // didn't depend on interp->feature_flags being set already.
+ _PyObject_InitState(interp);
+
PyThreadState *tstate = _PyThreadState_New(interp);
if (tstate == NULL) {
return _PyStatus_ERR("can't make first thread");
@@ -2103,6 +2107,10 @@ new_interpreter(PyThreadState **tstate_p, const PyInterpreterConfig *config)
goto error;
}
+ // This could be done in init_interpreter() (in pystate.c) if it
+ // didn't depend on interp->feature_flags being set already.
+ _PyObject_InitState(interp);
+
status = init_interp_create_gil(tstate, config->gil);
if (_PyStatus_EXCEPTION(status)) {
goto error;
diff --git a/contrib/tools/python3/Python/pystate.c b/contrib/tools/python3/Python/pystate.c
index 93fbbaaf01..c829f64431 100644
--- a/contrib/tools/python3/Python/pystate.c
+++ b/contrib/tools/python3/Python/pystate.c
@@ -691,7 +691,9 @@ init_interpreter(PyInterpreterState *interp,
_obmalloc_pools_INIT(interp->obmalloc.pools);
memcpy(&interp->obmalloc.pools.used, temp, sizeof(temp));
}
- _PyObject_InitState(interp);
+
+ // We would call _PyObject_InitState() at this point
+ // if interp->feature_flags were alredy set.
_PyEval_InitState(interp, pending_lock);
_PyGC_InitState(&interp->gc);
@@ -1598,7 +1600,9 @@ tstate_delete_common(PyThreadState *tstate)
if (tstate->_status.bound_gilstate) {
unbind_gilstate_tstate(tstate);
}
- unbind_tstate(tstate);
+ if (tstate->_status.bound) {
+ unbind_tstate(tstate);
+ }
// XXX Move to PyThreadState_Clear()?
clear_datastack(tstate);
diff --git a/contrib/tools/python3/Python/traceback.c b/contrib/tools/python3/Python/traceback.c
index fdaf19d370..fba3594e97 100644
--- a/contrib/tools/python3/Python/traceback.c
+++ b/contrib/tools/python3/Python/traceback.c
@@ -1242,6 +1242,8 @@ done:
static void
dump_frame(int fd, _PyInterpreterFrame *frame)
{
+ assert(frame->owner != FRAME_OWNED_BY_CSTACK);
+
PyCodeObject *code = frame->f_code;
PUTS(fd, " File ");
if (code->co_filename != NULL
@@ -1315,24 +1317,27 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)
unsigned int depth = 0;
while (1) {
+ if (frame->owner == FRAME_OWNED_BY_CSTACK) {
+ /* Trampoline frame */
+ frame = frame->previous;
+ if (frame == NULL) {
+ break;
+ }
+
+ /* Can't have more than one shim frame in a row */
+ assert(frame->owner != FRAME_OWNED_BY_CSTACK);
+ }
+
if (MAX_FRAME_DEPTH <= depth) {
PUTS(fd, " ...\n");
break;
}
+
dump_frame(fd, frame);
frame = frame->previous;
if (frame == NULL) {
break;
}
- if (frame->owner == FRAME_OWNED_BY_CSTACK) {
- /* Trampoline frame */
- frame = frame->previous;
- }
- if (frame == NULL) {
- break;
- }
- /* Can't have more than one shim frame in a row */
- assert(frame->owner != FRAME_OWNED_BY_CSTACK);
depth++;
}
}
diff --git a/contrib/tools/python3/README.rst b/contrib/tools/python3/README.rst
index f7fbe2083d..c6dc40b17f 100644
--- a/contrib/tools/python3/README.rst
+++ b/contrib/tools/python3/README.rst
@@ -1,4 +1,4 @@
-This is Python version 3.12.7
+This is Python version 3.12.8
=============================
.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
@@ -64,7 +64,7 @@ the executable is called ``python.exe``; elsewhere it's just ``python``.
Building a complete Python installation requires the use of various
additional third-party libraries, depending on your build platform and
configure options. Not all standard library modules are buildable or
-useable on all platforms. Refer to the
+usable on all platforms. Refer to the
`Install dependencies <https://devguide.python.org/getting-started/setup-building.html#build-dependencies>`_
section of the `Developer Guide`_ for current detailed information on
dependencies for various Linux distributions and macOS.
diff --git a/contrib/tools/python3/bin/ya.make b/contrib/tools/python3/bin/ya.make
index 49dfb8b7c4..082185c090 100644
--- a/contrib/tools/python3/bin/ya.make
+++ b/contrib/tools/python3/bin/ya.make
@@ -2,9 +2,9 @@
PY3_PROGRAM(python3)
-VERSION(3.12.7)
+VERSION(3.12.8)
-ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.7.tar.gz)
+ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.8.tar.gz)
LICENSE(Python-2.0)
diff --git a/contrib/tools/python3/patches/124938.patch b/contrib/tools/python3/patches/124938.patch
deleted file mode 100644
index 218691a926..0000000000
--- a/contrib/tools/python3/patches/124938.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From 3e07c20277cda90941953426f7bddc71d009388a Mon Sep 17 00:00:00 2001
-From: "Miss Islington (bot)"
- <31488909+miss-islington@users.noreply.github.com>
-Date: Tue, 16 Jul 2024 15:42:49 +0200
-Subject: [PATCH] [3.12] gh-113993: For string interning, do not rely on (or
- assert) _Py_IsImmortal (GH-121358) (GH-121851)
-
-gh-113993: For string interning, do not rely on (or assert) _Py_IsImmortal (GH-121358)
-
-Older stable ABI extensions are allowed to make immortal objects mortal.
-Instead, use `_PyUnicode_STATE` (`interned` and `statically_allocated`).
-(cherry picked from commit 956270d08d5c23f59937e2f29f8e0b7f63d68afd)
-
-Co-authored-by: Petr Viktorin <encukou@gmail.com>
----
- ...024-07-04-13-23-27.gh-issue-113601.K3RLqp.rst | 2 ++
- Objects/unicodeobject.c | 16 ++++++++++------
- 2 files changed, 12 insertions(+), 6 deletions(-)
- create mode 100644 Misc/NEWS.d/next/C API/2024-07-04-13-23-27.gh-issue-113601.K3RLqp.rst
-
-diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
-index 815747e1b1ed9c..7bd4b221c83cf7 100644
---- a/Objects/unicodeobject.c
-+++ b/Objects/unicodeobject.c
-@@ -257,7 +257,8 @@ _PyUnicode_InternedSize_Immortal(void)
- // value, to help detect bugs in optimizations.
-
- while (PyDict_Next(dict, &pos, &key, &value)) {
-- if (_Py_IsImmortal(key)) {
-+ assert(PyUnicode_CHECK_INTERNED(key) != SSTATE_INTERNED_IMMORTAL_STATIC);
-+ if (PyUnicode_CHECK_INTERNED(key) == SSTATE_INTERNED_IMMORTAL) {
- count++;
- }
- }
-@@ -691,10 +692,14 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
-
- /* Check interning state */
- #ifdef Py_DEBUG
-+ // Note that we do not check `_Py_IsImmortal(op)`, since stable ABI
-+ // extensions can make immortal strings mortal (but with a high enough
-+ // refcount).
-+ // The other way is extremely unlikely (worth a potential failed assertion
-+ // in a debug build), so we do check `!_Py_IsImmortal(op)`.
- switch (PyUnicode_CHECK_INTERNED(op)) {
- case SSTATE_NOT_INTERNED:
- if (ascii->state.statically_allocated) {
-- CHECK(_Py_IsImmortal(op));
- // This state is for two exceptions:
- // - strings are currently checked before they're interned
- // - the 256 one-latin1-character strings
-@@ -710,11 +715,9 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
- break;
- case SSTATE_INTERNED_IMMORTAL:
- CHECK(!ascii->state.statically_allocated);
-- CHECK(_Py_IsImmortal(op));
- break;
- case SSTATE_INTERNED_IMMORTAL_STATIC:
- CHECK(ascii->state.statically_allocated);
-- CHECK(_Py_IsImmortal(op));
- break;
- default:
- Py_UNREACHABLE();
-@@ -1899,7 +1902,8 @@ unicode_write_cstr(PyObject *unicode, Py_ssize_t index,
- static PyObject*
- get_latin1_char(Py_UCS1 ch)
- {
-- return Py_NewRef(LATIN1(ch));
-+ PyObject *o = LATIN1(ch);
-+ return o;
- }
-
- static PyObject*
-@@ -15015,7 +15019,7 @@ intern_common(PyInterpreterState *interp, PyObject *s /* stolen */,
- {
- PyObject *r = (PyObject *)_Py_hashtable_get(INTERNED_STRINGS, s);
- if (r != NULL) {
-- assert(_Py_IsImmortal(r));
-+ assert(_PyUnicode_STATE(r).statically_allocated);
- assert(r != s); // r must be statically_allocated; s is not
- Py_DECREF(s);
- return Py_NewRef(r);
diff --git a/contrib/tools/python3/patches/pr127876-fix-segfault.patch b/contrib/tools/python3/patches/pr127876-fix-segfault.patch
new file mode 100644
index 0000000000..1cadd3e8ad
--- /dev/null
+++ b/contrib/tools/python3/patches/pr127876-fix-segfault.patch
@@ -0,0 +1,29 @@
+From c56b5256ff30f59955362ab536c6f089dd86f9fd Mon Sep 17 00:00:00 2001
+From: Alexander Shadchin <shadchin@yandex-team.com>
+Date: Thu, 12 Dec 2024 19:39:27 +0300
+Subject: [PATCH 1/2] Fix segmentation fault
+
+---
+ Objects/unicodeobject.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
+index 33c4747bbef488..e043015b49d510 100644
+--- a/Objects/unicodeobject.c
++++ b/Objects/unicodeobject.c
+@@ -1429,12 +1429,12 @@ _copy_characters(PyObject *to, Py_ssize_t to_start,
+ assert(PyUnicode_Check(from));
+ assert(from_start + how_many <= PyUnicode_GET_LENGTH(from));
+
+- assert(PyUnicode_Check(to));
+- assert(to_start + how_many <= PyUnicode_GET_LENGTH(to));
+-
+ if (how_many == 0)
+ return 0;
+
++ assert(PyUnicode_Check(to));
++ assert(to_start + how_many <= PyUnicode_GET_LENGTH(to));
++
+ from_kind = PyUnicode_KIND(from);
+ from_data = PyUnicode_DATA(from);
+ to_kind = PyUnicode_KIND(to);
diff --git a/contrib/tools/python3/ya.make b/contrib/tools/python3/ya.make
index 025d2180f3..c7cc5c443b 100644
--- a/contrib/tools/python3/ya.make
+++ b/contrib/tools/python3/ya.make
@@ -2,9 +2,9 @@
LIBRARY()
-VERSION(3.12.7)
+VERSION(3.12.8)
-ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.7.tar.gz)
+ORIGINAL_SOURCE(https://github.com/python/cpython/archive/v3.12.8.tar.gz)
LICENSE(Python-2.0)
diff --git a/library/cpp/regex/hyperscan/hyperscan.cpp b/library/cpp/regex/hyperscan/hyperscan.cpp
index 5b6069d4a3..0a4bfcb9ec 100644
--- a/library/cpp/regex/hyperscan/hyperscan.cpp
+++ b/library/cpp/regex/hyperscan/hyperscan.cpp
@@ -6,8 +6,6 @@
#include <contrib/libs/hyperscan/runtime_corei7/hs_runtime.h>
#include <contrib/libs/hyperscan/runtime_avx2/hs_common.h>
#include <contrib/libs/hyperscan/runtime_avx2/hs_runtime.h>
-#include <contrib/libs/hyperscan/runtime_avx512/hs_common.h>
-#include <contrib/libs/hyperscan/runtime_avx512/hs_runtime.h>
#include <util/generic/singleton.h>
#include <util/system/sanitizers.h>
@@ -19,10 +17,9 @@ namespace NHyperscan {
namespace NPrivate {
ERuntime DetectCurrentRuntime() {
- // TODO: Remove MSanIsOn check upon DEVTOOLSSUPPORT-49258 resolution
- if (NX86::HaveAVX512F() && NX86::HaveAVX512BW() && !NSan::MSanIsOn()) {
- return ERuntime::AVX512;
- } else if (NX86::HaveAVX() && NX86::HaveAVX2()) {
+ // NOTE: We explicitly disable AVX512 runtime, there are bugs with
+ // trivial string matching. See SPI-122953 & SPI-117618.
+ if (NX86::HaveAVX() && NX86::HaveAVX2()) {
return ERuntime::AVX2;
} else if (NX86::HaveSSE42() && NX86::HavePOPCNT()) {
return ERuntime::Corei7;
@@ -41,8 +38,6 @@ namespace NHyperscan {
return 0;
case ERuntime::AVX2:
return CPU_FEATURES_AVX2;
- case ERuntime::AVX512:
- return CPU_FEATURES_AVX512;
}
}
@@ -78,11 +73,6 @@ namespace NHyperscan {
SerializeDatabase = avx2_hs_serialize_database;
DeserializeDatabase = avx2_hs_deserialize_database;
break;
- case ERuntime::AVX512:
- AllocScratch = avx512_hs_alloc_scratch;
- Scan = avx512_hs_scan;
- SerializeDatabase = avx512_hs_serialize_database;
- DeserializeDatabase = avx512_hs_deserialize_database;
}
}
diff --git a/library/cpp/regex/hyperscan/hyperscan.h b/library/cpp/regex/hyperscan/hyperscan.h
index 1c8f404389..eae82fa384 100644
--- a/library/cpp/regex/hyperscan/hyperscan.h
+++ b/library/cpp/regex/hyperscan/hyperscan.h
@@ -11,7 +11,6 @@
namespace NHyperscan {
using TCPUFeatures = decltype(hs_platform_info_t::cpu_features);
constexpr TCPUFeatures CPU_FEATURES_AVX2 = HS_CPU_FEATURES_AVX2;
- constexpr TCPUFeatures CPU_FEATURES_AVX512 = HS_CPU_FEATURES_AVX512 | HS_CPU_FEATURES_AVX2;
template<typename TNativeDeleter, TNativeDeleter NativeDeleter>
class TDeleter {
@@ -35,7 +34,6 @@ namespace NHyperscan {
Core2 = 0,
Corei7 = 1,
AVX2 = 2,
- AVX512 = 3
};
ERuntime DetectCurrentRuntime();
diff --git a/library/cpp/regex/hyperscan/ut/hyperscan_ut.cpp b/library/cpp/regex/hyperscan/ut/hyperscan_ut.cpp
index 9caa53f2e7..75cd0bcc89 100644
--- a/library/cpp/regex/hyperscan/ut/hyperscan_ut.cpp
+++ b/library/cpp/regex/hyperscan/ut/hyperscan_ut.cpp
@@ -210,7 +210,6 @@ Y_UNIT_TEST_SUITE(HyperscanWrappers) {
ERuntime::Core2,
ERuntime::Corei7,
ERuntime::AVX2,
- ERuntime::AVX512
};
// Unfortunately, we cannot emulate runtimes with more capabilities than current machine.
diff --git a/library/cpp/regex/hyperscan/ya.make b/library/cpp/regex/hyperscan/ya.make
index 72abbef9a2..1a052ae214 100644
--- a/library/cpp/regex/hyperscan/ya.make
+++ b/library/cpp/regex/hyperscan/ya.make
@@ -5,7 +5,6 @@ PEERDIR(
contrib/libs/hyperscan/runtime_core2
contrib/libs/hyperscan/runtime_corei7
contrib/libs/hyperscan/runtime_avx2
- contrib/libs/hyperscan/runtime_avx512
)
SRCS(
diff --git a/library/cpp/tld/tlds-alpha-by-domain.txt b/library/cpp/tld/tlds-alpha-by-domain.txt
index 133ab40cd8..b37de20a95 100644
--- a/library/cpp/tld/tlds-alpha-by-domain.txt
+++ b/library/cpp/tld/tlds-alpha-by-domain.txt
@@ -1,4 +1,4 @@
-# Version 2024121600, Last Updated Mon Dec 16 07:07:02 2024 UTC
+# Version 2024122200, Last Updated Sun Dec 22 07:07:01 2024 UTC
AAA
AARP
ABB
diff --git a/library/cpp/yt/misc/typeid-inl.h b/library/cpp/yt/misc/typeid-inl.h
new file mode 100644
index 0000000000..a4518cfa46
--- /dev/null
+++ b/library/cpp/yt/misc/typeid-inl.h
@@ -0,0 +1,49 @@
+#ifndef TYPEID_INL_H_
+#error "Direct inclusion of this file is not allowed, include typeid.h"
+// For the sake of sane code completion.
+#include "typeid.h"
+#endif
+
+#include "port.h"
+
+#include <util/system/compiler.h>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace NDetail {
+
+template <class T>
+class TTypeidTag
+{ };
+
+} // namespace NDetail
+
+template <class T>
+const std::type_info& Typeid()
+{
+ if constexpr (requires { TypeidImpl(NDetail::TTypeidTag<T>()); }) {
+ return TypeidImpl(NDetail::TTypeidTag<T>());
+ } else {
+ return typeid(T);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+#undef YT_DECLARE_TYPEID
+#undef YT_DEFINE_TYPEID
+
+#define YT_DECLARE_TYPEID(type) \
+ [[maybe_unused]] YT_ATTRIBUTE_USED const std::type_info& TypeidImpl(::NYT::NDetail::TTypeidTag<type>);
+
+#define YT_DEFINE_TYPEID(type) \
+ [[maybe_unused]] YT_ATTRIBUTE_USED Y_FORCE_INLINE const std::type_info& TypeidImpl(::NYT::NDetail::TTypeidTag<type>) \
+ { \
+ return typeid(type); \
+ }
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/library/cpp/yt/misc/typeid.h b/library/cpp/yt/misc/typeid.h
new file mode 100644
index 0000000000..d4584e64f2
--- /dev/null
+++ b/library/cpp/yt/misc/typeid.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <typeinfo>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+// Enables accessing type_info for incomplete types.
+
+//! Place this macro in header file after forward-declaring a type.
+#define YT_DECLARE_TYPEID(type)
+
+//! Place this macro in header or source file after fully defining a type.
+#define YT_DEFINE_TYPEID(type)
+
+//! Equivalent to |typeid(T)| but also works for incomplete types
+//! annotated with YT_DECLARE_TYPEID.
+template <class T>
+const std::type_info& Typeid();
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
+
+#define TYPEID_INL_H_
+#include "typeid-inl.h"
+#undef TYPEID_INL_H_
diff --git a/yt/yt/library/stockpile/public.h b/library/cpp/yt/misc/unittests/typeid_sample.cpp
index f71c1dc7e4..9a3184e458 100644
--- a/yt/yt/library/stockpile/public.h
+++ b/library/cpp/yt/misc/unittests/typeid_sample.cpp
@@ -1,13 +1,13 @@
-#pragma once
-
-#include <yt/yt/core/misc/public.h>
+#include "typeid_sample.h"
namespace NYT {
////////////////////////////////////////////////////////////////////////////////
-DECLARE_REFCOUNTED_STRUCT(TStockpileConfig)
-DECLARE_REFCOUNTED_STRUCT(TStockpileDynamicConfig)
+struct TTypeidIncomplete
+{ };
+
+YT_DEFINE_TYPEID(TTypeidIncomplete);
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/library/program/private.h b/library/cpp/yt/misc/unittests/typeid_sample.h
index e6e06faf63..d6b5a288b5 100644
--- a/yt/yt/library/program/private.h
+++ b/library/cpp/yt/misc/unittests/typeid_sample.h
@@ -1,14 +1,16 @@
#pragma once
-#include "public.h"
-
-#include <yt/yt/core/logging/log.h>
+#include <library/cpp/yt/misc/typeid.h>
namespace NYT {
////////////////////////////////////////////////////////////////////////////////
-YT_DEFINE_GLOBAL(const NLogging::TLogger, ProgramLogger, "Program");
+struct TTypeidIncomplete;
+YT_DECLARE_TYPEID(TTypeidIncomplete);
+
+struct TTypeidComplete
+{ };
////////////////////////////////////////////////////////////////////////////////
diff --git a/library/cpp/yt/misc/unittests/typeid_ut.cpp b/library/cpp/yt/misc/unittests/typeid_ut.cpp
new file mode 100644
index 0000000000..3400c832e2
--- /dev/null
+++ b/library/cpp/yt/misc/unittests/typeid_ut.cpp
@@ -0,0 +1,25 @@
+#include "typeid_sample.h"
+
+#include <library/cpp/yt/misc/typeid.h>
+
+#include <library/cpp/testing/gtest/gtest.h>
+
+namespace NYT {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TTypeidTest, Complete)
+{
+ EXPECT_NE(std::string(Typeid<TTypeidComplete>().name()).find("TTypeidComplete"), std::string::npos);
+}
+
+TEST(TTypeidTest, Incomplete)
+{
+ EXPECT_NE(std::string(Typeid<TTypeidIncomplete>().name()).find("TTypeidIncomplete"), std::string::npos);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT
diff --git a/library/cpp/yt/misc/unittests/ya.make b/library/cpp/yt/misc/unittests/ya.make
index c914ca3061..ba7525f66a 100644
--- a/library/cpp/yt/misc/unittests/ya.make
+++ b/library/cpp/yt/misc/unittests/ya.make
@@ -12,6 +12,8 @@ SRCS(
strong_typedef_ut.cpp
tag_invoke_cpo_ut.cpp
tag_invoke_impl_ut.cpp
+ typeid_sample.cpp
+ typeid_ut.cpp
)
PEERDIR(
diff --git a/library/cpp/yt/stockpile/README.md b/library/cpp/yt/stockpile/README.md
deleted file mode 100644
index 6ee4cd1b1f..0000000000
--- a/library/cpp/yt/stockpile/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# stockpile
-
-При приближении к лимиту памяти в memory cgroup, linux запускает механизм direct reclaim,
-чтобы освободить свободную память. По опыту YT, direct reclaim очень сильно замедляет работу
-всего процесса.
-
-Проблема возникает не только, когда память занята анонимными страницами. 50% памяти контейнера
-может быть занято не dirty страницами page cache, но проблема всёравно будет проявляться. Например,
-если процесс активно читает файлы с диска без O_DIRECT, вся память очень быстро будет забита.
-
-Чтобы бороться с этой проблемой, в яндексовом ядре добавлена ручка `madvise(MADV_STOCKPILE)`.
-Больше подробностей в https://st.yandex-team.ru/KERNEL-186 \ No newline at end of file
diff --git a/library/cpp/yt/stockpile/stockpile.h b/library/cpp/yt/stockpile/stockpile.h
deleted file mode 100644
index fae1b3a569..0000000000
--- a/library/cpp/yt/stockpile/stockpile.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#pragma once
-
-#include <library/cpp/yt/cpu_clock/clock.h>
-
-#include <library/cpp/yt/misc/enum.h>
-
-#include <util/system/types.h>
-
-#include <util/generic/size_literals.h>
-
-#include <util/datetime/base.h>
-
-namespace NYT {
-
-////////////////////////////////////////////////////////////////////////////////
-
-DEFINE_ENUM(EStockpileStrategy,
- ((FixedBreaks) (0))
- ((FlooredLoad) (1))
- ((ProgressiveBackoff) (2))
-);
-
-////////////////////////////////////////////////////////////////////////////////
-
-struct TStockpileOptions
-{
- static constexpr i64 DefaultBufferSize = 4_GBs;
- i64 BufferSize = DefaultBufferSize;
-
- static constexpr int DefaultThreadCount = 4;
- int ThreadCount = DefaultThreadCount;
-
- static constexpr EStockpileStrategy DefaultStrategy = EStockpileStrategy::FixedBreaks;
- EStockpileStrategy Strategy = DefaultStrategy;
-
- static constexpr TDuration DefaultPeriod = TDuration::MilliSeconds(10);
- TDuration Period = DefaultPeriod;
-};
-
-////////////////////////////////////////////////////////////////////////////////
-
-class TStockpileManager
-{
-public:
- //! Configures the background stockpile threads.
- //! Safe to call multiple times.
- static void Reconfigure(TStockpileOptions options);
-};
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT
diff --git a/library/cpp/yt/stockpile/stockpile_linux.cpp b/library/cpp/yt/stockpile/stockpile_linux.cpp
deleted file mode 100644
index 8ae847dec7..0000000000
--- a/library/cpp/yt/stockpile/stockpile_linux.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-#include "stockpile.h"
-
-#include <library/cpp/yt/threading/spin_lock.h>
-
-#include <library/cpp/yt/misc/global.h>
-
-#include <library/cpp/yt/memory/leaky_singleton.h>
-
-#include <library/cpp/yt/logging/logger.h>
-
-#include <thread>
-
-#include <sys/mman.h>
-
-#include <util/system/thread.h>
-
-#include <string.h>
-
-namespace NYT {
-
-////////////////////////////////////////////////////////////////////////////////
-
-namespace {
-
-YT_DEFINE_GLOBAL(const NLogging::TLogger, Logger, "Stockpile");
-constexpr int MADV_STOCKPILE = 0x59410004;
-
-} // namespace
-
-class TStockpileManagerImpl
-{
-public:
- static TStockpileManagerImpl* Get()
- {
- return LeakySingleton<TStockpileManagerImpl>();
- }
-
- void Reconfigure(TStockpileOptions options)
- {
- auto guard = Guard(SpinLock_);
-
- Run_.store(false);
- for (const auto& thread : Threads_) {
- thread->join();
- }
-
- Threads_.clear();
- Run_.store(true);
-
- Options_ = options;
-
- for (int threadIndex = 0; threadIndex < Options_.ThreadCount; ++threadIndex) {
- Threads_.push_back(std::make_unique<std::thread>(&TStockpileManagerImpl::ThreadMain, this));
- }
- }
-
-private:
- DECLARE_LEAKY_SINGLETON_FRIEND();
-
- const i64 PageSize_ = sysconf(_SC_PAGESIZE);
-
- YT_DECLARE_SPIN_LOCK(NThreading::TSpinLock, SpinLock_);
- std::vector<std::unique_ptr<std::thread>> Threads_;
- TStockpileOptions Options_;
- std::atomic<bool> Run_ = false;
-
- void ThreadMain()
- {
- TThread::SetCurrentThreadName("Stockpile");
-
- auto bufferSize = Options_.BufferSize;
- auto period = Options_.Period;
-
- while (Run_.load()) {
- switch (Options_.Strategy) {
- case EStockpileStrategy::FixedBreaks:
- RunWithFixedBreaks(Options_.BufferSize, Options_.Period);
- break;
-
- case EStockpileStrategy::FlooredLoad:
- RunWithCappedLoad(Options_.BufferSize, Options_.Period);
- break;
-
- case EStockpileStrategy::ProgressiveBackoff:
- std::tie(bufferSize, period) = RunWithBackoffs(bufferSize, period);
- break;
-
- default:
- YT_ABORT();
- }
- }
- }
-
- void RunWithFixedBreaks(i64 bufferSize, TDuration period)
- {
- auto returnCode = -::madvise(nullptr, bufferSize, MADV_STOCKPILE);
- YT_LOG_DEBUG_IF(returnCode != 0, "System call \"madvise\" failed: %v", strerror(returnCode));
-
- Sleep(period);
- }
-
- void RunWithCappedLoad(i64 bufferSize, TDuration period)
- {
- auto started = GetApproximateCpuInstant();
-
- auto returnCode = -::madvise(nullptr, bufferSize, MADV_STOCKPILE);
- YT_LOG_DEBUG_IF(returnCode != 0, "System call \"madvise\" failed: %v", strerror(returnCode));
-
- auto duration = CpuDurationToDuration(GetApproximateCpuInstant() - started);
- if (duration < period) {
- Sleep(period - duration);
- }
- }
-
- std::pair<i64, TDuration> RunWithBackoffs(
- i64 adjustedBufferSize,
- TDuration adjustedPeriod)
- {
- int result = ::madvise(nullptr, adjustedBufferSize, MADV_STOCKPILE);
- if (result == 0) {
- Sleep(Options_.Period);
- return {Options_.BufferSize, Options_.Period};
- }
-
- YT_LOG_DEBUG("System call \"madvise\" failed: %v", strerror(errno));
- switch (errno) {
- case ENOMEM:
- if (adjustedBufferSize / 2 >= PageSize_) {
- // Immediately make an attempt to reclaim half as much.
- adjustedBufferSize = adjustedBufferSize / 2;
- } else {
- // Unless there is not even a single reclaimable page.
- Sleep(Options_.Period);
- }
- return {adjustedBufferSize, Options_.Period};
-
- case EAGAIN:
- case EINTR:
- Sleep(adjustedPeriod);
- return {Options_.BufferSize, adjustedPeriod + Options_.Period};
-
- default:
- Sleep(Options_.Period);
- return {Options_.BufferSize, Options_.Period};
- }
- }
-};
-
-////////////////////////////////////////////////////////////////////////////////
-
-void TStockpileManager::Reconfigure(TStockpileOptions options)
-{
- TStockpileManagerImpl::Get()->Reconfigure(std::move(options));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT
diff --git a/library/cpp/yt/stockpile/ya.make b/library/cpp/yt/stockpile/ya.make
deleted file mode 100644
index 36ce673ba6..0000000000
--- a/library/cpp/yt/stockpile/ya.make
+++ /dev/null
@@ -1,18 +0,0 @@
-LIBRARY()
-
-INCLUDE(${ARCADIA_ROOT}/library/cpp/yt/ya_cpp.make.inc)
-
-IF (OS_LINUX AND NOT SANITIZER_TYPE)
- SRCS(stockpile_linux.cpp)
-ELSE()
- SRCS(stockpile_other.cpp)
-ENDIF()
-
-PEERDIR(
- library/cpp/yt/misc
- library/cpp/yt/threading
- library/cpp/yt/logging
- library/cpp/yt/memory
-)
-
-END()
diff --git a/library/cpp/yt/yson_string/convert.cpp b/library/cpp/yt/yson_string/convert.cpp
index 68241adb78..1beb7cc4c7 100644
--- a/library/cpp/yt/yson_string/convert.cpp
+++ b/library/cpp/yt/yson_string/convert.cpp
@@ -11,12 +11,43 @@
#include <array>
+#include <util/string/escape.h>
+
#include <util/stream/mem.h>
namespace NYT::NYson {
////////////////////////////////////////////////////////////////////////////////
+namespace NDetail {
+
+size_t FloatToStringWithNanInf(double value, char* buf, size_t size)
+{
+ if (std::isfinite(value)) {
+ return FloatToString(value, buf, size);
+ }
+
+ static const TStringBuf nanLiteral = "%nan";
+ static const TStringBuf infLiteral = "%inf";
+ static const TStringBuf negativeInfLiteral = "%-inf";
+
+ TStringBuf str;
+ if (std::isnan(value)) {
+ str = nanLiteral;
+ } else if (std::isinf(value) && value > 0) {
+ str = infLiteral;
+ } else {
+ str = negativeInfLiteral;
+ }
+ YT_VERIFY(str.size() + 1 <= size);
+ ::memcpy(buf, str.data(), str.size() + 1);
+ return str.size();
+}
+
+} // namespace NDetail
+
+////////////////////////////////////////////////////////////////////////////////
+
template <>
TYsonString ConvertToYsonString<i8>(const i8& value)
{
@@ -385,4 +416,389 @@ TGuid ConvertFromYsonString<TGuid>(const TYsonStringBuf& str)
////////////////////////////////////////////////////////////////////////////////
+template <>
+TYsonString ConvertToTextYsonString<i8>(const i8& value)
+{
+ return ConvertToTextYsonString(static_cast<i64>(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<i32>(const i32& value)
+{
+ return ConvertToTextYsonString(static_cast<i64>(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<i64>(const i64& value)
+{
+ return TYsonString{::ToString(value)};
+}
+
+template <>
+TYsonString ConvertToTextYsonString<ui8>(const ui8& value)
+{
+ return ConvertToTextYsonString(static_cast<ui64>(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<ui32>(const ui32& value)
+{
+ return ConvertToTextYsonString(static_cast<ui64>(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<ui64>(const ui64& value)
+{
+ return TYsonString{::ToString(value) + 'u'};
+}
+
+template <>
+TYsonString ConvertToTextYsonString<TString>(const TString& value)
+{
+ return ConvertToTextYsonString(TStringBuf(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<std::string>(const std::string& value)
+{
+ return ConvertToTextYsonString(TStringBuf(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<TStringBuf>(const TStringBuf& value)
+{
+ return TYsonString(NYT::Format("\"%v\"", ::EscapeC(value)));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<std::string_view>(const std::string_view& value)
+{
+ return ConvertToTextYsonString(TStringBuf(value));
+}
+
+TYsonString ConvertToTextYsonString(const char* value)
+{
+ return ConvertToTextYsonString(TStringBuf(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<float>(const float& value)
+{
+ return ConvertToTextYsonString(static_cast<double>(value));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<double>(const double& value)
+{
+ char buf[256];
+ auto str = TStringBuf(buf, NDetail::FloatToStringWithNanInf(value, buf, sizeof(buf)));
+ auto ret = NYT::Format(
+ "%v%v",
+ str,
+ MakeFormatterWrapper([&] (TStringBuilderBase* builder) {
+ if (str.find('.') == TString::npos && str.find('e') == TString::npos && std::isfinite(value)) {
+ builder->AppendChar('.');
+ }
+ }));
+ return TYsonString(std::move(ret));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<bool>(const bool& value)
+{
+ return value
+ ? TYsonString(TStringBuf("%true"))
+ : TYsonString(TStringBuf("%false"));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<TInstant>(const TInstant& value)
+{
+ return ConvertToTextYsonString(value.ToString());
+}
+
+template <>
+TYsonString ConvertToTextYsonString<TDuration>(const TDuration& value)
+{
+ // ConvertTo does unchecked cast to i64 :(.
+ return ConvertToTextYsonString(static_cast<i64>(value.MilliSeconds()));
+}
+
+template <>
+TYsonString ConvertToTextYsonString<TGuid>(const TGuid& value)
+{
+ return ConvertToTextYsonString(NYT::ToString(value));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace {
+
+template <class TSomeInt>
+TSomeInt ReadTextUint(TStringBuf strBuf)
+{
+ // Drop 'u'
+ return ::FromString<TSomeInt>(TStringBuf{strBuf.data(), strBuf.length() - 1});
+}
+
+template <class TSomeInt>
+TSomeInt ReadTextInt(TStringBuf strBuf)
+{
+ return ::FromString<TSomeInt>(TStringBuf{strBuf.data(), strBuf.length()});
+}
+
+bool IsNumeric(TStringBuf strBuf)
+{
+ bool isNumeric = true;
+ bool isNegative = false;
+ for (int i = 0; i < std::ssize(strBuf); ++i) {
+ char c = strBuf[i];
+
+ if (!('0' <= c && c <= '9')) {
+ if (i == 0 && c == '-') {
+ isNegative = true;
+ continue;
+ }
+ if (i == std::ssize(strBuf) - 1 && c == 'u' && !isNegative) {
+ continue;
+ }
+ isNumeric = false;
+ break;
+ }
+ }
+
+ return isNumeric;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <class TSomeInt>
+TSomeInt ParseSomeIntFromTextYsonString(const TYsonStringBuf& str)
+{
+ YT_ASSERT(str.GetType() == EYsonType::Node);
+ auto strBuf = str.AsStringBuf();
+
+ if (std::ssize(strBuf) == 0 || !IsNumeric(strBuf)) {
+ throw TYsonLiteralParseException(NYT::Format(
+ "Unexpected %v\n"
+ "Value is not numeric",
+ strBuf));
+ }
+
+ if (strBuf.back() == 'u') {
+ // Drop 'u'
+ return ReadTextUint<TSomeInt>(strBuf);
+ } else {
+ return ReadTextInt<TSomeInt>(strBuf);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TString DoParseStringFromTextYson(TStringBuf strBuf)
+{
+ // Remove quotation marks.
+ return ::UnescapeC(TStringBuf{strBuf.data() + 1, strBuf.length() - 2});
+}
+
+TString ParseStringFromTextYsonString(const TYsonStringBuf& str)
+{
+ YT_ASSERT(str.GetType() == EYsonType::Node);
+ auto strBuf = str.AsStringBuf();
+ if (std::ssize(strBuf) < 2 || strBuf.front() != '\"' || strBuf.back() != '\"') {
+ throw TYsonLiteralParseException(Format(
+ "Unexpected %v\n"
+ "Text yson string must begin and end with \\\"",
+ strBuf));
+ }
+ return DoParseStringFromTextYson(strBuf);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+double ParseDoubleFromTextYsonString(const TYsonStringBuf& str)
+{
+ YT_ASSERT(str.GetType() == EYsonType::Node);
+ auto strBuf = str.AsStringBuf();
+
+ if (std::ssize(strBuf) < 2) {
+ throw TYsonLiteralParseException(Format(
+ "Incorrect remaining string length: expected at least 2, got %v",
+ std::ssize(strBuf)));
+ }
+
+ // Check special values first.
+ // %nan
+ // %inf, %+inf, %-inf
+ if (strBuf[0] == '%') {
+ switch (strBuf[1]) {
+ case '+':
+ case 'i':
+ return std::numeric_limits<double>::infinity();
+
+ case '-':
+ return -std::numeric_limits<double>::infinity();
+
+ case 'n':
+ return std::numeric_limits<double>::quiet_NaN();
+
+ default:
+ throw TYsonLiteralParseException(Format(
+ "Incorrect %%-literal %v",
+ strBuf));
+ }
+ }
+
+ return ::FromString<double>(strBuf);
+}
+
+} // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define PARSE_INT(type, underlyingType) \
+ template <> \
+ type ConvertFromTextYsonString<type>(const TYsonStringBuf& str) \
+ { \
+ try { \
+ return CheckedIntegralCast<type>(ParseSomeIntFromTextYsonString<underlyingType>(str)); \
+ } catch (const std::exception& ex) { \
+ throw TYsonLiteralParseException(ex, "Error parsing \"" #type "\" value from YSON"); \
+ } \
+ }
+
+PARSE_INT(i8, i64)
+PARSE_INT(i16, i64)
+PARSE_INT(i32, i64)
+PARSE_INT(i64, i64)
+PARSE_INT(ui8, ui64)
+PARSE_INT(ui16, ui64)
+PARSE_INT(ui32, ui64)
+PARSE_INT(ui64, ui64)
+
+#undef PARSE
+
+template <>
+TString ConvertFromTextYsonString<TString>(const TYsonStringBuf& str)
+{
+ try {
+ return ParseStringFromTextYsonString(str);
+ } catch (const std::exception& ex) {
+ throw TYsonLiteralParseException(ex, "Error parsing \"string\" value from YSON");
+ }
+}
+
+template <>
+std::string ConvertFromTextYsonString<std::string>(const TYsonStringBuf& str)
+{
+ return std::string{ConvertFromTextYsonString<TString>(str)};
+}
+
+template <>
+float ConvertFromTextYsonString<float>(const TYsonStringBuf& str)
+{
+ try {
+ return static_cast<float>(ParseDoubleFromTextYsonString(str));
+ } catch (const std::exception& ex) {
+ throw TYsonLiteralParseException(ex, "Error parsing \"float\" value from YSON");
+ }
+}
+
+template <>
+double ConvertFromTextYsonString<double>(const TYsonStringBuf& str)
+{
+ try {
+ return ParseDoubleFromTextYsonString(str);
+ } catch (const std::exception& ex) {
+ throw TYsonLiteralParseException(ex, "Error parsing \"double\" value from YSON");
+ }
+}
+
+template <>
+bool ConvertFromTextYsonString<bool>(const TYsonStringBuf& str)
+{
+ try {
+ YT_ASSERT(str.GetType() == EYsonType::Node);
+ auto strBuf = str.AsStringBuf();
+
+ if (std::ssize(strBuf) == 0) {
+ throw TYsonLiteralParseException("Empty string");
+ }
+
+ char ch = strBuf.front();
+
+ if (ch == '%') {
+ if (strBuf != "%true" && strBuf != "%false") {
+ throw TYsonLiteralParseException(Format(
+ "Expected %%true or %%false but found %v",
+ strBuf));
+ }
+ return strBuf == "%true";
+ }
+
+ if (ch == '\"') {
+ return ParseBool(DoParseStringFromTextYson(strBuf));
+ }
+
+ // NB(arkady-e1ppa): This check is linear in size(strBuf)
+ // And thus is tried as the last resort.
+ if (IsNumeric(strBuf)) {
+ auto checkValue = [&] (const auto& functor) {
+ auto value = functor(strBuf);
+ if (value != 0 && value != 1) {
+ throw TYsonLiteralParseException(Format(
+ "Expected 0 or 1 but found %v",
+ value));
+ }
+ return static_cast<bool>(value);
+ };
+
+ if (strBuf.back() == 'u') {
+ return checkValue(&ReadTextUint<ui64>);
+ } else {
+ return checkValue(&ReadTextInt<i64>);
+ }
+ }
+
+ throw TYsonLiteralParseException(Format(
+ "Unexpected %v\n"
+ "No known conversion to \"boolean\" value",
+ strBuf));
+ } catch (const std::exception& ex) {
+ throw TYsonLiteralParseException(ex, "Error parsing \"boolean\" value from YSON");
+ }
+}
+
+template <>
+TInstant ConvertFromTextYsonString<TInstant>(const TYsonStringBuf& str)
+{
+ try {
+ return TInstant::ParseIso8601(ParseStringFromTextYsonString(str));
+ } catch (const std::exception& ex) {
+ throw TYsonLiteralParseException(ex, "Error parsing \"instant\" value from YSON");
+ }
+}
+
+template <>
+TDuration ConvertFromTextYsonString<TDuration>(const TYsonStringBuf& str)
+{
+ try {
+ return TDuration::MilliSeconds(ParseSomeIntFromTextYsonString<i64>(str));
+ } catch (const std::exception& ex) {
+ throw TYsonLiteralParseException(ex, "Error parsing \"duration\" value from YSON");
+ }
+}
+
+template <>
+TGuid ConvertFromTextYsonString<TGuid>(const TYsonStringBuf& str)
+{
+ try {
+ return TGuid::FromString(ParseStringFromTextYsonString(str));
+ } catch (const std::exception& ex) {
+ throw TYsonLiteralParseException(ex, "Error parsing \"guid\" value from YSON");
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
} // namespace NYT::NYson
diff --git a/library/cpp/yt/yson_string/convert.h b/library/cpp/yt/yson_string/convert.h
index eedb0939e0..a51821fa30 100644
--- a/library/cpp/yt/yson_string/convert.h
+++ b/library/cpp/yt/yson_string/convert.h
@@ -13,6 +13,15 @@
namespace NYT::NYson {
////////////////////////////////////////////////////////////////////////////////
+
+namespace NDetail {
+
+size_t FloatToStringWithNanInf(double value, char* buf, size_t size);
+
+} // namespace NDetail
+
+////////////////////////////////////////////////////////////////////////////////
+
// Generic forward declarations.
template <class T>
@@ -24,6 +33,13 @@ TYsonString ConvertToYsonString(const T& value, EYsonFormat format);
template <class T>
T ConvertFromYsonString(const TYsonStringBuf& str);
+// TODO(arkady-e1ppa): Move those to library/cpp/yt/error
+// and swap to std::string(_view) to drop dep on library/cpp/yson_string.
+template <class T>
+TYsonString ConvertToTextYsonString(const T& value) = delete;
+template <class T>
+T ConvertFromTextYsonString(const TYsonStringBuf& str) = delete;
+
////////////////////////////////////////////////////////////////////////////////
// Basic specializations for ConvertToYsonString.
@@ -44,8 +60,6 @@ TYsonString ConvertToYsonString<ui64>(const ui64& value);
template <>
TYsonString ConvertToYsonString<TString>(const TString& value);
template <>
-TYsonString ConvertToYsonString<std::string>(const std::string& value);
-template <>
TYsonString ConvertToYsonString<TStringBuf>(const TStringBuf& value);
TYsonString ConvertToYsonString(const char* value);
@@ -93,6 +107,8 @@ ui64 ConvertFromYsonString<ui64>(const TYsonStringBuf& str);
template <>
TString ConvertFromYsonString<TString>(const TYsonStringBuf& str);
+template <>
+std::string ConvertFromYsonString<std::string>(const TYsonStringBuf& str);
template <>
float ConvertFromYsonString<float>(const TYsonStringBuf& str);
@@ -113,4 +129,85 @@ TGuid ConvertFromYsonString<TGuid>(const TYsonStringBuf& str);
////////////////////////////////////////////////////////////////////////////////
+template <>
+TYsonString ConvertToTextYsonString<i8>(const i8& value);
+template <>
+TYsonString ConvertToTextYsonString<i32>(const i32& value);
+template <>
+TYsonString ConvertToTextYsonString<i64>(const i64& value);
+
+template <>
+TYsonString ConvertToTextYsonString<ui8>(const ui8& value);
+template <>
+TYsonString ConvertToTextYsonString<ui32>(const ui32& value);
+template <>
+TYsonString ConvertToTextYsonString<ui64>(const ui64& value);
+
+template <>
+TYsonString ConvertToTextYsonString<TString>(const TString& value);
+template <>
+TYsonString ConvertToTextYsonString<std::string>(const std::string& value);
+template <>
+TYsonString ConvertToTextYsonString<TStringBuf>(const TStringBuf& value);
+template <>
+TYsonString ConvertToTextYsonString<std::string_view>(const std::string_view& value);
+TYsonString ConvertToTextYsonString(const char* value);
+
+template <>
+TYsonString ConvertToTextYsonString<float>(const float& value);
+template <>
+TYsonString ConvertToTextYsonString<double>(const double& value);
+
+template <>
+TYsonString ConvertToTextYsonString<bool>(const bool& value);
+
+template <>
+TYsonString ConvertToTextYsonString<TInstant>(const TInstant& value);
+
+template <>
+TYsonString ConvertToTextYsonString<TDuration>(const TDuration& value);
+
+template <>
+TYsonString ConvertToTextYsonString<TGuid>(const TGuid& value);
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <>
+i8 ConvertFromTextYsonString<i8>(const TYsonStringBuf& str);
+template <>
+i32 ConvertFromTextYsonString<i32>(const TYsonStringBuf& str);
+template <>
+i64 ConvertFromTextYsonString<i64>(const TYsonStringBuf& str);
+
+template <>
+ui8 ConvertFromTextYsonString<ui8>(const TYsonStringBuf& str);
+template <>
+ui32 ConvertFromTextYsonString<ui32>(const TYsonStringBuf& str);
+template <>
+ui64 ConvertFromTextYsonString<ui64>(const TYsonStringBuf& str);
+
+template <>
+TString ConvertFromTextYsonString<TString>(const TYsonStringBuf& str);
+template <>
+std::string ConvertFromTextYsonString<std::string>(const TYsonStringBuf& str);
+
+template <>
+float ConvertFromTextYsonString<float>(const TYsonStringBuf& str);
+template <>
+double ConvertFromTextYsonString<double>(const TYsonStringBuf& str);
+
+template <>
+bool ConvertFromTextYsonString<bool>(const TYsonStringBuf& str);
+
+template <>
+TInstant ConvertFromTextYsonString<TInstant>(const TYsonStringBuf& str);
+
+template <>
+TDuration ConvertFromTextYsonString<TDuration>(const TYsonStringBuf& str);
+
+template <>
+TGuid ConvertFromTextYsonString<TGuid>(const TYsonStringBuf& str);
+
+////////////////////////////////////////////////////////////////////////////////
+
} // namespace NYT::NYson
diff --git a/library/python/monlib/metric_registry.pxd b/library/python/monlib/metric_registry.pxd
index e57c963929..998acf3141 100644
--- a/library/python/monlib/metric_registry.pxd
+++ b/library/python/monlib/metric_registry.pxd
@@ -20,6 +20,7 @@ cdef extern from "library/cpp/monlib/metrics/metric_registry.h" namespace "NMoni
THistogram* HistogramRate(const TLabels&, IHistogramCollectorPtr collector) except +
void Reset() except +
+ void Clear() except +
void Accept(TInstant time, IMetricConsumer* consumer) except +
void Append(TInstant time, IMetricConsumer* consumer) except +
diff --git a/library/python/monlib/metric_registry.pyx b/library/python/monlib/metric_registry.pyx
index aae0a5962a..6ddf64cd78 100644
--- a/library/python/monlib/metric_registry.pyx
+++ b/library/python/monlib/metric_registry.pyx
@@ -264,6 +264,9 @@ cdef class MetricRegistry:
def reset(self):
self.__wrapped.Get().Reset()
+ def clear(self):
+ self.__wrapped.Get().Clear()
+
def accept(self, time, Encoder encoder):
cdef IMetricConsumer* ptr = <IMetricConsumer*>encoder.native()
timestamp = int((time - dt.datetime(1970, 1, 1)).total_seconds())
diff --git a/library/python/monlib/ut/py2/test.py b/library/python/monlib/ut/py2/test.py
index 2880120a12..4e389c47f1 100644
--- a/library/python/monlib/ut/py2/test.py
+++ b/library/python/monlib/ut/py2/test.py
@@ -311,3 +311,94 @@ EXPECTED = json.loads("""
def test_unistat_conversion(request):
j = loads(UNISTAT_DATA, from_format='unistat', to_format='json')
assert json.loads(j) == EXPECTED
+
+
+def test_reset_and_clear_registry():
+ registry = MetricRegistry()
+
+ c = registry.counter({'foo': 'counter'})
+ c.inc()
+
+ g = registry.gauge({'foo': 'gauge'})
+ g.set(20)
+
+ r = registry.rate({'foo': 'rate'})
+ r.add(10)
+
+ out = dumps(registry, format="json")
+ expected = json.loads("""{
+ "sensors":
+ [
+ {
+ "kind":"RATE",
+ "labels":
+ {
+ "foo":"rate"
+ },
+ "value":10
+ },
+ {
+ "kind":"COUNTER",
+ "labels":
+ {
+ "foo":"counter"
+ },
+ "value":1
+ },
+ {
+ "kind":"GAUGE",
+ "labels":
+ {
+ "foo":"gauge"
+ },
+ "value":20
+ }
+ ]
+ }
+ """)
+
+ j = json.loads(out)
+ assert j == expected
+
+ registry.reset()
+
+ out = dumps(registry, format="json")
+ expected = json.loads("""{
+ "sensors":
+ [
+ {
+ "kind":"RATE",
+ "labels":
+ {
+ "foo":"rate"
+ },
+ "value":0
+ },
+ {
+ "kind":"COUNTER",
+ "labels":
+ {
+ "foo":"counter"
+ },
+ "value":0
+ },
+ {
+ "kind":"GAUGE",
+ "labels":
+ {
+ "foo":"gauge"
+ },
+ "value":0
+ }
+ ]
+ }
+ """)
+
+ j = json.loads(out)
+ assert j == expected
+
+ registry.clear()
+
+ out = dumps(registry, format="json")
+ j = json.loads(out)
+ assert j == {}
diff --git a/library/python/monlib/ut/py3/test.py b/library/python/monlib/ut/py3/test.py
index 431241c657..5a68c1653e 100644
--- a/library/python/monlib/ut/py3/test.py
+++ b/library/python/monlib/ut/py3/test.py
@@ -309,3 +309,94 @@ EXPECTED = json.loads("""
def test_unistat_conversion(request):
j = loads(UNISTAT_DATA, from_format='unistat', to_format='json')
assert json.loads(j) == EXPECTED
+
+
+def test_reset_and_clear_registry():
+ registry = MetricRegistry()
+
+ c = registry.counter({'foo': 'counter'})
+ c.inc()
+
+ g = registry.gauge({'foo': 'gauge'})
+ g.set(20)
+
+ r = registry.rate({'foo': 'rate'})
+ r.add(10)
+
+ out = dumps(registry, format="json")
+ expected = json.loads("""{
+ "sensors":
+ [
+ {
+ "kind":"RATE",
+ "labels":
+ {
+ "foo":"rate"
+ },
+ "value":10
+ },
+ {
+ "kind":"COUNTER",
+ "labels":
+ {
+ "foo":"counter"
+ },
+ "value":1
+ },
+ {
+ "kind":"GAUGE",
+ "labels":
+ {
+ "foo":"gauge"
+ },
+ "value":20
+ }
+ ]
+ }
+ """)
+
+ j = json.loads(out)
+ assert j == expected
+
+ registry.reset()
+
+ out = dumps(registry, format="json")
+ expected = json.loads("""{
+ "sensors":
+ [
+ {
+ "kind":"RATE",
+ "labels":
+ {
+ "foo":"rate"
+ },
+ "value":0
+ },
+ {
+ "kind":"COUNTER",
+ "labels":
+ {
+ "foo":"counter"
+ },
+ "value":0
+ },
+ {
+ "kind":"GAUGE",
+ "labels":
+ {
+ "foo":"gauge"
+ },
+ "value":0
+ }
+ ]
+ }
+ """)
+
+ j = json.loads(out)
+ assert j == expected
+
+ registry.clear()
+
+ out = dumps(registry, format="json")
+ j = json.loads(out)
+ assert j == {}
diff --git a/util/generic/fwd.h b/util/generic/fwd.h
index 906203d60e..d1acc25256 100644
--- a/util/generic/fwd.h
+++ b/util/generic/fwd.h
@@ -8,6 +8,9 @@ template <typename TCharType, typename TTraits = std::char_traits<TCharType>>
class TBasicString;
using TString = TBasicString<char>;
+#ifndef TSTRING_IS_STD_STRING
+using TCowString = TBasicString<char>;
+#endif
using TUtf16String = TBasicString<wchar16>;
using TUtf32String = TBasicString<wchar32>;
diff --git a/util/generic/hash.pxd b/util/generic/hash.pxd
index 385c10d805..027e87d968 100644
--- a/util/generic/hash.pxd
+++ b/util/generic/hash.pxd
@@ -5,7 +5,6 @@ cdef extern from "util/generic/hash.h" nogil:
cppclass iterator:
pair[T, U]& operator*()
iterator operator++()
- iterator operator--()
bint operator==(iterator)
bint operator!=(iterator)
@@ -15,7 +14,6 @@ cdef extern from "util/generic/hash.h" nogil:
cppclass reverse_iterator:
pair[T, U]& operator*()
iterator operator++()
- iterator operator--()
bint operator==(reverse_iterator)
bint operator!=(reverse_iterator)
@@ -29,10 +27,6 @@ cdef extern from "util/generic/hash.h" nogil:
bint operator==(THashMap&)
bint operator!=(THashMap&)
- bint operator<(THashMap&)
- bint operator>(THashMap&)
- bint operator<=(THashMap&)
- bint operator>=(THashMap&)
U& at(T&) except +
iterator begin()
@@ -54,13 +48,7 @@ cdef extern from "util/generic/hash.h" nogil:
size_t max_size()
size_t size()
void swap(THashMap&)
- iterator lower_bound(T&)
- const_iterator const_lower_bound "lower_bound"(T&)
reverse_iterator rbegin()
const_reverse_iterator const_rbegin "rbegin"()
reverse_iterator rend()
const_reverse_iterator const_rend "rend"()
- iterator upper_bound(T&)
- const_iterator const_upper_bound "upper_bound"(T&)
- void max_load_factor(float)
- float max_load_factor()
diff --git a/util/generic/hash_set.pxd b/util/generic/hash_set.pxd
index d28d90cbe7..37da2a9da4 100644
--- a/util/generic/hash_set.pxd
+++ b/util/generic/hash_set.pxd
@@ -5,7 +5,6 @@ cdef extern from "util/generic/hash_set.h" nogil:
cppclass iterator:
T& operator*()
iterator operator++()
- iterator operator--()
bint operator==(iterator)
bint operator!=(iterator)
@@ -14,15 +13,10 @@ cdef extern from "util/generic/hash_set.h" nogil:
THashSet() except +
THashSet(THashSet&) except +
- THashSet(T* t) except +
THashSet& operator=(THashSet&)
bint operator==(THashSet&)
bint operator!=(THashSet&)
- bint operator<(THashSet&)
- bint operator>(THashSet&)
- bint operator<=(THashSet&)
- bint operator>=(THashSet&)
iterator begin()
const_iterator const_begin "begin"()
diff --git a/util/generic/ptr.pxd b/util/generic/ptr.pxd
index 16e8d19144..e407829519 100644
--- a/util/generic/ptr.pxd
+++ b/util/generic/ptr.pxd
@@ -36,7 +36,8 @@ cdef extern from "<util/generic/ptr.h>" nogil:
TAtomicSharedPtr(T*)
T& operator*()
T* Get()
- void Reset(T*)
+ void Reset(T*) # this is a fake signature as a workaround for Cython's inability to support implicit conversion T* -> TAtomicSharedPtr[T]
+ void Reset(TAtomicSharedPtr) noexcept
cdef TAtomicSharedPtr[T] MakeAtomicShared[T](...)
diff --git a/util/generic/string.pxd b/util/generic/string.pxd
index c25f7392a1..d9d5e014e1 100644
--- a/util/generic/string.pxd
+++ b/util/generic/string.pxd
@@ -29,8 +29,6 @@ cdef extern from "<util/generic/string.h>" nogil:
TString(size_t, char) except +
TString(char*, char*) except +
TString(TStringBuf&) except +
- TString(TStringBuf&, TStringBuf&) except +
- TString(TStringBuf&, TStringBuf&, TStringBuf&) except +
const char* c_str()
size_t max_size()
diff --git a/ya b/ya
index 47dda3c225..4994a53ab0 100755
--- a/ya
+++ b/ya
@@ -39,33 +39,33 @@ REGISTRY_ENDPOINT = os.environ.get("YA_REGISTRY_ENDPOINT", "https://devtools-reg
PLATFORM_MAP = {
"data": {
"darwin": {
- "md5": "06245598b6c10e195159e767ed35c3da",
+ "md5": "0dbb899ca6535e6fb9190ff174ddba64",
"urls": [
- f"{REGISTRY_ENDPOINT}/7688967236"
+ f"{REGISTRY_ENDPOINT}/7717386190"
]
},
"darwin-arm64": {
- "md5": "0d697b763c0e4ab01048691943cd30d4",
+ "md5": "a20ba3ccad87532e23d5273742aa7e20",
"urls": [
- f"{REGISTRY_ENDPOINT}/7688964649"
+ f"{REGISTRY_ENDPOINT}/7717385787"
]
},
"linux-aarch64": {
- "md5": "33d2ba456b1bdf00a8cf919f9bdf1b3d",
+ "md5": "bee36ad0cb272bcd8b3571123b42ed3e",
"urls": [
- f"{REGISTRY_ENDPOINT}/7688961562"
+ f"{REGISTRY_ENDPOINT}/7717385214"
]
},
"win32-clang-cl": {
- "md5": "30dd886c8a485be7b73f65bc8debffcc",
+ "md5": "09af264ef19e31e219cd062323f4b86c",
"urls": [
- f"{REGISTRY_ENDPOINT}/7688969209"
+ f"{REGISTRY_ENDPOINT}/7717386558"
]
},
"linux": {
- "md5": "45ca76bbc8194a302e9b8641925c2214",
+ "md5": "a6df5b2d99d6daee9c939154a3ea1231",
"urls": [
- f"{REGISTRY_ENDPOINT}/7688971317"
+ f"{REGISTRY_ENDPOINT}/7717387113"
]
}
}
diff --git a/ydb/ci/rightlib.txt b/ydb/ci/rightlib.txt
index c6149864c2..38580f8797 100644
--- a/ydb/ci/rightlib.txt
+++ b/ydb/ci/rightlib.txt
@@ -1 +1 @@
-bb0840c0025a75dd3b85b746ebcec7deb7d9fe1c
+b821606f7bd364dc755d37b5bcb3559130675364
diff --git a/yql/essentials/core/cbo/cbo_hints.cpp b/yql/essentials/core/cbo/cbo_hints.cpp
index 630bb3e6b0..3a022b36d0 100644
--- a/yql/essentials/core/cbo/cbo_hints.cpp
+++ b/yql/essentials/core/cbo/cbo_hints.cpp
@@ -6,9 +6,16 @@
using namespace NYql;
+TString ToLower(TString s) {
+ for (char& c: s) {
+ c = std::tolower(c);
+ }
+ return s;
+}
+
class TOptimizerHintsParser {
public:
- TOptimizerHintsParser(const TString& text)
+ TOptimizerHintsParser(const TString& text)
: Pos(-1)
, Size(static_cast<i32>(text.size()) - 1)
, Text(text)
@@ -45,9 +52,9 @@ private:
return labels;
}
- void JoinType() {
+ void JoinType() {
i32 beginPos = Pos + 1;
-
+
Keyword({"("});
i32 labelsBeginPos = Pos + 1;
@@ -59,17 +66,17 @@ private:
labels.pop_back();
Keyword({")"});
-
+
TVector<EJoinAlgoType> joinAlgos = {EJoinAlgoType::GraceJoin, EJoinAlgoType::LookupJoin, EJoinAlgoType::MapJoin};
- TVector<TString> joinAlgosStr = {"Shuffle", "Lookup", "Broadcast"};
+ TVector<TString> joinAlgosStr = {"shuffle", "lookup", "broadcast"};
for (const auto& [JoinType, joinAlgoStr]: Zip(joinAlgos, joinAlgosStr)) {
- if (reqJoinAlgoStr == joinAlgoStr) {
+ if (ToLower(reqJoinAlgoStr) == joinAlgoStr) {
Hints.JoinAlgoHints->PushBack(std::move(labels), JoinType, "JoinType" + Text.substr(beginPos, Pos - beginPos + 1));
return;
}
}
-
+
ParseError(Sprintf("Unknown JoinType: '%s', supported algos: [%s]", reqJoinAlgoStr.c_str(), JoinSeq(", ", joinAlgosStr).c_str()), Pos - reqJoinAlgoStr.size());
Y_UNREACHABLE();
}
@@ -82,7 +89,7 @@ private:
Keyword({")"});
Hints.JoinOrderHints->PushBack(
- std::move(joinOrderHintTree),
+ std::move(joinOrderHintTree),
leading? "Leading" : "JoinOrder" + Text.substr(beginPos, Pos - beginPos + 1)
);
}
@@ -100,7 +107,7 @@ private:
auto join = JoinOrderLabels();
Keyword({")"});
return join;
- }
+ }
ParseError(Sprintf("JoinOrder args must be either a relation, either a join, example of the format: JoinOrder(t1 (t2 t3))"), Pos);
Y_UNREACHABLE();
@@ -116,7 +123,7 @@ private:
char sign = signStr[0];
auto value = Number();
Keyword({")"});
-
+
TCardinalityHints::ECardOperation op;
switch (sign) {
case '+': { op = TCardinalityHints::ECardOperation::Add; break; }
@@ -138,7 +145,7 @@ private:
}
TString Label() {
- return Term(Letters() | Digits());
+ return Term(LabelAllowedSymbols());
}
std::optional<TString> MaybeLabel() {
@@ -170,7 +177,7 @@ private:
char Char(unsigned char c) {
std::bitset<256> allowed;
- allowed[c] = 1;
+ allowed[c] = 1;
return Char(allowed);
}
@@ -181,7 +188,7 @@ private:
}
return Char(allowed);
}
-
+
char Char(const std::bitset<256>& allowedSymbols = {}) {
Y_ENSURE(Pos < Size, Sprintf("Expected [%s], but got end of the string.", ""));
@@ -281,6 +288,12 @@ private:
return res;
}
+ constexpr std::bitset<256> LabelAllowedSymbols() {
+ auto labelSymbols = Digits() | Letters();
+ labelSymbols['_'] = 1;
+ return labelSymbols;
+ }
+
void SkipWhiteSpaces() {
for (; Pos < Size && isspace(Text[Pos + 1]); ++Pos) {
}
diff --git a/yql/essentials/core/services/mounts/ya.make b/yql/essentials/core/services/mounts/ya.make
index 660204f365..f6180eef6e 100644
--- a/yql/essentials/core/services/mounts/ya.make
+++ b/yql/essentials/core/services/mounts/ya.make
@@ -9,6 +9,7 @@ PEERDIR(
library/cpp/resource
yql/essentials/core/user_data
yql/essentials/core
+ yql/essentials/utils/log
)
YQL_LAST_ABI_VERSION()
diff --git a/yql/essentials/core/services/mounts/yql_mounts.cpp b/yql/essentials/core/services/mounts/yql_mounts.cpp
index 7d4052e8c8..683a7fe84b 100644
--- a/yql/essentials/core/services/mounts/yql_mounts.cpp
+++ b/yql/essentials/core/services/mounts/yql_mounts.cpp
@@ -1,6 +1,7 @@
#include "yql_mounts.h"
#include <yql/essentials/core/yql_library_compiler.h>
+#include <yql/essentials/utils/log/profile.h>
#include <library/cpp/resource/resource.h>
@@ -117,6 +118,7 @@ namespace NYql {
bool optimizeLibraries,
THolder<TExprContext> ownedCtx)
{
+ YQL_PROFILE_FUNC(DEBUG);
auto ctx = rawCtx ? rawCtx : ownedCtx.Get();
Y_ENSURE(ctx);
TUserDataTable mounts;
diff --git a/yql/essentials/core/type_ann/type_ann_core.cpp b/yql/essentials/core/type_ann/type_ann_core.cpp
index 3b6a626e07..d448c7ed54 100644
--- a/yql/essentials/core/type_ann/type_ann_core.cpp
+++ b/yql/essentials/core/type_ann/type_ann_core.cpp
@@ -5930,6 +5930,9 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
if (const auto status = ConvertChildrenToType(input, commonType, ctx.Expr); status != IGraphTransformer::TStatus::Ok)
return status;
+ if (warn) {
+ return IGraphTransformer::TStatus::Repeat;
+ }
const auto dictType = IsSet ?
ctx.Expr.MakeType<TDictExprType>(commonType, ctx.Expr.MakeType<TVoidExprType>()):
ctx.Expr.MakeType<TDictExprType>(commonType->Cast<TTupleExprType>()->GetItems().front(), commonType->Cast<TTupleExprType>()->GetItems().back());
@@ -5943,7 +5946,7 @@ template <NKikimr::NUdf::EDataSlot DataSlot>
return IGraphTransformer::TStatus::Error;
}
- return warn ? IGraphTransformer::TStatus::Repeat : IGraphTransformer::TStatus::Ok;
+ return IGraphTransformer::TStatus::Ok;
}
IGraphTransformer::TStatus DictFromKeysWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) {
diff --git a/yql/essentials/minikql/comp_nodes/ut/mkql_block_map_join_ut.cpp b/yql/essentials/minikql/comp_nodes/ut/mkql_block_map_join_ut.cpp
index f1cb1ea1aa..f4d60c3ef5 100644
--- a/yql/essentials/minikql/comp_nodes/ut/mkql_block_map_join_ut.cpp
+++ b/yql/essentials/minikql/comp_nodes/ut/mkql_block_map_join_ut.cpp
@@ -796,14 +796,17 @@ Y_UNIT_TEST_SUITE(TMiniKQLBlockMapJoinTestOptional) {
expectedSubkey.push_back(leftSubkeyInit[i]);
expectedValue.push_back(leftValueInit[i]);
- const auto& found = rightMap.find(*leftKeyInit[i]);
- if (found != rightMap.cend()) {
- expectedRightKey.push_back(found->first);
- expectedRightValue.push_back(found->second);
- } else {
- expectedRightKey.push_back(std::nullopt);
- expectedRightValue.push_back(std::nullopt);
+ if (leftKeyInit[i].has_value()) {
+ const auto& found = rightMap.find(*leftKeyInit[i]);
+ if (found != rightMap.cend()) {
+ expectedRightKey.push_back(found->first);
+ expectedRightValue.push_back(found->second);
+ continue;
+ }
}
+
+ expectedRightKey.push_back(std::nullopt);
+ expectedRightValue.push_back(std::nullopt);
}
auto [leftType, leftList] = ConvertVectorsToTuples(setup,
diff --git a/yql/essentials/minikql/dom/make.cpp b/yql/essentials/minikql/dom/make.cpp
index ca6864f759..8c1bfecfd0 100644
--- a/yql/essentials/minikql/dom/make.cpp
+++ b/yql/essentials/minikql/dom/make.cpp
@@ -133,6 +133,7 @@ TUnboxedValuePod MakeVariant(const ITypeInfoHelper* typeHelper, const TType* sha
TUnboxedValuePod MakeDom(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
switch (const auto kind = typeHelper->GetTypeKind(shape)) {
case ETypeKind::Null:
+ case ETypeKind::Void:
return MakeEntity();
case ETypeKind::EmptyList:
return SetNodeType<ENodeType::List>(TUnboxedValuePod::Void());
diff --git a/yql/essentials/minikql/dom/node.cpp b/yql/essentials/minikql/dom/node.cpp
index 6eabde3e4e..64458dea8d 100644
--- a/yql/essentials/minikql/dom/node.cpp
+++ b/yql/essentials/minikql/dom/node.cpp
@@ -133,6 +133,10 @@ bool TMapNode::IsSortedDict() const {
return true;
}
+TStringRef TMapNode::GetResourceTag() const {
+ return NodeResourceName;
+}
+
void* TMapNode::GetResource() {
return Items_;
}
diff --git a/yql/essentials/minikql/dom/node.h b/yql/essentials/minikql/dom/node.h
index 04a211fd09..5719709655 100644
--- a/yql/essentials/minikql/dom/node.h
+++ b/yql/essentials/minikql/dom/node.h
@@ -94,6 +94,8 @@ private:
bool IsSortedDict() const final;
+ TStringRef GetResourceTag() const final;
+
void* GetResource() final;
ui32 Count_;
diff --git a/yql/essentials/minikql/mkql_program_builder.cpp b/yql/essentials/minikql/mkql_program_builder.cpp
index 0b9197024d..895f2d590a 100644
--- a/yql/essentials/minikql/mkql_program_builder.cpp
+++ b/yql/essentials/minikql/mkql_program_builder.cpp
@@ -6243,7 +6243,7 @@ TRuntimeNode TProgramBuilder::MatchRecognizeCore(
callableBuilder.Add(NewDataLiteral(static_cast<i32>(skipTo.To)));
callableBuilder.Add(NewDataLiteral<NUdf::EDataSlot::String>(skipTo.Var));
}
- if constexpr (RuntimeVersion >= 53U) {
+ if constexpr (RuntimeVersion >= 54U) {
callableBuilder.Add(NewDataLiteral(static_cast<i32>(rowsPerMatch)));
callableBuilder.Add(NewList(outputColumnEntryType, outputColumnOrder));
}
diff --git a/yql/essentials/minikql/mkql_runtime_version.h b/yql/essentials/minikql/mkql_runtime_version.h
index b4fbc1951e..26cd1a8fcc 100644
--- a/yql/essentials/minikql/mkql_runtime_version.h
+++ b/yql/essentials/minikql/mkql_runtime_version.h
@@ -24,7 +24,7 @@ namespace NMiniKQL {
// 1. Bump this version every time incompatible runtime nodes are introduced.
// 2. Make sure you provide runtime node generation for previous runtime versions.
#ifndef MKQL_RUNTIME_VERSION
-#define MKQL_RUNTIME_VERSION 53U
+#define MKQL_RUNTIME_VERSION 54U
#endif
// History:
diff --git a/yql/essentials/parser/pg_catalog/catalog.cpp b/yql/essentials/parser/pg_catalog/catalog.cpp
index c631fca46b..40a2d3a52b 100644
--- a/yql/essentials/parser/pg_catalog/catalog.cpp
+++ b/yql/essentials/parser/pg_catalog/catalog.cpp
@@ -1,5 +1,6 @@
#include "catalog.h"
#include <yql/essentials/parser/pg_catalog/proto/pg_catalog.pb.h>
+#include <yql/essentials/utils/log/profile.h>
#include <util/generic/array_size.h>
#include <util/generic/utility.h>
#include <util/generic/hash.h>
@@ -3649,6 +3650,7 @@ ISqlLanguageParser* GetSqlLanguageParser() {
}
void LoadSystemFunctions(ISystemFunctionsParser& parser) {
+ YQL_PROFILE_FUNC(DEBUG);
auto& catalog = TCatalog::MutableInstance();
with_lock (catalog.ExtensionsGuard) {
if (catalog.State->SystemFunctionInit) {
@@ -3684,6 +3686,7 @@ void LoadSystemFunctions(ISystemFunctionsParser& parser) {
void RegisterExtensions(const TVector<TExtensionDesc>& extensions, bool typesOnly,
IExtensionSqlParser& parser, IExtensionLoader* loader) {
+ YQL_PROFILE_FUNC(DEBUG);
if (extensions.size() > MaximumExtensionsCount) {
throw yexception() << "Too many extensions: " << extensions.size();
}
diff --git a/yql/essentials/parser/pg_catalog/ya.make b/yql/essentials/parser/pg_catalog/ya.make
index f9aefb43aa..815bcaa340 100644
--- a/yql/essentials/parser/pg_catalog/ya.make
+++ b/yql/essentials/parser/pg_catalog/ya.make
@@ -23,6 +23,7 @@ PEERDIR(
yql/essentials/public/issue
library/cpp/digest/md5
yql/essentials/parser/pg_catalog/proto
+ yql/essentials/utils/log
)
END()
diff --git a/yql/essentials/parser/pg_wrapper/ut/codegen_ut.cpp b/yql/essentials/parser/pg_wrapper/ut/codegen_ut.cpp
index 50320e27dd..91536d2872 100644
--- a/yql/essentials/parser/pg_wrapper/ut/codegen_ut.cpp
+++ b/yql/essentials/parser/pg_wrapper/ut/codegen_ut.cpp
@@ -45,7 +45,7 @@ Y_UNIT_TEST_SUITE(TPgCodegen) {
void PgFuncImpl(EKernelFlavor flavor, bool constArg, bool fixed) {
const TString& name = fixed ? "date_eq" : "textout";
ICodegen::TPtr codegen;
- TExecFunc execFunc;
+ TExecFunc execFunc;
switch (flavor) {
case EKernelFlavor::Indirect: {
if (fixed) {
@@ -94,10 +94,10 @@ Y_UNIT_TEST_SUITE(TPgCodegen) {
nullBuilder.Reserve(length);
auto out = dataBuilder.MutableData();
auto outNulls = nullBuilder.MutableData();
- NUdf::TFixedSizeBlockReader<ui64, false> reader1;
- NUdf::TFixedSizeBlockReader<ui64, false> reader2;
+ NUdf::TFixedSizeBlockReader<ui64, false> reader1;
+ NUdf::TFixedSizeBlockReader<ui64, false> reader2;
const auto& array1 = *batch.values[0].array();
- const auto ptr1 = array1.GetValues<ui64>(1);
+ const auto ptr1 = array1.GetValues<ui64>(1);
if (batch.values[1].is_array()) {
const auto& array2 = *batch.values[1].array();
const auto ptr2 = array2.GetValues<ui64>(1);
@@ -222,7 +222,7 @@ Y_UNIT_TEST_SUITE(TPgCodegen) {
arrow::compute::ExecBatch batch(std::move(batchArgs), N);
{
- Cout << "begin...\n";
+ Cout << "begin...\n";
TSimpleTimer timer;
for (size_t count = 0; count < (fixed ? 10000 : 1000); ++count) {
arrow::Datum res;
@@ -247,7 +247,7 @@ Y_UNIT_TEST_SUITE(TPgCodegen) {
Y_UNIT_TEST(PgFixedFuncIndirect) {
PgFuncImpl(EKernelFlavor::Indirect, false, true);
PgFuncImpl(EKernelFlavor::Indirect, true, true);
- }
+ }
#if !defined(USE_SLOW_PG_KERNELS)
Y_UNIT_TEST(PgFixedFuncCpp) {
@@ -255,19 +255,21 @@ Y_UNIT_TEST_SUITE(TPgCodegen) {
PgFuncImpl(EKernelFlavor::Cpp, true, true);
}
+#if defined(YQL_USE_PG_BC)
Y_UNIT_TEST(PgFixedFuncBC) {
PgFuncImpl(EKernelFlavor::BitCode, false, true);
PgFuncImpl(EKernelFlavor::BitCode, true, true);
}
-#endif
+#endif
+#endif
Y_UNIT_TEST(PgStrFuncIdeal) {
PgFuncImpl(EKernelFlavor::Ideal, false, false);
- }
+ }
Y_UNIT_TEST(PgStrFuncDefArg) {
PgFuncImpl(EKernelFlavor::DefArg, false, false);
- }
+ }
Y_UNIT_TEST(PgStrFuncIndirect) {
PgFuncImpl(EKernelFlavor::Indirect, false, false);
@@ -278,9 +280,11 @@ Y_UNIT_TEST_SUITE(TPgCodegen) {
PgFuncImpl(EKernelFlavor::Cpp, false, false);
}
+#if defined(YQL_USE_PG_BC)
Y_UNIT_TEST(PgStrFuncBC) {
PgFuncImpl(EKernelFlavor::BitCode, false, false);
}
#endif
+#endif
}
diff --git a/yql/essentials/parser/pg_wrapper/ut/ya.make b/yql/essentials/parser/pg_wrapper/ut/ya.make
index 4dc451e52f..37d3514757 100644
--- a/yql/essentials/parser/pg_wrapper/ut/ya.make
+++ b/yql/essentials/parser/pg_wrapper/ut/ya.make
@@ -35,6 +35,12 @@ PEERDIR(
YQL_LAST_ABI_VERSION()
+IF (YQL_USE_PG_BC)
+ CFLAGS(
+ -DYQL_USE_PG_BC
+ )
+ENDIF()
+
IF (MKQL_RUNTIME_VERSION)
CFLAGS(
-DMKQL_RUNTIME_VERSION=$MKQL_RUNTIME_VERSION
diff --git a/yql/essentials/parser/pg_wrapper/ya.make b/yql/essentials/parser/pg_wrapper/ya.make
index cf31405feb..7ea0ecfa7a 100644
--- a/yql/essentials/parser/pg_wrapper/ya.make
+++ b/yql/essentials/parser/pg_wrapper/ya.make
@@ -64,9 +64,11 @@ ENDIF()
IF (NOT OS_WINDOWS AND NOT SANITIZER_TYPE AND NOT BUILD_TYPE == "DEBUG")
IF (NOT BUILD_POSTGRES_ONLY)
+IF (YQL_USE_PG_BC)
USE_LLVM_BC14()
INCLUDE(pg_bc.all.inc)
ENDIF()
+ENDIF()
ELSE()
CFLAGS(-DUSE_SLOW_PG_KERNELS)
ENDIF()
diff --git a/yql/essentials/providers/common/udf_resolve/yql_outproc_udf_resolver.cpp b/yql/essentials/providers/common/udf_resolve/yql_outproc_udf_resolver.cpp
index f02a666e5c..9e13ad766b 100644
--- a/yql/essentials/providers/common/udf_resolve/yql_outproc_udf_resolver.cpp
+++ b/yql/essentials/providers/common/udf_resolve/yql_outproc_udf_resolver.cpp
@@ -174,8 +174,9 @@ public:
bool needLibrary = false;
for (auto& m : *import->Modules) {
if (requiredLoadedModules.contains(m)) {
- YQL_ENSURE(import->Block->Type == EUserDataType::PATH);
- path2LoadedImport[import->Block->Data] = import;
+ if (import->Block->Type == EUserDataType::PATH) {
+ path2LoadedImport[import->Block->Data] = import;
+ }
}
if (requiredExternalModules.contains(m)) {
diff --git a/yql/essentials/providers/pure/ut/ya.make b/yql/essentials/providers/pure/ut/ya.make
new file mode 100644
index 0000000000..770076756e
--- /dev/null
+++ b/yql/essentials/providers/pure/ut/ya.make
@@ -0,0 +1,23 @@
+UNITTEST_FOR(yql/essentials/providers/pure)
+
+SIZE(MEDIUM)
+
+SRCS(
+ yql_pure_provider_ut.cpp
+)
+
+PEERDIR(
+ yql/essentials/core/facade
+ yql/essentials/public/result_format
+ yql/essentials/minikql/invoke_builtins
+ yql/essentials/minikql
+ yql/essentials/minikql/comp_nodes/llvm14
+ yql/essentials/minikql/invoke_builtins/llvm14
+ yql/essentials/sql/pg_dummy
+ yql/essentials/public/udf/service/exception_policy
+ library/cpp/yson/node
+)
+
+YQL_LAST_ABI_VERSION()
+
+END()
diff --git a/yql/essentials/providers/pure/ut/yql_pure_provider_ut.cpp b/yql/essentials/providers/pure/ut/yql_pure_provider_ut.cpp
new file mode 100644
index 0000000000..c2d66c002a
--- /dev/null
+++ b/yql/essentials/providers/pure/ut/yql_pure_provider_ut.cpp
@@ -0,0 +1,270 @@
+#include "yql_pure_provider.h"
+
+#include <library/cpp/testing/unittest/registar.h>
+#include <yql/essentials/core/facade/yql_facade.h>
+#include <yql/essentials/minikql/invoke_builtins/mkql_builtins.h>
+#include <yql/essentials/minikql/mkql_function_registry.h>
+#include <yql/essentials/public/result_format/yql_result_format_response.h>
+
+#include <library/cpp/yson/node/node_io.h>
+
+#include <util/system/user.h>
+#include <util/string/strip.h>
+
+namespace NYql {
+
+namespace {
+
+struct TSettings {
+ bool SExpr = false;
+ bool Pretty = false;
+};
+
+TString Run(const TString& query, TSettings settings = {}) {
+ auto functionRegistry = NKikimr::NMiniKQL::CreateFunctionRegistry(NKikimr::NMiniKQL::CreateBuiltinRegistry());
+ TVector<TDataProviderInitializer> dataProvidersInit;
+ dataProvidersInit.push_back(GetPureDataProviderInitializer());
+ TProgramFactory factory(true, functionRegistry.Get(), 0ULL, dataProvidersInit, "ut");
+ TProgramPtr program = factory.Create("-stdin-", query);
+ program->ConfigureYsonResultFormat(settings.Pretty ? NYson::EYsonFormat::Pretty : NYson::EYsonFormat::Text);
+ bool parseRes;
+ if (settings.SExpr) {
+ parseRes = program->ParseYql();
+ } else {
+ parseRes = program->ParseSql();
+ }
+
+ if (!parseRes) {
+ TStringStream err;
+ program->PrintErrorsTo(err);
+ UNIT_FAIL(err.Str());
+ }
+
+ if (!program->Compile(GetUsername())) {
+ TStringStream err;
+ program->PrintErrorsTo(err);
+ UNIT_FAIL(err.Str());
+ }
+
+ TProgram::TStatus status = program->Run(GetUsername());
+ if (status == TProgram::TStatus::Error) {
+ TStringStream err;
+ program->PrintErrorsTo(err);
+ UNIT_FAIL(err.Str());
+ }
+
+ return program->ResultsAsString();
+}
+
+}
+
+Y_UNIT_TEST_SUITE(TPureProviderTests) {
+ Y_UNIT_TEST(SExpr) {
+ const auto s = R"(
+ (
+ (let result_sink (DataSink 'result))
+ (let output (Int32 '1))
+ (let world (Write! world result_sink (Key) output '('('type))))
+ (return (Commit! world result_sink))
+ )
+
+ )";
+ const auto expectedRes = R"(
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "DataType";
+ "Int32"
+ ];
+ "Data" = "1"
+ }
+ ]
+ }
+]
+ )";
+ auto res = Run(s, TSettings{.SExpr = true, .Pretty = true});
+ UNIT_ASSERT_NO_DIFF(res, Strip(expectedRes));
+ }
+
+ Y_UNIT_TEST(Sql0Rows) {
+ const auto s = "select * from (select 1 as x) limit 0";
+ const auto expectedRes = R"(
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "x";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = []
+ }
+ ]
+ }
+]
+ )";
+ auto res = Run(s, TSettings{.Pretty = true});
+ UNIT_ASSERT_NO_DIFF(res, Strip(expectedRes));
+ }
+
+ void Sql1RowImpl(const TString& query) {
+ const auto expectedRes = R"(
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "x";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ "1"
+ ]
+ ]
+ }
+ ]
+ }
+]
+ )";
+ auto res = Run(query, TSettings{.Pretty = true});
+ UNIT_ASSERT_NO_DIFF(res, Strip(expectedRes));
+ }
+
+ Y_UNIT_TEST(Sql1Row_LLVM_On) {
+ const auto s = "pragma config.flags(\"LLVM\",\"--dump-stats\");select 1 as x";
+ Sql1RowImpl(s);
+ }
+
+ Y_UNIT_TEST(Sql1Row_LLVM_Off) {
+ const auto s = "pragma config.flags(\"LLVM\",\"OFF\");select 1 as x";
+ Sql1RowImpl(s);
+ }
+
+ Y_UNIT_TEST(Sql2Rows) {
+ const auto s = "select 1 as x union all select 2 as x order by x";
+ const auto expectedRes = R"(
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "x";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ "1"
+ ];
+ [
+ "2"
+ ]
+ ]
+ }
+ ]
+ }
+]
+ )";
+ auto res = Run(s, TSettings{.Pretty = true});
+ UNIT_ASSERT_NO_DIFF(res, Strip(expectedRes));
+ }
+
+ Y_UNIT_TEST(TruncateRows) {
+ const auto s = "select x from (select ListFromRange(1,2000) as x) flatten by x";
+ auto res = Run(s);
+ auto respList = NResult::ParseResponse(NYT::NodeFromYsonString(res));
+ UNIT_ASSERT_VALUES_EQUAL(respList.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(respList[0].Writes.size(), 1);
+ UNIT_ASSERT(respList[0].Writes[0].IsTruncated);
+ }
+
+ Y_UNIT_TEST(TruncateBytes) {
+ const auto s = "select '" + TString(1000000, 'a') + "' as x, 1 as y union all select '' as x, 2 as y order by y";
+ auto res = Run(s);
+ auto respList = NResult::ParseResponse(NYT::NodeFromYsonString(res));
+ UNIT_ASSERT_VALUES_EQUAL(respList.size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(respList[0].Writes.size(), 1);
+ UNIT_ASSERT(respList[0].Writes[0].IsTruncated);
+ }
+
+ Y_UNIT_TEST(ColumnOrder) {
+ const auto s = "pragma OrderedColumns;select 1 as y, 2 as x";
+ const auto expectedRes = R"(
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "y";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ];
+ [
+ "x";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ "1";
+ "2"
+ ]
+ ]
+ }
+ ]
+ }
+]
+ )";
+ auto res = Run(s, TSettings{.Pretty = true});
+ UNIT_ASSERT_NO_DIFF(res, Strip(expectedRes));
+ }
+}
+
+} // namespace NYql
diff --git a/yql/essentials/providers/pure/ya.make b/yql/essentials/providers/pure/ya.make
index 2ce55fd588..d7bbf0e5ab 100644
--- a/yql/essentials/providers/pure/ya.make
+++ b/yql/essentials/providers/pure/ya.make
@@ -26,3 +26,7 @@ PEERDIR(
YQL_LAST_ABI_VERSION()
END()
+
+RECURSE_FOR_TESTS(
+ ut
+)
diff --git a/yql/essentials/providers/pure/yql_pure_provider.cpp b/yql/essentials/providers/pure/yql_pure_provider.cpp
index b1c65f71e1..8257951be0 100644
--- a/yql/essentials/providers/pure/yql_pure_provider.cpp
+++ b/yql/essentials/providers/pure/yql_pure_provider.cpp
@@ -62,7 +62,32 @@ public:
return SyncError();
}
+ const bool isList = lambda.Ref().GetTypeAnn()->GetKind() == ETypeAnnotationKind::List;
auto optimized = lambda.Ptr();
+ auto source1 = ctx.Builder(lambda.Pos())
+ .Callable("Take")
+ .Callable(0, "SourceOf")
+ .Callable(0, "StreamType")
+ .Callable(0, "NullType")
+ .Seal()
+ .Seal()
+ .Seal()
+ .Callable(1, "Uint64")
+ .Atom(0, "1")
+ .Seal()
+ .Seal()
+ .Build();
+
+ optimized = ctx.Builder(lambda.Pos())
+ .Callable(isList ? "FlatMap" : "Map")
+ .Add(0, source1)
+ .Lambda(1)
+ .Param("x")
+ .Set(optimized)
+ .Seal()
+ .Seal()
+ .Build();
+
bool hasNonDeterministicFunctions;
auto status = PeepHoleOptimizeNode(optimized, optimized, ctx, *State_->Types, nullptr, hasNonDeterministicFunctions);
if (status.Level == IGraphTransformer::TStatus::Error) {
@@ -124,26 +149,37 @@ public:
TStringOutput dataOut(data);
TCountingOutput dataCountingOut(&dataOut);
NYson::TYsonWriter dataWriter(&dataCountingOut, NCommon::GetYsonFormat(fillSettings), ::NYson::EYsonType::Node, false);
- if (type->IsList()) {
- auto inputType = AS_TYPE(TListType, type)->GetItemType();
+ YQL_ENSURE(type->IsStream());
+ auto itemType = AS_TYPE(TStreamType, type)->GetItemType();
+ if (isList) {
TMaybe<ui64> rowsLimit = fillSettings.RowsLimitPerWrite;
TMaybe<ui64> bytesLimit = fillSettings.AllResultsBytesLimit;
- TMaybe<TVector<ui32>> structPositions = NCommon::CreateStructPositions(inputType, &columns);
+ TMaybe<TVector<ui32>> structPositions = NCommon::CreateStructPositions(itemType, &columns);
dataWriter.OnBeginList();
- const auto it = value.GetListIterator();
ui64 rows = 0;
- for (NUdf::TUnboxedValue item; it.Next(item); ++rows) {
+ for (;;) {
+ NUdf::TUnboxedValue item;
+ auto status = value.Fetch(item);
+ if (status == NUdf::EFetchStatus::Finish) {
+ break;
+ }
+
+ YQL_ENSURE(status == NUdf::EFetchStatus::Ok);
if ((rowsLimit && rows >= *rowsLimit) || (bytesLimit && dataCountingOut.Counter() >= *bytesLimit)) {
truncated = true;
break;
}
dataWriter.OnListItem();
- NCommon::WriteYsonValue(dataWriter, item, inputType, structPositions.Get());
+ NCommon::WriteYsonValue(dataWriter, item, itemType, structPositions.Get());
+ ++rows;
}
dataWriter.OnEndList();
} else {
- NCommon::WriteYsonValue(dataWriter, value, type, nullptr);
+ NUdf::TUnboxedValue item;
+ YQL_ENSURE(value.Fetch(item) == NUdf::EFetchStatus::Ok);
+ NCommon::WriteYsonValue(dataWriter, item, itemType, nullptr);
+ YQL_ENSURE(value.Fetch(item) == NUdf::EFetchStatus::Finish);
}
writer.OnKeyedItem("Data");
diff --git a/yql/essentials/sql/v1/SQLv1.g.in b/yql/essentials/sql/v1/SQLv1.g.in
index 670ad27e3e..61e7dc6f25 100644
--- a/yql/essentials/sql/v1/SQLv1.g.in
+++ b/yql/essentials/sql/v1/SQLv1.g.in
@@ -825,8 +825,8 @@ alter_table_alter_index_action:
drop_table_stmt: DROP (TABLE | TABLESTORE | EXTERNAL TABLE) (IF EXISTS)? simple_table_ref;
-create_user_stmt: CREATE USER role_name create_user_option?;
-alter_user_stmt: ALTER USER role_name (WITH? create_user_option | RENAME TO role_name);
+create_user_stmt: CREATE USER role_name create_user_option*;
+alter_user_stmt: ALTER USER role_name (WITH? create_user_option+ | RENAME TO role_name);
create_group_stmt: CREATE GROUP role_name (WITH USER role_name (COMMA role_name)* COMMA?)?;
alter_group_stmt: ALTER GROUP role_name ((ADD|DROP) USER role_name (COMMA role_name)* COMMA? | RENAME TO role_name);
@@ -834,7 +834,9 @@ alter_group_stmt: ALTER GROUP role_name ((ADD|DROP) USER role_name (COMMA role_n
drop_role_stmt: DROP (USER|GROUP) (IF EXISTS)? role_name (COMMA role_name)* COMMA?;
role_name: an_id_or_type | bind_parameter;
-create_user_option: ENCRYPTED? PASSWORD expr;
+create_user_option: password_option | login_option;
+password_option: ENCRYPTED? PASSWORD expr;
+login_option: LOGIN | NOLOGIN;
grant_permissions_stmt: GRANT permission_name_target ON an_id_schema (COMMA an_id_schema)* TO role_name (COMMA role_name)* COMMA? (WITH GRANT OPTION)?;
revoke_permissions_stmt: REVOKE (GRANT OPTION FOR)? permission_name_target ON an_id_schema (COMMA an_id_schema)* FROM role_name (COMMA role_name)*;
@@ -1368,6 +1370,7 @@ keyword_as_compat:
| LEGACY
| LIKE
| LOCAL
+ | LOGIN
| MANAGE
| MATCH
| MATCHES
@@ -1380,6 +1383,7 @@ keyword_as_compat:
// | NATURAL
| NEXT
| NO
+ | NOLOGIN
// | NOTNULL
| NULLS
| OBJECT
@@ -1592,6 +1596,7 @@ keyword_compat: (
| LEGACY
| LIKE
| LOCAL
+ | LOGIN
| MANAGE
| MATCH
| MATCHES
@@ -1604,6 +1609,7 @@ keyword_compat: (
| NATURAL
| NEXT
| NO
+ | NOLOGIN
| NOTNULL
| NULLS
| OBJECT
@@ -1949,6 +1955,7 @@ LIKE: L I K E;
LIMIT: L I M I T;
LIST: L I S T;
LOCAL: L O C A L;
+LOGIN: L O G I N;
MANAGE: M A N A G E;
MATCH: M A T C H;
MATCHES: M A T C H E S;
@@ -1961,6 +1968,7 @@ NANOSECONDS: N A N O S E C O N D S;
NATURAL: N A T U R A L;
NEXT: N E X T;
NO: N O;
+NOLOGIN: N O L O G I N;
NOT: N O T;
NOTNULL: N O T N U L L;
NULL: N U L L;
diff --git a/yql/essentials/sql/v1/SQLv1Antlr4.g.in b/yql/essentials/sql/v1/SQLv1Antlr4.g.in
index 89131437e9..96e450501c 100644
--- a/yql/essentials/sql/v1/SQLv1Antlr4.g.in
+++ b/yql/essentials/sql/v1/SQLv1Antlr4.g.in
@@ -824,8 +824,8 @@ alter_table_alter_index_action:
drop_table_stmt: DROP (TABLE | TABLESTORE | EXTERNAL TABLE) (IF EXISTS)? simple_table_ref;
-create_user_stmt: CREATE USER role_name create_user_option?;
-alter_user_stmt: ALTER USER role_name (WITH? create_user_option | RENAME TO role_name);
+create_user_stmt: CREATE USER role_name create_user_option*;
+alter_user_stmt: ALTER USER role_name (WITH? create_user_option+ | RENAME TO role_name);
create_group_stmt: CREATE GROUP role_name (WITH USER role_name (COMMA role_name)* COMMA?)?;
alter_group_stmt: ALTER GROUP role_name ((ADD|DROP) USER role_name (COMMA role_name)* COMMA? | RENAME TO role_name);
@@ -833,7 +833,9 @@ alter_group_stmt: ALTER GROUP role_name ((ADD|DROP) USER role_name (COMMA role_n
drop_role_stmt: DROP (USER|GROUP) (IF EXISTS)? role_name (COMMA role_name)* COMMA?;
role_name: an_id_or_type | bind_parameter;
-create_user_option: ENCRYPTED? PASSWORD expr;
+create_user_option: password_option | login_option;
+password_option: ENCRYPTED? PASSWORD expr;
+login_option: LOGIN | NOLOGIN;
grant_permissions_stmt: GRANT permission_name_target ON an_id_schema (COMMA an_id_schema)* TO role_name (COMMA role_name)* COMMA? (WITH GRANT OPTION)?;
revoke_permissions_stmt: REVOKE (GRANT OPTION FOR)? permission_name_target ON an_id_schema (COMMA an_id_schema)* FROM role_name (COMMA role_name)*;
@@ -1367,6 +1369,7 @@ keyword_as_compat:
| LEGACY
| LIKE
| LOCAL
+ | LOGIN
| MANAGE
| MATCH
| MATCHES
@@ -1379,6 +1382,7 @@ keyword_as_compat:
// | NATURAL
| NEXT
| NO
+ | NOLOGIN
// | NOTNULL
| NULLS
| OBJECT
@@ -1591,6 +1595,7 @@ keyword_compat: (
| LEGACY
| LIKE
| LOCAL
+ | LOGIN
| MANAGE
| MATCH
| MATCHES
@@ -1603,6 +1608,7 @@ keyword_compat: (
| NATURAL
| NEXT
| NO
+ | NOLOGIN
| NOTNULL
| NULLS
| OBJECT
@@ -1948,6 +1954,7 @@ LIKE: L I K E;
LIMIT: L I M I T;
LIST: L I S T;
LOCAL: L O C A L;
+LOGIN: L O G I N;
MANAGE: M A N A G E;
MATCH: M A T C H;
MATCHES: M A T C H E S;
@@ -1960,6 +1967,7 @@ NANOSECONDS: N A N O S E C O N D S;
NATURAL: N A T U R A L;
NEXT: N E X T;
NO: N O;
+NOLOGIN: N O L O G I N;
NOT: N O T;
NOTNULL: N O T N U L L;
NULL: N U L L;
diff --git a/yql/essentials/sql/v1/format/sql_format.cpp b/yql/essentials/sql/v1/format/sql_format.cpp
index b330800734..b7a8d5c48d 100644
--- a/yql/essentials/sql/v1/format/sql_format.cpp
+++ b/yql/essentials/sql/v1/format/sql_format.cpp
@@ -276,6 +276,11 @@ TTokenIterator GetNextStatementBegin(TTokenIterator begin, TTokenIterator end) {
continue;
}
if (curr->Name == "SEMICOLON") {
+ auto next = SkipWS(curr + 1, end);
+ while (next != end && next->Name == "COMMENT" && curr->Line == next->Line) {
+ curr = next;
+ next = SkipWS(next + 1, end);
+ }
++curr;
break;
}
diff --git a/yql/essentials/sql/v1/format/sql_format_ut.h b/yql/essentials/sql/v1/format/sql_format_ut.h
index f44ab557c3..bd62ddf368 100644
--- a/yql/essentials/sql/v1/format/sql_format_ut.h
+++ b/yql/essentials/sql/v1/format/sql_format_ut.h
@@ -73,8 +73,13 @@ Y_UNIT_TEST(DropRole) {
Y_UNIT_TEST(CreateUser) {
TCases cases = {
- {"use plato;create user user;","USE plato;\n\nCREATE USER user;\n"},
- {"use plato;create user user encrypted password 'foo';","USE plato;\n\nCREATE USER user ENCRYPTED PASSWORD 'foo';\n"},
+ {"use plato;create user user;", "USE plato;\n\nCREATE USER user;\n"},
+ {"use plato;create user user encrypted password 'foo';", "USE plato;\n\nCREATE USER user ENCRYPTED PASSWORD 'foo';\n"},
+ {"use plato;CREATE USER user1;", "USE plato;\n\nCREATE USER user1;\n"},
+ {"use plato;create user user1 encrypted password '123' login;", "USE plato;\n\nCREATE USER user1 ENCRYPTED PASSWORD '123' LOGIN;\n"},
+ {"use plato;cREATE USER user1 PASSWORD '123' NOLOGIN;", "USE plato;\n\nCREATE USER user1 PASSWORD '123' NOLOGIN;\n"},
+ {"use plato;CREATE USER user1 LOGIN;", "USE plato;\n\nCREATE USER user1 LOGIN;\n"},
+ {"use plato;CREATE USER user1 NOLOGIN;", "USE plato;\n\nCREATE USER user1 NOLOGIN;\n"},
};
TSetup setup;
@@ -97,6 +102,7 @@ Y_UNIT_TEST(AlterUser) {
{"use plato;alter user user rename to user;","USE plato;\n\nALTER USER user RENAME TO user;\n"},
{"use plato;alter user user encrypted password 'foo';","USE plato;\n\nALTER USER user ENCRYPTED PASSWORD 'foo';\n"},
{"use plato;alter user user with encrypted password 'foo';","USE plato;\n\nALTER USER user WITH ENCRYPTED PASSWORD 'foo';\n"},
+ {"use plato;ALTER USER user1 NOLOGIN;", "USE plato;\n\nALTER USER user1 NOLOGIN;\n"},
};
TSetup setup;
@@ -211,6 +217,8 @@ Y_UNIT_TEST(NamedNode) {
"$a = (\n\tSELECT\n\t\t*\n\tFROM\n\t\t$t -- comment\n);\n"},
{"-- comment\r\r\r$a=1;",
"-- comment\r\n$a = 1;\n"},
+ {"$a=1;-- comment\n$b=2;/* comment */ /* comment */\n$c = 3;/* comment */ -- comment",
+ "$a = 1; -- comment\n$b = 2; /* comment */ /* comment */\n$c = 3; /* comment */ -- comment\n"},
};
TSetup setup;
diff --git a/yql/essentials/sql/v1/node.h b/yql/essentials/sql/v1/node.h
index fe6ddb08ac..609cd82dd4 100644
--- a/yql/essentials/sql/v1/node.h
+++ b/yql/essentials/sql/v1/node.h
@@ -1305,6 +1305,14 @@ namespace NSQLTranslationV1 {
TMaybe<TDeferredAtom> Password;
bool IsPasswordEncrypted = false;
TVector<TDeferredAtom> Roles;
+
+ enum class ETypeOfLogin {
+ Undefined,
+ Login,
+ NoLogin
+ };
+
+ ETypeOfLogin CanLogin = ETypeOfLogin::Undefined;
};
struct TSequenceParameters {
diff --git a/yql/essentials/sql/v1/select.cpp b/yql/essentials/sql/v1/select.cpp
index 1442215e15..4f5db44069 100644
--- a/yql/essentials/sql/v1/select.cpp
+++ b/yql/essentials/sql/v1/select.cpp
@@ -1869,6 +1869,10 @@ public:
return false;
}
+ if (!ctx.SimpleColumns && Columns.QualifiedAll && !columnName.Contains('.')) {
+ return false;
+ }
+
if (!Columns.IsColumnPossible(ctx, columnName)) {
return true;
}
diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp
index 5252417526..a2dd6cc68a 100644
--- a/yql/essentials/sql/v1/sql_query.cpp
+++ b/yql/essentials/sql/v1/sql_query.cpp
@@ -583,7 +583,7 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core&
break;
}
case TRule_sql_stmt_core::kAltSqlStmtCore22: {
- // create_user_stmt: CREATE USER role_name create_user_option?;
+ // create_user_stmt: CREATE USER role_name (create_user_option)*;
Ctx.BodyPart();
auto& node = core.GetAlt_sql_stmt_core22().GetRule_create_user_stmt1();
@@ -604,9 +604,19 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core&
}
TMaybe<TRoleParameters> roleParams;
- if (node.HasBlock4()) {
+ const auto& options = node.GetBlock4();
+
+ if (options.size() > 0) {
roleParams.ConstructInPlace();
- if (!RoleParameters(node.GetBlock4().GetRule_create_user_option1(), *roleParams)) {
+ std::vector<TRule_create_user_option> opts;
+ opts.reserve(options.size());
+ for (const auto& opt : options) {
+ opts.push_back(opt.GetRule_create_user_option1());
+ }
+
+ bool isCreateUser = true;
+
+ if (!RoleParameters(opts, *roleParams, isCreateUser)) {
return false;
}
}
@@ -615,7 +625,7 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core&
break;
}
case TRule_sql_stmt_core::kAltSqlStmtCore23: {
- // alter_user_stmt: ALTER USER role_name (WITH? create_user_option | RENAME TO role_name);
+ // alter_user_stmt: ALTER USER role_name (WITH? create_user_option+ | RENAME TO role_name);
Ctx.BodyPart();
auto& node = core.GetAlt_sql_stmt_core23().GetRule_alter_user_stmt1();
@@ -641,7 +651,17 @@ bool TSqlQuery::Statement(TVector<TNodePtr>& blocks, const TRule_sql_stmt_core&
switch (node.GetBlock4().Alt_case()) {
case TRule_alter_user_stmt_TBlock4::kAlt1: {
TRoleParameters roleParams;
- if (!RoleParameters(node.GetBlock4().GetAlt1().GetRule_create_user_option2(), roleParams)) {
+
+ auto options = node.GetBlock4().GetAlt1().GetBlock2();
+ std::vector<TRule_create_user_option> opts;
+ opts.reserve(options.size());
+ for (const auto& opt : options) {
+ opts.push_back(opt.GetRule_create_user_option1());
+ }
+
+ bool isCreateUser = false;
+
+ if (!RoleParameters(opts, roleParams, isCreateUser)) {
return false;
}
stmt = BuildAlterUser(pos, service, cluster, roleName, roleParams, Ctx.Scoped);
diff --git a/yql/essentials/sql/v1/sql_translation.cpp b/yql/essentials/sql/v1/sql_translation.cpp
index 61a273b260..16de88ffe0 100644
--- a/yql/essentials/sql/v1/sql_translation.cpp
+++ b/yql/essentials/sql/v1/sql_translation.cpp
@@ -3818,19 +3818,82 @@ bool TSqlTranslation::RoleNameClause(const TRule_role_name& node, TDeferredAtom&
return true;
}
-bool TSqlTranslation::RoleParameters(const TRule_create_user_option& node, TRoleParameters& result) {
- // create_user_option: ENCRYPTED? PASSWORD expr;
+bool TSqlTranslation::RoleParameters(const std::vector<TRule_create_user_option>& optionsList, TRoleParameters& result, bool isCreateUser) {
+ enum class ECreateUserOption {
+ Login,
+ Password
+ };
+
+ std::set<ECreateUserOption> used = {};
+
+ auto ParseCreateUserOption = [&used, this](const TRule_create_user_option& option, TRoleParameters& result) -> bool {
+ // create_user_option: password_option | login_option;
+ // password_option: ENCRYPTED? PASSWORD expr;
+ // login_option: LOGIN | NOLOGIN;
+
+ switch (option.Alt_case()) {
+ case TRule_create_user_option::kAltCreateUserOption1:
+ {
+ TSqlExpression expr(Ctx, Mode);
+ TNodePtr password = expr.Build(option.GetAlt_create_user_option1().GetRule_password_option1().GetRule_expr3());
+ if (!password) {
+ Error() << "Couldn't parse the password";
+ return false;
+ }
+
+ result.IsPasswordEncrypted = option.GetAlt_create_user_option1().GetRule_password_option1().HasBlock1();
+ if (!password->IsNull()) {
+ result.Password = MakeAtomFromExpression(Ctx.Pos(), Ctx, password);
+ }
+
+ if (used.contains(ECreateUserOption::Password)) {
+ Error() << "Conflicting or redundant options";
+ return false;
+ }
+
+ used.insert(ECreateUserOption::Password);
+
+ break;
+ }
+ case TRule_create_user_option::kAltCreateUserOption2:
+ {
+ if (used.contains(ECreateUserOption::Login)) {
+ Error() << "Conflicting or redundant options";
+ return false;
+ }
+
+ used.insert(ECreateUserOption::Login);
+
+ const auto token = option.GetAlt_create_user_option2().GetRule_login_option1().GetToken1().GetId();
+ if (IS_TOKEN(token, LOGIN)) {
+ result.CanLogin = TRoleParameters::ETypeOfLogin::Login;
+ } else if (IS_TOKEN(token, NOLOGIN)) {
+ result.CanLogin = TRoleParameters::ETypeOfLogin::NoLogin;
+ } else {
+ Y_ABORT("You should change implementation according to grammar changes");
+ }
+
+ break;
+ }
+ case TRule_create_user_option::ALT_NOT_SET:
+ {
+ Y_ABORT("You should change implementation according to grammar changes");
+ }
+ }
+
+ return true;
+ };
+
result = TRoleParameters{};
- TSqlExpression expr(Ctx, Mode);
- TNodePtr password = expr.Build(node.GetRule_expr3());
- if (!password) {
- return false;
+ if (isCreateUser) {
+ result.CanLogin = TRoleParameters::ETypeOfLogin::NoLogin;
}
- result.IsPasswordEncrypted = node.HasBlock1();
- if (!password->IsNull()) {
- result.Password = MakeAtomFromExpression(Ctx.Pos(), Ctx, password);
+ for (const auto& option : optionsList) {
+ if (!ParseCreateUserOption(option, result)) {
+ return false;
+ }
}
return true;
diff --git a/yql/essentials/sql/v1/sql_translation.h b/yql/essentials/sql/v1/sql_translation.h
index 325640d74a..3587b57a7a 100644
--- a/yql/essentials/sql/v1/sql_translation.h
+++ b/yql/essentials/sql/v1/sql_translation.h
@@ -242,7 +242,7 @@ protected:
bool ParseResourcePoolClassifierSettings(std::map<TString, TDeferredAtom>& result, const TRule_with_table_settings& settings);
bool ParseResourcePoolClassifierSettings(std::map<TString, TDeferredAtom>& result, std::set<TString>& toReset, const TRule_alter_resource_pool_classifier_action& alterAction);
bool RoleNameClause(const TRule_role_name& node, TDeferredAtom& result, bool allowSystemRoles);
- bool RoleParameters(const TRule_create_user_option& node, TRoleParameters& result);
+ bool RoleParameters(const std::vector<TRule_create_user_option>& optionsList, TRoleParameters& result, bool isCreateUser);
bool PermissionNameClause(const TRule_permission_name_target& node, TVector<TDeferredAtom>& result, bool withGrantOption);
bool PermissionNameClause(const TRule_permission_name& node, TDeferredAtom& result);
bool PermissionNameClause(const TRule_permission_id& node, TDeferredAtom& result);
diff --git a/yql/essentials/sql/v1/sql_ut.cpp b/yql/essentials/sql/v1/sql_ut.cpp
index 1c87beee05..efbed0e665 100644
--- a/yql/essentials/sql/v1/sql_ut.cpp
+++ b/yql/essentials/sql/v1/sql_ut.cpp
@@ -4957,6 +4957,82 @@ select FormatType($f());
"<main>:1:8: Error: Can't use window function LastValue without window specification (OVER keyword is missing)\n");
}
+ Y_UNIT_TEST(CreateAlterUserWithLoginNoLogin) {
+ auto reqCreateUser = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1;
+ )");
+
+ UNIT_ASSERT(reqCreateUser.IsOk());
+ UNIT_ASSERT(reqCreateUser.Root);
+
+ auto reqAlterUser = SqlToYql(R"(
+ USE plato;
+ ALTER USER user1;
+ )");
+
+ UNIT_ASSERT(!reqAlterUser.IsOk());
+ UNIT_ASSERT_STRING_CONTAINS(reqAlterUser.Issues.ToString(), "Error: Unexpected token ';' : cannot match to any predicted input...");
+
+ auto reqPasswordAndLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 PASSWORD '123' LOGIN;
+ )");
+
+ UNIT_ASSERT(reqPasswordAndLogin.IsOk());
+ UNIT_ASSERT(reqPasswordAndLogin.Root);
+
+ auto reqPasswordAndNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 PASSWORD '123' NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqPasswordAndNoLogin.IsOk());
+ UNIT_ASSERT(reqPasswordAndNoLogin.Root);
+
+ auto reqLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN;
+ )");
+
+ UNIT_ASSERT(reqLogin.IsOk());
+ UNIT_ASSERT(reqLogin.Root);
+
+ auto reqNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqNoLogin.IsOk());
+ UNIT_ASSERT(reqNoLogin.Root);
+
+ auto reqLoginNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN NOLOGIN;
+ )");
+
+ UNIT_ASSERT(!reqLoginNoLogin.IsOk());
+ UNIT_ASSERT_STRING_CONTAINS(reqLoginNoLogin.Issues.ToString(), "Error: Conflicting or redundant options");
+
+ auto reqAlterLoginNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN;
+ ALTER USER user1 NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqAlterLoginNoLogin.IsOk());
+ UNIT_ASSERT(reqAlterLoginNoLogin.Root);
+
+ auto reqAlterLoginNoLoginWithPassword = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN;
+ ALTER USER user1 PASSWORD '321' NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqAlterLoginNoLoginWithPassword.IsOk());
+ UNIT_ASSERT(reqAlterLoginNoLoginWithPassword.Root);
+ }
+
Y_UNIT_TEST(CreateAlterUserWithoutCluster) {
ExpectFailWithError("\n CREATE USER user ENCRYPTED PASSWORD 'foobar';", "<main>:2:2: Error: USE statement is missing - no default cluster is selected\n");
ExpectFailWithError("ALTER USER CURRENT_USER RENAME TO $foo;", "<main>:1:1: Error: USE statement is missing - no default cluster is selected\n");
diff --git a/yql/essentials/sql/v1/sql_ut_antlr4.cpp b/yql/essentials/sql/v1/sql_ut_antlr4.cpp
index 705ca3d19c..c5df28bbaa 100644
--- a/yql/essentials/sql/v1/sql_ut_antlr4.cpp
+++ b/yql/essentials/sql/v1/sql_ut_antlr4.cpp
@@ -471,6 +471,82 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["EquiJoin"]);
}
+ Y_UNIT_TEST(CreateAlterUserWithLoginNoLogin) {
+ auto reqCreateUser = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1;
+ )");
+
+ UNIT_ASSERT(reqCreateUser.IsOk());
+ UNIT_ASSERT(reqCreateUser.Root);
+
+ auto reqAlterUser = SqlToYql(R"(
+ USE plato;
+ ALTER USER user1;
+ )");
+
+ UNIT_ASSERT(!reqAlterUser.IsOk());
+ UNIT_ASSERT_STRING_CONTAINS(reqAlterUser.Issues.ToString(), "Error: mismatched input ';' expecting {ENCRYPTED, LOGIN, NOLOGIN, PASSWORD, RENAME, WITH}");
+
+ auto reqPasswordAndLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOgin;
+ )");
+
+ UNIT_ASSERT(reqPasswordAndLogin.IsOk());
+ UNIT_ASSERT(reqPasswordAndLogin.Root);
+
+ auto reqPasswordAndNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 PASSWORD '123' NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqPasswordAndNoLogin.IsOk());
+ UNIT_ASSERT(reqPasswordAndNoLogin.Root);
+
+ auto reqLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN;
+ )");
+
+ UNIT_ASSERT(reqLogin.IsOk());
+ UNIT_ASSERT(reqLogin.Root);
+
+ auto reqNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqNoLogin.IsOk());
+ UNIT_ASSERT(reqNoLogin.Root);
+
+ auto reqLoginNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN NOLOGIN;
+ )");
+
+ UNIT_ASSERT(!reqLoginNoLogin.IsOk());
+ UNIT_ASSERT_STRING_CONTAINS(reqLoginNoLogin.Issues.ToString(), "Error: Conflicting or redundant options");
+
+ auto reqAlterLoginNoLogin = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN;
+ ALTER USER user1 NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqAlterLoginNoLogin.IsOk());
+ UNIT_ASSERT(reqAlterLoginNoLogin.Root);
+
+ auto reqAlterLoginNoLoginWithPassword = SqlToYql(R"(
+ USE plato;
+ CREATE USER user1 LOGIN;
+ ALTER USER user1 PASSWORD '321' NOLOGIN;
+ )");
+
+ UNIT_ASSERT(reqAlterLoginNoLoginWithPassword.IsOk());
+ UNIT_ASSERT(reqAlterLoginNoLoginWithPassword.Root);
+ }
+
Y_UNIT_TEST(JoinWithoutConcreteColumns) {
NYql::TAstParseResult res = SqlToYql(
" use plato;"
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/result.json b/yql/essentials/tests/sql/sql2yql/canondata/result.json
index f687bca643..da8e4a69ce 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/result.json
+++ b/yql/essentials/tests/sql/sql2yql/canondata/result.json
@@ -11222,9 +11222,9 @@
],
"test_sql2yql.test[match_recognize-all_rows_per_match]": [
{
- "checksum": "31a940b1bbcea146ae9383e278326c7a",
- "size": 6729,
- "uri": "https://{canondata_backend}/1889210/954e2f1656d98697ece5794c59acf75dd1d40612/resource.tar.gz#test_sql2yql.test_match_recognize-all_rows_per_match_/sql.yql"
+ "checksum": "ee193116db0e897c8a3fbb98a75caaac",
+ "size": 6732,
+ "uri": "https://{canondata_backend}/1889210/a0cc9e3113699f51443284ed56291923dfc3735d/resource.tar.gz#test_sql2yql.test_match_recognize-all_rows_per_match_/sql.yql"
}
],
"test_sql2yql.test[match_recognize-greedy_quantifiers]": [
@@ -12067,6 +12067,13 @@
"uri": "https://{canondata_backend}/1942173/99e88108149e222741552e7e6cddef041d6a2846/resource.tar.gz#test_sql2yql.test_order_by-order_by_missing_project_column_join_types_/sql.yql"
}
],
+ "test_sql2yql.test[order_by-order_by_missing_project_column_nosimple]": [
+ {
+ "checksum": "ea2472dbe1cea58561e9a506a692738f",
+ "size": 3172,
+ "uri": "https://{canondata_backend}/1599023/02c3082e8ed2b6689e833c3b6594da85e12a01be/resource.tar.gz#test_sql2yql.test_order_by-order_by_missing_project_column_nosimple_/sql.yql"
+ }
+ ],
"test_sql2yql.test[order_by-order_by_mul_columns]": [
{
"checksum": "88f079be2cb6e1e762d50772e8fbc12d",
@@ -28625,6 +28632,11 @@
"uri": "file://test_sql_format.test_order_by-order_by_missing_project_column_join_types_/formatted.sql"
}
],
+ "test_sql_format.test[order_by-order_by_missing_project_column_nosimple]": [
+ {
+ "uri": "file://test_sql_format.test_order_by-order_by_missing_project_column_nosimple_/formatted.sql"
+ }
+ ],
"test_sql_format.test[order_by-order_by_mul_columns]": [
{
"uri": "file://test_sql_format.test_order_by-order_by_mul_columns_/formatted.sql"
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_aggregate-group_by_session_nopush_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_aggregate-group_by_session_nopush_/formatted.sql
index 8c15f9f952..55b25c01db 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_aggregate-group_by_session_nopush_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_aggregate-group_by_session_nopush_/formatted.sql
@@ -17,5 +17,4 @@ FROM (
)
WHERE
ss != 100500
-;
--- should not push down
+; -- should not push down
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-add_bitcast_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-add_bitcast_/formatted.sql
index 066eecc165..ef99f355e0 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-add_bitcast_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-add_bitcast_/formatted.sql
@@ -2,15 +2,12 @@ USE plato;
SELECT
1ul + 1
-;
+; -- warn
--- warn
SELECT
1u + 1
-;
+; -- warn
--- warn
SELECT
1l + 1u
-;
--- ok
+; -- ok
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-div_bitcast_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-div_bitcast_/formatted.sql
index 9597182864..946e613c55 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-div_bitcast_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-div_bitcast_/formatted.sql
@@ -2,15 +2,12 @@ USE plato;
SELECT
1ul / 1
-;
+; -- warn
--- warn
SELECT
1u / 1
-;
+; -- warn
--- warn
SELECT
1l / 1u
-;
--- ok
+; -- ok
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mod_bitcast_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mod_bitcast_/formatted.sql
index efa491555d..c3d6cc2b1d 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mod_bitcast_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mod_bitcast_/formatted.sql
@@ -2,15 +2,12 @@ USE plato;
SELECT
1ul % 1
-;
+; -- warn
--- warn
SELECT
1u % 1
-;
+; -- warn
--- warn
SELECT
1l % 1u
-;
--- ok
+; -- ok
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mul_bitcast_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mul_bitcast_/formatted.sql
index 8fbc996355..51daa0e7ff 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mul_bitcast_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-mul_bitcast_/formatted.sql
@@ -2,15 +2,12 @@ USE plato;
SELECT
1ul * 1
-;
+; -- warn
--- warn
SELECT
1u * 1
-;
+; -- warn
--- warn
SELECT
1l * 1u
-;
--- ok
+; -- ok
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-sub_bitcast_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-sub_bitcast_/formatted.sql
index 8d28bd557c..b414769fd7 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-sub_bitcast_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_bitcast_implicit-sub_bitcast_/formatted.sql
@@ -2,15 +2,12 @@ USE plato;
SELECT
1ul - 1
-;
+; -- warn
--- warn
SELECT
1u - 1
-;
+; -- warn
--- warn
SELECT
1l - 1u
-;
--- ok
+; -- ok
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_column_group-hint_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_column_group-hint_/formatted.sql
index ae5cb7e3dc..1c102e4f17 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_column_group-hint_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_column_group-hint_/formatted.sql
@@ -7,9 +7,8 @@ $i1 = (
Input
WHERE
a > 'a'
-);
+); -- several publish consumers with same groups
--- several publish consumers with same groups
$i2 = (
SELECT
*
@@ -17,9 +16,8 @@ $i2 = (
Input
WHERE
a > 'a1'
-);
+); -- several publish consumers with different groups
--- several publish consumers with different groups
$i3 = (
SELECT
*
@@ -27,9 +25,8 @@ $i3 = (
Input
WHERE
a < 'a2'
-);
+); -- several consumers including publish
--- several consumers including publish
$i4 = (
SELECT
*
@@ -37,9 +34,8 @@ $i4 = (
Input
WHERE
a != 'a'
-);
+); -- several publish consumers with and without groups
--- several publish consumers with and without groups
-- test column group spec normalization
INSERT INTO Output1 WITH column_groups = '{g1=[a;b;c];def=#}'
SELECT
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_datetime-date_tz_compare_diff_zones_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_datetime-date_tz_compare_diff_zones_/formatted.sql
index 5fe7c180ba..01eff73bc1 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_datetime-date_tz_compare_diff_zones_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_datetime-date_tz_compare_diff_zones_/formatted.sql
@@ -13,9 +13,8 @@ SELECT
SELECT
CAST('2000-01-01,GMT' AS tzdate) == tzdate('2000-01-01,America/Los_Angeles')
-;
+; -- same time value
--- same time value
SELECT
RemoveTimezone(CAST('2000-01-01,GMT' AS tzdate)) == RemoveTimezone(tzdate('2000-01-01,America/Los_Angeles'))
;
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-cast_string_implicit_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-cast_string_implicit_/formatted.sql
index d34761cff9..3b7ae94bf9 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-cast_string_implicit_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-cast_string_implicit_/formatted.sql
@@ -1,60 +1,47 @@
SELECT
AsList('aaa', 'aaa'u)
-;
+; -- List<String>
--- List<String>
SELECT
AsList('aaa', '[1, 2, 3]'j)
-;
+; -- List<String>
--- List<String>
SELECT
AsList('aaa', '[1; 2; 3]'y)
-;
+; -- List<String>
--- List<String>
SELECT
AsList('aaa'u, 'aaa')
-;
+; -- List<String>
--- List<String>
SELECT
AsList('aaa'u, '[1, 2, 3]'j)
-;
+; -- List<Utf8>
--- List<Utf8>
SELECT
AsList('aaa'u, '[1; 2; 3]'y)
-;
+; -- List<String>
--- List<String>
SELECT
AsList('[1, 2, 3]'j, 'aaa')
-;
+; -- List<String>
--- List<String>
SELECT
AsList('[1, 2, 3]'j, 'aaa'u)
-;
+; -- List<Utf8>
--- List<Utf8>
SELECT
AsList('[1, 2, 3]'j, '[1; 2; 3]'y)
-;
+; -- List<String>
--- List<String>
SELECT
AsList('[1; 2; 3]'y, 'aaa')
-;
+; -- List<String>
--- List<String>
SELECT
AsList('[1; 2; 3]'y, 'aaa'u)
-;
+; -- List<String>
--- List<String>
SELECT
AsList('[1; 2; 3]'y, '[1, 2, 3]'j)
-;
--- List<String>
-
+; -- List<String>
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-dict_builtins_null_lookup_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-dict_builtins_null_lookup_/formatted.sql
index 053a8e0f2c..9fa9484936 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-dict_builtins_null_lookup_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_expr-dict_builtins_null_lookup_/formatted.sql
@@ -10,9 +10,8 @@ SELECT
DictContains($d3, NULL), -- true, null is convertible to Nothing<T> for any T
DictLookup($d2, NULL), -- Nothing(String?), no such key
DictLookup($d3, NULL)
-;
+; -- Just("baz"), null is convertible to Nothing<T> for any T
--- Just("baz"), null is convertible to Nothing<T> for any T
SELECT
DictContains($t1, AsTuple(1, 'keyy')), -- false, missing key
DictContains($t1, AsTuple(1, 'key')), -- true, match
@@ -21,5 +20,4 @@ SELECT
DictContains($t3, AsTuple(NULL, 'key')), -- true, null is convertible to Nothing<T> for any T
DictLookup($t2, AsTuple(NULL, 'key')), -- Nothing(Tuple<Int32?, String>?), no such key
DictLookup($t3, AsTuple(NULL, 'key'))
-;
--- Just(AsTuple(123, "value")), null is convertible to Nothing<T> for any T
+; -- Just(AsTuple(123, "value")), null is convertible to Nothing<T> for any T
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_ansi_join_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_ansi_join_/formatted.sql
index 3dec26b8c0..cf090dac37 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_ansi_join_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_ansi_join_/formatted.sql
@@ -66,9 +66,8 @@ WHERE
optkey NOT IN $rp
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -77,9 +76,8 @@ WHERE
optkey NOT IN $rp
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -88,9 +86,8 @@ WHERE
optkey NOT IN $rp
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
-- Right is O
SELECT
optkey
@@ -100,9 +97,8 @@ WHERE
optkey NOT IN $ro
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -111,9 +107,8 @@ WHERE
optkey NOT IN $ro
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -122,9 +117,8 @@ WHERE
optkey NOT IN $ro
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
-- Right is N
SELECT
optkey
@@ -134,9 +128,8 @@ WHERE
optkey NOT IN $rn
ORDER BY
optkey
-;
+; -- []
--- []
SELECT
optkey
FROM
@@ -145,9 +138,8 @@ WHERE
optkey NOT IN $rn
ORDER BY
optkey
-;
+; -- []
--- []
SELECT
optkey
FROM
@@ -156,9 +148,8 @@ WHERE
optkey NOT IN $rn
ORDER BY
optkey
-;
+; -- []
--- []
-- 2, 4, 6, null
$extraDict = (
SELECT
@@ -182,9 +173,8 @@ WHERE
optkey != 10 AND optkey NOT IN $ro AND optkey IN $extraDict AND optkey != 4
ORDER BY
optkey
-;
+; -- [2,6]
--- [2,6]
SELECT
optkey
FROM
@@ -193,9 +183,8 @@ WHERE
optkey != 10 AND optkey NOT IN $rn AND optkey IN $extraDict AND optkey != 4
ORDER BY
optkey
-;
+; -- []
--- []
-- Empty dict
SELECT
optkey
@@ -211,6 +200,4 @@ WHERE
)
ORDER BY
optkey
-;
--- [1-10,null]
-
+; -- [1-10,null]
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_noansi_join_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_noansi_join_/formatted.sql
index 9fbe514124..4f02d53d68 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_noansi_join_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_noansi_join_/formatted.sql
@@ -66,9 +66,8 @@ WHERE
optkey NOT IN $rp
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -77,9 +76,8 @@ WHERE
optkey NOT IN $rp
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -88,9 +86,8 @@ WHERE
optkey NOT IN $rp
ORDER BY
optkey
-;
+; -- [null,2,3,4,6,8,10]
--- [null,2,3,4,6,8,10]
-- Right is O
SELECT
optkey
@@ -100,9 +97,8 @@ WHERE
optkey NOT IN $ro
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -111,9 +107,8 @@ WHERE
optkey NOT IN $ro
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -122,9 +117,8 @@ WHERE
optkey NOT IN $ro
ORDER BY
optkey
-;
+; -- [null,2,3,4,6,8,10]
--- [null,2,3,4,6,8,10]
-- Right is N
SELECT
optkey
@@ -134,9 +128,8 @@ WHERE
optkey NOT IN $rn
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -145,9 +138,8 @@ WHERE
optkey NOT IN $rn
ORDER BY
optkey
-;
+; -- [2,3,4,6,8,10]
--- [2,3,4,6,8,10]
SELECT
optkey
FROM
@@ -156,9 +148,8 @@ WHERE
optkey NOT IN $rn
ORDER BY
optkey
-;
+; -- [null,2,3,4,6,8,10]
--- [null,2,3,4,6,8,10]
-- 2, 4, 6, null
$extraDict = (
SELECT
@@ -182,9 +173,8 @@ WHERE
optkey != 10 AND optkey NOT IN $ro AND optkey IN $extraDict AND optkey != 4
ORDER BY
optkey
-;
+; -- [2,6]
--- [2,6]
SELECT
optkey
FROM
@@ -193,9 +183,8 @@ WHERE
optkey != 10 AND optkey NOT IN $rn AND optkey IN $extraDict AND optkey != 4
ORDER BY
optkey
-;
+; -- [2,6]
--- [2,6]
-- Empty dict
SELECT
optkey
@@ -211,6 +200,4 @@ WHERE
)
ORDER BY
optkey
-;
--- [1-10,null]
-
+; -- [1-10,null]
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_/formatted.sql
index 7cc64316c7..02d8df23eb 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_/formatted.sql
@@ -10,5 +10,4 @@ SELECT
(1, NULL) IN ((1, 2), (1, 3)), -- Nothing<Bool?>
(2, NULL) IN ((1, 2), (1, 3)), -- Nothing<Bool?>
(1, NULL) IN ()
-;
--- Nothing<Bool?>
+; -- Nothing<Bool?>
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_ansi_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_ansi_/formatted.sql
index 326a709927..cd79c2a96e 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_ansi_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_in-in_with_nulls_and_optionals_extra_ansi_/formatted.sql
@@ -10,5 +10,4 @@ SELECT
(1, NULL) IN ((1, 2), (1, 3)), -- Nothing<Bool?>
(2, NULL) IN ((1, 2), (1, 3)), -- Just(false)
(1, NULL) IN ()
-;
--- Just(false)
+; -- Just(false)
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_/formatted.sql
index 37e8cecb5a..f9f38135f4 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_/formatted.sql
@@ -1,9 +1,7 @@
/* ytfile can not */
USE plato;
-PRAGMA warning('disable', '8001');
-
--- CBO_MISSING_TABLE_STATS
+PRAGMA warning('disable', '8001'); -- CBO_MISSING_TABLE_STATS
PRAGMA CostBasedOptimizer = 'native';
PRAGMA yt.MapJoinLimit = '1000';
PRAGMA yt.LookupJoinLimit = '1000';
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_only_sorted_merge_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_only_sorted_merge_/formatted.sql
index 59a75e45c9..3773cd9c62 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_only_sorted_merge_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-cbo_4tables_only_sorted_merge_/formatted.sql
@@ -1,9 +1,7 @@
/* ytfile can not */
USE plato;
-PRAGMA warning('disable', '8001');
-
--- CBO_MISSING_TABLE_STATS
+PRAGMA warning('disable', '8001'); -- CBO_MISSING_TABLE_STATS
PRAGMA CostBasedOptimizer = 'native';
PRAGMA yt.MapJoinLimit = '1000';
PRAGMA yt.LookupJoinLimit = '1000';
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_cbo_3_tables_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_cbo_3_tables_/formatted.sql
index ecbc9980f9..db7bf3d339 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_cbo_3_tables_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_cbo_3_tables_/formatted.sql
@@ -1,8 +1,6 @@
USE plato;
-PRAGMA warning('disable', '8001');
-
--- CBO_MISSING_TABLE_STATS
+PRAGMA warning('disable', '8001'); -- CBO_MISSING_TABLE_STATS
PRAGMA CostBasedOptimizer = 'pg';
SELECT
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_left_cbo_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_left_cbo_/formatted.sql
index e3287b0ccb..f84bb6ef38 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_left_cbo_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_left_cbo_/formatted.sql
@@ -1,8 +1,6 @@
USE plato;
-PRAGMA warning('disable', '8001');
-
--- CBO_MISSING_TABLE_STATS
+PRAGMA warning('disable', '8001'); -- CBO_MISSING_TABLE_STATS
PRAGMA CostBasedOptimizer = 'PG';
SELECT
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_right_cbo_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_right_cbo_/formatted.sql
index 89c9d30704..b1ab35595c 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_right_cbo_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_join-join_right_cbo_/formatted.sql
@@ -1,8 +1,6 @@
USE plato;
-PRAGMA warning('disable', '8001');
-
--- CBO_MISSING_TABLE_STATS
+PRAGMA warning('disable', '8001'); -- CBO_MISSING_TABLE_STATS
PRAGMA CostBasedOptimizer = 'PG';
SELECT
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-decimal_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-decimal_/formatted.sql
index 1c8ffe23b4..a1866f61c1 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-decimal_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-decimal_/formatted.sql
@@ -84,23 +84,20 @@ FROM
@decimal
WHERE
value == CAST('6.6' AS Decimal (15, 10))
-;
+; -- Safe key filter calc
--- Safe key filter calc
SELECT
*
FROM
@decimal
WHERE
value == CAST($asIs('3.3') AS Decimal (15, 10))
-;
+; -- Unsafe key filter calc
--- Unsafe key filter calc
SELECT
*
FROM
@decimal
WHERE
value == CAST($asIs('bad') AS Decimal (15, 10))
-;
--- Unsafe key filter calc
+; -- Unsafe key filter calc
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-tzdate_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-tzdate_/formatted.sql
index db97e0a135..262e38eeec 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-tzdate_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-tzdate_/formatted.sql
@@ -77,23 +77,20 @@ FROM
@tzdate
WHERE
value == CAST('1999-01-01,Europe/Moscow' AS TzDate)
-;
+; -- Safe key filter calc
--- Safe key filter calc
SELECT
*
FROM
@tzdate
WHERE
value == CAST($asIs('2105-12-30,America/Los_Angeles') AS TzDate)
-;
+; -- Unsafe key filter calc
--- Unsafe key filter calc
SELECT
*
FROM
@tzdate
WHERE
value == CAST($asIs('bad') AS TzDate)
-;
--- Unsafe key filter calc
+; -- Unsafe key filter calc
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-uuid_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-uuid_/formatted.sql
index b4fc19dd85..5ca4a5e7ee 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-uuid_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_key_filter-uuid_/formatted.sql
@@ -98,23 +98,20 @@ FROM
@uuid
WHERE
value == CAST('00000000-0000-0000-0000-100000000000' AS Uuid)
-;
+; -- Safe key filter calc
--- Safe key filter calc
SELECT
*
FROM
@uuid
WHERE
value == CAST($asIs('00000000-0000-0000-0000-200000000000') AS Uuid)
-;
+; -- Unsafe key filter calc
--- Unsafe key filter calc
SELECT
*
FROM
@uuid
WHERE
value == CAST($asIs('bad') AS Uuid)
-;
--- Unsafe key filter calc
+; -- Unsafe key filter calc
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_match_recognize-all_rows_per_match_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_match_recognize-all_rows_per_match_/formatted.sql
index edcc854cfa..ae64953618 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_match_recognize-all_rows_per_match_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_match_recognize-all_rows_per_match_/formatted.sql
@@ -1,6 +1,6 @@
-PRAGMA FeatureR010 = "prototype";
+PRAGMA FeatureR010 = 'prototype';
-$input =
+$input = (
SELECT
*
FROM
@@ -19,7 +19,7 @@ $input =
<|time: 1100, value: 5|>,
<|time: 1200, value: 0|>,
])
-;
+);
SELECT
*
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_order_by-order_by_missing_project_column_nosimple_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_order_by-order_by_missing_project_column_nosimple_/formatted.sql
new file mode 100644
index 0000000000..5bb4d66337
--- /dev/null
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_order_by-order_by_missing_project_column_nosimple_/formatted.sql
@@ -0,0 +1,46 @@
+/* syntax version 1 */
+/* postgres can not */
+/* dq can not */
+/* dqfile can not */
+/* yt can not */
+PRAGMA DisableSimpleColumns;
+
+$src = [
+ <|a: 5, b: 50, zz: 500|>,
+ <|a: 4, b: 40, zz: 400|>,
+ <|a: 3, b: 30, zz: 300|>,
+ <|a: 2, b: 20, zz: 200|>,
+ <|a: 1, b: 10, zz: 100|>,
+];
+
+$src1 = [
+ <|a: 4, f: 40|>,
+ <|a: 3, f: 30|>,
+ <|a: 2, f: 20|>,
+ <|a: 1, f: 10|>,
+];
+
+$src = (
+ SELECT
+ *
+ FROM
+ as_table($src)
+);
+
+$src1 = (
+ SELECT
+ *
+ FROM
+ as_table($src1)
+);
+
+SELECT
+ x.*
+FROM
+ $src AS x
+LEFT ONLY JOIN
+ $src1 AS y
+USING (a)
+ORDER BY
+ random(a)
+;
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_params-primitives_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_params-primitives_/formatted.sql
index 19fc917dc6..0c5da65033 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_params-primitives_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_params-primitives_/formatted.sql
@@ -3,22 +3,14 @@ DECLARE $x1 AS int;
DECLARE $x2 AS Double;
DECLARE $x3 AS Bool;
DECLARE $x4 AS Float;
-DECLARE $x5 AS String;
-
--- unicode
+DECLARE $x5 AS String; -- unicode
DECLARE $x6 AS Int64;
DECLARE $x7 AS Uint64;
-DECLARE $x8 AS String;
-
--- binary
+DECLARE $x8 AS String; -- binary
DECLARE $x9 AS Utf8;
DECLARE $x10 AS Uuid;
-DECLARE $x11 AS String?;
-
--- null
-DECLARE $x12 AS String?;
-
--- not null
+DECLARE $x11 AS String?; -- null
+DECLARE $x12 AS String?; -- not null
DECLARE $x13 AS Yson;
DECLARE $x14 AS Json;
DECLARE $x15 AS datetime;
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_/formatted.sql
index 08d9a3b581..0a9259aed4 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_/formatted.sql
@@ -8,9 +8,8 @@ $count = (
COUNT(*)
FROM
Input
-);
+); -- $count = 10
--- $count = 10
$var = (
SELECT
*
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_udf_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_udf_/formatted.sql
index 7a2f11fb41..7da3c0e4d7 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_udf_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-bind_expr_udf_/formatted.sql
@@ -11,5 +11,4 @@ FROM
TABLESAMPLE BERNOULLI (Math::Ceil(100 * $percent))
ORDER BY
key
-;
--- 100% sample
+; -- 100% sample
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-subquery_expr_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-subquery_expr_/formatted.sql
index 337f365d5e..6b7041a3f1 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-subquery_expr_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_sampling-subquery_expr_/formatted.sql
@@ -6,9 +6,8 @@ $count = (
COUNT(*)
FROM
plato.Input
-);
+); -- $count = 10
--- $count = 10
SELECT
*
FROM (
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_schema-user_schema_with_sort_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_schema-user_schema_with_sort_/formatted.sql
index 6b9523050c..38c1e0f904 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_schema-user_schema_with_sort_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_schema-user_schema_with_sort_/formatted.sql
@@ -15,9 +15,8 @@ FROM
Input1 WITH SCHEMA Struct<key: String?, subkey: String>
ORDER BY
key
-;
+; -- should reset sort
--- should reset sort
SELECT
*
FROM
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-named_args_for_script_with_posargs_reuse_args_fail_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-named_args_for_script_with_posargs_reuse_args_fail_/formatted.sql
index b1cc429950..3a7b94d707 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-named_args_for_script_with_posargs_reuse_args_fail_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-named_args_for_script_with_posargs_reuse_args_fail_/formatted.sql
@@ -26,5 +26,4 @@ SELECT
$udf(name, age, age AS age) AS val
FROM
$data
-;
--- age is reused as named after positional
+; -- age is reused as named after positional
diff --git a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-wrong_args_fail_/formatted.sql b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-wrong_args_fail_/formatted.sql
index 67a6d45b69..2aeb8fc7ed 100644
--- a/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-wrong_args_fail_/formatted.sql
+++ b/yql/essentials/tests/sql/sql2yql/canondata/test_sql_format.test_udf-wrong_args_fail_/formatted.sql
@@ -3,20 +3,16 @@
-- Find has optional args
SELECT
String::ReplaceAll()
-;
+; -- too few
--- too few
SELECT
String::ReplaceAll('abc')
-;
+; -- too few
--- too few
SELECT
String::ReplaceAll('abc', 'b', 2, 4)
-;
+; -- too many
--- too many
SELECT
String::ReplaceAll('abc', 'b', 2, 4, 44)
-;
--- too many
+; -- too many
diff --git a/yql/essentials/tests/sql/sql2yql/ya.make b/yql/essentials/tests/sql/sql2yql/ya.make
index f6f5df53a0..cff97cecd9 100644
--- a/yql/essentials/tests/sql/sql2yql/ya.make
+++ b/yql/essentials/tests/sql/sql2yql/ya.make
@@ -1,3 +1,5 @@
+IF (NOT OPENSOURCE)
+
PY3TEST()
TEST_SRCS(
test_sql2yql.py
@@ -42,3 +44,5 @@ NO_CHECK_IMPORTS()
END()
+ENDIF()
+
diff --git a/yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.cfg b/yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.sql b/yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.sql
new file mode 100644
index 0000000000..f1434c8c08
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/order_by/order_by_missing_project_column_nosimple.sql
@@ -0,0 +1,32 @@
+/* syntax version 1 */
+/* postgres can not */
+/* dq can not */
+/* dqfile can not */
+/* yt can not */
+pragma DisableSimpleColumns;
+
+$src = [
+<|a:5, b:50, zz:500|>,
+<|a:4, b:40, zz:400|>,
+<|a:3, b:30, zz:300|>,
+<|a:2, b:20, zz:200|>,
+<|a:1, b:10, zz:100|>,
+];
+
+$src1 = [
+<|a:4, f:40|>,
+<|a:3, f:30|>,
+<|a:2, f:20|>,
+<|a:1, f:10|>,
+];
+
+
+$src = select * from as_table($src);
+$src1 = select * from as_table($src1);
+
+select
+ x.*
+from $src as x
+left only join $src1 as y
+using(a)
+order by random(a);
diff --git a/yql/essentials/tools/minirun/apply_patches.sh b/yql/essentials/tools/minirun/apply_patches.sh
new file mode 100755
index 0000000000..ca2e4f445f
--- /dev/null
+++ b/yql/essentials/tools/minirun/apply_patches.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+set -eu
+
+errexit() {
+ echo $1
+ exit 1
+ }
+
+echo patching
+cd ../../../../
+patch -p0 < yql/essentials/tools/minirun/patches/01_no_icu.patch || errexit "Source patching failed"
+echo done
+
+
diff --git a/yql/essentials/tools/minirun/minirun.cpp b/yql/essentials/tools/minirun/minirun.cpp
index 0d4fedfd9a..1282212bb2 100644
--- a/yql/essentials/tools/minirun/minirun.cpp
+++ b/yql/essentials/tools/minirun/minirun.cpp
@@ -11,6 +11,7 @@ public:
{
GetRunOptions().UseRepeatableRandomAndTimeProviders = true;
GetRunOptions().ResultsFormat = NYson::EYsonFormat::Pretty;
+ GetRunOptions().OptimizeLibs = false;
GetRunOptions().AddOptExtension([this](NLastGetopt::TOpts& opts) {
opts.AddLongOption("ndebug", "Do not show debug info in error output").NoArgument().SetFlag(&GetRunOptions().NoDebug);
diff --git a/yql/essentials/tools/minirun/patches/01_no_icu.patch b/yql/essentials/tools/minirun/patches/01_no_icu.patch
new file mode 100644
index 0000000000..95a2723287
--- /dev/null
+++ b/yql/essentials/tools/minirun/patches/01_no_icu.patch
@@ -0,0 +1,93 @@
+--- contrib/restricted/boost/regex/ya.make (index)
++++ contrib/restricted/boost/regex/ya.make (working tree)
+@@ -16,7 +16,6 @@ VERSION(1.87.0)
+ ORIGINAL_SOURCE(https://github.com/boostorg/regex/archive/boost-1.87.0.tar.gz)
+
+ PEERDIR(
+- contrib/libs/icu
+ contrib/restricted/boost/assert
+ contrib/restricted/boost/concept_check
+ contrib/restricted/boost/config
+@@ -40,7 +39,6 @@ NO_COMPILER_WARNINGS()
+ NO_UTIL()
+
+ CFLAGS(
+- -DBOOST_HAS_ICU
+ -DBOOST_NO_CXX98_BINDERS
+ )
+
+--- contrib/restricted/thrift/ya.make (index)
++++ contrib/restricted/thrift/ya.make (working tree)
+@@ -24,7 +24,6 @@ PEERDIR(
+ contrib/libs/openssl
+ contrib/libs/zlib
+ contrib/restricted/boost/interprocess
+- contrib/restricted/boost/locale
+ contrib/restricted/boost/math
+ contrib/restricted/boost/system
+ contrib/restricted/boost/thread
+@@ -49,7 +48,6 @@ SRCS(
+ thrift/protocol/TBase64Utils.cpp
+ thrift/protocol/TDebugProtocol.cpp
+ thrift/protocol/THeaderProtocol.cpp
+- thrift/protocol/TJSONProtocol.cpp
+ thrift/protocol/TMultiplexedProtocol.cpp
+ thrift/protocol/TProtocol.cpp
+ thrift/server/TConnectedClient.cpp
+--- yql/essentials/parser/pg_wrapper/postgresql/src/backend/utils/adt/formatting.c (index)
++++ yql/essentials/parser/pg_wrapper/postgresql/src/backend/utils/adt/formatting.c (working tree)
+@@ -72,7 +72,7 @@
+ #include <wctype.h>
+
+ #ifdef USE_ICU
+-#include <unicode/ustring.h>
++#error #include <unicode/ustring.h>
+ #endif
+
+ #include "catalog/pg_collation.h"
+--- yql/essentials/parser/pg_wrapper/postgresql/src/backend/utils/adt/pg_locale.c (index)
++++ yql/essentials/parser/pg_wrapper/postgresql/src/backend/utils/adt/pg_locale.c (working tree)
+@@ -69,8 +69,8 @@
+ #include "utils/syscache.h"
+
+ #ifdef USE_ICU
+-#include <unicode/ucnv.h>
+-#include <unicode/ustring.h>
++#error #include <unicode/ucnv.h>
++#error #include <unicode/ustring.h>
+ #endif
+
+ #ifdef __GLIBC__
+--- yql/essentials/parser/pg_wrapper/postgresql/src/include/pg_config-linux.h (index)
++++ yql/essentials/parser/pg_wrapper/postgresql/src/include/pg_config-linux.h (working tree)
+@@ -707,7 +707,8 @@
+ /* #undef USE_BSD_AUTH */
+
+ /* Define to build with ICU support. (--with-icu) */
+-#define USE_ICU 1
++//#define USE_ICU 1
++#undef USE_ICU
+
+ /* Define to 1 to build with LDAP support. (--with-ldap) */
+ /* #undef USE_LDAP */
+--- yql/essentials/parser/pg_wrapper/postgresql/src/include/utils/pg_locale.h (index)
++++ yql/essentials/parser/pg_wrapper/postgresql/src/include/utils/pg_locale.h (working tree)
+@@ -16,7 +16,7 @@
+ #include <xlocale.h>
+ #endif
+ #ifdef USE_ICU
+-#include <unicode/ucol.h>
++#error include <unicode/ucol.h>
+ #endif
+
+ #ifdef USE_ICU
+--- yql/essentials/parser/pg_wrapper/ya.make (index)
++++ yql/essentials/parser/pg_wrapper/ya.make (working tree)
+@@ -95,7 +95,6 @@ PEERDIR(
+ yql/essentials/types/dynumber
+ yql/essentials/types/uuid
+
+- contrib/libs/icu
+ contrib/libs/libc_compat
+ contrib/libs/libxml
+ contrib/libs/lz4
diff --git a/yql/essentials/tools/udf_resolver/udf_resolver.cpp b/yql/essentials/tools/udf_resolver/udf_resolver.cpp
index 8d2b8ec6cd..5b8717bfe3 100644
--- a/yql/essentials/tools/udf_resolver/udf_resolver.cpp
+++ b/yql/essentials/tools/udf_resolver/udf_resolver.cpp
@@ -456,6 +456,7 @@ int main(int argc, char **argv) {
Allow(stat),
#endif
Allow(sysinfo),
+ Allow(sigaltstack),
Allow(uname),
#ifndef _arm64_
Allow(unlink),
diff --git a/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp b/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp
index 6e6167582f..2db2f62607 100644
--- a/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp
+++ b/yql/essentials/tools/yql_facade_run/yql_facade_run.cpp
@@ -573,7 +573,7 @@ int TFacadeRunner::DoMain(int argc, const char *argv[]) {
moduleResolver = std::make_shared<TModuleResolver>(std::move(modules), ctx.NextUniqueId, ClusterMapping_, RunOptions_.SqlFlags, RunOptions_.Mode >= ERunMode::Validate);
} else {
- if (!GetYqlDefaultModuleResolver(ctx, moduleResolver, ClusterMapping_, RunOptions_.Mode >= ERunMode::Validate)) {
+ if (!GetYqlDefaultModuleResolver(ctx, moduleResolver, ClusterMapping_, RunOptions_.OptimizeLibs && RunOptions_.Mode >= ERunMode::Validate)) {
*RunOptions_.ErrStream << "Errors loading default YQL libraries:" << Endl;
ctx.IssueManager.GetIssues().PrintTo(*RunOptions_.ErrStream);
return -1;
diff --git a/yql/essentials/tools/yql_facade_run/yql_facade_run.h b/yql/essentials/tools/yql_facade_run/yql_facade_run.h
index f5e1fd5bd2..b586370c2d 100644
--- a/yql/essentials/tools/yql_facade_run/yql_facade_run.h
+++ b/yql/essentials/tools/yql_facade_run/yql_facade_run.h
@@ -127,6 +127,7 @@ public:
bool EnableResultPosition = false;
bool EnableCredentials = false;
bool EnableQPlayer = false;
+ bool OptimizeLibs = true;
void Parse(int argc, const char *argv[]);
diff --git a/yql/essentials/udfs/common/digest/digest_udf.cpp b/yql/essentials/udfs/common/digest/digest_udf.cpp
index 491fe7a66c..1925052200 100644
--- a/yql/essentials/udfs/common/digest/digest_udf.cpp
+++ b/yql/essentials/udfs/common/digest/digest_udf.cpp
@@ -26,6 +26,68 @@ using namespace NKikimr;
using namespace NUdf;
namespace {
+ enum EDigestType {
+ CRC32C, CRC64, FNV32, FNV64, MURMUR, MURMUR32, MURMUR2A, MURMUR2A32, CITY
+ };
+ const char* DigestNames[] = {
+ "Crc32c", "Crc64", "Fnv32", "Fnv64", "MurMurHash", "MurMurHash32", "MurMurHash2A", "MurMurHash2A32", "CityHash"
+ };
+
+ template<typename TResult>
+ using TDigestGenerator = TResult(const TStringRef&, TMaybe<TResult> init);
+
+ template<EDigestType DigestType, typename TResult, TDigestGenerator<TResult>* Generator>
+ class TDigestFunctionUdf: public TBoxedValue {
+ public:
+ TDigestFunctionUdf(TSourcePosition pos) : Pos_(pos) {}
+
+ static TStringRef Name() {
+ static TString name = DigestNames[DigestType];
+ return TStringRef(name);
+ }
+
+ static bool DeclareSignature(
+ const TStringRef& name,
+ TType*,
+ IFunctionTypeInfoBuilder& builder,
+ bool typesOnly)
+ {
+ if (Name() != name) {
+ return false;
+ }
+
+ auto args = builder.Args();
+ args->Add(builder.SimpleType<char *>()).Flags(ICallablePayload::TArgumentFlags::AutoMap);
+ args->Add(builder.Optional()->Item(builder.SimpleType<TResult>()).Build()).Name("Init");
+ args->Done();
+ builder.OptionalArgs(1);
+ builder.Returns(builder.SimpleType<TResult>());
+
+ if (!typesOnly) {
+ builder.Implementation(new TDigestFunctionUdf<DigestType, TResult, Generator>(GetSourcePosition(builder)));
+ }
+
+ return true;
+ }
+
+ private:
+ TUnboxedValue Run(const IValueBuilder*, const TUnboxedValuePod* args) const final try {
+ TMaybe<TResult> init = Nothing();
+ if (auto val = args[1]) {
+ init = val.Get<TResult>();
+ }
+ return TUnboxedValuePod(Generator(args[0].AsStringRef(), init));
+ } catch (const std ::exception&) {
+ TStringBuilder sb;
+ sb << Pos_ << " ";
+ sb << CurrentExceptionMessage();
+ sb << Endl << "[" << TStringBuf(Name()) << "]";
+ UdfTerminate(sb.c_str());
+ }
+
+ TSourcePosition Pos_;
+ };
+
SIMPLE_STRICT_UDF(TCrc32c, ui32(TAutoMap<char*>)) {
Y_UNUSED(valueBuilder);
const auto& inputRef = args[0].AsStringRef();
@@ -33,68 +95,65 @@ namespace {
return TUnboxedValuePod(hash);
}
- SIMPLE_STRICT_UDF(TCrc64, ui64(TAutoMap<char*>)) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui64 hash = crc64(inputRef.Data(), inputRef.Size());
- return TUnboxedValuePod(hash);
- }
-
- SIMPLE_STRICT_UDF(TFnv32, ui32(TAutoMap<char*>)) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui32 hash = FnvHash<ui32>(inputRef.Data(), inputRef.Size());
- return TUnboxedValuePod(hash);
- }
+ using TCrc64 = TDigestFunctionUdf<CRC64, ui64, [](auto& inputRef, auto init) {
+ return crc64(inputRef.Data(), inputRef.Size(), init.GetOrElse(CRC64INIT));
+ }>;
- SIMPLE_STRICT_UDF(TFnv64, ui64(TAutoMap<char*>)) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui64 hash = FnvHash<ui64>(inputRef.Data(), inputRef.Size());
- return TUnboxedValuePod(hash);
- }
+ using TFnv32 = TDigestFunctionUdf<FNV32, ui32, [](auto& inputRef, auto init) {
+ if (init) {
+ return FnvHash<ui32>(inputRef.Data(), inputRef.Size(), *init);
+ } else {
+ return FnvHash<ui32>(inputRef.Data(), inputRef.Size());
+ }
+ }>;
- SIMPLE_STRICT_UDF(TMurMurHash, ui64(TAutoMap<char*>)) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui64 hash = MurmurHash<ui64>(inputRef.Data(), inputRef.Size());
- return TUnboxedValuePod(hash);
- }
+ using TFnv64 = TDigestFunctionUdf<FNV64, ui64, [](auto& inputRef, auto init) {
+ if (init) {
+ return FnvHash<ui64>(inputRef.Data(), inputRef.Size(), *init);
+ } else {
+ return FnvHash<ui64>(inputRef.Data(), inputRef.Size());
+ }
+ }>;
- SIMPLE_STRICT_UDF(TMurMurHash32, ui32(TAutoMap<char*>)) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui32 hash = MurmurHash<ui32>(inputRef.Data(), inputRef.Size());
- return TUnboxedValuePod(hash);
- }
+ using TMurMurHash = TDigestFunctionUdf<MURMUR, ui64, [](auto& inputRef, auto init) {
+ if (init) {
+ return MurmurHash<ui64>(inputRef.Data(), inputRef.Size(), *init);
+ } else {
+ return MurmurHash<ui64>(inputRef.Data(), inputRef.Size());
+ }
+ }>;
- SIMPLE_STRICT_UDF(TMurMurHash2A, ui64(TAutoMap<char*>)) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui64 hash = TMurmurHash2A<ui64>{}.Update(inputRef.Data(), inputRef.Size()).Value();
- return TUnboxedValuePod(hash);
- }
+ using TMurMurHash32 = TDigestFunctionUdf<MURMUR32, ui32, [] (auto& inputRef, auto init) {
+ if (init) {
+ return MurmurHash<ui32>(inputRef.Data(), inputRef.Size(), *init);
+ } else {
+ return MurmurHash<ui32>(inputRef.Data(), inputRef.Size());
+ }
+ }>;
- SIMPLE_STRICT_UDF(TMurMurHash2A32, ui32(TAutoMap<char*>)) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui32 hash = TMurmurHash2A<ui32>{}.Update(inputRef.Data(), inputRef.Size()).Value();
- return TUnboxedValuePod(hash);
- }
+ using TMurMurHash2A = TDigestFunctionUdf<MURMUR2A, ui64, [] (auto& inputRef, auto init) {
+ if (init) {
+ return TMurmurHash2A<ui64>{*init}.Update(inputRef.Data(), inputRef.Size()).Value();
+ } else {
+ return TMurmurHash2A<ui64>{}.Update(inputRef.Data(), inputRef.Size()).Value();
+ }
+ }>;
- SIMPLE_STRICT_UDF_WITH_OPTIONAL_ARGS(TCityHash, ui64(TAutoMap<char*>, TOptional<ui64>), 1) {
- Y_UNUSED(valueBuilder);
- const auto& inputRef = args[0].AsStringRef();
- ui64 hash;
- if (args[1]) {
- hash = CityHash64WithSeed(inputRef.Data(), inputRef.Size(), args[1].Get<ui64>());
+ using TMurMurHash2A32 = TDigestFunctionUdf<MURMUR2A32, ui32, [] (auto& inputRef, auto init) {
+ if (init) {
+ return TMurmurHash2A<ui32>{*init}.Update(inputRef.Data(), inputRef.Size()).Value();
} else {
- hash = CityHash64(inputRef.Data(), inputRef.Size());
+ return TMurmurHash2A<ui32>{}.Update(inputRef.Data(), inputRef.Size()).Value();
}
- return TUnboxedValuePod(hash);
- }
+ }>;
- using TUi64Pair = NUdf::TTuple<ui64, ui64>;
+ using TCityHash = TDigestFunctionUdf<CITY, ui64, [] (auto& inputRef, auto init) {
+ if (init) {
+ return CityHash64WithSeed(inputRef.Data(), inputRef.Size(), *init);
+ } else {
+ return CityHash64(inputRef.Data(), inputRef.Size());
+ }
+ }>;
class TCityHash128: public TBoxedValue {
public:
diff --git a/yql/essentials/udfs/common/digest/test/canondata/result.json b/yql/essentials/udfs/common/digest/test/canondata/result.json
index fb6112fc5b..5056bb47cb 100644
--- a/yql/essentials/udfs/common/digest/test/canondata/result.json
+++ b/yql/essentials/udfs/common/digest/test/canondata/result.json
@@ -3,5 +3,10 @@
{
"uri": "file://test.test_Basic_/results.txt"
}
+ ],
+ "test.test[Init]": [
+ {
+ "uri": "file://test.test_Init_/results.txt"
+ }
]
}
diff --git a/yql/essentials/udfs/common/digest/test/canondata/test.test_Init_/results.txt b/yql/essentials/udfs/common/digest/test/canondata/test.test_Init_/results.txt
new file mode 100644
index 0000000000..53faaf453b
--- /dev/null
+++ b/yql/essentials/udfs/common/digest/test/canondata/test.test_Init_/results.txt
@@ -0,0 +1,202 @@
+[
+ {
+ "Write" = [
+ {
+ "Type" = [
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "column0";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column1";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column2";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ];
+ [
+ "column3";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ];
+ [
+ "column4";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column5";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column6";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column7";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column8";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ];
+ [
+ "column9";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ];
+ [
+ "column10";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column11";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column12";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ];
+ [
+ "column13";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ];
+ [
+ "column14";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "column15";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ]
+ ]
+ ]
+ ];
+ "Data" = [
+ [
+ "12517938706220930219";
+ "12517938706220930219";
+ "151308058";
+ "151308058";
+ "854320535119994";
+ "854320535119994";
+ "9815316673246213022";
+ "9815316673246213022";
+ "3549562424";
+ "3549562424";
+ "7091385679591462881";
+ "7091385679591462881";
+ "2867599578";
+ "2867599578";
+ "9781551444137168419";
+ "9781551444137168419"
+ ];
+ [
+ "7439640649521800617";
+ "7439640649521800617";
+ "151308057";
+ "151308057";
+ "854320535119993";
+ "854320535119993";
+ "3140806664558319421";
+ "3140806664558319421";
+ "4067583852";
+ "4067583852";
+ "8498979662292624923";
+ "8498979662292624923";
+ "1911426935";
+ "1911426935";
+ "16387792208989722131";
+ "16387792208989722131"
+ ];
+ [
+ "9402898472742411560";
+ "9402898472742411560";
+ "151308056";
+ "151308056";
+ "854320535119992";
+ "854320535119992";
+ "5511627967124305793";
+ "5511627967124305793";
+ "4218195213";
+ "4218195213";
+ "4001281192876778049";
+ "4001281192876778049";
+ "1399730784";
+ "1399730784";
+ "3425497360513913945";
+ "3425497360513913945"
+ ];
+ [
+ "777";
+ "777";
+ "777";
+ "777";
+ "777";
+ "777";
+ "16843636611330352828";
+ "16843636611330352828";
+ "2954663174";
+ "2954663174";
+ "13671058521579127884";
+ "13671058521579127884";
+ "2722328547";
+ "2722328547";
+ "15226978636637575808";
+ "15226978636637575808"
+ ]
+ ]
+ }
+ ]
+ }
+] \ No newline at end of file
diff --git a/yql/essentials/udfs/common/digest/test/cases/Init.cfg b/yql/essentials/udfs/common/digest/test/cases/Init.cfg
new file mode 100644
index 0000000000..62e2c58706
--- /dev/null
+++ b/yql/essentials/udfs/common/digest/test/cases/Init.cfg
@@ -0,0 +1 @@
+in plato.Input Basic.in \ No newline at end of file
diff --git a/yql/essentials/udfs/common/digest/test/cases/Init.sql b/yql/essentials/udfs/common/digest/test/cases/Init.sql
new file mode 100644
index 0000000000..7805314d87
--- /dev/null
+++ b/yql/essentials/udfs/common/digest/test/cases/Init.sql
@@ -0,0 +1,11 @@
+SELECT
+ Digest::Crc64(key, 777), Digest::Crc64(key, 777 AS Init),
+ Digest::Fnv32(key, 777), Digest::Fnv32(key, 777 AS Init),
+ Digest::Fnv64(key, 777), Digest::Fnv64(key, 777 AS Init),
+ Digest::MurMurHash(key, 777), Digest::MurMurHash(key, 777 AS Init),
+ Digest::MurMurHash32(key, 777), Digest::MurMurHash32(key, 777 AS Init),
+ Digest::MurMurHash2A(key, 777), Digest::MurMurHash2A(key, 777 AS Init),
+ Digest::MurMurHash2A32(key, 777), Digest::MurMurHash2A32(key, 777 AS Init),
+ Digest::CityHash(key, 777), Digest::CityHash(key, 777 AS Init),
+
+FROM Input; \ No newline at end of file
diff --git a/yql/essentials/udfs/common/hyperscan/test/canondata/test.test_Error_/extracted b/yql/essentials/udfs/common/hyperscan/test/canondata/test.test_Error_/extracted
index d3707ae88c..21ca8cec79 100644
--- a/yql/essentials/udfs/common/hyperscan/test/canondata/test.test_Error_/extracted
+++ b/yql/essentials/udfs/common/hyperscan/test/canondata/test.test_Error_/extracted
@@ -3,6 +3,6 @@
<tmp_path>/program.sql:<main>:8:1: Error: Execution of node: YtMap!
SELECT $match(value) AS match FROM Input;
^
- <tmp_path>/program.sql:<main>:6:21: Error: library/cpp/regex/hyperscan/hyperscan.cpp:102: Failed to compile regex: ^*$. Error message (hyperscan): Invalid repeat at index 1.
+ <tmp_path>/program.sql:<main>:6:21: Error: library/cpp/regex/hyperscan/hyperscan.cpp:92: Failed to compile regex: ^*$. Error message (hyperscan): Invalid repeat at index 1.
$match = Hyperscan::Match("*");
^ \ No newline at end of file
diff --git a/yql/essentials/udfs/common/yson2/test/canondata/test.test_From_/results.txt b/yql/essentials/udfs/common/yson2/test/canondata/test.test_From_/results.txt
index d1e62592cc..ddddb74752 100644
--- a/yql/essentials/udfs/common/yson2/test/canondata/test.test_From_/results.txt
+++ b/yql/essentials/udfs/common/yson2/test/canondata/test.test_From_/results.txt
@@ -32,7 +32,7 @@
"column3";
[
"DataType";
- "Yson"
+ "Bool"
]
];
[
@@ -118,6 +118,13 @@
"DataType";
"Yson"
]
+ ];
+ [
+ "column16";
+ [
+ "DataType";
+ "Yson"
+ ]
]
]
]
@@ -126,6 +133,7 @@
[
%true;
%true;
+ %true;
%false;
{
"$type" = "boolean";
diff --git a/yql/essentials/udfs/common/yson2/test/cases/From.sql b/yql/essentials/udfs/common/yson2/test/cases/From.sql
index 2a1f6ed15a..97b0fff53c 100644
--- a/yql/essentials/udfs/common/yson2/test/cases/From.sql
+++ b/yql/essentials/udfs/common/yson2/test/cases/From.sql
@@ -1,6 +1,7 @@
/* syntax version 1 */
select
Yson::IsEntity(Yson::From(NULL)),
+Yson::IsEntity(Yson::From(Void())),
Yson::IsEntity(Yson::Parse(Yson("#"))),
Yson::IsEntity(Yson::Parse(Yson("1"))),
diff --git a/yql/essentials/udfs/common/yson2/yson2_udf.cpp b/yql/essentials/udfs/common/yson2/yson2_udf.cpp
index 76dbe07c55..997b0cecf1 100644
--- a/yql/essentials/udfs/common/yson2/yson2_udf.cpp
+++ b/yql/essentials/udfs/common/yson2/yson2_udf.cpp
@@ -795,6 +795,7 @@ protected:
static const TType* CheckType(const ITypeInfoHelper::TPtr typeHelper, const TType* shape) {
switch (const auto kind = typeHelper->GetTypeKind(shape)) {
case ETypeKind::Null:
+ case ETypeKind::Void:
case ETypeKind::EmptyList:
case ETypeKind::EmptyDict:
return MoreTypesAllowed ? nullptr : shape;
diff --git a/yql/essentials/utils/log/profile.cpp b/yql/essentials/utils/log/profile.cpp
index 4dd412b8f6..130bb05a4a 100644
--- a/yql/essentials/utils/log/profile.cpp
+++ b/yql/essentials/utils/log/profile.cpp
@@ -17,27 +17,32 @@ TProfilingScope::~TProfilingScope() {
return;
}
- double elapsed = static_cast<double>(::MicroSeconds() - StartedAt_);
- TStringBuf unit("us");
- if (elapsed > 1000000) {
- elapsed /= 1000000;
- unit = TStringBuf("s");
- } else if (elapsed > 1000) {
- elapsed /= 1000;
- unit = TStringBuf("ms");
- }
-
- auto doLog = [&]() {
- YQL_PERF_LOG(Level_, File_, Line_)
- << TStringBuf("Execution of [") << Name_
- << TStringBuf("] took ") << Prec(elapsed, 3) << unit;
- };
-
- if (!LogCtxPath_.first.empty() || !LogCtxPath_.second.empty()) {
- YQL_LOG_CTX_ROOT_SESSION_SCOPE(LogCtxPath_);
- doLog();
- } else {
- doLog();
+ try {
+ double elapsed = static_cast<double>(::MicroSeconds() - StartedAt_);
+ TStringBuf unit("us");
+ if (elapsed > 1000000) {
+ elapsed /= 1000000;
+ unit = TStringBuf("s");
+ } else if (elapsed > 1000) {
+ elapsed /= 1000;
+ unit = TStringBuf("ms");
+ }
+
+ auto doLog = [&]() {
+ YQL_PERF_LOG(Level_, File_, Line_)
+ << TStringBuf("Execution of [") << Name_
+ << TStringBuf("] took ") << Prec(elapsed, 3) << unit;
+ };
+
+ if (!LogCtxPath_.first.empty() || !LogCtxPath_.second.empty()) {
+ YQL_LOG_CTX_ROOT_SESSION_SCOPE(LogCtxPath_);
+ doLog();
+ } else {
+ doLog();
+ }
+ } catch (const std::bad_alloc&) {
+ // no memory, we will not write anything
+ Y_ABORT("No memory");
}
}
diff --git a/yt/cpp/mapreduce/client/client.cpp b/yt/cpp/mapreduce/client/client.cpp
index 9e3976b144..9fcb82f5b7 100644
--- a/yt/cpp/mapreduce/client/client.cpp
+++ b/yt/cpp/mapreduce/client/client.cpp
@@ -1352,11 +1352,27 @@ TNode::TListType TClient::SkyShareTable(
const TSkyShareTableOptions& options)
{
CheckShutdown();
- return NRawClient::SkyShareTable(
- ClientRetryPolicy_->CreatePolicyForGenericRequest(),
- Context_,
- tablePaths,
- options);
+
+ // As documented at https://wiki.yandex-team.ru/yt/userdoc/blob_tables/#shag3.sozdajomrazdachu
+ // first request returns HTTP status code 202 (Accepted). And we need retrying until we have 200 (OK).
+ NHttpClient::IHttpResponsePtr response;
+ do {
+ response = RequestWithRetry<NHttpClient::IHttpResponsePtr>(
+ ClientRetryPolicy_->CreatePolicyForGenericRequest(),
+ [this, &tablePaths, &options] (TMutationId /*mutationId*/) {
+ return RawClient_->SkyShareTable(tablePaths, options);
+ });
+ TWaitProxy::Get()->Sleep(TDuration::Seconds(5));
+ } while (response->GetStatusCode() != 200);
+
+ if (options.KeyColumns_) {
+ return NodeFromJsonString(response->GetResponse())["torrents"].AsList();
+ } else {
+ TNode torrent;
+ torrent["key"] = TNode::CreateList();
+ torrent["rbtorrent"] = response->GetResponse();
+ return TNode::TListType{torrent};
+ }
}
TCheckPermissionResponse TClient::CheckPermission(
diff --git a/yt/cpp/mapreduce/client/client_reader.cpp b/yt/cpp/mapreduce/client/client_reader.cpp
index b312716877..e7538a22da 100644
--- a/yt/cpp/mapreduce/client/client_reader.cpp
+++ b/yt/cpp/mapreduce/client/client_reader.cpp
@@ -166,99 +166,28 @@ void TClientReader::CreateRequest(const TMaybe<ui32>& rangeIndex, const TMaybe<u
CurrentRequestRetryPolicy_ = ClientRetryPolicy_->CreatePolicyForGenericRequest();
}
- bool areRangesUpdated = false;
+ auto transactionId = (ReadTransaction_ ? ReadTransaction_->GetId() : ParentTransactionId_);
- while (true) {
- CurrentRequestRetryPolicy_->NotifyNewAttempt();
-
- THttpHeader header("GET", GetReadTableCommand(Context_.Config->ApiVersion));
- if (Context_.ServiceTicketAuth) {
- header.SetServiceTicket(Context_.ServiceTicketAuth->Ptr->IssueServiceTicket());
+ if (rowIndex.Defined()) {
+ auto& ranges = Path_.MutableRanges();
+ if (ranges.Empty()) {
+ ranges.ConstructInPlace(TVector{TReadRange()});
} else {
- header.SetToken(Context_.Token);
- }
-
- if (Context_.ImpersonationUser) {
- header.SetImpersonationUser(*Context_.ImpersonationUser);
- }
-
- auto transactionId = (ReadTransaction_ ? ReadTransaction_->GetId() : ParentTransactionId_);
- header.AddTransactionId(transactionId);
-
- const auto& controlAttributes = Options_.ControlAttributes_;
- header.AddParameter("control_attributes", TNode()
- ("enable_row_index", controlAttributes.EnableRowIndex_)
- ("enable_range_index", controlAttributes.EnableRangeIndex_));
- header.SetOutputFormat(Format_);
-
- header.SetResponseCompression(ToString(Context_.Config->AcceptEncoding));
-
- if (rowIndex.Defined() && !areRangesUpdated) {
- auto& ranges = Path_.MutableRanges();
- if (ranges.Empty()) {
- ranges.ConstructInPlace(TVector{TReadRange()});
- } else {
- if (rangeIndex.GetOrElse(0) >= ranges->size()) {
- ythrow yexception()
- << "range index " << rangeIndex.GetOrElse(0)
- << " is out of range, input range count is " << ranges->size();
- }
- ranges->erase(ranges->begin(), ranges->begin() + rangeIndex.GetOrElse(0));
+ if (rangeIndex.GetOrElse(0) >= ranges->size()) {
+ ythrow yexception()
+ << "range index " << rangeIndex.GetOrElse(0)
+ << " is out of range, input range count is " << ranges->size();
}
- ranges->begin()->LowerLimit(TReadLimit().RowIndex(*rowIndex));
- areRangesUpdated = true;
- }
-
- header.MergeParameters(FormIORequestParameters(Path_, Options_));
-
- auto requestId = CreateGuidAsString();
-
- try {
- const auto proxyName = GetProxyForHeavyRequest(Context_);
- UpdateHeaderForProxyIfNeed(proxyName, Context_, header);
- Response_ = Context_.HttpClient->Request(GetFullUrlForProxy(proxyName, Context_, header), requestId, header);
-
- Input_ = Response_->GetResponseStream();
-
- YT_LOG_DEBUG(
- "RSP %v - table stream (RangeIndex: %v, RowIndex: %v)",
- requestId,
- rangeIndex,
- rowIndex);
-
- return;
- } catch (const TErrorResponse& e) {
- LogRequestError(
- requestId,
- header,
- e.what(),
- CurrentRequestRetryPolicy_->GetAttemptDescription());
-
- if (!IsRetriable(e)) {
- throw;
- }
- auto backoff = CurrentRequestRetryPolicy_->OnRetriableError(e);
- if (!backoff) {
- throw;
- }
- NDetail::TWaitProxy::Get()->Sleep(*backoff);
- } catch (const std::exception& e) {
- LogRequestError(
- requestId,
- header,
- e.what(),
- CurrentRequestRetryPolicy_->GetAttemptDescription());
-
- Response_.reset();
- Input_ = nullptr;
-
- auto backoff = CurrentRequestRetryPolicy_->OnGenericError(e);
- if (!backoff) {
- throw;
- }
- NDetail::TWaitProxy::Get()->Sleep(*backoff);
+ ranges->erase(ranges->begin(), ranges->begin() + rangeIndex.GetOrElse(0));
}
+ ranges->begin()->LowerLimit(TReadLimit().RowIndex(*rowIndex));
}
+
+ Input_ = NDetail::RequestWithRetry<std::unique_ptr<IInputStream>>(
+ CurrentRequestRetryPolicy_,
+ [this, &transactionId] (TMutationId /*mutationId*/) {
+ return RawClient_->ReadTable(transactionId, Path_, Format_, Options_);
+ });
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/cpp/mapreduce/client/client_reader.h b/yt/cpp/mapreduce/client/client_reader.h
index 61bc698340..3f73080046 100644
--- a/yt/cpp/mapreduce/client/client_reader.h
+++ b/yt/cpp/mapreduce/client/client_reader.h
@@ -2,8 +2,6 @@
#include <yt/cpp/mapreduce/common/fwd.h>
-#include <yt/cpp/mapreduce/interface/io.h>
-
#include <yt/cpp/mapreduce/http/context.h>
#include <yt/cpp/mapreduce/http/requests.h>
#include <yt/cpp/mapreduce/http/http.h>
@@ -55,8 +53,7 @@ private:
THolder<TPingableTransaction> ReadTransaction_;
- NHttpClient::IHttpResponsePtr Response_;
- IInputStream* Input_;
+ std::unique_ptr<IInputStream> Input_;
IRequestRetryPolicyPtr CurrentRequestRetryPolicy_;
diff --git a/yt/cpp/mapreduce/client/file_reader.cpp b/yt/cpp/mapreduce/client/file_reader.cpp
index 06463d0af2..f88b40e38b 100644
--- a/yt/cpp/mapreduce/client/file_reader.cpp
+++ b/yt/cpp/mapreduce/client/file_reader.cpp
@@ -31,7 +31,7 @@ using ::ToString;
static TMaybe<ui64> GetEndOffset(const TFileReaderOptions& options) {
if (options.Length_) {
- return options.Offset_.GetOrElse(0) + *options.Length_;
+ return options.Offset_ + *options.Length_;
} else {
return Nothing();
}
@@ -46,7 +46,6 @@ TStreamReaderBase::TStreamReaderBase(
const TClientContext& context,
const TTransactionId& transactionId)
: RawClient_(rawClient)
- , Context_(context)
, ClientRetryPolicy_(std::move(clientRetryPolicy))
, ReadTransaction_(MakeHolder<TPingableTransaction>(
RawClient_,
@@ -64,59 +63,26 @@ TYPath TStreamReaderBase::Snapshot(const TYPath& path)
return NYT::Snapshot(RawClient_, ClientRetryPolicy_, ReadTransaction_->GetId(), path);
}
-TString TStreamReaderBase::GetActiveRequestId() const
-{
- if (Response_) {
- return Response_->GetRequestId();;
- } else {
- return "<no-active-request>";
- }
-}
-
size_t TStreamReaderBase::DoRead(void* buf, size_t len)
{
- const int retryCount = Context_.Config->ReadRetryCount;
- for (int attempt = 1; attempt <= retryCount; ++attempt) {
- try {
- if (!Input_) {
- Response_ = Request(Context_, ReadTransaction_->GetId(), CurrentOffset_);
- Input_ = Response_->GetResponseStream();
- }
- if (len == 0) {
- return 0;
- }
- const size_t read = Input_->Read(buf, len);
- CurrentOffset_ += read;
- return read;
- } catch (TErrorResponse& e) {
- YT_LOG_ERROR("RSP %v - failed: %v (attempt %v of %v)",
- GetActiveRequestId(),
- e.what(),
- attempt,
- retryCount);
-
- if (!IsRetriable(e) || attempt == retryCount) {
- throw;
- }
- TWaitProxy::Get()->Sleep(GetBackoffDuration(e, Context_.Config));
- } catch (std::exception& e) {
- YT_LOG_ERROR("RSP %v - failed: %v (attempt %v of %v)",
- GetActiveRequestId(),
- e.what(),
- attempt,
- retryCount);
-
- // Invalidate connection.
- Response_.reset();
-
- if (attempt == retryCount) {
+ if (len == 0) {
+ return 0;
+ }
+ return RequestWithRetry<size_t>(
+ ClientRetryPolicy_->CreatePolicyForReaderRequest(),
+ [this, &buf, len] (TMutationId /*mutationId*/) {
+ try {
+ if (!Input_) {
+ Input_ = Request(ReadTransaction_->GetId(), CurrentOffset_);
+ }
+ const size_t read = Input_->Read(buf, len);
+ CurrentOffset_ += read;
+ return read;
+ } catch (...) {
+ Input_ = nullptr;
throw;
}
- TWaitProxy::Get()->Sleep(GetBackoffDuration(e, Context_.Config));
- }
- Input_ = nullptr;
- }
- Y_UNREACHABLE(); // we should either return or throw from loop above
+ });
}
////////////////////////////////////////////////////////////////////////////////
@@ -130,57 +96,25 @@ TFileReader::TFileReader(
const TTransactionId& transactionId,
const TFileReaderOptions& options)
: TStreamReaderBase(rawClient, std::move(clientRetryPolicy), std::move(transactionPinger), context, transactionId)
- , FileReaderOptions_(options)
+ , StartOffset_(options.Offset_)
+ , EndOffset_(GetEndOffset(options))
+ , Options_(options)
, Path_(path)
- , StartOffset_(FileReaderOptions_.Offset_.GetOrElse(0))
- , EndOffset_(GetEndOffset(FileReaderOptions_))
{
Path_.Path_ = TStreamReaderBase::Snapshot(Path_.Path_);
}
-NHttpClient::IHttpResponsePtr TFileReader::Request(const TClientContext& context, const TTransactionId& transactionId, ui64 readBytes)
+std::unique_ptr<IInputStream> TFileReader::Request(const TTransactionId& transactionId, ui64 readBytes)
{
const ui64 currentOffset = StartOffset_ + readBytes;
- TString hostName = GetProxyForHeavyRequest(context);
-
- THttpHeader header("GET", GetReadFileCommand(context.Config->ApiVersion));
- if (context.ServiceTicketAuth) {
- header.SetServiceTicket(context.ServiceTicketAuth->Ptr->IssueServiceTicket());
- } else {
- header.SetToken(context.Token);
- }
-
- if (context.ImpersonationUser) {
- header.SetImpersonationUser(*context.ImpersonationUser);
- }
-
- UpdateHeaderForProxyIfNeed(hostName, context, header);
-
- header.AddTransactionId(transactionId);
- header.SetOutputFormat(TMaybe<TFormat>()); // Binary format
if (EndOffset_) {
Y_ABORT_UNLESS(*EndOffset_ >= currentOffset);
- FileReaderOptions_.Length(*EndOffset_ - currentOffset);
- }
- FileReaderOptions_.Offset(currentOffset);
- header.MergeParameters(FormIORequestParameters(Path_, FileReaderOptions_));
-
- header.SetResponseCompression(ToString(context.Config->AcceptEncoding));
-
- auto requestId = CreateGuidAsString();
- NHttpClient::IHttpResponsePtr response;
- try {
- response = context.HttpClient->Request(GetFullUrl(hostName, context, header), requestId, header);
- } catch (const std::exception& ex) {
- LogRequestError(requestId, header, ex.what(), "");
- throw;
+ Options_.Length(*EndOffset_ - currentOffset);
}
- YT_LOG_DEBUG("RSP %v - file stream",
- requestId);
-
- return response;
+ Options_.Offset(currentOffset);
+ return RawClient_->ReadFile(transactionId, Path_, Options_);
}
////////////////////////////////////////////////////////////////////////////////
@@ -195,66 +129,22 @@ TBlobTableReader::TBlobTableReader(
const TTransactionId& transactionId,
const TBlobTableReaderOptions& options)
: TStreamReaderBase(rawClient, std::move(retryPolicy), std::move(transactionPinger), context, transactionId)
+ , StartOffset_(options.Offset_)
, Key_(key)
, Options_(options)
{
Path_ = TStreamReaderBase::Snapshot(path);
}
-NHttpClient::IHttpResponsePtr TBlobTableReader::Request(const TClientContext& context, const TTransactionId& transactionId, ui64 readBytes)
+std::unique_ptr<IInputStream> TBlobTableReader::Request(const TTransactionId& transactionId, ui64 readBytes)
{
- TString hostName = GetProxyForHeavyRequest(context);
-
- THttpHeader header("GET", "read_blob_table");
- if (context.ServiceTicketAuth) {
- header.SetServiceTicket(context.ServiceTicketAuth->Ptr->IssueServiceTicket());
- } else {
- header.SetToken(context.Token);
- }
-
- if (context.ImpersonationUser) {
- header.SetImpersonationUser(*context.ImpersonationUser);
- }
-
- UpdateHeaderForProxyIfNeed(hostName, context, header);
-
- header.AddTransactionId(transactionId);
- header.SetOutputFormat(TMaybe<TFormat>()); // Binary format
-
- const ui64 currentOffset = Options_.Offset_ + readBytes;
+ const i64 currentOffset = StartOffset_ + readBytes;
const i64 startPartIndex = currentOffset / Options_.PartSize_;
- const ui64 skipBytes = currentOffset - Options_.PartSize_ * startPartIndex;
- auto lowerLimitKey = Key_;
- lowerLimitKey.Parts_.push_back(startPartIndex);
- auto upperLimitKey = Key_;
- upperLimitKey.Parts_.push_back(std::numeric_limits<i64>::max());
- TNode params = PathToParamNode(TRichYPath(Path_).AddRange(TReadRange()
- .LowerLimit(TReadLimit().Key(lowerLimitKey))
- .UpperLimit(TReadLimit().Key(upperLimitKey))));
- params["start_part_index"] = TNode(startPartIndex);
- params["offset"] = skipBytes;
- if (Options_.PartIndexColumnName_) {
- params["part_index_column_name"] = *Options_.PartIndexColumnName_;
- }
- if (Options_.DataColumnName_) {
- params["data_column_name"] = *Options_.DataColumnName_;
- }
- params["part_size"] = Options_.PartSize_;
- header.MergeParameters(params);
- header.SetResponseCompression(ToString(context.Config->AcceptEncoding));
-
- auto requestId = CreateGuidAsString();
- NHttpClient::IHttpResponsePtr response;
- try {
- response = context.HttpClient->Request(GetFullUrl(hostName, context, header), requestId, header);
- } catch (const std::exception& ex) {
- LogRequestError(requestId, header, ex.what(), "");
- throw;
- }
+ const i64 skipBytes = currentOffset - Options_.PartSize_ * startPartIndex;
- YT_LOG_DEBUG("RSP %v - blob table stream",
- requestId);
- return response;
+ Options_.Offset(skipBytes);
+ Options_.StartPartIndex(startPartIndex);
+ return RawClient_->ReadBlobTable(transactionId, Path_, Key_, Options_);
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/cpp/mapreduce/client/file_reader.h b/yt/cpp/mapreduce/client/file_reader.h
index 48248696d3..8aafdc860d 100644
--- a/yt/cpp/mapreduce/client/file_reader.h
+++ b/yt/cpp/mapreduce/client/file_reader.h
@@ -11,7 +11,6 @@ class IInputStream;
namespace NYT {
-class THttpRequest;
class TPingableTransaction;
namespace NDetail {
@@ -35,19 +34,16 @@ protected:
protected:
const IRawClientPtr RawClient_;
- const TClientContext Context_;
private:
size_t DoRead(void* buf, size_t len) override;
- virtual NHttpClient::IHttpResponsePtr Request(const TClientContext& context, const TTransactionId& transactionId, ui64 readBytes) = 0;
- TString GetActiveRequestId() const;
+ virtual std::unique_ptr<IInputStream> Request(const TTransactionId& transactionId, ui64 readBytes) = 0;
private:
const IClientRetryPolicyPtr ClientRetryPolicy_;
TFileReaderOptions FileReaderOptions_;
- NHttpClient::IHttpResponsePtr Response_;
- IInputStream* Input_ = nullptr;
+ std::unique_ptr<IInputStream> Input_;
THolder<TPingableTransaction> ReadTransaction_;
@@ -67,17 +63,17 @@ public:
ITransactionPingerPtr transactionPinger,
const TClientContext& context,
const TTransactionId& transactionId,
- const TFileReaderOptions& options = TFileReaderOptions());
+ const TFileReaderOptions& options = {});
private:
- NHttpClient::IHttpResponsePtr Request(const TClientContext& context, const TTransactionId& transactionId, ui64 readBytes) override;
+ std::unique_ptr<IInputStream> Request(const TTransactionId& transactionId, ui64 readBytes) override;
private:
- TFileReaderOptions FileReaderOptions_;
-
- TRichYPath Path_;
const ui64 StartOffset_;
const TMaybe<ui64> EndOffset_;
+
+ TFileReaderOptions Options_;
+ TRichYPath Path_;
};
////////////////////////////////////////////////////////////////////////////////
@@ -94,14 +90,16 @@ public:
ITransactionPingerPtr transactionPinger,
const TClientContext& context,
const TTransactionId& transactionId,
- const TBlobTableReaderOptions& options);
+ const TBlobTableReaderOptions& options = {});
private:
- NHttpClient::IHttpResponsePtr Request(const TClientContext& context, const TTransactionId& transactionId, ui64 readBytes) override;
+ std::unique_ptr<IInputStream> Request(const TTransactionId& transactionId, ui64 readBytes) override;
private:
+ const ui64 StartOffset_;
const TKey Key_;
- const TBlobTableReaderOptions Options_;
+
+ TBlobTableReaderOptions Options_;
TYPath Path_;
};
diff --git a/yt/cpp/mapreduce/common/retry_lib.cpp b/yt/cpp/mapreduce/common/retry_lib.cpp
index 772a2ab0cd..8146eb8b46 100644
--- a/yt/cpp/mapreduce/common/retry_lib.cpp
+++ b/yt/cpp/mapreduce/common/retry_lib.cpp
@@ -118,6 +118,11 @@ public:
return Wrap(MakeIntrusive<TAttemptLimitedRetryPolicy>(static_cast<ui32>(Config_->StartOperationRetryCount), Config_));
}
+ IRequestRetryPolicyPtr CreatePolicyForReaderRequest() override
+ {
+ return Wrap(MakeIntrusive<TAttemptLimitedRetryPolicy>(static_cast<ui32>(Config_->ReadRetryCount), Config_));
+ }
+
IRequestRetryPolicyPtr Wrap(IRequestRetryPolicyPtr basePolicy)
{
auto config = RetryConfigProvider_->CreateRetryConfig();
diff --git a/yt/cpp/mapreduce/common/retry_lib.h b/yt/cpp/mapreduce/common/retry_lib.h
index c6c061f614..5b406b075f 100644
--- a/yt/cpp/mapreduce/common/retry_lib.h
+++ b/yt/cpp/mapreduce/common/retry_lib.h
@@ -48,6 +48,7 @@ class IClientRetryPolicy
public:
virtual IRequestRetryPolicyPtr CreatePolicyForGenericRequest() = 0;
virtual IRequestRetryPolicyPtr CreatePolicyForStartOperationRequest() = 0;
+ virtual IRequestRetryPolicyPtr CreatePolicyForReaderRequest() = 0;
};
diff --git a/yt/cpp/mapreduce/http/http_client.h b/yt/cpp/mapreduce/http/http_client.h
index 6087eca098..a01b619fab 100644
--- a/yt/cpp/mapreduce/http/http_client.h
+++ b/yt/cpp/mapreduce/http/http_client.h
@@ -42,7 +42,6 @@ public:
virtual IHttpResponsePtr Finish() = 0;
};
-
class IHttpClient
{
public:
@@ -65,6 +64,34 @@ public:
////////////////////////////////////////////////////////////////////////////////
+class THttpResponseStream
+ : public IInputStream
+{
+public:
+ THttpResponseStream(IHttpResponsePtr response)
+ : Response_(std::move(response))
+ {
+ Underlying_ = Response_->GetResponseStream();
+ }
+
+private:
+ size_t DoRead(void *buf, size_t len) override
+ {
+ return Underlying_->Read(buf, len);
+ }
+
+ size_t DoSkip(size_t len) override
+ {
+ return Underlying_->Skip(len);
+ }
+
+private:
+ IHttpResponsePtr Response_;
+ IInputStream* Underlying_;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
IHttpClientPtr CreateDefaultHttpClient();
IHttpClientPtr CreateCoreHttpClient(bool useTLS, const TConfigPtr& config);
diff --git a/yt/cpp/mapreduce/http/retry_request.cpp b/yt/cpp/mapreduce/http/retry_request.cpp
index 1d9267009f..a47b2952b1 100644
--- a/yt/cpp/mapreduce/http/retry_request.cpp
+++ b/yt/cpp/mapreduce/http/retry_request.cpp
@@ -20,7 +20,7 @@ namespace NDetail {
////////////////////////////////////////////////////////////////////////////////
-static TResponseInfo Request(
+static NHttpClient::IHttpResponsePtr Request(
const TClientContext& context,
THttpHeader& header,
TMaybe<TStringBuf> body,
@@ -38,16 +38,10 @@ static TResponseInfo Request(
auto url = GetFullUrlForProxy(hostName, context, header);
- auto response = context.HttpClient->Request(url, requestId, config.HttpConfig, header, body);
-
- TResponseInfo result;
- result.RequestId = requestId;
- result.Response = response->GetResponse();
- result.HttpCode = response->GetStatusCode();
- return result;
+ return context.HttpClient->Request(url, requestId, config.HttpConfig, header, body);
}
-TResponseInfo RequestWithoutRetry(
+NHttpClient::IHttpResponsePtr RequestWithoutRetry(
const TClientContext& context,
TMutationId& mutationId,
THttpHeader& header,
@@ -118,7 +112,12 @@ TResponseInfo RetryRequestWithPolicy(
}
}
- return Request(context, header, body, requestId, config);
+ auto response = Request(context, header, body, requestId, config);
+ return TResponseInfo{
+ .RequestId = response->GetRequestId(),
+ .Response = response->GetResponse(),
+ .HttpCode = response->GetStatusCode(),
+ };
} catch (const TErrorResponse& e) {
LogRequestError(requestId, header, e.what(), retryPolicy->GetAttemptDescription());
retryWithSameMutationId = e.IsTransportError();
diff --git a/yt/cpp/mapreduce/http/retry_request.h b/yt/cpp/mapreduce/http/retry_request.h
index 9750d0b541..444ecbbafc 100644
--- a/yt/cpp/mapreduce/http/retry_request.h
+++ b/yt/cpp/mapreduce/http/retry_request.h
@@ -105,7 +105,7 @@ TResponseInfo RetryRequestWithPolicy(
TMaybe<TStringBuf> body = {},
const TRequestConfig& config = TRequestConfig());
-TResponseInfo RequestWithoutRetry(
+NHttpClient::IHttpResponsePtr RequestWithoutRetry(
const TClientContext& context,
TMutationId& mutationId,
THttpHeader& header,
diff --git a/yt/cpp/mapreduce/interface/client_method_options.h b/yt/cpp/mapreduce/interface/client_method_options.h
index 9bfb79753d..d457bf5f43 100644
--- a/yt/cpp/mapreduce/interface/client_method_options.h
+++ b/yt/cpp/mapreduce/interface/client_method_options.h
@@ -287,9 +287,12 @@ struct TBlobTableReaderOptions
///
/// All blob parts except the last part of the blob must be of this size
/// otherwise blob table reader emits error.
- FLUENT_FIELD_DEFAULT(ui64, PartSize, 4 * 1024 * 1024);
+ FLUENT_FIELD_DEFAULT(i64, PartSize, 4 * 1024 * 1024);
- /// @brief Offset from which to start reading
+ /// @brief Part index from which to start reading.
+ FLUENT_FIELD_DEFAULT(i64, StartPartIndex, 0);
+
+ /// @brief Offset from which to start reading.
FLUENT_FIELD_DEFAULT(i64, Offset, 0);
};
@@ -468,7 +471,7 @@ struct TFileReaderOptions
/// @brief Offset to start reading from.
///
/// By default reading is started from the beginning of the file.
- FLUENT_FIELD_OPTION(i64, Offset);
+ FLUENT_FIELD_DEFAULT(i64, Offset, 0);
///
/// @brief Maximum length to read.
diff --git a/yt/cpp/mapreduce/interface/raw_client.h b/yt/cpp/mapreduce/interface/raw_client.h
index 32055e3d00..4994826863 100644
--- a/yt/cpp/mapreduce/interface/raw_client.h
+++ b/yt/cpp/mapreduce/interface/raw_client.h
@@ -8,6 +8,13 @@ namespace NYT {
////////////////////////////////////////////////////////////////////////////////
+namespace NHttpClient {
+ class IHttpResponse;
+ using IHttpResponsePtr = std::unique_ptr<IHttpResponse>;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
class IRawClient
: public virtual TThrRefBase
{
@@ -196,6 +203,18 @@ public:
const TOperationId& operationId,
const TGetJobTraceOptions& options = {}) = 0;
+ // SkyShare
+
+ virtual NHttpClient::IHttpResponsePtr SkyShareTable(
+ const std::vector<TYPath>& tablePaths,
+ const TSkyShareTableOptions& options = {}) = 0;
+
+ // Files
+ virtual std::unique_ptr<IInputStream> ReadFile(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TFileReaderOptions& options = {}) = 0;
+
// File cache
virtual TMaybe<TYPath> GetFileFromCache(
@@ -266,6 +285,18 @@ public:
const TYPath& path,
const TAlterTableOptions& options = {}) = 0;
+ virtual std::unique_ptr<IInputStream> ReadTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TMaybe<TFormat>& format,
+ const TTableReaderOptions& options = {}) = 0;
+
+ virtual std::unique_ptr<IInputStream> ReadBlobTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TKey& key,
+ const TBlobTableReaderOptions& options = {}) = 0;
+
virtual void AlterTableReplica(
TMutationId& mutationId,
const TReplicaId& replicaId,
diff --git a/yt/cpp/mapreduce/io/helpers.h b/yt/cpp/mapreduce/io/helpers.h
index 0733ff417c..0d3ec40ab6 100644
--- a/yt/cpp/mapreduce/io/helpers.h
+++ b/yt/cpp/mapreduce/io/helpers.h
@@ -63,9 +63,7 @@ inline TNode FormIORequestParameters(
if (options.Config_) {
params[TIOOptionsTraits<TTableReaderOptions>::ConfigName] = *options.Config_;
}
- if (options.Offset_) {
- params["offset"] = *options.Offset_;
- }
+ params["offset"] = options.Offset_;
if (options.Length_) {
params["length"] = *options.Length_;
}
diff --git a/yt/cpp/mapreduce/raw_client/raw_client.cpp b/yt/cpp/mapreduce/raw_client/raw_client.cpp
index 71d8d5fba9..65bfa01cea 100644
--- a/yt/cpp/mapreduce/raw_client/raw_client.cpp
+++ b/yt/cpp/mapreduce/raw_client/raw_client.cpp
@@ -14,6 +14,8 @@
#include <yt/cpp/mapreduce/interface/operation.h>
#include <yt/cpp/mapreduce/interface/tvm.h>
+#include <yt/cpp/mapreduce/io/helpers.h>
+
#include <library/cpp/yson/node/node_io.h>
namespace NYT::NDetail {
@@ -32,7 +34,7 @@ TNode THttpRawClient::Get(
TMutationId mutationId;
THttpHeader header("GET", "get");
header.MergeParameters(NRawClient::SerializeParamsForGet(transactionId, Context_.Config->Prefix, path, options));
- return NodeFromYsonString(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return NodeFromYsonString(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
TNode THttpRawClient::TryGet(
@@ -61,7 +63,7 @@ void THttpRawClient::Set(
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForSet(transactionId, Context_.Config->Prefix, path, options));
auto body = NodeToYsonString(value);
- RequestWithoutRetry(Context_, mutationId, header, body);
+ RequestWithoutRetry(Context_, mutationId, header, body)->GetResponse();
}
bool THttpRawClient::Exists(
@@ -72,7 +74,7 @@ bool THttpRawClient::Exists(
TMutationId mutationId;
THttpHeader header("GET", "exists");
header.MergeParameters(NRawClient::SerializeParamsForExists(transactionId, Context_.Config->Prefix, path, options));
- return ParseBoolFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseBoolFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
void THttpRawClient::MultisetAttributes(
@@ -86,7 +88,7 @@ void THttpRawClient::MultisetAttributes(
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForMultisetAttributes(transactionId, Context_.Config->Prefix, path, options));
auto body = NodeToYsonString(value);
- RequestWithoutRetry(Context_, mutationId, header, body);
+ RequestWithoutRetry(Context_, mutationId, header, body)->GetResponse();
}
TNodeId THttpRawClient::Create(
@@ -99,7 +101,7 @@ TNodeId THttpRawClient::Create(
THttpHeader header("POST", "create");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForCreate(transactionId, Context_.Config->Prefix, path, type, options));
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
TNodeId THttpRawClient::CopyWithoutRetries(
@@ -112,7 +114,7 @@ TNodeId THttpRawClient::CopyWithoutRetries(
THttpHeader header("POST", "copy");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForCopy(transactionId, Context_.Config->Prefix, sourcePath, destinationPath, options));
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
TNodeId THttpRawClient::CopyInsideMasterCell(
@@ -129,7 +131,7 @@ TNodeId THttpRawClient::CopyInsideMasterCell(
// Make cross cell copying disable.
params["enable_cross_cell_copying"] = false;
header.MergeParameters(params);
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
TNodeId THttpRawClient::MoveWithoutRetries(
@@ -142,7 +144,7 @@ TNodeId THttpRawClient::MoveWithoutRetries(
THttpHeader header("POST", "move");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForMove(transactionId, Context_.Config->Prefix, sourcePath, destinationPath, options));
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
TNodeId THttpRawClient::MoveInsideMasterCell(
@@ -159,7 +161,7 @@ TNodeId THttpRawClient::MoveInsideMasterCell(
// Make cross cell copying disable.
params["enable_cross_cell_copying"] = false;
header.MergeParameters(params);
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
void THttpRawClient::Remove(
@@ -171,7 +173,7 @@ void THttpRawClient::Remove(
THttpHeader header("POST", "remove");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForRemove(transactionId, Context_.Config->Prefix, path, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
TNode::TListType THttpRawClient::List(
@@ -190,7 +192,7 @@ TNode::TListType THttpRawClient::List(
}
header.MergeParameters(NRawClient::SerializeParamsForList(transactionId, Context_.Config->Prefix, updatedPath, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- return NodeFromYsonString(responseInfo.Response).AsList();
+ return NodeFromYsonString(responseInfo->GetResponse()).AsList();
}
TNodeId THttpRawClient::Link(
@@ -203,7 +205,7 @@ TNodeId THttpRawClient::Link(
THttpHeader header("POST", "link");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForLink(transactionId, Context_.Config->Prefix, targetPath, linkPath, options));
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
TLockId THttpRawClient::Lock(
@@ -216,7 +218,7 @@ TLockId THttpRawClient::Lock(
THttpHeader header("POST", "lock");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForLock(transactionId, Context_.Config->Prefix, path, mode, options));
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
void THttpRawClient::Unlock(
@@ -228,7 +230,7 @@ void THttpRawClient::Unlock(
THttpHeader header("POST", "unlock");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForUnlock(transactionId, Context_.Config->Prefix, path, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::Concatenate(
@@ -241,7 +243,7 @@ void THttpRawClient::Concatenate(
THttpHeader header("POST", "concatenate");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForConcatenate(transactionId, Context_.Config->Prefix, sourcePaths, destinationPath, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
TTransactionId THttpRawClient::StartTransaction(
@@ -252,7 +254,7 @@ TTransactionId THttpRawClient::StartTransaction(
THttpHeader header("POST", "start_tx");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForStartTransaction(parentTransactionId, Context_.Config->TxTimeout, options));
- return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header).Response);
+ return ParseGuidFromResponse(RequestWithoutRetry(Context_, mutationId, header)->GetResponse());
}
void THttpRawClient::PingTransaction(const TTransactionId& transactionId)
@@ -264,7 +266,7 @@ void THttpRawClient::PingTransaction(const TTransactionId& transactionId)
requestConfig.HttpConfig = NHttpClient::THttpConfig{
.SocketTimeout = Context_.Config->PingTimeout
};
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::AbortTransaction(
@@ -274,7 +276,7 @@ void THttpRawClient::AbortTransaction(
THttpHeader header("POST", "abort_tx");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForAbortTransaction(transactionId));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::CommitTransaction(
@@ -284,7 +286,7 @@ void THttpRawClient::CommitTransaction(
THttpHeader header("POST", "commit_tx");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForCommitTransaction(transactionId));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
TOperationAttributes THttpRawClient::GetOperation(
@@ -295,7 +297,7 @@ TOperationAttributes THttpRawClient::GetOperation(
THttpHeader header("GET", "get_operation");
header.MergeParameters(NRawClient::SerializeParamsForGetOperation(operationId, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- return NRawClient::ParseOperationAttributes(NodeFromYsonString(responseInfo.Response));
+ return NRawClient::ParseOperationAttributes(NodeFromYsonString(responseInfo->GetResponse()));
}
TOperationAttributes THttpRawClient::GetOperation(
@@ -306,7 +308,7 @@ TOperationAttributes THttpRawClient::GetOperation(
THttpHeader header("GET", "get_operation");
header.MergeParameters(NRawClient::SerializeParamsForGetOperation(alias, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- return NRawClient::ParseOperationAttributes(NodeFromYsonString(responseInfo.Response));
+ return NRawClient::ParseOperationAttributes(NodeFromYsonString(responseInfo->GetResponse()));
}
void THttpRawClient::AbortOperation(
@@ -316,7 +318,7 @@ void THttpRawClient::AbortOperation(
THttpHeader header("POST", "abort_op");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForAbortOperation(operationId));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::CompleteOperation(
@@ -326,7 +328,7 @@ void THttpRawClient::CompleteOperation(
THttpHeader header("POST", "complete_op");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForCompleteOperation(operationId));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::SuspendOperation(
@@ -337,7 +339,7 @@ void THttpRawClient::SuspendOperation(
THttpHeader header("POST", "suspend_op");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForSuspendOperation(operationId, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::ResumeOperation(
@@ -348,7 +350,7 @@ void THttpRawClient::ResumeOperation(
THttpHeader header("POST", "resume_op");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForResumeOperation(operationId, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
template <typename TKey>
@@ -367,7 +369,7 @@ TListOperationsResult THttpRawClient::ListOperations(const TListOperationsOption
THttpHeader header("GET", "list_operations");
header.MergeParameters(NRawClient::SerializeParamsForListOperations(options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- auto resultNode = NodeFromYsonString(responseInfo.Response);
+ auto resultNode = NodeFromYsonString(responseInfo->GetResponse());
const auto& operationNodesList = resultNode["operations"].AsList();
@@ -417,7 +419,7 @@ NYson::TYsonString THttpRawClient::GetJob(
THttpHeader header("GET", "get_job");
header.MergeParameters(NRawClient::SerializeParamsForGetJob(operationId, jobId, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- return NYson::TYsonString(responseInfo.Response);
+ return NYson::TYsonString(responseInfo->GetResponse());
}
TListJobsResult THttpRawClient::ListJobs(
@@ -428,7 +430,7 @@ TListJobsResult THttpRawClient::ListJobs(
THttpHeader header("GET", "list_jobs");
header.MergeParameters(NRawClient::SerializeParamsForListJobs(operationId, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- auto resultNode = NodeFromYsonString(responseInfo.Response);
+ auto resultNode = NodeFromYsonString(responseInfo->GetResponse());
const auto& jobNodesList = resultNode["jobs"].AsList();
@@ -524,7 +526,7 @@ TString THttpRawClient::GetJobStderrWithRetries(
TRequestConfig config;
config.IsHeavy = true;
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, {}, config);
- return responseInfo.Response;
+ return responseInfo->GetResponse();
}
IFileReaderPtr THttpRawClient::GetJobStderr(
@@ -573,7 +575,7 @@ std::vector<TJobTraceEvent> THttpRawClient::GetJobTrace(
THttpHeader header("GET", "get_job_trace");
header.MergeParameters(NRawClient::SerializeParamsForGetJobTrace(operationId, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- auto resultNode = NodeFromYsonString(responseInfo.Response);
+ auto resultNode = NodeFromYsonString(responseInfo->GetResponse());
const auto& traceEventNodesList = resultNode.AsList();
@@ -586,6 +588,50 @@ std::vector<TJobTraceEvent> THttpRawClient::GetJobTrace(
return result;
}
+NHttpClient::IHttpResponsePtr THttpRawClient::SkyShareTable(
+ const std::vector<TYPath>& tablePaths,
+ const TSkyShareTableOptions& options)
+{
+ TMutationId mutationId;
+ THttpHeader header("POST", "api/v1/share", /*IsApi*/ false);
+
+ auto proxyName = Context_.ServerName.substr(0, Context_.ServerName.find('.'));
+
+ auto host = Context_.Config->SkynetApiHost;
+ if (host == "") {
+ host = "skynet." + proxyName + ".yt.yandex.net";
+ }
+
+ TSkyShareTableOptions patchedOptions = options;
+
+ if (Context_.Config->Pool && !patchedOptions.Pool_) {
+ patchedOptions.Pool(Context_.Config->Pool);
+ }
+
+ header.MergeParameters(NRawClient::SerializeParamsForSkyShareTable(proxyName, Context_.Config->Prefix, tablePaths, patchedOptions));
+ TClientContext skyApiHost({.ServerName = host, .HttpClient = NHttpClient::CreateDefaultHttpClient()});
+
+ return RequestWithoutRetry(skyApiHost, mutationId, header, "");
+}
+
+std::unique_ptr<IInputStream> THttpRawClient::ReadFile(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TFileReaderOptions& options)
+{
+ TMutationId mutationId;
+ THttpHeader header("GET", GetReadFileCommand(Context_.Config->ApiVersion));
+ header.AddTransactionId(transactionId);
+ header.SetOutputFormat(TMaybe<TFormat>()); // Binary format
+ header.MergeParameters(FormIORequestParameters(path, options));
+ header.SetResponseCompression(ToString(Context_.Config->AcceptEncoding));
+
+ TRequestConfig config;
+ config.IsHeavy = true;
+ auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
+ return std::make_unique<NHttpClient::THttpResponseStream>(std::move(responseInfo));
+}
+
TMaybe<TYPath> THttpRawClient::GetFileFromCache(
const TTransactionId& transactionId,
const TString& md5Signature,
@@ -596,7 +642,7 @@ TMaybe<TYPath> THttpRawClient::GetFileFromCache(
THttpHeader header("GET", "get_file_from_cache");
header.MergeParameters(NRawClient::SerializeParamsForGetFileFromCache(transactionId, md5Signature, cachePath, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- auto resultNode = NodeFromYsonString(responseInfo.Response).AsString();
+ auto resultNode = NodeFromYsonString(responseInfo->GetResponse()).AsString();
return resultNode.empty() ? Nothing() : TMaybe<TYPath>(resultNode);
}
@@ -611,7 +657,7 @@ TYPath THttpRawClient::PutFileToCache(
THttpHeader header("POST", "put_file_to_cache");
header.MergeParameters(NRawClient::SerializeParamsForPutFileToCache(transactionId, Context_.Config->Prefix, filePath, md5Signature, cachePath, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- return NodeFromYsonString(responseInfo.Response).AsString();
+ return NodeFromYsonString(responseInfo->GetResponse()).AsString();
}
void THttpRawClient::MountTable(
@@ -626,7 +672,7 @@ void THttpRawClient::MountTable(
header.AddParameter("cell_id", GetGuidAsString(*options.CellId_));
}
header.AddParameter("freeze", options.Freeze_);
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::UnmountTable(
@@ -638,7 +684,7 @@ void THttpRawClient::UnmountTable(
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeTabletParams(Context_.Config->Prefix, path, options));
header.AddParameter("force", options.Force_);
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::RemountTable(
@@ -649,7 +695,7 @@ void THttpRawClient::RemountTable(
THttpHeader header("POST", "remount_table");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeTabletParams(Context_.Config->Prefix, path, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::ReshardTableByPivotKeys(
@@ -662,7 +708,7 @@ void THttpRawClient::ReshardTableByPivotKeys(
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeTabletParams(Context_.Config->Prefix, path, options));
header.AddParameter("pivot_keys", BuildYsonNodeFluently().List(keys));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::ReshardTableByTabletCount(
@@ -675,7 +721,7 @@ void THttpRawClient::ReshardTableByTabletCount(
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeTabletParams(Context_.Config->Prefix, path, options));
header.AddParameter("tablet_count", tabletCount);
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::InsertRows(
@@ -690,7 +736,7 @@ void THttpRawClient::InsertRows(
auto body = NodeListToYsonString(rows);
TRequestConfig config;
config.IsHeavy = true;
- RequestWithoutRetry(Context_, mutationId, header, body, config);
+ RequestWithoutRetry(Context_, mutationId, header, body, config)->GetResponse();
}
void THttpRawClient::TrimRows(
@@ -706,7 +752,7 @@ void THttpRawClient::TrimRows(
header.MergeParameters(NRawClient::SerializeParametersForTrimRows(Context_.Config->Prefix, path, options));
TRequestConfig config;
config.IsHeavy = true;
- RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
+ RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config)->GetResponse();
}
TNode::TListType THttpRawClient::LookupRows(
@@ -737,7 +783,7 @@ TNode::TListType THttpRawClient::LookupRows(
TRequestConfig config;
config.IsHeavy = true;
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, body, config);
- return NodeFromYsonString(responseInfo.Response, ::NYson::EYsonType::ListFragment).AsList();
+ return NodeFromYsonString(responseInfo->GetResponse(), ::NYson::EYsonType::ListFragment).AsList();
}
TNode::TListType THttpRawClient::SelectRows(
@@ -769,7 +815,44 @@ TNode::TListType THttpRawClient::SelectRows(
TRequestConfig config;
config.IsHeavy = true;
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
- return NodeFromYsonString(responseInfo.Response, ::NYson::EYsonType::ListFragment).AsList();
+ return NodeFromYsonString(responseInfo->GetResponse(), ::NYson::EYsonType::ListFragment).AsList();
+}
+
+std::unique_ptr<IInputStream> THttpRawClient::ReadTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TMaybe<TFormat>& format,
+ const TTableReaderOptions& options)
+{
+ TMutationId mutationId;
+ THttpHeader header("GET", GetReadTableCommand(Context_.Config->ApiVersion));
+ header.SetOutputFormat(format);
+ header.SetResponseCompression(ToString(Context_.Config->AcceptEncoding));
+ header.MergeParameters(NRawClient::SerializeParamsForReadTable(transactionId, Context_.Config->Prefix, path, options));
+ header.MergeParameters(FormIORequestParameters(path, options));
+
+ TRequestConfig config;
+ config.IsHeavy = true;
+ auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
+ return std::make_unique<NHttpClient::THttpResponseStream>(std::move(responseInfo));
+}
+
+std::unique_ptr<IInputStream> THttpRawClient::ReadBlobTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TKey& key,
+ const TBlobTableReaderOptions& options)
+{
+ TMutationId mutationId;
+ THttpHeader header("GET", "read_blob_table");
+ header.SetOutputFormat(TMaybe<TFormat>()); // Binary format
+ header.SetResponseCompression(ToString(Context_.Config->AcceptEncoding));
+ header.MergeParameters(NRawClient::SerializeParamsForReadBlobTable(transactionId, path, key, options));
+
+ TRequestConfig config;
+ config.IsHeavy = true;
+ auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
+ return std::make_unique<NHttpClient::THttpResponseStream>(std::move(responseInfo));
}
void THttpRawClient::AlterTable(
@@ -781,7 +864,7 @@ void THttpRawClient::AlterTable(
THttpHeader header("POST", "alter_table");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForAlterTable(transactionId, Context_.Config->Prefix, path, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::AlterTableReplica(
@@ -792,7 +875,7 @@ void THttpRawClient::AlterTableReplica(
THttpHeader header("POST", "alter_table_replica");
header.AddMutationId();
header.MergeParameters(NRawClient::SerializeParamsForAlterTableReplica(replicaId, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::DeleteRows(
@@ -808,7 +891,7 @@ void THttpRawClient::DeleteRows(
auto body = NodeListToYsonString(keys);
TRequestConfig config;
config.IsHeavy = true;
- RequestWithoutRetry(Context_, mutationId, header, body, config);
+ RequestWithoutRetry(Context_, mutationId, header, body, config)->GetResponse();
}
void THttpRawClient::FreezeTable(
@@ -818,7 +901,7 @@ void THttpRawClient::FreezeTable(
TMutationId mutationId;
THttpHeader header("POST", "freeze_table");
header.MergeParameters(NRawClient::SerializeParamsForFreezeTable(Context_.Config->Prefix, path, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
void THttpRawClient::UnfreezeTable(
@@ -828,7 +911,7 @@ void THttpRawClient::UnfreezeTable(
TMutationId mutationId;
THttpHeader header("POST", "unfreeze_table");
header.MergeParameters(NRawClient::SerializeParamsForUnfreezeTable(Context_.Config->Prefix, path, options));
- RequestWithoutRetry(Context_, mutationId, header);
+ RequestWithoutRetry(Context_, mutationId, header)->GetResponse();
}
TCheckPermissionResponse THttpRawClient::CheckPermission(
@@ -841,7 +924,7 @@ TCheckPermissionResponse THttpRawClient::CheckPermission(
THttpHeader header("GET", "check_permission");
header.MergeParameters(NRawClient::SerializeParamsForCheckPermission(user, permission, Context_.Config->Prefix, path, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
- return NRawClient::ParseCheckPermissionResponse(NodeFromYsonString(responseInfo.Response));
+ return NRawClient::ParseCheckPermissionResponse(NodeFromYsonString(responseInfo->GetResponse()));
}
TVector<TTabletInfo> THttpRawClient::GetTabletInfos(
@@ -854,7 +937,7 @@ TVector<TTabletInfo> THttpRawClient::GetTabletInfos(
header.MergeParameters(NRawClient::SerializeParamsForGetTabletInfos(Context_.Config->Prefix, path, tabletIndexes, options));
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header);
TVector<TTabletInfo> result;
- Deserialize(result, *NodeFromYsonString(responseInfo.Response).AsMap().FindPtr("tablets"));
+ Deserialize(result, *NodeFromYsonString(responseInfo->GetResponse()).AsMap().FindPtr("tablets"));
return result;
}
@@ -870,7 +953,7 @@ TVector<TTableColumnarStatistics> THttpRawClient::GetTableColumnarStatistics(
config.IsHeavy = true;
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
TVector<TTableColumnarStatistics> result;
- Deserialize(result, NodeFromYsonString(responseInfo.Response));
+ Deserialize(result, NodeFromYsonString(responseInfo->GetResponse()));
return result;
}
@@ -886,7 +969,7 @@ TMultiTablePartitions THttpRawClient::GetTablePartitions(
config.IsHeavy = true;
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
TMultiTablePartitions result;
- Deserialize(result, NodeFromYsonString(responseInfo.Response));
+ Deserialize(result, NodeFromYsonString(responseInfo->GetResponse()));
return result;
}
@@ -897,7 +980,7 @@ ui64 THttpRawClient::GenerateTimestamp()
TRequestConfig config;
config.IsHeavy = true;
auto responseInfo = RequestWithoutRetry(Context_, mutationId, header, /*body*/ {}, config);
- return NodeFromYsonString(responseInfo.Response).AsUint64();
+ return NodeFromYsonString(responseInfo->GetResponse()).AsUint64();
}
TAuthorizationInfo THttpRawClient::WhoAmI()
@@ -908,7 +991,7 @@ TAuthorizationInfo THttpRawClient::WhoAmI()
TAuthorizationInfo result;
NJson::TJsonValue jsonValue;
- bool ok = NJson::ReadJsonTree(requestResult.Response, &jsonValue, /*throwOnError*/ true);
+ bool ok = NJson::ReadJsonTree(requestResult->GetResponse(), &jsonValue, /*throwOnError*/ true);
Y_ABORT_UNLESS(ok);
result.Login = jsonValue["login"].GetString();
result.Realm = jsonValue["realm"].GetString();
diff --git a/yt/cpp/mapreduce/raw_client/raw_client.h b/yt/cpp/mapreduce/raw_client/raw_client.h
index 08015f024f..e540d1b331 100644
--- a/yt/cpp/mapreduce/raw_client/raw_client.h
+++ b/yt/cpp/mapreduce/raw_client/raw_client.h
@@ -202,6 +202,18 @@ public:
const TOperationId& operationId,
const TGetJobTraceOptions& options = {}) override;
+ // SkyShare
+
+ NHttpClient::IHttpResponsePtr SkyShareTable(
+ const std::vector<TYPath>& tablePaths,
+ const TSkyShareTableOptions& options = {}) override;
+
+ // Files
+ std::unique_ptr<IInputStream> ReadFile(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TFileReaderOptions& options = {}) override;
+
// File cache
TMaybe<TYPath> GetFileFromCache(
@@ -266,6 +278,18 @@ public:
const TString& query,
const TSelectRowsOptions& options = {}) override;
+ std::unique_ptr<IInputStream> ReadTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TMaybe<TFormat>& format,
+ const TTableReaderOptions& options = {}) override;
+
+ std::unique_ptr<IInputStream> ReadBlobTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TKey& key,
+ const TBlobTableReaderOptions& options = {}) override;
+
void AlterTable(
TMutationId& mutationId,
const TTransactionId& transactionId,
diff --git a/yt/cpp/mapreduce/raw_client/raw_requests.cpp b/yt/cpp/mapreduce/raw_client/raw_requests.cpp
index a3f10e6c41..a3f01da6fc 100644
--- a/yt/cpp/mapreduce/raw_client/raw_requests.cpp
+++ b/yt/cpp/mapreduce/raw_client/raw_requests.cpp
@@ -301,50 +301,6 @@ TCheckPermissionResponse ParseCheckPermissionResponse(const TNode& node)
return result;
}
-TNode::TListType SkyShareTable(
- const IRequestRetryPolicyPtr& retryPolicy,
- const TClientContext& context,
- const std::vector<TYPath>& tablePaths,
- const TSkyShareTableOptions& options)
-{
- THttpHeader header("POST", "api/v1/share", /*IsApi*/ false);
-
- auto proxyName = context.ServerName.substr(0, context.ServerName.find('.'));
-
- auto host = context.Config->SkynetApiHost;
- if (host == "") {
- host = "skynet." + proxyName + ".yt.yandex.net";
- }
-
- TSkyShareTableOptions patchedOptions = options;
-
- if (context.Config->Pool && !patchedOptions.Pool_) {
- patchedOptions.Pool(context.Config->Pool);
- }
-
- header.MergeParameters(NRawClient::SerializeParamsForSkyShareTable(proxyName, context.Config->Prefix, tablePaths, patchedOptions));
- TClientContext skyApiHost({ .ServerName = host, .HttpClient = NHttpClient::CreateDefaultHttpClient() });
- TResponseInfo response = {};
-
- // As documented at https://wiki.yandex-team.ru/yt/userdoc/blob_tables/#shag3.sozdajomrazdachu
- // first request returns HTTP status code 202 (Accepted). And we need retrying until we have 200 (OK).
- while (response.HttpCode != 200) {
- response = RetryRequestWithPolicy(retryPolicy, skyApiHost, header, "");
- TWaitProxy::Get()->Sleep(TDuration::Seconds(5));
- }
-
- if (options.KeyColumns_) {
- return NodeFromJsonString(response.Response)["torrents"].AsList();
- } else {
- TNode torrent;
-
- torrent["key"] = TNode::CreateList();
- torrent["rbtorrent"] = response.Response;
-
- return TNode::TListType{ torrent };
- }
-}
-
TRichYPath CanonizeYPath(
const IRequestRetryPolicyPtr& retryPolicy,
const TClientContext& context,
diff --git a/yt/cpp/mapreduce/raw_client/raw_requests.h b/yt/cpp/mapreduce/raw_client/raw_requests.h
index c60536c86d..bcc9a4bfd7 100644
--- a/yt/cpp/mapreduce/raw_client/raw_requests.h
+++ b/yt/cpp/mapreduce/raw_client/raw_requests.h
@@ -29,7 +29,6 @@ TCheckPermissionResponse ParseCheckPermissionResponse(const TNode& node);
////////////////////////////////////////////////////////////////////////////////
-//
// marks `batchRequest' as executed
void ExecuteBatch(
IRequestRetryPolicyPtr retryPolicy,
@@ -37,14 +36,6 @@ void ExecuteBatch(
TRawBatchRequest& batchRequest,
const TExecuteBatchOptions& options = {});
-// SkyShare
-
-TNode::TListType SkyShareTable(
- const IRequestRetryPolicyPtr& retryPolicy,
- const TClientContext& context,
- const std::vector<TYPath>& tablePaths,
- const TSkyShareTableOptions& options = {});
-
// Misc
TRichYPath CanonizeYPath(
diff --git a/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.cpp b/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.cpp
index 8474bd0edc..2869ddcc0f 100644
--- a/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.cpp
+++ b/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.cpp
@@ -4,6 +4,7 @@
#include <yt/cpp/mapreduce/interface/config.h>
#include <yt/cpp/mapreduce/interface/client_method_options.h>
+#include <yt/cpp/mapreduce/interface/fluent.h>
#include <yt/cpp/mapreduce/interface/operation.h>
#include <yt/cpp/mapreduce/interface/serialize.h>
@@ -639,13 +640,60 @@ TNode SerializeParametersForDeleteRows(
TNode SerializeParametersForTrimRows(
const TString& pathPrefix,
const TYPath& path,
- const TTrimRowsOptions& /* options*/)
+ const TTrimRowsOptions& /*options*/)
{
TNode result;
SetPathParam(&result, pathPrefix, path);
return result;
}
+TNode SerializeParamsForReadTable(
+ const TTransactionId& transactionId,
+ const TString& pathPrefix,
+ const TRichYPath& path,
+ const TTableReaderOptions& options)
+{
+ TNode result;
+ SetTransactionIdParam(&result, transactionId);
+ result["control_attributes"] = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("enable_row_index").Value(options.ControlAttributes_.EnableRowIndex_)
+ .Item("enable_range_index").Value(options.ControlAttributes_.EnableRangeIndex_)
+ .EndMap();
+ return result;
+}
+
+TNode SerializeParamsForReadBlobTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TKey& key,
+ const TBlobTableReaderOptions& options)
+{
+ auto lowerLimitKey = key;
+ lowerLimitKey.Parts_.push_back(options.StartPartIndex_);
+ auto upperLimitKey = key;
+ upperLimitKey.Parts_.push_back(std::numeric_limits<i64>::max());
+
+ TNode result = PathToParamNode(
+ TRichYPath(path).
+ AddRange(TReadRange()
+ .LowerLimit(TReadLimit().Key(lowerLimitKey))
+ .UpperLimit(TReadLimit().Key(upperLimitKey))));
+
+ SetTransactionIdParam(&result, transactionId);
+
+ result["start_part_index"] = options.StartPartIndex_;
+ result["offset"] = options.Offset_;
+ if (options.PartIndexColumnName_) {
+ result["part_index_column_name"] = *options.PartIndexColumnName_;
+ }
+ if (options.DataColumnName_) {
+ result["data_column_name"] = *options.DataColumnName_;
+ }
+ result["part_size"] = options.PartSize_;
+ return result;
+}
+
TNode SerializeParamsForParseYPath(const TRichYPath& path)
{
TNode result;
diff --git a/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.h b/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.h
index 655198248c..acbf003b5c 100644
--- a/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.h
+++ b/yt/cpp/mapreduce/raw_client/rpc_parameters_serialization.h
@@ -146,6 +146,18 @@ TNode SerializeParametersForTrimRows(
const TYPath& path,
const TTrimRowsOptions& options);
+TNode SerializeParamsForReadTable(
+ const TTransactionId& transactionId,
+ const TString& pathPrefix,
+ const TRichYPath& path,
+ const TTableReaderOptions& options);
+
+TNode SerializeParamsForReadBlobTable(
+ const TTransactionId& transactionId,
+ const TRichYPath& path,
+ const TKey& key,
+ const TBlobTableReaderOptions& options);
+
TNode SerializeParamsForParseYPath(
const TRichYPath& path);
diff --git a/yt/python/yt/yson/__init__.py b/yt/python/yt/yson/__init__.py
index 2d5dad9663..ddaec8dd4c 100644
--- a/yt/python/yt/yson/__init__.py
+++ b/yt/python/yt/yson/__init__.py
@@ -54,7 +54,7 @@ except ImportError as error:
print("Warning! Failed to import YSON bindings: " + message, file=_sys.stderr)
try:
- from yt_yson_bindings import upload_parquet, dump_parquet, dump_orc, upload_orc, async_dump_parquet # noqa
+ from yt_yson_bindings import upload_parquet, dump_parquet, dump_orc, upload_orc, async_dump_parquet, async_dump_orc # noqa
HAS_PARQUET = True
except ImportError as error:
message = str(error)
diff --git a/yt/yql/providers/yt/comp_nodes/dq/dq_yt_block_reader.cpp b/yt/yql/providers/yt/comp_nodes/dq/dq_yt_block_reader.cpp
index c8c2b61607..8b3019ffa3 100644
--- a/yt/yql/providers/yt/comp_nodes/dq/dq_yt_block_reader.cpp
+++ b/yt/yql/providers/yt/comp_nodes/dq/dq_yt_block_reader.cpp
@@ -368,7 +368,7 @@ public:
LocalListeners_.reserve(Inputs_.size());
for (size_t i = 0; i < Inputs_.size(); ++i) {
auto& decoder = Settings_->Specs->Inputs[Settings_->OriginalIndexes[i]];
- bool native = decoder->NativeYtTypeFlags && !decoder->FieldsVec[i].ExplicitYson;
+ bool native = decoder->NativeYtTypeFlags;
LocalListeners_.emplace_back(std::make_shared<TLocalListener>(Listener_, Settings_->ColumnNameMapping, ptr, types, *Settings_->Pool, Settings_->PgBuilder, native, jobStats));
LocalListeners_.back()->Init(LocalListeners_.back());
}
diff --git a/yt/yql/providers/yt/gateway/native/ut/ya.make b/yt/yql/providers/yt/gateway/native/ut/ya.make
index 702a53d5dd..23f262c22b 100644
--- a/yt/yql/providers/yt/gateway/native/ut/ya.make
+++ b/yt/yql/providers/yt/gateway/native/ut/ya.make
@@ -1,5 +1,3 @@
-IF (NOT OPENSOURCE)
-
UNITTEST()
SRCS(
@@ -11,7 +9,7 @@ PEERDIR(
yt/yql/providers/yt/gateway/file
yt/yql/providers/yt/codec/codegen
yt/yql/providers/yt/comp_nodes/llvm14
- yql/essentials/core/ut_common
+ yt/yql/providers/yt/lib/ut_common
library/cpp/testing/mock_server
library/cpp/testing/common
yql/essentials/public/udf/service/terminate_policy
@@ -24,5 +22,3 @@ YQL_LAST_ABI_VERSION()
END()
-ENDIF()
-
diff --git a/yt/yql/providers/yt/gateway/native/ut/yql_yt_native_folders_ut.cpp b/yt/yql/providers/yt/gateway/native/ut/yql_yt_native_folders_ut.cpp
new file mode 100644
index 0000000000..b08db52a50
--- /dev/null
+++ b/yt/yql/providers/yt/gateway/native/ut/yql_yt_native_folders_ut.cpp
@@ -0,0 +1,366 @@
+#include "library/cpp/testing/unittest/registar.h"
+#include <library/cpp/yson/node/node_io.h>
+#include <yt/yql/providers/yt/lib/ut_common/yql_ut_common.h>
+#include <library/cpp/testing/common/network.h>
+#include <library/cpp/testing/mock_server/server.h>
+#include <yt/yql/providers/yt/gateway/native/yql_yt_native.h>
+#include <yql/essentials/core/file_storage/proto/file_storage.pb.h>
+#include <yql/essentials/providers/common/proto/gateways_config.pb.h>
+#include <yt/yql/providers/yt/provider/yql_yt_provider.h>
+
+namespace NYql {
+
+namespace {
+
+constexpr auto CYPRES_TX_ID = "\"9518f6d4-f0480586-41103e8-ca595920\"";
+constexpr auto CYPRES_NODE_A_CONTENT = R"(
+[
+ {
+ output = [
+ <
+ "user_attributes" = {};
+ "type" = "table";
+ > "a";
+ <
+ "user_attributes" = {};
+ "type" = "table";
+ > "b";
+ <
+ "user_attributes" = {};
+ "target_path" = "//link_dest";
+ "broken" = %false;
+ "type" = "link";
+ > "link";
+ <
+ "user_attributes" = {};
+ "target_path" = "//link_broken_dest";
+ "broken" = %true;
+ "type" = "link";
+ > "link_broken";
+ <
+ "user_attributes" = {};
+ "target_path" = "//link_access_denied";
+ "broken" = %false;
+ "type" = "link";
+ > "link_access_denied";
+ ];
+ };
+]
+)";
+
+constexpr auto CYPRES_NODE_W_LINK = R"(
+[
+ {
+ output = [
+ <
+ "target_path" = "//link_dest";
+ "broken" = %false;
+ "type" = "link";
+ > "link";
+ ];
+ }
+]
+)";
+
+constexpr auto CYPRES_LINK_DEST = R"(
+[
+ {
+ "output" = <
+ "user_attributes" = {};
+ "type" = "table";
+ > #;
+ };
+]
+)";
+
+constexpr auto CYPRES_ACCESS_ERROR = R"(
+[
+ {
+ "error" = {
+ "code" = 901;
+ "message" = "Access denied";
+ }
+ }
+]
+)";
+
+constexpr auto CYPRESS_BLACKBOX_ERROR = R"(
+[
+ {
+ "error" = {
+ "code" = 111;
+ "message" = "Blackbox rejected token";
+ }
+ }
+]
+)";
+
+TVector<IYtGateway::TFolderResult::TFolderItem> EXPECTED_ITEMS {
+ {"test/a/a", "table", R"({"user_attributes"={}})"},
+ {"test/a/b", "table", R"({"user_attributes"={}})"},
+ {"test/a/link", "table", R"({"user_attributes"={}})"},
+ {"test/a/link_access_denied", "unknown", "{}"}
+};
+
+TGatewaysConfig MakeGatewaysConfig(size_t port)
+{
+ TGatewaysConfig config {};
+ auto* clusters = config.MutableYt()->MutableClusterMapping();
+ NYql::TYtClusterConfig cluster;
+ cluster.SetName("ut_cluster");
+ cluster.SetYTName("ut_cluster");
+ cluster.SetCluster("localhost:" + ToString(port));
+ clusters->Add(std::move(cluster));
+ return config;
+}
+
+class TYtReplier : public TRequestReplier {
+public:
+ using THandler = std::function<THttpResponse(TStringBuf path, const NYT::TNode& attributes)>;
+
+ bool DoReply(const TReplyParams& params) override {
+ const TParsedHttpFull parsed(params.Input.FirstLine());
+ Cout << parsed.Path << Endl;
+
+ HttpCodes code = HTTP_NOT_FOUND;
+ TString content;
+ if (parsed.Path == "/api/v3/start_tx") {
+ content = CYPRES_TX_ID;
+ code = HTTP_OK;
+ }
+ else if (parsed.Path == "/api/v3/ping_tx") {
+ code = HTTP_OK;
+ }
+ else if (parsed.Path == "/api/v3/execute_batch") {
+ auto executeBatchRes = HandleExecuteBatch(params.Input);
+ executeBatchRes.OutTo(params.Output);
+ return true;
+ }
+ THttpResponse resp(code);
+ resp.SetContent(content);
+ resp.OutTo(params.Output);
+
+ return true;
+ }
+ explicit TYtReplier(THandler handleListCommand, THandler handleGetCommand, TMaybe<std::function<void(const NYT::TNode& request)>> assertion):
+ HandleListCommand_(handleListCommand), HandleGetCommand_(handleGetCommand) {
+ if (assertion) {
+ Assertion_ = assertion.GetRef();
+ }
+ }
+
+private:
+ THttpResponse HandleExecuteBatch(THttpInput& input) {
+ auto requestBody = input.ReadAll();
+ auto requestBodyNode = NYT::NodeFromYsonString(requestBody);
+ if (!requestBodyNode.HasKey("requests")) {
+ return THttpResponse{HTTP_INTERNAL_SERVER_ERROR};
+ }
+ auto& requests = requestBodyNode["requests"];
+ if (!requests.IsList()) {
+ return THttpResponse{HTTP_INTERNAL_SERVER_ERROR};
+ }
+ for (auto& request : requests.AsList()) {
+ Assertion_(request);
+
+ const auto& command = request["command"];
+ const auto& parameters = request["parameters"];
+ const auto& path = parameters["path"].AsString();
+ const auto& attributes = parameters.HasKey("attributes") ? parameters["attributes"] : NYT::TNode{};
+ if (command == "list") {
+ return HandleListCommand_(path, attributes);
+ }
+ if (command == "get") {
+ return HandleGetCommand_(path, attributes);
+ }
+ }
+ return THttpResponse{HTTP_NOT_FOUND};
+ }
+
+ std::function<void(const NYT::TNode& request)> Assertion_ = [] ([[maybe_unused]] auto _) {};
+ THandler HandleListCommand_;
+ THandler HandleGetCommand_;
+
+};
+
+Y_UNIT_TEST_SUITE(YtNativeGateway) {
+
+std::pair<TIntrusivePtr<TYtState>, IYtGateway::TPtr> InitTest(const NTesting::TPortHolder& port, TTypeAnnotationContext* types) {
+ TYtNativeServices nativeServices;
+ auto gatewaysConfig = MakeGatewaysConfig(port);
+ nativeServices.Config = std::make_shared<TYtGatewayConfig>(gatewaysConfig.GetYt());
+ nativeServices.FileStorage = CreateFileStorage(TFileStorageConfig{});
+
+ auto ytGateway = CreateYtNativeGateway(nativeServices);
+ auto ytState = MakeIntrusive<TYtState>(types);
+ ytState->Gateway = ytGateway;
+
+ InitializeYtGateway(ytGateway, ytState);
+ return {ytState, ytGateway};
+}
+
+IYtGateway::TFolderResult GetFolderResult(TYtReplier::THandler handleList, TYtReplier::THandler handleGet,
+TMaybe<std::function<void(const NYT::TNode& request)>> gatewayRequestAssertion, std::function<IYtGateway::TFolderOptions(TString)> makeFolderOptions) {
+ const auto port = NTesting::GetFreePort();
+ NMock::TMockServer mockServer{port,
+ [gatewayRequestAssertion, handleList, handleGet] () {return new TYtReplier(handleList, handleGet, gatewayRequestAssertion);}
+ };
+
+ TTypeAnnotationContext types;
+ auto [ytState, ytGateway] = InitTest(port, &types);
+
+ IYtGateway::TFolderOptions folderOptions = makeFolderOptions(ytState->SessionId);
+ auto folderFuture = ytGateway->GetFolder(std::move(folderOptions));
+
+ folderFuture.Wait();
+ ytState->Gateway->CloseSession({ytState->SessionId});
+ auto folderRes = folderFuture.GetValue();
+ return folderRes;
+}
+
+Y_UNIT_TEST(GetFolder) {
+ THashMap<TString, THashSet<TString>> requiredAttributes {
+ {"//test/a", {"type", "broken", "target_path", "user_attributes"}},
+ {"//link_dest", {"type", "user_attributes"}}
+ };
+ const auto checkRequiredAttributes = [&requiredAttributes] (const NYT::TNode& request) {
+ const auto& parameters = request["parameters"];
+ const auto path = parameters["path"].AsString();
+ const auto& attributes = parameters.HasKey("attributes") ? parameters["attributes"] : NYT::TNode{};
+
+ if (!requiredAttributes.contains(path)) {
+ return;
+ }
+
+ THashSet<TString> attributesSet;
+ for (const auto& attribute : attributes.AsList()) {
+ attributesSet.insert(attribute.AsString());
+ }
+ UNIT_ASSERT_VALUES_EQUAL(requiredAttributes[path], attributesSet);
+ };
+
+ const auto handleGet = [] (TStringBuf path, const NYT::TNode& attributes) {
+ Y_UNUSED(attributes);
+ THttpResponse resp{HTTP_OK};
+ if (path == "//link_dest") {
+ resp.SetContent(CYPRES_LINK_DEST);
+ return resp;
+ }
+ if (path == "//link_access_denied") {
+ resp.SetContent(CYPRES_ACCESS_ERROR);
+ return resp;
+ }
+
+ return THttpResponse{HTTP_NOT_FOUND};
+ };
+
+ const auto handleList = [] (TStringBuf path, const NYT::TNode& attributes) {
+ Y_UNUSED(attributes);
+ THttpResponse resp{HTTP_OK};
+ if (path == "//test/a") {
+ resp.SetContent(CYPRES_NODE_A_CONTENT);
+ return resp;
+ }
+ return THttpResponse{HTTP_NOT_FOUND};
+ };
+
+ const auto makeFolderOptions = [] (const TString& sessionId) {
+ IYtGateway::TFolderOptions folderOptions{sessionId};
+ TYtSettings ytSettings {};
+ folderOptions.Cluster("ut_cluster")
+ .Config(std::make_shared<TYtSettings>(ytSettings))
+ .Prefix("//test/a")
+ .Attributes({"user_attributes"});
+ return folderOptions;
+ };
+
+ auto folderRes
+ = GetFolderResult(handleList, handleGet, checkRequiredAttributes, makeFolderOptions);
+
+ UNIT_ASSERT_EQUAL_C(folderRes.Success(), true, folderRes.Issues().ToString());
+ UNIT_ASSERT_EQUAL(
+ folderRes.ItemsOrFileLink,
+ (std::variant<TVector<IYtGateway::TFolderResult::TFolderItem>, TFileLinkPtr>(EXPECTED_ITEMS)));
+ }
+
+Y_UNIT_TEST(EmptyResolveIsNotError) {
+ const auto port = NTesting::GetFreePort();
+
+ const auto handleList = [] (TStringBuf path, const NYT::TNode& attributes) {
+ Y_UNUSED(path);
+ Y_UNUSED(attributes);
+
+ THttpResponse resp{HTTP_OK};
+ resp.SetContent(CYPRES_NODE_W_LINK);
+ return resp;
+ };
+
+ const auto handleGet = [] (TStringBuf path, const NYT::TNode& attributes) {
+ Y_UNUSED(path);
+ Y_UNUSED(attributes);
+
+ THttpResponse resp{HTTP_OK};
+ resp.SetContent(CYPRES_ACCESS_ERROR);
+ return resp;
+ };
+
+ const auto makeFolderOptions = [] (const TString& sessionId) {
+ IYtGateway::TFolderOptions folderOptions{sessionId};
+ TYtSettings ytSettings {};
+ folderOptions.Cluster("ut_cluster")
+ .Config(std::make_shared<TYtSettings>(ytSettings))
+ .Prefix("//test/a")
+ .Attributes({"user_attributes"});
+ return folderOptions;
+ };
+
+ auto folderRes
+ = GetFolderResult(handleList, handleGet, Nothing(), makeFolderOptions);
+
+ UNIT_ASSERT_EQUAL_C(folderRes.Success(), true, folderRes.Issues().ToString());
+}
+
+Y_UNIT_TEST(GetFolderException) {
+ const auto port = NTesting::GetFreePort();
+
+ const auto handleList = [] (TStringBuf path, const NYT::TNode& attributes) {
+ Y_UNUSED(path);
+ Y_UNUSED(attributes);
+
+ THttpResponse resp{HTTP_UNAUTHORIZED};
+ auto header = R"({"code":900,"message":"Authentication failed"})";
+ resp.AddHeader(THttpInputHeader("X-YT-Error", header));
+ resp.SetContent(CYPRESS_BLACKBOX_ERROR);
+ return resp;
+ };
+
+ const auto handleGet = [] (TStringBuf path, const NYT::TNode& attributes) {
+ Y_UNUSED(path);
+ Y_UNUSED(attributes);
+
+ THttpResponse resp{HTTP_OK};
+ resp.SetContent("");
+ return resp;
+ };
+
+ const auto makeFolderOptions = [] (const TString& sessionId) {
+ IYtGateway::TFolderOptions folderOptions{sessionId};
+ TYtSettings ytSettings {};
+ folderOptions.Cluster("ut_cluster")
+ .Config(std::make_shared<TYtSettings>(ytSettings))
+ .Prefix("//test/a")
+ .Attributes({"user_attributes"});
+ return folderOptions;
+ };
+
+ const auto folderRes
+ = GetFolderResult(handleList, handleGet, Nothing(), makeFolderOptions);
+
+ UNIT_ASSERT(!folderRes.Issues().Empty());
+ UNIT_ASSERT_STRING_CONTAINS(folderRes.Issues().ToString(), "Authentication failed");
+}
+}
+
+} // namespace
+
+} // namespace NYql
diff --git a/yql/essentials/core/ut_common/ya.make b/yt/yql/providers/yt/lib/ut_common/ya.make
index 04c59aaf3d..4084a3d770 100644
--- a/yql/essentials/core/ut_common/ya.make
+++ b/yt/yql/providers/yt/lib/ut_common/ya.make
@@ -1,5 +1,3 @@
-IF (NOT OPENSOURCE)
-
LIBRARY()
SRCS(
@@ -10,15 +8,9 @@ SRCS(
PEERDIR(
yql/essentials/core
yql/essentials/core/expr_nodes
- contrib/ydb/library/yql/dq/proto
- contrib/ydb/library/yql/dq/expr_nodes
)
-
YQL_LAST_ABI_VERSION()
-
END()
-ENDIF()
-
diff --git a/yql/essentials/core/ut_common/yql_ut_common.cpp b/yt/yql/providers/yt/lib/ut_common/yql_ut_common.cpp
index cef3f2723c..cef3f2723c 100644
--- a/yql/essentials/core/ut_common/yql_ut_common.cpp
+++ b/yt/yql/providers/yt/lib/ut_common/yql_ut_common.cpp
diff --git a/yql/essentials/core/ut_common/yql_ut_common.h b/yt/yql/providers/yt/lib/ut_common/yql_ut_common.h
index ddee02690a..ddee02690a 100644
--- a/yql/essentials/core/ut_common/yql_ut_common.h
+++ b/yt/yql/providers/yt/lib/ut_common/yql_ut_common.h
diff --git a/yt/yql/providers/yt/provider/ut/ya.make b/yt/yql/providers/yt/provider/ut/ya.make
index 3b29f30999..888bfe2d25 100644
--- a/yt/yql/providers/yt/provider/ut/ya.make
+++ b/yt/yql/providers/yt/provider/ut/ya.make
@@ -17,7 +17,7 @@ PEERDIR(
yt/yql/providers/yt/gateway/file
yt/yql/providers/yt/codec/codegen
yt/yql/providers/yt/comp_nodes/llvm14
- yql/essentials/core/ut_common
+ yt/yql/providers/yt/lib/ut_common
yql/essentials/ast
yql/essentials/public/udf/service/terminate_policy
yql/essentials/core/services
@@ -38,3 +38,4 @@ YQL_LAST_ABI_VERSION()
END()
ENDIF()
+
diff --git a/yt/yt/client/arrow/arrow_row_stream_encoder.cpp b/yt/yt/client/arrow/arrow_row_stream_encoder.cpp
index 25a403790c..1d266f3c71 100644
--- a/yt/yt/client/arrow/arrow_row_stream_encoder.cpp
+++ b/yt/yt/client/arrow/arrow_row_stream_encoder.cpp
@@ -1,8 +1,5 @@
#include "arrow_row_stream_encoder.h"
-#include <yt/yt/client/arrow/fbs/Message.fbs.h>
-#include <yt/yt/client/arrow/fbs/Schema.fbs.h>
-
#include <yt/yt/client/api/rpc_proxy/row_stream.h>
#include <yt/yt/client/api/rpc_proxy/wire_row_stream.h>
@@ -14,6 +11,8 @@
#include <yt/yt/client/table_client/schema.h>
#include <yt/yt/client/table_client/columnar.h>
+#include <yt/yt/library/formats/format.h>
+
#include <yt/yt/core/misc/error.h>
#include <yt/yt/core/misc/range.h>
@@ -32,651 +31,6 @@ static constexpr auto& Logger = ArrowLogger;
namespace {
-using TBatchColumn = IUnversionedColumnarRowBatch::TColumn;
-using TBodyWriter = std::function<void(TMutableRef)>;
-
-constexpr i64 ArrowAlignment = 8;
-
-flatbuffers::Offset<flatbuffers::String> SerializeString(
- flatbuffers::FlatBufferBuilder* flatbufBuilder,
- const std::string& str)
-{
- return flatbufBuilder->CreateString(str.data(), str.length());
-}
-
-std::tuple<org::apache::arrow::flatbuf::Type, flatbuffers::Offset<void>> SerializeColumnType(
- flatbuffers::FlatBufferBuilder* flatbufBuilder,
- const TColumnSchema& schema)
-{
- auto simpleType = CastToV1Type(schema.LogicalType()).first;
- switch (simpleType) {
- case ESimpleLogicalValueType::Null:
- case ESimpleLogicalValueType::Void:
- return std::tuple(
- org::apache::arrow::flatbuf::Type_Null,
- org::apache::arrow::flatbuf::CreateNull(*flatbufBuilder)
- .Union());
-
- case ESimpleLogicalValueType::Int64:
- case ESimpleLogicalValueType::Uint64:
- case ESimpleLogicalValueType::Int8:
- case ESimpleLogicalValueType::Uint8:
- case ESimpleLogicalValueType::Int16:
- case ESimpleLogicalValueType::Uint16:
- case ESimpleLogicalValueType::Int32:
- case ESimpleLogicalValueType::Uint32:
- return std::tuple(
- org::apache::arrow::flatbuf::Type_Int,
- org::apache::arrow::flatbuf::CreateInt(
- *flatbufBuilder,
- GetIntegralTypeBitWidth(simpleType),
- IsIntegralTypeSigned(simpleType)).Union());
-
- case ESimpleLogicalValueType::Double:
- return std::tuple(
- org::apache::arrow::flatbuf::Type_FloatingPoint,
- org::apache::arrow::flatbuf::CreateFloatingPoint(
- *flatbufBuilder,
- org::apache::arrow::flatbuf::Precision_DOUBLE)
- .Union());
-
- case ESimpleLogicalValueType::Float:
- return std::tuple(
- org::apache::arrow::flatbuf::Type_FloatingPoint,
- org::apache::arrow::flatbuf::CreateFloatingPoint(
- *flatbufBuilder,
- org::apache::arrow::flatbuf::Precision_SINGLE)
- .Union());
-
- case ESimpleLogicalValueType::Boolean:
- return std::tuple(
- org::apache::arrow::flatbuf::Type_Bool,
- org::apache::arrow::flatbuf::CreateBool(*flatbufBuilder)
- .Union());
-
- case ESimpleLogicalValueType::String:
- case ESimpleLogicalValueType::Any:
- return std::tuple(
- org::apache::arrow::flatbuf::Type_Binary,
- org::apache::arrow::flatbuf::CreateBinary(*flatbufBuilder)
- .Union());
-
- case ESimpleLogicalValueType::Utf8:
- return std::tuple(
- org::apache::arrow::flatbuf::Type_Utf8,
- org::apache::arrow::flatbuf::CreateUtf8(*flatbufBuilder)
- .Union());
-
- // TODO(babenko): the following types are not supported:
- // Date
- // Datetime
- // Interval
- // Timestamp
-
- default:
- THROW_ERROR_EXCEPTION("Column %v has type %Qlv that is not currently supported by Arrow encoder",
- schema.GetDiagnosticNameString(),
- simpleType);
- }
-}
-
-bool IsRleButNotDictionaryEncodedStringLikeColumn(const TBatchColumn& column)
-{
- auto simpleType = CastToV1Type(column.Type).first;
- return
- IsStringLikeType(simpleType) &&
- column.Rle &&
- !column.Rle->ValueColumn->Dictionary;
-}
-
-bool IsRleAndDictionaryEncodedColumn(const TBatchColumn& column)
-{
- return
- column.Rle &&
- column.Rle->ValueColumn->Dictionary;
-}
-
-bool IsDictionaryEncodedColumn(const TBatchColumn& column)
-{
- return
- column.Dictionary ||
- IsRleAndDictionaryEncodedColumn(column) ||
- IsRleButNotDictionaryEncodedStringLikeColumn(column);
-}
-
-struct TTypedBatchColumn
-{
- const TBatchColumn* Column;
- TLogicalTypePtr Type;
-};
-
-struct TRecordBatchBodyPart
-{
- i64 Size;
- TBodyWriter Writer;
-};
-
-struct TRecordBatchSerializationContext final
-{
- explicit TRecordBatchSerializationContext(flatbuffers::FlatBufferBuilder* flatbufBuilder)
- : FlatbufBuilder(flatbufBuilder)
- { }
-
- void AddFieldNode(i64 length, i64 nullCount)
- {
- FieldNodes.emplace_back(length, nullCount);
- }
-
- void AddBuffer(i64 size, TBodyWriter writer)
- {
- YT_LOG_DEBUG("Buffer registered (Offset: %v, Size: %v)",
- CurrentBodyOffset,
- size);
-
- Buffers.emplace_back(CurrentBodyOffset, size);
- CurrentBodyOffset += AlignUp<i64>(size, ArrowAlignment);
- Parts.push_back(TRecordBatchBodyPart{size, std::move(writer)});
- }
-
- flatbuffers::FlatBufferBuilder* const FlatbufBuilder;
-
- i64 CurrentBodyOffset = 0;
- std::vector<org::apache::arrow::flatbuf::FieldNode> FieldNodes;
- std::vector<org::apache::arrow::flatbuf::Buffer> Buffers;
- std::vector<TRecordBatchBodyPart> Parts;
-};
-
-template <class T>
-TMutableRange<T> GetTypedValues(TMutableRef ref)
-{
- return TMutableRange(
- reinterpret_cast<T*>(ref.Begin()),
- reinterpret_cast<T*>(ref.End()));
-}
-
-void SerializeColumnPrologue(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- if (column->NullBitmap ||
- column->Rle && column->Rle->ValueColumn->NullBitmap)
- {
- if (column->Rle) {
- const auto* valueColumn = column->Rle->ValueColumn;
- auto rleIndexes = column->GetTypedValues<ui64>();
-
- context->AddFieldNode(
- column->ValueCount,
- CountOnesInRleBitmap(
- valueColumn->NullBitmap->Data,
- rleIndexes,
- column->StartIndex,
- column->StartIndex + column->ValueCount));
-
- context->AddBuffer(
- GetBitmapByteSize(column->ValueCount),
- [=] (TMutableRef dstRef) {
- BuildValidityBitmapFromRleNullBitmap(
- valueColumn->NullBitmap->Data,
- rleIndexes,
- column->StartIndex,
- column->StartIndex + column->ValueCount,
- dstRef);
- });
- } else {
- context->AddFieldNode(
- column->ValueCount,
- CountOnesInBitmap(
- column->NullBitmap->Data,
- column->StartIndex,
- column->StartIndex + column->ValueCount));
-
- context->AddBuffer(
- GetBitmapByteSize(column->ValueCount),
- [=] (TMutableRef dstRef) {
- CopyBitmapRangeToBitmapNegated(
- column->NullBitmap->Data,
- column->StartIndex,
- column->StartIndex + column->ValueCount,
- dstRef);
- });
- }
- } else {
- context->AddFieldNode(
- column->ValueCount,
- 0);
-
- context->AddBuffer(
- 0,
- [=] (TMutableRef /*dstRef*/) { });
- }
-}
-
-void SerializeRleButNotDictionaryEncodedStringLikeColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
- YT_VERIFY(column->Values->BitWidth == 64);
- YT_VERIFY(column->Values->BaseValue == 0);
- YT_VERIFY(!column->Values->ZigZagEncoded);
-
- YT_LOG_DEBUG("Adding RLE but not dictionary-encoded string-like column (ColumnId: %v, StartIndex: %v, ValueCount: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount);
-
- SerializeColumnPrologue(typedColumn, context);
-
- auto rleIndexes = column->GetTypedValues<ui64>();
-
- context->AddBuffer(
- sizeof (ui32) * column->ValueCount,
- [=] (TMutableRef dstRef) {
- BuildIotaDictionaryIndexesFromRleIndexes(
- rleIndexes,
- column->StartIndex,
- column->StartIndex + column->ValueCount,
- GetTypedValues<ui32>(dstRef));
- });
-}
-
-void SerializeDictionaryColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
- YT_VERIFY(column->Dictionary->ZeroMeansNull);
- YT_VERIFY(column->Values->BitWidth == 32);
- YT_VERIFY(column->Values->BaseValue == 0);
- YT_VERIFY(!column->Values->ZigZagEncoded);
-
- YT_LOG_DEBUG("Adding dictionary column (ColumnId: %v, StartIndex: %v, ValueCount: %v, Rle: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount,
- column->Rle.has_value());
-
- auto relevantDictionaryIndexes = column->GetRelevantTypedValues<ui32>();
-
- context->AddFieldNode(
- column->ValueCount,
- CountNullsInDictionaryIndexesWithZeroNull(relevantDictionaryIndexes));
-
- context->AddBuffer(
- GetBitmapByteSize(column->ValueCount),
- [=] (TMutableRef dstRef) {
- BuildValidityBitmapFromDictionaryIndexesWithZeroNull(
- relevantDictionaryIndexes,
- dstRef);
- });
-
- context->AddBuffer(
- sizeof (ui32) * column->ValueCount,
- [=] (TMutableRef dstRef) {
- BuildDictionaryIndexesFromDictionaryIndexesWithZeroNull(
- relevantDictionaryIndexes,
- GetTypedValues<ui32>(dstRef));
- });
-}
-
-void SerializeRleDictionaryColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
- YT_VERIFY(column->Values->BitWidth == 64);
- YT_VERIFY(column->Values->BaseValue == 0);
- YT_VERIFY(!column->Values->ZigZagEncoded);
- YT_VERIFY(column->Rle->ValueColumn->Dictionary->ZeroMeansNull);
- YT_VERIFY(column->Rle->ValueColumn->Values->BitWidth == 32);
- YT_VERIFY(column->Rle->ValueColumn->Values->BaseValue == 0);
- YT_VERIFY(!column->Rle->ValueColumn->Values->ZigZagEncoded);
-
- YT_LOG_DEBUG("Adding dictionary column (ColumnId: %v, StartIndex: %v, ValueCount: %v, Rle: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount,
- column->Rle.has_value());
-
- auto dictionaryIndexes = column->Rle->ValueColumn->GetTypedValues<ui32>();
- auto rleIndexes = column->GetTypedValues<ui64>();
-
- context->AddFieldNode(
- column->ValueCount,
- CountNullsInRleDictionaryIndexesWithZeroNull(
- dictionaryIndexes,
- rleIndexes,
- column->StartIndex,
- column->StartIndex + column->ValueCount));
-
- context->AddBuffer(
- GetBitmapByteSize(column->ValueCount),
- [=] (TMutableRef dstRef) {
- BuildValidityBitmapFromRleDictionaryIndexesWithZeroNull(
- dictionaryIndexes,
- rleIndexes,
- column->StartIndex,
- column->StartIndex + column->ValueCount,
- dstRef);
- });
-
- context->AddBuffer(
- sizeof (ui32) * column->ValueCount,
- [=] (TMutableRef dstRef) {
- BuildDictionaryIndexesFromRleDictionaryIndexesWithZeroNull(
- dictionaryIndexes,
- rleIndexes,
- column->StartIndex,
- column->StartIndex + column->ValueCount,
- GetTypedValues<ui32>(dstRef));
- });
-}
-
-void SerializeIntegerColumn(
- const TTypedBatchColumn& typedColumn,
- ESimpleLogicalValueType simpleType,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
-
- YT_LOG_DEBUG("Adding integer column (ColumnId: %v, StartIndex: %v, ValueCount: %v, Rle: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount,
- column->Rle.has_value());
-
- SerializeColumnPrologue(typedColumn, context);
-
- context->AddBuffer(
- column->ValueCount * GetIntegralTypeByteSize(simpleType),
- [=] (TMutableRef dstRef) {
- const auto* valueColumn = column->Rle
- ? column->Rle->ValueColumn
- : column;
- auto values = valueColumn->GetTypedValues<ui64>();
-
- auto rleIndexes = column->Rle
- ? column->GetTypedValues<ui64>()
- : TRange<ui64>();
-
- auto startIndex = column->StartIndex;
-
- switch (simpleType) {
- #define XX(cppType, ytType) \
- case ESimpleLogicalValueType::ytType: { \
- auto dstValues = GetTypedValues<cppType>(dstRef); \
- auto* currentOutput = dstValues.Begin(); \
- DecodeIntegerVector( \
- startIndex, \
- startIndex + column->ValueCount, \
- valueColumn->Values->BaseValue, \
- valueColumn->Values->ZigZagEncoded, \
- TRange<ui32>(), \
- rleIndexes, \
- [&] (auto index) { \
- return values[index]; \
- }, \
- [&] (auto value) { \
- *currentOutput++ = value; \
- }); \
- break; \
- }
-
- XX( i8, Int8)
- XX( i16, Int16)
- XX( i32, Int32)
- XX( i64, Int64)
- XX( ui8, Uint8)
- XX(ui16, Uint16)
- XX(ui32, Uint32)
- XX(ui64, Uint64)
-
- #undef XX
-
- default:
- THROW_ERROR_EXCEPTION("Integer column %v has unexpected type %Qlv",
- typedColumn.Column->Id,
- simpleType);
- }
- });
-}
-
-void SerializeDoubleColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
- YT_VERIFY(column->Values->BitWidth == 64);
- YT_VERIFY(column->Values->BaseValue == 0);
- YT_VERIFY(!column->Values->ZigZagEncoded);
-
- YT_LOG_DEBUG(
- "Adding double column (ColumnId: %v, StartIndex: %v, ValueCount: %v, Rle: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount,
- column->Rle.has_value());
-
- SerializeColumnPrologue(typedColumn, context);
-
- context->AddBuffer(
- column->ValueCount * sizeof(double),
- [=] (TMutableRef dstRef) {
- auto relevantValues = column->GetRelevantTypedValues<double>();
- ::memcpy(
- dstRef.Begin(),
- relevantValues.Begin(),
- column->ValueCount * sizeof(double));
- });
-}
-
-void SerializeFloatColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
- YT_VERIFY(column->Values->BitWidth == 32);
- YT_VERIFY(column->Values->BaseValue == 0);
- YT_VERIFY(!column->Values->ZigZagEncoded);
-
- YT_LOG_DEBUG(
- "Adding float column (ColumnId: %v, StartIndex: %v, ValueCount: %v, Rle: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount,
- column->Rle.has_value());
-
- SerializeColumnPrologue(typedColumn, context);
-
- context->AddBuffer(
- column->ValueCount * sizeof(float),
- [=] (TMutableRef dstRef) {
- auto relevantValues = column->GetRelevantTypedValues<float>();
- ::memcpy(
- dstRef.Begin(),
- relevantValues.Begin(),
- column->ValueCount * sizeof(float));
- });
-}
-
-void SerializeStringLikeColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
- YT_VERIFY(column->Values->BaseValue == 0);
- YT_VERIFY(column->Values->BitWidth == 32);
- YT_VERIFY(column->Values->ZigZagEncoded);
- YT_VERIFY(column->Strings);
- YT_VERIFY(column->Strings->AvgLength);
- YT_VERIFY(!column->Rle);
-
- auto startIndex = column->StartIndex;
- auto endIndex = startIndex + column->ValueCount;
- auto stringData = column->Strings->Data;
- auto avgLength = *column->Strings->AvgLength;
-
- auto offsets = column->GetTypedValues<ui32>();
- auto startOffset = DecodeStringOffset(offsets, avgLength, startIndex);
- auto endOffset = DecodeStringOffset(offsets, avgLength, endIndex);
- auto stringsSize = endOffset - startOffset;
-
- YT_LOG_DEBUG("Adding string-like column (ColumnId: %v, StartIndex: %v, ValueCount: %v, StartOffset: %v, EndOffset: %v, StringsSize: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount,
- startOffset,
- endOffset,
- stringsSize);
-
- SerializeColumnPrologue(typedColumn, context);
-
- context->AddBuffer(
- sizeof(i32) * (column->ValueCount + 1),
- [=] (TMutableRef dstRef) {
- DecodeStringOffsets(
- offsets,
- avgLength,
- startIndex,
- endIndex,
- GetTypedValues<ui32>(dstRef));
- });
-
- context->AddBuffer(
- stringsSize,
- [=] (TMutableRef dstRef) {
- ::memcpy(
- dstRef.Begin(),
- stringData.Begin() + startOffset,
- stringsSize);
- });
-}
-
-void SerializeBooleanColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
- YT_VERIFY(column->Values);
- YT_VERIFY(!column->Values->ZigZagEncoded);
- YT_VERIFY(column->Values->BaseValue == 0);
- YT_VERIFY(column->Values->BitWidth == 1);
-
- YT_LOG_DEBUG("Adding boolean column (ColumnId: %v, StartIndex: %v, ValueCount: %v)",
- column->Id,
- column->StartIndex,
- column->ValueCount);
-
- SerializeColumnPrologue(typedColumn, context);
-
- context->AddBuffer(
- GetBitmapByteSize(column->ValueCount),
- [=] (TMutableRef dstRef) {
- CopyBitmapRangeToBitmap(
- column->Values->Data,
- column->StartIndex,
- column->StartIndex + column->ValueCount,
- dstRef);
- });
-}
-
-void SerializeNullColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- SerializeColumnPrologue(typedColumn, context);
-}
-
-void SerializeColumn(
- const TTypedBatchColumn& typedColumn,
- TRecordBatchSerializationContext* context)
-{
- const auto* column = typedColumn.Column;
-
- if (IsRleButNotDictionaryEncodedStringLikeColumn(*typedColumn.Column)) {
- SerializeRleButNotDictionaryEncodedStringLikeColumn(typedColumn, context);
- return;
- }
-
- if (column->Dictionary) {
- SerializeDictionaryColumn(typedColumn, context);
- return;
- }
-
- if (column->Rle && column->Rle->ValueColumn->Dictionary) {
- SerializeRleDictionaryColumn(typedColumn, context);
- return;
- }
-
- auto simpleType = CastToV1Type(typedColumn.Type).first;
- if (IsIntegralType(simpleType)) {
- SerializeIntegerColumn(typedColumn, simpleType, context);
- } else if (simpleType == ESimpleLogicalValueType::Double) {
- SerializeDoubleColumn(typedColumn, context);
- } else if (simpleType == ESimpleLogicalValueType::Float) {
- SerializeFloatColumn(typedColumn, context);
- } else if (IsStringLikeType(simpleType)) {
- SerializeStringLikeColumn(typedColumn, context);
- } else if (simpleType == ESimpleLogicalValueType::Boolean) {
- SerializeBooleanColumn(typedColumn, context);
- } else if (simpleType == ESimpleLogicalValueType::Null) {
- SerializeNullColumn(typedColumn, context);
- } else if (simpleType == ESimpleLogicalValueType::Void) {
- SerializeNullColumn(typedColumn, context);
- } else {
- THROW_ERROR_EXCEPTION("Column %v has unexpected type %Qlv",
- typedColumn.Column->Id,
- simpleType);
- }
-}
-
-auto SerializeRecordBatch(
- flatbuffers::FlatBufferBuilder* flatbufBuilder,
- int length,
- TRange<TTypedBatchColumn> typedColumns)
-{
- auto context = New<TRecordBatchSerializationContext>(flatbufBuilder);
-
- for (const auto& typedColumn : typedColumns) {
- SerializeColumn(typedColumn, context.Get());
- }
-
- auto fieldNodesOffset = flatbufBuilder->CreateVectorOfStructs(context->FieldNodes);
-
- auto buffersOffset = flatbufBuilder->CreateVectorOfStructs(context->Buffers);
-
- auto recordBatchOffset = org::apache::arrow::flatbuf::CreateRecordBatch(
- *flatbufBuilder,
- length,
- fieldNodesOffset,
- buffersOffset);
-
- auto totalSize = context->CurrentBodyOffset;
-
- return std::tuple(
- recordBatchOffset,
- totalSize,
- [context = std::move(context)] (TMutableRef dstRef) {
- char* current = dstRef.Begin();
- for (const auto& part : context->Parts) {
- part.Writer(TMutableRef(current, current + part.Size));
- current += AlignUp<i64>(part.Size, ArrowAlignment);
- }
- YT_VERIFY(current == dstRef.End());
- });
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
DECLARE_REFCOUNTED_CLASS(TArrowRowStreamEncoder)
class TArrowRowStreamEncoder
@@ -685,460 +39,41 @@ class TArrowRowStreamEncoder
public:
TArrowRowStreamEncoder(
TTableSchemaPtr schema,
+ std::optional<std::vector<std::string>> columns,
TNameTablePtr nameTable,
IRowStreamEncoderPtr fallbackEncoder,
NFormats::TControlAttributesConfigPtr controlAttributesConfig)
: Schema_(std::move(schema))
+ , Columns_(std::move(columns))
, NameTable_(std::move(nameTable))
, FallbackEncoder_(std::move(fallbackEncoder))
, ControlAttributesConfig_(controlAttributesConfig)
+ , OutputStream_(Data_)
+ , AsyncOutputStream_(NConcurrency::CreateAsyncAdapter(&OutputStream_))
{
- if (ControlAttributesConfig_->EnableRowIndex) {
- RowIndexId_ = NameTable_->GetIdOrRegisterName(RowIndexColumnName);
- }
-
- if (ControlAttributesConfig_->EnableRangeIndex) {
- RangeIndexId_ = NameTable_->GetIdOrRegisterName(RangeIndexColumnName);
- }
-
- if (ControlAttributesConfig_->EnableTableIndex) {
- TableIndexId_ = NameTable_->GetIdOrRegisterName(TableIndexColumnName);
- }
-
- if (ControlAttributesConfig_->EnableTabletIndex) {
- TabletIndexId_ = NameTable_->GetIdOrRegisterName(TabletIndexColumnName);
- }
-
YT_LOG_DEBUG("Row stream encoder created (Schema: %v)",
*Schema_);
}
- const TTableSchemaPtr& GetSchema()
- {
- return Schema_;
- }
-
- const TNameTablePtr& GetNameTable()
- {
- return NameTable_;
- }
-
- bool IsFirstBatch()
- {
- return FirstBatch_;
- }
-
- std::vector<IUnversionedColumnarRowBatch::TDictionaryId>& ArrowDictionaryIds()
- {
- return ArrowDictionaryIds_;
- }
-
- bool IsTableIndexColumnId(int id) const
- {
- return id == TableIndexId_;
- }
-
- bool IsRowIndexColumnId(int id) const
- {
- return id == RowIndexId_;
- }
-
- bool IsRangeIndexColumnId(int id) const
- {
- return id == RangeIndexId_;
- }
-
- bool IsTabletIndexColumnId(int id) const
- {
- return id == TabletIndexId_;
- }
-
- bool IsSystemColumnId(int id) const
- {
- return IsTableIndexColumnId(id) ||
- IsRangeIndexColumnId(id) ||
- IsRowIndexColumnId(id) ||
- IsTabletIndexColumnId(id);
- }
-
- bool IsSystemColumnEnable(int columnIndex)
- {
- return ControlAttributesConfig_->EnableTableIndex && IsTableIndexColumnId(columnIndex) ||
- ControlAttributesConfig_->EnableRangeIndex && IsRangeIndexColumnId(columnIndex) ||
- ControlAttributesConfig_->EnableRowIndex && IsRowIndexColumnId(columnIndex) ||
- ControlAttributesConfig_->EnableTabletIndex && IsTabletIndexColumnId(columnIndex);
- }
-
TSharedRef Encode(
const IUnversionedRowBatchPtr& batch,
const NApi::NRpcProxy::NProto::TRowsetStatistics* statistics) override;
private:
const TTableSchemaPtr Schema_;
+ const std::optional<std::vector<std::string>> Columns_;
const TNameTablePtr NameTable_;
const IRowStreamEncoderPtr FallbackEncoder_;
const NFormats::TControlAttributesConfigPtr ControlAttributesConfig_;
- int RowIndexId_ = -1;
- int RangeIndexId_ = -1;
- int TableIndexId_ = -1;
- int TabletIndexId_ = -1;
-
- bool FirstBatch_ = true;
- std::vector<IUnversionedColumnarRowBatch::TDictionaryId> ArrowDictionaryIds_;
+ NFormats::ISchemalessFormatWriterPtr Writer_ = nullptr;
+ TString Data_;
+ TStringOutput OutputStream_;
+ NConcurrency::IFlushableAsyncOutputStreamPtr AsyncOutputStream_;
};
DEFINE_REFCOUNTED_TYPE(TArrowRowStreamEncoder)
-////////////////////////////////////////////////////////////////////////////////
-
-class TArrowRowStreamBlockEncoder
-{
-public:
- TArrowRowStreamBlockEncoder(
- TArrowRowStreamEncoderPtr streamEncoder,
- IUnversionedColumnarRowBatchPtr batch)
- : StreamEncoder_(std::move(streamEncoder))
- , Batch_(std::move(batch))
- {
- PrepareColumns();
- if (IsSchemaMessageNeeded()) {
- if (!StreamEncoder_->IsFirstBatch()) {
- RegisterEosMarker();
- }
- ResetArrowDictionaries();
- PrepareSchema();
- }
- PrepareDictionaryBatches();
- PrepareRecordBatch();
- }
-
- i64 GetPayloadSize() const
- {
- i64 size = 0;
- for (const auto& message : Messages_) {
- size += sizeof (ui32); // continuation indicator
- size += sizeof (ui32); // metadata size
- if (message.FlatbufBuilder) {
- size += AlignUp<i64>(message.FlatbufBuilder->GetSize(), ArrowAlignment); // metadata message
- size += AlignUp<i64>(message.BodySize, ArrowAlignment); // body
- }
- }
- return size;
- }
-
- void WritePayload(TMutableRef payloadRef)
- {
- YT_LOG_DEBUG("Started writing payload (Size: %v)",
- payloadRef.Size());
- char* current = payloadRef.Begin();
- for (const auto& message : Messages_) {
- // Continuation indicator
- *reinterpret_cast<ui32*>(current) = 0xFFFFFFFF;
- current += sizeof(ui32);
-
- if (message.FlatbufBuilder) {
- auto metadataSize = message.FlatbufBuilder->GetSize();
- auto* metadataPtr = message.FlatbufBuilder->GetBufferPointer();
-
- // Metadata size
- *reinterpret_cast<ui32*>(current) = AlignUp<i64>(metadataSize, ArrowAlignment);
- current += sizeof(ui32);
-
- // Metadata message
- ::memcpy(current, metadataPtr, metadataSize);
- current += AlignUp<i64>(metadataSize, ArrowAlignment);
-
- // Body
- if (message.BodyWriter) {
- message.BodyWriter(TMutableRef(current, current + message.BodySize));
- current += AlignUp<i64>(message.BodySize, ArrowAlignment);
- } else {
- YT_VERIFY(message.BodySize == 0);
- }
- } else {
- // EOS marker
- *reinterpret_cast<ui32*>(current) = 0;
- current += sizeof(ui32);
- }
- }
- YT_VERIFY(current == payloadRef.End());
- YT_LOG_DEBUG("Finished writing payload");
- }
-
-private:
- const TArrowRowStreamEncoderPtr StreamEncoder_;
- const IUnversionedColumnarRowBatchPtr Batch_;
-
- std::vector<TTypedBatchColumn> TypedColumns_;
-
- struct TMessage
- {
- std::optional<flatbuffers::FlatBufferBuilder> FlatbufBuilder;
- i64 BodySize;
- TBodyWriter BodyWriter;
- };
-
- std::vector<TMessage> Messages_;
-
- void RegisterEosMarker()
- {
- YT_LOG_DEBUG("EOS marker registered");
-
- Messages_.push_back(TMessage{
- std::nullopt,
- 0,
- TBodyWriter()
- });
- }
-
- void RegisterMessage(
- org::apache::arrow::flatbuf::MessageHeader type,
- flatbuffers::FlatBufferBuilder&& flatbufBuilder,
- i64 bodySize = 0,
- std::function<void(TMutableRef)> bodyWriter = nullptr)
- {
- YT_LOG_DEBUG("Message registered (Type: %v, MessageSize: %v, BodySize: %v)",
- org::apache::arrow::flatbuf::EnumNamesMessageHeader()[type],
- flatbufBuilder.GetSize(),
- bodySize);
-
- YT_VERIFY((bodySize % ArrowAlignment) == 0);
- Messages_.push_back(TMessage{
- std::move(flatbufBuilder),
- bodySize,
- std::move(bodyWriter)
- });
- }
-
- std::optional<TColumnSchema> FindColumnSchema(const TBatchColumn& column)
- {
- YT_VERIFY(column.Id >= 0);
- auto name = StreamEncoder_->GetNameTable()->GetName(column.Id);
- auto columnSchemaPtr = StreamEncoder_->GetSchema()->FindColumn(name);
- if (!columnSchemaPtr) {
- if (StreamEncoder_->IsSystemColumnId(column.Id) && StreamEncoder_->IsSystemColumnEnable(column.Id)) {
- return TColumnSchema(TString(name), EValueType::Int64);
- }
- return std::nullopt;
- }
- return *columnSchemaPtr;
- }
-
- void PrepareColumns()
- {
- auto batchColumns = Batch_->MaterializeColumns();
- TypedColumns_.reserve(batchColumns.Size());
- for (const auto* column : batchColumns) {
- // Ignoring null schema column and not enabled system columns.
- if (auto columnSchema = FindColumnSchema(*column)) {
- TypedColumns_.push_back(TTypedBatchColumn{
- column,
- columnSchema->LogicalType()
- });
- }
- }
- }
-
- bool IsSchemaMessageNeeded()
- {
- if (StreamEncoder_->IsFirstBatch()) {
- return true;
- }
-
- YT_VERIFY(StreamEncoder_->ArrowDictionaryIds().size() == TypedColumns_.size());
-
- bool result = StreamEncoder_->IsFirstBatch();
- for (int index = 0; index < std::ssize(TypedColumns_); ++index) {
- bool currentDictionary = IsDictionaryEncodedColumn(*TypedColumns_[index].Column);
- bool previousDictionary = StreamEncoder_->ArrowDictionaryIds()[index] != IUnversionedColumnarRowBatch::NullDictionaryId;
- if (currentDictionary != previousDictionary) {
- result = true;
- }
- }
- return result;
- }
-
- void ResetArrowDictionaries()
- {
- StreamEncoder_->ArrowDictionaryIds().assign(TypedColumns_.size(), IUnversionedColumnarRowBatch::NullDictionaryId);
- }
-
-
- void PrepareSchema()
- {
- flatbuffers::FlatBufferBuilder flatbufBuilder;
-
- int arrowDictionaryIdCounter = 0;
- std::vector<flatbuffers::Offset<org::apache::arrow::flatbuf::Field>> fieldOffsets;
- fieldOffsets.reserve(TypedColumns_.size());
-
- for (const auto& typedColumn : TypedColumns_) {
- auto optionalColumnSchema = FindColumnSchema(*typedColumn.Column);
- YT_VERIFY(optionalColumnSchema != std::nullopt);
- auto columnSchema = *optionalColumnSchema;
-
- auto nameOffset = SerializeString(&flatbufBuilder, columnSchema.Name());
-
- auto [typeType, typeOffset] = SerializeColumnType(&flatbufBuilder, columnSchema);
-
- flatbuffers::Offset<org::apache::arrow::flatbuf::DictionaryEncoding> dictionaryEncodingOffset;
-
- auto indexTypeOffset = org::apache::arrow::flatbuf::CreateInt(flatbufBuilder, 32, false);
-
- if (IsDictionaryEncodedColumn(*typedColumn.Column)) {
- dictionaryEncodingOffset = org::apache::arrow::flatbuf::CreateDictionaryEncoding(
- flatbufBuilder,
- arrowDictionaryIdCounter++,
- indexTypeOffset);
- }
-
- auto fieldOffset = org::apache::arrow::flatbuf::CreateField(
- flatbufBuilder,
- nameOffset,
- columnSchema.LogicalType()->IsNullable(),
- typeType,
- typeOffset,
- dictionaryEncodingOffset);
-
- fieldOffsets.push_back(fieldOffset);
- }
-
- auto fieldsOffset = flatbufBuilder.CreateVector(fieldOffsets);
-
- auto schemaOffset = org::apache::arrow::flatbuf::CreateSchema(
- flatbufBuilder,
- org::apache::arrow::flatbuf::Endianness_Little,
- fieldsOffset);
-
- auto messageOffset = org::apache::arrow::flatbuf::CreateMessage(
- flatbufBuilder,
- org::apache::arrow::flatbuf::MetadataVersion_V4,
- org::apache::arrow::flatbuf::MessageHeader_Schema,
- schemaOffset.Union(),
- 0);
-
- flatbufBuilder.Finish(messageOffset);
-
- RegisterMessage(
- org::apache::arrow::flatbuf::MessageHeader_Schema,
- std::move(flatbufBuilder));
- }
-
- void PrepareDictionaryBatches()
- {
- int arrowDictionaryIdCounter = 0;
- auto prepareDictionaryBatch = [&] (
- int columnIndex,
- IUnversionedColumnarRowBatch::TDictionaryId ytDictionaryId,
- const TBatchColumn* dictionaryColumn)
- {
- int arrowDictionaryId = arrowDictionaryIdCounter++;
- const auto& typedColumn = TypedColumns_[columnIndex];
- auto previousYTDictionaryId = StreamEncoder_->ArrowDictionaryIds()[columnIndex];
- if (ytDictionaryId == previousYTDictionaryId) {
- YT_LOG_DEBUG("Reusing previous dictionary (ColumnId: %v, YTDictionaryId: %v, ArrowDictionaryId: %v)",
- typedColumn.Column->Id,
- ytDictionaryId,
- arrowDictionaryId);
- } else {
- YT_LOG_DEBUG("Sending new dictionary (ColumnId: %v, YTDictionaryId: %v, ArrowDictionaryId: %v)",
- typedColumn.Column->Id,
- ytDictionaryId,
- arrowDictionaryId);
- PrepareDictionaryBatch(
- TTypedBatchColumn{dictionaryColumn, typedColumn.Type},
- arrowDictionaryId);
- StreamEncoder_->ArrowDictionaryIds()[columnIndex] = ytDictionaryId;
- }
- };
-
- for (int columnIndex = 0; columnIndex < std::ssize(TypedColumns_); ++columnIndex) {
- const auto& typedColumn = TypedColumns_[columnIndex];
- if (typedColumn.Column->Dictionary) {
- YT_LOG_DEBUG("Adding dictionary batch for dictionary-encoded column (ColumnId: %v)",
- typedColumn.Column->Id);
- prepareDictionaryBatch(
- columnIndex,
- typedColumn.Column->Dictionary->DictionaryId,
- typedColumn.Column->Dictionary->ValueColumn);
- } else if (IsRleButNotDictionaryEncodedStringLikeColumn(*typedColumn.Column)) {
- YT_LOG_DEBUG("Adding dictionary batch for RLE but not dictionary-encoded string-like column (ColumnId: %v)",
- typedColumn.Column->Id);
- prepareDictionaryBatch(
- columnIndex,
- IUnversionedColumnarRowBatch::GenerateDictionaryId(), // any unique one will do
- typedColumn.Column->Rle->ValueColumn);
- } else if (IsRleAndDictionaryEncodedColumn(*typedColumn.Column)) {
- YT_LOG_DEBUG("Adding dictionary batch for RLE and dictionary-encoded column (ColumnId: %v)",
- typedColumn.Column->Id);
- prepareDictionaryBatch(
- columnIndex,
- typedColumn.Column->Rle->ValueColumn->Dictionary->DictionaryId,
- typedColumn.Column->Rle->ValueColumn->Dictionary->ValueColumn);
- }
- }
- }
-
- void PrepareDictionaryBatch(
- const TTypedBatchColumn& typedColumn,
- int arrowDictionaryId)
- {
- flatbuffers::FlatBufferBuilder flatbufBuilder;
-
- auto [recordBatchOffset, bodySize, bodyWriter] = SerializeRecordBatch(
- &flatbufBuilder,
- typedColumn.Column->ValueCount,
- TRange({typedColumn}));
-
- auto dictionaryBatchOffset = org::apache::arrow::flatbuf::CreateDictionaryBatch(
- flatbufBuilder,
- arrowDictionaryId,
- recordBatchOffset);
-
- auto messageOffset = org::apache::arrow::flatbuf::CreateMessage(
- flatbufBuilder,
- org::apache::arrow::flatbuf::MetadataVersion_V4,
- org::apache::arrow::flatbuf::MessageHeader_DictionaryBatch,
- dictionaryBatchOffset.Union(),
- bodySize);
-
- flatbufBuilder.Finish(messageOffset);
-
- RegisterMessage(
- org::apache::arrow::flatbuf::MessageHeader_DictionaryBatch,
- std::move(flatbufBuilder),
- bodySize,
- std::move(bodyWriter));
- }
-
- void PrepareRecordBatch()
- {
- flatbuffers::FlatBufferBuilder flatbufBuilder;
-
- auto [recordBatchOffset, bodySize, bodyWriter] = SerializeRecordBatch(
- &flatbufBuilder,
- Batch_->GetRowCount(),
- TypedColumns_);
-
- auto messageOffset = org::apache::arrow::flatbuf::CreateMessage(
- flatbufBuilder,
- org::apache::arrow::flatbuf::MetadataVersion_V4,
- org::apache::arrow::flatbuf::MessageHeader_RecordBatch,
- recordBatchOffset.Union(),
- bodySize);
-
- flatbufBuilder.Finish(messageOffset);
-
- RegisterMessage(
- org::apache::arrow::flatbuf::MessageHeader_RecordBatch,
- std::move(flatbufBuilder),
- bodySize,
- std::move(bodyWriter));
- }
-};
-
-////////////////////////////////////////////////////////////////////////////////
TSharedRef TArrowRowStreamEncoder::Encode(
const IUnversionedRowBatchPtr& batch,
@@ -1157,16 +92,31 @@ TSharedRef TArrowRowStreamEncoder::Encode(
descriptor.set_rowset_kind(NApi::NRpcProxy::NProto::RK_UNVERSIONED);
descriptor.set_rowset_format(NApi::NRpcProxy::NProto::RF_ARROW);
- TArrowRowStreamBlockEncoder blockEncoder(this, std::move(columnarBatch));
+ if (!Writer_) {
+ // The writer is created lazily to avoid unnecessary errors in the constructor when using fallbackEncoder
+ Writer_ = CreateStaticTableWriterForFormat(
+ NFormats::EFormatType::Arrow,
+ NameTable_,
+ {Schema_},
+ {Columns_},
+ AsyncOutputStream_,
+ /*enableContextSaving*/ false,
+ ControlAttributesConfig_,
+ /*keyColumnCount*/ 0);
+ }
+ Data_.clear();
+ Writer_->WriteBatch(batch);
+ NConcurrency::WaitFor(Writer_->Flush())
+ .ThrowOnError();
+
+ auto rowRefs = TSharedRef::FromString(Data_);
auto [block, payloadRef] = SerializeRowStreamBlockEnvelope(
- blockEncoder.GetPayloadSize(),
+ rowRefs.Size(),
descriptor,
statistics);
- blockEncoder.WritePayload(payloadRef);
-
- FirstBatch_ = false;
+ MergeRefsToRef(std::vector<TSharedRef>{rowRefs}, payloadRef);
return block;
}
@@ -1177,12 +127,14 @@ TSharedRef TArrowRowStreamEncoder::Encode(
IRowStreamEncoderPtr CreateArrowRowStreamEncoder(
TTableSchemaPtr schema,
+ std::optional<std::vector<std::string>> columns,
TNameTablePtr nameTable,
IRowStreamEncoderPtr fallbackEncoder,
NFormats::TControlAttributesConfigPtr controlAttributesConfig)
{
return New<TArrowRowStreamEncoder>(
std::move(schema),
+ std::move(columns),
std::move(nameTable),
std::move(fallbackEncoder),
std::move(controlAttributesConfig));
diff --git a/yt/yt/client/arrow/arrow_row_stream_encoder.h b/yt/yt/client/arrow/arrow_row_stream_encoder.h
index 792b647d18..be20a949c4 100644
--- a/yt/yt/client/arrow/arrow_row_stream_encoder.h
+++ b/yt/yt/client/arrow/arrow_row_stream_encoder.h
@@ -14,6 +14,7 @@ namespace NYT::NArrow {
NApi::NRpcProxy::IRowStreamEncoderPtr CreateArrowRowStreamEncoder(
NTableClient::TTableSchemaPtr schema,
+ std::optional<std::vector<std::string>> columns,
NTableClient::TNameTablePtr nameTable,
NApi::NRpcProxy::IRowStreamEncoderPtr fallbackEncoder,
NFormats::TControlAttributesConfigPtr controlAttributesConfig);
diff --git a/yt/yt/client/arrow/ya.make b/yt/yt/client/arrow/ya.make
index 40d27d8e07..097479ffdf 100644
--- a/yt/yt/client/arrow/ya.make
+++ b/yt/yt/client/arrow/ya.make
@@ -10,7 +10,7 @@ SRCS(
PEERDIR(
yt/yt/client
- yt/yt/client/arrow/fbs
+ yt/yt/library/formats
)
END()
diff --git a/yt/yt/client/driver/proxy_discovery_cache.cpp b/yt/yt/client/driver/proxy_discovery_cache.cpp
index a17894a93e..a9612bb359 100644
--- a/yt/yt/client/driver/proxy_discovery_cache.cpp
+++ b/yt/yt/client/driver/proxy_discovery_cache.cpp
@@ -70,6 +70,8 @@ public:
private:
const IClientPtr Client_;
+ const NLogging::TLogger Logger = DriverLogger();
+
TFuture<TProxyDiscoveryResponse> DoGet(
const TProxyDiscoveryRequest& request,
bool /*isPeriodicUpdate*/) noexcept override
@@ -93,7 +95,13 @@ private:
options.ReadFrom = EMasterChannelKind::LocalCache;
options.Attributes = {BalancersAttributeName};
- auto path = GetProxyRegistryPath(request.Type) + "/@";
+ TYPath path;
+ try {
+ path = GetProxyRegistryPath(request.Type) + "/@";
+ } catch (const std::exception& ex) {
+ YT_LOG_ERROR(ex, "Failed to get proxy registry path");
+ return MakeFuture<std::optional<TProxyDiscoveryResponse>>(ex);
+ }
return Client_->GetNode(path, options).Apply(
BIND([=] (const TYsonString& yson) -> std::optional<TProxyDiscoveryResponse> {
auto attributes = ConvertTo<IMapNodePtr>(yson);
@@ -120,7 +128,13 @@ private:
options.SuppressTransactionCoordinatorSync = true;
options.Attributes = {BannedAttributeName, RoleAttributeName, AddressesAttributeName};
- auto path = GetProxyRegistryPath(request.Type);
+ TYPath path;
+ try {
+ path = GetProxyRegistryPath(request.Type);
+ } catch (const std::exception& ex) {
+ YT_LOG_ERROR(ex, "Failed to get proxy registry path");
+ return MakeFuture<TProxyDiscoveryResponse>(ex);
+ }
return Client_->GetNode(path, options).Apply(BIND([=] (const TYsonString& yson) {
TProxyDiscoveryResponse response;
diff --git a/yt/yt/client/signature/public.h b/yt/yt/client/signature/public.h
new file mode 100644
index 0000000000..012d19cfda
--- /dev/null
+++ b/yt/yt/client/signature/public.h
@@ -0,0 +1,11 @@
+#include <library/cpp/yt/memory/ref_counted.h>
+
+namespace NYT::NSignature {
+
+///////////////////////////////////////////////////////////////////////////////
+
+DECLARE_REFCOUNTED_CLASS(TSignature)
+
+///////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NSignature
diff --git a/yt/yt/client/signature/signature.cpp b/yt/yt/client/signature/signature.cpp
new file mode 100644
index 0000000000..4c071c1407
--- /dev/null
+++ b/yt/yt/client/signature/signature.cpp
@@ -0,0 +1,64 @@
+#include "signature.h"
+
+#include <yt/yt/core/yson/consumer.h>
+
+#include <yt/yt/core/ytree/fluent.h>
+#include <yt/yt/core/ytree/convert.h>
+
+namespace NYT::NSignature {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NYson;
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TSignature::TSignature(NYson::TYsonString payload)
+ : Payload_(std::move(payload))
+{ }
+
+////////////////////////////////////////////////////////////////////////////////
+
+const TYsonString& TSignature::Payload() const
+{
+ return Payload_;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void Serialize(const TSignature& signature, IYsonConsumer* consumer)
+{
+ consumer->OnBeginMap();
+ BuildYsonMapFragmentFluently(consumer)
+ .Item("header").Value(signature.Header_.ToString())
+ .Item("payload").Value(signature.Payload_.ToString())
+ .Item("signature").Value(TString(
+ reinterpret_cast<const char*>(signature.Signature_.data()),
+ signature.Signature_.size()));
+ consumer->OnEndMap();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void Deserialize(TSignature& signature, INodePtr node)
+{
+ auto mapNode = node->AsMap();
+ signature.Header_ = TYsonString(mapNode->GetChildValueOrThrow<TString>("header"));
+ signature.Payload_ = TYsonString(mapNode->GetChildValueOrThrow<TString>("payload"));
+
+ auto signatureString = mapNode->GetChildValueOrThrow<TString>("signature");
+ auto signatureBytes = std::as_bytes(std::span(TStringBuf(signatureString)));
+ signature.Signature_.resize(signatureBytes.size());
+
+ std::copy(signatureBytes.begin(), signatureBytes.end(), signature.Signature_.begin());
+}
+
+void Deserialize(TSignature& signature, TYsonPullParserCursor* cursor)
+{
+ Deserialize(signature, ExtractTo<INodePtr>(cursor));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NSignature
diff --git a/yt/yt/client/signature/signature.h b/yt/yt/client/signature/signature.h
new file mode 100644
index 0000000000..f6602994ce
--- /dev/null
+++ b/yt/yt/client/signature/signature.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "public.h"
+
+#include <yt/yt/core/yson/string.h>
+
+#include <yt/yt/core/ytree/public.h>
+
+#include <vector>
+
+namespace NYT::NSignature {
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TSignature final
+{
+public:
+ // NB(pavook) only needed for Deserialize internals.
+
+ //! Constructs an empty TSignature.
+ TSignature() = default;
+
+ //! Creates a TSignature containing the given payload without an actual signature.
+ explicit TSignature(NYson::TYsonString payload);
+
+ [[nodiscard]] const NYson::TYsonString& Payload() const;
+
+private:
+ NYson::TYsonString Header_;
+ NYson::TYsonString Payload_;
+ std::vector<std::byte> Signature_;
+
+ friend class TSignatureGenerator;
+ friend class TSignatureValidator;
+
+ friend void Serialize(const TSignature& signature, NYson::IYsonConsumer* consumer);
+ friend void Deserialize(TSignature& signature, NYTree::INodePtr node);
+ friend void Deserialize(TSignature& signature, NYson::TYsonPullParserCursor* cursor);
+};
+
+DEFINE_REFCOUNTED_TYPE(TSignature)
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NSignature
diff --git a/yt/yt/client/signature/unittests/signature_ut.cpp b/yt/yt/client/signature/unittests/signature_ut.cpp
new file mode 100644
index 0000000000..75ae1733fa
--- /dev/null
+++ b/yt/yt/client/signature/unittests/signature_ut.cpp
@@ -0,0 +1,54 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/client/signature/signature.h>
+
+#include <yt/yt/core/yson/string.h>
+
+#include <yt/yt/core/ytree/convert.h>
+
+namespace NYT::NSignature {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NYson;
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSignatureTest, PayloadConstruct)
+{
+ TSignature signature(TYsonString("payload"_sb));
+ EXPECT_EQ(signature.Payload().ToString(), "payload");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSignatureTest, DeserializeSerialize)
+{
+ // SignatureSize bytes.
+ TYsonString ysonOK(R"({"header"="header";"payload"="payload";"signature"="signature";})"_sb);
+
+ TSignaturePtr signature;
+ EXPECT_NO_THROW(signature = ConvertTo<TSignaturePtr>(ysonOK));
+ EXPECT_EQ(signature->Payload().ToString(), "payload");
+
+ EXPECT_EQ(ConvertToYsonString(signature, EYsonFormat::Text).ToString(), ysonOK.ToString());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSignatureTest, DeserializeFail)
+{
+ {
+ TYsonString ysonFail(
+ R"({"header"="header";"buddy"="payload";"signature"="abacaba";})"_sb
+ );
+ EXPECT_THROW_WITH_SUBSTRING(ConvertTo<TSignaturePtr>(ysonFail), "no child with key \"payload\"");
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NSignature
diff --git a/yt/yt/library/oom/unittests/ya.make b/yt/yt/client/signature/unittests/ya.make
index 23392352b9..b7f6fd5fe5 100644
--- a/yt/yt/library/oom/unittests/ya.make
+++ b/yt/yt/client/signature/unittests/ya.make
@@ -1,17 +1,18 @@
-GTEST()
+GTEST(unittester-client-signature)
INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
-ALLOCATOR(TCMALLOC)
-
SRCS(
- oom_ut.cpp
+ signature_ut.cpp
)
INCLUDE(${ARCADIA_ROOT}/yt/opensource.inc)
PEERDIR(
- yt/yt/library/oom
+ yt/yt/core/test_framework
+ yt/yt/client
)
+SIZE(SMALL)
+
END()
diff --git a/yt/yt/client/ya.make b/yt/yt/client/ya.make
index 2b384fe818..9d54b9ab4c 100644
--- a/yt/yt/client/ya.make
+++ b/yt/yt/client/ya.make
@@ -101,6 +101,8 @@ SRCS(
security_client/public.cpp
security_client/helpers.cpp
+ signature/signature.cpp
+
table_client/public.cpp
table_client/adapters.cpp
table_client/table_output.cpp
@@ -237,6 +239,7 @@ RECURSE(
RECURSE_FOR_TESTS(
api/unittests
+ signature/unittests
table_client/unittests
unittests
)
diff --git a/yt/yt/core/bus/tcp/config.h b/yt/yt/core/bus/tcp/config.h
index 22d1bd6cd7..914035e2d9 100644
--- a/yt/yt/core/bus/tcp/config.h
+++ b/yt/yt/core/bus/tcp/config.h
@@ -47,11 +47,11 @@ public:
TEnumIndexedArray<EMultiplexingBand, TMultiplexingBandConfigPtr> MultiplexingBands;
- TTcpDispatcherConfigPtr ApplyDynamic(const TTcpDispatcherDynamicConfigPtr& dynamicConfig) const;
-
//! Used to store TLS/SSL certificate files.
std::optional<TString> BusCertsDirectoryPath;
+ TTcpDispatcherConfigPtr ApplyDynamic(const TTcpDispatcherDynamicConfigPtr& dynamicConfig) const;
+
REGISTER_YSON_STRUCT(TTcpDispatcherConfig);
static void Register(TRegistrar registrar);
@@ -78,6 +78,8 @@ public:
//! Used to store TLS/SSL certificate files.
std::optional<TString> BusCertsDirectoryPath;
+ static void Setup(auto&& registrar);
+
REGISTER_YSON_STRUCT(TTcpDispatcherDynamicConfig);
static void Register(TRegistrar registrar);
diff --git a/yt/yt/core/bus/tcp/configure_dispatcher.cpp b/yt/yt/core/bus/tcp/configure_dispatcher.cpp
new file mode 100644
index 0000000000..75fdd662a5
--- /dev/null
+++ b/yt/yt/core/bus/tcp/configure_dispatcher.cpp
@@ -0,0 +1,41 @@
+#include "dispatcher.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NBus {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TTcpDispatcherConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TTcpDispatcherDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TTcpDispatcherConfigPtr& config)
+{
+ NBus::TTcpDispatcher::Get()->Configure(config);
+}
+
+void ReconfigureSingleton(
+ const TTcpDispatcherConfigPtr& config,
+ const TTcpDispatcherDynamicConfigPtr& dynamicConfig)
+{
+ TTcpDispatcher::Get()->Configure(config->ApplyDynamic(dynamicConfig));
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "tcp_dispatcher",
+ TTcpDispatcherConfig,
+ TTcpDispatcherDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NBus
diff --git a/yt/yt/core/bus/tcp/dispatcher.cpp b/yt/yt/core/bus/tcp/dispatcher.cpp
index 045f3d231d..4b5c7b64f2 100644
--- a/yt/yt/core/bus/tcp/dispatcher.cpp
+++ b/yt/yt/core/bus/tcp/dispatcher.cpp
@@ -1,4 +1,5 @@
#include "dispatcher.h"
+
#include "dispatcher_impl.h"
#include <yt/yt/core/bus/private.h>
diff --git a/yt/yt/core/bus/tcp/public.h b/yt/yt/core/bus/tcp/public.h
index 5e7c54af91..0c86109c1a 100644
--- a/yt/yt/core/bus/tcp/public.h
+++ b/yt/yt/core/bus/tcp/public.h
@@ -1,5 +1,7 @@
#pragma once
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
#include <yt/yt/core/bus/public.h>
namespace NYT::NBus {
@@ -18,6 +20,8 @@ DECLARE_REFCOUNTED_CLASS(TBusClientConfig)
struct IPacketTranscoderFactory;
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TTcpDispatcherConfig, TTcpDispatcherDynamicConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NBus
diff --git a/yt/yt/core/concurrency/configure_fiber_manager.cpp b/yt/yt/core/concurrency/configure_fiber_manager.cpp
new file mode 100644
index 0000000000..36168664fc
--- /dev/null
+++ b/yt/yt/core/concurrency/configure_fiber_manager.cpp
@@ -0,0 +1,41 @@
+#include "fiber_manager.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NConcurrency {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TFiberManagerConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TFiberManagerDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TFiberManagerConfigPtr& config)
+{
+ TFiberManager::Configure(config);
+}
+
+void ReconfigureSingleton(
+ const TFiberManagerConfigPtr& config,
+ const TFiberManagerDynamicConfigPtr& dynamicConfig)
+{
+ TFiberManager::Configure(config->ApplyDynamic(dynamicConfig));
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "fiber_manager",
+ TFiberManagerConfig,
+ TFiberManagerDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NConcurrency
diff --git a/yt/yt/core/concurrency/coroutine.h b/yt/yt/core/concurrency/coroutine.h
index 7b395585e9..5a4e849908 100644
--- a/yt/yt/core/concurrency/coroutine.h
+++ b/yt/yt/core/concurrency/coroutine.h
@@ -5,6 +5,8 @@
#include <yt/yt/core/actions/callback.h>
+#include <library/cpp/yt/misc/concepts.h>
+
#include <util/system/context.h>
#include <optional>
diff --git a/yt/yt/core/concurrency/execution_stack.h b/yt/yt/core/concurrency/execution_stack.h
index 99038d3cd3..fe02810788 100644
--- a/yt/yt/core/concurrency/execution_stack.h
+++ b/yt/yt/core/concurrency/execution_stack.h
@@ -2,6 +2,10 @@
#include "public.h"
+#if defined(_win_)
+#include <windows.h>
+#endif
+
namespace NYT::NConcurrency {
////////////////////////////////////////////////////////////////////////////////
@@ -66,7 +70,6 @@ private:
friend TExecutionContext CreateExecutionContext(
TExecutionStack* stack,
void (*trampoline)(void*));
-
};
#else
diff --git a/yt/yt/core/concurrency/new_fair_share_thread_pool.cpp b/yt/yt/core/concurrency/new_fair_share_thread_pool.cpp
index a0e9fd4e8e..14541740eb 100644
--- a/yt/yt/core/concurrency/new_fair_share_thread_pool.cpp
+++ b/yt/yt/core/concurrency/new_fair_share_thread_pool.cpp
@@ -9,6 +9,7 @@
#include <yt/yt/core/actions/current_invoker.h>
#include <yt/yt/core/misc/finally.h>
+#include <yt/yt/core/misc/hazard_ptr.h>
#include <yt/yt/core/misc/heap.h>
#include <yt/yt/core/misc/ring_queue.h>
#include <yt/yt/core/misc/mpsc_stack.h>
@@ -714,7 +715,9 @@ public:
while (true) {
auto cookie = GetEventCount()->PrepareWait();
- auto hasAction = ThreadStates_[index].Action.BucketHolder;
+ auto& threadState = ThreadStates_[index];
+
+ auto hasAction = threadState.Action.BucketHolder;
int activeThreadDelta = hasAction ? -1 : 0;
auto callback = DoOnExecute(index, fetchNext);
@@ -738,6 +741,7 @@ public:
}
YT_VERIFY(fetchNext);
+ MaybeRunMaintenance(&threadState, GetCpuInstant(), /*flush*/ true);
Wait(cookie, isStopping);
}
}
@@ -806,6 +810,7 @@ private:
int LastActionsInQueue;
TDuration TimeFromStart;
TDuration TimeFromEnqueue;
+ TCpuInstant LastMaintenanceInstant = {};
};
static_assert(sizeof(TThreadState) >= CacheLineSize);
@@ -1189,6 +1194,8 @@ private:
ReportWaitTime(waitTime);
}
+ MaybeRunMaintenance(&threadState, action.StartedAt, /*flush*/ false);
+
CumulativeSchedulingTimeCounter_.Add(CpuDurationToDuration(GetCpuInstant() - cpuInstant));
if (!fetchNext) {
@@ -1240,6 +1247,17 @@ private:
WaitTimeObserver_(waitTime);
}
}
+
+ static void MaybeRunMaintenance(TThreadState* threadState, TCpuInstant now, bool flush)
+ {
+ YT_ASSERT(threadState);
+
+ constexpr i64 MaintenancePeriod = 1'000'000'000;
+ if (flush || now > threadState->LastMaintenanceInstant + MaintenancePeriod) {
+ ReclaimHazardPointers(false);
+ threadState->LastMaintenanceInstant = now;
+ }
+ }
};
DEFINE_REFCOUNTED_TYPE(TTwoLevelFairShareQueue)
diff --git a/yt/yt/core/concurrency/public.h b/yt/yt/core/concurrency/public.h
index b7634c0730..e25d455dfa 100644
--- a/yt/yt/core/concurrency/public.h
+++ b/yt/yt/core/concurrency/public.h
@@ -1,6 +1,9 @@
#pragma once
#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
+#include <library/cpp/yt/misc/enum.h>
namespace NYT::NConcurrency {
@@ -127,6 +130,8 @@ DECLARE_REFCOUNTED_STRUCT(ICallbackProvider)
class TPropagatingStorage;
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TFiberManagerConfig, TFiberManagerDynamicConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NConcurrency
diff --git a/yt/yt/core/logging/configure_log_manager.cpp b/yt/yt/core/logging/configure_log_manager.cpp
new file mode 100644
index 0000000000..4ace9c5d5b
--- /dev/null
+++ b/yt/yt/core/logging/configure_log_manager.cpp
@@ -0,0 +1,51 @@
+#include "log_manager.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NLogging {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TLogManagerConfigPtr>& parameter)
+{
+ parameter
+ .DefaultCtor([] { return NLogging::TLogManagerConfig::CreateDefault(); })
+ .ResetOnLoad();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TLogManagerDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TLogManagerConfigPtr& config)
+{
+ if (!NLogging::TLogManager::Get()->IsConfiguredFromEnv()) {
+ TLogManager::Get()->Configure(
+ config,
+ /*sync*/ true);
+ }
+}
+
+void ReconfigureSingleton(
+ const TLogManagerConfigPtr& config,
+ const TLogManagerDynamicConfigPtr& dynamicConfig)
+{
+ if (!NLogging::TLogManager::Get()->IsConfiguredFromEnv()) {
+ NLogging::TLogManager::Get()->Configure(
+ config->ApplyDynamic(dynamicConfig),
+ /*sync*/ false);
+ }
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "logging",
+ TLogManagerConfig,
+ TLogManagerDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NLogging
diff --git a/yt/yt/core/logging/public.h b/yt/yt/core/logging/public.h
index 2ede67840c..cd9b4d1568 100644
--- a/yt/yt/core/logging/public.h
+++ b/yt/yt/core/logging/public.h
@@ -1,9 +1,12 @@
#pragma once
#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
#include <library/cpp/yt/logging/public.h>
+#include <library/cpp/yt/misc/enum.h>
+
namespace NYT::NLogging {
////////////////////////////////////////////////////////////////////////////////
@@ -45,6 +48,8 @@ DECLARE_REFCOUNTED_STRUCT(IFileLogWriter)
DECLARE_REFCOUNTED_STRUCT(IStreamLogOutput)
DECLARE_REFCOUNTED_STRUCT(ILogCompressionCodec)
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TLogManagerConfig, TLogManagerDynamicConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NLogging
diff --git a/yt/yt/core/misc/configurable_singleton_decl-inl.h b/yt/yt/core/misc/configurable_singleton_decl-inl.h
new file mode 100644
index 0000000000..75342d0715
--- /dev/null
+++ b/yt/yt/core/misc/configurable_singleton_decl-inl.h
@@ -0,0 +1,33 @@
+#ifndef CONFIGURABLE_SINGLETON_DECL_INL_H_
+#error "Direct inclusion of this file is not allowed, include configurable_singleton_decl.h"
+// For the sake of sane code completion.
+#include "configurable_singleton_decl.h"
+#endif
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace NDetail {
+
+template <class TConfig, bool Static>
+struct TSingletonConfigTag
+{ };
+
+} // namespace NDetail
+
+////////////////////////////////////////////////////////////////////////////////
+
+#undef YT_DECLARE_CONFIGURABLE_SINGLETON
+#undef YT_DECLARE_RECONFIGURABLE_SINGLETON
+
+#define YT_DECLARE_CONFIGURABLE_SINGLETON(configType) \
+ void CheckSingletonConfigRegistered(::NYT::NDetail::TSingletonConfigTag<configType, true>) \
+
+#define YT_DECLARE_RECONFIGURABLE_SINGLETON(configType, dynamicConfigType) \
+ void CheckSingletonConfigRegistered(::NYT::NDetail::TSingletonConfigTag<configType, true>); \
+ void CheckSingletonConfigRegistered(::NYT::NDetail::TSingletonConfigTag<dynamicConfigType, false>)
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/yt/yt/core/misc/configurable_singleton_decl.h b/yt/yt/core/misc/configurable_singleton_decl.h
new file mode 100644
index 0000000000..72d7b157c4
--- /dev/null
+++ b/yt/yt/core/misc/configurable_singleton_decl.h
@@ -0,0 +1,16 @@
+#pragma once
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define YT_DECLARE_CONFIGURABLE_SINGLETON(configType)
+#define YT_DECLARE_RECONFIGURABLE_SINGLETON(configType, dynamicConfigType)
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
+
+#define CONFIGURABLE_SINGLETON_DECL_INL_H_
+#include "configurable_singleton_decl-inl.h"
+#undef CONFIGURABLE_SINGLETON_DECL_INL_H_
diff --git a/yt/yt/core/misc/configurable_singleton_def-inl.h b/yt/yt/core/misc/configurable_singleton_def-inl.h
new file mode 100644
index 0000000000..0f46b7c445
--- /dev/null
+++ b/yt/yt/core/misc/configurable_singleton_def-inl.h
@@ -0,0 +1,150 @@
+#ifndef CONFIGURABLE_SINGLETON_DEF_INL_H_
+#error "Direct inclusion of this file is not allowed, include configurable_singleton_def.h"
+// For the sake of sane code completion.
+#include "configurable_singleton_def.h"
+#endif
+
+#include <library/cpp/yt/misc/static_initializer.h>
+
+#include <yt/yt/core/misc/collection_helpers.h>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace NDetail {
+
+template <bool Static>
+template <class TConfig>
+TIntrusivePtr<TConfig> TSingletonsConfigBase<Static>::TryGetSingletonConfig()
+{
+ CheckSingletonConfigRegistered(TSingletonConfigTag<TConfig, true>());
+ return std::any_cast<TIntrusivePtr<TConfig>>(*GetOrCrash(TypeToConfig_, typeid(TConfig)));
+}
+
+template <bool Static>
+template <class TConfig>
+TIntrusivePtr<TConfig> TSingletonsConfigBase<Static>::GetSingletonConfig()
+{
+ auto config = TryGetSingletonConfig<TConfig>();
+ YT_VERIFY(config);
+ return config;
+}
+
+template <bool Static>
+template <class TConfig>
+void TSingletonsConfigBase<Static>::SetSingletonConfig(TIntrusivePtr<TConfig> config)
+{
+ CheckSingletonConfigRegistered(TSingletonConfigTag<TConfig, Static>());
+ *GetOrCrash(TypeToConfig_, typeid(TConfig)) = std::move(config);
+}
+
+template <class TManagerConfig>
+using TRegisterSingletonField = std::function<void(NYTree::TYsonStructRegistrar<TManagerConfig> registrar)>;
+using TConfigureSingleton = std::function<void(const std::any& config)>;
+using TReconfigureSingleton = std::function<void(const std::any& config, const std::any& dynamicConfig)>;
+
+struct TSingletonTraits
+{
+ TRegisterSingletonField<TSingletonsConfig> RegisterField;
+ TRegisterSingletonField<TSingletonsDynamicConfig> RegisterDynamicField;
+ TConfigureSingleton Configure;
+ TReconfigureSingleton Reconfigure;
+};
+
+struct TSingletonConfigHelpers
+{
+ static void RegisterSingleton(
+ const std::string& singletonName,
+ TSingletonTraits singletonTraits);
+
+ template <class TSingletonConfig, class TManagerConfig>
+ static TRegisterSingletonField<TManagerConfig> MakeRegisterField(const std::string& singletonName)
+ {
+ return [=] (NYTree::TYsonStructRegistrar<TManagerConfig> registrar) {
+ SetupSingletonConfigParameter(
+ registrar.template ParameterWithUniversalAccessor<TIntrusivePtr<TSingletonConfig>>(
+ // TODO(babenko): switch to std::string
+ TString(singletonName),
+ [=] (TManagerConfig* config) -> auto& {
+ auto it = config->NameToConfig_.find(singletonName);
+ if (it == config->NameToConfig_.end()) {
+ it = config->NameToConfig_.emplace(singletonName, std::any(TIntrusivePtr<TSingletonConfig>())).first;
+ EmplaceOrCrash(config->TypeToConfig_, std::type_index(typeid(TSingletonConfig)), &it->second);
+ }
+ return *std::any_cast<TIntrusivePtr<TSingletonConfig>>(&it->second);
+ }));
+ };
+ }
+
+ template <class TSingletonConfig>
+ static TConfigureSingleton MakeConfigureSingleton()
+ {
+ return [] (const std::any& config) {
+ auto typedConfig = std::any_cast<TIntrusivePtr<TSingletonConfig>>(config);
+ ConfigureSingleton(typedConfig);
+ };
+ }
+
+ template <class TSingletonConfig, class TDynamicSingletonConfig>
+ static TReconfigureSingleton MakeReconfigureSingleton()
+ {
+ return [] (const std::any& config, const std::any& dynamicConfig) {
+ auto typedConfig = std::any_cast<TIntrusivePtr<TSingletonConfig>>(config);
+ auto typedDynamicConfig = std::any_cast<TIntrusivePtr<TDynamicSingletonConfig>>(dynamicConfig);
+ ReconfigureSingleton(typedConfig, typedDynamicConfig);
+ };
+ }
+
+ template <class TSingletonConfig>
+ static void RegisterSingleton(const std::string& singletonName)
+ {
+ RegisterSingleton(
+ singletonName,
+ TSingletonTraits{
+ .RegisterField = MakeRegisterField<TSingletonConfig, TSingletonsConfig>(singletonName),
+ .Configure = MakeConfigureSingleton<TSingletonConfig>(),
+ });
+ }
+
+ template <class TSingletonConfig, class TDynamicSingletonConfig>
+ static void RegisterReconfigurableSingleton(const std::string& singletonName)
+ {
+ RegisterSingleton(
+ singletonName,
+ TSingletonTraits{
+ .RegisterField = MakeRegisterField<TSingletonConfig, TSingletonsConfig>(singletonName),
+ .RegisterDynamicField = MakeRegisterField<TDynamicSingletonConfig, TSingletonsDynamicConfig>(singletonName),
+ .Configure = MakeConfigureSingleton<TSingletonConfig>(),
+ .Reconfigure = MakeReconfigureSingleton<TSingletonConfig, TDynamicSingletonConfig>(),
+ });
+ }
+};
+
+} // namespace NDetail
+
+////////////////////////////////////////////////////////////////////////////////
+
+#undef YT_DEFINE_CONFIGURABLE_SINGLETON
+#undef YT_DEFINE_RECONFIGURABLE_SINGLETON
+
+#define YT_DEFINE_CONFIGURABLE_SINGLETON(singletonName, configType) \
+ [[maybe_unused]] void CheckSingletonConfigRegistered(::NYT::NDetail::TSingletonConfigTag<configType, true>) \
+ { } \
+ \
+ YT_STATIC_INITIALIZER( \
+ ::NYT::NDetail::TSingletonConfigHelpers::RegisterSingleton<configType>(singletonName))
+
+#define YT_DEFINE_RECONFIGURABLE_SINGLETON(singletonName, configType, dynamicConfigType) \
+ [[maybe_unused]] void CheckSingletonConfigRegistered(::NYT::NDetail::TSingletonConfigTag<configType, true>) \
+ { } \
+ \
+ [[maybe_unused]] void CheckSingletonConfigRegistered(::NYT::NDetail::TSingletonConfigTag<dynamicConfigType, false>) \
+ { } \
+ \
+ YT_STATIC_INITIALIZER( \
+ ::NYT::NDetail::TSingletonConfigHelpers::RegisterReconfigurableSingleton<configType, dynamicConfigType>(singletonName)) \
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/yt/yt/core/misc/configurable_singleton_def.cpp b/yt/yt/core/misc/configurable_singleton_def.cpp
new file mode 100644
index 0000000000..acad95481d
--- /dev/null
+++ b/yt/yt/core/misc/configurable_singleton_def.cpp
@@ -0,0 +1,151 @@
+#include "configurable_singleton_def.h"
+
+#include <library/cpp/yt/memory/leaky_singleton.h>
+
+#include <library/cpp/yt/threading/spin_lock.h>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace NDetail {
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TSingletonManagerImpl
+{
+public:
+ static TSingletonManagerImpl* Get()
+ {
+ return LeakySingleton<TSingletonManagerImpl>();
+ }
+
+ void Register(
+ const std::string& singletonName,
+ TSingletonTraits singletonTraits)
+ {
+ YT_VERIFY(!AllRegistered_.load());
+ EmplaceOrCrash(SingletonMap_, singletonName, std::move(singletonTraits));
+ }
+
+
+ void Configure(const TSingletonsConfigPtr& config)
+ {
+ auto guard = Guard(ConfigureLock_);
+
+ if (std::exchange(Configured_, true)) {
+ THROW_ERROR_EXCEPTION("Singletons have already been configured");
+ }
+
+ Config_ = config;
+
+ for (const auto& [name, traits] : Singletons()) {
+ const auto& field = GetOrCrash(config->NameToConfig_, name);
+ traits.Configure(field);
+ }
+ }
+
+ void Reconfigure(const TSingletonsDynamicConfigPtr& dynamicConfig)
+ {
+ auto guard = Guard(ConfigureLock_);
+
+ if (!Configured_) {
+ THROW_ERROR_EXCEPTION("Singletons are not configured yet");
+ }
+
+ for (const auto& [name, traits] : Singletons()) {
+ if (const auto& reconfigure = traits.Reconfigure) {
+ const auto& singletonConfig = GetOrCrash(Config_->NameToConfig_, name);
+ const auto& singletonDynamicConfig = GetOrCrash(dynamicConfig->NameToConfig_, name);
+ reconfigure(singletonConfig, singletonDynamicConfig);
+ }
+ }
+ }
+
+ using TSingletonMap = THashMap<std::string, TSingletonTraits>;
+
+ const TSingletonMap& Singletons() const
+ {
+ AllRegistered_.store(true);
+ return SingletonMap_;
+ }
+
+private:
+ DECLARE_LEAKY_SINGLETON_FRIEND();
+ TSingletonManagerImpl() = default;
+
+ mutable std::atomic<bool> AllRegistered_ = false;
+ THashMap<std::string, TSingletonTraits> SingletonMap_;
+
+ NThreading::TSpinLock ConfigureLock_;
+ TSingletonsConfigPtr Config_;
+ bool Configured_ = false;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TSingletonConfigHelpers::RegisterSingleton(
+ const std::string& fieldName,
+ TSingletonTraits singletonTraits)
+{
+ TSingletonManagerImpl::Get()->Register(
+ fieldName,
+ std::move(singletonTraits));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <bool Static>
+void TSingletonsConfigBase<Static>::RegisterSingletons(
+ auto&& registrar,
+ auto&& registerFieldSelector)
+{
+ for (const auto& [_, traits] : NDetail::TSingletonManagerImpl::Get()->Singletons()) {
+ if (const auto& register_ = registerFieldSelector(traits)) {
+ register_(registrar);
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+template class TSingletonsConfigBase<false>;
+template class TSingletonsConfigBase<true>;
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NDetail
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TSingletonManager::Configure(const TSingletonsConfigPtr& config)
+{
+ NDetail::TSingletonManagerImpl::Get()->Configure(config);
+}
+
+void TSingletonManager::Reconfigure(const TSingletonsDynamicConfigPtr& dynamicConfig)
+{
+ NDetail::TSingletonManagerImpl::Get()->Reconfigure(dynamicConfig);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TSingletonsConfig::Register(TRegistrar registrar)
+{
+ RegisterSingletons(
+ registrar,
+ [] (const NDetail::TSingletonTraits& traits) { return traits.RegisterField; });
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TSingletonsDynamicConfig::Register(TRegistrar registrar)
+{
+ RegisterSingletons(
+ registrar,
+ [] (const NDetail::TSingletonTraits& traits) { return traits.RegisterDynamicField; });
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/yt/yt/core/misc/configurable_singleton_def.h b/yt/yt/core/misc/configurable_singleton_def.h
new file mode 100644
index 0000000000..684d50e314
--- /dev/null
+++ b/yt/yt/core/misc/configurable_singleton_def.h
@@ -0,0 +1,93 @@
+#pragma once
+
+#include <yt/yt/core/ytree/yson_struct.h>
+
+#include <any>
+#include <typeindex>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace NDetail {
+
+struct TSingletonConfigHelpers;
+class TSingletonManagerImpl;
+
+template <bool Static>
+class TSingletonsConfigBase
+{
+public:
+ template <class TConfig>
+ TIntrusivePtr<TConfig> TryGetSingletonConfig();
+
+ template <class TConfig>
+ TIntrusivePtr<TConfig> GetSingletonConfig();
+
+ template <class TConfig>
+ void SetSingletonConfig(TIntrusivePtr<TConfig> config);
+
+protected:
+ static void RegisterSingletons(
+ auto&& registrar,
+ auto&& registerFieldSelector);
+
+private:
+ friend struct NYT::NDetail::TSingletonConfigHelpers;
+ friend class NYT::NDetail::TSingletonManagerImpl;
+
+ THashMap<std::string, std::any> NameToConfig_;
+ THashMap<std::type_index, std::any*> TypeToConfig_;
+};
+
+} // namespace NDetail
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TSingletonsConfig
+ : public NDetail::TSingletonsConfigBase<true>
+ , public virtual NYTree::TYsonStruct
+{
+public:
+ REGISTER_YSON_STRUCT(TSingletonsConfig);
+
+ static void Register(TRegistrar registrar);
+};
+
+DEFINE_REFCOUNTED_TYPE(TSingletonsConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TSingletonsDynamicConfig
+ : public NDetail::TSingletonsConfigBase<false>
+ , public virtual NYTree::TYsonStruct
+{
+public:
+ REGISTER_YSON_STRUCT(TSingletonsDynamicConfig);
+
+ static void Register(TRegistrar registrar);
+};
+
+DEFINE_REFCOUNTED_TYPE(TSingletonsDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define YT_DEFINE_CONFIGURABLE_SINGLETON(singletonName, configType)
+#define YT_DEFINE_RECONFIGURABLE_SINGLETON(singletonName, configType, dynamicConfigType)
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TSingletonManager
+{
+public:
+ static void Configure(const TSingletonsConfigPtr& config);
+ static void Reconfigure(const TSingletonsDynamicConfigPtr& dynamicConfig);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
+
+#define CONFIGURABLE_SINGLETON_DEF_INL_H_
+#include "configurable_singleton_def-inl.h"
+#undef CONFIGURABLE_SINGLETON_DEF_INL_H_
diff --git a/yt/yt/core/misc/public.h b/yt/yt/core/misc/public.h
index 9cff9ba2cd..2ce8dd5a2d 100644
--- a/yt/yt/core/misc/public.h
+++ b/yt/yt/core/misc/public.h
@@ -3,8 +3,6 @@
#include "common.h"
#include "error_code.h"
-#include <library/cpp/yt/misc/concepts.h>
-
// Google Protobuf forward declarations.
namespace google::protobuf {
@@ -102,6 +100,9 @@ DECLARE_REFCOUNTED_CLASS(TAsyncExpiringCacheConfig)
DECLARE_REFCOUNTED_CLASS(TLogDigestConfig)
DECLARE_REFCOUNTED_CLASS(THistogramDigestConfig)
+DECLARE_REFCOUNTED_CLASS(TSingletonsConfig)
+DECLARE_REFCOUNTED_CLASS(TSingletonsDynamicConfig)
+
class TSignalRegistry;
class TBloomFilterBuilder;
diff --git a/yt/yt/core/misc/unittests/configurable_singleton_ut.cpp b/yt/yt/core/misc/unittests/configurable_singleton_ut.cpp
new file mode 100644
index 0000000000..64fdbfd6f5
--- /dev/null
+++ b/yt/yt/core/misc/unittests/configurable_singleton_ut.cpp
@@ -0,0 +1,234 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT {
+namespace {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+DECLARE_REFCOUNTED_STRUCT(TRequiredSingletonConfig);
+DECLARE_REFCOUNTED_STRUCT(TOptionalSingletonConfig);
+DECLARE_REFCOUNTED_STRUCT(TDefaultNewSingletonConfig);
+DECLARE_REFCOUNTED_STRUCT(TReconfigurableSingletonConfig);
+DECLARE_REFCOUNTED_STRUCT(TReconfigurableSingletonDynamicConfig);
+
+YT_DECLARE_CONFIGURABLE_SINGLETON(TRequiredSingletonConfig);
+YT_DECLARE_CONFIGURABLE_SINGLETON(TOptionalSingletonConfig);
+YT_DECLARE_CONFIGURABLE_SINGLETON(TDefaultNewSingletonConfig);
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TReconfigurableSingletonConfig, TReconfigurableSingletonDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TRequiredSingletonConfig
+ : public TYsonStruct
+{
+ int Speed;
+
+ REGISTER_YSON_STRUCT(TRequiredSingletonConfig);
+
+ static void Register(TRegistrar registarar)
+ {
+ registarar.Parameter("speed", &TThis::Speed);
+ }
+};
+
+DEFINE_REFCOUNTED_TYPE(TRequiredSingletonConfig)
+
+int ConfiguredSpeed = -1;
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TRequiredSingletonConfigPtr>& /*parameter*/)
+{ }
+
+void ConfigureSingleton(const TRequiredSingletonConfigPtr& config)
+{
+ ConfiguredSpeed = config->Speed;
+}
+
+YT_DEFINE_CONFIGURABLE_SINGLETON("required", TRequiredSingletonConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TOptionalSingletonConfig
+ : public TYsonStruct
+{
+ int Depth;
+
+ REGISTER_YSON_STRUCT(TOptionalSingletonConfig);
+
+ static void Register(TRegistrar registarar)
+ {
+ registarar.Parameter("depth", &TThis::Depth);
+ }
+};
+
+DEFINE_REFCOUNTED_TYPE(TOptionalSingletonConfig)
+
+int ConfiguredDepth = -1;
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TOptionalSingletonConfigPtr>& parameter)
+{
+ parameter.Optional();
+}
+
+void ConfigureSingleton(const TOptionalSingletonConfigPtr& config)
+{
+ if (config) {
+ ConfiguredDepth = config->Depth;
+ }
+}
+
+YT_DEFINE_CONFIGURABLE_SINGLETON("optional", TOptionalSingletonConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TDefaultNewSingletonConfig
+ : public TYsonStruct
+{
+ int Width;
+
+ REGISTER_YSON_STRUCT(TDefaultNewSingletonConfig);
+
+ static void Register(TRegistrar registarar)
+ {
+ registarar.Parameter("width", &TThis::Width)
+ .Default(456);
+ }
+};
+
+DEFINE_REFCOUNTED_TYPE(TDefaultNewSingletonConfig)
+
+int ConfiguredWidth = -1;
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TDefaultNewSingletonConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TDefaultNewSingletonConfigPtr& config)
+{
+ ConfiguredWidth = config->Width;
+}
+
+YT_DEFINE_CONFIGURABLE_SINGLETON("default_new", TDefaultNewSingletonConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TReconfigurableSingletonConfig
+ : public TYsonStruct
+{
+ int Cost;
+
+ REGISTER_YSON_STRUCT(TReconfigurableSingletonConfig);
+
+ static void Register(TRegistrar registarar)
+ {
+ registarar.Parameter("cost", &TThis::Cost)
+ .Default(777);
+ }
+};
+
+DEFINE_REFCOUNTED_TYPE(TReconfigurableSingletonConfig)
+
+struct TReconfigurableSingletonDynamicConfig
+ : public TYsonStruct
+{
+ std::optional<int> Cost;
+
+ REGISTER_YSON_STRUCT(TReconfigurableSingletonDynamicConfig);
+
+ static void Register(TRegistrar registarar)
+ {
+ registarar.Parameter("cost", &TThis::Cost)
+ .Default();
+ }
+};
+
+DEFINE_REFCOUNTED_TYPE(TReconfigurableSingletonDynamicConfig)
+
+int ConfiguredCost = -1;
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TReconfigurableSingletonConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TReconfigurableSingletonDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TReconfigurableSingletonConfigPtr& config)
+{
+ ConfiguredCost = config->Cost;
+}
+
+void ReconfigureSingleton(
+ const TReconfigurableSingletonConfigPtr& config,
+ const TReconfigurableSingletonDynamicConfigPtr& dynamicConfig)
+{
+ ConfiguredCost = dynamicConfig->Cost.value_or(config->Cost);
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "reconfigurable",
+ TReconfigurableSingletonConfig,
+ TReconfigurableSingletonDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TConfigurableSingletonTest, Run)
+{
+ auto config = ConvertTo<TSingletonsConfigPtr>(NYson::TYsonString(TString(R"""({
+ required = {
+ speed = 123;
+ };
+ })""")));
+ auto dynamicConfig1 = ConvertTo<TSingletonsDynamicConfigPtr>(NYson::TYsonString(TString(R"""({
+ reconfigurable = {
+ cost = 888;
+ };
+ })""")));
+ auto dynamicConfig2 = ConvertTo<TSingletonsDynamicConfigPtr>(NYson::TYsonString(TString(R"""({
+ reconfigurable = {
+ cost = 999;
+ };
+ })""")));
+
+ EXPECT_THROW_WITH_SUBSTRING(TSingletonManager::Reconfigure(dynamicConfig1), "Singletons are not configured yet");
+
+ EXPECT_EQ(ConfiguredSpeed, -1);
+ EXPECT_EQ(ConfiguredDepth, -1);
+ EXPECT_EQ(ConfiguredWidth, -1);
+ EXPECT_EQ(ConfiguredCost, -1);
+
+ TSingletonManager::Configure(config);
+
+ EXPECT_EQ(ConfiguredSpeed, 123);
+ EXPECT_EQ(ConfiguredDepth, -1);
+ EXPECT_EQ(ConfiguredWidth, 456);
+ EXPECT_EQ(ConfiguredCost, 777);
+
+ EXPECT_THROW_WITH_SUBSTRING(TSingletonManager::Configure(config), "Singletons have already been configured");
+
+ TSingletonManager::Reconfigure(dynamicConfig1);
+
+ EXPECT_EQ(ConfiguredSpeed, 123);
+ EXPECT_EQ(ConfiguredDepth, -1);
+ EXPECT_EQ(ConfiguredWidth, 456);
+ EXPECT_EQ(ConfiguredCost, 888);
+
+ TSingletonManager::Reconfigure(dynamicConfig2);
+
+ EXPECT_EQ(ConfiguredSpeed, 123);
+ EXPECT_EQ(ConfiguredDepth, -1);
+ EXPECT_EQ(ConfiguredWidth, 456);
+ EXPECT_EQ(ConfiguredCost, 999);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT
diff --git a/yt/yt/core/misc/unittests/ya.make b/yt/yt/core/misc/unittests/ya.make
index a422838270..79d62c52c2 100644
--- a/yt/yt/core/misc/unittests/ya.make
+++ b/yt/yt/core/misc/unittests/ya.make
@@ -72,6 +72,7 @@ SRCS(
yverify_ut.cpp
zerocopy_output_writer_ut.cpp
hedging_manager_ut.cpp
+ configurable_singleton_ut.cpp
proto/ref_counted_tracker_ut.proto
)
diff --git a/yt/yt/core/net/address.cpp b/yt/yt/core/net/address.cpp
index ba490e7739..d048167af3 100644
--- a/yt/yt/core/net/address.cpp
+++ b/yt/yt/core/net/address.cpp
@@ -15,6 +15,7 @@
#include <yt/yt/core/misc/async_expiring_cache.h>
#include <yt/yt/core/misc/fs.h>
+#include <yt/yt/core/misc/configurable_singleton_def.h>
#include <yt/yt/core/profiling/timing.h>
diff --git a/yt/yt/core/net/configure_address_resolver.cpp b/yt/yt/core/net/configure_address_resolver.cpp
new file mode 100644
index 0000000000..16ae5220fd
--- /dev/null
+++ b/yt/yt/core/net/configure_address_resolver.cpp
@@ -0,0 +1,28 @@
+#include "address.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NNet {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TAddressResolverConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TAddressResolverConfigPtr& config)
+{
+ TAddressResolver::Get()->Configure(config);
+}
+
+YT_DEFINE_CONFIGURABLE_SINGLETON(
+ "address_resolver",
+ TAddressResolverConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NNet
diff --git a/yt/yt/core/net/public.h b/yt/yt/core/net/public.h
index fde7eea47a..ea4891db83 100644
--- a/yt/yt/core/net/public.h
+++ b/yt/yt/core/net/public.h
@@ -1,9 +1,13 @@
#pragma once
#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+#include <yt/yt/core/misc/error_code.h>
#include <library/cpp/yt/memory/intrusive_ptr.h>
+#include <library/cpp/yt/misc/guid.h>
+
namespace NYT::NNet {
////////////////////////////////////////////////////////////////////////////////
@@ -32,6 +36,8 @@ YT_DEFINE_ERROR_ENUM(
((ResolveTimedOut) (1501))
);
+YT_DECLARE_CONFIGURABLE_SINGLETON(TAddressResolverConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NNet
diff --git a/yt/yt/core/rpc/configure_dispatcher.cpp b/yt/yt/core/rpc/configure_dispatcher.cpp
new file mode 100644
index 0000000000..ec95cd855d
--- /dev/null
+++ b/yt/yt/core/rpc/configure_dispatcher.cpp
@@ -0,0 +1,41 @@
+#include "dispatcher.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NRpc {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TDispatcherConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TDispatcherDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TDispatcherConfigPtr& config)
+{
+ TDispatcher::Get()->Configure(config);
+}
+
+void ReconfigureSingleton(
+ const TDispatcherConfigPtr& config,
+ const TDispatcherDynamicConfigPtr& dynamicConfig)
+{
+ TDispatcher::Get()->Configure(config->ApplyDynamic(dynamicConfig));
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "rpc_dispatcher",
+ TDispatcherConfig,
+ TDispatcherDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NRpc
diff --git a/yt/yt/core/rpc/dispatcher.cpp b/yt/yt/core/rpc/dispatcher.cpp
index 64edfdc3ae..0ede4496f9 100644
--- a/yt/yt/core/rpc/dispatcher.cpp
+++ b/yt/yt/core/rpc/dispatcher.cpp
@@ -161,7 +161,6 @@ void TDispatcher::SetServiceDiscovery(IServiceDiscoveryPtr serviceDiscovery)
Impl_->SetServiceDiscovery(std::move(serviceDiscovery));
}
-
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NRpc
diff --git a/yt/yt/core/rpc/grpc/configure_dispatcher.cpp b/yt/yt/core/rpc/grpc/configure_dispatcher.cpp
new file mode 100644
index 0000000000..e12e1f1739
--- /dev/null
+++ b/yt/yt/core/rpc/grpc/configure_dispatcher.cpp
@@ -0,0 +1,28 @@
+#include "dispatcher.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NRpc::NGrpc {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TDispatcherConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TDispatcherConfigPtr& config)
+{
+ TDispatcher::Get()->Configure(config);
+}
+
+YT_DEFINE_CONFIGURABLE_SINGLETON(
+ "grpc_dispatcher",
+ TDispatcherConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NRpc::NGrpc
diff --git a/yt/yt/core/rpc/grpc/public.h b/yt/yt/core/rpc/grpc/public.h
index 7cb846bf33..737faf3f4c 100644
--- a/yt/yt/core/rpc/grpc/public.h
+++ b/yt/yt/core/rpc/grpc/public.h
@@ -1,5 +1,7 @@
#pragma once
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
#include <yt/yt/core/logging/log.h>
namespace NYT::NRpc::NGrpc {
@@ -44,6 +46,8 @@ const THashSet<TStringBuf>& GetNativeMetadataKeys();
constexpr int GenericErrorStatusCode = 100;
+YT_DECLARE_CONFIGURABLE_SINGLETON(TDispatcherConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NRpc::NGrpc
diff --git a/yt/yt/core/rpc/grpc/ya.make b/yt/yt/core/rpc/grpc/ya.make
index 4622b67b93..5fc1d908f7 100644
--- a/yt/yt/core/rpc/grpc/ya.make
+++ b/yt/yt/core/rpc/grpc/ya.make
@@ -6,6 +6,7 @@ PROTO_NAMESPACE(yt)
SRCS(
config.cpp
+ GLOBAL configure_dispatcher.cpp
public.cpp
dispatcher.cpp
server.cpp
diff --git a/yt/yt/core/rpc/http/server.cpp b/yt/yt/core/rpc/http/server.cpp
index e0caa56bb7..783b82cd51 100644
--- a/yt/yt/core/rpc/http/server.cpp
+++ b/yt/yt/core/rpc/http/server.cpp
@@ -371,6 +371,11 @@ private:
rpcHeader->set_request_codec(ToProto(NCompression::ECodec::None));
rpcHeader->set_response_codec(ToProto(NCompression::ECodec::None));
+ ToProto(
+ rpcHeader->MutableExtension(NRpc::NProto::TRequestHeader::tracing_ext),
+ NTracing::TryGetCurrentTraceContext(),
+ /*sendBaggage*/ false);
+
return {};
}
};
diff --git a/yt/yt/core/rpc/public.h b/yt/yt/core/rpc/public.h
index 42933a8774..ea0a147594 100644
--- a/yt/yt/core/rpc/public.h
+++ b/yt/yt/core/rpc/public.h
@@ -1,5 +1,7 @@
#pragma once
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
#include <yt/yt/core/actions/callback.h>
#include <yt/yt/core/concurrency/public.h>
@@ -197,6 +199,8 @@ DEFINE_ENUM(EMessageFormat,
((Yson) (2))
);
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TDispatcherConfig, TDispatcherDynamicConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NRpc
diff --git a/yt/yt/core/service_discovery/yp/configure_service_discovery.cpp b/yt/yt/core/service_discovery/yp/configure_service_discovery.cpp
new file mode 100644
index 0000000000..3321226a4e
--- /dev/null
+++ b/yt/yt/core/service_discovery/yp/configure_service_discovery.cpp
@@ -0,0 +1,30 @@
+#include "service_discovery.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+#include <yt/yt/core/rpc/dispatcher.h>
+
+namespace NYT::NServiceDiscovery::NYP {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TServiceDiscoveryConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TServiceDiscoveryConfigPtr& config)
+{
+ NRpc::TDispatcher::Get()->SetServiceDiscovery(CreateServiceDiscovery(config));
+}
+
+YT_DEFINE_CONFIGURABLE_SINGLETON(
+ "yp_service_discovery",
+ TServiceDiscoveryConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NServiceDiscovery::NYP
diff --git a/yt/yt/core/service_discovery/yp/public.h b/yt/yt/core/service_discovery/yp/public.h
index 53d4de18d8..c90b9dc5a7 100644
--- a/yt/yt/core/service_discovery/yp/public.h
+++ b/yt/yt/core/service_discovery/yp/public.h
@@ -1,6 +1,7 @@
#pragma once
#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
namespace NYT::NServiceDiscovery::NYP {
@@ -8,6 +9,8 @@ namespace NYT::NServiceDiscovery::NYP {
DECLARE_REFCOUNTED_CLASS(TServiceDiscoveryConfig)
+YT_DECLARE_CONFIGURABLE_SINGLETON(TServiceDiscoveryConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NServiceDiscovery::NYP
diff --git a/yt/yt/core/service_discovery/yp/ya.make b/yt/yt/core/service_discovery/yp/ya.make
index cc37fa9639..e0efcc5a88 100644
--- a/yt/yt/core/service_discovery/yp/ya.make
+++ b/yt/yt/core/service_discovery/yp/ya.make
@@ -9,6 +9,7 @@ PEERDIR(
SRCS(
config.cpp
+ GLOBAL configure_service_discovery.cpp
)
IF (NOT OPENSOURCE)
diff --git a/yt/yt/core/ya.make b/yt/yt/core/ya.make
index 2368a67992..9794fce0a2 100644
--- a/yt/yt/core/ya.make
+++ b/yt/yt/core/ya.make
@@ -27,6 +27,7 @@ SRCS(
bus/tcp/dispatcher.cpp
bus/tcp/dispatcher_impl.cpp
bus/tcp/config.cpp
+ GLOBAL bus/tcp/configure_dispatcher.cpp
bus/tcp/packet.cpp
bus/tcp/client.cpp
bus/tcp/server.cpp
@@ -53,6 +54,7 @@ SRCS(
concurrency/async_stream_pipe.cpp
concurrency/async_stream.cpp
concurrency/config.cpp
+ GLOBAL concurrency/configure_fiber_manager.cpp
concurrency/coroutine.cpp
concurrency/delayed_executor.cpp
concurrency/execution_stack.cpp
@@ -97,6 +99,7 @@ SRCS(
logging/compression.cpp
logging/config.cpp
+ GLOBAL logging/configure_log_manager.cpp
logging/formatter.cpp
logging/fluent_log.cpp
GLOBAL logging/log.cpp
@@ -164,10 +167,12 @@ SRCS(
misc/cache_config.cpp
misc/utf8_decoder.cpp
misc/zerocopy_output_writer.cpp
+ misc/configurable_singleton_def.cpp
net/address.cpp
net/connection.cpp
net/config.cpp
+ GLOBAL net/configure_address_resolver.cpp
net/dialer.cpp
net/helpers.cpp
net/listener.cpp
@@ -195,6 +200,7 @@ SRCS(
rpc/channel_detail.cpp
rpc/client.cpp
rpc/config.cpp
+ GLOBAL rpc/configure_dispatcher.cpp
rpc/dispatcher.cpp
rpc/dynamic_channel_pool.cpp
rpc/hedging_channel.cpp
@@ -244,6 +250,7 @@ SRCS(
yson/async_writer.cpp
yson/attribute_consumer.cpp
yson/config.cpp
+ GLOBAL yson/configure_protobuf_interop.cpp
yson/consumer.cpp
yson/forwarding_consumer.cpp
yson/lexer.cpp
diff --git a/yt/yt/core/yson/configure_protobuf_interop.cpp b/yt/yt/core/yson/configure_protobuf_interop.cpp
new file mode 100644
index 0000000000..ca621c0664
--- /dev/null
+++ b/yt/yt/core/yson/configure_protobuf_interop.cpp
@@ -0,0 +1,41 @@
+#include "protobuf_interop.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NYson {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TProtobufInteropConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TProtobufInteropDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TProtobufInteropConfigPtr& config)
+{
+ SetProtobufInteropConfig(config);
+}
+
+void ReconfigureSingleton(
+ const TProtobufInteropConfigPtr& config,
+ const TProtobufInteropDynamicConfigPtr& dynamicConfig)
+{
+ ConfigureSingleton(config->ApplyDynamic(dynamicConfig));
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "protobuf_interop",
+ TProtobufInteropConfig,
+ TProtobufInteropDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NYson
diff --git a/yt/yt/core/yson/public.h b/yt/yt/core/yson/public.h
index d0932dea56..dae0c0b298 100644
--- a/yt/yt/core/yson/public.h
+++ b/yt/yt/core/yson/public.h
@@ -1,6 +1,7 @@
#pragma once
#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
#include <library/cpp/yt/yson/public.h>
#include <library/cpp/yt/yson_string/public.h>
@@ -98,6 +99,8 @@ class TProtobufMessageType;
//! An opaque reflected counterpart of ::google::protobuf::EnumDescriptor.
class TProtobufEnumType;
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TProtobufInteropConfig, TProtobufInteropDynamicConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NYson
diff --git a/yt/yt/core/yson/string.h b/yt/yt/core/yson/string.h
index 45938e3f7d..bb0992d9c7 100644
--- a/yt/yt/core/yson/string.h
+++ b/yt/yt/core/yson/string.h
@@ -2,6 +2,8 @@
#include "public.h"
+#include <yt/yt/core/misc/serialize.h>
+
#include <library/cpp/yt/yson_string/string.h>
namespace NYT::NYson {
diff --git a/yt/yt/core/yson/token.h b/yt/yt/core/yson/token.h
index 66c3e91075..c1de561903 100644
--- a/yt/yt/core/yson/token.h
+++ b/yt/yt/core/yson/token.h
@@ -4,6 +4,8 @@
#include <yt/yt/core/misc/property.h>
+#include <library/cpp/yt/string/string_builder.h>
+
namespace NYT::NYson {
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/core/yson/writer.cpp b/yt/yt/core/yson/writer.cpp
index d31abf0b46..32e3f1636c 100644
--- a/yt/yt/core/yson/writer.cpp
+++ b/yt/yt/core/yson/writer.cpp
@@ -132,30 +132,6 @@ void WriteUtf8String(const char* str, size_t len, IOutputStream& output)
}
}
-size_t FloatToStringWithNanInf(double value, char* buf, size_t size)
-{
- if (std::isfinite(value)) {
- return FloatToString(value, buf, size);
- }
-
- static const TStringBuf nanLiteral = "%nan";
- static const TStringBuf infLiteral = "%inf";
- static const TStringBuf negativeInfLiteral = "%-inf";
-
- TStringBuf str;
- if (std::isnan(value)) {
- str = nanLiteral;
- } else if (std::isinf(value) && value > 0) {
- str = infLiteral;
- } else {
- str = negativeInfLiteral;
- }
- YT_VERIFY(str.size() + 1 <= size);
- ::memcpy(buf, str.data(), str.size() + 1);
- return str.size();
-}
-
-
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -277,7 +253,7 @@ void TYsonWriter::OnDoubleScalar(double value)
Stream_->Write(&value, sizeof(double));
} else {
char buf[256];
- auto str = TStringBuf(buf, FloatToStringWithNanInf(value, buf, sizeof(buf)));
+ auto str = TStringBuf(buf, NDetail::FloatToStringWithNanInf(value, buf, sizeof(buf)));
Stream_->Write(str);
if (str.find('.') == TString::npos && str.find('e') == TString::npos && std::isfinite(value)) {
Stream_->Write(".");
diff --git a/yt/yt/core/ytree/unittests/text_yson_convert_ut.cpp b/yt/yt/core/ytree/unittests/text_yson_convert_ut.cpp
new file mode 100644
index 0000000000..75913bed0b
--- /dev/null
+++ b/yt/yt/core/ytree/unittests/text_yson_convert_ut.cpp
@@ -0,0 +1,273 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/ytree/convert.h>
+
+#include <library/cpp/yt/misc/source_location.h>
+
+#include <library/cpp/yt/yson_string/convert.h>
+
+namespace NYT::NYTree {
+namespace {
+
+using namespace NYson;
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <class T>
+void CheckEqualConversionToTextYson(const T& value, const TSourceLocation& loc = YT_CURRENT_SOURCE_LOCATION)
+{
+ EXPECT_EQ(ConvertToTextYsonString(value).AsStringBuf(), ConvertToYsonString(value, EYsonFormat::Text).AsStringBuf())
+ << NYT::Format("At %v", loc);
+}
+
+template <class T, class U>
+void CheckEqualConversionToFromTextYson(const U& value, const TSourceLocation& loc = YT_CURRENT_SOURCE_LOCATION)
+{
+ auto yson = ConvertToTextYsonString(value);
+ EXPECT_EQ(ConvertFromTextYsonString<T>(yson), ConvertTo<T>(yson))
+ << NYT::Format("At %v", loc);
+}
+
+template <class T>
+void CheckEqualConversionFromTextYson(TStringBuf value, const TSourceLocation& loc = YT_CURRENT_SOURCE_LOCATION)
+{
+ NYson::TYsonString yson(value);
+ EXPECT_EQ(ConvertTo<T>(yson), ConvertTo<T>(yson))
+ << NYT::Format("At %v", loc);
+}
+
+TEST(TTextYsonConvertTest, ConvertToTextIntegrals)
+{
+ CheckEqualConversionToTextYson<i8>(+14);
+ CheckEqualConversionToTextYson<i8>(0);
+ CheckEqualConversionToTextYson<i8>(-15);
+ CheckEqualConversionToTextYson<i32>(+100);
+ CheckEqualConversionToTextYson<i32>(0);
+ CheckEqualConversionToTextYson<i32>(-123);
+ CheckEqualConversionToTextYson<i64>(+100);
+ CheckEqualConversionToTextYson<i64>(0);
+ CheckEqualConversionToTextYson<i64>(-123);
+
+ CheckEqualConversionToTextYson<ui8>(+100);
+ CheckEqualConversionToTextYson<ui8>(0);
+ CheckEqualConversionToTextYson<ui32>(+100);
+ CheckEqualConversionToTextYson<ui32>(0);
+ CheckEqualConversionToTextYson<ui64>(+100);
+ CheckEqualConversionToTextYson<ui64>(0);
+}
+
+TEST(TTextYsonConvertTest, ConvertToTextIntegralsLimits)
+{
+ CheckEqualConversionToTextYson<i64>(std::numeric_limits<i64>::max());
+ CheckEqualConversionToTextYson<i64>(std::numeric_limits<i64>::min());
+
+ CheckEqualConversionToTextYson<ui64>(std::numeric_limits<ui64>::max());
+ CheckEqualConversionToTextYson<ui64>(std::numeric_limits<ui64>::min());
+}
+
+TEST(TTextYsonConvertTest, ConvertToTextFloats)
+{
+ CheckEqualConversionToTextYson<float>(0.0);
+ CheckEqualConversionToTextYson<float>(-0.0);
+ CheckEqualConversionToTextYson<float>(-7.7777);
+ CheckEqualConversionToTextYson<float>(+9.243);
+
+ CheckEqualConversionToTextYson<double>(0.0);
+ CheckEqualConversionToTextYson<double>(-0.0);
+ CheckEqualConversionToTextYson<double>(-7.7777);
+ CheckEqualConversionToTextYson<double>(+9.243);
+}
+
+TEST(TTextYsonConvertTest, ConvertToTextFloatsSpecialValues)
+{
+ CheckEqualConversionToTextYson<double>(std::numeric_limits<double>::min());
+ CheckEqualConversionToTextYson<double>(std::numeric_limits<double>::max());
+ CheckEqualConversionToTextYson<double>(std::numeric_limits<double>::infinity());
+ CheckEqualConversionToTextYson<double>(-std::numeric_limits<double>::infinity());
+ CheckEqualConversionToTextYson<double>(std::numeric_limits<double>::quiet_NaN());
+}
+
+TEST(TTextYsonConvertTest, ConvertToTextOtherPrimitiveTypes)
+{
+ CheckEqualConversionToTextYson<bool>(true);
+ CheckEqualConversionToTextYson<bool>(false);
+
+ CheckEqualConversionToTextYson<TInstant>(TInstant::Now());
+ CheckEqualConversionToTextYson<TInstant>(TInstant::Zero());
+ CheckEqualConversionToTextYson<TInstant>(TInstant::FromValue(42));
+
+ CheckEqualConversionToTextYson<TDuration>(TDuration::Zero());
+ CheckEqualConversionToTextYson<TDuration>(TDuration::Seconds(2));
+ CheckEqualConversionToTextYson<TDuration>(TDuration::MilliSeconds(123));
+ CheckEqualConversionToTextYson<TDuration>(TDuration::MicroSeconds(12));
+
+ CheckEqualConversionToTextYson<std::string>("Hello, world!");
+ CheckEqualConversionToTextYson<std::string>("This is a so-called \"quotation marks\" test");
+ CheckEqualConversionToTextYson<std::string>("This tests \r other \b hidden symbols \n");
+ CheckEqualConversionToTextYson<std::string>("And this one tests special numbers numbers \x012");
+
+ CheckEqualConversionToTextYson<TGuid>(TGuid::Create());
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextIntegrals)
+{
+ CheckEqualConversionToFromTextYson<i8>(+15);
+ CheckEqualConversionToFromTextYson<i8>(0);
+ CheckEqualConversionToFromTextYson<i8>(-15);
+ CheckEqualConversionToFromTextYson<i32>(+100);
+ CheckEqualConversionToFromTextYson<i32>(0);
+ CheckEqualConversionToFromTextYson<i32>(-123);
+ CheckEqualConversionToFromTextYson<i64>(+100);
+ CheckEqualConversionToFromTextYson<i64>(0);
+ CheckEqualConversionToFromTextYson<i64>(-123);
+
+ CheckEqualConversionToFromTextYson<ui8>(+100);
+ CheckEqualConversionToFromTextYson<ui8>(0);
+ CheckEqualConversionToFromTextYson<ui32>(+100);
+ CheckEqualConversionToFromTextYson<ui32>(0);
+ CheckEqualConversionToFromTextYson<ui64>(+100);
+ CheckEqualConversionToFromTextYson<ui64>(0);
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextIntegralsLimits)
+{
+ CheckEqualConversionToFromTextYson<i64>(std::numeric_limits<i64>::max());
+ CheckEqualConversionToFromTextYson<i64>(std::numeric_limits<i64>::min());
+
+ CheckEqualConversionToFromTextYson<ui64>(std::numeric_limits<ui64>::max());
+ CheckEqualConversionToFromTextYson<ui64>(std::numeric_limits<ui64>::min());
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextFloats)
+{
+ CheckEqualConversionToFromTextYson<double>(0.0);
+ CheckEqualConversionToFromTextYson<double>(-0.0);
+ CheckEqualConversionToFromTextYson<double>(-7.7777);
+ CheckEqualConversionToFromTextYson<double>(+9.243);
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextFloatsSpecialValues)
+{
+ CheckEqualConversionToFromTextYson<double>(std::numeric_limits<double>::min());
+ CheckEqualConversionToFromTextYson<double>(std::numeric_limits<double>::max());
+ CheckEqualConversionToFromTextYson<double>(std::numeric_limits<double>::infinity());
+ CheckEqualConversionToFromTextYson<double>(-std::numeric_limits<double>::infinity());
+
+ // nans do not compare.
+ // CheckEqualConversionFromTextYson<double>(std::numeric_limits<double>::quiet_NaN());
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextOtherPrimitiveTypes)
+{
+ CheckEqualConversionToTextYson<bool>(true);
+ CheckEqualConversionToTextYson<bool>(false);
+ CheckEqualConversionToTextYson<bool>("true");
+ CheckEqualConversionToTextYson<bool>("false");
+ CheckEqualConversionToTextYson<bool>("0");
+ CheckEqualConversionToTextYson<bool>("1");
+
+ CheckEqualConversionToTextYson<TInstant>(TInstant::Now());
+ CheckEqualConversionToTextYson<TInstant>(TInstant::Zero());
+ CheckEqualConversionToTextYson<TInstant>(TInstant::FromValue(42));
+
+ CheckEqualConversionToTextYson<TDuration>(TDuration::Zero());
+ CheckEqualConversionToTextYson<TDuration>(TDuration::Seconds(2));
+ CheckEqualConversionToTextYson<TDuration>(TDuration::MilliSeconds(123));
+ CheckEqualConversionToTextYson<TDuration>(TDuration::MicroSeconds(12));
+
+ CheckEqualConversionToTextYson<std::string>("Hello, world!");
+ CheckEqualConversionToTextYson<std::string>("This is a so-called \"quotation marks\" test");
+ CheckEqualConversionToTextYson<std::string>("This tests \r other \b hidden symbols \n");
+ CheckEqualConversionToTextYson<std::string>("And this one tests special numbers numbers \x012");
+
+ CheckEqualConversionToTextYson<TGuid>(TGuid::Create());
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextIntegralsTypeMissmatch)
+{
+ CheckEqualConversionToFromTextYson<i8>(static_cast<ui64>(+100));
+ CheckEqualConversionToFromTextYson<i8>(static_cast<ui64>(0));
+ CheckEqualConversionToFromTextYson<i32>(static_cast<ui64>(+100));
+ CheckEqualConversionToFromTextYson<i32>(static_cast<ui64>(0));
+ CheckEqualConversionToFromTextYson<i64>(static_cast<ui64>(+100));
+ CheckEqualConversionToFromTextYson<i64>(static_cast<ui64>(0));
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextTypeMissmatch)
+{
+ CheckEqualConversionFromTextYson<bool>("%true");
+ CheckEqualConversionFromTextYson<bool>("%false");
+ CheckEqualConversionFromTextYson<bool>("1");
+ CheckEqualConversionFromTextYson<bool>("0");
+ CheckEqualConversionFromTextYson<bool>("-0");
+ CheckEqualConversionFromTextYson<bool>("1u");
+ CheckEqualConversionFromTextYson<bool>("0u");
+
+ CheckEqualConversionFromTextYson<bool>(ConvertToTextYsonString("true").AsStringBuf());
+ CheckEqualConversionFromTextYson<bool>(ConvertToTextYsonString("false").AsStringBuf());
+ CheckEqualConversionFromTextYson<bool>(ConvertToTextYsonString("1").AsStringBuf());
+ CheckEqualConversionFromTextYson<bool>(ConvertToTextYsonString("0").AsStringBuf());
+}
+
+TEST(TTextYsonConvertTest, ConvertFromTextYsonStringThrowBasicCases)
+{
+ auto fromPayload = [] (const auto& value) {
+ return NYson::TYsonString(TString(value));
+ };
+
+ // Overflow.
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<i8>(fromPayload("123123123213")));
+ EXPECT_ANY_THROW(ConvertTo<i8>(fromPayload("123123123213")));
+
+ // Negative.
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<ui64>(fromPayload("-123")));
+ EXPECT_ANY_THROW(ConvertTo<ui64>(fromPayload("-123")));
+
+ // Non-numeric.
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<i64>(fromPayload("haha")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<i64>(fromPayload("123qq")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<i64>(fromPayload("-123u")));
+ EXPECT_ANY_THROW(ConvertTo<i64>(fromPayload("haha")));
+ EXPECT_ANY_THROW(ConvertTo<i64>(fromPayload("123qq")));
+ EXPECT_ANY_THROW(ConvertTo<i64>(fromPayload("-123u")));
+
+ // Big positive to bool
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<bool>(fromPayload("42")));
+ EXPECT_ANY_THROW(ConvertTo<bool>(fromPayload("42")));
+
+ // Garbage to bool
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<bool>(fromPayload("%falsse")));
+ EXPECT_ANY_THROW(ConvertTo<bool>(fromPayload("%falsse")));
+
+ // Wrong string to bool
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<bool>(fromPayload("\"True\"")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<bool>(fromPayload("\"False\"")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<bool>(fromPayload("\"1u\"")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<bool>(fromPayload("\"0u\"")));
+ EXPECT_ANY_THROW(ConvertTo<bool>(fromPayload("\"True\"")));
+ EXPECT_ANY_THROW(ConvertTo<bool>(fromPayload("\"False\"")));
+ EXPECT_ANY_THROW(ConvertTo<bool>(fromPayload("\"1u\"")));
+ EXPECT_ANY_THROW(ConvertTo<bool>(fromPayload("\"0u\"")));
+
+ // Wrong string to string
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<std::string>(fromPayload("")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<std::string>(fromPayload("\"")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<std::string>(fromPayload("haha\"")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<std::string>(fromPayload("\'oops\'")));
+ EXPECT_ANY_THROW(ConvertTo<std::string>(fromPayload("")));
+ EXPECT_ANY_THROW(ConvertTo<std::string>(fromPayload("\"")));
+ EXPECT_ANY_THROW(ConvertTo<std::string>(fromPayload("haha\"")));
+ EXPECT_ANY_THROW(ConvertTo<std::string>(fromPayload("\'oops\'")));
+
+ // Wrong literal to double
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<double>(fromPayload("%%")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<std::string>(fromPayload("%42inf")));
+ EXPECT_ANY_THROW(ConvertFromTextYsonString<std::string>(fromPayload("%NaaN")));
+ EXPECT_ANY_THROW(ConvertTo<double>(fromPayload("%%")));
+ EXPECT_ANY_THROW(ConvertTo<std::string>(fromPayload("%42inf")));
+ EXPECT_ANY_THROW(ConvertTo<std::string>(fromPayload("%NaaN")));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+} // namespace
+} // namespace NYT::NYTree
diff --git a/yt/yt/core/ytree/unittests/ya.make b/yt/yt/core/ytree/unittests/ya.make
index 7196cea98c..1bc54b95aa 100644
--- a/yt/yt/core/ytree/unittests/ya.make
+++ b/yt/yt/core/ytree/unittests/ya.make
@@ -10,6 +10,7 @@ SRCS(
resolver_ut.cpp
serialize_ut.cpp
service_combiner_ut.cpp
+ text_yson_convert_ut.cpp
tree_builder_ut.cpp
lazy_ypath_service_ut.cpp
yson_schema_ut.cpp
diff --git a/yt/yt/core/ytree/ypath_client.h b/yt/yt/core/ytree/ypath_client.h
index 08cb92c5a8..b9b2200baa 100644
--- a/yt/yt/core/ytree/ypath_client.h
+++ b/yt/yt/core/ytree/ypath_client.h
@@ -12,6 +12,8 @@
#include <library/cpp/yt/memory/ref.h>
+#include <library/cpp/yt/logging/logger.h>
+
namespace NYT::NYTree {
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/library/backtrace_introspector/http/handler.cpp b/yt/yt/library/backtrace_introspector/http/handler.cpp
deleted file mode 100644
index fe3cb65564..0000000000
--- a/yt/yt/library/backtrace_introspector/http/handler.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "handler.h"
-
-#include <yt/yt/core/http/server.h>
-
-#include <yt/yt/core/concurrency/action_queue.h>
-
-#include <yt/yt/library/backtrace_introspector/introspect.h>
-
-namespace NYT::NBacktraceIntrospector {
-
-using namespace NHttp;
-using namespace NConcurrency;
-
-////////////////////////////////////////////////////////////////////////////////
-
-class THandlerBase
- : public IHttpHandler
-{
-public:
- void HandleRequest(const IRequestPtr& /*req*/, const IResponseWriterPtr& rsp) override
- {
- try {
- static const auto queue = New<TActionQueue>("BacktraceIntro");
- auto dumpFuture = BIND(&THandlerBase::Dump, MakeStrong(this))
- .AsyncVia(queue->GetInvoker())
- .Run();
-
- auto dump = WaitFor(dumpFuture)
- .ValueOrThrow();
-
- WaitFor(rsp->WriteBody(TSharedRef::FromString(dump)))
- .ThrowOnError();
-
- WaitFor(rsp->Close())
- .ThrowOnError();
- } catch (const std::exception& ex) {
- if (!rsp->AreHeadersFlushed()) {
- rsp->SetStatus(EStatusCode::InternalServerError);
- WaitFor(rsp->WriteBody(TSharedRef::FromString(ex.what())))
- .ThrowOnError();
- }
- throw;
- }
- }
-
-protected:
- virtual TString Dump() = 0;
-};
-
-class TThreadsHandler
- : public THandlerBase
-{
-private:
- TString Dump() override
- {
- return FormatIntrospectionInfos(IntrospectThreads());
- }
-};
-
-class TFibersHandler
- : public THandlerBase
-{
-private:
- TString Dump() override
- {
- return FormatIntrospectionInfos(IntrospectFibers());
- }
-};
-
-void Register(
- const IRequestPathMatcherPtr& handlers,
- const TString& prefix)
-{
- handlers->Add(prefix + "/threads", New<TThreadsHandler>());
- handlers->Add(prefix + "/fibers", New<TFibersHandler>());
-}
-
-void Register(
- const IServerPtr& server,
- const TString& prefix)
-{
- Register(server->GetPathMatcher(), prefix);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/http/handler.h b/yt/yt/library/backtrace_introspector/http/handler.h
deleted file mode 100644
index be795b7e5d..0000000000
--- a/yt/yt/library/backtrace_introspector/http/handler.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-#include <yt/yt/core/http/public.h>
-
-namespace NYT::NBacktraceIntrospector {
-
-////////////////////////////////////////////////////////////////////////////////
-
-//! Registers introspector handlers.
-void Register(
- const NHttp::IRequestPathMatcherPtr& handlers,
- const TString& prefix = {});
-
-void Register(
- const NHttp::IServerPtr& server,
- const TString& prefix = {});
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/http/ya.make b/yt/yt/library/backtrace_introspector/http/ya.make
deleted file mode 100644
index 504d20a2e3..0000000000
--- a/yt/yt/library/backtrace_introspector/http/ya.make
+++ /dev/null
@@ -1,16 +0,0 @@
-LIBRARY()
-
-INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
-
-SRCS(
- handler.cpp
-)
-
-PEERDIR(
- yt/yt/core
- yt/yt/core/http
-
- yt/yt/library/backtrace_introspector
-)
-
-END()
diff --git a/yt/yt/library/backtrace_introspector/introspect.cpp b/yt/yt/library/backtrace_introspector/introspect.cpp
deleted file mode 100644
index cfbd24a246..0000000000
--- a/yt/yt/library/backtrace_introspector/introspect.cpp
+++ /dev/null
@@ -1,224 +0,0 @@
-#include "introspect.h"
-
-#include "private.h"
-
-#include <yt/yt/core/misc/collection_helpers.h>
-#include <yt/yt/core/misc/finally.h>
-#include <yt/yt/core/misc/proc.h>
-
-#include <yt/yt/core/concurrency/fiber.h>
-#include <yt/yt/core/concurrency/scheduler_api.h>
-
-#include <yt/yt/core/tracing/trace_context.h>
-
-#include <library/cpp/yt/memory/safe_memory_reader.h>
-
-#include <library/cpp/yt/backtrace/backtrace.h>
-
-#include <library/cpp/yt/backtrace/cursors/libunwind/libunwind_cursor.h>
-
-#include <library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.h>
-
-#include <library/cpp/yt/backtrace/cursors/interop/interop.h>
-
-#include <util/system/yield.h>
-
-namespace NYT::NBacktraceIntrospector {
-
-using namespace NConcurrency;
-using namespace NThreading;
-using namespace NTracing;
-using namespace NBacktrace;
-
-////////////////////////////////////////////////////////////////////////////////
-
-static constexpr auto& Logger = BacktraceIntrospectorLogger;
-
-////////////////////////////////////////////////////////////////////////////////
-
-std::vector<TFiberIntrospectionInfo> IntrospectFibers()
-{
- YT_LOG_INFO("Fiber introspection started");
-
- YT_LOG_INFO("Collecting waiting fibers backtraces");
-
- std::vector<TFiberIntrospectionInfo> infos;
- THashSet<TFiberId> waitingFiberIds;
- THashMap<TFiberId, EFiberState> fiberStates;
-
- auto introspectionAction = [&] (NYT::NConcurrency::TFiber::TFiberList& fibers) {
- for (auto& fiberRef : fibers) {
- auto* fiber = fiberRef.AsFiber();
-
- auto fiberId = fiber->GetFiberId();
- if (fiberId == InvalidFiberId) {
- continue;
- }
-
- EmplaceOrCrash(fiberStates, fiberId, EFiberState::Introspecting);
-
- EFiberState state;
-
- auto onIntrospectionLockAcquired = [&] {
- YT_LOG_DEBUG("Waiting fiber is successfully locked for introspection (FiberId: %x)",
- fiberId);
-
- const auto& propagatingStorage = *NConcurrency::TryGetPropagatingStorage(*fiber->GetFls());
- const auto* traceContext = TryGetTraceContextFromPropagatingStorage(propagatingStorage);
-
- TFiberIntrospectionInfo info{
- .State = EFiberState::Waiting,
- .FiberId = fiberId,
- .WaitingSince = fiber->GetWaitingSince(),
- .TraceId = traceContext ? traceContext->GetTraceId() : TTraceId(),
- .TraceLoggingTag = traceContext ? traceContext->GetLoggingTag() : TString(),
- };
-
- auto optionalContext = TrySynthesizeLibunwindContextFromMachineContext(*fiber->GetMachineContext());
- if (!optionalContext) {
- YT_LOG_WARNING("Failed to synthesize libunwind context (FiberId: %x)",
- fiberId);
- return;
- }
-
- TLibunwindCursor cursor(*optionalContext);
- while (!cursor.IsFinished()) {
- info.Backtrace.push_back(cursor.GetCurrentIP());
- cursor.MoveNext();
- }
-
- infos.push_back(std::move(info));
- InsertOrCrash(waitingFiberIds, fiberId);
-
- YT_LOG_DEBUG("Fiber introspection completed (FiberId: %x)",
- info.FiberId);
- };
- if (!fiber->TryLockForIntrospection(&state, onIntrospectionLockAcquired)) {
- YT_LOG_DEBUG("Failed to lock fiber for introspection (FiberId: %x, State: %v)",
- fiberId,
- state);
- fiberStates[fiberId] = state;
- }
- }
- };
-
- TFiber::ReadFibers(introspectionAction);
-
- YT_LOG_INFO("Collecting running fibers backtraces");
-
- THashSet<TFiberId> runningFiberIds;
- for (auto& info : IntrospectThreads()) {
- if (info.FiberId == InvalidFiberId) {
- continue;
- }
-
- if (waitingFiberIds.contains(info.FiberId)) {
- continue;
- }
-
- if (!runningFiberIds.insert(info.FiberId).second) {
- continue;
- }
-
- infos.push_back(TFiberIntrospectionInfo{
- .State = EFiberState::Running,
- .FiberId = info.FiberId,
- .ThreadId = info.ThreadId,
- .ThreadName = std::move(info.ThreadName),
- .TraceId = info.TraceId,
- .TraceLoggingTag = std::move(info.TraceLoggingTag),
- .Backtrace = std::move(info.Backtrace),
- });
- }
-
- for (const auto& [fiberId, fiberState] : fiberStates) {
- if (fiberId == InvalidFiberId) {
- continue;
- }
- if (runningFiberIds.contains(fiberId)) {
- continue;
- }
- if (waitingFiberIds.contains(fiberId)) {
- continue;
- }
-
- infos.push_back(TFiberIntrospectionInfo{
- .State = fiberState,
- .FiberId = fiberId,
- });
- }
-
- YT_LOG_INFO("Fiber introspection completed");
-
- return infos;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-namespace {
-
-void FormatBacktrace(TStringBuilder* builder, const std::vector<const void*>& backtrace)
-{
- if (!backtrace.empty()) {
- builder->AppendString("Backtrace:\n");
- SymbolizeBacktrace(
- TRange(backtrace),
- [&] (TStringBuf str) {
- builder->AppendFormat(" %v", str);
- });
- }
-}
-
-} // namespace
-
-TString FormatIntrospectionInfos(const std::vector<TThreadIntrospectionInfo>& infos)
-{
- TStringBuilder builder;
- for (const auto& info : infos) {
- builder.AppendFormat("Thread id: %v\n", info.ThreadId);
- builder.AppendFormat("Thread name: %v\n", info.ThreadName);
- if (info.FiberId != InvalidFiberId) {
- builder.AppendFormat("Fiber id: %x\n", info.FiberId);
- }
- if (info.TraceId) {
- builder.AppendFormat("Trace id: %v\n", info.TraceId);
- }
- if (info.TraceLoggingTag) {
- builder.AppendFormat("Trace logging tag: %v\n", info.TraceLoggingTag);
- }
- FormatBacktrace(&builder, info.Backtrace);
- builder.AppendString("\n");
- }
- return builder.Flush();
-}
-
-TString FormatIntrospectionInfos(const std::vector<TFiberIntrospectionInfo>& infos)
-{
- TStringBuilder builder;
- for (const auto& info : infos) {
- builder.AppendFormat("Fiber id: %x\n", info.FiberId);
- builder.AppendFormat("State: %v\n", info.State);
- if (info.WaitingSince) {
- builder.AppendFormat("Waiting since: %v\n", info.WaitingSince);
- }
- if (info.ThreadId != InvalidThreadId) {
- builder.AppendFormat("Thread id: %v\n", info.ThreadId);
- }
- if (!info.ThreadName.empty()) {
- builder.AppendFormat("Thread name: %v\n", info.ThreadName);
- }
- if (info.TraceId) {
- builder.AppendFormat("Trace id: %v\n", info.TraceId);
- }
- if (info.TraceLoggingTag) {
- builder.AppendFormat("Trace logging tag: %v\n", info.TraceLoggingTag);
- }
- FormatBacktrace(&builder, info.Backtrace);
- builder.AppendString("\n");
- }
- return builder.Flush();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/introspect.h b/yt/yt/library/backtrace_introspector/introspect.h
deleted file mode 100644
index 2be09d2ec8..0000000000
--- a/yt/yt/library/backtrace_introspector/introspect.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#pragma once
-
-#include "public.h"
-
-#include <yt/yt/core/concurrency/public.h>
-
-#include <yt/yt/core/threading/public.h>
-
-#include <yt/yt/core/tracing/public.h>
-
-namespace NYT::NBacktraceIntrospector {
-
-////////////////////////////////////////////////////////////////////////////////
-// Thread introspection API
-
-struct TThreadIntrospectionInfo
-{
- NThreading::TThreadId ThreadId;
- NConcurrency::TFiberId FiberId;
- TString ThreadName;
- NTracing::TTraceId TraceId;
- //! Empty if no trace context is known.
- TString TraceLoggingTag;
- std::vector<const void*> Backtrace;
-};
-
-std::vector<TThreadIntrospectionInfo> IntrospectThreads();
-
-////////////////////////////////////////////////////////////////////////////////
-// Fiber introspection API
-
-struct TFiberIntrospectionInfo
-{
- NConcurrency::EFiberState State;
- NConcurrency::TFiberId FiberId;
- //! Zero if fiber is not waiting.
- TInstant WaitingSince;
- //! |InvalidThreadId| is fiber is not running.
- NThreading::TThreadId ThreadId;
- //! Empty if fiber is not running.
- TString ThreadName;
- NTracing::TTraceId TraceId;
- //! Empty if no trace context is known.
- TString TraceLoggingTag;
- std::vector<const void*> Backtrace;
-};
-
-std::vector<TFiberIntrospectionInfo> IntrospectFibers();
-
-////////////////////////////////////////////////////////////////////////////////
-
-TString FormatIntrospectionInfos(const std::vector<TThreadIntrospectionInfo>& infos);
-TString FormatIntrospectionInfos(const std::vector<TFiberIntrospectionInfo>& infos);
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/introspect_dummy.cpp b/yt/yt/library/backtrace_introspector/introspect_dummy.cpp
deleted file mode 100644
index e29293c7f5..0000000000
--- a/yt/yt/library/backtrace_introspector/introspect_dummy.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "introspect.h"
-
-namespace NYT::NBacktraceIntrospector {
-
-////////////////////////////////////////////////////////////////////////////////
-
-std::vector<TThreadIntrospectionInfo> IntrospectThreads()
-{
- return {};
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/introspect_linux.cpp b/yt/yt/library/backtrace_introspector/introspect_linux.cpp
deleted file mode 100644
index f2fdf1e8c2..0000000000
--- a/yt/yt/library/backtrace_introspector/introspect_linux.cpp
+++ /dev/null
@@ -1,217 +0,0 @@
-#include "introspect.h"
-
-#include "private.h"
-
-#include <yt/yt/core/misc/finally.h>
-#include <yt/yt/core/misc/proc.h>
-
-#include <yt/yt/core/concurrency/fiber.h>
-#include <yt/yt/core/concurrency/scheduler_api.h>
-
-#include <yt/yt/core/tracing/trace_context.h>
-
-#include <library/cpp/yt/memory/safe_memory_reader.h>
-
-#include <library/cpp/yt/backtrace/backtrace.h>
-
-#include <library/cpp/yt/backtrace/cursors/libunwind/libunwind_cursor.h>
-
-#include <library/cpp/yt/backtrace/cursors/frame_pointer/frame_pointer_cursor.h>
-
-#include <library/cpp/yt/backtrace/cursors/interop/interop.h>
-
-#include <library/cpp/yt/misc/thread_name.h>
-
-#include <util/system/yield.h>
-
-#include <sys/syscall.h>
-
-namespace NYT::NBacktraceIntrospector {
-
-using namespace NConcurrency;
-using namespace NTracing;
-using namespace NBacktrace;
-
-////////////////////////////////////////////////////////////////////////////////
-
-static constexpr auto& Logger = BacktraceIntrospectorLogger;
-
-////////////////////////////////////////////////////////////////////////////////
-
-namespace {
-
-struct TStaticString
-{
- TStaticString() = default;
-
- explicit TStaticString(TStringBuf str)
- {
- Length = std::min(std::ssize(str), std::ssize(Buffer));
- std::copy(str.data(), str.data() + Length, Buffer.data());
- }
-
- operator TString() const
- {
- return TString(Buffer.data(), static_cast<size_t>(Length));
- }
-
- std::array<char, 256> Buffer;
- int Length = 0;
-};
-
-struct TStaticBacktrace
-{
- operator std::vector<const void*>() const
- {
- return std::vector<const void*>(Frames.data(), Frames.data() + FrameCount);
- }
-
- std::array<const void*, 100> Frames;
- int FrameCount = 0;
-};
-
-struct TSignalHandlerContext
-{
- TSignalHandlerContext();
- ~TSignalHandlerContext();
-
- std::atomic<bool> Finished = false;
-
- TFiberId FiberId = {};
- TTraceId TraceId = {};
- TStaticString TraceLoggingTag;
- TStaticBacktrace Backtrace;
- TThreadName ThreadName = {};
-
- TSafeMemoryReader* MemoryReader = Singleton<TSafeMemoryReader>();
-
- void SetFinished()
- {
- Finished.store(true);
- }
-
- void WaitUntilFinished()
- {
- while (!Finished.load()) {
- ThreadYield();
- }
- }
-};
-
-static TSignalHandlerContext* SignalHandlerContext;
-
-TSignalHandlerContext::TSignalHandlerContext()
-{
- YT_VERIFY(!SignalHandlerContext);
- SignalHandlerContext = this;
-}
-
-TSignalHandlerContext::~TSignalHandlerContext()
-{
- YT_VERIFY(SignalHandlerContext == this);
- SignalHandlerContext = nullptr;
-}
-
-void SignalHandler(int sig, siginfo_t* /*info*/, void* threadContext)
-{
- YT_VERIFY(sig == SIGUSR1);
-
- SignalHandlerContext->FiberId = GetCurrentFiberId();
- SignalHandlerContext->ThreadName = GetCurrentThreadName();
- if (const auto* traceContext = TryGetCurrentTraceContext()) {
- SignalHandlerContext->TraceId = traceContext->GetTraceId();
- SignalHandlerContext->TraceLoggingTag = TStaticString(traceContext->GetLoggingTag());
- }
-
- auto cursorContext = FramePointerCursorContextFromUcontext(*static_cast<const ucontext_t*>(threadContext));
- TFramePointerCursor cursor(SignalHandlerContext->MemoryReader, cursorContext);
- while (!cursor.IsFinished() && SignalHandlerContext->Backtrace.FrameCount < std::ssize(SignalHandlerContext->Backtrace.Frames)) {
- SignalHandlerContext->Backtrace.Frames[SignalHandlerContext->Backtrace.FrameCount++] = cursor.GetCurrentIP();
- cursor.MoveNext();
- }
-
- SignalHandlerContext->SetFinished();
-}
-
-} // namespace
-
-std::vector<TThreadIntrospectionInfo> IntrospectThreads()
-{
- static std::atomic<bool> IntrospectionLock;
-
- if (IntrospectionLock.exchange(true)) {
- THROW_ERROR_EXCEPTION("Thread introspection is already in progress");
- }
-
- auto introspectionLockGuard = Finally([] {
- YT_VERIFY(IntrospectionLock.exchange(false));
- });
-
- YT_LOG_INFO("Thread introspection started");
-
- {
- struct sigaction action;
- action.sa_flags = SA_SIGINFO | SA_RESTART;
- ::sigemptyset(&action.sa_mask);
- action.sa_sigaction = SignalHandler;
-
- if (::sigaction(SIGUSR1, &action, nullptr) != 0) {
- THROW_ERROR_EXCEPTION("Failed to install signal handler")
- << TError::FromSystem();
- }
- }
-
- std::vector<TThreadIntrospectionInfo> infos;
- for (auto threadId : GetCurrentProcessThreadIds()) {
- if (!IsUserspaceThread(threadId)) {
- YT_LOG_DEBUG("Skipping a non-userspace thread (ThreadId: %v)",
- threadId);
- continue;
- }
-
- TSignalHandlerContext signalHandlerContext;
- if (::syscall(SYS_tkill, threadId, SIGUSR1) != 0) {
- YT_LOG_DEBUG(TError::FromSystem(), "Failed to signal to thread (ThreadId: %v)",
- threadId);
- continue;
- }
-
- YT_LOG_DEBUG("Sent signal to thread (ThreadId: %v)",
- threadId);
-
- signalHandlerContext.WaitUntilFinished();
-
- YT_LOG_DEBUG("Signal handler finished (ThreadId: %v, FiberId: %x)",
- threadId,
- signalHandlerContext.FiberId);
-
- infos.push_back(TThreadIntrospectionInfo{
- .ThreadId = threadId,
- .FiberId = signalHandlerContext.FiberId,
- .ThreadName = TString(signalHandlerContext.ThreadName.Buffer.data(), static_cast<size_t>(signalHandlerContext.ThreadName.Length)),
- .TraceId = signalHandlerContext.TraceId,
- .TraceLoggingTag = signalHandlerContext.TraceLoggingTag,
- .Backtrace = signalHandlerContext.Backtrace,
- });
- }
-
- {
- struct sigaction action;
- action.sa_flags = SA_RESTART;
- ::sigemptyset(&action.sa_mask);
- action.sa_handler = SIG_IGN;
-
- if (::sigaction(SIGUSR1, &action, nullptr) != 0) {
- THROW_ERROR_EXCEPTION("Failed to de-install signal handler")
- << TError::FromSystem();
- }
- }
-
- YT_LOG_INFO("Thread introspection completed");
-
- return infos;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/private.h b/yt/yt/library/backtrace_introspector/private.h
deleted file mode 100644
index 3f99c307a5..0000000000
--- a/yt/yt/library/backtrace_introspector/private.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#pragma once
-
-#include "public.h"
-
-#include <yt/yt/core/logging/log.h>
-
-namespace NYT::NBacktraceIntrospector {
-
-////////////////////////////////////////////////////////////////////////////////
-
-YT_DEFINE_GLOBAL(const NLogging::TLogger, BacktraceIntrospectorLogger, "BacktraceIntrospector");
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
-
diff --git a/yt/yt/library/backtrace_introspector/public.h b/yt/yt/library/backtrace_introspector/public.h
deleted file mode 100644
index 54a8bd06ed..0000000000
--- a/yt/yt/library/backtrace_introspector/public.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-namespace NYT::NBacktraceIntrospector {
-
-////////////////////////////////////////////////////////////////////////////////
-
-struct TThreadIntrospectionInfo;
-struct TFiberIntrospectionInfo;
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/unittests/introspect_ut.cpp b/yt/yt/library/backtrace_introspector/unittests/introspect_ut.cpp
deleted file mode 100644
index a939417958..0000000000
--- a/yt/yt/library/backtrace_introspector/unittests/introspect_ut.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-#include <yt/yt/core/test_framework/framework.h>
-
-#include <yt/yt/library/backtrace_introspector/introspect.h>
-
-#include <yt/yt/core/concurrency/action_queue.h>
-#include <yt/yt/core/concurrency/delayed_executor.h>
-
-#include <yt/yt/core/actions/bind.h>
-#include <yt/yt/core/actions/future.h>
-
-#include <yt/yt/core/tracing/trace_context.h>
-
-#include <yt/yt/core/logging/log.h>
-
-#include <yt/yt/core/misc/collection_helpers.h>
-
-namespace NYT::NBacktraceIntrospector {
-namespace {
-
-using namespace NConcurrency;
-using namespace NTracing;
-
-////////////////////////////////////////////////////////////////////////////////
-
-NLogging::TLogger Logger("Test");
-
-////////////////////////////////////////////////////////////////////////////////
-
-TEST(TBacktraceIntrospectorTest, Fibers)
-{
- constexpr int HeavyQueueCount = 5;
- std::vector<TActionQueuePtr> heavyQueues;
- const TString HeavyThreadNamePrefix("Heavy:");
- for (int index = 0; index < HeavyQueueCount; ++index) {
- heavyQueues.push_back(New<TActionQueue>(HeavyThreadNamePrefix + ToString(index)));
- }
-
- constexpr int LightQueueCount = 3;
- std::vector<TActionQueuePtr> lightQueues;
- const TString LightThreadNamePrefix("Light:");
- for (int index = 0; index < LightQueueCount; ++index) {
- lightQueues.push_back(New<TActionQueue>(LightThreadNamePrefix + ToString(index)));
- }
-
- constexpr int HeavyCallbackCount = 3;
- std::vector<TTraceContextPtr> heavyTraceContexts;
- std::set<TTraceId> expectedHeavyTraceIds;
- for (int index = 0; index < HeavyCallbackCount; ++index) {
- auto traceContext = TTraceContext::NewRoot("Heavy");
- traceContext->SetLoggingTag(Format("HeavyLoggingTag:%v", index));
- heavyTraceContexts.push_back(traceContext);
- InsertOrCrash(expectedHeavyTraceIds, traceContext->GetTraceId());
- }
-
- std::vector<TFuture<void>> heavyFutures;
- for (int index = 0; index < HeavyCallbackCount; ++index) {
- heavyFutures.push_back(
- BIND([&, index] {
- TTraceContextGuard traceContextGuard(heavyTraceContexts[index]);
- YT_LOG_INFO("Heavy callback started (Index: %v)", index);
- Sleep(TDuration::Seconds(3));
- YT_LOG_INFO("Heavy callback finished (Index: %v)", index);
- })
- .AsyncVia(heavyQueues[index % HeavyQueueCount]->GetInvoker())
- .Run());
- }
-
- constexpr int LightCallbackCount = 10;
- std::vector<TTraceContextPtr> lightTraceContexts;
- std::set<TTraceId> expectedLightTraceIds;
- for (int index = 0; index < LightCallbackCount; ++index) {
- auto traceContext = TTraceContext::NewRoot("Light");
- traceContext->SetLoggingTag(Format("LightLoggingTag:%v", index));
- lightTraceContexts.push_back(traceContext);
- InsertOrCrash(expectedLightTraceIds, traceContext->GetTraceId());
- }
-
- std::vector<TFuture<void>> lightFutures;
- for (int index = 0; index < LightCallbackCount; ++index) {
- lightFutures.push_back(
- BIND([&, index] {
- TTraceContextGuard traceContextGuard(lightTraceContexts[index]);
- YT_LOG_INFO("Light callback started (Index: %v)", index);
- TDelayedExecutor::WaitForDuration(TDuration::Seconds(1));
- YT_LOG_INFO("Light callback finished (Index: %v)", index);
- })
- .AsyncVia(lightQueues[index % LightQueueCount]->GetInvoker())
- .Run());
- }
-
- Sleep(TDuration::MilliSeconds(100));
-
- auto infos = IntrospectFibers();
- Cerr << FormatIntrospectionInfos(infos);
-
- std::set<TTraceId> actualHeavyTraceIds;
- std::set<TTraceId> actualLightTraceIds;
- for (const auto& info : infos) {
- if (!info.TraceId) {
- continue;
- }
- switch (info.State) {
- case EFiberState::Running:
- EXPECT_TRUE(actualHeavyTraceIds.insert(info.TraceId).second);
- if (expectedHeavyTraceIds.contains(info.TraceId)) {
- EXPECT_TRUE(info.ThreadName.StartsWith(HeavyThreadNamePrefix));
- }
- break;
-
- case EFiberState::Waiting:
- EXPECT_TRUE(actualLightTraceIds.insert(info.TraceId).second);
- break;
-
- default:
- break;
- }
- }
-
- EXPECT_EQ(expectedLightTraceIds, actualLightTraceIds);
- EXPECT_EQ(expectedHeavyTraceIds, actualHeavyTraceIds);
-
- for (const auto& future : heavyFutures) {
- future.Get().ThrowOnError();
- }
-
- for (const auto& future : lightFutures) {
- future.Get().ThrowOnError();
- }
-
- for (const auto& queue : heavyQueues) {
- queue->Shutdown(/*graceful*/ true);
- }
- for (const auto& queue : lightQueues) {
- queue->Shutdown(/*graceful*/ true);
- }
-}
-
-TEST(TBacktraceIntrospectorTest, Threads)
-{
- constexpr int QueueCount = 5;
- std::vector<TActionQueuePtr> queues;
- const TString ThreadNamePrefix("Queue:");
- for (int index = 0; index < QueueCount; ++index) {
- queues.push_back(New<TActionQueue>(ThreadNamePrefix + ToString(index)));
- }
-
- constexpr int CallbackCount = 3;
- std::vector<TTraceContextPtr> traceContexts;
- std::set<TTraceId> expectedTraceIds;
- for (int index = 0; index < CallbackCount; ++index) {
- auto traceContext = TTraceContext::NewRoot("Heavy");
- traceContexts.push_back(traceContext);
- InsertOrCrash(expectedTraceIds, traceContext->GetTraceId());
- }
-
- std::vector<TFuture<void>> futures;
- for (int index = 0; index < CallbackCount; ++index) {
- futures.push_back(
- BIND([&, index] {
- TTraceContextGuard traceContextGuard(traceContexts[index]);
- YT_LOG_INFO("Callback started (Index: %v)", index);
- Sleep(TDuration::Seconds(3));
- YT_LOG_INFO("Callback finished (Index: %v)", index);
- })
- .AsyncVia(queues[index % QueueCount]->GetInvoker())
- .Run());
- }
-
- Sleep(TDuration::MilliSeconds(100));
-
- auto infos = IntrospectThreads();
- Cerr << FormatIntrospectionInfos(infos);
-
- std::set<TTraceId> actualTraceIds;
- for (const auto& info : infos) {
- if (!info.TraceId) {
- continue;
- }
- EXPECT_TRUE(actualTraceIds.insert(info.TraceId).second);
- if (expectedTraceIds.contains(info.TraceId)) {
- EXPECT_TRUE(info.ThreadName.StartsWith(ThreadNamePrefix));
- }
- }
-
- EXPECT_EQ(expectedTraceIds, actualTraceIds);
-
- for (const auto& future : futures) {
- future.Get().ThrowOnError();
- }
- for (const auto& queue : queues) {
- queue->Shutdown(/*graceful*/ true);
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace
-} // namespace NYT::NBacktraceIntrospector
diff --git a/yt/yt/library/backtrace_introspector/unittests/ya.make b/yt/yt/library/backtrace_introspector/unittests/ya.make
deleted file mode 100644
index 393215d01e..0000000000
--- a/yt/yt/library/backtrace_introspector/unittests/ya.make
+++ /dev/null
@@ -1,15 +0,0 @@
-GTEST()
-
-SRCS(
- introspect_ut.cpp
-)
-
-INCLUDE(${ARCADIA_ROOT}/yt/opensource.inc)
-
-PEERDIR(
- yt/yt/library/backtrace_introspector
-
- yt/yt/core/test_framework
-)
-
-END()
diff --git a/yt/yt/library/backtrace_introspector/ya.make b/yt/yt/library/backtrace_introspector/ya.make
deleted file mode 100644
index 884b8fb562..0000000000
--- a/yt/yt/library/backtrace_introspector/ya.make
+++ /dev/null
@@ -1,31 +0,0 @@
-LIBRARY()
-
-INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
-
-SRCS(
- introspect.cpp
-)
-IF (OS_LINUX)
- SRCS(introspect_linux.cpp)
-ELSE()
- SRCS(introspect_dummy.cpp)
-ENDIF()
-
-PEERDIR(
- yt/yt/core
-
- library/cpp/yt/backtrace/cursors/interop
- library/cpp/yt/backtrace/cursors/libunwind
- library/cpp/yt/backtrace/cursors/frame_pointer
- library/cpp/yt/misc
-)
-
-END()
-
-RECURSE(
- http
-)
-
-RECURSE_FOR_TESTS(
- unittests
-)
diff --git a/yt/yt/library/formats/arrow_parser.cpp b/yt/yt/library/formats/arrow_parser.cpp
index c3c169352b..7c112716e5 100644
--- a/yt/yt/library/formats/arrow_parser.cpp
+++ b/yt/yt/library/formats/arrow_parser.cpp
@@ -245,6 +245,7 @@ private:
void ParseSimpleNumeric(FuncType makeUnversionedValueFunc)
{
auto array = std::static_pointer_cast<ArrayType>(Array_);
+ YT_VERIFY(array->length() <= std::ssize(*RowValues_));
for (int rowIndex = 0; rowIndex < array->length(); ++rowIndex) {
if (array->IsNull(rowIndex)) {
(*RowValues_)[rowIndex] = MakeUnversionedNullValue(ColumnId_);
@@ -258,6 +259,7 @@ private:
arrow::Status ParseStringLikeArray(auto makeUnversionedValueFunc)
{
auto array = std::static_pointer_cast<ArrayType>(Array_);
+ YT_VERIFY(array->length() <= std::ssize(*RowValues_));
for (int rowIndex = 0; rowIndex < array->length(); ++rowIndex) {
if (array->IsNull(rowIndex)) {
(*RowValues_)[rowIndex] = MakeUnversionedNullValue(ColumnId_);
@@ -295,6 +297,7 @@ private:
arrow::Status ParseBoolean()
{
auto array = std::static_pointer_cast<arrow::BooleanArray>(Array_);
+ YT_VERIFY(array->length() <= std::ssize(*RowValues_));
for (int rowIndex = 0; rowIndex < array->length(); rowIndex++) {
if (array->IsNull(rowIndex)) {
(*RowValues_)[rowIndex] = MakeUnversionedNullValue(ColumnId_);
@@ -308,6 +311,7 @@ private:
arrow::Status ParseNull()
{
auto array = std::static_pointer_cast<arrow::NullArray>(Array_);
+ YT_VERIFY(array->length() <= std::ssize(*RowValues_));
for (int rowIndex = 0; rowIndex < array->length(); rowIndex++) {
(*RowValues_)[rowIndex] = MakeUnversionedNullValue(ColumnId_);
}
@@ -834,19 +838,21 @@ void PrepareArrayForSimpleLogicalType(
{
CheckMatchingArrowTypes(columnType, column);
if (column->type()->id() == arrow::Type::DICTIONARY) {
- auto dictionaryColumn = std::static_pointer_cast<arrow::DictionaryArray>(column);
- TUnversionedRowValues dictionaryValues(rowsValues[columnIndex].size());
- auto dictionaryValuesColumn = dictionaryColumn->dictionary();
- CheckMatchingArrowTypes(columnType, dictionaryValuesColumn);
+ auto dictionaryArrayColumn = std::static_pointer_cast<arrow::DictionaryArray>(column);
+ auto dictionary = dictionaryArrayColumn->dictionary();
+ TUnversionedRowValues dictionaryValues(dictionary->length());
+ CheckMatchingArrowTypes(columnType, dictionary);
- TArraySimpleVisitor visitor(columnType, columnId, dictionaryValuesColumn, bufferForStringLikeValues, &dictionaryValues);
- ThrowOnError(dictionaryColumn->dictionary()->type()->Accept(&visitor));
+ TArraySimpleVisitor visitor(columnType, columnId, dictionary, bufferForStringLikeValues, &dictionaryValues);
+ ThrowOnError(dictionaryArrayColumn->dictionary()->type()->Accept(&visitor));
for (int offset = 0; offset < std::ssize(rowsValues[columnIndex]); offset++) {
- if (dictionaryColumn->IsNull(offset)) {
+ if (dictionaryArrayColumn->IsNull(offset)) {
rowsValues[columnIndex][offset] = MakeUnversionedNullValue(columnId);
} else {
- rowsValues[columnIndex][offset] = dictionaryValues[dictionaryColumn->GetValueIndex(offset)];
+ auto dictionaryValueIndex = dictionaryArrayColumn->GetValueIndex(offset);
+ YT_VERIFY(dictionaryValueIndex < std::ssize(dictionaryValues));
+ rowsValues[columnIndex][offset] = dictionaryValues[dictionaryValueIndex];
}
}
} else {
diff --git a/yt/yt/library/formats/unittests/arrow_parser_ut.cpp b/yt/yt/library/formats/unittests/arrow_parser_ut.cpp
new file mode 100644
index 0000000000..4e960edb08
--- /dev/null
+++ b/yt/yt/library/formats/unittests/arrow_parser_ut.cpp
@@ -0,0 +1,690 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include "row_helpers.h"
+
+#include <yt/yt/library/formats/arrow_parser.h>
+
+#include <yt/yt/client/formats/config.h>
+#include <yt/yt/client/formats/parser.h>
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/validate_logical_type.h>
+#include <yt/yt/library/formats/format.h>
+
+#include <contrib/libs/apache/arrow/cpp/src/arrow/api.h>
+#include <contrib/libs/apache/arrow/cpp/src/arrow/io/api.h>
+#include <contrib/libs/apache/arrow/cpp/src/arrow/io/memory.h>
+#include <contrib/libs/apache/arrow/cpp/src/arrow/ipc/api.h>
+#include <contrib/libs/apache/arrow/cpp/src/parquet/arrow/writer.h>
+
+namespace NYT {
+
+namespace {
+
+using namespace NFormats;
+using namespace NTableClient;
+using namespace NYTree;
+using namespace NYson;
+
+using namespace std::string_literals;
+
+////////////////////////////////////////////////////////////////////////////////
+
+std::string GetEos()
+{
+ std::string eos;
+ eos.assign(4, 0);
+ return eos;
+}
+
+void Verify(const arrow::Status& status)
+{
+ YT_VERIFY(status.ok());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+std::string MakeOutputFromRecordBatch(const std::shared_ptr<arrow::RecordBatch>& recordBatch)
+{
+ auto outputStream = arrow::io::BufferOutputStream::Create().ValueOrDie();
+ auto arrowWriter = arrow::ipc::MakeStreamWriter(outputStream, recordBatch->schema()).ValueOrDie();
+ Verify(arrowWriter->WriteRecordBatch(*recordBatch));
+ auto buffer = outputStream->Finish().ValueOrDie();
+ return buffer->ToString();
+}
+
+std::string MakeIntegerArrow(const std::vector<int8_t>& data)
+{
+ arrow::Int8Builder builder;
+
+ for (const auto& value : data) {
+ Verify(builder.Append(value));
+ }
+
+ auto intArray = builder.Finish();
+
+ auto arrowSchema = arrow::schema({arrow::field("integer", arrow::int8())});
+ std::vector<std::shared_ptr<arrow::Array>> columns = {*intArray};
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeOptionalIntegerArrow()
+{
+ arrow::Int8Builder builder;
+
+ Verify(builder.Append(1));
+ Verify(builder.AppendNull());
+ Verify(builder.AppendNull());
+
+ auto data = builder.Finish();
+
+ auto arrowSchema = arrow::schema({arrow::field("opt", arrow::int8())});
+ std::vector<std::shared_ptr<arrow::Array>> columns = {*data};
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeBooleanArrow(const std::vector<bool>& data)
+{
+ arrow::BooleanBuilder builder;
+
+ for (const auto& value : data) {
+ Verify(builder.Append(value));
+ }
+
+ auto boolArray = builder.Finish();
+
+ auto arrowSchema = arrow::schema({arrow::field("bool", arrow::boolean())});
+ std::vector<std::shared_ptr<arrow::Array>> columns = {*boolArray};
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeIntAndStringArrow(const std::vector<int8_t>& data, const std::vector<std::string>& stringData)
+{
+ arrow::Int8Builder builder;
+
+ for (const auto& value : data) {
+ Verify(builder.Append(value));
+ }
+ auto intArray = builder.Finish();
+
+ arrow::StringBuilder stringBuilder;
+
+ for (const auto& value : stringData) {
+ Verify(stringBuilder.Append(value));
+ }
+
+ auto stringArray = stringBuilder.Finish();
+
+ auto arrowSchema = arrow::schema({
+ arrow::field("integer", arrow::int8()),
+ arrow::field("string", arrow::binary()),
+ });
+
+ std::vector<std::shared_ptr<arrow::Array>> columns = {*intArray, *stringArray};
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeIntListArrow(const std::vector<std::optional<std::vector<int32_t>>>& data)
+{
+ auto* pool = arrow::default_memory_pool();
+ auto valueBuilder = std::make_shared<arrow::Int32Builder>(pool);
+ auto listBuilder = std::make_unique<arrow::ListBuilder>(pool, valueBuilder);
+
+ for (const auto& list : data) {
+ if (list) {
+ Verify(listBuilder->Append());
+ for (const auto& value : *list) {
+ Verify(valueBuilder->Append(value));
+ }
+ } else {
+ Verify(listBuilder->AppendNull());
+ }
+ }
+
+ auto arrowSchema = arrow::schema({arrow::field("list", listBuilder->type())});
+
+ std::shared_ptr<arrow::Array> listArray;
+ Verify(listBuilder->Finish(&listArray));
+ std::vector<std::shared_ptr<arrow::Array>> columns = {listArray};
+
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeStringListArrow(const std::vector<std::vector<std::string>>& data)
+{
+ auto* pool = arrow::default_memory_pool();
+
+ auto valueBuilder = std::make_shared<arrow::StringBuilder>(pool);
+ auto listBuilder = std::make_unique<arrow::ListBuilder>(pool, valueBuilder);
+
+ for (const auto& list : data) {
+ Verify(listBuilder->Append());
+ for (const auto& value : list) {
+ Verify(valueBuilder->Append(value));
+ }
+ }
+
+ auto arrowSchema = arrow::schema({arrow::field("list", listBuilder->type())});
+
+ std::shared_ptr<arrow::Array> listArray;
+ Verify(listBuilder->Finish(&listArray));
+ std::vector<std::shared_ptr<arrow::Array>> columns = {listArray};
+
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeMapArrow(const std::vector<std::vector<int32_t>>& key, const std::vector<std::vector<int32_t>>& value)
+{
+ auto* pool = arrow::default_memory_pool();
+
+ auto keyBuilder = std::make_shared<arrow::Int32Builder>(pool);
+ auto valueBuilder = std::make_shared<arrow::Int32Builder>(pool);
+ auto mapBuilder = std::make_unique<arrow::MapBuilder>(pool, keyBuilder, valueBuilder);
+
+ for (ssize_t mapIndex = 0; mapIndex < std::ssize(key); mapIndex++) {
+ Verify(mapBuilder->Append());
+ for (int valueNumber = 0; valueNumber < std::ssize(key[mapIndex]); valueNumber++) {
+ Verify(keyBuilder->Append(key[mapIndex][valueNumber]));
+ Verify(valueBuilder->Append(value[mapIndex][valueNumber]));
+ }
+ }
+
+ auto arrowSchema = arrow::schema({arrow::field("map", mapBuilder->type())});
+
+ std::shared_ptr<arrow::Array> mapArray;
+ Verify(mapBuilder->Finish(&mapArray));
+ std::vector<std::shared_ptr<arrow::Array>> columns = {mapArray};
+
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeDictionaryArrow(bool addExtraValues = false)
+{
+ auto* pool = arrow::default_memory_pool();
+
+ arrow::DictionaryBuilder<arrow::Int32Type> dictionaryBuilder(pool);
+
+ std::vector<int32_t> values = {1, 2, 1};
+
+ for (auto value : values) {
+ Verify(dictionaryBuilder.Append(value));
+ }
+
+ if (addExtraValues) {
+ arrow::Int32Builder builder;
+ Verify(builder.Append(3));
+ Verify(builder.Append(4));
+ Verify(builder.Append(5));
+ auto intArray = *builder.Finish();
+ Verify(dictionaryBuilder.InsertMemoValues(*intArray));
+ }
+
+ auto arrowSchema = arrow::schema({arrow::field("integer", dictionaryBuilder.type())});
+
+ std::shared_ptr<arrow::Array> array;
+ Verify(dictionaryBuilder.Finish(&array));
+
+ std::vector<std::shared_ptr<arrow::Array>> columns = {array};
+
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeStructArrow(const std::vector<std::string>& stringData, const std::vector<int64_t>& intData)
+{
+ auto* pool = arrow::default_memory_pool();
+
+ auto stringBuilder = std::make_shared<arrow::StringBuilder>(pool);
+ auto intBuilder = std::make_shared<arrow::Int64Builder>(pool);
+
+ std::vector<std::shared_ptr<arrow::Field>> fields = {
+ std::make_shared<arrow::Field>("bar", std::make_shared<arrow::StringType>()),
+ std::make_shared<arrow::Field>("foo", std::make_shared<arrow::Int64Type>())
+ };
+
+ arrow::StructBuilder structBuilder(
+ std::make_shared<arrow::StructType>(fields),
+ pool,
+ {stringBuilder, intBuilder});
+
+ for (int index = 0; index < std::ssize(stringData); index++) {
+ Verify(structBuilder.Append());
+ Verify(stringBuilder->Append(stringData[index]));
+ Verify(intBuilder->Append(intData[index]));
+ }
+
+ std::shared_ptr<arrow::Schema> arrowSchema = arrow::schema({arrow::field("struct", structBuilder.type())});
+
+ std::shared_ptr<arrow::Array> structArray;
+ Verify(structBuilder.Finish(&structArray));
+ std::vector<std::shared_ptr<arrow::Array>> columns = {structArray};
+
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeDecimalArrows(std::vector<TString> values, std::vector<std::tuple<int, int, int>> columnParameters)
+{
+ auto* pool = arrow::default_memory_pool();
+
+ auto makeColumn = [&]<class TBuilder, class TType, class TValue>(int precision, int scale) {
+ auto builder = std::make_shared<TBuilder>(std::make_shared<TType>(precision, scale), pool);
+ for (const auto& value : values) {
+ Verify(builder->Append(TValue(std::string(value))));
+ }
+ return builder->Finish().ValueOrDie();
+ };
+
+ std::vector<std::shared_ptr<arrow::Array>> columns;
+ for (const auto& [bitness, precision, scale] : columnParameters) {
+ if (bitness == 128) {
+ columns.push_back(makeColumn.template operator()<arrow::Decimal128Builder, arrow::Decimal128Type, arrow::Decimal128>(precision, scale));
+ } else if (bitness == 256) {
+ columns.push_back(makeColumn.template operator()<arrow::Decimal256Builder, arrow::Decimal256Type, arrow::Decimal256>(precision, scale));
+ } else {
+ YT_ABORT();
+ }
+ }
+
+ arrow::FieldVector fields;
+ for (const auto& [bitness, precision, scale] : columnParameters) {
+ std::shared_ptr<arrow::DataType> type;
+ if (bitness == 128) {
+ type = std::make_shared<arrow::Decimal128Type>(precision, scale);
+ } else if (bitness == 256) {
+ type = std::make_shared<arrow::Decimal256Type>(precision, scale);
+ } else {
+ YT_ABORT();
+ }
+ fields.push_back(std::make_shared<arrow::Field>(Format("decimal%v_%v_%v", bitness, precision, scale), type));
+ }
+
+ auto recordBatch = arrow::RecordBatch::Make(arrow::schema(std::move(fields)), columns[0]->length(), columns);
+
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+std::string MakeDecimalListArrow(std::vector<TString> values)
+{
+ // Create a single column with one value, which is a list containing all the #values.
+ // Type of the list is Decimal128(10, 3).
+ auto* pool = arrow::default_memory_pool();
+ auto decimalBuilder = std::make_shared<arrow::Decimal128Builder>(std::make_shared<arrow::Decimal128Type>(10, 3), pool);
+ auto listBuilder = std::make_unique<arrow::ListBuilder>(pool, decimalBuilder);
+
+ Verify(listBuilder->Append());
+ for (const auto& value : values) {
+ Verify(decimalBuilder->Append(arrow::Decimal128(std::string(value))));
+ }
+ std::shared_ptr<arrow::Array> listArray;
+ Verify(listBuilder->Finish(&listArray));
+ auto arrowSchema = arrow::schema({arrow::field("list", listArray->type())});
+ std::vector<std::shared_ptr<arrow::Array>> columns = {listArray};
+ auto recordBatch = arrow::RecordBatch::Make(arrowSchema, columns[0]->length(), columns);
+ return MakeOutputFromRecordBatch(recordBatch);
+}
+
+void TestArrowParserWithDictionary(bool addExtraValues = false)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("integer", EValueType::Int64)
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeDictionaryArrow(addExtraValues);
+ parser->Read(data);
+ parser->Finish();
+
+ ASSERT_EQ(collectedRows.Size(), 3u);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "integer")), 1);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(1, "integer")), 2);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(2, "integer")), 1);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TArrowParserTest, Simple)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("integer", EValueType::Int64)
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeIntegerArrow({1, 2, 3});
+ parser->Read(data);
+ parser->Finish();
+
+ ASSERT_EQ(collectedRows.Size(), 3u);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "integer")), 1);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(1, "integer")), 2);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(2, "integer")), 3);
+}
+
+TEST(TArrowParserTest, Optional)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("opt", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64)))
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeOptionalIntegerArrow();
+ parser->Read(data);
+ parser->Finish();
+
+ ASSERT_EQ(collectedRows.Size(), 3u);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "opt")), 1);
+ ASSERT_TRUE(IsNull(collectedRows.GetRowValue(1, "opt")));
+ ASSERT_TRUE(IsNull(collectedRows.GetRowValue(2, "opt")));
+}
+
+TEST(TArrowParserTest, Dictionary)
+{
+ TestArrowParserWithDictionary(false);
+ TestArrowParserWithDictionary(true);
+}
+
+TEST(TArrowParserTest, Bool)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("bool", EValueType::Boolean),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeBooleanArrow({true, false, true});
+ parser->Read(data);
+ parser->Finish();
+
+ ASSERT_EQ(collectedRows.Size(), 3u);
+
+ ASSERT_EQ(GetBoolean(collectedRows.GetRowValue(0, "bool")), true);
+ ASSERT_EQ(GetBoolean(collectedRows.GetRowValue(1, "bool")), false);
+ ASSERT_EQ(GetBoolean(collectedRows.GetRowValue(2, "bool")), true);
+}
+
+TEST(TArrowParserTest, String)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("integer", EValueType::Any),
+ TColumnSchema("string", EValueType::String),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeIntAndStringArrow({1, 2, 3}, {"foo", "bar", "yt"});
+ parser->Read(data);
+ parser->Finish();
+
+ ASSERT_EQ(collectedRows.Size(), 3u);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "integer")), 1);
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(0, "string")), "foo");
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(1, "integer")), 2);
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(1, "string")), "bar");
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(2, "integer")), 3);
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(2, "string")), "yt");
+}
+
+
+TString ConvertToYsonTextStringStable(const INodePtr& node)
+{
+ TStringStream out;
+ TYsonWriter writer(&out, EYsonFormat::Text);
+ VisitTree(node, &writer, true, TAttributeFilter());
+ writer.Flush();
+ return out.Str();
+}
+
+TEST(TArrowParserTest, ListOfIntegers)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("list", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeIntListArrow({std::vector{1, 2, 3}, std::nullopt, std::vector{4, 5}});
+ parser->Read(data);
+ parser->Finish();
+
+ auto firstNode = GetComposite(collectedRows.GetRowValue(0, "list"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(firstNode), "[1;2;3;]");
+
+ ASSERT_EQ(EValueType::Null, collectedRows.GetRowValue(1, "list").Type);
+
+ auto thirdNode = GetComposite(collectedRows.GetRowValue(2, "list"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(thirdNode), "[4;5;]");
+}
+
+TEST(TArrowParserTest, ListOfStrings)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("list", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeStringListArrow({{"foo", "bar"}, {"42", "universe"}});
+ parser->Read(data);
+ parser->Finish();
+
+ auto firstNode = GetComposite(collectedRows.GetRowValue(0, "list"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(firstNode), "[\"foo\";\"bar\";]");
+
+ auto secondNode = GetComposite(collectedRows.GetRowValue(1, "list"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(secondNode), "[\"42\";\"universe\";]");
+}
+
+TEST(TArrowParserTest, Map)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema(
+ "map",
+ DictLogicalType(
+ SimpleLogicalType(ESimpleLogicalValueType::Int64),
+ SimpleLogicalType(ESimpleLogicalValueType::Uint64))),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeMapArrow({{1, 3}, {3}}, {{2, 2}, {2}});
+ parser->Read(data);
+ parser->Finish();
+
+ auto firstNode = GetComposite(collectedRows.GetRowValue(0, "map"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(firstNode), "[[1;2;];[3;2;];]");
+
+ auto secondNode = GetComposite(collectedRows.GetRowValue(1, "map"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(secondNode), "[[3;2;];]");
+}
+
+TEST(TArrowParserTest, SeveralIntArrays)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("integer", EValueType::Int64),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+ auto data = Format("%v%v%v", MakeIntegerArrow({1, 2, 3}), GetEos(), MakeIntegerArrow({5, 6}));
+
+ parser->Read(data);
+ parser->Finish();
+
+ ASSERT_EQ(collectedRows.Size(), 5u);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "integer")), 1);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(1, "integer")), 2);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(2, "integer")), 3);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(3, "integer")), 5);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(4, "integer")), 6);
+}
+
+TEST(TArrowParserTest, Struct)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("struct", StructLogicalType({
+ {"bar", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"foo", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ })),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ parser->Read(MakeStructArrow({"one", "two"}, {1, 2}));
+ parser->Finish();
+
+ auto firstNode = GetComposite(collectedRows.GetRowValue(0, "struct"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(firstNode), "[\"one\";1;]");
+
+ auto secondNode = GetComposite(collectedRows.GetRowValue(1, "struct"));
+ ASSERT_EQ(ConvertToYsonTextStringStable(secondNode), "[\"two\";2;]");
+}
+
+TEST(TArrowParserTest, DecimalVariousPrecisions)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("decimal128_10_3", DecimalLogicalType(10, 3)),
+ TColumnSchema("decimal128_35_3", DecimalLogicalType(35, 3)),
+ TColumnSchema("decimal128_38_3", DecimalLogicalType(38, 3)),
+ TColumnSchema("decimal256_10_3", DecimalLogicalType(10, 3)),
+ TColumnSchema("decimal256_35_3", DecimalLogicalType(35, 3)),
+ TColumnSchema("decimal256_38_3", DecimalLogicalType(38, 3)),
+ TColumnSchema("decimal256_76_3", DecimalLogicalType(76, 3)),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ std::vector<TString> values = {"3.141", "0.000", "-2.718", "9999999.999"};
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ parser->Read(MakeDecimalArrows(values, {{128, 10, 3}, {128, 35, 3}, {128, 38, 3}, {256, 10, 3}, {256, 35, 3}, {256, 38, 3}, {256, 76, 3}}));
+ parser->Finish();
+
+ auto collectStrings = [&] (TStringBuf columnName) {
+ std::vector<TString> result;
+ for (size_t index = 0; index < values.size(); ++index) {
+ result.push_back(collectedRows.GetRowValue(index, columnName).AsString());
+ }
+ return result;
+ };
+
+ std::vector<TString> expectedValues_10_3 =
+ {"\x80\x00\x00\x00\x00\x00\x0c\x45"s, "\x80\x00\x00\x00\x00\x00\x00\x00"s, "\x7f\xff\xff\xff\xff\xff\xf5\x62"s, "\x80\x00\x00\x02\x54\x0b\xe3\xff"s};
+ std::vector<TString> expectedValues_35_3 =
+ {
+ "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x45"s, "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"s,
+ "\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf5\x62"s, "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x54\x0b\xe3\xff"s,
+ };
+ std::vector<TString> expectedValues_38_3 =
+ {
+ "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x45"s, "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"s,
+ "\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf5\x62"s, "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x54\x0b\xe3\xff"s
+ };
+ std::vector<TString> expectedValues_76_3 =
+ {
+ "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x45"s,
+ "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"s,
+ "\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf5\x62"s,
+ "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x54\x0b\xe3\xff"s,
+ };
+ ASSERT_EQ(expectedValues_10_3, collectStrings("decimal128_10_3"));
+ ASSERT_EQ(expectedValues_35_3, collectStrings("decimal128_35_3"));
+ ASSERT_EQ(expectedValues_38_3, collectStrings("decimal128_38_3"));
+ ASSERT_EQ(expectedValues_10_3, collectStrings("decimal256_10_3"));
+ ASSERT_EQ(expectedValues_35_3, collectStrings("decimal256_35_3"));
+ ASSERT_EQ(expectedValues_38_3, collectStrings("decimal256_38_3"));
+ ASSERT_EQ(expectedValues_76_3, collectStrings("decimal256_76_3"));
+}
+
+TEST(TArrowParserTest, ListOfDecimals)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("list", ListLogicalType(DecimalLogicalType(10, 3))),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ std::vector<TString> values = {"3.141", "0.000", "-2.718", "9999999.999"};
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ parser->Read(MakeDecimalListArrow(values));
+ parser->Finish();
+
+ auto firstList = ConvertTo<std::vector<TString>>(GetComposite(collectedRows.GetRowValue(0, "list")));
+ std::vector<TString> secondList = {
+ "\x80\x00\x00\x00\x00\x00\x0c\x45"s, "\x80\x00\x00\x00\x00\x00\x00\x00"s,
+ "\x7f\xff\xff\xff\xff\xff\xf5\x62"s, "\x80\x00\x00\x02\x54\x0b\xe3\xff"s
+ };
+ ASSERT_EQ(firstList, secondList);
+}
+
+TEST(TArrowParserTest, BlockingInput)
+{
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("integer", EValueType::Int64)
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+
+ auto parser = CreateParserForArrow(&collectedRows);
+
+ auto data = MakeIntegerArrow({1, 2, 3});
+ for (auto i : data) {
+ std::string s(1, i);
+ parser->Read(s);
+ }
+ parser->Finish();
+
+ ASSERT_EQ(collectedRows.Size(), 3u);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "integer")), 1);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(1, "integer")), 2);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(2, "integer")), 3);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT
diff --git a/yt/yt/library/formats/unittests/dsv_parser_ut.cpp b/yt/yt/library/formats/unittests/dsv_parser_ut.cpp
new file mode 100644
index 0000000000..f939585099
--- /dev/null
+++ b/yt/yt/library/formats/unittests/dsv_parser_ut.cpp
@@ -0,0 +1,365 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/test_framework/yson_consumer_mock.h>
+
+#include <yt/yt/library/formats/dsv_parser.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NYson;
+
+using ::testing::InSequence;
+using ::testing::StrictMock;
+using ::testing::NiceMock;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TDsvParserTest, Simple)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("integer"));
+ EXPECT_CALL(Mock, OnStringScalar("42"));
+ EXPECT_CALL(Mock, OnKeyedItem("string"));
+ EXPECT_CALL(Mock, OnStringScalar("some"));
+ EXPECT_CALL(Mock, OnKeyedItem("double"));
+ EXPECT_CALL(Mock, OnStringScalar("10"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("foo"));
+ EXPECT_CALL(Mock, OnStringScalar("bar"));
+ EXPECT_CALL(Mock, OnKeyedItem("one"));
+ EXPECT_CALL(Mock, OnStringScalar("1"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "integer=42\tstring=some\tdouble=10\n"
+ "foo=bar\tone=1\n";
+ ParseDsv(input, &Mock);
+}
+
+TEST(TDsvParserTest, EmptyInput)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ TString input = "";
+ ParseDsv(input, &Mock);
+}
+
+TEST(TDsvParserTest, BinaryData)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+
+ auto a = TString("\0\0\0\0", 4);
+ auto b = TString("\x80\0\x16\xC8", 4);
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("ntr"));
+ EXPECT_CALL(Mock, OnStringScalar(a));
+ EXPECT_CALL(Mock, OnKeyedItem("xrp"));
+ EXPECT_CALL(Mock, OnStringScalar(b));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "ntr=\\0\\0\\0\\0\txrp=\x80\\0\x16\xC8\n";
+ ParseDsv(input, &Mock);
+}
+
+TEST(TDsvParserTest, EmptyRecord)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "\n";
+ ParseDsv(input, &Mock);
+}
+
+TEST(TDsvParserTest, EmptyRecords)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "\n\n";
+ ParseDsv(input, &Mock);
+}
+
+TEST(TDsvParserTest, EmptyKeysAndValues)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem(""));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "=\n";
+ ParseDsv(input, &Mock);
+}
+
+TEST(TDsvParserTest, UnescapedZeroInInput)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+
+ TString input = TString("a\0b=v", 5);
+ EXPECT_ANY_THROW({
+ ParseDsv(input, &Mock);
+ });
+}
+
+TEST(TDsvParserTest, ZerosAreNotTerminals)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ TString key = TString("a\0b", 3);
+ TString value = TString("c\0d", 3);
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem(key));
+ EXPECT_CALL(Mock, OnStringScalar(value));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "a\\0b=c\\0d\n";
+ ParseDsv(input, &Mock);
+}
+
+TEST(TDsvParserTest, UnterminatedRecord)
+{
+ NiceMock<TMockYsonConsumer> Mock;
+
+ TString input = "a=b";
+ EXPECT_ANY_THROW({
+ ParseDsv(input, &Mock);
+ });
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TTskvParserTest: public ::testing::Test
+{
+public:
+ StrictMock<TMockYsonConsumer> Mock;
+ NiceMock<TMockYsonConsumer> ErrorMock;
+
+ TDsvFormatConfigPtr Config;
+
+ void SetUp() override {
+ Config = New<TDsvFormatConfig>();
+ Config->LinePrefix = "tskv";
+ }
+};
+
+TEST_F(TTskvParserTest, Simple)
+{
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("id"));
+ EXPECT_CALL(Mock, OnStringScalar("1"));
+ EXPECT_CALL(Mock, OnKeyedItem("guid"));
+ EXPECT_CALL(Mock, OnStringScalar("100500"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("id"));
+ EXPECT_CALL(Mock, OnStringScalar("2"));
+ EXPECT_CALL(Mock, OnKeyedItem("guid"));
+ EXPECT_CALL(Mock, OnStringScalar("20025"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "tskv\n"
+ "tskv\tid=1\tguid=100500\t\n"
+ "tskv\tid=2\tguid=20025\n";
+ ParseDsv(input, &Mock, Config);
+}
+
+TEST_F(TTskvParserTest, SimpleWithNewLine)
+{
+ InSequence dummy;
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("foo"));
+ EXPECT_CALL(Mock, OnStringScalar("bar"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "tskv\tfoo=bar\n";
+ ParseDsv(input, &Mock, Config);
+}
+
+TEST_F(TTskvParserTest, Escaping)
+{
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a=b"));
+ EXPECT_CALL(Mock, OnStringScalar("c=d or e=f"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key_with_\t,\r_and_\n"));
+ EXPECT_CALL(Mock, OnStringScalar("value_with_\t,\\_and_\r\n"));
+ EXPECT_CALL(Mock, OnKeyedItem("another_key"));
+ EXPECT_CALL(Mock, OnStringScalar("another_value"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "t\\s\\kv\n"
+ "tskv" "\t" "a\\=b" "=" "c\\=d or e=f" "\n" // Note: unescaping is less strict
+ "tskv" "\t"
+ "key_with_\\t,\r_and_\\n"
+ "="
+ "value_with_\\t,\\\\_and_\\r\\n"
+ "\t"
+ "an\\other_\\key=anoth\\er_v\\alue"
+ "\n";
+
+ ParseDsv(input, &Mock, Config);
+}
+
+TEST_F(TTskvParserTest, DisabledEscaping)
+{
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a\\"));
+ EXPECT_CALL(Mock, OnStringScalar("b\\t=c\\=d or e=f\\0"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "tskv\t\\x\\y\n"
+ "tskv" "\t" "a\\=b\\t" "=" "c\\=d or e=f\\0" "\n";
+
+ Config->EnableEscaping = false;
+
+ ParseDsv(input, &Mock, Config);
+}
+
+TEST_F(TTskvParserTest, AllowedUnescapedSymbols)
+{
+ Config->LinePrefix = "prefix_with_=";
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("just_key"));
+ EXPECT_CALL(Mock, OnStringScalar("value_with_="));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "prefix_with_=" "\t" "just_key" "=" "value_with_=" "\n";
+ ParseDsv(input, &Mock, Config);
+}
+
+TEST_F(TTskvParserTest, UndefinedValues)
+{
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("b"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "tskv" "\t" "tskv" "\t" "tskv" "\n"
+ "tskv\t" "some_key" "\t\t\t" "a=b" "\t" "another_key" "\n" // Note: consequent \t
+ "tskv\n";
+ ParseDsv(input, &Mock, Config);
+}
+
+
+TEST_F(TTskvParserTest, OnlyLinePrefix)
+{
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "tskv\n";
+ ParseDsv(input, &Mock, Config);
+}
+
+TEST_F(TTskvParserTest, OnlyLinePrefixAndTab)
+{
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "tskv\t\n";
+ ParseDsv(input, &Mock, Config);
+}
+
+TEST_F(TTskvParserTest, NotFinishedLinePrefix)
+{
+ TString input = "tsk";
+
+ EXPECT_ANY_THROW({
+ ParseDsv(input, &ErrorMock, Config);
+ });
+}
+
+TEST_F(TTskvParserTest, WrongLinePrefix)
+{
+ TString input =
+ "tskv\ta=b\n"
+ "tZkv\tc=d\te=f\n"
+ "tskv\ta=b\n";
+
+ EXPECT_ANY_THROW({
+ ParseDsv(input, &ErrorMock, Config);
+ });
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NDriver
diff --git a/yt/yt/library/formats/unittests/dsv_writer_ut.cpp b/yt/yt/library/formats/unittests/dsv_writer_ut.cpp
new file mode 100644
index 0000000000..842a669557
--- /dev/null
+++ b/yt/yt/library/formats/unittests/dsv_writer_ut.cpp
@@ -0,0 +1,316 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/library/formats/dsv_parser.h>
+#include <yt/yt/library/formats/dsv_writer.h>
+
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/unversioned_row.h>
+
+#include <yt/yt/core/concurrency/async_stream.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NYTree;
+using namespace NYson;
+using namespace NConcurrency;
+using namespace NTableClient;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TDsvWriterTest, StringScalar)
+{
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream);
+
+ consumer.OnStringScalar("0-2-xb-1234");
+ EXPECT_EQ("0-2-xb-1234", outputStream.Str());
+}
+
+TEST(TDsvWriterTest, ListContainingDifferentTypes)
+{
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream);
+
+ consumer.OnBeginList();
+ consumer.OnListItem();
+ consumer.OnInt64Scalar(100);
+ consumer.OnListItem();
+ consumer.OnStringScalar("foo");
+ consumer.OnListItem();
+ consumer.OnListItem();
+ consumer.OnBeginMap();
+ consumer.OnKeyedItem("a");
+ consumer.OnStringScalar("10");
+ consumer.OnKeyedItem("b");
+ consumer.OnStringScalar("c");
+ consumer.OnEndMap();
+ consumer.OnEndList();
+
+ TString output =
+ "100\n"
+ "foo\n"
+ "\n"
+ "a=10\tb=c\n";
+
+ EXPECT_EQ(output, outputStream.Str());
+}
+
+TEST(TDsvWriterTest, ListInsideList)
+{
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream);
+
+ consumer.OnBeginList();
+ consumer.OnListItem();
+ EXPECT_ANY_THROW(consumer.OnBeginList());
+}
+
+TEST(TDsvWriterTest, ListInsideMap)
+{
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream);
+
+ consumer.OnBeginMap();
+ consumer.OnKeyedItem("foo");
+ EXPECT_ANY_THROW(consumer.OnBeginList());
+}
+
+TEST(TDsvWriterTest, MapInsideMap)
+{
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream);
+
+ consumer.OnBeginMap();
+ consumer.OnKeyedItem("foo");
+ EXPECT_ANY_THROW(consumer.OnBeginMap());
+}
+
+TEST(TDsvWriterTest, WithoutEsacping)
+{
+ auto config = New<TDsvFormatConfig>();
+ config->EnableEscaping = false;
+
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream, config);
+
+ consumer.OnStringScalar("string_with_\t_\\_=_and_\n");
+
+ TString output = "string_with_\t_\\_=_and_\n";
+
+ EXPECT_EQ(output, outputStream.Str());
+}
+
+TEST(TDsvWriterTest, ListUsingOnRaw)
+{
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream);
+
+ consumer.OnRaw("[10; 20; 30]", EYsonType::Node);
+ TString output =
+ "10\n"
+ "20\n"
+ "30\n";
+
+ EXPECT_EQ(output, outputStream.Str());
+}
+
+TEST(TDsvWriterTest, MapUsingOnRaw)
+{
+ TStringStream outputStream;
+ TDsvNodeConsumer consumer(&outputStream);
+
+ consumer.OnRaw("{a=b; c=d}", EYsonType::Node);
+ TString output = "a=b\tc=d";
+
+ EXPECT_EQ(output, outputStream.Str());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TDsvWriterTest, SimpleTabular)
+{
+ auto nameTable = New<TNameTable>();
+ auto integerId = nameTable->RegisterName("integer");
+ auto stringId = nameTable->RegisterName("string");
+ auto doubleId = nameTable->RegisterName("double");
+ auto fooId = nameTable->RegisterName("foo");
+ auto oneId = nameTable->RegisterName("one");
+ auto tableIndexId = nameTable->RegisterName(TableIndexColumnName);
+ auto rowIndexId = nameTable->RegisterName(RowIndexColumnName);
+ auto rangeIndexId = nameTable->RegisterName(RangeIndexColumnName);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedInt64Value(42, integerId));
+ row1.AddValue(MakeUnversionedStringValue("some", stringId));
+ row1.AddValue(MakeUnversionedDoubleValue(10., doubleId));
+ row1.AddValue(MakeUnversionedInt64Value(2, tableIndexId));
+ row1.AddValue(MakeUnversionedInt64Value(42, rowIndexId));
+ row1.AddValue(MakeUnversionedInt64Value(1, rangeIndexId));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("bar", fooId));
+ row2.AddValue(MakeUnversionedSentinelValue(EValueType::Null, integerId));
+ row2.AddValue(MakeUnversionedInt64Value(1, oneId));
+ row2.AddValue(MakeUnversionedInt64Value(2, tableIndexId));
+ row2.AddValue(MakeUnversionedInt64Value(43, rowIndexId));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow()};
+
+ TStringStream outputStream;
+ auto config = New<TDsvFormatConfig>();
+ config->EnableTableIndex = true;
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ controlAttributes->EnableTableIndex = true;
+ auto writer = CreateSchemalessWriterForDsv(
+ config,
+ nameTable,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&outputStream)),
+ false,
+ controlAttributes,
+ 0);
+
+ EXPECT_EQ(true, writer->Write(rows));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output =
+ "integer=42\tstring=some\tdouble=10.\t@table_index=2\n"
+ "foo=bar\tone=1\t@table_index=2\n";
+ EXPECT_EQ(output, outputStream.Str());
+}
+
+TEST(TDsvWriterTest, AnyTabular)
+{
+ auto nameTable = New<TNameTable>();
+ auto anyId = nameTable->RegisterName("any");
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedAnyValue("[]", anyId));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ TStringStream outputStream;
+ auto controlAttributes = New<TControlAttributesConfig>();
+ auto writer = CreateSchemalessWriterForDsv(
+ New<TDsvFormatConfig>(),
+ nameTable,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&outputStream)),
+ false,
+ controlAttributes,
+ 0);
+
+ EXPECT_FALSE(writer->Write(rows));
+ EXPECT_ANY_THROW(writer->GetReadyEvent().Get().ThrowOnError());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TTskvWriterTest, SimpleTabular)
+{
+ auto nameTable = New<TNameTable>();
+ auto id1 = nameTable->RegisterName("id");
+ auto id2 = nameTable->RegisterName("guid");
+ auto tableIndexId = nameTable->RegisterName(TableIndexColumnName);
+ auto rowIndexId = nameTable->RegisterName(RowIndexColumnName);
+ auto rangeIndexId = nameTable->RegisterName(RangeIndexColumnName);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedInt64Value(2, tableIndexId));
+ row1.AddValue(MakeUnversionedInt64Value(42, rowIndexId));
+ row1.AddValue(MakeUnversionedInt64Value(1, rangeIndexId));
+
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("1", id1));
+ row2.AddValue(MakeUnversionedInt64Value(100500, id2));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("2", id1));
+ row3.AddValue(MakeUnversionedInt64Value(20025, id2));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow(), row3.GetRow() };
+
+ TStringStream outputStream;
+ auto config = New<TDsvFormatConfig>();
+ config->LinePrefix = "tskv";
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ auto writer = CreateSchemalessWriterForDsv(
+ config,
+ nameTable,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&outputStream)),
+ false,
+ controlAttributes,
+ 0);
+
+ EXPECT_EQ(true, writer->Write(rows));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output =
+ "tskv\n"
+ "tskv\tid=1\tguid=100500\n"
+ "tskv\tid=2\tguid=20025\n";
+
+ EXPECT_EQ(output, outputStream.Str());
+}
+
+TEST(TTskvWriterTest, Escaping)
+{
+ auto key1 = TString("\0 is escaped", 12);
+
+ auto nameTable = New<TNameTable>();
+ auto id1 = nameTable->RegisterName(key1);
+ auto id2 = nameTable->RegisterName("Escaping in in key: \r \t \n \\ =");
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue(key1, id1));
+ row.AddValue(MakeUnversionedStringValue("Escaping in value: \r \t \n \\ =", id2));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ TStringStream outputStream;
+ auto config = New<TDsvFormatConfig>();
+ config->LinePrefix = "tskv";
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ auto writer = CreateSchemalessWriterForDsv(
+ config,
+ nameTable,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&outputStream)),
+ false,
+ controlAttributes,
+ 0);
+
+ EXPECT_EQ(true, writer->Write(rows));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output =
+ "tskv"
+ "\t"
+
+ "\\0 is escaped"
+ "="
+ "\\0 is escaped"
+
+ "\t"
+
+ "Escaping in in key: \\r \\t \\n \\\\ \\="
+ "="
+ "Escaping in value: \\r \\t \\n \\\\ =" // Note: = is not escaped
+
+ "\n";
+
+ EXPECT_EQ(output, outputStream.Str());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/format_writer_ut.h b/yt/yt/library/formats/unittests/format_writer_ut.h
new file mode 100644
index 0000000000..9da194d588
--- /dev/null
+++ b/yt/yt/library/formats/unittests/format_writer_ut.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <yt/yt/library/formats/format.h>
+
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/unversioned_row.h>
+
+namespace NYT::NFormats {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TestNameTableExpansion(ISchemalessFormatWriterPtr writer, NTableClient::TNameTablePtr nameTable)
+{
+ // We write five rows, on each iteration we double number of
+ // columns in the NameTable.
+ for (int iteration = 0; iteration < 5; ++iteration) {
+ NTableClient::TUnversionedOwningRowBuilder row;
+ for (int index = 0; index < (1 << iteration); ++index) {
+ auto key = "Column" + ToString(index);
+ auto value = "Value" + ToString(index);
+ int columnId = nameTable->GetIdOrRegisterName(key);
+ row.AddValue(NTableClient::MakeUnversionedStringValue(value, columnId));
+ }
+ auto completeRow = row.FinishRow();
+ EXPECT_EQ(true, writer->Write({completeRow.Get()}));
+ }
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/protobuf_format_ut.cpp b/yt/yt/library/formats/unittests/protobuf_format_ut.cpp
new file mode 100644
index 0000000000..f3cb743833
--- /dev/null
+++ b/yt/yt/library/formats/unittests/protobuf_format_ut.cpp
@@ -0,0 +1,4659 @@
+#include "row_helpers.h"
+#include "yson_helpers.h"
+#include "yt/yt/client/table_client/public.h"
+
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/concurrency/async_stream.h>
+#include <yt/yt/core/json/json_parser.h>
+#include <yt/yt/core/yson/string.h>
+#include <yt/yt/core/ytree/fluent.h>
+
+#include <yt/yt/client/formats/config.h>
+#include <yt/yt/client/formats/parser.h>
+#include <yt/yt/client/formats/format.h>
+#include <yt/yt/client/table_client/logical_type.h>
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/value_consumer.h>
+#include <yt/yt/client/table_client/unversioned_row.h>
+
+#include <yt/yt/library/formats/format.h>
+#include <yt/yt/library/formats/lenval_control_constants.h>
+#include <yt/yt/library/formats/protobuf_writer.h>
+#include <yt/yt/library/formats/protobuf_parser.h>
+#include <yt/yt/library/formats/protobuf.h>
+
+#include <yt/yt/library/formats/unittests/protobuf_format_ut.pb.h>
+
+#include <yt/yt/library/named_value/named_value.h>
+
+#include <util/random/fast.h>
+
+#include <google/protobuf/text_format.h>
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/descriptor.pb.h>
+
+using namespace std::string_view_literals;
+
+
+namespace NYT {
+namespace {
+
+using namespace NYson;
+using namespace NYTree;
+using namespace NFormats;
+using namespace NTableClient;
+using namespace NConcurrency;
+using namespace NProtobufFormatTest;
+
+using ::google::protobuf::FileDescriptor;
+using NNamedValue::MakeRow;
+
+////////////////////////////////////////////////////////////////////////////////
+
+DEFINE_ENUM(EProtoFormatType,
+ (FileDescriptorLegacy)
+ (FileDescriptor)
+ (Structured)
+);
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define EXPECT_NODES_EQUAL(a, b) \
+ EXPECT_TRUE(AreNodesEqual((a), (b))) \
+ << #a ": " << ConvertToYsonString((a), EYsonFormat::Text).ToString() \
+ << "\n\n" #b ": " << ConvertToYsonString((b), EYsonFormat::Text).ToString();
+
+////////////////////////////////////////////////////////////////////////////////
+
+TString ConvertToTextYson(const INodePtr& node)
+{
+ return ConvertToYsonString(node, EYsonFormat::Text).ToString();
+}
+
+// Hardcoded serialization of file descriptor used in old format description.
+TString FileDescriptorLegacy = "\x0a\xb6\x03\x0a\x29\x6a\x75\x6e\x6b\x2f\x65\x72\x6d\x6f\x6c\x6f\x76\x64\x2f\x74\x65\x73\x74\x2d\x70\x72\x6f\x74\x6f\x62"
+ "\x75\x66\x2f\x6d\x65\x73\x73\x61\x67\x65\x2e\x70\x72\x6f\x74\x6f\x22\x2d\x0a\x0f\x54\x45\x6d\x62\x65\x64\x65\x64\x4d\x65\x73\x73\x61\x67\x65\x12"
+ "\x0b\x0a\x03\x4b\x65\x79\x18\x01\x20\x01\x28\x09\x12\x0d\x0a\x05\x56\x61\x6c\x75\x65\x18\x02\x20\x01\x28\x09\x22\xb3\x02\x0a\x08\x54\x4d\x65\x73"
+ "\x73\x61\x67\x65\x12\x0e\x0a\x06\x44\x6f\x75\x62\x6c\x65\x18\x01\x20\x01\x28\x01\x12\x0d\x0a\x05\x46\x6c\x6f\x61\x74\x18\x02\x20\x01\x28\x02\x12"
+ "\x0d\x0a\x05\x49\x6e\x74\x36\x34\x18\x03\x20\x01\x28\x03\x12\x0e\x0a\x06\x55\x49\x6e\x74\x36\x34\x18\x04\x20\x01\x28\x04\x12\x0e\x0a\x06\x53\x49"
+ "\x6e\x74\x36\x34\x18\x05\x20\x01\x28\x12\x12\x0f\x0a\x07\x46\x69\x78\x65\x64\x36\x34\x18\x06\x20\x01\x28\x06\x12\x10\x0a\x08\x53\x46\x69\x78\x65"
+ "\x64\x36\x34\x18\x07\x20\x01\x28\x10\x12\x0d\x0a\x05\x49\x6e\x74\x33\x32\x18\x08\x20\x01\x28\x05\x12\x0e\x0a\x06\x55\x49\x6e\x74\x33\x32\x18\x09"
+ "\x20\x01\x28\x0d\x12\x0e\x0a\x06\x53\x49\x6e\x74\x33\x32\x18\x0a\x20\x01\x28\x11\x12\x0f\x0a\x07\x46\x69\x78\x65\x64\x33\x32\x18\x0b\x20\x01\x28"
+ "\x07\x12\x10\x0a\x08\x53\x46\x69\x78\x65\x64\x33\x32\x18\x0c\x20\x01\x28\x0f\x12\x0c\x0a\x04\x42\x6f\x6f\x6c\x18\x0d\x20\x01\x28\x08\x12\x0e\x0a"
+ "\x06\x53\x74\x72\x69\x6e\x67\x18\x0e\x20\x01\x28\x09\x12\x0d\x0a\x05\x42\x79\x74\x65\x73\x18\x0f\x20\x01\x28\x0c\x12\x14\x0a\x04\x45\x6e\x75\x6d"
+ "\x18\x10\x20\x01\x28\x0e\x32\x06\x2e\x45\x45\x6e\x75\x6d\x12\x21\x0a\x07\x4d\x65\x73\x73\x61\x67\x65\x18\x11\x20\x01\x28\x0b\x32\x10\x2e\x54\x45"
+ "\x6d\x62\x65\x64\x65\x64\x4d\x65\x73\x73\x61\x67\x65\x2a\x24\x0a\x05\x45\x45\x6e\x75\x6d\x12\x07\x0a\x03\x4f\x6e\x65\x10\x01\x12\x07\x0a\x03\x54"
+ "\x77\x6f\x10\x02\x12\x09\x0a\x05\x54\x68\x72\x65\x65\x10\x03";
+
+TString GenerateRandomLenvalString(TFastRng64& rng, ui32 size)
+{
+ TString result;
+ result.append(reinterpret_cast<const char*>(&size), sizeof(size));
+
+ size += sizeof(ui32);
+
+ while (result.size() < size) {
+ ui64 num = rng.GenRand();
+ result.append(reinterpret_cast<const char*>(&num), sizeof(num));
+ }
+ if (result.size() > size) {
+ result.resize(size);
+ }
+ return result;
+}
+
+static TProtobufFormatConfigPtr MakeProtobufFormatConfig(const std::vector<const ::google::protobuf::Descriptor*>& descriptorList)
+{
+ ::google::protobuf::FileDescriptorSet fileDescriptorSet;
+ THashSet<const ::google::protobuf::FileDescriptor*> files;
+
+ std::function<void(const ::google::protobuf::FileDescriptor*)> addFile;
+ addFile = [&] (const ::google::protobuf::FileDescriptor* fileDescriptor) {
+ if (!files.insert(fileDescriptor).second) {
+ return;
+ }
+
+ // N.B. We want to write dependencies in fileDescriptorSet in topological order
+ // so we traverse dependencies first and the add current fileDescriptor.
+ for (int i = 0; i < fileDescriptor->dependency_count(); ++i) {
+ addFile(fileDescriptor->dependency(i));
+ }
+ fileDescriptor->CopyTo(fileDescriptorSet.add_file());
+ };
+ std::vector<TString> typeNames;
+
+ for (const auto* descriptor : descriptorList) {
+ addFile(descriptor->file());
+ typeNames.push_back(descriptor->full_name());
+ }
+
+ auto formatConfigYsonString = BuildYsonStringFluently()
+ .BeginMap()
+ .Item("file_descriptor_set_text").Value(fileDescriptorSet.ShortDebugString())
+ .Item("type_names").Value(typeNames)
+ .EndMap();
+
+ return ConvertTo<TProtobufFormatConfigPtr>(formatConfigYsonString);
+}
+
+INodePtr ParseYson(TStringBuf data)
+{
+ return ConvertToNode(NYson::TYsonString(TString{data}));
+}
+
+TString LenvalBytes(const ::google::protobuf::Message& message)
+{
+ TStringStream out;
+ ui32 messageSize = static_cast<ui32>(message.ByteSizeLong());
+ out.Write(&messageSize, sizeof(messageSize));
+ if (!message.SerializeToArcadiaStream(&out)) {
+ THROW_ERROR_EXCEPTION("Can not serialize message");
+ }
+ return out.Str();
+}
+
+void EnsureTypesMatch(EValueType expected, EValueType actual)
+{
+ if (expected != actual) {
+ THROW_ERROR_EXCEPTION("Mismatching type: expected %Qlv, actual %Qlv",
+ expected,
+ actual);
+ }
+}
+
+double GetDouble(const TUnversionedValue& row)
+{
+ EnsureTypesMatch(EValueType::Double, row.Type);
+ return row.Data.Double;
+}
+
+template <typename TMessage>
+TCollectingValueConsumer ParseRows(
+ const TMessage& message,
+ const TProtobufFormatConfigPtr& config,
+ const TTableSchemaPtr& schema = New<TTableSchema>(),
+ int count = 1)
+{
+ TString lenvalBytes;
+ TStringOutput out(lenvalBytes);
+ auto messageSize = static_cast<ui32>(message.ByteSize());
+ for (int i = 0; i < count; ++i) {
+ out.Write(&messageSize, sizeof(messageSize));
+ if (!message.SerializeToArcadiaStream(&out)) {
+ THROW_ERROR_EXCEPTION("Failed to serialize message");
+ }
+ }
+
+ TCollectingValueConsumer rowCollector(schema);
+ auto parser = CreateParserForProtobuf(&rowCollector, config, 0);
+ parser->Read(lenvalBytes);
+ parser->Finish();
+ if (static_cast<ssize_t>(rowCollector.Size()) != count) {
+ THROW_ERROR_EXCEPTION("rowCollector has wrong size: expected %v, actual %v",
+ count,
+ rowCollector.Size());
+ }
+ return rowCollector;
+}
+
+template <typename TMessage>
+TCollectingValueConsumer ParseRows(
+ const TMessage& message,
+ const INodePtr& config,
+ const TTableSchemaPtr& schema = New<TTableSchema>(),
+ int count = 1)
+{
+ return ParseRows(message, ConvertTo<TProtobufFormatConfigPtr>(config->Attributes().ToMap()), schema, count);
+}
+
+
+void AddDependencies(
+ const FileDescriptor* fileDescriptor,
+ std::vector<const FileDescriptor*>& fileDescriptors,
+ THashSet<const FileDescriptor*>& fileDescriptorSet)
+{
+ if (fileDescriptorSet.contains(fileDescriptor)) {
+ return;
+ }
+ fileDescriptorSet.insert(fileDescriptor);
+ for (int i = 0; i < fileDescriptor->dependency_count(); ++i) {
+ AddDependencies(fileDescriptor->dependency(i), fileDescriptors, fileDescriptorSet);
+ }
+ fileDescriptors.push_back(fileDescriptor);
+}
+
+template <typename ... Ts>
+INodePtr CreateFileDescriptorConfig(std::optional<EComplexTypeMode> complexTypeMode = {})
+{
+ std::vector<const FileDescriptor*> fileDescriptors;
+ THashSet<const FileDescriptor*> fileDescriptorSet;
+ std::vector<const FileDescriptor*> originalFileDescriptors = {Ts::descriptor()->file()...};
+
+ for (auto d : originalFileDescriptors) {
+ AddDependencies(d, fileDescriptors, fileDescriptorSet);
+ }
+
+ ::google::protobuf::FileDescriptorSet fileDescriptorSetProto;
+ for (auto fileDescriptor : fileDescriptors) {
+ fileDescriptor->CopyTo(fileDescriptorSetProto.add_file());
+ }
+ TString fileDescriptorSetText;
+ ::google::protobuf::TextFormat::Printer().PrintToString(fileDescriptorSetProto, &fileDescriptorSetText);
+ std::vector<TString> typeNames = {Ts::descriptor()->full_name()...};
+ return BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("file_descriptor_set_text").Value(fileDescriptorSetText)
+ .Item("type_names").Value(typeNames)
+ .OptionalItem("complex_type_mode", complexTypeMode)
+ .EndAttributes()
+ .Value("protobuf");
+}
+
+static const auto EnumerationsConfig = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("EEnum")
+ .BeginMap()
+ .Item("One").Value(1)
+ .Item("Two").Value(2)
+ .Item("Three").Value(3)
+ .Item("MinusFortyTwo").Value(-42)
+ .Item("MaxInt32").Value(std::numeric_limits<int>::max())
+ .Item("MinInt32").Value(std::numeric_limits<int>::min())
+ .EndMap()
+ .EndMap();
+
+INodePtr CreateAllFieldsConfig(EProtoFormatType protoFormatType)
+{
+ switch (protoFormatType) {
+ case EProtoFormatType::FileDescriptor:
+ return CreateFileDescriptorConfig<TMessage>();
+ case EProtoFormatType::FileDescriptorLegacy:
+ return BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("file_descriptor_set")
+ .Value(FileDescriptorLegacy)
+ .Item("file_indices")
+ .BeginList()
+ .Item().Value(0)
+ .EndList()
+ .Item("message_indices")
+ .BeginList()
+ .Item().Value(1)
+ .EndList()
+ .EndAttributes()
+ .Value("protobuf");
+ case EProtoFormatType::Structured:
+ return BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("enumerations").Value(EnumerationsConfig)
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Double")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("double")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Float")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("float")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Int64")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("UInt64")
+ .Item("field_number").Value(4)
+ .Item("proto_type").Value("uint64")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SInt64")
+ .Item("field_number").Value(5)
+ .Item("proto_type").Value("sint64")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Fixed64")
+ .Item("field_number").Value(6)
+ .Item("proto_type").Value("fixed64")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SFixed64")
+ .Item("field_number").Value(7)
+ .Item("proto_type").Value("sfixed64")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Int32")
+ .Item("field_number").Value(8)
+ .Item("proto_type").Value("int32")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("UInt32")
+ .Item("field_number").Value(9)
+ .Item("proto_type").Value("uint32")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SInt32")
+ .Item("field_number").Value(10)
+ .Item("proto_type").Value("sint32")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Fixed32")
+ .Item("field_number").Value(11)
+ .Item("proto_type").Value("fixed32")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SFixed32")
+ .Item("field_number").Value(12)
+ .Item("proto_type").Value("sfixed32")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Bool")
+ .Item("field_number").Value(13)
+ .Item("proto_type").Value("bool")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("String")
+ .Item("field_number").Value(14)
+ .Item("proto_type").Value("string")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Bytes")
+ .Item("field_number").Value(15)
+ .Item("proto_type").Value("bytes")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Enum")
+ .Item("field_number").Value(16)
+ .Item("proto_type").Value("enum_string")
+ .Item("enumeration_name").Value("EEnum")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Message")
+ .Item("field_number").Value(17)
+ .Item("proto_type").Value("message")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("AnyWithMap")
+ .Item("field_number").Value(18)
+ .Item("proto_type").Value("any")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("AnyWithInt64")
+ .Item("field_number").Value(19)
+ .Item("proto_type").Value("any")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("AnyWithString")
+ .Item("field_number").Value(20)
+ .Item("proto_type").Value("any")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("OtherColumns")
+ .Item("field_number").Value(21)
+ .Item("proto_type").Value("other_columns")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("MissingInt64")
+ .Item("field_number").Value(22)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndAttributes()
+ .Value("protobuf");
+ }
+ Y_ABORT();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TLenvalEntry
+{
+ TString RowData;
+ ui32 TableIndex;
+ ui64 TabletIndex;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TLenvalParser
+{
+public:
+ explicit TLenvalParser(IInputStream* input)
+ : Input_(input)
+ { }
+
+ explicit TLenvalParser(TStringBuf input)
+ : StreamHolder_(std::make_unique<TMemoryInput>(input))
+ , Input_(StreamHolder_.get())
+ { }
+
+ std::optional<TLenvalEntry> Next()
+ {
+ ui32 rowSize;
+ size_t read = Input_->Load(&rowSize, sizeof(rowSize));
+ if (read == 0) {
+ return std::nullopt;
+ } else if (read < sizeof(rowSize)) {
+ THROW_ERROR_EXCEPTION("corrupted lenval: can't read row length");
+ }
+ switch (rowSize) {
+ case LenvalTableIndexMarker: {
+ ui32 tableIndex;
+ read = Input_->Load(&tableIndex, sizeof(tableIndex));
+ if (read != sizeof(tableIndex)) {
+ THROW_ERROR_EXCEPTION("corrupted lenval: can't read table index");
+ }
+ CurrentTableIndex_ = tableIndex;
+ return Next();
+ }
+ case LenvalTabletIndexMarker: {
+ ui64 tabletIndex;
+ read = Input_->Load(&tabletIndex, sizeof(tabletIndex));
+ if (read != sizeof(tabletIndex)) {
+ THROW_ERROR_EXCEPTION("corrupted lenval: can't read tablet index");
+ }
+ CurrentTabletIndex_ = tabletIndex;
+ return Next();
+ }
+ case LenvalEndOfStream:
+ EndOfStream_ = true;
+ return std::nullopt;
+ case LenvalKeySwitch:
+ case LenvalRangeIndexMarker:
+ case LenvalRowIndexMarker:
+ THROW_ERROR_EXCEPTION("marker is unsupported");
+ default: {
+ TLenvalEntry result;
+ result.RowData.resize(rowSize);
+ result.TableIndex = CurrentTableIndex_;
+ result.TabletIndex = CurrentTabletIndex_;
+ Input_->Load(result.RowData.Detach(), rowSize);
+
+ return result;
+ }
+ }
+ }
+
+ bool IsEndOfStream() const
+ {
+ return EndOfStream_;
+ }
+
+private:
+ std::unique_ptr<IInputStream> StreamHolder_;
+ IInputStream* Input_;
+ ui32 CurrentTableIndex_ = 0;
+ ui64 CurrentTabletIndex_ = 0;
+ bool EndOfStream_ = false;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace {
+
+TProtobufFormatConfigPtr ParseAndValidateConfig(const INodePtr& node, std::vector<TTableSchemaPtr> schemas = {})
+{
+ auto config = ConvertTo<TProtobufFormatConfigPtr>(node);
+ if (schemas.empty()) {
+ schemas.assign(config->Tables.size(), New<TTableSchema>());
+ }
+ New<TProtobufParserFormatDescription>()->Init(config, schemas);
+ New<TProtobufWriterFormatDescription>()->Init(config, schemas);
+ return config;
+}
+
+} // namespace
+
+INodePtr BuildEmbeddedConfig(EComplexTypeMode complexTypeMode, EProtoFormatType formatType) {
+ if (formatType == EProtoFormatType::FileDescriptor) {
+ return CreateFileDescriptorConfig<NYT::TEmbeddingMessage>(complexTypeMode);
+ }
+
+ auto config = BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("tables").BeginList()
+ .Item().BeginMap()
+ .Item("columns").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("*")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("embedded_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("other_columns_field")
+ .Item("field_number").Value(15)
+ .Item("proto_type").Value("other_columns")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("embedded_num")
+ .Item("field_number").Value(10)
+ .Item("proto_type").Value("uint64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("embedded_extra_field")
+ .Item("field_number").Value(11)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("variant")
+ .Item("proto_type").Value("oneof")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("str_variant")
+ .Item("field_number").Value(101)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("uint_variant")
+ .Item("field_number").Value(102)
+ .Item("proto_type").Value("uint64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("*")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("embedded_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("embedded2_num")
+ .Item("field_number").Value(10)
+ .Item("proto_type").Value("uint64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("embedded2_struct")
+ .Item("field_number").Value(17)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("float1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("float")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("string1")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("embedded2_repeated")
+ .Item("field_number").Value(42)
+ .Item("proto_type").Value("string")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("num")
+ .Item("field_number").Value(12)
+ .Item("proto_type").Value("uint64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("extra_field")
+ .Item("field_number").Value(13)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .Item("complex_type_mode").Value(complexTypeMode)
+ .EndAttributes()
+ .Value("protobuf");
+ return config;
+}
+
+TTableSchemaPtr BuildEmbeddedSchema()
+{
+ auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"num", SimpleLogicalType(ESimpleLogicalValueType::Uint64)},
+ {"embedded_num", SimpleLogicalType(ESimpleLogicalValueType::Uint64)},
+ {"variant", VariantStructLogicalType({
+ {"str_variant", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"uint_variant", SimpleLogicalType(ESimpleLogicalValueType::Uint64)},
+ })},
+ {"extra_column", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Uint64))},
+ {"embedded2_num", SimpleLogicalType(ESimpleLogicalValueType::Uint64)},
+ {"embedded2_struct", StructLogicalType({
+ {"float1", SimpleLogicalType(ESimpleLogicalValueType::Float)},
+ {"string1", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ })},
+ {"embedded2_repeated", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"other_complex_field", StructLogicalType({
+ {"one", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"two", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"three", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ })},
+ {"extra_int", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+
+ });
+ return schema;
+}
+
+TEST(TProtobufFormat, TestConfigParsingEmbedded) {
+ auto config = BuildEmbeddedConfig(EComplexTypeMode::Positional, EProtoFormatType::Structured);
+ auto schema = BuildEmbeddedSchema();
+
+ EXPECT_NO_THROW(
+ ParseAndValidateConfig(config->Attributes().ToMap(), {schema}));
+}
+
+TEST(TProtobufFormat, TestConfigParsing)
+{
+ // Empty config.
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(ParseYson("{}")),
+ "one of \"tables\", \"file_descriptor_set\" and \"file_descriptor_set_text\" must be specified");
+
+ // Broken protobuf.
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(ParseYson(R"({file_descriptor_set="dfgxx"; file_indices=[0]; message_indices=[0]})")),
+ "Error parsing \"file_descriptor_set\" in protobuf config");
+
+ EXPECT_NO_THROW(ParseAndValidateConfig(
+ CreateAllFieldsConfig(EProtoFormatType::Structured)->Attributes().ToMap()));
+
+ EXPECT_NO_THROW(ParseAndValidateConfig(
+ CreateAllFieldsConfig(EProtoFormatType::FileDescriptorLegacy)->Attributes().ToMap()));
+
+ EXPECT_NO_THROW(ParseAndValidateConfig(
+ CreateAllFieldsConfig(EProtoFormatType::FileDescriptor)->Attributes().ToMap()));
+
+ auto embeddedInsideNonembeddedConfig = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables").BeginList()
+ .Item().BeginMap()
+ .Item("columns").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("embedded_message1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("embedded_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("field1")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("embedded_message2")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("embedded_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("field2")
+ .Item("field_number").Value(4)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto schemaForEmbedded = New<TTableSchema>(std::vector{
+ TColumnSchema("field1", StructLogicalType({
+ {"embedded_message2", StructLogicalType({
+ {"field2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ })},
+ }))
+ });
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(embeddedInsideNonembeddedConfig, {schemaForEmbedded}),
+ "embedded_message inside of structured_message is not allowed");
+
+ auto repeatedEmbeddedConfig = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("*")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("embedded_message")
+ .Item("repeated").Value(true)
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("field1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("uint64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(repeatedEmbeddedConfig),
+ R"(type "embedded_message" can not be repeated)");
+
+ auto multipleOtherColumnsConfig = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Other1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("other_columns")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Other2")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("other_columns")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(multipleOtherColumnsConfig),
+ "Multiple \"other_columns\" in protobuf config are not allowed");
+
+ auto duplicateColumnNamesConfig = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SomeColumn")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SomeColumn")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(duplicateColumnNamesConfig),
+ "Multiple fields with same column name \"SomeColumn\" are forbidden in protobuf format");
+
+ auto anyCorrespondsToStruct = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SomeColumn")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("any")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto schema = New<TTableSchema>(std::vector{
+ TColumnSchema("SomeColumn", StructLogicalType({})),
+ });
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(anyCorrespondsToStruct, {schema}),
+ "Table schema and protobuf format config mismatch");
+
+ auto configWithBytes = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SomeColumn")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("bytes")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto schemaWithUtf8 = New<TTableSchema>(std::vector{
+ TColumnSchema("SomeColumn", SimpleLogicalType(ESimpleLogicalValueType::Utf8)),
+ });
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(configWithBytes, {schemaWithUtf8}),
+ "mismatch: expected logical type to be one of");
+
+ auto configWithPackedNonRepeated = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SomeColumn")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .Item("packed").Value(true)
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto schemaWithInt64List = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"SomeColumn", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ });
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(configWithPackedNonRepeated, {schemaWithInt64List}),
+ "Field \"SomeColumn\" is marked \"packed\" but is not marked \"repeated\"");
+
+ auto configWithPackedRepeatedString = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SomeColumn")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("string")
+ .Item("packed").Value(true)
+ .Item("repeated").Value(true)
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto schemaWithStringList = New<TTableSchema>(std::vector{
+ TColumnSchema("SomeColumn", ListLogicalType(
+ SimpleLogicalType(ESimpleLogicalValueType::String)))
+ });
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(configWithPackedRepeatedString, {schemaWithStringList}),
+ "packed protobuf field must have primitive numeric type, got \"string\"");
+
+ auto configWithMissingFieldNumber = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("SomeColumn")
+ .Item("proto_type").Value("string")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseAndValidateConfig(configWithMissingFieldNumber, {schemaWithStringList}),
+ "\"field_number\" is required");
+}
+
+TEST(TProtobufFormat, TestParseBigZigZag)
+{
+ constexpr i32 value = Min<i32>();
+ TMessage message;
+ message.set_int32_field(value);
+ auto config = ConvertTo<TProtobufFormatConfigPtr>(CreateAllFieldsConfig(EProtoFormatType::Structured)->Attributes().ToMap());
+ auto rowCollector = ParseRows(message, config);
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(0, "Int32")), value);
+}
+
+TEST(TProtobufFormat, TestParseEnumerationString)
+{
+ auto config = ConvertTo<TProtobufFormatConfigPtr>(CreateAllFieldsConfig(EProtoFormatType::Structured)->Attributes().ToMap());
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::One);
+ auto rowCollector = ParseRows(message, config);
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(0, "Enum")), "One");
+ }
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::Two);
+ auto rowCollector = ParseRows(message, config);
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(0, "Enum")), "Two");
+ }
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::Three);
+ auto rowCollector = ParseRows(message, config);
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(0, "Enum")), "Three");
+ }
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::MinusFortyTwo);
+ auto rowCollector = ParseRows(message, config);
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(0, "Enum")), "MinusFortyTwo");
+ }
+}
+
+TEST(TProtobufFormat, TestParseWrongEnumeration)
+{
+ auto config = ConvertTo<TProtobufFormatConfigPtr>(CreateAllFieldsConfig(EProtoFormatType::Structured)->Attributes().ToMap());
+ TMessage message;
+ auto enumTag = TMessage::descriptor()->FindFieldByName("enum_field")->number();
+ message.mutable_unknown_fields()->AddVarint(enumTag, 30);
+ EXPECT_ANY_THROW(ParseRows(message, config));
+}
+
+TEST(TProtobufFormat, TestParseEnumerationInt)
+{
+ TCollectingValueConsumer rowCollector;
+
+ auto config = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Enum")
+ .Item("field_number").Value(16)
+ .Item("proto_type").Value("enum_int")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto parser = CreateParserForProtobuf(&rowCollector, ConvertTo<TProtobufFormatConfigPtr>(config), 0);
+
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::One);
+ parser->Read(LenvalBytes(message));
+ }
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::Two);
+ parser->Read(LenvalBytes(message));
+ }
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::Three);
+ parser->Read(LenvalBytes(message));
+ }
+ {
+ TMessage message;
+ message.set_enum_field(EEnum::MinusFortyTwo);
+ parser->Read(LenvalBytes(message));
+ }
+ {
+ TMessage message;
+ auto enumTag = TMessage::descriptor()->FindFieldByName("enum_field")->number();
+ message.mutable_unknown_fields()->AddVarint(enumTag, 100500);
+ parser->Read(LenvalBytes(message));
+ }
+
+ parser->Finish();
+
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(0, "Enum")), 1);
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(1, "Enum")), 2);
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(2, "Enum")), 3);
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(3, "Enum")), -42);
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(4, "Enum")), 100500);
+}
+
+TEST(TProtobufFormat, TestParseRandomGarbage)
+{
+ // Check that we never crash.
+
+ TFastRng64 rng(42);
+ for (int i = 0; i != 1000; ++i) {
+ auto bytes = GenerateRandomLenvalString(rng, 8);
+
+ TCollectingValueConsumer rowCollector;
+ auto parser = CreateParserForProtobuf(
+ &rowCollector,
+ ConvertTo<TProtobufFormatConfigPtr>(CreateAllFieldsConfig(EProtoFormatType::Structured)->Attributes().ToMap()),
+ 0);
+ try {
+ parser->Read(bytes);
+ parser->Finish();
+ } catch (...) {
+ }
+ }
+}
+
+TEST(TProtobufFormat, TestParseZeroColumns)
+{
+ auto config = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ TCollectingValueConsumer rowCollector;
+ auto parser = CreateParserForProtobuf(
+ &rowCollector,
+ ConvertTo<TProtobufFormatConfigPtr>(config),
+ 0);
+
+ // Empty lenval values.
+ parser->Read("\0\0\0\0"sv);
+ parser->Read("\0\0\0\0"sv);
+
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<ssize_t>(rowCollector.Size()), 2);
+ EXPECT_EQ(static_cast<int>(rowCollector.GetRow(0).GetCount()), 0);
+ EXPECT_EQ(static_cast<int>(rowCollector.GetRow(1).GetCount()), 0);
+}
+
+TEST(TProtobufFormat, TestWriteEnumerationString)
+{
+ auto config = CreateAllFieldsConfig(EProtoFormatType::Structured);
+
+ auto nameTable = New<TNameTable>();
+
+ TString result;
+ TStringOutput resultStream(result);
+ auto writer = CreateWriterForProtobuf(
+ config->Attributes(),
+ {New<TTableSchema>()},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+
+ EXPECT_EQ(true, writer->Write({
+ MakeRow(nameTable, {
+ {"Enum", "MinusFortyTwo"}
+ }).Get()
+ }));
+ EXPECT_EQ(true, writer->Write({
+ MakeRow(nameTable, {
+ {"Enum", "Three"},
+ }).Get()
+ }));
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput si(result);
+ TLenvalParser parser(&si);
+ {
+ auto row = parser.Next();
+ ASSERT_TRUE(row);
+ NYT::TMessage message;
+ ASSERT_TRUE(message.ParseFromString(row->RowData));
+ ASSERT_EQ(message.enum_field(), NYT::EEnum::MinusFortyTwo);
+ }
+ {
+ auto row = parser.Next();
+ ASSERT_TRUE(row);
+ NYT::TMessage message;
+ ASSERT_TRUE(message.ParseFromString(row->RowData));
+ ASSERT_EQ(message.enum_field(), NYT::EEnum::Three);
+ }
+ {
+ auto row = parser.Next();
+ ASSERT_FALSE(row);
+ }
+}
+
+TEST(TProtobufFormat, TestWriteEnumerationInt)
+{
+ auto config = BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("Enum")
+ .Item("field_number").Value(16)
+ .Item("proto_type").Value("enum_int")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndAttributes()
+ .Value("protobuf");
+
+ auto nameTable = New<TNameTable>();
+
+ auto writeAndParseRow = [&] (TUnversionedRow row, TMessage* message) {
+ TString result;
+ TStringOutput resultStream(result);
+ auto writer = CreateWriterForProtobuf(
+ config->Attributes(),
+ {New<TTableSchema>()},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+ Y_UNUSED(writer->Write({row}));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput si(result);
+ TLenvalParser parser(&si);
+ auto protoRow = parser.Next();
+ ASSERT_TRUE(protoRow);
+
+ ASSERT_TRUE(message->ParseFromString(protoRow->RowData));
+
+ auto nextProtoRow = parser.Next();
+ ASSERT_FALSE(nextProtoRow);
+ };
+
+ {
+ TMessage message;
+ writeAndParseRow(
+ MakeRow(nameTable, {
+ {"Enum", -42},
+ }).Get(),
+ &message);
+ ASSERT_EQ(message.enum_field(), EEnum::MinusFortyTwo);
+ }
+ {
+ TMessage message;
+ writeAndParseRow(
+ MakeRow(nameTable, {
+ {"Enum", static_cast<ui64>(std::numeric_limits<i32>::max())},
+ }).Get(),
+ &message);
+ ASSERT_EQ(message.enum_field(), EEnum::MaxInt32);
+ }
+ {
+ TMessage message;
+ writeAndParseRow(
+ MakeRow(nameTable, {
+ {"Enum", std::numeric_limits<i32>::max()},
+ }).Get(),
+ &message);
+ ASSERT_EQ(message.enum_field(), EEnum::MaxInt32);
+ }
+ {
+ TMessage message;
+ writeAndParseRow(
+ MakeRow(nameTable, {
+ {"Enum", std::numeric_limits<i32>::min()},
+ }).Get(),
+ &message);
+ ASSERT_EQ(message.enum_field(), EEnum::MinInt32);
+ }
+
+ TMessage message;
+ ASSERT_THROW(
+ writeAndParseRow(
+ MakeRow(nameTable, {
+ {"Enum", static_cast<i64>(std::numeric_limits<i32>::max()) + 1},
+ }).Get(),
+ &message),
+ TErrorException);
+
+ ASSERT_THROW(
+ writeAndParseRow(
+ MakeRow(nameTable, {
+ {"Enum", static_cast<i64>(std::numeric_limits<i32>::min()) - 1},
+ }).Get(),
+ &message),
+ TErrorException);
+
+ ASSERT_THROW(
+ writeAndParseRow(
+ MakeRow(nameTable, {
+ {"Enum", static_cast<ui64>(std::numeric_limits<i32>::max()) + 1},
+ }).Get(),
+ &message),
+ TErrorException);
+}
+
+
+TEST(TProtobufFormat, TestWriteZeroColumns)
+{
+ auto config = BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndAttributes()
+ .Value("protobuf");
+
+ auto nameTable = New<TNameTable>();
+
+ TString result;
+ TStringOutput resultStream(result);
+ auto writer = CreateWriterForProtobuf(
+ config->Attributes(),
+ {New<TTableSchema>()},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+
+ EXPECT_EQ(true, writer->Write({
+ MakeRow(nameTable, {
+ {"Int64", -1},
+ {"String", "this_is_string"},
+ }).Get()
+ }));
+ EXPECT_EQ(true, writer->Write({MakeRow(nameTable, { }).Get()}));
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ ASSERT_EQ(result, "\0\0\0\0\0\0\0\0"sv);
+}
+
+TEST(TProtobufFormat, TestTabletIndex)
+{
+ auto config = ConvertTo<TProtobufFormatConfigPtr>(BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap());
+
+ auto nameTable = New<TNameTable>();
+
+ TString result;
+ TStringOutput resultStream(result);
+ auto controlAttributesConfig = New<TControlAttributesConfig>();
+ controlAttributesConfig->EnableTabletIndex = true;
+
+ auto writer = CreateWriterForProtobuf(
+ config,
+ {New<TTableSchema>()},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ controlAttributesConfig,
+ 0);
+
+ EXPECT_EQ(true, writer->Write({
+ MakeRow(nameTable, {
+ {TString(TabletIndexColumnName), 1LL << 50},
+ {"int64_field", -2345},
+ }).Get(),
+ MakeRow(nameTable, {
+ {TString(TabletIndexColumnName), 12},
+ {"int64_field", 2345},
+ }).Get(),
+ }));
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput si(result);
+ TLenvalParser parser(&si);
+ {
+ auto row = parser.Next();
+ ASSERT_TRUE(row);
+ ASSERT_EQ(row->TabletIndex, 1ULL << 50);
+ NYT::TMessage message;
+ ASSERT_TRUE(message.ParseFromString(row->RowData));
+ ASSERT_EQ(message.int64_field(), -2345);
+ }
+ {
+ auto row = parser.Next();
+ ASSERT_TRUE(row);
+ ASSERT_EQ(static_cast<int>(row->TabletIndex), 12);
+ NYT::TMessage message;
+ ASSERT_TRUE(message.ParseFromString(row->RowData));
+ ASSERT_EQ(message.int64_field(), 2345);
+ }
+ {
+ auto row = parser.Next();
+ ASSERT_FALSE(row);
+ }
+}
+
+TEST(TProtobufFormat, TestContext)
+{
+ auto config = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ TCollectingValueConsumer rowCollector;
+ auto parser = CreateParserForProtobuf(
+ &rowCollector,
+ ConvertTo<TProtobufFormatConfigPtr>(config),
+ 0);
+
+ TString context;
+ try {
+ TMessage message;
+ message.set_string_field("PYSHCH-PYSHCH");
+ parser->Read(LenvalBytes(message));
+ parser->Finish();
+ GTEST_FATAL_FAILURE_("expected to throw");
+ } catch (const NYT::TErrorException& e) {
+ context = *e.Error().Attributes().Find<TString>("context");
+ }
+ ASSERT_NE(context.find("PYSHCH-PYSHCH"), TString::npos);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TTableSchemaPtr CreateSchemaWithStructuredMessage()
+{
+ auto keyValueStruct = StructLogicalType({
+ {"key", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"value", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ });
+
+ return New<TTableSchema>(std::vector<TColumnSchema>{
+ {"first", StructLogicalType({
+ {"field_missing_from_proto1", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int32))},
+ {"enum_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"int64_field", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"repeated_int64_field", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"another_repeated_int64_field", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"message_field", keyValueStruct},
+ {"repeated_message_field", ListLogicalType(keyValueStruct)},
+ {"any_int64_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"any_map_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Any))},
+ {"optional_int64_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"repeated_optional_any_field", ListLogicalType(OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Any)))},
+ {"packed_repeated_enum_field", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"optional_repeated_bool_field", OptionalLogicalType(ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Boolean)))},
+ {"oneof_field", VariantStructLogicalType({
+ {"oneof_string_field_1", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_string_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_message_field", keyValueStruct},
+ })},
+ {"optional_oneof_field", OptionalLogicalType(VariantStructLogicalType({
+ {"oneof_string_field_1", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_string_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_message_field", keyValueStruct},
+ }))},
+ {"map_field", DictLogicalType(
+ SimpleLogicalType(ESimpleLogicalValueType::Int64),
+ OptionalLogicalType(keyValueStruct))
+ },
+ {"field_missing_from_proto2", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int32))},
+ })},
+ {"repeated_int64_field", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"another_repeated_int64_field", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"repeated_message_field", ListLogicalType(keyValueStruct)},
+ {"second", StructLogicalType({
+ {"one", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"two", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"three", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ })},
+ {"any_field", SimpleLogicalType(ESimpleLogicalValueType::Any)},
+
+ {"int64_field", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"uint64_field", SimpleLogicalType(ESimpleLogicalValueType::Uint64)},
+ {"int32_field", SimpleLogicalType(ESimpleLogicalValueType::Int32)},
+ {"uint32_field", SimpleLogicalType(ESimpleLogicalValueType::Uint32)},
+
+ {"enum_int_field", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"enum_string_string_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"enum_string_int64_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+
+ {"repeated_optional_any_field", ListLogicalType(OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Any)))},
+
+ {"other_complex_field", StructLogicalType({
+ {"one", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"two", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"three", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ })},
+
+ {"utf8_field", SimpleLogicalType(ESimpleLogicalValueType::Utf8)},
+
+ {"packed_repeated_int64_field", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+
+ {"optional_repeated_int64_field", OptionalLogicalType(ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64)))},
+
+ {"oneof_field", VariantStructLogicalType({
+ {"oneof_string_field_1", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_string_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_message_field", keyValueStruct},
+ })},
+
+ {"optional_oneof_field", OptionalLogicalType(VariantStructLogicalType({
+ {"oneof_string_field_1", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_string_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"oneof_message_field", keyValueStruct},
+ }))},
+
+ {"map_field", DictLogicalType(
+ SimpleLogicalType(ESimpleLogicalValueType::Int64),
+ OptionalLogicalType(keyValueStruct))
+ },
+ });
+}
+
+INodePtr CreateConfigWithStructuredMessage(EComplexTypeMode complexTypeMode, EProtoFormatType formatType)
+{
+ if (formatType == EProtoFormatType::FileDescriptor) {
+ return CreateFileDescriptorConfig<TMessageWithStructuredEmbedded>(complexTypeMode);
+ }
+ YT_VERIFY(formatType == EProtoFormatType::Structured);
+
+ auto buildOneofConfig = [] (TString prefix, int fieldNumberOffset) {
+ return BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("name").Value(prefix + "oneof_field")
+ .Item("proto_type").Value("oneof")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value(prefix + "oneof_string_field_1")
+ .Item("field_number").Value(101 + fieldNumberOffset)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value(prefix + "oneof_string_field")
+ .Item("field_number").Value(102 + fieldNumberOffset)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value(prefix + "oneof_message_field")
+ .Item("field_number").Value(1000 + fieldNumberOffset)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("key")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("value")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+ };
+ auto oneofConfig = buildOneofConfig("", 0);
+ auto optionalOneofConfig = buildOneofConfig("optional_", 1000);
+
+ auto keyValueFields = BuildYsonStringFluently()
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("key")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("value")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList();
+
+ return BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("enumerations").Value(EnumerationsConfig)
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("first")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("enum_field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("enum_string")
+ .Item("enumeration_name").Value("EEnum")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("packed_repeated_enum_field")
+ .Item("field_number").Value(11)
+ .Item("proto_type").Value("enum_string")
+ .Item("enumeration_name").Value("EEnum")
+ .Item("repeated").Value(true)
+ .Item("packed").Value(true)
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("message_field")
+ .Item("field_number").Value(4)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").Value(keyValueFields)
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("repeated_int64_field")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("int64")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("another_repeated_int64_field")
+ .Item("field_number").Value(9)
+ .Item("proto_type").Value("int64")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("repeated_message_field")
+ .Item("field_number").Value(5)
+ .Item("proto_type").Value("structured_message")
+ .Item("repeated").Value(true)
+ .Item("fields").Value(keyValueFields)
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("any_int64_field")
+ .Item("field_number").Value(6)
+ .Item("proto_type").Value("any")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("any_map_field")
+ .Item("field_number").Value(7)
+ .Item("proto_type").Value("any")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("optional_int64_field")
+ .Item("field_number").Value(8)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("repeated_optional_any_field")
+ .Item("field_number").Value(10)
+ .Item("proto_type").Value("any")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("optional_repeated_bool_field")
+ .Item("field_number").Value(12)
+ .Item("proto_type").Value("bool")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .Item().Value(oneofConfig)
+ .Item().Value(optionalOneofConfig)
+ .Item()
+ .BeginMap()
+ .Item("name").Value("map_field")
+ .Item("field_number").Value(13)
+ .Item("proto_type").Value("structured_message")
+ .Item("repeated").Value(true)
+ .Item("fields")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("key")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("value")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").Value(keyValueFields)
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("second")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("one")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("two")
+ .Item("field_number").Value(500000000)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("three")
+ .Item("field_number").Value(100500)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("repeated_message_field")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("structured_message")
+ .Item("repeated").Value(true)
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("key")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("value")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("repeated_int64_field")
+ .Item("field_number").Value(4)
+ .Item("proto_type").Value("int64")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("another_repeated_int64_field")
+ .Item("field_number").Value(13)
+ .Item("proto_type").Value("int64")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .Item()
+ .BeginMap()
+ // In schema it is of type "any".
+ .Item("name").Value("any_field")
+ .Item("field_number").Value(5)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ // The next fields are for type casting testing
+ .Item()
+ .BeginMap()
+ // In schema it is of type "int64".
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(6)
+ .Item("proto_type").Value("int32")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ // In schema it is of type "uint64".
+ .Item("name").Value("uint64_field")
+ .Item("field_number").Value(7)
+ .Item("proto_type").Value("uint32")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ // In schema it is of type "int32".
+ .Item("name").Value("int32_field")
+ .Item("field_number").Value(8)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ // In schema it is of type "uint32".
+ .Item("name").Value("uint32_field")
+ .Item("field_number").Value(9)
+ .Item("proto_type").Value("uint64")
+ .EndMap()
+
+ // Enums.
+ .Item()
+ .BeginMap()
+ .Item("name").Value("enum_int_field")
+ .Item("field_number").Value(10)
+ .Item("proto_type").Value("enum_int")
+ .Item("enumeration_name").Value("EEnum")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("enum_string_string_field")
+ .Item("field_number").Value(11)
+ .Item("proto_type").Value("enum_string")
+ .Item("enumeration_name").Value("EEnum")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("enum_string_int64_field")
+ .Item("field_number").Value(12)
+ .Item("proto_type").Value("enum_string")
+ .Item("enumeration_name").Value("EEnum")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("utf8_field")
+ .Item("field_number").Value(16)
+ .Item("proto_type").Value("string")
+ .EndMap()
+
+ // list<optional<any>>.
+ .Item()
+ .BeginMap()
+ .Item("name").Value("repeated_optional_any_field")
+ .Item("field_number").Value(14)
+ .Item("proto_type").Value("any")
+ .Item("repeated").Value(true)
+ .EndMap()
+
+ // Other columns.
+ .Item()
+ .BeginMap()
+ .Item("name").Value("other_columns_field")
+ .Item("field_number").Value(15)
+ .Item("proto_type").Value("other_columns")
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("packed_repeated_int64_field")
+ .Item("field_number").Value(17)
+ .Item("proto_type").Value("int64")
+ .Item("repeated").Value(true)
+ .Item("packed").Value(true)
+ .EndMap()
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("optional_repeated_int64_field")
+ .Item("field_number").Value(18)
+ .Item("proto_type").Value("int64")
+ .Item("repeated").Value(true)
+ .EndMap()
+
+ .Item().Value(oneofConfig)
+ .Item().Value(optionalOneofConfig)
+
+ .Item()
+ .BeginMap()
+ .Item("name").Value("map_field")
+ .Item("field_number").Value(19)
+ .Item("proto_type").Value("structured_message")
+ .Item("repeated").Value(true)
+ .Item("fields")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("key")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("value")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").Value(keyValueFields)
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .Item("complex_type_mode").Value(complexTypeMode)
+ .EndAttributes()
+ .Value("protobuf");
+}
+
+using TProtobufFormatStructuredMessageParameter = std::tuple<EComplexTypeMode, int, EProtoFormatType>;
+
+class TProtobufFormatStructuredMessage
+ : public ::testing::TestWithParam<TProtobufFormatStructuredMessageParameter>
+{ };
+
+INSTANTIATE_TEST_SUITE_P(
+ FileDescriptor,
+ TProtobufFormatStructuredMessage,
+ ::testing::Values(TProtobufFormatStructuredMessageParameter{
+ EComplexTypeMode::Positional,
+ 1,
+ EProtoFormatType::FileDescriptor}));
+
+INSTANTIATE_TEST_SUITE_P(
+ Positional,
+ TProtobufFormatStructuredMessage,
+ ::testing::Values(TProtobufFormatStructuredMessageParameter{
+ EComplexTypeMode::Positional,
+ 1,
+ EProtoFormatType::Structured}));
+
+INSTANTIATE_TEST_SUITE_P(
+ Named,
+ TProtobufFormatStructuredMessage,
+ ::testing::Values(TProtobufFormatStructuredMessageParameter{
+ EComplexTypeMode::Named,
+ 1,
+ EProtoFormatType::Structured}));
+
+INSTANTIATE_TEST_SUITE_P(
+ ManyRows,
+ TProtobufFormatStructuredMessage,
+ ::testing::Values(TProtobufFormatStructuredMessageParameter{
+ EComplexTypeMode::Named,
+ 30000,
+ EProtoFormatType::Structured}));
+
+TEST_P(TProtobufFormatStructuredMessage, EmbeddedWrite)
+{
+ auto [complexTypeMode, rowCount, protoFormatType] = GetParam();
+
+ auto nameTable = New<TNameTable>();
+ auto numId = nameTable->RegisterName("num");
+ auto embeddedNumId = nameTable->RegisterName("embedded_num");
+ auto variantId = nameTable->RegisterName("variant");
+ auto embedded2NumId = nameTable->RegisterName("embedded2_num");
+ auto embedded2StructId = nameTable->RegisterName("embedded2_struct");
+ auto embedded2RepeatedId = nameTable->RegisterName("embedded2_repeated");
+ auto extraIntId = nameTable->RegisterName("extra_int");
+ auto otherComplexFieldId = nameTable->RegisterName("other_complex_field");
+
+ //message T2 {
+ // optional ui64 embedded2_num;
+ //};
+ //message T1 {
+ // required T2 t2 [embedded];
+ // optional ui64 embedded_num;
+ //};
+ //
+ //message T {
+ // required T1 t1 [embedded];
+ // optional ui64 num;
+ //};
+
+ auto schema = BuildEmbeddedSchema();
+ auto config = BuildEmbeddedConfig(complexTypeMode, protoFormatType);
+
+ TString result;
+ TStringOutput resultStream(result);
+ auto writer = CreateWriterForProtobuf(
+ ConvertTo<TProtobufFormatConfigPtr>(config->Attributes()),
+ {schema},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+
+ TUnversionedRowBuilder builder;
+ builder.AddValue(MakeUnversionedUint64Value(789, numId));
+ builder.AddValue(MakeUnversionedUint64Value(123, embeddedNumId));
+ builder.AddValue(MakeUnversionedUint64Value(456, embedded2NumId));
+ builder.AddValue(MakeUnversionedCompositeValue("[1; 555u]", variantId));
+ auto embeddedYson = BuildYsonStringFluently()
+ .BeginList()
+ // float1
+ .Item().Value(1.5f)
+ // string1
+ .Item().Value("abc")
+ .EndList();
+ auto embeddedYsonStr = embeddedYson.ToString();
+ builder.AddValue(MakeUnversionedCompositeValue(embeddedYsonStr, embedded2StructId));
+ auto repeatedYsonStr = BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value("a")
+ .Item().Value("b")
+ .EndList()
+ .ToString();
+ builder.AddValue(MakeUnversionedCompositeValue(repeatedYsonStr, embedded2RepeatedId));
+ builder.AddValue(MakeUnversionedInt64Value(111, extraIntId));
+ auto otherComplexFieldYson = BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value(22)
+ .Item().Value(23)
+ .Item().Value(24)
+ .EndList();
+ auto otherComplexFieldYsonStr = otherComplexFieldYson.ToString();
+ builder.AddValue(MakeUnversionedCompositeValue(otherComplexFieldYsonStr, otherComplexFieldId));
+
+
+ auto rows = std::vector<TUnversionedRow>(rowCount, builder.GetRow());
+ EXPECT_EQ(true, writer->Write(rows));
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput input(result);
+ TLenvalParser lenvalParser(&input);
+
+ for (int rowIndex = 0; rowIndex < rowCount; ++rowIndex) {
+ auto entry = lenvalParser.Next();
+ ASSERT_TRUE(entry);
+
+ NYT::TEmbeddingMessage message;
+ ASSERT_TRUE(message.ParseFromString(entry->RowData));
+
+ EXPECT_EQ(message.num(), 789UL);
+ EXPECT_EQ(message.t1().embedded_num(), 123UL);
+ EXPECT_EQ(message.t1().t2().embedded2_num(), 456UL);
+
+ EXPECT_FALSE(message.t1().has_str_variant());
+ EXPECT_TRUE(message.t1().has_uint_variant());
+ EXPECT_EQ(message.t1().uint_variant(), 555UL);
+
+ EXPECT_EQ(message.t1().t2().embedded2_struct().float1(), 1.5f);
+ EXPECT_EQ(message.t1().t2().embedded2_struct().string1(), "abc");
+
+ ASSERT_EQ(message.t1().t2().embedded2_repeated_size(), 2);
+ EXPECT_EQ(message.t1().t2().embedded2_repeated(0), "a");
+ EXPECT_EQ(message.t1().t2().embedded2_repeated(1), "b");
+
+ {
+ auto otherColumns = ConvertToNode(TYsonString(message.other_columns_field()))->AsMap();
+ auto mode = complexTypeMode;
+ auto expected = ([&] {
+ switch (mode) {
+ case EComplexTypeMode::Named:
+ return BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("one").Value(22)
+ .Item("two").Value(23)
+ .Item("three").Value(24)
+ .EndMap();
+ case EComplexTypeMode::Positional:
+ return ConvertToNode(otherComplexFieldYson);
+ }
+ YT_ABORT();
+ })();
+
+ EXPECT_NODES_EQUAL(expected, otherColumns->GetChildOrThrow("other_complex_field"));
+ EXPECT_EQ(ConvertTo<i64>(otherColumns->GetChildOrThrow("extra_int")), 111);
+ }
+
+ ASSERT_FALSE(message.has_extra_field());
+ ASSERT_FALSE(message.t1().has_embedded_extra_field());
+ }
+
+ ASSERT_FALSE(lenvalParser.Next());
+}
+
+TEST_P(TProtobufFormatStructuredMessage, Write)
+{
+ auto [complexTypeMode, rowCount, protoFormatType] = GetParam();
+
+ auto nameTable = New<TNameTable>();
+ auto firstId = nameTable->RegisterName("first");
+ auto secondId = nameTable->RegisterName("second");
+ auto repeatedMessageId = nameTable->RegisterName("repeated_message_field");
+ auto repeatedInt64Id = nameTable->RegisterName("repeated_int64_field");
+ auto anotherRepeatedInt64Id = nameTable->RegisterName("another_repeated_int64_field");
+ auto anyFieldId = nameTable->RegisterName("any_field");
+ auto int64FieldId = nameTable->RegisterName("int64_field");
+ auto uint64FieldId = nameTable->RegisterName("uint64_field");
+ auto int32FieldId = nameTable->RegisterName("int32_field");
+ auto uint32FieldId = nameTable->RegisterName("uint32_field");
+ auto enumIntFieldId = nameTable->RegisterName("enum_int_field");
+ auto enumStringStringFieldId = nameTable->RegisterName("enum_string_string_field");
+ auto enumStringInt64FieldId = nameTable->RegisterName("enum_string_int64_field");
+ auto utf8FieldId = nameTable->RegisterName("utf8_field");
+ auto repeatedOptionalAnyFieldId = nameTable->RegisterName("repeated_optional_any_field");
+ auto otherComplexFieldId = nameTable->RegisterName("other_complex_field");
+ auto packedRepeatedInt64FieldId = nameTable->RegisterName("packed_repeated_int64_field");
+ auto optionalRepeatedInt64FieldId = nameTable->RegisterName("optional_repeated_int64_field");
+ auto oneofFieldId = nameTable->RegisterName("oneof_field");
+ auto optionalOneofFieldId = nameTable->RegisterName("optional_oneof_field");
+ auto mapFieldId = nameTable->RegisterName("map_field");
+
+ auto schema = CreateSchemaWithStructuredMessage();
+ auto config = CreateConfigWithStructuredMessage(complexTypeMode, protoFormatType);
+
+ TString result;
+ TStringOutput resultStream(result);
+ auto writer = CreateWriterForProtobuf(
+ ConvertTo<TProtobufFormatConfigPtr>(config->Attributes()),
+ {schema},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+
+ auto firstYsonStr = BuildYsonStringFluently()
+ .BeginList()
+ // field_missing_from_proto1
+ .Item().Value(11111)
+ // enum_field
+ .Item().Value("Two")
+ // int64_field
+ .Item().Value(44)
+ // repeated_int64_field
+ .Item()
+ .BeginList()
+ .Item().Value(55)
+ .Item().Value(56)
+ .Item().Value(57)
+ .EndList()
+ // another_repeated_int64_field
+ .Item()
+ .BeginList()
+ .EndList()
+ // message_field
+ .Item()
+ .BeginList()
+ .Item().Value("key")
+ .Item().Value("value")
+ .EndList()
+ // repeated_message_field
+ .Item()
+ .BeginList()
+ .Item()
+ .BeginList()
+ .Item().Value("key1")
+ .Item().Value("value1")
+ .EndList()
+ .Item()
+ .BeginList()
+ .Item().Value("key2")
+ .Item().Value("value2")
+ .EndList()
+ .EndList()
+ // any_int64_field
+ .Item().Value(45)
+ // any_map_field
+ .Item()
+ .BeginMap()
+ .Item("key").Value("value")
+ .EndMap()
+ // optional_int64_field
+ .Item().Entity()
+ // repeated_optional_any_field
+ .Item()
+ .BeginList()
+ .Item().Value(2)
+ .Item().Entity()
+ .Item().Value("foo")
+ .EndList()
+ // packed_repeated_enum_field
+ .Item()
+ .BeginList()
+ .Item().Value("MinusFortyTwo")
+ .Item().Value("Two")
+ .EndList()
+ // optional_repeated_bool_field
+ .Item()
+ .BeginList()
+ .Item().Value(false)
+ .Item().Value(true)
+ .Item().Value(false)
+ .EndList()
+ // oneof_field
+ .Item()
+ .BeginList()
+ // message_field
+ .Item().Value(2)
+ .Item().BeginList()
+ .Item().Value("foo")
+ .Item().Entity()
+ .EndList()
+ .EndList()
+ // optional_oneof_field
+ .Item()
+ .Entity()
+ // map_field
+ .Item()
+ .BeginList()
+ .Item().BeginList()
+ .Item().Value(13)
+ .Item().BeginList()
+ .Item().Value("bac")
+ .Item().Value("cab")
+ .EndList()
+ .EndList()
+ .Item().BeginList()
+ .Item().Value(15)
+ .Item().BeginList()
+ .Item().Value("ya")
+ .Item().Value("make")
+ .EndList()
+ .EndList()
+ .EndList()
+ .EndList()
+ .ToString();
+
+ auto secondYsonStr = BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value(101)
+ .Item().Value(102)
+ .Item().Value(103)
+ .EndList()
+ .ToString();
+
+ auto repeatedMessageYsonStr = BuildYsonStringFluently()
+ .BeginList()
+ .Item()
+ .BeginList()
+ .Item().Value("key11")
+ .Item().Value("value11")
+ .EndList()
+ .Item()
+ .BeginList()
+ .Item().Value("key21")
+ .Item().Value("value21")
+ .EndList()
+ .EndList()
+ .ToString();
+
+ auto repeatedInt64Yson = BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value(31)
+ .Item().Value(32)
+ .Item().Value(33)
+ .EndList();
+ auto repeatedInt64YsonStr = repeatedInt64Yson.ToString();
+
+ auto anotherRepeatedInt64YsonStr = BuildYsonStringFluently()
+ .BeginList()
+ .EndList()
+ .ToString();
+
+ auto repeatedOptionalAnyYson = BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value(1)
+ .Item().Value("abc")
+ .Item().Entity()
+ .Item().Value(true)
+ .EndList();
+ auto repeatedOptionalAnyYsonStr = repeatedOptionalAnyYson.ToString();
+
+ auto otherComplexFieldYson = BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value(22)
+ .Item().Value(23)
+ .Item().Value(24)
+ .EndList();
+ auto otherComplexFieldYsonStr = otherComplexFieldYson.ToString();
+
+ TUnversionedRowBuilder builder;
+ builder.AddValue(MakeUnversionedCompositeValue(firstYsonStr, firstId));
+ builder.AddValue(MakeUnversionedCompositeValue(secondYsonStr, secondId));
+ builder.AddValue(MakeUnversionedCompositeValue(repeatedMessageYsonStr, repeatedMessageId));
+ builder.AddValue(MakeUnversionedCompositeValue(repeatedInt64YsonStr, repeatedInt64Id));
+ builder.AddValue(MakeUnversionedCompositeValue(anotherRepeatedInt64YsonStr, anotherRepeatedInt64Id));
+ builder.AddValue(MakeUnversionedInt64Value(4321, anyFieldId));
+
+ builder.AddValue(MakeUnversionedInt64Value(-64, int64FieldId));
+ builder.AddValue(MakeUnversionedUint64Value(64, uint64FieldId));
+ builder.AddValue(MakeUnversionedInt64Value(-32, int32FieldId));
+ builder.AddValue(MakeUnversionedUint64Value(32, uint32FieldId));
+
+ builder.AddValue(MakeUnversionedInt64Value(-42, enumIntFieldId));
+ builder.AddValue(MakeUnversionedStringValue("Three", enumStringStringFieldId));
+ builder.AddValue(MakeUnversionedInt64Value(1, enumStringInt64FieldId));
+
+ const auto HelloWorldInRussian = "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xbc\xd0\xb8\xd1\x80!";
+ builder.AddValue(MakeUnversionedStringValue(HelloWorldInRussian, utf8FieldId));
+
+ builder.AddValue(MakeUnversionedCompositeValue(repeatedOptionalAnyYsonStr, repeatedOptionalAnyFieldId));
+
+ builder.AddValue(MakeUnversionedCompositeValue(otherComplexFieldYsonStr, otherComplexFieldId));
+
+ builder.AddValue(MakeUnversionedCompositeValue("[12;-10;123456789000;]", packedRepeatedInt64FieldId));
+
+ builder.AddValue(MakeUnversionedCompositeValue("[1;2;3]", optionalRepeatedInt64FieldId));
+
+ builder.AddValue(MakeUnversionedCompositeValue("[0; foobaz]", oneofFieldId));
+ builder.AddValue(MakeUnversionedNullValue(optionalOneofFieldId));
+
+ builder.AddValue(MakeUnversionedCompositeValue("[[2; [x; y]]; [5; [z; w]]]", mapFieldId));
+
+ auto rows = std::vector<TUnversionedRow>(rowCount, builder.GetRow());
+ EXPECT_EQ(true, writer->Write(rows));
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput input(result);
+ TLenvalParser lenvalParser(&input);
+
+ for (int rowIndex = 0; rowIndex < rowCount; ++rowIndex) {
+ auto entry = lenvalParser.Next();
+ ASSERT_TRUE(entry);
+
+ NYT::TMessageWithStructuredEmbedded message;
+ ASSERT_TRUE(message.ParseFromString(entry->RowData));
+
+ const auto& first = message.first();
+ EXPECT_EQ(first.enum_field(), EEnum::Two);
+ EXPECT_EQ(first.int64_field(), 44);
+ std::vector<i64> firstRepeatedInt64Field(
+ first.repeated_int64_field().begin(),
+ first.repeated_int64_field().end());
+ EXPECT_EQ(firstRepeatedInt64Field, (std::vector<i64>{55, 56, 57}));
+ std::vector<i64> firstAnotherRepeatedInt64Field(
+ first.another_repeated_int64_field().begin(),
+ first.another_repeated_int64_field().end());
+ EXPECT_EQ(firstAnotherRepeatedInt64Field, (std::vector<i64>{}));
+ EXPECT_EQ(first.message_field().key(), "key");
+ EXPECT_EQ(first.message_field().value(), "value");
+ ASSERT_EQ(first.repeated_message_field_size(), 2);
+ EXPECT_EQ(first.repeated_message_field(0).key(), "key1");
+ EXPECT_EQ(first.repeated_message_field(0).value(), "value1");
+ EXPECT_EQ(first.repeated_message_field(1).key(), "key2");
+ EXPECT_EQ(first.repeated_message_field(1).value(), "value2");
+
+ EXPECT_NODES_EQUAL(
+ ConvertToNode(TYsonString(first.any_int64_field())),
+ BuildYsonNodeFluently().Value(45));
+
+ EXPECT_NODES_EQUAL(
+ ConvertToNode(TYsonString(first.any_map_field())),
+ BuildYsonNodeFluently().BeginMap()
+ .Item("key").Value("value")
+ .EndMap());
+
+ std::vector<TYsonString> firstRepeatedOptionalAnyField(
+ first.repeated_optional_any_field().begin(),
+ first.repeated_optional_any_field().end());
+
+ EXPECT_NODES_EQUAL(
+ ConvertToNode(firstRepeatedOptionalAnyField),
+ BuildYsonNodeFluently()
+ .BeginList()
+ .Item().Value(2)
+ .Item().Entity()
+ .Item().Value("foo")
+ .EndList());
+
+ EXPECT_FALSE(first.has_optional_int64_field());
+
+ std::vector<EEnum> actualFirstPackedRepeatedEnumField;
+ for (auto x : first.packed_repeated_enum_field()) {
+ actualFirstPackedRepeatedEnumField.push_back(static_cast<EEnum>(x));
+ }
+ auto expectedFirstPackedRepeatedEnumField = std::vector<EEnum>{EEnum::MinusFortyTwo, EEnum::Two};
+ EXPECT_EQ(expectedFirstPackedRepeatedEnumField, actualFirstPackedRepeatedEnumField);
+
+ std::vector<bool> firstOptionalRepeatedBoolField(
+ first.optional_repeated_bool_field().begin(),
+ first.optional_repeated_bool_field().end());
+ auto expectedFirstOptionalRepeatedBoolField = std::vector<bool>{false, true, false};
+ EXPECT_EQ(expectedFirstOptionalRepeatedBoolField, firstOptionalRepeatedBoolField);
+
+ EXPECT_FALSE(first.has_oneof_string_field_1());
+ EXPECT_FALSE(first.has_oneof_string_field());
+ EXPECT_TRUE(first.has_oneof_message_field());
+ EXPECT_EQ(first.oneof_message_field().key(), "foo");
+ EXPECT_FALSE(first.oneof_message_field().has_value());
+
+ EXPECT_FALSE(first.has_optional_oneof_string_field_1());
+ EXPECT_FALSE(first.has_optional_oneof_string_field());
+ EXPECT_FALSE(first.has_optional_oneof_message_field());
+
+ EXPECT_EQ(std::ssize(first.map_field()), 2);
+ ASSERT_EQ(static_cast<int>(first.map_field().count(13)), 1);
+ EXPECT_EQ(first.map_field().at(13).key(), "bac");
+ EXPECT_EQ(first.map_field().at(13).value(), "cab");
+ ASSERT_EQ(static_cast<int>(first.map_field().count(15)), 1);
+ EXPECT_EQ(first.map_field().at(15).key(), "ya");
+ EXPECT_EQ(first.map_field().at(15).value(), "make");
+
+ const auto& second = message.second();
+ EXPECT_EQ(second.one(), 101);
+ EXPECT_EQ(second.two(), 102);
+ EXPECT_EQ(second.three(), 103);
+
+ ASSERT_EQ(message.repeated_message_field_size(), 2);
+ EXPECT_EQ(message.repeated_message_field(0).key(), "key11");
+ EXPECT_EQ(message.repeated_message_field(0).value(), "value11");
+ EXPECT_EQ(message.repeated_message_field(1).key(), "key21");
+ EXPECT_EQ(message.repeated_message_field(1).value(), "value21");
+
+ std::vector<i64> repeatedInt64Field(
+ message.repeated_int64_field().begin(),
+ message.repeated_int64_field().end());
+ EXPECT_EQ(repeatedInt64Field, (std::vector<i64>{31, 32, 33}));
+
+ std::vector<i64> anotherRepeatedInt64Field(
+ message.another_repeated_int64_field().begin(),
+ message.another_repeated_int64_field().end());
+ EXPECT_EQ(anotherRepeatedInt64Field, (std::vector<i64>{}));
+
+ EXPECT_EQ(message.int64_any_field(), 4321);
+
+ // Note the reversal of 32 <-> 64.
+ EXPECT_EQ(message.int32_field(), -64);
+ EXPECT_EQ(message.uint32_field(), 64u);
+ EXPECT_EQ(message.int64_field(), -32);
+ EXPECT_EQ(message.uint64_field(), 32u);
+
+ EXPECT_EQ(message.enum_int_field(), EEnum::MinusFortyTwo);
+ EXPECT_EQ(message.enum_string_string_field(), EEnum::Three);
+ EXPECT_EQ(message.enum_string_int64_field(), EEnum::One);
+
+ EXPECT_EQ(message.utf8_field(), HelloWorldInRussian);
+
+ std::vector<TYsonString> repeatedOptionalAnyField(
+ message.repeated_optional_any_field().begin(),
+ message.repeated_optional_any_field().end());
+ EXPECT_NODES_EQUAL(ConvertToNode(repeatedOptionalAnyField), ConvertToNode(repeatedOptionalAnyYson));
+
+ {
+ auto otherColumns = ConvertToNode(TYsonString(message.other_columns_field()))->AsMap();
+ auto mode = complexTypeMode;
+ auto expected = ([&] {
+ switch (mode) {
+ case EComplexTypeMode::Named:
+ return BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("one").Value(22)
+ .Item("two").Value(23)
+ .Item("three").Value(24)
+ .EndMap();
+ case EComplexTypeMode::Positional:
+ return ConvertToNode(otherComplexFieldYson);
+ }
+ YT_ABORT();
+ })();
+
+ EXPECT_NODES_EQUAL(expected, otherColumns->GetChildOrThrow("other_complex_field"));
+ }
+
+ std::vector<i64> actualPackedRepeatedInt64Field(
+ message.packed_repeated_int64_field().begin(),
+ message.packed_repeated_int64_field().end());
+ auto expectedPackedRepeatedInt64Field = std::vector<i64>{12, -10, 123456789000LL};
+ EXPECT_EQ(expectedPackedRepeatedInt64Field, actualPackedRepeatedInt64Field);
+
+ std::vector<i64> actualOptionalRepeatedInt64Field(
+ message.optional_repeated_int64_field().begin(),
+ message.optional_repeated_int64_field().end());
+ auto expectedOptionalRepeatedInt64Field = std::vector<i64>{1, 2, 3};
+ EXPECT_EQ(expectedOptionalRepeatedInt64Field, actualOptionalRepeatedInt64Field);
+
+ EXPECT_TRUE(message.has_oneof_string_field_1());
+ EXPECT_EQ(message.oneof_string_field_1(), "foobaz");
+ EXPECT_FALSE(message.has_oneof_string_field());
+ EXPECT_FALSE(message.has_oneof_message_field());
+
+ EXPECT_FALSE(message.has_optional_oneof_string_field_1());
+ EXPECT_FALSE(message.has_optional_oneof_string_field());
+ EXPECT_FALSE(message.has_optional_oneof_message_field());
+
+ EXPECT_EQ(std::ssize(message.map_field()), 2);
+ ASSERT_EQ(static_cast<int>(message.map_field().count(2)), 1);
+ EXPECT_EQ(message.map_field().at(2).key(), "x");
+ EXPECT_EQ(message.map_field().at(2).value(), "y");
+ ASSERT_EQ(static_cast<int>(message.map_field().count(5)), 1);
+ EXPECT_EQ(message.map_field().at(5).key(), "z");
+ EXPECT_EQ(message.map_field().at(5).value(), "w");
+ }
+
+ ASSERT_FALSE(lenvalParser.Next());
+}
+
+INodePtr SortMapByKey(const INodePtr& node)
+{
+ auto keyValuePairs = ConvertTo<std::vector<std::pair<i64, INodePtr>>>(node);
+ std::sort(std::begin(keyValuePairs), std::end(keyValuePairs));
+ return ConvertTo<INodePtr>(keyValuePairs);
+}
+
+TEST_P(TProtobufFormatStructuredMessage, EmbeddedParse)
+{
+ auto [complexTypeMode, rowCount, protoFormatType] = GetParam();
+
+ auto schema = BuildEmbeddedSchema();
+ auto config = BuildEmbeddedConfig(complexTypeMode, protoFormatType);
+
+ NYT::TEmbeddingMessage message;
+
+ message.set_num(789);
+ auto* t1 = message.mutable_t1();
+ t1->set_embedded_num(123);
+ auto* t2 = t1->mutable_t2();
+ t2->set_embedded2_num(456);
+ t1->set_uint_variant(555);
+ t2->add_embedded2_repeated("a");
+ t2->add_embedded2_repeated("b");
+ t2->add_embedded2_repeated("c");
+ auto* embedded2_struct = t2->mutable_embedded2_struct();
+ embedded2_struct->set_float1(1.5f);
+ embedded2_struct->set_string1("abc");
+
+ //message.set_extra_field("*");
+ //t1->set_embedded_extra_field("*");
+
+ auto rowCollector = ParseRows(message, config, schema, rowCount);
+ for (int rowIndex = 0; rowIndex < rowCount; ++rowIndex) {
+ EXPECT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "num")), 789u);
+ EXPECT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "embedded_num")), 123u);
+ EXPECT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "embedded2_num")), 456u);
+ EXPECT_NODES_EQUAL(
+ GetComposite(rowCollector.GetRowValue(rowIndex, "variant")),
+ ConvertToNode(TYsonString(TStringBuf("[1; 555u]"))));
+
+ auto embedded2_repeatedNode = GetComposite(rowCollector.GetRowValue(rowIndex, "embedded2_repeated"));
+ ASSERT_EQ(embedded2_repeatedNode->GetType(), ENodeType::List);
+ const auto& embedded2_repeatedList = embedded2_repeatedNode->AsList();
+ ASSERT_EQ(embedded2_repeatedList->GetChildCount(), 3);
+ EXPECT_EQ(embedded2_repeatedList->GetChildValueOrThrow<TString>(0), "a");
+ EXPECT_EQ(embedded2_repeatedList->GetChildValueOrThrow<TString>(1), "b");
+ EXPECT_EQ(embedded2_repeatedList->GetChildValueOrThrow<TString>(2), "c");
+
+ auto embedded2_structNode = GetComposite(rowCollector.GetRowValue(rowIndex, "embedded2_struct"));
+ ASSERT_EQ(embedded2_structNode->GetType(), ENodeType::List);
+ const auto& embedded2_structList = embedded2_structNode->AsList();
+ ASSERT_EQ(embedded2_structList->GetChildCount(), 2);
+ EXPECT_EQ(embedded2_structList->GetChildValueOrThrow<double>(0), 1.5f);
+ EXPECT_EQ(embedded2_structList->GetChildValueOrThrow<TString>(1), "abc");
+ }
+}
+
+TEST_P(TProtobufFormatStructuredMessage, Parse)
+{
+ auto [complexTypeMode, rowCount, protoFormatType] = GetParam();
+
+ auto schema = CreateSchemaWithStructuredMessage();
+ auto config = CreateConfigWithStructuredMessage(complexTypeMode, protoFormatType);
+
+ NYT::TMessageWithStructuredEmbedded message;
+
+ auto* first = message.mutable_first();
+ first->set_enum_field(EEnum::Two);
+ first->set_int64_field(44);
+
+ first->add_repeated_int64_field(55);
+ first->add_repeated_int64_field(56);
+ first->add_repeated_int64_field(57);
+
+ // another_repeated_int64_field is intentionally empty.
+
+ first->mutable_message_field()->set_key("key");
+ first->mutable_message_field()->set_value("value");
+ auto* firstSubfield1 = first->add_repeated_message_field();
+ firstSubfield1->set_key("key1");
+ firstSubfield1->set_value("value1");
+ auto* firstSubfield2 = first->add_repeated_message_field();
+ firstSubfield2->set_key("key2");
+ firstSubfield2->set_value("value2");
+
+ first->set_any_int64_field(BuildYsonStringFluently().Value(4422).ToString());
+ first->set_any_map_field(
+ BuildYsonStringFluently()
+ .BeginMap()
+ .Item("key").Value("value")
+ .EndMap()
+ .ToString());
+
+ first->add_repeated_optional_any_field("%false");
+ first->add_repeated_optional_any_field("42");
+ first->add_repeated_optional_any_field("#");
+
+ first->add_packed_repeated_enum_field(EEnum::MaxInt32);
+ first->add_packed_repeated_enum_field(EEnum::MinusFortyTwo);
+
+ // optional_repeated_bool_field is intentionally empty.
+
+ first->mutable_oneof_message_field()->set_key("KEY");
+
+ // optional_oneof_field is intentionally empty.
+
+ (*first->mutable_map_field())[111].set_key("key111");
+ (*first->mutable_map_field())[111].set_value("value111");
+ (*first->mutable_map_field())[222].set_key("key222");
+ (*first->mutable_map_field())[222].set_value("value222");
+
+ auto* second = message.mutable_second();
+ second->set_one(101);
+ second->set_two(102);
+ second->set_three(103);
+
+ message.add_repeated_int64_field(31);
+ message.add_repeated_int64_field(32);
+ message.add_repeated_int64_field(33);
+
+ // another_repeated_int64_field is intentionally empty.
+
+ auto* subfield1 = message.add_repeated_message_field();
+ subfield1->set_key("key11");
+ subfield1->set_value("value11");
+ auto* subfield2 = message.add_repeated_message_field();
+ subfield2->set_key("key21");
+ subfield2->set_value("value21");
+
+ message.set_int64_any_field(4321);
+
+ // Note the reversal of 32 <-> 64.
+ message.set_int64_field(-32);
+ message.set_uint64_field(32);
+ message.set_int32_field(-64);
+ message.set_uint32_field(64);
+
+ // Note that we don't set the "enum_string_int64_field" as it would fail during parsing.
+ message.set_enum_int_field(EEnum::MinusFortyTwo);
+ message.set_enum_string_string_field(EEnum::Three);
+
+ const auto HelloWorldInChinese = "\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c";
+ message.set_utf8_field(HelloWorldInChinese);
+
+ message.add_repeated_optional_any_field("#");
+ message.add_repeated_optional_any_field("1");
+ message.add_repeated_optional_any_field("\"qwe\"");
+ message.add_repeated_optional_any_field("%true");
+
+ auto otherComplexFieldPositional = BuildYsonNodeFluently()
+ .BeginList()
+ .Item().Value(301)
+ .Item().Value(302)
+ .Item().Value(303)
+ .EndList();
+
+ auto mode = complexTypeMode;
+ auto otherComplexField = ([&] {
+ switch (mode) {
+ case EComplexTypeMode::Named:
+ return BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("one").Value(301)
+ .Item("two").Value(302)
+ .Item("three").Value(303)
+ .EndMap();
+ case EComplexTypeMode::Positional:
+ return otherComplexFieldPositional;
+ }
+ YT_ABORT();
+ })();
+ auto otherColumnsYson = BuildYsonStringFluently()
+ .BeginMap()
+ .Item("other_complex_field").Value(otherComplexField)
+ .EndMap();
+ message.set_other_columns_field(otherColumnsYson.ToString());
+
+ message.add_packed_repeated_int64_field(-123456789000LL);
+ message.add_packed_repeated_int64_field(0);
+
+ message.add_optional_repeated_int64_field(-4242);
+
+ // optional_oneof_field is intentionally empty.
+
+ message.set_oneof_string_field("spam");
+
+ (*message.mutable_map_field())[777].set_key("key777");
+ (*message.mutable_map_field())[777].set_value("value777");
+ (*message.mutable_map_field())[888].set_key("key888");
+ (*message.mutable_map_field())[888].set_value("value888");
+
+ auto rowCollector = ParseRows(message, config, schema, rowCount);
+ for (int rowIndex = 0; rowIndex < rowCount; ++rowIndex) {
+ auto firstNode = GetComposite(rowCollector.GetRowValue(rowIndex, "first"));
+ ASSERT_EQ(firstNode->GetType(), ENodeType::List);
+ const auto& firstList = firstNode->AsList();
+ ASSERT_EQ(firstList->GetChildCount(), 17);
+
+ EXPECT_EQ(firstList->GetChildOrThrow(0)->GetType(), ENodeType::Entity);
+ EXPECT_EQ(firstList->GetChildValueOrThrow<TString>(1), "Two");
+ EXPECT_EQ(firstList->GetChildValueOrThrow<i64>(2), 44);
+
+ ASSERT_EQ(firstList->GetChildOrThrow(3)->GetType(), ENodeType::List);
+ EXPECT_EQ(ConvertTo<std::vector<i64>>(firstList->GetChildOrThrow(3)), (std::vector<i64>{55, 56, 57}));
+
+ ASSERT_EQ(firstList->GetChildOrThrow(4)->GetType(), ENodeType::List);
+ EXPECT_EQ(ConvertTo<std::vector<i64>>(firstList->GetChildOrThrow(4)), (std::vector<i64>{}));
+
+ ASSERT_EQ(firstList->GetChildOrThrow(5)->GetType(), ENodeType::List);
+ EXPECT_EQ(firstList->GetChildOrThrow(5)->AsList()->GetChildValueOrThrow<TString>(0), "key");
+ EXPECT_EQ(firstList->GetChildOrThrow(5)->AsList()->GetChildValueOrThrow<TString>(1), "value");
+
+ ASSERT_EQ(firstList->GetChildOrThrow(6)->GetType(), ENodeType::List);
+ ASSERT_EQ(firstList->GetChildOrThrow(6)->AsList()->GetChildCount(), 2);
+
+ const auto& firstSubNode1 = firstList->GetChildOrThrow(6)->AsList()->GetChildOrThrow(0);
+ ASSERT_EQ(firstSubNode1->GetType(), ENodeType::List);
+ ASSERT_EQ(firstSubNode1->AsList()->GetChildCount(), 2);
+ EXPECT_EQ(firstSubNode1->AsList()->GetChildValueOrThrow<TString>(0), "key1");
+ EXPECT_EQ(firstSubNode1->AsList()->GetChildValueOrThrow<TString>(1), "value1");
+
+ const auto& firstSubNode2 = firstList->GetChildOrThrow(6)->AsList()->GetChildOrThrow(1);
+ ASSERT_EQ(firstSubNode2->GetType(), ENodeType::List);
+ ASSERT_EQ(firstSubNode2->AsList()->GetChildCount(), 2);
+ EXPECT_EQ(firstSubNode2->AsList()->GetChildValueOrThrow<TString>(0), "key2");
+ EXPECT_EQ(firstSubNode2->AsList()->GetChildValueOrThrow<TString>(1), "value2");
+
+ ASSERT_EQ(firstList->GetChildOrThrow(7)->GetType(), ENodeType::Int64);
+ EXPECT_EQ(firstList->GetChildValueOrThrow<i64>(7), 4422);
+
+ ASSERT_EQ(firstList->GetChildOrThrow(8)->GetType(), ENodeType::Map);
+ EXPECT_NODES_EQUAL(
+ firstList->GetChildOrThrow(8),
+ BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("key").Value("value")
+ .EndMap());
+
+ ASSERT_EQ(firstList->GetChildOrThrow(9)->GetType(), ENodeType::Entity);
+
+ EXPECT_NODES_EQUAL(
+ firstList->GetChildOrThrow(10),
+ BuildYsonNodeFluently()
+ .BeginList()
+ .Item().Value(false)
+ .Item().Value(42)
+ .Item().Entity()
+ .EndList());
+
+ EXPECT_NODES_EQUAL(
+ firstList->GetChildOrThrow(11),
+ BuildYsonNodeFluently()
+ .BeginList()
+ .Item().Value("MaxInt32")
+ .Item().Value("MinusFortyTwo")
+ .EndList());
+
+ // optional_repeated_bool_field.
+ ASSERT_EQ(firstList->GetChildOrThrow(12)->GetType(), ENodeType::Entity);
+
+ // oneof_field.
+ EXPECT_NODES_EQUAL(
+ firstList->GetChildOrThrow(13),
+ BuildYsonNodeFluently()
+ .BeginList()
+ .Item().Value(2)
+ .Item().BeginList()
+ .Item().Value("KEY")
+ .Item().Entity()
+ .EndList()
+ .EndList());
+
+ // optional_oneof_field.
+ ASSERT_EQ(firstList->GetChildOrThrow(14)->GetType(), ENodeType::Entity);
+
+ // map_field.
+ EXPECT_NODES_EQUAL(
+ SortMapByKey(firstList->GetChildOrThrow(15)),
+ BuildYsonNodeFluently()
+ .BeginList()
+ .Item().BeginList()
+ .Item().Value(111)
+ .Item().BeginList()
+ .Item().Value("key111")
+ .Item().Value("value111")
+ .EndList()
+ .EndList()
+ .Item().BeginList()
+ .Item().Value(222)
+ .Item().BeginList()
+ .Item().Value("key222")
+ .Item().Value("value222")
+ .EndList()
+ .EndList()
+ .EndList());
+
+ // field_missing_from_proto2.
+ ASSERT_EQ(firstList->GetChildOrThrow(16)->GetType(), ENodeType::Entity);
+
+ auto secondNode = GetComposite(rowCollector.GetRowValue(rowIndex, "second"));
+ ASSERT_EQ(secondNode->GetType(), ENodeType::List);
+ EXPECT_EQ(ConvertTo<std::vector<i64>>(secondNode), (std::vector<i64>{101, 102, 103}));
+
+ auto repeatedMessageNode = GetComposite(rowCollector.GetRowValue(rowIndex, "repeated_message_field"));
+ ASSERT_EQ(repeatedMessageNode->GetType(), ENodeType::List);
+ ASSERT_EQ(repeatedMessageNode->AsList()->GetChildCount(), 2);
+
+ const auto& subNode1 = repeatedMessageNode->AsList()->GetChildOrThrow(0);
+ ASSERT_EQ(subNode1->GetType(), ENodeType::List);
+ ASSERT_EQ(subNode1->AsList()->GetChildCount(), 2);
+ EXPECT_EQ(subNode1->AsList()->GetChildValueOrThrow<TString>(0), "key11");
+ EXPECT_EQ(subNode1->AsList()->GetChildValueOrThrow<TString>(1), "value11");
+
+ const auto& subNode2 = repeatedMessageNode->AsList()->GetChildOrThrow(1);
+ ASSERT_EQ(subNode2->GetType(), ENodeType::List);
+ ASSERT_EQ(subNode2->AsList()->GetChildCount(), 2);
+ EXPECT_EQ(subNode2->AsList()->GetChildValueOrThrow<TString>(0), "key21");
+ EXPECT_EQ(subNode2->AsList()->GetChildValueOrThrow<TString>(1), "value21");
+
+ auto repeatedInt64Node = GetComposite(rowCollector.GetRowValue(rowIndex, "repeated_int64_field"));
+ EXPECT_EQ(ConvertTo<std::vector<i64>>(repeatedInt64Node), (std::vector<i64>{31, 32, 33}));
+
+ auto anotherRepeatedInt64Node = GetComposite(rowCollector.GetRowValue(rowIndex, "another_repeated_int64_field"));
+ EXPECT_EQ(ConvertTo<std::vector<i64>>(anotherRepeatedInt64Node), (std::vector<i64>{}));
+
+ auto anyValue = rowCollector.GetRowValue(rowIndex, "any_field");
+ ASSERT_EQ(anyValue.Type, EValueType::Int64);
+ EXPECT_EQ(anyValue.Data.Int64, 4321);
+
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "int64_field")), -64);
+ EXPECT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "uint64_field")), 64u);
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "int32_field")), -32);
+ EXPECT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "uint32_field")), 32u);
+
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "enum_int_field")), -42);
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(rowIndex, "enum_string_string_field")), "Three");
+
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(rowIndex, "utf8_field")), HelloWorldInChinese);
+
+ auto repeatedRepeatedOptionalAnyNode = GetComposite(rowCollector.GetRowValue(rowIndex, "repeated_optional_any_field"));
+ auto expectedRepeatedOptionalAnyNode = BuildYsonNodeFluently()
+ .BeginList()
+ .Item().Entity()
+ .Item().Value(1)
+ .Item().Value("qwe")
+ .Item().Value(true)
+ .EndList();
+ EXPECT_NODES_EQUAL(repeatedRepeatedOptionalAnyNode, expectedRepeatedOptionalAnyNode);
+
+ auto actualOtherComplexField = GetComposite(rowCollector.GetRowValue(rowIndex, "other_complex_field"));
+ EXPECT_NODES_EQUAL(actualOtherComplexField, otherComplexFieldPositional);
+
+ EXPECT_NODES_EQUAL(
+ GetComposite(rowCollector.GetRowValue(rowIndex, "packed_repeated_int64_field")),
+ ConvertToNode(TYsonString(TStringBuf("[-123456789000;0]"))));
+
+ EXPECT_NODES_EQUAL(
+ GetComposite(rowCollector.GetRowValue(rowIndex, "optional_repeated_int64_field")),
+ ConvertToNode(TYsonString(TStringBuf("[-4242]"))));
+
+ EXPECT_NODES_EQUAL(
+ GetComposite(rowCollector.GetRowValue(rowIndex, "oneof_field")),
+ ConvertToNode(TYsonString(TStringBuf("[1; \"spam\"]"))));
+
+ EXPECT_FALSE(rowCollector.FindRowValue(rowIndex, "optional_oneof_field"));
+
+ // map_field.
+ EXPECT_NODES_EQUAL(
+ SortMapByKey(GetComposite(rowCollector.GetRowValue(rowIndex, "map_field"))),
+ ConvertToNode(TYsonString(TStringBuf("[[777; [key777; value777]]; [888; [key888; value888]]]"))));
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+std::vector<TTableSchemaPtr> CreateSeveralTablesSchemas()
+{
+ return {
+ New<TTableSchema>(std::vector<TColumnSchema>{
+ {"embedded", StructLogicalType({
+ {"enum_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"int64_field", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ })},
+ {"repeated_int64_field", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ {"any_field", SimpleLogicalType(ESimpleLogicalValueType::Any)},
+ }),
+ New<TTableSchema>(std::vector<TColumnSchema>{
+ {"enum_field", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"int64_field", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ }),
+ // Empty schema.
+ New<TTableSchema>(),
+ };
+}
+
+INodePtr CreateSeveralTablesConfig(EProtoFormatType protoFormatType)
+{
+ if (protoFormatType == EProtoFormatType::FileDescriptor) {
+ return CreateFileDescriptorConfig<TSeveralTablesMessageFirst, TSeveralTablesMessageSecond, TSeveralTablesMessageThird>();
+ }
+ YT_VERIFY(protoFormatType == EProtoFormatType::Structured);
+
+ return BuildYsonNodeFluently()
+ .BeginAttributes()
+ .Item("enumerations").Value(EnumerationsConfig)
+ .Item("tables")
+ .BeginList()
+ // Table #1.
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("embedded")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("enum_field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("enum_string")
+ .Item("enumeration_name").Value("EEnum")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("repeated_int64_field")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .Item("repeated").Value(true)
+ .EndMap()
+ .Item()
+ .BeginMap()
+ // In schema it is of type "any".
+ .Item("name").Value("any_field")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+
+ // Table #2.
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("enum_field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("enum_string")
+ .Item("enumeration_name").Value("EEnum")
+ .EndMap()
+ .EndList()
+ .EndMap()
+
+ // Table #3.
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("string_field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndAttributes()
+ .Value("protobuf");
+}
+
+using TProtobufFormatSeveralTablesParam = std::tuple<EProtoFormatType>;
+
+class TProtobufFormatSeveralTables
+ : public ::testing::TestWithParam<TProtobufFormatSeveralTablesParam>
+{ };
+
+INSTANTIATE_TEST_SUITE_P(
+ FileDescriptor,
+ TProtobufFormatSeveralTables,
+ ::testing::Values(TProtobufFormatSeveralTablesParam{
+ EProtoFormatType::FileDescriptor}));
+
+INSTANTIATE_TEST_SUITE_P(
+ Structured,
+ TProtobufFormatSeveralTables,
+ ::testing::Values(TProtobufFormatSeveralTablesParam{
+ EProtoFormatType::Structured}));
+
+TEST_P(TProtobufFormatSeveralTables, Write)
+{
+ auto [protoFormatType] = GetParam();
+
+ auto schemas = CreateSeveralTablesSchemas();
+ auto configNode = CreateSeveralTablesConfig(protoFormatType);
+
+ auto config = ConvertTo<TProtobufFormatConfigPtr>(configNode->Attributes().ToMap());
+
+ auto nameTable = New<TNameTable>();
+ auto embeddedId = nameTable->RegisterName("embedded");
+ auto anyFieldId = nameTable->RegisterName("any_field");
+ auto int64FieldId = nameTable->RegisterName("int64_field");
+ auto repeatedInt64Id = nameTable->RegisterName("repeated_int64_field");
+ auto enumFieldId = nameTable->RegisterName("enum_field");
+ auto stringFieldId = nameTable->RegisterName("string_field");
+ auto tableIndexId = nameTable->RegisterName(TableIndexColumnName);
+
+ TString result;
+ TStringOutput resultStream(result);
+ auto controlAttributesConfig = New<TControlAttributesConfig>();
+ controlAttributesConfig->EnableTableIndex = true;
+ controlAttributesConfig->EnableEndOfStream = true;
+ auto writer = CreateWriterForProtobuf(
+ std::move(config),
+ schemas,
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ std::move(controlAttributesConfig),
+ 0);
+
+ auto embeddedYson = BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value("Two")
+ .Item().Value(44)
+ .EndList()
+ .ToString();
+
+ auto repeatedInt64Yson = ConvertToYsonString(std::vector<i64>{31, 32, 33}).ToString();
+
+ {
+ TUnversionedRowBuilder builder;
+ builder.AddValue(MakeUnversionedCompositeValue(embeddedYson, embeddedId));
+ builder.AddValue(MakeUnversionedCompositeValue(repeatedInt64Yson, repeatedInt64Id));
+ builder.AddValue(MakeUnversionedInt64Value(4321, anyFieldId));
+ EXPECT_EQ(true, writer->Write({builder.GetRow()}));
+ }
+ {
+ TUnversionedRowBuilder builder;
+ builder.AddValue(MakeUnversionedStringValue("Two", enumFieldId));
+ builder.AddValue(MakeUnversionedInt64Value(999, int64FieldId));
+ builder.AddValue(MakeUnversionedInt64Value(1, tableIndexId));
+ EXPECT_EQ(true, writer->Write({builder.GetRow()}));
+ }
+ {
+ TUnversionedRowBuilder builder;
+ builder.AddValue(MakeUnversionedStringValue("blah", stringFieldId));
+ builder.AddValue(MakeUnversionedInt64Value(2, tableIndexId));
+ EXPECT_EQ(true, writer->Write({builder.GetRow()}));
+ }
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput input(result);
+ TLenvalParser lenvalParser(&input);
+
+ {
+ auto entry = lenvalParser.Next();
+ ASSERT_TRUE(entry);
+
+ NYT::TSeveralTablesMessageFirst message;
+ ASSERT_TRUE(message.ParseFromString(entry->RowData));
+
+ const auto& embedded = message.embedded();
+ EXPECT_EQ(embedded.enum_field(), EEnum::Two);
+ EXPECT_EQ(embedded.int64_field(), 44);
+
+ std::vector<i64> repeatedInt64Field(
+ message.repeated_int64_field().begin(),
+ message.repeated_int64_field().end());
+ EXPECT_EQ(repeatedInt64Field, (std::vector<i64>{31, 32, 33}));
+ EXPECT_EQ(message.int64_field(), 4321);
+ }
+ {
+ auto entry = lenvalParser.Next();
+ ASSERT_TRUE(entry);
+
+ NYT::TSeveralTablesMessageSecond message;
+ ASSERT_TRUE(message.ParseFromString(entry->RowData));
+
+ EXPECT_EQ(message.enum_field(), EEnum::Two);
+ EXPECT_EQ(message.int64_field(), 999);
+ }
+ {
+ auto entry = lenvalParser.Next();
+ ASSERT_TRUE(entry);
+
+ NYT::TSeveralTablesMessageThird message;
+ ASSERT_TRUE(message.ParseFromString(entry->RowData));
+
+ EXPECT_EQ(message.string_field(), "blah");
+ }
+ ASSERT_FALSE(lenvalParser.IsEndOfStream());
+ ASSERT_FALSE(lenvalParser.Next());
+ ASSERT_TRUE(lenvalParser.IsEndOfStream());
+ ASSERT_FALSE(lenvalParser.Next());
+}
+
+TEST_P(TProtobufFormatSeveralTables, Parse)
+{
+ auto [protoFormatType] = GetParam();
+
+ auto schemas = CreateSeveralTablesSchemas();
+ auto configNode = CreateSeveralTablesConfig(protoFormatType);
+ auto config = ConvertTo<TProtobufFormatConfigPtr>(configNode->Attributes().ToMap());
+
+ std::vector<TCollectingValueConsumer> rowCollectors;
+ std::vector<std::unique_ptr<IParser>> parsers;
+ for (const auto& schema : schemas) {
+ rowCollectors.emplace_back(schema);
+ }
+ for (int tableIndex = 0; tableIndex < static_cast<int>(schemas.size()); ++tableIndex) {
+ parsers.push_back(CreateParserForProtobuf(
+ &rowCollectors[tableIndex],
+ config,
+ tableIndex));
+ }
+
+ NYT::TSeveralTablesMessageFirst firstMessage;
+ auto* embedded = firstMessage.mutable_embedded();
+ embedded->set_enum_field(EEnum::Two);
+ embedded->set_int64_field(44);
+
+ firstMessage.add_repeated_int64_field(55);
+ firstMessage.add_repeated_int64_field(56);
+ firstMessage.add_repeated_int64_field(57);
+
+ firstMessage.set_int64_field(4444);
+
+ NYT::TSeveralTablesMessageSecond secondMessage;
+ secondMessage.set_enum_field(EEnum::Two);
+ secondMessage.set_int64_field(44);
+
+ NYT::TSeveralTablesMessageThird thirdMessage;
+ thirdMessage.set_string_field("blah");
+
+ auto parse = [] (auto& parser, const auto& message) {
+ TString lenvalBytes;
+ {
+ TStringOutput out(lenvalBytes);
+ auto messageSize = static_cast<ui32>(message.ByteSizeLong());
+ out.Write(&messageSize, sizeof(messageSize));
+ ASSERT_TRUE(message.SerializeToArcadiaStream(&out));
+ }
+ parser->Read(lenvalBytes);
+ parser->Finish();
+ };
+
+ parse(parsers[0], firstMessage);
+ parse(parsers[1], secondMessage);
+ parse(parsers[2], thirdMessage);
+
+ {
+ const auto& rowCollector = rowCollectors[0];
+ ASSERT_EQ(static_cast<int>(rowCollector.Size()), 1);
+
+ auto embeddedNode = GetComposite(rowCollector.GetRowValue(0, "embedded"));
+ ASSERT_EQ(ConvertToTextYson(embeddedNode), "[\"Two\";44;]");
+
+ auto repeatedInt64Node = GetComposite(rowCollector.GetRowValue(0, "repeated_int64_field"));
+ ASSERT_EQ(ConvertToTextYson(repeatedInt64Node), "[55;56;57;]");
+
+ auto int64Field = GetInt64(rowCollector.GetRowValue(0, "any_field"));
+ EXPECT_EQ(int64Field, 4444);
+ }
+
+ {
+ const auto& rowCollector = rowCollectors[1];
+ ASSERT_EQ(static_cast<int>(rowCollector.Size()), 1);
+
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(0, "enum_field")), "Two");
+ EXPECT_EQ(GetInt64(rowCollector.GetRowValue(0, "int64_field")), 44);
+ }
+
+ {
+ const auto& rowCollector = rowCollectors[2];
+ ASSERT_EQ(static_cast<int>(rowCollector.Size()), 1);
+
+ EXPECT_EQ(GetString(rowCollector.GetRowValue(0, "string_field")), "blah");
+ }
+}
+
+TEST(TProtobufFormat, SchemaConfigMismatch)
+{
+ auto createParser = [] (const TTableSchemaPtr& schema, const INodePtr& configNode) {
+ TCollectingValueConsumer rowCollector(schema);
+ return CreateParserForProtobuf(
+ &rowCollector,
+ ConvertTo<TProtobufFormatConfigPtr>(configNode),
+ 0);
+ };
+ auto createSeveralTableWriter = [] (const std::vector<TTableSchemaPtr>& schemas, const INodePtr& configNode) {
+ TString result;
+ TStringOutput resultStream(result);
+ return CreateWriterForProtobuf(
+ ConvertTo<TProtobufFormatConfigPtr>(configNode),
+ schemas,
+ New<TNameTable>(),
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+ };
+ auto createWriter = [&] (const TTableSchemaPtr& schema, const INodePtr& configNode) {
+ createSeveralTableWriter({schema}, configNode);
+ };
+
+ auto schema_struct_with_int64 = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"struct", StructLogicalType({
+ {"int64_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ })},
+ });
+
+ auto schema_struct_with_uint64 = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"struct", StructLogicalType({
+ {"int64_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Uint64))},
+ })},
+ });
+
+ auto config_struct_with_int64 = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("struct")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(2)
+ // Wrong type.
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ // OK.
+ EXPECT_NO_THROW(createParser(schema_struct_with_int64, config_struct_with_int64));
+ EXPECT_NO_THROW(createWriter(schema_struct_with_int64, config_struct_with_int64));
+
+ // Types mismatch.
+ EXPECT_THROW_WITH_SUBSTRING(
+ createParser(schema_struct_with_uint64, config_struct_with_int64),
+ "signedness of both types must be the same");
+ EXPECT_THROW_WITH_SUBSTRING(
+ createWriter(schema_struct_with_uint64, config_struct_with_int64),
+ "signedness of both types must be the same");
+
+ // No schema for structured field is Ok.
+ EXPECT_NO_THROW(createParser(New<TTableSchema>(), config_struct_with_int64));
+ EXPECT_NO_THROW(createWriter(New<TTableSchema>(), config_struct_with_int64));
+
+ auto schema_list_int64 = New<TTableSchema>(std::vector<TColumnSchema>{
+ {
+ "repeated",
+ ListLogicalType(
+ SimpleLogicalType(ESimpleLogicalValueType::Int64)),
+ },
+ });
+
+ auto schema_list_optional_int64 = New<TTableSchema>(std::vector<TColumnSchema>{
+ {
+ "repeated",
+ ListLogicalType(
+ OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))),
+ },
+ });
+
+ auto config_repeated_int64 = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("repeated")
+ .Item("field_number").Value(1)
+ .Item("repeated").Value(true)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ // OK.
+ EXPECT_NO_THROW(createParser(schema_list_int64, config_repeated_int64));
+ EXPECT_NO_THROW(createWriter(schema_list_int64, config_repeated_int64));
+
+ // No schema for repeated field is Ok.
+ EXPECT_NO_THROW(createParser(New<TTableSchema>(), config_repeated_int64));
+ EXPECT_NO_THROW(createWriter(New<TTableSchema>(), config_repeated_int64));
+
+ // List of optional is not allowed.
+ EXPECT_THROW_WITH_SUBSTRING(
+ createParser(schema_list_optional_int64, config_repeated_int64),
+ "unexpected logical metatype \"optional\"");
+ EXPECT_THROW_WITH_SUBSTRING(
+ createWriter(schema_list_optional_int64, config_repeated_int64),
+ "unexpected logical metatype \"optional\"");
+
+ auto schema_optional_list_int64 = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"repeated", OptionalLogicalType(
+ ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64)))},
+ });
+
+ // Optional list is OK.
+ EXPECT_NO_THROW(createParser(schema_optional_list_int64, config_repeated_int64));
+ EXPECT_NO_THROW(createWriter(schema_optional_list_int64, config_repeated_int64));
+
+ auto schema_optional_optional_int64 = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"field", OptionalLogicalType(
+ OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64)))},
+ });
+
+ auto config_int64 = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ // Optional of optional is not allowed.
+ EXPECT_THROW_WITH_SUBSTRING(
+ createParser(schema_optional_optional_int64, config_int64),
+ "unexpected logical metatype \"optional\"");
+ EXPECT_THROW_WITH_SUBSTRING(
+ createWriter(schema_optional_optional_int64, config_int64),
+ "unexpected logical metatype \"optional\"");
+
+ auto schema_struct_with_both = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"struct", StructLogicalType({
+ {"required_field", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"optional_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ })},
+ });
+
+ auto config_struct_with_required = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("struct")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("required_field")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto config_struct_with_optional = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("struct")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("optional_field")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ auto config_struct_with_unknown = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("struct")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("required_field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("optional_field")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("unknown_field")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ // Schema has more fields, non-optional field is missing in protobuf config.
+ // Parser should fail.
+ EXPECT_THROW_WITH_SUBSTRING(
+ createParser(schema_struct_with_both, config_struct_with_optional),
+ "non-optional field \"required_field\" in schema is missing from protobuf config");
+ // Writer feels OK.
+ EXPECT_NO_THROW(createWriter(schema_struct_with_both, config_struct_with_optional));
+
+ // Schema has more fields, optional field is missing in protobuf config.
+ // It's OK for both the writer and the parser.
+ EXPECT_NO_THROW(createParser(schema_struct_with_both, config_struct_with_required));
+ EXPECT_NO_THROW(createWriter(schema_struct_with_both, config_struct_with_required));
+
+ // Protobuf config has more fields, it is always OK.
+ EXPECT_NO_THROW(createParser(schema_struct_with_both, config_struct_with_unknown));
+ EXPECT_NO_THROW(createWriter(schema_struct_with_both, config_struct_with_unknown));
+
+ auto schema_int64 = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"int64_field", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ });
+
+ auto config_two_tables = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("int64_field")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ EXPECT_NO_THROW(createWriter(schema_int64, config_two_tables));
+ EXPECT_THROW_WITH_SUBSTRING(
+ createSeveralTableWriter({schema_int64, schema_int64, schema_int64}, config_two_tables),
+ "Number of schemas is greater than number of tables in protobuf config: 3 > 2");
+
+ auto schema_variant_with_int = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"variant", VariantStructLogicalType({
+ {"a", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ })},
+ });
+ auto schema_variant_with_optional_int = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"variant", VariantStructLogicalType({
+ {"a", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ })},
+ });
+
+ auto config_with_oneof = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("tables")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("columns")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("variant")
+ .Item("proto_type").Value("oneof")
+ .Item("fields").BeginList()
+ .Item()
+ .BeginMap()
+ .Item("name").Value("a")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap();
+
+ // Oneof fields require schematized columns.
+ EXPECT_THROW_WITH_SUBSTRING(
+ createParser(New<TTableSchema>(), config_with_oneof),
+ "requires a corresponding schematized column");
+ EXPECT_THROW_WITH_SUBSTRING(
+ createWriter(New<TTableSchema>(), config_with_oneof),
+ "requires a corresponding schematized column");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ createParser(schema_variant_with_optional_int, config_with_oneof),
+ "Optional variant field \"variant.a\"");
+ EXPECT_THROW_WITH_SUBSTRING(
+ createWriter(schema_variant_with_optional_int, config_with_oneof),
+ "Optional variant field \"variant.a\"");
+ EXPECT_NO_THROW(createParser(schema_variant_with_int, config_with_oneof));
+ EXPECT_NO_THROW(createWriter(schema_variant_with_int, config_with_oneof));
+}
+
+TEST(TProtobufFormat, MultipleOtherColumns)
+{
+ auto nameTable = New<TNameTable>();
+
+ TString data;
+ TStringOutput resultStream(data);
+
+ auto controlAttributesConfig = New<TControlAttributesConfig>();
+ controlAttributesConfig->EnableTableIndex = true;
+ controlAttributesConfig->EnableEndOfStream = true;
+
+ auto protoWriter = CreateWriterForProtobuf(
+ MakeProtobufFormatConfig({TOtherColumnsMessage::descriptor(), TOtherColumnsMessage::descriptor()}),
+ std::vector<TTableSchemaPtr>(2, New<TTableSchema>()),
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ controlAttributesConfig,
+ 0);
+
+ EXPECT_EQ(true, protoWriter->Write(
+ std::vector<TUnversionedRow>{
+ NNamedValue::MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"field1", "foo"},
+ }),
+ NNamedValue::MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 1},
+ {"field2", "bar"},
+ }),
+ }));
+
+ WaitFor(protoWriter->Close())
+ .ThrowOnError();
+
+ std::vector<TString> otherColumnsValue;
+ auto parser = TLenvalParser(data);
+ while (auto item = parser.Next()) {
+ TOtherColumnsMessage message;
+ bool parsed = message.ParseFromString(item->RowData);
+ EXPECT_TRUE(parsed);
+ otherColumnsValue.push_back(CanonizeYson(message.other_columns_field()));
+ }
+
+ EXPECT_EQ(
+ otherColumnsValue,
+ std::vector<TString>({
+ CanonizeYson("{field1=foo}"),
+ CanonizeYson("{field2=bar}"),
+ }));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+using TProtobufFormatAllFieldsParameter = std::tuple<int, EProtoFormatType>;
+class TProtobufFormatAllFields
+ : public ::testing::TestWithParam<TProtobufFormatAllFieldsParameter>
+{
+public:
+ bool IsLegacyFormat() const
+ {
+ auto [rowCount, protoFormatType] = GetParam();
+ return protoFormatType == EProtoFormatType::FileDescriptorLegacy;
+ }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+ Specification,
+ TProtobufFormatAllFields,
+ ::testing::Values(TProtobufFormatAllFieldsParameter{1, EProtoFormatType::Structured}));
+
+INSTANTIATE_TEST_SUITE_P(
+ FileDescriptorLegacy,
+ TProtobufFormatAllFields,
+ ::testing::Values(TProtobufFormatAllFieldsParameter{1, EProtoFormatType::FileDescriptorLegacy}));
+
+INSTANTIATE_TEST_SUITE_P(
+ FileDescriptor,
+ TProtobufFormatAllFields,
+ ::testing::Values(TProtobufFormatAllFieldsParameter{1, EProtoFormatType::FileDescriptor}));
+
+INSTANTIATE_TEST_SUITE_P(
+ ManyRows,
+ TProtobufFormatAllFields,
+ ::testing::Values(TProtobufFormatAllFieldsParameter{50000, EProtoFormatType::Structured}));
+
+TEST_P(TProtobufFormatAllFields, Writer)
+{
+ auto [rowCount, protoFormatType] = GetParam();
+ auto config = CreateAllFieldsConfig(protoFormatType);
+
+ auto nameTable = New<TNameTable>();
+
+ auto doubleId = nameTable->RegisterName("Double");
+ auto floatId = nameTable->RegisterName("Float");
+
+ auto int64Id = nameTable->RegisterName("Int64");
+ auto uint64Id = nameTable->RegisterName("UInt64");
+ auto sint64Id = nameTable->RegisterName("SInt64");
+ auto fixed64Id = nameTable->RegisterName("Fixed64");
+ auto sfixed64Id = nameTable->RegisterName("SFixed64");
+
+ auto int32Id = nameTable->RegisterName("Int32");
+ auto uint32Id = nameTable->RegisterName("UInt32");
+ auto sint32Id = nameTable->RegisterName("SInt32");
+ auto fixed32Id = nameTable->RegisterName("Fixed32");
+ auto sfixed32Id = nameTable->RegisterName("SFixed32");
+
+ auto boolId = nameTable->RegisterName("Bool");
+ auto stringId = nameTable->RegisterName("String");
+ auto bytesId = nameTable->RegisterName("Bytes");
+
+ auto enumId = nameTable->RegisterName("Enum");
+
+ auto messageId = nameTable->RegisterName("Message");
+
+ auto anyWithMapId = nameTable->RegisterName("AnyWithMap");
+ auto anyWithInt64Id = nameTable->RegisterName("AnyWithInt64");
+ auto anyWithStringId = nameTable->RegisterName("AnyWithString");
+
+ auto otherInt64ColumnId = nameTable->RegisterName("OtherInt64Column");
+ auto otherDoubleColumnId = nameTable->RegisterName("OtherDoubleColumn");
+ auto otherStringColumnId = nameTable->RegisterName("OtherStringColumn");
+ auto otherNullColumnId = nameTable->RegisterName("OtherNullColumn");
+ auto otherBooleanColumnId = nameTable->RegisterName("OtherBooleanColumn");
+ auto otherAnyColumnId = nameTable->RegisterName("OtherAnyColumn");
+
+ auto tableIndexColumnId = nameTable->RegisterName(TableIndexColumnName);
+ auto rowIndexColumnId = nameTable->RegisterName(RowIndexColumnName);
+ auto rangeIndexColumnId = nameTable->RegisterName(RangeIndexColumnName);
+
+ auto missintInt64Id = nameTable->RegisterName("MissingInt64");
+
+ TString result;
+ TStringOutput resultStream(result);
+ auto writer = CreateWriterForProtobuf(
+ config->Attributes(),
+ {New<TTableSchema>()},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+
+ TEmbeddedMessage embeddedMessage;
+ embeddedMessage.set_key("embedded_key");
+ embeddedMessage.set_value("embedded_value");
+ TString embeddedMessageBytes;
+ ASSERT_TRUE(embeddedMessage.SerializeToString(&embeddedMessageBytes));
+
+ auto mapNode = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("Key").Value("Value")
+ .Item("Another")
+ .BeginList()
+ .Item().Value(1)
+ .Item().Value("two")
+ .EndList()
+ .EndMap();
+ auto ysonString = ConvertToYsonString(mapNode).ToString();
+
+ TUnversionedRowBuilder builder;
+ for (const auto& value : {
+ MakeUnversionedDoubleValue(3.14159, doubleId),
+ MakeUnversionedDoubleValue(2.71828, floatId),
+
+ MakeUnversionedInt64Value(-1, int64Id),
+ MakeUnversionedUint64Value(2, uint64Id),
+ MakeUnversionedInt64Value(-3, sint64Id),
+ MakeUnversionedUint64Value(4, fixed64Id),
+ MakeUnversionedInt64Value(-5, sfixed64Id),
+
+ MakeUnversionedInt64Value(-6, int32Id),
+ MakeUnversionedUint64Value(7, uint32Id),
+ MakeUnversionedInt64Value(-8, sint32Id),
+ MakeUnversionedUint64Value(9, fixed32Id),
+ MakeUnversionedInt64Value(-10, sfixed32Id),
+
+ MakeUnversionedBooleanValue(true, boolId),
+ MakeUnversionedStringValue("this_is_string", stringId),
+ MakeUnversionedStringValue("this_is_bytes", bytesId),
+
+ MakeUnversionedStringValue("Two", enumId),
+
+ MakeUnversionedStringValue(embeddedMessageBytes, messageId),
+
+ MakeUnversionedNullValue(missintInt64Id),
+
+ MakeUnversionedInt64Value(12, tableIndexColumnId),
+ MakeUnversionedInt64Value(42, rowIndexColumnId),
+ MakeUnversionedInt64Value(333, rangeIndexColumnId),
+ }) {
+ builder.AddValue(value);
+ }
+
+ if (!IsLegacyFormat()) {
+ builder.AddValue(MakeUnversionedAnyValue(ysonString, anyWithMapId));
+ builder.AddValue(MakeUnversionedInt64Value(22, anyWithInt64Id));
+ builder.AddValue(MakeUnversionedStringValue("some_string", anyWithStringId));
+
+ builder.AddValue(MakeUnversionedInt64Value(-123, otherInt64ColumnId));
+ builder.AddValue(MakeUnversionedDoubleValue(-123.456, otherDoubleColumnId));
+ builder.AddValue(MakeUnversionedStringValue("some_string", otherStringColumnId));
+ builder.AddValue(MakeUnversionedBooleanValue(true, otherBooleanColumnId));
+ builder.AddValue(MakeUnversionedAnyValue(ysonString, otherAnyColumnId));
+ builder.AddValue(MakeUnversionedNullValue(otherNullColumnId));
+ }
+
+ auto row = builder.GetRow();
+ std::vector<TUnversionedRow> rows(rowCount, row);
+ EXPECT_EQ(true, writer->Write(rows));
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput input(result);
+ TLenvalParser lenvalParser(&input);
+
+ for (int rowIndex = 0; rowIndex < rowCount; ++rowIndex) {
+ auto entry = lenvalParser.Next();
+ ASSERT_TRUE(entry);
+
+ NYT::TMessage message;
+ ASSERT_TRUE(message.ParseFromString(entry->RowData));
+
+ EXPECT_DOUBLE_EQ(message.double_field(), 3.14159);
+ EXPECT_FLOAT_EQ(message.float_field(), 2.71828);
+ EXPECT_EQ(message.int64_field(), -1);
+ EXPECT_EQ(message.uint64_field(), 2u);
+ EXPECT_EQ(message.sint64_field(), -3);
+ EXPECT_EQ(message.fixed64_field(), 4u);
+ EXPECT_EQ(message.sfixed64_field(), -5);
+
+ EXPECT_EQ(message.int32_field(), -6);
+ EXPECT_EQ(message.uint32_field(), 7u);
+ EXPECT_EQ(message.sint32_field(), -8);
+ EXPECT_EQ(message.fixed32_field(), 9u);
+ EXPECT_EQ(message.sfixed32_field(), -10);
+
+ EXPECT_EQ(message.bool_field(), true);
+ EXPECT_EQ(message.string_field(), "this_is_string");
+ EXPECT_EQ(message.bytes_field(), "this_is_bytes");
+
+ EXPECT_EQ(message.enum_field(), EEnum::Two);
+
+ EXPECT_EQ(message.message_field().key(), "embedded_key");
+ EXPECT_EQ(message.message_field().value(), "embedded_value");
+
+ if (!IsLegacyFormat()) {
+ EXPECT_TRUE(AreNodesEqual(ConvertToNode(TYsonString(message.any_field_with_map())), mapNode));
+ EXPECT_TRUE(AreNodesEqual(
+ ConvertToNode(TYsonString(message.any_field_with_int64())),
+ BuildYsonNodeFluently().Value(22)));
+ EXPECT_TRUE(AreNodesEqual(
+ ConvertToNode(TYsonString(message.any_field_with_string())),
+ BuildYsonNodeFluently().Value("some_string")));
+
+ auto otherColumnsMap = ConvertToNode(TYsonString(message.other_columns_field()))->AsMap();
+ EXPECT_EQ(otherColumnsMap->GetChildValueOrThrow<i64>("OtherInt64Column"), -123);
+ EXPECT_DOUBLE_EQ(otherColumnsMap->GetChildValueOrThrow<double>("OtherDoubleColumn"), -123.456);
+ EXPECT_EQ(otherColumnsMap->GetChildValueOrThrow<TString>("OtherStringColumn"), "some_string");
+ EXPECT_EQ(otherColumnsMap->GetChildValueOrThrow<bool>("OtherBooleanColumn"), true);
+ EXPECT_TRUE(AreNodesEqual(otherColumnsMap->GetChildOrThrow("OtherAnyColumn"), mapNode));
+ EXPECT_EQ(otherColumnsMap->GetChildOrThrow("OtherNullColumn")->GetType(), ENodeType::Entity);
+
+ auto keys = otherColumnsMap->GetKeys();
+ std::sort(keys.begin(), keys.end());
+ std::vector<std::string> expectedKeys = {
+ "OtherInt64Column",
+ "OtherDoubleColumn",
+ "OtherStringColumn",
+ "OtherBooleanColumn",
+ "OtherAnyColumn",
+ "OtherNullColumn"
+ };
+ std::sort(expectedKeys.begin(), expectedKeys.end());
+ EXPECT_EQ(expectedKeys, keys);
+ }
+ }
+
+ ASSERT_FALSE(lenvalParser.Next());
+}
+
+TEST_P(TProtobufFormatAllFields, Parser)
+{
+ auto [rowCount, protoFormatType] = GetParam();
+
+ auto config = CreateAllFieldsConfig(protoFormatType);
+
+ TMessage message;
+ message.set_double_field(3.14159);
+ message.set_float_field(2.71828);
+
+ message.set_int64_field(-1);
+ message.set_uint64_field(2);
+ message.set_sint64_field(-3);
+ message.set_fixed64_field(4);
+ message.set_sfixed64_field(-5);
+
+ message.set_int32_field(-6);
+ message.set_uint32_field(7);
+ message.set_sint32_field(-8);
+ message.set_fixed32_field(9);
+ message.set_sfixed32_field(-10);
+
+ message.set_bool_field(true);
+ message.set_string_field("this_is_string");
+ message.set_bytes_field("this_is_bytes");
+ message.set_enum_field(EEnum::Three);
+
+ message.mutable_message_field()->set_key("embedded_key");
+ message.mutable_message_field()->set_value("embedded_value");
+
+ auto mapNode = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("Key").Value("Value")
+ .Item("Another")
+ .BeginList()
+ .Item().Value(1)
+ .Item().Value("two")
+ .EndList()
+ .EndMap();
+
+ auto otherColumnsNode = BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("OtherInt64Column").Value(-123)
+ .Item("OtherDoubleColumn").Value(-123.456)
+ .Item("OtherStringColumn").Value("some_string")
+ .Item("OtherBooleanColumn").Value(true)
+ .Item("OtherAnyColumn").Value(mapNode)
+ .Item("OtherNullColumn").Entity()
+ .EndMap();
+
+ if (!IsLegacyFormat()) {
+ message.set_any_field_with_map(ConvertToYsonString(mapNode).ToString());
+ message.set_any_field_with_int64(BuildYsonStringFluently().Value(22).ToString());
+ message.set_any_field_with_string(BuildYsonStringFluently().Value("some_string").ToString());
+ message.set_other_columns_field(ConvertToYsonString(otherColumnsNode).ToString());
+ }
+
+ auto rowCollector = ParseRows(
+ message,
+ ConvertTo<TProtobufFormatConfigPtr>(config->Attributes().ToMap()),
+ New<TTableSchema>(),
+ rowCount);
+
+ for (int rowIndex = 0; rowIndex < rowCount; ++rowIndex) {
+ int expectedSize = IsLegacyFormat() ? 17 : 26;
+ ASSERT_EQ(static_cast<int>(rowCollector.GetRow(rowIndex).GetCount()), expectedSize);
+
+ ASSERT_DOUBLE_EQ(GetDouble(rowCollector.GetRowValue(rowIndex, "Double")), 3.14159);
+ ASSERT_NEAR(GetDouble(rowCollector.GetRowValue(rowIndex, "Float")), 2.71828, 1e-5);
+
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "Int64")), -1);
+ ASSERT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "UInt64")), 2u);
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "SInt64")), -3);
+ ASSERT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "Fixed64")), 4u);
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "SFixed64")), -5);
+
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "Int32")), -6);
+ ASSERT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "UInt32")), 7u);
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "SInt32")), -8);
+ ASSERT_EQ(GetUint64(rowCollector.GetRowValue(rowIndex, "Fixed32")), 9u);
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "SFixed32")), -10);
+
+ ASSERT_EQ(GetBoolean(rowCollector.GetRowValue(rowIndex, "Bool")), true);
+ ASSERT_EQ(GetString(rowCollector.GetRowValue(rowIndex, "String")), "this_is_string");
+ ASSERT_EQ(GetString(rowCollector.GetRowValue(rowIndex, "Bytes")), "this_is_bytes");
+
+ if (IsLegacyFormat()) {
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "Enum")), 3);
+ } else {
+ ASSERT_EQ(GetString(rowCollector.GetRowValue(rowIndex, "Enum")), "Three");
+ }
+
+ TEmbeddedMessage embeddedMessage;
+ ASSERT_TRUE(embeddedMessage.ParseFromString(GetString(rowCollector.GetRowValue(rowIndex, "Message"))));
+ ASSERT_EQ(embeddedMessage.key(), "embedded_key");
+ ASSERT_EQ(embeddedMessage.value(), "embedded_value");
+
+ if (!IsLegacyFormat()) {
+ ASSERT_TRUE(AreNodesEqual(GetAny(rowCollector.GetRowValue(rowIndex, "AnyWithMap")), mapNode));
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "AnyWithInt64")), 22);
+ ASSERT_EQ(GetString(rowCollector.GetRowValue(rowIndex, "AnyWithString")), "some_string");
+
+ ASSERT_EQ(GetInt64(rowCollector.GetRowValue(rowIndex, "OtherInt64Column")), -123);
+ ASSERT_DOUBLE_EQ(GetDouble(rowCollector.GetRowValue(rowIndex, "OtherDoubleColumn")), -123.456);
+ ASSERT_EQ(GetString(rowCollector.GetRowValue(rowIndex, "OtherStringColumn")), "some_string");
+ ASSERT_EQ(GetBoolean(rowCollector.GetRowValue(rowIndex, "OtherBooleanColumn")), true);
+ ASSERT_TRUE(AreNodesEqual(GetAny(rowCollector.GetRowValue(rowIndex, "OtherAnyColumn")), mapNode));
+ ASSERT_EQ(rowCollector.GetRowValue(rowIndex, "OtherNullColumn").Type, EValueType::Null);
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TProtobufFormatCompat
+ : public ::testing::Test
+{
+public:
+ static TTableSchemaPtr GetEarlySchema()
+ {
+ static const auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"a", OptionalLogicalType(VariantStructLogicalType({
+ {"f1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ }))},
+ });
+ return schema;
+ }
+
+ static TTableSchemaPtr GetFirstMiddleSchema()
+ {
+ static const auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"a", OptionalLogicalType(VariantStructLogicalType({
+ {"f1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"f2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ }))},
+ {"b", OptionalLogicalType(StructLogicalType({
+ {"x", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ }))},
+ });
+ return schema;
+ }
+
+ static TTableSchemaPtr GetSecondMiddleSchema()
+ {
+ static const auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"a", OptionalLogicalType(VariantStructLogicalType({
+ {"f1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"f2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ }))},
+ {"b", OptionalLogicalType(StructLogicalType({
+ {"x", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"y", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ }))},
+ });
+ return schema;
+ }
+
+ static TTableSchemaPtr GetThirdMiddleSchema()
+ {
+ static const auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"a", OptionalLogicalType(VariantStructLogicalType({
+ {"f1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"f2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ }))},
+ {"b", OptionalLogicalType(StructLogicalType({
+ {"x", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"y", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"z", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ }))},
+ });
+ return schema;
+ }
+
+ static TTableSchemaPtr GetLateSchema()
+ {
+ static const auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"a", OptionalLogicalType(VariantStructLogicalType({
+ {"f1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"f2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"f3", SimpleLogicalType(ESimpleLogicalValueType::Boolean)},
+ }))},
+ {"c", OptionalLogicalType(ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Boolean)))},
+ {"b", OptionalLogicalType(StructLogicalType({
+ {"x", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"y", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"z", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ }))},
+ });
+ return schema;
+ }
+
+ static TProtobufFormatConfigPtr GetFirstMiddleConfig()
+ {
+ static const auto config = ConvertTo<TProtobufFormatConfigPtr>(BuildYsonNodeFluently()
+ .BeginMap().Item("tables").BeginList().Item().BeginMap().Item("columns").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("a")
+ .Item("field_number").Value(0)
+ .Item("proto_type").Value("oneof")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("f1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("b")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("x")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList().EndMap().EndList().EndMap());
+ return config;
+ }
+
+ static TProtobufFormatConfigPtr GetSecondMiddleConfig()
+ {
+ static const auto config = ConvertTo<TProtobufFormatConfigPtr>(BuildYsonNodeFluently()
+ .BeginMap().Item("tables").BeginList().Item().BeginMap().Item("columns").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("a")
+ .Item("field_number").Value(0)
+ .Item("proto_type").Value("oneof")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("f1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("f2")
+ .Item("field_number").Value(101)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("b")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields")
+ .BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("x")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("y")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList().EndMap().EndList().EndMap());
+ return config;
+ }
+};
+
+template <typename TMessage>
+TMessage WriteRow(
+ TUnversionedRow row,
+ const TProtobufFormatConfigPtr& config,
+ const TTableSchemaPtr& schema,
+ const TNameTablePtr& nameTable)
+{
+ TString result;
+ TStringOutput resultStream(result);
+
+ auto writer = CreateWriterForProtobuf(
+ config,
+ {schema},
+ nameTable,
+ CreateAsyncAdapter(&resultStream),
+ true,
+ New<TControlAttributesConfig>(),
+ 0);
+ Y_UNUSED(writer->Write(std::vector<TUnversionedRow>{row}));
+ writer->Close().Get().ThrowOnError();
+
+ TStringInput input(result);
+ TLenvalParser lenvalParser(&input);
+ auto entry = lenvalParser.Next();
+ if (!entry) {
+ THROW_ERROR_EXCEPTION("Unexpected end of stream in lenval parser");
+ }
+ TMessage message;
+ if (!message.ParseFromString(entry->RowData)) {
+ THROW_ERROR_EXCEPTION("Failed to parse message");
+ }
+ if (lenvalParser.Next()) {
+ THROW_ERROR_EXCEPTION("Unexpected entry in lenval parser");
+ }
+ return message;
+}
+
+TEST_F(TProtobufFormatCompat, Write)
+{
+ auto nameTable = TNameTable::FromSchema(*GetLateSchema());
+ auto config = GetSecondMiddleConfig();
+
+ auto writeRow = [&] (TUnversionedRow row, const TTableSchemaPtr& schema) {
+ return WriteRow<NYT::TCompatMessage>(row, config, schema, nameTable);
+ };
+
+ {
+ auto earlyRow = MakeRow(nameTable, {
+ {"a", EValueType::Composite, "[0; -24]"}
+ });
+
+ SCOPED_TRACE("early");
+ auto message = writeRow(earlyRow, GetEarlySchema());
+ EXPECT_EQ(message.f1(), -24);
+ EXPECT_FALSE(message.has_f2());
+ EXPECT_EQ(message.has_b(), false);
+ }
+ {
+ auto firstMiddleRow = MakeRow(nameTable, {
+ {"a", EValueType::Composite, "[1; foobar]"},
+ {"b", EValueType::Composite, "[foo]"},
+ });
+
+ SCOPED_TRACE("firstMiddle");
+ auto message = writeRow(firstMiddleRow, GetFirstMiddleSchema());
+ EXPECT_FALSE(message.has_f1());
+ EXPECT_EQ(message.f2(), "foobar");
+ EXPECT_EQ(message.b().x(), "foo");
+ EXPECT_EQ(message.b().has_y(), false);
+ }
+ {
+ auto secondMiddleRow = MakeRow(nameTable, {
+ {"a", EValueType::Composite, "[1; foobar]"},
+ {"b", EValueType::Composite, "[foo; bar]"},
+ });
+
+ SCOPED_TRACE("secondMiddle");
+ auto message = writeRow(secondMiddleRow, GetSecondMiddleSchema());
+ EXPECT_FALSE(message.has_f1());
+ EXPECT_EQ(message.f2(), "foobar");
+ EXPECT_EQ(message.b().x(), "foo");
+ EXPECT_EQ(message.b().y(), "bar");
+ }
+ {
+ auto thirdMiddleRow = MakeRow(nameTable, {
+ {"a", EValueType::Composite, "[1; foobar]"},
+ {"b", EValueType::Composite, "[foo; bar; spam]"},
+ });
+
+ SCOPED_TRACE("thirdMiddle");
+ auto message = writeRow(thirdMiddleRow, GetThirdMiddleSchema());
+ EXPECT_FALSE(message.has_f1());
+ EXPECT_EQ(message.f2(), "foobar");
+ EXPECT_EQ(message.b().x(), "foo");
+ EXPECT_EQ(message.b().y(), "bar");
+ }
+ {
+ auto lateRow = MakeRow(nameTable, {
+ {"a", EValueType::Composite, "[2; %true]"},
+ {"c", EValueType::Composite, "[%false; %true; %false]"},
+ {"b", EValueType::Composite, "[foo; bar; spam]"},
+ });
+
+ SCOPED_TRACE("late");
+ auto message = writeRow(lateRow, GetLateSchema());
+ EXPECT_FALSE(message.has_f1());
+ EXPECT_FALSE(message.has_f2());
+ EXPECT_EQ(message.b().x(), "foo");
+ EXPECT_EQ(message.b().y(), "bar");
+ }
+}
+
+TEST_F(TProtobufFormatCompat, Parse)
+{
+ auto config = GetSecondMiddleConfig();
+
+ NYT::TCompatMessage message;
+ message.set_f2("Sandiego");
+ message.mutable_b()->set_x("foo");
+ message.mutable_b()->set_y("bar");
+
+ {
+ SCOPED_TRACE("early");
+ auto collector = ParseRows(message, config, GetEarlySchema());
+ EXPECT_FALSE(collector.FindRowValue(0, "a"));
+ EXPECT_FALSE(collector.GetNameTable()->FindId("b"));
+ EXPECT_FALSE(collector.GetNameTable()->FindId("c"));
+ }
+ {
+ SCOPED_TRACE("firstMiddle");
+ auto collector = ParseRows(message, config, GetFirstMiddleSchema());
+ EXPECT_NODES_EQUAL(
+ GetComposite(collector.GetRowValue(0, "a")),
+ ConvertToNode(TYsonString(TStringBuf("[1;Sandiego]"))));
+ EXPECT_NODES_EQUAL(GetComposite(collector.GetRowValue(0, "b")), ConvertToNode(TYsonString(TStringBuf("[foo]"))));
+ EXPECT_FALSE(collector.GetNameTable()->FindId("c"));
+ }
+ {
+ SCOPED_TRACE("secondMiddle");
+ auto collector = ParseRows(message, config, GetSecondMiddleSchema());
+ EXPECT_NODES_EQUAL(
+ GetComposite(collector.GetRowValue(0, "a")),
+ ConvertToNode(TYsonString(TStringBuf("[1;Sandiego]"))));
+ EXPECT_NODES_EQUAL(GetComposite(collector.GetRowValue(0, "b")), ConvertToNode(TYsonString(TStringBuf("[foo;bar]"))));
+ EXPECT_FALSE(collector.GetNameTable()->FindId("c"));
+ }
+ {
+ SCOPED_TRACE("thirdMiddle");
+ auto collector = ParseRows(message, config, GetThirdMiddleSchema());
+ EXPECT_NODES_EQUAL(
+ GetComposite(collector.GetRowValue(0, "a")),
+ ConvertToNode(TYsonString(TStringBuf("[1;Sandiego]"))));
+ EXPECT_NODES_EQUAL(GetComposite(collector.GetRowValue(0, "b")), ConvertToNode(TYsonString(TStringBuf("[foo;bar;#]"))));
+ EXPECT_FALSE(collector.GetNameTable()->FindId("c"));
+ }
+ {
+ SCOPED_TRACE("late");
+ auto collector = ParseRows(message, config, GetLateSchema());
+ EXPECT_NODES_EQUAL(
+ GetComposite(collector.GetRowValue(0, "a")),
+ ConvertToNode(TYsonString(TStringBuf("[1;Sandiego]"))));
+ EXPECT_NODES_EQUAL(GetComposite(collector.GetRowValue(0, "b")), ConvertToNode(TYsonString(TStringBuf("[foo;bar;#]"))));
+ EXPECT_TRUE(collector.GetNameTable()->FindId("c"));
+ }
+}
+
+TEST_F(TProtobufFormatCompat, ParseWrong)
+{
+ NYT::TCompatMessage message;
+ message.set_f1(42);
+ message.mutable_b()->set_x("foo");
+ message.mutable_b()->set_y("bar");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseRows(message, GetFirstMiddleConfig(), GetFirstMiddleSchema()),
+ "Unexpected field number 2");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TProtobufFormatEnumCompat
+ : public ::testing::Test
+{
+public:
+ static TTableSchemaPtr CreateTableSchema()
+ {
+ static const auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"optional_enum", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"required_enum", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"repeated_enum", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"packed_repeated_enum", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"inner", OptionalLogicalType(StructLogicalType({
+ {"optional_enum", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"required_enum", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"repeated_enum", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ {"packed_repeated_enum", ListLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))},
+ }))},
+ });
+ return schema;
+ }
+ static TProtobufFormatConfigPtr CreateProtobufFormatConfig()
+ {
+ static const auto config = ConvertTo<TProtobufFormatConfigPtr>(BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("enumerations").BeginMap()
+ .Item("ECompatEnum")
+ .BeginMap()
+ .Item("One").Value(1)
+ .Item("Two").Value(2)
+ .Item("Three").Value(3)
+ .EndMap()
+ .EndMap()
+ .Item("tables").BeginList().Item().BeginMap().Item("columns").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("optional_enum")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("enum_string")
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("required_enum")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("enum_string")
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("repeated_enum")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("enum_string")
+ .Item("repeated").Value(true)
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("packed_repeated_enum")
+ .Item("field_number").Value(4)
+ .Item("proto_type").Value("enum_string")
+ .Item("repeated").Value(true)
+ .Item("packed").Value(true)
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("inner")
+ .Item("field_number").Value(100)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("optional_enum")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("enum_string")
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("required_enum")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("enum_string")
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("repeated_enum")
+ .Item("field_number").Value(3)
+ .Item("proto_type").Value("enum_string")
+ .Item("repeated").Value(true)
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("packed_repeated_enum")
+ .Item("field_number").Value(4)
+ .Item("proto_type").Value("enum_string")
+ .Item("repeated").Value(true)
+ .Item("packed").Value(true)
+ .Item("enum_writing_mode").Value("skip_unknown_values")
+ .Item("enumeration_name").Value("ECompatEnum")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList().EndMap().EndList().EndMap());
+ return config;
+ }
+
+};
+
+TEST_F(TProtobufFormatEnumCompat, WriteCanSkipUnknownEnumValues)
+{
+ auto schema = CreateTableSchema();
+ auto config = CreateProtobufFormatConfig();
+
+ auto nameTable = TNameTable::FromSchema(*schema);
+
+ auto row = MakeRow(nameTable, {
+ {"optional_enum", "MinusFortyTwo"},
+ {"required_enum", "One"},
+ {"repeated_enum", EValueType::Composite, "[MinusFortyTwo;One;MinusFortyTwo]"},
+ {"packed_repeated_enum", EValueType::Composite, "[MinusFortyTwo;Two;MinusFortyTwo]"},
+ {"inner", EValueType::Composite, "[MinusFortyTwo;Two;[MinusFortyTwo;Two];[One;MinusFortyTwo]]"},
+ });
+
+ auto collectRepeated = [] (const auto& repeated) {
+ std::vector<TEnumCompat::ECompatEnum> values;
+ for (auto value : repeated) {
+ values.push_back(static_cast<TEnumCompat::ECompatEnum>(value));
+ }
+ return values;
+ };
+
+ auto message = WriteRow<TEnumCompat>(row, config, schema, nameTable);
+
+ EXPECT_FALSE(message.has_optional_enum());
+ EXPECT_EQ(message.required_enum(), TEnumCompat::One);
+ EXPECT_EQ(collectRepeated(message.repeated_enum()), std::vector{TEnumCompat::One});
+ EXPECT_EQ(collectRepeated(message.packed_repeated_enum()), std::vector{TEnumCompat::Two});
+
+ ASSERT_TRUE(message.has_inner());
+ EXPECT_FALSE(message.inner().has_optional_enum());
+ EXPECT_EQ(message.inner().required_enum(), TEnumCompat::Two);
+ EXPECT_EQ(collectRepeated(message.inner().repeated_enum()), std::vector{TEnumCompat::Two});
+ EXPECT_EQ(collectRepeated(message.inner().packed_repeated_enum()), std::vector{TEnumCompat::One});
+}
+
+TEST_F(TProtobufFormatEnumCompat, WriteDoesntSkipRequiredFields)
+{
+ auto schema = CreateTableSchema();
+ auto config = CreateProtobufFormatConfig();
+
+ auto nameTable = TNameTable::FromSchema(*schema);
+
+ {
+ auto row = MakeRow(nameTable, {{"required_enum", "MinusFortyTwo"}});
+ EXPECT_THROW_WITH_SUBSTRING(WriteRow<TEnumCompat>(row, config, schema, nameTable), "Invalid value for enum");
+ }
+ {
+ auto row = MakeRow(nameTable, {{"inner", EValueType::Composite, "[#;MinusFortyTwo;#;#]"},});
+ EXPECT_THROW_WITH_SUBSTRING(WriteRow<TEnumCompat>(row, config, schema, nameTable), "Invalid value for enum");
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TProtobufFormatRuntimeErrors
+ : public ::testing::Test
+{
+public:
+ static TTableSchemaPtr GetSchemaWithVariant(bool optional = false)
+ {
+ auto variantType = VariantStructLogicalType({
+ {"f1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"f2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ });
+ return New<TTableSchema>(std::vector<TColumnSchema>{
+ {"a", optional ? OptionalLogicalType(variantType) : variantType},
+ });
+ }
+
+ static TTableSchemaPtr GetSchemaWithStruct(bool optional = false)
+ {
+ auto structType = StructLogicalType({
+ {"f1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"f2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ });
+ return New<TTableSchema>(std::vector<TColumnSchema>{
+ {"a", optional ? OptionalLogicalType(structType) : structType},
+ });
+ }
+
+ static TProtobufFormatConfigPtr GetConfigWithVariant()
+ {
+ static const auto config = ConvertTo<TProtobufFormatConfigPtr>(BuildYsonNodeFluently()
+ .BeginMap().Item("tables").BeginList().Item().BeginMap().Item("columns").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("a")
+ .Item("proto_type").Value("oneof")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("f1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("f2")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList().EndMap().EndList().EndMap());
+ return config;
+ }
+
+ static TProtobufFormatConfigPtr GetConfigWithStruct()
+ {
+ static const auto config = ConvertTo<TProtobufFormatConfigPtr>(BuildYsonNodeFluently()
+ .BeginMap().Item("tables").BeginList().Item().BeginMap().Item("columns").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("a")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("structured_message")
+ .Item("fields").BeginList()
+ .Item().BeginMap()
+ .Item("name").Value("f1")
+ .Item("field_number").Value(1)
+ .Item("proto_type").Value("int64")
+ .EndMap()
+ .Item().BeginMap()
+ .Item("name").Value("f2")
+ .Item("field_number").Value(2)
+ .Item("proto_type").Value("string")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList().EndMap().EndList().EndMap());
+ return config;
+ }
+};
+
+TEST_F(TProtobufFormatRuntimeErrors, ParseVariant)
+{
+ {
+ SCOPED_TRACE("Optional variant, all missing");
+ TMessageWithOneof message;
+ auto collector = ParseRows(message, GetConfigWithVariant(), GetSchemaWithVariant(/* optional */ true));
+ EXPECT_FALSE(collector.FindRowValue(0, "a"));
+ }
+ {
+ SCOPED_TRACE("All missing");
+ TMessageWithOneof message;
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseRows(message, GetConfigWithVariant(), GetSchemaWithVariant()),
+ "required field \"<root>.a\" is missing");
+ }
+ {
+ SCOPED_TRACE("two alternatives");
+ TMessageWithStruct::TStruct message;
+ message.set_f1(5);
+ message.set_f2("boo");
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseRows(message, GetConfigWithVariant(), GetSchemaWithVariant()),
+ "multiple entries for oneof field \"<root>.a\"");
+ }
+}
+
+TEST_F(TProtobufFormatRuntimeErrors, ParseStruct)
+{
+ {
+ SCOPED_TRACE("Optional submessage missing");
+ TMessageWithStruct message;
+ auto collector = ParseRows(message, GetConfigWithStruct(), GetSchemaWithStruct(/* optional */ true));
+ EXPECT_FALSE(collector.FindRowValue(0, "a"));
+ }
+ {
+ SCOPED_TRACE("Required submessage missing");
+ TMessageWithStruct message;
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseRows(message, GetConfigWithStruct(), GetSchemaWithStruct()),
+ "required field \"<root>.a\" is missing");
+ }
+ {
+ SCOPED_TRACE("All fields missing");
+ TMessageWithStruct message;
+ message.mutable_a();
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseRows(message, GetConfigWithStruct(), GetSchemaWithStruct()),
+ "required field \"<root>.a.f1\" is missing");
+ }
+ {
+ SCOPED_TRACE("Second field missing");
+ TMessageWithStruct message;
+ message.mutable_a()->set_f1(17);
+ EXPECT_THROW_WITH_SUBSTRING(
+ ParseRows(message, GetConfigWithStruct(), GetSchemaWithStruct()),
+ "required field \"<root>.a.f2\" is missing");
+ }
+ {
+ SCOPED_TRACE("All present");
+ TMessageWithStruct message;
+ message.mutable_a()->set_f1(17);
+ message.mutable_a()->set_f2("foobar");
+ auto collector = ParseRows(message, GetConfigWithStruct(), GetSchemaWithStruct());
+ EXPECT_NODES_EQUAL(
+ GetComposite(collector.GetRowValue(0, "a")),
+ ConvertToNode(TYsonString(TStringBuf("[17;foobar]"))));
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT
diff --git a/yt/yt/library/formats/unittests/protobuf_format_ut.proto b/yt/yt/library/formats/unittests/protobuf_format_ut.proto
new file mode 100644
index 0000000000..06258de619
--- /dev/null
+++ b/yt/yt/library/formats/unittests/protobuf_format_ut.proto
@@ -0,0 +1,255 @@
+import "yt/yt_proto/yt/formats/extension.proto";
+
+package NYT.NProtobufFormatTest;
+
+enum EEnum
+{
+ One = 1;
+ Two = 2;
+ Three = 3;
+
+ MinusFortyTwo = -42;
+
+ MinInt32 = -2147483648;
+ MaxInt32 = 2147483647;
+}
+
+message TEmbeddedStruct {
+ optional float float1 = 1;
+ optional string string1 = 2;
+};
+
+message TEmbedded2Message {
+ option (NYT.default_field_flags) = SERIALIZATION_YT;
+ optional uint64 embedded2_num = 10;
+ optional TEmbeddedStruct embedded2_struct = 17;
+ repeated string embedded2_repeated = 42;
+};
+
+message TEmbedded1Message {
+ option (NYT.default_field_flags) = SERIALIZATION_YT;
+ optional TEmbedded2Message t2 = 1 [(NYT.flags) = EMBEDDED];
+ oneof variant {
+ string str_variant = 101;
+ uint64 uint_variant = 102;
+ }
+ optional uint64 embedded_num = 10; // make intentional field_num collision!
+ optional string embedded_extra_field = 11;
+};
+message TEmbeddingMessage {
+ optional bytes other_columns_field = 15 [(NYT.flags) = OTHER_COLUMNS];
+ optional TEmbedded1Message t1 = 2 [(NYT.flags) = EMBEDDED];
+ optional uint64 num = 12;
+ optional string extra_field = 13;
+};
+
+message TEmbeddedMessage
+{
+ optional string key = 1;
+ optional string value = 2;
+}
+
+message TMessageWithStructuredEmbedded
+{
+ option (NYT.default_field_flags) = SERIALIZATION_YT;
+
+ message TFirstMessage
+ {
+ option (NYT.default_field_flags) = SERIALIZATION_YT;
+
+ optional EEnum enum_field = 1 [(NYT.flags) = ENUM_STRING];
+ optional int64 int64_field = 2;
+ repeated int64 repeated_int64_field = 3;
+ optional TEmbeddedMessage message_field = 4;
+ repeated TEmbeddedMessage repeated_message_field = 5;
+ optional bytes any_int64_field = 6 [(NYT.flags) = ANY];
+ optional bytes any_map_field = 7 [(NYT.flags) = ANY];
+ optional int64 optional_int64_field = 8;
+ repeated int64 another_repeated_int64_field = 9;
+ repeated bytes repeated_optional_any_field = 10 [(NYT.flags) = ANY];
+ repeated EEnum packed_repeated_enum_field = 11 [packed=true, (NYT.flags) = ENUM_STRING];
+ repeated bool optional_repeated_bool_field = 12;
+ oneof oneof_field {
+ string oneof_string_field_1 = 101;
+ string oneof_string_field = 102;
+ TEmbeddedMessage oneof_message_field = 1000;
+ }
+ oneof optional_oneof_field {
+ string optional_oneof_string_field_1 = 201;
+ string optional_oneof_string_field = 202;
+ TEmbeddedMessage optional_oneof_message_field = 2000;
+ }
+ map<int64, TEmbeddedMessage> map_field = 13 [(NYT.flags) = MAP_AS_DICT];
+ }
+
+ message TSecondMessage
+ {
+ optional int64 one = 2;
+ optional int64 two = 500000000;
+ optional int64 three = 100500;
+ }
+
+ optional TFirstMessage first = 1;
+ optional TSecondMessage second = 2;
+ repeated TEmbeddedMessage repeated_message_field = 3;
+ repeated int64 repeated_int64_field = 4;
+ optional int64 int64_any_field = 5 [(NYT.column_name) = "any_field"];
+
+ optional int32 int32_field = 6 [(NYT.column_name) = "int64_field"];
+ optional uint32 uint32_field = 7 [(NYT.column_name) = "uint64_field"];
+ optional int64 int64_field = 8 [(NYT.column_name) = "int32_field"];
+ optional uint64 uint64_field = 9 [(NYT.column_name) = "uint32_field"];
+
+ optional EEnum enum_int_field = 10 [(NYT.flags) = ENUM_INT];
+ optional EEnum enum_string_string_field = 11 [(NYT.flags) = ENUM_STRING];
+ optional EEnum enum_string_int64_field = 12 [(NYT.flags) = ENUM_STRING];
+
+
+ repeated int64 another_repeated_int64_field = 13;
+
+ repeated bytes repeated_optional_any_field = 14 [(NYT.flags) = ANY];
+
+ optional bytes other_columns_field = 15 [(NYT.flags) = OTHER_COLUMNS];
+
+ optional string utf8_field = 16;
+
+ repeated int64 packed_repeated_int64_field = 17 [packed=true];
+
+ repeated int64 optional_repeated_int64_field = 18;
+
+ oneof oneof_field {
+ string oneof_string_field_1 = 101;
+ string oneof_string_field = 102;
+ TEmbeddedMessage oneof_message_field = 1000;
+ }
+
+ oneof optional_oneof_field {
+ string optional_oneof_string_field_1 = 201;
+ string optional_oneof_string_field = 202;
+ TEmbeddedMessage optional_oneof_message_field = 2000;
+ }
+
+ map<int64, TEmbeddedMessage> map_field = 19 [(NYT.flags) = MAP_AS_DICT];
+}
+
+message TSeveralTablesMessageFirst
+{
+ option (NYT.default_field_flags) = SERIALIZATION_YT;
+
+ message TEmbedded
+ {
+ optional EEnum enum_field = 1 [(NYT.flags) = ENUM_STRING];
+ optional int64 int64_field = 2;
+ }
+ optional TEmbedded embedded = 1;
+ repeated int64 repeated_int64_field = 2;
+ optional int64 int64_field = 3 [(NYT.column_name) = "any_field"];
+}
+
+message TSeveralTablesMessageSecond
+{
+ optional EEnum enum_field = 1 [(NYT.flags) = ENUM_STRING];
+ optional int64 int64_field = 2;
+}
+
+message TSeveralTablesMessageThird
+{
+ optional string string_field = 1;
+}
+
+message TMessage
+{
+ optional double double_field = 1 [(NYT.column_name) = "Double"];
+ optional float float_field = 2 [(NYT.column_name) = "Float"];
+
+ optional int64 int64_field = 3 [(NYT.column_name) = "Int64"];
+ optional uint64 uint64_field = 4 [(NYT.column_name) = "UInt64"];
+ optional sint64 sint64_field = 5 [(NYT.column_name) = "SInt64"];
+ optional fixed64 fixed64_field = 6 [(NYT.column_name) = "Fixed64"];
+ optional sfixed64 sfixed64_field = 7 [(NYT.column_name) = "SFixed64"];
+
+ optional int32 int32_field = 8 [(NYT.column_name) = "Int32"];
+ optional uint32 uint32_field = 9 [(NYT.column_name) = "UInt32"];
+ optional sint32 sint32_field = 10 [(NYT.column_name) = "SInt32"];
+ optional fixed32 fixed32_field = 11 [(NYT.column_name) = "Fixed32"];
+ optional sfixed32 sfixed32_field = 12 [(NYT.column_name) = "SFixed32"];
+
+ optional bool bool_field = 13 [(NYT.column_name) = "Bool"];
+ optional string string_field = 14 [(NYT.column_name) = "String"];
+ optional bytes bytes_field = 15 [(NYT.column_name) = "Bytes"];
+
+ optional EEnum enum_field = 16 [(NYT.column_name) = "Enum", (NYT.flags) = ENUM_STRING];
+ optional TEmbeddedMessage message_field = 17 [(NYT.column_name) = "Message"];
+
+ optional bytes any_field_with_map = 18 [(NYT.column_name) = "AnyWithMap", (NYT.flags) = ANY];
+ optional bytes any_field_with_int64 = 19 [(NYT.column_name) = "AnyWithInt64", (NYT.flags) = ANY];
+ optional bytes any_field_with_string = 20 [(NYT.column_name) = "AnyWithString", (NYT.flags) = ANY];
+ optional bytes other_columns_field = 21 [(NYT.flags) = OTHER_COLUMNS];
+
+ optional int64 missing_int64_field = 22 [(NYT.column_name) = "MissingInt64"];
+}
+
+message TCompatMessage
+{
+ message TEmbedded
+ {
+ optional string x = 1;
+ optional string y = 2;
+ }
+
+ oneof a {
+ int64 f1 = 1;
+ string f2 = 101;
+ }
+ optional TEmbedded b = 2;
+}
+
+message TMessageWithOneof
+{
+ oneof variant {
+ int64 f1 = 1;
+ string f2 = 2;
+ }
+}
+
+message TMessageWithStruct
+{
+ message TStruct
+ {
+ optional int64 f1 = 1;
+ optional string f2 = 2;
+ }
+ optional TStruct a = 1;
+}
+
+message TOtherColumnsMessage
+{
+ optional bytes other_columns_field = 1 [(NYT.flags) = OTHER_COLUMNS];
+}
+
+message TEnumCompat {
+ option (NYT.default_field_flags) = SERIALIZATION_YT;
+ option (NYT.default_field_flags) = ENUM_SKIP_UNKNOWN_VALUES;
+
+ enum ECompatEnum {
+ One = 1;
+ Two = 2;
+ Three = 3;
+ }
+
+
+ message TStruct
+ {
+ optional ECompatEnum optional_enum = 1;
+ required ECompatEnum required_enum = 2;
+ repeated ECompatEnum repeated_enum = 3;
+ repeated ECompatEnum packed_repeated_enum = 4 [packed=true, (NYT.flags) = ENUM_STRING];
+ }
+
+ optional ECompatEnum optional_enum = 1;
+ required ECompatEnum required_enum = 2;
+ repeated ECompatEnum repeated_enum = 3;
+ repeated ECompatEnum packed_repeated_enum = 4 [packed=true, (NYT.flags) = ENUM_STRING];
+
+ optional TStruct inner = 100;
+}
diff --git a/yt/yt/library/formats/unittests/row_helpers.cpp b/yt/yt/library/formats/unittests/row_helpers.cpp
new file mode 100644
index 0000000000..61a89d1669
--- /dev/null
+++ b/yt/yt/library/formats/unittests/row_helpers.cpp
@@ -0,0 +1,70 @@
+#include "row_helpers.h"
+
+#include <yt/yt/core/yson/string.h>
+#include <yt/yt/core/ytree/convert.h>
+
+namespace NYT {
+
+using namespace NTableClient;
+
+////////////////////////////////////////////////////////////////////////////////
+
+static void EnsureTypesMatch(EValueType expected, EValueType actual)
+{
+ if (expected != actual) {
+ THROW_ERROR_EXCEPTION("Unexpected type of TUnversionedValue: expected %Qlv, actual %Qlv",
+ expected,
+ actual);
+ }
+}
+
+i64 GetInt64(const TUnversionedValue& value)
+{
+ EnsureTypesMatch(EValueType::Int64, value.Type);
+ return value.Data.Int64;
+}
+
+ui64 GetUint64(const TUnversionedValue& value)
+{
+ EnsureTypesMatch(EValueType::Uint64, value.Type);
+ return value.Data.Uint64;
+}
+
+double GetDouble(const NTableClient::TUnversionedValue& value)
+{
+ EnsureTypesMatch(EValueType::Double, value.Type);
+ return value.Data.Double;
+}
+
+bool GetBoolean(const TUnversionedValue& value)
+{
+ EnsureTypesMatch(EValueType::Boolean, value.Type);
+ return value.Data.Boolean;
+}
+
+TString GetString(const TUnversionedValue& value)
+{
+ EnsureTypesMatch(EValueType::String, value.Type);
+ return value.AsString();
+}
+
+NYTree::INodePtr GetAny(const NTableClient::TUnversionedValue& value)
+{
+ EnsureTypesMatch(EValueType::Any, value.Type);
+ return NYTree::ConvertToNode(NYson::TYsonString(value.AsString()));
+}
+
+NYTree::INodePtr GetComposite(const NTableClient::TUnversionedValue& value)
+{
+ EnsureTypesMatch(EValueType::Composite, value.Type);
+ return NYTree::ConvertToNode(NYson::TYsonString(value.AsString()));
+}
+
+bool IsNull(const NTableClient::TUnversionedValue& value)
+{
+ return value.Type == EValueType::Null;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/yt/yt/library/formats/unittests/row_helpers.h b/yt/yt/library/formats/unittests/row_helpers.h
new file mode 100644
index 0000000000..fdc3f8b560
--- /dev/null
+++ b/yt/yt/library/formats/unittests/row_helpers.h
@@ -0,0 +1,111 @@
+#pragma once
+
+#include <yt/yt/client/table_client/unversioned_row.h>
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/schema.h>
+#include <yt/yt/client/table_client/value_consumer.h>
+
+#include <vector>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TCollectingValueConsumer
+ : public NTableClient::IValueConsumer
+{
+public:
+ explicit TCollectingValueConsumer(NTableClient::TTableSchemaPtr schema = New<NTableClient::TTableSchema>())
+ : Schema_(std::move(schema))
+ { }
+
+ explicit TCollectingValueConsumer(NTableClient::TNameTablePtr nameTable, NTableClient::TTableSchemaPtr schema = New<NTableClient::TTableSchema>())
+ : Schema_(std::move(schema))
+ , NameTable_(std::move(nameTable))
+ { }
+
+ const NTableClient::TNameTablePtr& GetNameTable() const override
+ {
+ return NameTable_;
+ }
+
+ const NTableClient::TTableSchemaPtr& GetSchema() const override
+ {
+ return Schema_;
+ }
+
+ bool GetAllowUnknownColumns() const override
+ {
+ return true;
+ }
+
+ void OnBeginRow() override
+ { }
+
+ void OnValue(const NTableClient::TUnversionedValue& value) override
+ {
+ Builder_.AddValue(value);
+ }
+
+ void OnEndRow() override
+ {
+ RowList_.emplace_back(Builder_.FinishRow());
+ }
+
+ NTableClient::TUnversionedRow GetRow(size_t rowIndex)
+ {
+ return RowList_.at(rowIndex);
+ }
+
+ std::optional<NTableClient::TUnversionedValue> FindRowValue(size_t rowIndex, TStringBuf columnName) const
+ {
+ NTableClient::TUnversionedRow row = RowList_.at(rowIndex);
+ auto id = GetNameTable()->GetIdOrThrow(columnName);
+
+ for (const auto& value : row) {
+ if (value.Id == id) {
+ return value;
+ }
+ }
+ return std::nullopt;
+ }
+
+ NTableClient::TUnversionedValue GetRowValue(size_t rowIndex, TStringBuf columnName) const
+ {
+ auto row = FindRowValue(rowIndex, columnName);
+ if (!row) {
+ THROW_ERROR_EXCEPTION("Cannot find column %Qv", columnName);
+ }
+ return *row;
+ }
+
+ size_t Size() const
+ {
+ return RowList_.size();
+ }
+
+ const std::vector<NTableClient::TUnversionedOwningRow>& GetRowList() const {
+ return RowList_;
+ }
+
+private:
+ const NTableClient::TTableSchemaPtr Schema_;
+ const NTableClient::TNameTablePtr NameTable_ = New<NTableClient::TNameTable>();
+ NTableClient::TUnversionedOwningRowBuilder Builder_;
+ std::vector<NTableClient::TUnversionedOwningRow> RowList_;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+i64 GetInt64(const NTableClient::TUnversionedValue& value);
+ui64 GetUint64(const NTableClient::TUnversionedValue& value);
+double GetDouble(const NTableClient::TUnversionedValue& value);
+bool GetBoolean(const NTableClient::TUnversionedValue& value);
+TString GetString(const NTableClient::TUnversionedValue& value);
+NYTree::INodePtr GetAny(const NTableClient::TUnversionedValue& value);
+NYTree::INodePtr GetComposite(const NTableClient::TUnversionedValue& value);
+bool IsNull(const NTableClient::TUnversionedValue& value);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/yt/yt/library/formats/unittests/schemaful_dsv_parser_ut.cpp b/yt/yt/library/formats/unittests/schemaful_dsv_parser_ut.cpp
new file mode 100644
index 0000000000..875ad5b9f1
--- /dev/null
+++ b/yt/yt/library/formats/unittests/schemaful_dsv_parser_ut.cpp
@@ -0,0 +1,248 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/test_framework/yson_consumer_mock.h>
+
+#include <yt/yt/library/formats/schemaful_dsv_parser.h>
+
+#include <yt/yt/core/yson/null_consumer.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NYson;
+
+using ::testing::InSequence;
+using ::testing::StrictMock;
+using ::testing::NiceMock;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSchemafulDsvParserTest, Simple)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("5"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar("6"));
+ EXPECT_CALL(Mock, OnEndMap());
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("100"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar("max\tignat"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "5\t6\n"
+ "100\tmax\\tignat\n";
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a", "b"};
+
+ ParseSchemafulDsv(input, &Mock, config);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSchemafulDsvParserTest, TableIndex)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginAttributes());
+ EXPECT_CALL(Mock, OnKeyedItem("table_index"));
+ EXPECT_CALL(Mock, OnInt64Scalar(1));
+ EXPECT_CALL(Mock, OnEndAttributes());
+ EXPECT_CALL(Mock, OnEntity());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("x"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginAttributes());
+ EXPECT_CALL(Mock, OnKeyedItem("table_index"));
+ EXPECT_CALL(Mock, OnInt64Scalar(0));
+ EXPECT_CALL(Mock, OnEndAttributes());
+ EXPECT_CALL(Mock, OnEntity());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("y"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("z"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "1\tx\n"
+ "0\ty\n"
+ "0\tz\n";
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a"};
+ config->EnableTableIndex = true;
+
+ ParseSchemafulDsv(input, &Mock, config);
+}
+
+TEST(TSchemafulDsvParserTest, TooManyRows)
+{
+ TString input = "5\t6\n";
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a"};
+
+ EXPECT_THROW({ ParseSchemafulDsv(input, GetNullYsonConsumer(), config); }, std::exception);
+}
+
+TEST(TSchemafulDsvParserTest, SpecialSymbols)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ auto value = TString("6\0", 2);
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("5\r"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar(value));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input("5\r\t6\0\n", 6);
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a", "b"};
+
+ ParseSchemafulDsv(input, &Mock, config);
+}
+
+TEST(TSchemafulDsvParserTest, EnabledEscaping)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ auto value = TString("6\0", 2);
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("5\r\r"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar(value));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input("5\r\\r\t6\0\n", 8);
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a", "b"};
+ config->EnableEscaping = true;
+
+ ParseSchemafulDsv(input, &Mock, config);
+}
+
+TEST(TSchemafulDsvParserTest, DisabledEscaping)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ auto value = TString("6\0", 2);
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("5\r\\r"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar(value));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input("5\r\\r\t6\0\n", 8);
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a", "b"};
+ config->EnableEscaping = false;
+
+ ParseSchemafulDsv(input, &Mock, config);
+}
+
+TEST(TSchemafulDsvParserTest, ColumnsNamesHeader)
+{
+ TString input("a\tb\n1\t2\n");
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a", "b"};
+ config->EnableColumnNamesHeader = true;
+
+ EXPECT_THROW(ParseSchemafulDsv(input, GetNullYsonConsumer(), config), std::exception);
+}
+
+TEST(TSchemafulDsvParserTest, MissingValueModePrintSentinel)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ TString input = "x\t\tz\n";
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("x"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnKeyedItem("c"));
+ EXPECT_CALL(Mock, OnStringScalar("z"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ auto config = New<TSchemafulDsvFormatConfig>();
+ config->Columns = {"a", "b", "c"};
+ // By default missing_value_mode = fail and no sentinel values are used,
+ // i. e. there is no way to represent YSON entity with this format.
+
+ ParseSchemafulDsv(input, &Mock, config);
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("x"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnEntity());
+ EXPECT_CALL(Mock, OnKeyedItem("c"));
+ EXPECT_CALL(Mock, OnStringScalar("z"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ config->MissingValueMode = EMissingSchemafulDsvValueMode::PrintSentinel;
+ // By default missing_value_sentinel = "".
+
+ ParseSchemafulDsv(input, &Mock, config);
+
+ input = "null\tNULL\t\n";
+
+ config->MissingValueSentinel = "NULL";
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("null"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnEntity());
+ EXPECT_CALL(Mock, OnKeyedItem("c"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ ParseSchemafulDsv(input, &Mock, config);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/schemaful_dsv_writer_ut.cpp b/yt/yt/library/formats/unittests/schemaful_dsv_writer_ut.cpp
new file mode 100644
index 0000000000..52cd31a1a8
--- /dev/null
+++ b/yt/yt/library/formats/unittests/schemaful_dsv_writer_ut.cpp
@@ -0,0 +1,346 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include "format_writer_ut.h"
+
+#include <yt/yt/library/formats/schemaful_dsv_writer.h>
+#include <yt/yt/library/formats/format.h>
+
+#include <yt/yt/client/table_client/name_table.h>
+
+#include <yt/yt/core/concurrency/async_stream.h>
+
+#include <limits>
+
+namespace NYT::NFormats {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NYTree;
+using namespace NYson;
+using namespace NConcurrency;
+using namespace NTableClient;
+
+class TSchemalessWriterForSchemafulDsvTest
+ : public ::testing::Test
+{
+protected:
+ TNameTablePtr NameTable_;
+ int KeyAId_;
+ int KeyBId_;
+ int KeyCId_;
+ int KeyDId_;
+ int TableIndexId_;
+ int RangeIndexId_;
+ int RowIndexId_;
+ TSchemafulDsvFormatConfigPtr Config_;
+
+ ISchemalessFormatWriterPtr Writer_;
+
+ TStringStream OutputStream_;
+
+ TSchemalessWriterForSchemafulDsvTest()
+ {
+ NameTable_ = New<TNameTable>();
+ KeyAId_ = NameTable_->RegisterName("column_a");
+ KeyBId_ = NameTable_->RegisterName("column_b");
+ KeyCId_ = NameTable_->RegisterName("column_c");
+ KeyDId_ = NameTable_->RegisterName("column_d");
+ TableIndexId_ = NameTable_->RegisterName(TableIndexColumnName);
+ RowIndexId_ = NameTable_->RegisterName(RowIndexColumnName);
+ RangeIndexId_ = NameTable_->RegisterName(RangeIndexColumnName);
+
+ Config_ = New<TSchemafulDsvFormatConfig>();
+ }
+
+ void CreateStandardWriter()
+ {
+ auto controlAttributesConfig = New<TControlAttributesConfig>();
+ controlAttributesConfig->EnableTableIndex = Config_->EnableTableIndex;
+ Writer_ = CreateSchemalessWriterForSchemafulDsv(
+ Config_,
+ NameTable_,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&OutputStream_)),
+ false, // enableContextSaving
+ controlAttributesConfig,
+ 0 /* keyColumnCount */);
+ }
+};
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, Simple)
+{
+ Config_->Columns = {"column_b", "column_c", "column_a"};
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("value_a", KeyAId_));
+ row1.AddValue(MakeUnversionedInt64Value(-42, KeyBId_));
+ row1.AddValue(MakeUnversionedBooleanValue(true, KeyCId_));
+ row1.AddValue(MakeUnversionedStringValue("garbage", KeyDId_));
+
+ // Ignore system columns.
+ row1.AddValue(MakeUnversionedInt64Value(2, TableIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(42, RowIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(1, RangeIndexId_));
+
+ TUnversionedRowBuilder row2;
+ // The order is reversed.
+ row2.AddValue(MakeUnversionedStringValue("value_c", KeyCId_));
+ row2.AddValue(MakeUnversionedBooleanValue(false, KeyBId_));
+ row2.AddValue(MakeUnversionedInt64Value(23, KeyAId_));
+
+ std::vector<TUnversionedRow> rows = {row1.GetRow(), row2.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "-42\ttrue\tvalue_a\n"
+ "false\tvalue_c\t23\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+// This test shows the actual behavior of writer. It is OK to change it in the future. :)
+TEST_F(TSchemalessWriterForSchemafulDsvTest, TrickyDoubleRepresentations)
+{
+ Config_->Columns = {"column_a", "column_b", "column_c", "column_d"};
+ CreateStandardWriter();
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedDoubleValue(1.234567890123456, KeyAId_));
+ row1.AddValue(MakeUnversionedDoubleValue(42, KeyBId_));
+ row1.AddValue(MakeUnversionedDoubleValue(1e300, KeyCId_));
+ row1.AddValue(MakeUnversionedDoubleValue(-1e-300, KeyDId_));
+
+ std::vector<TUnversionedRow> rows = {row1.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+ TString expectedOutput = "1.234567890123456\t42.\t1e+300\t-1e-300\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, IntegralTypeRepresentations)
+{
+ Config_->Columns = {"column_a", "column_b", "column_c", "column_d"};
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedInt64Value(0LL, KeyAId_));
+ row1.AddValue(MakeUnversionedInt64Value(-1LL, KeyBId_));
+ row1.AddValue(MakeUnversionedInt64Value(1LL, KeyCId_));
+ row1.AddValue(MakeUnversionedInt64Value(99LL, KeyDId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedInt64Value(123LL, KeyAId_));
+ row2.AddValue(MakeUnversionedInt64Value(-123LL, KeyBId_));
+ row2.AddValue(MakeUnversionedInt64Value(1234LL, KeyCId_));
+ row2.AddValue(MakeUnversionedInt64Value(-1234LL, KeyDId_));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedUint64Value(0ULL, KeyAId_));
+ row3.AddValue(MakeUnversionedUint64Value(98ULL, KeyBId_));
+ row3.AddValue(MakeUnversionedUint64Value(987ULL, KeyCId_));
+ row3.AddValue(MakeUnversionedUint64Value(9876ULL, KeyDId_));
+
+ TUnversionedRowBuilder row4;
+ row4.AddValue(MakeUnversionedInt64Value(std::numeric_limits<i64>::max(), KeyAId_));
+ row4.AddValue(MakeUnversionedInt64Value(std::numeric_limits<i64>::min(), KeyBId_));
+ row4.AddValue(MakeUnversionedInt64Value(std::numeric_limits<i64>::min() + 1LL, KeyCId_));
+ row4.AddValue(MakeUnversionedUint64Value(std::numeric_limits<ui64>::max(), KeyDId_));
+
+ std::vector<TUnversionedRow> rows =
+ {row1.GetRow(), row2.GetRow(), row3.GetRow(), row4.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+ TString expectedOutput =
+ "0\t-1\t1\t99\n"
+ "123\t-123\t1234\t-1234\n"
+ "0\t98\t987\t9876\n"
+ "9223372036854775807\t-9223372036854775808\t-9223372036854775807\t18446744073709551615\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, EmptyColumnList)
+{
+ Config_->Columns = std::vector<std::string>();
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedInt64Value(0LL, KeyAId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+ TString expectedOutput = "\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, MissingValueMode)
+{
+ Config_->Columns = {"column_a", "column_b", "column_c"};
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("Value1A", KeyAId_));
+ row1.AddValue(MakeUnversionedStringValue("Value1B", KeyBId_));
+ row1.AddValue(MakeUnversionedStringValue("Value1C", KeyCId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("Value2A", KeyAId_));
+ row2.AddValue(MakeUnversionedStringValue("Value2C", KeyCId_));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("Value3A", KeyAId_));
+ row3.AddValue(MakeUnversionedStringValue("Value3B", KeyBId_));
+ row3.AddValue(MakeUnversionedStringValue("Value3C", KeyCId_));
+
+ std::vector<TUnversionedRow> rows =
+ {row1.GetRow(), row2.GetRow(), row3.GetRow()};
+
+ {
+ Config_->MissingValueMode = EMissingSchemafulDsvValueMode::SkipRow;
+ CreateStandardWriter();
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+ TString expectedOutput =
+ "Value1A\tValue1B\tValue1C\n"
+ "Value3A\tValue3B\tValue3C\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+ OutputStream_.Clear();
+ }
+
+ {
+ Config_->MissingValueMode = EMissingSchemafulDsvValueMode::Fail;
+ CreateStandardWriter();
+ EXPECT_EQ(false, Writer_->Write(rows));
+ EXPECT_THROW(Writer_->Close()
+ .Get()
+ .ThrowOnError(), std::exception);
+ OutputStream_.Clear();
+ }
+
+ {
+ Config_->MissingValueMode = EMissingSchemafulDsvValueMode::PrintSentinel;
+ Config_->MissingValueSentinel = "~";
+ CreateStandardWriter();
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+ TString expectedOutput =
+ "Value1A\tValue1B\tValue1C\n"
+ "Value2A\t~\tValue2C\n"
+ "Value3A\tValue3B\tValue3C\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+ OutputStream_.Clear();
+ }
+}
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, NameTableExpansion)
+{
+ Config_->Columns = {"Column1"};
+ Config_->MissingValueMode = {EMissingSchemafulDsvValueMode::PrintSentinel};
+ CreateStandardWriter();
+ TestNameTableExpansion(Writer_, NameTable_);
+}
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, TableIndex)
+{
+ Config_->Columns = {"column_a", "column_b", "column_c", "column_d"};
+ Config_->EnableTableIndex = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row0;
+ row0.AddValue(MakeUnversionedInt64Value(0LL, KeyAId_));
+ row0.AddValue(MakeUnversionedInt64Value(1LL, KeyBId_));
+ row0.AddValue(MakeUnversionedInt64Value(2LL, KeyCId_));
+ row0.AddValue(MakeUnversionedInt64Value(3LL, KeyDId_));
+
+ // It's necessary to specify a column corresponding to the table index
+ // when enable_table_index = true.
+ EXPECT_EQ(false, Writer_->Write(std::vector<TUnversionedRow>{row0.GetRow()}));
+
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedInt64Value(42LL, TableIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(0LL, KeyAId_));
+ row1.AddValue(MakeUnversionedInt64Value(1LL, KeyBId_));
+ row1.AddValue(MakeUnversionedInt64Value(2LL, KeyCId_));
+ row1.AddValue(MakeUnversionedInt64Value(3LL, KeyDId_));
+
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedInt64Value(42LL, TableIndexId_));
+ row2.AddValue(MakeUnversionedInt64Value(4LL, KeyAId_));
+ row2.AddValue(MakeUnversionedInt64Value(5LL, KeyBId_));
+ row2.AddValue(MakeUnversionedInt64Value(6LL, KeyCId_));
+ row2.AddValue(MakeUnversionedInt64Value(7LL, KeyDId_));
+
+ EXPECT_EQ(true, Writer_->Write(std::vector<TUnversionedRow>{row1.GetRow(), row2.GetRow()}));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedInt64Value(23LL, TableIndexId_));
+ row3.AddValue(MakeUnversionedUint64Value(8LL, KeyAId_));
+ row3.AddValue(MakeUnversionedUint64Value(9LL, KeyBId_));
+ row3.AddValue(MakeUnversionedUint64Value(10LL, KeyCId_));
+ row3.AddValue(MakeUnversionedUint64Value(11ULL, KeyDId_));
+
+ EXPECT_EQ(true, Writer_->Write(std::vector<TUnversionedRow>{row3.GetRow()}));
+
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+ TString expectedOutput =
+ "42\t0\t1\t2\t3\n"
+ "42\t4\t5\t6\t7\n"
+ "23\t8\t9\t10\t11\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, ValidateDuplicateNames)
+{
+ Config_->Columns = {"column_a", "column_b", "column_a"};
+ Config_->EnableTableIndex = true;
+ EXPECT_THROW(CreateStandardWriter(), TErrorException);
+}
+
+TEST_F(TSchemalessWriterForSchemafulDsvTest, ColumnsHeader)
+{
+ Config_->Columns = {"column_b", "column_c", "column_a"};
+ Config_->EnableColumnNamesHeader = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("value_a", KeyAId_));
+ row1.AddValue(MakeUnversionedInt64Value(-42, KeyBId_));
+ row1.AddValue(MakeUnversionedBooleanValue(true, KeyCId_));
+ std::vector<TUnversionedRow> rows = {row1.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "column_b\tcolumn_c\tcolumn_a\n"
+ "-42\ttrue\tvalue_a\n";
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/skiff_format_ut.cpp b/yt/yt/library/formats/unittests/skiff_format_ut.cpp
new file mode 100644
index 0000000000..0f5d416bd5
--- /dev/null
+++ b/yt/yt/library/formats/unittests/skiff_format_ut.cpp
@@ -0,0 +1,3028 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/library/logical_type_shortcuts/logical_type_shortcuts.h>
+#include "value_examples.h"
+#include "row_helpers.h"
+#include "yson_helpers.h"
+
+#include <yt/yt/client/formats/config.h>
+#include <yt/yt/client/formats/parser.h>
+#include <yt/yt/library/formats/skiff_parser.h>
+#include <yt/yt/library/formats/skiff_writer.h>
+#include <yt/yt/library/formats/format.h>
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/validate_logical_type.h>
+
+#include <yt/yt/library/named_value/named_value.h>
+#include <yt/yt/library/skiff_ext/schema_match.h>
+
+#include <yt/yt/core/yson/string.h>
+#include <yt/yt/core/ytree/convert.h>
+#include <yt/yt/core/ytree/fluent.h>
+#include <yt/yt/core/ytree/tree_visitor.h>
+
+#include <library/cpp/skiff/skiff.h>
+#include <library/cpp/skiff/skiff_schema.h>
+
+#include <util/stream/null.h>
+#include <util/string/hex.h>
+
+namespace NYT {
+
+namespace {
+
+using namespace NFormats;
+using namespace NNamedValue;
+using namespace NSkiff;
+using namespace NSkiffExt;
+using namespace NTableClient;
+using namespace NYTree;
+using namespace NYson;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TString ConvertToSkiffSchemaShortDebugString(INodePtr node)
+{
+ auto skiffFormatConfig = ConvertTo<TSkiffFormatConfigPtr>(std::move(node));
+ auto skiffSchemas = ParseSkiffSchemas(skiffFormatConfig->SkiffSchemaRegistry, skiffFormatConfig->TableSkiffSchemas);
+ TStringStream result;
+ result << '{';
+ for (const auto& schema : skiffSchemas) {
+ result << GetShortDebugString(schema);
+ result << ',';
+ }
+ result << '}';
+ return result.Str();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TString ConvertToYsonTextStringStable(const INodePtr& node)
+{
+ TStringStream out;
+ TYsonWriter writer(&out, EYsonFormat::Text);
+ VisitTree(node, &writer, true, TAttributeFilter());
+ writer.Flush();
+ return out.Str();
+}
+
+TTableSchemaPtr CreateSingleValueTableSchema(const TLogicalTypePtr& logicalType)
+{
+ std::vector<TColumnSchema> columns;
+ if (logicalType) {
+ columns.emplace_back("value", logicalType);
+
+ }
+ auto strict = static_cast<bool>(logicalType);
+ return New<TTableSchema>(columns, strict);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSkiffSchemaParse, TestAllowedTypes)
+{
+ EXPECT_EQ(
+ "{uint64,}",
+
+ ConvertToSkiffSchemaShortDebugString(
+ BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("table_skiff_schemas")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("wire_type")
+ .Value("uint64")
+ .EndMap()
+ .EndList()
+ .EndMap()));
+
+ EXPECT_EQ(
+ "{string32,}",
+
+ ConvertToSkiffSchemaShortDebugString(
+ BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("table_skiff_schemas")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("wire_type")
+ .Value("string32")
+ .EndMap()
+ .EndList()
+ .EndMap()));
+
+ EXPECT_EQ(
+ "{variant8<string32;int64;>,}",
+
+ ConvertToSkiffSchemaShortDebugString(
+ BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("table_skiff_schemas")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("wire_type")
+ .Value("variant8")
+ .Item("children")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("wire_type")
+ .Value("string32")
+ .EndMap()
+ .Item()
+ .BeginMap()
+ .Item("wire_type")
+ .Value("int64")
+ .EndMap()
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()));
+
+ EXPECT_EQ(
+ "{variant8<int64;string32;>,}",
+
+ ConvertToSkiffSchemaShortDebugString(
+ BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("skiff_schema_registry")
+ .BeginMap()
+ .Item("item1")
+ .BeginMap()
+ .Item("wire_type")
+ .Value("int64")
+ .EndMap()
+ .Item("item2")
+ .BeginMap()
+ .Item("wire_type")
+ .Value("string32")
+ .EndMap()
+ .EndMap()
+ .Item("table_skiff_schemas")
+ .BeginList()
+ .Item()
+ .BeginMap()
+ .Item("wire_type")
+ .Value("variant8")
+ .Item("children")
+ .BeginList()
+ .Item().Value("$item1")
+ .Item().Value("$item2")
+ .EndList()
+ .EndMap()
+ .EndList()
+ .EndMap()));
+}
+
+TEST(TSkiffSchemaParse, TestRecursiveTypesAreDisallowed)
+{
+ try {
+ ConvertToSkiffSchemaShortDebugString(
+ BuildYsonNodeFluently()
+ .BeginMap()
+ .Item("skiff_schema_registry")
+ .BeginMap()
+ .Item("item1")
+ .BeginMap()
+ .Item("wire_type")
+ .Value("variant8")
+ .Item("children")
+ .BeginList()
+ .Item().Value("$item1")
+ .EndList()
+ .EndMap()
+ .EndMap()
+ .Item("table_skiff_schemas")
+ .BeginList()
+ .Item().Value("$item1")
+ .EndList()
+ .EndMap());
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("recursive types are forbidden"));
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSkiffSchemaDescription, TestDescriptionDerivation)
+{
+ auto schema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Foo"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Uint64),
+ })->SetName("Bar"),
+ });
+
+ auto tableDescriptionList = CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ EXPECT_EQ(std::ssize(tableDescriptionList), 1);
+ EXPECT_EQ(tableDescriptionList[0].HasOtherColumns, false);
+ EXPECT_EQ(tableDescriptionList[0].SparseFieldDescriptionList.empty(), true);
+
+ auto denseFieldDescriptionList = tableDescriptionList[0].DenseFieldDescriptionList;
+ EXPECT_EQ(std::ssize(denseFieldDescriptionList), 2);
+
+ EXPECT_EQ(denseFieldDescriptionList[0].Name(), "Foo");
+ EXPECT_EQ(denseFieldDescriptionList[0].ValidatedSimplify(), EWireType::Uint64);
+}
+
+TEST(TSkiffSchemaDescription, TestKeySwitchColumn)
+{
+ {
+ auto schema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Foo"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("$key_switch"),
+ });
+
+ auto tableDescriptionList = CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ EXPECT_EQ(std::ssize(tableDescriptionList), 1);
+ EXPECT_EQ(tableDescriptionList[0].KeySwitchFieldIndex, std::optional<size_t>(1));
+ }
+ {
+ auto schema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("$key_switch"),
+ });
+
+ try {
+ auto tableDescriptionList = CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Column \"$key_switch\" has unexpected Skiff type"));
+ }
+ }
+}
+
+TEST(TSkiffSchemaDescription, TestDisallowEmptyNames)
+{
+ auto schema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Foo"),
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName(""),
+ });
+
+ try {
+ CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("must have a name"));
+ }
+}
+
+TEST(TSkiffSchemaDescription, TestWrongRowType)
+{
+ auto schema = CreateRepeatedVariant16Schema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Foo"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Bar"),
+ });
+
+ try {
+ CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Invalid wire type for table row"));
+ }
+}
+
+TEST(TSkiffSchemaDescription, TestOtherColumnsOk)
+{
+ auto schema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Foo"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Bar"),
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("$other_columns"),
+ });
+
+ auto tableDescriptionList = CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ ASSERT_EQ(std::ssize(tableDescriptionList), 1);
+ ASSERT_EQ(tableDescriptionList[0].HasOtherColumns, true);
+}
+
+TEST(TSkiffSchemaDescription, TestOtherColumnsWrongType)
+{
+ auto schema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Foo"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Bar"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("$other_columns"),
+ });
+
+ try {
+ CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Invalid wire type for column \"$other_columns\""));
+ }
+}
+
+TEST(TSkiffSchemaDescription, TestOtherColumnsWrongPlace)
+{
+ auto schema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Foo"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("$other_columns"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("Bar"),
+ });
+
+ try {
+ CreateTableDescriptionList({schema}, RangeIndexColumnName, RowIndexColumnName);
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Invalid placement of special column \"$other_columns\""));
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+ISchemalessFormatWriterPtr CreateSkiffWriter(
+ std::shared_ptr<TSkiffSchema> skiffSchema,
+ TNameTablePtr nameTable,
+ IOutputStream* outputStream,
+ const std::vector<TTableSchemaPtr>& tableSchemaList,
+ int keyColumnCount = 0,
+ bool enableEndOfStream = false)
+{
+ auto controlAttributesConfig = New<TControlAttributesConfig>();
+ controlAttributesConfig->EnableKeySwitch = (keyColumnCount > 0);
+ controlAttributesConfig->EnableEndOfStream = enableEndOfStream;
+ return CreateWriterForSkiff(
+ {std::move(skiffSchema)},
+ std::move(nameTable),
+ tableSchemaList,
+ NConcurrency::CreateAsyncAdapter(outputStream),
+ false,
+ controlAttributesConfig,
+ keyColumnCount);
+}
+
+TString TableToSkiff(
+ const TLogicalTypePtr& logicalType,
+ const std::shared_ptr<TSkiffSchema>& typeSchema,
+ const TNamedValue::TValue& value)
+{
+ auto schema = CreateSingleValueTableSchema(logicalType);
+ auto skiffSchema = CreateTupleSchema({
+ typeSchema->SetName("value")
+ });
+
+ auto nameTable = New<TNameTable>();
+
+ TStringStream resultStream;
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {schema});
+
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {"value", value}
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ auto result = resultStream.Str();
+ if (!TStringBuf(result).StartsWith(TString(2, '\0'))) {
+ THROW_ERROR_EXCEPTION("Expected skiff value to start with \\x00\\x00, but prefix is %Qv",
+ EscapeC(result.substr(0, 2)));
+ }
+
+ return result.substr(2);
+}
+
+TNamedValue::TValue SkiffToTable(
+ const TLogicalTypePtr& logicalType,
+ const std::shared_ptr<TSkiffSchema>& typeSchema,
+ const TString& skiffValue)
+{
+ auto schema = CreateSingleValueTableSchema(logicalType);
+ auto skiffSchema = CreateTupleSchema({
+ typeSchema->SetName("value")
+ });
+ auto nameTable = New<TNameTable>();
+
+ TCollectingValueConsumer rowCollector(schema);
+ auto parser = CreateParserForSkiff(skiffSchema, &rowCollector);
+ parser->Read(TString(2, 0));
+ parser->Read(skiffValue);
+ parser->Finish();
+
+ if (rowCollector.Size() != 1) {
+ THROW_ERROR_EXCEPTION("Expected 1 row collected, actual %v",
+ rowCollector.Size());
+ }
+ auto value = rowCollector.GetRowValue(0, "value");
+ return TNamedValue::ExtractValue(value);
+}
+
+#define CHECK_BIDIRECTIONAL_CONVERSION(logicalTypeArg, skiffSchemaArg, tableValueArg, hexSkiffArg) \
+ do { \
+ try { \
+ TLogicalTypePtr logicalType = (logicalTypeArg); \
+ std::shared_ptr<TSkiffSchema> skiffSchema = (skiffSchemaArg); \
+ TNamedValue::TValue tableValue = (tableValueArg); \
+ TString hexSkiff = (hexSkiffArg); \
+ auto nameTable = New<TNameTable>(); \
+ auto actualSkiff = TableToSkiff(logicalType, skiffSchema, tableValue); \
+ EXPECT_EQ(HexEncode(actualSkiff), hexSkiff); \
+ auto actualValue = SkiffToTable(logicalType, skiffSchema, HexDecode(hexSkiff)); \
+ EXPECT_EQ(actualValue, tableValue); \
+ } catch (const std::exception& ex) { \
+ ADD_FAILURE() << "unexpected exception: " << ex.what(); \
+ } \
+ } while (0)
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TestAllWireTypes(bool useSchema)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("int64"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("uint64"),
+ CreateSimpleTypeSchema(EWireType::Double)->SetName("double_1"),
+ CreateSimpleTypeSchema(EWireType::Double)->SetName("double_2"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("boolean"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("string32"),
+ CreateSimpleTypeSchema(EWireType::Nothing)->SetName("null"),
+
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName("opt_int64"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Uint64),
+ })->SetName("opt_uint64"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Double),
+ })->SetName("opt_double_1"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Double),
+ })->SetName("opt_double_2"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ })->SetName("opt_boolean"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::String32),
+ })->SetName("opt_string32"),
+ });
+ std::vector<TTableSchemaPtr> tableSchemas;
+ if (useSchema) {
+ tableSchemas.push_back(New<TTableSchema>(std::vector{
+ TColumnSchema("int64", EValueType::Int64),
+ TColumnSchema("uint64", EValueType::Uint64),
+ TColumnSchema("double_1", EValueType::Double),
+ TColumnSchema("double_2", ESimpleLogicalValueType::Float),
+ TColumnSchema("boolean", EValueType::Boolean),
+ TColumnSchema("string32", EValueType::String),
+ TColumnSchema("null", EValueType::Null),
+ TColumnSchema("opt_int64", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))),
+ TColumnSchema("opt_uint64", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Uint64))),
+ TColumnSchema("opt_double_1", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Double))),
+ TColumnSchema("opt_double_2", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Float))),
+ TColumnSchema("opt_boolean", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Boolean))),
+ TColumnSchema("opt_string32", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::String))),
+ }));
+ } else {
+ tableSchemas.push_back(New<TTableSchema>());
+ }
+ auto nameTable = New<TNameTable>();
+ TString result;
+ {
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, tableSchemas);
+
+ auto isWriterReady = writer->Write({
+ MakeRow(nameTable, {
+ {"int64", -1},
+ {"uint64", 2u},
+ {"double_1", 3.0},
+ {"double_2", 3.0},
+ {"boolean", true},
+ {"string32", "four"},
+ {"null", nullptr},
+
+ {"opt_int64", -5},
+ {"opt_uint64", 6u},
+ {"opt_double_1", 7.0},
+ {"opt_double_2", 7.0},
+ {"opt_boolean", false},
+ {"opt_string32", "eight"},
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ });
+ if (!isWriterReady) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {"int64", -9},
+ {"uint64", 10u},
+ {"double_1", 11.0},
+ {"double_2", 11.0},
+ {"boolean", false},
+ {"string32", "twelve"},
+ {"null", nullptr},
+
+ {"opt_int64", nullptr},
+ {"opt_uint64", nullptr},
+ {"opt_double_1", nullptr},
+ {"opt_double_2", nullptr},
+ {"opt_boolean", nullptr},
+ {"opt_string32", nullptr},
+ {TString(TableIndexColumnName), 0},
+ }).Get()
+ }));
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ }
+
+ TStringInput resultInput(result);
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), -1);
+ ASSERT_EQ(checkedSkiffParser.ParseUint64(), 2u);
+ // double_1
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 3.0);
+ // double_2
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 3.0);
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), true);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "four");
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), -5);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseUint64(), 6u);
+
+ // double_1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 7.0);
+
+ // double_2
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 7.0);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), false);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "eight");
+
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), -9);
+ ASSERT_EQ(checkedSkiffParser.ParseUint64(), 10u);
+ // double_1
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 11.0);
+ // double_2
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 11.0);
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), false);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "twelve");
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ // double_1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ // double_2
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+
+ // end
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestAllWireTypesNoSchema)
+{
+ TestAllWireTypes(false);
+}
+
+TEST(TSkiffWriter, TestAllWireTypesWithSchema)
+{
+ TestAllWireTypes(true);
+}
+
+class TSkiffYsonWireTypeP
+ : public ::testing::TestWithParam<std::tuple<
+ TLogicalTypePtr,
+ TNamedValue::TValue,
+ TString
+ >>
+{
+public:
+ static std::vector<ParamType> GetCases()
+ {
+ using namespace NLogicalTypeShortcuts;
+ std::vector<ParamType> result;
+
+ for (const auto& example : GetPrimitiveValueExamples()) {
+ result.emplace_back(example.LogicalType, example.Value, example.PrettyYson);
+ result.emplace_back(nullptr, example.Value, example.PrettyYson);
+ }
+
+ for (const auto type : TEnumTraits<ESimpleLogicalValueType>::GetDomainValues()) {
+ auto logicalType = OptionalLogicalType(SimpleLogicalType(type));
+ if (IsV3Composite(logicalType)) {
+ // Optional<Null> is not v1 type
+ continue;
+ }
+ result.emplace_back(logicalType, nullptr, "#");
+ }
+ return result;
+ }
+
+ static const std::vector<ParamType> Cases;
+};
+
+const std::vector<TSkiffYsonWireTypeP::ParamType> TSkiffYsonWireTypeP::Cases = TSkiffYsonWireTypeP::GetCases();
+
+INSTANTIATE_TEST_SUITE_P(
+ Cases,
+ TSkiffYsonWireTypeP,
+ ::testing::ValuesIn(TSkiffYsonWireTypeP::Cases));
+
+TEST_P(TSkiffYsonWireTypeP, Test)
+{
+ const auto& [logicalType, value, expectedYson] = GetParam();
+ TTableSchemaPtr tableSchema;
+ if (logicalType) {
+ tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("column", logicalType),
+ });
+ } else {
+ tableSchema = New<TTableSchema>();
+ }
+ auto skiffTableSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("column"),
+ });
+ auto nameTable = New<TNameTable>();
+ TStringStream actualSkiffDataStream;
+ auto writer = CreateSkiffWriter(skiffTableSchema, nameTable, &actualSkiffDataStream, {tableSchema});
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {{"column", value}})
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ auto actualSkiffData = actualSkiffDataStream.Str();
+ {
+ TMemoryInput in(actualSkiffData);
+ TCheckedSkiffParser parser(CreateVariant16Schema({skiffTableSchema}), &in);
+ EXPECT_EQ(parser.ParseVariant16Tag(), 0);
+ auto actualYson = parser.ParseYson32();
+ parser.ValidateFinished();
+
+ EXPECT_EQ(CanonizeYson(actualYson), CanonizeYson(expectedYson));
+ }
+
+ TCollectingValueConsumer rowCollector(nameTable);
+ auto parser = CreateParserForSkiff(skiffTableSchema, tableSchema, &rowCollector);
+ parser->Read(actualSkiffDataStream.Str());
+ parser->Finish();
+ auto actualValue = rowCollector.GetRowValue(0, "column");
+ EXPECT_EQ(actualValue, TNamedValue("column", value).ToUnversionedValue(nameTable));
+}
+
+TEST(TSkiffWriter, TestYsonWireType)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("yson32"),
+
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Yson32),
+ })->SetName("opt_yson32"),
+ });
+ auto nameTable = New<TNameTable>();
+ TString result;
+ {
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()});
+
+ auto write = [&] (TUnversionedRow row) {
+ if (!writer->Write({row})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ };
+
+ // Row 0 (Null)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+
+ {"yson32", nullptr},
+ {"opt_yson32", nullptr},
+ }).Get(),
+ });
+
+ // Row 1 (Int64)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+
+ {"yson32", -5},
+ {"opt_yson32", -6},
+ }).Get(),
+ });
+
+ // Row 2 (Uint64)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+
+ {"yson32", 42u},
+ {"opt_yson32", 43u},
+ }).Get(),
+ });
+
+ // Row 3 ((Double)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+
+ {"yson32", 2.7182818},
+ {"opt_yson32", 3.1415926},
+ }).Get(),
+ });
+
+ // Row 4 ((Boolean)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+
+ {"yson32", true},
+ {"opt_yson32", false},
+ }).Get(),
+ });
+
+ // Row 5 ((String)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+
+ {"yson32", "Yin"},
+ {"opt_yson32", "Yang"},
+ }).Get(),
+ });
+
+ // Row 6 ((Any)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+
+ {"yson32", EValueType::Any, "{foo=bar;}"},
+ {"opt_yson32", EValueType::Any, "{bar=baz;}"},
+ }).Get(),
+ });
+
+ // Row 7 ((missing optional values)
+ write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ });
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ }
+
+ TStringInput resultInput(result);
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ auto parseYson = [] (TCheckedSkiffParser* parser) {
+ auto yson = TString{parser->ParseYson32()};
+ return ConvertToNode(TYsonString(yson));
+ };
+
+ // Row 0 (Null)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->GetType(), ENodeType::Entity);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+
+ // Row 1 (Int64)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsInt64()->GetValue(), -5);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsInt64()->GetValue(), -6);
+
+ // Row 2 (Uint64)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsUint64()->GetValue(), 42u);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsUint64()->GetValue(), 43u);
+
+ // Row 3 (Double)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsDouble()->GetValue(), 2.7182818);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsDouble()->GetValue(), 3.1415926);
+
+ // Row 4 (Boolean)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsBoolean()->GetValue(), true);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsBoolean()->GetValue(), false);
+
+ // Row 5 (String)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsString()->GetValue(), "Yin");
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsString()->GetValue(), "Yang");
+
+ // Row 6 (Any)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsMap()->GetChildOrThrow("foo")->AsString()->GetValue(), "bar");
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->AsMap()->GetChildOrThrow("bar")->AsString()->GetValue(), "baz");
+
+ // Row 7 (Null)
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser)->GetType(), ENodeType::Entity);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+
+ // end
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+class TSkiffFormatSmallIntP
+: public ::testing::TestWithParam<std::tuple<
+ std::shared_ptr<TSkiffSchema>,
+ TLogicalTypePtr,
+ TNamedValue::TValue,
+ TString
+>>
+{
+public:
+ static std::vector<ParamType> GetCases()
+ {
+ using namespace NLogicalTypeShortcuts;
+
+ std::vector<ParamType> result;
+
+ auto addSimpleCase = [&result] (
+ EWireType wireType,
+ const TLogicalTypePtr& logicalType,
+ auto value,
+ TStringBuf skiffValue)
+ {
+ auto simpleSkiffSchema = CreateSimpleTypeSchema(wireType);
+ auto simpleSkiffData = TString(2, 0) + skiffValue;
+ result.emplace_back(simpleSkiffSchema, logicalType, value, simpleSkiffData);
+ };
+
+ auto addListCase = [&result] (
+ EWireType wireType,
+ const TLogicalTypePtr& logicalType,
+ auto value,
+ TStringBuf skiffValue)
+ {
+ auto listSkiffSchema = CreateRepeatedVariant8Schema({CreateSimpleTypeSchema(wireType)});
+ auto listSkiffData = TString(3, 0) + skiffValue + TString(1, '\xff');
+ auto listValue = TNamedValue::TValue{
+ TNamedValue::TComposite{
+ BuildYsonStringFluently()
+ .BeginList()
+ .Item().Value(value)
+ .EndList().ToString()
+ }
+ };
+ result.emplace_back(listSkiffSchema, List(logicalType), listValue, listSkiffData);
+ };
+
+ auto addSimpleAndListCases = [&] (
+ EWireType wireType,
+ const TLogicalTypePtr& logicalType,
+ auto value,
+ TStringBuf skiffValue)
+ {
+ addSimpleCase(wireType, logicalType, value, skiffValue);
+ addListCase(wireType, logicalType, value, skiffValue);
+ };
+
+ auto addMultiCase = [&] (EWireType wireType, auto value, TStringBuf skiffValue) {
+ auto add = [&] (const TLogicalTypePtr& logicalType) {
+ addSimpleAndListCases(wireType, logicalType, value, skiffValue);
+ };
+ addSimpleCase(wireType, Yson(), value, skiffValue);
+
+ using T = std::decay_t<decltype(value)>;
+ static_assert(std::is_integral_v<T>);
+ if constexpr (std::is_signed_v<T>) {
+ if (std::numeric_limits<i8>::min() <= value && value <= std::numeric_limits<i8>::max()) {
+ add(Int8());
+ }
+ if (std::numeric_limits<i16>::min() <= value && value <= std::numeric_limits<i16>::max()) {
+ add(Int16());
+ }
+ if (std::numeric_limits<i32>::min() <= value && value <= std::numeric_limits<i32>::max()) {
+ add(Int32());
+ }
+ add(Int64());
+ } else {
+ if (value <= std::numeric_limits<ui8>::max()) {
+ add(Uint8());
+ }
+ if (value <= std::numeric_limits<ui16>::max()) {
+ add(Uint16());
+ }
+ if (value <= std::numeric_limits<ui32>::max()) {
+ add(Uint32());
+ }
+ add(Uint64());
+ }
+ };
+ addMultiCase(EWireType::Int8, 0, TStringBuf("\x00"sv));
+ addMultiCase(EWireType::Int8, 42, TStringBuf("*"));
+ addMultiCase(EWireType::Int8, -42, TStringBuf("\xd6"sv));
+ addMultiCase(EWireType::Int8, 127, TStringBuf("\x7f"sv));
+ addMultiCase(EWireType::Int8, -128, TStringBuf("\x80"sv));
+
+ addMultiCase(EWireType::Int16, 0, TStringBuf("\x00\x00"sv));
+ addMultiCase(EWireType::Int16, 42, TStringBuf("\x2a\x00"sv));
+ addMultiCase(EWireType::Int16, -42, TStringBuf("\xd6\xff"sv));
+ addMultiCase(EWireType::Int16, 0x7fff, TStringBuf("\xff\x7f"sv));
+ addMultiCase(EWireType::Int16, -0x8000, TStringBuf("\x00\x80"sv));
+
+ addMultiCase(EWireType::Int32, 0, TStringBuf("\x00\x00\x00\x00"sv));
+ addMultiCase(EWireType::Int32, 42, TStringBuf("\x2a\x00\x00\x00"sv));
+ addMultiCase(EWireType::Int32, -42, TStringBuf("\xd6\xff\xff\xff"sv));
+ addMultiCase(EWireType::Int32, 0x7fffffff, TStringBuf("\xff\xff\xff\x7f"sv));
+ addMultiCase(EWireType::Int32, -0x80000000l, TStringBuf("\x00\x00\x00\x80"sv));
+
+ addMultiCase(EWireType::Uint8, 0ull, TStringBuf("\x00"sv));
+ addMultiCase(EWireType::Uint8, 42ull, TStringBuf("*"));
+ addMultiCase(EWireType::Uint8, 255ull, TStringBuf("\xff"sv));
+
+ addMultiCase(EWireType::Uint16, 0ull, TStringBuf("\x00\x00"sv));
+ addMultiCase(EWireType::Uint16, 42ull, TStringBuf("\x2a\x00"sv));
+ addMultiCase(EWireType::Uint16, 0xFFFFull, TStringBuf("\xff\xff"sv));
+
+ addMultiCase(EWireType::Uint32, 0ull, TStringBuf("\x00\x00\x00\x00"sv));
+ addMultiCase(EWireType::Uint32, 42ull, TStringBuf("\x2a\x00\x00\x00"sv));
+ addMultiCase(EWireType::Uint32, 0xFFFFFFFFull, TStringBuf("\xff\xff\xff\xff"sv));
+
+ addSimpleAndListCases(EWireType::Uint16, Date(), 0ull, TStringBuf("\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Uint16, Date(), 42ull, TStringBuf("\x2a\x00"sv));
+ addSimpleAndListCases(EWireType::Uint16, Date(), DateUpperBound - 1, TStringBuf("\x08\xc2"sv));
+
+ addSimpleAndListCases(EWireType::Uint32, Datetime(), 0ull, TStringBuf("\x00\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Uint32, Datetime(), 42ull, TStringBuf("\x2a\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Uint32, Datetime(), DatetimeUpperBound - 1, TStringBuf("\x7f\xdd\xce\xff"sv));
+
+ addSimpleAndListCases(EWireType::Int64, Date32(), 0ll, TStringBuf("\x00\x00\x00\x00\x00\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Int64, Date32(), Date32UpperBound - 1, TStringBuf("\x3f\x73\x2e\x03\x00\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Int64, Date32(), Date32LowerBound, TStringBuf("\xbf\x8c\xd1\xfc\xff\xff\xff\xff"sv));
+
+ addSimpleAndListCases(EWireType::Int32, Date32(), 0ll, TStringBuf("\x00\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Int32, Date32(), Date32UpperBound - 1, TStringBuf("\x3f\x73\x2e\x03"sv));
+ addSimpleAndListCases(EWireType::Int32, Date32(), Date32LowerBound, TStringBuf("\xbf\x8c\xd1\xfc"sv));
+
+ addSimpleAndListCases(EWireType::Int64, Datetime64(), 0ll, TStringBuf("\x00\x00\x00\x00\x00\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Int64, Datetime64(), Datetime64UpperBound - 1, TStringBuf("\xff\xdf\xf0\xbc\x31\x04\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Int64, Datetime64(), Datetime64LowerBound, TStringBuf("\x80\xce\x0d\x43\xce\xfb\xff\xff"sv));
+
+ addSimpleAndListCases(EWireType::Int64, Timestamp64(), 0ll, TStringBuf("\x00\x00\x00\x00\x00\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Int64, Timestamp64(), Timestamp64UpperBound - 1, TStringBuf("\xff\xff\xf7\x75\x42\xf1\xff\x3f"sv));
+ addSimpleAndListCases(EWireType::Int64, Timestamp64(), Timestamp64LowerBound, TStringBuf("\x00\xa0\x30\x6c\xa9\x0e\x00\xc0"sv));
+
+ addSimpleAndListCases(EWireType::Int64, Interval64(), 0ll, TStringBuf("\x00\x00\x00\x00\x00\x00\x00\x00"sv));
+ addSimpleAndListCases(EWireType::Int64, Interval64(), Interval64UpperBound - 1, TStringBuf("\x00\x60\xc7\x09\x99\xe2\xff\x7f"sv));
+ addSimpleAndListCases(EWireType::Int64, Interval64(), -Interval64UpperBound + 1, TStringBuf("\x00\xa0\x38\xf6\x66\x1d\x00\x80"sv));
+
+ return result;
+ }
+
+ static const std::vector<ParamType> Cases;
+};
+
+const std::vector<TSkiffFormatSmallIntP::ParamType> TSkiffFormatSmallIntP::Cases = TSkiffFormatSmallIntP::GetCases();
+
+INSTANTIATE_TEST_SUITE_P(
+ Cases,
+ TSkiffFormatSmallIntP,
+ ::testing::ValuesIn(TSkiffFormatSmallIntP::Cases));
+
+TEST_P(TSkiffFormatSmallIntP, Test)
+{
+ const auto& [skiffValueSchema, logicalType, value, expectedSkiffData] = GetParam();
+
+ const auto nameTable = New<TNameTable>();
+
+ TStringStream actualSkiffData;
+ auto skiffTableSchema = CreateTupleSchema({
+ skiffValueSchema->SetName("column")
+ });
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("column", logicalType),
+ });
+ auto writer = CreateSkiffWriter(skiffTableSchema, nameTable, &actualSkiffData, {tableSchema});
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {{"column", value}})
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ EXPECT_EQ(actualSkiffData.Str(), expectedSkiffData);
+
+ TCollectingValueConsumer rowCollector(nameTable);
+ auto parser = CreateParserForSkiff(skiffTableSchema, tableSchema, &rowCollector);
+ parser->Read(expectedSkiffData);
+ parser->Finish();
+ auto actualValue = rowCollector.GetRowValue(0, "column");
+
+ EXPECT_EQ(actualValue, TNamedValue("common", value).ToUnversionedValue(nameTable));
+}
+
+TEST(TSkiffWriter, TestBadSmallIntegers)
+{
+ using namespace NLogicalTypeShortcuts;
+ auto writeSkiffValue = [] (
+ std::shared_ptr<TSkiffSchema>&& typeSchema,
+ TLogicalTypePtr logicalType,
+ TNamedValue::TValue value)
+ {
+ TStringStream result;
+ auto skiffSchema = CreateTupleSchema({
+ typeSchema->SetName("column")
+ });
+ auto tableSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ TColumnSchema("column", std::move(logicalType)),
+ });
+ auto nameTable = New<TNameTable>();
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &result, {tableSchema});
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {{"column", std::move(value)}})
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ return result.Str();
+ };
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Int8), Int64(), 128),
+ "is out of range for possible values");
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Int8), Int64(), -129),
+ "is out of range for possible values");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Int16), Int64(), 0x8000),
+ "is out of range for possible values");
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Int16), Int64(), -0x8001),
+ "is out of range for possible values");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Int32), Int64(), 0x80000000ll),
+ "is out of range for possible values");
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Int32), Int64(), -0x80000001ll),
+ "is out of range for possible values");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Uint8), Uint64(), 256ull),
+ "is out of range for possible values");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Uint16), Uint64(), 0x1FFFFull),
+ "is out of range for possible values");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ writeSkiffValue(CreateSimpleTypeSchema(EWireType::Uint32), Uint64(), 0x100000000ull),
+ "is out of range for possible values");
+}
+
+class TSkiffFormatUuidTestP : public ::testing::TestWithParam<std::tuple<
+ TNameTablePtr,
+ TTableSchemaPtr,
+ std::shared_ptr<TSkiffSchema>,
+ std::vector<TUnversionedOwningRow>,
+ TString
+>>
+{
+public:
+ static std::vector<ParamType> GetCases()
+ {
+ using namespace NLogicalTypeShortcuts;
+
+ auto nameTable = New<TNameTable>();
+ const auto stringUuidValue = TStringBuf("\xee\x1f\x37\x70" "\xb9\x93\x64\xb5" "\xe4\xdf\xe9\x03" "\x67\x5c\x30\x62");
+ const auto uint128UuidValue = TStringBuf("\x62\x30\x5c\x67" "\x03\xe9\xdf\xe4" "\xb5\x64\x93\xb9" "\x70\x37\x1f\xee");
+
+ const auto requiredTableSchema = New<TTableSchema>(std::vector<TColumnSchema>{TColumnSchema("uuid", Uuid())});
+ const auto optionalTableSchema = New<TTableSchema>(std::vector<TColumnSchema>{TColumnSchema("uuid", Optional(Uuid()))});
+
+ const auto optionalUint128SkiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Uint128),
+ })->SetName("uuid"),
+ });
+
+ const auto requiredUint128SkiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint128)->SetName("uuid"),
+ });
+
+ const auto optionalStringSkiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::String32),
+ })->SetName("uuid"),
+ });
+
+ const auto requiredStringSkiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("uuid"),
+ });
+
+ std::vector<ParamType> result;
+
+ result.emplace_back(
+ nameTable,
+ requiredTableSchema,
+ requiredUint128SkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + uint128UuidValue);
+
+ result.emplace_back(
+ nameTable,
+ optionalTableSchema,
+ requiredUint128SkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + uint128UuidValue);
+
+ result.emplace_back(
+ nameTable,
+ requiredTableSchema,
+ optionalUint128SkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + "\1" + uint128UuidValue);
+
+ result.emplace_back(
+ nameTable,
+ optionalTableSchema,
+ optionalUint128SkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + "\1" + uint128UuidValue);
+
+ const TString uuidLen = TString(TStringBuf("\x10\x00\x00\x00"sv));
+
+ result.emplace_back(
+ nameTable,
+ requiredTableSchema,
+ requiredStringSkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + uuidLen + stringUuidValue);
+
+ result.emplace_back(
+ nameTable,
+ optionalTableSchema,
+ requiredStringSkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + uuidLen + stringUuidValue);
+
+ result.emplace_back(
+ nameTable,
+ requiredTableSchema,
+ optionalStringSkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + "\1" + uuidLen + stringUuidValue);
+
+ result.emplace_back(
+ nameTable,
+ optionalTableSchema,
+ optionalStringSkiffSchema,
+ std::vector<TUnversionedOwningRow>{
+ MakeRow(nameTable, {{"uuid", stringUuidValue}}),
+ },
+ TString(2, '\0') + "\1" + uuidLen + stringUuidValue);
+
+ return result;
+ }
+
+ static const std::vector<ParamType> Cases;
+};
+
+const std::vector<TSkiffFormatUuidTestP::ParamType> TSkiffFormatUuidTestP::Cases = TSkiffFormatUuidTestP::GetCases();
+
+INSTANTIATE_TEST_SUITE_P(
+ Cases,
+ TSkiffFormatUuidTestP,
+ ::testing::ValuesIn(TSkiffFormatUuidTestP::Cases));
+
+TEST_P(TSkiffFormatUuidTestP, Test)
+{
+ const auto& [nameTable, tableSchema, skiffSchema, rows, skiffString] = GetParam();
+
+ TStringStream result;
+ std::vector<TUnversionedRow> nonOwningRows;
+ for (const auto& row : rows) {
+ nonOwningRows.emplace_back(row);
+ }
+ auto skiffWriter = CreateSkiffWriter(skiffSchema, nameTable, &result, {tableSchema});
+ Y_UNUSED(skiffWriter->Write(TRange(nonOwningRows)));
+ skiffWriter->Close().Get().ThrowOnError();
+ ASSERT_EQ(result.Str(), skiffString);
+
+ TCollectingValueConsumer rowCollector(nameTable);
+ auto requiredParser = CreateParserForSkiff(skiffSchema, tableSchema, &rowCollector);
+ requiredParser->Read(result.Str());
+ requiredParser->Finish();
+ ASSERT_EQ(rowCollector.GetRowList(), rows);
+}
+
+TEST(TSkiffFormatUuidTest, TestError)
+{
+ using namespace NLogicalTypeShortcuts;
+
+ auto nameTable = New<TNameTable>();
+ auto tableSchema = New<TTableSchema>(
+ std::vector<TColumnSchema>{TColumnSchema("uuid", Optional(Uuid()))});
+
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Uint128)->SetName("uuid"),
+ });
+
+ TStringStream result;
+ auto skiffWriter = CreateSkiffWriter(skiffSchema, nameTable, &result, {tableSchema});
+ Y_UNUSED(skiffWriter->Write({
+ MakeRow(nameTable, {{"uuid", nullptr}}),
+ }));
+ EXPECT_THROW_WITH_SUBSTRING(skiffWriter->Close().Get().ThrowOnError(),
+ "Unexpected type");
+
+}
+
+class TSkiffWriterSingular
+ : public ::testing::Test
+ , public ::testing::WithParamInterface<ESimpleLogicalValueType>
+{};
+
+INSTANTIATE_TEST_SUITE_P(
+ Singular,
+ TSkiffWriterSingular,
+ ::testing::Values(ESimpleLogicalValueType::Null, ESimpleLogicalValueType::Void));
+
+TEST_P(TSkiffWriterSingular, TestOptionalSingular)
+{
+ const auto singularType = GetParam();
+
+ auto skiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ })->SetName("opt_null"),
+ });
+
+ auto nameTable = New<TNameTable>();
+ const std::vector<TTableSchemaPtr> tableSchemas = {
+ New<TTableSchema>(std::vector{
+ TColumnSchema("opt_null", OptionalLogicalType(SimpleLogicalType(singularType))),
+ }),
+ };
+
+ TString result;
+ {
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, tableSchemas);
+ // Row 0
+ auto isReady = writer->Write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"opt_null", nullptr},
+ }).Get(),
+ });
+ if (!isReady) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ // Row 1
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"opt_null", EValueType::Composite, "[#]"},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ }
+
+ TStringInput resultInput(result);
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestRearrange)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("number"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::String32),
+ })->SetName("eng"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::String32),
+ })->SetName("rus"),
+ });
+ auto nameTable = New<TNameTable>();
+ TString result;
+ {
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()});
+
+ auto write = [&] (TUnversionedRow row) {
+ if (!writer->Write({row})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ };
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"number", 1},
+ {"eng", "one"},
+ {"rus", nullptr},
+ }).Get());
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"eng", nullptr},
+ {"number", 2},
+ {"rus", "dva"},
+ }).Get());
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"rus", "tri"},
+ {"eng", "three"},
+ {"number", 3},
+ }).Get());
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ }
+
+ TStringInput resultInput(result);
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "one");
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 2);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "dva");
+
+ // row 2
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 3);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "three");
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "tri");
+
+ // end
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestMissingRequiredField)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("number"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("eng"),
+ });
+ auto nameTable = New<TNameTable>();
+ TString result;
+ try {
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()});
+
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"number", 1},
+ }).Get()
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Unexpected type of \"eng\" column"));
+ }
+}
+
+TEST(TSkiffWriter, TestSparse)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateRepeatedVariant16Schema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("int64"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("uint64"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("string32"),
+ })->SetName("$sparse_columns"),
+ });
+
+ auto nameTable = New<TNameTable>();
+ TString result;
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()});
+
+ auto write = [&] (TUnversionedRow row) {
+ if (!writer->Write({row})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ };
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"int64", -1},
+ {"string32", "minus one"},
+ }).Get());
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"string32", "minus five"},
+ {"int64", -5},
+ }).Get());
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"uint64", 42u},
+ }).Get());
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"int64", -8},
+ {"uint64", nullptr},
+ {"string32", nullptr},
+ }).Get());
+
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(result);
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), -1);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 2);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "minus one");
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), EndOfSequenceTag<ui16>());
+
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 2);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "minus five");
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), -5);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), EndOfSequenceTag<ui16>());
+
+ // row 2
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseUint64(), 42u);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), EndOfSequenceTag<ui16>());
+
+ // row 3
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), -8);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), EndOfSequenceTag<ui16>());
+
+ // row 4
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), EndOfSequenceTag<ui16>());
+
+ // end
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestMissingFields)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("value"),
+ });
+
+ try {
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()});
+
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"unknown_column", "four"},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Column \"unknown_column\" is not described by Skiff schema"));
+ }
+
+ try {
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto unknownColumnId = nameTable->RegisterName("unknown_column");
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, std::vector{New<TTableSchema>()});
+
+ ASSERT_TRUE(unknownColumnId < nameTable->GetId("value"));
+
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"unknown_column", "four"},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+ ADD_FAILURE();
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Column \"unknown_column\" is not described by Skiff schema"));
+ }
+}
+
+TEST(TSkiffWriter, TestOtherColumns)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64)
+ })->SetName("int64_column"),
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("$other_columns"),
+ });
+
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ nameTable->RegisterName("string_column");
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()});
+
+ auto write = [&] (TUnversionedRow row) {
+ if (!writer->Write({row})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ };
+
+ // Row 0.
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"string_column", "foo"},
+ }).Get());
+
+ // Row 1.
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"int64_column", 42},
+ }).Get());
+
+ // Row 2.
+ write(MakeRow(nameTable, {
+ {TString(TableIndexColumnName), 0},
+ {"other_string_column", "bar"},
+ }).Get());
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ auto parseYson = [] (TCheckedSkiffParser* parser) {
+ auto yson = TString{parser->ParseYson32()};
+ return ConvertToYsonTextStringStable(ConvertToNode(TYsonString(yson)));
+ };
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser), "{\"string_column\"=\"foo\";}");
+
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 42);
+ ASSERT_EQ(parseYson(&checkedSkiffParser), "{}");
+
+ // row 2
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(parseYson(&checkedSkiffParser), "{\"other_string_column\"=\"bar\";}");
+
+ // end
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestKeySwitch)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("value"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("$key_switch"),
+ });
+
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()}, 1);
+
+ auto write = [&] (TUnversionedRow row) {
+ if (!writer->Write({row})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ };
+
+ // Row 0.
+ write(MakeRow(nameTable, {
+ {"value", "one"},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ // Row 1.
+ write(MakeRow(nameTable, {
+ {"value", "one"},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ // Row 2.
+ write(MakeRow(nameTable, {
+ {"value", "two"},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ TString buf;
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "one");
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), false);
+
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "one");
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), false);
+
+ // row 2
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "two");
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), true);
+
+ // end
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestEndOfStream)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("value"),
+ });
+
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()}, 1, true);
+
+ auto write = [&] (TUnversionedRow row) {
+ if (!writer->Write({row})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ };
+
+ // Row 0.
+ write(MakeRow(nameTable, {
+ {"value", "zero"},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ // Row 1.
+ write(MakeRow(nameTable, {
+ {"value", "one"},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ TString buf;
+
+ // Row 0.
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "zero");
+
+ // Row 1.
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "one");
+
+ // End of stream.
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0xffff);
+
+ // The End.
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestRowRangeIndex)
+{
+ const auto rowAndRangeIndex = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName("$range_index"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName("$row_index"),
+ });
+
+ struct TRow {
+ int TableIndex;
+ std::optional<int> RangeIndex;
+ std::optional<int> RowIndex;
+ };
+ auto generateUnversionedRow = [] (const TRow& row, const TNameTablePtr& nameTable) {
+ std::vector<TNamedValue> values = {
+ {TString(TableIndexColumnName), row.TableIndex},
+ };
+ if (row.RangeIndex) {
+ values.emplace_back(TString(RangeIndexColumnName), *row.RangeIndex);
+ }
+ if (row.RowIndex) {
+ values.emplace_back(TString(RowIndexColumnName), *row.RowIndex);
+ }
+ return MakeRow(nameTable, values);
+ };
+
+ auto skiffWrite = [generateUnversionedRow] (const std::vector<TRow>& rows, const std::shared_ptr<TSkiffSchema>& skiffSchema) {
+ std::vector<TTableSchemaPtr> tableSchemas;
+ {
+ THashSet<int> tableIndices;
+ for (const auto& row : rows) {
+ tableIndices.insert(row.TableIndex);
+ }
+ tableSchemas.assign(tableIndices.size(), New<TTableSchema>());
+ }
+
+
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto writer = CreateSkiffWriter(
+ skiffSchema,
+ nameTable,
+ &resultStream,
+ tableSchemas);
+
+ for (const auto& row : rows) {
+ if (!writer->Write({generateUnversionedRow(row, nameTable)})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ }
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ return HexEncode(resultStream.Str());
+ };
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, 0, 0},
+ {0, 0, 1},
+ {0, 0, 2},
+ }, rowAndRangeIndex).data(),
+
+ "0000" "01""00000000""00000000" "01""00000000""00000000"
+ "0000" "00" "00"
+ "0000" "00" "00");
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, 0, 0},
+ {0, 0, 1},
+ {0, 0, 3},
+ }, rowAndRangeIndex).data(),
+
+ "0000" "01""00000000""00000000" "01""00000000""00000000"
+ "0000" "00" "00"
+ "0000" "00" "01""03000000""00000000");
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, 0, 0},
+ {0, 0, 1},
+ {0, 1, 2},
+ {0, 1, 3},
+ }, rowAndRangeIndex).data(),
+
+ "0000" "01""00000000""00000000" "01""00000000""00000000"
+ "0000" "00" "00"
+ "0000" "01""01000000""00000000" "01""02000000""00000000"
+ "0000" "00" "00");
+
+ EXPECT_THROW_WITH_SUBSTRING(skiffWrite({{0, 0, {}}}, rowAndRangeIndex), "index requested but reader did not return it");
+ EXPECT_THROW_WITH_SUBSTRING(skiffWrite({{0, {}, 0}}, rowAndRangeIndex), "index requested but reader did not return it");
+
+ const auto rowAndRangeIndexAllowMissing = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ })->SetName("$range_index"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ })->SetName("$row_index"),
+ });
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, 0, 0},
+ {0, 0, 1},
+ {0, 0, 2},
+ }, rowAndRangeIndexAllowMissing).data(),
+
+ "0000" "01""00000000""00000000" "01""00000000""00000000"
+ "0000" "00" "00"
+ "0000" "00" "00");
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, 0, 0},
+ {0, 0, 1},
+ {0, 0, 3},
+ }, rowAndRangeIndexAllowMissing).data(),
+
+ "0000" "01""00000000""00000000" "01""00000000""00000000"
+ "0000" "00" "00"
+ "0000" "00" "01""03000000""00000000");
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, 0, 0},
+ {0, 0, 1},
+ {0, 1, 2},
+ {0, 1, 3},
+ }, rowAndRangeIndexAllowMissing).data(),
+
+ "0000" "01""00000000""00000000" "01""00000000""00000000"
+ "0000" "00" "00"
+ "0000" "01""01000000""00000000" "01""02000000""00000000"
+ "0000" "00" "00");
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, {}, {}},
+ {0, {}, {}},
+ {0, {}, {}},
+ {0, {}, {}},
+ }, rowAndRangeIndexAllowMissing).data(),
+
+ "0000" "02" "02"
+ "0000" "02" "02"
+ "0000" "02" "02"
+ "0000" "02" "02");
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, {}, 0},
+ {0, {}, 1},
+ {0, {}, 3},
+ {0, {}, 4},
+ }, rowAndRangeIndexAllowMissing).data(),
+
+ "0000" "02" "01""00000000""00000000"
+ "0000" "02" "00"
+ "0000" "02" "01""03000000""00000000"
+ "0000" "02" "00");
+
+ EXPECT_STREQ(
+ skiffWrite({
+ {0, 0, {}},
+ {0, 0, {}},
+ {0, 1, {}},
+ {0, 1, {}},
+ }, rowAndRangeIndexAllowMissing).data(),
+
+ "0000" "01""00000000""00000000" "02"
+ "0000" "00" "02"
+ "0000" "01""01000000""00000000" "02"
+ "0000" "00" "02");
+}
+
+TEST(TSkiffWriter, TestRowIndexOnlyOrRangeIndexOnly)
+{
+ std::string columnNameList[] = {
+ RowIndexColumnName,
+ RangeIndexColumnName,
+ };
+
+ for (const auto& columnName : columnNameList) {
+ auto skiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName(TString(columnName)),
+ });
+
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()}, 1);
+
+ // Row 0.
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {TString(columnName), 0},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 0);
+
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+ }
+}
+
+TEST(TSkiffWriter, TestComplexType)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("name"),
+ CreateRepeatedVariant8Schema({
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("x"),
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("y"),
+ })
+ })->SetName("points")
+ })->SetName("value"),
+ });
+
+ {
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto tableSchema = New<TTableSchema>(std::vector{
+ TColumnSchema("value", StructLogicalType({
+ {"name", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {
+ "points",
+ ListLogicalType(
+ StructLogicalType({
+ {"x", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"y", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ }))
+ }
+ })),
+ });
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, std::vector{tableSchema});
+
+ // Row 0.
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {"value", EValueType::Composite, "[foo;[[0; 1];[2;3]]]"},
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "foo");
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 2);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 3);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), EndOfSequenceTag<ui8>());
+
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+ }
+}
+
+TEST(TSkiffWriter, TestEmptyComplexType)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("name"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("value"),
+ })
+ })->SetName("value"),
+ });
+
+ {
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto tableSchema = New<TTableSchema>(std::vector{
+ TColumnSchema("value", OptionalLogicalType(
+ StructLogicalType({
+ {"name", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"value", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ }))),
+ });
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, std::vector{tableSchema});
+
+ // Row 0.
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {"value", nullptr},
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 0);
+
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+ }
+}
+
+TEST(TSkiffWriter, TestSparseComplexType)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateRepeatedVariant16Schema({
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("name"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("value"),
+ })->SetName("value"),
+ })->SetName("$sparse_columns"),
+ });
+
+ {
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto tableSchema = New<TTableSchema>(std::vector{
+ TColumnSchema("value", OptionalLogicalType(
+ StructLogicalType({
+ {"name", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"value", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ }))),
+ });
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, std::vector{tableSchema});
+
+ // Row 0.
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {"value", EValueType::Composite, "[foo;bar;]"},
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "foo");
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "bar");
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), EndOfSequenceTag<ui16>());
+
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+ }
+}
+
+TEST(TSkiffWriter, TestSparseComplexTypeWithExtraOptional)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateRepeatedVariant16Schema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("name"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("value"),
+ })
+ })->SetName("value"),
+ })->SetName("$sparse_columns"),
+ });
+
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto tableSchema = New<TTableSchema>(std::vector{
+ TColumnSchema("value", OptionalLogicalType(
+ StructLogicalType({
+ {"name", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"value", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ }))),
+ });
+
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, std::vector{tableSchema});
+
+ // Row 0.
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {"value", EValueType::Composite, "[foo;bar;]"},
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "foo");
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "bar");
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), EndOfSequenceTag<ui16>());
+
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+}
+
+TEST(TSkiffWriter, TestBadWireTypeForSimpleColumn)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Yson32),
+ })
+ })->SetName("opt_yson32"),
+ });
+ auto nameTable = New<TNameTable>();
+ TStringStream resultStream;
+ EXPECT_THROW_WITH_SUBSTRING(
+ CreateSkiffWriter(skiffSchema, nameTable, &resultStream, std::vector{New<TTableSchema>()}),
+ "cannot be represented with Skiff schema");
+}
+
+TEST(TSkiffWriter, TestMissingComplexColumn)
+{
+ auto optionalSkiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateRepeatedVariant8Schema({CreateSimpleTypeSchema(EWireType::Int64)}),
+ })->SetName("opt_list"),
+ });
+ auto requiredSkiffSchema = CreateTupleSchema({
+ CreateRepeatedVariant8Schema({CreateSimpleTypeSchema(EWireType::Int64)})->SetName("opt_list"),
+ });
+
+ { // Non optional Skiff schema
+ auto nameTable = New<TNameTable>();
+ EXPECT_THROW_WITH_SUBSTRING(
+ CreateSkiffWriter(requiredSkiffSchema, nameTable, &Cnull, std::vector{New<TTableSchema>()}),
+ "cannot be represented with Skiff schema");
+ }
+
+ {
+ auto nameTable = New<TNameTable>();
+ TStringStream resultStream;
+ auto writer = CreateSkiffWriter(optionalSkiffSchema, nameTable, &resultStream, std::vector{New<TTableSchema>()});
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, { }).Get(),
+ MakeRow(nameTable, {
+ {"opt_list", nullptr},
+ }).Get(),
+ MakeRow(nameTable, { }).Get(),
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ EXPECT_EQ(HexEncode(resultStream.Str()), "0000" "00" "0000" "00" "0000" "00");
+ }
+}
+
+TEST(TSkiffWriter, TestSkippedFields)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("number"),
+ CreateSimpleTypeSchema(EWireType::Nothing)->SetName("string"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName(TString(RangeIndexColumnName)),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName(TString(RowIndexColumnName)),
+ CreateSimpleTypeSchema(EWireType::Double)->SetName("double"),
+ });
+ auto tableSchema = New<TTableSchema>(std::vector{
+ TColumnSchema("number", EValueType::Int64),
+ TColumnSchema("string", EValueType::String),
+ TColumnSchema("double", EValueType::Double),
+ });
+
+ auto nameTable = New<TNameTable>();
+ TString result;
+ {
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {tableSchema});
+
+ if (!writer->Write({
+ MakeRow(nameTable, {
+ {"number", 1},
+ {"string", "hello"},
+ {TString(RangeIndexColumnName), 0},
+ {TString(RowIndexColumnName), 0},
+ {"double", 1.5},
+ }).Get()
+ }))
+ {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {"number", 1},
+ {TString(RangeIndexColumnName), 5},
+ {TString(RowIndexColumnName), 1},
+ {"double", 2.5},
+ }).Get()
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(result);
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 1.5);
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 5);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseDouble(), 2.5);
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+ }
+
+}
+
+TEST(TSkiffWriter, TestSkippedFieldsOutOfRange)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Nothing)->SetName("string"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName(TString(RangeIndexColumnName)),
+ });
+ auto tableSchema = New<TTableSchema>(std::vector{
+ TColumnSchema("string", EValueType::String),
+ });
+
+ auto nameTable = New<TNameTable>();
+ TString result;
+ {
+ TStringOutput resultStream(result);
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {tableSchema});
+
+ if (!writer->Write({
+ MakeRow(nameTable, {
+ {"string", "hello"},
+ {TString(RangeIndexColumnName), 0},
+ }).Get()
+ }))
+ {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ Y_UNUSED(writer->Write({
+ MakeRow(nameTable, {
+ {TString(RangeIndexColumnName), 5},
+ }).Get()
+ }));
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(result);
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 0);
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseVariant8Tag(), 1);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 5);
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+ }
+
+}
+
+TEST(TSkiffWriter, TestSkippedFieldsAndKeySwitch)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("value"),
+ CreateSimpleTypeSchema(EWireType::Nothing)->SetName("skipped"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("$key_switch"),
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("value1"),
+ });
+ TStringStream resultStream;
+ auto nameTable = New<TNameTable>();
+ auto writer = CreateSkiffWriter(skiffSchema, nameTable, &resultStream, {New<TTableSchema>()}, 1);
+
+ auto write = [&] (TUnversionedRow row) {
+ if (!writer->Write({row})) {
+ writer->GetReadyEvent().Get().ThrowOnError();
+ }
+ };
+
+ // Row 0.
+ write(MakeRow(nameTable, {
+ {"value", "one"},
+ {"value1", 0},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ // Row 1.
+ write(MakeRow(nameTable, {
+ {"value", "one"},
+ {"value1", 1},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ // Row 2.
+ write(MakeRow(nameTable, {
+ {"value", "two"},
+ {"value1", 2},
+ {TString(TableIndexColumnName), 0},
+ }).Get());
+ writer->Close()
+ .Get()
+ .ThrowOnError();
+
+ TStringInput resultInput(resultStream.Str());
+ TCheckedSkiffParser checkedSkiffParser(CreateVariant16Schema({skiffSchema}), &resultInput);
+
+ TString buf;
+
+ // row 0
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "one");
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), false);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 0);
+
+ // row 1
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "one");
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), false);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 1);
+
+ // row 2
+ ASSERT_EQ(checkedSkiffParser.ParseVariant16Tag(), 0);
+ ASSERT_EQ(checkedSkiffParser.ParseString32(), "two");
+ ASSERT_EQ(checkedSkiffParser.ParseBoolean(), true);
+ ASSERT_EQ(checkedSkiffParser.ParseInt64(), 2);
+
+ // end
+ ASSERT_EQ(checkedSkiffParser.HasMoreData(), false);
+ checkedSkiffParser.ValidateFinished();
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSkiffParser, Simple)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("int64"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("uint64"),
+ CreateSimpleTypeSchema(EWireType::Double)->SetName("double"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("boolean"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("string32"),
+ CreateSimpleTypeSchema(EWireType::Nothing)->SetName("null"),
+
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ })->SetName("opt_int64"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Uint64),
+ })->SetName("opt_uint64"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Double),
+ })->SetName("opt_double"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ })->SetName("opt_boolean"),
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::String32),
+ })->SetName("opt_string32"),
+ });
+
+ TCollectingValueConsumer collectedRows;
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteInt64(-1);
+ checkedSkiffWriter.WriteUint64(2);
+ checkedSkiffWriter.WriteDouble(3.0);
+ checkedSkiffWriter.WriteBoolean(true);
+ checkedSkiffWriter.WriteString32("foo");
+
+ checkedSkiffWriter.WriteVariant8Tag(0);
+ checkedSkiffWriter.WriteVariant8Tag(0);
+ checkedSkiffWriter.WriteVariant8Tag(0);
+ checkedSkiffWriter.WriteVariant8Tag(0);
+ checkedSkiffWriter.WriteVariant8Tag(0);
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 1);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "int64")), -1);
+ ASSERT_EQ(GetUint64(collectedRows.GetRowValue(0, "uint64")), 2u);
+ ASSERT_EQ(GetDouble(collectedRows.GetRowValue(0, "double")), 3.0);
+ ASSERT_EQ(GetBoolean(collectedRows.GetRowValue(0, "boolean")), true);
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(0, "string32")), "foo");
+ ASSERT_EQ(IsNull(collectedRows.GetRowValue(0, "null")), true);
+
+ ASSERT_EQ(IsNull(collectedRows.GetRowValue(0, "opt_int64")), true);
+ ASSERT_EQ(IsNull(collectedRows.GetRowValue(0, "opt_uint64")), true);
+ ASSERT_EQ(IsNull(collectedRows.GetRowValue(0, "opt_double")), true);
+ ASSERT_EQ(IsNull(collectedRows.GetRowValue(0, "opt_boolean")), true);
+ ASSERT_EQ(IsNull(collectedRows.GetRowValue(0, "opt_string32")), true);
+}
+
+TEST(TSkiffParser, TestOptionalNull)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ })->SetName("opt_null"),
+ });
+ auto nameTable = New<TNameTable>();
+
+ {
+ TCollectingValueConsumer collectedRows;
+ EXPECT_THROW_WITH_SUBSTRING(
+ CreateParserForSkiff(skiffSchema, &collectedRows),
+ "cannot be represented with Skiff schema");
+ }
+
+ auto tableSchema = New<TTableSchema>(std::vector{
+ TColumnSchema("opt_null", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Null))),
+ });
+
+ TCollectingValueConsumer collectedRows(tableSchema);
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteVariant8Tag(0);
+
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteVariant8Tag(1);
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 2);
+
+ ASSERT_EQ(collectedRows.GetRowValue(0, "opt_null").Type, EValueType::Null);
+}
+
+TEST(TSkiffParser, TestSparse)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateRepeatedVariant16Schema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("int64"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("uint64"),
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("string32"),
+ })->SetName("$sparse_columns"),
+ });
+
+ TCollectingValueConsumer collectedRows;
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ // row 1
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ // sparse fields begin
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteInt64(-42);
+ checkedSkiffWriter.WriteVariant16Tag(1);
+ checkedSkiffWriter.WriteUint64(54);
+ checkedSkiffWriter.WriteVariant16Tag(EndOfSequenceTag<ui16>());
+
+ // row 2
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ // sparse fields begin
+ checkedSkiffWriter.WriteVariant16Tag(2);
+ checkedSkiffWriter.WriteString32("foo");
+ checkedSkiffWriter.WriteVariant16Tag(EndOfSequenceTag<ui16>());
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 2);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "int64")), -42);
+ ASSERT_EQ(GetUint64(collectedRows.GetRowValue(0, "uint64")), 54u);
+ ASSERT_FALSE(collectedRows.FindRowValue(0, "string32"));
+
+ ASSERT_FALSE(collectedRows.FindRowValue(1, "int64"));
+ ASSERT_FALSE(collectedRows.FindRowValue(1, "uint64"));
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(1, "string32")), "foo");
+}
+
+TEST(TSkiffParser, TestYsonWireType)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("yson"),
+ });
+
+ TCollectingValueConsumer collectedRows;
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ // Row 0.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteYson32("-42");
+
+ // Row 1.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteYson32("42u");
+
+ // Row 2.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteYson32("\"foobar\"");
+
+ // Row 3.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteYson32("%true");
+
+ // Row 4.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteYson32("{foo=bar}");
+
+ // Row 5.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteYson32("#");
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 6);
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "yson")), -42);
+ ASSERT_EQ(GetUint64(collectedRows.GetRowValue(1, "yson")), 42u);
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(2, "yson")), "foobar");
+ ASSERT_EQ(GetBoolean(collectedRows.GetRowValue(3, "yson")), true);
+ ASSERT_EQ(GetAny(collectedRows.GetRowValue(4, "yson"))->AsMap()->GetChildOrThrow("foo")->AsString()->GetValue(), "bar");
+ ASSERT_EQ(IsNull(collectedRows.GetRowValue(5, "yson")), true);
+}
+
+TEST(TSkiffParser, TestBadYsonWireType)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("yson"),
+ });
+
+ auto parseYsonUsingSkiff = [&] (TStringBuf ysonValue) {
+ TCollectingValueConsumer collectedRows;
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+ TStringStream dataStream;
+ ASSERT_NO_THROW({
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteYson32(ysonValue);
+
+ checkedSkiffWriter.Finish();
+ });
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+ };
+
+ try {
+ parseYsonUsingSkiff("[42");
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Premature end of stream"));
+ }
+
+ try {
+ parseYsonUsingSkiff("<foo=bar>42");
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Table values cannot have top-level attributes"));
+ }
+}
+
+TEST(TSkiffParser, TestSpecialColumns)
+{
+ std::shared_ptr<TSkiffSchema> skiffSchemaList[] = {
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("yson"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("$key_switch"),
+ }),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("yson"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("$row_switch"),
+ }),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("yson"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("$range_switch"),
+ }),
+ };
+
+ for (const auto& skiffSchema : skiffSchemaList) {
+ try {
+ TCollectingValueConsumer collectedRows;
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+ } catch (std::exception& e) {
+ EXPECT_THAT(e.what(), testing::HasSubstr("Skiff parser does not support \"$key_switch\""));
+ }
+ }
+}
+
+TEST(TSkiffParser, TestOtherColumns)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("name"),
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("$other_columns"),
+ });
+
+ TCollectingValueConsumer collectedRows;
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ // Row 0.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteString32("row_0");
+ checkedSkiffWriter.WriteYson32("{foo=-42;}");
+
+ // Row 1.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteString32("row_1");
+ checkedSkiffWriter.WriteYson32("{bar=qux;baz={boolean=%false;};}");
+
+ // Row 2.
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 2);
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(0, "name")), "row_0");
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "foo")), -42);
+
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(1, "name")), "row_1");
+ ASSERT_EQ(GetString(collectedRows.GetRowValue(1, "bar")), "qux");
+ ASSERT_EQ(ConvertToYsonTextStringStable(GetAny(collectedRows.GetRowValue(1, "baz"))), "{\"boolean\"=%false;}");
+}
+
+TEST(TSkiffParser, TestComplexColumn)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("value"),
+ })->SetName("column")
+ });
+
+ TCollectingValueConsumer collectedRows(
+ New<TTableSchema>(std::vector{
+ TColumnSchema("column", NTableClient::StructLogicalType({
+ {"key", NTableClient::SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"value", NTableClient::SimpleLogicalType(ESimpleLogicalValueType::Int64)}
+ }))
+ }));
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ // Row 0.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteString32("row_0");
+ checkedSkiffWriter.WriteInt64(42);
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 1);
+ ASSERT_EQ(ConvertToYsonTextStringStable(GetComposite(collectedRows.GetRowValue(0, "column"))), "[\"row_0\";42;]");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSkiffParser, TestEmptyInput)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("column"),
+ });
+
+ TCollectingValueConsumer collectedRows;
+
+ {
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+ parser->Finish();
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 0);
+ }
+ {
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+ parser->Read("");
+ parser->Finish();
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 0);
+ }
+ {
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+ parser->Read("");
+ parser->Read("");
+ parser->Finish();
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 0);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TSkiffParser, ColumnIds)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("field_a"),
+ CreateSimpleTypeSchema(EWireType::Uint64)->SetName("field_b")
+ });
+
+ TCollectingValueConsumer collectedRows;
+ collectedRows.GetNameTable()->GetIdOrRegisterName("field_b");
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteInt64(-1);
+ checkedSkiffWriter.WriteUint64(2);
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 1);
+
+ ASSERT_EQ(GetInt64(collectedRows.GetRowValue(0, "field_a")), -1);
+ ASSERT_EQ(GetUint64(collectedRows.GetRowValue(0, "field_b")), 2u);
+}
+
+TEST(TSkiffParser, TestSparseComplexType)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateRepeatedVariant16Schema({
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("name"),
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("value"),
+ })->SetName("value"),
+ })->SetName("$sparse_columns"),
+ });
+
+ TCollectingValueConsumer collectedRows(
+ New<TTableSchema>(std::vector{
+ TColumnSchema("value", OptionalLogicalType(
+ StructLogicalType({
+ {"name", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"value", SimpleLogicalType(ESimpleLogicalValueType::Int64)}
+ })))
+ }));
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ // Row 0.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteString32("row_0");
+ checkedSkiffWriter.WriteInt64(10);
+ checkedSkiffWriter.WriteVariant16Tag(EndOfSequenceTag<ui16>());
+
+ // Row 1.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteVariant16Tag(EndOfSequenceTag<ui16>());
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 2);
+ EXPECT_EQ(ConvertToYsonTextStringStable(GetComposite(collectedRows.GetRowValue(0, "value"))), "[\"row_0\";10;]");
+ EXPECT_FALSE(collectedRows.FindRowValue(1, "value"));
+}
+
+TEST(TSkiffParser, TestSparseComplexTypeWithExtraOptional)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateRepeatedVariant16Schema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("value"),
+ })
+ })->SetName("column"),
+ })->SetName("$sparse_columns"),
+ });
+
+ TCollectingValueConsumer collectedRows(
+ New<TTableSchema>(std::vector{
+ TColumnSchema("column", OptionalLogicalType(
+ StructLogicalType({
+ {"key", NTableClient::SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"value", NTableClient::SimpleLogicalType(ESimpleLogicalValueType::Int64)}
+ })))
+ }));
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ TStringStream dataStream;
+ TCheckedSkiffWriter checkedSkiffWriter(CreateVariant16Schema({skiffSchema}), &dataStream);
+
+ // Row 0.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteVariant8Tag(1);
+ checkedSkiffWriter.WriteString32("row_0");
+ checkedSkiffWriter.WriteInt64(42);
+ checkedSkiffWriter.WriteVariant16Tag(EndOfSequenceTag<ui16>());
+
+ // Row 1.
+ checkedSkiffWriter.WriteVariant16Tag(0);
+ checkedSkiffWriter.WriteVariant16Tag(EndOfSequenceTag<ui16>());
+
+ checkedSkiffWriter.Finish();
+
+ parser->Read(dataStream.Str());
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 2);
+ ASSERT_EQ(ConvertToYsonTextStringStable(GetComposite(collectedRows.GetRowValue(0, "column"))), "[\"row_0\";42;]");
+ ASSERT_FALSE(collectedRows.FindRowValue(1, "column"));
+}
+
+
+TEST(TSkiffParser, TestBadWireTypeForSimpleColumn)
+{
+ auto skiffSchema = CreateTupleSchema({
+ CreateVariant8Schema({
+ CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Yson32),
+ })
+ })->SetName("opt_yson32"),
+ });
+
+ TCollectingValueConsumer collectedRows;
+ EXPECT_THROW_WITH_SUBSTRING(
+ CreateParserForSkiff(skiffSchema, &collectedRows),
+ "cannot be represented with Skiff schema");
+}
+
+TEST(TSkiffParser, TestEmptyColumns)
+{
+ auto skiffSchema = CreateTupleSchema({});
+ TCollectingValueConsumer collectedRows;
+ auto parser = CreateParserForSkiff(skiffSchema, &collectedRows);
+
+ parser->Read(TStringBuf("\x00\x00\x00\x00"sv));
+ parser->Finish();
+
+ ASSERT_EQ(static_cast<int>(collectedRows.Size()), 2);
+}
+
+TEST(TSkiffFormat, TestTimestamp)
+{
+ using namespace NLogicalTypeShortcuts;
+ CHECK_BIDIRECTIONAL_CONVERSION(Timestamp(), CreateSimpleTypeSchema(EWireType::Uint64), 42ull, "2A000000" "00000000");
+ CHECK_BIDIRECTIONAL_CONVERSION(Interval(), CreateSimpleTypeSchema(EWireType::Int64), 42, "2A000000" "00000000");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT
diff --git a/yt/yt/library/formats/unittests/skiff_yson_converter_ut.cpp b/yt/yt/library/formats/unittests/skiff_yson_converter_ut.cpp
new file mode 100644
index 0000000000..67e526a9dc
--- /dev/null
+++ b/yt/yt/library/formats/unittests/skiff_yson_converter_ut.cpp
@@ -0,0 +1,707 @@
+#include <yt/yt/library/logical_type_shortcuts/logical_type_shortcuts.h>
+
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/client/table_client/logical_type.h>
+#include <yt/yt/library/formats/skiff_yson_converter.h>
+
+#include <yt/yt/core/yson/parser.h>
+#include <yt/yt/core/yson/pull_parser.h>
+#include <yt/yt/core/yson/token_writer.h>
+#include <yt/yt/core/yson/writer.h>
+
+#include <library/cpp/skiff/skiff.h>
+#include <library/cpp/skiff/skiff_schema.h>
+
+#include <util/string/hex.h>
+
+#include <util/stream/mem.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NTableClient;
+using namespace NSkiff;
+using namespace NYson;
+using namespace NTableClient::NLogicalTypeShortcuts;
+
+////////////////////////////////////////////////////////////////////////////////
+
+std::shared_ptr<TSkiffSchema> SkiffOptional(std::shared_ptr<TSkiffSchema> skiffSchema)
+{
+ return CreateVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ std::move(skiffSchema)
+ });
+}
+
+TString ConvertYsonHex(
+ const TLogicalTypePtr& logicalType,
+ const std::shared_ptr<TSkiffSchema>& skiffSchema,
+ TStringBuf ysonString,
+ const TYsonToSkiffConverterConfig& config = {})
+{
+ auto converter = CreateYsonToSkiffConverter(
+ TComplexTypeFieldDescriptor("test-field", logicalType),
+ skiffSchema,
+ config);
+
+ // Yson parsers have a bug when they can't parse some values that end unexpectedly.
+ TString spacedYsonInput = TString{ysonString} + " ";
+
+ TStringStream out;
+ {
+ TCheckedInDebugSkiffWriter writer(skiffSchema, &out);
+
+ TMemoryInput in(spacedYsonInput);
+ TYsonPullParser pullParser(&in, EYsonType::Node);
+ TYsonPullParserCursor cursor(&pullParser);
+
+ converter(&cursor, &writer);
+
+ EXPECT_EQ(cursor.GetCurrent().GetType(), EYsonItemType::EndOfStream);
+ writer.Finish();
+ }
+
+ auto result = HexEncode(out.Str());
+ result.to_lower();
+ return result;
+}
+
+TString ConvertHexToTextYson(
+ const TLogicalTypePtr& logicalType,
+ const std::shared_ptr<TSkiffSchema>& skiffSchema,
+ TStringBuf hexString,
+ const TSkiffToYsonConverterConfig& config = {})
+{
+ auto converter = CreateSkiffToYsonConverter(TComplexTypeFieldDescriptor("test-field", logicalType), skiffSchema, config);
+
+
+ TStringStream binaryOut;
+ {
+ TString binaryString = HexDecode(hexString);
+ TMemoryInput in(binaryString);
+ TCheckedInDebugSkiffParser parser(skiffSchema, &in);
+
+ auto writer = TCheckedInDebugYsonTokenWriter(&binaryOut);
+ converter(&parser, &writer);
+ EXPECT_EQ(parser.GetReadBytesCount(), binaryString.size());
+ }
+ binaryOut.Finish();
+
+ TStringStream out;
+ {
+ auto writer = TYsonWriter(&out, EYsonFormat::Text);
+ ParseYsonStringBuffer(binaryOut.Str(), EYsonType::Node, &writer);
+ }
+ out.Finish();
+
+ return out.Str();
+}
+
+
+#define CHECK_BIDIRECTIONAL_CONVERSION(logicalType, skiffSchema, ysonString, skiffString, ...) \
+ do { \
+ std::tuple<TYsonToSkiffConverterConfig, TSkiffToYsonConverterConfig> cfg = {__VA_ARGS__}; \
+ auto actualSkiffString = ConvertYsonHex(logicalType, skiffSchema, ysonString, std::get<0>(cfg)); \
+ EXPECT_EQ(actualSkiffString, skiffString) << "Yson -> Skiff conversion error"; \
+ auto actualYsonString = ConvertHexToTextYson(logicalType, skiffSchema, skiffString, std::get<1>(cfg)); \
+ EXPECT_EQ(actualYsonString, ysonString) << "Skiff -> Yson conversion error"; \
+ } while (0)
+
+
+TEST(TYsonSkiffConverterTest, TestSimpleTypes)
+{
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Int8(),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ "-42",
+ "d6ffffff" "ffffffff");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Uint64(),
+ CreateSimpleTypeSchema(EWireType::Uint64),
+ "42u",
+ "2a000000" "00000000");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Uint64(),
+ CreateSimpleTypeSchema(EWireType::Uint64),
+ "8u",
+ "08000000" "00000000");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Bool(),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ "%true",
+ "01");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Double(),
+ CreateSimpleTypeSchema(EWireType::Double),
+ "0.",
+ "00000000" "00000000");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Float(),
+ CreateSimpleTypeSchema(EWireType::Double),
+ "0.",
+ "00000000" "00000000");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ String(),
+ CreateSimpleTypeSchema(EWireType::String32),
+ "\"foo\"",
+ "03000000" "666f6f");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Null(),
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ "#",
+ "");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Uuid(),
+ CreateSimpleTypeSchema(EWireType::Uint128),
+ "\"\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\"",
+ "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Uuid(),
+ CreateSimpleTypeSchema(EWireType::String32),
+ "\"\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF\"",
+ "10000000f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff");
+}
+
+TEST(TYsonSkiffConverterTest, TestYson32)
+{
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Yson(),
+ CreateSimpleTypeSchema(EWireType::Yson32),
+ "-42",
+ "02000000" "0253");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Yson(),
+ CreateSimpleTypeSchema(EWireType::Yson32),
+ "#",
+ "01000000" "23");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Yson(),
+ CreateSimpleTypeSchema(EWireType::Yson32),
+ "[1;2;[3;];]",
+ "0e000000" "5b02023b02043b5b02063b5d3b5d");
+}
+
+TEST(TYsonSkiffConverterTest, TestOptionalTypes)
+{
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Int64()),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64)),
+ "-42",
+ "01" "d6ffffff" "ffffffff");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Int64()),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64)),
+ "#",
+ "00");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Optional(Bool())),
+ SkiffOptional(SkiffOptional(CreateSimpleTypeSchema(EWireType::Boolean))),
+ "[%true;]",
+ "01" "01" "01");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Optional(Bool())),
+ SkiffOptional(SkiffOptional(CreateSimpleTypeSchema(EWireType::Boolean))),
+ "[#;]",
+ "01" "00");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Optional(Bool())),
+ SkiffOptional(SkiffOptional(CreateSimpleTypeSchema(EWireType::Boolean))),
+ "#",
+ "00");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(List(Bool())),
+ SkiffOptional(CreateRepeatedVariant8Schema({CreateSimpleTypeSchema(EWireType::Boolean)})),
+ "#",
+ "00");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Optional(List(Bool()))),
+ SkiffOptional(
+ SkiffOptional(
+ CreateRepeatedVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Boolean)
+ }))),
+ "[[%true;%false;%true;];]",
+ "01" "01" "0001" "0000" "0001" "ff");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Optional(List(Bool()))),
+ SkiffOptional(
+ SkiffOptional(
+ CreateRepeatedVariant8Schema({
+ CreateSimpleTypeSchema(EWireType::Boolean)
+ }))),
+ "[#;]",
+ "0100");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ConvertYsonHex(
+ Optional(Optional(Bool())),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Boolean)),
+ " [ %true ] "),
+ "Optional nesting mismatch");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ConvertHexToTextYson(
+ Optional(Bool()),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ "00"),
+ "Optional nesting mismatch");
+
+ TYsonToSkiffConverterConfig ysonToSkiffConfig;
+ ysonToSkiffConfig.AllowOmitTopLevelOptional = true;
+
+ TSkiffToYsonConverterConfig skiffToYsonConfig;
+ skiffToYsonConfig.AllowOmitTopLevelOptional = true;
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Optional(Bool())),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Boolean)),
+ "[%true;]",
+ "01" "01",
+ ysonToSkiffConfig,
+ skiffToYsonConfig);
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Optional(Optional(Bool())),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Boolean)),
+ "[#;]",
+ "00",
+ ysonToSkiffConfig,
+ skiffToYsonConfig);
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ConvertYsonHex(
+ Optional(Optional(Bool())),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Boolean)),
+ " # ",
+ ysonToSkiffConfig),
+ "value expected to be nonempty");
+}
+
+TEST(TYsonSkiffConverterTest, TestListTypes)
+{
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ List(Bool()),
+ CreateRepeatedVariant8Schema({CreateSimpleTypeSchema(EWireType::Boolean)}),
+ "[]",
+ "ff");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ List(Bool()),
+ CreateRepeatedVariant8Schema({CreateSimpleTypeSchema(EWireType::Boolean)}),
+ "[%true;%true;%true;]",
+ "00" "01" "00" "01" "00" "01" "ff");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ List(List(Bool())),
+ CreateRepeatedVariant8Schema({CreateRepeatedVariant8Schema({CreateSimpleTypeSchema(EWireType::Boolean)})}),
+ "[[];[%true;];[%true;%true;];]",
+ "00" "ff" "00" "0001ff" "00" "00010001ff" "ff");
+}
+
+TEST(TYsonSkiffConverterTest, TestStruct)
+{
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Struct(
+ "key", String(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("value"),
+ }),
+ "[\"true\";%true;]",
+ "04000000" "74727565" "01");
+}
+
+TEST(TYsonSkiffConverterTest, TestSkippedFields)
+{
+ TString skiffString;
+ skiffString = ConvertYsonHex(
+ Struct(
+ "key", String(),
+ "subkey", Int64(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("value"),
+ }),
+ " [ true ; 1; %true ] ");
+ EXPECT_EQ(skiffString, "04000000" "74727565" "01"sv);
+
+ skiffString = ConvertYsonHex(
+ Struct(
+ "key", String(),
+ "subkey", Int64(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("subkey"),
+ }),
+ " [ true ; 1; %true ] ");
+ EXPECT_EQ(skiffString, "01000000" "00000000"sv);
+
+ try {
+ ConvertHexToTextYson(
+ Struct(
+ "key", String(),
+ "subkey", Int64(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("subkey"),
+ }),
+ "01000000" "00000000");
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::ContainsRegex("Non optional struct field .* is missing"));
+ }
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Struct(
+ "key", Optional(String()),
+ "subkey", Int64(),
+ "value", Optional(Bool())),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64)->SetName("subkey"),
+ }),
+ "[#;15;#;]",
+ "0f000000" "00000000");
+}
+
+TEST(TYsonSkiffConverterTest, TestUnknownSkiffFields)
+{
+ TString skiffString;
+ skiffString = ConvertYsonHex(
+ Struct(
+ "key", String(),
+ "subkey", Int64(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::String32))->SetName("key2"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("value"),
+ }),
+ " [ true ; 1; %true ] ");
+ EXPECT_EQ(skiffString, "04000000" "74727565" "00" "01"sv);
+
+ skiffString = ConvertYsonHex(
+ Struct(
+ "key", String(),
+ "subkey", Int64(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("value"),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Yson32))->SetName("value2"),
+ }),
+ " [ true ; 1; %true ] ");
+ EXPECT_EQ(skiffString, "04000000" "74727565" "01" "00"sv);
+
+
+ try {
+ ConvertYsonHex(
+ Struct(
+ "key", String(),
+ "subkey", Int64(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("value"),
+ CreateSimpleTypeSchema(EWireType::Yson32)->SetName("value2"),
+ }),
+ " [ true ; 1; %true ] ");
+ GTEST_FAIL() << "exception expected";
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::ContainsRegex("Non optional Skiff field .* is missing corresponding logical struct field"));
+ }
+
+ try {
+ ConvertHexToTextYson(
+ Struct(
+ "key", String(),
+ "subkey", Int64(),
+ "value", Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32)->SetName("key"),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::String32))->SetName("key2"),
+ CreateSimpleTypeSchema(EWireType::Boolean)->SetName("value"),
+ }),
+ "04000000" "74727565" "00" "01"sv);
+ GTEST_FAIL() << "expected_exception";
+ } catch (const std::exception& e) {
+ EXPECT_THAT(e.what(), testing::ContainsRegex("is not found in logical type"));
+ }
+}
+
+TEST(TYsonSkiffConverterTest, TestTuple)
+{
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Tuple(String(), Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ }),
+ "[\"true\";%true;]",
+ "04000000" "74727565" "01");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ Tuple(Int64(), Optional(Int64())),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Int64),
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64)),
+ }),
+ "[2;42;]",
+ "02000000" "00000000" "01" "2a000000" "00000000");
+}
+
+TEST(TYsonSkiffConverterTest, TestTupleSkippedFields)
+{
+ TString skiffString;
+ skiffString = ConvertYsonHex(
+ Tuple(String(), Int64(), Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32),
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ }),
+ " [ true ; 1; %true ] ");
+ EXPECT_EQ(skiffString, "04000000" "74727565" "01"sv);
+
+ skiffString = ConvertYsonHex(
+ Tuple(String(), Int64(), Bool()),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ }),
+ " [ true ; 1; %true ] ");
+ EXPECT_EQ(skiffString, "01000000" "00000000"sv);
+
+ skiffString = ConvertYsonHex(
+ Tuple(Optional(String()), Int64(), Optional(Bool())),
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::Nothing),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ CreateSimpleTypeSchema(EWireType::Nothing)
+ }),
+ "[#;15;#;]");
+ EXPECT_EQ(skiffString, "0f000000" "00000000"sv);
+}
+
+TEST(TYsonSkiffConverterTest, TestDict)
+{
+ const auto logicalType = Dict(String(), Int64());
+ const auto skiffSchema = CreateRepeatedVariant8Schema({
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32),
+ CreateSimpleTypeSchema(EWireType::Int64)
+ })
+ });
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ logicalType,
+ skiffSchema,
+ "[[\"one\";1;];[\"two\";2;];]",
+ "00" "03000000" "6f6e65" "01000000" "00000000"
+ "00" "03000000" "74776f" "02000000" "00000000"
+ "ff");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ConvertHexToTextYson(logicalType, skiffSchema, "01" "01000000" "6f" "01000000" "00000000" "ff"),
+ "Unexpected \"repeated_variant8\" tag");
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ConvertHexToTextYson(logicalType, skiffSchema, "00" "01000000" "6f" "01000000" "00000000"),
+ "Premature end of stream");
+}
+
+TEST(TYsonSkiffConverterTest, TestTagged)
+{
+ const auto logicalType = Tagged(
+ "tag",
+ Dict(Tagged("tag", String()), Int64()));
+ const auto skiffSchema = CreateRepeatedVariant8Schema({
+ CreateTupleSchema({
+ CreateSimpleTypeSchema(EWireType::String32),
+ CreateSimpleTypeSchema(EWireType::Int64)
+ })
+ });
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ logicalType,
+ skiffSchema,
+ "[[\"one\";1;];[\"two\";2;];]",
+ "00" "03000000" "6f6e65" "01000000" "00000000"
+ "00" "03000000" "74776f" "02000000" "00000000"
+ "ff");
+}
+
+TEST(TYsonSkiffConverterTest, TestOptionalVariantSimilarity)
+{
+ auto logicalType = Optional(
+ VariantTuple(Null(), Int64()));
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ logicalType,
+ SkiffOptional(SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64))),
+ "[1;42;]",
+ "01" "01" "2a000000" "00000000");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ logicalType,
+ SkiffOptional(SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64))),
+ "[0;#;]",
+ "01" "00");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ logicalType,
+ SkiffOptional(SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64))),
+ "#",
+ "00");
+
+ TYsonToSkiffConverterConfig ysonToSkiffConfig;
+ ysonToSkiffConfig.AllowOmitTopLevelOptional = true;
+
+ TSkiffToYsonConverterConfig skiffToYsonConfig;
+ skiffToYsonConfig.AllowOmitTopLevelOptional = true;
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ logicalType,
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64)),
+ "[1;42;]",
+ "01" "2a000000" "00000000",
+ ysonToSkiffConfig,
+ skiffToYsonConfig);
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ logicalType,
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64)),
+ "[0;#;]",
+ "00",
+ ysonToSkiffConfig,
+ skiffToYsonConfig);
+
+ EXPECT_THROW_WITH_SUBSTRING(
+ ConvertYsonHex(
+ logicalType,
+ SkiffOptional(CreateSimpleTypeSchema(EWireType::Int64)),
+ "#",
+ ysonToSkiffConfig),
+ "value expected to be nonempty");
+}
+
+class TYsonSkiffConverterTestVariant
+ : public ::testing::TestWithParam<std::tuple<ELogicalMetatype, EWireType>>
+{
+public:
+ TLogicalTypePtr VariantLogicalType(const std::vector<TLogicalTypePtr>& elements)
+ {
+ auto [metatype, wireType] = GetParam();
+ if (metatype == ELogicalMetatype::VariantTuple) {
+ return VariantTupleLogicalType(elements);
+ } else {
+ std::vector<TStructField> fields;
+ for (size_t i = 0; i < elements.size(); ++i) {
+ fields.push_back({Format("field%v", i), elements[i]});
+ }
+ return VariantStructLogicalType(fields);
+ }
+ }
+
+ std::shared_ptr<TSkiffSchema> VariantSkiffSchema(std::vector<std::shared_ptr<TSkiffSchema>> elements)
+ {
+ for (size_t i = 0; i < elements.size(); ++i) {
+ elements[i]->SetName(Format("field%v", i));
+ }
+ auto [metatype, wireType] = GetParam();
+ if (wireType == EWireType::Variant8) {
+ return CreateVariant8Schema(std::move(elements));
+ } else if (wireType == EWireType::Variant16) {
+ return CreateVariant16Schema(std::move(elements));
+ }
+ Y_UNREACHABLE();
+ }
+
+ TString VariantTagInfix() const
+ {
+ auto [metatype, wireType] = GetParam();
+ if (wireType == EWireType::Variant16) {
+ return "00";
+ }
+ return {};
+ }
+};
+
+TEST_P(TYsonSkiffConverterTestVariant, TestVariant)
+{
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ VariantLogicalType({
+ Int64(),
+ Bool()
+ }),
+ VariantSkiffSchema({
+ CreateSimpleTypeSchema(EWireType::Int64),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ }),
+ "[0;42;]",
+ "00" + VariantTagInfix() + "2a000000" "00000000");
+
+ CHECK_BIDIRECTIONAL_CONVERSION(
+ VariantLogicalType({
+ Int64(),
+ Bool()
+ }),
+ VariantSkiffSchema({
+ CreateSimpleTypeSchema(EWireType::Int64),
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ }),
+ "[1;%true;]",
+ "01" + VariantTagInfix() + "01");
+}
+
+TEST_P(TYsonSkiffConverterTestVariant, TestMalformedVariants)
+{
+ auto logicalType = VariantLogicalType({
+ Bool(),
+ Int64(),
+ });
+ auto skiffSchema = VariantSkiffSchema({
+ CreateSimpleTypeSchema(EWireType::Boolean),
+ CreateSimpleTypeSchema(EWireType::Int64),
+ });
+
+ EXPECT_THROW_WITH_SUBSTRING(ConvertYsonHex(logicalType, skiffSchema, "[2; 42]"), "Yson to Skiff conversion error");
+ EXPECT_THROW_WITH_SUBSTRING(ConvertYsonHex(logicalType, skiffSchema, "[]"), "Yson to Skiff conversion error");
+ EXPECT_THROW_WITH_SUBSTRING(ConvertYsonHex(logicalType, skiffSchema, "[0]"), "Yson to Skiff conversion error");
+
+ EXPECT_THROW_WITH_SUBSTRING(ConvertHexToTextYson(logicalType, skiffSchema, "02" + VariantTagInfix() + "00"),
+ "Skiff to Yson conversion error");
+}
+
+INSTANTIATE_TEST_SUITE_P(
+ Variants,
+ TYsonSkiffConverterTestVariant,
+ ::testing::Combine(
+ ::testing::ValuesIn({ELogicalMetatype::VariantStruct, ELogicalMetatype::VariantTuple}),
+ ::testing::ValuesIn({EWireType::Variant8, EWireType::Variant16}))
+);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/value_examples.cpp b/yt/yt/library/formats/unittests/value_examples.cpp
new file mode 100644
index 0000000000..da41a6341e
--- /dev/null
+++ b/yt/yt/library/formats/unittests/value_examples.cpp
@@ -0,0 +1,163 @@
+#include "value_examples.h"
+
+#include <yt/yt/library/logical_type_shortcuts/logical_type_shortcuts.h>
+
+#include <yt/yt/library/decimal/decimal.h>
+
+#include <cmath>
+
+namespace NYT::NTableClient {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NLogicalTypeShortcuts;
+using namespace NNamedValue;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TValueExample::TValueExample(TLogicalTypePtr logicalType, TNamedValue::TValue value, TString prettyYson)
+ : LogicalType(std::move(logicalType))
+ , Value(std::move(value))
+ , PrettyYson(std::move(prettyYson))
+{ }
+
+////////////////////////////////////////////////////////////////////////////////
+
+std::vector<TValueExample> GetPrimitiveValueExamples()
+{
+ static const std::vector<TValueExample> valueExamples = {
+ TValueExample{Int8(), 0, "0"},
+ TValueExample{Int8(), -5, "-5"},
+ TValueExample{Int8(), 42, "42"},
+ TValueExample{Int8(), -128, "-128"},
+ TValueExample{Int8(), 127, "127"},
+
+ TValueExample{Int16(), 0, "0"},
+ TValueExample{Int16(), -6, "-6"},
+ TValueExample{Int16(), 43, "43"},
+ TValueExample{Int16(), 0x7FFF, "32767"},
+ TValueExample{Int16(), -0x8000, "-32768"},
+
+ TValueExample{Int32(), 0, "0"},
+ TValueExample{Int32(), -7, "-7"},
+ TValueExample{Int32(), 44, "44"},
+ TValueExample{Int32(), 0x7FFFFFFF, "2147483647"},
+ TValueExample{Int32(), -0x80000000ll, "-2147483648"},
+
+ TValueExample{Int64(), 0, "0"},
+ TValueExample{Int64(), -7, "-7"},
+ TValueExample{Int64(), 45, "45"},
+ TValueExample{Int64(), 0x7FFFFFFFFFFFFFFFll, "9223372036854775807"},
+ TValueExample{Int64(), i64(-0x8000000000000000ll), "-9223372036854775808"},
+
+ TValueExample{Uint8(), 0ull, "0u"},
+ TValueExample{Uint8(), 46ull, "46u"},
+ TValueExample{Uint8(), 255ull, "255u"},
+
+ TValueExample{Uint16(), 0ull, "0u"},
+ TValueExample{Uint16(), 47ull, "47u"},
+ TValueExample{Uint16(), 0xFFFFull, "65535u"},
+
+ TValueExample{Uint32(), 0ull, "0u"},
+ TValueExample{Uint32(), 48ull, "48u"},
+ TValueExample{Uint32(), 0xFFFFFFFFull, "4294967295u"},
+
+ TValueExample{Uint64(), 0ull, "0u"},
+ TValueExample{Uint64(), 49ull, "49u"},
+ TValueExample{Uint64(), 0xFFFFFFFFFFFFFFFFull, "18446744073709551615u"},
+
+ TValueExample{String(), "", R"("")"},
+ TValueExample{String(), "foo", R"("foo")"},
+ TValueExample{String(), TString(TStringBuf("\xf0\x00"sv)), R"("\xf0\x00")"},
+
+ TValueExample{Utf8(), "", R"("")"},
+ TValueExample{Utf8(), "bar", R"("bar")"},
+
+ TValueExample{Bool(), true, "%true"},
+ TValueExample{Bool(), false, "%false"},
+
+ // NB. .125 = 1 / 8 is
+ TValueExample{Double(), 3.125, "3.125"},
+ TValueExample{Double(), 2.775, "2.775"},
+ // TPrimitiveTypeExample{Double(), std::nan("1"), "%nan"},
+ TValueExample{Double(), INFINITY, "%inf"},
+ TValueExample{Double(), -INFINITY, "%-inf"},
+
+ TValueExample{Float(), 5.125, "5.125"},
+ TValueExample{Float(), 6.775, "6.775"},
+
+ TValueExample{Null(), nullptr, "#"},
+ TValueExample{Void(), nullptr, "#"},
+
+ TValueExample{Json(), "83", R"("83")"},
+ TValueExample{Json(), "[]", R"("[]")"},
+
+ TValueExample{
+ Uuid(),
+ TString(16, 0),
+ TString(TStringBuf(R"("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")"))
+ },
+ TValueExample{
+ Uuid(),
+ TString(TStringBuf("\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFE\xDC\xBA\x98\x76\x54\x32\x10"sv)),
+ TString(TStringBuf(R"("\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFE\xDC\xBA\x98\x76\x54\x32\x10")"))
+ },
+
+ TValueExample{Date(), 0ull, "0u"},
+ TValueExample{Date(), 18431ull, "18431u"},
+ TValueExample{Date(), 49672ull, "49672u"},
+
+ TValueExample{Datetime(), 0ull, "0u"},
+ TValueExample{Datetime(), 668800588ull, "668800588u"},
+ TValueExample{Datetime(), 4291747199ull, "4291747199u"},
+
+ TValueExample{Timestamp(), 0ull, "0u"},
+ TValueExample{Timestamp(), 2508452463052426ull, "2508452463052426u"},
+ TValueExample{Timestamp(), 4291747199999999ull, "4291747199999999u"},
+
+ TValueExample{Interval(), 0, "0"},
+ TValueExample{Timestamp(), 2208610308646589ll, "2208610308646589"},
+ TValueExample{Timestamp(), 1187314596653899ll, "1187314596653899"},
+ TValueExample{Timestamp(), 4291747199999999ll, "4291747199999999"},
+ TValueExample{Timestamp(), -4291747199999999ll, "-4291747199999999"},
+
+ TValueExample{Date32(), -53375809, "-53375809"},
+ TValueExample{Date32(), 0, "0"},
+ TValueExample{Date32(), 53375807, "53375807"},
+
+ TValueExample{Datetime64(), -4611669897600ll, "-4611669897600"},
+ TValueExample{Datetime64(), 42, "42"},
+ TValueExample{Datetime64(), 4611669811199ll, "4611669811199"},
+
+ TValueExample{Timestamp64(), -4611669897600000000ll, "-4611669897600000000"},
+ TValueExample{Timestamp64(), 42, "42"},
+ TValueExample{Timestamp64(), 4611669811199999999l, "4611669811199999999"},
+
+ TValueExample{Interval64(), -9223339708799999999ll, "-9223339708799999999"},
+ TValueExample{Interval64(), 0, "0"},
+ TValueExample{Interval64(), 9223339708799999999ll, "9223339708799999999"},
+
+ TValueExample{Yson(), "qux", R"("qux")"},
+
+ TValueExample{Decimal(3, 2), NDecimal::TDecimal::TextToBinary("3.14", 3, 2), R"("\x80\x00\x01\x3a")"},
+ };
+
+ THashSet<ESimpleLogicalValueType> allValueTypes;
+ for (const auto value : TEnumTraits<ESimpleLogicalValueType>::GetDomainValues()) {
+ allValueTypes.insert(value);
+ }
+ for (const auto& example : valueExamples) {
+ if (example.LogicalType->GetMetatype() == ELogicalMetatype::Simple) {
+ allValueTypes.erase(example.LogicalType->AsSimpleTypeRef().GetElement());
+ }
+ }
+ if (!allValueTypes.empty()) {
+ THROW_ERROR_EXCEPTION("PrimitiveTypeExample variable doesn't contain values: %v",
+ allValueTypes);
+ }
+ return valueExamples;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NTableClient
diff --git a/yt/yt/library/formats/unittests/value_examples.h b/yt/yt/library/formats/unittests/value_examples.h
new file mode 100644
index 0000000000..06644e2cd6
--- /dev/null
+++ b/yt/yt/library/formats/unittests/value_examples.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <yt/yt/library/named_value/named_value.h>
+
+#include <yt/yt/client/table_client/logical_type.h>
+
+namespace NYT::NTableClient {
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TValueExample
+{
+ TLogicalTypePtr LogicalType;
+ NNamedValue::TNamedValue::TValue Value;
+ TString PrettyYson;
+
+ TValueExample(TLogicalTypePtr logicalType, NNamedValue::TNamedValue::TValue value, TString prettyYson);
+};
+
+std::vector<TValueExample> GetPrimitiveValueExamples();
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NTableClient
diff --git a/yt/yt/library/formats/unittests/web_json_writer_ut.cpp b/yt/yt/library/formats/unittests/web_json_writer_ut.cpp
new file mode 100644
index 0000000000..d7f20ec20a
--- /dev/null
+++ b/yt/yt/library/formats/unittests/web_json_writer_ut.cpp
@@ -0,0 +1,1714 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/library/formats/web_json_writer.h>
+
+#include <yt/yt/client/table_client/logical_type.h>
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/schema.h>
+
+#include <yt/yt/core/concurrency/async_stream.h>
+
+#include <yt/yt/core/json/json_parser.h>
+
+#include <yt/yt/core/ytree/fluent.h>
+
+#include <yt/yt/library/named_value/named_value.h>
+
+#include <limits>
+
+namespace NYT::NFormats {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NYTree;
+using namespace NYson;
+using namespace NConcurrency;
+using namespace NTableClient;
+
+using NNamedValue::MakeRow;
+
+INodePtr ParseJsonToNode(TStringBuf string)
+{
+ TBuildingYsonConsumerViaTreeBuilder<INodePtr> builder(EYsonType::Node);
+ TMemoryInput stream(string);
+
+ // For plain (raw) JSON parsing we need to switch off
+ // "smart" attribute analysis and UTF-8 decoding.
+ auto config = New<NJson::TJsonFormatConfig>();
+ config->EncodeUtf8 = false;
+ config->Plain = true;
+
+ NJson::ParseJson(&stream, &builder, std::move(config));
+ return builder.Finish();
+}
+
+class TWriterForWebJson
+ : public ::testing::Test
+{
+protected:
+ TNameTablePtr NameTable_ = New<TNameTable>();
+ TWebJsonFormatConfigPtr Config_ = New<TWebJsonFormatConfig>();
+ TStringStream OutputStream_;
+ ISchemalessFormatWriterPtr Writer_;
+
+ const TString ValueColumnName_ = "value";
+
+ void CreateStandardWriter(const std::vector<TTableSchemaPtr>& schemas = {New<TTableSchema>()})
+ {
+ Writer_ = CreateWriterForWebJson(
+ Config_,
+ NameTable_,
+ schemas,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&OutputStream_)));
+ }
+};
+
+TEST_F(TWriterForWebJson, Simple)
+{
+ Config_->MaxAllColumnNamesCount = 2;
+
+ CreateStandardWriter();
+
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_a", 100500u},
+ {"column_b", true},
+ {"column_c", "row1_c"},
+ {TString(RowIndexColumnName), 0},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", "row2_c"},
+ {"column_b", "row2_b"},
+ {TString(RowIndexColumnName), 1},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ WaitFor(Writer_->Close())
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"column_a\":{"
+ "\"$type\":\"uint64\","
+ "\"$value\":\"100500\""
+ "},"
+ "\"column_b\":{"
+ "\"$type\":\"boolean\","
+ "\"$value\":\"true\""
+ "},"
+ "\"column_c\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row1_c\""
+ "}"
+ "},"
+ "{"
+ "\"column_c\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row2_c\""
+ "},"
+ "\"column_b\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row2_b\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"false\","
+ "\"incomplete_all_column_names\":\"true\","
+ "\"all_column_names\":["
+ "\"column_a\","
+ "\"column_b\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, SliceColumnsByMaxCount)
+{
+ Config_->MaxSelectedColumnCount = 2;
+
+ CreateStandardWriter();
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_a", "row1_a"},
+ {"column_b", "row1_b"},
+ {"column_c", "row1_c"},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", "row2_c"},
+ {"column_b", "row2_b"},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", "row3_c"},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ YT_UNUSED_FUTURE(Writer_->Close());
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"column_a\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row1_a\""
+ "},"
+ "\"column_b\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row1_b\""
+ "}"
+ "},"
+ "{"
+ "\"column_b\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row2_b\""
+ "}"
+ "},"
+ "{"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"true\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"column_a\","
+ "\"column_b\","
+ "\"column_c\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, SliceStrings)
+{
+ Config_->FieldWeightLimit = 6;
+
+ CreateStandardWriter();
+
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_b", "row1_b"},
+ {"column_c", "rooooow1_c"},
+ {"column_a", "row1_a"},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", "row2_c"},
+ {"column_b", "rooow2_b"},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", "row3_c"},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ YT_UNUSED_FUTURE(Writer_->Close());
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"column_b\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row1_b\""
+ "},"
+ "\"column_c\":{"
+ "\"$incomplete\":true,"
+ "\"$type\":\"string\","
+ "\"$value\":\"rooooo\""
+ "},"
+ "\"column_a\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row1_a\""
+ "}"
+ "},"
+ "{"
+ "\"column_c\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row2_c\""
+ "},"
+ "\"column_b\":{"
+ "\"$incomplete\":true,"
+ "\"$type\":\"string\","
+ "\"$value\":\"rooow2\""
+ "}"
+ "},"
+ "{"
+ "\"column_c\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row3_c\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"false\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"column_a\","
+ "\"column_b\","
+ "\"column_c\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, ReplaceAnyWithNull)
+{
+ Config_->FieldWeightLimit = 8;
+
+ CreateStandardWriter();
+
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_b", EValueType::Any, "{key=a}"},
+ {"column_c", "row1_c"},
+ {"column_a", "row1_a"},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", EValueType::Any, "{key=aaaaaa}"},
+ {"column_b", "row2_b"},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", "row3_c"},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ WaitFor(Writer_->Close())
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"column_b\":{"
+ "\"key\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"a\""
+ "}"
+ "},"
+ "\"column_c\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row1_c\""
+ "},"
+ "\"column_a\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row1_a\""
+ "}"
+ "},"
+ "{"
+ "\"column_c\":{"
+ "\"$incomplete\":true,"
+ "\"$type\":\"any\","
+ "\"$value\":\"\""
+ "},"
+ "\"column_b\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row2_b\""
+ "}"
+ "},"
+ "{"
+ "\"column_c\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"row3_c\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"false\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"column_a\","
+ "\"column_b\","
+ "\"column_c\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, NotSkipSystemColumns)
+{
+ Config_->SkipSystemColumns = false;
+
+ CreateStandardWriter();
+
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {TString(TableIndexColumnName), 0},
+ {TString(RowIndexColumnName), 1},
+ {TString(TabletIndexColumnName), 2},
+ {ValueColumnName_, 3}
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ WaitFor(Writer_->Close())
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"$$table_index\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"0\""
+ "},"
+ "\"$$row_index\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"1\""
+ "},"
+ "\"$$tablet_index\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"2\""
+ "},"
+ "\"value\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"3\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"false\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"$row_index\","
+ "\"$table_index\","
+ "\"$tablet_index\","
+ "\"value\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, SkipSystemColumns)
+{
+ Config_->SkipSystemColumns = true;
+
+ CreateStandardWriter();
+
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {TString(TableIndexColumnName), 0},
+ {TString(RowIndexColumnName), 1},
+ {TString(TabletIndexColumnName), 2},
+ {ValueColumnName_, 3}
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ WaitFor(Writer_->Close())
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"value\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"3\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"false\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"value\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, NotSkipRequestedSystemColumns)
+{
+ Config_->SkipSystemColumns = true;
+ Config_->ColumnNames = std::vector<std::string>{TabletIndexColumnName, ValueColumnName_};
+
+ CreateStandardWriter();
+
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {TString(TableIndexColumnName), 0},
+ {TString(RowIndexColumnName), 1},
+ {TString(TabletIndexColumnName), 2},
+ {ValueColumnName_, 3}
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ WaitFor(Writer_->Close())
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"$$tablet_index\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"2\""
+ "},"
+ "\"value\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"3\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"false\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"$tablet_index\","
+ "\"value\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, SkipUnregisteredColumns)
+{
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ int keyDId = -1;
+ row.AddValue(MakeUnversionedBooleanValue(true, keyDId));
+ std::vector<TUnversionedRow> rows = {row.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ keyDId = NameTable_->RegisterName("column_d");
+
+ rows.clear();
+ row.Reset();
+ row.AddValue(MakeUnversionedBooleanValue(true, keyDId));
+ rows.push_back(row.GetRow());
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ YT_UNUSED_FUTURE(Writer_->Close());
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "},"
+ "{"
+ "\"column_d\":{"
+ "\"$type\":\"boolean\","
+ "\"$value\":\"true\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"false\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"column_d\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+TEST_F(TWriterForWebJson, SliceColumnsByName)
+{
+ Config_->ColumnNames = {
+ "column_b",
+ "column_c",
+ "$tablet_index"};
+ Config_->MaxSelectedColumnCount = 2;
+ Config_->SkipSystemColumns = false;
+
+ CreateStandardWriter();
+
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_a", 100500u},
+ {"column_b", 0.42},
+ {"column_c", "abracadabra"},
+ {TString(TabletIndexColumnName), 10},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ WaitFor(Writer_->Close())
+ .ThrowOnError();
+ auto result = ParseJsonToNode(OutputStream_.Str());
+
+ TString expectedOutput =
+ "{"
+ "\"rows\":["
+ "{"
+ "\"column_b\":{"
+ "\"$type\":\"double\","
+ "\"$value\":\"0.42\""
+ "},"
+ "\"column_c\":{"
+ "\"$type\":\"string\","
+ "\"$value\":\"abracadabra\""
+ "},"
+ "\"$$tablet_index\":{"
+ "\"$type\":\"int64\","
+ "\"$value\":\"10\""
+ "}"
+ "}"
+ "],"
+ "\"incomplete_columns\":\"true\","
+ "\"incomplete_all_column_names\":\"false\","
+ "\"all_column_names\":["
+ "\"$tablet_index\","
+ "\"column_a\","
+ "\"column_b\","
+ "\"column_c\""
+ "]"
+ "}";
+
+ EXPECT_EQ(std::ssize(expectedOutput), Writer_->GetWrittenSize());
+ EXPECT_EQ(expectedOutput, OutputStream_.Str());
+}
+
+template <typename TValue>
+void CheckYqlValue(
+ const INodePtr& valueNode,
+ const TValue& expectedValue)
+{
+ using TDecayedValue = std::decay_t<TValue>;
+ if constexpr (std::is_convertible_v<TDecayedValue, TString>) {
+ ASSERT_EQ(valueNode->GetType(), ENodeType::String);
+ EXPECT_EQ(valueNode->GetValue<TString>(), expectedValue);
+ } else if constexpr (std::is_same_v<TDecayedValue, double>) {
+ ASSERT_EQ(valueNode->GetType(), ENodeType::String);
+ EXPECT_FLOAT_EQ(FromString<double>(valueNode->GetValue<TString>()), expectedValue);
+ } else if constexpr (std::is_same_v<TDecayedValue, bool>) {
+ ASSERT_EQ(valueNode->GetType(), ENodeType::Boolean);
+ EXPECT_EQ(valueNode->GetValue<bool>(), expectedValue);
+ } else if constexpr (std::is_same_v<TDecayedValue, INodePtr>) {
+ EXPECT_TRUE(AreNodesEqual(valueNode, expectedValue))
+ << "actualValueNode is " << ConvertToYsonString(valueNode, EYsonFormat::Pretty).AsStringBuf()
+ << "\nexpectedValue is " << ConvertToYsonString(expectedValue, EYsonFormat::Pretty).AsStringBuf();
+ } else {
+ static_assert(TDependentFalse<TDecayedValue>, "Type not allowed");
+ }
+}
+
+template <typename TType>
+void CheckYqlType(
+ const INodePtr& typeNode,
+ const TType& expectedType,
+ const std::vector<INodePtr>& yqlTypes)
+{
+ ASSERT_EQ(typeNode->GetType(), ENodeType::String);
+ auto typeIndexString = typeNode->GetValue<TString>();
+ auto typeIndex = FromString<int>(typeIndexString);
+ ASSERT_LT(typeIndex, static_cast<int>(yqlTypes.size()));
+ ASSERT_GE(typeIndex, 0);
+ const auto& yqlType = yqlTypes[typeIndex];
+ EXPECT_EQ(yqlType->GetType(), ENodeType::List);
+
+ auto expectedTypeNode = [&] () -> INodePtr {
+ using TDecayedType = std::decay_t<TType>;
+ if constexpr (std::is_convertible_v<TDecayedType, TString>) {
+ return ConvertToNode(TYsonString(TString(expectedType)));
+ } else if constexpr (std::is_same_v<TDecayedType, INodePtr>) {
+ return expectedType;
+ } else {
+ static_assert(TDependentFalse<TDecayedType>, "Type not allowed");
+ }
+ }();
+ EXPECT_TRUE(AreNodesEqual(yqlType, expectedTypeNode))
+ << "yqlType is " << ConvertToYsonString(yqlType, EYsonFormat::Pretty).AsStringBuf()
+ << "\nexpectedTypeNode is " << ConvertToYsonString(expectedTypeNode, EYsonFormat::Pretty).AsStringBuf();
+}
+
+template <typename TValue, typename TType>
+void CheckYqlTypeAndValue(
+ const INodePtr& row,
+ TStringBuf name,
+ const TType& expectedType,
+ const TValue& expectedValue,
+ const std::vector<INodePtr>& yqlTypes)
+{
+ ASSERT_EQ(row->GetType(), ENodeType::Map);
+ auto entry = row->AsMap()->FindChild(TString(name));
+ ASSERT_TRUE(entry);
+ ASSERT_EQ(entry->GetType(), ENodeType::List);
+ ASSERT_EQ(entry->AsList()->GetChildCount(), 2);
+ auto valueNode = entry->AsList()->GetChildOrThrow(0);
+ CheckYqlValue(valueNode, expectedValue);
+ auto typeNode = entry->AsList()->GetChildOrThrow(1);
+ CheckYqlType(typeNode, expectedType, yqlTypes);
+}
+
+#define CHECK_YQL_TYPE_AND_VALUE(row, name, expectedType, expectedValue, yqlTypes) \
+ do { \
+ SCOPED_TRACE(name); \
+ CheckYqlTypeAndValue(row, name, expectedType, expectedValue, yqlTypes); \
+ } while (0)
+
+TEST_F(TWriterForWebJson, YqlValueFormat_SimpleTypes)
+{
+ Config_->MaxAllColumnNamesCount = 2;
+ Config_->ValueFormat = EWebJsonValueFormat::Yql;
+
+ // We will emulate writing rows from two tables.
+ CreateStandardWriter(std::vector{New<TTableSchema>(), New<TTableSchema>()});
+
+ {
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_a", 100500u},
+ {"column_b", true},
+ {"column_c", "row1_c"},
+ {TString(RowIndexColumnName), 0},
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_c", "row2_c"},
+ {"column_b", "row2_b"},
+ {TString(RowIndexColumnName), 1},
+ {TString(TableIndexColumnName), 0},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_a", -100500},
+ {"column_b", EValueType::Any, "{x=2;y=3}"},
+ {"column_c", 2.71828},
+ {TString(RowIndexColumnName), 1},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ Writer_->Close().Get().ThrowOnError();
+ }
+
+ auto result = ParseJsonToNode(OutputStream_.Str());
+ ASSERT_EQ(result->GetType(), ENodeType::Map);
+
+ auto rows = result->AsMap()->FindChild("rows");
+ ASSERT_TRUE(rows);
+ auto incompleteColumns = result->AsMap()->FindChild("incomplete_columns");
+ ASSERT_TRUE(incompleteColumns);
+ auto incompleteAllColumnNames = result->AsMap()->FindChild("incomplete_all_column_names");
+ ASSERT_TRUE(incompleteAllColumnNames);
+ auto allColumnNames = result->AsMap()->FindChild("all_column_names");
+ ASSERT_TRUE(allColumnNames);
+ auto yqlTypeRegistry = result->AsMap()->FindChild("yql_type_registry");
+ ASSERT_TRUE(yqlTypeRegistry);
+
+ ASSERT_EQ(incompleteColumns->GetType(), ENodeType::String);
+ EXPECT_EQ(incompleteColumns->GetValue<TString>(), "false");
+
+ ASSERT_EQ(incompleteAllColumnNames->GetType(), ENodeType::String);
+ EXPECT_EQ(incompleteAllColumnNames->GetValue<TString>(), "true");
+
+ ASSERT_EQ(allColumnNames->GetType(), ENodeType::List);
+ std::vector<TString> allColumnNamesVector;
+ ASSERT_NO_THROW(allColumnNamesVector = ConvertTo<decltype(allColumnNamesVector)>(allColumnNames));
+ EXPECT_EQ(allColumnNamesVector, (std::vector<TString>{"column_a", "column_b"}));
+
+ ASSERT_EQ(yqlTypeRegistry->GetType(), ENodeType::List);
+ auto yqlTypes = ConvertTo<std::vector<INodePtr>>(yqlTypeRegistry);
+
+ ASSERT_EQ(rows->GetType(), ENodeType::List);
+ ASSERT_EQ(rows->AsList()->GetChildCount(), 3);
+
+ auto row1 = rows->AsList()->GetChildOrThrow(0);
+ auto row2 = rows->AsList()->GetChildOrThrow(1);
+ auto row3 = rows->AsList()->GetChildOrThrow(2);
+
+ ASSERT_EQ(row1->GetType(), ENodeType::Map);
+ EXPECT_EQ(row1->AsMap()->GetChildCount(), 3);
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_a", R"(["DataType"; "Uint64"])", "100500", yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_b", R"(["DataType"; "Boolean"])", true, yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_c", R"(["DataType"; "String"])", "row1_c", yqlTypes);
+
+ ASSERT_EQ(row2->GetType(), ENodeType::Map);
+ EXPECT_EQ(row2->AsMap()->GetChildCount(), 2);
+ CHECK_YQL_TYPE_AND_VALUE(row2, "column_b", R"(["DataType"; "String"])", "row2_b", yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row2, "column_c", R"(["DataType"; "String"])", "row2_c", yqlTypes);
+
+ ASSERT_EQ(row3->GetType(), ENodeType::Map);
+ EXPECT_EQ(row3->AsMap()->GetChildCount(), 3);
+ CHECK_YQL_TYPE_AND_VALUE(row3, "column_a", R"(["DataType"; "Int64"])", "-100500", yqlTypes);
+ auto row3BValue = ConvertToNode(TYsonString(TStringBuf(R"({
+ val = {
+ x = {
+ "$type" = "int64";
+ "$value" = "2";
+ };
+ y = {
+ "$type" = "int64";
+ "$value" = "3";
+ }
+ }
+ })")));
+ CHECK_YQL_TYPE_AND_VALUE(row3, "column_b", R"(["DataType"; "Yson"])", row3BValue, yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row3, "column_c", R"(["DataType"; "Double"])", 2.71828, yqlTypes);
+}
+
+TEST_F(TWriterForWebJson, ColumnNameEncoding)
+{
+ Config_->MaxAllColumnNamesCount = 2;
+ Config_->ValueFormat = EWebJsonValueFormat::Yql;
+
+ CreateStandardWriter();
+
+ {
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_a", 100500u},
+ {"column_non_ascii_\xd0\x81", -100500},
+ }).Get()
+ });
+ EXPECT_TRUE(written);
+ Writer_->Close().Get().ThrowOnError();
+ }
+
+ auto result = ParseJsonToNode(OutputStream_.Str());
+ ASSERT_EQ(result->GetType(), ENodeType::Map);
+
+ auto rows = result->AsMap()->FindChild("rows");
+ ASSERT_TRUE(rows);
+ auto incompleteColumns = result->AsMap()->FindChild("incomplete_columns");
+ ASSERT_TRUE(incompleteColumns);
+ auto incompleteAllColumnNames = result->AsMap()->FindChild("incomplete_all_column_names");
+ ASSERT_TRUE(incompleteAllColumnNames);
+ auto allColumnNames = result->AsMap()->FindChild("all_column_names");
+ ASSERT_TRUE(allColumnNames);
+ auto yqlTypeRegistry = result->AsMap()->FindChild("yql_type_registry");
+ ASSERT_TRUE(yqlTypeRegistry);
+
+ ASSERT_EQ(allColumnNames->GetType(), ENodeType::List);
+ std::vector<TString> allColumnNamesVector;
+ ASSERT_NO_THROW(allColumnNamesVector = ConvertTo<decltype(allColumnNamesVector)>(allColumnNames));
+ EXPECT_EQ(allColumnNamesVector, (std::vector<TString>{"column_a", "column_non_ascii_\xc3\x90\xc2\x81"}));
+
+ ASSERT_EQ(yqlTypeRegistry->GetType(), ENodeType::List);
+ auto yqlTypes = ConvertTo<std::vector<INodePtr>>(yqlTypeRegistry);
+
+ ASSERT_EQ(rows->GetType(), ENodeType::List);
+ ASSERT_EQ(rows->AsList()->GetChildCount(), 1);
+
+ auto row1 = rows->AsList()->GetChildOrThrow(0);
+
+ ASSERT_EQ(row1->GetType(), ENodeType::Map);
+ EXPECT_EQ(row1->AsMap()->GetChildCount(), 2);
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_a", R"(["DataType"; "Uint64"])", "100500", yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_non_ascii_\xc3\x90\xc2\x81", R"(["DataType"; "Int64"])", "-100500", yqlTypes);
+}
+
+TEST_F(TWriterForWebJson, YqlValueFormat_ComplexTypes)
+{
+ Config_->ValueFormat = EWebJsonValueFormat::Yql;
+
+ auto firstSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"column_a", OptionalLogicalType(
+ ListLogicalType(MakeLogicalType(ESimpleLogicalValueType::Int64, true)))},
+ {"column_b", StructLogicalType({
+ {"key", MakeLogicalType(ESimpleLogicalValueType::String, true)},
+ {"value", MakeLogicalType(ESimpleLogicalValueType::String, true)},
+ {"variant_tuple", VariantTupleLogicalType({
+ MakeLogicalType(ESimpleLogicalValueType::Int8, true),
+ MakeLogicalType(ESimpleLogicalValueType::Boolean, false),
+ })},
+ {"variant_struct", VariantStructLogicalType({
+ {"a", MakeLogicalType(ESimpleLogicalValueType::Int8, true)},
+ {"b", MakeLogicalType(ESimpleLogicalValueType::Boolean, false)},
+ })},
+ {"dict", DictLogicalType(
+ SimpleLogicalType(ESimpleLogicalValueType::Int64),
+ SimpleLogicalType(ESimpleLogicalValueType::String)),
+ },
+ {"tagged", TaggedLogicalType(
+ "MyTag",
+ SimpleLogicalType(ESimpleLogicalValueType::Int64)),
+ },
+ {"timestamp", SimpleLogicalType(ESimpleLogicalValueType::Timestamp)},
+ {"date", SimpleLogicalType(ESimpleLogicalValueType::Date)},
+ {"datetime", SimpleLogicalType(ESimpleLogicalValueType::Datetime)},
+ {"interval", SimpleLogicalType(ESimpleLogicalValueType::Interval)},
+ {"date32", SimpleLogicalType(ESimpleLogicalValueType::Date32)},
+ {"datetime64", SimpleLogicalType(ESimpleLogicalValueType::Datetime64)},
+ {"timestamp64", SimpleLogicalType(ESimpleLogicalValueType::Timestamp64)},
+ {"interval64", SimpleLogicalType(ESimpleLogicalValueType::Interval64)},
+ {"json", SimpleLogicalType(ESimpleLogicalValueType::Json)},
+ {"float", SimpleLogicalType(ESimpleLogicalValueType::Float)},
+ })},
+ {"column_c", ListLogicalType(StructLogicalType({
+ {"very_optional_key", OptionalLogicalType(MakeLogicalType(ESimpleLogicalValueType::String, false))},
+ {"optional_value", MakeLogicalType(ESimpleLogicalValueType::String, false)},
+ }))},
+ });
+
+ auto secondSchema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"column_a", VariantTupleLogicalType({
+ SimpleLogicalType(ESimpleLogicalValueType::Null),
+ SimpleLogicalType(ESimpleLogicalValueType::Any),
+ })},
+ {"column_b", SimpleLogicalType(ESimpleLogicalValueType::Null)},
+ {"column_c", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Null))},
+ {"column_d", OptionalLogicalType(SimpleLogicalType(ESimpleLogicalValueType::Int64))},
+ });
+
+ auto firstColumnAType = ConvertToNode(TYsonString(TStringBuf(R"([
+ "OptionalType";
+ [
+ "ListType";
+ ["DataType"; "Int64"]
+ ]
+ ])")));
+ auto firstColumnBType = ConvertToNode(TYsonString(TStringBuf(R"([
+ "StructType";
+ [
+ [
+ "key";
+ ["DataType"; "String"]
+ ];
+ [
+ "value";
+ ["DataType"; "String"]
+ ];
+ [
+ "variant_tuple";
+ [
+ "VariantType";
+ [
+ "TupleType";
+ [
+ ["DataType"; "Int8"];
+ [
+ "OptionalType";
+ ["DataType"; "Boolean"]
+ ]
+ ]
+ ]
+ ]
+ ];
+ [
+ "variant_struct";
+ [
+ "VariantType";
+ [
+ "StructType";
+ [
+ [
+ "a";
+ ["DataType"; "Int8"]
+ ];
+ [
+ "b";
+ [
+ "OptionalType";
+ ["DataType"; "Boolean"]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
+ [
+ "dict";
+ [
+ "DictType";
+ ["DataType"; "Int64"];
+ ["DataType"; "String"]
+ ]
+ ];
+ [
+ "tagged";
+ [
+ "TaggedType";
+ "MyTag";
+ ["DataType"; "Int64"]
+ ]
+ ];
+ [
+ "timestamp";
+ ["DataType"; "Timestamp"]
+ ];
+ [
+ "date";
+ ["DataType"; "Date"]
+ ];
+ [
+ "datetime";
+ ["DataType"; "Datetime"]
+ ];
+ [
+ "interval";
+ ["DataType"; "Interval"]
+ ];
+ [
+ "date32";
+ ["DataType"; "Date32"]
+ ];
+ [
+ "datetime64";
+ ["DataType"; "Datetime64"]
+ ];
+ [
+ "timestamp64";
+ ["DataType"; "Timestamp64"]
+ ];
+ [
+ "interval64";
+ ["DataType"; "Interval64"]
+ ];
+ [
+ "json";
+ ["DataType"; "Json"]
+ ];
+ [
+ "float";
+ ["DataType"; "Float"]
+ ];
+ ]
+ ])")));
+ auto firstColumnCType = ConvertToNode(TYsonString(TStringBuf(R"([
+ "ListType";
+ [
+ "StructType";
+ [
+ [
+ "very_optional_key";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ ["DataType"; "String"]
+ ]
+ ]
+ ];
+ [
+ "optional_value";
+ [
+ "OptionalType";
+ ["DataType"; "String"]
+ ]
+ ]
+ ]
+ ]
+ ])")));
+ auto secondColumnAType = ConvertToNode(TYsonString(TStringBuf(R"([
+ "VariantType";
+ [
+ "TupleType";
+ [
+ ["NullType"];
+ ["DataType"; "Yson"];
+ ]
+ ]
+ ])")));
+ auto secondColumnBType = ConvertToNode(TYsonString(TStringBuf(R"(["NullType"])")));
+ auto secondColumnCType = ConvertToNode(TYsonString(TStringBuf(R"([
+ "OptionalType";
+ [
+ "NullType";
+ ]
+ ])")));
+ auto secondColumnDType = ConvertToNode(TYsonString(TStringBuf(R"([
+ "OptionalType";
+ ["DataType"; "Int64"]
+ ])")));
+
+ CreateStandardWriter(std::vector{firstSchema, secondSchema});
+ {
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {"column_a", EValueType::Composite, R"([-1; -2; -5])"},
+ {
+ "column_b",
+ EValueType::Composite,
+ R"([
+ "key";
+ "value";
+ [0; 7];
+ [1; #];
+ [[1; "a"]; [2; "b"]];
+ 99;
+ 100u;
+ 101u;
+ 102u;
+ 103;
+ -42;
+ 42;
+ -42;
+ -1;
+ "[\"a\", {\"b\": 42}]";
+ -3.25;
+ ])",
+ },
+ {"column_c", EValueType::Composite, R"([[[#]; "value"]; [["key"]; #]])"},
+ {"column_d", -49},
+ {TString(TableIndexColumnName), 0},
+ {TString(RowIndexColumnName), 0},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_a", EValueType::Composite, R"([0; -2; -5; 177])"},
+ {
+ "column_b",
+ EValueType::Composite,
+ R"([
+ "key1";
+ "value1";
+ [1; %false];
+ [1; #];
+ [];
+ 199;
+ 0u;
+ 1101u;
+ 1102u;
+ 1103;
+ 123;
+ -123;
+ 123;
+ 123;
+ "null";
+ 0.0;
+ ])",
+ },
+ {"column_c", EValueType::Composite, R"([[#; #]; [["key1"]; #]])"},
+ {"column_d", 49u},
+ {TString(RowIndexColumnName), 1},
+ }).Get(),
+ MakeRow(NameTable_, {
+ {"column_a", EValueType::Composite, "[]"},
+ {
+ "column_b",
+ EValueType::Composite,
+ R"([
+ "key2";
+ "value2";
+ [0; 127];
+ [1; %true];
+ [[0; ""]];
+ 399;
+ 30u;
+ 3101u;
+ 3202u;
+ 3103;
+ -53375809;
+ -4611669897600;
+ -4611669897600000000;
+ -9223339708799999999;
+ "{\"x\": false}";
+ 1e10;
+ ])"
+ },
+ {"column_c", EValueType::Composite, "[[[key]; #]]"},
+ {"column_d", "49"},
+ {TString(RowIndexColumnName), 2},
+ }).Get(),
+
+ MakeRow(NameTable_, {
+ {"column_a", nullptr},
+ {
+ "column_b",
+ EValueType::Composite,
+ // First string is valid UTF-8, the second one should be Base64 encoded.
+ "["
+ "\"\xC3\xBF\";"
+ "\"\xFA\xFB\xFC\xFD\";"
+ R"(
+ [0; 127];
+ [1; %true];
+ [[-1; "-1"]; [0; ""]];
+ 499;
+ 40u;
+ 4101u;
+ 4202u;
+ 4103;
+ 53375807;
+ 4611669811199;
+ 4611669811199999999;
+ 9223339708799999999;
+ "{}";
+ -2.125;
+ ])",
+ },
+ {"column_c", EValueType::Composite, "[]"},
+ {"column_d", EValueType::Any, "{x=49}"},
+ {TString(RowIndexColumnName), 3},
+ }).Get(),
+
+ // Here come rows from the second table.
+ MakeRow(NameTable_, {
+ {"column_a", EValueType::Composite, "[0; #]"},
+ {"column_b", nullptr},
+ {"column_c", nullptr},
+ {"column_d", -49},
+ {TString(TableIndexColumnName), 1},
+ {TString(RowIndexColumnName), 0},
+ }).Get(),
+
+ MakeRow(NameTable_, {
+ {"column_a", EValueType::Composite, "[1; {z=z}]"},
+ {"column_b", nullptr},
+ {"column_c", EValueType::Composite, "[#]"},
+ {"column_d", nullptr},
+ {TString(TableIndexColumnName), 1},
+ {TString(RowIndexColumnName), 1},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ Writer_->Close().Get().ThrowOnError();
+ }
+
+ auto result = ParseJsonToNode(OutputStream_.Str());
+ ASSERT_EQ(result->GetType(), ENodeType::Map);
+
+ auto rows = result->AsMap()->FindChild("rows");
+ ASSERT_TRUE(rows);
+ auto incompleteColumns = result->AsMap()->FindChild("incomplete_columns");
+ ASSERT_TRUE(incompleteColumns);
+ auto incompleteAllColumnNames = result->AsMap()->FindChild("incomplete_all_column_names");
+ ASSERT_TRUE(incompleteAllColumnNames);
+ auto allColumnNames = result->AsMap()->FindChild("all_column_names");
+ ASSERT_TRUE(allColumnNames);
+ auto yqlTypeRegistry = result->AsMap()->FindChild("yql_type_registry");
+ ASSERT_TRUE(yqlTypeRegistry);
+
+ ASSERT_EQ(incompleteColumns->GetType(), ENodeType::String);
+ EXPECT_EQ(incompleteColumns->GetValue<TString>(), "false");
+
+ ASSERT_EQ(incompleteAllColumnNames->GetType(), ENodeType::String);
+ EXPECT_EQ(incompleteAllColumnNames->GetValue<TString>(), "false");
+
+ ASSERT_EQ(allColumnNames->GetType(), ENodeType::List);
+ std::vector<TString> allColumnNamesVector;
+ ASSERT_NO_THROW(allColumnNamesVector = ConvertTo<decltype(allColumnNamesVector)>(allColumnNames));
+ EXPECT_EQ(allColumnNamesVector, (std::vector<TString>{"column_a", "column_b", "column_c", "column_d"}));
+
+ ASSERT_EQ(yqlTypeRegistry->GetType(), ENodeType::List);
+ auto yqlTypes = ConvertTo<std::vector<INodePtr>>(yqlTypeRegistry);
+
+ ASSERT_EQ(rows->GetType(), ENodeType::List);
+ ASSERT_EQ(rows->AsList()->GetChildCount(), 6);
+
+ auto row1 = rows->AsList()->GetChildOrThrow(0);
+ auto row2 = rows->AsList()->GetChildOrThrow(1);
+ auto row3 = rows->AsList()->GetChildOrThrow(2);
+ auto row4 = rows->AsList()->GetChildOrThrow(3);
+ auto row5 = rows->AsList()->GetChildOrThrow(4);
+ auto row6 = rows->AsList()->GetChildOrThrow(5);
+
+ ASSERT_EQ(row1->GetType(), ENodeType::Map);
+ EXPECT_EQ(row1->AsMap()->GetChildCount(), 4);
+ auto row1AValue = ConvertToNode(TYsonString(TStringBuf(R"([{"val"=["-1"; "-2"; "-5"]}])")));
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_a", firstColumnAType, row1AValue, yqlTypes);
+ auto row1BValue = ConvertToNode(TYsonString(TStringBuf(
+ R"([
+ "key";
+ "value";
+ ["0"; "7"];
+ ["1"; #];
+ {"val"=[["1"; "a"]; ["2"; "b"]]};
+ "99";
+ "100";
+ "101";
+ "102";
+ "103";
+ "-42";
+ "42";
+ "-42";
+ "-1";
+ "[\"a\", {\"b\": 42}]";
+ "-3.25";
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_b", firstColumnBType, row1BValue, yqlTypes);
+ auto row1CValue = ConvertToNode(TYsonString(TStringBuf(R"({
+ "val"=[
+ [[#]; ["value"]];
+ [[["key"]]; #]
+ ]
+ })")));
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_c", firstColumnCType, row1CValue, yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row1, "column_d", R"(["DataType"; "Int64"])", "-49", yqlTypes);
+
+ ASSERT_EQ(row2->GetType(), ENodeType::Map);
+ EXPECT_EQ(row2->AsMap()->GetChildCount(), 4);
+ auto row2AValue = ConvertToNode(TYsonString(TStringBuf(R"([{"val"=["0"; "-2"; "-5"; "177"]}])")));
+ CHECK_YQL_TYPE_AND_VALUE(row2, "column_a", firstColumnAType, row2AValue, yqlTypes);
+ auto row2BValue = ConvertToNode(TYsonString(TStringBuf(
+ R"([
+ "key1";
+ "value1";
+ ["1"; [%false]];
+ ["1"; #];
+ {"val"=[]};
+ "199";
+ "0";
+ "1101";
+ "1102";
+ "1103";
+ "123";
+ "-123";
+ "123";
+ "123";
+ "null";
+ "0";
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row2, "column_b", firstColumnBType, row2BValue, yqlTypes);
+ auto row2CValue = ConvertToNode(TYsonString(TStringBuf(R"({
+ "val"=[
+ [#; #];
+ [[["key1"]]; #]
+ ]
+ })")));
+ CHECK_YQL_TYPE_AND_VALUE(row2, "column_c", firstColumnCType, row2CValue, yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row2, "column_d", R"(["DataType"; "Uint64"])", "49", yqlTypes);
+
+ ASSERT_EQ(row3->GetType(), ENodeType::Map);
+ EXPECT_EQ(row3->AsMap()->GetChildCount(), 4);
+ auto row3AValue = ConvertToNode(TYsonString(TStringBuf(R"([{"val"=[]}])")));
+ CHECK_YQL_TYPE_AND_VALUE(row3, "column_a", firstColumnAType, row3AValue, yqlTypes);
+ auto row3BValue = ConvertToNode(TYsonString(TStringBuf(
+ R"([
+ "key2";
+ "value2";
+ ["0"; "127"];
+ ["1"; [%true]];
+ {"val"=[["0"; ""]]};
+ "399";
+ "30";
+ "3101";
+ "3202";
+ "3103";
+ "-53375809";
+ "-4611669897600";
+ "-4611669897600000000";
+ "-9223339708799999999";
+ "{\"x\": false}";
+ "10000000000";
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row3, "column_b", firstColumnBType, row3BValue, yqlTypes);
+ auto row3CValue = ConvertToNode(TYsonString(TStringBuf(R"({
+ "val"=[
+ [[["key"]]; #]
+ ]
+ })")));
+ CHECK_YQL_TYPE_AND_VALUE(row3, "column_c", firstColumnCType, row3CValue, yqlTypes);
+ CHECK_YQL_TYPE_AND_VALUE(row3, "column_d", R"(["DataType"; "String"])", "49", yqlTypes);
+
+ ASSERT_EQ(row4->GetType(), ENodeType::Map);
+ EXPECT_EQ(row4->AsMap()->GetChildCount(), 4);
+ auto row4AValue = ConvertToNode(TYsonString(TStringBuf(R"(#)")));
+ CHECK_YQL_TYPE_AND_VALUE(row4, "column_a", firstColumnAType, row4AValue, yqlTypes);
+
+ auto row4BValue = ConvertToNode(TYsonString(TStringBuf(
+ "["
+ "\"\xC3\xBF\";"
+ R"(
+ {"b64" = %true; "val" = "+vv8/Q=="};
+ ["0"; "127"];
+ ["1"; [%true]];
+ {"val"=[["-1"; "-1"]; ["0"; ""]]};
+ "499";
+ "40";
+ "4101";
+ "4202";
+ "4103";
+ "53375807";
+ "4611669811199";
+ "4611669811199999999";
+ "9223339708799999999";
+ "{}";
+ "-2.125";
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row4, "column_b", firstColumnBType, row4BValue, yqlTypes);
+
+ auto row4CValue = ConvertToNode(TYsonString(TStringBuf(R"({"val"=[]})")));
+ CHECK_YQL_TYPE_AND_VALUE(row4, "column_c", firstColumnCType, row4CValue, yqlTypes);
+ auto row4DValue = ConvertToNode(TYsonString(TStringBuf(R"({
+ val = {
+ x = {
+ "$type" = "int64";
+ "$value" = "49";
+ }
+ }
+ })")));
+ CHECK_YQL_TYPE_AND_VALUE(row4, "column_d", R"(["DataType"; "Yson"])", row4DValue, yqlTypes);
+
+ // Here must come rows from the second table.
+
+ ASSERT_EQ(row5->GetType(), ENodeType::Map);
+ EXPECT_EQ(row5->AsMap()->GetChildCount(), 4);
+ auto row5AValue = ConvertToNode(TYsonString(TStringBuf(R"(["0"; #])")));
+ CHECK_YQL_TYPE_AND_VALUE(row5, "column_a", secondColumnAType, row5AValue, yqlTypes);
+ auto row5BValue = ConvertToNode(TYsonString(TStringBuf(R"(#)")));
+ CHECK_YQL_TYPE_AND_VALUE(row5, "column_b", secondColumnBType, row5BValue, yqlTypes);
+ auto row5CValue = ConvertToNode(TYsonString(TStringBuf(R"(#)")));
+ CHECK_YQL_TYPE_AND_VALUE(row5, "column_c", secondColumnCType, row5CValue, yqlTypes);
+ auto row5DValue = ConvertToNode(TYsonString(TStringBuf(R"(["-49"])")));
+ CHECK_YQL_TYPE_AND_VALUE(row5, "column_d", secondColumnDType, row5DValue, yqlTypes);
+
+ ASSERT_EQ(row6->GetType(), ENodeType::Map);
+ EXPECT_EQ(row6->AsMap()->GetChildCount(), 4);
+ auto row6AValue = ConvertToNode(TYsonString(TStringBuf(R"([
+ "1";
+ {
+ val = {
+ z = {
+ "$type" = "string";
+ "$value" = "z";
+ }
+ }
+ };
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row6, "column_a", secondColumnAType, row6AValue, yqlTypes);
+ auto row6BValue = ConvertToNode(TYsonString(TStringBuf(R"(#)")));
+ CHECK_YQL_TYPE_AND_VALUE(row6, "column_b", secondColumnBType, row6BValue, yqlTypes);
+ auto row6CValue = ConvertToNode(TYsonString(TStringBuf(R"([#])")));
+ CHECK_YQL_TYPE_AND_VALUE(row6, "column_c", secondColumnCType, row6CValue, yqlTypes);
+ auto row6DValue = ConvertToNode(TYsonString(TStringBuf(R"(#)")));
+ CHECK_YQL_TYPE_AND_VALUE(row6, "column_d", secondColumnDType, row6DValue, yqlTypes);
+}
+
+TEST_F(TWriterForWebJson, YqlValueFormat_Incomplete)
+{
+ Config_->ValueFormat = EWebJsonValueFormat::Yql;
+ Config_->FieldWeightLimit = 215;
+ Config_->StringWeightLimit = 10;
+
+ auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"column_a", StructLogicalType({
+ {"field1", SimpleLogicalType(ESimpleLogicalValueType::Int64)},
+ {"list", ListLogicalType(
+ VariantStructLogicalType({
+ {"a", DictLogicalType(
+ SimpleLogicalType(ESimpleLogicalValueType::Int64),
+ SimpleLogicalType(ESimpleLogicalValueType::String)),
+ },
+ {"b", SimpleLogicalType(ESimpleLogicalValueType::Any)},
+ })),
+ },
+ {"field2", SimpleLogicalType(ESimpleLogicalValueType::String)},
+ {"field3", MakeLogicalType(ESimpleLogicalValueType::Int64, false)},
+ })},
+ {"column_b", SimpleLogicalType(ESimpleLogicalValueType::Any)},
+ {"column_c", MakeLogicalType(ESimpleLogicalValueType::String, false)},
+ });
+
+ auto yqlTypeA = ConvertToNode(TYsonString(TStringBuf(R"([
+ "StructType";
+ [
+ [
+ "field1";
+ ["DataType"; "Int64"]
+ ];
+ [
+ "list";
+ [
+ "ListType";
+ [
+ "VariantType";
+ [
+ "StructType";
+ [
+ [
+ "a";
+ [
+ "DictType";
+ ["DataType"; "Int64"];
+ ["DataType"; "String"]
+ ]
+ ];
+ [
+ "b";
+ ["DataType"; "Yson"]
+ ];
+ ]
+ ]
+ ]
+ ]
+ ];
+ [
+ "field2";
+ ["DataType"; "String"]
+ ];
+ [
+ "field3";
+ [
+ "OptionalType";
+ ["DataType"; "Int64"]
+ ]
+ ];
+ ]
+ ])")));
+
+ auto yqlTypeB = ConvertToNode(TYsonString(TStringBuf(R"(["DataType"; "Yson"])")));
+ auto yqlTypeC = ConvertToNode(TYsonString(TStringBuf(R"(["OptionalType"; ["DataType"; "String"]])")));
+ {
+ CreateStandardWriter({schema});
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {
+ {
+ "column_a",
+ EValueType::Composite,
+ R"([
+ -1;
+ [
+ [
+ 0;
+ [
+ [-2; "UTF:)" + TString("\xF0\x90\x8D\x88") + "\xF0\x90\x8D\x88" + R"("];
+ [2; "!UTF:)" + TString("\xFA\xFB\xFC\xFD\xFA\xFB\xFC\xFD") + R"("];
+ [0; ""];
+ ]
+ ];
+ [
+ 1;
+ "{kinda_long_key = kinda_even_longer_value}"
+ ];
+ [
+ 0;
+ [
+ [0; "One more quite long string"];
+ [1; "One more quite long string"];
+ [2; "One more quite long string"];
+ [3; "One more quite long string"];
+ [4; "One more quite long string"];
+ [5; "One more quite long string"];
+ ]
+ ];
+ [
+ 1;
+ "{kinda_long_key = kinda_even_longer_value}"
+ ];
+ ];
+ "I'm short";
+ 424242238133245
+ ])"
+ },
+ {"column_b", EValueType::Any, "{kinda_long_key = kinda_even_longer_value}"},
+ {"column_c", "One more quite long string"},
+ }).Get(),
+ });
+ EXPECT_TRUE(written);
+ Writer_->Close().Get().ThrowOnError();
+ }
+
+ auto result = ParseJsonToNode(OutputStream_.Str());
+ ASSERT_EQ(result->GetType(), ENodeType::Map);
+
+ auto rows = result->AsMap()->FindChild("rows");
+ ASSERT_TRUE(rows);
+ auto yqlTypeRegistry = result->AsMap()->FindChild("yql_type_registry");
+ ASSERT_TRUE(yqlTypeRegistry);
+
+ ASSERT_EQ(yqlTypeRegistry->GetType(), ENodeType::List);
+ auto yqlTypes = ConvertTo<std::vector<INodePtr>>(yqlTypeRegistry);
+
+ ASSERT_EQ(rows->GetType(), ENodeType::List);
+ ASSERT_EQ(rows->AsList()->GetChildCount(), 1);
+
+ auto row = rows->AsList()->GetChildOrThrow(0);
+ ASSERT_EQ(row->GetType(), ENodeType::Map);
+ EXPECT_EQ(row->AsMap()->GetChildCount(), 3);
+
+ auto rowAValue = ConvertToNode(TYsonString(R"([
+ "-1";
+ {
+ "inc" = %true;
+ "val" = [
+ [
+ "0";
+ {
+ "val" = [
+ ["-2"; {"inc"=%true; "val"="UTF:)" + TString("\xF0\x90\x8D\x88") + R"("}];
+ ["2"; {"inc"=%true; "b64"=%true; "val"="IVVURjr6"}];
+ ["0"; ""];
+ ]
+ }
+ ];
+ [
+ "1";
+ {"val"=""; "inc"=%true}
+ ];
+ [
+ "0";
+ {
+ "inc" = %true;
+ "val" = [
+ ["0"; {"val"="One more q"; "inc"=%true}];
+ ["1"; {"val"="One more "; "inc"=%true}];
+ ];
+ }
+ ];
+ ];
+ };
+ {
+ "val" = "";
+ "inc" = %true;
+ };
+ ["424242238133245"];
+ ])"));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_a", yqlTypeA, rowAValue, yqlTypes);
+
+ // Simple values are not truncated to |StringWeightLimit|
+ auto rowBValue = ConvertToNode(TYsonString(TStringBuf(R"({
+ val = {
+ kinda_long_key = {
+ "$type" = "string";
+ "$value" = kinda_even_longer_value;
+ }
+ }
+ })")));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_b", yqlTypeB, rowBValue, yqlTypes);
+ auto rowCValue = ConvertToNode(TYsonString(TStringBuf(R"(["One more quite long string"])")));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_c", yqlTypeC, rowCValue, yqlTypes);
+}
+
+
+TEST_F(TWriterForWebJson, YqlValueFormat_Any)
+{
+ Config_->ValueFormat = EWebJsonValueFormat::Yql;
+
+ auto schema = New<TTableSchema>(std::vector<TColumnSchema>{
+ {"column_a", MakeLogicalType(ESimpleLogicalValueType::Any, false)},
+ });
+
+ auto yqlTypeA = ConvertToNode(TYsonString(TStringBuf(R"([
+ "OptionalType";
+ ["DataType"; "Yson"]
+ ])")));
+
+ CreateStandardWriter({schema});
+ {
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {{"column_a", EValueType::Any, "{x=y;z=2}"}}).Get(),
+ MakeRow(NameTable_, {{"column_a", true}}).Get(),
+ MakeRow(NameTable_, {{"column_a", -42}}).Get(),
+ MakeRow(NameTable_, {{"column_a", 42u}}).Get(),
+ });
+ EXPECT_TRUE(written);
+ Writer_->Close().Get().ThrowOnError();
+ }
+
+ auto result = ParseJsonToNode(OutputStream_.Str());
+ ASSERT_EQ(result->GetType(), ENodeType::Map);
+
+ auto rows = result->AsMap()->FindChild("rows");
+ ASSERT_TRUE(rows);
+ auto yqlTypeRegistry = result->AsMap()->FindChild("yql_type_registry");
+ ASSERT_TRUE(yqlTypeRegistry);
+
+ ASSERT_EQ(yqlTypeRegistry->GetType(), ENodeType::List);
+ auto yqlTypes = ConvertTo<std::vector<INodePtr>>(yqlTypeRegistry);
+
+ ASSERT_EQ(rows->GetType(), ENodeType::List);
+ ASSERT_EQ(rows->AsList()->GetChildCount(), 4);
+
+ {
+ auto row = rows->AsList()->GetChildOrThrow(0);
+ ASSERT_EQ(row->GetType(), ENodeType::Map);
+ auto rowAValue = ConvertToNode(TYsonString(TStringBuf(R"([
+ {
+ val = {
+ x = {
+ "$type" = "string";
+ "$value" = "y";
+ };
+ z = {
+ "$type" = "int64";
+ "$value" = "2";
+ }
+ }
+ }
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_a", yqlTypeA, rowAValue, yqlTypes);
+ }
+ {
+ auto row = rows->AsList()->GetChildOrThrow(1);
+ ASSERT_EQ(row->GetType(), ENodeType::Map);
+ auto rowAValue = ConvertToNode(TYsonString(TStringBuf(R"([
+ {
+ val = {
+ "$type" = "boolean";
+ "$value" = "true";
+ }
+ }
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_a", yqlTypeA, rowAValue, yqlTypes);
+ }
+ {
+ auto row = rows->AsList()->GetChildOrThrow(2);
+ ASSERT_EQ(row->GetType(), ENodeType::Map);
+ auto rowAValue = ConvertToNode(TYsonString(TStringBuf(R"([
+ {
+ val = {
+ "$type" = "int64";
+ "$value" = "-42";
+ }
+ }
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_a", yqlTypeA, rowAValue, yqlTypes);
+ }
+ {
+ auto row = rows->AsList()->GetChildOrThrow(3);
+ ASSERT_EQ(row->GetType(), ENodeType::Map);
+ auto rowAValue = ConvertToNode(TYsonString(TStringBuf(R"([
+ {
+ val = {
+ "$type" = "uint64";
+ "$value" = "42";
+ }
+ }
+ ])")));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_a", yqlTypeA, rowAValue, yqlTypes);
+ }
+}
+
+TEST_F(TWriterForWebJson, YqlValueFormat_CompositeNoSchema)
+{
+ Config_->ValueFormat = EWebJsonValueFormat::Yql;
+
+ auto schema = New<TTableSchema>();
+
+ auto yqlTypeA = ConvertToNode(TYsonString(TStringBuf(R"(["DataType"; "Yson"])")));
+
+ CreateStandardWriter({schema});
+ {
+ bool written = Writer_->Write({
+ MakeRow(NameTable_, {{"column_a", EValueType::Composite, "[1;2]"}}).Get(),
+ });
+ EXPECT_TRUE(written);
+ Writer_->Close().Get().ThrowOnError();
+ }
+
+ auto result = ParseJsonToNode(OutputStream_.Str());
+ ASSERT_EQ(result->GetType(), ENodeType::Map);
+
+ auto rows = result->AsMap()->FindChild("rows");
+ ASSERT_TRUE(rows);
+ auto yqlTypeRegistry = result->AsMap()->FindChild("yql_type_registry");
+ ASSERT_TRUE(yqlTypeRegistry);
+
+ ASSERT_EQ(yqlTypeRegistry->GetType(), ENodeType::List);
+ auto yqlTypes = ConvertTo<std::vector<INodePtr>>(yqlTypeRegistry);
+
+ ASSERT_EQ(rows->GetType(), ENodeType::List);
+ ASSERT_EQ(rows->AsList()->GetChildCount(), 1);
+
+ {
+ auto row = rows->AsList()->GetChildOrThrow(0);
+ ASSERT_EQ(row->GetType(), ENodeType::Map);
+ auto rowAValue = ConvertToNode(TYsonString(TStringBuf(R"({
+ "val" = [
+ {
+ "$type" = "int64";
+ "$value" = "1";
+ };
+ {
+ "$type" = "int64";
+ "$value" = "2";
+ }
+ ]
+ })")));
+ CHECK_YQL_TYPE_AND_VALUE(row, "column_a", yqlTypeA, rowAValue, yqlTypes);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/ya.make b/yt/yt/library/formats/unittests/ya.make
new file mode 100644
index 0000000000..f080e66dc7
--- /dev/null
+++ b/yt/yt/library/formats/unittests/ya.make
@@ -0,0 +1,53 @@
+GTEST(unittester-formats)
+
+INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
+
+PROTO_NAMESPACE(yt)
+
+SRCS(
+ protobuf_format_ut.proto
+
+ arrow_parser_ut.cpp
+ dsv_parser_ut.cpp
+ dsv_writer_ut.cpp
+ protobuf_format_ut.cpp
+ row_helpers.cpp
+ schemaful_dsv_parser_ut.cpp
+ schemaful_dsv_writer_ut.cpp
+ skiff_format_ut.cpp
+ skiff_yson_converter_ut.cpp
+ value_examples.cpp
+ web_json_writer_ut.cpp
+ yamred_dsv_parser_ut.cpp
+ yamred_dsv_writer_ut.cpp
+ yaml_parser_ut.cpp
+ yaml_writer_ut.cpp
+ yamr_parser_ut.cpp
+ yamr_writer_ut.cpp
+ yson_helpers.cpp
+)
+
+INCLUDE(${ARCADIA_ROOT}/yt/opensource.inc)
+
+PEERDIR(
+ yt/yt/build
+ yt/yt/core/test_framework
+ yt/yt/core
+ yt/yt/client
+ yt/yt/client/formats
+ yt/yt/library/formats
+ yt/yt/library/named_value
+
+ contrib/libs/apache/arrow
+)
+
+RESOURCE(
+ ${ARCADIA_ROOT}/library/cpp/type_info/ut/test-data/good-types.txt /types/good
+ ${ARCADIA_ROOT}/library/cpp/type_info/ut/test-data/bad-types.txt /types/bad
+)
+
+SIZE(MEDIUM)
+
+REQUIREMENTS(ram:12)
+
+END()
diff --git a/yt/yt/library/formats/unittests/yaml_parser_ut.cpp b/yt/yt/library/formats/unittests/yaml_parser_ut.cpp
new file mode 100644
index 0000000000..95b9898360
--- /dev/null
+++ b/yt/yt/library/formats/unittests/yaml_parser_ut.cpp
@@ -0,0 +1,598 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/client/formats/parser.h>
+
+#include <yt/yt/client/formats/config.h>
+
+#include <yt/yt/library/formats/yaml_parser.h>
+
+#include <yt/yt/core/yson/writer.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NYson;
+
+////////////////////////////////////////////////////////////////////////////
+
+TString ParseYaml(const TString& yaml, EYsonType ysonType)
+{
+ TStringStream inputStream(yaml);
+ TStringStream outputStream;
+ TYsonWriter writer(&outputStream, EYsonFormat::Pretty, ysonType);
+ auto config = New<TYamlFormatConfig>();
+ ParseYaml(&inputStream, &writer, config, ysonType);
+ return outputStream.Str();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamlParserTest, Simple)
+{
+ TString yaml = R"(
+hello)";
+ // Here and in the rest of the tests we introduce an extra leading \n for the better readabilty, which we later
+ // strip off in the comparison.
+ TString expectedYson = R"(
+"hello")";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+}
+
+TEST(TYamlParserTest, Integers)
+{
+ TString yaml = R"(
+a: 1
+b: -1
+# Hex and oct
+c: 0xDeAdBeEf
+d: 0o42
+# Various non-normalized forms of numbers
+e: -000
+f: +0
+g: +42
+# Would be oct in YAML 1.1, but not in YAML 1.2!
+h: 0042
+i: -018
+# 2^63, should be unsigned
+j: 9223372036854775808
+# 2^64 - 1, should be unsigned
+k: 18446744073709551615
+l: -9223372036854775808
+m: !yt/uint64 1234
+n: !!int 23
+o: !!int -15)";
+ TString expectedYson = R"(
+{
+ "a" = 1;
+ "b" = -1;
+ "c" = 3735928559u;
+ "d" = 34u;
+ "e" = 0;
+ "f" = 0;
+ "g" = 42;
+ "h" = 42;
+ "i" = -18;
+ "j" = 9223372036854775808u;
+ "k" = 18446744073709551615u;
+ "l" = -9223372036854775808;
+ "m" = 1234u;
+ "n" = 23;
+ "o" = -15;
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+
+ std::vector<TString> invalidYamls = {
+ "!!int -0x42",
+ "!!int -0o23",
+ "!!int deadbeef",
+ "!!int 18446744073709551616",
+ "!!int -9223372036854775809"
+ "!yt/uint64 -1",
+ "!yt/uint64 18446744073709551616",
+ "!!int 0x",
+ // Examples below were integers in YAML 1.1, but not in YAML 1.2.
+ "!!int 123_456",
+ "!!int 190:20:30",
+ "!!int 0b1001",
+ "!!int \"\"",
+ };
+ for (const auto& yaml : invalidYamls) {
+ EXPECT_THROW_MESSAGE_HAS_SUBSTR(ParseYaml(yaml, EYsonType::Node), std::exception, "is not an integer or does not fit")
+ << "For YAML: " << yaml << std::endl;
+ }
+}
+
+TEST(TYamlParserTest, Floats)
+{
+ TString yaml = R"(
+a: 1.
+b: .2
+c: +3.14
+d: -2.17
+e: .inf
+f: -.Inf
+g: +.INF
+h: .nan
+i: .NaN
+j: .NAN
+k: !!float 42
+l: 1e2
+m: 1e+2
+n: 1e-2
+)";
+ TString expectedYson = R"(
+{
+ "a" = 1.;
+ "b" = 0.2;
+ "c" = 3.14;
+ "d" = -2.17;
+ "e" = %inf;
+ "f" = %-inf;
+ "g" = %inf;
+ "h" = %nan;
+ "i" = %nan;
+ "j" = %nan;
+ "k" = 42.;
+ "l" = 100.;
+ "m" = 100.;
+ "n" = 0.01;
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+
+ std::vector<TString> invalidYamls = {
+ "!!float 0o23",
+ "!!float 1e",
+ "!!float 1e+",
+ "!!float 1e-",
+ "!!float 1e-2.3",
+ "!!float 1e2.3",
+ // Examples below were integers in YAML 1.1, but not in YAML 1.2.
+ "!!float 123_456",
+ "!!float 190:20:30.15",
+ "!!float inf",
+ "!!float .InF",
+ "!!float -+42.0",
+ "!!float .",
+ // For some reason arcadian FloatToString parses this, but it feels excessive to ban that
+ // despite not satisfying the regexp from the spec.
+ // "!!float 0x42",
+ };
+ for (const auto& yaml : invalidYamls) {
+ EXPECT_THROW_MESSAGE_HAS_SUBSTR(ParseYaml(yaml, EYsonType::Node), std::exception, "is not a floating point")
+ << "For YAML: " << yaml << std::endl;
+ }
+}
+
+TEST(TYamlParserTest, Booleans)
+{
+ TString yaml = R"(
+a: true
+b: false
+c: True
+d: False
+e: TRUE
+f: FALSE
+g: !!bool true
+)";
+ TString expectedYson = R"(
+{
+ "a" = %true;
+ "b" = %false;
+ "c" = %true;
+ "d" = %false;
+ "e" = %true;
+ "f" = %false;
+ "g" = %true;
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+
+ std::vector<TString> invalidYamls = {
+ "!!bool 1",
+ "!!bool 0",
+ // Examples below were booleans in YAML 1.1, but not in YAML 1.2.
+ "!!bool yes",
+ "!!bool no",
+ "!!bool on",
+ "!!bool off",
+ "!!bool y",
+ "!!bool n",
+ "!!bool \"\"",
+ };
+ for (const auto& yaml : invalidYamls) {
+ EXPECT_THROW_MESSAGE_HAS_SUBSTR(ParseYaml(yaml, EYsonType::Node), std::exception, "is not a boolean")
+ << "For YAML: " << yaml << std::endl;
+ }
+}
+
+TEST(TYamlParserTest, Nulls)
+{
+ TString yaml = R"(
+a: null
+b: Null
+c: NULL
+d: ~
+e:
+f: !!null null
+# This is not allowed by a regexp in a spec, but feels excessive to ban.
+g: !!null foo
+)";
+ TString expectedYson = R"(
+{
+ "a" = #;
+ "b" = #;
+ "c" = #;
+ "d" = #;
+ "e" = #;
+ "f" = #;
+ "g" = #;
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+}
+
+TEST(TYamlParserTest, Strings)
+{
+ TString yaml = R"(
+a: "hello"
+b: 'world'
+c: of
+d: !!str warcraft
+e: !!str 42
+f: !!str ~
+g: ! hello
+)";
+ TString expectedYson = R"(
+{
+ "a" = "hello";
+ "b" = "world";
+ "c" = "of";
+ "d" = "warcraft";
+ "e" = "42";
+ "f" = "~";
+ "g" = "hello";
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+}
+
+TEST(TYamlParserTest, Mappings)
+{
+ TString yaml = R"(
+a:
+ x: 1
+ y:
+ foo: bar
+ bar: foo
+42:
+ z: 3
+c: {}
+)";
+ TString expectedYson = R"(
+{
+ "a" = {
+ "x" = 1;
+ "y" = {
+ "foo" = "bar";
+ "bar" = "foo";
+ };
+ };
+ "42" = {
+ "z" = 3;
+ };
+ "c" = {};
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+}
+
+TEST(TYamlParserTest, Sequences)
+{
+ TString yaml = R"(
+- foo
+- - 1
+ - 2
+ - 3
+- bar
+- []
+- - - - null
+)";
+ TString expectedYson = R"(
+[
+ "foo";
+ [
+ 1;
+ 2;
+ 3;
+ ];
+ "bar";
+ [];
+ [
+ [
+ [
+ #;
+ ];
+ ];
+ ];
+])";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+}
+
+TEST(TYamlParserTest, Attributes)
+{
+ TString yaml = R"(
+!yt/attrnode
+- x: 1
+ y: 2
+- a: !yt/attrnode
+ - {}
+ - 42
+ b: !yt/attrnode
+ - x: null
+ - - 1
+ - 2
+ - 3
+ c: !yt/attrnode
+ - foo: 1
+ - null
+)";
+ // <x=1;y=2>{a=<>42; b=<x=#>[1;2;3]; c=<foo=1>#;}
+ TString expectedYson = R"(
+<
+ "x" = 1;
+ "y" = 2;
+> {
+ "a" = <> 42;
+ "b" = <
+ "x" = #;
+ > [
+ 1;
+ 2;
+ 3;
+ ];
+ "c" = <
+ "foo" = 1;
+ > #;
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+
+ std::vector<std::pair<TString, TString>> invalidYamlsAndErrors = {
+ {R"(
+!yt/attrnode
+- x: 1
+)", "Unexpected event type \"sequence_end\""},
+ {R"(
+!yt/attrnode
+- foo
+- bar
+)", "Unexpected event type \"scalar\""},
+ {R"(
+!yt/attrnode
+- x: 1
+- y: 2
+- z: 3
+)", "Unexpected event type \"mapping_start\""},
+};
+ for (const auto& [yaml, error] : invalidYamlsAndErrors) {
+ EXPECT_THROW_MESSAGE_HAS_SUBSTR(ParseYaml(yaml, EYsonType::Node), std::exception, error)
+ << "For YAML: " << yaml << std::endl;
+ }
+};
+
+TEST(TYamlParserTest, MultiDocument)
+{
+ TString yaml = R"(
+a: 1
+---
+foo
+---
+~
+---
+)";
+ TString expectedYson = R"(
+{
+ "a" = 1;
+};
+"foo";
+#;
+#;
+)";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::ListFragment), expectedYson.substr(1));
+}
+
+TEST(TYamlParserTest, Anchors)
+{
+ TString yaml = R"(
+a: &foo 1
+b: *foo
+c: &bar
+ x: &baz
+ - False
+ - &qux True
+ y: 2
+ z: *baz
+ t: *foo
+ w: *qux
+d: *bar
+e: *baz
+f: *foo
+g: *qux
+)";
+ TString expectedYson = R"(
+{
+ "a" = 1;
+ "b" = 1;
+ "c" = {
+ "x" = [
+ %false;
+ %true;
+ ];
+ "y" = 2;
+ "z" = [
+ %false;
+ %true;
+ ];
+ "t" = 1;
+ "w" = %true;
+ };
+ "d" = {
+ "x" = [
+ %false;
+ %true;
+ ];
+ "y" = 2;
+ "z" = [
+ %false;
+ %true;
+ ];
+ "t" = 1;
+ "w" = %true;
+ };
+ "e" = [
+ %false;
+ %true;
+ ];
+ "f" = 1;
+ "g" = %true;
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+
+ std::vector<std::pair<TString, TString>> invalidYamlsAndErrors = {
+ {R"(
+a: *foo
+)", "undefined or unfinished anchor"},
+ {R"(
+- &foo a
+- &foo b
+)", "already defined"},
+ {R"(
+a: &foo
+- b: &foo
+ - c
+)", "already defined"},
+ {R"(
+a: &foo
+ bar: *foo
+)", "undefined or unfinished anchor"},
+ {R"(
+a: &foo bar
+*foo: baz
+)", "alias as a map key is not supported"},
+ {R"(
+&foo a: b
+)", "anchors on map keys is not supported"},
+ };
+ for (const auto& [yaml, error] : invalidYamlsAndErrors) {
+ EXPECT_THROW_MESSAGE_HAS_SUBSTR(ParseYaml(yaml, EYsonType::Node), std::exception, error)
+ << "For YAML: " << yaml << std::endl;
+ }
+}
+
+TEST(TYamlParserTest, Empty)
+{
+ TString yaml = "";
+ TString expectedYson = "";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::ListFragment), expectedYson);
+}
+
+//! There is a reverse test in yaml_writer_ut.cpp.
+TEST(TYamlParserTest, RealExample)
+{
+ TString yaml = R"(
+mount_config: {}
+schema: !yt/attrnode
+- strict: true
+ unique_keys: false
+- - name: lat
+ required: false
+ type: double
+ type_v3:
+ type_name: optional
+ item: double
+ - name: lon
+ required: false
+ type: double
+ type_v3:
+ type_name: optional
+ item: double
+native_cell_tag: !yt/uint64 9991
+creation_time: 2024-08-15T11:17:59.314773Z
+inherit_acl: true
+revision: !yt/uint64 8233452423020
+resource_usage:
+ node_count: 1
+ chunk_count: 1
+ disk_space_per_medium:
+ default: 562182
+ disk_space: 562182
+ chunk_host_cell_master_memory: 0
+ master_memory: 0
+ tablet_count: 0
+ tablet_static_memory: 0
+acl: []
+id: 77d-1c53a-27070191-e4d8f5ac
+parent_id: 77d-1c0d3-2707012f-ddf40dd7
+foreign: false
+type: table
+sequoia: false
+ref_counter: 1
+builtin: false
+owner: max
+compression_ratio: 0.3679379456925491
+)";
+ TString expectedYson = R"(
+{
+ "mount_config" = {};
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "lat";
+ "required" = %false;
+ "type" = "double";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "double";
+ };
+ };
+ {
+ "name" = "lon";
+ "required" = %false;
+ "type" = "double";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "double";
+ };
+ };
+ ];
+ "native_cell_tag" = 9991u;
+ "creation_time" = "2024-08-15T11:17:59.314773Z";
+ "inherit_acl" = %true;
+ "revision" = 8233452423020u;
+ "resource_usage" = {
+ "node_count" = 1;
+ "chunk_count" = 1;
+ "disk_space_per_medium" = {
+ "default" = 562182;
+ };
+ "disk_space" = 562182;
+ "chunk_host_cell_master_memory" = 0;
+ "master_memory" = 0;
+ "tablet_count" = 0;
+ "tablet_static_memory" = 0;
+ };
+ "acl" = [];
+ "id" = "77d-1c53a-27070191-e4d8f5ac";
+ "parent_id" = "77d-1c0d3-2707012f-ddf40dd7";
+ "foreign" = %false;
+ "type" = "table";
+ "sequoia" = %false;
+ "ref_counter" = 1;
+ "builtin" = %false;
+ "owner" = "max";
+ "compression_ratio" = 0.3679379456925491;
+})";
+ EXPECT_EQ(ParseYaml(yaml, EYsonType::Node), expectedYson.substr(1));
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/yaml_writer_ut.cpp b/yt/yt/library/formats/unittests/yaml_writer_ut.cpp
new file mode 100644
index 0000000000..96fd4a4003
--- /dev/null
+++ b/yt/yt/library/formats/unittests/yaml_writer_ut.cpp
@@ -0,0 +1,319 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/library/formats/yaml_writer.h>
+
+#include <yt/yt/client/formats/config.h>
+
+#include <yt/yt/core/yson/string.h>
+
+#include <yt/yt/core/ytree/convert.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NYson;
+using namespace NYTree;
+
+//////////////////////////////////////////////////////////////////////////////
+
+TString YsonToYaml(const TYsonString& yson, const TYsonString& formatAttributes = TYsonString(TStringBuf("{}")))
+{
+ TStringStream outputStream;
+ auto config = ConvertTo<TYamlFormatConfigPtr>(formatAttributes);
+ auto writer = CreateYamlWriter(&outputStream, yson.GetType(), config);
+ Serialize(yson, writer.get());
+ writer->Flush();
+ return outputStream.Str();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamlWriterTest, Simple)
+{
+ TString yson = "hello";
+ // Here and in the rest of the tests we introduce an extra leading \n for the better readabilty, which we later
+ // strip off in the comparison.
+ TString expectedYaml = R"(
+hello
+)";
+
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, IntegersWithoutUintTag)
+{
+ TString yson = "{a=1; b=1u; c=-1; d=9223372036854775808u; e=-9223372036854775808; f=18446744073709551615u}";
+ TString expectedYaml = R"(
+a: 1
+b: 1
+c: -1
+d: 9223372036854775808
+e: -9223372036854775808
+f: 18446744073709551615
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, IntegersWithUintTag)
+{
+ TString formatAttributes = "{write_uint_tag=%true}";
+ TString yson = "{a=1; b=1u; c=-1; d=9223372036854775808u; e=-9223372036854775808; f=18446744073709551615u}";
+ TString expectedYaml = R"(
+a: 1
+b: !yt/uint64 1
+c: -1
+d: !yt/uint64 9223372036854775808
+e: -9223372036854775808
+f: !yt/uint64 18446744073709551615
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson), TYsonString(formatAttributes)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, Doubles)
+{
+ TString yson = "{a=2.7; b=-3.14; c=0.0; d=4.; e=1e30; f=%nan; g=%inf; h=%-inf}";
+ TString expectedYaml = R"(
+a: 2.7
+b: -3.14
+c: 0.
+d: 4.
+e: 1e+30
+f: .nan
+g: .inf
+h: -.inf
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, Entity)
+{
+ TString yson = "{a=#}";
+ TString expectedYaml = R"(
+a: null
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, Booleans)
+{
+ TString yson = "{a=%true; b=%false}";
+ TString expectedYaml = R"(
+a: true
+b: false
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, Strings)
+{
+ // a and b may be represented as plain scalars.
+ // c-e must be quoted on syntactical level, so libyaml chooses a single-quoted style.
+ // f-i must be quoted because they meet regexps for non-string types, so we force a double-quoted style.
+ TString yson = R"({a=hello; b="23asd"; c=" "; d="foo\nbar"; e=""; f="42"; g="TRUE"; h="1e4000"; i="~";})";
+ TString expectedYaml = R"(
+a: hello
+b: 23asd
+c: ' '
+d: 'foo
+
+ bar'
+e: ""
+f: "42"
+g: "TRUE"
+h: "1e4000"
+i: "~"
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, Mappings)
+{
+ TString yson("{a={x=1;y={foo=bar;bar=foo}};b={z=3};c={};}");
+ TString expectedYaml = R"(
+a:
+ x: 1
+ y:
+ foo: bar
+ bar: foo
+b:
+ z: 3
+c: {}
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, Sequences)
+{
+ TString yson = "[foo; [1; 2; 3]; bar; []; [[[#]]]]";
+ TString expectedYaml = R"(
+- foo
+- - 1
+ - 2
+ - 3
+- bar
+- []
+- - - - null
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, MultiDocument)
+{
+ TString yson = "foo;{a=1;b=2};[x;y];{};#;bar;[]";
+ TString expectedYaml = R"(
+foo
+---
+a: 1
+b: 2
+---
+- x
+- y
+--- {}
+--- null
+--- bar
+--- []
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson, EYsonType::ListFragment)), expectedYaml.substr(1));
+}
+
+TEST(TYamlWriterTest, Attributes)
+{
+ TString yson = "<x=1;y=2>{a=<>42; b=<x=#>[1;2;3]; c=<foo=1>#;}";
+ TString expectedYaml = R"(
+!yt/attrnode
+- x: 1
+ y: 2
+- a: !yt/attrnode
+ - {}
+ - 42
+ b: !yt/attrnode
+ - x: null
+ - - 1
+ - 2
+ - 3
+ c: !yt/attrnode
+ - foo: 1
+ - null
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson)), expectedYaml.substr(1));
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamlWriterTest, EmptyStream)
+{
+ TString yson = "";
+ TString expectedYaml = "";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson, EYsonType::ListFragment)), expectedYaml);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+//! There is a reverse test in yaml_reader_ut.cpp.
+TEST(TYamlWriterTest, RealExample)
+{
+ TString formatAttributes = "{write_uint_tag=%true}";
+ TString yson = R"(
+{
+ "mount_config" = {};
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "lat";
+ "required" = %false;
+ "type" = "double";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "double";
+ };
+ };
+ {
+ "name" = "lon";
+ "required" = %false;
+ "type" = "double";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "double";
+ };
+ };
+ ];
+ "native_cell_tag" = 9991u;
+ "creation_time" = "2024-08-15T11:17:59.314773Z";
+ "inherit_acl" = %true;
+ "revision" = 8233452423020u;
+ "resource_usage" = {
+ "node_count" = 1;
+ "chunk_count" = 1;
+ "disk_space_per_medium" = {
+ "default" = 562182;
+ };
+ "disk_space" = 562182;
+ "chunk_host_cell_master_memory" = 0;
+ "master_memory" = 0;
+ "tablet_count" = 0;
+ "tablet_static_memory" = 0;
+ };
+ "acl" = [];
+ "id" = "77d-1c53a-27070191-e4d8f5ac";
+ "parent_id" = "77d-1c0d3-2707012f-ddf40dd7";
+ "foreign" = %false;
+ "type" = "table";
+ "sequoia" = %false;
+ "ref_counter" = 1;
+ "builtin" = %false;
+ "owner" = "max";
+ "compression_ratio" = 0.3679379456925491;
+}
+ )";
+
+ TString expectedYaml = R"(
+mount_config: {}
+schema: !yt/attrnode
+- strict: true
+ unique_keys: false
+- - name: lat
+ required: false
+ type: double
+ type_v3:
+ type_name: optional
+ item: double
+ - name: lon
+ required: false
+ type: double
+ type_v3:
+ type_name: optional
+ item: double
+native_cell_tag: !yt/uint64 9991
+creation_time: 2024-08-15T11:17:59.314773Z
+inherit_acl: true
+revision: !yt/uint64 8233452423020
+resource_usage:
+ node_count: 1
+ chunk_count: 1
+ disk_space_per_medium:
+ default: 562182
+ disk_space: 562182
+ chunk_host_cell_master_memory: 0
+ master_memory: 0
+ tablet_count: 0
+ tablet_static_memory: 0
+acl: []
+id: 77d-1c53a-27070191-e4d8f5ac
+parent_id: 77d-1c0d3-2707012f-ddf40dd7
+foreign: false
+type: table
+sequoia: false
+ref_counter: 1
+builtin: false
+owner: max
+compression_ratio: 0.3679379456925491
+)";
+ EXPECT_EQ(YsonToYaml(TYsonString(yson), TYsonString(formatAttributes)), expectedYaml.substr(1));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/yamr_parser_ut.cpp b/yt/yt/library/formats/unittests/yamr_parser_ut.cpp
new file mode 100644
index 0000000000..84c9a28457
--- /dev/null
+++ b/yt/yt/library/formats/unittests/yamr_parser_ut.cpp
@@ -0,0 +1,601 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/test_framework/yson_consumer_mock.h>
+
+#include <yt/yt/library/formats/yamr_parser.h>
+
+#include <yt/yt/core/yson/null_consumer.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NYson;
+
+using ::testing::InSequence;
+using ::testing::StrictMock;
+using ::testing::NiceMock;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamrParserTest, Simple)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key1"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value1"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginAttributes());
+ EXPECT_CALL(Mock, OnKeyedItem("table_index"));
+ EXPECT_CALL(Mock, OnInt64Scalar(2));
+ EXPECT_CALL(Mock, OnEndAttributes());
+ EXPECT_CALL(Mock, OnEntity());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value2"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "key1\tvalue1\n"
+ "2\n"
+ "key2\tvalue2\n";
+
+ ParseYamr(input, &Mock);
+}
+
+TEST(TYamrParserTest, ValueWithTabs)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar(TStringBuf("key1\0", 5)));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value with \t and some other"));
+ EXPECT_CALL(Mock, OnEndMap());
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar(TStringBuf("another\0 value with \t", 21)));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input(
+ "key1\0\tvalue with \t and some other\n"
+ "key2\tanother\0 value with \t\n",
+ 34 +
+ 27);
+
+ ParseYamr(input, &Mock);
+}
+
+TEST(TYamrParserTest, SimpleWithSubkey)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key1"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("subkey1"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value1"));
+ EXPECT_CALL(Mock, OnEndMap());
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("subkey2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value2"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "key1\tsubkey1\tvalue1\n"
+ "key2\tsubkey2\tvalue2\n";
+
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = true;
+
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrParserTest, IncompleteRows)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key1"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("subkey1"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value1"));
+ EXPECT_CALL(Mock, OnEndMap());
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("subkey"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnEndMap());
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("subkey2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value2"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "key1\tsubkey1\tvalue1\n"
+ "key\tsubkey\n"
+ "key2\tsubkey2\tvalue2\n";
+
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = true;
+
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrParserTest, IncorrectIncompleteRows)
+{
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = false;
+
+ EXPECT_THROW(ParseYamr("\n", GetNullYsonConsumer(), config), std::exception);
+ EXPECT_THROW(ParseYamr("key\n", GetNullYsonConsumer(), config), std::exception);
+ EXPECT_THROW(ParseYamr("key\tvalue\nkey\n", GetNullYsonConsumer(), config), std::exception);
+}
+
+TEST(TYamrParserTest, TabsInValue)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("a\tb\\tc\t"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ auto config = New<TYamrFormatConfig>();
+ TString input = "key\ta\tb\\tc\t";
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrParserTest, Escaping)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("\tkey\t"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("\n"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("a\tb\t\n"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = true;
+ config->EnableEscaping = true;
+
+ TString input = "\\tkey\\t\t\\n\ta\tb\t\\n\n";
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrParserTest, CustomSeparators)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value"));
+ EXPECT_CALL(Mock, OnEndMap());
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value2"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ auto config = New<TYamrFormatConfig>();
+ config->RecordSeparator = 'Y';
+ config->FieldSeparator = 'X';
+
+ TString input = "keyXvalueYkey2Xvalue2Y";
+ ParseYamr(input, &Mock, config);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamrLenvalParserTest, Simple)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key1"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value1"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginAttributes());
+ EXPECT_CALL(Mock, OnKeyedItem("table_index"));
+ EXPECT_CALL(Mock, OnInt64Scalar(1));
+ EXPECT_CALL(Mock, OnEndAttributes());
+ EXPECT_CALL(Mock, OnEntity());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value2"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2",
+
+ 2 * (2 * 4 + 4 + 6) + 8); // all i32 + lengths of keys
+
+ auto config = New<TYamrFormatConfig>();
+ config->Lenval = true;
+
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrLenvalParserTest, SimpleWithSubkey)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key1"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("subkey1"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value1"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("subkey2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value2"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x07\x00\x00\x00" "subkey1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x07\x00\x00\x00" "subkey2"
+ "\x06\x00\x00\x00" "value2",
+
+ 2 * (3 * 4 + 4 + 7 + 6)); // all i32 + lengths of keys
+
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = true;
+ config->Lenval = true;
+
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrLenvalParserTest, EmptyFields)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = TString(
+ "\x00\x00\x00\x00"
+ "\x00\x00\x00\x00"
+ "\x00\x00\x00\x00",
+ 3 * 4);
+
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = true;
+ config->Lenval = true;
+
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrLenvalParserTest, HugeLength)
+{
+ TString input = TString(
+ "\xFF\xFF\xFF\xFF"
+ "\x00\x00\x00\x00"
+ "\x00\x00\x00\x00",
+ 3 * 4);
+
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = true;
+ config->Lenval = true;
+
+ EXPECT_THROW(ParseYamr(input, GetNullYsonConsumer(), config), std::exception);
+}
+
+TEST(TYamrLenvalParserTest, SimpleEndOfMessage)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key1"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value1"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginAttributes());
+ EXPECT_CALL(Mock, OnKeyedItem("table_index"));
+ EXPECT_CALL(Mock, OnInt64Scalar(1));
+ EXPECT_CALL(Mock, OnEndAttributes());
+ EXPECT_CALL(Mock, OnEntity());
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("key2"));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar("value2"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2"
+
+ "\xfb\xff\xff\xff" "\x02\x00\x00\x00\x00\x00\x00\x00",
+
+ 2 * (2 * 4 + 4 + 6) + 8 + 12); // all i32 + lengths of keys
+
+ auto config = New<TYamrFormatConfig>();
+ config->Lenval = true;
+ config->EnableEom = true;
+
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrLenvalParserTest, EmptyFieldsWithEOM)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnKeyedItem("value"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = TString(
+ "\x00\x00\x00\x00"
+ "\x00\x00\x00\x00"
+ "\x00\x00\x00\x00"
+ "\xfb\xff\xff\xff" "\x01\x00\x00\x00\x00\x00\x00\x00",
+ 3 * 4 + 12);
+
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = true;
+ config->Lenval = true;
+ config->EnableEom = true;
+
+ ParseYamr(input, &Mock, config);
+}
+
+TEST(TYamrParserTest, IncorrectPlaceOfEOM)
+{
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = false;
+ config->Lenval = true;
+ config->EnableEom = true;
+
+ TString input1 = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\xfb\xff\xff\xff" "\x02\x00\x00\x00\x00\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2",
+
+ 2 * (2 * 4 + 4 + 6) + 8 + 12); // all i32 + lengths of keys
+
+ TString input2 = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+
+ "\xfb\xff\xff\xff" "\x02\x00\x00\x00\x00\x00\x00\x00"
+
+ "\x06\x00\x00\x00" "value2",
+
+ 2 * (2 * 4 + 4 + 6) + 8 + 12); // all i32 + lengths of keys
+
+ EXPECT_THROW(ParseYamr(input1, GetNullYsonConsumer(), config), std::exception);
+ EXPECT_THROW(ParseYamr(input2, GetNullYsonConsumer(), config), std::exception);
+}
+
+TEST(TYamrParserTest, IncorrectEOM)
+{
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = false;
+ config->Lenval = true;
+ config->EnableEom = true;
+
+ // Garbage after EOM marker
+ TString input1 = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\xfb\xff\xff\xff" "\x01\x00\x00\x00\x00\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2",
+
+ 2 * (2 * 4 + 4 + 6) + 8 + 12); // all i32 + lengths of keys
+
+ // Row count mismatch
+ TString input2 = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2"
+
+ "\xfb\xff\xff\xff" "\x03\x00\x00\x00\x00\x00\x00\x00",
+
+ 2 * (2 * 4 + 4 + 6) + 8 + 12); // all i32 + lengths of keys
+
+ // Missing EOM marker
+ TString input3 = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2",
+
+ 2 * (2 * 4 + 4 + 6) + 8); // all i32 + lengths of keys
+
+ // Missing EOM marker with empty fields
+ TString input4 = TString(
+ "\x00\x00\x00\x00"
+ "\x00\x00\x00\x00"
+ "\x00\x00\x00\x00",
+ 3 * 4);
+
+ EXPECT_THROW(ParseYamr(input1, GetNullYsonConsumer(), config), std::exception);
+ EXPECT_THROW(ParseYamr(input2, GetNullYsonConsumer(), config), std::exception);
+ EXPECT_THROW(ParseYamr(input3, GetNullYsonConsumer(), config), std::exception);
+ EXPECT_THROW(ParseYamr(input4, GetNullYsonConsumer(), config), std::exception);
+}
+
+TEST(TYamrParserTest, UnsupportedEOMInTextMode)
+{
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = false;
+ config->Lenval = false;
+ config->EnableEom = true;
+
+ TString input = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2"
+
+ "\xfb\xff\xff\xff" "\x02\x00\x00\x00\x00\x00\x00\x00",
+
+ 2 * (2 * 4 + 4 + 6) + 8 + 12); // all i32 + lengths of keys
+
+ EXPECT_THROW(ParseYamr(input, GetNullYsonConsumer(), config), std::exception);
+}
+
+TEST(TYamrParserTest, UnexpectedEOM)
+{
+ auto config = New<TYamrFormatConfig>();
+ config->HasSubkey = false;
+ config->Lenval = true;
+ config->EnableEom = false;
+
+ TString input = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xff\xff\xff\xff" "\x01\x00\x00\x00"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2"
+
+ "\xfb\xff\xff\xff" "\x02\x00\x00\x00\x00\x00\x00\x00",
+
+ 2 * (2 * 4 + 4 + 6) + 8 + 12); // all i32 + lengths of keys
+
+ EXPECT_THROW(ParseYamr(input, GetNullYsonConsumer(), config), std::exception);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/yamr_writer_ut.cpp b/yt/yt/library/formats/unittests/yamr_writer_ut.cpp
new file mode 100644
index 0000000000..2cad4bcbc9
--- /dev/null
+++ b/yt/yt/library/formats/unittests/yamr_writer_ut.cpp
@@ -0,0 +1,645 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/client/table_client/unversioned_row.h>
+#include <yt/yt/client/table_client/name_table.h>
+
+#include <yt/yt/library/formats/yamr_writer.h>
+
+#include <yt/yt/core/concurrency/async_stream.h>
+
+namespace NYT::NFormats {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NYTree;
+using namespace NYson;
+using namespace NConcurrency;
+using namespace NTableClient;
+
+class TSchemalessWriterForYamrTest
+ : public ::testing::Test
+{
+protected:
+ TNameTablePtr NameTable_;
+ int KeyId_;
+ int SubkeyId_;
+ int ValueId_;
+ int TableIndexId_;
+ int RangeIndexId_;
+ int RowIndexId_;
+
+ TYamrFormatConfigPtr Config_;
+
+ IUnversionedRowsetWriterPtr Writer_;
+
+ TStringStream OutputStream_;
+
+ TSchemalessWriterForYamrTest()
+ {
+ NameTable_ = New<TNameTable>();
+ KeyId_ = NameTable_->RegisterName("key");
+ SubkeyId_ = NameTable_->RegisterName("subkey");
+ ValueId_ = NameTable_->RegisterName("value");
+ TableIndexId_ = NameTable_->RegisterName(TableIndexColumnName);
+ RowIndexId_ = NameTable_->RegisterName(RowIndexColumnName);
+ RangeIndexId_ = NameTable_->RegisterName(RangeIndexColumnName);
+
+ Config_ = New<TYamrFormatConfig>();
+ }
+
+ void CreateStandardWriter(TControlAttributesConfigPtr controlAttributes = New<TControlAttributesConfig>())
+ {
+ Writer_ = CreateSchemalessWriterForYamr(
+ Config_,
+ NameTable_,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&OutputStream_)),
+ false, /* enableContextSaving */
+ controlAttributes,
+ 0 /* keyColumnCount */);
+ }
+};
+
+TEST_F(TSchemalessWriterForYamrTest, Simple)
+{
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+
+ // Ignore system columns.
+ row1.AddValue(MakeUnversionedInt64Value(2, TableIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(42, RowIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(1, RangeIndexId_));
+
+ // Note that key and value follow not in order.
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output =
+ "key1\tvalue1\n"
+ "key2\tvalue2\n";
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, SimpleWithSubkey)
+{
+ Config_->HasSubkey = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+ row1.AddValue(MakeUnversionedStringValue("subkey1", SubkeyId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("subkey2", SubkeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output =
+ "key1\tsubkey1\tvalue1\n"
+ "key2\tsubkey2\tvalue2\n";
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, SubkeyCouldBeSkipped)
+{
+ Config_->HasSubkey = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("key", KeyId_));
+ row.AddValue(MakeUnversionedStringValue("value", ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = "key\t\tvalue\n";
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, SubkeyCouldBeNull)
+{
+ Config_->HasSubkey = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("key", KeyId_));
+ row.AddValue(MakeUnversionedSentinelValue(EValueType::Null, SubkeyId_));
+ row.AddValue(MakeUnversionedStringValue("value", ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = "key\t\tvalue\n";
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, NonNullTerminatedStrings)
+{
+ Config_->HasSubkey = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ const char* longString = "trashkeytrashsubkeytrashvalue";
+ row.AddValue(MakeUnversionedStringValue(TStringBuf(longString + 5, 3), KeyId_));
+ row.AddValue(MakeUnversionedStringValue(TStringBuf(longString + 13, 6), SubkeyId_));
+ row.AddValue(MakeUnversionedStringValue(TStringBuf(longString + 24, 5), ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = "key\tsubkey\tvalue\n";
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, SkippedKey)
+{
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("value", ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_FALSE(Writer_->Write(rows));
+
+ EXPECT_THROW(Writer_->Close()
+ .Get()
+ .ThrowOnError(), std::exception);
+}
+
+TEST_F(TSchemalessWriterForYamrTest, SkippedValue)
+{
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("key", KeyId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_FALSE(Writer_->Write(rows));
+
+ EXPECT_THROW(Writer_->Close()
+ .Get()
+ .ThrowOnError(), std::exception);
+}
+
+TEST_F(TSchemalessWriterForYamrTest, NotStringType) {
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("key", KeyId_));
+ row.AddValue(MakeUnversionedInt64Value(42, ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_FALSE(Writer_->Write(rows));
+
+ EXPECT_THROW(Writer_->Close()
+ .Get()
+ .ThrowOnError(), std::exception);
+}
+
+TEST_F(TSchemalessWriterForYamrTest, ExtraItem)
+{
+ int trashId = NameTable_->RegisterName("trash");
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("key", KeyId_));
+ row.AddValue(MakeUnversionedStringValue("value", ValueId_));
+ // This value will be ignored.
+ row.AddValue(MakeUnversionedStringValue("trash", trashId));
+ // This value will also be ignored because Config_->HasSubkey is off,
+ // despite the fact it has non-string type.
+ row.AddValue(MakeUnversionedInt64Value(42, SubkeyId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = "key\tvalue\n";
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, Escaping)
+{
+ Config_->HasSubkey = true;
+ Config_->EnableEscaping = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("\n", KeyId_));
+ row.AddValue(MakeUnversionedStringValue("\t", SubkeyId_));
+ row.AddValue(MakeUnversionedStringValue("\n", ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = "\\n\t\\t\t\\n\n";
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, SimpleWithTableIndex)
+{
+ Config_->EnableTableIndex = true;
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ controlAttributes->EnableTableIndex = true;
+ CreateStandardWriter(controlAttributes);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+ row1.AddValue(MakeUnversionedInt64Value(42, TableIndexId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+ row2.AddValue(MakeUnversionedInt64Value(42, TableIndexId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("key3", KeyId_));
+ row3.AddValue(MakeUnversionedStringValue("value3", ValueId_));
+ row3.AddValue(MakeUnversionedInt64Value(23, TableIndexId_));
+
+ rows = { row3.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output =
+ "42\n"
+ "key1\tvalue1\n"
+ "key2\tvalue2\n"
+ "23\n"
+ "key3\tvalue3\n";
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, SimpleWithRowIndexAndTableIndex)
+{
+ Config_->EnableTableIndex = true;
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ controlAttributes->EnableTableIndex = true;
+ controlAttributes->EnableRowIndex = true;
+ CreateStandardWriter(controlAttributes);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+ row1.AddValue(MakeUnversionedInt64Value(42, TableIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(0, RowIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(0, RangeIndexId_));
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("key3", KeyId_));
+ row3.AddValue(MakeUnversionedStringValue("value3", ValueId_));
+ row3.AddValue(MakeUnversionedInt64Value(5, RowIndexId_));
+ row3.AddValue(MakeUnversionedInt64Value(1, RangeIndexId_));
+ rows = { row3.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ TUnversionedRowBuilder row4;
+ row4.AddValue(MakeUnversionedStringValue("key4", KeyId_));
+ row4.AddValue(MakeUnversionedStringValue("value4", ValueId_));
+ row4.AddValue(MakeUnversionedInt64Value(23, TableIndexId_));
+ row4.AddValue(MakeUnversionedInt64Value(10, RowIndexId_));
+ row4.AddValue(MakeUnversionedInt64Value(2, RangeIndexId_));
+ rows = { row4.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output =
+ "42\n0\n"
+ "key1\tvalue1\n"
+ "key2\tvalue2\n"
+ "42\n5\n"
+ "key3\tvalue3\n"
+ "23\n10\n"
+ "key4\tvalue4\n";
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, Lenval)
+{
+ Config_->HasSubkey = true;
+ Config_->Lenval = true;
+ CreateStandardWriter();
+
+ // Note that order in both rows is unusual.
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("subkey1", SubkeyId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+ row2.AddValue(MakeUnversionedStringValue("subkey2", SubkeyId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x07\x00\x00\x00" "subkey1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x07\x00\x00\x00" "subkey2"
+ "\x06\x00\x00\x00" "value2",
+
+ 2 * (3 * 4 + 4 + 6 + 7)); // all i32 + lengths of keys
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, LenvalWithEmptyFields)
+{
+ Config_->HasSubkey = true;
+ Config_->Lenval = true;
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("subkey1", SubkeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row2.AddValue(MakeUnversionedStringValue("", SubkeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("key3", KeyId_));
+ row3.AddValue(MakeUnversionedStringValue("subkey3", SubkeyId_));
+ row3.AddValue(MakeUnversionedStringValue("", ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow(), row3.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = TString(
+ "\x00\x00\x00\x00" ""
+ "\x07\x00\x00\x00" "subkey1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x00\x00\x00\x00" ""
+ "\x06\x00\x00\x00" "value2"
+
+ "\x04\x00\x00\x00" "key3"
+ "\x07\x00\x00\x00" "subkey3"
+ "\x00\x00\x00\x00" "",
+
+ 9 * 4 + (7 + 6) + (4 + 6) + (4 + 7)); // all i32 + lengths of keys
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, LenvalWithKeySwitch)
+{
+ Config_->HasSubkey = true;
+ Config_->Lenval = true;
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ controlAttributes->EnableKeySwitch = true;
+
+ Writer_ = CreateSchemalessWriterForYamr(
+ Config_,
+ NameTable_,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&OutputStream_)),
+ false, /* enableContextSaving */
+ controlAttributes,
+ 1 /* keyColumnCount */);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("subkey1", SubkeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row2.AddValue(MakeUnversionedStringValue("subkey21", SubkeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value21", ValueId_));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row3.AddValue(MakeUnversionedStringValue("subkey22", SubkeyId_));
+ row3.AddValue(MakeUnversionedStringValue("value22", ValueId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow(), row3.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ TUnversionedRowBuilder row4;
+ row4.AddValue(MakeUnversionedStringValue("key3", KeyId_));
+ row4.AddValue(MakeUnversionedStringValue("subkey3", SubkeyId_));
+ row4.AddValue(MakeUnversionedStringValue("value3", ValueId_));
+
+ rows = { row4.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output = TString(
+ "\x04\x00\x00\x00" "key1"
+ "\x07\x00\x00\x00" "subkey1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\xfe\xff\xff\xff" // key switch
+
+ "\x04\x00\x00\x00" "key2"
+ "\x08\x00\x00\x00" "subkey21"
+ "\x07\x00\x00\x00" "value21"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x08\x00\x00\x00" "subkey22"
+ "\x07\x00\x00\x00" "value22"
+
+ "\xfe\xff\xff\xff"
+
+ "\x04\x00\x00\x00" "key3"
+ "\x07\x00\x00\x00" "subkey3"
+ "\x06\x00\x00\x00" "value3",
+
+ 14 * 4 + (4 + 7 + 6) + (4 + 8 + 7) + (4 + 8 + 7) + (4 + 7 + 6)); // all i32 + lengths of keys
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, LenvalWithTableIndex)
+{
+ Config_->EnableTableIndex = true;
+ Config_->Lenval = true;
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ controlAttributes->EnableTableIndex = true;
+ CreateStandardWriter(controlAttributes);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+ row1.AddValue(MakeUnversionedInt64Value(42, TableIndexId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+ row2.AddValue(MakeUnversionedInt64Value(42, TableIndexId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("key3", KeyId_));
+ row3.AddValue(MakeUnversionedStringValue("value3", ValueId_));
+ row3.AddValue(MakeUnversionedInt64Value(23, TableIndexId_));
+
+ rows = { row3.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output(
+ "\xff\xff\xff\xff" "\x2a\x00\x00\x00" // 42
+
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2"
+
+ "\xff\xff\xff\xff" "\x17\x00\x00\x00" // 23
+
+ "\x04\x00\x00\x00" "key3"
+ "\x06\x00\x00\x00" "value3",
+
+ 10 * 4 + 3 * (4 + 6));
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+TEST_F(TSchemalessWriterForYamrTest, LenvalWithRangeAndRowIndex)
+{
+ Config_->Lenval = true;
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ controlAttributes->EnableRowIndex = true;
+ controlAttributes->EnableRangeIndex = true;
+ CreateStandardWriter(controlAttributes);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("key1", KeyId_));
+ row1.AddValue(MakeUnversionedStringValue("value1", ValueId_));
+ row1.AddValue(MakeUnversionedInt64Value(42, RangeIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(23, RowIndexId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("key2", KeyId_));
+ row2.AddValue(MakeUnversionedStringValue("value2", ValueId_));
+ row2.AddValue(MakeUnversionedInt64Value(42, RangeIndexId_));
+ row2.AddValue(MakeUnversionedInt64Value(24, RowIndexId_));
+
+ std::vector<TUnversionedRow> rows = { row1.GetRow(), row2.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ TUnversionedRowBuilder row3;
+ row3.AddValue(MakeUnversionedStringValue("key3", KeyId_));
+ row3.AddValue(MakeUnversionedStringValue("value3", ValueId_));
+ row3.AddValue(MakeUnversionedInt64Value(42, RangeIndexId_));
+ row3.AddValue(MakeUnversionedInt64Value(25, RowIndexId_));
+
+ rows = { row3.GetRow() };
+ EXPECT_EQ(true, Writer_->Write(rows));
+
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString output(
+ "\xfd\xff\xff\xff" "\x2a\x00\x00\x00" // 42
+ "\xfc\xff\xff\xff" "\x17\x00\x00\x00\x00\x00\x00\x00" // 23
+
+ "\x04\x00\x00\x00" "key1"
+ "\x06\x00\x00\x00" "value1"
+
+ "\x04\x00\x00\x00" "key2"
+ "\x06\x00\x00\x00" "value2"
+
+ "\x04\x00\x00\x00" "key3"
+ "\x06\x00\x00\x00" "value3",
+
+ 11 * 4 + 3 * (4 + 6));
+
+ EXPECT_EQ(output, OutputStream_.Str());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/yamred_dsv_parser_ut.cpp b/yt/yt/library/formats/unittests/yamred_dsv_parser_ut.cpp
new file mode 100644
index 0000000000..41183ca5f0
--- /dev/null
+++ b/yt/yt/library/formats/unittests/yamred_dsv_parser_ut.cpp
@@ -0,0 +1,185 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/test_framework/yson_consumer_mock.h>
+
+#include <yt/yt/library/formats/yamred_dsv_parser.h>
+
+namespace NYT::NFormats {
+namespace {
+
+using namespace NYson;
+
+using ::testing::InSequence;
+using ::testing::StrictMock;
+using ::testing::NiceMock;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamredDsvParserTest, Simple)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key_a"));
+ EXPECT_CALL(Mock, OnStringScalar("1"));
+ EXPECT_CALL(Mock, OnKeyedItem("key_b"));
+ EXPECT_CALL(Mock, OnStringScalar("2"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey_x"));
+ EXPECT_CALL(Mock, OnStringScalar("3"));
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("5"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar("6"));
+ EXPECT_CALL(Mock, OnEndMap());
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key_a"));
+ EXPECT_CALL(Mock, OnStringScalar("7"));
+ EXPECT_CALL(Mock, OnKeyedItem("key_b"));
+ EXPECT_CALL(Mock, OnStringScalar("8"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey_x"));
+ EXPECT_CALL(Mock, OnStringScalar("9"));
+ EXPECT_CALL(Mock, OnKeyedItem("b"));
+ EXPECT_CALL(Mock, OnStringScalar("max\tignat"));
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("100"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input =
+ "1 2\t3\ta=5\tb=6\n"
+ "7 8\t9\tb=max\\tignat\ta=100\n";
+
+ auto config = New<TYamredDsvFormatConfig>();
+ config->HasSubkey = true;
+ config->KeyColumnNames.push_back("key_a");
+ config->KeyColumnNames.push_back("key_b");
+ config->SubkeyColumnNames.push_back("subkey_x");
+
+ ParseYamredDsv(input, &Mock, config);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamredDsvParserTest, EmptyField)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar(""));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("0 1"));
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("b"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "\t0 1\ta=b\n";
+
+ auto config = New<TYamredDsvFormatConfig>();
+ config->HasSubkey = true;
+ config->KeyColumnNames.push_back("key");
+ config->SubkeyColumnNames.push_back("subkey");
+
+ ParseYamredDsv(input, &Mock, config);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamredDsvParserTest, Escaping)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("\t"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("0\n1"));
+ EXPECT_CALL(Mock, OnKeyedItem("a"));
+ EXPECT_CALL(Mock, OnStringScalar("\tb\nc"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = "\\t\t0\\n1\ta=\\tb\\nc\n";
+
+ auto config = New<TYamredDsvFormatConfig>();
+ config->HasSubkey = true;
+ config->EnableEscaping = true;
+ config->KeyColumnNames.push_back("key");
+ config->SubkeyColumnNames.push_back("subkey");
+
+ ParseYamredDsv(input, &Mock, config);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TYamredDsvParserTest, Lenval)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("a"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("bc"));
+ EXPECT_CALL(Mock, OnKeyedItem("d"));
+ EXPECT_CALL(Mock, OnStringScalar("e"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = TString(
+ "\x01\x00\x00\x00" "a"
+ "\x02\x00\x00\x00" "bc"
+ "\x03\x00\x00\x00" "d=e",
+ 3 * 4 + 1 + 2 + 3);
+
+ auto config = New<TYamredDsvFormatConfig>();
+ config->Lenval = true;
+ config->HasSubkey = true;
+ config->KeyColumnNames.push_back("key");
+ config->SubkeyColumnNames.push_back("subkey");
+
+ ParseYamredDsv(input, &Mock, config);
+}
+
+TEST(TYamredDsvParserTest, EOM)
+{
+ StrictMock<TMockYsonConsumer> Mock;
+ InSequence dummy;
+
+ EXPECT_CALL(Mock, OnListItem());
+ EXPECT_CALL(Mock, OnBeginMap());
+ EXPECT_CALL(Mock, OnKeyedItem("key"));
+ EXPECT_CALL(Mock, OnStringScalar("a"));
+ EXPECT_CALL(Mock, OnKeyedItem("subkey"));
+ EXPECT_CALL(Mock, OnStringScalar("bc"));
+ EXPECT_CALL(Mock, OnKeyedItem("d"));
+ EXPECT_CALL(Mock, OnStringScalar("e"));
+ EXPECT_CALL(Mock, OnEndMap());
+
+ TString input = TString(
+ "\x01\x00\x00\x00" "a"
+ "\x02\x00\x00\x00" "bc"
+ "\x03\x00\x00\x00" "d=e"
+ "\xfb\xff\xff\xff" "\x01\x00\x00\x00\x00\x00\x00\x00",
+ 3 * 4 + 1 + 2 + 3 + 12);
+
+ auto config = New<TYamredDsvFormatConfig>();
+ config->Lenval = true;
+ config->EnableEom = true;
+ config->HasSubkey = true;
+ config->KeyColumnNames.push_back("key");
+ config->SubkeyColumnNames.push_back("subkey");
+
+ ParseYamredDsv(input, &Mock, config);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/yamred_dsv_writer_ut.cpp b/yt/yt/library/formats/unittests/yamred_dsv_writer_ut.cpp
new file mode 100644
index 0000000000..fc5f28639e
--- /dev/null
+++ b/yt/yt/library/formats/unittests/yamred_dsv_writer_ut.cpp
@@ -0,0 +1,424 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/client/table_client/unversioned_row.h>
+#include <yt/yt/client/table_client/name_table.h>
+
+#include <yt/yt/library/formats/yamred_dsv_writer.h>
+
+#include <yt/yt/core/concurrency/async_stream.h>
+
+#include <util/string/vector.h>
+
+#include <cstdio>
+
+
+namespace NYT::NFormats {
+namespace {
+
+using VectorStrok = TVector<TString>;
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NYTree;
+using namespace NYson;
+using namespace NConcurrency;
+using namespace NTableClient;
+
+class TSchemalessWriterForYamredDsvTest
+ : public ::testing::Test
+{
+protected:
+ TNameTablePtr NameTable_;
+ TYamredDsvFormatConfigPtr Config_;
+ IUnversionedRowsetWriterPtr Writer_;
+
+ TStringStream OutputStream_;
+
+ int KeyAId_;
+ int KeyBId_;
+ int KeyCId_;
+ int ValueXId_;
+ int ValueYId_;
+ int TableIndexId_;
+ int RangeIndexId_;
+ int RowIndexId_;
+
+ TSchemalessWriterForYamredDsvTest()
+ {
+ NameTable_ = New<TNameTable>();
+ KeyAId_ = NameTable_->RegisterName("key_a");
+ KeyBId_ = NameTable_->RegisterName("key_b");
+ KeyCId_ = NameTable_->RegisterName("key_c");
+ ValueXId_ = NameTable_->RegisterName("value_x");
+ ValueYId_ = NameTable_->RegisterName("value_y");
+ TableIndexId_ = NameTable_->RegisterName(TableIndexColumnName);
+ RowIndexId_ = NameTable_->RegisterName(RowIndexColumnName);
+ RangeIndexId_ = NameTable_->RegisterName(RangeIndexColumnName);
+ Config_ = New<TYamredDsvFormatConfig>();
+ }
+
+ void CreateStandardWriter(TControlAttributesConfigPtr controlAttributes = New<TControlAttributesConfig>())
+ {
+ Writer_ = CreateSchemalessWriterForYamredDsv(
+ Config_,
+ NameTable_,
+ CreateAsyncAdapter(static_cast<IOutputStream*>(&OutputStream_)),
+ false, /* enableContextSaving */
+ controlAttributes,
+ 0 /* keyColumnCount */);
+ }
+
+ // Splits output into key and sorted vector of values that are entries of the last YAMR column.
+ // Returns true if success (there are >= 2 values after splitting by field separator), otherwise false.
+ bool ExtractKeyValue(TString output, TString& key, VectorStrok& value, char fieldSeparator = '\t')
+ {
+ char delimiter[2] = {fieldSeparator, 0};
+ // Splitting by field separator.
+ value = SplitString(output, delimiter, 0 /* maxFields */, KEEP_EMPTY_TOKENS);
+ // We should at least have key and the rest of values.
+ if (value.size() < 2)
+ return false;
+ key = value[0];
+ value.erase(value.begin());
+ std::sort(value.begin(), value.end());
+ return true;
+ }
+
+ // The same function as previous, version with subkey.
+ bool ExtractKeySubkeyValue(TString output, TString& key, TString& subkey, VectorStrok& value, char fieldSeparator = '\t')
+ {
+ char delimiter[2] = {fieldSeparator, 0};
+ // Splitting by field separator.
+ value = SplitString(output, delimiter, 0 /* maxFields */, KEEP_EMPTY_TOKENS);
+ // We should at least have key, subkey and the rest of values.
+ if (value.size() < 3)
+ return false;
+ key = value[0];
+ subkey = value[1];
+ value.erase(value.begin(), value.end());
+ std::sort(value.begin(), value.end());
+ return true;
+ }
+
+ // Compares output and expected output ignoring the order of entries in YAMR value column.
+ void CompareKeyValue(TString output, TString expected, char recordSeparator = '\n', char fieldSeparator = '\t')
+ {
+ char delimiter[2] = {recordSeparator, 0};
+ VectorStrok outputRows = SplitString(output, delimiter, 0 /* maxFields */ , KEEP_EMPTY_TOKENS);
+ VectorStrok expectedRows = SplitString(expected, delimiter, 0 /* maxFields */, KEEP_EMPTY_TOKENS);
+ EXPECT_EQ(outputRows.size(), expectedRows.size());
+ // Since there is \n after each row, there will be an extra empty string in both vectors.
+ EXPECT_EQ(outputRows.back(), "");
+ ASSERT_EQ(expectedRows.back(), "");
+ outputRows.pop_back();
+ expectedRows.pop_back();
+
+ TString outputKey;
+ TString expectedKey;
+ VectorStrok outputValue;
+ VectorStrok expectedValue;
+ for (int rowIndex = 0; rowIndex < static_cast<int>(outputRows.size()); rowIndex++) {
+ EXPECT_TRUE(ExtractKeyValue(outputRows[rowIndex], outputKey, outputValue, fieldSeparator));
+ ASSERT_TRUE(ExtractKeyValue(expectedRows[rowIndex], expectedKey, expectedValue, fieldSeparator));
+ EXPECT_EQ(outputKey, expectedKey);
+ EXPECT_EQ(outputValue, expectedValue);
+ }
+ }
+
+ // The same function as previous, version with subkey.
+ void CompareKeySubkeyValue(TString output, TString expected, char recordSeparator = '\n', char fieldSeparator = '\t')
+ {
+ char delimiter[2] = {recordSeparator, 0};
+ VectorStrok outputRows = SplitString(output, delimiter, 0 /* maxFields */ , KEEP_EMPTY_TOKENS);
+ VectorStrok expectedRows = SplitString(expected, delimiter, 0 /* maxFields */, KEEP_EMPTY_TOKENS);
+ EXPECT_EQ(outputRows.size(), expectedRows.size());
+ // Since there is \n after each row, there will be an extra empty string in both vectors.
+ EXPECT_EQ(outputRows.back(), "");
+ ASSERT_EQ(expectedRows.back(), "");
+ outputRows.pop_back();
+ expectedRows.pop_back();
+
+ TString outputKey;
+ TString expectedKey;
+ TString outputSubkey;
+ TString expectedSubkey;
+ VectorStrok outputValue;
+ VectorStrok expectedValue;
+ for (int rowIndex = 0; rowIndex < static_cast<int>(outputRows.size()); rowIndex++) {
+ EXPECT_TRUE(ExtractKeySubkeyValue(outputRows[rowIndex], outputKey, outputSubkey, outputValue, fieldSeparator));
+ ASSERT_TRUE(ExtractKeySubkeyValue(expectedRows[rowIndex], expectedKey, expectedSubkey, expectedValue, fieldSeparator));
+ EXPECT_EQ(outputKey, expectedKey);
+ EXPECT_EQ(outputSubkey, expectedSubkey);
+ EXPECT_EQ(outputValue, expectedValue);
+ }
+ }
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, Simple)
+{
+ Config_->KeyColumnNames.emplace_back("key_a");
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("a1", KeyAId_));
+ row1.AddValue(MakeUnversionedStringValue("x", ValueXId_));
+ row1.AddValue(MakeUnversionedSentinelValue(EValueType::Null, ValueYId_));
+
+ // Ignore system columns.
+ row1.AddValue(MakeUnversionedInt64Value(2, TableIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(42, RowIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(1, RangeIndexId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("a2", KeyAId_));
+ row2.AddValue(MakeUnversionedStringValue("y", ValueYId_));
+ row2.AddValue(MakeUnversionedStringValue("b", KeyBId_));
+
+ std::vector<TUnversionedRow> rows = {row1.GetRow(), row2.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "a1\tvalue_x=x\n"
+ "a2\tvalue_y=y\tkey_b=b\n";
+
+ TString output = OutputStream_.Str();
+
+ CompareKeyValue(expectedOutput, output);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, SimpleWithSubkey)
+{
+ Config_->HasSubkey = true;
+ Config_->KeyColumnNames.emplace_back("key_a");
+ Config_->KeyColumnNames.emplace_back("key_b");
+ Config_->SubkeyColumnNames.emplace_back("key_c");
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("a", KeyAId_));
+ row1.AddValue(MakeUnversionedStringValue("b1", KeyBId_));
+ row1.AddValue(MakeUnversionedStringValue("c", KeyCId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("a", KeyAId_));
+ row2.AddValue(MakeUnversionedStringValue("b2", KeyBId_));
+ row2.AddValue(MakeUnversionedStringValue("c", KeyCId_));
+
+ std::vector<TUnversionedRow> rows = {row1.GetRow(), row2.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput =
+ "a b1\tc\t\n"
+ "a b2\tc\t\n";
+
+ TString output = OutputStream_.Str();
+
+ CompareKeySubkeyValue(expectedOutput, output);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, Lenval)
+{
+ Config_->Lenval = true;
+ Config_->HasSubkey = true;
+ Config_->EnableTableIndex = true;
+ Config_->KeyColumnNames.emplace_back("key_a");
+ Config_->KeyColumnNames.emplace_back("key_b");
+ Config_->SubkeyColumnNames.emplace_back("key_c");
+
+ auto controlAttributes = New<TControlAttributesConfig>();
+ controlAttributes->EnableTableIndex = true;
+ controlAttributes->EnableRowIndex = true;
+ controlAttributes->EnableRangeIndex = true;
+ CreateStandardWriter(controlAttributes);
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("a", KeyAId_));
+ row1.AddValue(MakeUnversionedStringValue("b1", KeyBId_));
+ row1.AddValue(MakeUnversionedStringValue("c", KeyCId_));
+ row1.AddValue(MakeUnversionedStringValue("x", ValueXId_));
+
+ row1.AddValue(MakeUnversionedInt64Value(42, TableIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(23, RangeIndexId_));
+ row1.AddValue(MakeUnversionedInt64Value(17, RowIndexId_));
+
+ TUnversionedRowBuilder row2;
+ row2.AddValue(MakeUnversionedStringValue("a", KeyAId_));
+ row2.AddValue(MakeUnversionedStringValue("b2", KeyBId_));
+ row2.AddValue(MakeUnversionedStringValue("c", KeyCId_));
+
+ row2.AddValue(MakeUnversionedInt64Value(42, TableIndexId_));
+ row2.AddValue(MakeUnversionedInt64Value(23, RangeIndexId_));
+ row2.AddValue(MakeUnversionedInt64Value(18, RowIndexId_));
+
+ std::vector<TUnversionedRow> rows = {row1.GetRow(), row2.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput = TString(
+ "\xff\xff\xff\xff" "\x2a\x00\x00\x00" // Table index.
+ "\xfd\xff\xff\xff" "\x17\x00\x00\x00" // Range index.
+ "\xfc\xff\xff\xff" "\x11\x00\x00\x00\x00\x00\x00\x00" // Row index.
+
+ "\x04\x00\x00\x00" "a b1"
+ "\x01\x00\x00\x00" "c"
+ "\x09\x00\x00\x00" "value_x=x"
+
+ "\x04\x00\x00\x00" "a b2"
+ "\x01\x00\x00\x00" "c"
+ "\x00\x00\x00\x00" "",
+
+ 13 * 4 + 4 + 1 + 9 + 4 + 1 + 0);
+
+ TString output = OutputStream_.Str();
+ EXPECT_EQ(expectedOutput, output)
+ << "expected length: " << expectedOutput.length()
+ << ", "
+ << "actual length: " << output.length();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, Escaping)
+{
+ Config_->KeyColumnNames.emplace_back("key_a");
+ Config_->KeyColumnNames.emplace_back("key_b");
+ int columnWithEscapedNameId = NameTable_->GetIdOrRegisterName("value\t_t");
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("a\n", KeyAId_));
+ row1.AddValue(MakeUnversionedStringValue("\nb\t", KeyBId_));
+ row1.AddValue(MakeUnversionedStringValue("\nva\\lue\t", columnWithEscapedNameId));
+
+ std::vector<TUnversionedRow> rows = {row1.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput = "a\\n \\nb\\t\tvalue\\t_t=\\nva\\\\lue\\t\n";
+ TString output = OutputStream_.Str();
+
+ EXPECT_EQ(expectedOutput, output);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, SkippedKey)
+{
+ Config_->KeyColumnNames.emplace_back("key_a");
+ Config_->KeyColumnNames.emplace_back("key_b");
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("b", KeyBId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_FALSE(Writer_->Write(rows));
+
+ EXPECT_THROW(Writer_->Close()
+ .Get()
+ .ThrowOnError(), std::exception);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, SkippedSubkey)
+{
+ Config_->HasSubkey = true;
+ Config_->KeyColumnNames.emplace_back("key_a");
+ Config_->SubkeyColumnNames.emplace_back("key_c");
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedStringValue("a", KeyAId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_FALSE(Writer_->Write(rows));
+
+ EXPECT_THROW(Writer_->Close()
+ .Get()
+ .ThrowOnError(), std::exception);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, NonStringValues)
+{
+ Config_->HasSubkey = true;
+ Config_->KeyColumnNames.emplace_back("key_a");
+ Config_->SubkeyColumnNames.emplace_back("key_c");
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row;
+ row.AddValue(MakeUnversionedInt64Value(-42, KeyAId_));
+ row.AddValue(MakeUnversionedUint64Value(18, KeyCId_));
+ row.AddValue(MakeUnversionedBooleanValue(true, KeyBId_));
+ row.AddValue(MakeUnversionedDoubleValue(3.14, ValueXId_));
+ row.AddValue(MakeUnversionedStringValue("yt", ValueYId_));
+
+ std::vector<TUnversionedRow> rows = { row.GetRow() };
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput = "-42\t18\tkey_b=true\tvalue_x=3.14\tvalue_y=yt\n";
+ TString output = OutputStream_.Str();
+
+ EXPECT_EQ(expectedOutput, output);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST_F(TSchemalessWriterForYamredDsvTest, ErasingSubkeyColumnsWhenHasSubkeyIsFalse)
+{
+ Config_->KeyColumnNames.emplace_back("key_a");
+ Config_->SubkeyColumnNames.emplace_back("key_b");
+ // Config->HasSubkey = false by default.
+ CreateStandardWriter();
+
+ TUnversionedRowBuilder row1;
+ row1.AddValue(MakeUnversionedStringValue("a", KeyAId_));
+ row1.AddValue(MakeUnversionedStringValue("b", KeyBId_));
+ row1.AddValue(MakeUnversionedStringValue("c", KeyCId_));
+ row1.AddValue(MakeUnversionedStringValue("x", ValueXId_));
+
+ std::vector<TUnversionedRow> rows = {row1.GetRow()};
+
+ EXPECT_EQ(true, Writer_->Write(rows));
+ Writer_->Close()
+ .Get()
+ .ThrowOnError();
+
+ TString expectedOutput = "a\tkey_c=c\tvalue_x=x\n";
+ TString output = OutputStream_.Str();
+
+ EXPECT_EQ(expectedOutput, output);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NFormats
diff --git a/yt/yt/library/formats/unittests/yson_helpers.cpp b/yt/yt/library/formats/unittests/yson_helpers.cpp
new file mode 100644
index 0000000000..669585caf7
--- /dev/null
+++ b/yt/yt/library/formats/unittests/yson_helpers.cpp
@@ -0,0 +1,29 @@
+#include "yson_helpers.h"
+
+#include <yt/yt/core/ytree/convert.h>
+#include <yt/yt/core/ytree/node.h>
+#include <yt/yt/core/yson/string.h>
+
+namespace NYT {
+
+using namespace NYson;
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TString CanonizeYson(TStringBuf input)
+{
+ auto node = ConvertToNode(TYsonString(input));
+ auto binaryYson = ConvertToYsonString(node);
+
+ TStringStream out;
+ {
+ TYsonWriter writer(&out, NYson::EYsonFormat::Pretty);
+ ParseYsonStringBuffer(binaryYson.AsStringBuf(), EYsonType::Node, &writer);
+ }
+ return out.Str();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/library/cpp/yt/stockpile/stockpile_other.cpp b/yt/yt/library/formats/unittests/yson_helpers.h
index 481b111b56..d123d40447 100644
--- a/library/cpp/yt/stockpile/stockpile_other.cpp
+++ b/yt/yt/library/formats/unittests/yson_helpers.h
@@ -1,11 +1,12 @@
-#include "stockpile.h"
+#pragma once
+
+#include <util/generic/string.h>
namespace NYT {
////////////////////////////////////////////////////////////////////////////////
-void TStockpileManager::Reconfigure(TStockpileOptions /*options*/)
-{ }
+TString CanonizeYson(TStringBuf yson);
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/library/monitoring/http_integration.cpp b/yt/yt/library/monitoring/http_integration.cpp
deleted file mode 100644
index 25fe9ad304..0000000000
--- a/yt/yt/library/monitoring/http_integration.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-#include "http_integration.h"
-
-#include "monitoring_manager.h"
-
-#include <yt/yt/build/build.h>
-
-#include <yt/yt/core/json/config.h>
-#include <yt/yt/core/json/json_writer.h>
-
-#include <yt/yt/core/ytree/fluent.h>
-
-#include <yt/yt/core/yson/parser.h>
-#include <yt/yt/core/yson/consumer.h>
-
-#include <yt/yt/core/concurrency/scheduler.h>
-
-#include <yt/yt/core/ytree/helpers.h>
-#include <yt/yt/core/ytree/virtual.h>
-#include <yt/yt/core/ytree/ypath_detail.h>
-#include <yt/yt/core/ytree/ypath_proxy.h>
-
-#include <yt/yt/core/http/http.h>
-#include <yt/yt/core/http/helpers.h>
-#include <yt/yt/core/http/server.h>
-
-#include <yt/yt/core/bus/tcp/dispatcher.h>
-
-#include <yt/yt/core/misc/ref_counted_tracker_statistics_producer.h>
-
-#include <yt/yt/library/profiling/solomon/exporter.h>
-
-#ifdef _linux_
-#include <yt/yt/library/ytprof/http/handler.h>
-#include <yt/yt/library/ytprof/build_info.h>
-
-#include <yt/yt/library/backtrace_introspector/http/handler.h>
-#endif
-
-#include <library/cpp/cgiparam/cgiparam.h>
-
-#include <util/string/vector.h>
-
-namespace NYT::NMonitoring {
-
-using namespace NYTree;
-using namespace NYson;
-using namespace NHttp;
-using namespace NConcurrency;
-using namespace NJson;
-
-////////////////////////////////////////////////////////////////////////////////
-
-DEFINE_ENUM(EVerb,
- (Get)
- (List)
-);
-
-////////////////////////////////////////////////////////////////////////////////
-
-void Initialize(
- const NHttp::IServerPtr& monitoringServer,
- const NProfiling::TSolomonExporterConfigPtr& config,
- TMonitoringManagerPtr* monitoringManager,
- NYTree::IMapNodePtr* orchidRoot)
-{
- *monitoringManager = New<TMonitoringManager>();
- (*monitoringManager)->Register("/ref_counted", CreateRefCountedTrackerStatisticsProducer());
- (*monitoringManager)->Register("/solomon", BIND([] (NYson::IYsonConsumer* consumer) {
- auto tags = NProfiling::TSolomonRegistry::Get()->GetDynamicTags();
-
- BuildYsonFluently(consumer)
- .BeginMap()
- .Item("dynamic_tags").Value(THashMap<TString, TString>(tags.begin(), tags.end()))
- .EndMap();
- }));
- (*monitoringManager)->Start();
-
- *orchidRoot = NYTree::GetEphemeralNodeFactory(true)->CreateMap();
- SetNodeByYPath(
- *orchidRoot,
- "/monitoring",
- CreateVirtualNode((*monitoringManager)->GetService()));
- SetNodeByYPath(
- *orchidRoot,
- "/tcp_dispatcher",
- CreateVirtualNode(NYT::NBus::TTcpDispatcher::Get()->GetOrchidService()));
-
-#ifdef _linux_
- auto buildInfo = NYTProf::TBuildInfo::GetDefault();
- buildInfo.BinaryVersion = GetVersion();
-
- SetNodeByYPath(
- *orchidRoot,
- "/build_info",
- NYTree::BuildYsonNodeFluently()
- .BeginMap()
- .Item("arc_revision").Value(buildInfo.ArcRevision)
- .Item("binary_version").Value(buildInfo.BinaryVersion)
- .Item("build_type").Value(buildInfo.BuildType)
- .EndMap());
-#endif
-
- if (monitoringServer) {
- auto exporter = New<NProfiling::TSolomonExporter>(config);
- exporter->Register("/solomon", monitoringServer);
- exporter->Start();
-
- SetNodeByYPath(
- *orchidRoot,
- "/sensors",
- CreateVirtualNode(exporter->GetSensorService()));
-
-#ifdef _linux_
- NYTProf::Register(monitoringServer, "/ytprof", buildInfo);
- NBacktraceIntrospector::Register(monitoringServer, "/backtrace");
-#endif
- monitoringServer->AddHandler(
- "/orchid/",
- GetOrchidYPathHttpHandler(*orchidRoot));
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-class TYPathHttpHandler
- : public IHttpHandler
-{
-public:
- explicit TYPathHttpHandler(IYPathServicePtr service)
- : Service_(std::move(service))
- { }
-
- void HandleRequest(
- const IRequestPtr& req,
- const IResponseWriterPtr& rsp) override
- {
- const TStringBuf orchidPrefix = "/orchid";
-
- TString path{req->GetUrl().Path};
- if (!path.StartsWith(orchidPrefix)) {
- THROW_ERROR_EXCEPTION("HTTP request must start with %Qv prefix",
- orchidPrefix)
- << TErrorAttribute("path", path);
- }
-
- path = path.substr(orchidPrefix.size(), TString::npos);
- TCgiParameters params(req->GetUrl().RawQuery);
-
- auto verb = EVerb::Get;
-
- auto options = CreateEphemeralAttributes();
- for (const auto& param : params) {
- if (param.first == "verb") {
- verb = ParseEnum<EVerb>(param.second);
- } else {
- // Just a check, IAttributeDictionary takes raw YSON anyway.
- try {
- ValidateYson(TYsonString(param.second), DefaultYsonParserNestingLevelLimit);
- } catch (const std::exception& ex) {
- THROW_ERROR_EXCEPTION("Error parsing value of query parameter %Qv",
- param.first)
- << ex;
- }
-
- options->SetYson(param.first, TYsonString(param.second));
- }
- }
-
- TYsonString result;
- switch (verb) {
- case EVerb::Get: {
- auto ypathReq = TYPathProxy::Get(path);
- ToProto(ypathReq->mutable_options(), *options);
- auto ypathRsp = WaitFor(ExecuteVerb(Service_, ypathReq))
- .ValueOrThrow();
- result = TYsonString(ypathRsp->value());
- break;
- }
- case EVerb::List: {
- auto ypathReq = TYPathProxy::List(path);
- auto ypathRsp = WaitFor(ExecuteVerb(Service_, ypathReq))
- .ValueOrThrow();
- result = TYsonString(ypathRsp->value());
- break;
- }
- default:
- YT_ABORT();
- }
-
- rsp->SetStatus(EStatusCode::OK);
- NHttp::ReplyJson(rsp, [&] (NYson::IYsonConsumer* writer) {
- Serialize(result, writer);
- });
- WaitFor(rsp->Close())
- .ThrowOnError();
- }
-
-private:
- const IYPathServicePtr Service_;
-};
-
-IHttpHandlerPtr GetOrchidYPathHttpHandler(const IYPathServicePtr& service)
-{
- return WrapYTException(New<TYPathHttpHandler>(service));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NMonitoring
diff --git a/yt/yt/library/monitoring/http_integration.h b/yt/yt/library/monitoring/http_integration.h
deleted file mode 100644
index 48c12ca8a8..0000000000
--- a/yt/yt/library/monitoring/http_integration.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-#include "public.h"
-
-#include <yt/yt/core/ytree/ypath_service.h>
-
-#include <yt/yt/core/http/public.h>
-
-#include <yt/yt/library/profiling/solomon/public.h>
-
-namespace NYT::NMonitoring {
-
-////////////////////////////////////////////////////////////////////////////////
-
-void Initialize(
- const NHttp::IServerPtr& monitoringServer,
- const NProfiling::TSolomonExporterConfigPtr& solomonExporterConfig,
- TMonitoringManagerPtr* monitoringManager,
- NYTree::IMapNodePtr* orchidRoot);
-
-NHttp::IHttpHandlerPtr CreateTracingHttpHandler();
-
-NHttp::IHttpHandlerPtr GetOrchidYPathHttpHandler(
- const NYTree::IYPathServicePtr& service);
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NMonitoring
diff --git a/yt/yt/library/monitoring/monitoring_manager.cpp b/yt/yt/library/monitoring/monitoring_manager.cpp
deleted file mode 100644
index 263443060b..0000000000
--- a/yt/yt/library/monitoring/monitoring_manager.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-#include "monitoring_manager.h"
-#include "private.h"
-
-#include <yt/yt/core/concurrency/action_queue.h>
-#include <yt/yt/core/concurrency/periodic_executor.h>
-
-#include <yt/yt/core/ytree/convert.h>
-#include <yt/yt/core/ytree/ephemeral_node_factory.h>
-#include <yt/yt/core/ytree/node.h>
-#include <yt/yt/core/ytree/tree_visitor.h>
-#include <yt/yt/core/ytree/ypath_detail.h>
-#include <yt/yt/core/ytree/ypath_client.h>
-
-#include <yt/yt/library/profiling/sensor.h>
-
-namespace NYT::NMonitoring {
-
-using namespace NYTree;
-using namespace NYPath;
-using namespace NYson;
-using namespace NConcurrency;
-
-////////////////////////////////////////////////////////////////////////////////
-
-static constexpr auto& Logger = MonitoringLogger;
-
-static const auto UpdatePeriod = TDuration::Seconds(3);
-static const auto EmptyRoot = GetEphemeralNodeFactory()->CreateMap();
-
-////////////////////////////////////////////////////////////////////////////////
-
-class TMonitoringManager::TImpl
- : public TRefCounted
-{
-public:
- void Register(const TYPath& path, TYsonProducer producer)
- {
- auto guard = Guard(SpinLock_);
- YT_VERIFY(PathToProducer_.emplace(path, producer).second);
- }
-
- void Unregister(const TYPath& path)
- {
- auto guard = Guard(SpinLock_);
- YT_VERIFY(PathToProducer_.erase(path) == 1);
- }
-
- IYPathServicePtr GetService()
- {
- return New<TYPathService>(this);
- }
-
- void Start()
- {
- auto guard = Guard(SpinLock_);
-
- YT_VERIFY(!Started_);
-
- PeriodicExecutor_ = New<TPeriodicExecutor>(
- ActionQueue_->GetInvoker(),
- BIND(&TImpl::Update, MakeWeak(this)),
- UpdatePeriod);
- PeriodicExecutor_->Start();
-
- Started_ = true;
- }
-
- void Stop()
- {
- auto guard = Guard(SpinLock_);
-
- if (!Started_)
- return;
-
- Started_ = false;
- YT_UNUSED_FUTURE(PeriodicExecutor_->Stop());
- Root_.Reset();
- }
-
-private:
- class TYPathService
- : public TYPathServiceBase
- {
- public:
- explicit TYPathService(TIntrusivePtr<TImpl> owner)
- : Owner_(std::move(owner))
- { }
-
- TResolveResult Resolve(const TYPath& path, const IYPathServiceContextPtr& /*context*/) override
- {
- return TResolveResultThere{Owner_->GetRoot(), path};
- }
-
- private:
- const TIntrusivePtr<TImpl> Owner_;
-
- };
-
- bool Started_ = false;
- TActionQueuePtr ActionQueue_ = New<TActionQueue>("Monitoring");
- TPeriodicExecutorPtr PeriodicExecutor_;
-
- YT_DECLARE_SPIN_LOCK(NThreading::TSpinLock, SpinLock_);
- THashMap<TString, NYson::TYsonProducer> PathToProducer_;
- IMapNodePtr Root_;
-
- void Update()
- {
- YT_LOG_DEBUG("Started updating monitoring state");
-
- YT_PROFILE_TIMING("/monitoring/update_time") {
- auto newRoot = GetEphemeralNodeFactory()->CreateMap();
-
- THashMap<TString, NYson::TYsonProducer> pathToProducer;;
- {
- auto guard = Guard(SpinLock_);
- pathToProducer = PathToProducer_;
- }
-
- for (const auto& [path, producer] : pathToProducer) {
- auto value = ConvertToYsonString(producer);
- SyncYPathSet(newRoot, path, value);
- }
-
- if (Started_) {
- auto guard = Guard(SpinLock_);
- std::swap(Root_, newRoot);
- }
- }
- YT_LOG_DEBUG("Finished updating monitoring state");
- }
-
- IMapNodePtr GetRoot()
- {
- auto guard = Guard(SpinLock_);
- return Root_ ? Root_ : EmptyRoot;
- }
-};
-
-DEFINE_REFCOUNTED_TYPE(TMonitoringManager)
-
-////////////////////////////////////////////////////////////////////////////////
-
-TMonitoringManager::TMonitoringManager()
- : Impl_(New<TImpl>())
-{ }
-
-TMonitoringManager::~TMonitoringManager() = default;
-
-void TMonitoringManager::Register(const TYPath& path, TYsonProducer producer)
-{
- Impl_->Register(path, producer);
-}
-
-void TMonitoringManager::Unregister(const TYPath& path)
-{
- Impl_->Unregister(path);
-}
-
-IYPathServicePtr TMonitoringManager::GetService()
-{
- return Impl_->GetService();
-}
-
-void TMonitoringManager::Start()
-{
- Impl_->Start();
-}
-
-void TMonitoringManager::Stop()
-{
- Impl_->Stop();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NMonitoring
diff --git a/yt/yt/library/monitoring/monitoring_manager.h b/yt/yt/library/monitoring/monitoring_manager.h
deleted file mode 100644
index b2582bbe70..0000000000
--- a/yt/yt/library/monitoring/monitoring_manager.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#pragma once
-
-#include "public.h"
-
-#include <yt/yt/core/yson/consumer.h>
-#include <yt/yt/core/yson/producer.h>
-
-#include <yt/yt/core/ypath/public.h>
-
-#include <yt/yt/core/ytree/public.h>
-
-namespace NYT::NMonitoring {
-
-////////////////////////////////////////////////////////////////////////////////
-
-//! Exposes a tree assembled from results returned by a set of
-//! registered NYson::TYsonProducer-s.
-/*!
- * \note
- * The results are cached and periodically updated.
- */
-class TMonitoringManager
- : public TRefCounted
-{
-public:
- TMonitoringManager();
- ~TMonitoringManager();
-
- //! Registers a new #producer for a given #path.
- void Register(const NYPath::TYPath& path, NYson::TYsonProducer producer);
-
- //! Unregisters an existing producer for the specified #path.
- void Unregister(const NYPath::TYPath& path);
-
- //! Returns the service representing the whole tree.
- /*!
- * \note The service is thread-safe.
- */
- NYTree::IYPathServicePtr GetService();
-
- //! Starts periodic updates.
- void Start();
-
- //! Stops periodic updates.
- void Stop();
-
-private:
- class TImpl;
- TIntrusivePtr<TImpl> Impl_;
-
-};
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NMonitoring
diff --git a/yt/yt/library/monitoring/private.h b/yt/yt/library/monitoring/private.h
deleted file mode 100644
index 61809bdb68..0000000000
--- a/yt/yt/library/monitoring/private.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#pragma once
-
-#include "public.h"
-
-#include <yt/yt/core/logging/log.h>
-
-namespace NYT::NMonitoring {
-
-////////////////////////////////////////////////////////////////////////////////
-
-YT_DEFINE_GLOBAL(const NLogging::TLogger, MonitoringLogger, "Monitoring");
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NJournalClient
diff --git a/yt/yt/library/monitoring/public.h b/yt/yt/library/monitoring/public.h
deleted file mode 100644
index 3514bdd858..0000000000
--- a/yt/yt/library/monitoring/public.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#pragma once
-
-#include <yt/yt/core/misc/public.h>
-
-namespace NYT::NMonitoring {
-
-////////////////////////////////////////////////////////////////////////////////
-
-DECLARE_REFCOUNTED_CLASS(TMonitoringManager)
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NMonitoring
diff --git a/yt/yt/library/monitoring/ya.make b/yt/yt/library/monitoring/ya.make
deleted file mode 100644
index c2fccd99ac..0000000000
--- a/yt/yt/library/monitoring/ya.make
+++ /dev/null
@@ -1,27 +0,0 @@
-LIBRARY()
-
-INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
-
-SRCS(
- http_integration.cpp
- monitoring_manager.cpp
-)
-
-PEERDIR(
- yt/yt/core
- yt/yt/build
- yt/yt/library/profiling
- yt/yt/library/profiling/solomon
- library/cpp/cgiparam
-)
-
-IF (OS_LINUX)
- PEERDIR(
- yt/yt/library/ytprof
- yt/yt/library/ytprof/http
-
- yt/yt/library/backtrace_introspector/http
- )
-ENDIF()
-
-END()
diff --git a/yt/yt/library/oom/oom.cpp b/yt/yt/library/oom/oom.cpp
deleted file mode 100644
index 56714260ce..0000000000
--- a/yt/yt/library/oom/oom.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-#include "oom.h"
-
-#include <thread>
-#include <mutex>
-
-#include <yt/yt/core/misc/proc.h>
-#include <yt/yt/core/misc/ref_counted_tracker.h>
-
-#include <library/cpp/yt/assert/assert.h>
-#include <library/cpp/yt/logging/logger.h>
-
-#include <yt/yt/library/ytprof/heap_profiler.h>
-#include <yt/yt/library/ytprof/profile.h>
-
-#include <util/datetime/base.h>
-#include <util/system/file.h>
-#include <util/stream/output.h>
-#include <util/stream/file.h>
-#include <util/string/split.h>
-#include <util/system/fs.h>
-
-namespace NYT {
-
-////////////////////////////////////////////////////////////////////////////////
-
-namespace {
-
-YT_DEFINE_GLOBAL(const NYT::NLogging::TLogger, Logger, "OOM");
-
-const char* TCMallocStats[] = {
- "tcmalloc.per_cpu_caches_active",
- "generic.virtual_memory_used",
- "generic.physical_memory_used",
- "generic.bytes_in_use_by_app",
- "generic.heap_size",
- "tcmalloc.central_cache_free",
- "tcmalloc.cpu_free",
- "tcmalloc.page_heap_free",
- "tcmalloc.page_heap_unmapped",
- "tcmalloc.page_algorithm",
- "tcmalloc.max_total_thread_cache_bytes",
- "tcmalloc.thread_cache_free",
- "tcmalloc.thread_cache_count",
- "tcmalloc.local_bytes",
- "tcmalloc.external_fragmentation_bytes",
- "tcmalloc.metadata_bytes",
- "tcmalloc.transfer_cache_free",
- "tcmalloc.hard_usage_limit_bytes",
- "tcmalloc.desired_usage_limit_bytes",
- "tcmalloc.required_bytes",
-};
-
-void OomWatchdog(TOomWatchdogOptions options)
-{
- while (true) {
- auto rss = GetProcessMemoryUsage().Rss;
-
- if (options.MemoryLimit && static_cast<i64>(rss) > *options.MemoryLimit) {
- auto profile = NYTProf::CaptureHeapProfile(tcmalloc::ProfileType::kHeap);
-
- TFileOutput output(options.HeapDumpPath);
- NYTProf::WriteCompressedProfile(&output, profile);
- output.Finish();
-
- auto rctDump = TRefCountedTracker::Get()->GetDebugInfo();
- for (const auto& line : StringSplitter(rctDump).Split('\n')) {
- YT_LOG_DEBUG("RCT %v", line.Token());
- }
-
- auto parseMemoryAmount = [] (const TStringBuf strValue) {
- const TStringBuf kbSuffix = " kB";
- YT_VERIFY(strValue.EndsWith(kbSuffix));
- auto startPos = strValue.find_first_not_of(' ');
- auto valueString = strValue.substr(
- startPos,
- strValue.size() - kbSuffix.size() - startPos);
- return FromString<ui64>(valueString) * 1_KB;
- };
-
- ui64 rssAnon = 0;
- ui64 rssFile = 0;
- ui64 rssShmem = 0;
-
- TFileInput statusFile(Format("/proc/self/status"));
- TString line;
- while (statusFile.ReadLine(line)) {
- const TStringBuf rssAnonHeader = "RssAnon:\t";
- if (line.StartsWith(rssAnonHeader)) {
- rssAnon = parseMemoryAmount(line.substr(rssAnonHeader.size()));
- continue;
- }
-
- const TStringBuf rssFileHeader = "RssFile:\t";
- if (line.StartsWith(rssFileHeader)) {
- rssFile = parseMemoryAmount(line.substr(rssFileHeader.size()));
- continue;
- }
-
- const TStringBuf rssShmemHeader = "RssShmem:\t";
- if (line.StartsWith(rssShmemHeader)) {
- rssShmem = parseMemoryAmount(line.substr(rssShmemHeader.size()));
- continue;
- }
- }
-
- YT_LOG_DEBUG("Memory statistis (RssTotal: %v, RssAnon: %v, RssFile %v, RssShmem: %v, TCMalloc: %v)",
- rss,
- rssAnon,
- rssFile,
- rssShmem,
- MakeFormattableView(
- TRange(TCMallocStats),
- [&] (auto* builder, auto metric) {
- auto value = tcmalloc::MallocExtension::GetNumericProperty(metric);
- builder->AppendFormat("%v: %v", metric, value);
- }));
-
- YT_LOG_FATAL("Early OOM triggered (MemoryUsage: %v, MemoryLimit: %v, HeapDump: %v, CurrentWorkingDirectory: %v)",
- rss,
- *options.MemoryLimit,
- options.HeapDumpPath,
- NFs::CurrentWorkingDirectory());
- }
-
- Sleep(TDuration::MilliSeconds(10));
- }
-}
-
-} // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-
-void EnableEarlyOomWatchdog(TOomWatchdogOptions options)
-{
- static std::once_flag onceFlag;
-
- std::call_once(onceFlag, [options] {
- std::thread(OomWatchdog, options).detach();
- });
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT
diff --git a/yt/yt/library/oom/oom.h b/yt/yt/library/oom/oom.h
deleted file mode 100644
index 7a5892918a..0000000000
--- a/yt/yt/library/oom/oom.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#pragma once
-
-#include <optional>
-
-#include <util/generic/string.h>
-
-namespace NYT {
-
-////////////////////////////////////////////////////////////////////////////////
-
-struct TOomWatchdogOptions
-{
- std::optional<i64> MemoryLimit;
- TString HeapDumpPath = "oom.pb.gz";
-};
-
-void EnableEarlyOomWatchdog(TOomWatchdogOptions options);
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT
diff --git a/yt/yt/library/oom/unittests/oom_ut.cpp b/yt/yt/library/oom/unittests/oom_ut.cpp
deleted file mode 100644
index 78f0182973..0000000000
--- a/yt/yt/library/oom/unittests/oom_ut.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <gtest/gtest.h>
-
-#include <yt/yt/library/oom/oom.h>
-
-#include <util/datetime/base.h>
-#include <util/system/fs.h>
-#include <util/generic/size_literals.h>
-
-namespace NYT {
-namespace {
-
-////////////////////////////////////////////////////////////////////////////////
-
-TEST(TEarlyOomTest, Crash)
-{
- auto checkOom = [] {
- EnableEarlyOomWatchdog(TOomWatchdogOptions{
- .MemoryLimit = 0,
- });
-
- Sleep(TDuration::Seconds(5));
- };
-
- ASSERT_DEATH(checkOom(), "");
-
- ASSERT_TRUE(NFs::Exists("oom.pb.gz"));
-}
-
-TEST(TEarlyOomTest, NoCrash)
-{
- EnableEarlyOomWatchdog(TOomWatchdogOptions{
- .MemoryLimit = 1_GB,
- });
-
- Sleep(TDuration::Seconds(5));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace
-} // namespace NYT
diff --git a/yt/yt/library/oom/ya.make b/yt/yt/library/oom/ya.make
deleted file mode 100644
index f4845495d8..0000000000
--- a/yt/yt/library/oom/ya.make
+++ /dev/null
@@ -1,20 +0,0 @@
-LIBRARY()
-
-INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
-
-SRCS(
- oom.cpp
-)
-
-PEERDIR(
- yt/yt/core
- yt/yt/library/ytprof
-)
-
-END()
-
-IF (OS_LINUX AND NOT SANITIZER_TYPE)
- RECURSE(
- unittests
- )
-ENDIF()
diff --git a/yt/yt/library/process/config.cpp b/yt/yt/library/process/config.cpp
new file mode 100644
index 0000000000..9099aca7f0
--- /dev/null
+++ b/yt/yt/library/process/config.cpp
@@ -0,0 +1,34 @@
+#include "config.h"
+
+namespace NYT::NPipes {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TIODispatcherConfig::Register(TRegistrar registrar)
+{
+ registrar.Parameter("thread_pool_polling_period", &TThis::ThreadPoolPollingPeriod)
+ .Default(TDuration::MilliSeconds(10));
+}
+
+TIODispatcherConfigPtr TIODispatcherConfig::ApplyDynamic(
+ const TIODispatcherDynamicConfigPtr& dynamicConfig) const
+{
+ auto mergedConfig = CloneYsonStruct(MakeStrong(this));
+ UpdateYsonStructField(mergedConfig->ThreadPoolPollingPeriod, dynamicConfig->ThreadPoolPollingPeriod);
+ mergedConfig->Postprocess();
+ return mergedConfig;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TIODispatcherDynamicConfig::Register(TRegistrar registrar)
+{
+ registrar.Parameter("thread_pool_polling_period", &TThis::ThreadPoolPollingPeriod)
+ .Optional();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NPipes
diff --git a/yt/yt/library/process/config.h b/yt/yt/library/process/config.h
new file mode 100644
index 0000000000..84be0ef7be
--- /dev/null
+++ b/yt/yt/library/process/config.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "public.h"
+
+#include <yt/yt/core/ytree/yson_struct.h>
+
+namespace NYT::NPipes {
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TIODispatcherConfig
+ : public NYTree::TYsonStruct
+{
+public:
+ TDuration ThreadPoolPollingPeriod;
+
+ TIODispatcherConfigPtr ApplyDynamic(const TIODispatcherDynamicConfigPtr& dynamicConfig) const;
+
+ REGISTER_YSON_STRUCT(TIODispatcherConfig);
+
+ static void Register(TRegistrar registrar);
+};
+
+DEFINE_REFCOUNTED_TYPE(TIODispatcherConfig)
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TIODispatcherDynamicConfig
+ : public NYTree::TYsonStruct
+{
+public:
+ std::optional<TDuration> ThreadPoolPollingPeriod;
+
+ REGISTER_YSON_STRUCT(TIODispatcherDynamicConfig);
+
+ static void Register(TRegistrar registrar);
+};
+
+DEFINE_REFCOUNTED_TYPE(TIODispatcherDynamicConfig)
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NPipes
diff --git a/yt/yt/library/process/configure_io_dispatcher.cpp b/yt/yt/library/process/configure_io_dispatcher.cpp
new file mode 100644
index 0000000000..d2f834b0f2
--- /dev/null
+++ b/yt/yt/library/process/configure_io_dispatcher.cpp
@@ -0,0 +1,41 @@
+#include "io_dispatcher.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NPipes {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TIODispatcherConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TIODispatcherDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TIODispatcherConfigPtr& config)
+{
+ TIODispatcher::Get()->Configure(config);
+}
+
+void ReconfigureSingleton(
+ const TIODispatcherConfigPtr& config,
+ const TIODispatcherDynamicConfigPtr& dynamicConfig)
+{
+ TIODispatcher::Get()->Configure(config->ApplyDynamic(dynamicConfig));
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "io_dispatcher",
+ TIODispatcherConfig,
+ TIODispatcherDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NPipes
diff --git a/yt/yt/library/process/io_dispatcher.cpp b/yt/yt/library/process/io_dispatcher.cpp
index c6e7e2f67f..96e1f88087 100644
--- a/yt/yt/library/process/io_dispatcher.cpp
+++ b/yt/yt/library/process/io_dispatcher.cpp
@@ -1,5 +1,7 @@
#include "io_dispatcher.h"
+#include "config.h"
+
#include <yt/yt/core/concurrency/thread_pool_poller.h>
#include <yt/yt/core/concurrency/poller.h>
@@ -9,14 +11,6 @@ using namespace NConcurrency;
////////////////////////////////////////////////////////////////////////////////
-void TIODispatcherConfig::Register(TRegistrar registrar)
-{
- registrar.Parameter("thread_pool_polling_period", &TThis::ThreadPoolPollingPeriod)
- .Default(TDuration::MilliSeconds(10));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
TIODispatcher::TIODispatcher()
: Poller_(BIND([] { return CreateThreadPoolPoller(1, "Pipes"); }))
{ }
diff --git a/yt/yt/library/process/io_dispatcher.h b/yt/yt/library/process/io_dispatcher.h
index 32fd92f0ac..3c47bddf78 100644
--- a/yt/yt/library/process/io_dispatcher.h
+++ b/yt/yt/library/process/io_dispatcher.h
@@ -12,32 +12,15 @@ namespace NYT::NPipes {
////////////////////////////////////////////////////////////////////////////////
-class TIODispatcherConfig
- : public NYTree::TYsonStruct
-{
-public:
- TDuration ThreadPoolPollingPeriod;
-
- REGISTER_YSON_STRUCT(TIODispatcherConfig);
-
- static void Register(TRegistrar registrar);
-};
-
-DEFINE_REFCOUNTED_TYPE(TIODispatcherConfig)
-
-////////////////////////////////////////////////////////////////////////////////
-
class TIODispatcher
{
public:
- ~TIODispatcher();
-
static TIODispatcher* Get();
+ ~TIODispatcher();
void Configure(const TIODispatcherConfigPtr& config);
IInvokerPtr GetInvoker();
-
NConcurrency::IPollerPtr GetPoller();
private:
diff --git a/yt/yt/library/process/public.h b/yt/yt/library/process/public.h
index fd4193f80d..76cfff1340 100644
--- a/yt/yt/library/process/public.h
+++ b/yt/yt/library/process/public.h
@@ -1,6 +1,8 @@
#pragma once
-#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
+#include <library/cpp/yt/memory/ref_counted.h>
namespace NYT::NPipes {
@@ -10,6 +12,10 @@ DECLARE_REFCOUNTED_CLASS(TNamedPipe)
DECLARE_REFCOUNTED_CLASS(TNamedPipeConfig)
DECLARE_REFCOUNTED_CLASS(TIODispatcherConfig)
+DECLARE_REFCOUNTED_CLASS(TIODispatcherDynamicConfig)
+
+
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TIODispatcherConfig, TIODispatcherDynamicConfig);
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/library/process/unittests/pipes_ut.cpp b/yt/yt/library/process/unittests/pipes_ut.cpp
deleted file mode 100644
index f0c371dd30..0000000000
--- a/yt/yt/library/process/unittests/pipes_ut.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-#include <yt/yt/core/test_framework/framework.h>
-
-#include <yt/yt/core/concurrency/action_queue.h>
-#include <yt/yt/core/concurrency/scheduler.h>
-
-#include <yt/yt/core/misc/blob.h>
-#include <yt/yt/core/misc/proc.h>
-
-#include <yt/yt/core/net/connection.h>
-
-#include <yt/yt/library/process/pipe.h>
-
-#include <random>
-
-namespace NYT::NPipes {
-
-////////////////////////////////////////////////////////////////////////////////
-
-using namespace NConcurrency;
-using namespace NNet;
-
-#ifndef _win_
-
-//! NB: You can't set size smaller than that of a page.
-constexpr int SmallPipeCapacity = 4096;
-
-TEST(TPipeIOHolder, CanInstantiate)
-{
- auto pipe = TPipeFactory().Create();
-
- auto readerHolder = pipe.CreateAsyncReader();
- auto writerHolder = pipe.CreateAsyncWriter();
-
- readerHolder->Abort().Get();
- writerHolder->Abort().Get();
-}
-
-TEST(TPipeTest, PrematureEOF)
-{
- auto pipe = TNamedPipe::Create("./namedpipe");
- auto reader = pipe->CreateAsyncReader();
-
- auto buffer = TSharedMutableRef::Allocate(1024 * 1024);
- EXPECT_THROW(reader->Read(buffer).WithTimeout(TDuration::Seconds(1)).Get().ValueOrThrow(), TErrorException);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-TBlob ReadAll(IConnectionReaderPtr reader, bool useWaitFor)
-{
- auto buffer = TSharedMutableRef::Allocate(1_MB, {.InitializeStorage = false});
- auto whole = TBlob(GetRefCountedTypeCookie<TDefaultBlobTag>());
-
- while (true) {
- TErrorOr<size_t> result;
- auto future = reader->Read(buffer);
- if (useWaitFor) {
- result = WaitFor(future);
- } else {
- result = future.Get();
- }
-
- if (result.ValueOrThrow() == 0) {
- break;
- }
-
- whole.Append(buffer.Begin(), result.Value());
- }
- return whole;
-}
-
-void WriteAll(IConnectionWriterPtr writer, const char* data, size_t size, size_t blockSize)
-{
- while (size > 0) {
- const size_t currentBlockSize = std::min(blockSize, size);
- auto buffer = TSharedRef(data, currentBlockSize, nullptr);
- auto error = WaitFor(writer->Write(buffer));
- THROW_ERROR_EXCEPTION_IF_FAILED(error);
- size -= currentBlockSize;
- data += currentBlockSize;
- }
-
- {
- auto error = WaitFor(writer->Close());
- THROW_ERROR_EXCEPTION_IF_FAILED(error);
- }
-}
-
-TEST(TAsyncWriterTest, AsyncCloseFail)
-{
- auto pipe = TPipeFactory().Create();
-
- auto reader = pipe.CreateAsyncReader();
- auto writer = pipe.CreateAsyncWriter();
-
- auto queue = New<NConcurrency::TActionQueue>();
- auto readFromPipe =
- BIND(&ReadAll, reader, false)
- .AsyncVia(queue->GetInvoker())
- .Run();
-
- int length = 200*1024;
- auto buffer = TSharedMutableRef::Allocate(length);
- ::memset(buffer.Begin(), 'a', buffer.Size());
-
- auto writeResult = writer->Write(buffer).Get();
-
- EXPECT_TRUE(writeResult.IsOK())
- << ToString(writeResult);
-
- auto error = writer->Close();
-
- auto readResult = readFromPipe.Get();
- ASSERT_TRUE(readResult.IsOK())
- << ToString(readResult);
-
- auto closeStatus = error.Get();
-}
-
-TEST(TAsyncWriterTest, WriteFailed)
-{
- auto pipe = TPipeFactory().Create();
- auto reader = pipe.CreateAsyncReader();
- auto writer = pipe.CreateAsyncWriter();
-
- int length = 200*1024;
- auto buffer = TSharedMutableRef::Allocate(length);
- ::memset(buffer.Begin(), 'a', buffer.Size());
-
- auto asyncWriteResult = writer->Write(buffer);
- YT_UNUSED_FUTURE(reader->Abort());
-
- EXPECT_FALSE(asyncWriteResult.Get().IsOK())
- << ToString(asyncWriteResult.Get());
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-class TPipeReadWriteTest
- : public ::testing::Test
-{
-protected:
- void SetUp() override
- {
- auto pipe = TPipeFactory().Create();
-
- Reader = pipe.CreateAsyncReader();
- Writer = pipe.CreateAsyncWriter();
- }
-
- void TearDown() override
- { }
-
- IConnectionReaderPtr Reader;
- IConnectionWriterPtr Writer;
-};
-
-class TNamedPipeReadWriteTest
- : public ::testing::Test
-{
-protected:
- void SetUp() override
- {
- auto pipe = TNamedPipe::Create("./namedpipe");
- Reader = pipe->CreateAsyncReader();
- Writer = pipe->CreateAsyncWriter();
- }
-
- void TearDown() override
- { }
-
- void SetUpWithCapacity(int capacity)
- {
- auto pipe = TNamedPipe::Create("./namedpipewcap", 0660, capacity);
- Reader = pipe->CreateAsyncReader();
- Writer = pipe->CreateAsyncWriter();
- }
-
- void SetUpWithDeliveryFence()
- {
- auto pipe = TNamedPipe::Create("./namedpipewcap", 0660);
- Reader = pipe->CreateAsyncReader();
- Writer = pipe->CreateAsyncWriter(/*useDeliveryFence*/ true);
- }
-
- IConnectionReaderPtr Reader;
- IConnectionWriterPtr Writer;
-};
-
-TEST_F(TPipeReadWriteTest, ReadSomethingSpin)
-{
- TString message("Hello pipe!\n");
- auto buffer = TSharedRef::FromString(message);
- Writer->Write(buffer).Get().ThrowOnError();
- Writer->Close().Get().ThrowOnError();
-
- auto data = TSharedMutableRef::Allocate(1);
- auto whole = TBlob(GetRefCountedTypeCookie<TDefaultBlobTag>());
-
- while (true) {
- auto result = Reader->Read(data).Get();
- if (result.ValueOrThrow() == 0) {
- break;
- }
- whole.Append(data.Begin(), result.Value());
- }
-
- EXPECT_EQ(message, TString(whole.Begin(), whole.End()));
-}
-
-TEST_F(TNamedPipeReadWriteTest, ReadSomethingSpin)
-{
- TString message("Hello pipe!\n");
- auto buffer = TSharedRef::FromString(message);
-
- Writer->Write(buffer).Get().ThrowOnError();
- Writer->Close().Get().ThrowOnError();
-
- auto data = TSharedMutableRef::Allocate(1);
- auto whole = TBlob(GetRefCountedTypeCookie<TDefaultBlobTag>());
-
- while (true) {
- auto result = Reader->Read(data).Get();
- if (result.ValueOrThrow() == 0) {
- break;
- }
- whole.Append(data.Begin(), result.Value());
- }
- EXPECT_EQ(message, TString(whole.Begin(), whole.End()));
-}
-
-
-TEST_F(TPipeReadWriteTest, ReadSomethingWait)
-{
- TString message("Hello pipe!\n");
- auto buffer = TSharedRef::FromString(message);
- EXPECT_TRUE(Writer->Write(buffer).Get().IsOK());
- WaitFor(Writer->Close())
- .ThrowOnError();
- auto whole = ReadAll(Reader, false);
- EXPECT_EQ(message, TString(whole.Begin(), whole.End()));
-}
-
-TEST_F(TNamedPipeReadWriteTest, ReadSomethingWait)
-{
- TString message("Hello pipe!\n");
- auto buffer = TSharedRef::FromString(message);
- EXPECT_TRUE(Writer->Write(buffer).Get().IsOK());
- WaitFor(Writer->Close())
- .ThrowOnError();
- auto whole = ReadAll(Reader, false);
- EXPECT_EQ(message, TString(whole.Begin(), whole.End()));
-}
-
-TEST_F(TPipeReadWriteTest, ReadWrite)
-{
- TString text("Hello cruel world!\n");
- auto buffer = TSharedRef::FromString(text);
- Writer->Write(buffer).Get();
- auto errorsOnClose = Writer->Close();
-
- auto textFromPipe = ReadAll(Reader, false);
-
- auto error = errorsOnClose.Get();
- EXPECT_TRUE(error.IsOK()) << error.GetMessage();
- EXPECT_EQ(text, TString(textFromPipe.Begin(), textFromPipe.End()));
-}
-
-TEST_F(TNamedPipeReadWriteTest, ReadWrite)
-{
- TString text("Hello cruel world!\n");
- auto buffer = TSharedRef::FromString(text);
- Writer->Write(buffer).Get();
- auto errorsOnClose = Writer->Close();
-
- auto textFromPipe = ReadAll(Reader, false);
-
- auto error = errorsOnClose.Get();
- EXPECT_TRUE(error.IsOK()) << error.GetMessage();
- EXPECT_EQ(text, TString(textFromPipe.Begin(), textFromPipe.End()));
-}
-
-TEST_F(TNamedPipeReadWriteTest, CapacityJustWorks)
-{
- SetUpWithCapacity(SmallPipeCapacity);
-
- TString text(5, 'a');
- text.push_back('\n');
- auto writeBuffer = TSharedRef::FromString(text);
-
- auto writeFuture = Writer->Write(writeBuffer);
- EXPECT_TRUE(writeFuture.Get().IsOK());
-
- auto readBuffer = TSharedMutableRef::Allocate(5000, {.InitializeStorage = false});
- auto readResult = Reader->Read(readBuffer).Get();
-
- EXPECT_EQ(text, TString(readBuffer.Begin(), readResult.Value()));
-}
-
-TEST_F(TNamedPipeReadWriteTest, CapacityOverflow)
-{
- SetUpWithCapacity(SmallPipeCapacity);
- auto readerQueue = New<NConcurrency::TActionQueue>("Reader");
-
- TString text(5000, 'a');
- text.push_back('\n');
- auto writeBuffer = TSharedRef::FromString(text);
- auto writeFuture = Writer->Write(writeBuffer);
-
- TDelayedExecutor::WaitForDuration(TDuration::Seconds(1));
- EXPECT_FALSE(writeFuture.IsSet());
-
- auto readFuture = BIND([&] {
- auto readBuffer = TSharedMutableRef::Allocate(6000, {.InitializeStorage = false});
- auto readResult = Reader->Read(readBuffer).Get();
-
- EXPECT_TRUE(readResult.IsOK());
- EXPECT_EQ(text.substr(0, 4096), TString(readBuffer.Begin(), readResult.Value()));
- })
- .AsyncVia(readerQueue->GetInvoker())
- .Run();
-
- EXPECT_TRUE(readFuture.Get().IsOK());
- EXPECT_TRUE(writeFuture.Get().IsOK());
-}
-
-TEST_F(TNamedPipeReadWriteTest, CapacityDontDiscardSurplus)
-{
- SetUpWithCapacity(SmallPipeCapacity);
- auto readerQueue = New<NConcurrency::TActionQueue>("Reader");
- auto writerQueue = New<NConcurrency::TActionQueue>("Writer");
-
- TString text(5000, 'a');
- text.push_back('\n');
-
- auto writeFuture = BIND(&WriteAll, Writer, text.data(), text.size(), text.size())
- .AsyncVia(writerQueue->GetInvoker())
- .Run();
-
- TDelayedExecutor::WaitForDuration(TDuration::Seconds(1));
- EXPECT_FALSE(writeFuture.IsSet());
-
- auto readFuture = BIND(&ReadAll, Reader, false)
- .AsyncVia(readerQueue->GetInvoker())
- .Run();
-
- auto readResult = readFuture.Get().ValueOrThrow();
- EXPECT_EQ(text, TString(readResult.Begin(), readResult.End()));
-
- EXPECT_TRUE(writeFuture.Get().IsOK());
-}
-
-#if defined(_linux_)
-
-TEST_F(TNamedPipeReadWriteTest, DeliveryFencedWriteJustWorks)
-{
- SetUpWithDeliveryFence();
-
- TString text("aabbb");
- auto writeBuffer = TSharedRef::FromString(text);
- auto writeFuture = Writer->Write(writeBuffer);
-
- auto readBuffer = TSharedMutableRef::Allocate(2, {.InitializeStorage = false});
- auto readResult = Reader->Read(readBuffer).Get();
- EXPECT_EQ(TString("aa"), TString(readBuffer.Begin(), readResult.Value()));
-
- EXPECT_FALSE(writeFuture.IsSet());
-
- readBuffer = TSharedMutableRef::Allocate(10, {.InitializeStorage = false});
- readResult = Reader->Read(readBuffer).Get();
- EXPECT_EQ(TString("bbb"), TString(readBuffer.Begin(), readResult.Value()));
-
- // Future is set only after the entire buffer is read.
- EXPECT_TRUE(writeFuture.Get().IsOK());
-}
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-
-class TPipeBigReadWriteTest
- : public TPipeReadWriteTest
- , public ::testing::WithParamInterface<std::pair<size_t, size_t>>
-{ };
-
-TEST_P(TPipeBigReadWriteTest, RealReadWrite)
-{
- size_t dataSize, blockSize;
- std::tie(dataSize, blockSize) = GetParam();
-
- auto queue = New<NConcurrency::TActionQueue>();
-
- std::vector<char> data(dataSize, 'a');
-
- YT_UNUSED_FUTURE(BIND([&] {
- auto dice = std::bind(
- std::uniform_int_distribution<int>(0, 127),
- std::default_random_engine());
- for (size_t i = 0; i < data.size(); ++i) {
- data[i] = dice();
- }
- })
- .AsyncVia(queue->GetInvoker()).Run());
-
- auto writeError = BIND(&WriteAll, Writer, data.data(), data.size(), blockSize)
- .AsyncVia(queue->GetInvoker())
- .Run();
- auto readFromPipe = BIND(&ReadAll, Reader, true)
- .AsyncVia(queue->GetInvoker())
- .Run();
-
- auto textFromPipe = readFromPipe.Get().ValueOrThrow();
- EXPECT_EQ(data.size(), textFromPipe.Size());
- auto result = std::mismatch(textFromPipe.Begin(), textFromPipe.End(), data.begin());
- EXPECT_TRUE(std::equal(textFromPipe.Begin(), textFromPipe.End(), data.begin())) <<
- (result.first - textFromPipe.Begin()) << " " << (int)(*result.first);
-}
-
-INSTANTIATE_TEST_SUITE_P(
- ValueParametrized,
- TPipeBigReadWriteTest,
- ::testing::Values(
- std::pair(2000 * 4096, 4096),
- std::pair(100 * 4096, 10000),
- std::pair(100 * 4096, 100),
- std::pair(100, 4096)));
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT::NPipes
diff --git a/yt/yt/library/process/unittests/process_ut.cpp b/yt/yt/library/process/unittests/process_ut.cpp
deleted file mode 100644
index 61508c487f..0000000000
--- a/yt/yt/library/process/unittests/process_ut.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#include <yt/yt/library/process/process.h>
-
-#include <yt/yt/core/test_framework/framework.h>
-
-#include <yt/yt/core/actions/bind.h>
-
-#include <yt/yt/core/concurrency/action_queue.h>
-#include <yt/yt/core/concurrency/delayed_executor.h>
-#include <yt/yt/core/concurrency/scheduler.h>
-
-#include <yt/yt/core/net/connection.h>
-
-#include <library/cpp/yt/system/handle_eintr.h>
-
-namespace NYT {
-namespace {
-
-using namespace NConcurrency;
-
-////////////////////////////////////////////////////////////////////////////////
-
-#if defined(_unix_) and not defined(_asan_enabled_)
-
-TEST(TProcessTest, Basic)
-{
- auto p = New<TSimpleProcess>("/bin/ls");
- TFuture<void> finished;
-
- ASSERT_NO_THROW(finished = p->Spawn());
- ASSERT_TRUE(p->IsStarted());
- auto error = WaitFor(finished);
- EXPECT_TRUE(error.IsOK()) << ToString(error);
- EXPECT_TRUE(p->IsFinished());
-}
-
-// NB: We cannot rely on 'ls' and 'sleep' in arcadia tests.
-TEST(TProcessTest, RunFromPathEnv)
-{
- auto p = New<TSimpleProcess>("/bin/ls", false);
- TFuture<void> finished;
-
- ASSERT_NO_THROW(finished = p->Spawn());
- ASSERT_TRUE(p->IsStarted());
- auto error = WaitFor(finished);
- EXPECT_TRUE(error.IsOK()) << ToString(error);
- EXPECT_TRUE(p->IsFinished());
-}
-
-TEST(TProcessTest, PollDuration)
-{
- auto p = New<TSimpleProcess>("/bin/sleep", true, TDuration::MilliSeconds(1));
- p->AddArgument("0.1");
-
- auto error = WaitFor(p->Spawn());
- EXPECT_TRUE(error.IsOK()) << ToString(error);
- EXPECT_TRUE(p->IsFinished());
-}
-
-TEST(TProcessTest, InvalidPath)
-{
- auto p = New<TSimpleProcess>("/some/bad/path/binary");
-
- TFuture<void> finished;
- ASSERT_NO_THROW(finished = p->Spawn());
- ASSERT_FALSE(p->IsStarted());
- auto error = WaitFor(finished);
- EXPECT_FALSE(p->IsFinished());
- EXPECT_FALSE(error.IsOK());
-}
-
-TEST(TProcessTest, StdOut)
-{
- auto p = New<TSimpleProcess>("/bin/date");
-
- auto outStream = p->GetStdOutReader();
- TFuture<void> finished;
- ASSERT_NO_THROW(finished = p->Spawn());
- ASSERT_TRUE(p->IsStarted());
- auto error = WaitFor(finished);
- EXPECT_TRUE(error.IsOK()) << ToString(error);
- EXPECT_TRUE(p->IsFinished());
-
- auto buffer = TSharedMutableRef::Allocate(4_KB, {.InitializeStorage = false});
- auto future = outStream->Read(buffer);
- auto result = WaitFor(future);
- size_t sz = result.ValueOrThrow();
- EXPECT_TRUE(sz > 0);
-}
-
-TEST(TSimpleProcess, GetCommandLine1)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- EXPECT_EQ("/bin/bash", p->GetCommandLine());
- p->AddArgument("-c");
- EXPECT_EQ("/bin/bash -c", p->GetCommandLine());
- p->AddArgument("exit 0");
- EXPECT_EQ("/bin/bash -c \"exit 0\"", p->GetCommandLine());
-}
-
-TEST(TProcessBase, GetCommandLine2)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- EXPECT_EQ("/bin/bash", p->GetCommandLine());
- p->AddArgument("-c");
- EXPECT_EQ("/bin/bash -c", p->GetCommandLine());
- p->AddArgument("\"quoted\"");
- EXPECT_EQ("/bin/bash -c \"\\\"quoted\\\"\"", p->GetCommandLine());
-}
-
-TEST(TProcessTest, ProcessReturnCode0)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- p->AddArgument("-c");
- p->AddArgument("exit 0");
-
- TFuture<void> finished;
- ASSERT_NO_THROW(finished = p->Spawn());
- ASSERT_TRUE(p->IsStarted());
- auto error = WaitFor(finished);
- EXPECT_TRUE(error.IsOK()) << ToString(error);
- EXPECT_TRUE(p->IsFinished());
-}
-
-TEST(TProcessTest, ProcessReturnCode123)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- p->AddArgument("-c");
- p->AddArgument("exit 123");
-
- TFuture<void> finished;
- ASSERT_NO_THROW(finished = p->Spawn());
- ASSERT_TRUE(p->IsStarted());
- auto error = WaitFor(finished);
- EXPECT_EQ(EProcessErrorCode::NonZeroExitCode, error.GetCode());
- EXPECT_EQ(123, error.Attributes().Get<int>("exit_code"));
- EXPECT_TRUE(p->IsFinished());
-}
-
-TEST(TProcessTest, Params1)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- p->AddArgument("-c");
- p->AddArgument("if test 3 -gt 1; then exit 7; fi");
-
- auto error = WaitFor(p->Spawn());
- EXPECT_FALSE(error.IsOK());
- EXPECT_TRUE(p->IsFinished());
-}
-
-TEST(TProcessTest, Params2)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- p->AddArgument("-c");
- p->AddArgument("if test 1 -gt 3; then exit 7; fi");
-
- auto error = WaitFor(p->Spawn());
- EXPECT_TRUE(error.IsOK()) << ToString(error);
- EXPECT_TRUE(p->IsFinished());
-}
-
-TEST(TProcessTest, InheritEnvironment)
-{
- const char* name = "SPAWN_TEST_ENV_VAR";
- const char* value = "42";
- setenv(name, value, 1);
-
- auto p = New<TSimpleProcess>("/bin/bash");
- p->AddArgument("-c");
- p->AddArgument("if test $SPAWN_TEST_ENV_VAR = 42; then exit 7; fi");
-
- auto error = WaitFor(p->Spawn());
- EXPECT_FALSE(error.IsOK());
- EXPECT_TRUE(p->IsFinished());
-
- unsetenv(name);
-}
-
-TEST(TProcessTest, Kill)
-{
- auto p = New<TSimpleProcess>("/bin/sleep");
- p->AddArgument("5");
-
- auto finished = p->Spawn();
-
- NConcurrency::TDelayedExecutor::Submit(
- BIND([&] {
- p->Kill(SIGKILL);
- }),
- TDuration::MilliSeconds(100));
-
- auto error = WaitFor(finished);
- EXPECT_FALSE(error.IsOK());
- EXPECT_TRUE(p->IsFinished());
-}
-
-TEST(TProcessTest, KillFinished)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- p->AddArgument("-c");
- p->AddArgument("true");
-
- auto finished = p->Spawn();
-
- auto error = WaitFor(finished);
- EXPECT_TRUE(error.IsOK());
-
- p->Kill(SIGKILL);
-}
-
-TEST(TProcessTest, KillZombie)
-{
- auto p = New<TSimpleProcess>("/bin/bash");
- p->AddArgument("-c");
- p->AddArgument("/bin/sleep 1; /bin/true");
-
- auto finished = p->Spawn();
-
- siginfo_t infop;
- auto res = HandleEintr(::waitid, P_PID, p->GetProcessId(), &infop, WEXITED | WNOWAIT);
-
- if (res == 0) {
- EXPECT_EQ(p->GetProcessId(), infop.si_pid);
- } else {
- // NB(arkady-e1ppa): Sometimes child process will run
- // just fine and yet will be invisible to waitid
- // on some platforms.
- // Cause of this is still unknown.
- EXPECT_EQ(errno, ECHILD);
- }
-
- p->Kill(SIGKILL);
- auto error = WaitFor(finished);
- EXPECT_TRUE(error.IsOK())
- << ToString(error);
-}
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace
-} // namespace NYT
diff --git a/yt/yt/library/process/unittests/subprocess_ut.cpp b/yt/yt/library/process/unittests/subprocess_ut.cpp
deleted file mode 100644
index ff7cf7aa08..0000000000
--- a/yt/yt/library/process/unittests/subprocess_ut.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#include <yt/yt/core/test_framework/framework.h>
-
-#include <yt/yt/core/actions/future.h>
-
-#include <yt/yt/core/concurrency/action_queue.h>
-
-#include <yt/yt/library/process/subprocess.h>
-
-namespace NYT {
-namespace {
-
-using namespace NConcurrency;
-
-////////////////////////////////////////////////////////////////////////////////
-
-#if defined(_unix_) and not defined(_asan_enabled_)
-
-TEST(TSubprocessTest, Basic)
-{
- TSubprocess subprocess("/bin/bash");
-
- subprocess.AddArgument("-c");
- subprocess.AddArgument("true");
-
- auto result = subprocess.Execute();
- EXPECT_TRUE(result.Status.IsOK());
-}
-
-TEST(TSubprocessTest, PipeOutput)
-{
- TSubprocess subprocess("/bin/echo");
-
- subprocess.AddArgument("hello");
-
- auto result = subprocess.Execute();
- EXPECT_TRUE(result.Status.IsOK());
- TString output(result.Output.Begin(), result.Output.End());
- EXPECT_TRUE(output == "hello\n") << output;
-}
-
-TEST(TSubprocessTest, PipeStdin)
-{
- auto queue = New<TActionQueue>();
-
- BIND([] {
- TSubprocess subprocess("/bin/cat");
- subprocess.AddArgument("-");
-
- auto input = TString("TEST test TEST");
- auto inputRef = TSharedRef::FromString(input);
- auto result = subprocess.Execute(inputRef);
- EXPECT_TRUE(result.Status.IsOK());
-
- TString output(result.Output.Begin(), result.Output.End());
- EXPECT_EQ(input, output);
- }).AsyncVia(queue->GetInvoker()).Run().Get().ThrowOnError();
-}
-
-TEST(TSubprocessTest, PipeBigOutput)
-{
- auto queue = New<TActionQueue>();
-
- auto result = BIND([] {
- TSubprocess subprocess("/bin/bash");
-
- subprocess.AddArgument("-c");
- subprocess.AddArgument("for i in `/usr/bin/seq 100000`; do echo hello; done; echo world");
-
- auto result = subprocess.Execute();
- return result.Status.IsOK();
- }).AsyncVia(queue->GetInvoker()).Run().Get().Value();
-
- EXPECT_TRUE(result);
-}
-
-TEST(TSubprocessTest, PipeBigError)
-{
- auto queue = New<TActionQueue>();
-
- auto result = BIND([] {
- TSubprocess subprocess("/bin/bash");
-
- subprocess.AddArgument("-c");
- subprocess.AddArgument("for i in `/usr/bin/seq 100000`; do echo hello 1>&2; done; echo world");
-
- auto result = subprocess.Execute();
- return result;
- }).AsyncVia(queue->GetInvoker()).Run().Get().Value();
-
- EXPECT_TRUE(result.Status.IsOK());
- EXPECT_EQ(6*100000, std::ssize(result.Error));
-}
-
-TEST(TSubprocessTest, BinaryNotFound)
-{
- auto queue = New<TActionQueue>();
-
- auto result = BIND([] {
- TSubprocess subprocess("does-not-exist");
- return subprocess.Execute();
- }).AsyncVia(queue->GetInvoker()).Run().Get().Value();
-
- EXPECT_FALSE(result.Status.IsOK());
-}
-
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace
-} // namespace NYT
diff --git a/yt/yt/library/process/unittests/ya.make b/yt/yt/library/process/unittests/ya.make
deleted file mode 100644
index 149d9eee1f..0000000000
--- a/yt/yt/library/process/unittests/ya.make
+++ /dev/null
@@ -1,22 +0,0 @@
-GTEST(unittester-library-process)
-
-INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
-
-SRCS(
- pipes_ut.cpp
- process_ut.cpp
- subprocess_ut.cpp
-)
-
-INCLUDE(${ARCADIA_ROOT}/yt/opensource.inc)
-
-PEERDIR(
- yt/yt/build
- yt/yt/core
- yt/yt/core/test_framework
- yt/yt/library/process
-)
-
-SIZE(MEDIUM)
-
-END()
diff --git a/yt/yt/library/process/ya.make b/yt/yt/library/process/ya.make
index 79763c7267..6b3ea41ca2 100644
--- a/yt/yt/library/process/ya.make
+++ b/yt/yt/library/process/ya.make
@@ -3,6 +3,8 @@ LIBRARY()
INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
SRCS(
+ config.cpp
+ GLOBAL configure_io_dispatcher.cpp
io_dispatcher.cpp
pipe.cpp
process.cpp
diff --git a/yt/yt/library/profiling/resource_tracker/configure_resource_tracker.cpp b/yt/yt/library/profiling/resource_tracker/configure_resource_tracker.cpp
new file mode 100644
index 0000000000..4b25b3f6f4
--- /dev/null
+++ b/yt/yt/library/profiling/resource_tracker/configure_resource_tracker.cpp
@@ -0,0 +1,28 @@
+#include "resource_tracker.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NProfiling {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TResourceTrackerConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TResourceTrackerConfigPtr& config)
+{
+ TResourceTracker::Configure(config);
+}
+
+YT_DEFINE_CONFIGURABLE_SINGLETON(
+ "resource_tracker",
+ TResourceTrackerConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NProfiling
diff --git a/yt/yt/library/profiling/resource_tracker/public.h b/yt/yt/library/profiling/resource_tracker/public.h
index 36786770fa..febd29d563 100644
--- a/yt/yt/library/profiling/resource_tracker/public.h
+++ b/yt/yt/library/profiling/resource_tracker/public.h
@@ -1,6 +1,8 @@
#pragma once
-#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
+#include <library/cpp/yt/memory/ref_counted.h>
namespace NYT::NProfiling {
@@ -8,6 +10,8 @@ namespace NYT::NProfiling {
DECLARE_REFCOUNTED_STRUCT(TResourceTrackerConfig)
+YT_DECLARE_CONFIGURABLE_SINGLETON(TResourceTrackerConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NProfiling
diff --git a/yt/yt/library/profiling/resource_tracker/resource_tracker.cpp b/yt/yt/library/profiling/resource_tracker/resource_tracker.cpp
index 1c45abfbbb..138f89434a 100644
--- a/yt/yt/library/profiling/resource_tracker/resource_tracker.cpp
+++ b/yt/yt/library/profiling/resource_tracker/resource_tracker.cpp
@@ -33,7 +33,6 @@ namespace NYT::NProfiling {
////////////////////////////////////////////////////////////////////////////////
using namespace NYPath;
-using namespace NYTree;
using namespace NProfiling;
using namespace NConcurrency;
diff --git a/yt/yt/library/profiling/resource_tracker/ya.make b/yt/yt/library/profiling/resource_tracker/ya.make
index 62287a3fb7..009f21eaa4 100644
--- a/yt/yt/library/profiling/resource_tracker/ya.make
+++ b/yt/yt/library/profiling/resource_tracker/ya.make
@@ -4,6 +4,7 @@ INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
SRCS(
config.cpp
+ GLOBAL configure_resource_tracker.cpp
resource_tracker.cpp
)
diff --git a/yt/yt/library/profiling/solomon/config.cpp b/yt/yt/library/profiling/solomon/config.cpp
index e714548804..7b9666ab2e 100644
--- a/yt/yt/library/profiling/solomon/config.cpp
+++ b/yt/yt/library/profiling/solomon/config.cpp
@@ -45,6 +45,9 @@ void TSolomonExporterConfig::Register(TRegistrar registrar)
registrar.Parameter("convert_counters_to_delta_gauge", &TThis::ConvertCountersToDeltaGauge)
.Default(false);
+ registrar.Parameter("enable_histogram_compat", &TThis::EnableHistogramCompat)
+ .Default(false);
+
registrar.Parameter("export_summary", &TThis::ExportSummary)
.Default(false);
registrar.Parameter("export_summary_as_max", &TThis::ExportSummaryAsMax)
diff --git a/yt/yt/library/profiling/solomon/config.h b/yt/yt/library/profiling/solomon/config.h
index 42b5b4548e..0ff84c96d2 100644
--- a/yt/yt/library/profiling/solomon/config.h
+++ b/yt/yt/library/profiling/solomon/config.h
@@ -41,6 +41,7 @@ struct TSolomonExporterConfig
bool ConvertCountersToRateForSolomon;
bool RenameConvertedCounters;
bool ConvertCountersToDeltaGauge;
+ bool EnableHistogramCompat;
bool ExportSummary;
bool ExportSummaryAsMax;
diff --git a/yt/yt/library/profiling/solomon/exporter.cpp b/yt/yt/library/profiling/solomon/exporter.cpp
index aee542660a..c06a7e4ac7 100644
--- a/yt/yt/library/profiling/solomon/exporter.cpp
+++ b/yt/yt/library/profiling/solomon/exporter.cpp
@@ -636,6 +636,9 @@ void TSolomonExporter::DoHandleShard(
if (Config_->ConvertCountersToDeltaGauge && outputEncodingContext.IsSolomonPull) {
options.ConvertCountersToDeltaGauge = true;
}
+ if (Config_->EnableHistogramCompat && outputEncodingContext.IsSolomonPull) {
+ options.EnableHistogramCompat = true;
+ }
options.EnableSolomonAggregationWorkaround = outputEncodingContext.IsSolomonPull;
options.Times = readWindow;
diff --git a/yt/yt/library/profiling/solomon/helpers.cpp b/yt/yt/library/profiling/solomon/helpers.cpp
index 056daaa330..7f4be734a5 100644
--- a/yt/yt/library/profiling/solomon/helpers.cpp
+++ b/yt/yt/library/profiling/solomon/helpers.cpp
@@ -1,8 +1,13 @@
#include "helpers.h"
+#include "percpu.h"
#include "private.h"
+#include "producer.h"
+#include "sensor_set.h"
#include <yt/yt/core/http/http.h>
+#include <yt/yt/core/misc/ref_counted_tracker.h>
+
#include <library/cpp/monlib/encode/json/json.h>
#include <library/cpp/monlib/encode/spack/spack_v1.h>
#include <library/cpp/monlib/encode/prometheus/prometheus.h>
@@ -73,6 +78,38 @@ TOutputEncodingContext CreateOutputEncodingContextFromHeaders(const THeadersPtr&
return context;
}
+i64 GetCountersBytesAlive()
+{
+ auto* tracker = TRefCountedTracker::Get();
+ i64 usage = 0;
+
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TSimpleCounter>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TPerCpuCounter>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TCounterState>());
+
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TSimpleTimeCounter>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TPerCpuTimeCounter>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TTimeCounterState>());
+
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TSimpleGauge>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TPerCpuGauge>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TGaugeState>());
+
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TSimpleSummary<double>>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TPerCpuSummary<double>>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TSimpleSummary<TDuration>>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TPerCpuSummary<TDuration>>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TSummaryState>());
+
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TProducerState>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<THistogram>());
+
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<TTimerSummaryState>());
+ usage += tracker->GetBytesAlive(GetRefCountedTypeKey<THistogramState>());
+
+ return usage;
+}
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NProfiling
diff --git a/yt/yt/library/profiling/solomon/helpers.h b/yt/yt/library/profiling/solomon/helpers.h
index 4713fd20b7..fd2c841b3f 100644
--- a/yt/yt/library/profiling/solomon/helpers.h
+++ b/yt/yt/library/profiling/solomon/helpers.h
@@ -27,6 +27,8 @@ void FillResponseHeaders(const TOutputEncodingContext& outputEncodingContext, co
//! Creates output encoder according to request headers.
TOutputEncodingContext CreateOutputEncodingContextFromHeaders(const NHttp::THeadersPtr& headers);
+i64 GetCountersBytesAlive();
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NProfiling
diff --git a/yt/yt/library/program/config.cpp b/yt/yt/library/program/config.cpp
index 371c7ced70..762feea0f2 100644
--- a/yt/yt/library/program/config.cpp
+++ b/yt/yt/library/program/config.cpp
@@ -18,67 +18,6 @@ void THeapProfilerConfig::Register(TRegistrar registrar)
////////////////////////////////////////////////////////////////////////////////
-void TSingletonsConfig::Register(TRegistrar registrar)
-{
- registrar.Parameter("fiber_manager", &TThis::FiberManager)
- .DefaultNew();
- registrar.Parameter("address_resolver", &TThis::AddressResolver)
- .DefaultNew();
- registrar.Parameter("tcp_dispatcher", &TThis::TcpDispatcher)
- .DefaultNew();
- registrar.Parameter("io_dispatcher", &TThis::IODispatcher)
- .DefaultNew();
- registrar.Parameter("rpc_dispatcher", &TThis::RpcDispatcher)
- .DefaultNew();
- registrar.Parameter("grpc_dispatcher", &TThis::GrpcDispatcher)
- .DefaultNew();
- registrar.Parameter("yp_service_discovery", &TThis::YPServiceDiscovery)
- .DefaultNew();
- registrar.Parameter("logging", &TThis::Logging)
- .DefaultCtor([] { return NLogging::TLogManagerConfig::CreateDefault(); })
- .ResetOnLoad();
- registrar.Parameter("jaeger", &TThis::Jaeger)
- .DefaultNew();
- registrar.Parameter("tcmalloc", &TThis::TCMalloc)
- .DefaultNew();
- registrar.Parameter("stockpile", &TThis::Stockpile)
- .DefaultNew();
- registrar.Parameter("enable_ref_counted_tracker_profiling", &TThis::EnableRefCountedTrackerProfiling)
- .Default(true);
- registrar.Parameter("resource_tracker", &TThis::ResourceTracker)
- .DefaultNew();
- registrar.Parameter("heap_profiler", &TThis::HeapProfiler)
- .DefaultNew();
- registrar.Parameter("protobuf_interop", &TThis::ProtobufInterop)
- .DefaultNew();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-void TSingletonsDynamicConfig::Register(TRegistrar registrar)
-{
- registrar.Parameter("fiber_manager", &TThis::FiberManager)
- .DefaultNew();
- registrar.Parameter("tcp_dispatcher", &TThis::TcpDispatcher)
- .DefaultNew();
- registrar.Parameter("io_dispatcher", &TThis::IODispatcher)
- .Optional();
- registrar.Parameter("rpc_dispatcher", &TThis::RpcDispatcher)
- .DefaultNew();
- registrar.Parameter("logging", &TThis::Logging)
- .DefaultNew();
- registrar.Parameter("jaeger", &TThis::Jaeger)
- .DefaultNew();
- registrar.Parameter("tcmalloc", &TThis::TCMalloc)
- .Optional();
- registrar.Parameter("stockpile", &TThis::Stockpile)
- .DefaultNew();
- registrar.Parameter("protobuf_interop", &TThis::ProtobufInterop)
- .DefaultNew();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
void WarnForUnrecognizedOptionsImpl(
const NLogging::TLogger& logger,
const IMapNodePtr& unrecognized)
diff --git a/yt/yt/library/program/config.h b/yt/yt/library/program/config.h
index 1b6e0ffd64..38f6eb65ee 100644
--- a/yt/yt/library/program/config.h
+++ b/yt/yt/library/program/config.h
@@ -2,32 +2,9 @@
#include "public.h"
-#include <yt/yt/core/concurrency/config.h>
-
#include <yt/yt/core/ytree/yson_struct.h>
-#include <yt/yt/core/net/config.h>
-
-#include <yt/yt/core/rpc/config.h>
-#include <yt/yt/core/rpc/grpc/config.h>
-
-#include <yt/yt/core/bus/tcp/config.h>
-
-#include <yt/yt/core/logging/config.h>
-
-#include <yt/yt/core/service_discovery/yp/config.h>
-
-#include <yt/yt/core/yson/config.h>
-
-#include <yt/yt/library/process/io_dispatcher.h>
-
-#include <yt/yt/library/tracing/jaeger/tracer.h>
-
-#include <yt/yt/library/profiling/resource_tracker/config.h>
-
-#include <yt/yt/library/tcmalloc/config.h>
-
-#include <yt/yt/library/stockpile/config.h>
+#include <yt/yt/core/misc/configurable_singleton_def.h>
namespace NYT {
@@ -53,58 +30,6 @@ DEFINE_REFCOUNTED_TYPE(THeapProfilerConfig)
////////////////////////////////////////////////////////////////////////////////
-class TSingletonsConfig
- : public virtual NYTree::TYsonStruct
-{
-public:
- NConcurrency::TFiberManagerConfigPtr FiberManager;
- NNet::TAddressResolverConfigPtr AddressResolver;
- NBus::TTcpDispatcherConfigPtr TcpDispatcher;
- NPipes::TIODispatcherConfigPtr IODispatcher;
- NRpc::TDispatcherConfigPtr RpcDispatcher;
- NRpc::NGrpc::TDispatcherConfigPtr GrpcDispatcher;
- NServiceDiscovery::NYP::TServiceDiscoveryConfigPtr YPServiceDiscovery;
- NLogging::TLogManagerConfigPtr Logging;
- NTracing::TJaegerTracerConfigPtr Jaeger;
- NTCMalloc::TTCMallocConfigPtr TCMalloc;
- TStockpileConfigPtr Stockpile;
- bool EnableRefCountedTrackerProfiling;
- NProfiling::TResourceTrackerConfigPtr ResourceTracker;
- THeapProfilerConfigPtr HeapProfiler;
- NYson::TProtobufInteropConfigPtr ProtobufInterop;
-
- REGISTER_YSON_STRUCT(TSingletonsConfig);
-
- static void Register(TRegistrar registrar);
-};
-
-DEFINE_REFCOUNTED_TYPE(TSingletonsConfig)
-
-////////////////////////////////////////////////////////////////////////////////
-
-class TSingletonsDynamicConfig
- : public virtual NYTree::TYsonStruct
-{
-public:
- NConcurrency::TFiberManagerDynamicConfigPtr FiberManager;
- NBus::TTcpDispatcherDynamicConfigPtr TcpDispatcher;
- NPipes::TIODispatcherConfigPtr IODispatcher;
- NRpc::TDispatcherDynamicConfigPtr RpcDispatcher;
- NLogging::TLogManagerDynamicConfigPtr Logging;
- NTracing::TJaegerTracerDynamicConfigPtr Jaeger;
- NTCMalloc::TTCMallocConfigPtr TCMalloc;
- TStockpileDynamicConfigPtr Stockpile;
- NYson::TProtobufInteropDynamicConfigPtr ProtobufInterop;
-
- REGISTER_YSON_STRUCT(TSingletonsDynamicConfig);
-
- static void Register(TRegistrar registrar);
-};
-
-DEFINE_REFCOUNTED_TYPE(TSingletonsDynamicConfig)
-
-////////////////////////////////////////////////////////////////////////////////
-
// NB: These functions should not be called from bootstrap
// config validator since logger is not set up yet.
void WarnForUnrecognizedOptions(
diff --git a/yt/yt/library/program/helpers.cpp b/yt/yt/library/program/helpers.cpp
index b46bdd9786..1911b327b5 100644
--- a/yt/yt/library/program/helpers.cpp
+++ b/yt/yt/library/program/helpers.cpp
@@ -1,124 +1,37 @@
#include "helpers.h"
#include "config.h"
-#include "private.h"
-
-#include <yt/yt/core/misc/lazy_ptr.h>
-#include <yt/yt/core/misc/ref_counted_tracker.h>
-#include <yt/yt/core/misc/ref_counted_tracker_profiler.h>
-
-#include <yt/yt/core/bus/tcp/dispatcher.h>
-
-#include <yt/yt/core/concurrency/fiber_manager.h>
-
-#include <yt/yt/library/tracing/jaeger/tracer.h>
#include <yt/yt/library/profiling/perf/event_counter_profiler.h>
-#include <yt/yt/library/profiling/resource_tracker/resource_tracker.h>
-
-#include <yt/yt/library/tcmalloc/tcmalloc_manager.h>
+#include <yt/yt/core/misc/ref_counted_tracker_profiler.h>
#include <yt/yt/core/logging/log_manager.h>
-#include <yt/yt/core/concurrency/execution_stack.h>
-#include <yt/yt/core/concurrency/fiber_scheduler_thread.h>
-#include <yt/yt/core/concurrency/periodic_executor.h>
-
#include <yt/yt/core/net/address.h>
-#include <yt/yt/core/yson/protobuf_interop.h>
-
-#include <yt/yt/core/rpc/dispatcher.h>
-#include <yt/yt/core/rpc/grpc/dispatcher.h>
-
-#include <yt/yt/core/service_discovery/yp/service_discovery.h>
-
-#include <library/cpp/yt/memory/atomic_intrusive_ptr.h>
-
-#include <util/string/split.h>
-#include <util/system/thread.h>
-
-#include <mutex>
-#include <thread>
-
namespace NYT {
-using namespace NConcurrency;
-using namespace NThreading;
-using namespace NTCMalloc;
-
////////////////////////////////////////////////////////////////////////////////
void ConfigureSingletons(const TSingletonsConfigPtr& config)
{
- TFiberManager::Configure(config->FiberManager);
+ TSingletonManager::Configure(config);
+ // TODO(babenko): move to server program base
NLogging::TLogManager::Get()->EnableReopenOnSighup();
- if (!NLogging::TLogManager::Get()->IsConfiguredFromEnv()) {
- NLogging::TLogManager::Get()->Configure(config->Logging);
- }
- NNet::TAddressResolver::Get()->Configure(config->AddressResolver);
// By default, server components must have a reasonable FQDN.
// Failure to do so may result in issues like YT-4561.
+ // TODO(babenko): move to server program base
NNet::TAddressResolver::Get()->EnsureLocalHostName();
- NBus::TTcpDispatcher::Get()->Configure(config->TcpDispatcher);
-
- NPipes::TIODispatcher::Get()->Configure(config->IODispatcher);
-
- NRpc::TDispatcher::Get()->Configure(config->RpcDispatcher);
-
- NRpc::NGrpc::TDispatcher::Get()->Configure(config->GrpcDispatcher);
-
- NRpc::TDispatcher::Get()->SetServiceDiscovery(
- NServiceDiscovery::NYP::CreateServiceDiscovery(config->YPServiceDiscovery));
-
- NTracing::SetGlobalTracer(New<NTracing::TJaegerTracer>(config->Jaeger));
-
+ // TODO(babenko): move to server program base
NProfiling::EnablePerfEventCounterProfiling();
-
- NTCMalloc::TTCMallocManager::Configure(config->TCMalloc);
-
- TStockpileManager::Reconfigure(*config->Stockpile);
-
- if (config->EnableRefCountedTrackerProfiling) {
- EnableRefCountedTrackerProfiling();
- }
-
- NProfiling::TResourceTracker::Configure(config->ResourceTracker);
-
- NYson::SetProtobufInteropConfig(config->ProtobufInterop);
}
-void ReconfigureSingletons(const TSingletonsConfigPtr& config, const TSingletonsDynamicConfigPtr& dynamicConfig)
+void ReconfigureSingletons(const TSingletonsDynamicConfigPtr& dynamicConfig)
{
- TFiberManager::Configure(config->FiberManager->ApplyDynamic(dynamicConfig->FiberManager));
-
- if (!NLogging::TLogManager::Get()->IsConfiguredFromEnv()) {
- NLogging::TLogManager::Get()->Configure(
- config->Logging->ApplyDynamic(dynamicConfig->Logging),
- /*sync*/ false);
- }
-
- auto tracer = NTracing::GetGlobalTracer();
- if (auto jaeger = DynamicPointerCast<NTracing::TJaegerTracer>(tracer); jaeger) {
- jaeger->Configure(config->Jaeger->ApplyDynamic(dynamicConfig->Jaeger));
- }
-
- NBus::TTcpDispatcher::Get()->Configure(config->TcpDispatcher->ApplyDynamic(dynamicConfig->TcpDispatcher));
-
- NPipes::TIODispatcher::Get()->Configure(dynamicConfig->IODispatcher ? dynamicConfig->IODispatcher : config->IODispatcher);
-
- NRpc::TDispatcher::Get()->Configure(config->RpcDispatcher->ApplyDynamic(dynamicConfig->RpcDispatcher));
-
- NTCMalloc::TTCMallocManager::Configure(dynamicConfig->TCMalloc
- ? config->TCMalloc->ApplyDynamic(dynamicConfig->TCMalloc)
- : config->TCMalloc);
-
- TStockpileManager::Reconfigure(*config->Stockpile->ApplyDynamic(dynamicConfig->Stockpile));
-
- NYson::SetProtobufInteropConfig(config->ProtobufInterop->ApplyDynamic(dynamicConfig->ProtobufInterop));
+ TSingletonManager::Reconfigure(dynamicConfig);
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/library/program/helpers.h b/yt/yt/library/program/helpers.h
index 7cbf696109..7d0842179d 100644
--- a/yt/yt/library/program/helpers.h
+++ b/yt/yt/library/program/helpers.h
@@ -7,9 +7,7 @@ namespace NYT {
////////////////////////////////////////////////////////////////////////////////
void ConfigureSingletons(const TSingletonsConfigPtr& config);
-void ReconfigureSingletons(
- const TSingletonsConfigPtr& config,
- const TSingletonsDynamicConfigPtr& dynamicConfig);
+void ReconfigureSingletons(const TSingletonsDynamicConfigPtr& dynamicConfig);
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/library/program/program.cpp b/yt/yt/library/program/program.cpp
index ff74660266..5c13a6d09c 100644
--- a/yt/yt/library/program/program.cpp
+++ b/yt/yt/library/program/program.cpp
@@ -18,8 +18,6 @@
#include <yt/yt/library/profiling/tcmalloc/profiler.h>
-#include <library/cpp/yt/stockpile/stockpile.h>
-
#include <library/cpp/yt/system/exit.h>
#include <library/cpp/yt/backtrace/absl_unwinder/absl_unwinder.h>
diff --git a/yt/yt/library/program/program.h b/yt/yt/library/program/program.h
index cd8bf61554..1f47ce93b7 100644
--- a/yt/yt/library/program/program.h
+++ b/yt/yt/library/program/program.h
@@ -2,8 +2,6 @@
#include <yt/yt/core/misc/public.h>
-#include <library/cpp/yt/stockpile/stockpile.h>
-
#include <library/cpp/getopt/last_getopt.h>
#include <yt/yt/core/yson/string.h>
diff --git a/yt/yt/library/program/public.h b/yt/yt/library/program/public.h
index 34231b1373..e45512239b 100644
--- a/yt/yt/library/program/public.h
+++ b/yt/yt/library/program/public.h
@@ -8,8 +8,6 @@ namespace NYT {
DECLARE_REFCOUNTED_CLASS(TBuildInfo)
DECLARE_REFCOUNTED_CLASS(TRpcConfig)
-DECLARE_REFCOUNTED_CLASS(TSingletonsConfig)
-DECLARE_REFCOUNTED_CLASS(TSingletonsDynamicConfig)
DECLARE_REFCOUNTED_CLASS(THeapSizeLimitConfig)
DECLARE_REFCOUNTED_CLASS(THeapProfilerConfig)
diff --git a/yt/yt/library/program/ya.make b/yt/yt/library/program/ya.make
index 5e07ac0d66..eac249a168 100644
--- a/yt/yt/library/program/ya.make
+++ b/yt/yt/library/program/ya.make
@@ -15,19 +15,12 @@ SRCS(
PEERDIR(
yt/yt/core
- yt/yt/core/service_discovery/yp
- yt/yt/library/monitoring
- yt/yt/library/oom
- yt/yt/library/profiling/solomon
yt/yt/library/profiling/tcmalloc
yt/yt/library/profiling/perf
- yt/yt/library/stockpile
yt/yt/library/ytprof
- yt/yt/library/tcmalloc
- yt/yt/library/tracing/jaeger
- library/cpp/yt/mlock
- library/cpp/yt/stockpile
+ yt/yt/library/tcmalloc # for tcmalloc singleton
library/cpp/yt/string
+ library/cpp/yt/system
library/cpp/yt/backtrace/absl_unwinder
library/cpp/getopt/small
)
diff --git a/yt/yt/library/stockpile/config.cpp b/yt/yt/library/stockpile/config.cpp
deleted file mode 100644
index 4a2fc69971..0000000000
--- a/yt/yt/library/stockpile/config.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#include "config.h"
-
-namespace NYT {
-
-using namespace NYTree;
-
-////////////////////////////////////////////////////////////////////////////////
-
-void TStockpileConfig::Register(TRegistrar registrar)
-{
- registrar.BaseClassParameter("buffer_size", &TThis::BufferSize)
- .Default(DefaultBufferSize)
- .GreaterThan(0);
- registrar.BaseClassParameter("thread_count", &TThis::ThreadCount)
- .Default(DefaultThreadCount);
- registrar.BaseClassParameter("strategy", &TThis::Strategy)
- .Default(DefaultStrategy);
- registrar.BaseClassParameter("period", &TThis::Period)
- .Default(DefaultPeriod);
-}
-
-TStockpileConfigPtr TStockpileConfig::ApplyDynamic(const TStockpileDynamicConfigPtr& dynamicConfig) const
-{
- auto mergedConfig = CloneYsonStruct(MakeStrong(this));
-
- if (dynamicConfig->BufferSize) {
- mergedConfig->BufferSize = *dynamicConfig->BufferSize;
- }
- if (dynamicConfig->ThreadCount) {
- mergedConfig->ThreadCount = *dynamicConfig->ThreadCount;
- }
- if (dynamicConfig->Strategy) {
- mergedConfig->Strategy = *dynamicConfig->Strategy;
- }
- if (dynamicConfig->Period) {
- mergedConfig->Period = *dynamicConfig->Period;
- }
-
- mergedConfig->Postprocess();
- return mergedConfig;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-void TStockpileDynamicConfig::Register(TRegistrar registrar)
-{
- registrar.BaseClassParameter("buffer_size", &TThis::BufferSize)
- .Optional()
- .GreaterThan(0);
- registrar.BaseClassParameter("thread_count", &TThis::ThreadCount)
- .Optional()
- .GreaterThanOrEqual(0);
- registrar.BaseClassParameter("strategy", &TThis::Strategy)
- .Optional();
- registrar.BaseClassParameter("period", &TThis::Period)
- .Optional();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT
diff --git a/yt/yt/library/stockpile/config.h b/yt/yt/library/stockpile/config.h
deleted file mode 100644
index 7d12b5bfa4..0000000000
--- a/yt/yt/library/stockpile/config.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#pragma once
-
-#include "public.h"
-
-#include <yt/yt/core/ytree/yson_struct.h>
-
-#include <library/cpp/yt/stockpile/stockpile.h>
-
-namespace NYT {
-
-////////////////////////////////////////////////////////////////////////////////
-
-struct TStockpileConfig
- : public TStockpileOptions
- , public NYTree::TYsonStruct
-{
- TStockpileConfigPtr ApplyDynamic(const TStockpileDynamicConfigPtr& dynamicConfig) const;
-
- REGISTER_YSON_STRUCT(TStockpileConfig);
-
- static void Register(TRegistrar registrar);
-};
-
-DEFINE_REFCOUNTED_TYPE(TStockpileConfig)
-
-////////////////////////////////////////////////////////////////////////////////
-
-struct TStockpileDynamicConfig
- : public NYTree::TYsonStruct
-{
- std::optional<i64> BufferSize;
- std::optional<int> ThreadCount;
- std::optional<EStockpileStrategy> Strategy;
- std::optional<TDuration> Period;
-
- REGISTER_YSON_STRUCT(TStockpileDynamicConfig);
-
- static void Register(TRegistrar registrar);
-};
-
-DEFINE_REFCOUNTED_TYPE(TStockpileDynamicConfig)
-
-////////////////////////////////////////////////////////////////////////////////
-
-} // namespace NYT
diff --git a/yt/yt/library/stockpile/ya.make b/yt/yt/library/stockpile/ya.make
deleted file mode 100644
index 9529fab0fb..0000000000
--- a/yt/yt/library/stockpile/ya.make
+++ /dev/null
@@ -1,14 +0,0 @@
-LIBRARY()
-
-INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
-
-SRCS(
- config.cpp
-)
-
-PEERDIR(
- yt/yt/core
- library/cpp/yt/stockpile
-)
-
-END()
diff --git a/yt/yt/library/tcmalloc/configure_tcmalloc_manager.cpp b/yt/yt/library/tcmalloc/configure_tcmalloc_manager.cpp
new file mode 100644
index 0000000000..d5947bf185
--- /dev/null
+++ b/yt/yt/library/tcmalloc/configure_tcmalloc_manager.cpp
@@ -0,0 +1,36 @@
+#include "tcmalloc_manager.h"
+#include "config.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NTCMalloc {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TTCMallocConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TTCMallocConfigPtr& config)
+{
+ TTCMallocManager::Configure(config);
+}
+
+void ReconfigureSingleton(
+ const TTCMallocConfigPtr& config,
+ const TTCMallocConfigPtr& dynamicConfig)
+{
+ TTCMallocManager::Configure(config->ApplyDynamic(dynamicConfig));
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "tcmalloc",
+ TTCMallocConfig,
+ TTCMallocConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NTCMalloc
diff --git a/yt/yt/library/tcmalloc/public.h b/yt/yt/library/tcmalloc/public.h
index 620be42454..f6703f918c 100644
--- a/yt/yt/library/tcmalloc/public.h
+++ b/yt/yt/library/tcmalloc/public.h
@@ -1,6 +1,8 @@
#pragma once
-#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
+#include <library/cpp/yt/memory/ref_counted.h>
namespace NYT::NTCMalloc {
@@ -9,6 +11,8 @@ namespace NYT::NTCMalloc {
DECLARE_REFCOUNTED_STRUCT(TTCMallocConfig)
DECLARE_REFCOUNTED_STRUCT(THeapSizeLimitConfig)
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TTCMallocConfig, TTCMallocConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NTCMalloc
diff --git a/yt/yt/library/tcmalloc/ya.make b/yt/yt/library/tcmalloc/ya.make
index 4042a08971..35e68d60f8 100644
--- a/yt/yt/library/tcmalloc/ya.make
+++ b/yt/yt/library/tcmalloc/ya.make
@@ -5,6 +5,7 @@ INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
SRCS(
config.cpp
tcmalloc_manager.cpp
+ GLOBAL configure_tcmalloc_manager.cpp
)
PEERDIR(
diff --git a/yt/yt/library/tracing/jaeger/configure_tracer.cpp b/yt/yt/library/tracing/jaeger/configure_tracer.cpp
new file mode 100644
index 0000000000..376e8ea9a4
--- /dev/null
+++ b/yt/yt/library/tracing/jaeger/configure_tracer.cpp
@@ -0,0 +1,43 @@
+#include "tracer.h"
+
+#include <yt/yt/core/misc/configurable_singleton_def.h>
+
+namespace NYT::NTracing {
+
+using namespace NYTree;
+
+////////////////////////////////////////////////////////////////////////////////
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TJaegerTracerConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void SetupSingletonConfigParameter(TYsonStructParameter<TJaegerTracerDynamicConfigPtr>& parameter)
+{
+ parameter.DefaultNew();
+}
+
+void ConfigureSingleton(const TJaegerTracerConfigPtr& config)
+{
+ SetGlobalTracer(New<TJaegerTracer>(config));
+}
+
+void ReconfigureSingleton(
+ const TJaegerTracerConfigPtr& config,
+ const TJaegerTracerDynamicConfigPtr& dynamicConfig)
+{
+ auto tracer = NTracing::GetGlobalTracer();
+ auto jaegerTracer = DynamicPointerCast<NTracing::TJaegerTracer>(tracer);
+ YT_VERIFY(jaegerTracer);
+ jaegerTracer->Configure(config->ApplyDynamic(dynamicConfig));
+}
+
+YT_DEFINE_RECONFIGURABLE_SINGLETON(
+ "jaeger",
+ TJaegerTracerConfig,
+ TJaegerTracerDynamicConfig);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NTracing
diff --git a/yt/yt/library/tracing/jaeger/public.h b/yt/yt/library/tracing/jaeger/public.h
index 1d9506cacf..9eeaead1d9 100644
--- a/yt/yt/library/tracing/jaeger/public.h
+++ b/yt/yt/library/tracing/jaeger/public.h
@@ -1,6 +1,8 @@
#pragma once
-#include <yt/yt/core/misc/public.h>
+#include <yt/yt/core/misc/configurable_singleton_decl.h>
+
+#include <library/cpp/yt/memory/ref_counted.h>
namespace NYT::NTracing {
@@ -12,6 +14,8 @@ DECLARE_REFCOUNTED_CLASS(TSamplerConfig)
DECLARE_REFCOUNTED_CLASS(TJaegerTracerDynamicConfig)
DECLARE_REFCOUNTED_CLASS(TJaegerTracerConfig)
+YT_DECLARE_RECONFIGURABLE_SINGLETON(TJaegerTracerConfig, TJaegerTracerDynamicConfig);
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NTracing
diff --git a/yt/yt/library/tracing/jaeger/tracer.cpp b/yt/yt/library/tracing/jaeger/tracer.cpp
index 090f413790..f29a8be167 100644
--- a/yt/yt/library/tracing/jaeger/tracer.cpp
+++ b/yt/yt/library/tracing/jaeger/tracer.cpp
@@ -1,3 +1,4 @@
+
#include "tracer.h"
#include "private.h"
diff --git a/yt/yt/library/tracing/jaeger/ya.make b/yt/yt/library/tracing/jaeger/ya.make
index b85e518305..14f1877294 100644
--- a/yt/yt/library/tracing/jaeger/ya.make
+++ b/yt/yt/library/tracing/jaeger/ya.make
@@ -10,8 +10,10 @@ PEERDIR(
SRCS(
model.proto
+
sampler.cpp
- GLOBAL tracer.cpp
+ tracer.cpp
+ GLOBAL configure_tracer.cpp
)
END()
diff --git a/yt/yt/library/tvm/service/unittests/ya.make b/yt/yt/library/tvm/service/unittests/ya.make
deleted file mode 100644
index 23ac522bd0..0000000000
--- a/yt/yt/library/tvm/service/unittests/ya.make
+++ /dev/null
@@ -1,19 +0,0 @@
-GTEST(unittester-library-auth_tvm)
-
-INCLUDE(${ARCADIA_ROOT}/yt/opensource.inc)
-
-PEERDIR(
- yt/yt/build
-
- yt/yt/core/test_framework
-
- yt/yt/library/tvm/service
-)
-
-EXPLICIT_DATA()
-
-IF(NOT OPENSOURCE)
- INCLUDE(ya_non_opensource.inc)
-ENDIF()
-
-END()