diff --git a/.gitignore b/.gitignore index 4d984534a..607453a5d 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ bin # sigs dir is handled externally signatures +# but not the regression tests +!tools/hscollider/test_cases/signatures # ignore pcre symlink if it exists pcre diff --git a/CHANGELOG.md b/CHANGELOG.md index 97b311e8b..b2c69b7a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ This is a list of notable changes to Hyperscan, in reverse chronological order. +## [4.7.0] 2018-01-24 +- Introduced hscollider pattern testing tool, for validating Hyperscan match + behaviour against PCRE. +- Introduced hscheck pattern compilation tool. +- Introduced hsdump development tool for producing information about Hyperscan + pattern compilation. +- New API feature: extended approximate matching support for Hamming distance. +- Bugfix for issue #69: Force C++ linkage in Xcode. +- Bugfix for issue #73: More documentation for `hs_close_stream()`. +- Bugfix for issue #78: Fix for fat runtime initialisation when used as a + shared library. + ## [4.6.0] 2017-09-22 - New API feature: stream state compression. This allows the user to compress and restore state for streams to reduce memory usage. diff --git a/CMakeLists.txt b/CMakeLists.txt index 59a3292b8..56f17c5b2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 2.8.11) project (hyperscan C CXX) set (HS_MAJOR_VERSION 4) -set (HS_MINOR_VERSION 6) +set (HS_MINOR_VERSION 7) set (HS_PATCH_VERSION 0) set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION}) @@ -30,7 +30,7 @@ else() message(STATUS "Build type ${CMAKE_BUILD_TYPE}") endif() -if(CMAKE_BUILD_TYPE MATCHES RELEASE|RELWITHDEBINFO) +if(CMAKE_BUILD_TYPE MATCHES RELEASE|RELWITHDEBINFO|MINSIZEREL) set(RELEASE_BUILD TRUE) else() set(RELEASE_BUILD FALSE) @@ -218,8 +218,13 @@ else() endif() if(OPTIMISE) - set(OPT_C_FLAG "-O3") - set(OPT_CXX_FLAG "-O2") + if (NOT CMAKE_BUILD_TYPE MATCHES MINSIZEREL) + set(OPT_C_FLAG "-O3") + set(OPT_CXX_FLAG "-O2") + else () + set(OPT_C_FLAG "-Os") + set(OPT_CXX_FLAG "-Os") + endif () else() set(OPT_C_FLAG "-O0") set(OPT_CXX_FLAG "-O0") @@ -423,10 +428,10 @@ endif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") if(NOT WIN32) if(CMAKE_C_COMPILER_ID MATCHES "Intel") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable=remark") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable 279 -diag-disable=remark") endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Intel") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable 1170 -diag-disable 3373 -diag-disable=remark") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable 1170 -diag-disable 3373 -diag-disable 279 -diag-disable=remark") endif() endif() @@ -1271,25 +1276,42 @@ if (NOT BUILD_SHARED_LIBS) endif() if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS) + set(hs_shared_SRCS + src/hs_version.c + src/hs_valid_platform.c + $) + + if (XCODE) + # force this lib to use C++ linkage + add_custom_command(OUTPUT empty.cxx + COMMAND ${CMAKE_COMMAND} -E touch empty.cxx) + set (hs_shared_SRCS ${hs_shared_SRCS} empty.cxx) + endif (XCODE) + if (NOT FAT_RUNTIME) - add_library(hs_shared SHARED src/hs_version.c src/hs_valid_platform.c - $ $) - else() - add_library(hs_shared SHARED src/hs_version.c src/hs_valid_platform.c - $ $ + set(hs_shared_SRCS + ${hs_shared_SRCS} + $) + else () + set(hs_shared_SRCS + ${hs_shared_SRCS} + $ ${RUNTIME_SHLIBS}) + endif () + + add_library(hs_shared SHARED ${hs_shared_SRCS}) - endif() add_dependencies(hs_shared ragel_Parser) set_target_properties(hs_shared PROPERTIES OUTPUT_NAME hs VERSION ${LIB_VERSION} SOVERSION ${LIB_SOVERSION} MACOSX_RPATH ON) -install(TARGETS hs_shared - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + + install(TARGETS hs_shared + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() # used by tools and other targets diff --git a/cmake/pcre.cmake b/cmake/pcre.cmake new file mode 100644 index 000000000..acad45bdd --- /dev/null +++ b/cmake/pcre.cmake @@ -0,0 +1,64 @@ +# first look in pcre-$version or pcre subdirs +if (PCRE_SOURCE) + # either provided on cmdline or we've seen it already + set (PCRE_BUILD_SOURCE TRUE) +elseif (EXISTS ${PROJECT_SOURCE_DIR}/pcre-${PCRE_REQUIRED_VERSION}) + set (PCRE_SOURCE ${PROJECT_SOURCE_DIR}/pcre-${PCRE_REQUIRED_VERSION}) + set (PCRE_BUILD_SOURCE TRUE) +elseif (EXISTS ${PROJECT_SOURCE_DIR}/pcre) + set (PCRE_SOURCE ${PROJECT_SOURCE_DIR}/pcre) + set (PCRE_BUILD_SOURCE TRUE) +endif() + +if (PCRE_BUILD_SOURCE) + if (NOT IS_ABSOLUTE ${PCRE_SOURCE}) + set(PCRE_SOURCE "${CMAKE_BINARY_DIR}/${PCRE_SOURCE}") + endif () + set (saved_INCLUDES "${CMAKE_REQUIRED_INCLUDES}") + set (CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} ${PCRE_SOURCE}") + + if (PCRE_CHECKED) + set(PCRE_INCLUDE_DIRS ${PCRE_SOURCE} ${PROJECT_BINARY_DIR}/pcre) + set(PCRE_LDFLAGS -L"${LIBDIR}" -lpcre) + + # already processed this file and set up pcre building + return() + endif () + + # first, check version number + CHECK_C_SOURCE_COMPILES("#include + #if PCRE_MAJOR != ${PCRE_REQUIRED_MAJOR_VERSION} || PCRE_MINOR != ${PCRE_REQUIRED_MINOR_VERSION} + #error Incorrect pcre version + #endif + main() {}" CORRECT_PCRE_VERSION) + set (CMAKE_REQUIRED_INCLUDES "${saved_INCLUDES}") + + if (NOT CORRECT_PCRE_VERSION) + unset(CORRECT_PCRE_VERSION CACHE) + message(STATUS "Incorrect version of pcre - version ${PCRE_REQUIRED_VERSION} is required") + return () + else() + message(STATUS "PCRE version ${PCRE_REQUIRED_VERSION} - building from source.") + endif() + + # PCRE compile options + option(PCRE_BUILD_PCRECPP OFF) + option(PCRE_BUILD_PCREGREP OFF) + option(PCRE_SHOW_REPORT OFF) + set(PCRE_SUPPORT_UNICODE_PROPERTIES ON CACHE BOOL "Build pcre with unicode") + add_subdirectory(${PCRE_SOURCE} ${PROJECT_BINARY_DIR}/pcre EXCLUDE_FROM_ALL) + set(PCRE_INCLUDE_DIRS ${PCRE_SOURCE} ${PROJECT_BINARY_DIR}/pcre) + set(PCRE_LDFLAGS -L"${LIBDIR}" -lpcre) +else () + # pkgconf should save us + find_package(PkgConfig) + pkg_check_modules(PCRE libpcre=${PCRE_REQUIRED_VERSION}) + if (PCRE_FOUND) + message(STATUS "PCRE version ${PCRE_REQUIRED_VERSION}") + else () + message(STATUS "PCRE version ${PCRE_REQUIRED_VERSION} not found") + return () + endif () +endif (PCRE_BUILD_SOURCE) + +set (PCRE_CHECKED TRUE PARENT_SCOPE) diff --git a/cmake/sqlite3.cmake b/cmake/sqlite3.cmake index cbe17c6d4..a58362da7 100644 --- a/cmake/sqlite3.cmake +++ b/cmake/sqlite3.cmake @@ -44,7 +44,7 @@ else() # build sqlite as a static lib to compile into our test programs add_library(sqlite3_static STATIC "${PROJECT_SOURCE_DIR}/sqlite3/sqlite3.c") if (NOT WIN32) - set_target_properties(sqlite3_static PROPERTIES COMPILE_FLAGS "-Wno-unused -Wno-cast-qual -DSQLITE_OMIT_LOAD_EXTENSION") + set_target_properties(sqlite3_static PROPERTIES COMPILE_FLAGS "-Wno-error -Wno-extra -Wno-unused -Wno-cast-qual -DSQLITE_OMIT_LOAD_EXTENSION") endif() endif() endif() diff --git a/doc/dev-reference/_static/hyperscan.css b/doc/dev-reference/_static/hyperscan.css index 581314ac2..c39ddd8d8 100644 --- a/doc/dev-reference/_static/hyperscan.css +++ b/doc/dev-reference/_static/hyperscan.css @@ -2,3 +2,9 @@ .regexp { color: darkred !important; } + +/* Avoid (the alabaster theme default) Goudy Old Style, which renders in + * italics on some Mac/Safari systems. */ +body { + font-family: 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; +} diff --git a/doc/dev-reference/compilation.rst b/doc/dev-reference/compilation.rst index 6b6d972a3..df3041875 100644 --- a/doc/dev-reference/compilation.rst +++ b/doc/dev-reference/compilation.rst @@ -287,6 +287,7 @@ which provides the following fields: * ``min_length``: The minimum match length (from start to end) required to successfully match this expression. * ``edit_distance``: Match this expression within a given Levenshtein distance. +* ``hamming_distance``: Match this expression within a given Hamming distance. These parameters either allow the set of matches produced by a pattern to be constrained at compile time (rather than relying on the application to process @@ -299,10 +300,15 @@ and a ``max_offset`` of 15 will not produce matches when scanned against streams ``foo0123bar`` or ``foo0123456bar``. Similarly, the pattern :regexp:`/foobar/` when given an ``edit_distance`` of 2 -will produce matches when scanned against ``foobar``, ``fooba``, ``fobr``, -``fo_baz``, ``foooobar``, and anything else that lies within edit distance of 2 -(as defined by Levenshtein distance). For more details, see the -:ref:`approximate_matching` section. +will produce matches when scanned against ``foobar``, ``f00bar``, ``fooba``, +``fobr``, ``fo_baz``, ``foooobar``, and anything else that lies within edit +distance of 2 (as defined by Levenshtein distance). + +When the same pattern :regexp:`/foobar/` is given a ``hamming_distance`` of 2, +it will produce matches when scanned against ``foobar``, ``boofar``, +``f00bar``, and anything else with at most two characters substituted from the +original pattern. For more details, see the :ref:`approximate_matching` +section. ================= Prefiltering Mode @@ -377,7 +383,7 @@ The :c:type:`hs_platform_info_t` structure has two fields: #. ``cpu_features``: This allows the application to specify a mask of CPU features that may be used on the target platform. For example, :c:member:`HS_CPU_FEATURES_AVX2` can be specified for Intel\ |reg| Advanced - Vector Extensions +2 (Intel\ |reg| AVX2) instruction set support. If a flag + Vector Extensions 2 (Intel\ |reg| AVX2) instruction set support. If a flag for a particular CPU feature is specified, the database will not be usable on a CPU without that feature. @@ -398,13 +404,20 @@ follows: #. **Edit distance** is defined as Levenshtein distance. That is, there are three possible edit types considered: insertion, removal and substitution. - More formal description can be found on - `Wikipedia `_. + A more formal description can be found on + `Wikipedia `__. + +#. **Hamming distance** is the number of positions by which two strings of + equal length differ. That is, it is the number of substitutions required to + convert one string to the other. There are no insertions or removals when + approximate matching using a Hamming distance. A more formal description can + be found on + `Wikipedia `__. -#. **Approximate matching** will match all *corpora* within a given edit - distance. That is, given a pattern, approximate matching will match anything - that can be edited to arrive at a corpus that exactly matches the original - pattern. +#. **Approximate matching** will match all *corpora* within a given edit or + Hamming distance. That is, given a pattern, approximate matching will match + anything that can be edited to arrive at a corpus that exactly matches the + original pattern. #. **Matching semantics** are exactly the same as described in :ref:`semantics`. @@ -437,7 +450,9 @@ matching support. Here they are, in a nutshell: reduce to so-called "vacuous" patterns (patterns that match everything). For example, pattern :regexp:`/foo/` with edit distance 3, if implemented, would reduce to matching zero-length buffers. Such patterns will result in a - "Pattern cannot be approximately matched" compile error. + "Pattern cannot be approximately matched" compile error. Approximate + matching within a Hamming distance does not remove symbols, so will not + reduce to a vacuous pattern. * Finally, due to the inherent complexities of defining matching behavior, approximate matching implements a reduced subset of regular expression syntax. Approximate matching does not support UTF-8 (and other diff --git a/doc/dev-reference/conf.py.in b/doc/dev-reference/conf.py.in index 2daab3696..d0ef371b2 100644 --- a/doc/dev-reference/conf.py.in +++ b/doc/dev-reference/conf.py.in @@ -44,7 +44,7 @@ master_doc = 'index' # General information about the project. project = u'Hyperscan' -copyright = u'2015-2017, Intel Corporation' +copyright = u'2015-2018, Intel Corporation' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff --git a/doc/dev-reference/copyright.rst b/doc/dev-reference/copyright.rst index 9464382e6..656207504 100644 --- a/doc/dev-reference/copyright.rst +++ b/doc/dev-reference/copyright.rst @@ -30,4 +30,4 @@ and/or other countries. \*Other names and brands may be claimed as the property of others. -Copyright |copy| 2015-2017, Intel Corporation. All rights reserved. +Copyright |copy| 2015-2018, Intel Corporation. All rights reserved. diff --git a/doc/dev-reference/hyperscan.doxyfile.in b/doc/dev-reference/hyperscan.doxyfile.in index 9b4781695..a01739587 100644 --- a/doc/dev-reference/hyperscan.doxyfile.in +++ b/doc/dev-reference/hyperscan.doxyfile.in @@ -820,7 +820,7 @@ EXCLUDE_PATTERNS = # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = "HS_CDECL" # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include @@ -1959,7 +1959,7 @@ ENABLE_PREPROCESSING = YES # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -MACRO_EXPANSION = NO +MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then # the macro expansion is limited to the macros specified with the PREDEFINED and @@ -1967,7 +1967,7 @@ MACRO_EXPANSION = NO # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_ONLY_PREDEF = NO +EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. @@ -1999,7 +1999,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = "HS_CDECL=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/doc/dev-reference/runtime.rst b/doc/dev-reference/runtime.rst index dbfe7633f..d64ec540d 100644 --- a/doc/dev-reference/runtime.rst +++ b/doc/dev-reference/runtime.rst @@ -33,11 +33,21 @@ See :c:type:`match_event_handler` for more information. Streaming Mode ************** -The streaming runtime API consists of functions to open, scan, and close -Hyperscan data streams -- these functions being :c:func:`hs_open_stream`, -:c:func:`hs_scan_stream`, and :c:func:`hs_close_stream`. Any matches detected -in the written data are returned to the calling application via a function -pointer callback. +The core of the Hyperscan streaming runtime API consists of functions to open, +scan, and close Hyperscan data streams: + +* :c:func:`hs_open_stream`: allocates and initializes a new stream for scanning. + +* :c:func:`hs_scan_stream`: scans a block of data in a given stream, raising + matches as they are detected. + +* :c:func:`hs_close_stream`: completes scanning of a given stream (raising any + matches that occur at the end of the stream) and frees the stream state. After + a call to :c:func:`hs_close_stream`, the stream handle is invalid and should + not be used again for any purpose. + +Any matches detected in the data as it is scanned are returned to the calling +application via a function pointer callback. The match callback function has the capability to halt scanning of the current data stream by returning a non-zero value. In streaming mode, the result of diff --git a/doc/dev-reference/tools.rst b/doc/dev-reference/tools.rst index d2e7a06e0..9c2ce6eb5 100644 --- a/doc/dev-reference/tools.rst +++ b/doc/dev-reference/tools.rst @@ -6,6 +6,30 @@ Tools This section describes the set of utilities included with the Hyperscan library. +******************** +Quick Check: hscheck +******************** + +The ``hscheck`` tool allows the user to quickly check whether Hyperscan supports +a group of patterns. If a pattern is rejected by Hyperscan's compiler, the +compile error is provided on standard output. + +For example, given the following three patterns (the last of which contains a +syntax error) in a file called ``/tmp/test``:: + + 1:/foo.*bar/ + 2:/abc|def|ghi/ + 3:/((foo|bar)/ + +... the ``hscheck`` tool will produce the following output:: + + $ bin/hscheck -e /tmp/test + + OK: 1:/foo.*bar/ + OK: 2:/abc|def|ghi/ + FAIL (compile): 3:/((foo|bar)/: Missing close parenthesis for group started at index 0. + SUMMARY: 1 of 3 failed. + ******************** Benchmarker: hsbench ******************** @@ -62,6 +86,129 @@ to complete all of them. using a utility like ``taskset`` to lock the hsbench process to one core and minimize jitter due to the operating system's scheduler. +******************************* +Correctness Testing: hscollider +******************************* + +The ``hscollider`` tool, or Pattern Collider, provides a way to verify +Hyperscan's matching behaviour. It does this by compiling and scanning patterns +(either singly or in groups) against known corpora and comparing the results +against another engine (the "ground truth"). Two sources of ground truth for +comparison are available: + + * The PCRE library (http://pcre.org/). + * An NFA simulation run on Hyperscan's compile-time graph representation. This + is used if PCRE cannot support the pattern or if PCRE execution fails due to + a resource limit. + +Much of Hyperscan's testing infrastructure is built on ``hscollider``, and the +tool is designed to take advantage of multiple cores and provide considerable +flexibility in controlling the test. These options are described in the help +(``hscollider -h``) and include: + + * Testing in streaming, block or vectored mode. + * Testing corpora at different alignments in memory. + * Testing patterns in groups of varying size. + * Manipulating stream state or scratch space between tests. + * Cross-compilation and serialization/deserialization of databases. + * Synthetic generation of corpora given a pattern set. + +Using hscollider to debug a pattern +=================================== + +One common use-case for ``hscollider`` is to determine whether Hyperscan will +match a pattern in the expected location, and whether this accords with PCRE's +behaviour for the same case. + +Here is an example. We put our pattern in a file in Hyperscan's pattern +format:: + + $ cat /tmp/pat + 1:/hatstand.*badgerbrush/ + +We put the corpus to be scanned in another file, with the same numeric +identifier at the start to indicate that it should match pattern 1:: + + $ cat /tmp/corpus + 1:__hatstand__hatstand__badgerbrush_badgerbrush + +Then we can run ``hscollider`` with its verbosity turned up (``-vv``) so that +individual matches are displayed in the output:: + + $ bin/ue2collider -e /tmp/pat -c /tmp/corpus -Z 0 -T 1 -vv + ue2collider: The Pattern Collider Mark II + + Number of threads: 1 (1 scanner, 1 generator) + Expression path: /tmp/pat + Signature files: none + Mode of operation: block mode + UE2 scan alignment: 0 + Corpora read from file: /tmp/corpus + + Running single-pattern/single-compile test for 1 expressions. + + PCRE Match @ (2,45) + PCRE Match @ (2,33) + PCRE Match @ (12,45) + PCRE Match @ (12,33) + UE2 Match @ (0,33) for 1 + UE2 Match @ (0,45) for 1 + Scan call returned 0 + PASSED: id 1, alignment 0, corpus 0 (matched pcre:2, ue2:2) + Thread 0 processed 1 units. + + Summary: + Mode: Single/Block + ========= + Expressions processed: 1 + Corpora processed: 1 + Expressions with failures: 0 + Corpora generation failures: 0 + Compilation failures: pcre:0, ng:0, ue2:0 + Matching failures: pcre:0, ng:0, ue2:0 + Match differences: 0 + No ground truth: 0 + Total match differences: 0 + + Total elapsed time: 0.00522815 secs. + +We can see from this output that both PCRE and Hyperscan find matches ending at +offset 33 and 45, and so ``hscollider`` considers this test case to have +passed. + +(In the example command line above, ``-Z 0`` instructs us to only test at +corpus alignment 0, and ``-T 1`` instructs us to only use one thread.) + +.. note:: In default operation, PCRE produces only one match for a scan, unlike + Hyperscan's automata semantics. The ``hscollider`` tool uses libpcre's + "callout" functionality to match Hyperscan's semantics. + +Running a larger scan test +========================== + +A set of patterns for testing purposes are distributed with Hyperscan, and these +can be tested via ``hscollider`` on an in-tree build. Two CMake targets are +provided to do this easily: + +================================= ===================================== +Make Target Description +================================= ===================================== +``make collide_quick_test`` Tests all patterns in streaming mode. +``make collide_quick_test_block`` Tests all patterns in block mode. +================================= ===================================== + +***************** +Debugging: hsdump +***************** + +When built in debug mode (using the CMake directive ``CMAKE_BUILD_TYPE`` set to +``Debug``), Hyperscan includes support for dumping information about its +internals during pattern compilation with the ``hsdump`` tool. + +This information is mostly of use to Hyperscan developers familiar with the +library's internal structure, but can be used to diagnose issues with patterns +and provide more information in bug reports. + .. _tools_pattern_format: ************** diff --git a/src/compiler/compiler.cpp b/src/compiler/compiler.cpp index cce89e408..7affb08d3 100644 --- a/src/compiler/compiler.cpp +++ b/src/compiler/compiler.cpp @@ -78,7 +78,8 @@ void validateExt(const hs_expr_ext &ext) { static const unsigned long long ALL_EXT_FLAGS = HS_EXT_FLAG_MIN_OFFSET | HS_EXT_FLAG_MAX_OFFSET | HS_EXT_FLAG_MIN_LENGTH | - HS_EXT_FLAG_EDIT_DISTANCE; + HS_EXT_FLAG_EDIT_DISTANCE | + HS_EXT_FLAG_HAMMING_DISTANCE; if (ext.flags & ~ALL_EXT_FLAGS) { throw CompileError("Invalid hs_expr_ext flag set."); } @@ -96,6 +97,13 @@ void validateExt(const hs_expr_ext &ext) { throw CompileError("In hs_expr_ext, min_length must be less than or " "equal to max_offset."); } + + if ((ext.flags & HS_EXT_FLAG_EDIT_DISTANCE) && + (ext.flags & HS_EXT_FLAG_HAMMING_DISTANCE)) { + throw CompileError("In hs_expr_ext, cannot have both edit distance and " + "Hamming distance."); + } + } ParsedExpression::ParsedExpression(unsigned index_in, const char *expression, @@ -103,7 +111,7 @@ ParsedExpression::ParsedExpression(unsigned index_in, const char *expression, const hs_expr_ext *ext) : expr(index_in, flags & HS_FLAG_ALLOWEMPTY, flags & HS_FLAG_SINGLEMATCH, false, flags & HS_FLAG_PREFILTER, SOM_NONE, report, 0, MAX_OFFSET, - 0, 0) { + 0, 0, 0) { ParseMode mode(flags); component = parse(expression, mode); @@ -158,6 +166,9 @@ ParsedExpression::ParsedExpression(unsigned index_in, const char *expression, if (ext->flags & HS_EXT_FLAG_EDIT_DISTANCE) { expr.edit_distance = ext->edit_distance; } + if (ext->flags & HS_EXT_FLAG_HAMMING_DISTANCE) { + expr.hamm_distance = ext->hamming_distance; + } } // These are validated in validateExt, so an error will already have been diff --git a/src/compiler/expression_info.h b/src/compiler/expression_info.h index 7775f59e7..45d18cbfc 100644 --- a/src/compiler/expression_info.h +++ b/src/compiler/expression_info.h @@ -45,11 +45,13 @@ class ExpressionInfo { ExpressionInfo(unsigned int index_in, bool allow_vacuous_in, bool highlander_in, bool utf8_in, bool prefilter_in, som_type som_in, ReportID report_in, u64a min_offset_in, - u64a max_offset_in, u64a min_length_in, u32 edit_distance_in) + u64a max_offset_in, u64a min_length_in, u32 edit_distance_in, + u32 hamm_distance_in) : index(index_in), report(report_in), allow_vacuous(allow_vacuous_in), highlander(highlander_in), utf8(utf8_in), prefilter(prefilter_in), som(som_in), min_offset(min_offset_in), max_offset(max_offset_in), - min_length(min_length_in), edit_distance(edit_distance_in) {} + min_length(min_length_in), edit_distance(edit_distance_in), + hamm_distance(hamm_distance_in) {} /** * \brief Index of the expression represented by this graph. @@ -95,6 +97,7 @@ class ExpressionInfo { * 0 if not used. */ u32 edit_distance; + u32 hamm_distance; }; } diff --git a/src/dispatcher.c b/src/dispatcher.c index c37a984eb..70b82277a 100644 --- a/src/dispatcher.c +++ b/src/dispatcher.c @@ -30,7 +30,7 @@ #include "hs_common.h" #include "hs_runtime.h" #include "ue2common.h" -#include "util/cpuid_flags.h" +#include "util/cpuid_inline.h" #include "util/join.h" #if defined(DISABLE_AVX512_DISPATCH) diff --git a/src/hs.cpp b/src/hs.cpp index c2143fe31..04ffb479d 100644 --- a/src/hs.cpp +++ b/src/hs.cpp @@ -45,6 +45,7 @@ #include "parser/unsupported.h" #include "util/compile_error.h" #include "util/cpuid_flags.h" +#include "util/cpuid_inline.h" #include "util/depth.h" #include "util/popcount.h" #include "util/target_info.h" diff --git a/src/hs_common.h b/src/hs_common.h index e1f079f28..67aedb807 100644 --- a/src/hs_common.h +++ b/src/hs_common.h @@ -143,7 +143,7 @@ hs_error_t HS_CDECL hs_deserialize_database(const char *bytes, * by @ref hs_serialize_database() at a given memory location. * * This function (unlike @ref hs_deserialize_database()) will write the - * reconstructed database to the memory location given in the @a db parameter. + * reconstructed database to the memory location given in the @p db parameter. * The amount of space required at this location can be determined with the * @ref hs_serialized_database_size() function. * @@ -479,6 +479,10 @@ hs_error_t HS_CDECL hs_valid_platform(void); /** * A parameter passed to this function was invalid. + * + * This error is only returned in cases where the function can detect an + * invalid parameter -- it cannot be relied upon to detect (for example) + * pointers to freed memory or other invalid data. */ #define HS_INVALID (-1) diff --git a/src/hs_compile.h b/src/hs_compile.h index 3d5270443..dc9ba307c 100644 --- a/src/hs_compile.h +++ b/src/hs_compile.h @@ -258,6 +258,13 @@ typedef struct hs_expr_ext { * hs_expr_ext::flags field. */ unsigned edit_distance; + + /** + * Allow patterns to approximately match within this Hamming distance. To + * use this parameter, set the @ref HS_EXT_FLAG_HAMMING_DISTANCE flag in the + * hs_expr_ext::flags field. + */ + unsigned hamming_distance; } hs_expr_ext_t; /** @@ -281,6 +288,9 @@ typedef struct hs_expr_ext { /** Flag indicating that the hs_expr_ext::edit_distance field is used. */ #define HS_EXT_FLAG_EDIT_DISTANCE 8ULL +/** Flag indicating that the hs_expr_ext::hamming_distance field is used. */ +#define HS_EXT_FLAG_HAMMING_DISTANCE 16ULL + /** @} */ /** @@ -293,9 +303,9 @@ typedef struct hs_expr_ext { * @param expression * The NULL-terminated expression to parse. Note that this string must * represent ONLY the pattern to be matched, with no delimiters or flags; - * any global flags should be specified with the @a flags argument. For + * any global flags should be specified with the @p flags argument. For * example, the expression `/abc?def/i` should be compiled by providing - * `abc?def` as the @a expression, and @ref HS_FLAG_CASELESS as the @a + * `abc?def` as the @p expression, and @ref HS_FLAG_CASELESS as the @a * flags. * * @param flags @@ -362,8 +372,8 @@ hs_error_t HS_CDECL hs_compile(const char *expression, unsigned int flags, * hs_compile()) these strings must contain only the pattern to be * matched, with no delimiters or flags. For example, the expression * `/abc?def/i` should be compiled by providing `abc?def` as the first - * string in the @a expressions array, and @ref HS_FLAG_CASELESS as the - * first value in the @a flags array. + * string in the @p expressions array, and @ref HS_FLAG_CASELESS as the + * first value in the @p flags array. * * @param flags * Array of flags which modify the behaviour of each expression. Multiple @@ -418,7 +428,7 @@ hs_error_t HS_CDECL hs_compile(const char *expression, unsigned int flags, * * @return * @ref HS_SUCCESS is returned on successful compilation; @ref - * HS_COMPILER_ERROR on failure, with details provided in the @a error + * HS_COMPILER_ERROR on failure, with details provided in the @p error * parameter. * */ @@ -442,8 +452,8 @@ hs_error_t HS_CDECL hs_compile_multi(const char *const *expressions, * hs_compile()) these strings must contain only the pattern to be * matched, with no delimiters or flags. For example, the expression * `/abc?def/i` should be compiled by providing `abc?def` as the first - * string in the @a expressions array, and @ref HS_FLAG_CASELESS as the - * first value in the @a flags array. + * string in the @p expressions array, and @ref HS_FLAG_CASELESS as the + * first value in the @p flags array. * * @param flags * Array of flags which modify the behaviour of each expression. Multiple @@ -505,7 +515,7 @@ hs_error_t HS_CDECL hs_compile_multi(const char *const *expressions, * * @return * @ref HS_SUCCESS is returned on successful compilation; @ref - * HS_COMPILER_ERROR on failure, with details provided in the @a error + * HS_COMPILER_ERROR on failure, with details provided in the @p error * parameter. * */ @@ -549,9 +559,9 @@ hs_error_t HS_CDECL hs_free_compile_error(hs_compile_error_t *error); * @param expression * The NULL-terminated expression to parse. Note that this string must * represent ONLY the pattern to be matched, with no delimiters or flags; - * any global flags should be specified with the @a flags argument. For + * any global flags should be specified with the @p flags argument. For * example, the expression `/abc?def/i` should be compiled by providing - * `abc?def` as the @a expression, and @ref HS_FLAG_CASELESS as the @a + * `abc?def` as the @p expression, and @ref HS_FLAG_CASELESS as the @a * flags. * * @param flags @@ -611,9 +621,9 @@ hs_error_t HS_CDECL hs_expression_info(const char *expression, * @param expression * The NULL-terminated expression to parse. Note that this string must * represent ONLY the pattern to be matched, with no delimiters or flags; - * any global flags should be specified with the @a flags argument. For + * any global flags should be specified with the @p flags argument. For * example, the expression `/abc?def/i` should be compiled by providing - * `abc?def` as the @a expression, and @ref HS_FLAG_CASELESS as the @a + * `abc?def` as the @p expression, and @ref HS_FLAG_CASELESS as the @a * flags. * * @param flags diff --git a/src/hs_runtime.h b/src/hs_runtime.h index 98e500680..9bf674866 100644 --- a/src/hs_runtime.h +++ b/src/hs_runtime.h @@ -101,7 +101,7 @@ typedef struct hs_scratch hs_scratch_t; * - If the start of match value lies outside this horizon (possible only * when the SOM_HORIZON value is not @ref HS_MODE_SOM_HORIZON_LARGE), - * the @a from value will be set to @ref HS_OFFSET_PAST_HORIZON. + * the @p from value will be set to @ref HS_OFFSET_PAST_HORIZON. * - This argument will be set to zero if the Start of Match flag is not * enabled for the given pattern. @@ -193,6 +193,12 @@ hs_error_t HS_CDECL hs_scan_stream(hs_stream_t *id, const char *data, /** * Close a stream. * + * This function completes matching on the given stream and frees the memory + * associated with the stream state. After this call, the stream pointed to by + * @p id is invalid and can no longer be used. To reuse the stream state after + * completion, rather than closing it, the @ref hs_reset_stream function can be + * used. + * * This function must be called for any stream created with @ref * hs_open_stream(), even if scanning has been terminated by a non-zero return * from the match callback function. @@ -210,7 +216,7 @@ hs_error_t HS_CDECL hs_scan_stream(hs_stream_t *id, const char *data, * * @param scratch * A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is - * allowed to be NULL only if the @a onEvent callback is also NULL. + * allowed to be NULL only if the @p onEvent callback is also NULL. * * @param onEvent * Pointer to a match event callback function. If a NULL pointer is given, @@ -251,7 +257,7 @@ hs_error_t HS_CDECL hs_close_stream(hs_stream_t *id, hs_scratch_t *scratch, * * @param scratch * A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is - * allowed to be NULL only if the @a onEvent callback is also NULL. + * allowed to be NULL only if the @p onEvent callback is also NULL. * * @param onEvent * Pointer to a match event callback function. If a NULL pointer is given, @@ -287,7 +293,7 @@ hs_error_t HS_CDECL hs_copy_stream(hs_stream_t **to_id, /** * Duplicate the given 'from' stream state onto the 'to' stream. The 'to' stream - * will first be reset (reporting any EOD matches if a non-NULL @a onEvent + * will first be reset (reporting any EOD matches if a non-NULL @p onEvent * callback handler is provided). * * Note: the 'to' stream and the 'from' stream must be open against the same @@ -302,7 +308,7 @@ hs_error_t HS_CDECL hs_copy_stream(hs_stream_t **to_id, * * @param scratch * A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is - * allowed to be NULL only if the @a onEvent callback is also NULL. + * allowed to be NULL only if the @p onEvent callback is also NULL. * * @param onEvent * Pointer to a match event callback function. If a NULL pointer is given, @@ -325,10 +331,10 @@ hs_error_t HS_CDECL hs_reset_and_copy_stream(hs_stream_t *to_id, * Creates a compressed representation of the provided stream in the buffer * provided. This compressed representation can be converted back into a stream * state by using @ref hs_expand_stream() or @ref hs_reset_and_expand_stream(). - * The size of the compressed representation will be placed into @a used_space. + * The size of the compressed representation will be placed into @p used_space. * * If there is not sufficient space in the buffer to hold the compressed - * represention, @ref HS_INSUFFICIENT_SPACE will be returned and @a used_space + * representation, @ref HS_INSUFFICIENT_SPACE will be returned and @p used_space * will be populated with the amount of space required. * * Note: this function does not close the provided stream, you may continue to @@ -340,15 +346,15 @@ hs_error_t HS_CDECL hs_reset_and_copy_stream(hs_stream_t *to_id, * @param buf * Buffer to write the compressed representation into. Note: if the call is * just being used to determine the amount of space required, it is allowed - * to pass NULL here and @a buf_space as 0. + * to pass NULL here and @p buf_space as 0. * * @param buf_space - * The number of bytes in @a buf. If buf_space is too small, the call will + * The number of bytes in @p buf. If buf_space is too small, the call will * fail with @ref HS_INSUFFICIENT_SPACE. * * @param used_space * Pointer to where the amount of used space will be written to. The used - * buffer space is always less than or equal to @a buf_space. If the call + * buffer space is always less than or equal to @p buf_space. If the call * fails with @ref HS_INSUFFICIENT_SPACE, this pointer will be used to * write out the amount of buffer space required. * @@ -363,8 +369,8 @@ hs_error_t HS_CDECL hs_compress_stream(const hs_stream_t *stream, char *buf, * Decompresses a compressed representation created by @ref hs_compress_stream() * into a new stream. * - * Note: @a buf must correspond to a complete compressed representation created - * by @ref hs_compress_stream() of a stream that was opened against @a db. It is + * Note: @p buf must correspond to a complete compressed representation created + * by @ref hs_compress_stream() of a stream that was opened against @p db. It is * not always possible to detect misuse of this API and behaviour is undefined * if these properties are not satisfied. * @@ -393,19 +399,19 @@ hs_error_t HS_CDECL hs_expand_stream(const hs_database_t *db, /** * Decompresses a compressed representation created by @ref hs_compress_stream() * on top of the 'to' stream. The 'to' stream will first be reset (reporting - * any EOD matches if a non-NULL @a onEvent callback handler is provided). + * any EOD matches if a non-NULL @p onEvent callback handler is provided). * * Note: the 'to' stream must be opened against the same database as the * compressed stream. * - * Note: @a buf must correspond to a complete compressed representation created - * by @ref hs_compress_stream() of a stream that was opened against @a db. It is + * Note: @p buf must correspond to a complete compressed representation created + * by @ref hs_compress_stream() of a stream that was opened against @p db. It is * not always possible to detect misuse of this API and behaviour is undefined * if these properties are not satisfied. * * @param to_stream - * A pointer to the generated @ref hs_stream_t will be - * returned; NULL on failure. + * A pointer to a valid stream state. A pointer to the expanded @ref + * hs_stream_t will be returned; NULL on failure. * * @param buf * A compressed representation of a stream. These compressed forms are @@ -416,7 +422,7 @@ hs_error_t HS_CDECL hs_expand_stream(const hs_database_t *db, * * @param scratch * A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is - * allowed to be NULL only if the @a onEvent callback is also NULL. + * allowed to be NULL only if the @p onEvent callback is also NULL. * * @param onEvent * Pointer to a match event callback function. If a NULL pointer is given, @@ -492,7 +498,7 @@ hs_error_t HS_CDECL hs_scan(const hs_database_t *db, const char *data, * * @param count * Number of data blocks to scan. This should correspond to the size of - * of the @a data and @a length arrays. + * of the @p data and @p length arrays. * * @param flags * Flags modifying the behaviour of this function. This parameter is diff --git a/src/hs_valid_platform.c b/src/hs_valid_platform.c index 128ac04fd..59ad3f3ab 100644 --- a/src/hs_valid_platform.c +++ b/src/hs_valid_platform.c @@ -28,6 +28,7 @@ #include "hs_common.h" #include "util/cpuid_flags.h" +#include "util/cpuid_inline.h" HS_PUBLIC_API hs_error_t HS_CDECL hs_valid_platform(void) { diff --git a/src/nfagraph/ng.cpp b/src/nfagraph/ng.cpp index 8b247c74b..8b7e4f91f 100644 --- a/src/nfagraph/ng.cpp +++ b/src/nfagraph/ng.cpp @@ -347,14 +347,19 @@ bool NG::addGraph(ExpressionInfo &expr, unique_ptr g_ptr) { throw CompileError(expr.index, "Pattern can never match."); } + bool hamming = expr.hamm_distance > 0; + u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance; + + DEBUG_PRINTF("edit distance = %u hamming = %s\n", e_dist, hamming ? "true" : "false"); + // validate graph's suitability for fuzzing before resolving asserts - validate_fuzzy_compile(g, expr.edit_distance, expr.utf8, cc.grey); + validate_fuzzy_compile(g, e_dist, hamming, expr.utf8, cc.grey); resolveAsserts(rm, g, expr); dumpDotWrapper(g, expr, "02_post_assert_resolve", cc.grey); assert(allMatchStatesHaveReports(g)); - make_fuzzy(g, expr.edit_distance, cc.grey); + make_fuzzy(g, e_dist, hamming, cc.grey); dumpDotWrapper(g, expr, "02a_post_fuzz", cc.grey); pruneUseless(g); diff --git a/src/nfagraph/ng_expr_info.cpp b/src/nfagraph/ng_expr_info.cpp index 5f5bbea74..f8abbd04a 100644 --- a/src/nfagraph/ng_expr_info.cpp +++ b/src/nfagraph/ng_expr_info.cpp @@ -161,14 +161,17 @@ void fillExpressionInfo(ReportManager &rm, const CompileContext &cc, throw CompileError(expr.index, "Pattern can never match."); } + bool hamming = expr.hamm_distance > 0; + u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance; + // validate graph's suitability for fuzzing - validate_fuzzy_compile(g, expr.edit_distance, expr.utf8, cc.grey); + validate_fuzzy_compile(g, e_dist, hamming, expr.utf8, cc.grey); resolveAsserts(rm, g, expr); assert(allMatchStatesHaveReports(g)); // fuzz graph - this must happen before any transformations are made - make_fuzzy(g, expr.edit_distance, cc.grey); + make_fuzzy(g, e_dist, hamming, cc.grey); pruneUseless(g); pruneEmptyVertices(g); diff --git a/src/nfagraph/ng_extparam.cpp b/src/nfagraph/ng_extparam.cpp index bc7f81efd..6eb23113f 100644 --- a/src/nfagraph/ng_extparam.cpp +++ b/src/nfagraph/ng_extparam.cpp @@ -629,15 +629,6 @@ bool hasExtParams(const ExpressionInfo &expr) { return false; } -template -depth maxDistFromStart(const VertexDepth &d) { - if (!d.fromStartDotStar.max.is_unreachable()) { - // A path from startDs, any path, implies we can match at any offset. - return depth::infinity(); - } - return d.fromStart.max; -} - static const depth& maxDistToAccept(const NFAVertexBidiDepth &d) { if (d.toAccept.max.is_unreachable()) { @@ -689,7 +680,7 @@ bool isEdgePrunable(const NGHolder &g, const Report &report, const NFAVertexBidiDepth &dv = depths.at(v_idx); if (report.minOffset) { - depth max_offset = maxDistFromStart(du) + maxDistToAccept(dv); + depth max_offset = maxDistFromStartOfData(du) + maxDistToAccept(dv); if (max_offset.is_finite() && max_offset < report.minOffset) { DEBUG_PRINTF("max_offset=%s too small\n", max_offset.str().c_str()); return true; @@ -709,7 +700,7 @@ bool isEdgePrunable(const NGHolder &g, const Report &report, if (report.minLength && is_any_accept(v, g)) { // Simple take on min_length. If we're an edge to accept and our max // dist from start is too small, we can be pruned. - const depth &width = du.fromStart.max; + const depth &width = maxDistFromInit(du); if (width.is_finite() && width < report.minLength) { DEBUG_PRINTF("max width %s from start too small for min_length\n", width.str().c_str()); @@ -961,7 +952,7 @@ void removeUnneededOffsetBounds(NGHolder &g, ReportManager &rm) { replaceReports(g, [&](NFAVertex v, ReportID id) { const auto &d = depths.at(g[v].index); const depth &min_depth = min(d.fromStartDotStar.min, d.fromStart.min); - const depth &max_depth = maxDistFromStart(d); + const depth &max_depth = maxDistFromStartOfData(d); DEBUG_PRINTF("vertex %zu has min_depth=%s, max_depth=%s\n", g[v].index, min_depth.str().c_str(), max_depth.str().c_str()); diff --git a/src/nfagraph/ng_fuzzy.cpp b/src/nfagraph/ng_fuzzy.cpp index 2c3d85bd5..78fd86291 100644 --- a/src/nfagraph/ng_fuzzy.cpp +++ b/src/nfagraph/ng_fuzzy.cpp @@ -144,6 +144,7 @@ vector> gatherPredecessorsByDepth(const NGHolder &g, struct ShadowGraph { NGHolder &g; u32 edit_distance; + bool hamming; map, NFAVertex> shadow_map; map, NFAVertex> helper_map; map clones; @@ -151,13 +152,17 @@ struct ShadowGraph { vector> edges_to_be_added; flat_set orig; - ShadowGraph(NGHolder &g_in, u32 ed_in) : g(g_in), edit_distance(ed_in) {} + ShadowGraph(NGHolder &g_in, u32 ed_in, bool hamm_in) + : g(g_in), edit_distance(ed_in), hamming(hamm_in) {} void fuzz_graph() { if (edit_distance == 0) { return; } + DEBUG_PRINTF("edit distance = %u hamming = %s\n", edit_distance, + hamming ? "true" : "false"); + // step 1: prepare the vertices, helpers and shadows according to // the original graph prepare_graph(); @@ -167,7 +172,9 @@ struct ShadowGraph { // step 3: set up reports for newly created vertices (and make clones // if necessary) - create_reports(); + if (!hamming) { + create_reports(); + } // step 4: wire up shadow graph and helpers for insert/replace/remove connect_shadow_graph(); @@ -244,6 +251,16 @@ struct ShadowGraph { // if there's nowhere to go from this vertex, no helper needed if (proper_out_degree(v, g) < 1) { + DEBUG_PRINTF("No helper for node ID: %zu (level %u)\n", + g[shadow_v].index, dist); + helper_map[make_pair(v, dist)] = shadow_v; + continue; + } + + // start and startDs only have helpers for insert, so not Hamming + if (hamming && is_any_start(v, g)) { + DEBUG_PRINTF("No helper for node ID: %zu (level %u)\n", + g[shadow_v].index, dist); helper_map[make_pair(v, dist)] = shadow_v; continue; } @@ -256,6 +273,8 @@ struct ShadowGraph { g[helper_v].char_reach = CharReach::dot(); // do not copy virtual start's assert flags if (is_virtual_start(v, g)) { + DEBUG_PRINTF("Helper node ID is virtual start: %zu (level %u)\n", + g[helper_v].index, dist); g[helper_v].assert_flags = 0; } helper_map[make_pair(v, dist)] = helper_v; @@ -272,7 +291,7 @@ struct ShadowGraph { const auto &cur_shadow_helper = helper_map[make_pair(v, dist)]; // multiple insert - if (dist > 1) { + if (!hamming && dist > 1) { const auto &prev_level_helper = helper_map[make_pair(v, dist - 1)]; connect_to_clones(prev_level_helper, cur_shadow_helper); } @@ -429,13 +448,15 @@ struct ShadowGraph { connect_preds(v, dist); // handle helpers - if (dist > 0) { + if (!hamming && dist > 0) { connect_helpers(v, dist); } } // handle removals - connect_removals(v); + if (!hamming) { + connect_removals(v); + } } } @@ -636,8 +657,8 @@ bool will_turn_vacuous(const NGHolder &g, u32 edit_distance) { return false; } -void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool utf8, - const Grey &grey) { +void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool hamming, + bool utf8, const Grey &grey) { if (edit_distance == 0) { return; } @@ -657,13 +678,14 @@ void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool utf8, "approximate matching."); } } - if (will_turn_vacuous(g, edit_distance)) { + if (!hamming && will_turn_vacuous(g, edit_distance)) { throw CompileError("Approximate matching patterns that reduce to " "vacuous patterns are disallowed."); } } -void make_fuzzy(NGHolder &g, u32 edit_distance, const Grey &grey) { +void make_fuzzy(NGHolder &g, u32 edit_distance, bool hamming, + const Grey &grey) { if (edit_distance == 0) { return; } @@ -671,7 +693,7 @@ void make_fuzzy(NGHolder &g, u32 edit_distance, const Grey &grey) { assert(grey.allowApproximateMatching); assert(grey.maxEditDistance >= edit_distance); - ShadowGraph sg(g, edit_distance); + ShadowGraph sg(g, edit_distance, hamming); sg.fuzz_graph(); // For safety, enforce limit on actual vertex count. diff --git a/src/nfagraph/ng_fuzzy.h b/src/nfagraph/ng_fuzzy.h index a2c821273..a99767d87 100644 --- a/src/nfagraph/ng_fuzzy.h +++ b/src/nfagraph/ng_fuzzy.h @@ -40,10 +40,10 @@ struct Grey; class NGHolder; class ReportManager; -void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool utf8, - const Grey &grey); +void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool hamming, + bool utf8, const Grey &grey); -void make_fuzzy(NGHolder &g, u32 edit_distance, const Grey &grey); +void make_fuzzy(NGHolder &g, u32 edit_distance, bool hamming, const Grey &grey); } #endif // NG_FUZZY_H diff --git a/src/nfagraph/ng_util.cpp b/src/nfagraph/ng_util.cpp index 59c734980..cb2b71035 100644 --- a/src/nfagraph/ng_util.cpp +++ b/src/nfagraph/ng_util.cpp @@ -32,7 +32,6 @@ #include "ng_util.h" #include "grey.h" -#include "ng_depth.h" // for NFAVertexDepth #include "ng_dump.h" #include "ng_prune.h" #include "ue2common.h" @@ -61,25 +60,6 @@ using boost::make_assoc_property_map; namespace ue2 { -depth maxDistFromInit(const NFAVertexDepth &vd) { - if (vd.fromStart.max.is_unreachable()) { - return vd.fromStartDotStar.max; - } else if (vd.fromStartDotStar.max.is_unreachable()) { - return vd.fromStart.max; - } else { - return max(vd.fromStartDotStar.max, vd.fromStart.max); - } -} - -depth maxDistFromStartOfData(const NFAVertexDepth &vd) { - if (vd.fromStartDotStar.max.is_reachable()) { - /* the irrepressible nature of floating literals cannot be contained */ - return depth::infinity(); - } else { - return vd.fromStart.max; - } -} - NFAVertex getSoleDestVertex(const NGHolder &g, NFAVertex a) { assert(a != NGHolder::null_vertex()); diff --git a/src/nfagraph/ng_util.h b/src/nfagraph/ng_util.h index 3cc9c7c3e..a2d0d9b7d 100644 --- a/src/nfagraph/ng_util.h +++ b/src/nfagraph/ng_util.h @@ -32,6 +32,7 @@ #ifndef NG_UTIL_H #define NG_UTIL_H +#include "ng_depth.h" #include "ng_holder.h" #include "ue2common.h" #include "util/flat_containers.h" @@ -40,6 +41,7 @@ #include // for default_dfs_visitor +#include #include #include #include @@ -47,13 +49,29 @@ namespace ue2 { struct Grey; -struct NFAVertexDepth; struct ue2_literal; -class depth; class ReportManager; -depth maxDistFromInit(const NFAVertexDepth &d); -depth maxDistFromStartOfData(const NFAVertexDepth &d); +template +depth maxDistFromInit(const VertexDepth &vd) { + if (vd.fromStart.max.is_unreachable()) { + return vd.fromStartDotStar.max; + } else if (vd.fromStartDotStar.max.is_unreachable()) { + return vd.fromStart.max; + } else { + return std::max(vd.fromStartDotStar.max, vd.fromStart.max); + } +} + +template +depth maxDistFromStartOfData(const VertexDepth &vd) { + if (vd.fromStartDotStar.max.is_reachable()) { + /* the irrepressible nature of floating literals cannot be contained */ + return depth::infinity(); + } else { + return vd.fromStart.max; + } +} /** True if the given vertex is a dot (reachable on any character). */ template diff --git a/src/parser/shortcut_literal.cpp b/src/parser/shortcut_literal.cpp index 4539836ab..82679c88a 100644 --- a/src/parser/shortcut_literal.cpp +++ b/src/parser/shortcut_literal.cpp @@ -170,7 +170,7 @@ bool shortcutLiteral(NG &ng, const ParsedExpression &pe) { // XXX: don't shortcut literals with extended params (yet) if (expr.min_offset || expr.max_offset != MAX_OFFSET || expr.min_length || - expr.edit_distance) { + expr.edit_distance || expr.hamm_distance) { DEBUG_PRINTF("extended params not allowed\n"); return false; } diff --git a/src/util/cpuid_flags.c b/src/util/cpuid_flags.c index 3c62c07bf..0b529c0bf 100644 --- a/src/util/cpuid_flags.c +++ b/src/util/cpuid_flags.c @@ -27,154 +27,16 @@ */ #include "cpuid_flags.h" +#include "cpuid_inline.h" #include "ue2common.h" #include "hs_compile.h" // for HS_MODE_ flags #include "hs_internal.h" #include "util/arch.h" -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(CPUID_H_) #include #endif -// ECX -#define SSE3 (1 << 0) -#define SSSE3 (1 << 9) -#define SSE4_1 (1 << 19) -#define SSE4_2 (1 << 20) -#define POPCNT (1 << 23) -#define XSAVE (1 << 27) -#define AVX (1 << 28) - -// EDX -#define FXSAVE (1 << 24) -#define SSE (1 << 25) -#define SSE2 (1 << 26) -#define HTT (1 << 28) - -// Structured Extended Feature Flags Enumeration Leaf ECX values -#define BMI (1 << 3) -#define AVX2 (1 << 5) -#define BMI2 (1 << 8) - -// Structured Extended Feature Flags Enumeration Leaf EBX values -#define AVX512F (1 << 16) -#define AVX512BW (1 << 30) - -// Extended Control Register 0 (XCR0) values -#define XCR0_SSE (1 << 1) -#define XCR0_AVX (1 << 2) -#define XCR0_OPMASK (1 << 5) // k-regs -#define XCR0_ZMM_Hi256 (1 << 6) // upper 256 bits of ZMM0-ZMM15 -#define XCR0_Hi16_ZMM (1 << 7) // ZMM16-ZMM31 - -#define XCR0_AVX512 (XCR0_OPMASK | XCR0_ZMM_Hi256 | XCR0_Hi16_ZMM) - -static __inline -void cpuid(unsigned int op, unsigned int leaf, unsigned int *eax, - unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { -#ifndef _WIN32 - __cpuid_count(op, leaf, *eax, *ebx, *ecx, *edx); -#else - unsigned int a[4]; - __cpuidex(a, op, leaf); - *eax = a[0]; - *ebx = a[1]; - *ecx = a[2]; - *edx = a[3]; -#endif -} - -static inline -u64a xgetbv(u32 op) { -#if defined(_WIN32) || defined(__INTEL_COMPILER) - return _xgetbv(op); -#else - u32 a, d; - __asm__ volatile ( - "xgetbv\n" - : "=a"(a), - "=d"(d) - : "c"(op)); - return ((u64a)d << 32) + a; -#endif -} - -int check_avx2(void) { -#if defined(__INTEL_COMPILER) - return _may_i_use_cpu_feature(_FEATURE_AVX2); -#else - unsigned int eax, ebx, ecx, edx; - - cpuid(1, 0, &eax, &ebx, &ecx, &edx); - - /* check AVX is supported and XGETBV is enabled by OS */ - if ((ecx & (AVX | XSAVE)) != (AVX | XSAVE)) { - DEBUG_PRINTF("AVX and XSAVE not supported\n"); - return 0; - } - - /* check that SSE and AVX registers are enabled by OS */ - u64a xcr0 = xgetbv(0); - if ((xcr0 & (XCR0_SSE | XCR0_AVX)) != (XCR0_SSE | XCR0_AVX)) { - DEBUG_PRINTF("SSE and AVX registers not enabled\n"); - return 0; - } - - /* ECX and EDX contain capability flags */ - ecx = 0; - cpuid(7, 0, &eax, &ebx, &ecx, &edx); - - if (ebx & AVX2) { - DEBUG_PRINTF("AVX2 enabled\n"); - return 1; - } - - return 0; -#endif -} - -int check_avx512(void) { - /* - * For our purposes, having avx512 really means "can we use AVX512BW?" - */ -#if defined(__INTEL_COMPILER) - return _may_i_use_cpu_feature(_FEATURE_AVX512BW | _FEATURE_AVX512VL); -#else - unsigned int eax, ebx, ecx, edx; - - cpuid(1, 0, &eax, &ebx, &ecx, &edx); - - /* check XSAVE is enabled by OS */ - if (!(ecx & XSAVE)) { - DEBUG_PRINTF("AVX and XSAVE not supported\n"); - return 0; - } - - /* check that AVX 512 registers are enabled by OS */ - u64a xcr0 = xgetbv(0); - if ((xcr0 & XCR0_AVX512) != XCR0_AVX512) { - DEBUG_PRINTF("AVX512 registers not enabled\n"); - return 0; - } - - /* ECX and EDX contain capability flags */ - ecx = 0; - cpuid(7, 0, &eax, &ebx, &ecx, &edx); - - if (!(ebx & AVX512F)) { - DEBUG_PRINTF("AVX512F (AVX512 Foundation) instructions not enabled\n"); - return 0; - } - - if (ebx & AVX512BW) { - DEBUG_PRINTF("AVX512BW instructions enabled\n"); - return 1; - } - - return 0; -#endif -} - u64a cpuid_flags(void) { u64a cap = 0; @@ -200,24 +62,6 @@ u64a cpuid_flags(void) { return cap; } -int check_ssse3(void) { - unsigned int eax, ebx, ecx, edx; - cpuid(1, 0, &eax, &ebx, &ecx, &edx); - return !!(ecx & SSSE3); -} - -int check_sse42(void) { - unsigned int eax, ebx, ecx, edx; - cpuid(1, 0, &eax, &ebx, &ecx, &edx); - return !!(ecx & SSE4_2); -} - -int check_popcnt(void) { - unsigned int eax, ebx, ecx, edx; - cpuid(1, 0, &eax, &ebx, &ecx, &edx); - return !!(ecx & POPCNT); -} - struct family_id { u32 full_family; u32 full_model; diff --git a/src/util/cpuid_flags.h b/src/util/cpuid_flags.h index d79c3832f..527c6d52f 100644 --- a/src/util/cpuid_flags.h +++ b/src/util/cpuid_flags.h @@ -31,6 +31,12 @@ #include "ue2common.h" +#if !defined(_WIN32) && !defined(CPUID_H_) +#include + /* system header doesn't have a header guard */ +#define CPUID_H_ +#endif + #ifdef __cplusplus extern "C" { @@ -41,12 +47,6 @@ u64a cpuid_flags(void); u32 cpuid_tune(void); -int check_avx512(void); -int check_avx2(void); -int check_ssse3(void); -int check_sse42(void); -int check_popcnt(void); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/util/cpuid_inline.h b/src/util/cpuid_inline.h new file mode 100644 index 000000000..b6768cc26 --- /dev/null +++ b/src/util/cpuid_inline.h @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CPUID_INLINE_H_ +#define CPUID_INLINE_H_ + +#include "ue2common.h" +#include "cpuid_flags.h" + +#if !defined(_WIN32) && !defined(CPUID_H_) +#include +/* system header doesn't have a header guard */ +#define CPUID_H_ +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +static inline +void cpuid(unsigned int op, unsigned int leaf, unsigned int *eax, + unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { +#ifndef _WIN32 + __cpuid_count(op, leaf, *eax, *ebx, *ecx, *edx); +#else + int a[4]; + __cpuidex(a, op, leaf); + *eax = a[0]; + *ebx = a[1]; + *ecx = a[2]; + *edx = a[3]; +#endif +} + +// ECX +#define CPUID_SSE3 (1 << 0) +#define CPUID_SSSE3 (1 << 9) +#define CPUID_SSE4_1 (1 << 19) +#define CPUID_SSE4_2 (1 << 20) +#define CPUID_POPCNT (1 << 23) +#define CPUID_XSAVE (1 << 27) +#define CPUID_AVX (1 << 28) + +// EDX +#define CPUID_FXSAVE (1 << 24) +#define CPUID_SSE (1 << 25) +#define CPUID_SSE2 (1 << 26) +#define CPUID_HTT (1 << 28) + +// Structured Extended Feature Flags Enumeration Leaf ECX values +#define CPUID_BMI (1 << 3) +#define CPUID_AVX2 (1 << 5) +#define CPUID_BMI2 (1 << 8) + +// Structured Extended Feature Flags Enumeration Leaf EBX values +#define CPUID_AVX512F (1 << 16) +#define CPUID_AVX512BW (1 << 30) + +// Extended Control Register 0 (XCR0) values +#define CPUID_XCR0_SSE (1 << 1) +#define CPUID_XCR0_AVX (1 << 2) +#define CPUID_XCR0_OPMASK (1 << 5) // k-regs +#define CPUID_XCR0_ZMM_Hi256 (1 << 6) // upper 256 bits of ZMM0-ZMM15 +#define CPUID_XCR0_Hi16_ZMM (1 << 7) // ZMM16-ZMM31 + +#define CPUID_XCR0_AVX512 \ + (CPUID_XCR0_OPMASK | CPUID_XCR0_ZMM_Hi256 | CPUID_XCR0_Hi16_ZMM) + +static inline +u64a xgetbv(u32 op) { +#if defined(_WIN32) || defined(__INTEL_COMPILER) + return _xgetbv(op); +#else + u32 a, d; + __asm__ volatile ( + "xgetbv\n" + : "=a"(a), + "=d"(d) + : "c"(op)); + return ((u64a)d << 32) + a; +#endif +} + +static inline +int check_avx2(void) { +#if defined(__INTEL_COMPILER) + return _may_i_use_cpu_feature(_FEATURE_AVX2); +#else + unsigned int eax, ebx, ecx, edx; + + cpuid(1, 0, &eax, &ebx, &ecx, &edx); + + /* check AVX is supported and XGETBV is enabled by OS */ + if ((ecx & (CPUID_AVX | CPUID_XSAVE)) != (CPUID_AVX | CPUID_XSAVE)) { + DEBUG_PRINTF("AVX and XSAVE not supported\n"); + return 0; + } + + /* check that SSE and AVX registers are enabled by OS */ + u64a xcr0 = xgetbv(0); + if ((xcr0 & (CPUID_XCR0_SSE | CPUID_XCR0_AVX)) != + (CPUID_XCR0_SSE | CPUID_XCR0_AVX)) { + DEBUG_PRINTF("SSE and AVX registers not enabled\n"); + return 0; + } + + /* ECX and EDX contain capability flags */ + ecx = 0; + cpuid(7, 0, &eax, &ebx, &ecx, &edx); + + if (ebx & CPUID_AVX2) { + DEBUG_PRINTF("AVX2 enabled\n"); + return 1; + } + + return 0; +#endif +} + +static inline +int check_avx512(void) { + /* + * For our purposes, having avx512 really means "can we use AVX512BW?" + */ +#if defined(__INTEL_COMPILER) + return _may_i_use_cpu_feature(_FEATURE_AVX512BW | _FEATURE_AVX512VL); +#else + unsigned int eax, ebx, ecx, edx; + + cpuid(1, 0, &eax, &ebx, &ecx, &edx); + + /* check XSAVE is enabled by OS */ + if (!(ecx & CPUID_XSAVE)) { + DEBUG_PRINTF("AVX and XSAVE not supported\n"); + return 0; + } + + /* check that AVX 512 registers are enabled by OS */ + u64a xcr0 = xgetbv(0); + if ((xcr0 & CPUID_XCR0_AVX512) != CPUID_XCR0_AVX512) { + DEBUG_PRINTF("AVX512 registers not enabled\n"); + return 0; + } + + /* ECX and EDX contain capability flags */ + ecx = 0; + cpuid(7, 0, &eax, &ebx, &ecx, &edx); + + if (!(ebx & CPUID_AVX512F)) { + DEBUG_PRINTF("AVX512F (AVX512 Foundation) instructions not enabled\n"); + return 0; + } + + if (ebx & CPUID_AVX512BW) { + DEBUG_PRINTF("AVX512BW instructions enabled\n"); + return 1; + } + + return 0; +#endif +} + +static inline +int check_ssse3(void) { + unsigned int eax, ebx, ecx, edx; + cpuid(1, 0, &eax, &ebx, &ecx, &edx); + return !!(ecx & CPUID_SSSE3); +} + +static inline +int check_sse42(void) { + unsigned int eax, ebx, ecx, edx; + cpuid(1, 0, &eax, &ebx, &ecx, &edx); + return !!(ecx & CPUID_SSE4_2); +} + +static inline +int check_popcnt(void) { + unsigned int eax, ebx, ecx, edx; + cpuid(1, 0, &eax, &ebx, &ecx, &edx); + return !!(ecx & CPUID_POPCNT); +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* CPUID_INLINE_H_ */ diff --git a/tools/hsbench/CMakeLists.txt b/tools/hsbench/CMakeLists.txt index a8792cf74..f0e76da15 100644 --- a/tools/hsbench/CMakeLists.txt +++ b/tools/hsbench/CMakeLists.txt @@ -38,6 +38,9 @@ SET(hsbench_SOURCES huge.cpp huge.h main.cpp + sqldb.cpp + sqldb.h + sqldb_bind.h thread_barrier.h timer.h ) diff --git a/tools/hsbench/common.h b/tools/hsbench/common.h index a82959110..d7bce73ad 100644 --- a/tools/hsbench/common.h +++ b/tools/hsbench/common.h @@ -42,4 +42,9 @@ extern bool forceEditDistance; extern unsigned editDistance; extern bool printCompressSize; +struct SqlFailure { + explicit SqlFailure(const std::string &s) : message(s) {} + std::string message; +}; + #endif // COMMON_H diff --git a/tools/hsbench/engine_hyperscan.cpp b/tools/hsbench/engine_hyperscan.cpp index 5f188472c..d98b3a400 100644 --- a/tools/hsbench/engine_hyperscan.cpp +++ b/tools/hsbench/engine_hyperscan.cpp @@ -34,6 +34,7 @@ #include "expressions.h" #include "heapstats.h" #include "huge.h" +#include "sqldb.h" #include "timer.h" #include "database.h" @@ -113,7 +114,8 @@ int onMatchEcho(unsigned int id, unsigned long long, unsigned long long to, return 0; } -EngineHyperscan::EngineHyperscan(hs_database_t *db_in) : db(db_in) { +EngineHyperscan::EngineHyperscan(hs_database_t *db_in, CompileStats cs) + : db(db_in), compile_stats(std::move(cs)) { assert(db); } @@ -234,6 +236,43 @@ void EngineHyperscan::streamCompressExpand(EngineStream &stream, } } +void EngineHyperscan::printStats() const { + // Output summary information. + if (!compile_stats.sigs_name.empty()) { + printf("Signature set: %s\n", compile_stats.sigs_name.c_str()); + } + printf("Signatures: %s\n", compile_stats.signatures.c_str()); + printf("Hyperscan info: %s\n", compile_stats.db_info.c_str()); + printf("Expression count: %'zu\n", compile_stats.expressionCount); + printf("Bytecode size: %'zu bytes\n", compile_stats.compiledSize); + printf("Database CRC: 0x%x\n", compile_stats.crc32); + if (compile_stats.streaming) { + printf("Stream state size: %'zu bytes\n", compile_stats.streamSize); + } + printf("Scratch size: %'zu bytes\n", compile_stats.scratchSize); + printf("Compile time: %'0.3Lf seconds\n", compile_stats.compileSecs); + printf("Peak heap usage: %'u bytes\n", compile_stats.peakMemorySize); +} + +void EngineHyperscan::sqlStats(SqlDB &sqldb) const { + ostringstream crc; + crc << "0x" << hex << compile_stats.crc32; + + static const std::string Q = + "INSERT INTO Compile (" + "sigsName, signatures, dbInfo, exprCount, dbSize, crc, streaming," + "streamSize, scratchSize, compileSecs, peakMemory) " + "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)"; + + sqldb.insert_all(Q, compile_stats.sigs_name, compile_stats.signatures, + compile_stats.db_info, compile_stats.expressionCount, + compile_stats.compiledSize, crc.str(), + compile_stats.streaming ? "TRUE" : "FALSE", + compile_stats.streamSize, compile_stats.scratchSize, + compile_stats.compileSecs, compile_stats.peakMemorySize); +} + + static unsigned makeModeFlags(ScanMode scan_mode) { switch (scan_mode) { @@ -281,7 +320,8 @@ string dbFilename(const std::string &name, unsigned mode) { std::unique_ptr buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode, - const std::string &name, UNUSED const ue2::Grey &grey) { + const std::string &name, const std::string &sigs_name, + UNUSED const ue2::Grey &grey) { if (expressions.empty()) { assert(0); return nullptr; @@ -292,7 +332,6 @@ buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode, size_t streamSize = 0; size_t scratchSize = 0; unsigned int peakMemorySize = 0; - unsigned int crc = 0; std::string db_info; unsigned int mode = makeModeFlags(scan_mode); @@ -393,8 +432,6 @@ buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode, } assert(compiledSize > 0); - crc = db->crc32; - if (saveDatabases) { saveDatabase(db, dbFilename(name, mode).c_str()); } @@ -431,18 +468,24 @@ buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode, } hs_free_scratch(scratch); - // Output summary information. - printf("Signatures: %s\n", name.c_str()); - printf("Hyperscan info: %s\n", db_info.c_str()); - printf("Expression count: %'zu\n", expressions.size()); - printf("Bytecode size: %'zu bytes\n", compiledSize); - printf("Database CRC: 0x%x\n", crc); - if (mode & HS_MODE_STREAM) { - printf("Stream state size: %'zu bytes\n", streamSize); + // Collect summary information. + CompileStats cs; + cs.sigs_name = sigs_name; + if (!sigs_name.empty()) { + const auto pos = name.find_last_of('/'); + cs.signatures = name.substr(pos + 1); + } else { + cs.signatures = name; } - printf("Scratch size: %'zu bytes\n", scratchSize); - printf("Compile time: %'0.3Lf seconds\n", compileSecs); - printf("Peak heap usage: %'u bytes\n", peakMemorySize); - - return ue2::make_unique(db); + cs.db_info = db_info; + cs.expressionCount = expressions.size(); + cs.compiledSize = compiledSize; + cs.crc32 = db->crc32; + cs.streaming = mode & HS_MODE_STREAM; + cs.streamSize = streamSize; + cs.scratchSize = scratchSize; + cs.compileSecs = compileSecs; + cs.peakMemorySize = peakMemorySize; + + return ue2::make_unique(db, std::move(cs)); } diff --git a/tools/hsbench/engine_hyperscan.h b/tools/hsbench/engine_hyperscan.h index 2c93959b8..d27aab757 100644 --- a/tools/hsbench/engine_hyperscan.h +++ b/tools/hsbench/engine_hyperscan.h @@ -31,9 +31,11 @@ #include "expressions.h" #include "common.h" +#include "sqldb.h" #include "hs_runtime.h" #include +#include #include /** Structure for the result of a single complete scan. */ @@ -42,6 +44,21 @@ struct ResultEntry { unsigned int matches = 0; //!< Count of matches found. }; +/** Infomation about the database compile */ +struct CompileStats { + std::string sigs_name; + std::string signatures; + std::string db_info; + size_t expressionCount = 0; + size_t compiledSize = 0; + uint32_t crc32 = 0; + bool streaming; + size_t streamSize = 0; + size_t scratchSize = 0; + long double compileSecs = 0; + unsigned int peakMemorySize = 0; +}; + /** Engine context which is allocated on a per-thread basis. */ class EngineContext { public: @@ -62,7 +79,7 @@ class EngineStream { /** Hyperscan Engine for scanning data. */ class EngineHyperscan { public: - explicit EngineHyperscan(hs_database_t *db); + explicit EngineHyperscan(hs_database_t *db, CompileStats cs); ~EngineHyperscan(); std::unique_ptr makeContext() const; @@ -86,8 +103,13 @@ class EngineHyperscan { void streamScan(EngineStream &stream, const char *data, unsigned int len, unsigned int id, ResultEntry &result) const; + void printStats() const; + + void sqlStats(SqlDB &db) const; + private: hs_database_t *db; + CompileStats compile_stats; }; namespace ue2 { @@ -96,6 +118,7 @@ struct Grey; std::unique_ptr buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode, - const std::string &name, const ue2::Grey &grey); + const std::string &name, const std::string &sigs_name, + const ue2::Grey &grey); #endif // ENGINEHYPERSCAN_H diff --git a/tools/hsbench/main.cpp b/tools/hsbench/main.cpp index f2ea8e7e7..ae46de774 100644 --- a/tools/hsbench/main.cpp +++ b/tools/hsbench/main.cpp @@ -32,6 +32,7 @@ #include "data_corpus.h" #include "engine_hyperscan.h" #include "expressions.h" +#include "sqldb.h" #include "thread_barrier.h" #include "timer.h" #include "util/expression_path.h" @@ -89,10 +90,14 @@ ScanMode scan_mode = ScanMode::STREAMING; unsigned repeats = 20; string exprPath(""); string corpusFile(""); +string sqloutFile(""); +string sigName(""); // info only vector threadCores; Timer totalTimer; double totalSecs = 0; +SqlDB out_db; + typedef void (*thread_func_t)(void *context); class ThreadContext : boost::noncopyable { @@ -188,6 +193,8 @@ void usage(const char *error) { printf("\n"); printf(" --per-scan Display per-scan Mbit/sec results.\n"); printf(" --echo-matches Display all matches that occur during scan.\n"); + printf(" --sql-out FILE Output sqlite db.\n"); + printf(" -S NAME Signature set name (for sqlite db).\n"); printf("\n\n"); if (error) { @@ -207,28 +214,30 @@ struct BenchmarkSigs { static void processArgs(int argc, char *argv[], vector &sigSets, UNUSED unique_ptr &grey) { - const char options[] = "-b:c:Cd:e:E:G:hi:n:No:p:sVw:z:" + const char options[] = "-b:c:Cd:e:E:G:hi:n:No:p:sS:Vw:z:" #ifdef HAVE_DECL_PTHREAD_SETAFFINITY_NP "T:" // add the thread flag #endif ; int in_sigfile = 0; int do_per_scan = 0; - int do_echo_matches = 0; int do_compress = 0; int do_compress_size = 0; + int do_echo_matches = 0; + int do_sql_output = 0; + int option_index = 0; vector sigFiles; static struct option longopts[] = { - {"per-scan", 0, &do_per_scan, 1}, - {"echo-matches", 0, &do_echo_matches, 1}, - {"compress-stream", 0, &do_compress, 1}, - {"print-compress-size", 0, &do_compress_size, 1}, + {"per-scan", no_argument, &do_per_scan, 1}, + {"echo-matches", no_argument, &do_echo_matches, 1}, + {"compress-stream", no_argument, &do_compress, 1}, + {"sql-out", required_argument, &do_sql_output, 1}, {nullptr, 0, nullptr, 0} }; for (;;) { - int c = getopt_long(argc, argv, options, longopts, nullptr); + int c = getopt_long(argc, argv, options, longopts, &option_index); if (c < 0) { break; } @@ -294,6 +303,9 @@ void processArgs(int argc, char *argv[], vector &sigSets, case 'V': scan_mode = ScanMode::VECTORED; break; + case 'S': + sigName.assign(optarg); + break; #ifdef HAVE_DECL_PTHREAD_SETAFFINITY_NP case 'T': if (!strToList(optarg, threadCores)) { @@ -321,14 +333,19 @@ void processArgs(int argc, char *argv[], vector &sigSets, saveDatabases = true; serializePath = optarg; break; + case 0: + if (do_sql_output) { + sqloutFile.assign(optarg); + do_sql_output = 0; + } + break; case 1: if (in_sigfile) { sigFiles.push_back(optarg); in_sigfile = 2; break; } - case 0: - break; + /* fallthrough */ default: usage("Unrecognised command line argument."); exit(1); @@ -726,6 +743,67 @@ void displayResults(const vector> &threads, } } +/** Dump per-scan throughput data to sql. */ +static +void sqlPerScanResults(const vector> &threads, + u64a bytesPerRun, u64a scan_id) { + static const std::string Q = + "INSERT INTO ScanResults (scan_id, thread, scan, throughput) " + "VALUES (?1, ?2, ?3, ?4)"; + + for (const auto &t : threads) { + const auto &results = t->results; + for (size_t j = 0; j != results.size(); j++) { + const auto &r = results[j]; + double mbps = calc_mbps(r.seconds, bytesPerRun); + out_db.insert_all(Q, scan_id, t->num, j, mbps); + } + } +} + +/** Dump benchmark results to sql. */ +static +void sqlResults(const vector> &threads, + const vector &corpus_blocks) { + u64a bytesPerRun = byte_size(corpus_blocks); + u64a matchesPerRun = threads[0]->results[0].matches; + + u64a scan_id = out_db.lastRowId(); + + // Sanity check: all of our results should have the same match count. + for (const auto &t : threads) { + if (!all_of(begin(t->results), end(t->results), + [&matchesPerRun](const ResultEntry &e) { + return e.matches == matchesPerRun; + })) { + printf("\nWARNING: PER-SCAN MATCH COUNTS ARE INCONSISTENT!\n\n"); + break; + } + } + + u64a totalBytes = bytesPerRun * repeats * threads.size(); + double matchRate = ((double)matchesPerRun * 1024) / bytesPerRun; + + const auto pos = corpusFile.find_last_of('/'); + const auto corpus = corpusFile.substr(pos + 1); + + static const std::string Q = + "INSERT INTO Scan (scan_id, corpusFile, totalSecs, " + "bytesPerRun, blockSize, blockCount, totalBytes, " + "totalBlocks, matchesPerRun, matchRate, overallTput) " + "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)"; + + out_db.insert_all( + Q, scan_id, corpus, totalSecs, bytesPerRun, corpus_blocks.size(), + scan_mode == ScanMode::BLOCK ? 1 : count_streams(corpus_blocks), + totalBytes, corpus_blocks.size() * repeats * threads.size(), + matchesPerRun, matchRate, calc_mbps(totalSecs, totalBytes)); + + if (display_per_scan) { + sqlPerScanResults(threads, bytesPerRun, scan_id); + } +} + /** * Construct a thread context for this scanning mode. * @@ -798,10 +876,15 @@ void runBenchmark(const EngineHyperscan &db, t->join(); } - // Display global results. - displayResults(threads, corpus_blocks); + if (sqloutFile.empty()) { + // Display global results. + displayResults(threads, corpus_blocks); + } else { + // write to sqlite file + sqlResults(threads, corpus_blocks); + out_db.exec("END"); + } } - } // namespace /** Main driver. */ @@ -842,22 +925,39 @@ int main(int argc, char *argv[]) { printf("Corpus data error: %s\n", e.msg.c_str()); return 1; } - - for (const auto &s : sigSets) { - auto exprMap = limitToSignatures(exprMapTemplate, s.sigs); - if (exprMap.empty()) { - continue; + try { + if (!sqloutFile.empty()) { + out_db.open(sqloutFile); } - auto engine = buildEngineHyperscan(exprMap, scan_mode, s.name, *grey); - if (!engine) { - printf("Error: expressions failed to compile.\n"); - exit(1); - } + for (const auto &s : sigSets) { + auto exprMap = limitToSignatures(exprMapTemplate, s.sigs); + if (exprMap.empty()) { + continue; + } + + auto engine = buildEngineHyperscan(exprMap, scan_mode, s.name, + sigName, *grey); + if (!engine) { + printf("Error: expressions failed to compile.\n"); + exit(1); + } - printf("\n"); + if (sqloutFile.empty()) { + // Display global results. + engine->printStats(); + printf("\n"); - runBenchmark(*engine, corpus_blocks); + } else { + out_db.exec("BEGIN"); + engine->sqlStats(out_db); + } + + runBenchmark(*engine, corpus_blocks); + } + } catch (const SqlFailure &f) { + cerr << f.message << '\n'; + return -1; } return 0; diff --git a/tools/hsbench/sqldb.cpp b/tools/hsbench/sqldb.cpp new file mode 100644 index 000000000..eb974cb9b --- /dev/null +++ b/tools/hsbench/sqldb.cpp @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "common.h" +#include "sqldb.h" +#include "ue2common.h" + +#include +#include +#include +#include +#include +#include + +#include + +using namespace std; + +namespace { + +static +sqlite3 *initDB(const string &filename) { + sqlite3 *db; + int status; + status = sqlite3_open_v2(filename.c_str(), &db, + SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, nullptr); + + if (status != SQLITE_OK) { + ostringstream oss; + oss << "Unable to open database '" << filename + << "': " << sqlite3_errmsg(db); + status = sqlite3_close(db); + assert(status == SQLITE_OK); + throw SqlFailure(oss.str()); + } + + // create tables + static const string c("CREATE TABLE Compile (" + "id INTEGER PRIMARY KEY," + "sigsName TEXT, " + "signatures TEXT, " + "dbInfo TEXT, " + "exprCount INTEGER, " + "dbSize INTEGER," + "crc TEXT, " + "streaming TEXT, " + "streamSize INTEGER, " + "scratchSize INTEGER, " + "compileSecs DOUBLE, " + "peakMemory INTEGER" + ");"); + + static const string s("CREATE TABLE Scan (id INTEGER PRIMARY KEY," + "corpusFile TEXT, scan_id INTEGER, " + "totalSecs DOUBLE, bytesPerRun INTEGER, " + "blockSize INTEGER, blockCount INTEGER, " + "totalBytes INTEGER, totalBlocks INTEGER, " + "matchesPerRun INTEGER, " + "matchRate DOUBLE, overallTput DOUBLE);"); + + static const string sr( + "CREATE TABLE ScanResults ( id INTEGER PRIMARY KEY, " + "scan_id INTEGER, thread INTEGER, scan INTEGER, throughput DOUBLE );"); + + static const string create_query = c + s + sr; + + sqlite3_stmt *statement; + const char *pzTail = create_query.c_str(); + + while (strlen(pzTail)) { + status = + sqlite3_prepare(db, pzTail, strlen(pzTail), &statement, &pzTail); + if (status != SQLITE_OK) { + goto fail; + } + status = sqlite3_step(statement); + if (status != SQLITE_DONE && status != SQLITE_ROW) { + goto fail; + } + status = sqlite3_finalize(statement); + if (status != SQLITE_OK) { + goto fail; + } + } + + return db; + +fail: + ostringstream oss; + oss << "Unable to create tables: " << sqlite3_errmsg(db); + status = sqlite3_close(db); + assert(status == SQLITE_OK); + throw SqlFailure(oss.str()); +} +} // namespace + +SqlDB::~SqlDB() { + if (db) { + sqlite3_close(db); + } + db = nullptr; +} + +void SqlDB::open(const string &filename) { + if (!ifstream(filename)) { + // file doesn't exist, go set up some tables + db = initDB(filename); + } else { + int status; + status = sqlite3_open_v2(filename.c_str(), &db, SQLITE_OPEN_READWRITE, + nullptr); + + if (status != SQLITE_OK) { + ostringstream oss; + oss << "Unable to open database '" << filename + << "': " << sqlite3_errmsg(db); + throw SqlFailure(oss.str()); + } + } + + exec("PRAGMA synchronous = off;"); + exec("PRAGMA encoding = 'UTF-8';"); +} + +void SqlDB::exec(const string &query) { + assert(db); + int status; + status = sqlite3_exec(db, query.c_str(), nullptr, nullptr, nullptr); + if (status != SQLITE_OK) { + ostringstream oss; + oss << "Unable to run sqlite query: " << sqlite3_errmsg(db); + sqlite3_close(db); + throw SqlFailure(oss.str()); + } +} + +u64a SqlDB::lastRowId() { + assert(db); + return sqlite3_last_insert_rowid(db); +} diff --git a/tools/hsbench/sqldb.h b/tools/hsbench/sqldb.h new file mode 100644 index 000000000..f464cf61f --- /dev/null +++ b/tools/hsbench/sqldb.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SQLDB_H_ +#define SQLDB_H_ + +#include "ue2common.h" + +#include "common.h" +#include "sqldb_bind.h" + +#include +#include + +#include + +class SqlDB { +public: + SqlDB() : db(nullptr) {}; + ~SqlDB(); + void open(const std::string &filename); + void exec(const std::string &query); + u64a lastRowId(); + + template + void insert_all(const std::string &query, Args&&... args) { + sqlite3_stmt *stmt; + const char *tail; + + int rc = sqlite3_prepare(db, query.c_str(), query.size(), &stmt, &tail); + if (rc != SQLITE_OK) { + std::ostringstream oss; + oss << "Unable to prepare query: " << sqlite3_errmsg(db); + throw SqlFailure(oss.str()); + } + + // only one statement per function call + assert(strlen(tail) == 0); + + // perform templated binds to this statement + ue2_sqlite::bind_args(stmt, 1, args...); + + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + std::ostringstream oss; + oss << "Unable to run insert: " << sqlite3_errmsg(db); + throw SqlFailure(oss.str()); + } + + rc = sqlite3_finalize(stmt); + if (rc != SQLITE_OK) { + std::ostringstream oss; + oss << "Unable to finalize statement: " << sqlite3_errmsg(db); + throw SqlFailure(oss.str()); + } + } + +private: + sqlite3 *db; +}; + +#endif /* SQLDB_H_ */ diff --git a/tools/hsbench/sqldb_bind.h b/tools/hsbench/sqldb_bind.h new file mode 100644 index 000000000..5724466d4 --- /dev/null +++ b/tools/hsbench/sqldb_bind.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SQLDB_BIND_H_ +#define SQLDB_BIND_H_ + +#include "ue2common.h" + +#include +#include +#include + +#include + +namespace ue2_sqlite { + +inline +int bind_impl(sqlite3_stmt *stmt, int param, const unsigned long &val) { + return sqlite3_bind_int64(stmt, param, val); +} + +inline +int bind_impl(sqlite3_stmt *stmt, int param, const unsigned int &val) { + return sqlite3_bind_int(stmt, param, val); +} + +inline +int bind_impl(sqlite3_stmt *stmt, int param, const u64a &val) { + return sqlite3_bind_int64(stmt, param, val); +} + +inline +int bind_impl(sqlite3_stmt *stmt, int param, const double &val) { + return sqlite3_bind_double(stmt, param, val); +} + +inline +int bind_impl(sqlite3_stmt *stmt, int param, const long double &val) { + return sqlite3_bind_double(stmt, param, val); +} + +inline +int bind_impl(sqlite3_stmt *stmt, int param, const std::string &val) { + return sqlite3_bind_text(stmt, param, val.c_str(), val.size(), + SQLITE_TRANSIENT); +} + +template +void bind_args(sqlite3_stmt *stmt, int param, T obj) { + int rc = bind_impl(stmt, param, obj); + if (rc != SQLITE_OK) { + std::ostringstream oss; + oss << "SQL value bind failed for param #: " << param; + throw SqlFailure(oss.str()); + } +} + +template +void bind_args(sqlite3_stmt *stmt, int param, T obj, Args&&... args) { + bind_args(stmt, param, obj); + bind_args(stmt, param + 1, args...); +} + +} // namespace + +#endif /* SQLDB_BIND_H_ */ diff --git a/tools/hscheck/CMakeLists.txt b/tools/hscheck/CMakeLists.txt new file mode 100644 index 000000000..065d4c04b --- /dev/null +++ b/tools/hscheck/CMakeLists.txt @@ -0,0 +1,10 @@ +# only set these after all tests are done +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}") + +SET(hscheck_SOURCES + main.cpp +) +add_executable(hscheck ${hscheck_SOURCES}) +target_link_libraries(hscheck hs expressionutil pthread) + diff --git a/tools/hscheck/main.cpp b/tools/hscheck/main.cpp new file mode 100644 index 000000000..59f802446 --- /dev/null +++ b/tools/hscheck/main.cpp @@ -0,0 +1,476 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * \file + * \brief hscheck: Tool to test regex compilation with Hyperscan. + * + * hscheck accepts a file of regular expressions in the form: + * "ID:/regex/flags" and tests whether they can be compiled with Hyperscan, + * reporting the error if compilation fails. + * + * For example, create the file "regex" containing: + * + * 1:/foo.*bar/s + * 2:/hatstand|teakettle|badgerbrush/ + * + * This can be checked with the following hscheck invocation: + * + * $ bin/hscheck -e regex + * + * Use "hscheck -h" for complete usage information. + */ + +#include "config.h" + +#include "ExpressionParser.h" +#include "expressions.h" +#include "string_util.h" +#include "util/expression_path.h" +#include "util/make_unique.h" + +#include "grey.h" +#include "hs_compile.h" +#include "hs_internal.h" +#include "ue2common.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace ue2; + +namespace /* anonymous */ { + +// are we in streaming mode? (default: yes) +bool g_streaming = true; +bool g_vectored = false; +string g_exprPath(""); +string g_signatureFile(""); +bool g_allSignatures = false; +bool g_forceEditDistance = false; +bool build_sigs = false; +unsigned int g_signature; +unsigned int g_editDistance; +unsigned int globalFlags = 0; +unsigned int num_of_threads = 1; +unsigned int countFailures = 0; + +// Global greybox structure, used in non-release builds. +unique_ptr g_grey; + +// Global expression map. +ExpressionMap g_exprMap; + +// Iterator pointing to next expression to process. +ExpressionMap::const_iterator read_it; + +// Iterator pointing to next expression to print results. +ExpressionMap::const_iterator print_it; + +// Mutex guarding access to read iterator. +std::mutex lk_read; + +// Mutex serialising access to output map and stdout. +std::mutex lk_output; + +// Possible values for pattern check results. +enum ExprStatus {NOT_PROCESSED, SUCCESS, FAILURE}; + +// Map for storing results. +map> output; + +} // namespace + +static +bool getNextExpressionId(ExpressionMap::const_iterator &it) { + lock_guard lock(lk_read); + if (read_it != g_exprMap.end()) { + it = read_it; + ++read_it; + return true; + } else { + return false; + } +} + +// This function prints the Pattern IDs order +// It creates the output for build sigs +// Caller is required to hold lk_output when calling this function +static +void printExpressionId(const ExpressionMap &exprMap) { + while (print_it != exprMap.end()) { + unsigned int id = print_it->first; + const string ®ex = print_it->second; + const auto &result = output[id]; + if (result.second == NOT_PROCESSED) { + break; + } + bool fail = result.second == FAILURE; + if (!build_sigs) { + if (fail) { + cout << "FAIL (compile): " << id << ":" << regex << ": " + << result.first << endl; + } else { + cout << result.first << ' ' << id << ":" << regex << endl; + } + } else { + if (fail) { + cout << "# " << id << " # " << result.first << endl; + } else { + cout << id << endl; + } + } + + ++print_it; + } +} + +static +void recordFailure(const ExpressionMap &exprMap, unsigned int id, + const string &err) { + lock_guard lock(lk_output); + output[id].first = err; + output[id].second = FAILURE; + countFailures++; + printExpressionId(exprMap); +} + +static +void recordSuccess(const ExpressionMap &exprMap, unsigned int id) { + lock_guard lock(lk_output); + output[id].first = "OK:"; + output[id].second = SUCCESS; + printExpressionId(exprMap); +} + +static +void checkExpression(UNUSED void *threadarg) { + unsigned int mode = g_streaming ? HS_MODE_STREAM + : g_vectored ? HS_MODE_VECTORED + : HS_MODE_BLOCK; + if (g_streaming) { + // Use SOM mode, for permissiveness' sake. + mode |= HS_MODE_SOM_HORIZON_LARGE; + } + + ExpressionMap::const_iterator it; + while (getNextExpressionId(it)) { + const string &line = it->second; + + // Initial slash char is required, but unused. + if (line.empty() || line[0] != '/') { + recordFailure(g_exprMap, it->first, + "Format required is \"ID:/REGEX/FLAGS\"."); + continue; + } + + // Make a mutable copy and trim any whitespace on the right. + string expr = line; + boost::trim(expr); + + size_t flagsStart = expr.find_last_of('/'); + if (flagsStart == string::npos || flagsStart == 0) { + recordFailure(g_exprMap, it->first, "No trailing '/' char."); + continue; + } + + string regex; + unsigned int flags = 0; + hs_expr_ext ext; + if (!readExpression(expr, regex, &flags, &ext)) { + recordFailure(g_exprMap, it->first, "Unsupported flag used."); + continue; + } + + flags |= globalFlags; + if (g_forceEditDistance) { + ext.edit_distance = g_editDistance; + ext.flags |= HS_EXT_FLAG_EDIT_DISTANCE; + } + + // Try and compile a database. + const char *regexp = regex.c_str(); + const hs_expr_ext *extp = &ext; + + hs_error_t err; + hs_compile_error_t *compile_err; + hs_database_t *db = nullptr; + +#if !defined(RELEASE_BUILD) + // This variant is available in non-release builds and allows us to + // modify greybox settings. + err = hs_compile_multi_int(®exp, &flags, nullptr, &extp, 1, mode, + nullptr, &db, &compile_err, *g_grey); +#else + err = hs_compile_ext_multi(®exp, &flags, nullptr, &extp, 1, mode, + nullptr, &db, &compile_err); +#endif + + if (err == HS_SUCCESS) { + assert(db); + recordSuccess(g_exprMap, it->first); + hs_free_database(db); + } else { + assert(!db); + assert(compile_err); + recordFailure(g_exprMap, it->first, compile_err->message); + hs_free_compile_error(compile_err); + } + } +} + +static +void usage() { + cout << "Usage: hscheck [OPTIONS...]" << endl << endl + << " -e PATH Path to expression directory." << endl + << " -s FILE Signature file to use." << endl + << " -z NUM Signature ID to use." << endl + << " -E DISTANCE Force edit distance to DISTANCE for all patterns." << endl +#ifndef RELEASE_BUILD + << " -G OVERRIDES Overrides for the grey." << endl +#endif + << " -V Operate in vectored mode." << endl + << " -N Operate in block mode (default: streaming)." << endl + << " -L Pass HS_FLAG_SOM_LEFTMOST for all expressions (default: off)." << endl + << " -8 Force UTF8 mode on all patterns." << endl + << " -T NUM Run with NUM threads." << endl + << " -h Display this help." << endl + << " -B Build signature set." << endl + << endl; +} + +static +void processArgs(int argc, char *argv[], UNUSED unique_ptr &grey) { + const char options[] = "e:E:s:z:hLNV8G:T:B"; + bool signatureSet = false; + + for (;;) { + int c = getopt_long(argc, argv, options, nullptr, nullptr); + if (c < 0) { + break; + } + switch (c) { + case 'e': + g_exprPath.assign(optarg); + break; + case 'h': + usage(); + exit(0); + break; + case 's': + g_signatureFile.assign(optarg); + break; + case 'E': + if (!fromString(optarg, g_editDistance)) { + usage(); + exit(1); + } + g_forceEditDistance = true; + break; + case 'z': + if (!fromString(optarg, g_signature)) { + usage(); + exit(1); + } + signatureSet = true; + break; + case '8': + globalFlags |= HS_FLAG_UTF8; + break; + +#ifndef RELEASE_BUILD + case 'G': + applyGreyOverrides(grey.get(), string(optarg)); + break; +#endif + case 'L': + globalFlags |= HS_FLAG_SOM_LEFTMOST; + break; + case 'N': + g_streaming = false; + break; + case 'V': + g_streaming = false; + g_vectored = true; + break; + case 'T': + num_of_threads = atoi(optarg); + break; + case 'B': + build_sigs = true; + break; + default: + usage(); + exit(1); + } + } + + if (g_exprPath.empty() && !g_signatureFile.empty()) { + /* attempt to infer an expression directory */ + g_exprPath = inferExpressionPath(g_signatureFile); + } + + if (g_exprPath.empty()) { + usage(); + exit(1); + } + + if (!isDir(g_exprPath) && isFile(g_exprPath) + && g_signatureFile.empty() && !signatureSet) { + g_allSignatures = true; + } + + if (g_signatureFile.empty() && !signatureSet && !g_allSignatures) { + usage(); + exit(1); + } +} + +static +void failLine(unsigned lineNum, const string &file, + const string &line, const string &error) { + cerr << "Parse error in file " << file + << " on line " << lineNum << ": " << error + << endl << "Line is: '" << line << "'" << endl; + exit(1); +} + +// load a list of signature IDs if Build_sigs is enabled +// If a line is commented out, this function still loads the corresponding ID. +// The commented out line should have the format #id# +// It then prints out a signature file with the IDs that compile successfully. +static +void loadSignatureBuildSigs(const string &inFile, + SignatureSet &signatures) { + ifstream f(inFile.c_str()); + if (!f.good()) { + cerr << "Can't open file: '" << inFile << "'" << endl; + exit(1); + } + + unsigned lineNum = 0; + string line; + while (getline(f, line)) { + lineNum++; + unsigned id; + // if line is empty, we can skip it + if (line.empty()) { + continue; + } + // if line is commented out, try to locate the ID + // Line is usually in the form #id# + if (line[0] == '#') { + string temp; + // skip the opening hash and see if there is a second + size_t comment = line.find_first_of('#', 1); + if (comment) { + temp = line.substr(1, comment - 1); + } else { + temp = line.substr(1, line.size()); + } + // cull any whitespace + boost::trim(temp); + + if (fromString(temp, id)) { + signatures.push_back(id); + } else { + // couldn't be turned into an ID, dump to stdout + cout << line << endl; + } + } else { // lines that don't begin with # + if (fromString(line, id)) { + signatures.push_back(id); + } else { + // Parse error occurred + failLine(lineNum, inFile, line, "Unable to parse ID."); + } + } + } +} + +int main(int argc, char **argv) { + num_of_threads = max(1u, std::thread::hardware_concurrency()); + +#if !defined(RELEASE_BUILD) + g_grey = make_unique(); +#endif + processArgs(argc, argv, g_grey); + + if (num_of_threads == 0) { + cout << "Error: Must have at least one thread." << endl; + exit(1); + } + + loadExpressions(g_exprPath, g_exprMap); + + if (!g_allSignatures) { + SignatureSet signatures; + if (!g_signatureFile.empty()) { + if (!build_sigs) { + loadSignatureList(g_signatureFile, signatures); + } else { + loadSignatureBuildSigs(g_signatureFile, signatures); + } + } else { + signatures.push_back(g_signature); + } + + g_exprMap = limitToSignatures(g_exprMap, signatures); + } + + if (g_exprMap.empty()) { + cout << "Warning: no signatures to scan. Exiting." << endl; + exit(0); + } + + read_it = g_exprMap.begin(); + print_it = g_exprMap.begin(); + vector threads(num_of_threads); + + for (unsigned int i = 0; i < num_of_threads; i++) { + threads[i] = thread(checkExpression, nullptr); + } + + for (unsigned int i = 0; i < num_of_threads; i++) { + threads[i].join(); + } + + if (!g_exprMap.empty() && !build_sigs) { + cout << "SUMMARY: " << countFailures << " of " + << g_exprMap.size() << " failed." << endl; + } + return 0; +} diff --git a/tools/hscollider/BoundedQueue.h b/tools/hscollider/BoundedQueue.h new file mode 100644 index 000000000..ff7d013bb --- /dev/null +++ b/tools/hscollider/BoundedQueue.h @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2016, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef BOUNDEDQUEUE_H +#define BOUNDEDQUEUE_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +//#define QUEUE_STATS 1 + +#ifdef QUEUE_STATS + +#include + +class BoundedQueueStats { +public: + size_t pop = 0; //!< Number of pop operations. + size_t pop_block = 0; //!< Number of pop operations that had to block. + size_t push = 0; //!< Number of push operations. + size_t push_elements = 0; //!< Number of elements pushed. + size_t push_block = 0; //!< Number of push operations that had to block. + size_t refill = 0; //!< Number of refills done. + size_t stolen_from = 0; //!< Number of times we were stolen from. + + void dump() const { + std::cout << "pop : " << pop << std::endl; + std::cout << "pop_block : " << pop_block << std::endl; + std::cout << "push : " << push << std::endl; + std::cout << "push_elements : " << push_elements << std::endl; + std::cout << "push_block : " << push_block << std::endl; + std::cout << "refill : " << refill << std::endl; + std::cout << "stolen_from : " << stolen_from << std::endl; + } +}; +#endif + +template +class BoundedQueue : boost::noncopyable { +private: + // Encapsulates a queue and the mutex used to protect access to it. + class MutexQueue { + public: + // Forwarded queue operations. + void push(std::unique_ptr elem) { q.push(std::move(elem)); } + void pop() { q.pop(); } + std::unique_ptr &front() { return q.front(); } + bool empty() const { return q.empty(); } + size_t size() const { return q.size(); } + + // Acquire the mutex lock. + std::unique_lock lock() { + return std::unique_lock(mutex); + } + +#ifdef QUEUE_STATS + BoundedQueueStats stats; +#endif + + private: + std::mutex mutex; + std::queue> q; + }; + +public: + BoundedQueue(size_t consumers, size_t size) + : max_elements(size), consumer_q(consumers) { + assert(consumers > 0); + assert(size > 0); + } + +#ifdef QUEUE_STATS + ~BoundedQueue() { + std::cout << "Global queue stats:" << std::endl; + global_q.stats.dump(); + std::cout << std::endl; + for (size_t i = 0; i < consumer_q.size(); i++) { + std::cout << "Consumer queue " << i << ":" << std::endl; + consumer_q[i].stats.dump(); + std::cout << std::endl; + } + } +#endif // QUEUE_STATS + + void push(std::unique_ptr elem) { + auto lock = global_q.lock(); + +#ifdef QUEUE_STATS + global_q.stats.push++; + global_q.stats.push_elements++; + if (global_q.size() >= max_elements) { + global_q.stats.push_block++; + } +#endif // QUEUE_STATS + + // Block until queue is able to accept new elements. + cond_can_accept.wait(lock, + [&] { return global_q.size() < max_elements; }); + assert(global_q.size() < max_elements); + + global_q.push(std::move(elem)); + cond_can_consume.notify_all(); + } + + template + void push(Iter begin, Iter end) { + using ElemType = typename std::remove_reference::type; + static_assert(std::is_same>::value, + "Iterator must be over unique_ptr"); + + if (begin == end) { + return; + } + + auto lock = global_q.lock(); + +#ifdef QUEUE_STATS + global_q.stats.push++; + global_q.stats.push_elements += std::distance(begin, end); + if (global_q.size() >= max_elements) { + global_q.stats.push_block++; + } +#endif // QUEUE_STATS + + // Block until queue is able to accept new elements. + cond_can_accept.wait(lock, + [&] { return global_q.size() < max_elements; }); + assert(global_q.size() < max_elements); + + for (auto it = begin; it != end; ++it) { + global_q.push(std::move(*it)); + } + cond_can_consume.notify_all(); + } + + std::unique_ptr pop(size_t consumer_id) { + assert(consumer_id < consumer_q.size()); + auto &q = consumer_q[consumer_id]; + + // Try and satisfy the request from our per-consumer queue. + { + auto consumer_lock = q.lock(); + if (!q.empty()) { + return pop_from_queue(q); + } + } + + // Try and satisfy the request with a refill from the global queue. + { + auto lock = global_q.lock(); + if (!global_q.empty()) { + auto consumer_lock = q.lock(); + return refill_and_pop(q); + } + } + + // Try and satisfy the request by stealing it from another queue. + for (size_t i = 1; i < consumer_q.size(); i++) { + size_t victim_id = (consumer_id + i) % consumer_q.size(); + auto &victim_q = consumer_q[victim_id]; + auto victim_lock = victim_q.lock(); + // Note: we don't steal sentinel elements. + if (!victim_q.empty() && victim_q.front() != nullptr) { +#ifdef QUEUE_STATS + victim_q.stats.stolen_from++; +#endif + return pop_from_queue(victim_q); + } + } + + // All avenues exhausted, we must block until we've received a new + // element. + auto lock = global_q.lock(); +#ifdef QUEUE_STATS + global_q.stats.pop_block++; +#endif + cond_can_consume.wait(lock, [&]{ return !global_q.empty(); }); + assert(!global_q.empty()); + auto consumer_lock = q.lock(); + return refill_and_pop(q); + } + +private: + std::unique_ptr pop_from_queue(MutexQueue &q) { + assert(!q.empty()); + auto elem = std::move(q.front()); + q.pop(); +#ifdef QUEUE_STATS + q.stats.pop++; +#endif + return elem; + } + + std::unique_ptr refill_and_pop(MutexQueue &q) { + assert(!global_q.empty()); + +#ifdef QUEUE_STATS + q.stats.refill++; +#endif + + auto elem = pop_from_queue(global_q); + if (elem == nullptr) { + return elem; // Sentinel. + } + + // Grab all subsequent elements that share the same ID. + const auto &id = elem->id; + while (!global_q.empty()) { + auto &first = global_q.front(); + if (first == nullptr) { +#ifdef QUEUE_STATS + q.stats.push++; + q.stats.push_elements++; +#endif + // Sentinel element. We can grab one, but no more. + q.push(pop_from_queue(global_q)); + break; + } + if (first->id != id) { + break; + } +#ifdef QUEUE_STATS + q.stats.push++; + q.stats.push_elements++; +#endif + q.push(pop_from_queue(global_q)); + } + + if (global_q.size() < max_elements) { + cond_can_accept.notify_all(); + } + + return elem; + } + + // Maximum number of elements in the global queue (subsequent push + // operations will block). Note that we may overshoot this value when + // handling bulk push operations. + const size_t max_elements; + + // Global queue. + MutexQueue global_q; + + // Per-consumer queues. + std::vector consumer_q; + + // Condition variable for producers to wait on when the queue is full. + std::condition_variable cond_can_accept; + + // Condition variable for consumers to wait on when the queue is empty. + std::condition_variable cond_can_consume; +}; + +#ifdef QUEUE_STATS +#undef QUEUE_STATS +#endif + +#endif // BOUNDEDQUEUE_H diff --git a/tools/hscollider/CMakeLists.txt b/tools/hscollider/CMakeLists.txt new file mode 100644 index 000000000..f05b444fb --- /dev/null +++ b/tools/hscollider/CMakeLists.txt @@ -0,0 +1,101 @@ +# we have a fixed requirement for PCRE +set(PCRE_REQUIRED_MAJOR_VERSION 8) +set(PCRE_REQUIRED_MINOR_VERSION 41) +set(PCRE_REQUIRED_VERSION ${PCRE_REQUIRED_MAJOR_VERSION}.${PCRE_REQUIRED_MINOR_VERSION}) + +include (${CMAKE_MODULE_PATH}/pcre.cmake) +if (NOT CORRECT_PCRE_VERSION) + message(STATUS "PCRE ${PCRE_REQUIRED_VERSION} not found, not building hscollider") + return() +endif() + +include_directories(${PCRE_INCLUDE_DIRS}) + +include(${CMAKE_MODULE_PATH}/backtrace.cmake) + +# we need static libs - too much deep magic for shared libs +if (NOT BUILD_STATIC_LIBS) + return () +endif () + +CHECK_FUNCTION_EXISTS(sigaltstack HAVE_SIGALTSTACK) +CHECK_FUNCTION_EXISTS(sigaction HAVE_SIGACTION) +CHECK_FUNCTION_EXISTS(setrlimit HAVE_SETRLIMIT) + +set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/ColliderCorporaParser.cpp + PROPERTIES + COMPILE_FLAGS "${RAGEL_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}") + +ragelmaker(ColliderCorporaParser.rl) + +# only set these after all tests are done +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}") + +SET(hscollider_SOURCES + common.h + BoundedQueue.h + Corpora.cpp + FileCorpora.h + FileCorpora.cpp + ColliderCorporaParser.h + ColliderCorporaParser.cpp + NfaGeneratedCorpora.h + NfaGeneratedCorpora.cpp + GraphTruth.h + GraphTruth.cpp + GroundTruth.h + GroundTruth.cpp + UltimateTruth.h + UltimateTruth.cpp + ResultSet.h + args.cpp + args.h + limit.cpp + pcre_util.cpp + sig.cpp + sig.h + DatabaseProxy.h + Thread.h + Thread.cpp + main.cpp +) + +set_source_files_properties(${hscollider_SOURCES} PROPERTIES + INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}) +add_executable(hscollider ${hscollider_SOURCES}) +add_dependencies(hscollider ragel_ColliderCorporaParser) +add_dependencies(hscollider pcre) + +if(NOT WIN32) + target_link_libraries(hscollider hs ${PCRE_LDFLAGS} databaseutil + expressionutil corpusomatic crosscompileutil pthread + "${BACKTRACE_LDFLAGS}") + +if(HAVE_BACKTRACE) + set_source_files_properties(hscollider_SOURCES COMPILE_FLAGS + "${BACKTRACE_CFLAGS}") +endif() +else() # WIN32 + target_link_libraries(hscollider hs ${PCRE_LDFLAGS} databaseutil + expressionutil corpusomatic crosscompileutil) +endif() + +add_custom_target( + collide_quick_test + COMMAND ${CMAKE_BINARY_DIR}/bin/hscollider + -s ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/signatures/collider_tests.txt + -c ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/corpora/* + -Z0 -t3 + DEPENDS hscollider +) + +add_custom_target( + collide_quick_test_block + COMMAND ${CMAKE_BINARY_DIR}/bin/hscollider + -s ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/signatures/collider_tests.txt + -c ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/corpora/* + -Z0 + DEPENDS hscollider +) diff --git a/tools/hscollider/ColliderCorporaParser.h b/tools/hscollider/ColliderCorporaParser.h new file mode 100644 index 000000000..385e4ec8e --- /dev/null +++ b/tools/hscollider/ColliderCorporaParser.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FILECORPORAPARSER_H +#define FILECORPORAPARSER_H + +#include + +struct Corpus; + +// parse an escaped string into a real data buffer +bool parseCorpus(const std::string &line, Corpus &c, unsigned int &id); + +#endif diff --git a/tools/hscollider/ColliderCorporaParser.rl b/tools/hscollider/ColliderCorporaParser.rl new file mode 100644 index 000000000..ab40b2ba3 --- /dev/null +++ b/tools/hscollider/ColliderCorporaParser.rl @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "ColliderCorporaParser.h" +#include "Corpora.h" + +#include "ue2common.h" + +#include +#include +#include +#include + +using namespace std; + +namespace /* anonymous */ { + +// Take a string like '\xFF' and convert it to the character it represents +char unhex(const char *start, UNUSED const char *end) { + assert(start + 4 == end); + assert(start[0] == '\\'); + assert(start[1] == 'x'); + assert(isxdigit(start[2])); + assert(isxdigit(start[2])); + + char temp[3] = {start[2], start[3], 0}; + + return strtol(temp, nullptr, 16); +} + +%%{ + machine FileCorporaParser; + + action accumulateNum { + num = (num * 10) + (fc - '0'); + } + + action handleHexEscaped { + sout.push_back(unhex(ts, te)); + } + + action handleSpecial { + switch (*(ts+1)) { + case '0': sout.push_back('\x00'); break; + case 'a': sout.push_back('\x07'); break; + case 'e': sout.push_back('\x1b'); break; + case 'f': sout.push_back('\x0c'); break; + case 'n': sout.push_back('\x0a'); break; + case 'v': sout.push_back('\x0b'); break; + case 'r': sout.push_back('\x0d'); break; + case 't': sout.push_back('\x09'); break; + default: fbreak; + } + } + + action handleMatch { + c.matches.insert(num); + } + + write data; +}%% + +} // namespace + +bool parseCorpus(const string &line, Corpus &c, unsigned int &id) { + const char *p = line.c_str(); + const char *pe = p + line.size(); + const char *eof = pe; + const char *ts; + const char *te; + int cs; + UNUSED int act; + + // For storing integers as they're scanned + unsigned int num = 0; + + string &sout = c.data; + + %%{ + id = ( digit @accumulateNum)+ >{num = 0;} @{id = num;}; + + backslashed = '\\' ^alnum; + specials = '\\' [0aefnvrt]; + hexescaped = '\\x' xdigit{2}; + + corpus_old := |* + hexescaped => handleHexEscaped; + specials => handleSpecial; + backslashed => { sout.push_back(*(ts + 1)); }; + any => { sout.push_back(*ts); }; + *|; + + corpus_new := |* + hexescaped => handleHexEscaped; + specials => handleSpecial; + backslashed => { sout.push_back(*(ts + 1)); }; + any - '"' => { sout.push_back(*ts); }; + '"' => { fgoto colon_sep; }; + *|; + + colon_sep := |* + ':' => {fgoto match_list; }; + *|; + + match_list := |* + (' '* (digit @accumulateNum)+ ' '* ','?) >{num = 0;} => handleMatch; + *|; + + # Old simple line format + line_old = id ':' @{ fgoto corpus_old; }; + + # New line format with matches + line_new = id "=\"" @{ c.hasMatches = true; fgoto corpus_new; }; + + main := ( line_new | line_old ); + + # Initialize and execute + write init; + write exec; + }%% + + return (cs != FileCorporaParser_error) && (p == pe); +} diff --git a/tools/hscollider/Corpora.cpp b/tools/hscollider/Corpora.cpp new file mode 100644 index 000000000..7345393d6 --- /dev/null +++ b/tools/hscollider/Corpora.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Corpora.h" + +CorporaSource::~CorporaSource() { } diff --git a/tools/hscollider/Corpora.h b/tools/hscollider/Corpora.h new file mode 100644 index 000000000..65fb58361 --- /dev/null +++ b/tools/hscollider/Corpora.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CORPORA_H +#define CORPORA_H + +#include +#include +#include + +#include + +struct Corpus { + Corpus() : hasMatches(false) {} + explicit Corpus(const std::string &s) : data(s), hasMatches(false) {} + + std::string data; // Corpus itself + bool hasMatches; // Have the matches been pre-calculated? + std::set matches; // end-offsets of matches +}; + +struct CorpusFailure { + explicit CorpusFailure(const std::string &s) : message(s) {} + std::string message; +}; + +// Abstract class for a corpora source: new ways to load or generate corpora +// can be written by subclassing this class and providing its generate +// method. +class CorporaSource : boost::noncopyable { +public: + // destructor + virtual ~CorporaSource(); + + // Make a copy of this corpora source. + virtual CorporaSource *clone() const = 0; + + // Generate corpora for the given signature ID, adding them to the + // vector of strings provided. + virtual void generate(unsigned id, std::vector &data) = 0; +}; + +#endif // CORPORA_H diff --git a/tools/hscollider/DatabaseProxy.h b/tools/hscollider/DatabaseProxy.h new file mode 100644 index 000000000..13b6f680f --- /dev/null +++ b/tools/hscollider/DatabaseProxy.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2015-2016, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef UE2COLLIDER_DATABASEPROXY_H +#define UE2COLLIDER_DATABASEPROXY_H + +#include "UltimateTruth.h" + +#include +#include +#include +#include + +#include + +/** + * When a compile fails for the first time, we throw this exception so that a + * compilation error can be reported to the user. Subsequent failures will + * simply return nullptr rather than throwing this exception. + */ +struct CompileFailed { +public: + explicit CompileFailed(const std::string &err) : error(err) {} + std::string error; +}; + +class DatabaseProxy : boost::noncopyable { +public: + explicit DatabaseProxy(const std::set &expr_ids) + : ids(expr_ids) {} + + explicit DatabaseProxy(std::shared_ptr built_db) + : db(built_db) {} + + std::shared_ptr get(const UltimateTruth &ultimate) { + std::lock_guard lock(mutex); + if (failed) { + // We have previously failed to compile this database. + return nullptr; + } + if (db) { + return db; + } + + // Database hasn't been compiled yet. + std::string error; + db = ultimate.compile(ids, error); + if (!db) { + failed = true; + throw CompileFailed(error); + } + + return db; + } + +private: + std::mutex mutex; + std::shared_ptr db; + std::set ids; + bool failed = false; // Database failed compilation. +}; + +#endif // UE2COLLIDER_DATABASEPROXY_H diff --git a/tools/hscollider/FileCorpora.cpp b/tools/hscollider/FileCorpora.cpp new file mode 100644 index 000000000..82488569f --- /dev/null +++ b/tools/hscollider/FileCorpora.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "ColliderCorporaParser.h" +#include "FileCorpora.h" +#include "common.h" +#include "util/expression_path.h" + +#include +#include + +#include + +using namespace std; + +// Returns true if this line is empty or a comment and should be skipped +static +bool emptyLine(const string& line) { + return line.empty() || line[0] == '#'; +} + +FileCorpora *FileCorpora::clone() const { + FileCorpora *copy = new FileCorpora(); + copy->corpora_by_pat = corpora_by_pat; + return copy; +} + +bool FileCorpora::readLine(const string &line) { + unsigned id = 0; + Corpus c; + bool rv = parseCorpus(line, c, id); + if (rv) { + corpora_by_pat[id].push_back(c); + return true; + } else { + return false; + } +} + +bool FileCorpora::readFile(const string &filename) { + ifstream f(filename.c_str()); + if (!f.good()) { + return false; + } + + unsigned lineNum = 0; + string line; + while (getline(f, line)) { + lineNum++; + + boost::trim(line); + + if (emptyLine(line)) { + continue; + } + if (!readLine(line)) { + cerr << "Error in corpora file parsing line " << lineNum << endl; + return false; + } + } + return !corpora_by_pat.empty(); +} + +void FileCorpora::generate(unsigned id, + vector &data) { + auto i = corpora_by_pat.find(id); + if (i == corpora_by_pat.end() || i->second.empty()) { + throw CorpusFailure("no corpora found for pattern."); + } + + data.insert(data.end(), i->second.begin(), i->second.end()); +} diff --git a/tools/hscollider/FileCorpora.h b/tools/hscollider/FileCorpora.h new file mode 100644 index 000000000..c34c72ffd --- /dev/null +++ b/tools/hscollider/FileCorpora.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FILECORPORA_H +#define FILECORPORA_H + +#include "Corpora.h" + +#include +#include +#include +#include + +class FileCorpora : public CorporaSource { +public: + // copy + FileCorpora *clone() const override; + + // read corpora in from a file + bool readFile(const std::string &filename); + + // generator + void generate(unsigned id, std::vector &data) override; + +private: + // read in a line from our file + bool readLine(const std::string &line); + + std::map> corpora_by_pat; +}; + +#endif diff --git a/tools/hscollider/GraphTruth.cpp b/tools/hscollider/GraphTruth.cpp new file mode 100644 index 000000000..5c4cd8e75 --- /dev/null +++ b/tools/hscollider/GraphTruth.cpp @@ -0,0 +1,308 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "GraphTruth.h" + +#include "common.h" +#include "expressions.h" +#include "ExpressionParser.h" +#include "ng_find_matches.h" +#include "pcre_util.h" + +#include "grey.h" +#include "hs_compile.h" +#include "ue2common.h" +#include "compiler/compiler.h" +#include "nfagraph/ng.h" +#include "nfagraph/ng_depth.h" +#include "nfagraph/ng_dump.h" +#include "nfagraph/ng_fuzzy.h" +#include "nfagraph/ng_holder.h" +#include "nfagraph/ng_util.h" +#include "parser/Parser.h" +#include "parser/unsupported.h" +#include "util/compile_context.h" +#include "util/make_unique.h" +#include "util/report_manager.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace ue2; + +// Struct to store the actual compiled NFA graph. +class CompiledNG : boost::noncopyable { +public: + CompiledNG(unique_ptr g_in, + unique_ptr rm_in) + : g(std::move(g_in)), rm(std::move(rm_in)) {} + unique_ptr g; + unique_ptr rm; +}; + +static +void populateMatchSet(ResultSet &rs, const set> &matches, + const CNGInfo &cngi) { + for (const auto &m : matches) { + u64a from = m.first; + u64a to = m.second; + if (g_streamOffset) { + // Subtract stream offset imposed by offset test. + u64a offset = min(100ull, g_streamOffset); + assert(to >= offset); + from -= min(offset, from); + to -= offset; + } + u64a len = to - from; + + if (to < cngi.min_offset || to > cngi.max_offset || + len < cngi.min_length) { + // this match does not satisfy extparams constraints + DEBUG_PRINTF("skipping NFA Match @ (%llu,%llu)\n", from, to); + continue; + } + if (!cngi.som) { + from = 0; + } + rs.addMatch(from, to); + } +} + +CNGInfo::CNGInfo(unsigned id_in, const ExpressionMap &m_expr_in) + : id(id_in), m_expr(m_expr_in) {} + +CNGInfo::~CNGInfo() = default; + +void CNGInfo::compile() { + auto i = m_expr.find(id); + if (i == m_expr.end()) { + throw NGCompileFailure("ID not found in expression map."); + } + + string re; + unsigned hs_flags; + hs_expr_ext ext; + + // read the flags for NFA compiler + if (!readExpression(i->second, re, &hs_flags, &ext)) { + throw NGCompileFailure("Cannot parse expression flags."); + } + // make sure we respect collider's UTF-8 setting + if (force_utf8) { + hs_flags |= HS_FLAG_UTF8; + } + + try { + bool isStreaming = colliderMode == MODE_STREAMING; + bool isVectored = colliderMode == MODE_VECTORED; + CompileContext cc(isStreaming, isVectored, get_current_target(), + Grey()); + ParsedExpression pe(0, re.c_str(), hs_flags, 0, &ext); + + // UE-2850: ParsedExpression may have updated the utf8 flag if the + // original expression starts with (*UTF8) + utf8 |= pe.expr.utf8; + + auto rm = ue2::make_unique(cc.grey); + + // Expressions containing zero-width assertions and other extended pcre + // types aren't supported yet. This call will throw a ParseError + // exception if the component tree contains such a construct. + checkUnsupported(*pe.component); + + pe.component->checkEmbeddedStartAnchor(true); + pe.component->checkEmbeddedEndAnchor(true); + + // edit distance may be set globally + if (force_edit_distance) { + pe.expr.edit_distance = edit_distance; + } + + // validate_fuzzy_compile checks this, but we don't need to build the + // graph to know it will fail + if (pe.expr.edit_distance && utf8) { + throw NGCompileFailure("UTF-8 patterns cannot be " + "approximately matched"); + } + + auto built_expr = buildGraph(*rm, cc, pe); + auto &expr = built_expr.expr; + auto &g = built_expr.g; + + if (expr.edit_distance || expr.hamm_distance) { + // check if this pattern can be approximately matched, throws + // CompileError on failure + bool hamming = expr.hamm_distance > 0; + u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance; + validate_fuzzy_compile(*g, e_dist, hamming, utf8, cc.grey); + } + + if (isVacuous(*g)) { + if (som) { + throw NGUnsupportedFailure("Vacuous patterns are not supported " + "in SOM mode"); + } + if (expr.min_length > 0) { + throw NGUnsupportedFailure("Vacuous patterns are not supported " + "in combination with min_length"); + } + } + + cng = make_unique(move(g), move(rm)); + } catch (CompileError &e) { + throw NGCompileFailure(e.reason); + } catch (NGUnsupportedFailure &e) { + throw NGCompileFailure(e.msg); + } catch (...) { + throw NGCompileFailure("NFA graph construction failed"); + } +} + +GraphTruth::GraphTruth(ostream &os, const ExpressionMap &expr) + : out(os), m_expr(expr) {} + +unique_ptr GraphTruth::preprocess(unsigned id, + bool ignoreUnsupported) { + bool highlander = false; + bool prefilter = false; + bool som = false; + + auto i = m_expr.find(id); + if (i == m_expr.end()) { + throw NGCompileFailure("ID not found in expression map."); + } + + string re; + unsigned flags, hs_flags; + hs_expr_ext ext; + + // read the flags for NFA compiler + if (!readExpression(i->second, re, &hs_flags, &ext)) { + throw NGCompileFailure("Cannot parse expression flags."); + } + // read PCRE flags + if (!getPcreFlags(hs_flags, &flags, &highlander, &prefilter, &som)) { + throw NGCompileFailure("Cannot get PCRE flags."); + } + if (force_utf8) { + hs_flags |= HS_FLAG_UTF8; + } + + // edit distance might be set globally + if (force_edit_distance) { + ext.edit_distance = edit_distance; + } + + // SOM flags might be set globally. + som |= !!somFlags; + + if (force_prefilter) { + prefilter = true; + } + + u64a supported_flags = HS_EXT_FLAG_HAMMING_DISTANCE | + HS_EXT_FLAG_EDIT_DISTANCE | HS_EXT_FLAG_MIN_OFFSET | + HS_EXT_FLAG_MAX_OFFSET | HS_EXT_FLAG_MIN_LENGTH; + if (ext.flags & ~supported_flags) { + if (!ignoreUnsupported) { + throw NGUnsupportedFailure("Unsupported extended flags specified."); + } + } + + auto cngi = make_unique(id, m_expr); + cngi->utf8 = hs_flags & HS_FLAG_UTF8; + cngi->highlander = highlander; + cngi->prefilter = prefilter; + cngi->som = som; + cngi->min_offset = ext.min_offset; + cngi->max_offset = ext.max_offset; + cngi->min_length = ext.min_length; + cngi->max_edit_distance = ext.edit_distance; + cngi->max_hamm_distance = ext.hamming_distance; + + return cngi; +} + +bool GraphTruth::run(unsigned, const CompiledNG &cng, const CNGInfo &cngi, + const string &buffer, ResultSet &rs, string &) { + set> matches; + + if (g_streamOffset) { + size_t offset = MIN(100, g_streamOffset); + assert(offset > 0); + const string preamble(string(offset, '\0')); + + set> pre_matches; + + // First, scan an empty buffer size of the preamble so that we can + // discard any matches therein after the real scan, later. We use + // notEod so that end-anchors in our expression don't match at the + // end of the buffer. + if (!findMatches(*cng.g, *cng.rm, preamble, pre_matches, + cngi.max_edit_distance, cngi.max_hamm_distance, true, + cngi.utf8)) { + return false; + } + + // Real scan. + if (!findMatches(*cng.g, *cng.rm, preamble + buffer, matches, + cngi.max_edit_distance, cngi.max_hamm_distance, false, + cngi.utf8)) { + return false; + } + + // Erase any matches due entirely to the preamble. + for (const auto &m : pre_matches) { + matches.erase(m); + } + } else { + if (!findMatches(*cng.g, *cng.rm, buffer, matches, + cngi.max_edit_distance, cngi.max_hamm_distance, false, + cngi.utf8)) { + return false; + } + } + + populateMatchSet(rs, matches, cngi); + + if (echo_matches) { + for (const auto &m : rs.matches) { + out << "NFA Match @ (" << m.from << "," << m.to << ")" << endl; + } + } + + return true; +} diff --git a/tools/hscollider/GraphTruth.h b/tools/hscollider/GraphTruth.h new file mode 100644 index 000000000..5f53899c8 --- /dev/null +++ b/tools/hscollider/GraphTruth.h @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef GRAPHTRUTH_H +#define GRAPHTRUTH_H + +#include "expressions.h" +#include "ResultSet.h" + +#include "hs_compile.h" // for hs_expr_ext +#include "ue2common.h" + +#include +#include +#include + +#include + +namespace ue2 { + +class ReportManager; +struct BoundaryReports; + +} // namespace ue2 + +struct NGCompileFailure { + explicit NGCompileFailure(const std::string &msg_s) : msg(msg_s) {} + std::string msg; +}; + +struct NGUnsupportedFailure { + explicit NGUnsupportedFailure(const std::string &msg_s) : msg(msg_s) {} + std::string msg; +}; + +// Struct to store the actual compiled NFA graph. +class CompiledNG; + +// Struct to store the precompile information about the graph. +class CNGInfo : boost::noncopyable { +public: + CNGInfo(unsigned id_in, const ExpressionMap &m_expr_in); + ~CNGInfo(); + + bool is_bad() { + std::lock_guard lock(bad_mutex); + bool val = bad; + return val; + } + + void mark_bad() { + std::lock_guard lock(bad_mutex); + bad = true; + } + + const CompiledNG *get() { + std::lock_guard lock(cng_mutex); + + if (cng) { + return cng.get(); + } + + // NFA graph hasn't been compiled yet. + try { + compile(); + } catch (NGCompileFailure &e) { + throw NGCompileFailure(e); + } catch (NGUnsupportedFailure &e) { + throw NGCompileFailure(e.msg); + } + + return cng.get(); + } + + u64a min_offset = 0; + u64a max_offset = 0; + u64a min_length = 0; + u32 max_edit_distance = 0; + u32 max_hamm_distance = 0; + bool utf8 = false; + bool highlander = false; + bool prefilter = false; + bool som = false; +private: + void compile(); + // If NFA graph scan failed for some reason, we mark it as bad and skip + // the remaining tests for it for performance reasons. + bool bad = false; + std::mutex bad_mutex; // serialised accesses to bad flag. + + std::unique_ptr cng; // compiled NFA graph + std::mutex cng_mutex; // serialised accesses to NFA graph + + unsigned id; + + // Our expression map + const ExpressionMap &m_expr; +}; + + +class GraphTruth : boost::noncopyable { +public: + GraphTruth(std::ostream &os, const ExpressionMap &expr); + + bool run(unsigned id, const CompiledNG &cng, const CNGInfo &cngi, + const std::string &buffer, ResultSet &rs, std::string &error); + + std::unique_ptr preprocess(unsigned id, + bool ignoreUnsupported = false); + +private: + // Output stream. + std::ostream &out; + + // Our expression map + const ExpressionMap &m_expr; +}; + +#endif diff --git a/tools/hscollider/GroundTruth.cpp b/tools/hscollider/GroundTruth.cpp new file mode 100644 index 000000000..b0fe384d5 --- /dev/null +++ b/tools/hscollider/GroundTruth.cpp @@ -0,0 +1,513 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "common.h" +#include "ExpressionParser.h" +#include "expressions.h" +#include "GroundTruth.h" +#include "pcre_util.h" + +#include "hs_compile.h" // for hs_expr_ext +#include "ue2common.h" +#include "parser/control_verbs.h" +#include "parser/Parser.h" +#include "parser/parse_error.h" +#include "util/make_unique.h" +#include "util/unicode_def.h" +#include "util/unordered.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* -X, -Y support + * as PCRE performance is `non-linear' and these options add a large amount of + * scanning, the following short cuts are used: + * 1: the suffix is not scanned - we are more interested in the matches from + * the original corpora. + * 2: only the last 50 bytes of the prefix is scanned. This may lead to some + * minor correctness issues for a few patterns. + */ + +using namespace std; +using namespace ue2; + +// We store matches in a hash table as we're likely to see lots of them. These +// are moved into a ResultSet at the end. +using PcreMatchSet = ue2::ue2_unordered_set>; + +namespace { +struct CalloutContext { + explicit CalloutContext(ostream &os) : out(os) {} + ostream &out; + PcreMatchSet matches; +}; +} + +static +int pcreCallOut(pcre_callout_block *block) { + assert(block); + assert(block->callout_data); + CalloutContext *ctx = static_cast(block->callout_data); + + if (echo_matches) { + ctx->out << "PCRE Match @ (" << block->start_match << "," + << block->current_position << ")" << endl; + } + + unsigned int from = block->start_match; + unsigned int to = block->current_position; + assert(from <= to); + + ctx->matches.insert(make_pair(from, to)); + return 1; +} + +static +bool decodeExprPcre(string &expr, unsigned *flags, bool *highlander, + bool *prefilter, bool *som, hs_expr_ext *ext) { + string regex; + unsigned int hs_flags = 0; + if (!readExpression(expr, regex, &hs_flags, ext)) { + return false; + } + + expr.swap(regex); + + if (!getPcreFlags(hs_flags, flags, highlander, prefilter, som)) { + return false; + } + + if (force_utf8) { + *flags |= PCRE_UTF8; + } + + if (force_prefilter) { + *prefilter = true; + } + + return true; +} + +static +string pcreErrStr(int err) { + switch (err) { + case PCRE_ERROR_NOMATCH: + return "PCRE_ERROR_NOMATCH"; + case PCRE_ERROR_NULL: + return "PCRE_ERROR_NULL"; + case PCRE_ERROR_BADOPTION: + return "PCRE_ERROR_BADOPTION"; + case PCRE_ERROR_BADMAGIC: + return "PCRE_ERROR_BADMAGIC"; +#if defined(PCRE_ERROR_UNKNOWN_OPCODE) + case PCRE_ERROR_UNKNOWN_OPCODE: + return "PCRE_ERROR_UNKNOWN_OPCODE"; +#else + case PCRE_ERROR_UNKNOWN_NODE: + return "PCRE_ERROR_UNKNOWN_NODE"; +#endif + case PCRE_ERROR_NOMEMORY: + return "PCRE_ERROR_NOMEMORY"; + case PCRE_ERROR_NOSUBSTRING: + return "PCRE_ERROR_NOSUBSTRING"; + case PCRE_ERROR_MATCHLIMIT: + return "PCRE_ERROR_MATCHLIMIT"; + case PCRE_ERROR_CALLOUT: + return "PCRE_ERROR_CALLOUT"; + case PCRE_ERROR_BADUTF8: + return "PCRE_ERROR_BADUTF8"; + case PCRE_ERROR_BADUTF8_OFFSET: + return "PCRE_ERROR_BADUTF8_OFFSET"; + case PCRE_ERROR_PARTIAL: + return "PCRE_ERROR_PARTIAL"; + case PCRE_ERROR_BADPARTIAL: + return "PCRE_ERROR_BADPARTIAL"; + case PCRE_ERROR_INTERNAL: + return "PCRE_ERROR_INTERNAL"; + case PCRE_ERROR_BADCOUNT: + return "PCRE_ERROR_BADCOUNT"; +#if defined(PCRE_ERROR_RECURSIONLIMIT) + case PCRE_ERROR_RECURSIONLIMIT: + return "PCRE_ERROR_RECURSIONLIMIT"; +#endif + case PCRE_ERROR_DFA_UITEM: + return "PCRE_ERROR_DFA_UITEM"; + case PCRE_ERROR_DFA_UCOND: + return "PCRE_ERROR_DFA_UCOND"; + case PCRE_ERROR_DFA_UMLIMIT: + return "PCRE_ERROR_DFA_UMLIMIT"; + case PCRE_ERROR_DFA_WSSIZE: + return "PCRE_ERROR_DFA_WSSIZE"; + case PCRE_ERROR_DFA_RECURSE: + return "PCRE_ERROR_DFA_RECURSE"; + default: + { + ostringstream oss; + oss << "Unknown PCRE error (value: " << err << ")"; + return oss.str(); + } + } +} + +GroundTruth::GroundTruth(ostream &os, const ExpressionMap &expr, + unsigned long int limit, + unsigned long int limit_recursion) + : out(os), m_expr(expr), matchLimit(limit), + matchLimitRecursion(limit_recursion) {} + +void GroundTruth::global_prep() { + // We're using pcre callouts + pcre_callout = &pcreCallOut; +} + +static +void addCallout(string &re) { + // If the string begins with "(*UTF8)" or "(*UTF8)(*UCP)", we want to keep + // it at the front. We reuse the control verbs mini-parser for this. + size_t startpos = 0; + try { + ue2::ParseMode mode; + const char *ptr = ue2::read_control_verbs( + re.c_str(), re.c_str() + re.size(), 0, mode); + startpos = ptr - re.c_str(); + } catch (const ue2::ParseError &err) { + // fall through + } + assert(startpos <= re.length()); + re.insert(startpos, "(?:"); + // We include a \E to close any open \Q quoted block. If there isn't + // one, pcre will ignore the \E. + re.append("\\E)(?C)"); +} + +unique_ptr +GroundTruth::compile(unsigned id, bool no_callouts) { + bool highlander = false; + bool prefilter = false; + bool som = false; + + // we can still match approximate matching patterns with PCRE if edit + // distance 0 is requested + if (force_edit_distance && edit_distance) { + throw SoftPcreCompileFailure("Edit distance not supported by PCRE."); + } + + ExpressionMap::const_iterator i = m_expr.find(id); + if (i == m_expr.end()) { + throw PcreCompileFailure("ID not found in expression map."); + } + + string re(i->second); + unsigned flags; + hs_expr_ext ext; + + // Decode the flags + if (!decodeExprPcre(re, &flags, &highlander, &prefilter, &som, &ext)) { + throw PcreCompileFailure("Unable to decode flags."); + } + + // filter out flags not supported by PCRE + u64a supported = HS_EXT_FLAG_MIN_OFFSET | HS_EXT_FLAG_MAX_OFFSET | + HS_EXT_FLAG_MIN_LENGTH; + if (ext.flags & ~supported) { + // edit distance is a known unsupported flag, so just throw a soft error + if (ext.flags & HS_EXT_FLAG_EDIT_DISTANCE) { + throw SoftPcreCompileFailure("Edit distance not supported by PCRE."); + } + if (ext.flags & HS_EXT_FLAG_HAMMING_DISTANCE) { + throw SoftPcreCompileFailure( + "Hamming distance not supported by PCRE."); + } + throw PcreCompileFailure("Unsupported extended flags."); + } + + // SOM flags might be set globally. + som |= !!somFlags; + + // For traditional Hyperscan, add global callout to pattern. + if (!no_callouts) { + addCallout(re); + } + + // Compile the pattern + const char *errptr = nullptr; + int errloc = 0; + int errcode = 0; + + unique_ptr compiled = make_unique(); + compiled->utf8 = flags & PCRE_UTF8; + compiled->highlander = highlander; + compiled->prefilter = prefilter; + compiled->som = som; + compiled->min_offset = ext.min_offset; + compiled->max_offset = ext.max_offset; + compiled->min_length = ext.min_length; + compiled->expression = i->second; // original PCRE + flags |= PCRE_NO_AUTO_POSSESS; + + compiled->bytecode = + pcre_compile2(re.c_str(), flags, &errcode, &errptr, &errloc, nullptr); + + if (!compiled->bytecode || errptr) { + assert(errcode); + ostringstream oss; + oss << "Failed to compile expression '" << re << '\''; + oss << " (" << errptr << " at " << errloc << ")."; + if (errcode == 20) { // "regular expression is too large" + throw SoftPcreCompileFailure(oss.str()); + } else if (errcode == 25) { // "lookbehind assertion is not fixed length" + throw SoftPcreCompileFailure(oss.str()); + } else { + throw PcreCompileFailure(oss.str()); + } + } + + // Study the pattern + shared_ptr extra(pcre_study(compiled->bytecode, 0, &errptr), + free); + if (errptr) { + ostringstream oss; + oss << "Error studying pattern (" << errptr << ")."; + throw PcreCompileFailure(oss.str()); + } + + int infoRes = + pcre_fullinfo(compiled->bytecode, extra.get(), PCRE_INFO_CAPTURECOUNT, + &compiled->captureCount); + if (infoRes < PCRE_ERROR_NOMATCH) { + ostringstream oss; + oss << "Error determining number of capturing subpatterns (" + << pcreErrStr(infoRes) << ")."; + throw PcreCompileFailure(oss.str()); + } + + return compiled; +} + +static +void filterLeftmostSom(ResultSet &rs) { + if (rs.matches.size() <= 1) { + return; + } + + set seen; // End offsets. + set::iterator it = rs.matches.begin(); + while (it != rs.matches.end()) { + if (seen.insert(it->to).second) { + ++it; // First time we've seen this end-offset. + } else { + rs.matches.erase(it++); // Dupe with a "righter" SOM. + } + } +} + +static +void filterExtParams(ResultSet &rs, const CompiledPcre &compiled) { + set::iterator it = rs.matches.begin(); + while (it != rs.matches.end()) { + unsigned int from = it->from, to = it->to; + unsigned int len = to - from; + if (to < compiled.min_offset || to > compiled.max_offset || + len < compiled.min_length) { + rs.matches.erase(it++); + } else { + ++it; + } + } +} + +static +int scanBasic(const CompiledPcre &compiled, const string &buffer, + const pcre_extra &extra, vector &ovector, + CalloutContext &ctx) { + const size_t prefix_len = g_corpora_prefix.size(); + const size_t suffix_len = g_corpora_suffix.size(); + + size_t begin_offset = prefix_len - MIN(50, prefix_len); + size_t real_len = buffer.size(); + + if (suffix_len > 2) { + real_len -= suffix_len - 2; + } + + int flags = suffix_len ? PCRE_NOTEOL : 0; + int ret = pcre_exec(compiled.bytecode, &extra, buffer.c_str(), real_len, + begin_offset, flags, &ovector[0], ovector.size()); + + if (!g_corpora_prefix.empty()) { + PcreMatchSet tmp; + tmp.swap(ctx.matches); + + for (const auto &m : tmp) { + unsigned from = m.first; + unsigned to = m.second; + if (to >= prefix_len && to <= buffer.size() - suffix_len) { + from = from < prefix_len ? 0 : from - prefix_len; + to -= prefix_len; + ctx.matches.insert(make_pair(from, to)); + } + } + } + + return ret; +} + +static +int scanOffset(const CompiledPcre &compiled, const string &buffer, + const pcre_extra &extra, vector &ovector, + CalloutContext &ctx) { + size_t offset = MIN(100, g_streamOffset); + assert(offset > 0); + + const string buf(string(offset, '\0') + buffer); + + // First, scan our preamble so that we can discard any matches therein + // after the real scan, later. We use PCRE_NOTEOL so that end-anchors in + // our expression don't match at the end of the preamble. + int ret = pcre_exec(compiled.bytecode, &extra, buf.c_str(), offset, 0, + PCRE_NOTEOL, &ovector[0], ovector.size()); + if (ret < PCRE_ERROR_NOMATCH) { + return ret; + } + + PcreMatchSet pre_matches; + pre_matches.swap(ctx.matches); + + // Real scan. + ret = pcre_exec(compiled.bytecode, &extra, buf.c_str(), buf.size(), 0, 0, + &ovector[0], ovector.size()); + if (ret < PCRE_ERROR_NOMATCH) { + return ret; + } + + // Erase any matches due entirely to the preamble. + for (const auto &m : pre_matches) { + ctx.matches.erase(m); + } + + return ret; +} + +bool GroundTruth::run(unsigned, const CompiledPcre &compiled, + const string &buffer, ResultSet &rs, string &error) { + CalloutContext ctx(out); + + pcre_extra extra; + extra.flags = 0; + + // Switch on callouts. + extra.flags |= PCRE_EXTRA_CALLOUT_DATA; + extra.callout_data = &ctx; + + // Set the match_limit (in order to bound execution time on very complex + // patterns) + extra.flags |= (PCRE_EXTRA_MATCH_LIMIT | PCRE_EXTRA_MATCH_LIMIT_RECURSION); + extra.match_limit = matchLimit; + extra.match_limit_recursion = matchLimitRecursion; + +#ifdef PCRE_NO_START_OPTIMIZE + // Switch off optimizations that may result in callouts not occurring. + extra.flags |= PCRE_NO_START_OPTIMIZE; +#endif + + // Ensure there's enough room in the ovector for the capture groups in this + // pattern. + int ovecsize = (compiled.captureCount + 1) * 3; + ovector.resize(ovecsize); + + int ret; + switch (colliderMode) { + case MODE_BLOCK: + case MODE_STREAMING: + case MODE_VECTORED: + if (g_streamOffset) { + ret = scanOffset(compiled, buffer, extra, ovector, ctx); + } else { + ret = scanBasic(compiled, buffer, extra, ovector, ctx); + } + break; + default: + assert(0); + ret = PCRE_ERROR_NULL; + break; + } + + if (ret < PCRE_ERROR_NOMATCH) { + error = pcreErrStr(ret); + return false; + } + + // Move matches into a ResultSet. + for (const auto &m : ctx.matches) { + unsigned long long from = m.first; + unsigned long long to = m.second; + + if (g_streamOffset) { + // Subtract stream offset imposed by offset test. + unsigned long long offset = min(100ull, g_streamOffset); + assert(to >= offset); + from -= min(offset, from); + to -= offset; + } + + rs.addMatch(from, to); + } + + // If we have no matches, there's no further work to do. + if (rs.matches.empty()) { + return true; + } + + if (compiled.som) { + filterLeftmostSom(rs); + } + + filterExtParams(rs, compiled); + + // If we haven't been asked for SOM, strip the from offsets. + if (!compiled.som) { + set endonly; + for (const auto &m : rs.matches) { + endonly.insert(MatchResult(0, m.to)); + } + rs.matches.swap(endonly); + } + + return true; +} diff --git a/tools/hscollider/GroundTruth.h b/tools/hscollider/GroundTruth.h new file mode 100644 index 000000000..bcab55992 --- /dev/null +++ b/tools/hscollider/GroundTruth.h @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef GROUNDTRUTH_H +#define GROUNDTRUTH_H + +#include "expressions.h" +#include "ResultSet.h" + +#include +#include +#include +#include + +#include + +#include + +// Thrown by GroundTruth::compile in the event of a PCRE compile failure. +struct PcreCompileFailure { + PcreCompileFailure(const std::string &msg_s) : msg(msg_s) {} + std::string msg; +}; + +// Thrown in the event of a "soft" PCRE compile failure, one that we don't want +// to consider a ue2collider failure (e.g. "regular expression too large"). +struct SoftPcreCompileFailure : PcreCompileFailure { + SoftPcreCompileFailure(const std::string &msg_s) + : PcreCompileFailure(msg_s) {} +}; + +// Struct to store everything about a PCRE. Note that the code assumes that +// once populated, the data in this structure will remain constant while tests +// are running, except for the bad flag (which is protected by a mutex). +class CompiledPcre : boost::noncopyable { +public: + CompiledPcre() {} + ~CompiledPcre() { + free(bytecode); + } + + bool is_bad() { + std::lock_guard lock(bad_mutex); + bool val = bad; + return val; + } + + void mark_bad() { + std::lock_guard lock(bad_mutex); + bad = true; + } + + std::string expression; + pcre *bytecode = nullptr; + unsigned long long min_offset = 0; + unsigned long long max_offset = ~0ULL; + unsigned long long min_length = 0; + int captureCount = 0; + bool utf8 = false; + bool highlander = false; + bool prefilter = false; + bool som = false; + +private: + // If a PCRE has hit its match recursion limit when scanning a corpus, we + // mark it as bad and skip the remaining tests for it for performance + // reasons. + bool bad = false; + std::mutex bad_mutex; // serialised accesses to bad flag. +}; + +// Wrapper around libpcre to generate results for an expression and corpus. +class GroundTruth : boost::noncopyable { +public: + GroundTruth(std::ostream &os, const ExpressionMap &expr, + unsigned long limit, unsigned long limit_recursion); + + static void global_prep(); + + std::unique_ptr compile(unsigned id, + bool no_callouts = false); + + bool run(unsigned id, const CompiledPcre &compiled, + const std::string &buffer, ResultSet &rs, std::string &error); + +private: + // Output stream. + std::ostream &out; + + // Our expression map + const ExpressionMap &m_expr; + + // PCRE match limit + const unsigned long int matchLimit; + const unsigned long int matchLimitRecursion; + + // Persistent ovector used to run tests. + std::vector ovector; +}; + +#endif diff --git a/tools/hscollider/NfaGeneratedCorpora.cpp b/tools/hscollider/NfaGeneratedCorpora.cpp new file mode 100644 index 000000000..32933be42 --- /dev/null +++ b/tools/hscollider/NfaGeneratedCorpora.cpp @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "ng_corpus_properties.h" +#include "ng_corpus_generator.h" +#include "NfaGeneratedCorpora.h" +#include "ExpressionParser.h" + +#include "grey.h" +#include "hs_compile.h" +#include "compiler/compiler.h" +#include "nfagraph/ng.h" +#include "parser/parse_error.h" +#include "parser/Parser.h" +#include "parser/prefilter.h" +#include "parser/unsupported.h" +#include "util/compile_context.h" +#include "util/compile_error.h" +#include "util/report_manager.h" +#include "util/target_info.h" + +#include +#include +#include + +using namespace std; +using namespace ue2; + +NfaGeneratedCorpora::NfaGeneratedCorpora(const ExpressionMap &expr, + const CorpusProperties &props, + bool force_utf8_mode_in, + bool force_prefilter_mode_in) + : m_expr(expr), m_props(props), force_utf8_mode(force_utf8_mode_in), + force_prefilter_mode(force_prefilter_mode_in) { + // empty +} + +NfaGeneratedCorpora *NfaGeneratedCorpora::clone() const { + return new NfaGeneratedCorpora(m_expr, m_props, force_utf8_mode, + force_prefilter_mode); +} + +void NfaGeneratedCorpora::generate(unsigned id, vector &data) { + ExpressionMap::const_iterator i = m_expr.find(id); + if (i == m_expr.end()) { + throw CorpusFailure("Expression not found."); + } + + string re; + u32 hs_flags; + hs_expr_ext ext; + if (!readExpression(i->second, re, &hs_flags, &ext)) { + throw CorpusFailure("Expression could not be read: " + i->second); + } + + if (force_utf8_mode) { + hs_flags |= HS_FLAG_UTF8; + } + + if (force_prefilter_mode) { + hs_flags |= HS_FLAG_PREFILTER; + } + + // Wrap the UE2 parser and compiler functionality and use it to generate + // corpora for us. + vector c; + + try { + ParsedExpression pe(0, re.c_str(), hs_flags, 0, &ext); + + // Apply prefiltering transformations if desired. + if (pe.expr.prefilter) { + prefilterTree(pe.component, ParseMode(hs_flags)); + } + + // Bail on patterns with unsupported constructs. + checkUnsupported(*pe.component); + pe.component->checkEmbeddedStartAnchor(true); + pe.component->checkEmbeddedEndAnchor(true); + + CompileContext cc(false, false, get_current_target(), Grey()); + ReportManager rm(cc.grey); + auto built_expr = buildGraph(rm, cc, pe); + if (!built_expr.g) { + // A more specific error should probably have been thrown by + // buildGraph. + throw CorpusFailure("could not build graph."); + } + + const auto cg = + makeCorpusGenerator(*built_expr.g, built_expr.expr, m_props); + cg->generateCorpus(c); + } + catch (const ParseError &e) { + throw CorpusFailure("compilation failed, " + e.reason); + } + catch (const CompileError &e) { + throw CorpusFailure("compilation failed, " + e.reason); + } + catch (const std::bad_alloc &) { + throw CorpusFailure("out of memory."); + } + catch (const CorpusGenerationFailure &e) { + // if corpus generation failed, just pass up the error message + throw CorpusFailure("corpus generation failed: " + e.message); + } + catch (...) { + throw CorpusFailure("unknown error."); + } + + if (c.empty()) { + throw CorpusFailure("no corpora generated."); + } + + data.reserve(data.size() + c.size()); + for (const auto &e : c) { + data.push_back(Corpus(e)); + } +} diff --git a/tools/hscollider/NfaGeneratedCorpora.h b/tools/hscollider/NfaGeneratedCorpora.h new file mode 100644 index 000000000..08572de67 --- /dev/null +++ b/tools/hscollider/NfaGeneratedCorpora.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NFAGENERATEDCORPORA_H +#define NFAGENERATEDCORPORA_H + +#include "Corpora.h" +#include "ng_corpus_properties.h" +#include "expressions.h" + +#include +#include + +// Corpora associated with a pattern set +class NfaGeneratedCorpora : public CorporaSource { +public: + NfaGeneratedCorpora(const ExpressionMap &expr, + const CorpusProperties &props, bool force_utf8_mode_in, + bool force_prefilter_mode_in); + + NfaGeneratedCorpora *clone() const override; + + void generate(unsigned id, std::vector &data) override; + +private: + // Expressions handled by this corpora object + const ExpressionMap &m_expr; + + // CorpusProperties policy object + CorpusProperties m_props; + + bool force_utf8_mode; + bool force_prefilter_mode; +}; + +#endif diff --git a/tools/hscollider/ResultSet.h b/tools/hscollider/ResultSet.h new file mode 100644 index 000000000..23c628ecb --- /dev/null +++ b/tools/hscollider/ResultSet.h @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RESULTSET_H +#define RESULTSET_H + +#include +#include +#include +#include +#include + +// Class representing a single match, encapsulating to/from offsets. +class MatchResult { +public: + MatchResult(unsigned long long start, unsigned long long end) + : from(start), to(end) {} + + bool operator<(const MatchResult &a) const { + if (from != a.from) { + return from < a.from; + } + return to < a.to; + } + + bool operator==(const MatchResult &a) const { + return from == a.from && to == a.to; + } + + unsigned long long from; + unsigned long long to; +}; + +enum ResultSource { + RESULT_FROM_UE2, + RESULT_FROM_PCRE, + RESULT_FROM_GRAPH, +}; + +inline +std::ostream &operator<<(std::ostream &out, ResultSource src) { + switch (src) { + case RESULT_FROM_UE2: + out << "UE2"; + break; + case RESULT_FROM_GRAPH: + out << "Graph"; + break; + case RESULT_FROM_PCRE: + out << "PCRE"; + break; + } + return out; +} + +class ResultSet { +public: + // Constructor. + explicit ResultSet(ResultSource s) : src(s) {} + + // Can be constructed with a set of end-offsets. + ResultSet(const std::set &m, ResultSource s) : src(s) { + for (const auto &offset : m) { + matches.emplace(0, offset); + } + } + + // Equality. + bool operator==(const ResultSet &other) const { + return uoom == other.uoom && + match_after_halt == other.match_after_halt && + invalid_id == other.invalid_id && + matches == other.matches; + } + + // Inequality. + bool operator!=(const ResultSet &other) const { return !(*this == other); } + + // Add a match. + void addMatch(unsigned long long from, unsigned long long to, + int block = 0) { + MatchResult m(from, to); + matches.insert(m); + + if (matches_by_block[block].find(m) != matches_by_block[block].end()) { + dupe_matches.insert(m); + } else { + matches_by_block[block].insert(m); + } + } + + // Unexpected out of order match seen. + bool uoom = false; + + // A match was received after termination was requested. + bool match_after_halt = false; + + // A match from an invalid ID was seen. + bool invalid_id = false; + + // Ordered set of matches. + std::set matches; + + // Matches grouped by stream write/block that we see them in. + std::map> matches_by_block; + + // Dupe matches that we have seen. + std::set dupe_matches; + + /* Where these results came from (does not take part in comparisions) */ + ResultSource src; +}; + +#endif diff --git a/tools/hscollider/Thread.cpp b/tools/hscollider/Thread.cpp new file mode 100644 index 000000000..537fa0dd0 --- /dev/null +++ b/tools/hscollider/Thread.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "Thread.h" +#include "common.h" +#include "sig.h" + +#include +#include + +#include + +static const size_t COLLIDER_THREAD_STACK_SIZE = 8192 * 1024; + +void Thread::start() { + // Some systems, notably Mac OS X, use a default stack size that is + // smaller than what we want (particularly given that we're planning on + // running PCRE, which recurses inside pcre_exec). We attempt to + // increase it to 8MB. + int ret; + pthread_attr_t attr; + ret = pthread_attr_init(&attr); + if (ret) { + std::cerr << "pthread_attr_init failed" << std::endl; + exit(1); + } + + size_t stacksize = 0; + ret = pthread_attr_getstacksize(&attr, &stacksize); + if (ret) { + std::cerr << "Warning: can't query stack size with " + "pthread_attr_getstacksize" << std::endl; + goto create_thread; + } + + if (stacksize < COLLIDER_THREAD_STACK_SIZE) { + ret = pthread_attr_setstacksize(&attr, COLLIDER_THREAD_STACK_SIZE); + if (ret) { + std::cerr << "Warning: pthread_attr_setstacksize failed, " + "unable to set stack size to " + << COLLIDER_THREAD_STACK_SIZE << " bytes." << std::endl; + // Fall through: this isn't necessarily fatal (yet!) + } + } + +create_thread: + ret = pthread_create(&thread, &attr, &runThread, this); + if (ret) { + std::cerr << "pthread_create failed for thread id " << thread_id + << std::endl; + exit(1); + } +} + +// Dispatch +void *Thread::runThread(void *thr) { + if (!no_signal_handler) { + setSignalStack(); + } + ((Thread *)thr)->run(); + return nullptr; +} + +void Thread::join() { pthread_join(thread, nullptr); } + +Thread::Thread(size_t num) : thread_id(num) {} + +Thread::~Thread() {} diff --git a/tools/hscollider/Thread.h b/tools/hscollider/Thread.h new file mode 100644 index 000000000..2ca50e38b --- /dev/null +++ b/tools/hscollider/Thread.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef UE2COLLIDER_THREAD_H +#define UE2COLLIDER_THREAD_H + +#include + +#include + +#include + +class Thread : boost::noncopyable { +public: + explicit Thread(size_t num); + virtual ~Thread(); + + virtual void start(); + + // Dispatch + static void *runThread(void *thr); + + virtual void join(); + + // Implemented by subclasses. + virtual void run() = 0; + +protected: + const size_t thread_id; + +private: + pthread_t thread; +}; + +#endif // UE2COLLIDER_THREAD_H diff --git a/tools/hscollider/UltimateTruth.cpp b/tools/hscollider/UltimateTruth.cpp new file mode 100644 index 000000000..19c597be5 --- /dev/null +++ b/tools/hscollider/UltimateTruth.cpp @@ -0,0 +1,1026 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "ResultSet.h" +#include "UltimateTruth.h" +#include "util/database_util.h" +#include "util/ExpressionParser.h" +#include "util/string_util.h" + +#include "ue2common.h" +#include "common.h" +#include "crc32.h" +#include "hs.h" +#include "hs_internal.h" +#include "util/make_unique.h" + +#include "scratch.h" +#include "nfa/nfa_api_queue.h" +#include "rose/rose_internal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace std; +using namespace ue2; +using boost::ptr_vector; + +#ifndef RELEASE_BUILD + +#include "database.h" +#include "state.h" + +static +hs_error_t open_magic_stream(const hs_database_t *db, unsigned flags, + hs_stream_t **stream, hs_scratch_t *scratch, + unsigned long long start_offset) { + hs_error_t ret = hs_open_stream(db, flags, stream); + if (ret != HS_SUCCESS) { + return ret; + } + + const char dummy_data[100] = { 0 }; + UNUSED const struct RoseEngine *rose + = (const struct RoseEngine *)hs_get_bytecode(db); + assert(sizeof(dummy_data) >= rose->historyRequired); + hs_scan_stream(*stream, dummy_data, MIN(start_offset, sizeof(dummy_data)), 0, + scratch, nullptr, nullptr); + (*stream)->offset = start_offset; + return ret; +} + +#endif // RELEASE_BUILD + +class HyperscanDB : boost::noncopyable { +public: + // Constructor takes iterators over a container of pattern IDs. + template + HyperscanDB(hs_database_t *db_in, Iter ids_begin, Iter ids_end) + : db(db_in), ids(ids_begin, ids_end) {} + + ~HyperscanDB() { + hs_free_database(db); + } + + // Underlying Hyperscan database pointer. + hs_database_t *db; + + // The set of expression IDs that must return their matches in order. + unordered_set ordered; + + // The complete set of expression IDs associated with this database. + unordered_set ids; +}; + +// Used to track the ID and result set. +namespace { +struct MultiContext { + MultiContext(unsigned int id_in, const HyperscanDB &db_in, ResultSet *rs_in, + bool single_in, ostream &os) + : id(id_in), db(db_in), rs(rs_in), single(single_in), out(os) {} + unsigned int id; + int block = 0; + const HyperscanDB &db; + ResultSet *rs; + u64a lastRawMatch = 0; /* store last known unadjusted match location */ + u64a lastOrderMatch = 0; + bool single; + bool use_max_offset = false; + unsigned long long max_offset = 0; /* don't record matches beyond this */ + bool terminated = false; //!< user has instructed us to stop + bool in_scan_call = false; + ostream &out; +}; +} + +// Callback used for all (both single and multi-mode) scans. +static +int callbackMulti(unsigned int id, unsigned long long from, + unsigned long long to, UNUSED unsigned int flags, void *ctx) { + MultiContext *mctx = static_cast(ctx); + assert(mctx); + assert(mctx->rs); + assert(mctx->in_scan_call); + + ostream &out = mctx->out; + + // Sanity check: in single mode, we'd better not be getting matches for the + // wrong ID! + if (mctx->single && id != mctx->id) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id + << " which is not the id we're looking for" << endl; + mctx->rs->invalid_id = true; + return 1; + } + + // In any mode, we should NEVER get a match from an ID outside our known set. + if (mctx->db.ids.find(id) == mctx->db.ids.end()) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id + << " which is not in the pattern set" << endl; + mctx->rs->invalid_id = true; + return 1; + } + + if (mctx->terminated) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id + << " after termination" << endl; + mctx->rs->match_after_halt = true; + } + +#ifndef RELEASE_BUILD + unsigned int adjustment = flags & HS_MATCH_FLAG_ADJUSTED ? 1 : 0; + if (mctx->lastRawMatch > to + adjustment) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id + << " unordered" << endl; + mctx->rs->uoom = true; + } + mctx->lastRawMatch = to + adjustment; +#endif + + if (mctx->db.ordered.find(id) != mctx->db.ordered.end()) { + if (mctx->lastOrderMatch > to) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id + << " unordered" << endl; + mctx->rs->uoom = true; + } + mctx->lastOrderMatch = to; + } + + if (mctx->use_max_offset && to > mctx->max_offset) { + if (echo_matches) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id + << " ignored" << endl; + } + return 0; + } + + if (to - g_streamOffset < g_corpora_prefix.size()) { + if (echo_matches) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id + << " too early" << endl; + } + return 0; + } + + u64a offsetDelta = g_corpora_prefix.size() + g_streamOffset; + + if (from) { + // from only set in SOM mode, otherwise zero. If we wanted to be REALLY + // principled about this, we'd probably want to stash the flags + // somewhere at compile time. + from -= (from > offsetDelta ? offsetDelta : from); + } + + to -= offsetDelta; + + if (echo_matches) { + out << "UE2 Match @ (" << from << "," << to << ") for " << id << endl; + } + + if (mctx->single || id == mctx->id) { + mctx->rs->addMatch(from, to, mctx->block); + if (limit_matches && mctx->rs->matches.size() == limit_matches) { + if (echo_matches) { + out << "Terminating matching (hit match limit)" << endl; + } + mctx->terminated = true; + return 1; // terminate matching. + } + } + + return 0; +} + +static +void filterLeftmostSom(ResultSet &rs) { + if (rs.matches.size() <= 1) { + return; + } + + set seen; // End offsets. + auto it = rs.matches.begin(); + while (it != rs.matches.end()) { + if (seen.insert(it->to).second) { + ++it; // First time we've seen this end-offset. + } else { + rs.matches.erase(it++); + } + } +} + +UltimateTruth::UltimateTruth(ostream &os, const ExpressionMap &expr, + const hs_platform_info_t *plat, + const Grey &grey_in, unsigned int streamBlocks) + : grey(grey_in), out(os), m_expr(expr), m_xcompile(false), + m_streamBlocks(streamBlocks), scratch(nullptr), + platform(plat) { + // Build our mode flags. + + switch (colliderMode) { + case MODE_STREAMING: + m_mode = HS_MODE_STREAM; + break; + case MODE_BLOCK: + m_mode = HS_MODE_BLOCK; + break; + case MODE_VECTORED: + m_mode = HS_MODE_VECTORED; + break; + } + + // Set desired SOM precision, if we're in streaming mode. + if (colliderMode == MODE_STREAMING) { + m_mode |= somPrecisionMode; + } +} + +UltimateTruth::~UltimateTruth() { + hs_free_scratch(scratch); +} + +static +void mangle_scratch(hs_scratch_t *scratch) { + /* Use our knowledge of the internals of scratch to make a mess */ + + memset(&scratch->tctxt, 0xc0, sizeof(scratch->tctxt)); + memset(scratch->bstate, 0xd0, scratch->bStateSize); + memset(scratch->tstate, 0xe0, scratch->tStateSize); + memset(scratch->fullState, 0xf0, scratch->fullStateSize); + + for (u32 i = 0; i < scratch->queueCount; i++) { + struct mq *q = &scratch->queues[i]; + memset(q, 0x01, sizeof(*q)); + q->scratch = scratch; + } + + memset(scratch->aqa, 0xb0, scratch->activeQueueArraySize); + for (u32 i = 0; i < DELAY_SLOT_COUNT; i++) { + memset(scratch->delay_slots[i], 0x05, scratch->delay_fatbit_size); + } + + memset(scratch->catchup_pq.qm, 0x06, + scratch->queueCount * sizeof(struct queue_match)); + scratch->catchup_pq.qm_size = 45; + memset(&scratch->core_info, 0x07, sizeof(scratch->core_info)); + memset(scratch->deduper.som_start_log[0], 0x90, + sizeof(u64a) * scratch->deduper.dkey_count); + memset(scratch->deduper.som_start_log[1], 0x09, + sizeof(u64a) * scratch->deduper.dkey_count); + memset(scratch->deduper.log[0], 0xa0, scratch->deduper.log_size); + memset(scratch->deduper.log[1], 0x0a, scratch->deduper.log_size); + memset(scratch->deduper.som_log[0], 0xd0, scratch->deduper.log_size); + memset(scratch->deduper.som_log[1], 0x0d, scratch->deduper.log_size); + + for (u32 i = 0; i < scratch->anchored_literal_region_len; i++) { + memset(scratch->al_log[i], 0xa0, scratch->anchored_literal_fatbit_size); + } + scratch->al_log_sum=0xf0f; + + memset(scratch->handled_roles, 0x05, scratch->handledKeyFatbitSize); + memset(scratch->som_store, 0x06, + scratch->som_store_count * sizeof(u64a)); + memset(scratch->som_attempted_store, 0x06, + scratch->som_store_count * sizeof(u64a)); + memset(scratch->som_set_now, 0x03, scratch->som_fatbit_size); + memset(scratch->som_attempted_set, 0x04, scratch->som_fatbit_size); + scratch->som_set_now_offset = 45; + memset(&scratch->fdr_conf, 0x0d, sizeof(scratch->fdr_conf)); + scratch->fdr_conf_offset = 0xe4; +} + +bool UltimateTruth::blockScan(const HyperscanDB &hdb, const string &buffer, + size_t align, match_event_handler callback, + void *ctx_in, ResultSet *) { + assert(colliderMode == MODE_BLOCK); + assert(!m_xcompile); + + const hs_database_t *db = hdb.db; + assert(db); + MultiContext *ctx = (MultiContext *)ctx_in; + + char *realigned = setupScanBuffer(buffer.c_str(), buffer.size(), align); + if (!realigned) { + return false; + } + + if (use_copy_scratch && !cloneScratch()) { + return false; + } + + ctx->in_scan_call = true; + hs_error_t ret = + hs_scan(db, realigned, buffer.size(), 0, scratch, callback, ctx); + ctx->in_scan_call = false; + + if (g_verbose) { + out << "Scan call returned " << ret << endl; + } + + if (ctx->terminated) { + if (g_verbose && ret != HS_SCAN_TERMINATED) { + out << "Scan should have returned HS_SCAN_TERMINATED, returned " + << ret << " instead." << endl; + } + return ret == HS_SCAN_TERMINATED; + } + + if (g_verbose && ret != HS_SUCCESS) { + out << "Scan should have returned HS_SUCCESS, returned " << ret + << " instead." << endl; + } + + if (use_mangle_scratch) { + mangle_scratch(scratch); + } + + return ret == HS_SUCCESS; +} + +static +vector compressAndCloseStream(hs_stream_t *stream) { + size_t needed; + hs_error_t err = hs_compress_stream(stream, nullptr, 0, &needed); + if (err != HS_INSUFFICIENT_SPACE) { + return {}; + } + + vector buf(needed); + err = hs_compress_stream(stream, buf.data(), needed, &needed); + if (err != HS_SUCCESS) { + return {}; + } + assert(needed == buf.size()); + + err = hs_close_stream(stream, nullptr, nullptr, nullptr); + if (err != HS_SUCCESS) { + return {}; + } + + return buf; +} + + +static +hs_stream_t *compressAndExpandStream(const hs_database_t *db, + hs_stream_t *stream) { + vector buf = compressAndCloseStream(stream); + hs_stream_t *out; + hs_error_t err = hs_expand_stream(db, &out, buf.data(), buf.size()); + + if (err != HS_SUCCESS) { + return nullptr; + } + + return out; +} + +static +hs_stream_t *compressAndResetExpandStream(const hs_database_t *db, + hs_stream_t *stream) { + vector buf = compressAndCloseStream(stream); + if (buf.empty()) { + return nullptr; + } + + hs_stream_t *out; + + hs_error_t err = hs_open_stream(db, 0, &out); + + if (err != HS_SUCCESS) { + return nullptr; + } + + err = hs_reset_and_expand_stream(out, buf.data(), buf.size(), nullptr, + nullptr, nullptr); + if (err != HS_SUCCESS) { + return nullptr; + } + + return out; +} + +bool UltimateTruth::streamingScan(const HyperscanDB &hdb, const string &buffer, + size_t align, match_event_handler callback, + void *ctx_in, ResultSet *rs) { + assert(colliderMode == MODE_STREAMING); + assert(!m_xcompile); + + const hs_database_t *db = hdb.db; + assert(db); + MultiContext *ctx = (MultiContext *)ctx_in; + + // open a stream + hs_stream_t *stream; + size_t stream_size; + int ret; + + ret = hs_stream_size(db, &stream_size); + if (ret != HS_SUCCESS) { + out << "Unable to size stream." << endl; + return false; + } + + if (!g_streamOffset) { + ret = hs_open_stream(db, 0, &stream); + } else { +#ifndef RELEASE_BUILD + ret = open_magic_stream(db, 0, &stream, scratch, g_streamOffset); +#else + ret = HS_INVALID; +#endif + } + + if (ret != HS_SUCCESS) { + out << "Unable to open stream." << endl; + return false; + } + + // scan our data, split into blocks and copied into a temporary buffer + // aligned as requested (out of paranoia) + unsigned blockSize = buffer.size() / m_streamBlocks; + if (blockSize == 0) { + blockSize = 1; + } + const char *ptr = buffer.c_str(); + const char *end = ptr + buffer.size(); + ctx->block = 0; + + // We use a do-while loop here so that zero-byte cases still generate at + // least one hs_scan_stream call, since it's something users might try. + do { + if (ptr + blockSize > end) { + // last write is a runt + blockSize = end - ptr; + } + char *realigned = setupScanBuffer(ptr, blockSize, align); + if (!realigned) { + return false; + } + ctx->in_scan_call = true; + DEBUG_PRINTF("scan stream write %u\n", ctx->block); + ret = hs_scan_stream(stream, realigned, blockSize, 0, scratch, + callback, ctx); + DEBUG_PRINTF("scan %u done\n", ctx->block); + ctx->in_scan_call = false; + + if (limit_matches && rs->matches.size() == limit_matches) { + if (ret != HS_SCAN_TERMINATED) { + DEBUG_PRINTF("failure to scan %d\n", ret); + return false; + } + } else if (ret != HS_SUCCESS) { + DEBUG_PRINTF("failure to scan %d\n", ret); + return false; + } + + if (use_copy_scratch && !cloneScratch()) { + return false; + } + + if (use_copy_stream) { + hs_stream_t *s2; + ret = hs_copy_stream(&s2, stream); + if (ret != HS_SUCCESS) { + DEBUG_PRINTF("failure to copy %d\n", ret); + return false; + } + /* do a short write to the old stream so that it is in the wrong + * state. */ + char temp[2] = {0, 0}; + ret = hs_scan_stream(stream, temp, sizeof(temp), 0, scratch, + nullptr, nullptr); + + hs_error_t expected = HS_SUCCESS; + if (limit_matches && rs->matches.size() == limit_matches) { + expected = HS_SCAN_TERMINATED; + } + if (ret != expected) { + DEBUG_PRINTF("failure to scan %d\n", ret); + return false; + } + ret = hs_close_stream(stream, nullptr, nullptr, nullptr); + if (ret != HS_SUCCESS) { + DEBUG_PRINTF("failure to close %d\n", ret); + return false; + } + stream = s2; + } + if (use_mangle_scratch) { + mangle_scratch(scratch); + } + + if (use_compress_expand) { + auto rv = compressAndExpandStream(db, stream); + if (!rv) { + if (g_verbose) { + out << "Compress/Expand failed." << endl; + } + return false; + } else { + stream = rv; + } + } + + if (use_compress_reset_expand) { + auto rv = compressAndResetExpandStream(db, stream); + if (!rv) { + if (g_verbose) { + out << "Compress/Expand failed." << endl; + } + return false; + } else { + stream = rv; + } + } + + ptr += blockSize; + ctx->block++; + } while (ptr < end); + + // close the stream + ctx->in_scan_call = true; + DEBUG_PRINTF("close stream %u\n", ctx->block); + ret = hs_close_stream(stream, scratch, callback, ctx); + DEBUG_PRINTF("close stream done\n"); + ctx->in_scan_call = false; + + if (ret != HS_SUCCESS) { + return false; + } + + // UE2 cannot dedupe SOM matches across stream boundaries, so we must + // filter them out. + filterLeftmostSom(*rs); + + return ret == HS_SUCCESS; +} + +bool UltimateTruth::vectoredScan(const HyperscanDB &hdb, const string &buffer, + size_t align, match_event_handler callback, + void *ctx_in, ResultSet *rs) { + assert(colliderMode == MODE_VECTORED); + assert(!m_xcompile); + + const hs_database_t *db = hdb.db; + assert(db); + MultiContext *ctx = (MultiContext *)ctx_in; + + int ret; + + assert(!g_streamOffset); + + // scan our data, split into blocks and copied into a temporary buffer + // aligned as requested (out of paranoia) + unsigned blockSize = buffer.size() / m_streamBlocks; + if (blockSize == 0) { + blockSize = 1; + } + const char *ptr = buffer.c_str(); + const char *end = ptr + buffer.size(); + ctx->block = 0; + + // We use a do-while loop here so that zero-byte cases still generate at + // least one hs_scan_stream call, since it's something users might try. + + vector data; + vector length; + + u32 block_count = (buffer.size() + blockSize - 1) / blockSize; + block_count = MAX(block_count, 1); + + if (block_count > raw_blocks.size()) { + raw_blocks.resize(block_count); + } + + do { + if (ptr + blockSize > end) { + // last write is a runt + blockSize = end - ptr; + } + char *realigned = setupVecScanBuffer(ptr, blockSize, align, ctx->block); + if (!realigned) { + return false; + } + + data.push_back(realigned); + length.push_back(blockSize); + + ptr += blockSize; + ctx->block++; + + } while (ptr < end); + + if (use_copy_scratch && !cloneScratch()) { + return false; + } + + DEBUG_PRINTF("scan vectored write %u\n", ctx->block); + ctx->in_scan_call = true; + ret = hs_scan_vector(db, &data[0], &length[0], ctx->block, 0, scratch, + callback, ctx); + ctx->in_scan_call = false; + DEBUG_PRINTF("scan %u done\n", ctx->block); + if (use_mangle_scratch) { + mangle_scratch(scratch); + } + + rs->dupe_matches.clear(); /* TODO: dedupe across vectored blocks */ + + if (limit_matches && rs->matches.size() == limit_matches) { + if (ret != HS_SCAN_TERMINATED) { + DEBUG_PRINTF("failure to scan %d\n", ret); + return false; + } + } else if (ret != HS_SUCCESS) { + DEBUG_PRINTF("failure to scan %d\n", ret); + return false; + } + + // UE2 cannot dedupe SOM matches across vector block boundaries, so we must + // filter them out. + filterLeftmostSom(*rs); + + return true; +} + +bool UltimateTruth::run(unsigned int id, shared_ptr hdb, + const string &buffer, bool single_pattern, + unsigned int align, ResultSet &rs) { + assert(!m_xcompile); + assert(hdb); + + // Ensure that scratch is appropriate for this database. + if (!allocScratch(hdb)) { + out << "Scratch alloc failed." << endl; + return false; + } + + MultiContext ctx(id, *hdb, &rs, single_pattern, out); + if (!g_corpora_suffix.empty()) { + ctx.use_max_offset = true; + ctx.max_offset = buffer.size() - g_corpora_suffix.size(); + } + + switch (colliderMode) { + case MODE_BLOCK: + return blockScan(*hdb, buffer, align, callbackMulti, &ctx, &rs); + case MODE_STREAMING: + return streamingScan(*hdb, buffer, align, callbackMulti, &ctx, &rs); + case MODE_VECTORED: + return vectoredScan(*hdb, buffer, align, callbackMulti, &ctx, &rs); + } + + assert(0); + return false; +} + +static +bool isOrdered(const string &expr, unsigned int flags) { + // SOM doesn't produce ordered matches? + if (flags & HS_FLAG_SOM_LEFTMOST) { + return false; + } + + hs_expr_info_t *info = nullptr; + hs_compile_error_t *error = nullptr; + hs_error_t err = hs_expression_info(expr.c_str(), flags, &info, &error); + if (err != HS_SUCCESS) { + // Expression will fail compilation and report error elsewhere. + free(info); + hs_free_compile_error(error); + return false; + } + + assert(info); + + // Any pattern that does not require offset adjustment should produce + // matches in order. + bool ordered = !info->unordered_matches; + free(info); + return ordered; +} + +static unique_ptr +compileHyperscan(vector &patterns, vector &flags, + vector &idsvec, ptr_vector &ext, + unsigned mode, const hs_platform_info *platform, string &error, + const Grey &grey) { + const unsigned count = patterns.size(); + hs_database_t *db = nullptr; + hs_compile_error_t *compile_err; + + hs_error_t err = hs_compile_multi_int(&patterns[0], &flags[0], + &idsvec[0], ext.c_array(), count, + mode, platform, &db, + &compile_err, grey); + + if (err != HS_SUCCESS) { + error = compile_err->message; + hs_free_compile_error(compile_err); + return nullptr; + } + + return ue2::make_unique(db, idsvec.begin(), idsvec.end()); +} + +shared_ptr UltimateTruth::compile(const set &ids, + string &error) const { + // Build our vectors for compilation + const size_t count = ids.size(); + vector expressions(count); + vector idsvec(ids.begin(), ids.end()); + vector flags(count); + vector check_ordered(count, false); + ptr_vector ext; + ext.reserve(count); + + size_t n = 0; + for (const auto &id : ids) { + auto j = m_expr.find(id); + if (j == m_expr.end()) { + error = "Unable to find ID."; + return nullptr; + } + + ext.push_back(new hs_expr_ext); + bool must_be_ordered; + if (!readExpression(j->second, expressions[n], &flags[n], &ext[n], + &must_be_ordered)) { + ostringstream oss; + oss << "Unable to decode flags: '" << j->first << ":" + << j->second << "'."; + error = oss.str(); + return nullptr; + } + + check_ordered[n] = must_be_ordered; + + if (force_utf8) { + flags[n] |= HS_FLAG_UTF8; + } + + if (force_prefilter) { + flags[n] |= HS_FLAG_PREFILTER; + } + + if (somFlags) { + flags[n] |= somFlags; + } + + if (force_edit_distance) { + ext[n].flags |= HS_EXT_FLAG_EDIT_DISTANCE; + ext[n].edit_distance = edit_distance; + } + + n++; + } + + // Our compiler takes an array of plain ol' C strings. + vector patterns(count); + for (unsigned int i = 0; i < count; i++) { + patterns[i] = expressions[i].c_str(); + } + + // Compile + if (!count) { /* slight hack to allow us to compile empty sets cleanly */ + patterns.push_back(nullptr); + flags.push_back(0); + idsvec.push_back(0); + } + + auto db = compileHyperscan(patterns, flags, idsvec, ext, m_mode, platform, + error, grey); + if (!db) { + return nullptr; + } + + // Track IDs of patterns that require ordering for validation at match + // time. + for (unsigned int i = 0; i < count; i++) { + bool is_ordered = isOrdered(expressions[i], flags[i]); + if (check_ordered[i] && !is_ordered) { + error = "Ordering required, but hs_expression_info suggests " + "that ordering is not guaranteed."; + return nullptr; + } + if (is_ordered) { + db->ordered.insert(idsvec[i]); + } + } + + return move(db); +} + +bool UltimateTruth::allocScratch(shared_ptr db) { + assert(db); + + // We explicitly avoid running scratch allocators for the same HyperscanDB + // over and over again by retaining a shared_ptr to the last one we saw. + if (db == last_db) { + return true; + } + + hs_error_t err = hs_alloc_scratch(db.get()->db, &scratch); + if (err != HS_SUCCESS) { + return false; + } + + last_db = db; + return true; +} + +bool UltimateTruth::cloneScratch(void) { + hs_scratch_t *old_scratch = scratch; + hs_scratch_t *new_scratch; + hs_error_t ret = hs_clone_scratch(scratch, &new_scratch); + if (ret != HS_SUCCESS) { + DEBUG_PRINTF("failure to clone %d\n", ret); + return false; + } + scratch = new_scratch; + ret = hs_free_scratch(old_scratch); + if (ret != HS_SUCCESS) { + DEBUG_PRINTF("failure to free %d\n", ret); + return false; + } + DEBUG_PRINTF("scratch cloned from %p to %p\n", old_scratch, scratch); + return true; +} + +// Return an appropriately aligned (modulo max align) copy of the given buffer +char * UltimateTruth::setupScanBuffer(const char *begin, size_t len, + size_t align) { + if (align >= MAX_MAX_UE2_ALIGN) { + return nullptr; + } + + // Realloc if necessary + size_t maxBufSize = len + MAX_MAX_UE2_ALIGN; + if (maxBufSize > m_scanBuf.size()) { + m_scanBuf.resize(maxBufSize); + } + + uintptr_t currentAlign = (uintptr_t)(m_scanBuf.data()) % MAX_MAX_UE2_ALIGN; + char *ptr; + + ptrdiff_t diff = align - currentAlign; + if (diff >= 0) { + ptr = (m_scanBuf.data() + diff); + } else { + ptr = (m_scanBuf.data() + (MAX_MAX_UE2_ALIGN + diff)); + } + assert((uintptr_t)(ptr) % MAX_MAX_UE2_ALIGN == align); + + // copy the buffer + memcpy(ptr, begin, len); + return ptr; +} + +char *UltimateTruth::setupVecScanBuffer(const char *begin, size_t len, + size_t align, u32 block_id) { + if (align >= MAX_MAX_UE2_ALIGN) { + return nullptr; + } + + assert(block_id < raw_blocks.size()); + vector &raw = raw_blocks[block_id]; + + // Realloc if necessary + size_t maxBufSize = len + MAX_MAX_UE2_ALIGN; + if (maxBufSize > raw.size()) { + raw.resize(maxBufSize); + } + assert(maxBufSize <= raw.size()); + + uintptr_t currentAlign = (uintptr_t)(&raw[0]) % MAX_MAX_UE2_ALIGN; + char *ptr; + + ptrdiff_t diff = align - currentAlign; + if (diff >= 0) { + ptr = (&raw[0] + diff); + } else { + ptr = (&raw[0] + (MAX_MAX_UE2_ALIGN + diff)); + } + assert((uintptr_t)(ptr) % MAX_MAX_UE2_ALIGN == align); + + // copy the buffer + memcpy(ptr, begin, len); + return ptr; +} + +bool UltimateTruth::saveDatabase(const HyperscanDB &hdb, + const string &filename) const { + return ::saveDatabase(hdb.db, filename.c_str(), g_verbose); +} + +shared_ptr +UltimateTruth::loadDatabase(const string &filename, + const std::set &ids) const { + hs_database_t *hs_db = ::loadDatabase(filename.c_str(), g_verbose); + if (!hs_db) { + return nullptr; + } + + auto db = make_shared(hs_db, ids.begin(), ids.end()); + assert(db); + + // Fill db::ordered with the expressions that require the ordered flag. + for (const auto &id : ids) { + auto j = m_expr.find(id); + if (j == m_expr.end()) { + cerr << "Can't find expression with ID " << id << endl; + assert(0); + db.reset(); + return db; + } + string expr; + hs_expr_ext ext; + unsigned int flags; + if (!readExpression(j->second, expr, &flags, &ext)) { + cerr << "Can't parse expression with ID " << id << ": " + << j->second << endl; + assert(0); + db.reset(); + return db; + } + if (isOrdered(expr, flags)) { + db->ordered.insert(id); + } + } + + return db; +} + +unsigned int UltimateTruth::describe() const { + return m_mode; +} + +// Hash the settings used to compile a database, returning a string that can be +// used as a filename. +string UltimateTruth::dbSettingsHash(const set &ids) const { + // create a single string to contain a description of the db + ostringstream info_oss; + + // settings from UltimateTruth::describe() + info_oss << ' ' << describe() << ' '; + + // our set + for (unsigned int id : ids) { + info_oss << id << ' '; + } + + string info = info_oss.str(); + + u32 crc = Crc32c_ComputeBuf(0, info.data(), info.size()); + + // return STL string with printable version of digest + ostringstream oss; + oss << hex << setw(8) << setfill('0') << crc << dec; + + return oss.str(); +} + +string UltimateTruth::dbFilename(const set &ids) const { + ostringstream oss; + oss << serializePath << '/' << dbSettingsHash(ids) << ".db"; + return oss.str(); +} diff --git a/tools/hscollider/UltimateTruth.h b/tools/hscollider/UltimateTruth.h new file mode 100644 index 000000000..c8de86427 --- /dev/null +++ b/tools/hscollider/UltimateTruth.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ULTIMATETRUTH_H +#define ULTIMATETRUTH_H + +#include "expressions.h" + +#include "hs.h" + +#include +#include +#include +#include +#include + +#include + +namespace ue2 { + +struct Grey; + +} // namespace ue2 + +class HyperscanDB; +class ResultSet; + +// Wrapper around ue2 to generate results for an expression and corpus. +class UltimateTruth : boost::noncopyable { +public: + UltimateTruth(std::ostream &os, const ExpressionMap &expr, + const hs_platform_info *plat, const ue2::Grey &grey, + unsigned streamBlocks = 0); + + ~UltimateTruth(); + + std::shared_ptr compile(const std::set &ids, + std::string &error) const; + + bool saveDatabase(const HyperscanDB &db, + const std::string &filename) const; + + std::shared_ptr + loadDatabase(const std::string &filename, + const std::set &ids) const; + + // Are we runnable? (i.e. not xcompiling) + bool runnable() const { + return !m_xcompile; + } + + bool run(unsigned id, std::shared_ptr db, + const std::string &buffer, bool single_pattern, unsigned align, + ResultSet &rs); + + // Returns a value completely representing this object's compile options. + unsigned int describe() const; + + std::string dbFilename(const std::set &ids) const; + +private: + bool blockScan(const HyperscanDB &db, const std::string &buffer, + size_t align, match_event_handler callback, void *ctx, + ResultSet *rs); + bool streamingScan(const HyperscanDB &db, const std::string &buffer, + size_t align, match_event_handler callback, void *ctx, + ResultSet *rs); + bool vectoredScan(const HyperscanDB &db, const std::string &buffer, + size_t align, match_event_handler callback, void *ctx, + ResultSet *rs); + + char *setupScanBuffer(const char *buf, size_t len, size_t align); + + char *setupVecScanBuffer(const char *buf, size_t len, size_t align, + unsigned int block_id); + + bool allocScratch(std::shared_ptr db); + + bool cloneScratch(void); + + std::string dbSettingsHash(const std::set &ids) const; + + const ue2::Grey &grey; + + // Output stream. + std::ostream &out; + + // Our expression map + const ExpressionMap &m_expr; + + // Are we cross-compiling, and therefore unable to scan at all? + bool m_xcompile; + + // Our mode flags to pass into the compiler: calculated from streaming, + // etc. + unsigned m_mode; + + // In streaming mode, what is the number of blocks to chop data into? + unsigned m_streamBlocks; + + // Scratch space for Hyperscan. + hs_scratch_t *scratch; + + // Temporary scan buffer used for realigned scanning + std::vector m_scanBuf; + + std::vector > raw_blocks; /* temp scan buffers used by + * vectored mode */ + + // Last database we successfully allocated scratch for, so that we can + // avoid unnecessarily reallocating for it. + std::shared_ptr last_db; + + const hs_platform_info *platform; +}; + +#endif diff --git a/tools/hscollider/args.cpp b/tools/hscollider/args.cpp new file mode 100644 index 000000000..a15977f9a --- /dev/null +++ b/tools/hscollider/args.cpp @@ -0,0 +1,570 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "ng_corpus_properties.h" +#include "args.h" +#include "common.h" +#include "cross_compile.h" +#include "util/expression_path.h" +#include "util/string_util.h" + +#include "grey.h" +#include "ue2common.h" +#include "hs_compile.h" // for HS_MODE_* + +#include +#include +#include +#include +#include +#include +#include +#include + +#define xstr(s) str(s) +#define str(s) #s + +using namespace ue2; +using namespace std; + +// display usage information, with an optional error +static +void usage(const char *name, const char *error) { + printf("Usage: %s [OPTIONS...]\n\n", name); + printf("General Options:\n\n"); + printf(" -h Display help and exit.\n"); + printf(" -G OVERRIDES Overrides for the grey box.\n"); + printf(" -e PATH Path to expression directory or file.\n"); + printf(" -s FILE Signature file to use.\n"); + printf(" -z NUM Signature ID to use.\n"); + printf(" -c FILE Load corpora from FILE rather than using " + "generator.\n"); + printf(" -w FILE After running, save corpora (with matches) to " + "FILE.\n"); + printf(" -a [BAND] Compile all expressions in UE2 (but still match " + "singly).\n"); + printf(" If BAND, compile patterns in groups of size " + "BAND.\n"); + printf(" -t NUM Use streaming mode, split data into ~NUM " + "blocks.\n"); + printf(" -V NUM Use vectored mode, split data into ~NUM " + "blocks.\n"); + printf(" -Z {R or 0-%d} Only test one alignment, either as given or " + "'R' for random.\n", MAX_MAX_UE2_ALIGN - 1); + printf(" -q Quiet; display only match differences, no other " + "failures.\n"); + printf(" -v Verbose; display successes as well as " + "failures.\n"); + printf("\n"); + printf("Pattern flags:\n"); + printf("\n"); + printf(" -8 Force UTF8 mode on all patterns.\n"); + printf(" -L Apply HS_FLAG_SOM_LEFTMOST to all patterns.\n"); + printf(" -E DISTANCE Match all patterns within edit distance" + " DISTANCE.\n"); + printf(" --prefilter Apply HS_FLAG_PREFILTER to all patterns.\n"); + printf("\n"); + printf("Testing mode options:\n"); + printf("\n"); + printf(" -d NUM Set SOM precision mode (default: 8 (large)).\n"); + printf(" -O NUM In streaming mode, set initial offset to NUM.\n"); + printf(" -k NUM Terminate callback after NUM matches per " + "pattern.\n"); + printf(" --copy-scratch Copy scratch after each scan call.\n"); + printf(" --copy-stream Copy stream state after each scan call.\n"); + printf(" --compress-expand Compress and expand stream state after each " + "scan call.\n"); + printf(" --compress-reset-expand Compress, reset and expand stream state " + "after each scan call.\n"); + printf(" --mangle-scratch Mangle scratch space after each scan call.\n"); + printf(" --no-nfa Disable NFA graph execution engine.\n"); + printf(" --no-pcre Disable PCRE engine.\n"); + printf(" --test-nfa Disable UE2 engine (test NFA against PCRE).\n"); + printf(" --abort-on-fail Abort, rather than exit, on failure.\n"); + printf(" --no-signal-handler Do not handle handle signals (to generate " + "backtraces).\n"); + printf("\n"); + printf("Memory and resource control options:\n"); + printf("\n"); + printf(" -T NUM Run with NUM threads.\n"); + printf(" -M NUM Set maximum memory allocated to NUM megabytes per" + " thread.\n"); + printf(" (0 means no limit, default is 1000 MB).\n"); + printf(" -m NUM Set PCRE_MATCH_LIMIT (default: %lu).\n", + DEFAULT_PCRE_MATCH_LIMIT); + printf(" -r NUM Set PCRE_MATCH_LIMIT_RECURSION (default: %lu).\n", + DEFAULT_PCRE_MATCH_RECURSION_LIMIT); + printf("\n"); + printf("Cross-compiling:\n"); + printf("\n"); + printf(" -x NAME Cross-compile for arch NAME.\n"); + printf(" -i DIR Don't compile, load from files in DIR " + "instead.\n"); + printf(" -o DIR After compiling, save to files in DIR.\n"); + printf("\n"); + printf("Corpus generation options:\n"); + printf("\n"); + printf(" -n NUM Max corpora to generate for a given signature " + "(default: %u).\n", DEFAULT_CORPUS_GENERATOR_LIMIT); + printf(" -R NUM Random seed to use (default: seeded from " + "time()).\n"); + printf(" -p NUM,NUM,NUM Percentage probabilities of " + "(match,unmatch,random) char.\n"); + printf(" -C NUM,NUM Follow cycles (min,max) times.\n"); + printf(" -P NUM,NUM Add a random prefix of length between " + "(min,max).\n"); + printf(" -S NUM,NUM Add a random suffix of length between " + "(min,max).\n"); + printf(" -D NUM Apply an edit distance (default: 0) to each " + "corpus.\n"); + printf(" -b NUM Limit alphabet to NUM characters, starting at " + "lower-case 'a'.\n"); + printf("\n"); + + if (error) { + printf("Error: %s\n", error); + } +} + +void processArgs(int argc, char *argv[], CorpusProperties &corpus_gen_prop, + vector *corpora, UNUSED Grey *grey, + unique_ptr *plat_out) { + static const char options[] + = "-ab:cC:d:D:e:E:G:hi:k:Lm:M:n:o:O:p:P:qr:R:S:s:t:T:vV:w:x:X:Y:z:Z:8"; + s32 in_multi = 0; + s32 in_corpora = 0; + int pcreFlag = 1; + int nfaFlag = 1; + int ue2Flag = 1; + int copyScratch = 0; + int copyStream = 0; + int mangleScratch = 0; + int compressFlag = 0; + int compressResetFlag = 0; + static const struct option longopts[] = { + {"copy-scratch", 0, ©Scratch, 1}, + {"copy-stream", 0, ©Stream, 1}, + {"mangle-scratch", 0, &mangleScratch, 1}, + {"prefilter", 0, &force_prefilter, 1}, + {"no-pcre", 0, &pcreFlag, 0}, + {"no-nfa", 0, &nfaFlag, 0}, + {"test-nfa", 0, &ue2Flag, 0}, + {"abort-on-fail", 0, &abort_on_failure, 1}, + {"no-signal-handler", 0, &no_signal_handler, 1}, + {"compress-expand", 0, &compressFlag, 1}, + {"compress-reset-expand", 0, &compressResetFlag, 1}, + {nullptr, 0, nullptr, 0}}; + + for (;;) { + int c = getopt_long(argc, argv, options, longopts, nullptr); + if (c < 0) { + break; + } + + switch (c) { + case 'a': + g_ue2CompileAll = true; + in_multi = 2; + break; + case 'b': { + unsigned sz; + if (!fromString(optarg, sz) || sz > 256) { + usage(argv[0], "Must provide an integer argument <= 256" + "to '-b' flag"); + exit(1); + } + corpus_gen_prop.alphabetSize = sz; + break; + } + case 'c': + in_corpora = 2; + break; + case 'C': { + vector nums; + if (!strToList(optarg, nums) || nums.size() != 2 + || nums[0] > nums[1]) { + usage(argv[0], "Cycle limit '-C' argument takes a list of " + " integers: MIN,MAX"); + exit(1); + } + corpus_gen_prop.setCycleLimit(nums[0], nums[1]); + break; + } + case 'd': { + unsigned dist; + if (!fromString(optarg, dist)) { + usage(argv[0], + "Must provide an integer argument to '-d' flag"); + exit(1); + } + switch (dist) { + case 2: + somPrecisionMode = HS_MODE_SOM_HORIZON_SMALL; + break; + case 4: + somPrecisionMode = HS_MODE_SOM_HORIZON_MEDIUM; + break; + case 8: + somPrecisionMode = HS_MODE_SOM_HORIZON_LARGE; + break; + default: + usage(argv[0], "SOM precision must be 2, 4 or 8"); + exit(1); + } + break; + } + case 'D': { + unsigned dist; + if (!fromString(optarg, dist)) { + usage(argv[0], + "Must provide an integer argument to '-D' flag"); + exit(1); + } + corpus_gen_prop.editDistance = dist; + break; + } + case 'e': + g_exprPath.assign(optarg); + break; + case 'E': { + u32 dist; + if (!fromString(optarg, dist)) { + usage(argv[0], "Argument to '-E' flag must be an integer"); + exit(1); + } + force_edit_distance = true; + edit_distance = dist; + break; + } +#ifndef RELEASE_BUILD + case 'G': + applyGreyOverrides(grey, string(optarg)); + break; +#endif + case 'h': + usage(argv[0], nullptr); + exit(0); + case 'i': + loadDatabases = true; + serializePath = optarg; + break; + case 'k': + if (!fromString(optarg, limit_matches) || limit_matches < 1) { + usage(argv[0], + "Must provide a positive integer argument to '-k' " + "flag"); + exit(1); + } + break; + case 'L': + somFlags = HS_FLAG_SOM_LEFTMOST; + break; + case 'm': + if (!fromString(optarg, g_matchLimit) || g_matchLimit < 1) { + usage(argv[0], + "Must provide a positive integer argument to '-m' " + "flag"); + exit(1); + } + break; + case 'M': + if (!fromString(optarg, g_memoryLimit)) { + usage(argv[0], + "Must provide a positive (or zero) integer argument " + "to '-M' flag"); + exit(1); + } + break; + case 'n': { + unsigned int count; + if (!fromString(optarg, count)) { + usage(argv[0], "Argument to '-n' flag must be an integer"); + exit(1); + } + corpus_gen_prop.corpusLimit = count; + break; + } + case 'o': + saveDatabases = true; + serializePath = optarg; + break; + case 'O': + if (!fromString(optarg, g_streamOffset)) { + usage(argv[0], + "Argument '-O' flag must be a positive integer"); + exit(1); + } + break; + case 'p': { + vector prob; + if (!strToList(optarg, prob) || prob.size() != 3) { + usage(argv[0], "Probabilities '-p' argument takes a list " + "of three integers: MATCH,UNMATCH,RANDOM"); + exit(1); + } + if (!corpus_gen_prop.setPercentages(prob[0], prob[1], + prob[2])) { + usage(argv[0], + "Unable to set corpus generator probabilities."); + exit(1); + } + break; + } + case 'P': { + vector nums; + if (!strToList(optarg, nums) || nums.size() != 2 + || nums[0] > nums[1]) { + usage(argv[0], "Prefix '-P' argument takes a list of two" + " integers: MIN,MAX"); + exit(1); + } + corpus_gen_prop.prefixRange = min_max(nums[0], nums[1]); + break; + } + case 'q': + g_quiet++; + break; + case 'r': + if (!fromString(optarg, g_matchLimitRecursion) + || g_matchLimitRecursion < 1) { + usage(argv[0], "Must provide a positive integer argument " + "to '-r' flag"); + exit(1); + } + break; + case 'R': { + if (!fromString(optarg, randomSeed)) { + usage(argv[0], "Argument to '-R' flag must be an integer"); + exit(1); + } + corpus_gen_prop.seed(randomSeed); + break; + } + case 's': + g_signatureFiles.push_back(optarg); + break; + case 'S': { + vector nums; + if (!strToList(optarg, nums) || nums.size() != 2 || + nums[0] > nums[1]) { + usage(argv[0], "Suffix '-S' argument takes a list of two" + " integers: MIN,MAX"); + exit(1); + } + corpus_gen_prop.suffixRange = min_max(nums[0], nums[1]); + break; + } + case 't': + if (colliderMode != MODE_BLOCK) { + usage(argv[0], "You can only use one mode at a time!"); + exit(1); + } + colliderMode = MODE_STREAMING; + if (!fromString(optarg, g_streamBlocks) || g_streamBlocks < 1) { + usage(argv[0], "Must provide a positive integer argument " + "to '-t' flag"); + exit(1); + } + break; + case 'T': + if (!fromString(optarg, numThreads) || numThreads < 1) { + usage(argv[0], "Must provide a positive integer argument " + "to '-T' flag"); + exit(1); + } + break; + case 'v': + if (g_verbose) { + echo_matches = true; + } + g_verbose = true; + break; + case 'V': + if (colliderMode != MODE_BLOCK) { + usage(argv[0], "You can only use one mode at a time!"); + exit(1); + } + colliderMode = MODE_VECTORED; + if (!fromString(optarg, g_streamBlocks) || g_streamBlocks < 1) { + usage(argv[0], "Must provide a positive integer argument " + "to '-t' flag"); + exit(1); + } + break; + case 'w': + saveCorpora = true; + saveCorporaFile = optarg; + break; + case 'x': + *plat_out = xcompileReadMode(optarg); + if (!*plat_out) { + usage(argv[0], xcompileUsage().c_str()); + exit(1); + } + break; + case 'X': { + u32 count; + if (!fromString(optarg, count)) { + usage(argv[0], "Argument to '-X' flag must be an integer"); + exit(1); + } + g_corpora_prefix.insert(g_corpora_prefix.end(), count, '~'); + break; + } + case 'Y': + { + u32 count; + if (!fromString(optarg, count)) { + usage(argv[0], "Argument to '-Y' flag must be an integer"); + exit(1); + } + g_corpora_suffix.insert(g_corpora_suffix.end(), count, '~'); + break; + } + case 'z': + if (!strToList(optarg, g_signatures)) { + usage(argv[0], + "Argument to '-z' flag must be a list of integers"); + exit(1); + } + break; + case 'Z': + static constexpr unsigned ALIGN_LIMIT = MAX_MAX_UE2_ALIGN - 1; + if (optarg == string("R")) { + // Random min alignment selected. + use_random_alignment = true; + break; + } else if (!fromString(optarg, min_ue2_align) + || min_ue2_align > ALIGN_LIMIT) { + usage(argv[0], "Argument must be 'R' or numeric < " + xstr(MAX_MAX_UE2_ALIGN) " to '-Z'"); + exit(1); + } + max_ue2_align = min_ue2_align + 1; + break; + case '8': + force_utf8 = true; + break; + case 1: + if (in_multi) { + if (!fromString(optarg, multicompile_bands)) { + usage(argv[0], + "Argument to '-a' flag must be an integer"); + exit(1); + } + break; + } else if (in_corpora) { + corpora->push_back(optarg); + in_corpora = 2; + break; + } + case 0: + break; + default: + usage(argv[0], "Unrecognised command line argument."); + exit(1); + } + + in_multi = MAX(0, in_multi - 1); + in_corpora = MAX(0, in_corpora - 1); + } + + if (g_streamOffset && !g_streamBlocks) { + usage(argv[0], "stream offset requires streams"); + exit(1); + } + + if (g_exprPath.empty() && !g_signatureFiles.empty()) { + /* attempt to infer an expression directory */ + for (const auto &fname : g_signatureFiles) { + string exprPath = inferExpressionPath(fname); + if (!g_exprPath.empty() && exprPath != g_exprPath) { + usage(argv[0], "Only one expression path is allowed."); + } + g_exprPath.assign(exprPath); + } + } + + // Must have a valid expression path + if (g_exprPath.empty()) { + usage(argv[0], "Must specify an expression path with the -e option."); + exit(1); + } + + // If we've been handed an expr file and no restrictions, use 'em all! + if (!isDir(g_exprPath) && isFile(g_exprPath) && g_signatureFiles.empty() + && g_signatures.empty()) { + g_allSignatures = true; + } + + // Must have a valid signature file + if (g_signatureFiles.empty() && g_signatures.empty() && !g_allSignatures) { + usage(argv[0], "Must specify a signature file with the -s option."); + exit(1); + } + + // Cannot ask for both loading and saving + if (loadDatabases && saveDatabases) { + usage(argv[0], "You cannot both load and save databases."); + exit(1); + } + + // Cannot ask for cross-compile and loading + if (loadDatabases && *plat_out) { + usage(argv[0], "You cannot both load and xcompile of databases."); + exit(1); + } + + // need at least two pattern engines active + if (nfaFlag + pcreFlag + ue2Flag < 2) { + usage(argv[0], "At least two pattern engines should be active."); + exit(1); + } + + if (copyStream && !g_streamBlocks) { + usage(argv[0], "Copying streams only makes sense in streaming mode."); + exit(1); + } + if (compressFlag && compressResetFlag) { + usage(argv[0], + "Only use one of --compress-expand and --compress-reset-expand."); + exit(1); + } + + // set booleans appropriately + use_NFA = (bool) nfaFlag; + use_PCRE = (bool) pcreFlag; + use_UE2 = (bool) ue2Flag; + use_copy_scratch = (bool) copyScratch; + use_copy_stream = (bool) copyStream; + use_mangle_scratch = (bool) mangleScratch; + use_compress_expand = (bool)compressFlag; + use_compress_reset_expand = (bool)compressResetFlag; +} diff --git a/tools/hscollider/args.h b/tools/hscollider/args.h new file mode 100644 index 000000000..382eff036 --- /dev/null +++ b/tools/hscollider/args.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ARGS_H +#define ARGS_H + +#include +#include +#include + +namespace ue2 { +struct Grey; +} +struct hs_platform_info; +class CorpusProperties; + +void processArgs(int argc, char *argv[], CorpusProperties &corpus_gen_prop, + std::vector *corpora, ue2::Grey *grey, + std::unique_ptr *plat_out); + +#endif diff --git a/tools/hscollider/common.h b/tools/hscollider/common.h new file mode 100644 index 000000000..da85790ca --- /dev/null +++ b/tools/hscollider/common.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef COMMON_H +#define COMMON_H + +#include +#include +#include + +enum ColliderMode { + MODE_BLOCK, + MODE_STREAMING, + MODE_VECTORED +}; + +extern unsigned numThreads; +extern enum ColliderMode colliderMode; +extern unsigned int somFlags; +extern bool loadDatabases; +extern bool saveDatabases; +extern bool saveCorpora; +extern std::string saveCorporaFile; +extern std::string serializePath; +extern bool echo_matches; +extern int g_quiet; +extern bool g_verbose; +extern std::string g_exprPath; +extern std::vector g_signatureFiles; +extern bool g_allSignatures; +extern bool g_ue2CompileAll; +extern unsigned g_streamBlocks; +extern unsigned long long g_streamOffset; +extern std::string g_corpora_prefix; +extern std::string g_corpora_suffix; +extern unsigned multicompile_bands; +extern std::string g_corporaFile; +extern std::vector g_signatures; +extern unsigned long int g_matchLimit; +extern unsigned long int g_matchLimitRecursion; +extern unsigned min_ue2_align; +extern unsigned max_ue2_align; +extern size_t g_memoryLimit; +extern bool force_utf8; +extern int force_prefilter; +extern unsigned somPrecisionMode; +extern unsigned limit_matches; +extern unsigned randomSeed; +extern bool use_random_alignment; +extern bool use_PCRE; +extern bool use_NFA; +extern bool use_UE2; +extern bool use_copy_scratch; +extern bool use_copy_stream; +extern bool use_mangle_scratch; +extern bool use_compress_expand; +extern bool use_compress_reset_expand; +extern int abort_on_failure; +extern int no_signal_handler; +extern bool force_edit_distance; +extern unsigned edit_distance; + +// Constants +static const unsigned long int DEFAULT_PCRE_MATCH_LIMIT = 10*1000*1000; +static const unsigned long int DEFAULT_PCRE_MATCH_RECURSION_LIMIT = 10000; +#define MAX_MAX_UE2_ALIGN 64 +#endif diff --git a/tools/hscollider/limit.cpp b/tools/hscollider/limit.cpp new file mode 100644 index 000000000..716a19e3d --- /dev/null +++ b/tools/hscollider/limit.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2015, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "limit.h" + +#include + +#if defined(HAVE_SETRLIMIT) +#include +#include +#include +#include +#include + +void setMemoryLimit(size_t mbytes) { + size_t bytes = mbytes * 1024 * 1024; + + struct rlimit r; + r.rlim_cur = bytes; + r.rlim_max = bytes; + + int rv = setrlimit(RLIMIT_DATA, &r); + if (rv != 0) { + std::cerr << "setrlimit(RLIMIT_DATA, ...) failed: " << + strerror(errno) << std::endl; + } + + rv = setrlimit(RLIMIT_AS, &r); + if (rv != 0) { + std::cerr << "setrlimit(RLIMIT_AS, ...) failed: " << + strerror(errno) << std::endl; + } +} +#else // no setrlimit +void setMemoryLimit(size_t) {} +#endif diff --git a/tools/hscollider/limit.h b/tools/hscollider/limit.h new file mode 100644 index 000000000..64d25abe3 --- /dev/null +++ b/tools/hscollider/limit.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2015, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LIMIT_H +#define LIMIT_H + +#include + +void setMemoryLimit(size_t mbytes); + +#endif // LIMIT_H diff --git a/tools/hscollider/main.cpp b/tools/hscollider/main.cpp new file mode 100644 index 000000000..e1e543cc1 --- /dev/null +++ b/tools/hscollider/main.cpp @@ -0,0 +1,2002 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "BoundedQueue.h" +#include "DatabaseProxy.h" +#include "FileCorpora.h" +#include "GraphTruth.h" +#include "GroundTruth.h" +#include "NfaGeneratedCorpora.h" +#include "Thread.h" +#include "UltimateTruth.h" +#include "args.h" +#include "common.h" +#include "cross_compile.h" +#include "expressions.h" +#include "limit.h" +#include "ng_corpus_properties.h" +#include "sig.h" +#include "simple_timer.h" +#include "util/expression_path.h" +#include "util/string_util.h" + +#include "grey.h" +#include "hs.h" +#include "parser/utf8_validate.h" +#include "ue2common.h" +#include "util/container.h" +#include "util/make_unique.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace std; +using namespace ue2; + +unsigned int numThreads = 1; +unsigned int numScannerThreads = 1; +unsigned int numGeneratorThreads = 1; +enum ColliderMode colliderMode = MODE_BLOCK; +bool echo_matches = false; +int g_quiet = 0; +bool g_verbose = false; +bool g_allSignatures = false; +string g_exprPath; +vector g_signatureFiles; +string g_cmdline; +bool g_ue2CompileAll = false; +unsigned g_streamBlocks = 0; +unsigned long long g_streamOffset = 0; +unsigned multicompile_bands = 0; +vector g_signatures; +unsigned long int g_matchLimit = DEFAULT_PCRE_MATCH_LIMIT; +unsigned long int g_matchLimitRecursion = DEFAULT_PCRE_MATCH_RECURSION_LIMIT; +string g_corpora_prefix; +string g_corpora_suffix; +size_t g_memoryLimit = 1000; // megabytes per thread +unsigned int somFlags = 0; +bool loadDatabases = false; +bool saveDatabases = false; +bool saveCorpora = false; +string saveCorporaFile; +string serializePath; +bool force_utf8 = false; +int force_prefilter = 0; +int no_groups = 0; +unsigned somPrecisionMode = HS_MODE_SOM_HORIZON_LARGE; +unsigned limit_matches = 0; +unsigned randomSeed = 0; +bool use_random_alignment = false; +bool use_PCRE = true; +bool use_NFA = true; +bool use_UE2 = true; +bool use_copy_scratch = false; +bool use_copy_stream = false; +bool use_mangle_scratch = false; +bool use_compress_expand = false; +bool use_compress_reset_expand = false; +int abort_on_failure = 0; +int no_signal_handler = 0; +size_t max_scan_queue_len = 25000; +size_t max_generator_queue_len = 25000; +bool force_edit_distance = false; +unsigned edit_distance = 0; +CorpusProperties corpus_gen_prop; + +// Semi constants +unsigned min_ue2_align = 0; +unsigned max_ue2_align = MAX_MAX_UE2_ALIGN; + +#define DEDUPE_MATCHES + +static +unsigned countCores() { + unsigned count = std::thread::hardware_concurrency(); + return count ? count : 1; +} + +// Detect the Address Sanitizer with either GCC or Clang. +#if defined(__SANITIZE_ADDRESS__) +# define BUILT_WITH_ASAN +#elif defined(__has_feature) +# if __has_feature(address_sanitizer) +# define BUILT_WITH_ASAN +# endif +#endif + +// Set the default params that can be overridden with commandline args +static +void setDefaults() { + // Seed random number generator for corpora + randomSeed = time(nullptr); + // Overcommit since we have generators and scanners running. + numThreads = countCores() * 2; + +#ifdef BUILT_WITH_ASAN + cout << "NOTE: Built with AddressSanitizer.\n" + << "Defaulting to no memory limit and no signal handler.\n" + << endl; + g_memoryLimit = 0; + no_signal_handler = 1; +#endif +} + +static +void exit_with_fail(void) { + cout << "Failing cmdline was:\n " << g_cmdline << endl; + if (abort_on_failure) { + cout << "Calling abort()" << endl; + abort(); + } + exit(1); +} + +namespace /* anonymous */ { + +// For saving corpora out if the -w flag is specified. Note that we need a +// mutex to serialise writes from different threads. +class CorpusWriter { +public: + explicit CorpusWriter(const string &filename) + : out(filename.c_str(), ios_base::trunc) {} + + void write(const string &str) { + std::lock_guard lock(mutex); + out << str << flush; + } + +private: + ofstream out; + std::mutex mutex; +}; + +unique_ptr corporaOut = nullptr; + +// Encapsulates all of the data reported from a test +struct TestSummary { + unsigned totalCorpora = 0; + unsigned totalExpressions = 0; + unsigned failCorpora = 0; + unsigned failPcreCompile = 0; + unsigned failNGCompile = 0; + unsigned failUe2Compile = 0; + unsigned failCompileDifference = 0; // failed in pcre but not ue2 + unsigned failPcreScan = 0; + unsigned failNGScan = 0; + unsigned failUe2Scan = 0; + unsigned failDiff = 0; + unsigned failNoGroundTruth = 0; + set failIds; + set nogtIds; + + // true if we've got a failure + bool hasFailure() const { + return failDiff != 0 || !failIds.empty() || failCompileDifference != 0; + } + + void merge(const TestSummary &a) { + totalCorpora += a.totalCorpora; + totalExpressions += a.totalExpressions; + failCorpora += a.failCorpora; + failPcreCompile += a.failPcreCompile; + failNGCompile += a.failNGCompile; + failUe2Compile += a.failUe2Compile; + failCompileDifference += a.failCompileDifference; + failPcreScan += a.failPcreScan; + failNGScan += a.failNGScan; + failUe2Scan += a.failUe2Scan; + failDiff += a.failDiff; + failNoGroundTruth += a.failNoGroundTruth; + failIds.insert(begin(a.failIds), end(a.failIds)); + nogtIds.insert(begin(a.nogtIds), end(a.nogtIds)); + } +}; + +enum TestResult { + TEST_NO_GROUND_TRUTH, + TEST_PASSED, + TEST_SKIPPED, + TEST_FAILED_COMPILE, + TEST_FAILED +}; + +struct TestUnit { + shared_ptr pcre; // libpcre bytecode + shared_ptr cngi; // NFA graph info (compilation is deferred) + shared_ptr ue2; // ue2 bytecode + Corpus corpus; // a local copy, as we may modify it + + unsigned id; // expression id + unsigned corpus_id; // corpus id + bool highlander; // single match flag + bool prefilter; // prefilter flag + bool som; // start of match flag + bool multi; // if false, we're in single mode. + bool utf8; // at least one of our patterns is utf8 + + enum TestResult result; + + TestUnit(unsigned sig_id, unsigned c_id, const Corpus &c, + shared_ptr pcre_in, shared_ptr cngi_in, + shared_ptr ue2_in, bool multi_in, bool utf8_in, + bool highlander_in, bool prefilter_in, bool som_in) + : pcre(pcre_in), cngi(cngi_in), ue2(ue2_in), corpus(c), id(sig_id), + corpus_id(c_id), highlander(highlander_in), prefilter(prefilter_in), + som(som_in), multi(multi_in), utf8(utf8_in), + result(TEST_NO_GROUND_TRUTH) {} +}; + +} // namespace + +// For ease of printing match sets +static +std::ostream &operator<<(std::ostream &os, const set &v) { + auto vi = v.begin(), ve = v.end(); + while (vi != ve) { + // match offsets + os << '(' << vi->from << ',' << vi->to << ')'; + if (++vi != ve) { + os << ", "; + } + } + return os; +} + +static +void printCorpus(ostream &out, const Corpus &corpus) { + // Print the offending corpus + string corpus_data(corpus.data.begin() + g_corpora_prefix.size(), + corpus.data.end() - g_corpora_suffix.size()); + bool trimmed = false; + if (corpus_data.size() > 1000) { + corpus_data.resize(1000); + trimmed = true; + } + out << " Corpus data: '" << printable(corpus_data) << "'"; + if (trimmed) { + out << " ..."; + } + out << "\n"; +} + +static +void printGroundTruthDifference(ostream &out, const ExpressionMap &exprMap, + const TestUnit &unit, + const ResultSet &pcre_results, + const ResultSet &ngw_results) { + assert(contains(exprMap, unit.id)); + // Print the expression itself + out << " Expression: '" << exprMap.at(unit.id) << "'\n"; + printCorpus(out, unit.corpus); + out << " PCRE matches: " << pcre_results.matches << "\n"; + out << " NFA matches: " << ngw_results.matches << "\n"; + + vector diff; + + set_difference(pcre_results.matches.begin(), pcre_results.matches.end(), + ngw_results.matches.begin(), ngw_results.matches.end(), + back_inserter(diff)); + + for (const auto &match : diff) { + out << " PCRE only: match (" << match.from << "," << match.to << ")\n"; + } + + diff.clear(); + + set_difference(ngw_results.matches.begin(), ngw_results.matches.end(), + pcre_results.matches.begin(), pcre_results.matches.end(), + back_inserter(diff)); + + for (const auto &match : diff) { + out << " NFA only: match (" << match.from << "," << match.to << ")\n"; + } + out.flush(); +} + +// Report the difference information when a pattern causes different matches in +// our engines. +static +void printDifference(ostream &out, const ExpressionMap &exprMap, + const TestUnit &unit, const ResultSet >_results, + const vector &ue2_results, + const vector &pass) { + assert(contains(exprMap, unit.id)); + // Print the expression itself + out << " Expression: '" << exprMap.at(unit.id) << "'\n"; + printCorpus(out, unit.corpus); + out << " " << gt_results.src << " matches: " << gt_results.matches << endl; + + for (u32 align = min_ue2_align; align < max_ue2_align; align++) { + if (pass[align]) { + continue; + } + + u32 align_in = align; + out << " UE2 (" << align; + while (align + 1 < max_ue2_align) { + if (pass[align + 1] || + ue2_results[align] != ue2_results[align + 1]) { + break; + } + align++; + } + + if (align != align_in) { + out << " - " << align; + } + + out << ") matches: " << ue2_results[align].matches; + out << endl; + + vector only; + + // Print matches only returned by ground truth + set_difference(gt_results.matches.begin(), + gt_results.matches.end(), + ue2_results[align].matches.begin(), + ue2_results[align].matches.end(), + back_inserter(only)); + for (const auto &match : only) { + out << " " << gt_results.src << " only: match (" + << match.from << "," << match.to << ')' << endl; + } + + // Print matches only returned by UE2 + only.clear(); + + set_difference(ue2_results[align].matches.begin(), + ue2_results[align].matches.end(), + gt_results.matches.begin(), + gt_results.matches.end(), + back_inserter(only)); + + for (const auto &match : only) { + out << " UE2 only: match (" << match.from << "," << match.to << ')' + << endl; + } + +#ifdef DEDUPE_MATCHES + for (const auto &match : ue2_results[align].dupe_matches) { + out << " UE2 dupe: match (" << match.from << "," << match.to + << ')' << endl; + } +#endif + + if (ue2_results[align].uoom) { + out << " *** UE2 produced matches out of order" << endl; + } + if (ue2_results[align].match_after_halt) { + out << " *** UE2 produced matches after termination" << endl; + } + if (ue2_results[align].invalid_id) { + out << " *** UE2 produced matches for invalid ids" << endl; + } + } +} + +static +void printMode(void) { + if (!g_ue2CompileAll) { + cout << "Single/"; + } else if (!multicompile_bands) { + cout << "Multi/"; + } else { + cout << "Multi-" << multicompile_bands << "/"; + } + + switch (colliderMode) { + case MODE_BLOCK: + cout << "Block"; + break; + case MODE_STREAMING: + cout << "Streaming-" << g_streamBlocks; + if (g_streamOffset) { + cout << " offset " << g_streamOffset; + } + if (use_copy_stream) { + cout << " [copy stream]"; + } + if (use_compress_expand) { + cout << " [compress]"; + } + if (use_compress_reset_expand) { + cout << " [compress+reset]"; + } + break; + case MODE_VECTORED: + cout << "Vectored-" << g_streamBlocks; + break; + } + + if (use_copy_scratch) { + cout << " [copy scratch]"; + } + if (use_mangle_scratch) { + cout << " [mangle]"; + } + cout << endl; +} + +static +void printSummaryV(const TestSummary &sum) { + cout << endl; + cout << "Summary:" << endl; + cout << "Mode: "; + printMode(); + cout << "=========" << endl; + cout << "Expressions processed: " << sum.totalExpressions << endl; + cout << "Corpora processed: " << sum.totalCorpora << endl; + cout << "Expressions with failures: " << sum.failIds.size() << endl; + cout << " Corpora generation failures: " << sum.failCorpora << endl; + cout << " Compilation failures: "; + cout << "pcre:" << sum.failPcreCompile << ", "; + cout << "ng:" << sum.failNGCompile << ", "; + cout << "ue2:" << sum.failUe2Compile << endl; + + cout << " Matching failures: "; + cout << "pcre:" << sum.failPcreScan << ", "; + cout << "ng:" << sum.failNGScan << ", "; + cout << "ue2:" << sum.failUe2Scan << endl; + cout << " Match differences: " << sum.failIds.size() << endl; + cout << " No ground truth: " << sum.nogtIds.size() << endl; + cout << "Total match differences: " << sum.failDiff << endl; +} + +static +void printSummaryQ(const TestSummary &sum) { + cout << "Summary: "; + printMode(); + + cout << "Processed: " << sum.totalExpressions << " expressions, " + << sum.totalCorpora << " corpora" << endl; + cout << "Failures: " << sum.failIds.size() + << " (corpora: " << sum.failCorpora << "; compile: "; + cout << "pcre:" << sum.failPcreCompile << ", "; + cout << "ng:" << sum.failNGCompile << ", "; + cout << "ue2:" << sum.failUe2Compile << "; match: "; + + cout << "pcre:" << sum.failPcreScan << ", "; + cout << "ng:" << sum.failNGScan << ", "; + cout << "ue2:" << sum.failUe2Scan << ")" << endl; + cout << "Differences: " << sum.failIds.size() << " expressions, " + << sum.failDiff << " total" << endl; + cout << "No ground truth: " << sum.nogtIds.size() << " expressions" << endl; +} + +static +void printSummary(const TestSummary &sum) { + if (g_quiet > 1) { + printSummaryQ(sum); + } else { + printSummaryV(sum); + } +} + +// Returns true if this Highlander mode test succeeded. +static +bool checkSingleMatch(const ResultSet &ground_truth, const ResultSet &ue2) { + // In Highlander (single-match) mode, UE2 must return only one of the + // matches returned by PCRE/GraphTruth. It need not be the earliest one. + if (ground_truth.matches.empty()) { + return ue2.matches.empty(); + } else if (ue2.matches.size() != 1) { + return false; + } else { + return contains(ground_truth.matches, *ue2.matches.begin()); + } +} + +// Returns true if this prefiltering mode test succeeded. +static +bool checkPrefilterMatch(const ResultSet &ground_truth, const ResultSet &ue2, + bool highlander) { + if (highlander) { + // Highlander + prefilter is tricky. Best we can do is say that if PCRE + // returns matches, UE2 must return a match, though it may not be one + // of the ones returned by PCRE (it may be an earlier match). + if (!ground_truth.matches.empty()) { + return ue2.matches.size() == 1; + } + // We can't verify anything more. + return true; + } else if (!limit_matches || ue2.matches.size() < limit_matches) { + // In prefilter mode, every match found by PCRE must be found by UE2, + // but the UE2 set may be a superset of the PCRE match set. + return std::includes(ue2.matches.begin(), ue2.matches.end(), + ground_truth.matches.begin(), ground_truth.matches.end()); + } + + // Otherwise, we've hit our match limit. Prefilter mode is quite difficult + // to verify in this case, so we just verify that "something happened". + return true; +} + +static +ResultSet makeEndOfMatchOnly(const ResultSet &rs) { + ResultSet out(rs.src); + for (const auto &match : rs.matches) { + out.addMatch(0, match.to); + } + return out; +} + +static +bool checkMultiMatch(const ResultSet &ground_truth, const ResultSet &ue2) { + // If we had out-of-order matches or matches after termination, we have a + // bug! + if (ue2.uoom || ue2.match_after_halt || ue2.invalid_id) { + return false; + } + + // If we have more UE2 matches than our limit, we have a bug! + if (limit_matches && ue2.matches.size() > limit_matches) { + return false; + } + + // If we have more UE2 matches than PCRE matches, we have a bug! + if (ue2.matches.size() > ground_truth.matches.size()) { + return false; + } + + // If we've got fewer matches than our limit to test, then the match sets + // must be identical. + if (!limit_matches || ground_truth.matches.size() < limit_matches) { + return ground_truth == ue2; + } + + // We're in limit_matches mode _and_ we have hit the limit. Every match in + // 'ue2' must be in 'pcre'. (We can't just trim pcre and do an equality + // test as matches may come out of UE2 a little out of order.) + + // In streaming mode, the limit may mean that we get a different SOM from + // the leftmost one. So we compare only end offsets. + if (colliderMode == MODE_STREAMING || colliderMode == MODE_VECTORED) { + ResultSet gt_eom = makeEndOfMatchOnly(ground_truth); + ResultSet ue2_eom = makeEndOfMatchOnly(ue2); + return std::includes(gt_eom.matches.begin(), gt_eom.matches.end(), + ue2_eom.matches.begin(), ue2_eom.matches.end()); + } + + return std::includes(ground_truth.matches.begin(), + ground_truth.matches.end(), + ue2.matches.begin(), ue2.matches.end()); +} + +// Check results, returns true if there has any failure. +static +bool checkTestResults(ostream &out, TestSummary &summary, + const ExpressionMap &exprMap, TestUnit &unit, + const ResultSet >_results, + const vector &ue2_results) { + bool failed = false; + bool any_fail = false; + vector pass(max_ue2_align, false); + + for (unsigned align = min_ue2_align; align != max_ue2_align; ++align) { + if (unit.prefilter) { + failed = !checkPrefilterMatch(gt_results, ue2_results[align], + unit.highlander); + } else if (unit.highlander) { + failed = !checkSingleMatch(gt_results, ue2_results[align]); + } else { + // In non-Highlander mode, the two result sets MUST be equal + // don't check PCRE if the scan didn't succeed + failed = !checkMultiMatch(gt_results, ue2_results[align]); + } + +#ifdef DEDUPE_MATCHES + if (!failed) { + failed |= !ue2_results[align].dupe_matches.empty(); + } +#endif + + pass[align] = !failed; + + any_fail |= failed; + + summary.failDiff += failed ? 1 : 0; + + if (g_verbose) { + if (failed) { + out << "FAILED: id " << unit.id << ", alignment " << align + << ", corpus " << unit.corpus_id << ", results differ" + << endl; + } else { + out << "PASSED: id " << unit.id << ", alignment " << align + << ", corpus " << unit.corpus_id + << " (matched "<< gt_results.src << ":" + << gt_results.matches.size() + << ", ue2:" << ue2_results[align].matches.size() << ")" + << endl; + } + } + } + + if (!any_fail) { + return false; + } + + if (!g_verbose) { + out << "FAILED: id " << unit.id << ", alignment"; + for (unsigned align = min_ue2_align; align != max_ue2_align; ++align) { + if (!pass[align]) { + out << " " << align; + + if (align + 1 < max_ue2_align && !pass[align + 1]) { + while (align + 1 < max_ue2_align && !pass[align + 1]) { + align++; + } + + out << "-" << align; + } + } + } + + out << ", corpus " << unit.corpus_id << ", results differ" << endl; + } + printDifference(out, exprMap, unit, gt_results, ue2_results, pass); + + return true; +} + +// Construct a UE2 database, taking care of loading/saving to disk when +// appropriate +static +shared_ptr constructDatabase(const set &ids, + const UltimateTruth &ultimate) { + assert(!ids.empty()); + + if (loadDatabases) { + string filename = ultimate.dbFilename(ids); + shared_ptr db = ultimate.loadDatabase(filename, ids); + if (!db) { + if (!g_quiet) { + cout << "FAILED: could not load database " << filename << endl; + } + return nullptr; + } + return make_shared(db); + } + + shared_ptr ue2 = make_shared(ids); + + try { + // If we're not runnable (i.e. we're cross-compiling), let's at least + // try to build the database. + if (!ultimate.runnable()) { + shared_ptr db = ue2->get(ultimate); + assert(db); // throws otherwise + } + + // Compile and save if we've been told to. + if (saveDatabases) { + string filename = ultimate.dbFilename(ids); + if (!ultimate.saveDatabase(*(ue2->get(ultimate)), + filename.c_str())) { + cout << "FAILED: could not save database to file: " << filename + << endl; + } + } + } catch (const CompileFailed &fail) { + if (!g_quiet) { + cout << "FAILED: ue2 compile failed for " << *ids.begin() << ": " + << fail.error << endl; + } + // Return null database to indicate failure. + ue2 = nullptr; + } + + return ue2; +} + +static +bool getGraphTruth(ostream &out, CNGInfo &cngi, GraphTruth &graph, + TestUnit &unit, ResultSet &ngw_results, + TestSummary &summary, const string &expression) { + debug_stage = STAGE_GRAPH_RUN; + + // Skip patterns we've previously marked as bad. + if (cngi.is_bad()) { + summary.failNGScan++; + return false; + } + + // If we already have match information for this corpus, we don't need to + // run PCRE at all. At the moment our on-disk format for corpora with match + // information only includes the end-of-match offset, so we only use these + // in non-som modes. If edit distance is forced, all bets are off so we + // ignore this as well. + if (!g_streamOffset && unit.corpus.hasMatches && !force_utf8 && !cngi.som && + !force_edit_distance) { + if (g_verbose) { + out << "Using corpus match set rather than NFA graph" << endl; + } + ngw_results = ResultSet(unit.corpus.matches, RESULT_FROM_GRAPH); + } else { + // compile the actual graph + const CompiledNG *cng; + try { + debug_stage = STAGE_GRAPH_COMPILE; + cng = cngi.get(); + debug_stage = STAGE_UNDEFINED; + } + catch (const NGCompileFailure &err) { + debug_stage = STAGE_UNDEFINED; + summary.failNGCompile++; + summary.failNGScan++; + cngi.mark_bad(); + if (!g_quiet) { + cout << "FAILED: id " << unit.id + << ", NFA graph compile failed (" << err.msg << ")" + << endl; + } + return false; + } + debug_stage = STAGE_GRAPH_RUN; + + // Run NFA graph and collect match information. + string error; + assert(cng); + if (!graph.run(unit.id, *cng, cngi, unit.corpus.data, ngw_results, + error)) { + if (!g_quiet) { + out << "FAILED: id " << unit.id + << ", NFA graph scan failed: " << error << "\n" + << " Expression: '" << expression << "'\n" + << " Corpus data: '" << printable(unit.corpus.data) + << "'\n" + << " (note: marking bad, skipping subsequent tests)" + << endl; + } + summary.failNGScan++; + cngi.mark_bad(); + return false; + } + } + + return true; +} + +static +bool getGroundTruth(ostream &out, CompiledPcre &cpcre, GroundTruth &ground, + TestUnit &unit, ResultSet &pcre_results, + TestSummary &summary) { + debug_stage = STAGE_PCRE_RUN; + + // Skip patterns we've previously marked as bad. + if (cpcre.is_bad()) { + summary.failPcreScan++; + return false; + } + + // If we already have match information for this corpus, we don't need to + // run PCRE at all. At the moment our on-disk format for corpora with match + // information only includes the end-of-match offset, so we only use these + // in non-som modes. Also, we can't trust corpus matches if there was an + // edit distance requested for all patterns. + if (!g_streamOffset && unit.corpus.hasMatches && !force_utf8 && !cpcre.som + && !force_edit_distance) { + if (g_verbose) { + out << "Using corpus match set rather than PCRE" << endl; + } + pcre_results = ResultSet(unit.corpus.matches, RESULT_FROM_PCRE); + } else { + // Run PCRE and collect match information. + string error; + if (!ground.run(unit.id, cpcre, unit.corpus.data, pcre_results, + error)) { + if (!g_quiet) { + out << "FAILED: id " << unit.id + << ", libpcre scan failed: " << error << "\n" + << " Expression: '" << cpcre.expression << "'\n" + << " Corpus data: '" << printable(unit.corpus.data) + << "'\n" + << " (note: marking PCRE bad, skipping subsequent tests)" + << endl; + } + summary.failPcreScan++; + cpcre.mark_bad(); + return false; + } + } + + return true; +} + +static +void writeCorpus(unsigned id, const Corpus &corpus, const ResultSet &results) { + assert(corporaOut); + ostringstream oss; + oss << id << "=\"" << printable(corpus.data) << "\": "; + + auto vi = results.matches.begin(); + auto ve = results.matches.end(); + + // Print match end offsets only. + while (vi != ve) { + oss << vi->to; + if (++vi != ve) { + oss << ","; + } + } + oss << "\n"; + corporaOut->write(oss.str()); +} + +static +void runTestUnit(ostream &out, GroundTruth &ground, GraphTruth &graph, + UltimateTruth &ultimate, TestUnit &unit, TestSummary &summary, + const ExpressionMap &exprMap) { + assert(use_UE2); + Corpus &corpus = unit.corpus; + + shared_ptr db; + if (use_UE2) { + // Acquire UE2 database. + debug_stage = STAGE_UE2_COMPILE; + try { + db = unit.ue2->get(ultimate); + } catch (const CompileFailed &fail) { + summary.failUe2Compile++; + if (!g_quiet) { + out << "FAILED: ue2 compile failed for " << unit.id << ": " + << fail.error << endl; + unit.result = TEST_FAILED_COMPILE; + debug_stage = STAGE_UNDEFINED; + return; + } + } + debug_stage = STAGE_UNDEFINED; + + if (!db) { + // Database previously failed compilation. + unit.result = TEST_SKIPPED; + return; + } + } + + // If the user has specified that they want prefix/suffix data added to + // their corpora, we do it here; this is as local as possible to the + // test, so we don't keep piles of HUGE corpora hanging around. + if (!g_corpora_prefix.empty()) { + corpus.data.insert(0, g_corpora_prefix); + corpus.hasMatches = false; + } + if (!g_corpora_suffix.empty()) { + corpus.data.append(g_corpora_suffix); + corpus.hasMatches = false; + } + + ResultSet gt_results(RESULT_FROM_PCRE); + vector ue2_results(max_ue2_align, ResultSet(RESULT_FROM_UE2)); + + bool gt_done = false; + + // run PCRE test if enabled and if compile succeeded + if (unit.pcre && use_PCRE) { + gt_done = getGroundTruth(out, *unit.pcre, ground, unit, gt_results, + summary); + } + + // run NFA if PCRE failed (or wasn't run), or if we don't run UE2 + if (unit.cngi && (use_NFA && !gt_done)) { + gt_done = getGraphTruth(out, *unit.cngi, graph, unit, gt_results, + summary, exprMap.find(unit.id)->second); + } + + // both ground truth methods either failed or didn't run + if (!gt_done) { + unit.result = TEST_NO_GROUND_TRUTH; + return; + } + + // Write out corpora if we've been told to + if (saveCorpora) { + writeCorpus(unit.id, unit.corpus, gt_results); + } + + debug_stage = STAGE_UE2_RUN; + for (unsigned int align = min_ue2_align; align != max_ue2_align; ++align) { + bool ok = ultimate.run(unit.id, db, corpus.data, !unit.multi, align, + ue2_results[align]); + + if (!ok) { + if (!g_quiet) { + out << "FAILED: id " << unit.id << ", ue2 scan at alignment " + << align << " failed" << endl; + } + unit.result = TEST_FAILED; + debug_stage = STAGE_UNDEFINED; + return; + } + } + + // if we're using UE2, check all the different results modes + if (checkTestResults(out, summary, exprMap, unit, gt_results, + ue2_results)) { + unit.result = TEST_FAILED; + } else { + unit.result = TEST_PASSED; + } + + debug_stage = STAGE_UNDEFINED; +} + +/* Used for testing the graph truth agains PCE */ +static +void runGroundCompTestUnit(ostream &out, GroundTruth &ground, GraphTruth &graph, + TestUnit &unit, TestSummary &summary, + const ExpressionMap &exprMap) { + assert(!use_UE2); + assert(use_PCRE); + assert(use_NFA); + Corpus &corpus = unit.corpus; + + // If the user has specified that they want prefix/suffix data added to + // their corpora, we do it here; this is as local as possible to the + // test, so we don't keep piles of HUGE corpora hanging around. + if (!g_corpora_prefix.empty()) { + corpus.data.insert(0, g_corpora_prefix); + corpus.hasMatches = false; + } + if (!g_corpora_suffix.empty()) { + corpus.data.append(g_corpora_suffix); + corpus.hasMatches = false; + } + + ResultSet pcre_results(RESULT_FROM_PCRE); + ResultSet ngw_results(RESULT_FROM_GRAPH); + + bool pcreResult = false; + bool graphResult = false; + + if (unit.pcre) { + pcreResult = getGroundTruth(out, *unit.pcre, ground, unit, pcre_results, + summary); + } + + if (unit.cngi) { + graphResult = getGraphTruth(out, *unit.cngi, graph, unit, ngw_results, + summary, exprMap.find(unit.id)->second); + } + + // no ground truth found either NFA or PCRE failed + if (!pcreResult || !graphResult) { + unit.result = TEST_NO_GROUND_TRUTH; + return; + } + + // Write out corpora if we've been told to + if (saveCorpora) { + writeCorpus(unit.id, unit.corpus, pcre_results); + } + + if (pcre_results.matches != ngw_results.matches) { + unit.result = TEST_FAILED; + out << "FAILED: id " << unit.id << ", corpus " << unit.corpus_id + << ", results differ" << endl; + + printGroundTruthDifference(out, exprMap, unit, pcre_results, + ngw_results); + } else { + unit.result = TEST_PASSED; + if (g_verbose) { + out << "PASSED: id " << unit.id << ", corpus " << unit.corpus_id + << " (matched pcre:" << pcre_results.matches.size() + << ", matched ng:" << ngw_results.matches.size() << ")" << endl; + } + } + + debug_stage = STAGE_UNDEFINED; +} + +static +void addCorporaToQueue(ostream &out, BoundedQueue &testq, unsigned id, + CorporaSource &corpora, TestSummary &summary, + shared_ptr cpcre, shared_ptr cngi, + shared_ptr ue2, bool multi, bool utf8) { + // build corpora + vector c; + try { + corpora.generate(id, c); + } + catch (CorpusFailure &err) { + if (!g_quiet) { + out << "FAILED: id " << id << ", corpora failure: " << err.message + << endl; + } + summary.failCorpora++; + return; + } + + const bool som = cpcre ? cpcre->som : cngi->som; + const bool prefilter = cpcre ? cpcre->prefilter : cngi->prefilter; + const bool highlander = cpcre ? cpcre->highlander : cngi->highlander; + + // If we're in UTF-8 mode and the corpus isn't valid UTF-8, skip it: + // Hyperscan's behaviour when scanning invalid UTF-8 data in UTF-8 mode + // is undefined. + if (utf8) { + auto is_invalid_utf8 = [](const Corpus &corpus) { + return !isValidUtf8(corpus.data.c_str()); + }; + c.erase(remove_if(begin(c), end(c), is_invalid_utf8), end(c)); + } + + // Collect together corpora units in a container so that we don't have to + // repeatedly lock the queue. + vector> tests; + tests.reserve(c.size()); + + size_t corpus_id = 0; + for (const Corpus &corpus : c) { + tests.push_back(ue2::make_unique(id, corpus_id, corpus, cpcre, + cngi, ue2, multi, utf8, + highlander, prefilter, som)); + corpus_id++; + } + + testq.push(begin(tests), end(tests)); +} + +namespace /* anonymous */ { + +// A subclass of Thread that stores its own output in a stringstream, flushing +// it to cout when necessary. +class OutputThread : public Thread { +public: + OutputThread(size_t id) : Thread(id) {} + ~OutputThread() override { + flush_output(); + } + +protected: + void flush_output() { + const string &s = out.str(); + if (!s.empty()) { + cout << s; + out.str(""); // make empty + } + } + + // Output stream, flushed to cout after every test unit. + stringstream out; +}; + +class ScanThread : public OutputThread { +public: + ScanThread(size_t id, BoundedQueue &testq, const ExpressionMap &e, + const hs_platform_info *plat, const Grey &grey) + : OutputThread(id), q(testq), + ground(out, e, g_matchLimit, g_matchLimitRecursion), graph(out, e), + ultimate(out, e, plat, grey, g_streamBlocks), exprMap(e) {} + + void run() override { + DEBUG_PRINTF("thread %zu running\n", thread_id); + for (;;) { + const auto unit = q.pop(thread_id); + if (!unit) { + // Sentinel value, indicates that we have run out of units to + // process. + DEBUG_PRINTF("thread %zu stopped\n", thread_id); + break; + } + + assert(unit); + assert(exprMap.find(unit->id) != exprMap.end()); + + // Debug information is stored in TLS and (hopefully) printed out in + // the event of a crash. + debug_expr = unit->id; + debug_corpus = unit->corpus_id; + debug_corpus_ptr = unit->corpus.data.c_str(); + debug_corpus_len = unit->corpus.data.size(); + debug_expr_ptr = exprMap.find(unit->id)->second.c_str(); + + if (use_UE2) { + runTestUnit(out, ground, graph, ultimate, *unit, summary, + exprMap); + } else { + runGroundCompTestUnit(out, ground, graph, *unit, summary, + exprMap); + } + + if (unit->result == TEST_NO_GROUND_TRUTH) { + summary.nogtIds.insert(unit->id); + // this is fine, continue + } else if (unit->result == TEST_FAILED) { + summary.failIds.insert(unit->id); + } + + count++; + summary.totalCorpora++; + flush_output(); + } + } + + const TestSummary &getSummary() const { return summary; } + +public: + size_t count = 0; // number of units processed + +private: + // Shared queue. + BoundedQueue &q; + + // Thread-local data. + GroundTruth ground; // independent copy + GraphTruth graph; // independent copy + UltimateTruth ultimate; // independent copy + TestSummary summary; + + // Constant shared data. + const ExpressionMap &exprMap; +}; + +/** Represent a work item for the corpus generation threads. This contains + * all information relating to an expression. The corpus generator will + * generate corpora for this expression and enqueue work items representing + * complete test cases for the scanning threads. + */ +struct CorpusGenUnit { + CorpusGenUnit(unique_ptr cngi_in, unique_ptr pcre_in, + shared_ptr ue2_in, unsigned expr_id, + bool multi_in, bool utf8_in) + : cngi(move(cngi_in)), pcre(move(pcre_in)), ue2(ue2_in), id(expr_id), + multi(multi_in), utf8(utf8_in) {} + + unique_ptr cngi; + unique_ptr pcre; + + /* ue2 shared_ptr as in multicompile and banded compile it is shared amongst + * various corpus units (with differing expression ids). */ + shared_ptr ue2; + + unsigned id; // expression id + bool multi; // ue2 contains more than one expression + bool utf8; // ue2 can be run against utf8 corpora +}; + +class CorpusGenThread : public OutputThread { +public: + CorpusGenThread(size_t id, BoundedQueue &testq_in, + BoundedQueue &corpq_in, + const CorporaSource &corpora_in) + : OutputThread(id), testq(testq_in), corpq(corpq_in), + corpora(corpora_in.clone()) {} + + void run() override { + DEBUG_PRINTF("thread %zu running\n", thread_id); + for (;;) { + auto c = corpq.pop(thread_id); + if (!c) { + break; + } + + addCorporaToQueue(out, testq, c->id, *corpora, summary, + move(c->pcre), move(c->cngi), c->ue2, c->multi, + c->utf8); + + count++; + flush_output(); + } + } + + const TestSummary &getSummary() const { return summary; } + +public: + size_t count = 0; // number of units processed + +private: + // Output queue, shared between threads. + BoundedQueue &testq; + + // Input queue, shared between corpus generator threads. + BoundedQueue &corpq; + + // Thread-local data. + const unique_ptr corpora; // independent copy + TestSummary summary; +}; + +} // namespace + +static +unique_ptr makeNGInfo(const unsigned id, TestSummary &summary, + GraphTruth &graph, UltimateTruth &ultimate, + shared_ptr ue2) { + string nfaErr; + + try { + debug_stage = STAGE_GRAPH_PREPROCESS; + auto cngi = graph.preprocess(id); + debug_stage = STAGE_UNDEFINED; + return cngi; + } + catch (const NGCompileFailure &err) { + nfaErr = err.msg; + debug_stage = STAGE_UNDEFINED; + // fall through + } + catch (const NGUnsupportedFailure &err) { + // unsupported error happens when the pattern appears to be valid, but + // there are things that we don't yet support (e.g. SOM). + // in this case, try again, suppressing the errors + debug_stage = STAGE_UNDEFINED; + summary.failNGCompile++; + + // try again and suppress unsupported errors + try { + debug_stage = STAGE_GRAPH_PREPROCESS; + auto cngi = graph.preprocess(id, true); + debug_stage = STAGE_UNDEFINED; + + // preprocess succeeded - that means the pattern itself is valid. + // however, we can't use it, so we have to mark it as bad + // only print the error in the following cases: + // 1) if verbose is specified + // 2) if we are not using UE2 and quiet is NOT specified + if ((!use_UE2 && !g_quiet) || g_verbose) { + cout << "FAILED: id " << id << ", NFA graph preprocess failed (" + << err.msg << ")" << endl; + } + cngi->mark_bad(); + return cngi; + } + catch (const NGCompileFailure &e) { + // compile failed + nfaErr = e.msg; + debug_stage = STAGE_UNDEFINED; + // fall through + } + } + + // We should ensure that we also fail compilation with UE2, otherwise we + // likely have a pattern support bug. + try { + auto db = ue2->get(ultimate); + if (db) { + // if we made it this far, that means UE2 compile succeeded while + // NFA compile failed. + cout << "FAILED: id " << id << ", NFA graph preprocess failed (" + << nfaErr << ") but UE2 compile succeeded." << endl; + summary.failNGCompile++; + summary.failCompileDifference++; + return nullptr; + } + // If db is nullptr, we have previously failed compilation of this + // database. + } + catch (const CompileFailed &) { + // Everything's OK: compilation failed in Hyperscan as well. Fall + // through. + } + summary.failNGCompile++; + if (!g_quiet) { + cout << "FAILED: id " << id << ", NFA graph preprocess failed (" + << nfaErr << ")" << endl; + } + return nullptr; +} + +static +unique_ptr makePcre(const unsigned id, TestSummary &summary, + GroundTruth &ground, UltimateTruth &ultimate, + shared_ptr ue2) { + string pcreErr; + + try { + debug_stage = STAGE_PCRE_COMPILE; + auto cpcre = ground.compile(id); + debug_stage = STAGE_UNDEFINED; + return cpcre; + } + catch (const SoftPcreCompileFailure &err) { + debug_stage = STAGE_UNDEFINED; + summary.failPcreCompile++; + if (g_verbose) { + cout << "FAILED: id " << id + << ", libpcre compile failed with soft error: " << err.msg + << endl; + } + return nullptr; + } + catch (const PcreCompileFailure &err) { + debug_stage = STAGE_UNDEFINED; + pcreErr = err.msg; + // fall through + } + + // We should ensure that we also fail compilation with UE2, otherwise we + // likely have a pattern support bug. + try { + auto db = ue2->get(ultimate); + if (db) { + // OK, so now we have a situation: PCRE failed but UE2 succeeded. + // There is one situation where this is legal: patterns beginning + // with (*UTF8), which will throw an error due to the callback + // wrapping we do for PCRE. We can check these by trying to compile + // an "unwrapped" PCRE. + ground.compile(id, true); + // If we didn't throw, PCRE failed above but succeeded when not + // wrapped in a callback, and UE2 succeeded. Not worth reporting, + // fall through. + } + } + catch (const CompileFailed &) { + // Everything's OK: compilation failed in Hyperscan as well. Fall + // through. + } + catch (const PcreCompileFailure &) { + cout << "FAILED: id " << id << ", libpcre compile failed (" << pcreErr + << ") but UE2 compile succeeded." << endl; + summary.failPcreCompile++; + summary.failCompileDifference++; + return nullptr; + } + + if (!g_quiet) { + cout << "FAILED: id " << id << ", libpcre compile failed: " << pcreErr + << endl; + } + + summary.failPcreCompile++; + return nullptr; +} + +static +void drainGenerators(BoundedQueue &corpq, + vector> &generators, + TestSummary &summary) { + // Push a sentinel per thread. + for (size_t i = 0; i < generators.size(); i++) { + corpq.push(nullptr); + } + + // Wait for workers to end and retrieve their results. + for (auto &c : generators) { + c->join(); + summary.merge(c->getSummary()); + } +} + +// Note: In multi-pattern cases, utf8 is true if any pattern to be run against +// this corpus is in UTF-8 mode. +static +unique_ptr makeCorpusGenUnit(unsigned id, TestSummary &summary, + GroundTruth &ground, + GraphTruth &graph, + UltimateTruth &ultimate, + shared_ptr ue2, + bool multi, bool utf8) { + unique_ptr cpcre; + unique_ptr cngi; + + // compile PCRE bytecode + if (use_PCRE) { + cpcre = makePcre(id, summary, ground, ultimate, ue2); + } + if (use_NFA) { + cngi = makeNGInfo(id, summary, graph, ultimate, ue2); + } + + // if both compiles failed, skip the test + if (!cpcre && !cngi) { + return nullptr; + } + + // Caller may already have set the UTF-8 property (in multi cases) + utf8 |= cpcre ? cpcre->utf8 : cngi->utf8; + + return ue2::make_unique(move(cngi), move(cpcre), ue2, id, + multi, utf8); +} + +static +bool hasUTF8Pattern(GroundTruth &ground, ExpressionMap::const_iterator it, + ExpressionMap::const_iterator end) { + /* note: we cannot just check the flags as utf8 can be enabled in the + * pattern itself with (*UTF) */ + debug_stage = STAGE_PCRE_COMPILE; + for (; it != end; ++it) { + try { + auto cpcre = ground.compile(it->first); + assert(cpcre); // Would have thrown PcreCompileFailure otherwise. + if (cpcre->utf8) { + DEBUG_PRINTF("UTF8 mode\n"); + debug_stage = STAGE_UNDEFINED; + return true; + } + } + catch (const PcreCompileFailure &) { + continue; + } + } + debug_stage = STAGE_UNDEFINED; + return false; +} + +// Fill a test queue with single-pattern tests. +static +void buildSingle(BoundedQueue &corpq, TestSummary &summary, + GroundTruth &ground, GraphTruth &graph, + UltimateTruth &ultimate, const ExpressionMap &exprMap) { + for (const auto &m : exprMap) { + unsigned id = m.first; + debug_expr = id; + debug_expr_ptr = m.second.c_str(); + + shared_ptr ue2 = constructDatabase({id}, ultimate); + if (!ue2) { + summary.failUe2Compile++; + continue; + } + + // if we're cross-compiling, then we don't bother building PCRE and + // running scans, we're just going to output the database bytecode. + if (!ultimate.runnable()) { + continue; + } + + bool multi = false; + bool utf8 = false; + auto u = makeCorpusGenUnit(id, summary, ground, graph, ultimate, ue2, + multi, utf8); + if (u) { + corpq.push(move(u)); + } + } +} + +// Fill a test queue with multi-pattern tests of size N, where N is the band +// size specified on the command line. +static +void buildBanded(BoundedQueue &corpq, TestSummary &summary, + GroundTruth &ground, GraphTruth &graph, + UltimateTruth &ultimate, const ExpressionMap &exprMap) { + for (auto i = exprMap.begin(), e = exprMap.end(); i != e;) { + debug_expr = i->first; + debug_expr_ptr = i->second.c_str(); + + // Build a set of IDs in this band from the expression map + set bandIds; + + if (g_verbose) { + cout << "Building set:"; + } + + ExpressionMap::const_iterator band_end = i; + for (u32 j = 0; j < multicompile_bands && band_end != e; + j++, ++band_end) { + bandIds.insert(bandIds.end(), band_end->first); + if (g_verbose) { + cout << " " << band_end->first; + } + } + + if (g_verbose) { + cout << endl; + } + + // compile UE2 bytecode + shared_ptr ue2 = constructDatabase(bandIds, ultimate); + if (!ue2) { + summary.failUe2Compile++; + i = band_end; + continue; + } + + // if we're cross-compiling, then we don't bother building PCRE and + // running scans, we're just going to output the database bytecode. + if (!ultimate.runnable()) { + i = band_end; + continue; + } + + bool utf8 = hasUTF8Pattern(ground, i, band_end); + + for (; i != band_end; ++i) { + unsigned id = i->first; + bool multi = true; + auto u = makeCorpusGenUnit(id, summary, ground, graph, ultimate, + ue2, multi, utf8); + if (u) { + corpq.push(move(u)); + } + } + } +} + +// Fill a test queue with multi-pattern tests. +static +void buildMulti(BoundedQueue &corpq, TestSummary &summary, + GroundTruth &ground, GraphTruth &graph, UltimateTruth &ultimate, + const ExpressionMap &exprMap) { + // Build a set of all IDs from the expression map + set idsAll; + for (const auto &e : exprMap) { + idsAll.insert(e.first); + } + + // Compile in UE2 + shared_ptr ue2 = constructDatabase(idsAll, ultimate); + if (!ue2) { + summary.failUe2Compile++; + return; + } + + // if we're cross-compiling, then we don't bother building PCRE and + // running scans, we're just going to output the database bytecode. + if (!ultimate.runnable()) { + return; + } + + bool utf8 = hasUTF8Pattern(ground, exprMap.begin(), exprMap.end()); + + for (const auto &m : exprMap) { + unsigned id = m.first; + debug_expr = id; + debug_expr_ptr = m.second.c_str(); + bool multi = true; + auto u = makeCorpusGenUnit(id, summary, ground, graph, ultimate, ue2, + multi, utf8); + if (u) { + corpq.push(move(u)); + } + } +} + +static +void generateTests(CorporaSource &corpora_src, const ExpressionMap &exprMap, + TestSummary &summary, const hs_platform_info *plat, + const Grey &grey, BoundedQueue &testq) { + GraphTruth graph(cout, exprMap); + GroundTruth ground(cout, exprMap, g_matchLimit, g_matchLimitRecursion); + UltimateTruth ultimate(cout, exprMap, plat, grey, g_streamBlocks); + + // Construct corpus generator queue and threads. + BoundedQueue corpq(numGeneratorThreads, + max_generator_queue_len); + vector> generators; + for (size_t i = 0; i < numGeneratorThreads; i++) { + auto c = make_unique(i, testq, corpq, corpora_src); + c->start(); + generators.push_back(move(c)); + } + + if (g_ue2CompileAll && multicompile_bands) { + printf("Running single-pattern/banded-multi-compile test for %zu " + "expressions.\n\n", exprMap.size()); + buildBanded(corpq, summary, ground, graph, ultimate, exprMap); + } else if (g_ue2CompileAll) { + printf("Running single-pattern/multi-compile test for %zu " + "expressions.\n\n", exprMap.size()); + buildMulti(corpq, summary, ground, graph, ultimate, exprMap); + } else { + printf("Running single-pattern/single-compile test for %zu " + "expressions.\n\n", exprMap.size()); + buildSingle(corpq, summary, ground, graph, ultimate, exprMap); + } + + drainGenerators(corpq, generators, summary); +} + +static +void printSettingsV(const vector &corporaFiles, + const hs_platform_info *platform) { + cout << "hscollider: The Pattern Collider Mark II\n\n" + << "Number of threads: " << numThreads << " (" << numScannerThreads + << " scanner, " << numGeneratorThreads << " generator)\n" + << "Expression path: " << g_exprPath << "\n" + << "Signature files: "; + if (g_signatureFiles.empty()) { + cout << "none" << endl; + } else { + for (unsigned i = 0; i < g_signatureFiles.size(); i++) { + string &fname = g_signatureFiles[i]; + if (i > 0) { + cout << string(20, ' '); + } + cout << fname << endl; + } + } + cout << "Mode of operation: "; + + switch (colliderMode) { + case MODE_BLOCK: cout << "block mode"; break; + case MODE_STREAMING: cout << "streaming mode"; break; + case MODE_VECTORED: cout << "vectored mode"; break; + } + cout << endl; + + if (limit_matches) { + cout << "Terminate scanning after " << limit_matches << " matches." + << endl; + } + + if (platform) { + cout << "Cross-compile for: " << to_string(*platform) << endl; + } + + if (loadDatabases) { + cout << "Loading DBs from: " << serializePath << endl; + } + if (saveDatabases) { + cout << "Saving DBs to: " << serializePath << endl; + } + if (colliderMode == MODE_STREAMING) { + cout << "Stream block count: " << g_streamBlocks << endl; + } + if (colliderMode == MODE_VECTORED) { + cout << "Vectored block count: " << g_streamBlocks << endl; + } + + if (use_UE2) { + if (max_ue2_align == min_ue2_align + 1) { + cout << "UE2 scan alignment: " << min_ue2_align << endl; + } else { + cout << "UE2 scan alignment: [" << min_ue2_align << ", " + << max_ue2_align << ")" << endl; + } + } + + if (!corporaFiles.empty()) { + for (const auto &file : corporaFiles) { + cout << "Corpora read from file: " << file << endl; + } + } else { + cout << "Corpora properties: \n" + << " random seed: " << corpus_gen_prop.getSeed() << "\n" + << " percentages: " << corpus_gen_prop.percentMatch() + << "% match, " + << corpus_gen_prop.percentUnmatch() << "% unmatch, " + << corpus_gen_prop.percentRandom() << "% random" << endl; + + // prefix and suffix info + const min_max &prefixSpan = corpus_gen_prop.prefixRange; + const min_max &suffixSpan = corpus_gen_prop.suffixRange; + if (prefixSpan.max) { + cout << " random prefix: " << prefixSpan.min << " to " + << prefixSpan.max << endl; + } else { + cout << " random prefix: none" << endl; + } + if (suffixSpan.max) { + cout << " random suffix: " << suffixSpan.min + << " to " << suffixSpan.max << endl; + } else { + cout << " random suffix: none" << endl; + } + + // cycle info + pair cycleSpan = corpus_gen_prop.getCycleLimit(); + cout << " follow cycles: " << cycleSpan.first << " to " + << cycleSpan.second << " times" << endl; + } + + if (saveCorpora) { + cout << "Saving corpora to: " << saveCorporaFile << endl; + } + + cout << endl; +} + +static +void printSettingsQ(const vector &corporaFiles, + const hs_platform_info *platform) { + cout << "Number of threads: " << numThreads << endl + << "Expression path: " << g_exprPath << endl + << "Signature files: "; + if (g_signatureFiles.empty()) { + cout << "none" << endl; + } else { + for (unsigned i = 0; i < g_signatureFiles.size(); i++) { + string &fname = g_signatureFiles[i]; + if (i > 0) { + cout << string(20, ' '); + } + cout << fname << endl; + } + } + cout << "Mode of operation: "; + + switch (colliderMode) { + case MODE_BLOCK: cout << "block mode"; break; + case MODE_STREAMING: cout << "streaming mode"; break; + case MODE_VECTORED: cout << "vectored mode"; break; + } + cout << endl; + + if (limit_matches) { + cout << "Terminate scanning after " << limit_matches << " matches." + << endl; + } + + if (platform) { + cout << "Cross-compile for: " << to_string(*platform) << endl; + } + + if (colliderMode == MODE_STREAMING) { + cout << "Stream block count: " << g_streamBlocks << endl; + } + if (colliderMode == MODE_VECTORED) { + cout << "Vectored block count: " << g_streamBlocks << endl; + } + + if (max_ue2_align == min_ue2_align + 1) { + cout << "UE2 scan alignment: " << min_ue2_align << endl; + } else { + cout << "UE2 scan alignment: [" << min_ue2_align << ", " + << max_ue2_align << ")" << endl; + } + + if (!g_corpora_prefix.empty()) { + cout << "Prefix of " << g_corpora_prefix.size() << "bytes" << endl; + } + if (!g_corpora_suffix.empty()) { + cout << "Suffix of " << g_corpora_suffix.size() << "bytes" << endl; + } + + if (!corporaFiles.empty()) { + cout << "Corpora: from file" << endl; + } else { + cout << "Corpora: -R " << corpus_gen_prop.getSeed() << " -p " + << corpus_gen_prop.percentMatch() << "," + << corpus_gen_prop.percentUnmatch() << "," + << corpus_gen_prop.percentRandom(); + + // prefix and suffix info + const min_max &prefixSpan = corpus_gen_prop.prefixRange; + const min_max &suffixSpan = corpus_gen_prop.suffixRange; + if (prefixSpan.max) { + cout << " -P " << prefixSpan.min << "," << prefixSpan.max; + } + if (suffixSpan.max) { + cout << " -S " << suffixSpan.min << "," << suffixSpan.max; + } + + // cycle info + pair cycleSpan = corpus_gen_prop.getCycleLimit(); + cout << " -C " << cycleSpan.first << "," << cycleSpan.second; + cout << endl; + } +} + +static +void printSettings(const vector &c, const hs_platform_info *plat) { + if (g_quiet > 1) { + printSettingsQ(c, plat); + } else { + printSettingsV(c, plat); + } +} + +static +unique_ptr buildCorpora(const vector &corporaFiles, + const ExpressionMap &exprMap) { + if (!corporaFiles.empty()) { + auto c = ue2::make_unique(); + for (const auto &file : corporaFiles) { + if (!c->readFile(file)) { + cout << "Error reading corpora from file: " << file << endl; + exit_with_fail(); + } + } + return move(c); /* move allows unique_ptr conversion */ + } else { + auto c = ue2::make_unique( + exprMap, corpus_gen_prop, force_utf8, force_prefilter); + return move(c); + } +} + +static +bool needsQuotes(const char *s) { + size_t len = strlen(s); + // don't confuse the correct isblank for the one in locale + int (*blank)(int) = &std::isblank; + + if (len == 0) { + return true; + } + if (find_if(s, s + len, blank) != s + len) { + return true; + } + + return false; +} + +static +void storeCmdline(int argc, char **argv) { + for (int i = 0; i < argc; i++) { + const char *s = argv[i]; + if (needsQuotes(s)) { + g_cmdline += '"'; + g_cmdline += s; + g_cmdline += '"'; + } else { + g_cmdline += s; + } + if (i != argc - 1) { + g_cmdline += " "; + } + } +} + +static +bool runTests(CorporaSource &corpora_source, const ExpressionMap &exprMap, + const hs_platform_info *plat, const Grey &grey) { + TestSummary summary; + summary.totalExpressions = exprMap.size(); + BoundedQueue testq(numScannerThreads, max_scan_queue_len); + + // Start scanning threads. + vector> scanners; + for (size_t i = 0; i < numScannerThreads; i++) { + auto s = ue2::make_unique(i, testq, exprMap, plat, grey); + s->start(); + scanners.push_back(move(s)); + } + + generateTests(corpora_source, exprMap, summary, plat, grey, testq); + + // Push a sentinel per scanning thread to ensure that everyone finishes + // work. + for (size_t i = 0; i < scanners.size(); i++) { + testq.push(nullptr); + } + + // Wait for consumers to end and retrieve their results. + for (size_t i = 0; i < scanners.size(); i++) { + const auto &s = scanners[i]; + s->join(); + + if (g_verbose) { + cout << "Thread " << i << " processed " << s->count << " units." + << endl; + } + + summary.merge(s->getSummary()); + } + + printSummary(summary); + return !summary.hasFailure(); +} + +int main(int argc, char *argv[]) { + Grey grey; + vector corporaFiles; + + for (int i = 1; i < argc - 1; i++) { + if (!strcmp(argv[i], "-G")) { + cout << "Override: " << argv[i + 1] << endl; + } + } + + setDefaults(); + storeCmdline(argc, argv); + unique_ptr plat; + corpus_gen_prop.seed(randomSeed); + + processArgs(argc, argv, corpus_gen_prop, &corporaFiles, &grey, &plat); + + // If the user has asked for a random alignment, we select it here (after + // random number seed applied). + if (use_random_alignment) { + min_ue2_align = corpus_gen_prop.rand(0, 15); + max_ue2_align = min_ue2_align + 1; + } + + // Limit memory usage, unless the user has specified zero on the command + // line or in a config file. + if (g_memoryLimit) { + setMemoryLimit(g_memoryLimit * numThreads); + } + + // Split threads available up amongst scanner and generator threads. + numGeneratorThreads = max(1u, static_cast(numThreads * 0.5)); + numScannerThreads = max(1u, numThreads - numGeneratorThreads); + + ExpressionMap exprMap; + loadExpressions(g_exprPath, exprMap); + + if (!g_allSignatures) { + SignatureSet signatures; + if (!g_signatureFiles.empty()) { + for (string &fname : g_signatureFiles) { + loadSignatureList(fname, signatures); + } + } else { + signatures.insert(signatures.end(), g_signatures.begin(), + g_signatures.end()); + } + + exprMap = limitToSignatures(exprMap, signatures); + } + + printSettings(corporaFiles, plat.get()); + + if (exprMap.empty()) { + cout << "Warning: no signatures to scan. Exiting." << endl; + exit(0); + } + + if (!no_signal_handler) { + installSignalHandler(); + } + + if (saveDatabases || loadDatabases) { + struct stat st; + if (stat(serializePath.c_str(), &st) < 0) { + cout << "Unable to stat serialize path '" << serializePath + << "': " << strerror(errno) << endl; + exit_with_fail(); + } + } + + // If we're saving corpora out, truncate the output file. + if (saveCorpora) { + corporaOut = ue2::make_unique(saveCorporaFile); + } + + GroundTruth::global_prep(); + + auto corpora_source = buildCorpora(corporaFiles, exprMap); + + if (!g_verbose && g_quiet < 2) { + cout << "Only failed tests are displayed." << endl; + } + + SimpleTimer timer; + bool success = runTests(*corpora_source, exprMap, plat.get(), grey); + cout << "\nTotal elapsed time: " << timer.elapsed() << " secs." << endl; + exprMap.clear(); + + if (!success) { + exit_with_fail(); + } + + return 0; +} diff --git a/tools/hscollider/pcre_util.cpp b/tools/hscollider/pcre_util.cpp new file mode 100644 index 000000000..0e1aa0ec6 --- /dev/null +++ b/tools/hscollider/pcre_util.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "pcre_util.h" + +#include "hs.h" + +#include +#include /* for pcre flags */ + +bool getPcreFlags(unsigned int hs_flags, unsigned int *flags, + bool *highlander, bool *prefilter, bool *som) { + assert(flags); + assert(highlander); + assert(prefilter); + assert(som); + *flags = 0; + *highlander = false; + *prefilter = false; + *som = false; + + if (hs_flags & HS_FLAG_CASELESS) { + *flags |= PCRE_CASELESS; + hs_flags &= ~HS_FLAG_CASELESS; + } + if (hs_flags & HS_FLAG_DOTALL) { + *flags |= PCRE_DOTALL; + hs_flags &= ~HS_FLAG_DOTALL; + } + if (hs_flags & HS_FLAG_MULTILINE) { + *flags |= PCRE_MULTILINE; + hs_flags &= ~HS_FLAG_MULTILINE; + } + if (hs_flags & HS_FLAG_UCP) { + *flags |= PCRE_UCP; + hs_flags &= ~HS_FLAG_UCP; + } + if (hs_flags & HS_FLAG_UTF8) { + *flags |= PCRE_UTF8; + hs_flags &= ~HS_FLAG_UTF8; + } + if (hs_flags & HS_FLAG_SINGLEMATCH) { + *highlander = true; + hs_flags &= ~HS_FLAG_SINGLEMATCH; + } + if (hs_flags & HS_FLAG_PREFILTER) { + *prefilter = true; + hs_flags &= ~HS_FLAG_PREFILTER; + } + if (hs_flags & HS_FLAG_SOM_LEFTMOST) { + *som = true; + hs_flags &= ~HS_FLAG_SOM_LEFTMOST; + } + + // Flags that are irrelevant to PCRE. + hs_flags &= ~HS_FLAG_ALLOWEMPTY; + + if (hs_flags) { + // You've added new flags, haven't you? + assert(0); + return false; + } + + return true; +} diff --git a/tools/hscollider/pcre_util.h b/tools/hscollider/pcre_util.h new file mode 100644 index 000000000..877588735 --- /dev/null +++ b/tools/hscollider/pcre_util.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PCRE_UTIL_H +#define PCRE_UTIL_H + +/** Translates the given hyperscan flags into pcre flags (where appropriate) + * and other bools (for flags which are not directly translateable). + * + * Returns false if an unknown hyperscan flag is encountered. + */ +bool getPcreFlags(unsigned int hs_flags, unsigned int *pcre_flags, + bool *highlander, bool *prefilter, bool *som); + +#endif /* PCRE_UTIL_H */ + diff --git a/tools/hscollider/sig.cpp b/tools/hscollider/sig.cpp new file mode 100644 index 000000000..b48be98a9 --- /dev/null +++ b/tools/hscollider/sig.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2015-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" + +#include "sig.h" + +#include +#include +#include +#include +#include + +#ifdef HAVE_SIGACTION +#include +#endif + +#ifdef HAVE_BACKTRACE +#include +#include +#endif + +#define BACKTRACE_BUFFER_SIZE 200 + +TLS_VARIABLE volatile int debug_stage = STAGE_UNDEFINED; +TLS_VARIABLE volatile int debug_expr = 0; +TLS_VARIABLE const char * volatile debug_expr_ptr = nullptr; +TLS_VARIABLE volatile int debug_corpus = 0; +TLS_VARIABLE const char * volatile debug_corpus_ptr = nullptr; +TLS_VARIABLE volatile size_t debug_corpus_len = 0; + +extern std::string g_cmdline; + +#ifdef HAVE_SIGACTION +static void sighandler(int signum) { + /* NOTE: This signal handler is designed solely to provide more information + * when a crash occurs in ue2collider -- it makes calls to signal-unsafe + * functions like printf() and backtrace() by design, since we're already + * in deep trouble and are going to exit anyway. */ + + fflush(stdout); + printf("signal %d\n", signum); + printf("\nFailing cmdline was:\n%s\n\n", g_cmdline.c_str()); + printf("expression %d ", debug_expr); + switch(debug_stage) { + case STAGE_UE2_COMPILE: + printf("ue2 compile\n"); + break; + case STAGE_UE2_RUN: + printf("corpus %d ue2 scan\n", debug_corpus); + break; + case STAGE_PCRE_COMPILE: + printf("pcre compile\n"); + break; + case STAGE_PCRE_RUN: + printf("corpus %d pcre scan\n", debug_corpus); + break; + case STAGE_GRAPH_PREPROCESS: + printf("graph preprocess\n"); + break; + case STAGE_GRAPH_COMPILE: + printf("graph compile\n"); + break; + case STAGE_GRAPH_RUN: + printf("corpus %d graph scan\n", debug_corpus); + break; + default: + case STAGE_UNDEFINED: + printf("unknown stage\n"); + break; + } + printf("\n"); + + if (debug_expr_ptr) { + printf("expression %p\n", debug_expr_ptr); + printf("%d:%s\n\n", debug_expr, debug_expr_ptr); + } + + if (debug_stage == STAGE_PCRE_RUN || debug_stage == STAGE_UE2_RUN) { + printf("corpus %p len %zu\n", debug_corpus_ptr, debug_corpus_len); + + printf("%d:", debug_expr); + for (size_t i = 0; i < debug_corpus_len && debug_corpus_ptr; i++) { + unsigned char c = debug_corpus_ptr[i]; + if (c == '\n') { + printf("\\n"); + } else if (c == '\t') { + printf("\\t"); + } else if (c == '\r') { + printf("\\r"); + } else if (0x20 <= c && c <= 0x7e && c != '\\') { + printf("%c", c); + } else { + printf("\\x%02hhx", c); + } + } + printf("\n\n"); + } + + fflush(stdout); + +#ifdef HAVE_BACKTRACE + static void *bt[BACKTRACE_BUFFER_SIZE]; + int count = backtrace(bt, BACKTRACE_BUFFER_SIZE); + if (count) { + backtrace_symbols_fd(bt, count, STDOUT_FILENO); + } else { + printf("(Call to backtrace() returns zero count.)\n"); + } +#else + printf("(Backtrace unavailable on this platform.)\n"); +#endif + + _exit(signum); +} +#endif // HAVE_SIGACTION + +void installSignalHandler(void) { +#ifdef HAVE_SIGACTION + struct sigaction act; + memset(&act, 0, sizeof(act)); + act.sa_handler = sighandler; + act.sa_flags = 0; + sigemptyset(&act.sa_mask); + sigaddset(&act.sa_mask, SIGSEGV); + sigaddset(&act.sa_mask, SIGBUS); + sigaddset(&act.sa_mask, SIGFPE); + sigaddset(&act.sa_mask, SIGILL); + sigaddset(&act.sa_mask, SIGABRT); + sigaction(SIGBUS, &act, nullptr); + sigaction(SIGFPE, &act, nullptr); + sigaction(SIGILL, &act, nullptr); + sigaction(SIGABRT, &act, nullptr); + sigaction(SIGSEGV, &act, nullptr); + setSignalStack(); +#endif // HAVE_SIGACTION +} + +#ifdef HAVE_SIGALTSTACK +static TLS_VARIABLE char alt_stack_loc[SIGSTKSZ]; +#endif + +void setSignalStack(void) { +#ifdef HAVE_SIGALTSTACK + struct sigaction act; + memset(&act, 0, sizeof(act)); + act.sa_handler = sighandler; + act.sa_flags = 0; + stack_t alt_stack; + memset(&alt_stack, 0, sizeof(alt_stack)); + alt_stack.ss_flags = 0; + alt_stack.ss_size = SIGSTKSZ; + alt_stack.ss_sp = alt_stack_loc; + if (!sigaltstack(&alt_stack, nullptr)) { + act.sa_flags |= SA_ONSTACK; + } + sigaction(SIGSEGV, &act, nullptr); +#endif +} + diff --git a/tools/hscollider/sig.h b/tools/hscollider/sig.h new file mode 100644 index 000000000..fc6438269 --- /dev/null +++ b/tools/hscollider/sig.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2015, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SIG_H +#define SIG_H + +#include // for size_t + +#define STAGE_UNDEFINED 0 +#define STAGE_UE2_COMPILE 1 +#define STAGE_UE2_RUN 2 +#define STAGE_PCRE_COMPILE 3 +#define STAGE_PCRE_RUN 4 +#define STAGE_GRAPH_PREPROCESS 5 +#define STAGE_GRAPH_COMPILE 6 +#define STAGE_GRAPH_RUN 7 + +#define TLS_VARIABLE __thread + +extern TLS_VARIABLE volatile int debug_stage; +extern TLS_VARIABLE volatile int debug_expr; +extern TLS_VARIABLE const char * volatile debug_expr_ptr; +extern TLS_VARIABLE volatile int debug_corpus; +extern TLS_VARIABLE const char * volatile debug_corpus_ptr; +extern TLS_VARIABLE volatile size_t debug_corpus_len; + +void installSignalHandler(void); + +// Must be called by every thread. +void setSignalStack(void); + +#endif diff --git a/tools/hscollider/simple_timer.h b/tools/hscollider/simple_timer.h new file mode 100644 index 000000000..a310de15e --- /dev/null +++ b/tools/hscollider/simple_timer.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Intel Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SIMPLE_TIMER_H +#define SIMPLE_TIMER_H + +#include + +class SimpleTimer { +public: + SimpleTimer(); + double elapsed() const; +private: + std::chrono::time_point start; +}; + +SimpleTimer::SimpleTimer() { + start = std::chrono::system_clock::now(); +} + +double SimpleTimer::elapsed() const { + std::chrono::time_point end; + end = std::chrono::system_clock::now(); + + std::chrono::duration delta = end - start; + return delta.count(); +} + +#endif // SIMPLE_TIMER_H diff --git a/tools/hscollider/test_cases/corpora/accel.txt b/tools/hscollider/test_cases/corpora/accel.txt new file mode 100644 index 000000000..4f443749b --- /dev/null +++ b/tools/hscollider/test_cases/corpora/accel.txt @@ -0,0 +1,3 @@ +2000:abcdefxxxxxxxxxxxxxxxxxxxxxxxxxxAfoobarxxxxxxxxxxxxxx +2001:/w------Ue0-J-vNU-----C9---k--M---1S-x-----g-----A---\n +2002:mJpPthD\xf0\x95\x93\xa1hq\xf4\x8b\xb9\x9cbrp\xe2\x84\xaahB\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xe8\x86\x95\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80 diff --git a/tools/hscollider/test_cases/corpora/anchors.txt b/tools/hscollider/test_cases/corpora/anchors.txt new file mode 100644 index 000000000..422436929 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/anchors.txt @@ -0,0 +1,2515 @@ +13000="foo": 3 +13000="afoo": 4 +13001="foo": 3 +13001="afoo": 4 +13002="foo": 3 +13002="afoo": 4 +13003="foo": 3 +13003="afoo": 4 +13004="foo": 3 +13004="afoo": 4 +13005="foo": 3 +13005="afoo": 4 +13006="foo": 3 +13006="fooa": 3 +13007="foo": 3 +13007="fooa": 3 +13008="foo": 3 +13008="fooa": 3 +13009="foo": 3 +13009="fooa": 3 +13010="foo": 3 +13010="fooa": 3 +13011="foo": 3 +13011="fooa": 3 +13012="foo": 3 +13012="fooa": 3 +13013="foo": 3 +13013="fooa": 3 +13014="foo": 3 +13014="fooa": 3 +13015="foo": 3 +13015="fooa": 3 +13016="foo": 3 +13016="foofoo": 3,6 +13016="afoofoo": 4,7 +13017="foo": 3 +13017=" foo": 4 +13018="foo": 3 +13018=" foo": 4 +13019="foo": 3 +13019=" foo": +13020="foo": 3 +13020=" foo": +13021="foo": 3 +13021=" foo": +13100="a": 1 +13100="ab": +13100="aba": 3 +13100="A": 1 +13100="AB": +13100="ABA": 3 +13100="\x1f\x00\xcf*\xd1]5)VxI^[\xb18\xbfS\xb4a\xe7\xc4\xd5\xd7\x88\x01\xb6\xc1\xf9\nV\xb0\xa8W\x00\xd2\xa8\xdd\tQ4\x01\x9a\x12\xdb\xcbJ\x9bA}\x87CS`\xcbU\x96\x8eO d\x7f\xc8\xbb\xfe\x9cd\xdc%\xb5\x90&\xd0\xa3\x81\x9cm\x1e\xbb\xec\x9bD0n$|\xc3\xba\x0b\x92Zo\x91#\xab\x11\xbf\x8fmdF\xfe\n\x17\"\x8c3\x8f*\xef|E\xb3-\xb3W\xa9\xf7\x914\n\xeb\xa3\x9c\x0f\xce-O_\x1a\xb3%\x19>\xbb\xba\xca\xee\xcat^G\xb9\x91tm\xe8\x9d": +13101="a": 1 +13101="ab": +13101="aba": 3 +13101="A": +13101="AB": +13101="ABA": +13101="h]\xc4gk\xe4\xd2I\xe4\x12\xdb\x1fz\xb0\xd0K\x81\x9e\x99tcs\xbd\"\xcetn;\xd8\x85Y\xc0c\x1e(\xce\x82{\x18h\x8ds\x87\x88\xa3\xd7\xd3%\xf5\xec\x1aZ`W\xfb\xae\xcbk\xea$p\xc3e\xd3a\r\xa2\xe3\x88;L\x96.T\x9eR,rw\xa2_\x11\xfc?hx\xee\xb3\xe3YXUa\n\xbd\xa8~\xca\xcbb\xd3\x07/j\xb4\x83\t\x07/\xfa\xfe\xd1\xd9\x10N\x19\xf8\xc7\x87,+\xe0\x84\x00\xfd\xc1\xa9\xfb\r\xf4_\xe0\xfb\x8e\xca0\x91S8@N7\x13\xa7\xc6\xe0@\xbf(\xc8lT)p\xd3\xa73\xfc\xa3@\xf1\x82\xa0m\x90k\x9e\"\xbe\xd6c\x8c\x8d\xf54T\xd6t\x94\x00\xbc\x01\xd3\xe6\xf0\xa7\x8e\xa3%2\xe3\x175": +13102="a": 1 +13102="A": 1 +13102="aa": +13102="AC": +13103="": +13103="a": 1 +13103="aa": 1 +13103="b": 1 +13103="ba": +13103="ab": 1 +13103="BABABAABABAB": +13104="a": 1 +13104="b": 1 +13104="ababababa": 1,2,3,4,5,6,7,8,9 +13104="abababab": 1,2,3,4,5,6,7,8 +13105="bb": 2 +13105="cbd": 3 +13105="BB": 2 +13105="\x98\xe5\x0c\x06%\xa0\xc5y\xfbH\"n\xf8\x17\xbd\xcfoD(/9\xb83d\x1f\n\x1f\xa1\xc7~\xeb\xdfd\xf7\xe6\x8a\x18,\x83\x15t&\x83n=\xc1\xbd-\x06f\x5c\xbf\x9e\x0f$\xbe\x98\xc2`a\xc1LA&\xc4(0\xdc\xd34\xf1IZ\xf57\x177\xf4\xc3=\xda |z\xae\xa09H\xe3\x19)\xa5\xe4\xe9K\xa9\x92B\x140\xf8\xaf\x8an\xe6!\xa5\x5c\xe5c\xb6\x85\xdf15\x01\xe9\xfc\xe4\x82&\nh\x10U\x91\xa2Q\x98\n\x81\x129\x8b\x80!-'\xfc\x13\x8a\xb3\x98jeM": 99 +13106="h": 1 +13106="q": 1 +13106="j": 1 +13106="m": 1 +13106="a": 1 +13106="j0\n1IM,]\x19\xe2\x9a\x01\xdcs\xcfS&\xd7w(X\x99\xde\xca&\x04\xadA\x10?\xb7AAAAAAA\x97": +25002="cbaaaccc\x98abbabaa": 4,5,6,11,14,16 +25002="f\x14c\xbf2cc\x15aabVabb": 10,11,14 +25002="zb(ga cc.accb\x06babb": 11,17 +25002="\xd1b\xa5ccccagabab": 11,13 +25002="'\x8d\xcda\xf7\xa9c\xe3baabaab\x7f": 11,12,14,15 +25003="\xa0AAAAA\x83AlA\xd5\x0bAAAAAAA[AAAAAAA\xdc": 19,21,22,23,24,25,26,27 +25004="\x9dAAE~A\xffA\xde\xcb{AAAAAAAAAA\xf9A\xdeA": 16,17,18,19,20,21 +25005="a\xe6\xdfaaaa\xeea": 5,6,7 +25005="av\xa9a\x18&o\xe5aaaa\x14": 10,11,12 +25005="a\x1baa|\xba\x92X_aaaa": 4,11,12,13 +25005="\x82aW.aaaa1\xc4": 6,7,8 +25005="arI\xbe)aaa8aa": 7,8,11 +25005="a~\xc5aaaaa": 5,6,7,8 +25006=":b'aa\xd4aa": 5,8 +25007="bb\xc8b\xb7b\x15bbbbb\x8fbbb\xd3": 10,11,12,16 +25007="\x89b\xf1bbpbbbb\x10bbb\nbbbgb\xb6": 10,14,18 +25008="a\xa5bddbdcccc\x0fR\xa9&NlI)\xc6\xbd\x83\x0c\xad": 9,10,11 +25008="acbddbcccc<\xd7\x0f\xb3\x07jT\x9a\xbc": 8,9,10 +25008="acbdd`dcccc`\xd3 \x94\xb5\xda\x13\xb5\x94\x86\x93\xd3&\x0122\x1a\xa1l%\x7f=\xc5\xbe)\xc6\x8a7;\xca\x01:<\xc0m\x909\x1f\xe4lD\x16\xdf\n\xb7": 9,10,11 +25008="acbd\xfbdbdcccc\xa0Lb-o\xd6\xa0": 10,11,12 +25009="aaq\x14\x87a]aaa\xe6:aaa\xd2a\x7f\x07J\xf9YKa\xdc\x02\xc3\x9c\xb5\x0ea2<\xdb\xd3\xa7O\x14": 10,15 +25010="\x05\x01\xc6,h\xf493\xcc\x06\x96\x14@sH\xe1S\xc0\xf3l_\xe0\xf6:\x07\x85\x19R\xe2\xbc\xbd\x86]\"Qd\xb5)7aaaaaa": 42,43,44,45 +25010="<;\x92p\xf7Xj0@\xdf5\xb5G\x8d\x12\x5c\xe33U\xc0\xed\xe0\x00$\xdeaaaaaa": 28,29,30,31 +25010="\xe1\x98\xac\xd9\xf4@\x17\x1f\xf5\x5ciI\xcd\xab\x1fy\xa2aaaaaa": 20,21,22,23 +25010="\xe2\x1b\x07\x8cq\x02\xe5.\xd9\x91i\x9d\x14\x04\x83\xb4\xa3\x7fo7\xad<#aaaaaa": 26,27,28,29 +25010="\xf4\xfdt*\xd1\x98aaaaaa": 9,10,11,12 +25011="I\xaeS\x7f\x7f\xb0\xc1\xd3\x94\xa6\xdf#r\xbf\x9b\x12\x15\xbd\x19\xa2\x02\x9d\x18\x8fw\xa9H\r\xaa\xb2\xde\x92\x00\xd1\xb0\x1e \x10\x90SU\x0f\x16gmP\x18\"\xac\xd0cM\r\x1a{#bb\xcf\xac\xb4M\xddS\xbd-\x10|\xdc?o\xd1\xed$\xd7\xfa\x13\x8e\xbb^\xfd\xbdK\xa9vekwgBBAAAA": 58,91,92,93,94,95 +25012="\x8b9\xde\xd0\xc9\xd0fYS%U\xc1\t\x18\x0c\x7fc\x90\xb6%\xdd\xa5L\xbf\xa8B\xf3<\xa8t\x0c\xd2L\x89B\xb5\xf8G\xad\xea\x0b\xa1K\xb3X\xf6\xd2Z%'\x1e\xa1k\n\xff\xb2\xeb\x91\x8d3\xa49\xa4\x90a\x85\xe4\xf9k0\x82\x15plhg\x01\xd9`\xc5hgh": 76,82,83 +25013="\x8b\xafo\xfa\x9dhb\xc1\x89\xc0\nf%^\x88\xac\xcfn@\xbe\xc5\x89F=G\x867\x81A\xa6\rk\xf4\x1b\xb4\x040#\x05\x90Ke9P)7wt\xa5\x84S\x02\xe9{\xe7\xc5b\r\x9b\x82\xed\xe0/\xf7t\xe9\x9aC\xab>s\x95BK\x84\n!KEEEE": 42,79,80,81,82 +25013="\x97\xd2\xad\xda\xfc:\xf3\x91\xb9 \xde \xf162,\xd2\xf7\xf7\xc4\xe4KE4\xc4\xa0\xfda8\x80\x98\xaa\xcc\x11KE": 23,36 +25013="qqqqqqqqqqqqKEqke": 14,17 +25014="_aa_9_____^u___?_&-__-___D__m_._m_EEq_________:_$______k____\n___/__?___u_-pa+I__": 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80 +25015="Ln\xdf\xe6\xa4)<\xfd\xf7\xaeB\xa4\x9d!\xa3\xe0\x89": 2,4,12,13 +25016="P___!____mF_\n_+_@J__p____O_k7__3PZ___!___h___=h_____Fu_4": 2,3,4,5,6,7,8,9,10,11,12,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56 +25017="aaa\xd9\xf8\xd0\xb0\nX{\x8a\xa3}\xf3\xf1\xa2\xeb+U\xfdp\xeban\xe9\xb0\xb4\xf5\xfd=\xa1\xabt\xf0B\xe3?\xdaZ\x1d\xec\x9c^vfR\x12u\xea\xdc\x13\xbft\x9b\xd2\xc7/o\xc8\x0b": 1,2,3,23 +25018="aaaaa\n\x01\xca\xd2Y\xc6I\xb3O": 5,6 +25019="\x10\xd9e\xc5\xff=Z92T\x8a\xef&\xb0_\xdd?&\xa72/:8x^\x85\xdc\xbe\xdeB4\x18\xce\xc8\x99\xd2,8\xaeE\x10\xf8\x80\x199\x0e\x88\x0c\x80\xd1\xc68\x9f\x9dP\x9c\xc1\xcb\xfa\xa2\x9e\xb1\x0f\x05\xea\x13\x80\xd1<\xc1\xcd\x96p\xecNI\x99\xebpD\nv\xb4oN\xf3\xd8": 2,3,6,7,9,10,11,13,14,15,18,19,20,23,25,27,28,29,30,32,34,35,36,37,38,43,44,45,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,77,79,86 +25020="BAABA\x02G\xeb\xe5\xe1\xd2{\x9eZ|M\xb2\xb0\xf6D\x90\x1f\x04\x12\x1a\xb6\x113\x01x\x85\xfa^\x93W\xa3\xf8\x89V|\n\xc7\x97G\xc0\xb23\x12\x01\x7f\xf51h\x99\xea\xdcI\xbc\xc5|a\xe1\x16 \x13/\x0c\xa0~\xa4\xc8s\xbfq\xd9\xf5X9F*\xea\xe7\x92~\xb7\xb8\xb6@3H\x9f\x9cO\x9f\x1c\xfd\x04\x9c": 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98 +25021="foobar": 6 +25021="Foobar": +25021="FOOBAR": +25022="foobar": 6 +25022="Foobar": 6 +25022="FOOBAR": 6 +25023="foo_bar": 7 +25023="FOO_BAR": +25023="foO_bAr": +25024="foo_bar": 7 +25024="FOO_BAR": 7 +25024="foO_bAr": 7 +25025="foobar": 6 +25025="Foobar": +25025="FOOBAR": +25025="goobar": 6 +25025="Goobar": +25025="GOObar": +25026="foobar": 6 +25026="Foobar": 6 +25026="FOOBAR": 6 +25026="goobar": 6 +25026="Goobar": 6 +25026="GOObar": 6 +25027="foobar": 6 +25027="f0obar": 6 +25027="F0obar": 6 +25027="FOobar": 6 +25027="FOOBAR": 6 +25028="foobar": 6 +25028="fooBar": 6 +25028="fooBAR": 6 +25028="FOOBAR": +25029="foobar": 6 +25029="Foobar": 6 +25029="FOobar": +25029="FOOBAR": diff --git a/tools/hscollider/test_cases/corpora/charclass.txt b/tools/hscollider/test_cases/corpora/charclass.txt new file mode 100644 index 000000000..e0c942225 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/charclass.txt @@ -0,0 +1,172 @@ +11000="0t Q\nF\r\x00_%": 10 +11001="\x00": 1 +11001="\xff": 1 +11001="7": 1 +11002="\x00": 1 +11002="\xff": 1 +11002="7": 1 +11003="\x00": 1 +11003="\xff": 1 +11003="7": 1 +11004="\x00": 1 +11004="\xff": 1 +11004="7": 1 +11005="\x00": 1 +11005="\xff": 1 +11005="7": 1 +11006="0f7 \x1a7%": 7 +11007="l@; Rwf": 7 +11008="0": 1 +11008="1": 1 +11008="A": 1 +11008="q": 1 +11008="%": 1 +11009="1": 1 +11009="2": 1 +11009="A": 1 +11009="_": 1 +11010="Aa0arg": 6 +11010="Aa04t9": +11010="Ff97AZ": 6 +11010="Dd76q@": 6 +11011="~a": 2 +11011="^a": +11011="^\n": +11012="\x00": 1 +11012="\x05": 1 +11012="\x1f": 1 +11013="]": 1 +11013="[": 1 +11013="_": 1 +11013="w": 1 +11013="W": 1 +11013="z": 1 +11013="a": 1 +11013="C": 1 +11014="A": 1 +11014="a": 1 +11014="q": 1 +11014="5": 1 +11014="_": +11015="-": 1 +11015="a": 1 +11016="-": 1 +11016="A": 1 +11017="-": 1 +11017="T": 1 +11018="-": 1 +11018="d": 1 +11018="0": 1 +11020="\x08": 1 +11020="b": +11021=".$": 2 +11021=".": +11022="]": 1 +11022="a": 1 +11023="f": 1 +11023="]": +11023="a": +11024="]-_^ABC": 1,3,4 +11100="]": 1 +11100="[": +11101="]": 1 +11101="[": +11102="[": 1 +11102="]": 1 +11103="^": 1 +11103="X": +11104="+": 1 +11104=",": 1 +11104="-": 1 +11104="a": +11105="A": 1 +11105="7": 1 +11105="-": 1 +11105=",": +11106="ABCDEFGHIJKL-": 1,2,3,5,6,7,13 +11107="ABCDEFGHIJKL-": 1,2,3,5,13 +11108="\x00 01234567890\x5c": 1 +11109="\x00 01234567890\x5c": 2 +11110="\x00 01234567890\x5c": 2 +11111="\x00 01234567890\x5c": 2,3,13 +11112="\x00 01234567890\x5c": 2,4 +11113="\x00 01234567890\x5c": 4,11 +11114="\x00 01234567890\x5c": 1 +11115="\x00 01234567890\x5c": 4 +11116="\x00 01234567890\x5c": 4 +11117="\x00 01234567890\x5c": 4 +11121="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 19,27,35 +11122="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 14 +11123="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 14,36 +11124="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 32,33 +11125="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 36 +11127="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,35,36 +11128="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 14,22 +11200=">": +11200="^": +11201="B": +11201="S": +11202="B": +11202="S": +11203="^": +11204="!": +11205="-": 1 +11205="*": +11205="_": 1 +11205="`": +11205=">": 1 +11302="foofoofoofoobarfoobarbar": 15,21,24 +11306="foobazfoofoobazfoobarfoobarbarbaz": 33 +11307="abcdefABCDEF0123456789": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 +11307="~!@#$%ghijklmnopqrstuvwxyzGHIJKLMNOPQRSTUVWXYZa": 47 +11308="_7\xff0qq\xff": 7 +11309="A\x00aal*g": 7 +11310="\x7f": 1 +11312="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123 +11313="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11314="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123 +11315="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11316="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128 +11317="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11318="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 10,33 +11319="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11320="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,128 +11321="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11322="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58 +11323="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11324="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 +11325="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11326="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123 +11327="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11328="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 +11329="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11330="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 10,11,12,13,14,33 +11331="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11332="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91 +11333="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11334="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,98,99,100,101,102,103 +11335="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11336="\x0c": 1 +11337="\x07": 1 +11338="\x1b": 1 +11339="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127 +11340="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11341="abcdef-\x00\xff": 1,2,7 +11342="abcdef-\x00\xff": 1,2,7 +11343="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11344="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11345="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11346="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256 +11347="abcdef-q0": 1,2,7 +11348="abcdef-q0": 1,2,7 +11349="a a q q": 7 +11350="abc\x00\x01 \xff": 1,2,3,4,5,6,7 +11351="a(c_ab_a\xbf": 2,6,9 +11352="a\x00aba.a\xff": 1,2,3,5,7 +11353="\xf3\x93\x8c\x8a": +11353="\xf3\x89\xb8\x91": +11353="\x14\xf3\xa8\xa5\x8d": 1 +11354="a9gz": 1,2,3,4 +11354="\xee\x80\x80\xc2\xb6": 3,5 +11355="a . ; :": 3,5,7 +11355="\xc2\xb4": diff --git a/tools/hscollider/test_cases/corpora/comp.txt b/tools/hscollider/test_cases/corpora/comp.txt new file mode 100644 index 000000000..7ea1b4cc6 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/comp.txt @@ -0,0 +1,72 @@ +15800="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 9,15,18,24,27,33,36,42,45,48 +15800="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,16,19,25,28,34,37,43,46,49 +15800="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,17,20,26,29,35,38,44,47,50 +15800="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,18,21,27,30,36,39,45,48,51 +15800="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,19,22,28,31,37,40,46,49,52 +15800="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,20,23,29,32,38,41,47,50,53 +15800="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54 +15800="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55 +15800="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56 +15800="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57 +15800="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58 +15801="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15801="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15802="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,24,33,42,48 +15802="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,16,19,25,28,34,37,43,46,49 +15802="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,17,20,26,29,35,38,44,47,50 +15802="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,18,21,27,30,36,39,45,48,51 +15802="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,22,31,40,49 +15802="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,23,32,41,50 +15802="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,24,33,42,51 +15802="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15802="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15802="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15802="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": +15803="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,18,24,27,33,36,42,45,48 +15803="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,16,19,25,28,34,37,43,46,49 +15803="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,17,20,26,29,35,38,44,47,50 +15803="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,18,21,27,30,36,39,45,48,51 +15803="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,19,22,28,31,37,40,46,49,52 +15803="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,20,23,29,32,38,41,47,50,53 +15803="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54 +15803="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55 +15803="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56 +15803="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57 +15803="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58 +15804="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,48 +15804="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,19,25,28,34,37,43,46,49 +15804="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,20,26,29,35,38,44,47,50 +15804="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,21,27,30,36,39,45,48,51 +15804="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,22,28,31,37,40,46,49,52 +15804="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,23,29,32,38,41,47,50,53 +15804="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54 +15804="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55 +15804="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56 +15804="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57 +15804="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58 +15805="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,48 +15805="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,19,25,28,34,37,43,46,49 +15805="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,20,26,29,35,38,44,47,50 +15805="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,21,27,30,36,39,45,48,51 +15805="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,22,28,31,37,40,46,49,52 +15805="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,23,29,32,38,41,47,50,53 +15805="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54 +15805="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55 +15805="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56 +15805="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57 +15805="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58 +15806="anorak.*trainspotter": 20 +15806="anorak.*trainspotterA": 20 +15807="anorak.*trainspotter": 20 +15807="anorak.*trainspotterA": 20 +15808="anorak.*trainspotter": 20 +15808="anorak.*trainspotterA": 20 diff --git a/tools/hscollider/test_cases/corpora/comptree.txt b/tools/hscollider/test_cases/corpora/comptree.txt new file mode 100644 index 000000000..4c2b95ebe --- /dev/null +++ b/tools/hscollider/test_cases/corpora/comptree.txt @@ -0,0 +1,80 @@ +1000="foobar": +1000="foofoobar": 9 +1000="foofoofoobar": 12 +1000="foofoofoofoobar": 15 +1000="xfoobar": +1000="xfoofoobar": 10 +1000="xfoofoofoobar": 13 +1000="xfoofoofoofoobar": 16 +1001="foobar": +1001="foofoobar": 9 +1001="foofoofoobar": 12 +1001="foofoofoofoobar": 15 +1001="xfoobar": +1001="xfoofoobar": 10 +1001="xfoofoofoobar": 13 +1001="xfoofoofoofoobar": 16 +1002="foobar": +1002="foofoobar": 9 +1002="foofoofoobar": 12 +1002="foofoofoofoobar": 15 +1002="xfoobar": +1002="xfoofoobar": +1002="xfoofoofoobar": +1002="xfoofoofoofoobar": +1003="foobar": +1003="foofoobar": 9 +1003="foofoofoobar": 12 +1003="foofoofoofoobar": +1003="xfoobar": +1003="xfoofoobar": +1003="xfoofoofoobar": +1003="xfoofoofoofoobar": +1004="foobar": +1004="foofoobar": 9 +1004="foofoofoobar": 12 +1004="foofoofoofoobar": 15 +1004="xfoobar": +1004="xfoofoobar": 10 +1004="xfoofoofoobar": 13 +1004="xfoofoofoofoobar": 16 +1005="foobar": +1005="foofoobar": 9 +1005="foofoofoobar": 12 +1005="foofoofoofoobar": 15 +1005="xfoobar": +1005="xfoofoobar": 10 +1005="xfoofoofoobar": 13 +1005="xfoofoofoofoobar": 16 +1006="foobar": +1006="foofoobar": +1006="foofoofoobar": 12 +1006="foofoofoofoobar": 15 +1006="xfoobar": +1006="xfoofoobar": +1006="xfoofoofoobar": 13 +1006="xfoofoofoofoobar": 16 +1007="foobar": +1007="foofoobar": +1007="foofoofoobar": 12 +1007="foofoofoofoobar": 15 +1007="xfoobar": +1007="xfoofoobar": +1007="xfoofoofoobar": 13 +1007="xfoofoofoofoobar": 16 +1008="foobar": +1008="foofoobar": 9 +1008="foofoofoobar": 12 +1008="foofoofoofoobar": 15 +1008="xfoobar": +1008="xfoofoobar": 10 +1008="xfoofoofoobar": 13 +1008="xfoofoofoofoobar": 16 +1009="foobar": +1009="foofoobar": 9 +1009="foofoofoobar": 12 +1009="foofoofoofoobar": 15 +1009="xfoobar": +1009="xfoofoobar": 10 +1009="xfoofoofoobar": 13 +1009="xfoofoofoofoobar": 16 diff --git a/tools/hscollider/test_cases/corpora/extparams.txt b/tools/hscollider/test_cases/corpora/extparams.txt new file mode 100644 index 000000000..245719b67 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/extparams.txt @@ -0,0 +1,552 @@ +16200="foobar": 6 +16200="foo bar": 7 +16201="foobar": +16201="foo bar": +16201="foo bar": +16201="foo bar": +16201="foo bar": 10 +16201="foo bar": 11 +16201="foo bar": 12 +16202="foobar": 6 +16202="foo bar": 7 +16202="foo bar": 8 +16202="foo bar": 9 +16202="foo bar": 10 +16202="foo bar": +16202="foo bar": +16203="foobar": +16203="foo bar": +16203="foo bar": +16203="foo bar": +16203="foo bar": 10 +16203="foo bar": +16203="foo bar": +16204="foo bar": +16204="foo bar": 10 +16204="foo bar": 11 +16204="foo bar": 12 +16204="foo bar": 13 +16204="foo bar": 14 +16204="foo bar": 15 +16204="foo bar": +16204="foo bar": +16204="foo bar": +16205="ab": +16205="a b": +16205="a b": +16205="a b": 5 +16205="a b": 6 +16205="a b_": 5 +16205="_a b": 6 +16205="_a b_": 6 +16206="ab": +16206="a b": +16206="a b": +16206="a b": +16206="a b": +16206="a b_": +16206="_a b": +16206="_a b_": +16206=" a b": +16206=" a b": 10 +16206=" a b": 11 +16206=" a b": 12 +16206=" a b": 13 +16207="preamble_q": 10 +16207="preamble_____________________q": 30 +16207="preamble______________________q": +16207="preamble_______________________q": +16207="preamble________________________q": +16208="preambleq": +16208="preamble_q": +16208="preamble__q": +16208="preamble___q": 12 +16208="preamble____q": 13 +16208="preamble_____q": 14 +16209="aaaa": +16209="aaxaa": 5 +16209="aaxxxxxaa": 9 +16209="aaxxxxxxaa": 10 +16209="aaxxxxxxxaa": +16209="_aaxxxxxaa": 10 +16209="_aaxxxxxxaa": +16209="_aaxxxxxxxaa": +16210="01234567890123456789012345678901": 32 +16210="012345678901234567890123456789012345678901234567890123456789": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 +16211="\x04\xe8F\x0eI\xe1\xcb5\x0b{\x04\xea\x17%Jt\xf2\x11\x8e!\x11vOu9\x07\x12": +16212="aaaaaaaaaaaaaaaaaaaa": 10 +16212="xaaaaaaaaaaaaaaaaaaa": 10 +16212="aaaaaaaaaxaaaaaaaaaa": +16212="aaaaaaaaaaxaaaaaaaaa": 10 +16213="aaaaaaaaaaaaaaaaaaax": 20 +16213="aaaaaaaaaaaaaaaaaaaa": +16213="aaaaaaaaaaaaaaaaaaaax": 21 +16213="aaaaaaaaaaaaaaaaaax": +16213="aaaaaaaaaaaaaaaaaaxa": +16214="foo": +16214="foo_": +16214="foo__": +16214="foo___": +16214="foo____": +16214="foo_____": +16214="foo______": +16214="foo_______": 10 +16214="foo________": 10,11 +16214="foo_________": 10,11,12 +16214="foo__________": 10,11,12,13 +16214="foofoo_______": 10,11,12,13 +16214="foofoo________": 10,11,12,13,14 +16214="foofoo_________": 10,11,12,13,14,15 +16214="foofoo__________": 10,11,12,13,14,15,16 +16214="foofoo___________": 10,11,12,13,14,15,16,17 +16215="foo": +16215="foo_": +16215="foo__": +16215="foo___": +16215="foo____": +16215="foo_____": +16215="foo______": +16215="foo_______": 10 +16215="foo________": 10,11 +16215="foo_________": 10,11,12 +16215="foo__________": 10,11,12,13 +16215="foofoo_______": 10,11,12,13 +16215="foofoo________": 10,11,12,13,14 +16215="foofoo_________": 10,11,12,13,14,15 +16215="foofoo__________": 10,11,12,13,14,15,16 +16215="foofoo___________": 10,11,12,13,14,15,16,17 +16216="hatstandteakettle": +16216="hatstand_teakettle": +16216="hatstand__teakettle": +16216="hatstand___teakettle": +16216="hatstand____teakettle": +16216="hatstand_____teakettle": +16216="hatstand______teakettle": +16216="hatstand_______teakettle": +16216="hatstand________teakettle": 25 +16216="hatstand_________teakettle": 26 +16217="hatstand": +16217="_hatstand": +16217="__hatstand": 10 +16217="___hatstand": 11 +16217="____hatstand": 12 +16217="_____hatstand": 13 +16217="______hatstand": 14 +16217="_______hatstand": 15 +16217="________hatstand": +16217="_________hatstand": +16218="abc": +16218="_abc": +16218="__abc": 5 +16218="___abc": 6 +16218="____abc": 7 +16218="_____abc": 8 +16218="______abc": 9 +16218="_______abc": 10 +16218="________abc": +16219="foobar": +16219="foo_bar": +16219="foo__bar": +16219="foo___bar": +16219="foo____bar": 10 +16219="foofoo_bar": 10 +16219="foofoo_____bar": 14 +16220="foobar": +16220="foo_bar": +16220="foo__bar": +16220="foo___bar": +16220="foo____bar": 10 +16220="foofoo_bar": 10 +16220="foofoo_____bar": 14 +16221="0": +16221="01": +16221="012": +16221="0123": 4 +16221="01234": 4,5 +16222="0": +16222="01": +16222="012": +16222="0123": 4 +16222="01234": 4,5 +16223="hatstand": +16223="hatstandhatstand": +16223="___hatstandhatstand": +16223="____hatstandhatstand": 20 +16223="_____hatstandhatstand": 21 +16223="hatstandhatstandhatstand": 24 +16224="hatstand": +16224="hatstandhatstand": +16224="___hatstandhatstand": +16224="____hatstandhatstand": 20 +16224="_____hatstandhatstand": 21 +16224="hatstandhatstandhatstand": 24 +16225="hatstand": +16225="hatstandhatstandhatstand": 20,21,22,23,24 +16225="hatstand___________": +16225="hatstand____________": 20 +16225="hatstand_____________": 20,21 +16226="long cat is lng": +16226="long cat is long": 16 +16226="long cat is loong": 17 +16226="long cat is looong": 18 +16226="long cat is loooooooooooooooooooong": 35 +16227="": +16227="W": +16227="l": 1 +16227="ll": 1 +16227="l l l l l l l l l l l l": 1 +16227=" l l l l l l l l l l l l": +16228="rascal": 6 +16228="_rascal": +16228="__rascal": +16229="": 0 +16229="\x0b\x80vdwn\xd5\x19vdwn\x8a\x1fvdwnp\x8evdwn": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 +16230="abc_ef": +16230="abc_def": +16230="abc_ddef": +16230="abc_dddef": +16230="abc_ddddef": 10 +16230="abc_dddddef": 11 +16230="abc_ddddddef": 12 +16230="abc_dddddddef": 13 +16230="_abc_def": +16230="__abc_def": +16230="___abc_def": +16230="____abc_def": +16230="______abc_def": +16230="_______abc_def": +16230="________abc_def": +16230="_________abc_def": +16230="__________abc_def": +16230="___________abc_def": +16230="____________abc_def": +16230="_____________abc_def": +16230="______________abc_def": +16230="_______________abc_def": +16230="________________abc_def": +16230="_________________abc_def": +16230="__________________abc_def": +16230="___________________abc_def": +16230="____________________abc_def": +16230="_____________________abc_def": +16230="______________________abc_def": +16230="_______________________abc_def": +16230="________________________abc_def": +16230="_________________________abc_def": +16231="egs\n": 3 +16231="g": 1 +16231="g\n": 1 +16231="t": 1 +16232="h": +16232="_ab": 3 +16232="_ab\n": 3 +16233="abc": +16233="abcd": +16233="abcde": 5 +16233="abcdef": 5,6 +16233="__abc": +16233="__abcd": +16233="__abcde": 7 +16233="__abcdef": 7,8 +16234="kne": +16234="knee": +16234="kneee": 5 +16234="kneeee": 5,6 +16234="kneeeee": 5,6,7 +16234="kneeeeee": 5,6,7,8 +16234="kneeeeeee": 5,6,7,8,9 +16234="kneeeeeeee": 5,6,7,8,9,10 +16234="kneeeeeeeee": 5,6,7,8,9,10,11 +16234="kneeeeeeeeee": 5,6,7,8,9,10,11,12 +16234="kneeeeeeeeeee": 5,6,7,8,9,10,11,12 +16234="knereeeereeee": 5,6,7,8,9,10,11,12 +16235="s": +16235="c": +16235="zzzz": 4 +16235="ycdliejrcnrjfh akjshdna y": 4,9,21 +16236="__h__C]z________zJ]_____9___x": 8,17 +16237="O\xa4\x12\x0b\xd6\xa8j\xfdtL!Ia\xaa\xd3\xfa\xf31!\xbej": +16238="kgh_\xc5\xc9\xde\xcb\xc2\xfe\x0b\xb3\x83M\xf8\xa5g\"\x82c4a-\xd8[\xf8\xed\x9b\xdd\xb9g\xe8\xbf": 2 +16239="p": +16239="pp": +16239="ppp": +16239="pppp": +16239="ppppp": 5 +16239="pppppp": 5,6 +16239="ppppppp": 5,6,7 +16239="pppppppp": 5,6,7,8 +16239="ppppppppp": 5,6,7,8,9 +16239="pppppppppp": 5,6,7,8,9,10 +16239="ppppppppppp": 5,6,7,8,9,10,11 +16239="pppppppppppp": 5,6,7,8,9,10,11,12 +16239="ppppppppppppp": 5,6,7,8,9,10,11,12,13 +16239="pppppppppppppp": 5,6,7,8,9,10,11,12,13,14 +16239="ppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15 +16239="pppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15 +16239="ppppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15 +16239="pppppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15 +16239="ppppppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15 +16239="\npppp": +16239="\nppppp": 6 +16239="\npppppp": 6,7 +16240="": +16240="a": +16240="c": +16240="cc": +16240="ccc": +16240="cccc": 4 +16240="ccccc": 4,5 +16240="acacacacacac": 4,6,8,10,12 +16241="ykmy_g": +16241="ykmy_gg": +16241="ykmy_ggg": 8 +16241="ykmy_gggg": 8,9 +16241="ykmy_ggggg": 8,9,10 +16241="_ykmy_ggggg": 9,10,11 +16242="qrhhhhh": +16242="qrhhhhhh": 8 +16242="qrhhhhhhh": 8,9 +16242="qrhhhhhhhh": 8,9,10 +16242="qrhhhhhhhhh": 8,9,10,11 +16242="qrhhhhhhhhhh": 8,9,10,11,12 +16242="qrhhhhhhhhhhh": 8,9,10,11,12,13 +16242="qrhhhhhhhhhhhh": 8,9,10,11,12,13,14 +16242="qrhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15 +16242="qrhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16 +16242="qrhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17 +16242="qrhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18 +16242="qrhhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18,19 +16242="qrhhhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18,19,20 +16242="qrhhhhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18,19,20 +16242="z": +16242="qmhhhhhhhhhhz": 8,9,10,11,12 +16243="cjmwjnnnn": 9 +16244="\x08$\x82Zz\x8b\x0e\xe2a\x91\x8c\x9eQ\xc7\x84IQYEaYSC=\xbaB\x0b\xcd\xc8\xe5t\x8b\x06m\xa40\x1a%0KP": +16244="__qyeysa": +16244="__qye_ysa": +16244="__qye__ysa": 9 +16244="__qye__ys:": +16245="foo": 3 +16245="afoo": +16245="aafoo": +16245="aaafoo": +16245=" foo": 4 +16245=" foo": 5 +16245=" foo": 9 +16245=" foo": 10 +16245=" foo": +16245=" afoo": +16245=" afoo": +16245=" afoo": +16246="foo": 3 +16246="foo ": 3 +16246="fooa": +16246="_______foo": 10 +16246="_______foo ": 10 +16246="________foo ": +16246="______foo ": 9 +16246="_____foo ": 8 +16247="foo": 3 +16247="foo ": 3 +16247=" foo ": 4 +16247="______ foo ": 10 +16247="_____ foo ": 9 +16247="_____ fooa": +16247="_______ foo ": +16247="________ foo ": +16248="foobar": +16248="foo bar": 7 +16248=" foo bar": 8 +16248=" foo bar": 9 +16248=" foo bar": 10 +16248=" foo bar": 11 +16248=" foo bar": 12 +16248=" foo bar": 13 +16248=" foo bar": 14 +16248=" foo bar": 15 +16248=" foo bar ": 9 +16248=" foo bar ": 10 +16248=" foo bar ": 11 +16248=" foo bar ": 12 +16248=" foo bar ": 13 +16248=" foo bar ": 14 +16248=" foo bar ": 15 +16249="foobar": +16249="foo bar": +16249=" foo bar": +16249=" foo bar": +16249=" foo bar": +16249=" foo bar": +16249=" foo bar": 12 +16249=" foo bar": 13 +16249=" foo bar": 14 +16249=" foo bar": 15 +16249=" foo bar ": +16249=" foo bar ": +16249=" foo bar ": +16249=" foo bar ": 12 +16249=" foo bar ": 13 +16249=" foo bar ": 14 +16249=" foo bar ": 15 +16250="foobar": +16250="foo bar": 7 +16250=" foo bar": 8 +16250=" foo bar": 9 +16250=" foo bar": 10 +16250=" foo bar": 11 +16250=" foo bar": 12 +16250=" foo bar": 13 +16250=" foo bar": 14 +16250=" foo bar": 15 +16250=" foo bar ": 9 +16250=" foo bar ": 10 +16250=" foo bar ": 11 +16250=" foo bar ": 12 +16250=" foo bar ": 13 +16250=" foo bar ": 14 +16250=" foo bar ": 15 +16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51 +16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52 +16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52,53 +16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52 +16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52,53 +16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 53 +16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51 +16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52 +16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52,53 +16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52 +16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52,53 +16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 53 +16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54 +16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55 +16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55,56 +16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55 +16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55,56 +16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56 +16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54 +16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55 +16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55,56 +16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55 +16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55,56 +16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": +16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56 +16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56,57 +16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56,57,58 +16263="unambiguous": 11 +16263="extremely unambiguous": 21 +16264=" \n a": +16264=" \na": 13 +16264=" a": +16264=" g": 12 +16264=" \n a": +16264=" \na": 12 +16264=" a": +16264=" g": 11 +16264=" \na": 11 +16264=" a": +16264=" g": 10 +16264="\na": +16264="a": +16264="g": +16265="_apple2": +16265="apple2": 6 +16265="foo": 3 +16265=" foobar": +16265="foo__bar": 3 +16265="foo_bar": 3 +16265="foobar": 3,6 +16265="jabberwocky": +16266="aaaaaaaa": +16266="bbbbbbbbb": +16266="cccccccccc": 10 +16266="floating": +16266=" floating": +16266=" floating": 10 +16266=" floating": 11 +16266=" floating": 12 +16266=" floating": 13 +16267="abcdef_____": +16267="abcdefabcdefabcdefabcdef_____": 20,21,22,23,24,25,26,27,28,29 +16267="_________abcdef_____": 20 +16267="_________abcdef____": +16267="_________abcdef______": 20,21 +16267="_________abcdefabcdef": 20,21 +16267="_____________abcdefabcdef": 24,25 +16268="abcdef_": +16268="012345678901abcdef_": +16268="0123456789012abcdef_": 20 +16268="01234567890123abcdef_": 21 +16268="012345678901234abcdef_": 22 +16268="01234567890123abcdef": +16268="012345678901234abcdef": +16269="012345678901abcdef__": 20 +16269="0123456789012abcdef__": 21 +16269="01234567890123abcdef__": 22 +16269="012345678901234abcdef__": 23 +16269="01234567890123abcdef_": +16269="012345678901234abcdef_": +16270="abcdef": +16270="_abcdef": +16270="__abcdef": +16270="___abcdef": +16270="____abcdef": 10 +16270="_____abcdef": 11 +16270="______abcdef": 12 +16270="_______abcdef": 13 +16270="________abcdef": 14 +16270="_________abcdef": 15 +16270="__________abcdef": 16 +16270="___________abcdef": 17 +16270="____________abcdef": 18 +16270="_____________abcdef": 19 +16270="______________abcdef": 20 +16270="_______________abcdef": +16270="________________abcdef": +16270="abcdefabcdefabcdefabcdefabcdefabcdef": 12,18 +16270="defabcdefabcdefabcdefabcdefabcdef": 15 +16271="abcdef": +16271="_abcdef": +16271="__abcdef": +16271="___abcdef": +16271="____abcdef": 10 +16271="_____abcdef": +16271="______abcdef": +16271="_______abcdef": +16271="________abcdef": +16271="abcdefabcdefabcdefabcdefabcdefabcdef": +16271="cdefabcdefabcdefabcdefabcdefabcdef": 10 +16272="abcdef__": +16272="__abcdef__": 10 +16272="_abcdef__": +16272="___abcdef__": +16272="__abcdef_": +16272="_abcdef_": +16272="___abcdef_": +16273="\xe0\xb7\x81\xf1\x81\x90\xb9b\n": +16273="\xf3\xa3\x87\x9d\xf4\x8f\xb8\xa0b": 9 +16273="___b": +16273="__b": +16273="__b\n": diff --git a/tools/hscollider/test_cases/corpora/highlander.txt b/tools/hscollider/test_cases/corpora/highlander.txt new file mode 100644 index 000000000..8621b7fcb --- /dev/null +++ b/tools/hscollider/test_cases/corpora/highlander.txt @@ -0,0 +1,368 @@ +15300="fo": +15300="foo": 3 +15300="ffoo": 4 +15300="fofoo": 5 +15300="foofoo": 3,6 +15300="fooXXXfoo": 3,9 +15300="XXXfooXXXfoo": 6,12 +15300="foofoofoofoo": 3,6,9,12 +15301="foo": +15301="foobar": 6 +15301="foobarbar": 6,9 +15301="foobar\nfoobarbar": 6,13,16 +15302="foo": +15302="foobar": 6 +15302="foobarbar": 6,9 +15302="foobar\nfoobarbar": 6,13,16 +15303="bar123456781X3456789": +15303="blahfoo12345678123456789": 22 +15303="foo": +15303="foo12345678123456": +15303="foo123456781234567": 18 +15303="foo1234567812345678": 18 +15303="foo12345678123456789": 18 +15303="foo1234567812345678X": 18 +15303="foo123456781234567X": 18 +15303="foo12345678123456X": +15303="foo1234567812345X": +15303="foo123456781X3456789": +15303="foofoo12345678123456789": 18,21 +15303="foofoo12345678123456789": 18,21 +15303="foofooX23456781foo23456789YYYYYYYY": 33 +15303="fooX2345678123456789": +15303="fooXfoo12345678123456789": 22 +15303="XXX12345678123456789": +15304="bar123456781X3456789": +15304="blahfoo12345678123456789": 23 +15304="foo": +15304="foo12345678123456": +15304="foo123456781234567": +15304="foo1234567812345678": 19 +15304="foo12345678123456789": 19 +15304="foo1234567812345678X": 19 +15304="foo123456781234567X": +15304="foo12345678123456X": +15304="foo1234567812345X": +15304="foo123456781X3456789": +15304="foofoo12345678123456789": 19,22 +15304="foofoo12345678123456789": 19,22 +15304="foofooX23456781foo23456789YYYYYYYY": 34 +15304="fooX2345678123456789": +15304="fooXfoo12345678123456789": 23 +15304="XXX12345678123456789": +15305="bar123456781X3456789": +15305="blahfoo12345678123456789": 24 +15305="foo": +15305="foo12345678123456": +15305="foo123456781234567": +15305="foo1234567812345678": +15305="foo12345678123456789": 20 +15305="foo1234567812345678X": +15305="foo123456781234567X": +15305="foo12345678123456X": +15305="foo1234567812345X": +15305="foo123456781X3456789": +15305="foofoo12345678123456789": 20,23 +15305="foofoo12345678123456789": 20,23 +15305="foofooX23456781foo23456789YYYYYYYY": +15305="fooX2345678123456789": +15305="fooXfoo12345678123456789": 24 +15305="XXX12345678123456789": +15306="bar123456781X3456789": +15306="blahfoo12345678123456789": 24 +15306="foo": +15306="foo12345678123456": +15306="foo123456781234567": +15306="foo1234567812345678": +15306="foo12345678123456789": 20 +15306="foo1234567812345678X": +15306="foo123456781234567X": +15306="foo12345678123456X": +15306="foo1234567812345X": +15306="foo123456781X3456789": +15306="foofoo12345678123456789": 20,21,22,23 +15306="foofoo12345678123456789": 20,21,22,23 +15306="foofooX23456781foo23456789YYYYYYYY": 24,25,26,27,28,29,30,31,32,33,34 +15306="fooX2345678123456789": +15306="fooXfoo12345678123456789": 21,22,23,24 +15306="XXX12345678123456789": +15307="bar123456781X3456789": +15307="blahfoo12345678123456789": +15307="foo": +15307="foo12345678123456": +15307="foo123456781234567": +15307="foo1234567812345678": +15307="foo12345678123456789": +15307="foo1234567812345678X": +15307="foo123456781234567X": +15307="foo12345678123456X": +15307="foo1234567812345X": +15307="foo123456781X3456789": +15307="foofoo12345678123456789": +15307="foofoo12345678123456789": +15307="foofooX23456781foo23456789YYYYYYYY": +15307="fooX2345678123456789": +15307="fooXfoo12345678123456789": +15307="XXX12345678123456789": +15308="bar123456781X3456789": +15308="blahfoo12345678123456789": 24 +15308="foo": +15308="foo12345678123456": +15308="foo123456781234567": +15308="foo1234567812345678": +15308="foo12345678123456789": 20 +15308="foo1234567812345678X": +15308="foo123456781234567X": +15308="foo12345678123456X": +15308="foo1234567812345X": +15308="foo123456781X3456789": +15308="foofoo12345678123456789": 20,23 +15308="foofoo12345678123456789": 20,23 +15308="foofooX23456781foo23456789YYYYYYYY": +15308="fooX2345678123456789": +15308="fooXfoo12345678123456789": 24 +15308="XXX12345678123456789": +15309="bar123456781X3456789": +15309="blahfoo12345678123456789": 24 +15309="foo": +15309="foo12345678123456": +15309="foo123456781234567": +15309="foo1234567812345678": +15309="foo12345678123456789": 20 +15309="foo1234567812345678X": +15309="foo123456781234567X": +15309="foo12345678123456X": +15309="foo1234567812345X": +15309="foo123456781X3456789": +15309="foofoo12345678123456789": 23 +15309="foofoo12345678123456789": 23 +15309="foofooX23456781foo23456789YYYYYYYY": +15309="fooX2345678123456789": +15309="fooXfoo12345678123456789": 24 +15309="XXX12345678123456789": +15310="bar123456781X3456789": +15310="blahfoo12345678123456789": 17,18,19,20,21,22,23,24 +15310="foo": +15310="foo12345678123456": 17 +15310="foo123456781234567": 17,18 +15310="foo1234567812345678": 17,18,19 +15310="foo12345678123456789": 17,18,19,20 +15310="foo1234567812345678X": 17,18,19 +15310="foo123456781234567X": 17,18 +15310="foo12345678123456X": 17 +15310="foo1234567812345X": +15310="foo123456781X3456789": +15310="foofoo12345678123456789": 17,18,19,20,21,22,23 +15310="foofoo12345678123456789": 17,18,19,20,21,22,23 +15310="foofooX23456781foo23456789YYYYYYYY": 24,25,26,27,28,29,30,31,32,33,34 +15310="fooX2345678123456789": +15310="fooXfoo12345678123456789": 21,22,23,24 +15310="XXX12345678123456789": 20 +15311="bar123456781X3456789": +15311="blahfoo12345678123456789": 17 +15311="foo": +15311="foo12345678123456": 17 +15311="foo123456781234567": 17 +15311="foo1234567812345678": 17 +15311="foo12345678123456789": 17 +15311="foo1234567812345678X": 17 +15311="foo123456781234567X": 17 +15311="foo12345678123456X": 17 +15311="foo1234567812345X": +15311="foo123456781X3456789": +15311="foofoo12345678123456789": 17 +15311="foofoo12345678123456789": 17 +15311="foofooX23456781foo23456789YYYYYYYY": +15311="fooX2345678123456789": +15311="fooXfoo12345678123456789": +15311="XXX12345678123456789": +15312="bar123456781X3456789": +15312="blahfoo12345678123456789": 22 +15312="foo": +15312="foo12345678123456": +15312="foo123456781234567": 18 +15312="foo1234567812345678": 18 +15312="foo12345678123456789": 18 +15312="foo1234567812345678X": 18 +15312="foo123456781234567X": 18 +15312="foo12345678123456X": +15312="foo1234567812345X": +15312="foo123456781X3456789": +15312="foofoo12345678123456789": 18,20,21 +15312="foofoo12345678123456789": 18,20,21 +15312="foofooX23456781foo23456789YYYYYYYY": 32,33 +15312="fooX2345678123456789": +15312="fooXfoo12345678123456789": 21,22 +15312="XXX12345678123456789": +15313="bar123456781X3456789": +15313="blahfoo12345678123456789": 23 +15313="foo": +15313="foo12345678123456": +15313="foo123456781234567": +15313="foo1234567812345678": 19 +15313="foo12345678123456789": 19 +15313="foo1234567812345678X": 19 +15313="foo123456781234567X": +15313="foo12345678123456X": +15313="foo1234567812345X": +15313="foo123456781X3456789": +15313="foofoo12345678123456789": 19,21,22 +15313="foofoo12345678123456789": 19,21,22 +15313="foofooX23456781foo23456789YYYYYYYY": 33,34 +15313="fooX2345678123456789": +15313="fooXfoo12345678123456789": 22,23 +15313="XXX12345678123456789": +15314="bar123456781X3456789": +15314="blahfoo12345678123456789": 24 +15314="foo": +15314="foo12345678123456": +15314="foo123456781234567": +15314="foo1234567812345678": +15314="foo12345678123456789": 20 +15314="foo1234567812345678X": +15314="foo123456781234567X": +15314="foo12345678123456X": +15314="foo1234567812345X": +15314="foo123456781X3456789": +15314="foofoo12345678123456789": 20,22,23 +15314="foofoo12345678123456789": 20,22,23 +15314="foofooX23456781foo23456789YYYYYYYY": 34 +15314="fooX2345678123456789": +15314="fooXfoo12345678123456789": 23,24 +15314="XXX12345678123456789": +15315="bar123456781X3456789": +15315="blahfoo12345678123456789": 22 +15315="foo": +15315="foo12345678123456": +15315="foo123456781234567": 18 +15315="foo1234567812345678": 18 +15315="foo12345678123456789": 18 +15315="foo1234567812345678X": 18 +15315="foo123456781234567X": 18 +15315="foo12345678123456X": +15315="foo1234567812345X": +15315="foo123456781X3456789": +15315="foofoo12345678123456789": 18,21 +15315="foofoo12345678123456789": 18,21 +15315="foofooX23456781foo23456789YYYYYYYY": 33 +15315="fooX2345678123456789": +15315="fooXfoo12345678123456789": 22 +15315="XXX12345678123456789": +15316="bar123456781X3456789": +15316="blahfoo12345678123456789": 23 +15316="foo": +15316="foo12345678123456": +15316="foo123456781234567": +15316="foo1234567812345678": 19 +15316="foo12345678123456789": 19 +15316="foo1234567812345678X": 19 +15316="foo123456781234567X": +15316="foo12345678123456X": +15316="foo1234567812345X": +15316="foo123456781X3456789": +15316="foofoo12345678123456789": 19,22 +15316="foofoo12345678123456789": 19,22 +15316="foofooX23456781foo23456789YYYYYYYY": 34 +15316="fooX2345678123456789": +15316="fooXfoo12345678123456789": 23 +15316="XXX12345678123456789": +15317="bar123456781X3456789": +15317="blahfoo12345678123456789": 24 +15317="foo": +15317="foo12345678123456": +15317="foo123456781234567": +15317="foo1234567812345678": +15317="foo12345678123456789": 20 +15317="foo1234567812345678X": +15317="foo123456781234567X": +15317="foo12345678123456X": +15317="foo1234567812345X": +15317="foo123456781X3456789": +15317="foofoo12345678123456789": 20,23 +15317="foofoo12345678123456789": 20,23 +15317="foofooX23456781foo23456789YYYYYYYY": +15317="fooX2345678123456789": +15317="fooXfoo12345678123456789": 24 +15317="XXX12345678123456789": +15318="foo": 3 +15318="foofoo": 3,6 +15318="bar": 3 +15318="bar": 3 +15318="foobar": 3,6 +15318="barfoo": 3,6 +15318="XXfoo": 5 +15318="XXfoofoo": 5,8 +15318="XXbar": 5 +15318="XXbar": 5 +15318="XXfoobar": 5,8 +15318="XXbarfoo": 5,8 +15319="foobarX": 4,7 +15319="barfooX": 4,7 +15320="___\na___aa_": 0,4,5,10 +15321="foo bar baz": 7,11 +15321="foobarbarbazbarbaz": 6,9,12,15,18 +15321="foobarbaz": 6,9 +15321="foobarbazfoobarbaz": 6,9,15,18 +15322="foo bar baz": 7,11 +15322="foobarbarbazbarbaz": 6,9,12,15,18 +15322="foobarbaz": 6,9 +15322="foobarbazfoobarbaz": 6,9,15,18 +15323="foo barrr": 7,8,9 +15323="foobar": 6 +15323="foobarbarrr": 6,9,10,11 +15323="foobarr": 6,7 +15323="foobarrr": 6,7,8 +15323="foofoobarrr": 9,10,11 +15324=" foo eod bar eod baz eod": 12,20,24 +15324="foobarbarbazbarbaz": 6,9,12,15,18 +15324="foobarbaz": 6,9 +15324="foobarbazeod": 6,9,12 +15324="foobarbazfoobarbaz": 6,9,15,18 +15324="foobareod": 6,9 +15325="foo eod": 7 +15325="foo eod_": +15325="foo eodd": 8 +15325="fooeod": 6 +15325="fooeodd": 7 +15325="fooeoddd": 8 +15326="foo eod": 7 +15326="foo eod\n": 7 +15326="foo eod_": +15326="foo eod_\n": +15326="foo eodd": 8 +15326="foo eodd\n": 8 +15326="fooeod": 6 +15326="fooeod\n": 6 +15326="fooeodd": 7 +15326="fooeodd\n": 7 +15326="fooeoddd": 8 +15326="fooeoddd\n": 8 +15327="": +15327="0": +15327="A": 1 +15327="B": 1 +15327="C": 1 +15327="D": 1 +15327="E": 1 +15327="F": 1 +15327="_ABCDEF": 2,3,4,5,6,7 +15327="_abcdef": 2,3,4,5,6,7 +15327="a": 1 +15327="b": 1 +15327="c": 1 +15327="d": 1 +15327="e": 1 +15327="f": 1 +15328="": +15328="A": +15328="B": +15328="C": +15328="_": +15328="____abc___ABC": 5,6,7 +15328="a": 1 +15328="b": 1 +15328="c": 1 +15328="d": +15329="____pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp": 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204 +15329="____qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163 +15329="____qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp": 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364 diff --git a/tools/hscollider/test_cases/corpora/longlits.txt b/tools/hscollider/test_cases/corpora/longlits.txt new file mode 100644 index 000000000..7da2a0b39 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/longlits.txt @@ -0,0 +1,51 @@ +50000:ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq +50000:ihcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr +50000:vtymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc +50000:oxqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm +50000:jtaanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh +50000:ntafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy +50000:ckalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt +50000:fbbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap +50000:eosktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo +50000:gvoiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb + +50000:____________________________________________________________________________________________________ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq +50000:____________________________________________________________________________________________________ihcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr +50000:____________________________________________________________________________________________________vtymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc +50000:____________________________________________________________________________________________________oxqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm +50000:____________________________________________________________________________________________________jtaanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh +50000:____________________________________________________________________________________________________ntafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy +50000:____________________________________________________________________________________________________ckalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt +50000:____________________________________________________________________________________________________fbbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap +50000:____________________________________________________________________________________________________eosktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo +50000:____________________________________________________________________________________________________gvoiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb + +50000: ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq ihcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr vtymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc oxqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm jtaanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh ntafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy ckalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt fbbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap eosktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo gvoiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq + +50000:kdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq +50000:hcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr +50000:tymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc +50000:xqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm +50000:taanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh +50000:tafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy +50000:kalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt +50000:bbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap +50000:osktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo +50000:voiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb + +50001:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +50001: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +50001:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +50001:aaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +50002:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +50002: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +50002:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +50002:AAAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + +50003:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +50003: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +50003:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +50003:AAAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +50003:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +50003:AAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAaaaaaa diff --git a/tools/hscollider/test_cases/corpora/lookaround.txt b/tools/hscollider/test_cases/corpora/lookaround.txt new file mode 100644 index 000000000..8575af107 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/lookaround.txt @@ -0,0 +1,29 @@ +27000:AAAAAAAAAAAAABCDfoobaraaaaaabcdfoobarzzzzzzzzzzzzzzzzzzz +27000:aaaaaaaaaaaABCDfoobaraaaaaabcdfoobarzzzzzzzzzzzz +27000:aaaaaaaaaaLMNOfoobarzzzzzzzzzzzzzzzzzzz +27000:aaaaaaaaaaaaafoobarLLLLLLLLfoobarzzzzzzzzzzzz +27000:aaaaaaaaaaaAAfoobarzzzzzzzzzzzzzzzzzzzzzzzzzzzz +27000:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNNfoobaraaaaaaNNNfoobarzzzzzzzzzzzzzzzzzzzzzzzzzz +27001:aaaaaaaaaaaaaarFOOBARfoobarFOOBARRRRfoobarfoobarzzzzzzzzzzzzzzzzzz +27001:foobarfoobarfoobarFfoobarFfoobarfoobarfoobarzzzzzzzzzzzzzzz +27002:aaaaaaaaaaaaFFaafoobaraaaaaaaaaafoobarzzzzzzzzzzzzzzzz +27002:aaaaaaaaaaaaa:afoobar aaaaaaafoobarzzzzzzzzzz +27002:bbbbbaaaaaAfoobar +27002:bbbbbaaaaafoobar +27002:bbbbbaaaaaaAAAAAAAAfoobarzzzzzzzzzz +27003:aaaaaaaaaaaaaaaaaaafoobarzzzzzzzzzzzzzzzzzzzz +27003:aaaaaabcdefghKKKKKKKKKKKKfoobarKKKKKKKKKKKKKKKKKK +27003:aaaaaabcdefghiKKKKKKKKKKKKfoobarKKKKKKKKKKKKKKKKK +27003:aaaaaabcdefghiiiiiiiiiiiifoobarKKKKKKKKKKKKKK +27004:abcdefghijklmnofoobarabcdefghijklmnopqfoobarfoobar +27004:abcdefghijklmnfoobarfoobarabcdefghijklfoobar +27004:aaabcdefghikl__fffffoobarABCDEFGHIKLM_____foobar +27004:aaaaaacdefghiklmnopfoobarzzzzzzzzzzfoobar +27005: %foobfoobar d foobar______EEEEfoobar BEEfoobar +27005:ddddddddddededefoobar foobar foobar +27005: _foobar1111115WWWfoobarzzzzzzzzzzzzz +27006:0123012301230123012301230123foobar012301230123 +27006:00000000000000A0cdDEEEEE00foobar0000 +27006:00000000AABaaEEEEEfoobarfoobar +27006:00000000ddddDEEEEEEEfoobar +27007:c\xa1CCCCC[cdCAKDDDd\xc7vbEaaCC diff --git a/tools/hscollider/test_cases/corpora/mangle.txt b/tools/hscollider/test_cases/corpora/mangle.txt new file mode 100644 index 000000000..f05ece035 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/mangle.txt @@ -0,0 +1,1692 @@ +18000="foobar": +18000="fooabar": +18000="fooaabar": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 70 +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": 70 +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 70 +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 70 +18000="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18000="foo\x10\x19\x93vp\xc5\xf1\xb7iV\x823kx\xba\xd08\xc2c7\"\xfb\x02|g\xbap\x16t\xbbW\x84\xd4\xea\xfaE\xaf\xeb\xfcA~L\xac\xf6\x07}.\xc9\xe0e\xeb\xdbggC!\xd7Y\x95\x93\xb0\x19gbar": +18000="fooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbar": 70 +18000="fooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbba": +18000="fooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbaa": +18001="foobar": +18001="fooabar": +18001="fooaabar": +18001="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18001="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18001="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18001="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18001="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18001="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="foobar": +18002="fooabar": +18002="fooaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18002="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="hoobar": +18003="hooabar": +18003="hooaabar": +18003="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18003="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="foobar": +18003="fooabar": +18003="fooaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="foobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 251 +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="foobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="foobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18003="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18004="foobar": +18004="fooabar": +18004="fooaabar": +18004="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18004="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18004="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18004="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18004="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18004="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18004="foo:----fj-----OI--0---s--\"-----\r--)]C----J--G------z-S-Pv------CK;--Lf>------v-----EM---*-----%k---d.:_-0---j-----=<----l---------$-/--`x----@-------------O---U-5L--%h4----8-#*------_-.I-------a---w-dp\"-----+----_-h--:M--b-5--\tM----5--O--{-E---8-5-O--m-&--B-------P-H----[pr---7----D---O@-J-Z--SJ--O-c-----~-2;---.----P--j\r'bar----c-~8ey-x--b---0---i]B-kj7--!---3}'l--%-N---#R-<-1--t|------ga----\t-J/!-K--p5--4-U-M-[.---a]P--1----4-s----1--fy----U-TK---7--i(-`--yu^vqQ------\nV-`N\n-4-Vl^----7-----)s3--&----n-P-----U`-Q8~-p\ny#-[M--!\t--!----FOeDC------r-O}]t----K----8---`(--m_-\t----*-5-9-3-m?@SVE?--![uJbar": +18004="foo:----fj-----OI--0---s--\"-----\r--)]C----J--G------z-S-Pv------CK;--Lf>------v-----EM---*-----%k---d.:_-0---j-----=<----l---------$-/--`x----@-------------O---U-5L--%h4----8-#*------_-.I-------a---w-dp\"-----+----_-h--:M--b-5--\tM----5--O--{-E---8-5-O--m-&--B-------P-H----[pr---7----D---O@-J-Z--SJ--O-c-----~-2;---.----P--j\r'bar----c-~8ey-x--b---0---i]B-kj7--!---3}'l--%-N---#R-<-1--t|------ga----\t-J/!-K--p5--4-U-M-[.---a]P--1----4-s----1--fy----U-TK---7--i(-`--yu^vqQ------\nV-`N\n-4-Vl^----7-----)s3--&----n-P-----U`-Q8~-p\ny#-[M--!\t--!----FOeDC------r-O}]t----K----8---`(--m_-\t----*-5-9-3-m?@SVE?--![uJfoobar_____________________________________________________________bar": 673 +18005="foobar": +18005="fooabar": +18005="fooaabar": +18005="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18005="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18005="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18005="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18005="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18005="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18005="foo\x07\x9a\x00\xb5bR\xee\x95\xb5W[\x0e\xdbY[h\x11S>\xe6/\xbb \x18)Z)\x95\xd5z\xcb\xdc\x14\xcb\x91w\x1e\x7f\x0c\xd3\xd6g\xe1\xb2\xc0<\x1a\xd1\x8fX\x91\xb7\xbe\x13\xd7\xd7<2\x00\xd2\x07z\x9d\xe3\x8fbr": +18006="foobar": +18006="fooabar": +18006="fooaabar": +18006="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18006="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18006="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18006="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18006="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18006="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18006="fo\x98\x16\xf8=\xb5\xfd\x0e0\x17\xdd_7\xc6T\xf5>\xcbL;\xa2\x97\r\x8a\x90\x11\xd1\x1b\x16\x0e!>\xa686\xe3\xed3\xf1\x1dJ\xce}\x82\xd1w\xd3\x9d\xc3\x0e?[\x1c\xc9\xeb-\x9a\x06C\xa8(\x81N`bar": +18007="foobar": +18007="fooabar": +18007="fooaabar": +18007="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18007="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18007="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18007="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18007="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18007="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18008="foobar": +18008="fooabar": +18008="fooaabar": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18008="foobarX": +18008="fooabarX": +18008="fooaabarX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 70 +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18008="foobart": +18008="fooabart": +18008="fooaabart": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": 70,71 +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18008="foobartX": +18008="fooabartX": +18008="fooaabartX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": 70 +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18008="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18008="foo7\xe7\x02\xe3b-\x91\xb7%W\x1f\xccL/\x99\x7f\x9f\xfeRk\xb8F\xec\x11\x08\x8bd\xcaFa\x00-d\xe5\x90\"\x12!\xd97y\xf8\x03\xc5'\x9cD\xc6\x9a\x962R\xdd\x1ed\xe5\xa9\xc8\xb0\xef)\xb1\x1dbart": +18009="foobar": +18009="fooabar": +18009="fooaabar": +18009="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18009="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18009="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18009="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18009="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18009="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18009="foo\x8f\x8b\xe3U\xb6\xbc\xec]Se\xa9\x86Rf\xf3\xd9r\xd55\x00\xa10\xd4_H4\xa7\xf5\x9c^\x9c\x0f\xed'\xf3B\xde\xaf/;\x02\x94\xe4\x88\xe6J|\xbf\xbc\xb1\xc1]\xe2\x95\xbc*\xcac f\xc1\xbcu\xaf\xe3bar": +18010="foobar": +18010="fooabar": 7 +18010="fooaabar": 8 +18010="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18010="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18010="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18010="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18010="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18010="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18011="foobar": +18011="fooabar": +18011="fooaabar": +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18011="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18012="foobar": +18012="fooabar": 7 +18012="fooaabar": 8 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18012="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="foobar": +18013="fooabar": +18013="fooaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 406 +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 407 +18013="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 407 +18013="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 407 +18013="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 407 +18014="foobar": +18014="fooabar": +18014="fooaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18014="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18014="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18015="foobar": +18015="fooabar": +18015="fooaabar": 8 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18015="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18016="foobar": +18016="fooabar": +18016="fooaabar": +18016="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,69 +18016="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,70 +18016="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66 +18016="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18016="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18016="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18017="foobar": +18017="fooabar": +18017="fooaabar": +18017="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,69 +18017="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,70 +18017="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,71 +18017="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,72 +18017="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,73 +18017="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66 +18017="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66 +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18018="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18019="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18020="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18020="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18021="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18021="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 34 +18021="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18021="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18022="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18022="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 34 +18022="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18022="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18023="foobar": +18023="fooabar": +18023="fooaabar": +18023="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18023="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18023="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18023="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18023="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18023="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18024="foobar": +18024="fooabar": 7 +18024="fooaabar": 8 +18024="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18024="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18024="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18024="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18024="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18024="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18025="foobar": +18025="fooabar": +18025="fooaabar": +18025="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18025="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18025="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18025="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18025="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18025="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18026="foobar": 6 +18026="fooabar": +18026="fooaabar": +18026="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18026="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18026="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18026="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18026="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18026="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18027="foobar": 6 +18027="fooabar": 7 +18027="fooaabar": 8 +18027="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18027="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18027="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18027="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18027="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18027="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18028="foobar": 6 +18028="fooabar": +18028="fooaabar": +18028="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18028="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18028="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18028="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18028="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18028="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18029="foobar": +18029="fooabar": +18029="fooaabar": +18029="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18029="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18029="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18029="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18029="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18029="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18030="foobar": +18030="fooabar": +18030="fooaabar": +18030="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18030="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18030="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18030="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18030="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18030="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="foobar": +18031="fooabar": +18031="fooaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18031="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="hoobar": +18032="hooabar": +18032="hooaabar": +18032="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18032="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="hooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="foobar": +18032="fooabar": +18032="fooaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="foobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 251 +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="foobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="foobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18032="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18033="foobar": +18033="fooabar": +18033="fooaabar": +18033="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18033="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18033="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18033="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18033="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18033="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18034="foobar": +18034="fooabar": +18034="fooaabar": +18034="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18034="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18034="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18034="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18034="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18034="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18035="foobar": +18035="fooabar": +18035="fooaabar": +18035="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18035="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18035="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18035="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18035="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18035="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18036="foobar": +18036="fooabar": +18036="fooaabar": +18036="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18036="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18036="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18036="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18036="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18036="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18037="foobar": +18037="fooabar": +18037="fooaabar": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18037="foobarX": +18037="fooabarX": +18037="fooaabarX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 70 +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18037="foobart": +18037="fooabart": +18037="fooaabart": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": 70,71 +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18037="foobartX": +18037="fooabartX": +18037="fooaabartX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": 70 +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18037="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18038="foobar": +18038="fooabar": +18038="fooaabar": +18038="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18038="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18038="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18038="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18038="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18038="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18039="foobar": +18039="fooabar": 7 +18039="fooaabar": 8 +18039="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18039="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18039="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18039="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18039="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18039="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18040="foobar": +18040="fooabar": +18040="fooaabar": +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18040="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18041="foobar": +18041="fooabar": 7 +18041="fooaabar": 8 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18041="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="foobar": +18042="fooabar": +18042="fooaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 406 +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 407 +18042="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 407 +18042="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 407 +18042="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 407 +18043="foobar": +18043="fooabar": +18043="fooaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18043="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18043="fabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18044="foobar": +18044="fooabar": +18044="fooaabar": 8 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18044="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18045="foobar": +18045="fooabar": +18045="fooaabar": +18045="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,69 +18045="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,70 +18045="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66 +18045="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18045="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18045="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18046="foobar": +18046="fooabar": +18046="fooaabar": +18046="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,69 +18046="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,70 +18046="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,71 +18046="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,72 +18046="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66,73 +18046="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66 +18046="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 66 +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18047="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18048="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18049="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18049="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18050="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18050="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 34 +18050="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18050="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18051="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18051="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 34 +18051="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18051="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18052="foobar": +18052="fooabar": +18052="fooaabar": +18052="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18052="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18052="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18052="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18052="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18052="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18053="foobar": +18053="fooabar": 7 +18053="fooaabar": 8 +18053="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18053="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18053="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18053="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18053="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18053="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18054="foobar": +18054="fooabar": +18054="fooaabar": +18054="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18054="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18054="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18054="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18054="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18054="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18055="foobar": 6 +18055="fooabar": +18055="fooaabar": +18055="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18055="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18055="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18055="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18055="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18055="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18056="foobar": 6 +18056="fooabar": 7 +18056="fooaabar": 8 +18056="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18056="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18056="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18056="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18056="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18056="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18057="foobar": 6 +18057="fooabar": +18057="fooaabar": +18057="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18057="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18057="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18057="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18057="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18057="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18058="foobar": +18058="fooabar": +18058="fooaabar": +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18058="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18059="foobar": +18059="fooabar": 7 +18059="fooaabar": 8 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18059="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="foobar": +18060="fooabar": +18060="fooaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18060="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18061="foobar": 6 +18061="fooabar": 7 +18061="fooaabar": 8 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 69 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 70 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": 69 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": 70 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 69 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 70 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 69 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 70 +18061="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18062="foobar": 6 +18062="fooabar": 7 +18062="fooaabar": 8 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 69 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 37 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 605 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18062="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18063="______________________________________________________________________aaaa": 74 +18063="______________________________________________________________________123456789012": 82 +18100="Yfoobar": +18100="Yfooabar": +18100="Yfooaabar": +18100="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18100="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18100="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18100="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18100="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18100="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 71 +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": 71 +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 71 +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 71 +18100="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18101="Yfoobar": +18101="Yfooabar": +18101="Yfooaabar": +18101="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18101="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18101="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18101="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18101="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18101="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfoobar": +18102="Yfooabar": +18102="Yfooaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18102="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yhoobar": +18103="Yhooabar": +18103="Yhooaabar": +18103="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18103="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfoobar": +18103="Yfooabar": +18103="Yfooaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfoobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfoobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfoobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18103="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18105="Yfoobar": +18105="Yfooabar": +18105="Yfooaabar": +18105="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18105="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18105="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18105="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18105="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18105="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18106="Yfoobar": +18106="Yfooabar": +18106="Yfooaabar": +18106="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18106="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18106="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18106="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18106="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18106="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18107="Yfoobar": +18107="Yfooabar": +18107="Yfooaabar": +18107="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18107="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18107="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18107="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18107="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18107="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18108="Yfoobar": +18108="Yfooabar": +18108="Yfooaabar": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18108="YfoobarX": +18108="YfooabarX": +18108="YfooaabarX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 71 +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18108="Yfoobart": +18108="Yfooabart": +18108="Yfooaabart": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": 71,72 +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18108="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18108="YfoobartX": +18108="YfooabartX": +18108="YfooaabartX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": 71 +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18108="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18109="Yfoobar": +18109="Yfooabar": +18109="Yfooaabar": +18109="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18109="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18109="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18109="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18109="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18109="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18110="Yfoobar": +18110="Yfooabar": 8 +18110="Yfooaabar": 9 +18110="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18110="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18110="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18110="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18110="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18110="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18111="Yfoobar": +18111="Yfooabar": +18111="Yfooaabar": +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18111="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18112="Yfoobar": +18112="Yfooabar": 8 +18112="Yfooaabar": 9 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18112="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfoobar": +18113="Yfooabar": +18113="Yfooaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 407 +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 408 +18113="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 408 +18113="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 408 +18113="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 408 +18114="Yfoobar": +18114="Yfooabar": +18114="Yfooaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18114="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18114="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18115="Yfoobar": +18115="Yfooabar": +18115="Yfooaabar": 9 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18115="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 608 +18116="Yfoobar": +18116="Yfooabar": +18116="Yfooaabar": +18116="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,70 +18116="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,71 +18116="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67 +18116="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18116="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18116="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18117="Yfoobar": +18117="Yfooabar": +18117="Yfooaabar": +18117="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,70 +18117="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,71 +18117="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,72 +18117="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,73 +18117="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,74 +18117="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67 +18117="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67 +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18118="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18119="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18120="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 36 +18120="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18121="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18121="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18121="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 36 +18121="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18122="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18122="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18122="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 36 +18122="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18123="Yfoobar": +18123="Yfooabar": +18123="Yfooaabar": +18123="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18123="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18123="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18123="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18123="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18123="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18124="Yfoobar": +18124="Yfooabar": 8 +18124="Yfooaabar": 9 +18124="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18124="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18124="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18124="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18124="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18124="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18125="Yfoobar": +18125="Yfooabar": +18125="Yfooaabar": +18125="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18125="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18125="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18125="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18125="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18125="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18126="Yfoobar": 7 +18126="Yfooabar": +18126="Yfooaabar": +18126="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18126="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18126="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18126="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18126="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18126="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18127="Yfoobar": 7 +18127="Yfooabar": 8 +18127="Yfooaabar": 9 +18127="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18127="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18127="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18127="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18127="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18127="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18128="Yfoobar": 7 +18128="Yfooabar": +18128="Yfooaabar": +18128="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18128="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18128="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18128="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18128="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18128="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18129="Yfoobar": +18129="Yfooabar": +18129="Yfooaabar": +18129="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18129="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18129="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18129="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18129="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18129="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18130="Yfoobar": +18130="Yfooabar": +18130="Yfooaabar": +18130="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18130="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18130="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18130="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18130="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18130="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfoobar": +18131="Yfooabar": +18131="Yfooaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18131="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yhoobar": +18132="Yhooabar": +18132="Yhooaabar": +18132="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18132="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yhooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfoobar": +18132="Yfooabar": +18132="Yfooaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfoobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 252 +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfoobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfoobaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18132="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18134="Yfoobar": +18134="Yfooabar": +18134="Yfooaabar": +18134="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18134="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18134="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18134="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18134="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18134="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18135="Yfoobar": +18135="Yfooabar": +18135="Yfooaabar": +18135="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18135="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18135="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18135="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18135="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18135="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18136="Yfoobar": +18136="Yfooabar": +18136="Yfooaabar": +18136="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18136="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18136="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18136="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18136="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18136="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18137="Yfoobar": +18137="Yfooabar": +18137="Yfooaabar": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18137="YfoobarX": +18137="YfooabarX": +18137="YfooaabarX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 71 +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18137="Yfoobart": +18137="Yfooabart": +18137="Yfooaabart": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": 71,72 +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18137="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabart": +18137="YfoobartX": +18137="YfooabartX": +18137="YfooaabartX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": 71 +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18137="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabartX": +18138="Yfoobar": +18138="Yfooabar": +18138="Yfooaabar": +18138="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18138="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18138="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18138="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18138="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18138="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18139="Yfoobar": +18139="Yfooabar": 8 +18139="Yfooaabar": 9 +18139="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18139="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18139="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18139="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18139="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18139="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18140="Yfoobar": +18140="Yfooabar": +18140="Yfooaabar": +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18140="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18141="Yfoobar": +18141="Yfooabar": 8 +18141="Yfooaabar": 9 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18141="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfoobar": +18142="Yfooabar": +18142="Yfooaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 407 +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 408 +18142="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 408 +18142="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 408 +18142="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": 408 +18143="Yfoobar": +18143="Yfooabar": +18143="Yfooaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18143="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18143="Yfabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaz": +18144="Yfoobar": +18144="Yfooabar": +18144="Yfooaabar": 9 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18144="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 608 +18145="Yfoobar": +18145="Yfooabar": +18145="Yfooaabar": +18145="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,70 +18145="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,71 +18145="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67 +18145="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18145="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18145="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18146="Yfoobar": +18146="Yfooabar": +18146="Yfooaabar": +18146="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,70 +18146="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,71 +18146="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,72 +18146="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,73 +18146="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67,74 +18146="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67 +18146="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 67 +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18147="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18148="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18149="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 36 +18149="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18150="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18150="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18150="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 36 +18150="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18151="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18151="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 35 +18151="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 36 +18151="Yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18152="Yfoobar": +18152="Yfooabar": +18152="Yfooaabar": +18152="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18152="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18152="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18152="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18152="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18152="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18153="Yfoobar": +18153="Yfooabar": 8 +18153="Yfooaabar": 9 +18153="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18153="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18153="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18153="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18153="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18153="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18154="Yfoobar": +18154="Yfooabar": +18154="Yfooaabar": +18154="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18154="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18154="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18154="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18154="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18154="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18155="Yfoobar": 7 +18155="Yfooabar": +18155="Yfooaabar": +18155="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18155="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18155="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18155="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18155="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18155="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18156="Yfoobar": 7 +18156="Yfooabar": 8 +18156="Yfooaabar": 9 +18156="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18156="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18156="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18156="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18156="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18156="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18157="Yfoobar": 7 +18157="Yfooabar": +18157="Yfooaabar": +18157="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18157="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18157="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18157="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18157="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18157="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="Yfoobar": +18158="Yfooabar": +18158="Yfooaabar": +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18158="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="\x05fooa\x8faaaaaaa\x9aaaaaaaaaaaaa\xe1aa\xe2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6a\x11aaaaaaaaaaaaaaaaaaaaa\xc0aaaaaaaaaa\x9baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x82aaaaaaaa{aaaa\xfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x82aaaaa\xbeaaaaaaaaaaaaa\xcdaaaa\xfeaaaaaaaaaa\x1faaaaaaaaaaaaaaa\x0eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x10aaaaaaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xf6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="\x06fooaaaaaaaaaaaaaaaaaaaa\xe9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xbda?aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xc1aaaaaaaaaaaaaaaaaaaaaaa\xe8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xd7aaaaaaaaaaaa\x17aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xcdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xa8aaaaaaaaa\xb3aaaaaaaaaaaa\x88aaaaaaaaaaaRaaaaaaaaaaaaaaaaaa\xa5aaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaa\xbcaaaaaaaaaa\xb7aaaaaaaaaa?aaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="\x07fooaaaaaaaaaaaaaaaaaaaaaa\x81aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xb7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaaaaa\x7faaaaaaaaaaaa4aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xf2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xa2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xe7aaaaaaaaaaaaaaaa\x93aaaaaaaaaaaaaaaaaaaaaaaaaaaakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xcdaaaa\x98aaaaaa\x9eaaaaaaaaaaaaaaaaaaabar": +18158="\tfooaaaa\x1daaaaaaaaaaaaaaaaaaaaaaa_aaaaaaaaaaaa\x0baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xc7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xb0aaaaaaaaaaaaaa>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xe8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x97aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x85aaaaaaaaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18158="\x10fo\x0caaaaaaaaa\x8eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xa0aaaaaaaaaaaaa~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaaa\x92aa\xb6aaaaaaaaaaaaaaaaaaaaaaaaaaaYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xb0aaaaaaaaaaaaaaaa\x8baaaaaaaaaaaaaaaaaaaaaaaaaa\xd3aaaaaaaaaaaaaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x91aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\xc0aaaaaaaaaaaaaaaaaaaaaaaaabar": +18159="Yfoobar": +18159="Yfooabar": 8 +18159="Yfooaabar": 9 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18159="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfoobar": +18160="Yfooabar": +18160="Yfooaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18160="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18161="Yfoobar": 7 +18161="Yfooabar": 8 +18161="Yfooaabar": 9 +18161="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18161="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18161="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18161="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18161="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18161="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 70 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": 71 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarX": +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": 70 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": 71 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXX": +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 70 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 71 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 70 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": 71 +18161="YfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabarXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +18162="Yfoobar": 7 +18162="Yfooabar": 8 +18162="Yfooaabar": 9 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 70 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 71 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 72 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 40 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 606 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 607 +18162="Yfooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": +18163="Y______________________________________________________________________aaaa": 75 +18163="Y______________________________________________________________________123456789012": 83 +18164="Y______________________________________________________________________aaaa": 75 +18164="Y______________________________________________________________________123456789012b": 84 +18164="Y______________________________________________________________________12345678901b": 83 +18164="Y______________________________________________________________________b": +18164="Y______________________________________________________________________1b": 73 +18165="Y______________________________________________________________________aaaa": 75 +18165="Y______________________________________________________________________123456789012b": 84 +18165="Y______________________________________________________________________12345678901b": 83 +18165="Y______________________________________________________________________b": +18165="Y______________________________________________________________________1b": +18166="Yfoobar": +18166="Yfoo_bar": 8 +18166="Yfoo____bar": 11 +18166="Yfoo____________________________________________________________________________________________________bar": 107 +18166="Yfoo_____________________________________________________________________________________________________bar": 108 +18166="Yfoo______________________________________________________________________________________________________bar": +18166="nfoo\xd4\x89\xe12\x00\xd2\xc8oS\x1c\xb0\xd7f\xc7\xd9\x86\x89?\xe87\xf3\x0f\x13\x07r\xff\xde\x9c1\x7f|\x05\x08]7\t/\x00x\x82\x1c(Y\x83\xf03\tyr\xf1\xb0e\x00\xc4ls\xc3J\x0f\xf4\xc9\x8b\xf9\xd1\xe81\xdb\x181S\x9aM|\xf4\xd0l'\xda\xe5\x99\xcb\x95\xfe\xccYj?\x1d\xb5N\x11~\xd9\x0bP\xc1<+\xd9m~br": +18167="Yfoobar": +18167="Yfoo_bar": +18167="Yfoo____bar": +18167="Yfoo____________________________________________________________________________________________________bar": 107 +18167="Yfoo_____________________________________________________________________________________________________bar": 108 +18167="Yfoo______________________________________________________________________________________________________bar": +18168="Yfoobar": +18168="Yfoo_bar": +18168="Yfoo____bar": +18168="Yfoo____________________________________________________________________________________________________bar": 107 +18168="Yfoo_____________________________________________________________________________________________________bar": 108 +18168="Yfoo______________________________________________________________________________________________________bar": +18169="Yfoobar": +18169="Yfoo_bar": +18169="Yfoo____bar": +18169="Yfoo____________________________________________________________________________________________________bar": 107 +18169="Yfoo_____________________________________________________________________________________________________bar": +18169="Yfoo______________________________________________________________________________________________________bar": 109 +18169="Yfoo_______________________________________________________________________________________________________bar": +18169="Yfoo________________________________________________________________________________________________________bar": diff --git a/tools/hscollider/test_cases/corpora/mcclellan.txt b/tools/hscollider/test_cases/corpora/mcclellan.txt new file mode 100644 index 000000000..6b780da2b --- /dev/null +++ b/tools/hscollider/test_cases/corpora/mcclellan.txt @@ -0,0 +1,245 @@ +15900="foobarbar": 9 +15901="foobarbar": 6,9 +15902="foobarteabartea": 9,15 +15903="fo": 2 +15903="foobarfo": 2,8 +15903="foobarteafo": 2,9,11 +15904="fo": 2 +15904="foobarfo": 8 +15904="foobarteafo": 9,11 +15904="foo3baR\xee\xdbtea": 12 +15905="foobarteacofeee": 6,15 +15905="footeabarcofeee": 9,15 +15906="foogaz": 6 +15906="fofoogaz": 8 +15906="fobargaz": 8 +15906="bafoogaz": 8 +15906="foobarfgazfobarfoobarbbarbabargbargabar": 10 +15907="foobarfgazfobarfoobarbbarbabargbargabar": 6,10,15,21,25,30,34,39 +15908="foobartea": 9 +15908="foobgaztea": 10 +15908="foobagaztea": 11 +15908="fooabartea": 10 +15908="fooabgaztea": 11 +15908="fooabagaztea": 12 +15908="fooabagabartea": 14 +15909="fooabagabartea": 14 +15909="fooabagabagazaeteaet": 18 +15909="fooabagaba gazbagazaeteaet": 24 +15910="fooabagabartea": 14 +15910="fooabagabagazaeteaet": 16,18,20 +15910="fooabagaba gazbagazaeteaet": 22,24,26 +15911="foobafoobartea": +15912="foobafoobarteaet": +15913="p;;:": 4 +15913="p;;:_:": 4,6 +15913="p;;;;:_:": 6,8 +15913="p;;ab:_:": 6,8 +15913="p;;ab_:_:": 7,9 +15913="p;;ab_x:": 8 +15913="p;;ab_xj:": 9 +15913="p;p;;ab_xj:": +15913="aap;;ab_xj:": +15914="p;;:": 4 +15914="p;;:_:": 4,6 +15914="p;;;;:_:": 6,8 +15914="p;;ab:_:": 6,8 +15914="p;;ab_:_:": 7,9 +15914="p;;ab_x:": 8 +15914="p;;ab_xj:": 9 +15914="p;p;;ab_xj:": 11 +15914="aap;;ab_xj:": 11 +15915="p;;:": 4 +15915="p;;:_:": 4,6 +15915="p;;;;:_:": 6,8 +15915="p;;ab:_:": 6,8 +15915="p;;ab_:_:": 7,9 +15915="p;;ab_x:": 8 +15915="p;;ab_xj:": 9 +15915="p;p;;ab_xj:": 11 +15915="aap;;ab_xj:": 11 +15916="AAaZ": 4 +15916="AAbZ": 4 +15916="AAcZ": +15916="AAaXX": 5 +15916="AAbXX": +15916="AAcXX": +15916="AAaYY": +15916="AAbYY": 5 +15916="AAcYY": +15916="AAzaZ": 5 +15916="AAzbZ": 5 +15916="AAzcZ": +15916="AAzazXX": 7 +15916="AAzbzXX": +15916="AAzczXX": +15916="AAzazYY": +15916="AAzbzYY": 7 +15916="AAzczYY": +15916="AAzazZ": 6 +15916="AAzbzZ": 6 +15916="AAzczZ": +15916="AAzazXX": 7 +15916="AAzbzXX": +15916="AAzczXX": +15916="AAzazYY": +15916="AAzbzYY": 7 +15916="AAzczYY": +15916="AAaZZXXX": 4,5,7,8 +15916="AAbZZYYY": 4,5,7,8 +15916="AAabZZXXXYYY": 5,6,8,9,11,12 +15916="AAbaZZXXXYYY": 5,6,8,9,11,12 +15916="AAa_bZZXXXYYY": 6,7,9,10,12,13 +15916="AAb_aZZXXXYYY": 6,7,9,10,12,13 +15916="AAa_b_ZZXX_XYYY": 7,8,10,14,15 +15916="AAb_a_ZZXX_XYYY": 7,8,10,14,15 +15917="AAaZ": 4 +15917="AAbZ": 4 +15917="AAcZ": +15917="AAaXX": 5 +15917="AAbXX": +15917="AAcXX": +15917="AAaYY": +15917="AAbYY": +15917="AAcYY": +15917="AAzaZ": 5 +15917="AAzbZ": 5 +15917="AAzcZ": +15917="AAzazXX": 7 +15917="AAzbzXX": +15917="AAzczXX": +15917="AAzazYY": +15917="AAzbzYY": +15917="AAzczYY": +15917="AAzazZ": 6 +15917="AAzbzZ": 6 +15917="AAzczZ": +15917="AAzazXX": 7 +15917="AAzbzXX": +15917="AAzczXX": +15917="AAzazYY": +15917="AAzbzYY": +15917="AAzczYY": +15917="AAaZZXXX": 4,5,7,8 +15917="AAbZZYYY": 4,5 +15917="AAabZZXXXYYY": 5,6,8,9 +15917="AAbaZZXXXYYY": 5,6,8,9 +15917="AAa_bZZXXXYYY": 6,7,9,10 +15917="AAb_aZZXXXYYY": 6,7,9,10 +15917="AAa_b_ZZXX_XYYY": 7,8,10 +15917="AAb_a_ZZXX_XYYY": 7,8,10 +15918="ppp;;:": +15918="ppp;;:_:": +15918="ppp;;;;:_:": +15918="ppp;;ab:_:": +15918="ppp;;ab_:_:": +15918="ppp;;ab_x:": +15918="ppp;;ab_xj:": +15918="p;ppp;;ab_xj:": +15918="aappp;;ab_xj:": +15919="ppp;;:": +15919="ppp;;:_:": +15919="ppp;;;;:_:": +15919="ppp;;ab:_:": +15919="ppp;;ab_:_:": +15919="ppp;;ab_x:": +15919="ppp;;ab_xj:": +15919="p;ppp;;ab_xj:": +15919="aappp;;ab_xj:": +15920="ppp;;:": +15920="ppp;;:_:": +15920="ppp;;;;:_:": +15920="ppp;;ab:_:": +15920="ppp;;ab_:_:": +15920="ppp;;ab_x:": +15920="ppp;;ab_xj:": +15920="p;ppp;;ab_xj:": +15920="aappp;;ab_xj:": +15921="AAAAAaZ": 7 +15921="AAAAAbZ": 7 +15921="AAAAAcZ": +15921="AAAAAaXX": 8 +15921="AAAAAbXX": +15921="AAAAAcXX": +15921="AAAAAaYY": +15921="AAAAAbYY": 8 +15921="AAAAAcYY": +15921="AAAAAzaZ": 8 +15921="AAAAAzbZ": 8 +15921="AAAAAzcZ": +15921="AAAAAzazXX": 10 +15921="AAAAAzbzXX": +15921="AAAAAzczXX": +15921="AAAAAzazYY": +15921="AAAAAzbzYY": 10 +15921="AAAAAzczYY": +15921="AAAAAzazZ": 9 +15921="AAAAAzbzZ": 9 +15921="AAAAAzczZ": +15921="AAAAAzazXX": 10 +15921="AAAAAzbzXX": +15921="AAAAAzczXX": +15921="AAAAAzazYY": +15921="AAAAAzbzYY": 10 +15921="AAAAAzczYY": +15921="AAAAAaZZXXX": 7,8,10,11 +15921="AAAAAbZZYYY": 7,8,10,11 +15921="AAAAAabZZXXXYYY": 8,9,11,12,14,15 +15921="AAAAAbaZZXXXYYY": 8,9,11,12,14,15 +15921="AAAAAa_bZZXXXYYY": 9,10,12,13,15,16 +15921="AAAAAb_aZZXXXYYY": 9,10,12,13,15,16 +15921="AAAAAa_b_ZZXX_XYYY": 10,11,13,17,18 +15921="AAAAAb_a_ZZXX_XYYY": 10,11,13,17,18 +15922="AAAAAaZ": +15922="AAAAAbZ": +15922="AAAAAcZ": +15922="AAAAAaXX": +15922="AAAAAbXX": +15922="AAAAAcXX": +15922="AAAAAaYY": +15922="AAAAAbYY": +15922="AAAAAcYY": +15922="AAAAAzaZ": +15922="AAAAAzbZ": +15922="AAAAAzcZ": +15922="AAAAAzazXX": +15922="AAAAAzbzXX": +15922="AAAAAzczXX": +15922="AAAAAzazYY": +15922="AAAAAzbzYY": +15922="AAAAAzczYY": +15922="AAAAAzazZ": +15922="AAAAAzbzZ": +15922="AAAAAzczZ": +15922="AAAAAzazXX": +15922="AAAAAzbzXX": +15922="AAAAAzczXX": +15922="AAAAAzazYY": +15922="AAAAAzbzYY": +15922="AAAAAzczYY": +15922="AAAAAaZZXXX": +15922="AAAAAbZZYYY": +15922="AAAAAabZZXXXYYY": +15922="AAAAAbaZZXXXYYY": +15922="AAAAAa_bZZXXXYYY": +15922="AAAAAb_aZZXXXYYY": +15922="AAAAAa_b_ZZXX_XYYY": +15922="AAAAAb_a_ZZXX_XYYY": +15923="bbbbkbj_": 2,3,4,5,6,7 +15924:literal123456789 +15924:literaliteral1 +15924:literal1literal123456789 +15924:literaliteraliteral1 +15925:literal123456789 +15925:literaliteral1 +15925:literal1literal123456789 +15925:literaliteraliteral1 +15926:literal123456789 +15926:literaliteral1 +15926:literal1literal123456789 +15926:literaliteraliteral1 +15927:literal123456789 +15927:literaliteral1 +15927:literal1literal123456789 +15927:literaliteraliteral1 +15928:\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xe5\x9b\xbb\xee\x80\x80\xee\x80\x80\xee\x80\x80\xec\x88\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xe2\x8b\xba\xee\x80\x80\xe9\xa8\x8e\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80b\xe0\xb9\x82a8a diff --git a/tools/hscollider/test_cases/corpora/metacharacters.txt b/tools/hscollider/test_cases/corpora/metacharacters.txt new file mode 100644 index 000000000..8ffe1a13a --- /dev/null +++ b/tools/hscollider/test_cases/corpora/metacharacters.txt @@ -0,0 +1,51 @@ +24000="": +24000="a": 1 +24000="C": 1 +24000="\x00": 1 +24000="\xff": 1 +24000="abcdef": 1,2,3,4,5,6 +24001="\x07": 1 +24002="\x1a": 1 +24002="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 27 +24003=";": 1 +24003="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 60 +24004="{": 1 +24004="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 124 +24005="\x01": 1 +24005="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2 +24006="p": 1 +24006="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 113 +24007="\x1b": 1 +24008="\x0c": 1 +24009="\n": 1 +24010="\r": 1 +24011="\t": 1 +24012="\xdc\xdc\x00\xff": 4 +24015="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2 +24016="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 27 +24017="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 60 +24018="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 124 +24019="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2 +24020="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 113 +24021="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2 +24022="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": +24022="\x1cn": 2 +24023="8 literal 9": 11 +24024="bignum 1111111111": +24024="bignum I1111111": 15 +24025="bignum 2147483639": +24025="bignum \x8c7483639": 15 +24026="bignum \x018888": 12 +24027="bignum \n8888": 12 +24028="bignum S8888": 12 +24029="bignum \xff8888": 12 +24030:0 +24031:0 +24032:\n +24033:\n +24034:\n0 +24034:P +24035:\n0 +24035:P +24036:\xff +24037:80 diff --git a/tools/hscollider/test_cases/corpora/notbob.txt b/tools/hscollider/test_cases/corpora/notbob.txt new file mode 100644 index 000000000..50d188ecf --- /dev/null +++ b/tools/hscollider/test_cases/corpora/notbob.txt @@ -0,0 +1,921 @@ +15500="Anotbobnotbobnotboo": 7,13 +15500="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15500="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15500="notbobnotbobnotboo": 6,12 +15500="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15501="Anotbobnotbobnotboo": +15501="Anotbobnotbobnotnotbarnotbobnotbar": +15501="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6 +15501="notbobnotbobnotboo": 6 +15501="notbobnotbobnotnotbarnotbobnotbar": 6 +15502="Anotbobnotbobnotboo": +15502="Anotbobnotbobnotnotbarnotbobnotbar": +15502="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6 +15502="notbobnotbobnotboo": 6 +15502="notbobnotbobnotnotbarnotbobnotbar": 6 +15503="Anotbobnotbobnotboo": 7,13 +15503="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15503="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15503="notbobnotbobnotboo": 12 +15503="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15504="Anotbobnotbobnotboo": 7 +15504="Anotbobnotbobnotnotbarnotbobnotbar": 7 +15504="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15504="notbobnotbobnotboo": +15504="notbobnotbobnotnotbarnotbobnotbar": +15505="Anotbobnotbobnotboo": 7 +15505="Anotbobnotbobnotnotbarnotbobnotbar": 7 +15505="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15505="notbobnotbobnotboo": +15505="notbobnotbobnotnotbarnotbobnotbar": +15506="Anotbobnotbobnotboo": 13 +15506="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15506="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15506="notbobnotbobnotboo": 12 +15506="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15507="Anotbobnotbobnotboo": +15507="Anotbobnotbobnotnotbarnotbobnotbar": +15507="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12 +15507="notbobnotbobnotboo": 12 +15507="notbobnotbobnotnotbarnotbobnotbar": 12 +15508="Anotbobnotbobnotboo": +15508="Anotbobnotbobnotnotbarnotbobnotbar": +15508="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12 +15508="notbobnotbobnotboo": 12 +15508="notbobnotbobnotnotbarnotbobnotbar": 12 +15509="Anotbobnotbobnotboo": 7,13 +15509="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15509="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15509="notbobnotbobnotboo": 6,12 +15509="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15510="Anotbobnotbobnotboo": 7,13 +15510="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15510="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15510="notbobnotbobnotboo": 6,12 +15510="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15511="Anotbobnotbobnotboo": 7,13 +15511="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15511="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15511="notbobnotbobnotboo": 6,12 +15511="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15512="Anotbobnotbobnotboo": 7,13 +15512="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15512="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15512="notbobnotbobnotboo": 12 +15512="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15513="Anotbobnotbobnotboo": 7,13 +15513="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15513="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15513="notbobnotbobnotboo": 12 +15513="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15514="Anotbobnotbobnotboo": 7,13 +15514="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15514="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15514="notbobnotbobnotboo": 12 +15514="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15515="Anotbobnotbobnotboo": 13 +15515="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15515="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15515="notbobnotbobnotboo": 12 +15515="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15516="Anotbobnotbobnotboo": 13 +15516="Anotbobnotbobnotnotbarnotbobnotbar": 13 +15516="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12 +15516="notbobnotbobnotboo": 12 +15516="notbobnotbobnotnotbarnotbobnotbar": 12 +15517="Anotbobnotbobnotboo": 13 +15517="Anotbobnotbobnotnotbarnotbobnotbar": 13 +15517="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12 +15517="notbobnotbobnotboo": 12 +15517="notbobnotbobnotnotbarnotbobnotbar": 12 +15518="Anotbobnotbobnotboo": 7,13 +15518="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15518="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15518="notbobnotbobnotboo": 6,12 +15518="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15519="Anotbobnotbobnotboo": 7,13 +15519="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15519="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15519="notbobnotbobnotboo": 6,12 +15519="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15520="Anotbobnotbobnotboo": 7,13 +15520="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15520="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15520="notbobnotbobnotboo": 6,12 +15520="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15521="Anotbobnotbobnotboo": +15521="Anotbobnotbobnotnotbarnotbobnotbar": +15521="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15521="notbobnotbobnotboo": 6,12 +15521="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15522="Anotbobnotbobnotboo": +15522="Anotbobnotbobnotnotbarnotbobnotbar": +15522="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15522="notbobnotbobnotboo": 6,12 +15522="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15523="Anotbobnotbobnotboo": 7,13 +15523="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15523="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15523="notbobnotbobnotboo": 12 +15523="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15524="Anotbobnotbobnotboo": 7,13 +15524="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15524="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15524="notbobnotbobnotboo": +15524="notbobnotbobnotnotbarnotbobnotbar": +15525="Anotbobnotbobnotboo": 7,13 +15525="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15525="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15525="notbobnotbobnotboo": +15525="notbobnotbobnotnotbarnotbobnotbar": +15526="Anotbobnotbobnotboo": 13 +15526="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15526="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15526="notbobnotbobnotboo": 12 +15526="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15527="Anotbobnotbobnotboo": +15527="Anotbobnotbobnotnotbarnotbobnotbar": +15527="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15527="notbobnotbobnotboo": 12 +15527="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15528="Anotbobnotbobnotboo": +15528="Anotbobnotbobnotnotbarnotbobnotbar": +15528="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15528="notbobnotbobnotboo": 12 +15528="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15529="Anotbobnotbobnotboo": 7,13 +15529="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15529="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15529="notbobnotbobnotboo": 6,12 +15529="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15530="Anotbobnotbobnotboo": 7,13 +15530="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15530="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15530="notbobnotbobnotboo": 6,12 +15530="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15531="Anotbobnotbobnotboo": 7,13 +15531="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15531="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15531="notbobnotbobnotboo": 6,12 +15531="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15532="Anotbobnotbobnotboo": 7,13 +15532="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15532="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15532="notbobnotbobnotboo": 12 +15532="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15533="Anotbobnotbobnotboo": 7,13 +15533="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15533="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15533="notbobnotbobnotboo": 12 +15533="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15534="Anotbobnotbobnotboo": 7,13 +15534="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15534="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15534="notbobnotbobnotboo": 12 +15534="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15535="Anotbobnotbobnotboo": 13 +15535="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15535="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15535="notbobnotbobnotboo": 12 +15535="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15536="Anotbobnotbobnotboo": 13 +15536="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15536="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15536="notbobnotbobnotboo": 12 +15536="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15537="Anotbobnotbobnotboo": 13 +15537="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15537="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15537="notbobnotbobnotboo": 12 +15537="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15538="Anotbobnotbobnotboo": 7,13 +15538="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15538="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15538="notbobnotbobnotboo": 6,12 +15538="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15539="Anotbobnotbobnotboo": 7,13 +15539="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15539="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15539="notbobnotbobnotboo": 6,12 +15539="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15540="Anotbobnotbobnotboo": +15540="Anotbobnotbobnotnotbarnotbobnotbar": +15540="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15540="notbobnotbobnotboo": +15540="notbobnotbobnotnotbarnotbobnotbar": +15541="Anotbobnotbobnotboo": +15541="Anotbobnotbobnotnotbarnotbobnotbar": +15541="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15541="notbobnotbobnotboo": +15541="notbobnotbobnotnotbarnotbobnotbar": +15542="Anotbobnotbobnotboo": +15542="Anotbobnotbobnotnotbarnotbobnotbar": +15542="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15542="notbobnotbobnotboo": +15542="notbobnotbobnotnotbarnotbobnotbar": +15543="Anotbobnotbobnotboo": +15543="Anotbobnotbobnotnotbarnotbobnotbar": +15543="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15543="notbobnotbobnotboo": +15543="notbobnotbobnotnotbarnotbobnotbar": +15544="Anotbobnotbobnotboo": +15544="Anotbobnotbobnotnotbarnotbobnotbar": +15544="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15544="notbobnotbobnotboo": +15544="notbobnotbobnotnotbarnotbobnotbar": +15545="Anotbobnotbobnotboo": +15545="Anotbobnotbobnotnotbarnotbobnotbar": +15545="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15545="notbobnotbobnotboo": +15545="notbobnotbobnotnotbarnotbobnotbar": +15546="Anotbobnotbobnotboo": +15546="Anotbobnotbobnotnotbarnotbobnotbar": +15546="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15546="notbobnotbobnotboo": +15546="notbobnotbobnotnotbarnotbobnotbar": +15547="Anotbobnotbobnotboo": +15547="Anotbobnotbobnotnotbarnotbobnotbar": +15547="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15547="notbobnotbobnotboo": +15547="notbobnotbobnotnotbarnotbobnotbar": +15548="Anotbobnotbobnotboo": +15548="Anotbobnotbobnotnotbarnotbobnotbar": +15548="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15548="notbobnotbobnotboo": +15548="notbobnotbobnotnotbarnotbobnotbar": +15549="Anotbobnotbobnotboo": +15549="Anotbobnotbobnotnotbarnotbobnotbar": +15549="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15549="notbobnotbobnotboo": +15549="notbobnotbobnotnotbarnotbobnotbar": +15550="Anotbobnotbobnotboo": +15550="Anotbobnotbobnotnotbarnotbobnotbar": +15550="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15550="notbobnotbobnotboo": +15550="notbobnotbobnotnotbarnotbobnotbar": +15551="Anotbobnotbobnotboo": +15551="Anotbobnotbobnotnotbarnotbobnotbar": +15551="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15551="notbobnotbobnotboo": +15551="notbobnotbobnotnotbarnotbobnotbar": +15552="Anotbobnotbobnotboo": +15552="Anotbobnotbobnotnotbarnotbobnotbar": +15552="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15552="notbobnotbobnotboo": +15552="notbobnotbobnotnotbarnotbobnotbar": +15553="Anotbobnotbobnotboo": +15553="Anotbobnotbobnotnotbarnotbobnotbar": +15553="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15553="notbobnotbobnotboo": +15553="notbobnotbobnotnotbarnotbobnotbar": +15554="Anotbobnotbobnotboo": +15554="Anotbobnotbobnotnotbarnotbobnotbar": +15554="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15554="notbobnotbobnotboo": +15554="notbobnotbobnotnotbarnotbobnotbar": +15555="Anotbobnotbobnotboo": +15555="Anotbobnotbobnotnotbarnotbobnotbar": +15555="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15555="notbobnotbobnotboo": +15555="notbobnotbobnotnotbarnotbobnotbar": +15556="Anotbobnotbobnotboo": +15556="Anotbobnotbobnotnotbarnotbobnotbar": +15556="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15556="notbobnotbobnotboo": +15556="notbobnotbobnotnotbarnotbobnotbar": +15557="Anotbobnotbobnotboo": +15557="Anotbobnotbobnotnotbarnotbobnotbar": +15557="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15557="notbobnotbobnotboo": +15557="notbobnotbobnotnotbarnotbobnotbar": +15558="Anotbobnotbobnotboo": +15558="Anotbobnotbobnotnotbarnotbobnotbar": +15558="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15558="notbobnotbobnotboo": +15558="notbobnotbobnotnotbarnotbobnotbar": +15559="Anotbobnotbobnotboo": +15559="Anotbobnotbobnotnotbarnotbobnotbar": +15559="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15559="notbobnotbobnotboo": +15559="notbobnotbobnotnotbarnotbobnotbar": +15560="Anotbobnotbobnotboo": +15560="Anotbobnotbobnotnotbarnotbobnotbar": +15560="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15560="notbobnotbobnotboo": +15560="notbobnotbobnotnotbarnotbobnotbar": +15561="Anotbobnotbobnotboo": +15561="Anotbobnotbobnotnotbarnotbobnotbar": +15561="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15561="notbobnotbobnotboo": +15561="notbobnotbobnotnotbarnotbobnotbar": +15562="Anotbobnotbobnotboo": +15562="Anotbobnotbobnotnotbarnotbobnotbar": +15562="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15562="notbobnotbobnotboo": +15562="notbobnotbobnotnotbarnotbobnotbar": +15563="Anotbobnotbobnotboo": +15563="Anotbobnotbobnotnotbarnotbobnotbar": +15563="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15563="notbobnotbobnotboo": +15563="notbobnotbobnotnotbarnotbobnotbar": +15564="Anotbobnotbobnotboo": +15564="Anotbobnotbobnotnotbarnotbobnotbar": +15564="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15564="notbobnotbobnotboo": +15564="notbobnotbobnotnotbarnotbobnotbar": +15565="Anotbobnotbobnotboo": +15565="Anotbobnotbobnotnotbarnotbobnotbar": +15565="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15565="notbobnotbobnotboo": +15565="notbobnotbobnotnotbarnotbobnotbar": +15565="_notbobnoA___bbar": 17 +15566="Anotbobnotbobnotboo": +15566="Anotbobnotbobnotnotbarnotbobnotbar": +15566="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15566="notbobnotbobnotboo": +15566="notbobnotbobnotnotbarnotbobnotbar": +15567="Anotbobnotbobnotboo": +15567="Anotbobnotbobnotnotbarnotbobnotbar": +15567="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15567="notbobnotbobnotboo": +15567="notbobnotbobnotnotbarnotbobnotbar": +15568="Anotbobnotbobnotboo": +15568="Anotbobnotbobnotnotbarnotbobnotbar": +15568="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15568="notbobnotbobnotboo": +15568="notbobnotbobnotnotbarnotbobnotbar": +15569="Anotbobnotbobnotboo": +15569="Anotbobnotbobnotnotbarnotbobnotbar": +15569="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15569="notbobnotbobnotboo": +15569="notbobnotbobnotnotbarnotbobnotbar": +15570="Anotbobnotbobnotboo": +15570="Anotbobnotbobnotnotbarnotbobnotbar": +15570="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15570="notbobnotbobnotboo": +15570="notbobnotbobnotnotbarnotbobnotbar": +15571="Anotbobnotbobnotboo": +15571="Anotbobnotbobnotnotbarnotbobnotbar": +15571="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15571="notbobnotbobnotboo": +15571="notbobnotbobnotnotbarnotbobnotbar": +15572="Anotbobnotbobnotboo": +15572="Anotbobnotbobnotnotbarnotbobnotbar": +15572="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15572="notbobnotbobnotboo": +15572="notbobnotbobnotnotbarnotbobnotbar": +15573="Anotbobnotbobnotboo": +15573="Anotbobnotbobnotnotbarnotbobnotbar": +15573="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15573="notbobnotbobnotboo": +15573="notbobnotbobnotnotbarnotbobnotbar": +15574="Anotbobnotbobnotboo": +15574="Anotbobnotbobnotnotbarnotbobnotbar": +15574="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15574="notbobnotbobnotboo": +15574="notbobnotbobnotnotbarnotbobnotbar": +15575="Anotbobnotbobnotboo": +15575="Anotbobnotbobnotnotbarnotbobnotbar": +15575="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15575="notbobnotbobnotboo": +15575="notbobnotbobnotnotbarnotbobnotbar": +15576="Anotbobnotbobnotboo": +15576="Anotbobnotbobnotnotbarnotbobnotbar": +15576="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15576="notbobnotbobnotboo": +15576="notbobnotbobnotnotbarnotbobnotbar": +15577="Anotbobnotbobnotboo": +15577="Anotbobnotbobnotnotbarnotbobnotbar": +15577="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15577="notbobnotbobnotboo": +15577="notbobnotbobnotnotbarnotbobnotbar": +15578="Anotbobnotbobnotboo": +15578="Anotbobnotbobnotnotbarnotbobnotbar": +15578="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15578="notbobnotbobnotboo": +15578="notbobnotbobnotnotbarnotbobnotbar": +15579="Anotbobnotbobnotboo": +15579="Anotbobnotbobnotnotbarnotbobnotbar": +15579="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15579="notbobnotbobnotboo": +15579="notbobnotbobnotnotbarnotbobnotbar": +15580="Anotbobnotbobnotboo": +15580="Anotbobnotbobnotnotbarnotbobnotbar": +15580="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40 +15580="notbobnotbobnotboo": +15580="notbobnotbobnotnotbarnotbobnotbar": +15581="Anotbobnotbobnotboo": +15581="Anotbobnotbobnotnotbarnotbobnotbar": +15581="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40 +15581="notbobnotbobnotboo": +15581="notbobnotbobnotnotbarnotbobnotbar": +15582="Anotbobnotbobnotboo": +15582="Anotbobnotbobnotnotbarnotbobnotbar": +15582="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40 +15582="notbobnotbobnotboo": +15582="notbobnotbobnotnotbarnotbobnotbar": +15583="Anotbobnotbobnotboo": +15583="Anotbobnotbobnotnotbarnotbobnotbar": +15583="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68 +15583="notbobnotbobnotboo": +15583="notbobnotbobnotnotbarnotbobnotbar": +15584="Anotbobnotbobnotboo": +15584="Anotbobnotbobnotnotbarnotbobnotbar": +15584="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15584="notbobnotbobnotboo": +15584="notbobnotbobnotnotbarnotbobnotbar": +15585="Anotbobnotbobnotboo": +15585="Anotbobnotbobnotnotbarnotbobnotbar": +15585="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15585="notbobnotbobnotboo": +15585="notbobnotbobnotnotbarnotbobnotbar": +15586="Anotbobnotbobnotboo": +15586="Anotbobnotbobnotnotbarnotbobnotbar": +15586="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15586="notbobnotbobnotboo": +15586="notbobnotbobnotnotbarnotbobnotbar": +15587="Anotbobnotbobnotboo": +15587="Anotbobnotbobnotnotbarnotbobnotbar": +15587="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15587="notbobnotbobnotboo": +15587="notbobnotbobnotnotbarnotbobnotbar": +15588="Anotbobnotbobnotboo": +15588="Anotbobnotbobnotnotbarnotbobnotbar": +15588="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15588="notbobnotbobnotboo": +15588="notbobnotbobnotnotbarnotbobnotbar": +15589="Anotbobnotbobnotboo": +15589="Anotbobnotbobnotnotbarnotbobnotbar": +15589="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15589="notbobnotbobnotboo": +15589="notbobnotbobnotnotbarnotbobnotbar": +15590="Anotbobnotbobnotboo": 7,13 +15590="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,22,28,34 +15590="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,22,28,35,41,47,56,62,68 +15590="notbobnotbobnotboo": 6,12 +15590="notbobnotbobnotnotbarnotbobnotbar": 6,12,21,27,33 +15600="Anotbobnotbobnotboo": 7,13 +15600="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15600="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15600="notbobnotbobnotboo": 6,12 +15600="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15601="Anotbobnotbobnotboo": +15601="Anotbobnotbobnotnotbarnotbobnotbar": +15601="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6 +15601="notbobnotbobnotboo": 6 +15601="notbobnotbobnotnotbarnotbobnotbar": 6 +15602="Anotbobnotbobnotboo": +15602="Anotbobnotbobnotnotbarnotbobnotbar": +15602="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6 +15602="notbobnotbobnotboo": 6 +15602="notbobnotbobnotnotbarnotbobnotbar": 6 +15603="Anotbobnotbobnotboo": 7,13 +15603="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15603="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15603="notbobnotbobnotboo": 12 +15603="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15604="Anotbobnotbobnotboo": 7 +15604="Anotbobnotbobnotnotbarnotbobnotbar": 7 +15604="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15604="notbobnotbobnotboo": +15604="notbobnotbobnotnotbarnotbobnotbar": +15605="Anotbobnotbobnotboo": 7 +15605="Anotbobnotbobnotnotbarnotbobnotbar": 7 +15605="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15605="notbobnotbobnotboo": +15605="notbobnotbobnotnotbarnotbobnotbar": +15606="Anotbobnotbobnotboo": 13 +15606="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15606="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15606="notbobnotbobnotboo": 12 +15606="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15607="Anotbobnotbobnotboo": +15607="Anotbobnotbobnotnotbarnotbobnotbar": +15607="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41 +15607="notbobnotbobnotboo": 12 +15607="notbobnotbobnotnotbarnotbobnotbar": 12 +15608="Anotbobnotbobnotboo": +15608="Anotbobnotbobnotnotbarnotbobnotbar": +15608="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12 +15608="notbobnotbobnotboo": 12 +15608="notbobnotbobnotnotbarnotbobnotbar": 12 +15609="Anotbobnotbobnotboo": 7,13 +15609="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15609="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15609="notbobnotbobnotboo": 6,12 +15609="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15610="Anotbobnotbobnotboo": 7,13 +15610="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15610="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15610="notbobnotbobnotboo": 6,12 +15610="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15611="Anotbobnotbobnotboo": 7,13 +15611="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15611="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15611="notbobnotbobnotboo": 6,12 +15611="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15612="Anotbobnotbobnotboo": 7,13 +15612="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15612="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15612="notbobnotbobnotboo": 12 +15612="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15613="Anotbobnotbobnotboo": 7,13 +15613="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15613="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15613="notbobnotbobnotboo": 12 +15613="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15613="-----\nnotbob": 12 +15613="\nnotbob": 7 +15614="Anotbobnotbobnotboo": 7,13 +15614="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15614="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15614="notbobnotbobnotboo": 12 +15614="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15615="Anotbobnotbobnotboo": 13 +15615="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15615="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15615="notbobnotbobnotboo": 12 +15615="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15616="Anotbobnotbobnotboo": 13 +15616="Anotbobnotbobnotnotbarnotbobnotbar": 13 +15616="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41 +15616="notbobnotbobnotboo": 12 +15616="notbobnotbobnotnotbarnotbobnotbar": 12 +15617="Anotbobnotbobnotboo": 13 +15617="Anotbobnotbobnotnotbarnotbobnotbar": 13 +15617="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12 +15617="notbobnotbobnotboo": 12 +15617="notbobnotbobnotnotbarnotbobnotbar": 12 +15618="Anotbobnotbobnotboo": 7,13 +15618="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15618="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15618="notbobnotbobnotboo": 6,12 +15618="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15619="Anotbobnotbobnotboo": 7,13 +15619="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15619="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15619="notbobnotbobnotboo": 6,12 +15619="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15619="\nnotbob": 7 +15620="Anotbobnotbobnotboo": 7,13 +15620="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15620="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15620="notbobnotbobnotboo": 6,12 +15620="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15621="Anotbobnotbobnotboo": +15621="Anotbobnotbobnotnotbarnotbobnotbar": +15621="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15621="notbobnotbobnotboo": 6,12 +15621="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15622="Anotbobnotbobnotboo": +15622="Anotbobnotbobnotnotbarnotbobnotbar": +15622="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15622="notbobnotbobnotboo": 6,12 +15622="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15623="Anotbobnotbobnotboo": 7,13 +15623="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15623="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15623="notbobnotbobnotboo": 12 +15623="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15624="Anotbobnotbobnotboo": 7,13 +15624="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15624="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15624="notbobnotbobnotboo": +15624="notbobnotbobnotnotbarnotbobnotbar": +15625="Anotbobnotbobnotboo": 7,13 +15625="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15625="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15625="notbobnotbobnotboo": +15625="notbobnotbobnotnotbarnotbobnotbar": +15626="Anotbobnotbobnotboo": 13 +15626="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15626="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15626="notbobnotbobnotboo": 12 +15626="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15627="Anotbobnotbobnotboo": +15627="Anotbobnotbobnotnotbarnotbobnotbar": +15627="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15627="notbobnotbobnotboo": 12 +15627="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15628="Anotbobnotbobnotboo": +15628="Anotbobnotbobnotnotbarnotbobnotbar": +15628="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15628="notbobnotbobnotboo": 12 +15628="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15629="Anotbobnotbobnotboo": 7,13 +15629="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15629="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15629="notbobnotbobnotboo": 6,12 +15629="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15630="Anotbobnotbobnotboo": 7,13 +15630="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15630="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15630="notbobnotbobnotboo": 6,12 +15630="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15631="Anotbobnotbobnotboo": 7,13 +15631="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15631="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15631="notbobnotbobnotboo": 6,12 +15631="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15632="Anotbobnotbobnotboo": 7,13 +15632="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15632="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15632="notbobnotbobnotboo": 12 +15632="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15633="Anotbobnotbobnotboo": 7,13 +15633="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15633="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15633="notbobnotbobnotboo": 12 +15633="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15634="Anotbobnotbobnotboo": 7,13 +15634="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15634="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15634="notbobnotbobnotboo": 12 +15634="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15635="Anotbobnotbobnotboo": 13 +15635="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15635="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15635="notbobnotbobnotboo": 12 +15635="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15636="Anotbobnotbobnotboo": 13 +15636="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15636="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15636="notbobnotbobnotboo": 12 +15636="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15637="Anotbobnotbobnotboo": 13 +15637="Anotbobnotbobnotnotbarnotbobnotbar": 13,28 +15637="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62 +15637="notbobnotbobnotboo": 12 +15637="notbobnotbobnotnotbarnotbobnotbar": 12,27 +15638="Anotbobnotbobnotboo": 7,13 +15638="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15638="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15638="notbobnotbobnotboo": 6,12 +15638="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15639="Anotbobnotbobnotboo": 7,13 +15639="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28 +15639="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62 +15639="notbobnotbobnotboo": 6,12 +15639="notbobnotbobnotnotbarnotbobnotbar": 6,12,27 +15640="Anotbobnotbobnotboo": +15640="Anotbobnotbobnotnotbarnotbobnotbar": +15640="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15640="notbobnotbobnotboo": +15640="notbobnotbobnotnotbarnotbobnotbar": +15641="Anotbobnotbobnotboo": +15641="Anotbobnotbobnotnotbarnotbobnotbar": +15641="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15641="notbobnotbobnotboo": +15641="notbobnotbobnotnotbarnotbobnotbar": +15642="Anotbobnotbobnotboo": +15642="Anotbobnotbobnotnotbarnotbobnotbar": +15642="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15642="notbobnotbobnotboo": +15642="notbobnotbobnotnotbarnotbobnotbar": +15643="Anotbobnotbobnotboo": +15643="Anotbobnotbobnotnotbarnotbobnotbar": +15643="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15643="notbobnotbobnotboo": +15643="notbobnotbobnotnotbarnotbobnotbar": +15644="Anotbobnotbobnotboo": +15644="Anotbobnotbobnotnotbarnotbobnotbar": +15644="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15644="notbobnotbobnotboo": +15644="notbobnotbobnotnotbarnotbobnotbar": +15645="Anotbobnotbobnotboo": +15645="Anotbobnotbobnotnotbarnotbobnotbar": +15645="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15645="notbobnotbobnotboo": +15645="notbobnotbobnotnotbarnotbobnotbar": +15646="Anotbobnotbobnotboo": +15646="Anotbobnotbobnotnotbarnotbobnotbar": +15646="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15646="notbobnotbobnotboo": +15646="notbobnotbobnotnotbarnotbobnotbar": +15647="Anotbobnotbobnotboo": +15647="Anotbobnotbobnotnotbarnotbobnotbar": +15647="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15647="notbobnotbobnotboo": +15647="notbobnotbobnotnotbarnotbobnotbar": +15648="Anotbobnotbobnotboo": +15648="Anotbobnotbobnotnotbarnotbobnotbar": +15648="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15648="notbobnotbobnotboo": +15648="notbobnotbobnotnotbarnotbobnotbar": +15649="Anotbobnotbobnotboo": +15649="Anotbobnotbobnotnotbarnotbobnotbar": +15649="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15649="notbobnotbobnotboo": +15649="notbobnotbobnotnotbarnotbobnotbar": +15650="Anotbobnotbobnotboo": +15650="Anotbobnotbobnotnotbarnotbobnotbar": +15650="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15650="notbobnotbobnotboo": +15650="notbobnotbobnotnotbarnotbobnotbar": +15651="Anotbobnotbobnotboo": +15651="Anotbobnotbobnotnotbarnotbobnotbar": +15651="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15651="notbobnotbobnotboo": +15651="notbobnotbobnotnotbarnotbobnotbar": +15652="Anotbobnotbobnotboo": +15652="Anotbobnotbobnotnotbarnotbobnotbar": +15652="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15652="notbobnotbobnotboo": +15652="notbobnotbobnotnotbarnotbobnotbar": +15653="Anotbobnotbobnotboo": +15653="Anotbobnotbobnotnotbarnotbobnotbar": +15653="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15653="notbobnotbobnotboo": +15653="notbobnotbobnotnotbarnotbobnotbar": +15654="Anotbobnotbobnotboo": +15654="Anotbobnotbobnotnotbarnotbobnotbar": +15654="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15654="notbobnotbobnotboo": +15654="notbobnotbobnotnotbarnotbobnotbar": +15655="Anotbobnotbobnotboo": +15655="Anotbobnotbobnotnotbarnotbobnotbar": +15655="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15655="notbobnotbobnotboo": +15655="notbobnotbobnotnotbarnotbobnotbar": +15656="Anotbobnotbobnotboo": +15656="Anotbobnotbobnotnotbarnotbobnotbar": +15656="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15656="notbobnotbobnotboo": +15656="notbobnotbobnotnotbarnotbobnotbar": +15657="Anotbobnotbobnotboo": +15657="Anotbobnotbobnotnotbarnotbobnotbar": +15657="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15657="notbobnotbobnotboo": +15657="notbobnotbobnotnotbarnotbobnotbar": +15658="Anotbobnotbobnotboo": +15658="Anotbobnotbobnotnotbarnotbobnotbar": +15658="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15658="notbobnotbobnotboo": +15658="notbobnotbobnotnotbarnotbobnotbar": +15659="Anotbobnotbobnotboo": +15659="Anotbobnotbobnotnotbarnotbobnotbar": +15659="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15659="notbobnotbobnotboo": +15659="notbobnotbobnotnotbarnotbobnotbar": +15660="Anotbobnotbobnotboo": +15660="Anotbobnotbobnotnotbarnotbobnotbar": +15660="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15660="notbobnotbobnotboo": +15660="notbobnotbobnotnotbarnotbobnotbar": +15661="Anotbobnotbobnotboo": +15661="Anotbobnotbobnotnotbarnotbobnotbar": +15661="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15661="notbobnotbobnotboo": +15661="notbobnotbobnotnotbarnotbobnotbar": +15662="Anotbobnotbobnotboo": +15662="Anotbobnotbobnotnotbarnotbobnotbar": +15662="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15662="notbobnotbobnotboo": +15662="notbobnotbobnotnotbarnotbobnotbar": +15663="Anotbobnotbobnotboo": +15663="Anotbobnotbobnotnotbarnotbobnotbar": +15663="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15663="notbobnotbobnotboo": +15663="notbobnotbobnotnotbarnotbobnotbar": +15664="Anotbobnotbobnotboo": +15664="Anotbobnotbobnotnotbarnotbobnotbar": +15664="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15664="notbobnotbobnotboo": +15664="notbobnotbobnotnotbarnotbobnotbar": +15665="Anotbobnotbobnotboo": +15665="Anotbobnotbobnotnotbarnotbobnotbar": +15665="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15665="notbobnotbobnotboo": +15665="notbobnotbobnotnotbarnotbobnotbar": +15666="Anotbobnotbobnotboo": +15666="Anotbobnotbobnotnotbarnotbobnotbar": +15666="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15666="notbobnotbobnotboo": +15666="notbobnotbobnotnotbarnotbobnotbar": +15667="Anotbobnotbobnotboo": +15667="Anotbobnotbobnotnotbarnotbobnotbar": +15667="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15667="notbobnotbobnotboo": +15667="notbobnotbobnotnotbarnotbobnotbar": +15668="Anotbobnotbobnotboo": +15668="Anotbobnotbobnotnotbarnotbobnotbar": +15668="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15668="notbobnotbobnotboo": +15668="notbobnotbobnotnotbarnotbobnotbar": +15669="Anotbobnotbobnotboo": +15669="Anotbobnotbobnotnotbarnotbobnotbar": +15669="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15669="notbobnotbobnotboo": +15669="notbobnotbobnotnotbarnotbobnotbar": +15670="Anotbobnotbobnotboo": +15670="Anotbobnotbobnotnotbarnotbobnotbar": +15670="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15670="notbobnotbobnotboo": +15670="notbobnotbobnotnotbarnotbobnotbar": +15671="Anotbobnotbobnotboo": +15671="Anotbobnotbobnotnotbarnotbobnotbar": +15671="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15671="notbobnotbobnotboo": +15671="notbobnotbobnotnotbarnotbobnotbar": +15672="Anotbobnotbobnotboo": +15672="Anotbobnotbobnotnotbarnotbobnotbar": +15672="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15672="notbobnotbobnotboo": +15672="notbobnotbobnotnotbarnotbobnotbar": +15673="Anotbobnotbobnotboo": +15673="Anotbobnotbobnotnotbarnotbobnotbar": +15673="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15673="notbobnotbobnotboo": +15673="notbobnotbobnotnotbarnotbobnotbar": +15674="Anotbobnotbobnotboo": +15674="Anotbobnotbobnotnotbarnotbobnotbar": +15674="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15674="notbobnotbobnotboo": +15674="notbobnotbobnotnotbarnotbobnotbar": +15675="Anotbobnotbobnotboo": +15675="Anotbobnotbobnotnotbarnotbobnotbar": +15675="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15675="notbobnotbobnotboo": +15675="notbobnotbobnotnotbarnotbobnotbar": +15675:----notbobnoQ--bar +15675:-----notbobnoQ-bar +15675:---------notbobnoQbar +15675:---------notbobnotbobnoQbar +15676="Anotbobnotbobnotboo": +15676="Anotbobnotbobnotnotbarnotbobnotbar": +15676="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15676="notbobnotbobnotboo": +15676="notbobnotbobnotnotbarnotbobnotbar": +15677="Anotbobnotbobnotboo": +15677="Anotbobnotbobnotnotbarnotbobnotbar": +15677="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15677="notbobnotbobnotboo": +15677="notbobnotbobnotnotbarnotbobnotbar": +15678="Anotbobnotbobnotboo": +15678="Anotbobnotbobnotnotbarnotbobnotbar": +15678="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15678="notbobnotbobnotboo": +15678="notbobnotbobnotnotbarnotbobnotbar": +15679="Anotbobnotbobnotboo": +15679="Anotbobnotbobnotnotbarnotbobnotbar": +15679="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15679="notbobnotbobnotboo": +15679="notbobnotbobnotnotbarnotbobnotbar": +15680="Anotbobnotbobnotboo": +15680="Anotbobnotbobnotnotbarnotbobnotbar": +15680="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,56 +15680="notbobnotbobnotboo": +15680="notbobnotbobnotnotbarnotbobnotbar": +15680="\n\r\xd5\xe7E<\xd6\xa6\xc4\xd4\x19fl\xe6\xae\xf1\x9f\x96\x9b\x18\x84\x99\x8ar4\x00\xcf*\xe9Fc\x87\xd2:p\x97v\xc6\xbd\xbb\x1b": 40,41 +15680="\nV\xaf \x99.<\x918\xc0\xed\xa2\xcf\xf1aA\xaf6{\x8c?\n$\x9c@K\x8d\x9b\xaeHU/\x9e\x04O72\x8b\xc8kK": 40,41 +15681="Anotbobnotbobnotboo": +15681="Anotbobnotbobnotnotbarnotbobnotbar": +15681="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,56 +15681="notbobnotbobnotboo": +15681="notbobnotbobnotnotbarnotbobnotbar": +15681="\ny\xfe\x9c\x84\xef\xdar\x19\xc4\xb3\x96\x9c\xca7f\xed\xe1\x88~\xf2\"\x18MH\x85\xb8\xe7)xn\xfd\xf1\xec\x9a\xf6\xdd\xf4\xe8v\xb9": 40,41 +15682="Anotbobnotbobnotboo": +15682="Anotbobnotbobnotnotbarnotbobnotbar": +15682="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40 +15682="notbobnotbobnotboo": +15682="notbobnotbobnotnotbarnotbobnotbar": +15683="Anotbobnotbobnotboo": +15683="Anotbobnotbobnotnotbarnotbobnotbar": +15683="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68 +15683="notbobnotbobnotboo": +15683="notbobnotbobnotnotbarnotbobnotbar": +15684="Anotbobnotbobnotboo": +15684="Anotbobnotbobnotnotbarnotbobnotbar": +15684="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15684="notbobnotbobnotboo": +15684="notbobnotbobnotnotbarnotbobnotbar": +15685="Anotbobnotbobnotboo": +15685="Anotbobnotbobnotnotbarnotbobnotbar": +15685="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15685="notbobnotbobnotboo": +15685="notbobnotbobnotnotbarnotbobnotbar": +15686="Anotbobnotbobnotboo": +15686="Anotbobnotbobnotnotbarnotbobnotbar": +15686="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15686="notbobnotbobnotboo": +15686="notbobnotbobnotnotbarnotbobnotbar": +15687="Anotbobnotbobnotboo": +15687="Anotbobnotbobnotnotbarnotbobnotbar": +15687="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15687="notbobnotbobnotboo": +15687="notbobnotbobnotnotbarnotbobnotbar": +15688="Anotbobnotbobnotboo": +15688="Anotbobnotbobnotnotbarnotbobnotbar": +15688="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15688="notbobnotbobnotboo": +15688="notbobnotbobnotnotbarnotbobnotbar": +15689="Anotbobnotbobnotboo": +15689="Anotbobnotbobnotnotbarnotbobnotbar": +15689="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": +15689="notbobnotbobnotboo": +15689="notbobnotbobnotnotbarnotbobnotbar": +15690="Anotbobnotbobnotboo": 7,13 +15690="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,22,28,34 +15690="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,22,28,35,41,47,56,62,68 +15690="notbobnotbobnotboo": 6,12 +15690="notbobnotbobnotnotbarnotbobnotbar": 6,12,21,27,33 diff --git a/tools/hscollider/test_cases/corpora/options.txt b/tools/hscollider/test_cases/corpora/options.txt new file mode 100644 index 000000000..30f80e019 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/options.txt @@ -0,0 +1,79 @@ +24500="foo bar": 7 +24500="foo\nbar": 7 +24500="foobar": 6 +24501="foo bar baz": 11 +24501="foo bar\nbaz": 11 +24501="foo\nbar baz": +24501="foobar\x01baz": 10 +24502="foo bar": 7 +24502="foo\nbar": +24502="foobar": 6 +24503="foo bar": 7 +24503="foo\nbar": +24503="foobar": 6 +24504="foo bar baz": 11 +24504="foo bar\nbaz": 11 +24504="foo\nbar baz": +24504="foo\nbar\nbaz": +24504="foo__bar\x01c___xbaz": 17 +24504="foobarbaz": 9 +24600="FOOBAR": 6 +24600="fOoBaR": 6 +24600="fooBAR": 6 +24600="foobar": 6 +24601="FOOBAR": 6 +24601="fOoBaR": 6 +24601="fooBAR": 6 +24601="foobar": 6 +24602="FOOBAR": +24602="fOoBaR": +24602="fooBAR": +24602="foobar": 6 +24603="FOOBAR": +24603="FOObar": 6 +24603="foobar": 6 +24604="FOOBAR": +24604="fooBAR": 6 +24604="foobar": 6 +24605="FOOBAR": +24605="FOObar": 6 +24605="foobar": 6 +24700="__foobar": 8 +24700="firstline\nfoobar\nfoobar": 16,23 +24700="foobar": 6 +24701="__foobar": 8 +24701="firstline\nfoobar\nfoobar": 23 +24701="foobar": 6 +24800="foo bar": +24800="foobar": 6 +24801="foo bar baz": +24801="foobar baz": 10 +24801="foobarbaz": +24900="firstline\nfoobarbaz": 19 +24900="foo\nbar\nbaz": 11 +24900="foobarbaz": 9 +24901="ABBREVIATION": 6,12 +24901="aBBr": +24901="abbrev": 6 +24901="abbreviation": 6,12 +24902="foo\nBAR": 7 +24902="foo\nbaR": 7 +24902="foo_bar": 7 +24903="foo\nBAR": +24903="foo\nbaR": +24903="foo_bar": 7 +24904="fooBaRbaz": 9 +24904="foobarBAZ": +24905="nestedCASELESScaSEfulCASELESSliteral": +24905="nestedCASELESScasefulCASELESSliteral": 36 +24905="nestedcaselesscasefulcaselessliteral": 36 +24906="ab aB ac aC": 2,5,8,11 +24907="hatstand teakettle HATSTAND TEAKETTLE Hatstand Teakettle": 8,18,27,37,46,56 +24908="foo BAR baz bing": 16 +24908="foo BAR\nbaz bing": +24908="foo bar baz bing": 16 +24908="foo bar\nbaz bing": +24908="foo\nBAR baz\nbing": 16 +24908="foo\nBAR\nbaz\nbing": +24908="foo\nbar baz\nbing": 16 +24908="foo\nbar\nbaz\nbing": diff --git a/tools/hscollider/test_cases/corpora/passthrough.txt b/tools/hscollider/test_cases/corpora/passthrough.txt new file mode 100644 index 000000000..b05ca5853 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/passthrough.txt @@ -0,0 +1,66 @@ +9000="abc": +9000="abcdef": +9000="abcxxx": 6 +9000="abcyyyy": 7 +9000="defxxx": 6 +9000="defyyyy": 7 +9000="abcdefxxxyyy": 9 +9001="abc": +9001="abcdef": +9001="abcxxx": 6 +9001="abcyyyy": 7 +9001="defxxx": 6 +9001="defyyyy": 7 +9001="abcdefxxxyyy": +9001="qabc": +9001="qabcdef": +9001="qabcxxx": +9001="qabcyyyy": +9001="qdefxxx": +9001="qdefyyyy": +9001="qabcdefxxxyyy": +9001="abcabc": +9001="abcabcdef": +9001="abcabcxxx": +9001="abcabcyyyy": +9001="abcdefxxx": +9001="abcdefyyyy": +9001="abdabcdefxxxyyy": +9002="anchoredXXX": 11 +9002="NOTyanchoredXXX": +9002="anchoredYYY": 11 +9002="NOTanchoredYYY": +9002="floatingXXX": 11 +9002="floatingYYY": 11 +9002="XXXXXfloatingXXX": 16 +9002="XXXXXfloatingYYY": 16 +9005="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 40 +9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 41 +9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 42 +9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 43 +9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 44 +9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 167 +9005="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +9006="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 48 +9006=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 49 +9006="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 48,49,50,51,52,53,54,55,56,57,58,59,60 +9007="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 49 +9007=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 50 +9007="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 49,50,51,52,53,54,55,56,57,58,59,60 +9008="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 50 +9008=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 51 +9008="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 50,51,52,53,54,55,56,57,58,59,60 +9009="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 1000 +9009=" qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 1034 +9009=" qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 1034,1035,1036 +9009=" qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": +9010="coagulateshyperinnervationagitationreassuranceexchangeability": 61 +9010="coagulateshyperinnervationagitationreassuranceexchangeabilitycoagulateshyperinnervationagitationreassuranceexchangeability": 61,122 +9010=" coagulateshyperinnervationagitationreassuranceexchangeability": 84 +9010="_oagulateshyperinnervationagitationreassuranceexchangeability": +9010="coagulateshyperinnervationagitationreassuranceexchangeabilit_": +9011="nonplasticerythematoussnakebitesjubilatedworklessnesses": 55 +9011="nonplasticerythematoussnakebitesjubilatedworklessnessesnonplasticerythematoussnakebitesjubilatedworklessnesses": 55,110 +9011=" nonplasticerythematoussnakebitesjubilatedworklessnesses": 62 +9011="_onplasticerythematoussnakebitesjubilatedworklessnesses": +9011="nonplasticerythematoussnakebitesjubilatedworklessnesse_": diff --git a/tools/hscollider/test_cases/corpora/prefilter.txt b/tools/hscollider/test_cases/corpora/prefilter.txt new file mode 100644 index 000000000..320621be6 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/prefilter.txt @@ -0,0 +1,271 @@ +90000="foo": 3 +90000="foobar": +90000="foofoobar": 3 +90000="foobarfoobar": +90000="foofoofoo": 3,6,9 +90001="foo": +90001="foobaz": 6 +90001="foo baz": 7 +90001="foo baz": 9 +90001="foobabaz": 8 +90001="foobarbaz": +90001="foo barbaz": 10 +90001="foobar baz": +90002="bar": 3 +90002="foobar": +90002="foo bar": 7 +90002="barbar": 3,6 +90002="foobarbar": 9 +90003="foo": +90003="foo_____": +90003="foobar": 3 +90003="foo bar": 4 +90003="foo foo bar": 8 +90200="sense and sensibility": 21 +90200="response and responsibility": 27 +90200="sense and responsibility": +90200="response and sensibility": +90201="rah rah": 7 +90201="RAH RAH": 7 +90201="rah RAH": +90201="RAH rah": +90202="111": +90202="111 112": +90202="111 111": 12 +90202="111111": 6 +90202="111\n111": +90202="012 012": 7 +90202="999 999": 33 +90202="999 000 999": 58 +90203="this is a quoted string": +90203="this is a \"quoted string\"": 25 +90203="this is a 'quoted string'": 25 +90203="this is a \"quoted string'": +90203="this is a 'quoted string\"": +90204="blah": +90204="blah": +90204="bold italic": 25 +90205="foobar": +90205="foofoo": 6 +90205="barbar": 6 +90205="foofoofoobarfoofoobarbar": 6,9,15,18,21,24 +90205="foo___________bar______foo__________bar": 26,39 +90205="barfoo": +90205="foobarfoobar": 9,12 +90206="barfoo": +90206="foofoofoobarfoofoobarbar": 6,9,18,21,24 +90206="foofoo": 6 +90206="barbar": 6 +90206="foobarfoobar": 12 +90206="foo___________bar______foo__________bar": +90206="foobar": +90300="abcc": 4 +90300="abc": +90300="ac": +90320="possessive": +90320="possessive 0123": 15 +90320="possessive 01234": 16 +90320="possessive 0123456": 18 +90320="possessive 0123456789": 21 +90320="possessive 012": 14 +90320="possessive 012345": 17 +90320="possessive 0": 12 +90320="possessive 01": 13 +90321="possessive": +90321="possessive 0123": 15 +90321="possessive 01234": 16 +90321="possessive 012345": 17 +90321="possessive 0123456": 18 +90321="possessive 0123456789": 21 +90321="possessive 012": 14 +90321="possessive 01": 13 +90321="possessive 0": 12 +90322="possessive": +90322="possessive 0": 12 +90322="possessive 01": 12 +90323="possessive": +90323="possessive 0": +90323="possessive 01": +90323="possessive 012": +90323="possessive 01234": 15 +90323="possessive 0123": 15 +90323="possessive 012345": 15 +90323="possessive 0123456": 15 +90323="possessive 0123456789": 15 +90324="possessive": +90324="possessive 0123456": 18 +90324="possessive 012": +90324="possessive 0": +90324="possessive 01234567": 19 +90324="possessive 0123": +90324="possessive 0123456789": 21 +90324="possessive 012345678": 20 +90324="possessive 01234": +90324="possessive 012345": 17 +90324="possessive 01": +90325="possessive 012345678": +90325="possessive 01234567890": 22 +90325="possessive 0123456789012345678": 30 +90325="possessive 0123456789012": 24 +90325="possessive 012345678901": 23 +90325="possessive 01234567890123": 25 +90325="possessive 012345678901234": 26 +90325="possessive 0123456789": 21 +90325="possessive 0123456789012345": 27 +90325="possessive 0123456789012345678901": 31 +90325="possessive 012345678901234567": 29 +90325="possessive 01234567890123456789": 31 +90325="possessive 01234567890123456": 28 +90325="possessive 012345678901234567890": 31 +90207="aateakettlea": 12 +90207="aateakettleb": +90207="abteakettleb": 12 +90207="acteakettlec": 12 +90207="acteakettlecc": 12 +90207="aateakettlecc": +90208="aateakettlea": 12 +90208="aateakettleb": +90208="abteakettleb": 12 +90208="acteakettlec": 12 +90208="acteakettlecc": 12 +90208="aateakettlecc": +90208="____abcabcabcabcteakettleabcabcabcabc_": 28, 31, 34, 37 +90208="____abcabcabcabcteakettleabcabcabcab__": 28, 31, 34 + +90210="_0backref0": 10 +90210="_0backref3": +90210="_3backref3": 10 +90210="_9backref": +90210="_9backref9": 10 +90210="_backref0": +90211="_0backref0": 10 +90211="_0backref3": +90211="_3backref3": 10 +90211="_9backref": +90211="_9backref9": 10 +90211="_backref0": +90212="_0backref0": 10 +90212="_0backref3": +90212="_3backref3": 10 +90212="_9backref": +90212="_9backref9": 10 +90212="_backref0": +90213="_0backref0": 10 +90213="_0backref3": +90213="_3backref3": 10 +90213="_9backref": +90213="_9backref9": 10 +90213="_backref0": +90209="a_aaa": 5 +90209="a_aba": +90209="f_ffff_f_ffff_ff_": 5, 12 +90207="aateakettlea": 12 +90207="aateakettleb": +90207="abteakettleb": 12 +90207="acteakettlec": 12 +90207="acteakettlecc": 12 +90207="aateakettlecc": +90208="aateakettlea": 12 +90208="aateakettleb": +90208="abteakettleb": 12 +90208="acteakettlec": 12 +90208="acteakettlecc": 12 +90208="aateakettlecc": +90208="____abcabcabcabcteakettleabcabcabcabc_": 28, 31, 34, 37 +90208="____abcabcabcabcteakettleabcabcabcab__": 28, 31, 34 + +90210="_0backref0": 10 +90210="_0backref3": +90210="_3backref3": 10 +90210="_9backref": +90210="_9backref9": 10 +90210="_backref0": +90211="_0backref0": 10 +90211="_0backref3": +90211="_3backref3": 10 +90211="_9backref": +90211="_9backref9": 10 +90211="_backref0": +90212="_0backref0": 10 +90212="_0backref3": +90212="_3backref3": 10 +90212="_9backref": +90212="_9backref9": 10 +90212="_backref0": +90213="_0backref0": 10 +90213="_0backref3": +90213="_3backref3": 10 +90213="_9backref": +90213="_9backref9": 10 +90213="_backref0": +90209="a_aaa": 5 +90209="a_aba": +90209="f_ffff_f_ffff_ff_": 5, 12 +90400="a apple": 2 +90400="a pine": 2 +90400="a pineapple": 2,11 +90401="a melon": +90401="a orange": 8 +90401="a watermelon": 12 +90401="a waterorange": +90402="guinea pig": +90402="guinea pig party": 11 +90402="hamster": +90402="hamster party": 13 +90403="guinea pig": +90403="guinea pig nothing": 18 +90403="guinea pig party": +90403="hamster": +90403="hamster nothing": +90403="hamster party": 13 +90403=" nothing": +90403="nothing": +90404="guinea pig": +90404="guinea pig nothing": 18 +90404="guinea pig party": +90404="hamster": +90404="hamster nothing": +90404="hamster party": 13 +90404=" nothing": +90404="nothing": +90405="guinea pig": +90405="guinea pig nothing": 18 +90405="guinea pig party": +90405="hamster": +90405="hamster nothing": +90405="hamster party": 13 +90405=" nothing": +90405="nothing": +90406="water field": 11 +90406="water-buffalo field": 19 +90406="water-buffalo": +90407="jabber": 6 +90407="jabberwocky": 6 +90408="goodbye": 3 +90408="hell": 3 +90408="hello": 1,2,3,4,5 +90409="goodbye and hello": 1,2,3,4,5,6,7 +90409="hello": 3 +90410="badgerbrush": +90410="foobar": +90410="hatstand": +90410="hatstandbadgerbrush": +90410="hatstandteakettle": 17 +90410="notbadgerbrush": 14 +90411="badgerbrush": +90411="foobar": +90411="hatstand": +90411="hatstandbadgerbrush": 19 +90411="hatstandteakettle": +90411="notbadgerbrush": +90413="abdbbbCCdAeaaadCdbaddaaCCbaCCbEeaaabadbaabddEdeDadCCEdeDadadbddCCAeacCbbdbdaCCdddCCaCCdAeabcCbdbbddddCCCdbaCCbEeaacCaadddbdbdbaadCCCCbbddddbaCCEeabbdCdCCCCbddadddbadbddCCEeaaCCadCdCCadbCCbAeabbdbdddbdabdaadbbaEeaaabadbdbbdaCCabdbAeaabadadddddCCdaadAeacCcCdbddaddaAeaaabdabCCbbdadbddbdddbCCEeaaaaadbadCCdbbddddddaEeaaaabdbadbbddbadbdddCCbbdEea": 12,13,14,33,34,35,68,90,113,114,146,173,174,191,212,213,214,232,233,251,266,267,268,292,293,294,295,296,315,316,317,318,342 +90413="CCdadabCCddddabddEdeDadbadbaCCabbadaaAeaa": 40,41 +90413="CCdadaaCCddddabdabdbCCbadbaddCCCCdddAea": 39 +90414="qq_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a": 602 +90414="qqa_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a__a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a": 602 +90414="qqa_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_": 602 +90415="prefix00112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900": 606 +90415="prefix_______________________________99_____________________________________________________________________________________________________________01________________________________________________________________________________________________________________________________________________________________": 308 +90415="prefix____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________": 306 +90416:afooafooAfooAfooaFOOa +90417:dDcB\xf3\xb9\xa5\x8eAcDDe diff --git a/tools/hscollider/test_cases/corpora/priority.txt b/tools/hscollider/test_cases/corpora/priority.txt new file mode 100644 index 000000000..0190571b9 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/priority.txt @@ -0,0 +1,1123 @@ +14001="aab": 3 +14001="aabb": 3,4 +14001="aabbbbbbb": 3,4,5,6,7,8,9 +14002="aaaaabbbbbbbb": 6,7,8,9,10,11,12,13 +14003="abc": 3 +14003="abcd": 3,4 +14003="abcde": 3,4,5 +14003="abcdeabcde": 3,4,5,8,9,10 +14004="ab": 2 +14004="aab": 3 +14004="aabb": 3,4 +14004="aaaaaabbbbbbbb": 7,8,9,10,11,12,13,14 +14005="fooabcbar": 9 +14005="foobar": 6 +14005="fooabcdbar": 10 +14005="fooabcdebar": 11 +14006="afgz": 4 +14006="ahiz": 4 +14006="az": 2 +14007="afoobb": 5,6 +14007="abb": 2,3 +14008="abc": +14008="abbc": 4 +14008="abbbc": 5 +14009="abc": +14009="abbc": 4 +14009="abbbc": 5 +14010="az": +14010="atttz": 5 +14010="attttz": +14010="atttttz": +14010="attttttz": 8 +14010="atttttttttz": 11 +14011="az": +14011="atttz": 5 +14011="attttz": +14011="atttttz": +14011="attttttz": 8 +14011="atttttttttz": 11 +14012="az": 2 +14012="atttz": 5 +14012="attttz": +14012="atttttz": +14012="attttttz": 8 +14012="atttttttttz": 11 +14013="ab": 2 +14013="abb": 2,3 +14013="abbb": 2,3,4 +14013="abbbb": 2,3,4,5 +14013="abbbbb": 2,3,4,5,6 +14013="abbbbab": 2,3,4,5,7 +14014="ab": 2 +14014="abb": 2,3 +14014="abbb": 2,3,4 +14014="abbbb": 2,3,4,5 +14014="abbbbb": 2,3,4,5,6 +14014="abbbbab": 2,3,4,5 +14015="b": +14015="ab": 2 +14015="aab": 3 +14015="aaab": 4 +14016="b": 1 +14016="ab": 2 +14016="aab": 3 +14016="aaab": 4 +14017="qaaaq": 5 +14017="qq": 2 +14017="qaq": 3 +14017="qbbq": 4 +14017="qbaq": 4 +14017="qbq": 3 +14018="qq": 2 +14018="qaq": 3 +14018="qaaq": 4 +14019="qq": 2 +14019="qaq": 3 +14019="qaaq": 4 +14020="abb": 3 +14020="bb": 2 +14020="aabb": 4 +14021="abb": 3 +14021="bb": 2 +14021="aabb": 4 +14022="qq": 2 +14022="qaq": 3 +14022="qaaaq": 5 +14022="qaaaaaaq": 8 +14022="qaabaabq": 8 +14023="qaaaq": 5 +14023="qq": 2 +14023="qabq": 4 +14023="qaaq": 4 +14024="q": 1 +14024="qa": 1,2 +14024="qaa": 1,2,3 +14024="qaaa": 1,2,3,4 +14024="qaaaa": 1,2,3,4 +14025="foo:foo:afoo:~foo:%foo:[foo:aaa": 13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 +14025="foo:foo:foo:foo:foo:foo:yyy": 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 +14025="foo: foo: foo: foo: foo: foo: foo:yyyy": 14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38 +14026="foobar": 6 +14026="fooxbar": 7 +14026="fooxxbar": 8 +14026="fooxxxbar": 9 +14026="fooxxxxbar": 10 +14026="fooxxxxxbar": 11 +14026="fooxxxxxxxxxxbar": 16 +14026="fooxxxxxxxxxxxbar": +14026="foobarbarbarbarbarbar": 6,9,12,15 +14026="foofoofoofoofoofoobar": 21 +14026="foobarfoobarfoobarfoobar": 6,12,18,24 +14027="foobar": 6 +14027="fooxbar": 7 +14027="fooxxbar": 8 +14027="fooxxxbar": 9 +14027="fooxxxxbar": 10 +14027="fooxxxxxbar": 11 +14027="fooxxxxxxxxxxbar": 16 +14027="fooxxxxxxxxxxxbar": +14027="foobarbarbarbarbarbar": 6,9,12,15 +14027="foofoofoofoofoofoobar": 21 +14027="foobarfoobarfoobarfoobar": 6,12,18,24 +14028="foobar": +14028="fooxbar": 7 +14028="fooxxbar": 8 +14028="fooxxxbar": 9 +14028="fooxxxxbar": 10 +14028="fooxxxxxbar": 11 +14028="fooxxxxxxxxxxbar": 16 +14028="fooxxxxxxxxxxxbar": +14028="foobarbarbarbarbarbar": 9,12,15 +14028="foofoofoofoofoofoobar": 21 +14028="foobarfoobarfoobarfoobar": 12,18,24 +14029="foobar": +14029="fooxbar": 7 +14029="fooxxbar": 8 +14029="fooxxxbar": 9 +14029="fooxxxxbar": 10 +14029="fooxxxxxbar": 11 +14029="fooxxxxxxxxxxbar": 16 +14029="fooxxxxxxxxxxxbar": +14029="foobarbarbarbarbarbar": 9,12,15 +14029="foofoofoofoofoofoobar": 21 +14029="foobarfoobarfoobarfoobar": 12,18,24 +14030="foobar": +14030="fooxbar": +14030="fooxxbar": +14030="fooxxxbar": +14030="fooxxxxbar": +14030="fooxxxxxbar": +14030="fooxxxxxxxxxxbar": 16 +14030="fooxxxxxxxxxxxbar": +14030="foobarbarbarbarbarbar": +14030="foofoofoofoofoofoobar": +14030="foobarfoobarfoobarfoobar": +14031="foobar": +14031="fooxbar": +14031="fooxxbar": +14031="fooxxxbar": +14031="fooxxxxbar": +14031="fooxxxxxbar": +14031="fooxxxxxxxxxxbar": 16 +14031="fooxxxxxxxxxxxbar": +14031="foobarbarbarbarbarbar": +14031="foofoofoofoofoofoobar": +14031="foobarfoobarfoobarfoobar": +14032="foobar": 6 +14032="fooxbar": 7 +14032="fooxxbar": 8 +14032="fooxxxbar": 9 +14032="fooxxxxbar": 10 +14032="fooxxxxxbar": 11 +14032="fooxxxxxxxxxxbar": 16 +14032="fooxxxxxxxxxxxbar": +14032="foobarbarbarbarbarbar": 6,9,12,15 +14032="foofoofoofoofoofoobar": 21 +14032="foobarfoobarfoobarfoobar": 6,12,18,24 +14033="foobar": 6 +14033="fooxbar": 7 +14033="fooxxbar": 8 +14033="fooxxxbar": 9 +14033="fooxxxxbar": 10 +14033="fooxxxxxbar": 11 +14033="fooxxxxxxxxxxbar": 16 +14033="fooxxxxxxxxxxxbar": +14033="foobarbarbarbarbarbar": 6,9,12,15 +14033="foofoofoofoofoofoobar": 21 +14033="foobarfoobarfoobarfoobar": 6,12,18,24 +14034="foobar": 6 +14034="fooxbar": 7 +14034="fooxxbar": 8 +14034="fooxxxbar": 9 +14034="fooxxxxbar": 10 +14034="fooxxxxxbar": 11 +14034="fooxxxxxxxxxxbar": 16 +14034="fooxxxxxxxxxxxbar": +14034="foobarbarbarbarbarbar": 6,9,12,15 +14034="foofoofoofoofoofoobar": 21 +14034="foobarfoobarfoobarfoobar": 6,12,18,24 +14035="foobar": 6 +14035="fooxbar": 7 +14035="fooxxbar": 8 +14035="fooxxxbar": 9 +14035="fooxxxxbar": 10 +14035="fooxxxxxbar": 11 +14035="fooxxxxxxxxxxbar": 16 +14035="fooxxxxxxxxxxxbar": +14035="foobarbarbarbarbarbar": 6,9,12,15 +14035="foofoofoofoofoofoobar": 21 +14035="foobarfoobarfoobarfoobar": 6,12,18,24 +14036="foobar": +14036="fooxbar": +14036="fooxxbar": +14036="fooxxxbar": +14036="fooxxxxbar": +14036="fooxxxxxbar": +14036="fooxxxxxxxxxxbar": 16 +14036="fooxxxxxxxxxxxbar": 17 +14036="foobarbarbarbarbarbar": 18,21 +14036="foofoofoofoofoofoobar": 21 +14036="foobarfoobarfoobarfoobar": 18,24 +14037="foobar": +14037="fooxbar": +14037="fooxxbar": +14037="fooxxxbar": +14037="fooxxxxbar": +14037="fooxxxxxbar": +14037="fooxxxxxxxxxxbar": 16 +14037="fooxxxxxxxxxxxbar": 17 +14037="foobarbarbarbarbarbar": 18,21 +14037="foofoofoofoofoofoobar": 21 +14037="foobarfoobarfoobarfoobar": 18,24 +14038="foobar": 3 +14039="foobar": 3 +14040="foobar": 3 +14041="foobar": 3 +14042="foobar": 6 +14043="foobar": 6 +14044="foobar": 6 +14045="foobar": 6 +14046="foobar": 6 +14047="foobar": 6 +14048="foobar": 6 +14049="foobar": 6 +14050="ccbc": 1,2,4 +14050="cba": 1 +14050="cccccc": 1,2,3,4,5,6 +14050="bc": 2 +14051="ccbc": 1,2,4 +14051="cba": 1 +14051="cccccc": 1,2,3,4,5,6 +14051="bc": 2 +14052="ccbc": 1,2,4 +14052="cba": 1 +14052="cccccc": 1,2,3,4,5,6 +14052="bc": 2 +14053="ccbc": 1,2,4 +14053="cba": 1 +14053="cccccc": 1,2,3,4,5,6 +14053="bc": 2 +14054="ccbc": 1,2,4 +14054="cba": 1 +14054="cccccc": 1,2,3,4,5,6 +14054="bc": 2 +14055="ccbc": 1,2,4 +14055="cba": 1 +14055="cccccc": 1,2,3,4,5,6 +14055="bc": 2 +14056="ccbc": 1,2,4 +14056="cba": 1 +14056="cccccc": 1,2,3,4,5,6 +14056="bc": 2 +14057="ccbc": 1,2,4 +14057="cba": 1 +14057="cccccc": 1,2,3,4,5,6 +14057="bc": 2 +14058="ccbc": 1,2,4 +14058="cba": 1 +14058="cccccc": 1,2,3,4,5,6 +14058="bc": 2 +14059="ccbc": 1,2,4 +14059="cba": 1 +14059="cccccc": 1,2,3,4,5,6 +14059="bc": 2 +14060="ST": 2 +14060="SaT": 3 +14060="SaaT": 4 +14060="SaaaT": 5 +14060=";a;": +14060=";aaa;": +14060=";aaaT": +14060="Saaa;": +14061="ST": 2 +14061="SaT": 3 +14061="SaaT": 4 +14061="SaaaT": 5 +14061=";a;": +14061=";aaa;": +14061=";aaaT": +14061="Saaa;": +14062="ST": 2 +14062="SaT": 3 +14062="SaaT": 4 +14062="SaaaT": 5 +14062=";a;": +14062=";aaa;": +14062=";aaaT": +14062="Saaa;": +14063="ST": 2 +14063="SaT": 3 +14063="SaaT": 4 +14063="SaaaT": 5 +14063=";a;": +14063=";aaa;": +14063=";aaaT": +14063="Saaa;": +14064="ST": 2 +14064="SaT": 3 +14064="SaaT": 4 +14064="SaaaT": 5 +14064=";a;": +14064=";aaa;": +14064=";aaaT": 5 +14064="Saaa;": +14065="ST": 2 +14065="SaT": 3 +14065="SaaT": 4 +14065="SaaaT": 5 +14065=";a;": +14065=";aaa;": +14065=";aaaT": 5 +14065="Saaa;": +14066="ST": 2 +14066="SaT": 3 +14066="SaaT": 4 +14066="SaaaT": 5 +14066=";a;": +14066=";aaa;": +14066=";aaaT": 5 +14066="Saaa;": +14067="ST": 2 +14067="SaT": 3 +14067="SaaT": 4 +14067="SaaaT": 5 +14067=";a;": +14067=";aaa;": +14067=";aaaT": 5 +14067="Saaa;": +14068="ST": 2 +14068="SaT": +14068="SaaT": +14068="SaaaT": +14068=";a;": 3 +14068=";aaa;": +14068=";aaaT": +14068="Saaa;": +14069="ST": 2 +14069="SaT": +14069="SaaT": +14069="SaaaT": +14069=";a;": 3 +14069=";aaa;": +14069=";aaaT": +14069="Saaa;": +14070="ST": 2 +14070="SaT": +14070="SaaT": +14070="SaaaT": +14070=";a;": 3 +14070=";aaa;": +14070=";aaaT": +14070="Saaa;": +14071="ST": 2 +14071="SaT": +14071="SaaT": +14071="SaaaT": +14071=";a;": 3 +14071=";aaa;": +14071=";aaaT": +14071="Saaa;": +14072="ST": 1 +14072="SaT": 1,2 +14072="SaaT": 1,2,3 +14072="SaaaT": 1,2,3,4 +14072=";a;": +14072=";aaa;": +14072=";aaaT": +14072="Saaa;": 1,2,3 +14073="ST": 1 +14073="SaT": 1,2 +14073="SaaT": 1,2,3 +14073="SaaaT": 1,2,3,4 +14073=";a;": +14073=";aaa;": +14073=";aaaT": +14073="Saaa;": 1,2,3 +14074="ST": 1 +14074="SaT": 1,2 +14074="SaaT": 1,2,3 +14074="SaaaT": 1,2,3,4 +14074=";a;": +14074=";aaa;": +14074=";aaaT": +14074="Saaa;": 1,2,3 +14075="ST": 1 +14075="SaT": 1,2 +14075="SaaT": 1,2,3 +14075="SaaaT": 1,2,3,4 +14075=";a;": +14075=";aaa;": +14075=";aaaT": +14075="Saaa;": 1,2,3 +14076="ST": 2 +14076="SaT": 3 +14076="SaaT": 4 +14076="SaaaT": 5 +14076=";a;": +14076=";aaa;": +14076=";aaaT": +14076="Saaa;": +14077="ST": 2 +14077="SaT": 3 +14077="SaaT": 4 +14077="SaaaT": 5 +14077=";a;": +14077=";aaa;": +14077=";aaaT": +14077="Saaa;": +14078="ST": 2 +14078="SaT": 3 +14078="SaaT": 4 +14078="SaaaT": 5 +14078=";a;": +14078=";aaa;": +14078=";aaaT": +14078="Saaa;": +14079="ST": 2 +14079="SaT": 3 +14079="SaaT": 4 +14079="SaaaT": 5 +14079=";a;": +14079=";aaa;": +14079=";aaaT": +14079="Saaa;": +14080="ST": 2 +14080="SaT": 3 +14080="SaaT": 4 +14080="SaaaT": 5 +14080=";a;": +14080=";aaa;": +14080=";aaaT": 5 +14080="Saaa;": +14081="ST": 2 +14081="SaT": 3 +14081="SaaT": 4 +14081="SaaaT": 5 +14081=";a;": +14081=";aaa;": +14081=";aaaT": 5 +14081="Saaa;": +14082="ST": 2 +14082="SaT": 3 +14082="SaaT": 4 +14082="SaaaT": 5 +14082=";a;": +14082=";aaa;": +14082=";aaaT": 5 +14082="Saaa;": +14083="ST": 2 +14083="SaT": 3 +14083="SaaT": 4 +14083="SaaaT": 5 +14083=";a;": +14083=";aaa;": +14083=";aaaT": 5 +14083="Saaa;": +14084="ST": 2 +14084="SaT": +14084="SaaT": +14084="SaaaT": +14084=";a;": 3 +14084=";aaa;": +14084=";aaaT": +14084="Saaa;": +14085="ST": 2 +14085="SaT": +14085="SaaT": +14085="SaaaT": +14085=";a;": 3 +14085=";aaa;": +14085=";aaaT": +14085="Saaa;": +14086="ST": 2 +14086="SaT": +14086="SaaT": +14086="SaaaT": +14086=";a;": 3 +14086=";aaa;": +14086=";aaaT": +14086="Saaa;": +14087="ST": 2 +14087="SaT": +14087="SaaT": +14087="SaaaT": +14087=";a;": 3 +14087=";aaa;": +14087=";aaaT": +14087="Saaa;": +14088="ST": 1 +14088="SaT": 1,2 +14088="SaaT": 1,2,3 +14088="SaaaT": 1,2,3,4 +14088=";a;": +14088=";aaa;": +14088=";aaaT": +14088="Saaa;": 1,2,3 +14089="ST": 1 +14089="SaT": 1,2 +14089="SaaT": 1,2,3 +14089="SaaaT": 1,2,3,4 +14089=";a;": +14089=";aaa;": +14089=";aaaT": +14089="Saaa;": 1,2,3 +14090="ST": 1 +14090="SaT": 1,2 +14090="SaaT": 1,2,3 +14090="SaaaT": 1,2,3,4 +14090=";a;": +14090=";aaa;": +14090=";aaaT": +14090="Saaa;": 1,2,3 +14091="ST": 1 +14091="SaT": 1,2 +14091="SaaT": 1,2,3 +14091="SaaaT": 1,2,3,4 +14091=";a;": +14091=";aaa;": +14091=";aaaT": +14091="Saaa;": 1,2,3 +14092="ST": 2 +14092="SaT": 3 +14092="SaaT": 4 +14092="SaaaT": 5 +14092=";a;": +14092=";aaa;": +14092=";aaaT": 5 +14092="Saaa;": +14093="ST": 2 +14093="SaT": 3 +14093="SaaT": 4 +14093="SaaaT": 5 +14093=";a;": +14093=";aaa;": +14093=";aaaT": 5 +14093="Saaa;": +14094="ST": 2 +14094="SaT": 3 +14094="SaaT": 4 +14094="SaaaT": 5 +14094=";a;": +14094=";aaa;": +14094=";aaaT": 5 +14094="Saaa;": +14095="ST": 2 +14095="SaT": 3 +14095="SaaT": 4 +14095="SaaaT": 5 +14095=";a;": +14095=";aaa;": +14095=";aaaT": 5 +14095="Saaa;": +14096="ST": 2 +14096="SaT": +14096="SaaT": +14096="SaaaT": +14096=";a;": 3 +14096=";aaa;": +14096=";aaaT": +14096="Saaa;": +14097="ST": 2 +14097="SaT": +14097="SaaT": +14097="SaaaT": +14097=";a;": 3 +14097=";aaa;": +14097=";aaaT": +14097="Saaa;": +14098="ST": 2 +14098="SaT": +14098="SaaT": +14098="SaaaT": +14098=";a;": 3 +14098=";aaa;": +14098=";aaaT": +14098="Saaa;": +14099="ST": 2 +14099="SaT": +14099="SaaT": +14099="SaaaT": +14099=";a;": 3 +14099=";aaa;": +14099=";aaaT": +14099="Saaa;": +14100="ccbc": +14100="cba": 3 +14100="cccccc": +14100="bc": +14101="bc": 2 +14102="bc": 2 +14103="bc": 2 +14104="Xyuyyy": 1,2,3,4,5,6 +14104="Xuyyyy": 1,2,3,4,5,6 +14104="Xuuyyy": 1,2,3,4,5,6 +14105="Xyuyyy": 1,2,3,4,5,6 +14105="Xuyyyy": 1,2,3,4,5,6 +14105="Xuuyyy": 1,2,3,4,5,6 +14106="Xe_": 1,2 +14107="Xe_": 1,2 +14108="Xe_": 1,2 +14109="Xe_": 1,2 +14110="bacccX": 3,4,5 +14110="bcccX": 2,3,4 +14110="bccaX": 2,3 +14110="bcacX": 2,4 +14110="bcaccX": 2,4,5 +14111="bacccX": 3,4,5 +14111="bcccX": 2,3,4 +14111="bccaX": 2,3 +14111="bcacX": 2,4 +14111="bcaccX": 2,4,5 +14112="bacccX": 3,4,5 +14112="bcccX": 2,3,4 +14112="bccaX": 2,3 +14112="bcacX": 2,4 +14112="bcaccX": 2,4,5 +14113="bacccX": 3,4,5 +14113="bcccX": 2,3,4 +14113="bccaX": 2,3 +14113="bcacX": 2,4 +14113="bcaccX": 2,4,5 +14114="bacccX": +14114="bcccX": 5 +14115="bacccX": +14115="bcccX": 5 +14116="bacccX": +14116="bcccX": 5 +14117="abxbcd": 6 +14118="abxbcd": 6 +14118="abbcd": 5 +14119="bacccX": +14119="bcccX": 5 +14120="bacccX": +14120="bcccX": 5 +14121="bacccX": +14121="XcaccccY": 8 +14122="baaaaacacc": 7,9,10 +14122="bacccX": 3,4,5 +14122="bcccX": 2,3,4 +14122="bccaX": 2,3 +14122="bcacX": 2,4 +14123="baaaaacacc": 7,9,10 +14123="bacccX": 3,4,5 +14123="bcccX": 2,3,4 +14123="bccaX": 2,3 +14123="bcacX": 2,4 +14124="baaaaacacc": 7,9,10 +14124="bacccX": 3,4,5 +14124="bcccX": 2,3,4 +14124="bccaX": 2,3 +14124="bcacX": 2,4 +14125="baaaaacacc": 7,9,10 +14125="bacccX": 3,4,5 +14125="bcccX": 2,3,4 +14125="bccaX": 2,3 +14125="bcacX": 2,4 +14126="baaaaacacc": 7,9,10 +14126="bacccX": 3,4,5 +14126="bcccX": 2,3,4 +14126="bccaX": 2,3 +14126="bcacX": 2,4 +14126="bcaccX": 2,4,5 +14127="baaaaacacc": 7,9,10 +14127="bacccX": 3,4,5 +14127="bcccX": 2,3,4 +14127="bccaX": 2,3 +14127="bcacX": 2,4 +14127="bcaccX": 2,4,5 +14128="baaaaacacc": 7,9,10 +14128="bacccX": 3,4,5 +14128="bcccX": 2,3,4 +14128="bccaX": 2,3 +14128="bcacX": 2,4 +14128="bcaccX": 2,4,5 +14129="baaaaacacc": 7,9,10 +14129="bacccX": 3,4,5 +14129="bcccX": 2,3,4 +14129="bccaX": 2,3 +14129="bcacX": 2,4 +14129="bcaccX": 2,4,5 +14130="baaaaacacc": 7,9,10 +14130="bacccX": 3,4,5 +14130="bcccX": 2,3,4 +14130="bccaX": 2,3 +14130="bcacX": 2,4 +14131="baaaaacacc": 7,9,10 +14131="bacccX": 3,4,5 +14131="bcccX": 2,3,4 +14131="bccaX": 2,3 +14131="bcacX": 2,4 +14132="baaaaacacc": 7,9,10 +14132="bacccX": 3,4,5 +14132="bcccX": 2,3,4 +14132="bccaX": 2,3 +14132="bcacX": 2,4 +14133="baaaaacacc": 7,9,10 +14133="bacccX": 3,4,5 +14133="bcccX": 2,3,4 +14133="bccaX": 2,3 +14133="bcacX": 2,4 +14134="baaaaacacc": 7,9,10 +14134="bacccX": 3,4,5 +14134="bcccX": 2,3,4 +14134="bccaX": 2,3 +14134="bcacX": 2,4 +14135="baaaaacacc": 7,9,10 +14135="bacccX": 3,4,5 +14135="bcccX": 2,3,4 +14135="bccaX": 2,3 +14135="bcacX": 2,4 +14136="baaaaacacc": 7,9,10 +14136="bacccX": 3,4,5 +14136="bcccX": 2,3,4 +14136="bccaX": 2,3 +14136="bcacX": 2,4 +14137="baaaaacacc": 7,9,10 +14137="bacccX": 3,4,5 +14137="bcccX": 2,3,4 +14137="bccaX": 2,3 +14137="bcacX": 2,4 +14138="baaaaacacc": 7,9,10 +14138="bacccX": 3,4,5 +14138="bcccX": 2,3,4 +14138="bccaX": 2,3 +14138="bcacX": 2,4 +14139="baaaaacacc": 7,9,10 +14139="bacccX": 3,4,5 +14139="bcccX": 2,3,4 +14139="bccaX": 2,3 +14139="bcacX": 2,4 +14140="baaaaacacc": 7,9,10 +14140="bacccX": 3,4,5 +14140="bcccX": 2,3,4 +14140="bccaX": 2,3 +14140="bcacX": 2,4 +14141="baaaaacacc": 7,9,10 +14141="bacccX": 3,4,5 +14141="bcccX": 2,3,4 +14141="bccaX": 2,3 +14141="bcacX": 2,4 +14142="baaaaacacc": 7,9,10 +14142="bacccX": 3,4,5 +14142="bcccX": 2,3,4 +14142="bccaX": 2,3 +14142="bcacX": 2,4 +14143="baaaaacacc": 7,9,10 +14143="bacccX": 3,4,5 +14143="bcccX": 2,3,4 +14143="bccaX": 2,3 +14143="bcacX": 2,4 +14144="baaaaacacc": 7,9,10 +14144="bacccX": 3,4,5 +14144="bcccX": 2,3,4 +14144="bccaX": 2,3 +14144="bcacX": 2,4 +14145="baaaaacacc": 7,9,10 +14145="bacccX": 3,4,5 +14145="bcccX": 2,3,4 +14145="bccaX": 2,3 +14145="bcacX": 2,4 +14146="baaaaacacc": 7,9,10 +14146="bacccX": 3,4,5 +14146="bcccX": 2,3,4 +14146="bccaX": 2,3 +14146="bcacX": 2,4 +14147="baaaaacacc": 7,9,10 +14147="bacccX": 3,4,5 +14147="bcccX": 2,3,4 +14147="bccaX": 2,3 +14147="bcacX": 2,4 +14148="baaaaacacc": 7,9,10 +14148="bacccX": 3,4,5 +14148="bcccX": 2,3,4 +14148="bccaX": 2,3 +14148="bcacX": 2,4 +14149="baaaaacacc": 7,9,10 +14149="bacccX": 3,4,5 +14149="bcccX": 2,3,4 +14149="bccaX": 2,3 +14149="bcacX": 2,4 +14150="XYZaaa": 3,4,5,6 +14150="XYZaab": 3,4,5 +14151="XYZaaa": 3,4,5,6 +14151="XYZaab": 3,4,5 +14152="XYZaab": 6 +14153="XYZaab": 6 +14154="XYZaab": 6 +14155="XYZaab": 6 +14156="XYZaab": 6 +14157="XYZaab": 6 +14158="XYZaab": 3,4,5 +14159="XYZaab": 3,4,5 +14160="baa": 3 +14160=";baa": 4 +14161="baa": +14161=";baa": 4 +14162="xay": 3 +14162="xby": 3 +14162="xcy": +14162="xaay": 4 +14162="xaby": 4 +14162="xacy": +14162="xbay": 4 +14162="xbby": 4 +14162="xbcy": +14163="xay": 3 +14163="xby": 3 +14163="xcy": +14163="xaay": 4 +14163="xaby": 4 +14163="xacy": +14163="xbay": 4 +14163="xbby": 4 +14163="xbcy": +14164="xay": 3 +14164="xby": 3 +14164="xcy": +14164="xaay": 4 +14164="xaby": 4 +14164="xacy": +14164="xbay": 4 +14164="xbby": 4 +14164="xbcy": +14165="xay": 3 +14165="xby": 3 +14165="xcy": +14165="xaay": 4 +14165="xaby": 4 +14165="xacy": +14165="xbay": 4 +14165="xbby": 4 +14165="xbcy": +14166="xay": 3 +14166="xby": 3 +14166="xcy": +14166="xaay": 4 +14166="xaby": 4 +14166="xacy": +14166="xbay": 4 +14166="xbby": 4 +14166="xbcy": +14167="xay": 3 +14167="xby": 3 +14167="xcy": +14167="xaay": 4 +14167="xaby": 4 +14167="xacy": +14167="xbay": 4 +14167="xbby": 4 +14167="xbcy": +14168="xay": 3 +14168="xby": 3 +14168="xcy": +14168="xaay": 4 +14168="xaby": 4 +14168="xacy": +14168="xbay": 4 +14168="xbby": 4 +14168="xbcy": +14169="xay": 3 +14169="xby": 3 +14169="xcy": +14169="xaay": 4 +14169="xaby": 4 +14169="xacy": +14169="xbay": 4 +14169="xbby": 4 +14169="xbcy": +14170="xay": 3 +14170="xby": 3 +14170="xcy": +14170="xaay": 4 +14170="xaby": 4 +14170="xacy": +14170="xbay": 4 +14170="xbby": 4 +14170="xbcy": +14171="xay": 3 +14171="xby": 3 +14171="xcy": +14171="xaay": 4 +14171="xaby": 4 +14171="xacy": +14171="xbay": 4 +14171="xbby": 4 +14171="xbcy": +14172="xay": 3 +14172="xby": 3 +14172="xcy": +14172="xaay": 4 +14172="xaby": 4 +14172="xacy": +14172="xbay": 4 +14172="xbby": 4 +14172="xbcy": +14173="xay": 3 +14173="xby": 3 +14173="xcy": +14173="xaay": 4 +14173="xaby": 4 +14173="xacy": +14173="xbay": 4 +14173="xbby": 4 +14173="xbcy": +14174="X_A_": 2,3,4 +14174="X_X": 2,3 +14174="X::_A:_": 2,3,4,5,6,7 +14175="X_A_": 2,3,4 +14175="X_X": 2,3 +14175="X::_A:_": 2,3,4,5,6,7 +14176="X_A_": 2,3,4 +14176="X_X": 2,3 +14176="X::_A:_": 2,3,4,5,6,7 +14177="X_A_": 2,3,4 +14177="X_X": 2,3 +14177="X::_A:_": 2,3,4,5,6,7 +14178="X_A_": 2,3,4 +14178="X_X": 2,3 +14178="X::_A:_": 2,3,4,5,6,7 +14179="X_A_": 2,3,4 +14179="X_X": 2,3 +14179="X::_A:_": 2,3,4,5,6,7 +14180="X_A_": 4 +14180="X_X": +14180="X::_A:_": 4,5,6,7 +14181="X_A_": 4 +14181="X_X": +14181="X::_A:_": 4,5,6,7 +14182="X_A_": 4 +14182="X_X": +14182="X::_A:_": 4,5,6,7 +14183="X_A_": 4 +14183="X_X": +14183="X::_A:_": 4,5,6,7 +14184="baaaaacacc": 7,9,10 +14184="baCc": +14184="bc": 2 +14184="bcc": 2,3 +14184="bCc": +14185="baaaaacacc": 7,9,10 +14185="baCc": +14185="bc": 2 +14185="bcc": 2,3 +14185="bCc": +14186="baaaaacacc": 7,9,10 +14186="baCc": +14186="bc": 2 +14186="bcc": 2,3 +14186="bCc": +14187="baaaaacacc": 7,9,10 +14187="baCc": +14187="bc": 2 +14187="bcc": 2,3 +14187="bCc": +14188="baaaaacacc": 7,9,10 +14188="baCc": +14188="bc": 2 +14188="bcc": 2,3 +14188="bCc": +14189="baaaaacacc": 7,9,10 +14189="baCc": +14189="bc": 2 +14189="bcc": 2,3 +14189="bCc": +14190="baaaaacacc": 7,9,10 +14190="baCc": +14190="bc": 2 +14190="bcc": 2,3 +14190="bCc": +14191="baaaaacacc": 7,9,10 +14191="baCc": +14191="bc": 2 +14191="bcc": 2,3 +14191="bCc": +14192="baaaaacacc": 7 +14192="baCc": +14192="bc": 2 +14192="bcc": 2 +14192="bCc": +14193="baaaaacacc": 7 +14193="baCc": +14193="bc": 2 +14193="bcc": 2 +14193="bCc": +14194="baaaaacacc": 7 +14194="baCc": +14194="bc": 2 +14194="bcc": 2 +14194="bCc": +14195="baaaaacacc": 7 +14195="baCc": +14195="bc": 2 +14195="bcc": 2 +14195="bCc": +14196="baaaaacacc": 7,9,10 +14196="baCc": 4 +14196="bc": 2 +14196="bcc": 2,3 +14196="bCc": 3 +14197="baaaaacacc": 7,9,10 +14197="baCc": 4 +14197="bc": 2 +14197="bcc": 2,3 +14197="bCc": 3 +14198="baaaaacacc": 7,9,10 +14198="baCc": 4 +14198="bc": 2 +14198="bcc": 2,3 +14198="bCc": 3 +14199="baaaaacacc": 7,9,10 +14199="baCc": 4 +14199="bc": 2 +14199="bcc": 2,3 +14199="bCc": 3 +14200="baaaaacacc": 7,9,10 +14200="baCc": +14200="bc": 2 +14200="bcc": 2,3 +14200="bCc": +14201="baaaaacacc": 7,9,10 +14201="baCc": +14201="bc": 2 +14201="bcc": 2,3 +14201="bCc": +14202="baaaaacacc": 7,9,10 +14202="baCc": +14202="bc": 2 +14202="bcc": 2,3 +14202="bCc": +14203="baaaaacacc": 7,9,10 +14203="baCc": +14203="bc": 2 +14203="bcc": 2,3 +14203="bCc": +14204="baaaaacacc": 7 +14204="baCc": +14204="bc": 2 +14204="bcc": 2 +14204="bCc": +14205="baaaaacacc": 7 +14205="baCc": +14205="bc": 2 +14205="bcc": 2 +14205="bCc": +14206="baaaaacacc": 7 +14206="baCc": +14206="bc": 2 +14206="bcc": 2 +14206="bCc": +14207="baaaaacacc": 7 +14207="baCc": +14207="bc": 2 +14207="bcc": 2 +14207="bCc": +14208="baaaaacacc": 7,9,10 +14208="baCc": 4 +14208="bc": 2 +14208="bcc": 2,3 +14208="bCc": 3 +14209="baaaaacacc": 7,9,10 +14209="baCc": 4 +14209="bc": 2 +14209="bcc": 2,3 +14209="bCc": 3 +14210="baaaaacacc": 7,9,10 +14210="baCc": 4 +14210="bc": 2 +14210="bcc": 2,3 +14210="bCc": 3 +14211="baaaaacacc": 7,9,10 +14211="baCc": 4 +14211="bc": 2 +14211="bcc": 2,3 +14211="bCc": 3 +14212="baaac": 5 +14212="baadc": 5 +14213="baaac": 5 +14213="baadc": 5 +14214="baaac": 5 +14214="baadc": 5 +14215="baaac": 5 +14215="baadc": 5 +14216="baaac": 5 +14216="baadc": 5 +14217="baaac": 5 +14217="baadc": 5 +14218="bbaaaaa": 3,4 +14219="bbaaaaa": 3,4 +14220="cX": 2 +14220="ccX": 3 +14220="cccX": 4 +14221="cX": 2 +14221="ccX": 3 +14221="cccX": 4 +14222="baaaaac": 7 +14223="baaaaac": 7 +14224="baaaaac": 7 +14225="baaaaac": 7 +14226="baaaaac": 7 +14227="baaaaac": 7 +14228="baaaaac": 7 +14229="baaaaac": 7 +14230="baaaaac": diff --git a/tools/hscollider/test_cases/corpora/puff.txt b/tools/hscollider/test_cases/corpora/puff.txt new file mode 100644 index 000000000..e338667fb --- /dev/null +++ b/tools/hscollider/test_cases/corpora/puff.txt @@ -0,0 +1,1132 @@ +15200="foo": +15200="foo12345678123456": +15200="foo123456781234567": 18 +15200="foo1234567812345678": 18 +15200="foo12345678123456789": 18 +15200="foo1234567812345X": +15200="foo12345678123456X": +15200="foo123456781234567X": 18 +15200="foo1234567812345678X": 18 +15200="fooX2345678123456789": +15200="foo123456781X3456789": +15200="bar123456781X3456789": +15200="XXX12345678123456789": +15200="foofoo12345678123456789": 18,21 +15200="fooXfoo12345678123456789": 22 +15200="foofooX23456781foo23456789YYYYYYYY": 33 +15200="foofoo12345678123456789": 18,21 +15200="blahfoo12345678123456789": 22 +15201="foo": +15201="foo12345678123456": +15201="foo123456781234567": +15201="foo1234567812345678": 19 +15201="foo12345678123456789": 19 +15201="foo1234567812345X": +15201="foo12345678123456X": +15201="foo123456781234567X": +15201="foo1234567812345678X": 19 +15201="fooX2345678123456789": +15201="foo123456781X3456789": +15201="bar123456781X3456789": +15201="XXX12345678123456789": +15201="foofoo12345678123456789": 19,22 +15201="fooXfoo12345678123456789": 23 +15201="foofooX23456781foo23456789YYYYYYYY": 34 +15201="foofoo12345678123456789": 19,22 +15201="blahfoo12345678123456789": 23 +15202="foo": +15202="foo12345678123456": +15202="foo123456781234567": +15202="foo1234567812345678": +15202="foo12345678123456789": 20 +15202="foo1234567812345X": +15202="foo12345678123456X": +15202="foo123456781234567X": +15202="foo1234567812345678X": +15202="fooX2345678123456789": +15202="foo123456781X3456789": +15202="bar123456781X3456789": +15202="XXX12345678123456789": +15202="foofoo12345678123456789": 20,23 +15202="fooXfoo12345678123456789": 24 +15202="foofooX23456781foo23456789YYYYYYYY": +15202="foofoo12345678123456789": 20,23 +15202="blahfoo12345678123456789": 24 +15203="foo": +15203="foo12345678123456": +15203="foo123456781234567": +15203="foo1234567812345678": +15203="foo12345678123456789": 20 +15203="foo1234567812345X": +15203="foo12345678123456X": +15203="foo123456781234567X": +15203="foo1234567812345678X": +15203="fooX2345678123456789": +15203="foo123456781X3456789": +15203="bar123456781X3456789": +15203="XXX12345678123456789": +15203="foofoo12345678123456789": 20,21,22,23 +15203="fooXfoo12345678123456789": 21,22,23,24 +15203="foofooX23456781foo23456789YYYYYYYY": 24,25,26,27,28,29,30,31,32,33,34 +15203="foofoo12345678123456789": 20,21,22,23 +15203="blahfoo12345678123456789": 24 +15204="foo": +15204="foo12345678123456": +15204="foo123456781234567": +15204="foo1234567812345678": +15204="foo12345678123456789": +15204="foo1234567812345X": +15204="foo12345678123456X": +15204="foo123456781234567X": +15204="foo1234567812345678X": +15204="fooX2345678123456789": +15204="foo123456781X3456789": +15204="bar123456781X3456789": +15204="XXX12345678123456789": +15204="foofoo12345678123456789": +15204="fooXfoo12345678123456789": +15204="foofooX23456781foo23456789YYYYYYYY": +15204="foofoo12345678123456789": +15204="blahfoo12345678123456789": +15205="foo": +15205="foo12345678123456": +15205="foo123456781234567": +15205="foo1234567812345678": +15205="foo12345678123456789": 20 +15205="foo1234567812345X": +15205="foo12345678123456X": +15205="foo123456781234567X": +15205="foo1234567812345678X": +15205="fooX2345678123456789": +15205="foo123456781X3456789": +15205="bar123456781X3456789": +15205="XXX12345678123456789": +15205="foofoo12345678123456789": 20,23 +15205="fooXfoo12345678123456789": 24 +15205="foofooX23456781foo23456789YYYYYYYY": +15205="foofoo12345678123456789": 20,23 +15205="blahfoo12345678123456789": 24 +15206="foo": +15206="foo12345678123456": +15206="foo123456781234567": +15206="foo1234567812345678": +15206="foo12345678123456789": 20 +15206="foo1234567812345X": +15206="foo12345678123456X": +15206="foo123456781234567X": +15206="foo1234567812345678X": +15206="fooX2345678123456789": +15206="foo123456781X3456789": +15206="bar123456781X3456789": +15206="XXX12345678123456789": +15206="foofoo12345678123456789": 23 +15206="fooXfoo12345678123456789": 24 +15206="foofooX23456781foo23456789YYYYYYYY": +15206="foofoo12345678123456789": 23 +15206="blahfoo12345678123456789": 24 +15207="foo": +15207="foo12345678123456": 17 +15207="foo123456781234567": 17,18 +15207="foo1234567812345678": 17,18,19 +15207="foo12345678123456789": 17,18,19,20 +15207="foo1234567812345X": +15207="foo12345678123456X": 17 +15207="foo123456781234567X": 17,18 +15207="foo1234567812345678X": 17,18,19 +15207="fooX2345678123456789": +15207="foo123456781X3456789": +15207="bar123456781X3456789": +15207="XXX12345678123456789": 20 +15207="foofoo12345678123456789": 17,18,19,20,21,22,23 +15207="fooXfoo12345678123456789": 21,22,23,24 +15207="foofooX23456781foo23456789YYYYYYYY": 24,25,26,27,28,29,30,31,32,33,34 +15207="foofoo12345678123456789": 17,18,19,20,21,22,23 +15207="blahfoo12345678123456789": 17,18,19,20,21,22,23,24 +15208="foo": +15208="foo12345678123456": 17 +15208="foo123456781234567": 17 +15208="foo1234567812345678": 17 +15208="foo12345678123456789": 17 +15208="foo1234567812345X": +15208="foo12345678123456X": 17 +15208="foo123456781234567X": 17 +15208="foo1234567812345678X": 17 +15208="fooX2345678123456789": +15208="foo123456781X3456789": +15208="bar123456781X3456789": +15208="XXX12345678123456789": +15208="foofoo12345678123456789": 17 +15208="fooXfoo12345678123456789": +15208="foofooX23456781foo23456789YYYYYYYY": +15208="foofoo12345678123456789": 17 +15208="blahfoo12345678123456789": 17 +15209="foo": +15209="foo12345678123456": +15209="foo123456781234567": 18 +15209="foo1234567812345678": 18 +15209="foo12345678123456789": 18 +15209="foo1234567812345X": +15209="foo12345678123456X": +15209="foo123456781234567X": 18 +15209="foo1234567812345678X": 18 +15209="fooX2345678123456789": +15209="foo123456781X3456789": +15209="bar123456781X3456789": +15209="XXX12345678123456789": +15209="foofoo12345678123456789": 18,20,21 +15209="fooXfoo12345678123456789": 21,22 +15209="foofooX23456781foo23456789YYYYYYYY": 32,33 +15209="foofoo12345678123456789": 18,20,21 +15209="blahfoo12345678123456789": 22 +15210="foo": +15210="foo12345678123456": +15210="foo123456781234567": +15210="foo1234567812345678": 19 +15210="foo12345678123456789": 19 +15210="foo1234567812345X": +15210="foo12345678123456X": +15210="foo123456781234567X": +15210="foo1234567812345678X": 19 +15210="fooX2345678123456789": +15210="foo123456781X3456789": +15210="bar123456781X3456789": +15210="XXX12345678123456789": +15210="foofoo12345678123456789": 19,21,22 +15210="fooXfoo12345678123456789": 22,23 +15210="foofooX23456781foo23456789YYYYYYYY": 33,34 +15210="foofoo12345678123456789": 19,21,22 +15210="blahfoo12345678123456789": 23 +15211="foo": +15211="foo12345678123456": +15211="foo123456781234567": +15211="foo1234567812345678": +15211="foo12345678123456789": 20 +15211="foo1234567812345X": +15211="foo12345678123456X": +15211="foo123456781234567X": +15211="foo1234567812345678X": +15211="fooX2345678123456789": +15211="foo123456781X3456789": +15211="bar123456781X3456789": +15211="XXX12345678123456789": +15211="foofoo12345678123456789": 20,22,23 +15211="fooXfoo12345678123456789": 23,24 +15211="foofooX23456781foo23456789YYYYYYYY": 34 +15211="foofoo12345678123456789": 20,22,23 +15211="blahfoo12345678123456789": 24 +15212="foo": +15212="foo12345678123456": +15212="foo123456781234567": 18 +15212="foo1234567812345678": 18 +15212="foo12345678123456789": 18 +15212="foo1234567812345X": +15212="foo12345678123456X": +15212="foo123456781234567X": 18 +15212="foo1234567812345678X": 18 +15212="fooX2345678123456789": +15212="foo123456781X3456789": +15212="bar123456781X3456789": +15212="XXX12345678123456789": +15212="foofoo12345678123456789": 18,21 +15212="fooXfoo12345678123456789": 22 +15212="foofooX23456781foo23456789YYYYYYYY": 33 +15212="foofoo12345678123456789": 18,21 +15212="blahfoo12345678123456789": 22 +15213="foo": +15213="foo12345678123456": +15213="foo123456781234567": +15213="foo1234567812345678": 19 +15213="foo12345678123456789": 19 +15213="foo1234567812345X": +15213="foo12345678123456X": +15213="foo123456781234567X": +15213="foo1234567812345678X": 19 +15213="fooX2345678123456789": +15213="foo123456781X3456789": +15213="bar123456781X3456789": +15213="XXX12345678123456789": +15213="foofoo12345678123456789": 19,22 +15213="fooXfoo12345678123456789": 23 +15213="foofooX23456781foo23456789YYYYYYYY": 34 +15213="foofoo12345678123456789": 19,22 +15213="blahfoo12345678123456789": 23 +15214="foo": +15214="foo12345678123456": +15214="foo123456781234567": +15214="foo1234567812345678": +15214="foo12345678123456789": 20 +15214="foo1234567812345X": +15214="foo12345678123456X": +15214="foo123456781234567X": +15214="foo1234567812345678X": +15214="fooX2345678123456789": +15214="foo123456781X3456789": +15214="bar123456781X3456789": +15214="XXX12345678123456789": +15214="foofoo12345678123456789": 20,23 +15214="fooXfoo12345678123456789": 24 +15214="foofooX23456781foo23456789YYYYYYYY": +15214="foofoo12345678123456789": 20,23 +15214="blahfoo12345678123456789": 24 +15215="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15216="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15216="foo___________________________________________________f__________________________________________F__________________________________________________________________________________________________________________________________________________________________": 257 +15217="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15218="foo": +15218="foo12345678123456": +15218="foo123456781234567": +15218="foo1234567812345678": +15218="foo12345678123456789": 20 +15218="foo1234567812345X": +15218="foo12345678123456X": +15218="foo123456781234567X": +15218="foo1234567812345678X": +15218="fooX2345678123456789": +15218="foo123456781X3456789": +15218="bar123456781X3456789": +15218="XXX12345678123456789": +15218="foofoo12345678123456789": 20 +15218="fooXfoo12345678123456789": +15218="foofooX23456781foo23456789YYYYYYYY": +15218="foofoo12345678123456789": 20 +15219="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15220="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15221="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15222="foo": +15222="foo12345678123456": +15222="foo123456781234567": +15222="foo1234567812345678": +15222="foo12345678123456789": 20 +15222="foo1234567812345X": +15222="foo12345678123456X": +15222="foo123456781234567X": +15222="foo1234567812345678X": 20 +15222="fooX2345678123456789": 20 +15222="foo123456781X3456789": 20 +15222="bar123456781X3456789": 20 +15222="XXX12345678123456789": +15222="foofoo12345678123456789": 20 +15222="fooXfoo12345678123456789": 20 +15222="foofooX23456781foo23456789YYYYYYYY": 20 +15222="foofoo12345678123456789": 20 +15223="bar123456781X3456789": +15223="blahfoo12345678123456789": 22 +15223="foo": +15223="foo12345678123456": +15223="foo123456781234567": 18 +15223="foo1234567812345678": 18 +15223="foo12345678123456789": 18 +15223="foo1234567812345678X": 18 +15223="foo123456781234567X": 18 +15223="foo12345678123456X": 18 +15223="foo1234567812345X": +15223="foo123456781X3456789": 18 +15223="foofoo12345678123456789": 18,21 +15223="foofoo12345678123456789": 18,21 +15223="foofooX23456781foo23456789YYYYYYYY": 18,21,33 +15223="fooX2345678123456789": 18 +15223="fooXfoo12345678123456789": 18,22 +15223="XXX12345678123456789": +15224="bar123456781X3456789": +15224="blahfoo12345678123456789": 23 +15224="foo": +15224="foo12345678123456": +15224="foo123456781234567": +15224="foo1234567812345678": 19 +15224="foo12345678123456789": 19 +15224="foo1234567812345678X": 19 +15224="foo123456781234567X": 19 +15224="foo12345678123456X": +15224="foo1234567812345X": +15224="foo123456781X3456789": 19 +15224="foofoo12345678123456789": 19,22 +15224="foofoo12345678123456789": 19,22 +15224="foofooX23456781foo23456789YYYYYYYY": 19,22,34 +15224="fooX2345678123456789": 19 +15224="fooXfoo12345678123456789": 19,23 +15224="XXX12345678123456789": +15225="bar123456781X3456789": +15225="blahfoo12345678123456789": 24 +15225="foo": +15225="foo12345678123456": +15225="foo123456781234567": +15225="foo1234567812345678": +15225="foo12345678123456789": 20 +15225="foo1234567812345678X": 20 +15225="foo123456781234567X": +15225="foo12345678123456X": +15225="foo1234567812345X": +15225="foo123456781X3456789": 20 +15225="foofoo12345678123456789": 20,23 +15225="foofoo12345678123456789": 20,23 +15225="foofooX23456781foo23456789YYYYYYYY": 20,23 +15225="fooX2345678123456789": 20 +15225="fooXfoo12345678123456789": 20,24 +15225="XXX12345678123456789": +15226="bar123456781X3456789": +15226="blahfoo12345678123456789": 24 +15226="foo": +15226="foo12345678123456": +15226="foo123456781234567": +15226="foo1234567812345678": +15226="foo12345678123456789": 20 +15226="foo1234567812345678X": 20 +15226="foo123456781234567X": +15226="foo12345678123456X": +15226="foo1234567812345X": +15226="foo123456781X3456789": 20 +15226="foofoo12345678123456789": 20,21,22,23 +15226="foofoo12345678123456789": 20,21,22,23 +15226="foofooX23456781foo23456789YYYYYYYY": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34 +15226="fooX2345678123456789": 20 +15226="fooXfoo12345678123456789": 20,21,22,23,24 +15226="XXX12345678123456789": +15227="bar123456781X3456789": +15227="blahfoo12345678123456789": +15227="foo": +15227="foo12345678123456": +15227="foo123456781234567": +15227="foo1234567812345678": +15227="foo12345678123456789": +15227="foo1234567812345678X": +15227="foo123456781234567X": +15227="foo12345678123456X": +15227="foo1234567812345X": +15227="foo123456781X3456789": +15227="foofoo12345678123456789": +15227="foofoo12345678123456789": +15227="foofooX23456781foo23456789YYYYYYYY": +15227="fooX2345678123456789": +15227="fooXfoo12345678123456789": +15227="XXX12345678123456789": +15228="bar123456781X3456789": +15228="blahfoo12345678123456789": 24 +15228="foo": +15228="foo12345678123456": +15228="foo123456781234567": +15228="foo1234567812345678": +15228="foo12345678123456789": 20 +15228="foo1234567812345678X": 20 +15228="foo123456781234567X": +15228="foo12345678123456X": +15228="foo1234567812345X": +15228="foo123456781X3456789": 20 +15228="foofoo12345678123456789": 20,23 +15228="foofoo12345678123456789": 20,23 +15228="foofooX23456781foo23456789YYYYYYYY": 20,23 +15228="fooX2345678123456789": 20 +15228="fooXfoo12345678123456789": 20,24 +15228="XXX12345678123456789": +15229="bar123456781X3456789": +15229="blahfoo12345678123456789": 24 +15229="foo": +15229="foo12345678123456": +15229="foo123456781234567": +15229="foo1234567812345678": +15229="foo12345678123456789": 20 +15229="foo1234567812345678X": 20 +15229="foo123456781234567X": +15229="foo12345678123456X": +15229="foo1234567812345X": +15229="foo123456781X3456789": 20 +15229="foofoo12345678123456789": 23 +15229="foofoo12345678123456789": 23 +15229="foofooX23456781foo23456789YYYYYYYY": +15229="fooX2345678123456789": 20 +15229="fooXfoo12345678123456789": 24 +15229="XXX12345678123456789": +15230="bar123456781X3456789": 17,18,19,20 +15230="blahfoo12345678123456789": 17,18,19,20,21,22,23,24 +15230="foo": +15230="foo12345678123456": 17 +15230="foo123456781234567": 17,18 +15230="foo1234567812345678": 17,18,19 +15230="foo12345678123456789": 17,18,19,20 +15230="foo1234567812345678X": 17,18,19,20 +15230="foo123456781234567X": 17,18,19 +15230="foo12345678123456X": 17,18 +15230="foo1234567812345X": 17 +15230="foo123456781X3456789": 17,18,19,20 +15230="foofoo12345678123456789": 17,18,19,20,21,22,23 +15230="foofoo12345678123456789": 17,18,19,20,21,22,23 +15230="foofooX23456781foo23456789YYYYYYYY": 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34 +15230="fooX2345678123456789": 17,18,19,20 +15230="fooXfoo12345678123456789": 17,18,19,20,21,22,23,24 +15230="XXX12345678123456789": 17,18,19,20 +15231="bar123456781X3456789": 17 +15231="blahfoo12345678123456789": 17 +15231="foo": +15231="foo12345678123456": 17 +15231="foo123456781234567": 17 +15231="foo1234567812345678": 17 +15231="foo12345678123456789": 17 +15231="foo1234567812345678X": 17 +15231="foo123456781234567X": 17 +15231="foo12345678123456X": 17 +15231="foo1234567812345X": 17 +15231="foo123456781X3456789": 17 +15231="foofoo12345678123456789": 17 +15231="foofoo12345678123456789": 17 +15231="foofooX23456781foo23456789YYYYYYYY": 17 +15231="fooX2345678123456789": 17 +15231="fooXfoo12345678123456789": 17 +15231="XXX12345678123456789": 17 +15232="bar123456781X3456789": +15232="blahfoo12345678123456789": 22 +15232="foo": +15232="foo12345678123456": +15232="foo123456781234567": 18 +15232="foo1234567812345678": 18 +15232="foo12345678123456789": 18 +15232="foo1234567812345678X": 18 +15232="foo123456781234567X": 18 +15232="foo12345678123456X": 18 +15232="foo1234567812345X": +15232="foo123456781X3456789": 18 +15232="foofoo12345678123456789": 18,20,21 +15232="foofoo12345678123456789": 18,20,21 +15232="foofooX23456781foo23456789YYYYYYYY": 18,20,21,32,33 +15232="fooX2345678123456789": 18 +15232="fooXfoo12345678123456789": 18,21,22 +15232="XXX12345678123456789": +15233="bar123456781X3456789": +15233="blahfoo12345678123456789": 23 +15233="foo": +15233="foo12345678123456": +15233="foo123456781234567": +15233="foo1234567812345678": 19 +15233="foo12345678123456789": 19 +15233="foo1234567812345678X": 19 +15233="foo123456781234567X": 19 +15233="foo12345678123456X": +15233="foo1234567812345X": +15233="foo123456781X3456789": 19 +15233="foofoo12345678123456789": 19,21,22 +15233="foofoo12345678123456789": 19,21,22 +15233="foofooX23456781foo23456789YYYYYYYY": 19,21,22,33,34 +15233="fooX2345678123456789": 19 +15233="fooXfoo12345678123456789": 19,22,23 +15233="XXX12345678123456789": +15234="bar123456781X3456789": +15234="blahfoo12345678123456789": 24 +15234="foo": +15234="foo12345678123456": +15234="foo123456781234567": +15234="foo1234567812345678": +15234="foo12345678123456789": 20 +15234="foo1234567812345678X": 20 +15234="foo123456781234567X": +15234="foo12345678123456X": +15234="foo1234567812345X": +15234="foo123456781X3456789": 20 +15234="foofoo12345678123456789": 20,22,23 +15234="foofoo12345678123456789": 20,22,23 +15234="foofooX23456781foo23456789YYYYYYYY": 20,22,23,34 +15234="fooX2345678123456789": 20 +15234="fooXfoo12345678123456789": 20,23,24 +15234="XXX12345678123456789": +15235="bar123456781X3456789": 18 +15235="blahfoo12345678123456789": 22 +15235="foo": +15235="foo12345678123456": +15235="foo123456781234567": 18 +15235="foo1234567812345678": 18 +15235="foo12345678123456789": 18 +15235="foo1234567812345678X": 18 +15235="foo123456781234567X": 18 +15235="foo12345678123456X": 18 +15235="foo1234567812345X": +15235="foo123456781X3456789": 18 +15235="foofoo12345678123456789": 18,21 +15235="foofoo12345678123456789": 18,21 +15235="foofooX23456781foo23456789YYYYYYYY": 18,21,33 +15235="fooX2345678123456789": 18 +15235="fooXfoo12345678123456789": 18,22 +15235="XXX12345678123456789": +15236="bar123456781X3456789": 19 +15236="blahfoo12345678123456789": 23 +15236="foo": +15236="foo12345678123456": +15236="foo123456781234567": +15236="foo1234567812345678": 19 +15236="foo12345678123456789": 19 +15236="foo1234567812345678X": 19 +15236="foo123456781234567X": 19 +15236="foo12345678123456X": +15236="foo1234567812345X": +15236="foo123456781X3456789": 19 +15236="foofoo12345678123456789": 19,22 +15236="foofoo12345678123456789": 19,22 +15236="foofooX23456781foo23456789YYYYYYYY": 19,22,34 +15236="fooX2345678123456789": 19 +15236="fooXfoo12345678123456789": 19,23 +15236="XXX12345678123456789": +15237="bar123456781X3456789": 20 +15237="blahfoo12345678123456789": 24 +15237="foo": +15237="foo12345678123456": +15237="foo123456781234567": +15237="foo1234567812345678": +15237="foo12345678123456789": 20 +15237="foo1234567812345678X": 20 +15237="foo123456781234567X": +15237="foo12345678123456X": +15237="foo1234567812345X": +15237="foo123456781X3456789": 20 +15237="foofoo12345678123456789": 20,23 +15237="foofoo12345678123456789": 20,23 +15237="foofooX23456781foo23456789YYYYYYYY": 20,23 +15237="fooX2345678123456789": 20 +15237="fooXfoo12345678123456789": 20,24 +15237="XXX12345678123456789": +15238="foo12345678901234567890123456789012345678901234567890": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 +15238="fooXXbar12345678901234567foobar890123456789012345678901234567890": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 +15239="foo12345678901234567890123456789012345678901234567890": +15239="fooXXbar12345678901234567foobar890123456789012345678901234567890": 38,61 +15240="foo12345678901234567890123456789012345678901234567890": +15240="fooXXbar12345678901234567foobar890123456789012345678901234567890": 38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 +15241="hhechbd": +15241="hhechbdl": 8 +15241="hhechbdr": 8 +15241="hhechbdYYYYYYYYYYYYYYYYYY": 8,25 +15241="hhechbdjenobo": 8,13 +15241="hhechbdjenqbo": 8,13 +15241="hhechbdX": 8 +15242="iiXmXxZZZZZZZZZZZZZZZZZZZZZZ": 6,28 +15242="iiXmXxp": 6,7 +15242="iiXmXxy": 6,7 +15242="iiXmXx": 6 +15242="iiXmXxn": 6,7 +15242="iiXmXxnn": 6,7,8 +15242="iiXmXxnnnnnnn": 6,7,8,9,10,11,12,13 +15242="ZiiXmXxnnnnnnn": +15243="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15244="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15245="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": 258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314 +15246="bar12345678901234567890123": 19,20,21,22,23,24,25,26 +15246="barbarbabarbarbarbarbarbar": 19,20,21,22,23,24,25,26 +15246="barr______________________": 19,20,21,22,23,24,25,26 +15246="barbar12345678901234567890": 19,20,21,22,23,24,25,26 +15246="barbar12345678901234567890": 19,20,21,22,23,24,25,26 +15246="bar123456789X1234567890123": 19,20,21,22,23,24,25,26 +15246="bar123456789Y1234567890123": 19,20,21,22,23,24,25,26 +15246="bar123456789r1234567890123": 19,20,21,22,23,24,25,26 +15246="bar1234567890123456789X123": 19,20,21,22,23,24,25,26 +15246="bar1234567890123456789Y123": 19,20,21,22,23,24,25,26 +15246="bar1234567890123456789r123": 19,20,21,22,23,24,25,26 +15246="bar1234567890123456789bar12345678901234567890": 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15246="bar12345678901234567890123": 19,20,21,22,23,24,25,26 +15246="barbarbabarbarbarbarbarbar": 19,20,21,22,23,24,25,26 +15247="barr______________________": 19,20,21,22,23,24,25,26 +15247="barbar12345678901234567890": 19,20,21,22,23,24,25,26 +15247="barbar12345678901234567890": 19,20,21,22,23,24,25,26 +15247="bar123456789X1234567890123": +15247="bar123456789Y1234567890123": 19,20,21,22,23,24,25,26 +15247="bar123456789r1234567890123": 19,20,21,22,23,24,25,26 +15247="bar1234567890123456789X123": 19,20,21,22 +15247="bar1234567890123456789Y123": 19,20,21,22,23,24,25,26 +15247="bar1234567890123456789r123": 19,20,21,22,23,24,25,26 +15247="bar1234567890123456789bar12345678901234567890": 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15248="bar12345678901234567890123": 19,20,21,22,23,24,25,26 +15248="barbarbabarbarbarbarbarbar": +15248="barr______________________": +15248="barbar12345678901234567890": 22,23,24,25,26 +15248="barbar12345678901234567890": 22,23,24,25,26 +15248="bar123456789X1234567890123": 19,20,21,22,23,24,25,26 +15248="bar123456789Y1234567890123": 19,20,21,22,23,24,25,26 +15248="bar123456789r1234567890123": +15248="bar1234567890123456789X123": 19,20,21,22,23,24,25,26 +15248="bar1234567890123456789Y123": 19,20,21,22,23,24,25,26 +15248="bar1234567890123456789r123": 19,20,21,22 +15248="bar1234567890123456789bar12345678901234567890": 19,20,21,22,23,24,41,42,43,44,45 +15249="bar12345678901234567890123": 19,20,21,22,23,24,25,26 +15249="barbarbabarbarbarbarbarbar": 19,20,21,22,23,24,25,26 +15249="barr______________________": 19,20,21,22,23,24,25,26 +15249="barbar12345678901234567890": 19,20,21,22,23,24,25,26 +15249="barbar12345678901234567890": 19,20,21,22,23,24,25,26 +15249="bar123456789X1234567890123": +15249="bar123456789Y1234567890123": +15249="bar123456789r1234567890123": 19,20,21,22,23,24,25,26 +15249="bar1234567890123456789X123": 19,20,21,22 +15249="bar1234567890123456789Y123": 19,20,21,22 +15249="bar1234567890123456789r123": 19,20,21,22,23,24,25,26 +15249="bar1234567890123456789bar12345678901234567890": 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15250="bar12345678901234567890123": 19,20,21,22,23,24,25,26 +15250="barbarbabarbarbarbarbarbar": +15250="barr______________________": +15250="barbar12345678901234567890": 22,23,24,25,26 +15250="barbar12345678901234567890": 22,23,24,25,26 +15250="bar123456789X1234567890123": 19,20,21,22,23,24,25,26 +15250="bar123456789Y1234567890123": +15250="bar123456789r1234567890123": +15250="bar1234567890123456789X123": 19,20,21,22,23,24,25,26 +15250="bar1234567890123456789Y123": 19,20,21,22 +15250="bar1234567890123456789r123": 19,20,21,22 +15250="bar1234567890123456789bar12345678901234567890": 19,20,21,22,23,24,41,42,43,44,45 +15251="foobar1234567890123456789bar12345678901234567": 22,44 +15251="foobarbar1234567890123456789bar12345678901234567": 25,47 +15251="foobar1234567890123bar12345678901234567890": 38 +15251="foobar1234567890123bar12345678901234567890": 38 +15251="foobar123456789012bar123456789012345678901": 37 +15251="foobar12345678901234bar1234567890123456789": 22,39 +15252="f_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________": 255,256,257,258 +15253="f_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________": 256,257,258 +15254="f_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________": 257,258 +15255="fffffffffffffffffffffffffffffffffffffff": +15255="afffffffffffffffffffffffffffffffffffffff": 36,37,38,39,40 +15255="afffffffffffffffffffffffffffffffffffffffzafffffffffffffffffffffffffffffffffffffff": 36,37,38,39,40,77,78,79,80,81 +15255="afffffffffffffffffffffffffffffffffffffffafffffffffffffffffffffffffffffffffffffff": 36,37,38,39,40,76,77,78,79,80 +15256="fffffffffffffffffffffffffffffffffffffff": 36,37,38,39 +15256="afffffffffffffffffffffffffffffffffffffff": 37,38,39,40 +15256="afffffffffffffffffffffffffffffffffffffffzafffffffffffffffffffffffffffffffffffffff": 37,38,39,40,78,79,80,81 +15256="afffffffffffffffffffffffffffffffffffffffafffffffffffffffffffffffffffffffffffffff": 37,38,39,40,77,78,79,80 +15257="fffffffffffffffffffffffffffffffffffffff": 36,37,38,39 +15257="afffffffffffffffffffffffffffffffffffffff": 36,37,38,39,40 +15257="afffffffffffffffffffffffffffffffffffffffzafffffffffffffffffffffffffffffffffffffff": 36,37,38,39,40,77,78,79,80,81 +15257="afffffffffffffffffffffffffffffffffffffffafffffffffffffffffffffffffffffffffffffff": 36,37,38,39,40,76,77,78,79,80 +15258="_______________________________________________________": 50 +15259="_______________________________________________________": 50,51,52,53,54,55 +15260="_______________________________________________________": 50 +15261="_______________________________________________________": 50,51,52,53,54,55 +15262="_______________________________________________________": +15263="_______________________________________________________": +15264="_______________________________________________________": +15265="_______________________________________________________": +15266="x": 1 +15267="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15267="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15268="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 100,101,102,103,104,105,106,107,108,109,110 +15268="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 100,101,102,103,104,105,106,107,108,109,110 +15269="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15269="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15270="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 100 +15270="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 100 +15271="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15271="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15272="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15272="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15273="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15273="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15274="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 60,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15274="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 60,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15274="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 60,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15274="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_xa_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 60,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15274="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa": 60,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15274="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_a": 60,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15275="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15275="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110 +15275="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15275="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_xa_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15275="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa": 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15275="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_a": 55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111 +15276="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 51 +15276="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 51 +15276="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": +15276="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_xa_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 51 +15276="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa": 51 +15276="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_a": 51 +15277="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 72 +15277="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 72 +15277="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": +15277="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_xa_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": +15277="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa": 72 +15277="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_a": 72 +15278="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 100,101,102,103,104,105,106,107,108,109,110 +15278="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": 100,101,102,103,104,105,106,107,108,109,110 +15278="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": +15278="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_xa_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_": +15278="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa": 100,101,102,103,104,105,106,107,108,109,110 +15278="x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_a": 100,101,102,103,104,105,106,107,108,109,110 +15279="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100 +15279="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +15279="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": +15279="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 40,41,42,43,44,45,46,47,88,89,90,91,92,93,94,95,96,97,98,99,100,101 +15279="xxxxxxxxxxxxxxxxxxxxxxxxxxxXxxxxxxxxxxxxxxxxxxxxXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 89,90,91,92,93,94,95,96,97,98,99,100,101,102 +15279="xxxxxxxxxxxxxxxxxxxxxxxxxxxXxxxxxxxxxxxxxxxxxxxxXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxX": 89,90,91,92,93,94,95,96,97,98,99,100,101,102 +15279="Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx": 41,42,43,44,45,46,47,48 +15280="_________________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65 +15280="_______X_________________________________________________________": 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65 +15280="_______Y_________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65 +15280="_______Y_____X___________________________________________________": 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65 +15280="_______X_____Y___________________________________________________": 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65 +15281="X___________________________________________________________": 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_X__________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__X_________________________________________________________": 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___X________________________________________________________": 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____X_______________________________________________________": 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____X______________________________________________________": 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______X_____________________________________________________": 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_______X____________________________________________________": 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="________X___________________________________________________": 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_________X__________________________________________________": 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__________X_________________________________________________": 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___________X________________________________________________": 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____________X_______________________________________________": 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____________X______________________________________________": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______________X_____________________________________________": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_______________X____________________________________________": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="________________X___________________________________________": 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_________________X__________________________________________": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__________________X_________________________________________": 18,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___________________X________________________________________": 18,19,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____________________X_______________________________________": 18,19,20,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____________________X______________________________________": 18,19,20,21,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______________________X_____________________________________": 18,19,20,21,22,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_______________________X____________________________________": 18,19,20,21,22,23,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="________________________X___________________________________": 18,19,20,21,22,23,24,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_________________________X__________________________________": 18,19,20,21,22,23,24,25,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__________________________X_________________________________": 18,19,20,21,22,23,24,25,26,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___________________________X________________________________": 18,19,20,21,22,23,24,25,26,27,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____________________________X_______________________________": 18,19,20,21,22,23,24,25,26,27,28,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____________________________X______________________________": 18,19,20,21,22,23,24,25,26,27,28,29,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______________________________X_____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_______________________________X____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,50,51,52,53,54,55,56,57,58,59,60 +15281="________________________________X___________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,51,52,53,54,55,56,57,58,59,60 +15281="_________________________________X__________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,52,53,54,55,56,57,58,59,60 +15281="__________________________________X_________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,53,54,55,56,57,58,59,60 +15281="___________________________________X________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,54,55,56,57,58,59,60 +15281="____________________________________X_______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,55,56,57,58,59,60 +15281="_____________________________________X______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,56,57,58,59,60 +15281="______________________________________X_____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,57,58,59,60 +15281="_______________________________________X____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,58,59,60 +15281="________________________________________X___________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,59,60 +15281="_________________________________________X__________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,60 +15281="__________________________________________X_________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42 +15281="___________________________________________X________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 +15281="____________________________________________X_______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44 +15281="_____________________________________________X______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15281="______________________________________________X_____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46 +15281="_______________________________________________X____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 +15281="________________________________________________X___________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 +15281="_________________________________________________X__________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 +15281="__________________________________________________X_________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 +15281="___________________________________________________X________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 +15281="____________________________________________________X_______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 +15281="_____________________________________________________X______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 +15281="______________________________________________________X_____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 +15281="_______________________________________________________X____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55 +15281="________________________________________________________X___": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56 +15281="_________________________________________________________X__": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57 +15281="__________________________________________________________X_": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 +15281="___________________________________________________________X": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 +15281="XX__________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_XX_________________________________________________________": 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__XX________________________________________________________": 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___XX_______________________________________________________": 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____XX______________________________________________________": 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____XX_____________________________________________________": 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______XX____________________________________________________": 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_______XX___________________________________________________": 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="________XX__________________________________________________": 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_________XX_________________________________________________": 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__________XX________________________________________________": 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___________XX_______________________________________________": 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____________XX______________________________________________": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____________XX_____________________________________________": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______________XX____________________________________________": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_______________XX___________________________________________": 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="________________XX__________________________________________": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_________________XX_________________________________________": 37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__________________XX________________________________________": 18,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___________________XX_______________________________________": 18,19,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____________________XX______________________________________": 18,19,20,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____________________XX_____________________________________": 18,19,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______________________XX____________________________________": 18,19,20,21,22,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_______________________XX___________________________________": 18,19,20,21,22,23,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="________________________XX__________________________________": 18,19,20,21,22,23,24,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_________________________XX_________________________________": 18,19,20,21,22,23,24,25,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="__________________________XX________________________________": 18,19,20,21,22,23,24,25,26,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="___________________________XX_______________________________": 18,19,20,21,22,23,24,25,26,27,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="____________________________XX______________________________": 18,19,20,21,22,23,24,25,26,27,28,48,49,50,51,52,53,54,55,56,57,58,59,60 +15281="_____________________________XX_____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,49,50,51,52,53,54,55,56,57,58,59,60 +15281="______________________________XX____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,50,51,52,53,54,55,56,57,58,59,60 +15281="_______________________________XX___________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,51,52,53,54,55,56,57,58,59,60 +15281="________________________________XX__________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,52,53,54,55,56,57,58,59,60 +15281="_________________________________XX_________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,53,54,55,56,57,58,59,60 +15281="__________________________________XX________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,54,55,56,57,58,59,60 +15281="___________________________________XX_______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,55,56,57,58,59,60 +15281="____________________________________XX______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,56,57,58,59,60 +15281="_____________________________________XX_____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,57,58,59,60 +15281="______________________________________XX____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,58,59,60 +15281="_______________________________________XX___________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,59,60 +15281="________________________________________XX__________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,60 +15281="_________________________________________XX_________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 +15281="__________________________________________XX________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42 +15281="___________________________________________XX_______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 +15281="____________________________________________XX______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44 +15281="_____________________________________________XX_____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15281="______________________________________________XX____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46 +15281="_______________________________________________XX___________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 +15281="________________________________________________XX__________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 +15281="_________________________________________________XX_________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 +15281="__________________________________________________XX________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 +15281="___________________________________________________XX_______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 +15281="____________________________________________________XX______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 +15281="_____________________________________________________XX_____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 +15281="______________________________________________________XX____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 +15281="_______________________________________________________XX___": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55 +15281="________________________________________________________XX__": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56 +15281="_________________________________________________________XX_": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57 +15281="__________________________________________________________XX": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 +15282="X___________________________________________________________": 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_X__________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__X_________________________________________________________": 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___X________________________________________________________": 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____X_______________________________________________________": 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____X______________________________________________________": 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______X_____________________________________________________": 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_______X____________________________________________________": 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="________X___________________________________________________": 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_________X__________________________________________________": 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__________X_________________________________________________": 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___________X________________________________________________": 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____________X_______________________________________________": 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____________X______________________________________________": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______________X_____________________________________________": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_______________X____________________________________________": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="________________X___________________________________________": 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_________________X__________________________________________": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__________________X_________________________________________": 18,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___________________X________________________________________": 18,19,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____________________X_______________________________________": 18,19,20,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____________________X______________________________________": 18,19,20,21,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______________________X_____________________________________": 18,19,20,21,22,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_______________________X____________________________________": 18,19,20,21,22,23,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="________________________X___________________________________": 18,19,20,21,22,23,24,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_________________________X__________________________________": 18,19,20,21,22,23,24,25,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__________________________X_________________________________": 18,19,20,21,22,23,24,25,26,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___________________________X________________________________": 18,19,20,21,22,23,24,25,26,27,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____________________________X_______________________________": 18,19,20,21,22,23,24,25,26,27,28,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____________________________X______________________________": 18,19,20,21,22,23,24,25,26,27,28,29,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______________________________X_____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_______________________________X____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,50,51,52,53,54,55,56,57,58,59,60 +15282="________________________________X___________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,51,52,53,54,55,56,57,58,59,60 +15282="_________________________________X__________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,52,53,54,55,56,57,58,59,60 +15282="__________________________________X_________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,53,54,55,56,57,58,59,60 +15282="___________________________________X________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,54,55,56,57,58,59,60 +15282="____________________________________X_______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,55,56,57,58,59,60 +15282="_____________________________________X______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,56,57,58,59,60 +15282="______________________________________X_____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,57,58,59,60 +15282="_______________________________________X____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,58,59,60 +15282="________________________________________X___________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,59,60 +15282="_________________________________________X__________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,60 +15282="__________________________________________X_________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42 +15282="___________________________________________X________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 +15282="____________________________________________X_______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44 +15282="_____________________________________________X______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15282="______________________________________________X_____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46 +15282="_______________________________________________X____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 +15282="________________________________________________X___________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 +15282="_________________________________________________X__________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 +15282="__________________________________________________X_________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 +15282="___________________________________________________X________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 +15282="____________________________________________________X_______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 +15282="_____________________________________________________X______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 +15282="______________________________________________________X_____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 +15282="_______________________________________________________X____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55 +15282="________________________________________________________X___": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56 +15282="_________________________________________________________X__": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57 +15282="__________________________________________________________X_": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 +15282="___________________________________________________________X": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 +15282="XX__________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_XX_________________________________________________________": 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__XX________________________________________________________": 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___XX_______________________________________________________": 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____XX______________________________________________________": 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____XX_____________________________________________________": 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______XX____________________________________________________": 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_______XX___________________________________________________": 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="________XX__________________________________________________": 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_________XX_________________________________________________": 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__________XX________________________________________________": 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___________XX_______________________________________________": 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____________XX______________________________________________": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____________XX_____________________________________________": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______________XX____________________________________________": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_______________XX___________________________________________": 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="________________XX__________________________________________": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_________________XX_________________________________________": 37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__________________XX________________________________________": 18,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___________________XX_______________________________________": 18,19,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____________________XX______________________________________": 18,19,20,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____________________XX_____________________________________": 18,19,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______________________XX____________________________________": 18,19,20,21,22,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_______________________XX___________________________________": 18,19,20,21,22,23,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="________________________XX__________________________________": 18,19,20,21,22,23,24,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_________________________XX_________________________________": 18,19,20,21,22,23,24,25,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="__________________________XX________________________________": 18,19,20,21,22,23,24,25,26,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="___________________________XX_______________________________": 18,19,20,21,22,23,24,25,26,27,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="____________________________XX______________________________": 18,19,20,21,22,23,24,25,26,27,28,48,49,50,51,52,53,54,55,56,57,58,59,60 +15282="_____________________________XX_____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,49,50,51,52,53,54,55,56,57,58,59,60 +15282="______________________________XX____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,50,51,52,53,54,55,56,57,58,59,60 +15282="_______________________________XX___________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,51,52,53,54,55,56,57,58,59,60 +15282="________________________________XX__________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,52,53,54,55,56,57,58,59,60 +15282="_________________________________XX_________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,53,54,55,56,57,58,59,60 +15282="__________________________________XX________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,54,55,56,57,58,59,60 +15282="___________________________________XX_______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,55,56,57,58,59,60 +15282="____________________________________XX______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,56,57,58,59,60 +15282="_____________________________________XX_____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,57,58,59,60 +15282="______________________________________XX____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,58,59,60 +15282="_______________________________________XX___________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,59,60 +15282="________________________________________XX__________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,60 +15282="_________________________________________XX_________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 +15282="__________________________________________XX________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42 +15282="___________________________________________XX_______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 +15282="____________________________________________XX______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44 +15282="_____________________________________________XX_____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15282="______________________________________________XX____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46 +15282="_______________________________________________XX___________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 +15282="________________________________________________XX__________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 +15282="_________________________________________________XX_________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 +15282="__________________________________________________XX________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 +15282="___________________________________________________XX_______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 +15282="____________________________________________________XX______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 +15282="_____________________________________________________XX_____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 +15282="______________________________________________________XX____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 +15282="_______________________________________________________XX___": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55 +15282="________________________________________________________XX__": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56 +15282="_________________________________________________________XX_": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57 +15282="__________________________________________________________XX": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 +15283="X___________________________________________________________": 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_X__________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__X_________________________________________________________": 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___X________________________________________________________": 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____X_______________________________________________________": 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____X______________________________________________________": 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______X_____________________________________________________": 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_______X____________________________________________________": 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="________X___________________________________________________": 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_________X__________________________________________________": 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__________X_________________________________________________": 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___________X________________________________________________": 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____________X_______________________________________________": 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____________X______________________________________________": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______________X_____________________________________________": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_______________X____________________________________________": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="________________X___________________________________________": 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_________________X__________________________________________": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__________________X_________________________________________": 18,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___________________X________________________________________": 18,19,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____________________X_______________________________________": 18,19,20,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____________________X______________________________________": 18,19,20,21,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______________________X_____________________________________": 18,19,20,21,22,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_______________________X____________________________________": 18,19,20,21,22,23,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="________________________X___________________________________": 18,19,20,21,22,23,24,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_________________________X__________________________________": 18,19,20,21,22,23,24,25,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__________________________X_________________________________": 18,19,20,21,22,23,24,25,26,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___________________________X________________________________": 18,19,20,21,22,23,24,25,26,27,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____________________________X_______________________________": 18,19,20,21,22,23,24,25,26,27,28,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____________________________X______________________________": 18,19,20,21,22,23,24,25,26,27,28,29,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______________________________X_____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_______________________________X____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,50,51,52,53,54,55,56,57,58,59,60 +15283="________________________________X___________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,51,52,53,54,55,56,57,58,59,60 +15283="_________________________________X__________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,52,53,54,55,56,57,58,59,60 +15283="__________________________________X_________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,53,54,55,56,57,58,59,60 +15283="___________________________________X________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,54,55,56,57,58,59,60 +15283="____________________________________X_______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,55,56,57,58,59,60 +15283="_____________________________________X______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,56,57,58,59,60 +15283="______________________________________X_____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,57,58,59,60 +15283="_______________________________________X____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,58,59,60 +15283="________________________________________X___________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,59,60 +15283="_________________________________________X__________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,60 +15283="__________________________________________X_________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42 +15283="___________________________________________X________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 +15283="____________________________________________X_______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44 +15283="_____________________________________________X______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15283="______________________________________________X_____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46 +15283="_______________________________________________X____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 +15283="________________________________________________X___________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 +15283="_________________________________________________X__________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 +15283="__________________________________________________X_________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 +15283="___________________________________________________X________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 +15283="____________________________________________________X_______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 +15283="_____________________________________________________X______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 +15283="______________________________________________________X_____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 +15283="_______________________________________________________X____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55 +15283="________________________________________________________X___": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56 +15283="_________________________________________________________X__": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57 +15283="__________________________________________________________X_": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 +15283="___________________________________________________________X": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 +15283="XX__________________________________________________________": 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_XX_________________________________________________________": 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__XX________________________________________________________": 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___XX_______________________________________________________": 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____XX______________________________________________________": 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____XX_____________________________________________________": 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______XX____________________________________________________": 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_______XX___________________________________________________": 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="________XX__________________________________________________": 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_________XX_________________________________________________": 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__________XX________________________________________________": 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___________XX_______________________________________________": 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____________XX______________________________________________": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____________XX_____________________________________________": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______________XX____________________________________________": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_______________XX___________________________________________": 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="________________XX__________________________________________": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_________________XX_________________________________________": 37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__________________XX________________________________________": 18,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___________________XX_______________________________________": 18,19,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____________________XX______________________________________": 18,19,20,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____________________XX_____________________________________": 18,19,20,21,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______________________XX____________________________________": 18,19,20,21,22,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_______________________XX___________________________________": 18,19,20,21,22,23,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="________________________XX__________________________________": 18,19,20,21,22,23,24,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_________________________XX_________________________________": 18,19,20,21,22,23,24,25,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="__________________________XX________________________________": 18,19,20,21,22,23,24,25,26,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="___________________________XX_______________________________": 18,19,20,21,22,23,24,25,26,27,47,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="____________________________XX______________________________": 18,19,20,21,22,23,24,25,26,27,28,48,49,50,51,52,53,54,55,56,57,58,59,60 +15283="_____________________________XX_____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,49,50,51,52,53,54,55,56,57,58,59,60 +15283="______________________________XX____________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,50,51,52,53,54,55,56,57,58,59,60 +15283="_______________________________XX___________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,51,52,53,54,55,56,57,58,59,60 +15283="________________________________XX__________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,52,53,54,55,56,57,58,59,60 +15283="_________________________________XX_________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,53,54,55,56,57,58,59,60 +15283="__________________________________XX________________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,54,55,56,57,58,59,60 +15283="___________________________________XX_______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,55,56,57,58,59,60 +15283="____________________________________XX______________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,56,57,58,59,60 +15283="_____________________________________XX_____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,57,58,59,60 +15283="______________________________________XX____________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,58,59,60 +15283="_______________________________________XX___________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,59,60 +15283="________________________________________XX__________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,60 +15283="_________________________________________XX_________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 +15283="__________________________________________XX________________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42 +15283="___________________________________________XX_______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43 +15283="____________________________________________XX______________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44 +15283="_____________________________________________XX_____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45 +15283="______________________________________________XX____________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46 +15283="_______________________________________________XX___________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 +15283="________________________________________________XX__________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48 +15283="_________________________________________________XX_________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49 +15283="__________________________________________________XX________": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 +15283="___________________________________________________XX_______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51 +15283="____________________________________________________XX______": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52 +15283="_____________________________________________________XX_____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53 +15283="______________________________________________________XX____": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 +15283="_______________________________________________________XX___": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55 +15283="________________________________________________________XX__": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56 +15283="_________________________________________________________XX_": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57 +15283="__________________________________________________________XX": 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58 +15284="0.012345678901234567890123456789012345678901234567890123456789": 62 +15284="0.0123456789012345678901234567890123456789012345678901234567890": 62 +15284="0.01234567890123456789012345678901234567890123456789012345678": +15284="A0.012345678901234567890123456789012345678901234567890123456789": 63 +15284="A0.0123456789012345678901234567890123456789012345678901234567890": 63 +15284="A0.012345678901234567890123456789012345678901234567890123456789": 63 +15284="Q0.0123456789012345678901234567890123456789012345678901234567890": 63 +15284="Q0.012345678901234567890123456789012345678901234567890123456789": 63 +15284="Q0.01234567890123456789012345678901234567890123456789012345678": +15284="_0.0123456789012345678901234567890123456789012345678901234567890": +15284="_0.012345678901234567890123456789012345678901234567890123456789": +15284="_0.01234567890123456789012345678901234567890123456789012345678": +15285="0.012345678901234567890123456789012345678901234567890123456789": 62 +15285="0.0123456789012345678901234567890123456789012345678901234567890": 62 +15285="0.01234567890123456789012345678901234567890123456789012345678": +15285="A0.012345678901234567890123456789012345678901234567890123456789": 63 +15285="A0.0123456789012345678901234567890123456789012345678901234567890": 63 +15285="A0.012345678901234567890123456789012345678901234567890123456789": 63 +15285="Q0.0123456789012345678901234567890123456789012345678901234567890": 63 +15285="Q0.012345678901234567890123456789012345678901234567890123456789": 63 +15285="Q0.01234567890123456789012345678901234567890123456789012345678": +15285="_0.0123456789012345678901234567890123456789012345678901234567890": 63 +15285="_0.012345678901234567890123456789012345678901234567890123456789": 63 +15285="_0.01234567890123456789012345678901234567890123456789012345678": diff --git a/tools/hscollider/test_cases/corpora/pug.txt b/tools/hscollider/test_cases/corpora/pug.txt new file mode 100644 index 000000000..ec4684e1f --- /dev/null +++ b/tools/hscollider/test_cases/corpora/pug.txt @@ -0,0 +1,209 @@ +5000="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5000="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 116 +5000="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 118 +5001="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5001="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 116 +5001="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 118 +5002="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5002="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118 +5003="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5003="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118 +5003="aaaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 120 +5004="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5004="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 117 +5004="ax:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 119 +5005="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5005="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 117 +5005="ax:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 119 +5006="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5006="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 119 +5006="aaaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 121 +5007="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5007="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 119 +5007="aaaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 121 +5008="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5008="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118 +5008="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 120 +5009="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5009="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118 +5009="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 120 +5010="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5010="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 120 +5010="aaaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 122 +5011="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": +5011="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 120 +5011="aaaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 122 +5012="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150 +5012="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149 +5012="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150 +5013="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150 +5013="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149 +5013="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150 +5014="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150 +5014="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149 +5014="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150 +5015="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150 +5015="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149 +5015="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150 +5016="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149 +5016="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148 +5016="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153 +5017="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149 +5017="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148 +5017="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153 +5018="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149 +5018="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148 +5018="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153 +5019="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149 +5019="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148 +5019="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153 +5020="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151 +5020="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150 +5020="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156 +5021="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151 +5021="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150 +5021="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156 +5022="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151 +5022="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150 +5022="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156 +5023="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151 +5023="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150 +5023="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156 +5024="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpug": 155 +5024="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpug": 153,156 +5024="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpug": 154,157 +5025="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpug": 153,154,155 +5025="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpug": 153,154,155,156 +5025="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpug": 154,155,156,157 +5026="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 155 +5026="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 153,156 +5026="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 154,157 +5027="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 153,154,155 +5027="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 153,154,155,156 +5027="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 154,155,156,157 +5028="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpug": 155,158 +5028="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpug": 156,159 +5028="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpug": 154,157,160 +5029="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpug": 154,155,156,157,158 +5029="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpug": 154,155,156,157,158,159 +5029="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpug": 154,155,156,157,158,159,160 +5030="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 155,158 +5030="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 156,159 +5030="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,157,160 +5031="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,155,156,157,158 +5031="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,155,156,157,158,159 +5031="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,155,156,157,158,159,160 +5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpug": 158,161,164,167 +5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpug": 162,165,168,171 +5032="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpug": 157,160,163 +5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpug": +5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpug": +5032="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpug": +5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpug": 158,159,160,161,162,163,164,165,166,167 +5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpug": 162,163,164,165,166,167,168,169,170,171 +5033="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpug": 155,156,157,158,159,160,161,162,163 +5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpug": +5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpug": +5033="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpug": +5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": +5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": +5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": 157,160,163 +5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpug": +5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpug": +5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpug": +5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": +5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": +5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": 155,156,157,158,159,160,161,162,163 +5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpug": +5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpug": +5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpug": +5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpug": 173,176,179,182,185,188,191 +5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug": 177,180,183,186,189 +5036="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181 +5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpug": +5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug": +5036="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpug": +5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpug": 172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191 +5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug": 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189 +5037="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpug": 169,170,171,172,173,174,175,176,177,178,179,180,181 +5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpug": +5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug": +5037="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpug": +5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpug": +5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181 +5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpug": +5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": 169,170,171,172,173,174,175,176,177,178,179,180,181 +5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpug": +5040="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 170,173,176,179,182,185,188,191 +5040="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 175,178,181,184,187,190 +5040="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181 +5040="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug": +5040="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": +5040="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug": +5041="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191 +5041="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190 +5041="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 167,168,169,170,171,172,173,174,175,176,177,178,179,180,181 +5041="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug": +5041="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": +5041="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug": +5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug": +5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5042="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181 +5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5042="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug": +5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5043="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 167,168,169,170,171,172,173,174,175,176,177,178,179,180,181 +5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5043="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5044="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 173,176,179,182,185,188,191,194 +5044="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 175,178,181,184,187,190,193 +5044="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdaapugabcdabcdabcdabcdabcdabcdabcdaapugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181,184 +5044="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug": +5044="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": +5044="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug": +5045="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194 +5045="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193 +5045="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdaapugabcdabcdabcdabcdabcdabcdabcdaapugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184 +5045="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug": +5045="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": +5045="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug": +5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug": +5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5046="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181,184 +5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5046="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug": +5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5047="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184 +5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5047="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": +5048="X:yab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab pugpug": 126,127,128,129 +5048="x:Yab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab aapugpug": 125,126,127,128 +5048="x:yab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab aapugpug": 125,126,127,128 +5049="X:yabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcpugpug": 126,127,128,129 +5049="x:Yabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcaapugpug": +5049="x:yabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcaapugpugb": 125,126,127,128 +5900="xyd;add": +5900="xyd;ddayfadddddEA": 13,15,16,17 +5901="a- x- x- xa- x- x- x- xbb- x- x- x--cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddg": 116 +5901="cc- x- x-a- x- x- x- x- xbb- x- x-cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddg": 117 +5901="cc- x- x-a- x- x- x- x- x--bb- xcc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x--ddg": 117 +5901="cc- x- x-a- x- x- x- x- x--BB- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x-ddgddgddgddgddgddgddg": 144,147,150 +5901="cc- x- x-a- x- x- x- x- x--Ba- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x-ddgddgddgddgddgddgddg": 144,147,150 +5901="cc- x- x-a- x- x- x- x- x--Bcc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddgddgddgddgddgddgddg": 144,147,150 +5901="cc- x- x-a- x- x- x- x- x--Bbb- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddgddgddgddgddgddgddg": 144,147,150 +5902="a- x- x- xa- x- x- x- xbb- x- x- x--cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xyddg": 117 +5902="cc- x- x-a- x- x- x- x- xbb- x- x-cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xyddg": 118 +5902="cc- x- x-a- x- x- x- x- x--bb- xcc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x--yddg": 118 diff --git a/tools/hscollider/test_cases/corpora/redundancy.txt b/tools/hscollider/test_cases/corpora/redundancy.txt new file mode 100644 index 000000000..16a4d0d39 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/redundancy.txt @@ -0,0 +1,896 @@ +15100="hatstandteakettle": 17 +15100="hatstand teakettle": 18 +15100="hatstand teakettle": 21 +15100="hatstandateakettle": 18 +15100="hatstandaaaaateakettle": 22 +15100="hatstandeakettle": +15101="foobar": +15101="fooAbar": 7 +15101="fooAAbar": +15102="foobar": +15102="foo1bar": 7 +15102="foo2bar": 7 +15102="foo3bar": 7 +15102="foo4bar": 7 +15102="foo5bar": +15103="abc": 3 +15103="aabc": 4 +15103="aaabc": 5 +15103="aaaabc": 6 +15103="aaaaaaaaaaaaaaaaaaaaaaaaaaabc": 29 +15103="aaaaaaaaaaaaaaaaaaaaaaaaaa\nabc": +15103="aaaaaaaaaaaaaaaaaaaaaaaaaaa\nbc": +15104="fooaabar": 8 +15104="fooAabar": 8 +15104="fooAAbar": +15104="fooabar": +15104="fooAbar": +15104="fooabbar": +15104="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +15105="fooaabar": 8 +15105="fooAabar": 8 +15105="fooAAbar": +15105="fooabar": +15105="fooAbar": +15105="fooabbar": +15105="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +15105="fooaBbar": 8 +15105="fooaBBbar": 9 +15105="fooaBBBbar": 10 +15106="fooaabar": 8 +15106="fooBBbar": 8 +15106="fooAabar": 8 +15106="fooAAbar": +15106="fooabar": +15106="fooAbar": +15106="fooabbar": +15106="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +15106="fooaBbar": 8 +15106="fooaBBbar": 9 +15106="fooaBBBbar": 10 +15107="fooaabar": 8 +15107="fooBBbar": 8 +15107="fooAabar": 8 +15107="fooAAbar": +15107="fooabar": 7 +15107="fooAbar": +15107="fooabbar": +15107="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +15107="fooaBbar": 8 +15107="fooaBBbar": 9 +15107="fooaBBBbar": 10 +15107="fooabar": 7 +15107="fooBbar": 7 +15107="fooabar": 7 +15107="fooAbar": +15107="foobar": +15107="foobar": +15107="foobbar": +15107="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +15107="foobar": +15107="fooBBbar": 8 +15107="fooBBBbar": 9 +15108="fooaabar": 8 +15108="fooBBbar": 8 +15108="fooAabar": 8 +15108="fooAAbar": +15108="fooabar": 7 +15108="fooAbar": +15108="fooabbar": +15108="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39 +15108="fooaBbar": 8 +15108="fooaBBbar": 9 +15108="fooaBBBbar": 10 +15108="fooabar": 7 +15108="fooBbar": 7 +15108="fooabar": 7 +15108="fooAbar": +15108="foobar": +15108="foobar": +15108="foobbar": +15108="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38 +15108="foobar": +15108="fooBBbar": 8 +15108="fooBBBbar": 9 +15109="abde": 4 +15109="abdde": 5 +15109="abXde": +15109="acde": +15109="acXde": 5 +15109="acXXde": 6 +15109="acXdde": 6 +15110="abde": 4 +15110="abdde": 5 +15110="abXde": +15110="acde": 4 +15110="acXde": 5 +15110="acXXde": 6 +15110="acXdde": 6 +15120="foobar": 6 +15120="fooXbar": 7 +15120="fooXXbar": 8 +15120="fooabar": 7 +15120="fooXabar": 8 +15120="fooaXbar": 8 +15120="fooaaaabar": 10 +15120="fooaaXaabar": 11 +15121="foobar": 6 +15121="fooXbar": 7 +15121="fooXXbar": 8 +15121="fooabar": 7 +15121="fooXabar": 8 +15121="fooaXbar": 8 +15121="fooaaaabar": 10 +15121="fooaaXaabar": 11 +15122="foobar": 6 +15122="fooXbar": 7 +15122="fooXXbar": 8 +15122="fooabar": 7 +15122="fooXabar": 8 +15122="fooaXbar": 8 +15122="fooaaaabar": 10 +15122="fooaaXaabar": 11 +15123="foobar": 6 +15123="fooXbar": 7 +15123="fooXXbar": 8 +15123="fooabar": 7 +15123="fooXabar": 8 +15123="fooaXbar": 8 +15123="fooaaaabar": 10 +15123="fooaaXaabar": 11 +15124="foobar": +15124="fooXbar": +15124="fooXXbar": +15124="fooabar": 7 +15124="fooXabar": 8 +15124="fooaXbar": +15124="fooaaaabar": 10 +15124="fooaaXaabar": 11 +15125="foobar": +15125="fooXbar": +15125="fooXXbar": +15125="fooabar": 7 +15125="fooXabar": +15125="fooaXbar": 8 +15125="fooaaaabar": 10 +15125="fooaaXaabar": 11 +15126="foobar": +15126="fooXbar": 7 +15126="fooXXbar": 8 +15126="fooabar": 7 +15126="fooXabar": 8 +15126="fooaXbar": 8 +15126="fooaaaabar": 10 +15126="fooaaXaabar": 11 +15127="foobar": +15127="fooXbar": 7 +15127="fooXXbar": 8 +15127="fooabar": 7 +15127="fooXabar": 8 +15127="fooaXbar": 8 +15127="fooaaaabar": 10 +15127="fooaaXaabar": 11 +15128="foobar": +15128="fooXbar": 7 +15128="fooXXbar": 8 +15128="fooabar": 7 +15128="fooXabar": 8 +15128="fooaXbar": 8 +15128="fooaaaabar": 10 +15128="fooaaXaabar": 11 +15129="foobar": +15129="fooXbar": 7 +15129="fooXXbar": 8 +15129="fooabar": 7 +15129="fooXabar": 8 +15129="fooaXbar": 8 +15129="fooaaaabar": 10 +15129="fooaaXaabar": 11 +15130="foobar": +15130="fooXbar": +15130="fooXXbar": +15130="fooabar": +15130="fooXabar": 8 +15130="fooaXbar": +15130="fooaaaabar": 10 +15130="fooaaXaabar": 11 +15131="foobar": +15131="fooXbar": +15131="fooXXbar": +15131="fooabar": +15131="fooXabar": +15131="fooaXbar": 8 +15131="fooaaaabar": 10 +15131="fooaaXaabar": 11 +15132="abcdef": 6 +15132="abcadef": 7 +15132="abcaadef": 8 +15132="abcaaaaadef": 11 +15132="abcaaaaaadef": 12 +15132="abcaaaaaaadef": +15133="AAAAZZZZ": 8 +15133="AAAA_ZZZ": 8 +15133="AAA_AZZZ": +15133="AAAAA_ZZZ": 9 +15133="AAAAA__ZZZZ": 10,11 +15133="AAAA_A__ZZZZ": 11,12 +15133="AAAA_A__ZZZZ": 11,12 +15134="/(Y.|X.+)a[^a]*foo/s": 18 +15134="Yya_foo": 7 +15134="Yyaafoo": +15134="Xya_foo": 7 +15134="Xyaafoo": 7 +15135="oof_ayY": 7 +15135="oofaayY": +15135="oof_ayX": 7 +15135="oofaayX": 7 +15136="foo<<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 10,11,12,13,14,33 +88109="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,63,64,65,66,83,144,226,288,366,380 +88109="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 10,11,12,13,14,33,134,161 +88110="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,175,176,177,178,211,212,213,214,247,248,249,250,283,284,285,286,319,320,321,322 +88110="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,96,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123 +88111="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,105,106,107,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,141,142,143,145,147,149,151,153,155,157,159,161,163,164,165,167,169,171,173,175,176,177,178,179,181,183,184,185,186,187,189,190,191,193,195,197,198,199,200,201,203,204,205,206,207,208,209,211,212,213,214,215,217,219,221,223,225,227,229,231,233,235,237,239,241,243,245,247,248,249,250,251,253,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,284,285,286,287,289,291,293,295,297,299,301,303,305,307,308,309,311,313,315,317,319,320,321,322,323,325,327,328,329,330,331,333,334,335,337,339,341,342,343,344,345,347,348,349,350,351,352,353,355,357,359,361,363,365,367,369,371,373,375,377,379,381,383,385,387,389,391,393,395,396,397,398 +88111="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,96,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,171,179,180,182,186,187,189,190,191,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,249,250,251,252,253,254,255,256 +88112="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,68,69,70,71,104,105,106,107,140,141,142,143,175,176,177,178,211,212,213,214,247,248,249,250,283,284,285,286,319,320,321,322 +88113="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,68,69,70,71,104,105,106,107,140,141,142,143,164,175,176,177,178,184,186,190,198,200,204,206,208,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,435,437,439,441,443,445,447,449,451,453,455 +88114="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,69,105,141,142,176,177,212,213,248,249,284,285,320,321 +88115="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,69,105,141,142,164,176,177,190,200,212,213,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,249,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,284,285,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,321,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,376,435,437,439,441,443,445,447,449,451,453,455 +88116="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,144 +88117="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,144,379,382,385,388,391,394,397,400,403,406,409,412,415,421,430,433 +88118="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,68,70,71,104,106,107,140,143,175,178,211,214,247,250,283,286,319,322 +88119="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,68,70,71,104,106,107,140,143,175,178,211,214,247,250,283,286,319,322,356,358,360,362,364,366,368,370,372,374 +88120="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,69,105,141,142,176,177,212,213,248,249,284,285,320,321 +88121="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,69,105,141,142,176,177,190,212,213,248,249,282,284,285,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,321,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,439,445,451,455 +88122="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,69,105,141,142,176,177,212,213,248,249,284,285,320,321 +88123="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,69,105,141,142,164,176,177,190,200,212,213,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,249,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,284,285,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,321,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,376,435,437,439,441,443,445,447,449,451,453,455 +88124="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61 +88125="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,252,254,256,258,260,262,264,268,270,272,274,276,278,280,435,441,447 +88126="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,69,105,141,142,176,177,212,213,248,249,284,285,320,321 +88126="k": 1 +88126="K": 1 +88126="\xe2\x84\xaa": +88127="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,69,105,141,142,164,176,177,190,200,212,213,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,249,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,284,285,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,321,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,376,435,437,439,441,443,445,447,449,451,453,455 +88128="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,63,64,65,66,144 +88129="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,63,64,65,66,83,144,379,382,385,388,391,394,397,400,403,406,409,412,415,421,424,427,430,433 +88130="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,175,176,177,178,211,212,213,214,247,248,249,250,283,284,285,286,319,320,321,322 +88131="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,164,175,176,177,178,184,186,190,198,200,204,206,208,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,435,437,439,441,443,445,447,449,451,453,455 +88132="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,63,64,65,66,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,424,427,430,433,435,437,439,441,443,445,447,449,451,453,455 +88133="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,63,64,65,66,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,144,146,148,150,152,154,156,158,160,162,166,168,170,172,174,180,182,188,192,194,196,202,210,266,338,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,424,427,430,433 +88134="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,175,176,177,178,211,212,213,214,247,248,249,250,283,284,285,286,319,320,321,322 +88135="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,175,176,177,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,418,435,437,439,441,443,445,447,449,451,453,455 +88135="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107 +88135="0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98": 1,2,3,4,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,36,37,38,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,72,73,74,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107,108,109,110,111,113,115,117,119,121,123,125,127,129 +88135="\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80": 2,4,6,8,10,12,14,15,16,17,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,51,52,53,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108 +88135="\xe1\xa0\x8e": +88135="\xe2\x80\x80": +88135="\xe2\x80\x81": +88135="\xe2\x80\x82": +88135="\xe2\x80\x83": +88135="\xe2\x80\x84": +88135="\xe2\x80\x85": +88135="\xe2\x80\x86": +88135="\xe2\x80\x87": +88135="\xe2\x80\x88": +88135="\xe2\x80\x89": +88135="\xe2\x80\x8a": +88135="\xe2\x80\x8b": 3 +88135="\xe2\x80\xaf": +88135="\xe2\x80\xa8": +88135="\xe2\x80\xa9": +88135="\xe2\x81\x9f": +88135="\xe3\x80\x80": +88135="\xc7\x84": 2 +88135="\xc7\x85": 2 +88135="\xc7\x86": 2 +88135="\xc7\x87": 2 +88135="\xc7\x88": 2 +88135="\xc7\x89": 2 +88135="\xc7\x8a": 2 +88135="\xc7\x8b": 2 +88135="\xc7\x8c": 2 +88135="\xc7\xb2": 2 +88135="\xc7\xb3": 2 +88136="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 63,64,65,66 +88137="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 63,64,65,66 +88138="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,144,379,382,385,388,391,394,397,400,403,406,409,412,415,421,430,433 +88139="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 62,144,379,382,385,388,391,394,397,400,403,406,409,412,415,421,430,433 +88140="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,65,66,67,68,69,70,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,104,105,106,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,140,141,142,143,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,175,176,177,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,418,424,427,435,437,439,441,443,445,447,449,451,453,455 +88141="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,65,66,67,68,69,70,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,104,105,106,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,140,141,142,143,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,175,176,177,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,418,424,427,435,437,439,441,443,445,447,449,451,453,455 +88142="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 63,64,65,66,83,424,427 +88143="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 63,64,65,66,83,424,427 +88144="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,67,68,69,70,71,73,75,77,79,81,85,87,89,91,93,95,97,99,101,103,104,105,106,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,140,141,142,143,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,175,176,177,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,430,433,435,437,439,441,443,445,447,449,451,453,455 +88145="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xe1\x9a\x80\xe1\xa0\x8e\xe2\x80\x80\xe2\x80\x81\xe2\x80\x82\xe2\x80\x83\xe2\x80\x84\xe2\x80\x85\xe2\x80\x86\xe2\x80\x87\xe2\x80\x88\xe2\x80\x89\xe2\x80\x8a\xe2\x80\x8b\xe2\x80\xaf\xe2\x80\xa8\xe2\x80\xa9\xe2\x81\x9f\xe3\x80\x80\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,67,68,69,70,71,73,75,77,79,81,85,87,89,91,93,95,97,99,101,103,104,105,106,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,140,141,142,143,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,175,176,177,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,430,433,435,437,439,441,443,445,447,449,451,453,455 +89000="foobar": +89000="foo_bar": +89000="foo__bar": +89000="foo bar": +89000="foo bar": +89000="foo bar": +89000="foo_ bar": 8 +89000="foo\xc3\xb4 bar": 9 +89000="foo\xc3\xb4\xc3\xb4bar": +89000="foo\xc3\xb4\xf0\x9f\x92\xa9bar": 12 +89001="": +89001="a": 0,1 +89001="~": +89001="a~": 0,1 +89001="~a": 1,2 +89001="aa": 0,2 +89001="~~": +89001="a~a": 0,1,2,3 +89001="~a~": 1,2 +89001="aaa": 0,3 +89001="~~~": +89001="a~~": 0,1 +89001="~aa": 1,3 +89001="aa~": 0,2 +89001="~~a": 2,3 +89001="a\xc3\xb4": 0,1 +89001="~\xc3\xb4": +89001="\xc3\xb4a": 2,3 +89001="\xc3\xb4~": +89002="": 0 +89002="a": +89002="~": 0,1 +89002="a~": 2 +89002="~a": 0 +89002="aa": 1 +89002="~~": 0,1,2 +89002="a~a": +89002="~a~": 0,3 +89002="aaa": 1,2 +89002="~~~": 0,1,2,3 +89002="a~~": 2,3 +89002="~aa": 0,2 +89002="aa~": 1,3 +89002="~~a": 0,1 +89002="a\xc3\xb4": 3 +89002="~\xc3\xb4": 0,1,3 +89002="\xc3\xb4a": 0 +89002="\xc3\xb4~": 0,2,3 +89003="foo": 3 +89003="afooa": +89003=" foo": 4 +89003="\xc3\xb4foo\xc3\xb4": 5 +89003="\xe2\x81\x80foo\xe2\x80\xbf": 6 +89003="\xef\xb9\x8efoo\xef\xb9\x8e": 6 +89003="\xef\xb9\x8e\xef\xb9\x8e": +89003="\xc3\xb4\xc3\xb4": +89003="\xef\xb9\x8e\xc3\xb4": +89003="\xc3\xb4\xef\xb9\x8e": +89004="foo": 3 +89004="afooa": +89004=" foo": 4 +89004="\xc3\xb4foo\xc3\xb4": +89004="\xe2\x81\x80foo\xe2\x80\xbf": 6 +89004="\xef\xb9\x8efoo\xef\xb9\x8e": 6 +89004="\xef\xb9\x8e\xef\xb9\x8e": +89004="\xc3\xb4\xc3\xb4": +89004="\xef\xb9\x8e\xc3\xb4": +89004="\xc3\xb4\xef\xb9\x8e": +89005="foo": 3 +89005="afooa": +89005=" foo": 4 +89005="\xc3\xb4foo\xc3\xb4": 5 +89005="\xe2\x81\x80foo\xe2\x80\xbf": 6 +89005="\xef\xb9\x8efoo\xef\xb9\x8e": 6 +89005="\xef\xb9\x8e\xef\xb9\x8e": +89005="\xc3\xb4\xc3\xb4": +89005="\xef\xb9\x8e\xc3\xb4": +89005="\xc3\xb4\xef\xb9\x8e": +89006="foo": 3 +89006="afooa": +89006=" foo": 4 +89006="\xc3\xb4foo\xc3\xb4": +89006="\xe2\x81\x80foo\xe2\x80\xbf": 6 +89006="\xef\xb9\x8efoo\xef\xb9\x8e": 6 +89006="\xef\xb9\x8e\xef\xb9\x8e": +89006="\xc3\xb4\xc3\xb4": +89006="\xef\xb9\x8e\xc3\xb4": +89006="\xc3\xb4\xef\xb9\x8e": +89007="foo": +89007="afooa": 4 +89007=" foo": +89007="\xc3\xb4foo\xc3\xb4": +89007="\xe2\x81\x80foo\xe2\x80\xbf": +89007="\xef\xb9\x8efoo\xef\xb9\x8e": +89007="\xef\xb9\x8e\xef\xb9\x8e": +89007="\xc3\xb4\xc3\xb4": +89007="\xef\xb9\x8e\xc3\xb4": +89007="\xc3\xb4\xef\xb9\x8e": +89008="foo": +89008="afooa": 4 +89008=" foo": +89008="\xc3\xb4foo\xc3\xb4": 5 +89008="\xe2\x81\x80foo\xe2\x80\xbf": +89008="\xef\xb9\x8efoo\xef\xb9\x8e": +89008="\xef\xb9\x8e\xef\xb9\x8e": +89008="\xc3\xb4\xc3\xb4": +89008="\xef\xb9\x8e\xc3\xb4": +89008="\xc3\xb4\xef\xb9\x8e": +89009="foo": +89009="afooa": 4 +89009=" foo": +89009="\xc3\xb4foo\xc3\xb4": +89009="\xe2\x81\x80foo\xe2\x80\xbf": +89009="\xef\xb9\x8efoo\xef\xb9\x8e": +89009="\xef\xb9\x8e\xef\xb9\x8e": +89009="\xc3\xb4\xc3\xb4": +89009="\xef\xb9\x8e\xc3\xb4": +89009="\xc3\xb4\xef\xb9\x8e": +89010="foo": +89010="afooa": 4 +89010=" foo": +89010="\xc3\xb4foo\xc3\xb4": 5 +89010="\xe2\x81\x80foo\xe2\x80\xbf": +89010="\xef\xb9\x8efoo\xef\xb9\x8e": +89010="\xef\xb9\x8e\xef\xb9\x8e": +89010="\xc3\xb4\xc3\xb4": +89010="\xef\xb9\x8e\xc3\xb4": +89010="\xc3\xb4\xef\xb9\x8e": +89011="foo": +89011="afooa": +89011=" foo": +89011="\xc3\xb4foo\xc3\xb4": 7 +89011="\xe2\x81\x80foo\xe2\x80\xbf": +89011="\xef\xb9\x8efoo\xef\xb9\x8e": +89011="\xef\xb9\x8e\xef\xb9\x8e": +89011="\xc3\xb4\xc3\xb4": +89011="\xef\xb9\x8e\xc3\xb4": +89011="\xc3\xb4\xef\xb9\x8e": +89012="foo": +89012="afooa": +89012=" foo": +89012="\xc3\xb4foo\xc3\xb4": 2 +89012="\xe2\x81\x80foo\xe2\x80\xbf": +89012="\xef\xb9\x8efoo\xef\xb9\x8e": +89012="\xef\xb9\x8e\xef\xb9\x8e": +89012="\xc3\xb4\xc3\xb4": 2 +89012="\xef\xb9\x8e\xc3\xb4": 5 +89012="\xc3\xb4\xef\xb9\x8e": 2 +89013="foo": +89013="afooa": +89013=" foo": +89013="\xc3\xb4foo\xc3\xb4": 2 +89013="\xe2\x81\x80foo\xe2\x80\xbf": +89013="\xef\xb9\x8efoo\xef\xb9\x8e": +89013="\xef\xb9\x8e\xef\xb9\x8e": +89013="\xc3\xb4\xc3\xb4": +89013="\xef\xb9\x8e\xc3\xb4": +89013="\xc3\xb4\xef\xb9\x8e": +89014="foo": +89014="afooa": +89014=" foo": +89014="\xc3\xb4foo\xc3\xb4": 7 +89014="\xe2\x81\x80foo\xe2\x80\xbf": +89014="\xef\xb9\x8efoo\xef\xb9\x8e": +89014="\xef\xb9\x8e\xef\xb9\x8e": +89014="\xc3\xb4\xc3\xb4": 4 +89014="\xef\xb9\x8e\xc3\xb4": 5 +89014="\xc3\xb4\xef\xb9\x8e": 2 +89015="foo": +89015="afooa": +89015=" foo": +89015="\xc3\xb4foo\xc3\xb4": +89015="\xe2\x81\x80foo\xe2\x80\xbf": +89015="\xef\xb9\x8efoo\xef\xb9\x8e": 9 +89015="\xef\xb9\x8e\xef\xb9\x8e": +89015="\xc3\xb4\xc3\xb4": +89015="\xef\xb9\x8e\xc3\xb4": +89015="\xc3\xb4\xef\xb9\x8e": +89016="foo": +89016="afooa": +89016=" foo": +89016="\xc3\xb4foo\xc3\xb4": +89016="\xe2\x81\x80foo\xe2\x80\xbf": +89016="\xef\xb9\x8efoo\xef\xb9\x8e": 9 +89016="\xef\xb9\x8e\xef\xb9\x8e": +89016="\xc3\xb4\xc3\xb4": +89016="\xef\xb9\x8e\xc3\xb4": +89016="\xc3\xb4\xef\xb9\x8e": 5 +89017="foo": +89017="afooa": +89017=" foo": +89017="\xc3\xb4foo\xc3\xb4": +89017="\xe2\x81\x80foo\xe2\x80\xbf": +89017="\xef\xb9\x8efoo\xef\xb9\x8e": 3 +89017="\xef\xb9\x8e\xef\xb9\x8e": +89017="\xc3\xb4\xc3\xb4": +89017="\xef\xb9\x8e\xc3\xb4": +89017="\xc3\xb4\xef\xb9\x8e": +89018="foo": +89018="afooa": +89018=" foo": +89018="\xc3\xb4foo\xc3\xb4": +89018="\xe2\x81\x80foo\xe2\x80\xbf": +89018="\xef\xb9\x8efoo\xef\xb9\x8e": 3 +89018="\xef\xb9\x8e\xef\xb9\x8e": +89018="\xc3\xb4\xc3\xb4": +89018="\xef\xb9\x8e\xc3\xb4": 3 +89019:K +89100="\xe7\xa9\xba": 3 +89100="\xd8\xad\xd8\xb1\xd9\x8a\xd8\xa9": +89100="\xc3\xa6": +89100="\xc4\x80": +89101="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,164,175,176,177,178,184,186,190,198,200,204,206,208,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398 +89102="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,164,175,176,177,178,184,186,190,198,200,204,206,208,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398 +89103="\xe7\xa9\xba": 3 +89103="\xd8\xad\xd8\xb1\xd9\x8a\xd8\xa9": +89103="\xc3\xa6": +89103="\xc4\x80": +89104:𒀀 +89104:12000 +89105="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,164,175,176,177,178,184,186,190,198,200,204,206,208,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398 +89106="1234567890abcdefghojlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \n\x0b\x0c\r_0x80\xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f0x90\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f0xa0 \xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf0xb0\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf0xc0\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f0xd0\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f0xe0\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf0xf0\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\xdf\x80\xdf\x81\xdf\x82\xdf\x83\xdf\x84\xdf\x85\xdf\x86\xdf\x87\xdf\x88\xdf\x89\xdf\x8a\xc7\x84\xc7\x85\xc7\x86\xc7\x87\xc7\x88\xc7\x89\xc7\x8a\xc7\x8b\xc7\x8c\xc7\xb2\xc7\xb3": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,67,68,69,70,71,104,105,106,107,140,141,142,143,164,175,176,177,178,184,186,190,198,200,204,206,208,211,212,213,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,247,248,249,250,252,254,256,258,260,262,264,268,270,272,274,276,278,280,282,283,284,285,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,319,320,321,322,324,326,328,330,332,334,336,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398 diff --git a/tools/hscollider/test_cases/corpora/vacuous.txt b/tools/hscollider/test_cases/corpora/vacuous.txt new file mode 100644 index 000000000..71eb1ef09 --- /dev/null +++ b/tools/hscollider/test_cases/corpora/vacuous.txt @@ -0,0 +1,153 @@ +22000="": 0 +22000="foo": 0,1,2,3 +22001="": 0 +22001="foo": 0,1,2,3 +22002="": 0 +22002="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 +22003="": 0 +22003="foo": 0,1,2,3 +22004="": 0 +22004="foo": 0,1,2,3 +22005="": 0 +22005="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 +22006="": 0 +22006="foo": 0,1,2,3 +22006="foofoo": 0,1,2,3,4,5,6 +22006="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 +22007="": 0 +22007="foo": 0,1,2,3 +22007="foofoo": 0,1,2,3,4,5,6 +22007="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 +22008="": 0 +22008="foo": 0,1,2,3 +22008="foofoo": 0,1,2,3,4,5,6 +22008="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 +22009="": 0 +22009="foo": 0,1,2,3 +22009="foofoo": 0,1,2,3,4,5,6 +22009="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 +22010="": 0 +22010="foo": 0,1,2,3 +22011="": 0 +22011="foo": 0,1 +22012="": 0 +22012="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 +22013="": 0 +22013="foo": 0,1,2,3 +22014="": 0 +22014="foo": 0,1 +22015="": 0 +22015="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 +22016="": 0 +22016="foo": 0,3 +22016="foofoo": 0,3 +22016="foofoofoofoofoofoo": 0,3 +22017="": 0 +22017="foo": 0,1,3 +22017="foofoo": 0,1,3 +22017="foofoofoofoofoofoo": 0,1,3 +22018="": 0 +22018="foo": 0,1,2,3 +22018="foofoo": 0,1,2,3,4,5,6 +22018="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 +22019="": 0 +22019="foo": 0,1,2,3 +22019="foofoo": 0,1,2,3,4,5,6 +22019="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 +22020="": 0 +22020="a": +22020="aaaa": +22021="": 0 +22021="a": +22021="aaaa": +22022="": 0 +22022="\n": 0,1 +22022="foo\n": 3,4 +22022="foo": 3 +22023="": 0 +22023="\n": 1 +22023="foo\n": 3,4 +22023="foo": 3 +22024="": 0 +22024="\n": 0,1 +22024="a": 0,1 +22024="a\n": 0,1,2 +22025="": 0 +22025="\n": 0,1 +22025="a": 0,1 +22025="a\n": 0,1,2 +22026="": 0 +22026="a": 0,1 +22026="\n": 0,1 +22026="a\n": 0,2 +22027="": 0 +22027="a": 0,1 +22027="aa": 0,1 +22027="a\na": 0,1,2,3 +22027="foo\na": 0,4,5 +22027="foo\nfooa": 0,4 +22027="\n": 0 +22027="\na": 0,1,2 +22028="": 0 +22028="\n": 0 +22028="\na": 0 +22028="\n\n": 0,1 +22028="\na\n": 0 +22028="\n\n\n": 0,1,2 +22028="\n\n\n\n\n\n\n\n\n\n": 0,1,2,3,4,5,6,7,8,9 +22029="": +22029="a": 1 +22029="aa": 1,2 +22029="aaa": 1,2,3 +22029="aaaa": 1,2,3,4 +22029="aaaaa": 1,2,3,4,5 +22029="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122 +22030="": 0 +22030="\n": 0 +22030="\n\n": 0,1 +22030="foo": 0 +22030="foo\n": 0 +22031="": 0 +22031="\n": 0,1 +22031="\n\n": 0,1,2 +22031="foo": 3 +22031="foo\n": 3,4 +22032="": 0 +22032="\n": 1 +22032="\n\n": 2 +22032="foo": 3 +22032="foo\n": 4 +22033="": 0 +22033="\n": 0,1 +22033="\n\n": 1,2 +22033="foo": 3 +22033="foo\n": 3,4 +22034="": 0 +22034="\n": +22034="\n\n": +22034="foo": +22034="foo\n": +22035="": +22035="\n": 1 +22035="a": 1 +22035="\na": 1,2 +22035="a\n": 1 +22035="foo\n": 1 +22035="foo\na": 1,5 +22035="foo\n\n": 1,5 +22036="": 0 +22036="\n": 0,1 +22036="a": 0,1 +22036="a\n": 0,1 +22036="\na": 0,1,2 +22036="foo": 0,1 +22036="foo\n": 0,1 +22036="foo\na": 0,1,4,5 +22036="foo\n\n": 0,1,4,5 +22037="": 0 +22037="foo": 3 +22037="foo\n": 3,4 +22037="a\nfoo\n": 1,5,6 +22037="a\nfoo\nfoo": 1,5,9 +22037="a\nfoo\nfooa": 1,5,9,10 +22038:a diff --git a/tools/hscollider/test_cases/pcre/accel.txt b/tools/hscollider/test_cases/pcre/accel.txt new file mode 100644 index 000000000..6adc4000b --- /dev/null +++ b/tools/hscollider/test_cases/pcre/accel.txt @@ -0,0 +1,3 @@ +2000:/abcdef[^X].*[^X](A|B(CDE)?F)Y?foobar/s +2001:/[^abab]+\Z/si +2002:/mj(?:[pajl]|o)[tplh]thd.hq.b[frt]pk(\b)hb/i8L diff --git a/tools/hscollider/test_cases/pcre/anchors.txt b/tools/hscollider/test_cases/pcre/anchors.txt new file mode 100644 index 000000000..406a8825d --- /dev/null +++ b/tools/hscollider/test_cases/pcre/anchors.txt @@ -0,0 +1,174 @@ +# A set of patterns that use anchors in unusual ways, also makes some use of +# capturing groups. + +13000:/(^)?foo/O +13001:/(^)??foo/O +13002:/(^|)foo/O +13003:/(|^)foo/O +13004:/(^|^)?foo/O +13005:/(^||^)foo/O + +13006:/foo($)?/ +13007:/foo($)??/ +13008:/foo($|)/ +13009:/foo(|$)/ +13010:/foo($||$)/ + +13011:/foo(\z)?/ +13012:/foo(\z)??/ +13013:/foo(\z|)/ +13014:/foo(|\z)/ +13015:/foo(\z||\z)/ + +13016:/(?:^|foo|)foo/O + +13017:/(^)*foo/O +13018:/(^)*?foo/O +13019:/(^)+foo/O +13020:/(^)+?foo/O +13021:/(^){1}foo/O + +# More anchoring tests from the rose anchoring work +13100:/a\Z/siH +13101:/a\Z/ +13102:/\Aa\Z/iH +13103:/\A(\Ab\Z|a)/smi +13104:/(a|b|b$)/ +13105:/(b.|cbd|[dbd]$)/si +13106:/(^h|[qj]|m|a)$/ + +# Various trailing .* cases +13107:/foobar.*\z/ +13108:/foobar.*\z/sO +13109:/foobar.*\z/m +13110:/foobar.*\z/smO + +13111:/foobar.*\Z/ +13112:/foobar.*\Z/s +13113:/foobar.*\Z/m +13114:/foobar.*\Z/sm + +13115:/foobar.*$/ +13116:/foobar.*$/s +13117:/foobar.*$/m +13118:/foobar.*$/sm + +13119:/foobar.*($|)/ +13120:/foobar.*($|)/s +13121:/foobar.*($|)/m +13122:/foobar.*($|)/sm + +13123:/foobar.*(\z)?/ +13124:/foobar.*(\z)?/s +13125:/foobar.*(\z)?/m +13126:/foobar.*(\z)?/sm + +# Some alternation variants of the above +13127:/(foo|bar).*\z/ +13128:/(foo|bar).*\z/sO +13129:/(foo|bar).*\z/m +13130:/(foo|bar).*\z/smO + +13131:/(foo|bar).*\Z/ +13132:/(foo|bar).*\Z/s +13133:/(foo|bar).*\Z/m +13134:/(foo|bar).*\Z/sm + +13135:/(foo|bar).*$/ +13136:/(foo|bar).*$/s +13137:/(foo|bar).*$/m +13138:/(foo|bar).*$/sm + +13139:/(foo|bar).*($|)/ +13140:/(foo|bar).*($|)/s +13141:/(foo|bar).*($|)/m +13142:/(foo|bar).*($|)/sm + +13143:/(foo|bar).*(\z)?/ +13144:/(foo|bar).*(\z)?/s +13145:/(foo|bar).*(\z)?/m +13146:/(foo|bar).*(\z)?/sm + +# Rose support for .{N,}$ +13147:/abc.+$/s +13148:/abc.{2,}$/s +13149:/abc.{3,}$/s +13150:/abc.{10,}$/s +13151:/abc.{150,}$/s + +# More bounded and escaped EOD fun +13152:/abc.{2,}\z/s +13153:/abc.{2,5}\z/s +13154:/abc.{2,50}\z/s +13155:/abc.{2,5}$/s +13156:/abc.{2,50}$/s +13157:/abc[^xyz]{2,}\z/s +13158:/abc[^xyz]{2,5}\z/s +13159:/abc[^xyz]{2,50}\z/s +13160:/abc[^xyz]{2,}$/s +13161:/abc[^xyz]{2,5}$/s +13162:/abc[^xyz]{2,50}$/s + +# ... fun +13163:/.\z/s +13164:/.$/s +13165:/^.+\z/s +13166:/..\z/s + +13167:/^.{50}foo.bar/s + +# Anchored literals +13168:/^(.*\.)?trailer\z/s +13169:/^trailer\z/m +13170:/^(.*\.)?trailer$/s +13171:/^trailer$/m + +13172:/\Ap\z|s|\A|n/ +13173:/\Ap\z|s|\A|\Ab|n/ + +# Bi-anchored, non cyclic outfix +13174:/^\w{200}$/ + +# Leading anchored dots +13200:/^.foo/sO +13201:/^.{1}foo/sO +13202:/^.{2}foo/sO +13203:/^.{30}foo/sO +13204:/^.{1,30}foo/sO +13205:/^.{20,}foo/sO +13206:/^.{20,30}foo/sO +13207:/^.{0,20}foo/sO +13208:/^.{1,}foo/sO +13209:/^.?foo/sO +13210:/^.+foo/sO +13211:/^.*foo/sO +13212:/^.{4,20}foo|bar/sO +13213:/^(.{4,20}foo)|bar/sO +13214:/^(.{4,20}foo)|^bar/sO +13215:/^.{20,30}[^f][^o][^o]/sO +13216:/^.{0,}foo/sO +13217:/^.{20,30}a/sO +13218:/^[\x00-\xff]+/s +13219:/^..foo/sO +13220:/^..*foo/sO +13221:/^..*.foo/sO +13222:/^.*.foo/sO +13223:/^..+foo/sO +13224:/^..+.foo/sO +13225:/^.+.foo/sO +13226:/..foo/sO +13227:/..*foo/sO +13228:/..*.foo/sO +13229:/.*.foo/sO +13230:/..+foo/sO +13231:/..+.foo/sO +13232:/.+.foo/sO +13233:/(^.*.bar)?foo/sO +13234:/(^...bar)?foo/sO +13235:/((^....*bar)|(.._))foo/s +13236:/^.{0,20}foo[a-z]/sO +13237:/^.{0,20}fo[oO]/sO +13238:/^.(.{0,2}|.{0,2})foo/sO +13240:/(a|aaaa{4,}|^(a|[^a]|a)?.a[^a]*a)$/ +13241:/^.{600,}/s +13242:/.{600,}/s diff --git a/tools/hscollider/test_cases/pcre/approximate_matching.txt b/tools/hscollider/test_cases/pcre/approximate_matching.txt new file mode 100644 index 000000000..29668f9e1 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/approximate_matching.txt @@ -0,0 +1,25 @@ +# patterns that should produce matches +40000:/^(012)*test$/ms{edit_distance=1} +40001:/[^k]{3}$/ms{edit_distance=2} +40002:/^test$/ms{edit_distance=1} +40003:/^test/s{edit_distance=2} +40004:/test/s{edit_distance=2} +40005:/test|^lit/s{edit_distance=2} +40006:/tta+tt/s{edit_distance=2} +40007:/^ab(..)+bc/s{edit_distance=2} +40008:/a( bc|d)e/s{edit_distance=1} +40009:/abc|def$/s{edit_distance=2} +40010:/abc|def$/ms{edit_distance=2} + +40050:/^(012)*test$/ms{hamming_distance=1} +40051:/[^k]{3}$/ms{hamming_distance=2} +40052:/^test$/ms{hamming_distance=1} +40053:/^test/s{hamming_distance=2} +40054:/test/s{hamming_distance=2} +40055:/test|^lit/s{hamming_distance=2} +40056:/tta+tt/s{hamming_distance=2} +40057:/^ab(..)+bc/s{hamming_distance=2} +40058:/a( bc|d)e/s{hamming_distance=1} +40059:/abc|def$/s{hamming_distance=2} +40060:/abc|def$/ms{hamming_distance=2} +40061:/^a?/m{hamming_distance=1} diff --git a/tools/hscollider/test_cases/pcre/asserts.txt b/tools/hscollider/test_cases/pcre/asserts.txt new file mode 100644 index 000000000..bba958854 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/asserts.txt @@ -0,0 +1,86 @@ +23000:/foo.*\bbar/s +23001:/foo\b.*bar/s +23002:/\bfoo/ +23003:/\Bfoo/O +23004:/(word|nonword~).*\balpha/s +23005:/\B~/ +23006:/foo\b/ +23007:/foo\B/ +23008:/foo\b$/ +23009:/foo\b\z/O +23010:/foo.*\b\bbar/s +23011:/foo.*\b\b\bbar/s +23012:/foo\b.*\bbar/s +23013:/foo\B.*\Bbar/s +23014:/foo\b.*\Bbar/s +23015:/\b\bfoo/ +23016:/\B\Bfoo/O +23017:/\B\B~/ +23018:/foo\b\b/ +23019:/foo\B\B/ +23020:/foo\b\b$/ +23021:/foo\b\b\z/O +23022:/a[b~]+\b/ +23023:/\b[b~]+a/ +23024:/\ba/ +23025:/\b/ +23026:/\B/ +23027:/\b\z/ +23028:/\B\z/ +23029:/^\b/ +23030:/^\B/ +23031:/(a|\A\b)/ +23032:/(^a|\b)/ +23033:/^\bfoo/O +23034:/^\Bfoo/O +23035:/^\b\bfoo/O +23036:/^\B\Bfoo/O +23037:/foo.*(\b|\B)bar/O +23038:/three.*\b\b\basserts/ +23039:/three.*\B\B\Basserts/ +23040:/can't_match\b\B/O +23041:/\b\Bcan't_match/O +23042:/\b(.*)\b/s +23043:/\b(foo|bar|baz)\b/ + +# More tests: repeats +23044:/((\b){2,})+/ +23045:/((\b){10,})+/ +23046:/((\b|a){2,})+/ +23047:/(\b[a-f]\b)+/ +23048:/(((\b[a-f]+\b) ?))+/ + +# multiline bi-anchored boundaries +23049:/^(\B)/m +23050:/^(\b)/m +23051:/^\b$/m +23052:/^\b\Z/m +23053:/^\b\z/mO +23054:/\A\b$/m +23055:/\A\b\Z/m +23056:/\A\b\z/m +23057:/^\B$/m +23058:/^\B\Z/m +23059:/^\B\z/m +23060:/\A\B$/m +23061:/\A\B\Z/m +23062:/\A\B\z/m +23063:/\b.*\b/s +23064:/\B.*\B/s +23065:/\b.*\B/s +23066:/\B.*\b/s +23067:/\b.+\b/s +23068:/\B.+\B/s +23069:/\b.+\B/s +23070:/\B.+\b/s +23071:/l(\B.)*/i +23072:/(a?.\b){4,}bbabb/ +23073:/\A\B/ +23074:/\A\b/ + +23075:/\b[a-f]+\b/ + +# Asserts near repeats. +23076:/godzilla\b.{0,10}mothra/s +23077:/godzilla.{0,10}\bmothra/s +23078:/godzilla\b.{0,10}\bmothra/s diff --git a/tools/hscollider/test_cases/pcre/benefits.txt b/tools/hscollider/test_cases/pcre/benefits.txt new file mode 100644 index 000000000..c82adaa49 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/benefits.txt @@ -0,0 +1,34 @@ +19501:/a..b/sO +19502:/a..bc/sO +19503:/ab..c/sO +19504:/ab..c../sO +19505:/ab..c../siO +19506:/.ab..c../siO +19507:/abcdefgh....abcd....efgh/sO +19508:/foo..ba/sO +19509:/foo..ba\z/sO + +# Longer masks +19510:/[a-f]{3}-[a-f]{3}-[a-f]{4}/ + +# Mixed-sensitivity literals can use masks. +19511:/ab(?i)cdef(?-i)ghi/ + +# Fixed width pattern that's too long to use a benefits mask. +19512:/a{10}b{10}[Cc]{10}d{10}/ + +# Mixed sensitivity and dot mask +19513:/f[Yy][mPiU].W/ + +# Short mixed-case literals to stress literal matchers +19514:/(?i)godzill(?-i)a/ +19515:/g(?i)odzilla/ +19516:/G(?i)odzilla/ +19517:/(?i)god(?-i)z(?i)illa/ +19518:/g(?i)od(?-i)z(?i)illa/ + +# Masks and mixed-case +19519:/^nqt(?-i)qkf{14}bdr+k.t(?i)r[cp]q{3}\z/is + +# More mixed-case +19520:/[Bb][Cc][Aa][CDc]abaaEbcd/ diff --git a/tools/hscollider/test_cases/pcre/capturing.txt b/tools/hscollider/test_cases/pcre/capturing.txt new file mode 100644 index 000000000..d9c9980a8 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/capturing.txt @@ -0,0 +1,30 @@ +25000:/((e[dcb]ce(\B)a|.*b(d.|d|c|.|ad)ad[acd]b|a{4,10}|d)[cd]|ba[bcbc].b.ebcd{0,})/m +25001:/(a[^aaaa]aaaaa..aaa{0,}|.aaa)/ +25002:/(\A[aab]{1}|^a.|[aca](\B)baacccc(\b).((b|a)){1,}|aa[bc]cc.\z|\A[aa].cabc.|a(b|[bca]|c|c))/s +25003:/aaaaaa(a?|aaaa|a|.?)a+(.a.a.(\b)([aaa]|[aa]|.)aaaaa{4,}[aaa]aaa(a|[aa]))?/mi +25004:/(aaa{14,16}aa.a.a|[aaaa]aaa[aa]|(aa|a|a|[aaaa]|a)a[^aaaa]aaaaa)/smi +25005:/((aaaa[^\n]*aaaaa)|(aa)|(aa))/s +25006:/((abaaa.+a)|(aa))/s +25007:/[^p]b{3,20}/ +25008:/((acbddbdcccc)|(cc))/s +25009:/(aa(a|a|a|a|a|[aa])){1,7}/s +25010:/aa(a|a+)/s +25011:/bba*/i +25012:/hg[hkjs]*/s +25013:/ke+/i +25014:/.(a|.)a?/m +25015:/(\b)../i +25016:/../ +25017:/a/s +25018:/(a{5}$|(a|[aaa]|[aaaa])aaa[^aaa])/sm +25019:/(\B)..a*/i +25020:/(.bb|bbaababb|\Aba.*|b?(b|[ab]|a)[aab]b([ba]b?|bb)|\Abaaaaaa(a|a|.))/smi +25021:/foobar/ +25022:/foobar/i +25023:/foo_bar/ +25024:/foo_bar/i +25025:/[fg]oobar/ +25026:/[fg]oobar/i +25027:/f[0o]obar/i +25028:/foo(?i)bar/ +25029:/[Ff]oobar/ diff --git a/tools/hscollider/test_cases/pcre/charclass.txt b/tools/hscollider/test_cases/pcre/charclass.txt new file mode 100644 index 000000000..711975d8a --- /dev/null +++ b/tools/hscollider/test_cases/pcre/charclass.txt @@ -0,0 +1,174 @@ +# All the generic character types +11000:/\d\D\h\H\s\S\v\V\w\W/ + +# All the following should be equivalent to a dot (type plus non-type) +11001:/[\d\D]/ +11002:/[\h\H]/ +11003:/[\s\S]/ +11004:/[\v\V]/ +11005:/[\w\W]/ + +# POSIX classes +11006:/[[:alnum:]][[:alpha:]][[:ascii:]][[:blank:]][[:cntrl:]][[:digit:]][[:graph:]]/ +11007:/[[:lower:]][[:print:]][[:punct:]][[:space:]][[:upper:]][[:word:]][[:xdigit:]]/ +11008:/[01[:alpha:]%]/ +# Perl extension: negation of posix classes. This matches 1, 2 or any non-digit. +11009:/[12[:^digit:]]/ + +# Ranges +11010:/[A-F][a-f][0-9][a-f5-7][^t-z][^a-f0-9]/ +11011:/[^^][^\n]/ +11012:/[\000-\037]/ +11013:/[W-c]/i +11014:/[^\W_]/ + +# Literal 'dash' characters +11015:/[\s-\w]/ +11016:/[A-]/O +11017:/[A-Z-]/ +11018:/[a-f0-]/O + +# \b is a backspace in a character class (hex 08) +11020:/[\b]/O + +# Dollar and dot have no special meaning inside a class +11021:/[.][$]/O + +# Closing square brackets can be unescaped if they are the first element in a +# class (scary!) +11022:/[]a]/O +11023:/[^]a]/ +11024:/[]-_]/O + +# \R and \X are the literal chars R and X (unlike outside a class) +# 11025:/[\R\X]/O + +# Others +11100:/[\]]/O +11101:/[]]/O +11102:/[\[\]]/O +11103:/[\^]/O +11104:/[+--]/O +11105:/[--A]/ +11106:/[A-C-E-G]/O +11107:/[A-C-E]/O +11108:/[\0]/O +11109:/[\40]/O +11110:/[\040]/O +11111:/[\0400]/O +11112:/[\0401]/O +#hint: equiv to [18\x00] +11113:/[\81]/O +11114:/[\xg]/O +11115:/[\x31]/O +11116:/[\x{31}]/O +11117:/[\x{0000000000000031}]/O +11118:/[\x{31g}]/O +11119:/[\x{foo}-~]/O +11120:/[\x00-\x{31g}]/O +11121:/[[:foo]/O +11122:/[\Q^\Ea]/O +11123:/[\Qa]\E]/O +11124:/[\Q\Q\E]/O +11125:/[\E]]/O +11126:/[\x{31]/O +11127:/[^e]/i +11128:/[(?i)a]/O + +# These classes with escaped '-' chars in them aren't ranges +11200:/[\x20\x2d\x5f]/O +11201:/[A\x2dZ]/O +11202:/[A\055Z]/O +11203:/[-\x2da]/O +11204:/[\x20\x2d-]/O + +# Is a range (dash-to-\x5f) +11205:/[\x2d-\x5f]/s + +# void character classed +11300:/[^\x00-\xff]/O +11301:/[^\x00-\xff]foo/O +11302:/[^\x00-\xff]foo|bar/O +11303:/^[^\x00-\xff]foo/O +11304:/foo[^\x00-\xff]/O +11305:/foo[^\x00-\xff]$/O +11306:/baz.*([^\x00-\xff]foo|bar).*baz/O + +# we had a buggy defn of xdigit (as '[0-9a-fA-Z]') +11307:/[[:xdigit:]]/ + +# test negation of all the POSIX classes +11308:/[[:^alnum:]][[:^alpha:]][[:^ascii:]][[:^blank:]][[:^cntrl:]][[:^digit:]][[:^graph:]]/ +11309:/[[:^lower:]][[:^print:]][[:^punct:]][[:^space:]][[:^upper:]][[:^word:]][[:^xdigit:]]/ + +# test cntrl against DEL +11310:/[[:cntrl:]]/ + +# \C should just be the literal char C +#11311:/[\C]/O + +11312:/[[:alnum:]]/ +11313:/[[:^alnum:]]/ +11314:/[[:alpha:]]/ +11315:/[[:^alpha:]]/ +11316:/[[:ascii:]]/ +11317:/[[:^ascii:]]/ +11318:/[[:blank:]]/ +11319:/[[:^blank:]]/ +11320:/[[:cntrl:]]/ +11321:/[[:^cntrl:]]/ +11322:/[[:digit:]]/ +11323:/[[:^digit:]]/ +11324:/[[:graph:]]/ +11325:/[[:^graph:]]/ +11326:/[[:lower:]]/ +11327:/[[:^lower:]]/ +11328:/[[:print:]]/ +11329:/[[:^print:]]/ +11330:/[[:space:]]/ +11331:/[[:^space:]]/ +11332:/[[:upper:]]/ +11333:/[[:^upper:]]/ +11334:/[[:xdigit:]]/ +11335:/[[:^xdigit:]]/ +11339:/[[:punct:]]/ +11340:/[[:^punct:]]/ + +# Oddities +11336:/[\f]/ +11337:/[\a]/ +11338:/[\e]/ + +# Unterminated classes. +11341:/[ab-]/ +11342:/[ab-\Q\E]/ + +# More negated POSIX classes and interaction with mode bits. +11343:/[[:^upper:]]/i +11344:/[[:^lower:]]/i +11345:/[^A-Z]/i +11346:/[^a-z]/i + +# More unterminated classes. +11347:/[ab-]/8 +11348:/[ab-\Q\E]/8 + +# Some classes that look a little similar to POSIX collating classes, but +# aren't. +11349:/[.abc=] [=abc.] [^=abc=] [^.abc.]/ + +# Bug in PCRE versions before 8.38 (see PCRE issue #1697). +11350:/[\W\p{Any}]/ + +# Bug in PCRE versions before 8.38 (see PCRE issue #1717). +11351:/a[[:punct:]b]/W +11352:/[[:^graph:]a]/W + +# Bug in PCRE versions before 8.38 (see PCRE issue #1732). +11353:/[^[:alpha:][:^cntrl:]]/8W + +# Bug in PCRE versions before 8.38 (see PCRE issue #1719). +11354:/[[:^ascii:][:alnum:]a]/8W + +# Bug in PCRE < 8.38 to do with [:punct:] in UCP mode (see PCRE issue #1718). +11355:/[[:punct:]]/8W diff --git a/tools/hscollider/test_cases/pcre/comp.txt b/tools/hscollider/test_cases/pcre/comp.txt new file mode 100644 index 000000000..bbe7ad5d8 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/comp.txt @@ -0,0 +1,9 @@ +15800:/^.*(foo.*bar|baz.*baz)/sO +15801:/^.*(foo.*bar|baz.*baz)a/s +15802:/^.{1,6}(foo.*bar|baz.*baz)/sO +15803:/.{1,6}(foo.*bar|baz.*baz)/sO +15804:/.{1,6}(foo.*bar|........baz.*baz)/sO +15805:/^.{1,}(foo.*bar|........baz.*baz)/sO +15806:/anorak.*trainspotter|ANORAK.*trainspotter/iO +15807:/anorak.*trainspotter/iO +15808:/anorak.*trainspotter\z|ANORAK.*trainspotter/iO diff --git a/tools/hscollider/test_cases/pcre/comptree.txt b/tools/hscollider/test_cases/pcre/comptree.txt new file mode 100644 index 000000000..484122021 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/comptree.txt @@ -0,0 +1,10 @@ +1000:/(foo){2,}bar/ +1001:/(foo){2,3}bar/ +1002:/^(foo){2,}bar/ +1003:/^(foo){2,3}bar/ +1004:/x?(foo){2,}bar/ +1005:/x?(foo){2,3}bar/ +1006:/(foo){2,}bar/{min_length=10} +1007:/(foo){2,3}bar/{min_length=10} +1008:/(foo){2,}bar/L +1009:/(foo){2,3}bar/L diff --git a/tools/hscollider/test_cases/pcre/extparams.txt b/tools/hscollider/test_cases/pcre/extparams.txt new file mode 100644 index 000000000..bb6ff6c4b --- /dev/null +++ b/tools/hscollider/test_cases/pcre/extparams.txt @@ -0,0 +1,119 @@ +16200:/foo.*bar/{min_offset=1} +16201:/foo.*bar/{min_offset=10} +16202:/foo.*bar/{max_offset=10} +16203:/foo.*bar/{min_offset=10,max_offset=10} +16204:/foo.*bar/{min_offset=10,max_offset=15} +16205:/a.*b/{min_length=5} +16206:/a.*b/{min_offset=10,min_length=3} +16207:/preamble.*q/{max_offset=30} +16208:/preamble.*q/{min_length=12} +16209:/aa[^a]+aa/{max_offset=10} +16210:/[0-9]{32,}/{max_offset=48} +16211:/\x04\S+/{max_offset=17,min_length=17} +16212:/[^x]+/{min_offset=10,max_offset=10} +16213:/[^x]+x/{min_length=20} +16214:/foo.*/{min_length=10} +16215:/foo.+/{min_length=10} +16216:/^hatstand.*teakettle/{min_length=25} +16217:/hatstand/{min_offset=10,max_offset=15} +16218:/[abcdef]{3}/{min_offset=5,max_offset=10} + +# Test min_length with one cyclic -> bounded repeat transform. +16219:/foo.*bar/{min_length=10} +16220:/foo.+bar/{min_length=10} +16221:/.*./{min_length=4} +16222:/.+/{min_length=4} +16223:/^.*hatstand/{min_length=20} +16224:/^.+hatstand/{min_length=20} +16225:/hatstand.*/{min_length=20} + +# Unnecessary min_length +16226:/long cat is lo+ng/{min_length=8} + +# Be wary of assertions. +16227:/(\B|\Al)/smiV{min_offset=1,max_offset=10} + +# Anchoring via max_offset. +16228:/rascal/{max_offset=6} + +# Be wary of vacuous patterns. +16229:/(..v[xmdf]wn\b)*/V{max_offset=27} + +16230:/abc([^a]|ab|a[^b]c)d+ef/{max_offset=30,min_length=10} + +# Some alternations are disallowed by min_length. The next two also have $ +# metachars, which invoke -1 offset adjustment. +16231:/(^g$|k\z|egs$|t)/{min_length=1} +16232:/(h|.ab$)/{min_length=2} +16233:/(abc|abcd|abcde|abcdef)/{min_length=5} + +# Some highlander optimisations play merry hell with min_length. +16234:/kn[er]{2,10}/sH{min_length=5} + +# Mixed anchored/unanchored pattern with offsets. +16235:/(\As|^c|z|[ycld]|^.)/s{min_offset=4,max_offset=22} + +# More highlander shenanigans. +16236:/h|z|w|efp./H{min_offset=4} + +# \b or \B offset adjustments can cause trouble. +16237:/\A(g|l|(\b)|[wfse]|^[wc])/s{min_length=1,max_offset=4} +16238:/g(\B)/sV{max_offset=2} + +# min_length with virtual starts (multiline) +16239:/^p{1,}/m{min_length=5,max_offset=15} + +# vacuous edges that need to to away. +16240:/c?/V{min_length=1,min_offset=4} + +# min_length -> bounded repeat for a trailing cyclic. +16241:/ykmy[^kaib]g*/{min_length=8} + +# Alternation that stresses our min_length/max offset transforms. +16242:/\Aq[rgm]h+|z/i{min_length=8,max_offset=20} + +16243:/cj.wjn*v?/{min_length=9,min_offset=4} + +# min_length transformation with an offset-adjusted report. +16244:/qye.+ys(\B)/si{min_length=7} + +# More word-boundary tests. +16245:/\bfoo/{min_offset=2,max_offset=10} +16246:/foo\b/{min_offset=2,max_offset=10} +16247:/\bfoo\b/{min_offset=2,max_offset=10} +16248:/\bfoo\b.*\bbar\b/{min_offset=2,max_offset=15} +16249:/\bfoo\b.*\bbar\b/{min_length=10} +16250:/\bfoo\b.*\bbar\b/{max_offset=15} + +# highlander + min_offset puff/lbr tests. +16251:/.{50}/H{min_offset=51} +16252:/.{50}/H{min_offset=52} +16253:/.{50}/H{min_offset=53} +16254:/.{50,}/H{min_offset=51} +16255:/.{50,}/H{min_offset=52} +16256:/.{50,}/H{min_offset=53} +16257:/aaa.{50}/H{min_offset=54} +16258:/aaa.{50}/H{min_offset=55} +16259:/aaa.{50}/H{min_offset=56} +16260:/aaa.{50,}/H{min_offset=54} +16261:/aaa.{50,}/H{min_offset=55} +16262:/aaa.{50,}/H{min_offset=56} + +# unnecessary min_length +16263:/unambiguous/{min_length=11} + +# cases with prunable paths +16264:/^a|g/m{min_offset=10,max_offset=16} +16265:/^foo|jabberwocky|apple2|foo.*bar/{max_offset=6} +16266:/^(a{8}|b{9}|c{10})|floating/{min_offset=10} + +# some more cases to stress small block analyses +16267:/abcdef.{5,}/s{min_offset=20} +16268:/abcdef./s{min_offset=20} +16269:/abcdef../s{min_offset=20} +16270:/abcdef/sH{min_offset=10,max_offset=20} +16271:/abcdef/s{min_offset=10,max_offset=10} +16272:/abcdef../s{min_offset=10,max_offset=10} + +# several things at once +16273:/^[^dj].b$/sH8{min_length=9,max_offset=19} diff --git a/tools/hscollider/test_cases/pcre/highlander.txt b/tools/hscollider/test_cases/pcre/highlander.txt new file mode 100644 index 000000000..8f00d9db5 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/highlander.txt @@ -0,0 +1,37 @@ +15300:/foo/HO +15301:/foo.*bar/sHO +15302:/foo.*bar/HO +15303:/foo[^X]{15}/sHO +15304:/foo[^X]{16}/sHO +15305:/foo[^X]{17}/sHO +15306:/foo.*[^X]{17}/sH +15307:/foo[^X]{17}blah/sHO +15308:/foo[^XY]{17}/sHO +15309:/foo[^X]{17}$/sH +15310:/[^X]{17}/sH +15311:/^[^X]{17}/sHO +15312:/fo.*o[^X]{15}/sH +15313:/fo.*o[^X]{16}/sH +15314:/fo.*o[^X]{17}/sH +15315:/[fb][oa][or][^X]{15}/sH +15316:/[fb][oa][or][^X]{16}/sH +15317:/[fb][oa][or][^X]{17}/sH +15318:/foo|bar/HO +# for people who are unsure of highlander semantics +15319:/foo.|bar./HO +15320:/^(a[^aa]..aa|a*)/mHV + +# highlander pruning +15321:/(foo.*bar)|(foo.*bar.*baz)/H +15322:/foo.*bar(.*baz)?/H +15323:/foo.*bar+/H +15324:/(foo.*bar)|(foo.*bar.*baz)|(foo.*bar.*eod\z)/H +15325:/foo.*eod+\z/H +15326:/foo.*eod+$/H + +# SEP patterns +15327:/[a-f]/iH +15328:/a|b|c/H + +# Longer, run-prone literals +15329:/(p{100})|(q{100})/H diff --git a/tools/hscollider/test_cases/pcre/longlits.txt b/tools/hscollider/test_cases/pcre/longlits.txt new file mode 100644 index 000000000..7c5bcddde --- /dev/null +++ b/tools/hscollider/test_cases/pcre/longlits.txt @@ -0,0 +1,7 @@ +# Alternation of ten long literals. +50000:/ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq|ihcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr|vtymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc|oxqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm|jtaanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh|ntafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy|ckalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt|fbbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap|eosktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo|gvoiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb/ + +# Long flood literals. +50001:/a{300}/ +50002:/A{300}/ +50003:/a{300}/i diff --git a/tools/hscollider/test_cases/pcre/lookaround.txt b/tools/hscollider/test_cases/pcre/lookaround.txt new file mode 100644 index 000000000..759a76d04 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/lookaround.txt @@ -0,0 +1,8 @@ +27000:/a[A-L]?[B-M]?[C-N]?[D-O]?foobar/ +27001:/ar[A-Z]{1,9}foobar/ +27002:/a{5}\w{1,8}foobar/ +27003:/(ab|bc|cd|de|ef|fg|gh|hi)[\w]{12}foobar/ +27004:/(abcdef|bcdefg|cdefgh|defghi|efghij|fghijk|ghijkl|hijklm)[\w]{8}foobar/ +27005:/[\x20\x31\x42\x53\x64][\x20\x25\x31\x35\x42\x45\x53\x55\x64\x65][\w]{1,7}foobar/ +27006:/[\dABcd][\dABCd][\dAbcd][\dabcd][\dabCD][\dEFGH][\dEFGh][\dEfgh][0-5B-Iw-z][\dA-Z]{1,6}foobar/ +27007:/ec.((c|C|d){3}|.BEe|...|dE.[bdC]A.Ac[Aa]|ca)CC.cdCA.D{1,}[Dd]..b(dbe{16,18}|E|b)aaC(c|d*|e|[Da]|C|a)/s diff --git a/tools/hscollider/test_cases/pcre/mangle.txt b/tools/hscollider/test_cases/pcre/mangle.txt new file mode 100644 index 000000000..04e314662 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/mangle.txt @@ -0,0 +1,132 @@ +18000:/^foo.{64}bar/sO +18001:/^foo.{32}bar/sO +18002:/^foo.{600}bar/sO +18003:/^hoo.{64}bar|^foo.{64}bar.{178}bar/sO +18004:/foo.{64}bar/sO +18005:/^foo.{64}b(a?)r/sO +18006:/^f(o?)o.{64}bar/sO +18007:/^foo.{64}bar\z/sO +18008:/^foo.{64}bar(|t\z)/s +18009:/^foo.{63,64}bar/sO +18010:/^foo.{1,64}bar/sO +18011:/^foo.{599,600}bar/sO +18012:/^foo.{1,600}bar/sO +18013:/^(foo|fab).{400,600}(bar|baz)/sO +18014:/^foo.{63,64}.bar/sO +18015:/^foo.{1,600}.bar/sO +18016:/^foo.{63}(|.?bar)/s +18017:/^foo.{63}(|.{0,4}bar)/s +18018:/^foo.{32}.?.{32}bar/sO +18019:/^foo(..){1,32}bar/s +18020:/^(foo.{32}|).{32}bar/s +18021:/^(foo.{32}|).{0,32}bar/s +18022:/^(foo.{32}|).{1,32}bar/s +18023:/^foo.{64}bar/sHO +18024:/^foo.{1,64}bar/sHO +18025:/^foo.{63,64}bar/sHO +18026:/^foo(.{64})?bar/sH +18027:/^foo(.{1,64})?bar/sH +18028:/^foo(.{63,64})?bar/sH +18029:/^foo.{64}bar/O +18030:/^foo.{32}bar/O +18031:/^foo.{600}bar/O +18032:/^hoo.{64}bar|^foo.{64}bar.{178}bar/O +18033:/foo.{64}bar/O +18034:/^foo.{64}b(a?)r/O +18035:/^f(o?)o.{64}bar/O +18036:/^foo.{64}bar\z/O +18037:/^foo.{64}bar(|t\z)/ +18038:/^foo.{63,64}bar/O +18039:/^foo.{1,64}bar/O +18040:/^foo.{599,600}bar/O +18041:/^foo.{1,600}bar/O +18042:/^(foo|fab).{400,600}(bar|baz)/O +18043:/^foo.{63,64}.bar/O +18044:/^foo.{1,1000}.bar/O +18045:/^foo.{63}(|.?bar)/ +18046:/^foo.{63}(|.{0,4}bar)/ +18047:/^foo.{32}.?.{32}bar/O +18048:/^foo(..){1,32}bar/ +18049:/^(foo.{32}|).{32}bar/ +18050:/^(foo.{32}|).{0,32}bar/ +18051:/^(foo.{32}|).{1,32}bar/ +18052:/^foo.{64}bar/HO +18053:/^foo.{1,64}bar/HO +18054:/^foo.{63,64}bar/HO +18055:/^foo(.{64})?bar/H +18056:/^foo(.{1,64})?bar/H +18057:/^foo(.{63,64})?bar/H +18058:/^fooa{599,600}bar/O +18059:/^fooa{1,600}bar/ +18060:/^fooa{600}bar/O +18061:/^foo.{0,64}bar/sO +18062:/^foo.{0,600}bar/sO +18063:/^.{70}(aaaa|.{12})/s +18100:/^[^X]foo.{64}bar/sO +18101:/^[^X]foo.{32}bar/sO +18102:/^[^X]foo.{600}bar/s +18103:/^[^X]hoo.{64}bar|^[^X]foo.{130}bar.{178}bar/s +18105:/^[^X]foo.{64}b(a?)r/s +18106:/^[^X]f(o?)o.{64}bar/s +18107:/^[^X]foo.{64}bar\z/s +18108:/^[^X]foo.{64}bar(|t\z)/s +18109:/^[^X]foo.{63,64}bar/s +18110:/^[^X]foo.{1,64}bar/s +18111:/^[^X]foo.{599,600}bar/s +18112:/^[^X]foo.{1,600}bar/s +18113:/^[^X](foo|fab).{400,600}(bar|baz)/s +18114:/^[^X]foo.{63,64}.bar/s +18115:/^[^X]foo.{1,600}.bar/s +18116:/^[^X]foo.{63}(|.?bar)/s +18117:/^[^X]foo.{63}(|.{0,4}bar)/s +18118:/^[^X]foo.{32}.?.{32}bar/s +18119:/^[^X]foo(..){1,32}bar/s +18120:/^[^X](foo.{32}|).{32}bar/s +18121:/^[^X](foo.{32}|).{0,32}bar/s +18122:/^[^X](foo.{32}|).{1,32}bar/s +18123:/^[^X]foo.{64}bar/sHO +18124:/^[^X]foo.{1,64}bar/sH +18125:/^[^X]foo.{63,64}bar/sH +18126:/^[^X]foo(.{64})?bar/sH +18127:/^[^X]foo(.{1,64})?bar/sH +18128:/^[^X]foo(.{63,64})?bar/sH +18129:/^[^X]foo.{64}bar/O +18130:/^[^X]foo.{32}bar/O +18131:/^[^X]foo.{600}bar/ +18132:/^[^X]hoo.{64}bar|^[^X]foo.{64}bar.{178}bar/O +18134:/^[^X]foo.{64}b(a?)r/ +18135:/^[^X]f(o?)o.{64}bar/ +18136:/^[^X]foo.{64}bar\z/ +18137:/^[^X]foo.{64}bar(|t\z)/ +18138:/^[^X]foo.{63,64}bar/ +18139:/^[^X]foo.{1,64}bar/ +18140:/^[^X]foo.{599,600}bar/ +18141:/^[^X]foo.{1,600}bar/ +18142:/^[^X](foo|fab).{400,600}(bar|baz)/ +18143:/^[^X]foo.{63,64}.bar/ +18144:/^[^X]foo.{1,1000}.bar/ +18145:/^[^X]foo.{63}(|.?bar)/ +18146:/^[^X]foo.{63}(|.{0,4}bar)/ +18147:/^[^X]foo.{32}.?.{32}bar/ +18148:/^[^X]foo(..){1,32}bar/ +18149:/^[^X](foo.{32}|).{32}bar/ +18150:/^[^X](foo.{32}|).{0,32}bar/ +18151:/^[^X](foo.{32}|).{1,32}bar/ +18152:/^[^X]foo.{64}bar/HO +18153:/^[^X]foo.{1,64}bar/H +18154:/^[^X]foo.{63,64}bar/H +18155:/^[^X]foo(.{64})?bar/H +18156:/^[^X]foo(.{1,64})?bar/H +18157:/^[^X]foo(.{63,64})?bar/H +18158:/^[^X]fooa{599,600}bar/ +18159:/^[^X]fooa{1,600}bar/ +18160:/^[^X]fooa{600}bar/ +18161:/^[^X]foo.{0,64}bar/s +18162:/^[^X]foo.{0,600}bar/s +18163:/^[^X].{70}(aaaa|.{12})/s +18164:/^[^X].{70}(aaaa|.{0,11}.b)/s +18165:/^[^X].{70}(aaaa|.{1,11}.b)/s +18166:/^[^X]foo.{0,100}.bar/s +18167:/^[^X]foo.{100}.?bar/s +18168:/^[^X]foo.{50}.?.{50}bar/s +18169:/^[^X]foo.{50}(..)?.{50}bar/s diff --git a/tools/hscollider/test_cases/pcre/mcclellan.txt b/tools/hscollider/test_cases/pcre/mcclellan.txt new file mode 100644 index 000000000..572bbad1b --- /dev/null +++ b/tools/hscollider/test_cases/pcre/mcclellan.txt @@ -0,0 +1,29 @@ +15900:/foo.+ba[rR]/sO +15901:/foo.*ba[rR]/sO +15902:/foo.*ba[rR].*tea/sO +15903:/fo(|o.*ba[rR].*tea)/s +15904:/fo($|o.*ba[rR].*tea)/s +15905:/foo.*ba[rR]|tea.*cof[^f]ee/s +15906:/(foo|bar).*gaz/sO +15907:/foo.*(bar|gaz)/sO +15908:/foo.*(bar|gaz).*tea/sO +15909:/foo.*a(bar|gaz).*tea/sO +15910:/foo.*a(bar|gaz).*(tea|aet)/sO +15911:/foo(b[^a]r|g[^a]z).*tea/s +15912:/foo(b[^a]r|g[^a]z).*(tea|aet)/s +15913:/^p;;.*[_;]*.*:/sO +15914:/p;;.*[_;]*.*:/sO +15915:/p;;.*[_;]*.*:/O +15916:/^AA.*(a.*(Z|XX)|b.*(Z|YY))/s +15917:/^AA.*(a.*(Z|XX)|b.*Z)/s +15918:/^pppp;;.*[_;]*.*:/sO +15919:/pppp;;.*[_;]*.*:/sO +15920:/pppp;;.*[_;]*.*:/O +15921:/^AAAAA.*(a.*(Z|XX)|b.*(Z|YY))/s +15922:/^AAAAAA.*(a.*(Z|XX)|b.*Z)/s +15923:/(bdcd{26}|([kjrs]|b|b)+){2,4}/s +15924:/literal\w{0,7}\d+/s +15925:/literal\w{0,10}\d+/s +15926:/literal\w{0,10}/s +15927:/literal\w{5,}/s +15928:/[ab][^ab]a.a/s8 diff --git a/tools/hscollider/test_cases/pcre/metacharacters.txt b/tools/hscollider/test_cases/pcre/metacharacters.txt new file mode 100644 index 000000000..0a2c73a66 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/metacharacters.txt @@ -0,0 +1,66 @@ +# Some tests for specific special metacharacters + +# matches any byte +24000:/\C/ + +# alarm, that is, the BEL character (hex 07) +24001:/\a/O + +# "control-x", where x is any character +24002:/\cz/O +24003:/\c{/O +24004:/\c;/O +24005:/\ca/O +24006:/\c0/O + +# escape (hex 1B) +24007:/\e/O + +# formfeed (hex 0C) +24008:/\f/O + +# linefeed (hex 0A) +24009:/\n/O + +# carriage return (hex 0D) +24010:/\r/O + +# tab (hex 09) +24011:/\t/O + +# real hex escapes +24012:/\xdc\x{dc}\x00\x{ff}/O + +# broken hex escape, interpreted as a null followed by some chars +24013:/\x{dc/O + +# more control +24015:/\cA/O +24016:/[\cz]/O +24017:/[\c{]/O +24018:/[\c;]/O +24019:/[\ca]/O +24020:/[\c0]/O +24021:/[\cA]/O +24022:/\c\n/O + +# \8 and \9 are not back-references, they are simply the literals 8 and 9. +24023:/\8 literal \9/ + +# Big numbers +24024:/bignum \1111111111/ +24025:/bignum \2147483639/ +24026:/bignum \18888/ +24027:/bignum \128888/ +24028:/bignum \1238888/ +24029:/bignum \3778888/ + +# Octal escapes +24030:/\060/ +24031:/\60/ +24032:/\12/ +24033:/\012/ +24034:/\0120/ +24035:/\120/ +24036:/\377/ +24037:/\80/ diff --git a/tools/hscollider/test_cases/pcre/notbob.txt b/tools/hscollider/test_cases/pcre/notbob.txt new file mode 100644 index 000000000..ad4916640 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/notbob.txt @@ -0,0 +1,182 @@ +15500:/notbob/sO +15501:/^notbob/sO +15502:/\Anotbob/sO +15503:/.notbob/sO +15504:/^.notbob/sO +15505:/\A.notbob/sO +15506:/.{6}notbob/sO +15507:/^.{6}notbob/sO +15508:/\A.{6}notbob/sO +15509:/.*notbob/sO +15510:/^.*notbob/sO +15511:/\A.*notbob/sO +15512:/.+notbob/sO +15513:/^.+notbob/sO +15514:/\A.+notbob/sO +15515:/.{4,7}notbob/sO +15516:/^.{4,7}notbob/sO +15517:/\A.{4,7}notbob/sO +15518:/(\A|)notbob/sO +15519:/(^|.)notbob/s +15520:/not.*bob/sO +15521:/^not.*bob/sO +15522:/\Anot.*bob/sO +15523:/.not.*bob/sO +15524:/^.not.*bob/sO +15525:/\A.not.*bob/sO +15526:/.{6}not.*bob/sO +15527:/^.{6}not.*bob/sO +15528:/\A.{6}not.*bob/sO +15529:/.*not.*bob/sO +15530:/^.*not.*bob/sO +15531:/\A.*not.*bob/sO +15532:/.+not.*bob/sO +15533:/^.+not.*bob/sO +15534:/\A.+not.*bob/sO +15535:/.{4,7}not.*bob/sO +15536:/^.{4,7}not.*bob/sO +15537:/\A.{4,7}not.*bob/sO +15538:/(\A|)not.*bob/sO +15539:/(^|.)not.*bob/s +15540:/no[A-Z].*bar/s +15541:/^no[A-Z].*bar/sO +15542:/\Ano[A-Z].*bar/sO +15543:/.no[A-Z].*bar/s +15544:/^.no[A-Z].*bar/s +15545:/\A.no[A-Z].*bar/s +15546:/.{6}no[A-Z].*bar/s +15547:/^.{6}no[A-Z].*bar/s +15548:/\A.{6}no[A-Z].*bar/s +15549:/.*no[A-Z].*bar/s +15550:/^.*no[A-Z].*bar/s +15551:/\A.*no[A-Z].*bar/s +15552:/.+no[A-Z].*bar/s +15553:/^.+no[A-Z].*bar/s +15554:/\A.+no[A-Z].*bar/s +15555:/.{4,7}no[A-Z].*bar/s +15556:/^.{4,7}no[A-Z].*bar/s +15557:/\A.{4,7}no[A-Z].*bar/s +15558:/(\A|)no[A-Z].*bar/s +15559:/(^|.)no[A-Z].*bar/s +15560:/notbobno[A-Z].*bar/s +15561:/^notbobno[A-Z].*bar/sO +15562:/\Anotbobno[A-Z].*bar/sO +15563:/.notbobno[A-Z].*bar/s +15564:/^.notbobno[A-Z].*bar/s +15565:/\A.notbobno[A-Z].*bar/s +15566:/.{6}notbobno[A-Z].*bar/s +15567:/^.{6}notbobno[A-Z].*bar/s +15568:/\A.{6}notbobno[A-Z].*bar/s +15569:/.*notbobno[A-Z].*bar/s +15570:/^.*notbobno[A-Z].*bar/s +15571:/\A.*notbobno[A-Z].*bar/s +15572:/.+notbobno[A-Z].*bar/s +15573:/^.+notbobno[A-Z].*bar/s +15574:/\A.+notbobno[A-Z].*bar/s +15575:/.{4,7}notbobno[A-Z].*bar/s +15576:/^.{4,7}notbobno[A-Z].*bar/s +15577:/\A.{4,7}notbobno[A-Z].*bar/s +15578:/(\A|)notbobno[A-Z].*bar/s +15579:/(^|.)notbobno[A-Z].*bar/s +15580:/^.{40}/sO +15581:/^[^X]{40}/sO +15582:/\A[^X]{40}/sO +15583:/[^X]{40}/s +15584:/.{4,}notbobno[A-Z].*bar/s +15585:/^.{4,}no[A-Z].*bar/s +15586:/\A.{4,}notbobno[A-Z].*bar/s +15587:/.{4,}notbobno[A-Z].*bar/s +15588:/^.{4,}no[A-Z].*bar/s +15589:/\A.{4,}notbobno[A-Z].*bar/s +15590:/(^.*bar)|bob/sO +15600:/notbob/smO +15601:/^notbob/smO +15602:/\Anotbob/smO +15603:/.notbob/smO +15604:/^.notbob/smO +15605:/\A.notbob/smO +15606:/.{6}notbob/smO +15607:/^.{6}notbob/smO +15608:/\A.{6}notbob/smO +15609:/.*notbob/smO +15610:/^.*notbob/smO +15611:/\A.*notbob/smO +15612:/.+notbob/smO +15613:/^.+notbob/smO +15614:/\A.+notbob/smO +15615:/.{4,7}notbob/smO +15616:/^.{4,7}notbob/smO +15617:/\A.{4,7}notbob/smO +15618:/(\A|)notbob/smO +15619:/(^|.)notbob/sm +15620:/not.*bob/smO +15621:/^not.*bob/smO +15622:/\Anot.*bob/smO +15623:/.not.*bob/smO +15624:/^.not.*bob/smO +15625:/\A.not.*bob/smO +15626:/.{6}not.*bob/smO +15627:/^.{6}not.*bob/smO +15628:/\A.{6}not.*bob/smO +15629:/.*not.*bob/smO +15630:/^.*not.*bob/smO +15631:/\A.*not.*bob/smO +15632:/.+not.*bob/smO +15633:/^.+not.*bob/smO +15634:/\A.+not.*bob/smO +15635:/.{4,7}not.*bob/smO +15636:/^.{4,7}not.*bob/smO +15637:/\A.{4,7}not.*bob/smO +15638:/(\A|)not.*bob/smO +15639:/(^|.)not.*bob/sm +15640:/no[A-Z].*bar/sm +15641:/^no[A-Z].*bar/sm +15642:/\Ano[A-Z].*bar/smO +15643:/.no[A-Z].*bar/sm +15644:/^.no[A-Z].*bar/sm +15645:/\A.no[A-Z].*bar/sm +15646:/.{6}no[A-Z].*bar/sm +15647:/^.{6}no[A-Z].*bar/sm +15648:/\A.{6}no[A-Z].*bar/sm +15649:/.*no[A-Z].*bar/sm +15650:/^.*no[A-Z].*bar/sm +15651:/\A.*no[A-Z].*bar/sm +15652:/.+no[A-Z].*bar/sm +15653:/^.+no[A-Z].*bar/sm +15654:/\A.+no[A-Z].*bar/sm +15655:/.{4,7}no[A-Z].*bar/sm +15656:/^.{4,7}no[A-Z].*bar/sm +15657:/\A.{4,7}no[A-Z].*bar/sm +15658:/(\A|)no[A-Z].*bar/sm +15659:/(^|.)no[A-Z].*bar/sm +15660:/notbobno[A-Z].*bar/sm +15661:/^notbobno[A-Z].*bar/sm +15662:/\Anotbobno[A-Z].*bar/smO +15663:/.notbobno[A-Z].*bar/sm +15664:/^.notbobno[A-Z].*bar/sm +15665:/\A.notbobno[A-Z].*bar/sm +15666:/.{6}notbobno[A-Z].*bar/sm +15667:/^.{6}notbobno[A-Z].*bar/sm +15668:/\A.{6}notbobno[A-Z].*bar/sm +15669:/.*notbobno[A-Z].*bar/sm +15670:/^.*notbobno[A-Z].*bar/sm +15671:/\A.*notbobno[A-Z].*bar/sm +15672:/.+notbobno[A-Z].*bar/sm +15673:/^.+notbobno[A-Z].*bar/sm +15674:/\A.+notbobno[A-Z].*bar/sm +15675:/.{4,7}notbobno[A-Z].*bar/sm +15676:/^.{4,7}notbobno[A-Z].*bar/sm +15677:/\A.{4,7}notbobno[A-Z].*bar/sm +15678:/(\A|)notbobno[A-Z].*bar/sm +15679:/(^|.)notbobno[A-Z].*bar/sm +15680:/^.{40}/sm +15681:/^[^X]{40}/sm +15682:/\A[^X]{40}/smO +15683:/[^X]{40}/sm +15684:/.{4,}notbobno[A-Z].*bar/sm +15685:/^.{4,}no[A-Z].*bar/sm +15686:/\A.{4,}notbobno[A-Z].*bar/sm +15687:/.{4,}notbobno[A-Z].*bar/sm +15688:/^.{4,}no[A-Z].*bar/sm +15689:/\A.{4,}notbobno[A-Z].*bar/sm +15690:/(^.*bar)|bob/smO diff --git a/tools/hscollider/test_cases/pcre/options.txt b/tools/hscollider/test_cases/pcre/options.txt new file mode 100644 index 000000000..5e48ed1ba --- /dev/null +++ b/tools/hscollider/test_cases/pcre/options.txt @@ -0,0 +1,37 @@ +# Patterns that set/unset various options + +# DOTALL +24500:/(?s)foo.*bar/O +24501:/foo.*bar(?s).baz/O +24502:/(?-s)foo.*bar/sO +24503:/(?-s)foo.*bar/O +24504:/(?-s)foo.*bar(?s).*baz/sO + +# CASELESS +24600:/(?i)foobar/O +24601:/(?i)foobar/iO +24602:/(?-i)foobar/iO +24603:/foo(?-i)bar/iO +24604:/(?-i)foo(?i)bar/iO +24605:/(?i)foo(?-i)bar/O + +# MULTILINE +24700:/(?m)foobar$/ +24701:/(?-m)foobar$/m + +# EXTENDED +24800:/(?x)foo bar/O +24801:/(?x)foo bar(?-x) baz/O + +# EPIC COMBOS +24900:/(?imsx)^ foo .* bar .* baz/O + +# MORE COMPLEX CASES +24901:/^(?i:(?:abbr(?:ev(?:iation)?)))/ +24902:/(?s)foo(?i).bar/ +24903:/(?s)foo(?i-s).bar/ +24904:/foo(?i:bar)baz/ +24905:/nested(?i:caseless(?-i:caseful)caseless)literal/ +24906:/(a(?i)b|c)/ +24907:/(?i:hatstand|teakettle)/ +24908:/foo.*(?i-s:bar.*baz).*bing/s diff --git a/tools/hscollider/test_cases/pcre/passthrough.txt b/tools/hscollider/test_cases/pcre/passthrough.txt new file mode 100644 index 000000000..34620fde7 --- /dev/null +++ b/tools/hscollider/test_cases/pcre/passthrough.txt @@ -0,0 +1,12 @@ +9000:/(abc|def)(xxx|yyyy)/O +9001:/^(abc|def)(xxx|yyyy)/O +9002:/(^anchored|floating)(XXX|YYY)/O + +# Some long literals. +9005:/a{40}/ +9006:/a{48}/ +9007:/a{49}/ +9008:/a{50}/ +9009:/q{1000}/ +9010:/coagulateshyperinnervationagitationreassuranceexchangeability/ +9011:/nonplasticerythematoussnakebitesjubilatedworklessnesses/ diff --git a/tools/hscollider/test_cases/pcre/prefilter.txt b/tools/hscollider/test_cases/pcre/prefilter.txt new file mode 100644 index 000000000..11279eeac --- /dev/null +++ b/tools/hscollider/test_cases/pcre/prefilter.txt @@ -0,0 +1,72 @@ +# Prefiltering ("/P" flag) patterns. + +# Assertions. +90000:/foo(?!bar)/P +90001:/foo(?!bar).*baz/sP +90002:/(?+i])>.*?/sP + +# Relative backreferences. +90205:/(foo|bar).*\g{-1}/P +90206:/((foo|bar).*)\g{-2}/P + +# More simple back-references. +90207:/([abc])teakettle\1/P +90208:/([abc]+)teakettle\1/P +90209:/([a-f])_\1\1\1/P + +# Named back-references, in a variety of syntaxes. +90210:/(?