diff --git a/CMakeLists.txt b/CMakeLists.txt
index e112bd28c..e4dbd9457 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -45,6 +45,40 @@ function (die msg)
message(FATAL_ERROR "${BoldRed}${msg}${ColourReset}")
endfunction ()
+if (NOT ${ARCH} STREQUAL "")
+ string(SUBSTRING ${ARCH} 0 3 IS_ARM)
+ string(TOLOWER ${IS_ARM} IS_ARM)
+
+ if (${IS_ARM} STREQUAL "arm")
+ string(SUBSTRING ${ARCH} 0 5 ARM_TEST)
+ string(TOLOWER ${ARM_TEST} ARM_TEST)
+
+ if (${ARM_TEST} STREQUAL "armv6")
+ set(ARM6 1)
+ else()
+ set(ARM6 0)
+ endif()
+
+ if (${ARM_TEST} STREQUAL "armv7")
+ set(ARM7 1)
+ else()
+ set(ARM7 0)
+ endif()
+ endif()
+endif()
+
+if(WIN32 OR ARM7 OR ARM6)
+ set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
+ set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
+endif()
+
+# set this to 0 if per-block checkpoint needs to be disabled
+set(PER_BLOCK_CHECKPOINT 1)
+
+if(PER_BLOCK_CHECKPOINT)
+ add_definitions("-DPER_BLOCK_CHECKPOINT")
+endif()
+
list(INSERT CMAKE_MODULE_PATH 0
"${CMAKE_SOURCE_DIR}/cmake")
@@ -127,16 +161,16 @@ endif()
option(STATIC "Link libraries statically" ${DEFAULT_STATIC})
if(MINGW)
- get_filename_component(msys2_install_path "[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MSYS2 ${ARCH_WIDTH}bit;InstallLocation]" ABSOLUTE)
+ string(REGEX MATCH "^[^/]:/[^/]*" msys2_install_path "${CMAKE_C_COMPILER}")
+ message(STATUS "MSYS location: ${msys2_install_path}")
set(CMAKE_INCLUDE_PATH "${msys2_install_path}/mingw${ARCH_WIDTH}/include")
# This is necessary because otherwise CMake will make Boost libraries -lfoo
# rather than a full path. Unfortunately, this makes the shared libraries get
# linked due to a bug in CMake which misses putting -static flags around the
# -lfoo arguments.
- list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_DIRECTORIES
- "${msys2_install_path}/mingw${ARCH_WIDTH}/lib")
- list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES
- "${msys2_install_path}/mingw${ARCH_WIDTH}/lib")
+ set(DEFLIB ${msys2_install_path}/mingw${ARCH_WIDTH}/lib)
+ list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
+ list(REMOVE_ITEM CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES ${DEFLIB})
endif()
if(STATIC)
@@ -158,18 +192,47 @@ if (DEFINED ENV{DATABASE})
else()
message(STATUS "Could not find DATABASE in env (not required unless you want to change database type from default: ${DATABASE})")
endif()
+
+set(BERKELEY_DB 0)
if (DATABASE STREQUAL "lmdb")
set(BLOCKCHAIN_DB DB_LMDB)
+
+ # temporarily allow mingw to compile with berkeley_db,
+ # regardless if building static or not
+ if(NOT STATIC OR MINGW)
+ find_package(BerkeleyDB)
+
+ if(NOT BERKELEY_DB_LIBRARIES)
+ message(STATUS "BerkeleyDB not found and has been disabled.")
+ else()
+ message(STATUS "Found BerkeleyDB include (db.h) in ${BERKELEY_DB_INCLUDE_DIR}")
+ if(BERKELEY_DB_LIBRARIES)
+ message(STATUS "Found BerkeleyDB shared library")
+ set(BDB_STATIC false CACHE BOOL "BDB Static flag")
+ set(BDB_INCLUDE ${BERKELEY_DB_INCLUDE_DIR} CACHE STRING "BDB include path")
+ set(BDB_LIBRARY ${BERKELEY_DB_LIBRARIES} CACHE STRING "BDB library name")
+ set(BDB_LIBRARY_DIRS "" CACHE STRING "BDB Library dirs")
+ set(BERKELEY_DB 1)
+ else()
+ message(STATUS "Found BerkeleyDB includes, but could not find BerkeleyDB library. Please make sure you have installed libdb and libdb-dev or the equivalent")
+ endif()
+ endif()
+ endif()
elseif (DATABASE STREQUAL "memory")
set(BLOCKCHAIN_DB DB_MEMORY)
else()
die("Invalid database type: ${DATABASE}")
endif()
+if(BERKELEY_DB)
+ add_definitions("-DBERKELEY_DB")
+endif()
+
add_definitions("-DBLOCKCHAIN_DB=${BLOCKCHAIN_DB}")
if (UNIX AND NOT APPLE)
# Note that at the time of this writing the -Wstrict-prototypes flag added below will make this fail
+ set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)
endif()
@@ -194,7 +257,7 @@ include_directories(external/rapidjson)
include_directories(${LMDB_INCLUDE})
# Final setup for Berkeley DB
-if (NOT STATIC)
+if (BERKELEY_DB)
include_directories(${BDB_INCLUDE})
endif()
@@ -210,10 +273,15 @@ if(MSVC)
include_directories(SYSTEM src/platform/msc)
else()
set(ARCH native CACHE STRING "CPU to build for: -march value or default")
- if(ARCH STREQUAL "default")
+ # -march=armv7-a conflicts with -mcpu=cortex-a7
+ if(ARCH STREQUAL "default" OR ARM7)
set(ARCH_FLAG "")
else()
- set(ARCH_FLAG "-march=${ARCH}")
+ if(ARCH STREQUAL "x86_64")
+ set(ARCH_FLAG "-march=x86-64")
+ else()
+ set(ARCH_FLAG "-march=${ARCH}")
+ endif()
endif()
set(WARNINGS "-Wall -Wextra -Wpointer-arith -Wundef -Wvla -Wwrite-strings -Wno-error=extra -Wno-error=deprecated-declarations -Wno-error=sign-compare -Wno-error=strict-aliasing -Wno-error=type-limits -Wno-unused-parameter -Wno-error=unused-variable -Wno-error=undef -Wno-error=uninitialized")
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
@@ -256,14 +324,18 @@ else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -D_GNU_SOURCE ${MINGW_FLAG} ${WARNINGS} ${CXX_WARNINGS} ${ARCH_FLAG} -maes")
endif()
- string(SUBSTRING ${ARCH} 0 3 ARM_TEST)
- string(TOLOWER ${ARM_TEST} ARM_TEST)
- if(${ARM_TEST} STREQUAL "arm")
- message(STATUS "Setting ARM C and C++ flags")
+ if(ARM6)
+ message(STATUS "Setting ARM6 C and C++ flags")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=vfp -mfloat-abi=hard")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=vfp -mfloat-abi=hard")
endif()
+ if(ARM7)
+ message(STATUS "Setting ARM7 C and C++ flags")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4 -funsafe-math-optimizations -mtune=cortex-a7")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4 -funsafe-math-optimizations -mtune=cortex-a7")
+ endif()
+
if(APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGTEST_HAS_TR1_TUPLE=0")
endif()
@@ -341,7 +413,7 @@ elseif(APPLE OR FREEBSD)
set(EXTRA_LIBRARIES "")
elseif(NOT MSVC)
find_library(RT rt)
- set(EXTRA_LIBRARIES ${RT} ${PTHREAD} ${DL})
+ set(EXTRA_LIBRARIES ${RT} ${DL})
endif()
include(version.cmake)
diff --git a/Makefile b/Makefile
index 329f9c4ac..dda8663b7 100644
--- a/Makefile
+++ b/Makefile
@@ -58,6 +58,14 @@ release-all:
mkdir -p build/release
cd build/release && cmake -D BUILD_TESTS=ON -D CMAKE_BUILD_TYPE=release ../.. && $(MAKE)
+release-arm6:
+ mkdir -p build/release
+ cd build/release && cmake -D BUILD_TESTS=OFF -D ARCH="armv6zk" -D BUILD_64=OFF -D NO_AES=ON -D CMAKE_BUILD_TYPE=release ../.. && $(MAKE)
+
+release-arm7:
+ mkdir -p build/release
+ cd build/release && cmake -D BUILD_TESTS=OFF -D ARCH="armv7-a" -D BUILD_64=OFF -D NO_AES=ON -D CMAKE_BUILD_TYPE=release ../.. && $(MAKE)
+
release-static: release-static-64
release-static-64:
@@ -68,10 +76,6 @@ release-static-32:
mkdir -p build/release
cd build/release && cmake -D STATIC=ON -D ARCH="i686" -D BUILD_64=OFF -D CMAKE_BUILD_TYPE=release ../.. && $(MAKE)
-release-static-arm6:
- mkdir -p build/release
- cd build/release && cmake -D STATIC=ON -D ARCH="armv6zk" -D BUILD_64=OFF -D NO_AES=ON -D CMAKE_BUILD_TYPE=release ../.. && $(MAKE)
-
release-static-win64:
mkdir -p build/release
cd build/release && cmake -G "MSYS Makefiles" -D STATIC=ON -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_TOOLCHAIN_FILE=../../cmake/64-bit-toolchain.cmake -D MSYS2_FOLDER=c:/msys64 ../.. && $(MAKE)
diff --git a/README.i18n b/README.i18n
new file mode 100644
index 000000000..2b913f7d8
--- /dev/null
+++ b/README.i18n
@@ -0,0 +1,45 @@
+The Monero command line tools can be translated in various languages.
+In order to use the same translation workflow as the future GUI, they
+use Qt Linguist translation files. However, to avoid the dependencies
+on Qt this normally implies, they use a custom loader to read those
+files at runtime. In order to update, or build translations files, you
+do need to have Qt tools installed, however. For translating, you need
+either the Qt Linguist GUI, or another tool that supports Qt ts files,
+such as Transifex. To run, you do not need anything Qt.
+
+To update ts files after changing source code:
+
+ ./utils/translations/update-translations.sh
+
+To add a new language, eg Spanish (ISO code es):
+
+ cp transations/monero.ts transations/monero_es.ts
+
+To edit translations for Spanish:
+
+ linguist translations/monero_es.ts
+
+To build translations after modiying them:
+
+ ./utils/translations/build-translations.sh
+
+To test a translation:
+
+ LANG=es ./build/release/bin/simplewallet
+
+To add new translatable sources in the source:
+
+ Use the tr(string) function if possible. If the code is in a class,
+ and this class doesn't already have a tr() static function, add one,
+ which uses a context named after what lupdate uses for the context,
+ usually the fully qualified class name (eg, cryptonote::simple_wallet).
+ If you need to use tr in code that's not in a class, you can use the
+ fully qualified version (eg, simple_wallet::tr) of the one matching
+ the context you want.
+ Use QT_TRANSLATE_NOOP(string) if you want to specify a context manually.
+
+If you're getting messages of the form:
+
+ Class 'cryptonote::simple_wallet' lacks Q_OBJECT macro
+
+all is fine, we don't actually need that here.
diff --git a/README.md b/README.md
index aedd9174a..e2ba191da 100644
--- a/README.md
+++ b/README.md
@@ -134,7 +134,7 @@ cd build
```
* If you are on a 64-bit system, run:
```
-cmake -G "MSYS Makefiles" -D CMAKE_BUILD_TYPE=Release -D ARCH="x86_64" -D BUILD_64=ON -D CMAKE_TOOLCHAIN_FILE=../cmake/64-bit-toolchain.cmake -D MSYS2_FOLDER=c:/msys64 ..
+cmake -G "MSYS Makefiles" -D CMAKE_BUILD_TYPE=Release -D ARCH="x86-64" -D BUILD_64=ON -D CMAKE_TOOLCHAIN_FILE=../cmake/64-bit-toolchain.cmake -D MSYS2_FOLDER=c:/msys64 ..
```
* If you are on a 32-bit system, run:
```
@@ -167,3 +167,8 @@ Dependencies: Doxygen 1.8.0 or later, Graphviz 2.28 or later (optional).
* To build, change to the root of the source code directory, and run `doxygen Doxyfile`
* If you have installed Graphviz, you can also generate in-doc diagrams by instead running `HAVE_DOT=YES doxygen Doxyfile`
* The output will be built in doc/html/
+
+## Internationalization
+
+See README.i18n
+
diff --git a/contrib/epee/include/console_handler.h b/contrib/epee/include/console_handler.h
index 952fc3c96..5dd3eaba9 100644
--- a/contrib/epee/include/console_handler.h
+++ b/contrib/epee/include/console_handler.h
@@ -274,14 +274,15 @@ namespace epee
}
std::string command;
- if(!m_stdin_reader.get_line(command))
- {
- LOG_PRINT("Failed to read line.", LOG_LEVEL_0);
- }
+ bool get_line_ret = m_stdin_reader.get_line(command);
if (m_stdin_reader.eos())
{
break;
}
+ if (!get_line_ret)
+ {
+ LOG_PRINT("Failed to read line.", LOG_LEVEL_0);
+ }
string_tools::trim(command);
LOG_PRINT_L2("Read command: " << command);
@@ -303,7 +304,8 @@ namespace epee
std::cout << usage;
}
}
- exit_handler();
+ if (exit_handler)
+ exit_handler();
return true;
CATCH_ENTRY_L0("console_handler", false);
}
diff --git a/contrib/epee/include/misc_log_ex.h b/contrib/epee/include/misc_log_ex.h
index 42adc7c43..2adac7f2f 100644
--- a/contrib/epee/include/misc_log_ex.h
+++ b/contrib/epee/include/misc_log_ex.h
@@ -861,7 +861,8 @@ namespace log_space
std::string::size_type a = m_default_log_file.rfind('.');
if ( a != std::string::npos )
m_default_log_file.erase( a, m_default_log_file.size());
- m_default_log_file += ".log";
+ if ( ! m_default_log_file.empty() )
+ m_default_log_file += ".log";
return true;
}
diff --git a/external/db_drivers/CMakeLists.txt b/external/db_drivers/CMakeLists.txt
index cd7479724..4d1b95c94 100644
--- a/external/db_drivers/CMakeLists.txt
+++ b/external/db_drivers/CMakeLists.txt
@@ -31,24 +31,4 @@
message(STATUS "Using ${ARCH_WIDTH}-bit LMDB from source tree")
add_subdirectory(liblmdb${ARCH_WIDTH})
set(LMDB_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/liblmdb${ARCH_WIDTH}" CACHE STRING "LMDB Include path")
-
set(LMDB_LIBRARY "lmdb" CACHE STRING "LMDB Library name")
-
-if (NOT STATIC)
- find_package(BerkeleyDB)
-
- if(NOT BERKELEY_DB_LIBRARIES)
- die("BerkeleyDB not found. At this time it should be installed in your system for a non-static build.")
- else()
- message(STATUS "Found BerkeleyDB include (db.h) in ${BERKELEY_DB_INCLUDE_DIR}")
- if(BERKELEY_DB_LIBRARIES)
- message(STATUS "Found BerkeleyDB shared library")
- set(BDB_STATIC false CACHE BOOL "BDB Static flag")
- set(BDB_INCLUDE ${BERKELEY_DB_INCLUDE_DIR} CACHE STRING "BDB include path")
- set(BDB_LIBRARY ${BERKELEY_DB_LIBRARIES} CACHE STRING "BDB library name")
- set(BDB_LIBRARY_DIRS "" CACHE STRING "BDB Library dirs")
- else()
- die("Found BerkeleyDB includes, but could not find BerkeleyDB library. Please make sure you have installed libdb and libdb-dev or the equivalent")
- endif()
- endif()
-endif()
diff --git a/external/db_drivers/liblmdb32/CHANGES b/external/db_drivers/liblmdb32/CHANGES
index 34049ba7a..957742e75 100644
--- a/external/db_drivers/liblmdb32/CHANGES
+++ b/external/db_drivers/liblmdb32/CHANGES
@@ -1,5 +1,33 @@
LMDB 0.9 Change Log
+LMDB 0.9.15 Release (2015/06/19)
+ Fix txn init (ITS#7961,#7987)
+ Fix MDB_PREV_DUP (ITS#7955,#7671)
+ Fix compact of empty env (ITS#7956)
+ Fix mdb_copy file mode
+ Fix mdb_env_close() after failed mdb_env_open()
+ Fix mdb_rebalance collapsing root (ITS#8062)
+ Fix mdb_load with large values (ITS#8066)
+ Fix to retry writes on EINTR (ITS#8106)
+ Fix mdb_cursor_del on empty DB (ITS#8109)
+ Fix MDB_INTEGERDUP key compare (ITS#8117)
+ Fix error handling (ITS#7959,#8157,etc.)
+ Fix race conditions (ITS#7969,7970)
+ Added workaround for fdatasync bug in ext3fs
+ Build
+ Don't use -fPIC for static lib
+ Update .gitignore (ITS#7952,#7953)
+ Cleanup for "make test" (ITS#7841), "make clean", mtest*.c
+ Misc. Android/Windows cleanup
+ Documentation
+ Fix MDB_APPEND doc
+ Fix MDB_MAXKEYSIZE doc (ITS#8156)
+ Fix mdb_cursor_put,mdb_cursor_del EACCES description
+ Fix mdb_env_sync(MDB_RDONLY env) doc (ITS#8021)
+ Clarify MDB_WRITEMAP doc (ITS#8021)
+ Clarify mdb_env_open doc
+ Clarify mdb_dbi_open doc
+
LMDB 0.9.14 Release (2014/09/20)
Fix to support 64K page size (ITS#7713)
Fix to persist decreased as well as increased mapsizes (ITS#7789)
diff --git a/external/db_drivers/liblmdb32/CMakeLists.txt b/external/db_drivers/liblmdb32/CMakeLists.txt
index 62b800135..293da1039 100644
--- a/external/db_drivers/liblmdb32/CMakeLists.txt
+++ b/external/db_drivers/liblmdb32/CMakeLists.txt
@@ -26,6 +26,13 @@
# 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.
+if(FREEBSD)
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMDB_DSYNC=O_SYNC")
+endif()
+
+# pass the VL32 flag so that we actually invoke the VL32 extensions
+set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVL32")
+
set (lmdb_sources
mdb.c
midl.c)
diff --git a/external/db_drivers/liblmdb32/COPYRIGHT b/external/db_drivers/liblmdb32/COPYRIGHT
index e0eb484c7..722d1a515 100644
--- a/external/db_drivers/liblmdb32/COPYRIGHT
+++ b/external/db_drivers/liblmdb32/COPYRIGHT
@@ -1,4 +1,4 @@
-Copyright 2011-2014 Howard Chu, Symas Corp.
+Copyright 2011-2015 Howard Chu, Symas Corp.
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/external/db_drivers/liblmdb32/Makefile b/external/db_drivers/liblmdb32/Makefile
index 095e65587..26b6203af 100644
--- a/external/db_drivers/liblmdb32/Makefile
+++ b/external/db_drivers/liblmdb32/Makefile
@@ -11,6 +11,7 @@
# - MDB_USE_POSIX_SEM
# - MDB_DSYNC
# - MDB_FDATASYNC
+# - MDB_FDATASYNC_WORKS
# - MDB_USE_PWRITEV
#
# There may be other macros in mdb.c of interest. You should
@@ -42,18 +43,18 @@ install: $(ILIBS) $(IPROGS) $(IHDRS)
for f in $(IDOCS); do cp $$f $(DESTDIR)$(prefix)/man/man1; done
clean:
- rm -rf $(PROGS) *.[ao] *.so *~ testdb
+ rm -rf $(PROGS) *.[ao] *.[ls]o *~ testdb
test: all
- mkdir testdb
+ rm -rf testdb && mkdir testdb
./mtest && ./mdb_stat testdb
liblmdb.a: mdb.o midl.o
ar rs $@ mdb.o midl.o
-liblmdb.so: mdb.o midl.o
+liblmdb.so: mdb.lo midl.lo
# $(CC) $(LDFLAGS) -pthread -shared -Wl,-Bsymbolic -o $@ mdb.o midl.o $(SOLIBS)
- $(CC) $(LDFLAGS) -pthread -shared -o $@ mdb.o midl.o $(SOLIBS)
+ $(CC) $(LDFLAGS) -pthread -shared -o $@ mdb.lo midl.lo $(SOLIBS)
mdb_stat: mdb_stat.o liblmdb.a
mdb_copy: mdb_copy.o liblmdb.a
@@ -67,10 +68,16 @@ mtest5: mtest5.o liblmdb.a
mtest6: mtest6.o liblmdb.a
mdb.o: mdb.c lmdb.h midl.h
- $(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c mdb.c
+ $(CC) $(CFLAGS) $(CPPFLAGS) -c mdb.c
midl.o: midl.c midl.h
- $(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c midl.c
+ $(CC) $(CFLAGS) $(CPPFLAGS) -c midl.c
+
+mdb.lo: mdb.c lmdb.h midl.h
+ $(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c mdb.c -o $@
+
+midl.lo: midl.c midl.h
+ $(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c midl.c -o $@
%: %.o
$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
diff --git a/external/db_drivers/liblmdb32/lmdb.h b/external/db_drivers/liblmdb32/lmdb.h
index bdbb0b909..2f523579c 100644
--- a/external/db_drivers/liblmdb32/lmdb.h
+++ b/external/db_drivers/liblmdb32/lmdb.h
@@ -119,7 +119,7 @@
*
* @author Howard Chu, Symas Corporation.
*
- * @copyright Copyright 2011-2014 Howard Chu, Symas Corp. All rights reserved.
+ * @copyright Copyright 2011-2015 Howard Chu, Symas Corp. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the OpenLDAP
@@ -184,7 +184,7 @@ typedef int mdb_filehandle_t;
/** Library minor version */
#define MDB_VERSION_MINOR 9
/** Library patch version */
-#define MDB_VERSION_PATCH 14
+#define MDB_VERSION_PATCH 15
/** Combine args a,b,c into a single integer for easy version comparisons */
#define MDB_VERINT(a,b,c) (((a) << 24) | ((b) << 16) | (c))
@@ -194,7 +194,7 @@ typedef int mdb_filehandle_t;
MDB_VERINT(MDB_VERSION_MAJOR,MDB_VERSION_MINOR,MDB_VERSION_PATCH)
/** The release date of this library version */
-#define MDB_VERSION_DATE "September 20, 2014"
+#define MDB_VERSION_DATE "June 19, 2015"
/** A stringifier for the version info */
#define MDB_VERSTR(a,b,c,d) "LMDB " #a "." #b "." #c ": (" d ")"
@@ -296,12 +296,12 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
#define MDB_REVERSEKEY 0x02
/** use sorted duplicates */
#define MDB_DUPSORT 0x04
- /** numeric keys in native byte order.
+ /** numeric keys in native byte order: either unsigned int or size_t.
* The keys must all be of the same size. */
#define MDB_INTEGERKEY 0x08
/** with #MDB_DUPSORT, sorted dup items have fixed size */
#define MDB_DUPFIXED 0x10
- /** with #MDB_DUPSORT, dups are numeric in native byte order */
+ /** with #MDB_DUPSORT, dups are #MDB_INTEGERKEY-style integers */
#define MDB_INTEGERDUP 0x20
/** with #MDB_DUPSORT, use reverse string dups */
#define MDB_REVERSEDUP 0x40
@@ -516,8 +516,8 @@ int mdb_env_create(MDB_env **env);
* and uses fewer mallocs, but loses protection from application bugs
* like wild pointer writes and other bad updates into the database.
* Incompatible with nested transactions.
- * Processes with and without MDB_WRITEMAP on the same environment do
- * not cooperate well.
+ * Do not mix processes with and without MDB_WRITEMAP on the same
+ * environment. This can defeat durability (#mdb_env_sync etc).
*
#MDB_NOMETASYNC
* Flush system buffers to disk only once per transaction, omit the
* metadata flush. Defer that until the system flushes files to disk,
@@ -588,8 +588,8 @@ int mdb_env_create(MDB_env **env);
* reserved in that case.
* This flag may be changed at any time using #mdb_env_set_flags().
*
- * @param[in] mode The UNIX permissions to set on created files. This parameter
- * is ignored on Windows.
+ * @param[in] mode The UNIX permissions to set on created files and semaphores.
+ * This parameter is ignored on Windows.
* @return A non-zero error value on failure and 0 on success. Some possible
* errors are:
*
@@ -698,7 +698,8 @@ int mdb_env_info(MDB_env *env, MDB_envinfo *stat);
* Data is always written to disk when #mdb_txn_commit() is called,
* but the operating system may keep it buffered. LMDB always flushes
* the OS buffers upon commit as well, unless the environment was
- * opened with #MDB_NOSYNC or in part #MDB_NOMETASYNC.
+ * opened with #MDB_NOSYNC or in part #MDB_NOMETASYNC. This call is
+ * not valid if the environment was opened with #MDB_RDONLY.
* @param[in] env An environment handle returned by #mdb_env_create()
* @param[in] force If non-zero, force a synchronous flush. Otherwise
* if the environment has the #MDB_NOSYNC flag set the flushes
@@ -706,6 +707,7 @@ int mdb_env_info(MDB_env *env, MDB_envinfo *stat);
* @return A non-zero error value on failure and 0 on success. Some possible
* errors are:
*
+ * - EACCES - the environment is read-only.
*
- EINVAL - an invalid parameter was specified.
*
- EIO - an error occurred during synchronization.
*
@@ -1019,15 +1021,17 @@ int mdb_txn_renew(MDB_txn *txn);
* The database handle may be discarded by calling #mdb_dbi_close().
* The old database handle is returned if the database was already open.
* The handle may only be closed once.
+ *
* The database handle will be private to the current transaction until
* the transaction is successfully committed. If the transaction is
* aborted the handle will be closed automatically.
- * After a successful commit the
- * handle will reside in the shared environment, and may be used
- * by other transactions. This function must not be called from
- * multiple concurrent transactions. A transaction that uses this function
- * must finish (either commit or abort) before any other transaction may
- * use this function.
+ * After a successful commit the handle will reside in the shared
+ * environment, and may be used by other transactions.
+ *
+ * This function must not be called from multiple concurrent
+ * transactions in the same process. A transaction that uses
+ * this function must finish (either commit or abort) before
+ * any other transaction in the process may use this function.
*
* To use named databases (with name != NULL), #mdb_env_set_maxdbs()
* must be called before opening the environment. Database names
@@ -1048,9 +1052,9 @@ int mdb_txn_renew(MDB_txn *txn);
* keys may have multiple data items, stored in sorted order.) By default
* keys must be unique and may have only a single data item.
* - #MDB_INTEGERKEY
- * Keys are binary integers in native byte order. Setting this option
- * requires all keys to be the same size, typically sizeof(int)
- * or sizeof(size_t).
+ * Keys are binary integers in native byte order, either unsigned int
+ * or size_t, and will be sorted as such.
+ * The keys must all be of the same size.
*
- #MDB_DUPFIXED
* This flag may only be used in combination with #MDB_DUPSORT. This option
* tells the library that the data items for this database are all the same
@@ -1058,8 +1062,8 @@ int mdb_txn_renew(MDB_txn *txn);
* all data items are the same size, the #MDB_GET_MULTIPLE and #MDB_NEXT_MULTIPLE
* cursor operations may be used to retrieve multiple items at once.
*
- #MDB_INTEGERDUP
- * This option specifies that duplicate data items are also integers, and
- * should be sorted as such.
+ * This option specifies that duplicate data items are binary integers,
+ * similar to #MDB_INTEGERKEY keys.
*
- #MDB_REVERSEDUP
* This option specifies that duplicate data items should be compared as
* strings in reverse order.
@@ -1270,10 +1274,9 @@ int mdb_get(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data);
* LMDB does nothing else with this memory, the caller is expected
* to modify all of the space requested.
*
- #MDB_APPEND - append the given key/data pair to the end of the
- * database. No key comparisons are performed. This option allows
- * fast bulk loading when keys are already known to be in the
- * correct order. Loading unsorted keys with this flag will cause
- * data corruption.
+ * database. This option allows fast bulk loading when keys are
+ * already known to be in the correct order. Loading unsorted keys
+ * with this flag will cause a #MDB_KEYEXIST error.
*
- #MDB_APPENDDUP - as above, but for sorted dup data.
*
* @return A non-zero error value on failure and 0 on success. Some possible
@@ -1449,7 +1452,7 @@ int mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
*
* - #MDB_MAP_FULL - the database is full, see #mdb_env_set_mapsize().
*
- #MDB_TXN_FULL - the transaction has too many dirty pages.
- *
- EACCES - an attempt was made to modify a read-only database.
+ *
- EACCES - an attempt was made to write in a read-only transaction.
*
- EINVAL - an invalid parameter was specified.
*
*/
@@ -1469,7 +1472,7 @@ int mdb_cursor_put(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
* @return A non-zero error value on failure and 0 on success. Some possible
* errors are:
*
- * - EACCES - an attempt was made to modify a read-only database.
+ *
- EACCES - an attempt was made to write in a read-only transaction.
*
- EINVAL - an invalid parameter was specified.
*
*/
diff --git a/external/db_drivers/liblmdb32/mdb.c b/external/db_drivers/liblmdb32/mdb.c
index 63fece3d7..dd3d5848f 100644
--- a/external/db_drivers/liblmdb32/mdb.c
+++ b/external/db_drivers/liblmdb32/mdb.c
@@ -5,7 +5,7 @@
* BerkeleyDB API, but much simplified.
*/
/*
- * Copyright 2011-2014 Howard Chu, Symas Corp.
+ * Copyright 2011-2015 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -79,6 +79,14 @@ extern int cacheflush(char *addr, int nbytes, int cache);
#define CACHEFLUSH(addr, bytes, cache)
#endif
+#if defined(__linux) && !defined(MDB_FDATASYNC_WORKS)
+/** fdatasync is broken on ext3/ext4fs on older kernels, see
+ * description in #mdb_env_open2 comments. You can safely
+ * define MDB_FDATASYNC_WORKS if this code will only be run
+ * on kernels 3.6 and newer.
+ */
+#define BROKEN_FDATASYNC
+#endif
#include
#include
@@ -438,12 +446,17 @@ static txnid_t mdb_debug_start;
/** The version number for a database's lockfile format. */
#define MDB_LOCK_VERSION 1
- /** @brief The max size of a key we can write, or 0 for dynamic max.
+ /** @brief The max size of a key we can write, or 0 for computed max.
*
- * Define this as 0 to compute the max from the page size. 511
- * is default for backwards compat: liblmdb <= 0.9.10 can break
- * when modifying a DB with keys/dupsort data bigger than its max.
- * #MDB_DEVEL sets the default to 0.
+ * This macro should normally be left alone or set to 0.
+ * Note that a database with big keys or dupsort data cannot be
+ * reliably modified by a liblmdb which uses a smaller max.
+ * The default is 511 for backwards compat, or 0 when #MDB_DEVEL.
+ *
+ * Other values are allowed, for backwards compat. However:
+ * A value bigger than the computed max can break if you do not
+ * know what you are doing, and liblmdb <= 0.9.10 can break when
+ * modifying a DB with keys/dupsort data bigger than its max.
*
* Data items in an #MDB_DUPSORT database are also limited to
* this size, since they're actually keys of a sub-DB. Keys and
@@ -580,11 +593,11 @@ typedef struct MDB_rxbody {
* started from so we can avoid overwriting any data used in that
* particular version.
*/
- txnid_t mrb_txnid;
+ volatile txnid_t mrb_txnid;
/** The process ID of the process owning this reader txn. */
- MDB_PID_T mrb_pid;
+ volatile MDB_PID_T mrb_pid;
/** The thread ID of the thread owning this txn. */
- MDB_THR_T mrb_tid;
+ volatile MDB_THR_T mrb_tid;
} MDB_rxbody;
/** The actual reader record, with cacheline padding. */
@@ -632,12 +645,12 @@ typedef struct MDB_txbody {
* This is recorded here only for convenience; the value can always
* be determined by reading the main database meta pages.
*/
- txnid_t mtb_txnid;
+ volatile txnid_t mtb_txnid;
/** The number of slots that have been used in the reader table.
* This always records the maximum count, it is not decremented
* when readers release their slots.
*/
- unsigned mtb_numreaders;
+ volatile unsigned mtb_numreaders;
} MDB_txbody;
/** The actual reader table definition. */
@@ -898,7 +911,7 @@ typedef struct MDB_meta {
/** Stamp identifying this as an LMDB file. It must be set
* to #MDB_MAGIC. */
uint32_t mm_magic;
- /** Version number of this lock file. Must be set to #MDB_DATA_VERSION. */
+ /** Version number of this file. Must be set to #MDB_DATA_VERSION. */
uint32_t mm_version;
void *mm_address; /**< address for fixed mapping */
size_t mm_mapsize; /**< size of mmap region */
@@ -908,7 +921,7 @@ typedef struct MDB_meta {
/** Any persistent environment flags. @ref mdb_env */
#define mm_flags mm_dbs[0].md_flags
pgno_t mm_last_pg; /**< last used page in file */
- txnid_t mm_txnid; /**< txnid that committed this page */
+ volatile txnid_t mm_txnid; /**< txnid that committed this page */
} MDB_meta;
/** Buffer for a stack-allocated meta page.
@@ -991,7 +1004,7 @@ struct MDB_txn {
#ifdef VL32
/** List of read-only pages */
MDB_ID2L mt_rpages;
-#endif
+#endif
/** Number of DB records in use. This number only ever increments;
* we don't decrement it when individual DB handles are closed.
*/
@@ -1103,6 +1116,8 @@ struct MDB_env {
#define MDB_ENV_ACTIVE 0x20000000U
/** me_txkey is set */
#define MDB_ENV_TXKEY 0x10000000U
+ /** fdatasync is unreliable */
+#define MDB_FSYNCONLY 0x08000000U
uint32_t me_flags; /**< @ref mdb_env */
unsigned int me_psize; /**< DB page size, inited from me_os_psize */
unsigned int me_os_psize; /**< OS page size, from #GET_PAGESIZE */
@@ -1242,6 +1257,13 @@ static void mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi);
static MDB_cmp_func mdb_cmp_memn, mdb_cmp_memnr, mdb_cmp_int, mdb_cmp_cint, mdb_cmp_long;
/** @endcond */
+/** Compare two items pointing at size_t's of unknown alignment. */
+#ifdef MISALIGNED_OK
+# define mdb_cmp_clong mdb_cmp_long
+#else
+# define mdb_cmp_clong mdb_cmp_cint
+#endif
+
#ifdef _WIN32
static SECURITY_DESCRIPTOR mdb_null_sd;
static SECURITY_ATTRIBUTES mdb_all_sa;
@@ -1323,7 +1345,7 @@ mdb_strerror(int err)
buf[0] = 0;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, err, 0, ptr, sizeof(buf), pad);
+ NULL, err, 0, ptr, sizeof(buf), (va_list *)pad);
return ptr;
#else
return strerror(err);
@@ -1555,7 +1577,12 @@ mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b)
int
mdb_dcmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b)
{
- return txn->mt_dbxs[dbi].md_dcmp(a, b);
+ MDB_cmp_func *dcmp = txn->mt_dbxs[dbi].md_dcmp;
+#if UINT_MAX < SIZE_MAX
+ if (dcmp == mdb_cmp_int && a->mv_size == sizeof(size_t))
+ dcmp = mdb_cmp_clong;
+#endif
+ return dcmp(a, b);
}
/** Allocate memory for a page.
@@ -2323,6 +2350,8 @@ int
mdb_env_sync(MDB_env *env, int force)
{
int rc = 0;
+ if (env->me_flags & MDB_RDONLY)
+ return EACCES;
if (force || !F_ISSET(env->me_flags, MDB_NOSYNC)) {
if (env->me_flags & MDB_WRITEMAP) {
int flags = ((env->me_flags & MDB_MAPASYNC) && !force)
@@ -2334,6 +2363,12 @@ mdb_env_sync(MDB_env *env, int force)
rc = ErrCode();
#endif
} else {
+#ifdef BROKEN_FDATASYNC
+ if (env->me_flags & MDB_FSYNCONLY) {
+ if (fsync(env->me_fd))
+ rc = ErrCode();
+ } else
+#endif
if (MDB_FDATASYNC(env->me_fd))
rc = ErrCode();
}
@@ -2489,15 +2524,11 @@ mdb_txn_renew0(MDB_txn *txn)
MDB_env *env = txn->mt_env;
MDB_txninfo *ti = env->me_txns;
MDB_meta *meta;
- unsigned int i, nr;
+ unsigned int i, nr, flags = txn->mt_flags;
uint16_t x;
int rc, new_notls = 0;
- /* Setup db info */
- txn->mt_numdbs = env->me_numdbs;
- txn->mt_dbxs = env->me_dbxs; /* mostly static anyway */
-
- if (txn->mt_flags & MDB_TXN_RDONLY) {
+ if ((flags &= MDB_TXN_RDONLY) != 0) {
if (!ti) {
meta = env->me_metas[ mdb_env_pick_meta(env) ];
txn->mt_txnid = meta->mm_txnid;
@@ -2543,10 +2574,14 @@ mdb_txn_renew0(MDB_txn *txn)
return rc;
}
}
- txn->mt_txnid = r->mr_txnid = ti->mti_txnid;
+ do /* LY: Retry on a race, ITS#7970. */
+ r->mr_txnid = ti->mti_txnid;
+ while(r->mr_txnid != ti->mti_txnid);
+ txn->mt_txnid = r->mr_txnid;
txn->mt_u.reader = r;
meta = env->me_metas[txn->mt_txnid & 1];
}
+ txn->mt_dbxs = env->me_dbxs; /* mostly static anyway */
} else {
if (ti) {
LOCK_MUTEX_W(env);
@@ -2562,6 +2597,9 @@ mdb_txn_renew0(MDB_txn *txn)
if (txn->mt_txnid == mdb_debug_start)
mdb_debug = 1;
#endif
+ txn->mt_child = NULL;
+ txn->mt_loose_pgs = NULL;
+ txn->mt_loose_count = 0;
txn->mt_dirty_room = MDB_IDL_UM_MAX;
txn->mt_u.dirty_list = env->me_dirty_list;
txn->mt_u.dirty_list[0].mid = 0;
@@ -2578,6 +2616,10 @@ mdb_txn_renew0(MDB_txn *txn)
/* Moved to here to avoid a data race in read TXNs */
txn->mt_next_pgno = meta->mm_last_pg+1;
+ txn->mt_flags = flags;
+
+ /* Setup db info */
+ txn->mt_numdbs = env->me_numdbs;
for (i=2; imt_numdbs; i++) {
x = env->me_dbflags[i];
txn->mt_dbs[i].md_flags = x & PERSISTENT_FLAGS;
@@ -2643,18 +2685,16 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret)
}
tsize = sizeof(MDB_ntxn);
}
- size = tsize + env->me_maxdbs * (sizeof(MDB_db)+1);
+ size = tsize;
if (!(flags & MDB_RDONLY)) {
if (!parent) {
- txn = env->me_txn0;
- txn->mt_flags = 0;
+ txn = env->me_txn0; /* just reuse preallocated write txn */
goto ok;
}
+ /* child txns use own copy of cursors */
size += env->me_maxdbs * sizeof(MDB_cursor *);
- /* child txns use parent's dbiseqs */
- if (!parent)
- size += env->me_maxdbs * sizeof(unsigned int);
}
+ size += env->me_maxdbs * (sizeof(MDB_db)+1);
if ((txn = calloc(1, size)) == NULL) {
DPRINTF(("calloc: %s", strerror(errno)));
@@ -2807,38 +2847,40 @@ mdb_txn_reset0(MDB_txn *txn, const char *act)
txn->mt_numdbs = 0; /* close nothing if called again */
txn->mt_dbxs = NULL; /* mark txn as reset */
} else {
- mdb_cursors_close(txn, 0);
+ pgno_t *pghead = env->me_pghead;
+ mdb_cursors_close(txn, 0);
if (!(env->me_flags & MDB_WRITEMAP)) {
mdb_dlist_free(txn);
}
- mdb_midl_free(env->me_pghead);
- if (txn->mt_parent) {
+ if (!txn->mt_parent) {
+ if (mdb_midl_shrink(&txn->mt_free_pgs))
+ env->me_free_pgs = txn->mt_free_pgs;
+ /* me_pgstate: */
+ env->me_pghead = NULL;
+ env->me_pglast = 0;
+
+ env->me_txn = NULL;
+ /* The writer mutex was locked in mdb_txn_begin. */
+ if (env->me_txns)
+ UNLOCK_MUTEX_W(env);
+ } else {
txn->mt_parent->mt_child = NULL;
env->me_pgstate = ((MDB_ntxn *)txn)->mnt_pgstate;
mdb_midl_free(txn->mt_free_pgs);
mdb_midl_free(txn->mt_spill_pgs);
free(txn->mt_u.dirty_list);
- return;
}
- if (mdb_midl_shrink(&txn->mt_free_pgs))
- env->me_free_pgs = txn->mt_free_pgs;
- env->me_pghead = NULL;
- env->me_pglast = 0;
-
- env->me_txn = NULL;
- /* The writer mutex was locked in mdb_txn_begin. */
- if (env->me_txns)
- UNLOCK_MUTEX_W(env);
+ mdb_midl_free(pghead);
}
#ifdef VL32
{
unsigned i, n = txn->mt_rpages[0].mid;
for (i = 1; i <= n; i++) {
#ifdef _WIN32
- UnmapViewOfFile(txn->mt_rpages[i].mptr);)
+ UnmapViewOfFile(txn->mt_rpages[i].mptr);
#else
MDB_page *mp = txn->mt_rpages[i].mptr;
int size = txn->mt_env->me_psize;
@@ -3159,6 +3201,7 @@ mdb_page_flush(MDB_txn *txn, int keep)
/* Write up to MDB_COMMIT_PAGES dirty pages at a time. */
if (pos!=next_pos || n==MDB_COMMIT_PAGES || wsize+size>MAX_WRITE) {
if (n) {
+retry_write:
/* Write previous page(s) */
#ifdef MDB_USE_PWRITEV
wres = pwritev(env->me_fd, iov, n, wpos);
@@ -3166,8 +3209,11 @@ mdb_page_flush(MDB_txn *txn, int keep)
if (n == 1) {
wres = pwrite(env->me_fd, iov[0].iov_base, wsize, wpos);
} else {
+retry_seek:
if (lseek(env->me_fd, wpos, SEEK_SET) == -1) {
rc = ErrCode();
+ if (rc == EINTR)
+ goto retry_seek;
DPRINTF(("lseek: %s", strerror(rc)));
return rc;
}
@@ -3177,6 +3223,8 @@ mdb_page_flush(MDB_txn *txn, int keep)
if (wres != wsize) {
if (wres < 0) {
rc = ErrCode();
+ if (rc == EINTR)
+ goto retry_write;
DPRINTF(("Write error: %s", strerror(rc)));
} else {
rc = EIO; /* TODO: Use which error code? */
@@ -3546,7 +3594,8 @@ mdb_env_init_meta(MDB_env *env, MDB_meta *meta)
int len;
#define DO_PWRITE(rc, fd, ptr, size, len, pos) do { \
len = pwrite(fd, ptr, size, pos); \
- rc = (len >= 0); } while(0)
+ if (len == -1 && ErrCode() == EINTR) continue; \
+ rc = (len >= 0); break; } while(1)
#endif
DPUTS("writing new meta page");
@@ -3651,6 +3700,7 @@ mdb_env_write_meta(MDB_txn *txn)
/* Write to the SYNC fd */
mfd = env->me_flags & (MDB_NOSYNC|MDB_NOMETASYNC) ?
env->me_fd : env->me_mfd;
+retry_write:
#ifdef _WIN32
{
memset(&ov, 0, sizeof(ov));
@@ -3663,6 +3713,8 @@ mdb_env_write_meta(MDB_txn *txn)
#endif
if (rc != len) {
rc = rc < 0 ? ErrCode() : EIO;
+ if (rc == EINTR)
+ goto retry_write;
DPUTS("write failed, disk error?");
/* On a failure, the pagecache still contains the new data.
* Write some old data back, to prevent it from being used.
@@ -3894,6 +3946,32 @@ mdb_env_get_maxreaders(MDB_env *env, unsigned int *readers)
return MDB_SUCCESS;
}
+static int ESECT
+mdb_fsize(HANDLE fd, size_t *size)
+{
+#ifdef _WIN32
+ LARGE_INTEGER fsize;
+
+ if (!GetFileSizeEx(fd, &fsize))
+ return ErrCode();
+
+ *size = fsize.QuadPart;
+#else
+ struct stat st;
+
+ if (fstat(fd, &st))
+ return ErrCode();
+
+ *size = st.st_size;
+#endif
+ return MDB_SUCCESS;
+}
+
+#ifdef BROKEN_FDATASYNC
+#include
+#include
+#endif
+
/** Further setup required for opening an LMDB environment
*/
static int ESECT
@@ -3911,6 +3989,53 @@ mdb_env_open2(MDB_env *env)
else
env->me_pidquery = PROCESS_QUERY_INFORMATION;
#endif /* _WIN32 */
+#ifdef BROKEN_FDATASYNC
+ /* ext3/ext4 fdatasync is broken on some older Linux kernels.
+ * https://lkml.org/lkml/2012/9/3/83
+ * Kernels after 3.6-rc6 are known good.
+ * https://lkml.org/lkml/2012/9/10/556
+ * See if the DB is on ext3/ext4, then check for new enough kernel
+ * Kernels 2.6.32.60, 2.6.34.15, 3.2.30, and 3.5.4 are also known
+ * to be patched.
+ */
+ {
+ struct statfs st;
+ fstatfs(env->me_fd, &st);
+ while (st.f_type == 0xEF53) {
+ struct utsname uts;
+ int i;
+ uname(&uts);
+ if (uts.release[0] < '3') {
+ if (!strncmp(uts.release, "2.6.32.", 7)) {
+ i = atoi(uts.release+7);
+ if (i >= 60)
+ break; /* 2.6.32.60 and newer is OK */
+ } else if (!strncmp(uts.release, "2.6.34.", 7)) {
+ i = atoi(uts.release+7);
+ if (i >= 15)
+ break; /* 2.6.34.15 and newer is OK */
+ }
+ } else if (uts.release[0] == '3') {
+ i = atoi(uts.release+2);
+ if (i > 5)
+ break; /* 3.6 and newer is OK */
+ if (i == 5) {
+ i = atoi(uts.release+4);
+ if (i >= 4)
+ break; /* 3.5.4 and newer is OK */
+ } else if (i == 2) {
+ i = atoi(uts.release+4);
+ if (i >= 30)
+ break; /* 3.2.30 and newer is OK */
+ }
+ } else { /* 4.x and newer is OK */
+ break;
+ }
+ env->me_flags |= MDB_FSYNCONLY;
+ break;
+ }
+ }
+#endif
memset(&meta, 0, sizeof(meta));
@@ -4042,7 +4167,7 @@ PIMAGE_TLS_CALLBACK mdb_tls_cbp __attribute__((section (".CRT$XLB"))) = mdb_tls_
extern const PIMAGE_TLS_CALLBACK mdb_tls_cbp;
const PIMAGE_TLS_CALLBACK mdb_tls_cbp = mdb_tls_callback;
#pragma const_seg()
-#else /* WIN32 */
+#else /* _WIN32 */
#pragma comment(linker, "/INCLUDE:__tls_used")
#pragma comment(linker, "/INCLUDE:_mdb_tls_cbp")
#pragma data_seg(".CRT$XLB")
@@ -4092,7 +4217,7 @@ mdb_env_share_locks(MDB_env *env, int *excl)
return rc;
}
-/** Try to get exlusive lock, otherwise shared.
+/** Try to get exclusive lock, otherwise shared.
* Maintain *excl = -1: no/unknown lock, 0: shared, 1: exclusive.
*/
static int ESECT
@@ -4233,7 +4358,6 @@ mdb_hash_enc(MDB_val *val, char *encbuf)
* @param[in] env The LMDB environment.
* @param[in] lpath The pathname of the file used for the lock region.
* @param[in] mode The Unix permissions for the file, if we create it.
- * @param[out] excl Resulting file lock type: -1 none, 0 shared, 1 exclusive
* @param[in,out] excl In -1, out lock type: -1 none, 0 shared, 1 exclusive
* @return 0 on success, non-zero on failure.
*/
@@ -4599,7 +4723,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
if (!(flags & MDB_RDONLY)) {
MDB_txn *txn;
int tsize = sizeof(MDB_txn), size = tsize + env->me_maxdbs *
- (sizeof(MDB_db)+sizeof(MDB_cursor)+sizeof(unsigned int)+1);
+ (sizeof(MDB_db)+sizeof(MDB_cursor *)+sizeof(unsigned int)+1);
txn = calloc(1, size);
if (txn) {
txn->mt_dbs = (MDB_db *)((char *)txn + tsize);
@@ -4607,6 +4731,7 @@ mdb_env_open(MDB_env *env, const char *path, unsigned int flags, mdb_mode_t mode
txn->mt_dbiseqs = (unsigned int *)(txn->mt_cursors + env->me_maxdbs);
txn->mt_dbflags = (unsigned char *)(txn->mt_dbiseqs + env->me_maxdbs);
txn->mt_env = env;
+ txn->mt_dbxs = env->me_dbxs;
#ifdef VL32
txn->mt_rpages = calloc(MDB_IDL_UM_SIZE, sizeof(MDB_ID2));
if (!txn->mt_rpages) {
@@ -4639,13 +4764,15 @@ mdb_env_close0(MDB_env *env, int excl)
return;
/* Doing this here since me_dbxs may not exist during mdb_env_close */
- for (i = env->me_maxdbs; --i > MAIN_DBI; )
- free(env->me_dbxs[i].md_name.mv_data);
+ if (env->me_dbxs) {
+ for (i = env->me_maxdbs; --i > MAIN_DBI; )
+ free(env->me_dbxs[i].md_name.mv_data);
+ free(env->me_dbxs);
+ }
free(env->me_pbuf);
free(env->me_dbiseqs);
free(env->me_dbflags);
- free(env->me_dbxs);
free(env->me_path);
free(env->me_dirty_list);
free(env->me_txn0);
@@ -4752,7 +4879,11 @@ mdb_cmp_long(const MDB_val *a, const MDB_val *b)
*(size_t *)a->mv_data > *(size_t *)b->mv_data;
}
-/** Compare two items pointing at aligned unsigned int's */
+/** Compare two items pointing at aligned unsigned int's.
+ *
+ * This is also set as #MDB_INTEGERDUP|#MDB_DUPFIXED's #MDB_dbx.%md_dcmp,
+ * but #mdb_cmp_clong() is called instead if the data type is size_t.
+ */
static int
mdb_cmp_int(const MDB_val *a, const MDB_val *b)
{
@@ -4790,13 +4921,6 @@ mdb_cmp_cint(const MDB_val *a, const MDB_val *b)
#endif
}
-/** Compare two items pointing at size_t's of unknown alignment. */
-#ifdef MISALIGNED_OK
-# define mdb_cmp_clong mdb_cmp_long
-#else
-# define mdb_cmp_clong mdb_cmp_cint
-#endif
-
/** Compare two items lexically */
static int
mdb_cmp_memn(const MDB_val *a, const MDB_val *b)
@@ -5432,6 +5556,7 @@ mdb_cursor_sibling(MDB_cursor *mc, int move_right)
#ifdef VL32
op = mc->mc_pg[mc->mc_top];
#endif
+
mdb_cursor_pop(mc);
DPRINTF(("parent page is page %"Z"u, index %u",
mc->mc_pg[mc->mc_top]->mp_pgno, mc->mc_ki[mc->mc_top]));
@@ -5590,11 +5715,11 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
}
return rc;
}
- } else {
- mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
- if (op == MDB_PREV_DUP)
- return MDB_NOTFOUND;
}
+ } else {
+ mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
+ if (op == MDB_PREV_DUP)
+ return MDB_NOTFOUND;
}
}
@@ -5806,15 +5931,21 @@ set1:
return rc;
}
} else if (op == MDB_GET_BOTH || op == MDB_GET_BOTH_RANGE) {
- MDB_val d2;
- if ((rc = mdb_node_read(mc->mc_txn, leaf, &d2)) != MDB_SUCCESS)
+ MDB_val olddata;
+ MDB_cmp_func *dcmp;
+ if ((rc = mdb_node_read(mc->mc_txn, leaf, &olddata)) != MDB_SUCCESS)
return rc;
- rc = mc->mc_dbx->md_dcmp(data, &d2);
+ dcmp = mc->mc_dbx->md_dcmp;
+#if UINT_MAX < SIZE_MAX
+ if (dcmp == mdb_cmp_int && olddata.mv_size == sizeof(size_t))
+ dcmp = mdb_cmp_clong;
+#endif
+ rc = dcmp(data, &olddata);
if (rc) {
if (op == MDB_GET_BOTH || rc > 0)
return MDB_NOTFOUND;
rc = 0;
- *data = d2;
+ *data = olddata;
}
} else {
@@ -6324,16 +6455,17 @@ more:
/* Was a single item before, must convert now */
if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
+ MDB_cmp_func *dcmp;
/* Just overwrite the current item */
if (flags == MDB_CURRENT)
goto current;
-
+ dcmp = mc->mc_dbx->md_dcmp;
#if UINT_MAX < SIZE_MAX
- if (mc->mc_dbx->md_dcmp == mdb_cmp_int && olddata.mv_size == sizeof(size_t))
- mc->mc_dbx->md_dcmp = mdb_cmp_clong;
+ if (dcmp == mdb_cmp_int && olddata.mv_size == sizeof(size_t))
+ dcmp = mdb_cmp_clong;
#endif
/* does data match? */
- if (!mc->mc_dbx->md_dcmp(data, &olddata)) {
+ if (!dcmp(data, &olddata)) {
if (flags & MDB_NODUPDATA)
return MDB_KEYEXIST;
/* overwrite it */
@@ -7153,6 +7285,7 @@ mdb_cursor_init(MDB_cursor *mc, MDB_txn *txn, MDB_dbi dbi, MDB_xcursor *mx)
mc->mc_snum = 0;
mc->mc_top = 0;
mc->mc_pg[0] = 0;
+ mc->mc_ki[0] = 0;
mc->mc_flags = 0;
if (txn->mt_dbs[dbi].md_flags & MDB_DUPSORT) {
mdb_tassert(txn, mx != NULL);
@@ -7526,7 +7659,7 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst)
cdst->mc_ki[cdst->mc_top] = 0;
rc = mdb_update_key(cdst, &nullkey);
cdst->mc_ki[cdst->mc_top] = ix;
- mdb_cassert(csrc, rc == MDB_SUCCESS);
+ mdb_cassert(cdst, rc == MDB_SUCCESS);
}
}
@@ -7782,12 +7915,12 @@ mdb_rebalance(MDB_cursor *mc)
m3 = m2;
if (m3 == mc || m3->mc_snum < mc->mc_snum) continue;
if (m3->mc_pg[0] == mp) {
- m3->mc_snum--;
- m3->mc_top--;
for (i=0; imc_snum; i++) {
m3->mc_pg[i] = m3->mc_pg[i+1];
m3->mc_ki[i] = m3->mc_ki[i+1];
}
+ m3->mc_snum--;
+ m3->mc_top--;
}
}
}
@@ -7855,9 +7988,23 @@ mdb_rebalance(MDB_cursor *mc)
if (mc->mc_ki[ptop] == 0) {
rc = mdb_page_merge(&mn, mc);
} else {
+ MDB_cursor dummy;
oldki += NUMKEYS(mn.mc_pg[mn.mc_top]);
mn.mc_ki[mn.mc_top] += mc->mc_ki[mn.mc_top] + 1;
+ /* We want mdb_rebalance to find mn when doing fixups */
+ if (mc->mc_flags & C_SUB) {
+ dummy.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = &dummy;
+ dummy.mc_xcursor = (MDB_xcursor *)&mn;
+ } else {
+ mn.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = &mn;
+ }
rc = mdb_page_merge(mc, &mn);
+ if (mc->mc_flags & C_SUB)
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = dummy.mc_next;
+ else
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = mn.mc_next;
mdb_cursor_copy(&mn, mc);
}
mc->mc_flags &= ~C_EOF;
@@ -7884,6 +8031,13 @@ mdb_cursor_del0(MDB_cursor *mc)
MDB_cursor *m2, *m3;
MDB_dbi dbi = mc->mc_dbi;
+ /* DB is totally empty now, just bail out.
+ * Other cursors adjustments were already done
+ * by mdb_rebalance and aren't needed here.
+ */
+ if (!mc->mc_snum)
+ return rc;
+
mp = mc->mc_pg[mc->mc_top];
nkeys = NUMKEYS(mp);
@@ -8751,8 +8905,12 @@ mdb_env_copyfd1(MDB_env *env, HANDLE fd)
/* Set metapage 1 */
mm->mm_last_pg = txn->mt_next_pgno - freecount - 1;
mm->mm_dbs[1] = txn->mt_dbs[1];
- mm->mm_dbs[1].md_root = mm->mm_last_pg;
- mm->mm_txnid = 1;
+ if (mm->mm_last_pg > 1) {
+ mm->mm_dbs[1].md_root = mm->mm_last_pg;
+ mm->mm_txnid = 1;
+ } else {
+ mm->mm_dbs[1].md_root = P_INVALID;
+ }
}
my.mc_wlen[0] = env->me_psize * 2;
my.mc_txn = txn;
@@ -8847,21 +9005,13 @@ mdb_env_copyfd0(MDB_env *env, HANDLE fd)
goto leave;
w2 = txn->mt_next_pgno * env->me_psize;
-#ifdef WIN32
{
- LARGE_INTEGER fsize;
- GetFileSizeEx(env->me_fd, &fsize);
- if (w2 > fsize.QuadPart)
- w2 = fsize.QuadPart;
+ size_t fsize = 0;
+ if ((rc = mdb_fsize(env->me_fd, &fsize)))
+ goto leave;
+ if (w2 > fsize)
+ w2 = fsize;
}
-#else
- {
- struct stat st;
- fstat(env->me_fd, &st);
- if (w2 > (size_t)st.st_size)
- w2 = st.st_size;
- }
-#endif
wsize = w2 - wsize;
while (wsize > 0) {
if (wsize > MAX_WRITE)
diff --git a/external/db_drivers/liblmdb32/mdb_copy.1 b/external/db_drivers/liblmdb32/mdb_copy.1
index 094b26056..1e2a97694 100644
--- a/external/db_drivers/liblmdb32/mdb_copy.1
+++ b/external/db_drivers/liblmdb32/mdb_copy.1
@@ -1,5 +1,5 @@
.TH MDB_COPY 1 "2014/06/20" "LMDB 0.9.14"
-.\" Copyright 2012-2014 Howard Chu, Symas Corp. All Rights Reserved.
+.\" Copyright 2012-2015 Howard Chu, Symas Corp. All Rights Reserved.
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
.SH NAME
mdb_copy \- LMDB environment copy tool
diff --git a/external/db_drivers/liblmdb32/mdb_copy.c b/external/db_drivers/liblmdb32/mdb_copy.c
index e7f965c03..f37ccbcc2 100644
--- a/external/db_drivers/liblmdb32/mdb_copy.c
+++ b/external/db_drivers/liblmdb32/mdb_copy.c
@@ -1,6 +1,6 @@
/* mdb_copy.c - memory-mapped database backup tool */
/*
- * Copyright 2012 Howard Chu, Symas Corp.
+ * Copyright 2012-2015 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -64,7 +64,7 @@ int main(int argc,char * argv[])
act = "opening environment";
rc = mdb_env_create(&env);
if (rc == MDB_SUCCESS) {
- rc = mdb_env_open(env, argv[1], flags, 0664);
+ rc = mdb_env_open(env, argv[1], flags, 0600);
}
if (rc == MDB_SUCCESS) {
act = "copying";
diff --git a/external/db_drivers/liblmdb32/mdb_dump.1 b/external/db_drivers/liblmdb32/mdb_dump.1
index 6fcc93081..dd545049b 100644
--- a/external/db_drivers/liblmdb32/mdb_dump.1
+++ b/external/db_drivers/liblmdb32/mdb_dump.1
@@ -1,5 +1,5 @@
.TH MDB_DUMP 1 "2014/06/20" "LMDB 0.9.14"
-.\" Copyright 2014 Howard Chu, Symas Corp. All Rights Reserved.
+.\" Copyright 2014-2015 Howard Chu, Symas Corp. All Rights Reserved.
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
.SH NAME
mdb_dump \- LMDB environment export tool
diff --git a/external/db_drivers/liblmdb32/mdb_dump.c b/external/db_drivers/liblmdb32/mdb_dump.c
index 0eb85fd20..7202d865b 100644
--- a/external/db_drivers/liblmdb32/mdb_dump.c
+++ b/external/db_drivers/liblmdb32/mdb_dump.c
@@ -1,6 +1,6 @@
/* mdb_dump.c - memory-mapped database dump tool */
/*
- * Copyright 2011-2014 Howard Chu, Symas Corp.
+ * Copyright 2011-2015 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/external/db_drivers/liblmdb32/mdb_load.1 b/external/db_drivers/liblmdb32/mdb_load.1
index 728024010..511ec552b 100644
--- a/external/db_drivers/liblmdb32/mdb_load.1
+++ b/external/db_drivers/liblmdb32/mdb_load.1
@@ -1,5 +1,5 @@
.TH MDB_LOAD 1 "2014/06/20" "LMDB 0.9.14"
-.\" Copyright 2014 Howard Chu, Symas Corp. All Rights Reserved.
+.\" Copyright 2014-2015 Howard Chu, Symas Corp. All Rights Reserved.
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
.SH NAME
mdb_load \- LMDB environment import tool
diff --git a/external/db_drivers/liblmdb32/mdb_load.c b/external/db_drivers/liblmdb32/mdb_load.c
index e0d95e13c..1f6ce0b7e 100644
--- a/external/db_drivers/liblmdb32/mdb_load.c
+++ b/external/db_drivers/liblmdb32/mdb_load.c
@@ -1,6 +1,6 @@
/* mdb_load.c - memory-mapped database load tool */
/*
- * Copyright 2011-2014 Howard Chu, Symas Corp.
+ * Copyright 2011-2015 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -176,7 +176,7 @@ static int unhex(unsigned char *c2)
static int readline(MDB_val *out, MDB_val *buf)
{
unsigned char *c1, *c2, *end;
- size_t len;
+ size_t len, l2;
int c;
if (!(mode & NOHDR)) {
@@ -206,6 +206,7 @@ badend:
c1 = buf->mv_data;
len = strlen((char *)c1);
+ l2 = len;
/* Is buffer too short? */
while (c1[len-1] != '\n') {
@@ -217,17 +218,18 @@ badend:
return EOF;
}
c1 = buf->mv_data;
- c1 += buf->mv_size;
- if (fgets((char *)c1, buf->mv_size, stdin) == NULL) {
+ c1 += l2;
+ if (fgets((char *)c1, buf->mv_size+1, stdin) == NULL) {
Eof = 1;
badend();
return EOF;
}
buf->mv_size *= 2;
len = strlen((char *)c1);
+ l2 += len;
}
c1 = c2 = buf->mv_data;
- len = strlen((char *)c1);
+ len = l2;
c1[--len] = '\0';
end = c1 + len;
diff --git a/external/db_drivers/liblmdb32/mdb_stat.1 b/external/db_drivers/liblmdb32/mdb_stat.1
index 3d8d461d9..e6ee5ad58 100644
--- a/external/db_drivers/liblmdb32/mdb_stat.1
+++ b/external/db_drivers/liblmdb32/mdb_stat.1
@@ -1,5 +1,5 @@
.TH MDB_STAT 1 "2014/06/20" "LMDB 0.9.14"
-.\" Copyright 2012-2014 Howard Chu, Symas Corp. All Rights Reserved.
+.\" Copyright 2012-2015 Howard Chu, Symas Corp. All Rights Reserved.
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
.SH NAME
mdb_stat \- LMDB environment status tool
diff --git a/external/db_drivers/liblmdb32/mdb_stat.c b/external/db_drivers/liblmdb32/mdb_stat.c
index 1e9229296..210609b32 100644
--- a/external/db_drivers/liblmdb32/mdb_stat.c
+++ b/external/db_drivers/liblmdb32/mdb_stat.c
@@ -1,6 +1,6 @@
/* mdb_stat.c - memory-mapped database status tool */
/*
- * Copyright 2011-2013 Howard Chu, Symas Corp.
+ * Copyright 2011-2015 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/external/db_drivers/liblmdb32/midl.c b/external/db_drivers/liblmdb32/midl.c
index 88a3aff10..16782dcaf 100644
--- a/external/db_drivers/liblmdb32/midl.c
+++ b/external/db_drivers/liblmdb32/midl.c
@@ -3,7 +3,7 @@
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software .
*
- * Copyright 2000-2014 The OpenLDAP Foundation.
+ * Copyright 2000-2015 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/external/db_drivers/liblmdb32/midl.h b/external/db_drivers/liblmdb32/midl.h
index f23d7d3f3..1e5fee797 100644
--- a/external/db_drivers/liblmdb32/midl.h
+++ b/external/db_drivers/liblmdb32/midl.h
@@ -11,7 +11,7 @@
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software .
*
- * Copyright 2000-2014 The OpenLDAP Foundation.
+ * Copyright 2000-2015 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -58,7 +58,7 @@ typedef MDB_ID *MDB_IDL;
#ifdef VL32
#define MDB_IDL_LOGN 10 /* DB_SIZE is 2^10, UM_SIZE is 2^11 */
#else
-#define MDB_IDL_LOGN 16 /* DB_SIZE is 2^16, UM_SIZE is 2^17 */
+ #define MDB_IDL_LOGN 16 /* DB_SIZE is 2^16, UM_SIZE is 2^17 */
#endif
#define MDB_IDL_DB_SIZE (1< in each iteration, since MDB_NOOVERWRITE may modify it */
+ data.mv_size = sizeof(sval);
+ data.mv_data = sval;
if (RES(MDB_KEYEXIST, mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE))) {
j++;
data.mv_size = sizeof(sval);
@@ -68,7 +71,7 @@ int main(int argc,char * argv[])
E(mdb_txn_commit(txn));
E(mdb_env_stat(env, &mst));
- E(mdb_txn_begin(env, NULL, 1, &txn));
+ E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn));
E(mdb_cursor_open(txn, dbi, &cursor));
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
printf("key: %p %.*s, data: %p %.*s\n",
@@ -97,7 +100,7 @@ int main(int argc,char * argv[])
printf("Deleted %d values\n", j);
E(mdb_env_stat(env, &mst));
- E(mdb_txn_begin(env, NULL, 1, &txn));
+ E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn));
E(mdb_cursor_open(txn, dbi, &cursor));
printf("Cursor next\n");
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
@@ -128,6 +131,7 @@ int main(int argc,char * argv[])
(int) key.mv_size, (char *) key.mv_data,
(int) data.mv_size, (char *) data.mv_data);
+ mdb_cursor_close(cursor);
mdb_txn_abort(txn);
printf("Deleting with cursor\n");
@@ -164,9 +168,9 @@ int main(int argc,char * argv[])
data.mv_data, (int) data.mv_size, (char *) data.mv_data);
}
mdb_cursor_close(cursor);
- mdb_close(env, dbi);
-
mdb_txn_abort(txn);
+
+ mdb_dbi_close(env, dbi);
mdb_env_close(env);
return 0;
diff --git a/external/db_drivers/liblmdb32/mtest2.c b/external/db_drivers/liblmdb32/mtest2.c
index f1a3dbd6c..eacbe59d5 100644
--- a/external/db_drivers/liblmdb32/mtest2.c
+++ b/external/db_drivers/liblmdb32/mtest2.c
@@ -1,6 +1,6 @@
/* mtest2.c - memory-mapped database tester/toy */
/*
- * Copyright 2011-2014 Howard Chu, Symas Corp.
+ * Copyright 2011-2015 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -47,20 +47,22 @@ int main(int argc,char * argv[])
}
E(mdb_env_create(&env));
+ E(mdb_env_set_maxreaders(env, 1));
E(mdb_env_set_mapsize(env, 10485760));
E(mdb_env_set_maxdbs(env, 4));
E(mdb_env_open(env, "./testdb", MDB_FIXEDMAP|MDB_NOSYNC, 0664));
+
E(mdb_txn_begin(env, NULL, 0, &txn));
- E(mdb_open(txn, "id1", MDB_CREATE, &dbi));
+ E(mdb_dbi_open(txn, "id1", MDB_CREATE, &dbi));
key.mv_size = sizeof(int);
key.mv_data = sval;
- data.mv_size = sizeof(sval);
- data.mv_data = sval;
printf("Adding %d values\n", count);
for (i=0;i
- * @param[in] mode The UNIX permissions to set on created files. This parameter
- * is ignored on Windows.
+ * @param[in] mode The UNIX permissions to set on created files and semaphores.
+ * This parameter is ignored on Windows.
* @return A non-zero error value on failure and 0 on success. Some possible
* errors are:
*
@@ -1021,14 +1021,16 @@ int mdb_txn_renew(MDB_txn *txn);
* The database handle may be discarded by calling #mdb_dbi_close().
* The old database handle is returned if the database was already open.
* The handle may only be closed once.
+ *
* The database handle will be private to the current transaction until
* the transaction is successfully committed. If the transaction is
* aborted the handle will be closed automatically.
- * After a successful commit the
- * handle will reside in the shared environment, and may be used
- * by other transactions. This function must not be called from
- * multiple concurrent transactions in the same process. A transaction
- * that uses this function must finish (either commit or abort) before
+ * After a successful commit the handle will reside in the shared
+ * environment, and may be used by other transactions.
+ *
+ * This function must not be called from multiple concurrent
+ * transactions in the same process. A transaction that uses
+ * this function must finish (either commit or abort) before
* any other transaction in the process may use this function.
*
* To use named databases (with name != NULL), #mdb_env_set_maxdbs()
@@ -1050,9 +1052,9 @@ int mdb_txn_renew(MDB_txn *txn);
* keys may have multiple data items, stored in sorted order.) By default
* keys must be unique and may have only a single data item.
* - #MDB_INTEGERKEY
- * Keys are binary integers in native byte order. Setting this option
- * requires all keys to be the same size, typically sizeof(int)
- * or sizeof(size_t).
+ * Keys are binary integers in native byte order, either unsigned int
+ * or size_t, and will be sorted as such.
+ * The keys must all be of the same size.
*
- #MDB_DUPFIXED
* This flag may only be used in combination with #MDB_DUPSORT. This option
* tells the library that the data items for this database are all the same
@@ -1060,8 +1062,8 @@ int mdb_txn_renew(MDB_txn *txn);
* all data items are the same size, the #MDB_GET_MULTIPLE and #MDB_NEXT_MULTIPLE
* cursor operations may be used to retrieve multiple items at once.
*
- #MDB_INTEGERDUP
- * This option specifies that duplicate data items are also integers, and
- * should be sorted as such.
+ * This option specifies that duplicate data items are binary integers,
+ * similar to #MDB_INTEGERKEY keys.
*
- #MDB_REVERSEDUP
* This option specifies that duplicate data items should be compared as
* strings in reverse order.
@@ -1450,7 +1452,7 @@ int mdb_cursor_get(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
*
* - #MDB_MAP_FULL - the database is full, see #mdb_env_set_mapsize().
*
- #MDB_TXN_FULL - the transaction has too many dirty pages.
- *
- EACCES - an attempt was made to modify a read-only database.
+ *
- EACCES - an attempt was made to write in a read-only transaction.
*
- EINVAL - an invalid parameter was specified.
*
*/
@@ -1470,7 +1472,7 @@ int mdb_cursor_put(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
* @return A non-zero error value on failure and 0 on success. Some possible
* errors are:
*
- * - EACCES - an attempt was made to modify a read-only database.
+ *
- EACCES - an attempt was made to write in a read-only transaction.
*
- EINVAL - an invalid parameter was specified.
*
*/
diff --git a/external/db_drivers/liblmdb64/mdb.c b/external/db_drivers/liblmdb64/mdb.c
index c788b8534..6bdf3151d 100644
--- a/external/db_drivers/liblmdb64/mdb.c
+++ b/external/db_drivers/liblmdb64/mdb.c
@@ -446,12 +446,17 @@ static txnid_t mdb_debug_start;
/** The version number for a database's lockfile format. */
#define MDB_LOCK_VERSION 1
- /** @brief The max size of a key we can write, or 0 for dynamic max.
+ /** @brief The max size of a key we can write, or 0 for computed max.
*
- * Define this as 0 to compute the max from the page size. 511
- * is default for backwards compat: liblmdb <= 0.9.10 can break
- * when modifying a DB with keys/dupsort data bigger than its max.
- * #MDB_DEVEL sets the default to 0.
+ * This macro should normally be left alone or set to 0.
+ * Note that a database with big keys or dupsort data cannot be
+ * reliably modified by a liblmdb which uses a smaller max.
+ * The default is 511 for backwards compat, or 0 when #MDB_DEVEL.
+ *
+ * Other values are allowed, for backwards compat. However:
+ * A value bigger than the computed max can break if you do not
+ * know what you are doing, and liblmdb <= 0.9.10 can break when
+ * modifying a DB with keys/dupsort data bigger than its max.
*
* Data items in an #MDB_DUPSORT database are also limited to
* this size, since they're actually keys of a sub-DB. Keys and
@@ -1245,6 +1250,13 @@ static void mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi);
static MDB_cmp_func mdb_cmp_memn, mdb_cmp_memnr, mdb_cmp_int, mdb_cmp_cint, mdb_cmp_long;
/** @endcond */
+/** Compare two items pointing at size_t's of unknown alignment. */
+#ifdef MISALIGNED_OK
+# define mdb_cmp_clong mdb_cmp_long
+#else
+# define mdb_cmp_clong mdb_cmp_cint
+#endif
+
#ifdef _WIN32
static SECURITY_DESCRIPTOR mdb_null_sd;
static SECURITY_ATTRIBUTES mdb_all_sa;
@@ -1558,7 +1570,12 @@ mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b)
int
mdb_dcmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b)
{
- return txn->mt_dbxs[dbi].md_dcmp(a, b);
+ MDB_cmp_func *dcmp = txn->mt_dbxs[dbi].md_dcmp;
+#if UINT_MAX < SIZE_MAX
+ if (dcmp == mdb_cmp_int && a->mv_size == sizeof(size_t))
+ dcmp = mdb_cmp_clong;
+#endif
+ return dcmp(a, b);
}
/** Allocate memory for a page.
@@ -2486,14 +2503,11 @@ mdb_txn_renew0(MDB_txn *txn)
MDB_env *env = txn->mt_env;
MDB_txninfo *ti = env->me_txns;
MDB_meta *meta;
- unsigned int i, nr;
+ unsigned int i, nr, flags = txn->mt_flags;
uint16_t x;
int rc, new_notls = 0;
- if (txn->mt_flags & MDB_TXN_RDONLY) {
- /* Setup db info */
- txn->mt_numdbs = env->me_numdbs;
- txn->mt_dbxs = env->me_dbxs; /* mostly static anyway */
+ if ((flags &= MDB_TXN_RDONLY) != 0) {
if (!ti) {
meta = env->me_metas[ mdb_env_pick_meta(env) ];
txn->mt_txnid = meta->mm_txnid;
@@ -2546,6 +2560,7 @@ mdb_txn_renew0(MDB_txn *txn)
txn->mt_u.reader = r;
meta = env->me_metas[txn->mt_txnid & 1];
}
+ txn->mt_dbxs = env->me_dbxs; /* mostly static anyway */
} else {
if (ti) {
LOCK_MUTEX_W(env);
@@ -2556,14 +2571,11 @@ mdb_txn_renew0(MDB_txn *txn)
meta = env->me_metas[ mdb_env_pick_meta(env) ];
txn->mt_txnid = meta->mm_txnid;
}
- /* Setup db info */
- txn->mt_numdbs = env->me_numdbs;
txn->mt_txnid++;
#if MDB_DEBUG
if (txn->mt_txnid == mdb_debug_start)
mdb_debug = 1;
#endif
- txn->mt_flags = 0;
txn->mt_child = NULL;
txn->mt_loose_pgs = NULL;
txn->mt_loose_count = 0;
@@ -2583,6 +2595,10 @@ mdb_txn_renew0(MDB_txn *txn)
/* Moved to here to avoid a data race in read TXNs */
txn->mt_next_pgno = meta->mm_last_pg+1;
+ txn->mt_flags = flags;
+
+ /* Setup db info */
+ txn->mt_numdbs = env->me_numdbs;
for (i=2; imt_numdbs; i++) {
x = env->me_dbflags[i];
txn->mt_dbs[i].md_flags = x & PERSISTENT_FLAGS;
@@ -3132,6 +3148,7 @@ mdb_page_flush(MDB_txn *txn, int keep)
/* Write up to MDB_COMMIT_PAGES dirty pages at a time. */
if (pos!=next_pos || n==MDB_COMMIT_PAGES || wsize+size>MAX_WRITE) {
if (n) {
+retry_write:
/* Write previous page(s) */
#ifdef MDB_USE_PWRITEV
wres = pwritev(env->me_fd, iov, n, wpos);
@@ -3139,8 +3156,11 @@ mdb_page_flush(MDB_txn *txn, int keep)
if (n == 1) {
wres = pwrite(env->me_fd, iov[0].iov_base, wsize, wpos);
} else {
+retry_seek:
if (lseek(env->me_fd, wpos, SEEK_SET) == -1) {
rc = ErrCode();
+ if (rc == EINTR)
+ goto retry_seek;
DPRINTF(("lseek: %s", strerror(rc)));
return rc;
}
@@ -3150,6 +3170,8 @@ mdb_page_flush(MDB_txn *txn, int keep)
if (wres != wsize) {
if (wres < 0) {
rc = ErrCode();
+ if (rc == EINTR)
+ goto retry_write;
DPRINTF(("Write error: %s", strerror(rc)));
} else {
rc = EIO; /* TODO: Use which error code? */
@@ -3519,7 +3541,8 @@ mdb_env_init_meta(MDB_env *env, MDB_meta *meta)
int len;
#define DO_PWRITE(rc, fd, ptr, size, len, pos) do { \
len = pwrite(fd, ptr, size, pos); \
- rc = (len >= 0); } while(0)
+ if (len == -1 && ErrCode() == EINTR) continue; \
+ rc = (len >= 0); break; } while(1)
#endif
DPUTS("writing new meta page");
@@ -3624,6 +3647,7 @@ mdb_env_write_meta(MDB_txn *txn)
/* Write to the SYNC fd */
mfd = env->me_flags & (MDB_NOSYNC|MDB_NOMETASYNC) ?
env->me_fd : env->me_mfd;
+retry_write:
#ifdef _WIN32
{
memset(&ov, 0, sizeof(ov));
@@ -3636,6 +3660,8 @@ mdb_env_write_meta(MDB_txn *txn)
#endif
if (rc != len) {
rc = rc < 0 ? ErrCode() : EIO;
+ if (rc == EINTR)
+ goto retry_write;
DPUTS("write failed, disk error?");
/* On a failure, the pagecache still contains the new data.
* Write some old data back, to prevent it from being used.
@@ -4761,7 +4787,11 @@ mdb_cmp_long(const MDB_val *a, const MDB_val *b)
*(size_t *)a->mv_data > *(size_t *)b->mv_data;
}
-/** Compare two items pointing at aligned unsigned int's */
+/** Compare two items pointing at aligned unsigned int's.
+ *
+ * This is also set as #MDB_INTEGERDUP|#MDB_DUPFIXED's #MDB_dbx.%md_dcmp,
+ * but #mdb_cmp_clong() is called instead if the data type is size_t.
+ */
static int
mdb_cmp_int(const MDB_val *a, const MDB_val *b)
{
@@ -4799,13 +4829,6 @@ mdb_cmp_cint(const MDB_val *a, const MDB_val *b)
#endif
}
-/** Compare two items pointing at size_t's of unknown alignment. */
-#ifdef MISALIGNED_OK
-# define mdb_cmp_clong mdb_cmp_long
-#else
-# define mdb_cmp_clong mdb_cmp_cint
-#endif
-
/** Compare two items lexically */
static int
mdb_cmp_memn(const MDB_val *a, const MDB_val *b)
@@ -5741,15 +5764,21 @@ set1:
return rc;
}
} else if (op == MDB_GET_BOTH || op == MDB_GET_BOTH_RANGE) {
- MDB_val d2;
- if ((rc = mdb_node_read(mc->mc_txn, leaf, &d2)) != MDB_SUCCESS)
+ MDB_val olddata;
+ MDB_cmp_func *dcmp;
+ if ((rc = mdb_node_read(mc->mc_txn, leaf, &olddata)) != MDB_SUCCESS)
return rc;
- rc = mc->mc_dbx->md_dcmp(data, &d2);
+ dcmp = mc->mc_dbx->md_dcmp;
+#if UINT_MAX < SIZE_MAX
+ if (dcmp == mdb_cmp_int && olddata.mv_size == sizeof(size_t))
+ dcmp = mdb_cmp_clong;
+#endif
+ rc = dcmp(data, &olddata);
if (rc) {
if (op == MDB_GET_BOTH || rc > 0)
return MDB_NOTFOUND;
rc = 0;
- *data = d2;
+ *data = olddata;
}
} else {
@@ -6259,16 +6288,17 @@ more:
/* Was a single item before, must convert now */
if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
+ MDB_cmp_func *dcmp;
/* Just overwrite the current item */
if (flags == MDB_CURRENT)
goto current;
-
+ dcmp = mc->mc_dbx->md_dcmp;
#if UINT_MAX < SIZE_MAX
- if (mc->mc_dbx->md_dcmp == mdb_cmp_int && olddata.mv_size == sizeof(size_t))
- mc->mc_dbx->md_dcmp = mdb_cmp_clong;
+ if (dcmp == mdb_cmp_int && olddata.mv_size == sizeof(size_t))
+ dcmp = mdb_cmp_clong;
#endif
/* does data match? */
- if (!mc->mc_dbx->md_dcmp(data, &olddata)) {
+ if (!dcmp(data, &olddata)) {
if (flags & MDB_NODUPDATA)
return MDB_KEYEXIST;
/* overwrite it */
@@ -7088,6 +7118,7 @@ mdb_cursor_init(MDB_cursor *mc, MDB_txn *txn, MDB_dbi dbi, MDB_xcursor *mx)
mc->mc_snum = 0;
mc->mc_top = 0;
mc->mc_pg[0] = 0;
+ mc->mc_ki[0] = 0;
mc->mc_flags = 0;
if (txn->mt_dbs[dbi].md_flags & MDB_DUPSORT) {
mdb_tassert(txn, mx != NULL);
@@ -7717,12 +7748,12 @@ mdb_rebalance(MDB_cursor *mc)
m3 = m2;
if (m3 == mc || m3->mc_snum < mc->mc_snum) continue;
if (m3->mc_pg[0] == mp) {
- m3->mc_snum--;
- m3->mc_top--;
for (i=0; imc_snum; i++) {
m3->mc_pg[i] = m3->mc_pg[i+1];
m3->mc_ki[i] = m3->mc_ki[i+1];
}
+ m3->mc_snum--;
+ m3->mc_top--;
}
}
}
@@ -7790,9 +7821,23 @@ mdb_rebalance(MDB_cursor *mc)
if (mc->mc_ki[ptop] == 0) {
rc = mdb_page_merge(&mn, mc);
} else {
+ MDB_cursor dummy;
oldki += NUMKEYS(mn.mc_pg[mn.mc_top]);
mn.mc_ki[mn.mc_top] += mc->mc_ki[mn.mc_top] + 1;
+ /* We want mdb_rebalance to find mn when doing fixups */
+ if (mc->mc_flags & C_SUB) {
+ dummy.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = &dummy;
+ dummy.mc_xcursor = (MDB_xcursor *)&mn;
+ } else {
+ mn.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = &mn;
+ }
rc = mdb_page_merge(mc, &mn);
+ if (mc->mc_flags & C_SUB)
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = dummy.mc_next;
+ else
+ mc->mc_txn->mt_cursors[mc->mc_dbi] = mn.mc_next;
mdb_cursor_copy(&mn, mc);
}
mc->mc_flags &= ~C_EOF;
@@ -7819,6 +7864,13 @@ mdb_cursor_del0(MDB_cursor *mc)
MDB_cursor *m2, *m3;
MDB_dbi dbi = mc->mc_dbi;
+ /* DB is totally empty now, just bail out.
+ * Other cursors adjustments were already done
+ * by mdb_rebalance and aren't needed here.
+ */
+ if (!mc->mc_snum)
+ return rc;
+
mp = mc->mc_pg[mc->mc_top];
nkeys = NUMKEYS(mp);
diff --git a/external/db_drivers/liblmdb64/mtest.c b/external/db_drivers/liblmdb64/mtest.c
index 66dabc752..9d15088b0 100644
--- a/external/db_drivers/liblmdb64/mtest.c
+++ b/external/db_drivers/liblmdb64/mtest.c
@@ -45,19 +45,22 @@ int main(int argc,char * argv[])
}
E(mdb_env_create(&env));
+ E(mdb_env_set_maxreaders(env, 1));
E(mdb_env_set_mapsize(env, 10485760));
E(mdb_env_open(env, "./testdb", MDB_FIXEDMAP /*|MDB_NOSYNC*/, 0664));
+
E(mdb_txn_begin(env, NULL, 0, &txn));
- E(mdb_open(txn, NULL, 0, &dbi));
+ E(mdb_dbi_open(txn, NULL, 0, &dbi));
key.mv_size = sizeof(int);
key.mv_data = sval;
- data.mv_size = sizeof(sval);
- data.mv_data = sval;
printf("Adding %d values\n", count);
for (i=0;i in each iteration, since MDB_NOOVERWRITE may modify it */
+ data.mv_size = sizeof(sval);
+ data.mv_data = sval;
if (RES(MDB_KEYEXIST, mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE))) {
j++;
data.mv_size = sizeof(sval);
@@ -68,7 +71,7 @@ int main(int argc,char * argv[])
E(mdb_txn_commit(txn));
E(mdb_env_stat(env, &mst));
- E(mdb_txn_begin(env, NULL, 1, &txn));
+ E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn));
E(mdb_cursor_open(txn, dbi, &cursor));
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
printf("key: %p %.*s, data: %p %.*s\n",
@@ -97,7 +100,7 @@ int main(int argc,char * argv[])
printf("Deleted %d values\n", j);
E(mdb_env_stat(env, &mst));
- E(mdb_txn_begin(env, NULL, 1, &txn));
+ E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn));
E(mdb_cursor_open(txn, dbi, &cursor));
printf("Cursor next\n");
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
@@ -128,6 +131,7 @@ int main(int argc,char * argv[])
(int) key.mv_size, (char *) key.mv_data,
(int) data.mv_size, (char *) data.mv_data);
+ mdb_cursor_close(cursor);
mdb_txn_abort(txn);
printf("Deleting with cursor\n");
@@ -164,9 +168,9 @@ int main(int argc,char * argv[])
data.mv_data, (int) data.mv_size, (char *) data.mv_data);
}
mdb_cursor_close(cursor);
- mdb_close(env, dbi);
-
mdb_txn_abort(txn);
+
+ mdb_dbi_close(env, dbi);
mdb_env_close(env);
return 0;
diff --git a/external/db_drivers/liblmdb64/mtest2.c b/external/db_drivers/liblmdb64/mtest2.c
index 33e0e741c..eacbe59d5 100644
--- a/external/db_drivers/liblmdb64/mtest2.c
+++ b/external/db_drivers/liblmdb64/mtest2.c
@@ -47,20 +47,22 @@ int main(int argc,char * argv[])
}
E(mdb_env_create(&env));
+ E(mdb_env_set_maxreaders(env, 1));
E(mdb_env_set_mapsize(env, 10485760));
E(mdb_env_set_maxdbs(env, 4));
E(mdb_env_open(env, "./testdb", MDB_FIXEDMAP|MDB_NOSYNC, 0664));
+
E(mdb_txn_begin(env, NULL, 0, &txn));
- E(mdb_open(txn, "id1", MDB_CREATE, &dbi));
+ E(mdb_dbi_open(txn, "id1", MDB_CREATE, &dbi));
key.mv_size = sizeof(int);
key.mv_data = sval;
- data.mv_size = sizeof(sval);
- data.mv_data = sval;
printf("Adding %d values\n", count);
for (i=0;i.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.5.4'
-PACKAGE_STRING='unbound 1.5.4'
+PACKAGE_VERSION='1.5.5'
+PACKAGE_STRING='unbound 1.5.5'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl'
PACKAGE_URL=''
@@ -1389,7 +1389,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.5.4 to adapt to many kinds of systems.
+\`configure' configures unbound 1.5.5 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1454,7 +1454,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.5.4:";;
+ short | recursive ) echo "Configuration of unbound 1.5.5:";;
esac
cat <<\_ACEOF
@@ -1629,7 +1629,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.5.4
+unbound configure 1.5.5
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2338,7 +2338,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.5.4, which was
+It was created by unbound $as_me 1.5.5, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2690,7 +2690,7 @@ UNBOUND_VERSION_MAJOR=1
UNBOUND_VERSION_MINOR=5
-UNBOUND_VERSION_MICRO=4
+UNBOUND_VERSION_MICRO=5
LIBUNBOUND_CURRENT=5
@@ -16684,7 +16684,7 @@ rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LibreSSL" >&5
$as_echo_n "checking for LibreSSL... " >&6; }
-if grep OPENSSL_VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
+if grep VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -16845,6 +16845,36 @@ fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_SK_SSL_COMP_POP_FREE $ac_have_decl
_ACEOF
+ac_fn_c_check_decl "$LINENO" "SSL_CTX_set_ecdh_auto" "ac_cv_have_decl_SSL_CTX_set_ecdh_auto" "
+$ac_includes_default
+#ifdef HAVE_OPENSSL_ERR_H
+#include
+#endif
+
+#ifdef HAVE_OPENSSL_RAND_H
+#include
+#endif
+
+#ifdef HAVE_OPENSSL_CONF_H
+#include
+#endif
+
+#ifdef HAVE_OPENSSL_ENGINE_H
+#include
+#endif
+#include
+#include
+
+"
+if test "x$ac_cv_have_decl_SSL_CTX_set_ecdh_auto" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SSL_CTX_SET_ECDH_AUTO $ac_have_decl
+_ACEOF
fi
@@ -18150,6 +18180,8 @@ esac
fi
+LIBOBJ_WITHOUT_CTIMEARC4="$LIBOBJS"
+
ac_fn_c_check_func "$LINENO" "reallocarray" "ac_cv_func_reallocarray"
if test "x$ac_cv_func_reallocarray" = xyes; then :
$as_echo "#define HAVE_REALLOCARRAY 1" >>confdefs.h
@@ -18164,8 +18196,6 @@ esac
fi
-LIBOBJ_WITHOUT_CTIMEARC4="$LIBOBJS"
-
if test "$USE_NSS" = "no"; then
ac_fn_c_check_func "$LINENO" "arc4random" "ac_cv_func_arc4random"
if test "x$ac_cv_func_arc4random" = xyes; then :
@@ -18890,7 +18920,7 @@ _ACEOF
-version=1.5.4
+version=1.5.5
date=`date +'%b %e, %Y'`
@@ -19405,7 +19435,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.5.4, which was
+This file was extended by unbound $as_me 1.5.5, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -19471,7 +19501,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-unbound config.status 1.5.4
+unbound config.status 1.5.5
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/external/unbound/configure.ac b/external/unbound/configure.ac
index de809afdd..5ad39c7d5 100644
--- a/external/unbound/configure.ac
+++ b/external/unbound/configure.ac
@@ -10,7 +10,7 @@ sinclude(dnstap/dnstap.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
m4_define([VERSION_MINOR],[5])
-m4_define([VERSION_MICRO],[4])
+m4_define([VERSION_MICRO],[5])
AC_INIT(unbound, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), unbound-bugs@nlnetlabs.nl, unbound)
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
@@ -566,7 +566,7 @@ if test $USE_NSS = "no"; then
ACX_WITH_SSL
ACX_LIB_SSL
AC_MSG_CHECKING([for LibreSSL])
-if grep OPENSSL_VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
+if grep VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_LIBRESSL], [1], [Define if we have LibreSSL])
# libressl provides these compat functions, but they may also be
@@ -578,7 +578,7 @@ fi
AC_CHECK_HEADERS([openssl/conf.h],,, [AC_INCLUDES_DEFAULT])
AC_CHECK_HEADERS([openssl/engine.h],,, [AC_INCLUDES_DEFAULT])
AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode])
-AC_CHECK_DECLS([SSL_COMP_get_compression_methods,sk_SSL_COMP_pop_free], [], [], [
+AC_CHECK_DECLS([SSL_COMP_get_compression_methods,sk_SSL_COMP_pop_free,SSL_CTX_set_ecdh_auto], [], [], [
AC_INCLUDES_DEFAULT
#ifdef HAVE_OPENSSL_ERR_H
#include
@@ -998,9 +998,10 @@ AC_REPLACE_FUNCS(strlcat)
AC_REPLACE_FUNCS(strlcpy)
AC_REPLACE_FUNCS(memmove)
AC_REPLACE_FUNCS(gmtime_r)
-AC_REPLACE_FUNCS(reallocarray)
+dnl without CTIME, ARC4-functions and without reallocarray.
LIBOBJ_WITHOUT_CTIMEARC4="$LIBOBJS"
AC_SUBST(LIBOBJ_WITHOUT_CTIMEARC4)
+AC_REPLACE_FUNCS(reallocarray)
if test "$USE_NSS" = "no"; then
AC_REPLACE_FUNCS(arc4random)
AC_REPLACE_FUNCS(arc4random_uniform)
diff --git a/external/unbound/daemon/daemon.c b/external/unbound/daemon/daemon.c
index 0cd37ae82..e763f724e 100644
--- a/external/unbound/daemon/daemon.c
+++ b/external/unbound/daemon/daemon.c
@@ -399,6 +399,12 @@ daemon_create_workers(struct daemon* daemon)
verbose(VERB_ALGO, "total of %d outgoing ports available", numport);
daemon->num = (daemon->cfg->num_threads?daemon->cfg->num_threads:1);
+ if(daemon->reuseport && (int)daemon->num < (int)daemon->num_ports) {
+ log_warn("cannot reduce num-threads to %d because so-reuseport "
+ "so continuing with %d threads.", (int)daemon->num,
+ (int)daemon->num_ports);
+ daemon->num = (int)daemon->num_ports;
+ }
daemon->workers = (struct worker**)calloc((size_t)daemon->num,
sizeof(struct worker*));
if(daemon->cfg->dnstap) {
@@ -464,7 +470,7 @@ thread_start(void* arg)
#endif
#ifdef SO_REUSEPORT
if(worker->daemon->cfg->so_reuseport)
- port_num = worker->thread_num;
+ port_num = worker->thread_num % worker->daemon->num_ports;
else
port_num = 0;
#endif
diff --git a/external/unbound/daemon/remote.c b/external/unbound/daemon/remote.c
index 93d0eda28..300948b32 100644
--- a/external/unbound/daemon/remote.c
+++ b/external/unbound/daemon/remote.c
@@ -243,9 +243,9 @@ daemon_remote_create(struct config_file* cfg)
goto setup_error;
}
verbose(VERB_ALGO, "setup SSL certificates");
- if (!SSL_CTX_use_certificate_file(rc->ctx,s_cert,SSL_FILETYPE_PEM)) {
+ if (!SSL_CTX_use_certificate_chain_file(rc->ctx,s_cert)) {
log_err("Error for server-cert-file: %s", s_cert);
- log_crypto_err("Error in SSL_CTX use_certificate_file");
+ log_crypto_err("Error in SSL_CTX use_certificate_chain_file");
goto setup_error;
}
if(!SSL_CTX_use_PrivateKey_file(rc->ctx,s_key,SSL_FILETYPE_PEM)) {
@@ -258,6 +258,23 @@ daemon_remote_create(struct config_file* cfg)
log_crypto_err("Error in SSL_CTX check_private_key");
goto setup_error;
}
+#if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
+ if(!SSL_CTX_set_ecdh_auto(rc->ctx,1)) {
+ log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
+ }
+#elif defined(USE_ECDSA)
+ if(1) {
+ EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
+ if (!ecdh) {
+ log_crypto_err("could not find p256, not enabling ECDHE");
+ } else {
+ if (1 != SSL_CTX_set_tmp_ecdh (rc->ctx, ecdh)) {
+ log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
+ }
+ EC_KEY_free (ecdh);
+ }
+ }
+#endif
if(!SSL_CTX_load_verify_locations(rc->ctx, s_cert, NULL)) {
log_crypto_err("Error setting up SSL_CTX verify locations");
setup_error:
@@ -1683,6 +1700,7 @@ parse_delegpt(SSL* ssl, char* args, uint8_t* nm, int allow_names)
}
}
}
+ dp->has_parent_side_NS = 1;
return dp;
}
diff --git a/external/unbound/daemon/worker.c b/external/unbound/daemon/worker.c
index f4e87289a..79aec4d3a 100644
--- a/external/unbound/daemon/worker.c
+++ b/external/unbound/daemon/worker.c
@@ -568,7 +568,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
if(rep->an_numrrsets > 0 && (rep->rrsets[0]->rk.type ==
htons(LDNS_RR_TYPE_CNAME) || rep->rrsets[0]->rk.type ==
htons(LDNS_RR_TYPE_DNAME))) {
- if(!reply_check_cname_chain(rep)) {
+ if(!reply_check_cname_chain(qinfo, rep)) {
/* cname chain invalid, redo iterator steps */
verbose(VERB_ALGO, "Cache reply: cname chain broken");
bail_out:
diff --git a/external/unbound/doc/Changelog b/external/unbound/doc/Changelog
index f06654de4..35f67c113 100644
--- a/external/unbound/doc/Changelog
+++ b/external/unbound/doc/Changelog
@@ -1,3 +1,73 @@
+13 August 2015: Wouter
+ - 5011 implementation does not insist on all algorithms, when
+ harden-algo-downgrade is turned off.
+ - Reap the child process that libunbound spawns.
+
+11 August 2015: Wouter
+ - Fix #694: configure script does not detect LibreSSL 2.2.2
+
+4 August 2015: Wouter
+ - Document that local-zone nodefault matches exactly and transparent
+ can be used to release a subzone.
+
+3 August 2015: Wouter
+ - Document in the manual more text about configuring locally served
+ zones.
+ - Fix 5011 anchor update timer after reload.
+ - Fix mktime in unbound-anchor not using UTC.
+
+30 July 2015: Wouter
+ - please afl-gcc (llvm) for uninitialised variable warning.
+ - Added permit-small-holddown config to debug fast 5011 rollover.
+
+24 July 2015: Wouter
+ - Fix #690: Reload fails when so-reuseport is yes after changing
+ num-threads.
+ - iana portlist update.
+
+21 July 2015: Wouter
+ - Fix configure to detect SSL_CTX_set_ecdh_auto.
+ - iana portlist update.
+
+20 July 2015: Wouter
+ - Enable ECDHE for servers. Where available, use
+ SSL_CTX_set_ecdh_auto() for TLS-wrapped server configurations to
+ enable ECDHE. Otherwise, manually offer curve p256.
+ Client connections should automatically use ECDHE when available.
+ (thanks Daniel Kahn Gillmor)
+
+18 July 2015: Willem
+ - Allow certificate chain files to allow for intermediate certificates.
+ (thanks Daniel Kahn Gillmor)
+
+13 July 2015: Wouter
+ - makedist produces sha1 and sha256 files for created binaries too.
+
+9 July 2015: Wouter
+ - 1.5.4 release tag
+ - trunk has 1.5.5 in development.
+ - Fix #681: Setting forwarders with unbound-control forward
+ implicitly turns on forward-first.
+
+29 June 2015: Wouter
+ - iana portlist update.
+ - Fix alloc with log for allocation size checks.
+
+26 June 2015: Wouter
+ - Fix #677 Fix DNAME responses from cache that failed internal chain
+ test.
+ - iana portlist update.
+
+22 June 2015: Wouter
+ - Fix #677 Fix CNAME corresponding to a DNAME was checked incorrectly
+ and was therefore always synthesized (thanks to Valentin Dietrich).
+
+4 June 2015: Wouter
+ - RFC 7553 RR type URI support, is now enabled by default.
+
+2 June 2015: Wouter
+ - Fix #674: Do not free pointers given by getenv.
+
29 May 2015: Wouter
- Fix that unparseable error responses are ratelimited.
- SOA negative TTL is capped at minimumttl in its rdata section.
diff --git a/external/unbound/doc/example.conf.in b/external/unbound/doc/example.conf.in
index efe64f394..90491119e 100644
--- a/external/unbound/doc/example.conf.in
+++ b/external/unbound/doc/example.conf.in
@@ -444,6 +444,9 @@ server:
# If the value 0 is given, missing anchors are not removed.
# keep-missing: 31622400 # 366 days
+ # debug option that allows very small holddown times for key rollover
+ # permit-small-holddown: no
+
# the amount of memory to use for the key cache.
# plain value in bytes or you can append k, m or G. default is "4Mb".
# key-cache-size: 4m
@@ -623,6 +626,8 @@ remote-control:
# nameservers by hostname or by ipaddress. If you set stub-prime to yes,
# the list is treated as priming hints (default is no).
# With stub-first yes, it attempts without the stub if it fails.
+# Consider adding domain-insecure: name and local-zone: name nodefault
+# to the server: section if the stub is a locally served zone.
# stub-zone:
# name: "example.com"
# stub-addr: 192.0.2.68
diff --git a/external/unbound/doc/unbound.conf.5.in b/external/unbound/doc/unbound.conf.5.in
index 8836ed50c..cfbedd7d0 100644
--- a/external/unbound/doc/unbound.conf.5.in
+++ b/external/unbound/doc/unbound.conf.5.in
@@ -801,6 +801,10 @@ mechanism work with zones that perform regular (non\-5011) rollovers.
The default is 366 days. The value 0 does not remove missing anchors,
as per the RFC.
.TP
+.B permit\-small\-holddown: \fI
+Debug option that allows the autotrust 5011 rollover timers to assume
+very small values. Default is no.
+.TP
.B key\-cache\-size: \fI
Number of bytes size of the key cache. Default is 4 megabytes.
A plain number is in bytes, append 'k', 'm' or 'g' for kilobytes, megabytes
@@ -895,7 +899,8 @@ infected machines without answering the queries.
Used to turn off default contents for AS112 zones. The other types
also turn off default contents for the zone. The 'nodefault' option
has no other effect than turning off default contents for the
-given zone.
+given zone. Use \fInodefault\fR if you use exactly that zone, if you want to
+use a subzone, use \fItransparent\fR.
.P
The default zones are localhost, reverse 127.0.0.1 and ::1, and the AS112
zones. The AS112 zones are reverse DNS zones for private use and reserved
@@ -1124,6 +1129,12 @@ bit on replies for the private zone (authoritative servers do not set the
AD bit). This setup makes unbound capable of answering queries for the
private zone, and can even set the AD bit ('authentic'), but the AA
('authoritative') bit is not set on these replies.
+.P
+Consider adding \fBserver:\fR statements for \fBdomain\-insecure:\fR and
+for \fBlocal\-zone:\fI name nodefault\fR for the zone if it is a locally
+served zone. The insecure clause stops DNSSEC from invalidating the
+zone. The local zone nodefault (or \fItransparent\fR) clause makes the
+(reverse\-) zone bypass unbound's filtering of RFC1918 zones.
.TP
.B name: \fI
Name of the stub zone.
diff --git a/external/unbound/iterator/iter_scrub.c b/external/unbound/iterator/iter_scrub.c
index e9db19482..cc05867c0 100644
--- a/external/unbound/iterator/iter_scrub.c
+++ b/external/unbound/iterator/iter_scrub.c
@@ -372,7 +372,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
/* check next cname */
uint8_t* t = NULL;
size_t tlen = 0;
- if(!parse_get_cname_target(rrset, &t, &tlen))
+ if(!parse_get_cname_target(nx, &t, &tlen))
return 0;
if(dname_pkt_compare(pkt, alias, t) == 0) {
/* it's OK and better capitalized */
diff --git a/external/unbound/libunbound/libunbound.c b/external/unbound/libunbound/libunbound.c
index b3a4c2ba7..e96b3528a 100644
--- a/external/unbound/libunbound/libunbound.c
+++ b/external/unbound/libunbound/libunbound.c
@@ -65,6 +65,9 @@
#ifdef HAVE_PTHREAD
#include
#endif
+#ifdef HAVE_SYS_WAIT_H
+#include
+#endif
#if defined(UB_ON_WINDOWS) && defined (HAVE_WINDOWS_H)
#include
@@ -218,6 +221,12 @@ static void ub_stop_bg(struct ub_ctx* ctx)
ub_thread_join(ctx->bg_tid);
} else {
lock_basic_unlock(&ctx->cfglock);
+#ifndef UB_ON_WINDOWS
+ if(waitpid(ctx->bg_pid, NULL, 0) == -1) {
+ if(verbosity > 2)
+ log_err("waitpid: %s", strerror(errno));
+ }
+#endif
}
}
else {
@@ -1028,6 +1037,7 @@ ub_ctx_hosts(struct ub_ctx* ctx, const char* fname)
"\\hosts");
retval=ub_ctx_hosts(ctx, buf);
}
+ free(name);
return retval;
}
return UB_READFILE;
diff --git a/external/unbound/makedist.sh b/external/unbound/makedist.sh
index f06017668..23c89fc3d 100755
--- a/external/unbound/makedist.sh
+++ b/external/unbound/makedist.sh
@@ -136,6 +136,43 @@ create_temp_dir () {
cd $temp_dir
}
+# pass filename as $1 arg.
+# creates file.sha1 and file.sha256
+storehash () {
+ case $OSTYPE in
+ linux*)
+ sha=`sha1sum $1 | awk '{ print $1 }'`
+ sha256=`sha256sum $1 | awk '{ print $1 }'`
+ ;;
+ freebsd*)
+ sha=`sha1 $1 | awk '{ print $5 }'`
+ sha256=`sha256 $1 | awk '{ print $5 }'`
+ ;;
+ *)
+ # in case $OSTYPE is gone.
+ case `uname` in
+ Linux*)
+ sha=`sha1sum $1 | awk '{ print $1 }'`
+ sha256=`sha256sum $1 | awk '{ print $1 }'`
+ ;;
+ FreeBSD*)
+ sha=`sha1 $1 | awk '{ print $5 }'`
+ sha256=`sha256 $1 | awk '{ print $5 }'`
+ ;;
+ *)
+ sha=`sha1sum $1 | awk '{ print $1 }'`
+ sha256=`sha256sum $1 | awk '{ print $1 }'`
+ ;;
+ esac
+ ;;
+ esac
+ echo $sha > $1.sha1
+ echo $sha256 > $1.sha256
+ echo "hash of $1.{sha1,sha256}"
+ echo "sha1 $sha"
+ echo "sha256 $sha256"
+}
+
SNAPSHOT="no"
RC="no"
@@ -311,6 +348,8 @@ if [ "$DOWIN" = "yes" ]; then
mv unbound-$version.zip $cwd/.
cleanup
fi
+ storehash unbound_setup_$version.exe
+ storehash unbound-$version.zip
ls -lG unbound_setup_$version.exe
ls -lG unbound-$version.zip
info "Done"
@@ -411,36 +450,7 @@ tar czf ../unbound-$version.tar.gz unbound-$version || error_cleanup "Failed to
cleanup
-case $OSTYPE in
- linux*)
- sha=`sha1sum unbound-$version.tar.gz | awk '{ print $1 }'`
- sha256=`sha256sum unbound-$version.tar.gz | awk '{ print $1 }'`
- ;;
- freebsd*)
- sha=`sha1 unbound-$version.tar.gz | awk '{ print $5 }'`
- sha256=`sha256 unbound-$version.tar.gz | awk '{ print $5 }'`
- ;;
- *)
- # in case $OSTYPE is gone.
- case `uname` in
- Linux*)
- sha=`sha1sum unbound-$version.tar.gz | awk '{ print $1 }'`
- sha256=`sha256sum unbound-$version.tar.gz | awk '{ print $1 }'`
- ;;
- FreeBSD*)
- sha=`sha1 unbound-$version.tar.gz | awk '{ print $5 }'`
- sha256=`sha256 unbound-$version.tar.gz | awk '{ print $5 }'`
- ;;
- *)
- sha=`sha1sum unbound-$version.tar.gz | awk '{ print $1 }'`
- sha256=`sha256sum unbound-$version.tar.gz | awk '{ print $1 }'`
- ;;
- esac
- ;;
-esac
-echo $sha > unbound-$version.tar.gz.sha1
-echo $sha256 > unbound-$version.tar.gz.sha256
+storehash unbound-$version.tar.gz
info "Unbound distribution created successfully."
-info "SHA1sum: $sha"
diff --git a/external/unbound/services/cache/dns.c b/external/unbound/services/cache/dns.c
index 53127ce59..ba81afde4 100644
--- a/external/unbound/services/cache/dns.c
+++ b/external/unbound/services/cache/dns.c
@@ -505,7 +505,7 @@ tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
return NULL;
if(r->an_numrrsets > 0 && (r->rrsets[0]->rk.type == htons(
LDNS_RR_TYPE_CNAME) || r->rrsets[0]->rk.type == htons(
- LDNS_RR_TYPE_DNAME)) && !reply_check_cname_chain(r)) {
+ LDNS_RR_TYPE_DNAME)) && !reply_check_cname_chain(q, r)) {
/* cname chain is now invalid, reconstruct msg */
rrset_array_unlock(r->ref, r->rrset_count);
return NULL;
diff --git a/external/unbound/sldns/rrdef.c b/external/unbound/sldns/rrdef.c
index 72161d7b6..a8c6229b9 100644
--- a/external/unbound/sldns/rrdef.c
+++ b/external/unbound/sldns/rrdef.c
@@ -213,13 +213,11 @@ static const sldns_rdf_type type_eui48_wireformat[] = {
static const sldns_rdf_type type_eui64_wireformat[] = {
LDNS_RDF_TYPE_EUI64
};
-#ifdef DRAFT_RRTYPES
static const sldns_rdf_type type_uri_wireformat[] = {
LDNS_RDF_TYPE_INT16,
LDNS_RDF_TYPE_INT16,
LDNS_RDF_TYPE_LONG_STR
};
-#endif
static const sldns_rdf_type type_caa_wireformat[] = {
LDNS_RDF_TYPE_INT8,
LDNS_RDF_TYPE_TAG,
@@ -590,12 +588,8 @@ static sldns_rr_descriptor rdata_field_descriptors[] = {
/* ANY: A request for all (available) records */
{LDNS_RR_TYPE_ANY, "ANY", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-#ifdef DRAFT_RRTYPES
/* 256 */
{LDNS_RR_TYPE_URI, "URI", 3, 3, type_uri_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-#else
-{LDNS_RR_TYPE_NULL, "TYPE256", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-#endif
/* 257 */
{LDNS_RR_TYPE_CAA, "CAA", 3, 3, type_caa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
diff --git a/external/unbound/sldns/rrdef.h b/external/unbound/sldns/rrdef.h
index 933bcdfbf..678d2bc79 100644
--- a/external/unbound/sldns/rrdef.h
+++ b/external/unbound/sldns/rrdef.h
@@ -220,8 +220,7 @@ enum sldns_enum_rr_type
LDNS_RR_TYPE_MAILA = 254,
/** any type (wildcard) */
LDNS_RR_TYPE_ANY = 255,
- /** draft-faltstrom-uri-06 */
- LDNS_RR_TYPE_URI = 256,
+ LDNS_RR_TYPE_URI = 256, /* RFC 7553 */
LDNS_RR_TYPE_CAA = 257, /* RFC 6844 */
/** DNSSEC Trust Authorities */
diff --git a/external/unbound/smallapp/unbound-anchor.c b/external/unbound/smallapp/unbound-anchor.c
index 576a30f64..92bfa8428 100644
--- a/external/unbound/smallapp/unbound-anchor.c
+++ b/external/unbound/smallapp/unbound-anchor.c
@@ -117,6 +117,7 @@
#include "config.h"
#include "libunbound/unbound.h"
#include "sldns/rrdef.h"
+#include "sldns/parseutil.h"
#include
#ifndef HAVE_EXPAT_H
#error "need libexpat to parse root-anchors.xml file."
@@ -1328,7 +1329,7 @@ xml_convertdate(const char* str)
/* but ignore, (lenient) */
}
- t = mktime(&tm);
+ t = sldns_mktime_from_utc(&tm);
if(t == (time_t)-1) {
if(verb) printf("xml_convertdate mktime failure\n");
return 0;
diff --git a/external/unbound/smallapp/unbound-control.c b/external/unbound/smallapp/unbound-control.c
index d4b147d67..571b4d0b0 100644
--- a/external/unbound/smallapp/unbound-control.c
+++ b/external/unbound/smallapp/unbound-control.c
@@ -161,7 +161,7 @@ setup_ctx(struct config_file* cfg)
if(cfg->remote_control_use_cert) {
if(!(SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3))
ssl_err("could not set SSL_OP_NO_SSLv3");
- if(!SSL_CTX_use_certificate_file(ctx,c_cert,SSL_FILETYPE_PEM) ||
+ if(!SSL_CTX_use_certificate_chain_file(ctx,c_cert) ||
!SSL_CTX_use_PrivateKey_file(ctx,c_key,SSL_FILETYPE_PEM)
|| !SSL_CTX_check_private_key(ctx))
ssl_err("Error setting up SSL_CTX client key and cert");
diff --git a/external/unbound/testcode/petal.c b/external/unbound/testcode/petal.c
index 964735b39..a54181c37 100644
--- a/external/unbound/testcode/petal.c
+++ b/external/unbound/testcode/petal.c
@@ -236,12 +236,28 @@ setup_ctx(char* key, char* cert)
if(!ctx) print_exit("out of memory");
(void)SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
(void)SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3);
- if(!SSL_CTX_use_certificate_file(ctx, cert, SSL_FILETYPE_PEM))
+ if(!SSL_CTX_use_certificate_chain_file(ctx, cert))
print_exit("cannot read cert");
if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM))
print_exit("cannot read key");
if(!SSL_CTX_check_private_key(ctx))
print_exit("private key is not correct");
+#if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
+ if (!SSL_CTX_set_ecdh_auto(ctx,1))
+ if(verb>=1) printf("failed to set_ecdh_auto, not enabling ECDHE\n");
+#elif defined(USE_ECDSA)
+ if(1) {
+ EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
+ if (!ecdh) {
+ if(verb>=1) printf("could not find p256, not enabling ECDHE\n");
+ } else {
+ if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
+ if(verb>=1) printf("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE\n");
+ }
+ EC_KEY_free(ecdh);
+ }
+ }
+#endif
if(!SSL_CTX_load_verify_locations(ctx, cert, NULL))
print_exit("cannot load cert verify locations");
return ctx;
diff --git a/external/unbound/testdata/ctrl_pipe.tpkg b/external/unbound/testdata/ctrl_pipe.tpkg
deleted file mode 100644
index 877fcf901..000000000
Binary files a/external/unbound/testdata/ctrl_pipe.tpkg and /dev/null differ
diff --git a/external/unbound/testdata/fwd_any.rpl b/external/unbound/testdata/fwd_any.rpl
deleted file mode 100644
index 4284ee79e..000000000
--- a/external/unbound/testdata/fwd_any.rpl
+++ /dev/null
@@ -1,161 +0,0 @@
-; This is a comment.
-; config options go here.
-forward-zone: name: "." forward-addr: 216.0.0.1
-CONFIG_END
-
-SCENARIO_BEGIN Test query and cache with type ANY
-RANGE_BEGIN 0 1000
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-SECTION AUTHORITY
-www.example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 10.20.30.50
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN ANY
-SECTION ANSWER
-;; different type in this answer.
-www.example.com. IN TXT "text"
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN AAAA
-SECTION ANSWER
-www.example.com. IN AAAA ::5
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qname qtype
-ADJUST copy_id
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.foo.com. IN ANY
-SECTION ANSWER
-www.foo.com. IN A 1.2.3.77
-www.foo.com. IN AAAA ::77
-ENTRY_END
-
-RANGE_END
-
-STEP 10 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-; unneccesary nothing steps.
-STEP 20 NOTHING
-STEP 30 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH opcode qname qtype
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-ENTRY_END
-
-; test cache synthesis
-STEP 40 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN ANY
-ENTRY_END
-STEP 50 NOTHING
-STEP 60 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH opcode qname qtype
-SECTION QUESTION
-www.example.com. IN ANY
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-ENTRY_END
-
-; and again
-; the synthesized result itself is not added to the cache
-STEP 62 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN ANY
-ENTRY_END
-STEP 63 NOTHING
-STEP 64 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH opcode qname qtype
-SECTION QUESTION
-www.example.com. IN ANY
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-ENTRY_END
-
-; AAAA lookup to add more data in cache
-STEP 70 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN AAAA
-ENTRY_END
-STEP 80 NOTHING
-STEP 90 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH opcode qname qtype
-SECTION QUESTION
-www.example.com. IN AAAA
-SECTION ANSWER
-www.example.com. IN AAAA ::5
-ENTRY_END
-
-; test cache synthesis of AAAA, and two rrsets.
-STEP 100 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN ANY
-ENTRY_END
-STEP 110 NOTHING
-STEP 120 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH opcode qname qtype
-SECTION QUESTION
-www.example.com. IN ANY
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-www.example.com. IN AAAA ::5
-ENTRY_END
-
-; test query that is not synthesized from cache.
-STEP 130 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.foo.com. IN ANY
-ENTRY_END
-STEP 140 NOTHING
-STEP 150 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH opcode qname qtype
-SECTION QUESTION
-www.foo.com. IN ANY
-SECTION ANSWER
-www.foo.com. IN A 1.2.3.77
-www.foo.com. IN AAAA ::77
-ENTRY_END
-
-SCENARIO_END
diff --git a/external/unbound/testdata/fwd_capsid_strip.tpkg b/external/unbound/testdata/fwd_capsid_strip.tpkg
deleted file mode 100644
index c0be8a3c5..000000000
Binary files a/external/unbound/testdata/fwd_capsid_strip.tpkg and /dev/null differ
diff --git a/external/unbound/testdata/fwd_capsid_white.tpkg b/external/unbound/testdata/fwd_capsid_white.tpkg
deleted file mode 100644
index 199befb56..000000000
Binary files a/external/unbound/testdata/fwd_capsid_white.tpkg and /dev/null differ
diff --git a/external/unbound/testdata/iter_domain_sale.rpl b/external/unbound/testdata/iter_domain_sale.rpl
deleted file mode 100644
index ff612780a..000000000
--- a/external/unbound/testdata/iter_domain_sale.rpl
+++ /dev/null
@@ -1,273 +0,0 @@
-; config options
-server:
- target-fetch-policy: "0 0 0 0 0"
-
-stub-zone:
- name: "."
- stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
-CONFIG_END
-
-SCENARIO_BEGIN Test resolver with a domain sale
-; and the old operator is nasty, keeps running his server with the old data.
-; and lots of lookups keep going towards the domain.
-; eventually, the NS record has to timeout.
-
-; K.ROOT-SERVERS.NET.
-RANGE_BEGIN 0 100
- ADDRESS 193.0.14.129
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-. IN NS
-SECTION ANSWER
-. IN NS K.ROOT-SERVERS.NET.
-SECTION ADDITIONAL
-K.ROOT-SERVERS.NET. IN A 193.0.14.129
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode subdomain
-ADJUST copy_id copy_query
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN A
-SECTION AUTHORITY
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-RANGE_END
-
-; a.gtld-servers.net. (before sale of domain)
-RANGE_BEGIN 0 20
- ADDRESS 192.5.6.30
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN NS
-SECTION ANSWER
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode subdomain
-ADJUST copy_id copy_query
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN A
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; a.gtld-servers.net. (after sale of domain)
-RANGE_BEGIN 30 200
- ADDRESS 192.5.6.30
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN NS
-SECTION ANSWER
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode subdomain
-ADJUST copy_id copy_query
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN A
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 8.8.8.8
-ENTRY_END
-RANGE_END
-
-; ns.example.com. first owner
-RANGE_BEGIN 0 200
- ADDRESS 1.2.3.4
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qname
-ADJUST copy_id copy_query
-REPLY QR AA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 10.20.30.40
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-
-; nxdomains for any name,type
-; last in RANGE so that it matches everything left over.
-; it includes the NS record.
-ENTRY_BEGIN
-MATCH opcode
-ADJUST copy_id copy_query
-REPLY QR AA NXDOMAIN
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-SECTION AUTHORITY
-example.com. 3600 IN SOA a. b. 1 2 3 4 5
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; ns.example.com. new owner
-RANGE_BEGIN 0 200
- ADDRESS 8.8.8.8
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 8.8.8.8
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 88.88.88.88
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 8.8.8.8
-ENTRY_END
-RANGE_END
-
-; Fetch the old record from the old owner.
-STEP 1 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 5 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 10.20.30.40
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-
-; the domain is sold (right at this time).
-; but the information stays in the cache.
-
-; after 1800 secs still the cached answer
-STEP 20 TIME_PASSES ELAPSE 1800
-
-STEP 30 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 40 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 1800 IN A 10.20.30.40
-SECTION AUTHORITY
-example.com. 1800 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 1800 IN A 1.2.3.4
-ENTRY_END
-
-; and ask another query
-STEP 50 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-nx1.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 60 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NXDOMAIN
-SECTION QUESTION
-nx1.example.com. IN A
-SECTION ANSWER
-SECTION AUTHORITY
-; at TTL 5 because TTL is capped at min-ttl of 5 in rdata of SOA
-example.com. 5 IN SOA a. b. 1 2 3 4 5
-example.com. 1800 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 1800 IN A 1.2.3.4
-ENTRY_END
-
-; after another 1900 seconds the domain must have timed out.
-STEP 70 TIME_PASSES ELAPSE 1900
-
-; the NS record should have timed out.
-STEP 80 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 90 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 88.88.88.88
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 8.8.8.8
-ENTRY_END
-
-SCENARIO_END
diff --git a/external/unbound/testdata/iter_domain_sale_nschange.rpl b/external/unbound/testdata/iter_domain_sale_nschange.rpl
deleted file mode 100644
index bc396f67c..000000000
--- a/external/unbound/testdata/iter_domain_sale_nschange.rpl
+++ /dev/null
@@ -1,342 +0,0 @@
-; config options
-server:
- target-fetch-policy: "0 0 0 0 0"
-
-stub-zone:
- name: "."
- stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
-CONFIG_END
-
-SCENARIO_BEGIN Test resolver with a domain sale and NS changes
-; and the old operator is nasty, keeps running his server with the old data.
-; and lots of lookups keep going towards the domain.
-; and the old server is changing the NS record of the old domain.
-
-; K.ROOT-SERVERS.NET.
-RANGE_BEGIN 0 100
- ADDRESS 193.0.14.129
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-. IN NS
-SECTION ANSWER
-. IN NS K.ROOT-SERVERS.NET.
-SECTION ADDITIONAL
-K.ROOT-SERVERS.NET. IN A 193.0.14.129
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode subdomain
-ADJUST copy_id copy_query
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN A
-SECTION AUTHORITY
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-RANGE_END
-
-; a.gtld-servers.net. (before sale of domain)
-RANGE_BEGIN 0 20
- ADDRESS 192.5.6.30
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN NS
-SECTION ANSWER
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode subdomain
-ADJUST copy_id copy_query
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN A
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; a.gtld-servers.net. (after sale of domain)
-RANGE_BEGIN 30 200
- ADDRESS 192.5.6.30
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN NS
-SECTION ANSWER
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode subdomain
-ADJUST copy_id copy_query
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN A
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 8.8.8.8
-ENTRY_END
-RANGE_END
-
-; ns.example.com. first owner
-RANGE_BEGIN 0 30
- ADDRESS 1.2.3.4
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qname
-ADJUST copy_id copy_query
-REPLY QR AA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 10.20.30.40
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-
-; nxdomains for any name,type
-; last in RANGE so that it matches everything left over.
-; it includes the NS record.
-ENTRY_BEGIN
-MATCH opcode
-ADJUST copy_id copy_query
-REPLY QR AA NXDOMAIN
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-SECTION AUTHORITY
-example.com. 3600 IN SOA a. b. 1 2 3 4 5
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; ns.example.com. first owner, NS changed
-RANGE_BEGIN 40 200
- ADDRESS 1.2.3.4
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS nsb.example.com.
-SECTION ADDITIONAL
-nsb.example.com. IN A 1.2.3.4
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qname
-ADJUST copy_id copy_query
-REPLY QR AA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 10.20.30.40
-SECTION AUTHORITY
-example.com. 3600 IN NS nsb.example.com.
-SECTION ADDITIONAL
-nsb.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-
-; nxdomains for any name,type
-; last in RANGE so that it matches everything left over.
-; it includes the NS record.
-ENTRY_BEGIN
-MATCH opcode
-ADJUST copy_id copy_query
-REPLY QR AA NXDOMAIN
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-SECTION AUTHORITY
-example.com. 3600 IN SOA a. b. 1 2 3 4 5
-example.com. 3600 IN NS nsb.example.com.
-SECTION ADDITIONAL
-nsb.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; ns.example.com. new owner
-RANGE_BEGIN 0 200
- ADDRESS 8.8.8.8
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 8.8.8.8
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 88.88.88.88
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 8.8.8.8
-ENTRY_END
-RANGE_END
-
-; Fetch the old record from the old owner.
-STEP 1 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 5 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 10.20.30.40
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-
-; the domain is sold (right at this time).
-; but the information stays in the cache.
-
-; after 1800 secs still the cached answer
-STEP 20 TIME_PASSES ELAPSE 1800
-
-STEP 30 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 40 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 1800 IN A 10.20.30.40
-SECTION AUTHORITY
-example.com. 1800 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 1800 IN A 1.2.3.4
-ENTRY_END
-
-; and ask another query
-STEP 50 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-nx1.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 60 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NXDOMAIN
-SECTION QUESTION
-nx1.example.com. IN A
-SECTION ANSWER
-SECTION AUTHORITY
-; at TTL 5 because TTL capped at ttl of minttl in rdata of SOA.
-example.com. 5 IN SOA a. b. 1 2 3 4 5
-example.com. 3600 IN NS nsb.example.com.
-SECTION ADDITIONAL
-nsb.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-
-STEP 62 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-nx1.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 63 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NXDOMAIN
-SECTION QUESTION
-nx1.example.com. IN A
-SECTION ANSWER
-SECTION AUTHORITY
-; at TTL 5 because TTL capped at ttl of minttl in rdata of SOA.
-example.com. 5 IN SOA a. b. 1 2 3 4 5
-example.com. 1800 IN NS nsb.example.com.
-SECTION ADDITIONAL
-nsb.example.com. 3600 IN A 1.2.3.4
-ENTRY_END
-
-; after another 1900 seconds the domain must have timed out.
-STEP 70 TIME_PASSES ELAPSE 1900
-
-; the NS record should have timed out.
-STEP 80 QUERY
-ENTRY_BEGIN
-REPLY RD
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-; recursion happens here.
-STEP 90 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all ttl
-REPLY QR RD RA NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 88.88.88.88
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 8.8.8.8
-ENTRY_END
-
-SCENARIO_END
diff --git a/external/unbound/testdata/root_anchor.tpkg b/external/unbound/testdata/root_anchor.tpkg
deleted file mode 100644
index dfb4c5a1c..000000000
Binary files a/external/unbound/testdata/root_anchor.tpkg and /dev/null differ
diff --git a/external/unbound/testdata/val_spurious_ns.rpl b/external/unbound/testdata/val_spurious_ns.rpl
deleted file mode 100644
index 741fd1aff..000000000
--- a/external/unbound/testdata/val_spurious_ns.rpl
+++ /dev/null
@@ -1,151 +0,0 @@
-; config options
-; The island of trust is at example.com
-server:
- trust-anchor: "example.com. 3600 IN DS 2854 3 1 46e4ffc6e9a4793b488954bd3f0cc6af0dfb201b"
- val-override-date: "20070916134226"
- target-fetch-policy: "0 0 0 0 0"
-
-stub-zone:
- name: "."
- stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
-CONFIG_END
-
-SCENARIO_BEGIN Test validator with spurious unsigned NS in auth section
-
-; K.ROOT-SERVERS.NET.
-RANGE_BEGIN 0 100
- ADDRESS 193.0.14.129
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-. IN NS
-SECTION ANSWER
-. IN NS K.ROOT-SERVERS.NET.
-SECTION ADDITIONAL
-K.ROOT-SERVERS.NET. IN A 193.0.14.129
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION AUTHORITY
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-RANGE_END
-
-; a.gtld-servers.net.
-RANGE_BEGIN 0 100
- ADDRESS 192.5.6.30
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN NS
-SECTION ANSWER
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; ns.example.com.
-RANGE_BEGIN 0 100
- ADDRESS 1.2.3.4
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ENTRY_END
-
-; response to DNSKEY priming query
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN DNSKEY
-SECTION ANSWER
-example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJII s70j+sDS/UT2QRp61SE7S3E EXopNXoFE73JLRmvpi/UrOO/Vz4Se 6wXv/CYCKjGw06U4WRgR YXcpEhJROyNapmdIKSx hOzfLVE1gqA0PweZR8d tY3aNQSRn3sPpwJr6Mi /PqQKAMMrZ9ckJpf1+b QMOOvxgzz2U1GS18b3y ZKcgTMEaJzd/GZYzi/B N2DzQ0MsrSwYXfsNLFO Bbs8PJMW4LYIxeeOe6rUgkWOF 7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 1688b}
-example.com. 3600 IN RRSIG DNSKEY 3 2 3600 20070926134802 20070829134802 2854 example.com. MCwCFG1yhRNtTEa3Eno2zhVVuy2EJX3wAhQeLyUp6+UXcpC5qGNu9tkrTEgPUg== ;{id = 2854}
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ENTRY_END
-
-; response to query of interest
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-;example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
-ENTRY_END
-RANGE_END
-
-STEP 1 QUERY
-ENTRY_BEGIN
-REPLY RD DO
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-
-; recursion happens here.
-STEP 10 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all
-REPLY QR RD RA AD DO NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
-SECTION AUTHORITY
-; removed by spurious NS record removal code
-;;example.com. IN NS ns.example.com.
-;;example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
-ENTRY_END
-
-SCENARIO_END
diff --git a/external/unbound/testdata/val_ta_algo_dnskey_dp.rpl b/external/unbound/testdata/val_ta_algo_dnskey_dp.rpl
deleted file mode 100644
index b23c0f1b0..000000000
--- a/external/unbound/testdata/val_ta_algo_dnskey_dp.rpl
+++ /dev/null
@@ -1,182 +0,0 @@
-; config options
-; The island of trust is at example.com
-server:
- trust-anchor: "example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJIIs70j+sDS/UT2QRp61SE7S3EEXopNXoFE73JLRmvpi/UrOO/Vz4Se6wXv/CYCKjGw06U4WRgRYXcpEhJROyNapmdIKSxhOzfLVE1gqA0PweZR8dtY3aNQSRn3sPpwJr6Mi/PqQKAMMrZ9ckJpf1+bQMOOvxgzz2U1GS18b3yZKcgTMEaJzd/GZYzi/BN2DzQ0MsrSwYXfsNLFOBbs8PJMW4LYIxeeOe6rUgkWOF7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 1688b}"
- trust-anchor: "example.com. 3600 IN DS 30899 5 1 d4bf9d2e10f6d76840d42ef5913022abcd0bf512"
- val-override-date: "20070916134226"
- target-fetch-policy: "0 0 0 0 0"
- harden-algo-downgrade: no
-
-stub-zone:
- name: "."
- stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
-CONFIG_END
-
-SCENARIO_BEGIN Test validator with multiple algorithm trust anchor without harden
-
-; K.ROOT-SERVERS.NET.
-RANGE_BEGIN 0 100
- ADDRESS 193.0.14.129
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-. IN NS
-SECTION ANSWER
-. IN NS K.ROOT-SERVERS.NET.
-SECTION ADDITIONAL
-K.ROOT-SERVERS.NET. IN A 193.0.14.129
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION AUTHORITY
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-RANGE_END
-
-; a.gtld-servers.net.
-RANGE_BEGIN 0 100
- ADDRESS 192.5.6.30
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN NS
-SECTION ANSWER
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; ns.example.com.
-RANGE_BEGIN 0 100
- ADDRESS 1.2.3.4
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-ns.example.com. IN AAAA
-SECTION ANSWER
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-
-; response to DNSKEY priming query
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN DNSKEY
-SECTION ANSWER
-example.com. 3600 IN DNSKEY 256 3 5 AQPQ41chR9DEHt/aIzIFAqanbDlRflJoRs5yz1jFsoRIT7dWf0r+PeDuewdxkszNH6wnU4QL8pfKFRh5PIYVBLK3 ;{id = 30899 (zsk), size = 512b}
-example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJIIs70j+sDS/UT2QRp61SE7S3EEXopNXoFE73JLRmvpi/UrOO/Vz4Se6wXv/CYCKjGw06U4WRgRYXcpEhJROyNapmdIKSxhOzfLVE1gqA0PweZR8dtY3aNQSRn3sPpwJr6Mi/PqQKAMMrZ9ckJpf1+bQMOOvxgzz2U1GS18b3yZKcgTMEaJzd/GZYzi/BN2DzQ0MsrSwYXfsNLFOBbs8PJMW4LYIxeeOe6rUgkWOF7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 512b}
-example.com. 3600 IN RRSIG DNSKEY 3 2 3600 20070926134150 20070829134150 2854 example.com. AKIIYDOGHogglFqJK94ZtOnF7EfGikgAyloMNRSMCrQgFaFkmcOyjrc= ;{id = 2854}
-example.com. 3600 IN RRSIG DNSKEY 5 2 3600 20070926134150 20070829134150 30899 example.com. J55fsz1GGMnngc4r50xvXDUdaVMlfcLKLVsfMhwNLF+ERac5XV/lLRAc/aSER+qQdsSo0CrjYjy1wat7YQpDAA== ;{id = 30899}
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-; response to query of interest
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
-www.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. JNWECShNE+nCLQwOXJJ3xpUkh2G+FCh5nk8uYAHIVQRse/BIvCMSlvRrtVyw9RnXvk5RR2bEgN0pRdLWW7ug5Q== ;{id = 30899}
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-RANGE_END
-
-STEP 1 QUERY
-ENTRY_BEGIN
-REPLY RD DO
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-
-; recursion happens here.
-STEP 10 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all
-REPLY QR RD RA AD DO NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-www.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. JNWECShNE+nCLQwOXJJ3xpUkh2G+FCh5nk8uYAHIVQRse/BIvCMSlvRrtVyw9RnXvk5RR2bEgN0pRdLWW7ug5Q== ;{id = 30899}
-www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-SCENARIO_END
diff --git a/external/unbound/testdata/val_ta_algo_missing_dp.rpl b/external/unbound/testdata/val_ta_algo_missing_dp.rpl
deleted file mode 100644
index 2cf0556f5..000000000
--- a/external/unbound/testdata/val_ta_algo_missing_dp.rpl
+++ /dev/null
@@ -1,185 +0,0 @@
-; config options
-; The island of trust is at example.com
-server:
- trust-anchor: "example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJIIs70j+sDS/UT2QRp61SE7S3EEXopNXoFE73JLRmvpi/UrOO/Vz4Se6wXv/CYCKjGw06U4WRgRYXcpEhJROyNapmdIKSxhOzfLVE1gqA0PweZR8dtY3aNQSRn3sPpwJr6Mi/PqQKAMMrZ9ckJpf1+bQMOOvxgzz2U1GS18b3yZKcgTMEaJzd/GZYzi/BN2DzQ0MsrSwYXfsNLFOBbs8PJMW4LYIxeeOe6rUgkWOF7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 1688b}"
- trust-anchor: "example.com. 3600 IN DS 30899 5 1 d4bf9d2e10f6d76840d42ef5913022abcd0bf512"
- trust-anchor: "example.com. 3600 IN DS 30899 7 1 d4bf9d2e10f6d76840d42ef5913022abcd0bf512"
- val-override-date: "20070916134226"
- target-fetch-policy: "0 0 0 0 0"
- harden-algo-downgrade: no
-
-stub-zone:
- name: "."
- stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
-CONFIG_END
-
-SCENARIO_BEGIN Test validator with multiple algorithm missing one
-
-; K.ROOT-SERVERS.NET.
-RANGE_BEGIN 0 100
- ADDRESS 193.0.14.129
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-. IN NS
-SECTION ANSWER
-. IN NS K.ROOT-SERVERS.NET.
-SECTION ADDITIONAL
-K.ROOT-SERVERS.NET. IN A 193.0.14.129
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION AUTHORITY
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-RANGE_END
-
-; a.gtld-servers.net.
-RANGE_BEGIN 0 100
- ADDRESS 192.5.6.30
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-com. IN NS
-SECTION ANSWER
-com. IN NS a.gtld-servers.net.
-SECTION ADDITIONAL
-a.gtld-servers.net. IN A 192.5.6.30
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ENTRY_END
-RANGE_END
-
-; ns.example.com.
-RANGE_BEGIN 0 100
- ADDRESS 1.2.3.4
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN NS
-SECTION ANSWER
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR AA NOERROR
-SECTION QUESTION
-ns.example.com. IN AAAA
-SECTION ANSWER
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-
-; response to DNSKEY priming query
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-example.com. IN DNSKEY
-SECTION ANSWER
-example.com. 3600 IN DNSKEY 256 3 5 AQPQ41chR9DEHt/aIzIFAqanbDlRflJoRs5yz1jFsoRIT7dWf0r+PeDuewdxkszNH6wnU4QL8pfKFRh5PIYVBLK3 ;{id = 30899 (zsk), size = 512b}
-example.com. 3600 IN DNSKEY 256 3 3 ALXLUsWqUrY3JYER3T4TBJIIs70j+sDS/UT2QRp61SE7S3EEXopNXoFE73JLRmvpi/UrOO/Vz4Se6wXv/CYCKjGw06U4WRgRYXcpEhJROyNapmdIKSxhOzfLVE1gqA0PweZR8dtY3aNQSRn3sPpwJr6Mi/PqQKAMMrZ9ckJpf1+bQMOOvxgzz2U1GS18b3yZKcgTMEaJzd/GZYzi/BN2DzQ0MsrSwYXfsNLFOBbs8PJMW4LYIxeeOe6rUgkWOF7CC9Dh/dduQ1QrsJhmZAEFfd6ByYV+ ;{id = 2854 (zsk), size = 512b}
-example.com. 3600 IN RRSIG DNSKEY 3 2 3600 20070926134150 20070829134150 2854 example.com. AKIIYDOGHogglFqJK94ZtOnF7EfGikgAyloMNRSMCrQgFaFkmcOyjrc= ;{id = 2854}
-example.com. 3600 IN RRSIG DNSKEY 5 2 3600 20070926134150 20070829134150 30899 example.com. J55fsz1GGMnngc4r50xvXDUdaVMlfcLKLVsfMhwNLF+ERac5XV/lLRAc/aSER+qQdsSo0CrjYjy1wat7YQpDAA== ;{id = 30899}
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFQCMSWxVehgOQLoYclB9PIAbNP229AIUeH0vNNGJhjnZiqgIOKvs1EhzqAo= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-; response to query of interest
-ENTRY_BEGIN
-MATCH opcode qtype qname
-ADJUST copy_id
-REPLY QR NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. IN A 10.20.30.40
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
-www.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. JNWECShNE+nCLQwOXJJ3xpUkh2G+FCh5nk8uYAHIVQRse/BIvCMSlvRrtVyw9RnXvk5RR2bEgN0pRdLWW7ug5Q== ;{id = 30899}
-SECTION AUTHORITY
-example.com. IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-SECTION ADDITIONAL
-ns.example.com. IN A 1.2.3.4
-www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-RANGE_END
-
-STEP 1 QUERY
-ENTRY_BEGIN
-REPLY RD DO
-SECTION QUESTION
-www.example.com. IN A
-ENTRY_END
-
-; recursion happens here.
-STEP 10 CHECK_ANSWER
-ENTRY_BEGIN
-MATCH all
-REPLY QR RD RA AD DO NOERROR
-SECTION QUESTION
-www.example.com. IN A
-SECTION ANSWER
-www.example.com. 3600 IN A 10.20.30.40
-www.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. JNWECShNE+nCLQwOXJJ3xpUkh2G+FCh5nk8uYAHIVQRse/BIvCMSlvRrtVyw9RnXvk5RR2bEgN0pRdLWW7ug5Q== ;{id = 30899}
-www.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFC99iE9K5y2WNgI0gFvBWaTi9wm6AhUAoUqOpDtG5Zct+Qr9F3mSdnbc6V4= ;{id = 2854}
-
-SECTION AUTHORITY
-example.com. 3600 IN NS ns.example.com.
-example.com. 3600 IN RRSIG NS 3 2 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCN+qHdJxoI/2tNKwsb08pra/G7aAIUAWA5sDdJTbrXA1/3OaesGBAO3sI= ;{id = 2854}
-example.com. 3600 IN RRSIG NS 5 2 3600 20070926134150 20070829134150 30899 example.com. YTqtYba73HIOQuPr5oDyIX9pfmz1ybEBjwlD/jUgcPmFINUOZ9FeqG6ywgRKwn4AizkKTK00p1sxZYMKxl91wg== ;{id = 30899}
-
-SECTION ADDITIONAL
-ns.example.com. 3600 IN A 1.2.3.4
-ns.example.com. 3600 IN RRSIG A 3 3 3600 20070926134150 20070829134150 2854 example.com. MC0CFQCQMyTjn7WWwpwAR1LlVeLpRgZGuQIUCcJDEkwAuzytTDRlYK7nIMwH1CM= ;{id = 2854}
-ns.example.com. 3600 IN RRSIG A 5 3 3600 20070926134150 20070829134150 30899 example.com. Dn1ziMKrc3NdJkSv8g61Y9WNk3+BAuwCwnYzAZiHmkejkSCPViLJN7+f4Conp9l8LkTl50ZnLgoYrrUYNhMj6w== ;{id = 30899}
-ENTRY_END
-
-SCENARIO_END
diff --git a/external/unbound/util/alloc.c b/external/unbound/util/alloc.c
index 66bdc7db9..05d2fa362 100644
--- a/external/unbound/util/alloc.c
+++ b/external/unbound/util/alloc.c
@@ -364,6 +364,9 @@ void *unbound_stat_malloc(size_t size)
#ifdef calloc
#undef calloc
#endif
+#ifndef INT_MAX
+#define INT_MAX (((int)-1)>>1)
+#endif
/** calloc with stats */
void *unbound_stat_calloc(size_t nmemb, size_t size)
{
diff --git a/external/unbound/util/config_file.c b/external/unbound/util/config_file.c
index 5d31301fa..3ef545a7b 100644
--- a/external/unbound/util/config_file.c
+++ b/external/unbound/util/config_file.c
@@ -70,6 +70,8 @@
uid_t cfg_uid = (uid_t)-1;
/** from cfg username, after daemonise setup performed */
gid_t cfg_gid = (gid_t)-1;
+/** for debug allow small timeout values for fast rollovers */
+int autr_permit_small_holddown = 0;
/** global config during parsing */
struct config_parser_state* cfg_parser = 0;
@@ -200,6 +202,7 @@ config_create(void)
cfg->add_holddown = 30*24*3600;
cfg->del_holddown = 30*24*3600;
cfg->keep_missing = 366*24*3600; /* one year plus a little leeway */
+ cfg->permit_small_holddown = 0;
cfg->key_cache_size = 4 * 1024 * 1024;
cfg->key_cache_slabs = 4;
cfg->neg_cache_size = 1 * 1024 * 1024;
@@ -444,6 +447,9 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown)
else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown)
else S_UNSIGNED_OR_ZERO("keep-missing:", keep_missing)
+ else if(strcmp(opt, "permit-small-holddown:") == 0)
+ { IS_YES_OR_NO; cfg->permit_small_holddown = (strcmp(val, "yes") == 0);
+ autr_permit_small_holddown = cfg->permit_small_holddown; }
else S_MEMSIZE("key-cache-size:", key_cache_size)
else S_POW2("key-cache-slabs:", key_cache_slabs)
else S_MEMSIZE("neg-cache-size:", neg_cache_size)
@@ -705,6 +711,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_UNS(opt, "add-holddown", add_holddown)
else O_UNS(opt, "del-holddown", del_holddown)
else O_UNS(opt, "keep-missing", keep_missing)
+ else O_YNO(opt, "permit-small-holddown", permit_small_holddown)
else O_MEM(opt, "key-cache-size", key_cache_size)
else O_DEC(opt, "key-cache-slabs", key_cache_slabs)
else O_MEM(opt, "neg-cache-size", neg_cache_size)
@@ -1243,6 +1250,7 @@ config_apply(struct config_file* config)
MINIMAL_RESPONSES = config->minimal_responses;
RRSET_ROUNDROBIN = config->rrset_roundrobin;
log_set_time_asc(config->log_time_ascii);
+ autr_permit_small_holddown = config->permit_small_holddown;
}
void config_lookup_uid(struct config_file* cfg)
diff --git a/external/unbound/util/config_file.h b/external/unbound/util/config_file.h
index 1c3c31dcf..99b15e06e 100644
--- a/external/unbound/util/config_file.h
+++ b/external/unbound/util/config_file.h
@@ -269,6 +269,8 @@ struct config_file {
unsigned int del_holddown;
/** autotrust keep_missing time, in seconds. 0 is forever. */
unsigned int keep_missing;
+ /** permit small holddown values, allowing 5011 rollover very fast */
+ int permit_small_holddown;
/** size of the key cache */
size_t key_cache_size;
@@ -368,6 +370,8 @@ struct config_file {
extern uid_t cfg_uid;
/** from cfg username, after daemonise setup performed */
extern gid_t cfg_gid;
+/** debug and enable small timeouts */
+extern int autr_permit_small_holddown;
/**
* Stub config options
diff --git a/external/unbound/util/configlexer.c b/external/unbound/util/configlexer.c
index 83087781f..3ce3c0de3 100644
--- a/external/unbound/util/configlexer.c
+++ b/external/unbound/util/configlexer.c
@@ -363,8 +363,8 @@ static void yy_fatal_error (yyconst char msg[] );
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 174
-#define YY_END_OF_BUFFER 175
+#define YY_NUM_RULES 175
+#define YY_END_OF_BUFFER 176
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -372,198 +372,201 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[1731] =
+static yyconst flex_int16_t yy_accept[1752] =
{ 0,
- 1, 1, 156, 156, 160, 160, 164, 164, 168, 168,
- 1, 1, 175, 172, 1, 154, 154, 173, 2, 173,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 156,
- 157, 157, 158, 173, 160, 161, 161, 162, 173, 167,
- 164, 165, 165, 166, 173, 168, 169, 169, 170, 173,
- 171, 155, 2, 159, 173, 171, 172, 0, 1, 2,
- 2, 2, 2, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 1, 1, 157, 157, 161, 161, 165, 165, 169, 169,
+ 1, 1, 176, 173, 1, 155, 155, 174, 2, 174,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 157,
+ 158, 158, 159, 174, 161, 162, 162, 163, 174, 168,
+ 165, 166, 166, 167, 174, 169, 170, 170, 171, 174,
+ 172, 156, 2, 160, 174, 172, 173, 0, 1, 2,
+ 2, 2, 2, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 156, 0, 160, 0, 167, 0, 164,
- 168, 0, 171, 0, 2, 2, 171, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 171, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 157, 0, 161, 0, 168, 0,
+ 165, 169, 0, 172, 0, 2, 2, 172, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 172, 173,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 171, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 172, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 70, 172, 172, 172, 172, 172, 6,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 171, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 70, 173, 173, 173,
+ 173, 173, 173, 6, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 172, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 171, 172, 172, 172, 172, 172, 30,
- 172, 172, 172, 172, 172, 172, 172, 172, 135, 172,
- 12, 13, 172, 15, 14, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 172, 173,
+ 173, 173, 173, 173, 30, 173, 173, 173, 173, 173,
+ 173, 173, 173, 136, 173, 12, 13, 173, 15, 14,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 128, 172, 172, 172, 172, 172, 172,
- 3, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 171, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 163, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 33, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 129,
+ 173, 173, 173, 173, 173, 173, 3, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 172, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 164, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 33, 173,
- 172, 172, 34, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 85, 163, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 84, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 34,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 85,
+ 164, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 84, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 68, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 20, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 31, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 32, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 68, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 20, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 31, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 32, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 22, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 148, 172, 172,
- 172, 172, 172, 172, 26, 172, 27, 172, 172, 172,
- 71, 172, 72, 172, 69, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 5, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 87, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 22, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 149, 173, 173, 173,
+ 173, 173, 173, 26, 173, 27, 173, 173, 173, 71,
+ 173, 72, 173, 69, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 5,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 87, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 23, 172, 172, 172, 172, 172, 112, 111, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 35, 172, 172, 172, 172, 172, 172, 172, 172, 74,
- 73, 172, 172, 172, 172, 172, 172, 172, 108, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 53, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 23,
+ 173, 173, 173, 173, 173, 113, 112, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 35, 173, 173, 173, 173, 173, 173, 173, 173, 74,
+ 73, 173, 173, 173, 173, 173, 173, 173, 109, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 53, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 57, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 110, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 4, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 105, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 121, 172, 106, 172, 133, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 21, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 57, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 111, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 4, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 105, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 122, 173, 106, 173, 134, 173, 173, 173,
- 172, 76, 172, 77, 75, 172, 172, 172, 172, 172,
- 172, 172, 83, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 107, 172, 172, 172, 172, 132,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 67, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 28, 172, 172, 17, 172,
- 172, 172, 16, 172, 92, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 42,
- 44, 172, 172, 172, 172, 172, 172, 172, 172, 136,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 21, 173, 173,
+ 173, 173, 76, 173, 77, 75, 173, 173, 173, 173,
+ 173, 173, 173, 83, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 107, 173, 173, 173, 173,
+ 133, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 67, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 28, 173, 173,
+ 17, 173, 173, 173, 16, 173, 92, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 42, 44, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 78, 172, 172, 172, 172, 172, 172,
- 82, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 86, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 127,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 96, 172, 100, 172, 172, 172, 172, 81, 172,
- 172, 63, 172, 119, 172, 172, 172, 172, 134, 172,
- 172, 172, 172, 172, 172, 172, 141, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 99, 172,
+ 173, 137, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 78, 173, 173, 173, 173,
+ 173, 173, 82, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 86,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 128, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 96, 173, 100, 173, 173, 173,
+ 173, 81, 173, 173, 63, 173, 120, 173, 173, 173,
+ 173, 135, 173, 173, 173, 173, 173, 173, 173, 142,
- 172, 172, 172, 172, 45, 46, 172, 29, 52, 101,
- 172, 113, 109, 172, 172, 38, 172, 103, 172, 172,
- 172, 172, 172, 7, 172, 66, 172, 172, 172, 150,
- 172, 118, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 88,
- 140, 172, 172, 172, 172, 172, 172, 172, 172, 129,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 102, 172, 37, 39, 172, 172,
- 172, 172, 172, 65, 172, 172, 172, 149, 172, 172,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 99, 173, 173, 173, 173, 173, 45, 46, 173,
+ 29, 52, 101, 173, 114, 110, 173, 173, 38, 173,
+ 103, 173, 173, 173, 173, 173, 7, 173, 173, 66,
+ 173, 173, 173, 151, 173, 119, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 88, 141, 173, 173, 173, 173, 173,
+ 173, 173, 173, 130, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 102, 173,
- 172, 172, 123, 18, 19, 172, 172, 172, 172, 172,
- 172, 172, 62, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 125, 122, 172, 172, 172, 172, 172,
- 172, 172, 172, 36, 172, 172, 172, 172, 172, 172,
- 172, 11, 172, 172, 172, 172, 172, 172, 172, 172,
- 10, 172, 172, 172, 153, 172, 40, 172, 131, 124,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 95, 94, 172, 172, 126, 120, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 47, 172, 130, 172, 172,
+ 37, 39, 173, 173, 173, 173, 173, 173, 65, 173,
+ 173, 173, 150, 173, 173, 173, 173, 124, 18, 19,
+ 173, 173, 173, 173, 173, 173, 173, 62, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 126, 123,
+ 173, 173, 173, 173, 173, 173, 173, 173, 36, 173,
+ 173, 173, 173, 173, 173, 173, 11, 173, 173, 173,
+ 173, 173, 173, 173, 173, 10, 173, 173, 173, 173,
+ 154, 173, 40, 173, 132, 125, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 95, 94, 173,
+ 173, 127, 121, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 41, 172, 172, 172, 89, 91,
- 114, 172, 172, 172, 93, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 137, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 24,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 139, 172,
- 172, 117, 172, 172, 172, 172, 172, 172, 172, 50,
- 172, 25, 172, 9, 172, 172, 172, 172, 115, 54,
- 172, 172, 172, 98, 172, 172, 172, 172, 172, 172,
- 172, 138, 79, 172, 172, 172, 172, 56, 60, 55,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 47, 173, 131, 173, 173, 173, 173, 173, 173,
+ 173, 41, 173, 173, 173, 89, 91, 115, 173, 173,
+ 173, 93, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 138, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 24, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 140, 173, 173, 118,
+ 173, 173, 173, 173, 173, 173, 173, 50, 173, 25,
+ 173, 9, 173, 173, 173, 173, 173, 116, 54, 173,
- 172, 48, 172, 8, 172, 151, 172, 172, 97, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 61,
- 59, 172, 49, 172, 172, 116, 172, 172, 90, 43,
- 172, 172, 172, 172, 172, 172, 80, 58, 51, 152,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 64, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 104, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 172, 172,
+ 173, 173, 98, 173, 173, 173, 173, 173, 173, 173,
+ 139, 79, 173, 173, 173, 173, 56, 60, 55, 173,
+ 48, 173, 8, 173, 173, 152, 173, 173, 97, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 61,
+ 59, 173, 49, 173, 108, 173, 117, 173, 173, 90,
+ 43, 173, 173, 173, 173, 173, 173, 80, 58, 51,
+ 153, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 64, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
- 172, 172, 172, 172, 144, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 142, 172,
- 145, 146, 172, 172, 172, 172, 172, 143, 147, 0
+ 173, 173, 173, 173, 173, 173, 104, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 145, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 143,
+ 173, 146, 147, 173, 173, 173, 173, 173, 144, 148,
+ 0
} ;
static yyconst flex_int32_t yy_ec[256] =
@@ -606,784 +609,794 @@ static yyconst flex_int32_t yy_meta[40] =
1, 1, 1, 1, 1, 1, 1, 1, 1
} ;
-static yyconst flex_int16_t yy_base[1745] =
+static yyconst flex_int16_t yy_base[1766] =
{ 0,
0, 0, 37, 40, 44, 51, 63, 75, 56, 68,
- 87, 108, 2883, 2837, 50, 3431, 3431, 3431, 129, 94,
+ 87, 108, 2487, 2363, 50, 3475, 3475, 3475, 129, 94,
70, 104, 130, 90, 92, 115, 127, 95, 84, 111,
- 137, 148, 50, 150, 161, 158, 154, 167, 182, 2287,
- 3431, 3431, 3431, 70, 2251, 3431, 3431, 3431, 42, 1839,
- 1625, 3431, 3431, 3431, 199, 1573, 3431, 3431, 3431, 141,
- 1198, 3431, 203, 3431, 207, 122, 861, 213, 120, 0,
- 224, 0, 0, 103, 147, 140, 206, 171, 170, 208,
- 210, 211, 200, 226, 217, 214, 225, 227, 232, 180,
- 230, 235, 242, 229, 246, 247, 240, 249, 252, 253,
+ 137, 148, 50, 170, 150, 157, 160, 140, 166, 2236,
+ 3475, 3475, 3475, 70, 2188, 3475, 3475, 3475, 42, 1913,
+ 1777, 3475, 3475, 3475, 192, 1681, 3475, 3475, 3475, 141,
+ 1627, 3475, 198, 3475, 202, 122, 1553, 208, 120, 0,
+ 219, 0, 0, 103, 201, 203, 206, 164, 212, 204,
+ 214, 125, 215, 225, 217, 221, 224, 227, 229, 230,
+ 236, 237, 244, 228, 246, 249, 248, 253, 254, 173,
- 257, 258, 259, 261, 262, 267, 268, 269, 274, 275,
- 276, 278, 280, 284, 283, 286, 282, 290, 292, 299,
- 303, 293, 296, 812, 318, 609, 321, 447, 327, 359,
- 174, 332, 164, 336, 340, 0, 317, 333, 341, 311,
- 335, 337, 339, 342, 349, 346, 352, 355, 376, 357,
- 345, 360, 49, 359, 361, 367, 368, 372, 370, 369,
- 378, 371, 373, 382, 392, 399, 400, 401, 386, 408,
- 404, 411, 417, 413, 415, 402, 418, 414, 419, 423,
- 416, 425, 429, 426, 432, 435, 433, 302, 437, 443,
- 439, 440, 441, 454, 460, 457, 456, 446, 461, 467,
+ 255, 259, 260, 261, 262, 265, 264, 270, 263, 274,
+ 276, 277, 278, 284, 290, 286, 287, 291, 158, 293,
+ 299, 295, 303, 305, 1394, 315, 1200, 319, 1040, 327,
+ 776, 615, 320, 539, 335, 339, 0, 317, 332, 340,
+ 334, 296, 325, 336, 338, 346, 343, 350, 354, 375,
+ 355, 342, 357, 49, 359, 360, 353, 366, 368, 364,
+ 371, 372, 370, 369, 391, 377, 393, 402, 394, 387,
+ 405, 401, 409, 412, 410, 398, 413, 414, 415, 416,
+ 418, 420, 422, 423, 424, 427, 428, 435, 431, 439,
+ 433, 450, 436, 432, 452, 459, 461, 460, 457, 448,
- 466, 475, 463, 464, 473, 474, 477, 483, 488, 486,
- 489, 479, 491, 493, 494, 492, 502, 500, 503, 505,
- 512, 508, 509, 511, 513, 515, 517, 518, 519, 521,
- 525, 531, 524, 523, 529, 530, 539, 541, 542, 547,
- 554, 548, 549, 550, 556, 558, 560, 562, 566, 567,
- 574, 570, 571, 579, 572, 573, 588, 580, 591, 581,
- 583, 585, 593, 595, 599, 615, 601, 610, 604, 605,
- 606, 608, 637, 612, 620, 611, 623, 641, 622, 633,
- 644, 643, 645, 651, 646, 652, 653, 656, 655, 654,
- 660, 661, 662, 663, 674, 673, 667, 685, 681, 682,
+ 458, 468, 465, 476, 472, 464, 473, 474, 475, 483,
+ 488, 489, 491, 480, 486, 494, 498, 495, 505, 493,
+ 508, 506, 515, 503, 512, 513, 514, 516, 518, 520,
+ 519, 521, 531, 522, 528, 529, 532, 535, 538, 542,
+ 545, 544, 550, 552, 555, 557, 558, 560, 563, 561,
+ 564, 565, 571, 578, 574, 575, 581, 576, 582, 583,
+ 593, 595, 585, 587, 589, 596, 599, 597, 619, 605,
+ 608, 609, 613, 612, 616, 628, 614, 624, 625, 626,
+ 647, 629, 639, 648, 645, 646, 657, 650, 652, 656,
+ 659, 658, 662, 663, 664, 665, 667, 675, 679, 677,
- 664, 683, 689, 690, 697, 693, 694, 695, 696, 698,
- 701, 704, 708, 3431, 710, 705, 712, 713, 715, 3431,
- 716, 717, 718, 719, 724, 723, 735, 721, 733, 738,
- 740, 734, 741, 742, 743, 763, 745, 750, 752, 748,
- 753, 760, 756, 767, 770, 772, 775, 774, 754, 777,
- 778, 780, 783, 788, 791, 794, 795, 796, 797, 801,
- 802, 803, 804, 808, 816, 810, 822, 811, 828, 831,
- 825, 833, 835, 841, 818, 837, 840, 843, 845, 846,
- 847, 853, 850, 852, 856, 857, 854, 860, 870, 862,
- 873, 875, 877, 878, 880, 881, 883, 889, 863, 887,
+ 689, 682, 690, 691, 693, 695, 696, 704, 685, 700,
+ 701, 703, 710, 712, 702, 714, 3475, 718, 705, 716,
+ 720, 721, 722, 3475, 725, 727, 728, 730, 731, 732,
+ 738, 735, 737, 743, 744, 746, 749, 750, 751, 771,
+ 755, 752, 762, 760, 756, 773, 758, 780, 769, 778,
+ 785, 782, 786, 788, 789, 791, 792, 795, 809, 794,
+ 796, 802, 803, 813, 805, 816, 818, 819, 820, 822,
+ 830, 824, 827, 832, 840, 843, 845, 851, 833, 847,
+ 849, 855, 856, 857, 839, 863, 861, 864, 865, 869,
+ 867, 872, 876, 874, 879, 880, 887, 875, 889, 881,
- 893, 894, 886, 888, 898, 905, 906, 914, 907, 915,
- 912, 916, 923, 924, 917, 925, 928, 929, 930, 931,
- 933, 932, 935, 938, 939, 945, 942, 943, 948, 953,
- 955, 957, 958, 959, 962, 963, 967, 965, 966, 975,
- 976, 978, 980, 979, 982, 986, 981, 988, 991, 3431,
- 1001, 995, 992, 998, 892, 1003, 1005, 1031, 3431, 1007,
- 3431, 3431, 1006, 3431, 3431, 1008, 1009, 1010, 1018, 1054,
- 1019, 1011, 1012, 1025, 1027, 1032, 1033, 1020, 1041, 1044,
- 1046, 1038, 1045, 1048, 1052, 1062, 1049, 1059, 1069, 1071,
- 1080, 1081, 1079, 1078, 1083, 1085, 1068, 1087, 1088, 1090,
+ 836, 895, 893, 898, 900, 891, 902, 904, 910, 907,
+ 908, 909, 922, 913, 924, 916, 927, 933, 669, 915,
+ 929, 923, 935, 936, 937, 938, 939, 943, 944, 946,
+ 952, 940, 949, 956, 954, 963, 951, 964, 966, 969,
+ 970, 971, 972, 980, 973, 974, 984, 982, 987, 986,
+ 990, 988, 997, 995, 3475, 1005, 999, 1001, 1002, 1007,
+ 1008, 1010, 1036, 3475, 1012, 3475, 3475, 1011, 3475, 3475,
+ 1014, 1016, 1017, 1024, 1059, 1025, 1029, 1018, 1031, 1033,
+ 1037, 1038, 1042, 1049, 1051, 1062, 1046, 1052, 1056, 1068,
+ 1069, 1064, 1073, 1080, 1082, 1088, 1089, 1087, 1086, 1093,
- 1094, 1101, 1097, 3431, 1098, 1100, 1099, 1104, 1106, 1108,
- 3431, 1109, 1110, 1112, 1114, 1117, 1118, 1120, 1122, 1123,
- 1124, 1127, 1128, 1125, 1132, 1135, 1145, 1151, 1144, 1137,
- 1147, 1150, 1153, 1157, 1165, 1161, 1154, 1162, 1168, 1166,
- 1170, 1177, 1167, 1179, 1171, 1173, 1178, 1180, 1201, 1181,
- 1184, 1188, 1187, 1189, 1191, 1193, 1211, 1203, 1209, 1216,
- 1219, 1208, 1220, 1225, 1228, 1235, 1226, 1227, 1230, 1237,
- 1195, 1240, 1239, 1242, 1246, 1251, 1248, 3431, 1258, 1254,
- 1255, 1259, 1262, 1260, 1264, 1266, 1263, 1268, 1269, 1270,
- 1276, 1283, 3431, 1271, 1277, 1281, 1286, 1287, 1288, 1294,
+ 1094, 1095, 1098, 1097, 1096, 1100, 1106, 1110, 1107, 3475,
+ 1108, 1109, 1111, 1118, 1116, 1121, 3475, 1053, 1122, 1120,
+ 1123, 1128, 1129, 1130, 1133, 1134, 1135, 1136, 1142, 1138,
+ 1140, 1147, 1151, 1153, 1155, 1157, 1158, 1162, 1163, 1164,
+ 1171, 1169, 1168, 1174, 1178, 1175, 1180, 1182, 1177, 1185,
+ 1183, 1188, 1190, 1191, 1213, 1193, 1194, 1196, 1199, 1198,
+ 1201, 1205, 1206, 1208, 1220, 1226, 1227, 1207, 1230, 1232,
+ 1242, 1239, 1236, 1246, 1243, 1249, 1252, 1250, 1254, 1256,
+ 1258, 1260, 1263, 3475, 1269, 1268, 1266, 1273, 1274, 1272,
+ 1217, 1275, 1276, 1278, 1280, 1282, 1281, 1292, 3475, 1288,
- 1297, 1304, 3431, 1306, 1307, 1309, 1300, 1302, 1310, 1313,
- 1314, 1318, 1319, 1315, 1322, 1325, 1327, 1328, 1329, 1333,
- 1332, 1334, 1339, 1341, 1340, 1343, 1342, 1346, 1344, 1351,
- 1357, 1361, 1358, 1365, 1362, 1366, 1367, 1372, 1369, 1374,
- 1370, 1371, 3431, 125, 1376, 1377, 1375, 1391, 1393, 1394,
- 1397, 1384, 1400, 1401, 1403, 1385, 1405, 1407, 1409, 1410,
- 1411, 1412, 1415, 1419, 1422, 1413, 1430, 1421, 1425, 1431,
- 1423, 1435, 1437, 1378, 1438, 1443, 1444, 1441, 1445, 1446,
- 1449, 1450, 1454, 1451, 1452, 1453, 3431, 1469, 1461, 1455,
- 1467, 1471, 1478, 1474, 1479, 1481, 1482, 1488, 1484, 1490,
+ 1293, 1289, 1294, 1297, 1298, 1301, 1305, 1313, 1309, 3475,
+ 1317, 1314, 1320, 1319, 1321, 1324, 1325, 1326, 1327, 1329,
+ 1331, 1330, 1335, 1343, 1340, 1333, 1345, 1338, 1350, 1352,
+ 1353, 1354, 1355, 1357, 1358, 1362, 1364, 1368, 1370, 1367,
+ 1378, 1371, 1374, 1379, 1384, 1381, 1383, 1385, 1386, 3475,
+ 442, 1387, 1393, 1389, 1400, 1402, 1398, 1405, 1406, 1407,
+ 1412, 1413, 1396, 1414, 1416, 1419, 1422, 1424, 1423, 1425,
+ 1427, 1431, 1433, 1434, 1436, 1439, 1441, 1442, 1444, 1445,
+ 1451, 1450, 1452, 1453, 1456, 1457, 1458, 1460, 1462, 1465,
+ 1470, 1466, 1473, 3475, 1479, 1475, 1476, 1472, 1478, 1495,
- 1492, 1498, 1496, 1501, 1486, 1489, 1508, 1509, 1510, 1512,
- 1511, 1502, 3431, 1514, 1517, 1519, 1531, 1521, 1522, 1528,
- 1524, 1533, 1523, 1540, 1534, 1543, 3431, 1544, 1545, 1546,
- 1553, 1554, 1556, 1557, 1559, 1560, 1561, 1563, 1564, 1567,
- 1570, 1572, 1575, 3431, 1581, 1584, 1585, 1591, 1583, 1577,
- 1587, 1594, 1589, 1595, 1602, 1599, 1600, 1603, 1604, 1605,
- 1601, 1607, 1608, 1611, 1610, 1612, 3431, 1628, 1625, 1629,
- 1636, 1630, 1640, 1639, 1631, 1641, 1624, 1645, 1646, 1647,
- 1648, 1649, 1652, 1654, 1655, 1656, 1657, 1658, 1659, 1667,
- 1661, 1662, 1675, 1676, 1679, 1678, 1681, 1687, 1688, 1689,
+ 1487, 1496, 1488, 1491, 1498, 1502, 1499, 1505, 1507, 1509,
+ 1511, 1512, 1513, 1519, 1520, 1517, 1521, 1523, 1527, 1524,
+ 3475, 1529, 1530, 1534, 1543, 1536, 1540, 1546, 1544, 1547,
+ 1548, 1556, 1549, 1561, 3475, 1563, 1557, 1551, 1568, 1569,
+ 1572, 1574, 1576, 1577, 1578, 1580, 1581, 1584, 1582, 1587,
+ 1591, 3475, 1595, 1599, 1596, 1607, 1603, 1592, 1604, 1606,
+ 1608, 1609, 1618, 1610, 1614, 1617, 1619, 1620, 1616, 1622,
+ 1623, 1626, 1625, 1633, 3475, 1640, 1642, 1644, 1643, 1646,
+ 1654, 1653, 1650, 1655, 1656, 1658, 1659, 1662, 1663, 1665,
+ 1666, 1667, 1671, 1672, 1673, 1670, 1690, 1668, 1691, 1679,
- 3431, 1693, 1694, 1695, 1696, 1697, 1703, 1705, 1701, 1706,
- 1707, 1708, 1709, 1718, 1711, 1717, 1719, 1721, 1714, 1722,
- 1724, 1731, 1729, 1737, 1735, 1742, 1744, 3431, 1745, 1753,
- 1749, 1755, 1747, 1761, 3431, 1757, 3431, 1764, 1770, 1773,
- 3431, 1777, 3431, 1779, 3431, 1723, 1780, 1772, 1758, 1760,
- 1784, 1782, 1786, 1788, 1790, 1792, 1793, 1762, 1794, 1795,
- 3431, 1798, 1796, 1801, 1806, 1799, 1803, 1809, 1805, 1815,
- 1807, 1826, 1820, 1827, 1824, 1829, 1830, 3431, 1831, 1832,
- 1834, 1837, 1841, 1848, 1845, 1842, 1849, 1835, 1853, 1863,
- 1861, 1852, 1864, 1865, 1866, 1872, 1868, 1869, 1876, 1873,
+ 1692, 1678, 1694, 1677, 1699, 1707, 1708, 1705, 3475, 1710,
+ 1711, 1712, 1713, 1714, 1720, 1722, 1716, 1718, 1723, 1724,
+ 1725, 1739, 1726, 1728, 1732, 1736, 1730, 1738, 1741, 1752,
+ 1742, 1757, 1746, 1748, 1758, 1763, 3475, 1740, 1771, 1768,
+ 1772, 1764, 1779, 3475, 1775, 3475, 1778, 1780, 1790, 3475,
+ 1787, 3475, 1789, 3475, 1791, 1795, 1777, 1797, 1798, 1799,
+ 1800, 1802, 1803, 1805, 1807, 1808, 1809, 1811, 1816, 3475,
+ 1810, 1817, 1824, 1827, 1814, 1818, 1826, 1820, 1837, 1836,
+ 1847, 1833, 1848, 1844, 1846, 1849, 3475, 1850, 1851, 1854,
+ 1856, 1857, 1864, 1862, 1861, 1868, 1865, 1869, 1882, 1878,
- 1877, 1879, 1880, 1882, 1881, 1884, 1892, 1886, 1888, 1889,
- 3431, 1898, 1890, 1894, 1902, 1904, 3431, 3431, 1913, 1915,
- 1916, 1907, 1917, 1909, 1922, 1924, 1930, 1936, 1919, 1927,
- 1929, 1932, 1937, 1938, 1941, 1943, 1944, 1950, 1945, 1948,
- 3431, 1958, 1952, 1960, 1961, 1963, 1969, 1968, 1971, 3431,
- 3431, 1976, 1972, 1973, 1975, 1982, 1979, 1978, 3431, 1986,
- 1988, 1993, 1997, 1999, 2000, 1987, 1990, 2008, 1989, 2011,
- 2001, 2012, 2014, 2020, 2016, 2017, 2019, 2022, 2023, 2030,
- 3431, 2027, 2032, 2034, 2037, 2038, 2039, 2040, 2043, 2041,
- 2044, 2045, 2053, 2054, 2056, 2057, 2058, 2062, 2059, 2066,
+ 1871, 1880, 1881, 1883, 1891, 1884, 1887, 1894, 1895, 1885,
+ 1896, 1897, 1898, 1902, 1905, 1909, 1906, 1908, 1910, 3475,
+ 1915, 1919, 1922, 1921, 1911, 3475, 3475, 1924, 1932, 1936,
+ 1937, 1938, 1925, 1939, 1940, 1950, 1943, 1946, 1952, 1954,
+ 1955, 1956, 1957, 1958, 1959, 1961, 1962, 1963, 1971, 1970,
+ 3475, 1979, 1973, 1986, 1984, 1975, 1992, 1985, 1993, 3475,
+ 3475, 1989, 1994, 1999, 2000, 2006, 2004, 2003, 3475, 2005,
+ 2008, 2009, 2010, 2011, 2013, 2018, 2023, 2027, 2028, 2024,
+ 2032, 2033, 2029, 2035, 2034, 2036, 2037, 2040, 2047, 2052,
+ 3475, 2049, 2056, 2053, 2057, 2059, 2060, 2061, 2064, 2066,
- 2068, 2069, 2075, 2071, 3431, 2085, 2072, 2086, 2082, 2084,
- 2087, 2094, 2091, 2092, 2093, 2095, 2097, 2096, 2099, 2100,
- 2101, 2108, 3431, 2109, 2120, 2106, 2116, 2122, 2114, 2124,
- 2127, 2129, 3431, 2130, 2137, 2134, 2136, 2139, 2141, 2133,
- 2144, 2147, 2148, 2149, 2150, 2155, 2157, 2152, 2158, 2160,
- 2161, 2163, 2168, 2175, 2165, 2169, 2182, 2181, 2190, 2192,
- 2178, 2188, 2196, 2193, 2194, 2195, 2197, 2206, 2199, 2208,
- 2202, 3431, 2209, 2210, 2216, 2218, 2213, 2219, 2223, 2220,
- 2227, 3431, 2224, 3431, 2230, 3431, 2231, 2235, 2232, 2237,
- 2238, 2239, 2240, 2245, 2253, 2241, 3431, 2259, 2247, 2254,
+ 2063, 2067, 2071, 2078, 2074, 2077, 2079, 2081, 2084, 2086,
+ 2090, 2087, 2097, 2098, 3475, 2105, 2093, 2107, 2094, 2109,
+ 2112, 2115, 2114, 2103, 2116, 2117, 2106, 2118, 2122, 2124,
+ 2129, 2125, 3475, 2131, 2135, 2132, 2141, 2142, 2138, 2143,
+ 2146, 2149, 3475, 2152, 2158, 2154, 2155, 2161, 2160, 2163,
+ 2166, 2167, 2169, 2170, 2171, 2176, 2177, 2179, 2180, 2182,
+ 2184, 2183, 2186, 2193, 2196, 2191, 2200, 2203, 2206, 2216,
+ 2213, 2201, 2207, 2222, 2218, 2220, 2221, 2210, 2228, 2225,
+ 2231, 2229, 3475, 2234, 2238, 2243, 2245, 2232, 2240, 2248,
+ 2249, 2250, 3475, 2251, 3475, 2254, 3475, 2257, 2261, 2258,
- 2257, 3431, 2262, 3431, 3431, 2249, 2267, 2273, 2269, 2274,
- 2270, 2277, 3431, 2278, 2279, 2282, 2280, 2284, 2288, 2290,
- 2291, 2292, 2293, 2294, 3431, 2296, 2295, 2298, 2306, 3431,
- 2304, 2309, 2310, 2312, 2319, 2320, 2322, 2311, 2323, 2331,
- 2328, 3431, 2330, 2324, 2335, 2332, 2337, 2344, 2340, 2346,
- 2341, 2342, 2350, 2355, 2356, 3431, 2358, 2360, 3431, 2359,
- 2361, 2362, 3431, 2367, 3431, 2369, 2370, 2366, 2371, 2377,
- 2374, 2387, 2379, 2384, 2389, 2382, 2393, 2396, 2390, 3431,
- 3431, 2400, 2397, 2402, 2407, 2403, 2405, 2409, 2412, 3431,
- 2413, 2416, 2417, 2418, 2419, 2425, 2420, 2427, 2428, 2422,
+ 2262, 2263, 2264, 2268, 2265, 2279, 2273, 3475, 2276, 2267,
+ 2275, 2280, 3475, 2291, 3475, 3475, 2282, 2286, 2298, 2292,
+ 2294, 2299, 2303, 3475, 2304, 2296, 2305, 2308, 2307, 2310,
+ 2312, 2313, 2314, 2315, 2318, 3475, 2321, 2330, 2319, 2327,
+ 3475, 2320, 2340, 2323, 2341, 2331, 2342, 2343, 2344, 2345,
+ 2355, 2351, 2352, 3475, 2353, 2354, 2358, 2359, 2361, 2369,
+ 2366, 2373, 2367, 2376, 2378, 2377, 2370, 3475, 2384, 2387,
+ 3475, 2383, 2390, 2391, 3475, 2393, 3475, 2394, 2397, 2395,
+ 2402, 2404, 2405, 2409, 2398, 2415, 2401, 2413, 2422, 2416,
+ 2418, 3475, 3475, 2428, 2423, 2430, 2433, 2425, 2431, 2435,
- 2429, 2430, 2431, 3431, 2435, 2439, 2441, 2444, 2442, 2445,
- 3431, 2447, 2448, 2449, 2453, 2455, 2469, 2472, 2474, 2464,
- 2476, 2479, 2481, 2482, 2484, 2486, 2487, 3431, 2452, 2489,
- 2490, 2492, 2493, 2494, 2495, 2496, 2503, 2499, 2505, 3431,
- 2507, 2508, 2510, 2516, 2513, 2520, 2517, 2521, 2524, 2525,
- 2526, 2527, 2528, 2529, 2534, 2536, 2535, 2538, 2540, 2553,
- 2542, 3431, 2545, 3431, 2549, 2555, 2562, 2559, 3431, 2561,
- 2563, 3431, 2566, 3431, 2564, 2569, 2570, 2580, 3431, 2582,
- 2571, 2583, 2575, 2577, 2573, 2588, 3431, 2593, 2595, 2600,
- 2596, 2586, 2594, 2603, 2602, 2604, 2610, 2611, 3431, 2612,
+ 2442, 3475, 2436, 2439, 2443, 2445, 2446, 2447, 2448, 2453,
+ 2450, 2455, 2457, 2456, 2458, 3475, 2463, 2459, 2468, 2467,
+ 2469, 2471, 3475, 2473, 2475, 2476, 2479, 2484, 2490, 2495,
+ 2499, 2496, 2501, 2503, 2505, 2506, 2508, 2511, 2512, 3475,
+ 2480, 2514, 2515, 2517, 2518, 2520, 2519, 2523, 2528, 2529,
+ 2521, 2533, 3475, 2530, 2535, 2537, 2543, 2538, 2546, 2547,
+ 2548, 2551, 2552, 2554, 2555, 2556, 2558, 2561, 2562, 2563,
+ 2565, 2567, 2575, 2578, 3475, 2568, 3475, 2576, 2583, 2591,
+ 2589, 3475, 2587, 2592, 3475, 2593, 3475, 2594, 2595, 2596,
+ 2604, 3475, 2607, 2599, 2608, 2610, 2611, 2612, 2614, 3475,
- 2613, 2619, 2615, 2459, 3431, 3431, 2620, 3431, 3431, 3431,
- 2625, 3431, 3431, 2626, 2630, 3431, 2633, 3431, 2639, 2635,
- 2627, 2616, 2637, 3431, 2641, 3431, 2649, 2645, 2646, 3431,
- 2648, 3431, 2650, 2651, 2652, 2654, 2657, 2665, 2668, 2658,
- 2660, 2662, 2669, 2671, 2672, 2673, 2676, 2679, 2680, 2682,
- 2684, 2685, 2686, 2687, 2689, 2690, 2691, 2699, 2704, 3431,
- 3431, 2692, 2701, 2694, 2707, 2708, 2710, 2713, 2714, 3431,
- 2721, 2723, 2718, 2722, 2724, 2726, 2729, 2728, 2734, 2740,
- 2736, 2738, 2739, 2741, 3431, 2743, 3431, 3431, 2746, 2748,
- 2750, 2752, 2755, 3431, 2756, 2764, 2757, 3431, 2769, 2759,
+ 2617, 2620, 2619, 2624, 2626, 2627, 2628, 2630, 2633, 2639,
+ 2636, 3475, 2635, 2640, 2648, 2644, 2647, 3475, 3475, 2653,
+ 3475, 3475, 3475, 2656, 3475, 3475, 2657, 2659, 3475, 2661,
+ 3475, 2668, 2664, 2666, 2667, 2669, 3475, 2671, 2673, 3475,
+ 2675, 2676, 2677, 3475, 2679, 3475, 2680, 2684, 2681, 2688,
+ 2691, 2697, 2699, 2700, 2687, 2701, 2702, 2703, 2704, 2706,
+ 2708, 2710, 2711, 2716, 2717, 2718, 2720, 2721, 2722, 2723,
+ 2724, 2732, 2741, 3475, 3475, 2725, 2733, 2727, 2735, 2738,
+ 2743, 2746, 2752, 3475, 2757, 2750, 2754, 2758, 2748, 2760,
+ 2765, 2767, 2769, 2775, 2762, 2772, 2771, 2774, 3475, 2776,
- 2772, 2775, 3431, 3431, 3431, 2776, 2765, 2779, 2780, 2781,
- 2782, 2783, 3431, 2784, 2789, 2790, 2792, 2797, 2803, 2798,
- 2800, 2809, 2811, 3431, 3431, 2817, 2814, 2815, 2804, 2806,
- 2816, 2822, 2819, 3431, 2823, 2825, 2828, 2829, 2830, 2832,
- 2835, 3431, 2834, 2836, 2840, 2846, 2842, 2848, 2849, 2850,
- 3431, 2852, 2854, 2858, 3431, 2862, 3431, 2865, 3431, 3431,
- 2860, 2868, 2871, 2876, 2878, 2882, 2866, 2872, 2888, 2890,
- 2887, 3431, 3431, 2879, 2897, 3431, 3431, 2893, 2894, 2895,
- 2896, 2898, 2901, 2902, 2906, 2903, 2904, 2907, 2909, 2915,
- 2917, 2918, 2919, 2923, 2926, 3431, 2924, 3431, 2929, 2931,
+ 3475, 3475, 2777, 2779, 2784, 2785, 2788, 2789, 3475, 2792,
+ 2799, 2791, 3475, 2802, 2803, 2808, 2810, 3475, 3475, 3475,
+ 2811, 2805, 2814, 2813, 2815, 2816, 2817, 3475, 2819, 2821,
+ 2824, 2828, 2831, 2833, 2841, 2837, 2839, 2845, 3475, 3475,
+ 2851, 2848, 2849, 2847, 2840, 2850, 2857, 2853, 3475, 2860,
+ 2859, 2861, 2864, 2866, 2867, 2869, 3475, 2870, 2871, 2876,
+ 2880, 2872, 2883, 2884, 2885, 3475, 2887, 2886, 2893, 2888,
+ 3475, 2900, 3475, 2905, 3475, 3475, 2894, 2906, 2908, 2910,
+ 2913, 2916, 2902, 2917, 2923, 2922, 2924, 3475, 3475, 2919,
+ 2932, 3475, 3475, 2926, 2929, 2930, 2933, 2935, 2937, 2938,
- 2932, 2933, 2935, 2940, 3431, 2941, 2939, 2934, 3431, 3431,
- 3431, 2952, 2953, 2955, 3431, 2956, 2958, 2945, 2960, 2963,
- 2962, 2971, 2969, 2973, 3431, 2970, 2975, 2977, 2974, 2979,
- 2982, 2983, 2984, 2986, 2985, 2996, 2987, 3000, 3003, 3431,
- 3005, 2993, 3009, 3001, 2997, 3017, 3021, 3007, 3012, 3014,
- 3023, 3018, 3025, 3027, 3028, 3036, 3033, 3038, 3431, 3040,
- 3029, 3431, 3041, 3035, 3052, 3043, 3054, 3056, 3058, 3431,
- 3060, 3431, 3061, 3431, 3065, 3066, 3068, 3069, 3431, 3431,
- 3070, 3072, 3076, 3431, 3077, 3073, 3079, 3080, 3083, 3084,
- 3086, 3431, 3431, 3087, 3089, 3093, 3090, 3431, 3431, 3431,
+ 2939, 2940, 2941, 2945, 2950, 2951, 2952, 2954, 2955, 2958,
+ 2961, 3475, 2960, 3475, 2965, 2968, 2969, 2962, 2970, 2974,
+ 2975, 3475, 2977, 2976, 2979, 3475, 3475, 3475, 2989, 2990,
+ 2992, 3475, 2993, 2996, 2982, 2995, 3003, 2997, 3011, 2999,
+ 3010, 3475, 3000, 3007, 3013, 3014, 3017, 3020, 3021, 3023,
+ 3025, 3027, 3029, 3032, 3034, 3037, 3475, 3039, 3035, 3041,
+ 3043, 3045, 3046, 3048, 3050, 3052, 3054, 3056, 3058, 3060,
+ 3061, 3062, 3063, 3070, 3069, 3074, 3475, 3078, 3075, 3475,
+ 3079, 3083, 3080, 3089, 3091, 3093, 3095, 3475, 3099, 3475,
+ 3101, 3475, 3104, 3096, 3105, 3107, 3108, 3475, 3475, 3109,
- 3099, 3431, 3102, 3431, 3095, 3431, 3104, 3108, 3431, 3110,
- 3112, 3114, 3115, 3116, 3117, 3119, 3120, 3118, 3122, 3431,
- 3431, 3127, 3431, 3130, 3133, 3431, 3134, 3135, 3431, 3431,
- 3144, 3141, 3142, 3143, 3145, 3148, 3431, 3431, 3431, 3431,
- 3149, 3150, 3152, 3154, 3151, 3156, 3157, 3159, 3161, 3158,
- 3166, 3175, 3168, 3176, 3183, 3181, 3431, 3177, 3179, 3189,
- 3190, 3186, 3188, 3187, 3194, 3196, 3197, 3199, 3202, 3204,
- 3211, 3203, 3213, 3218, 3219, 3220, 3207, 3232, 3229, 3230,
- 3217, 3231, 3238, 3234, 3235, 3431, 3239, 3240, 3241, 3242,
- 3245, 3247, 3243, 3256, 3263, 3249, 3251, 3261, 3266, 3267,
+ 3112, 3115, 3475, 3116, 3118, 3119, 3122, 3123, 3124, 3126,
+ 3475, 3475, 3127, 3129, 3133, 3135, 3475, 3475, 3475, 3143,
+ 3475, 3144, 3475, 3150, 3146, 3475, 3152, 3153, 3475, 3136,
+ 3156, 3158, 3134, 3161, 3162, 3164, 3165, 3163, 3167, 3475,
+ 3475, 3172, 3475, 3174, 3475, 3178, 3475, 3175, 3179, 3475,
+ 3475, 3186, 3184, 3185, 3188, 3191, 3189, 3475, 3475, 3475,
+ 3475, 3192, 3193, 3195, 3197, 3194, 3199, 3200, 3202, 3204,
+ 3201, 3206, 3214, 3218, 3220, 3226, 3222, 3475, 3223, 3227,
+ 3229, 3233, 3230, 3232, 3231, 3234, 3237, 3239, 3240, 3241,
+ 3242, 3249, 3251, 3257, 3259, 3261, 3262, 3255, 3268, 3272,
- 3268, 3269, 3271, 3270, 3431, 3272, 3273, 3279, 3281, 3282,
- 3284, 3285, 3286, 3291, 3292, 3294, 3296, 3301, 3431, 3297,
- 3431, 3431, 3305, 3306, 3307, 3312, 3314, 3431, 3431, 3431,
- 3339, 3346, 3353, 3360, 3367, 94, 3374, 3381, 3388, 3395,
- 3402, 3409, 3416, 3423
+ 3269, 3265, 3273, 3280, 3277, 3278, 3475, 3281, 3279, 3282,
+ 3287, 3288, 3285, 3283, 3293, 3303, 3305, 3299, 3295, 3308,
+ 3309, 3311, 3312, 3315, 3313, 3475, 3317, 3319, 3321, 3323,
+ 3325, 3327, 3328, 3329, 3334, 3336, 3338, 3345, 3341, 3475,
+ 3349, 3475, 3475, 3350, 3339, 3351, 3353, 3357, 3475, 3475,
+ 3475, 3383, 3390, 3397, 3404, 3411, 94, 3418, 3425, 3432,
+ 3439, 3446, 3453, 3460, 3467
} ;
-static yyconst flex_int16_t yy_def[1745] =
+static yyconst flex_int16_t yy_def[1766] =
{ 0,
- 1730, 1, 1731, 1731, 1732, 1732, 1733, 1733, 1734, 1734,
- 1735, 1735, 1730, 1736, 1730, 1730, 1730, 1730, 1737, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1738,
- 1730, 1730, 1730, 1738, 1739, 1730, 1730, 1730, 1739, 1740,
- 1730, 1730, 1730, 1730, 1740, 1741, 1730, 1730, 1730, 1741,
- 1742, 1730, 1743, 1730, 1742, 1742, 1736, 1736, 1730, 1744,
- 1737, 1744, 1737, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1751, 1, 1752, 1752, 1753, 1753, 1754, 1754, 1755, 1755,
+ 1756, 1756, 1751, 1757, 1751, 1751, 1751, 1751, 1758, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1759,
+ 1751, 1751, 1751, 1759, 1760, 1751, 1751, 1751, 1760, 1761,
+ 1751, 1751, 1751, 1751, 1761, 1762, 1751, 1751, 1751, 1762,
+ 1763, 1751, 1764, 1751, 1763, 1763, 1757, 1757, 1751, 1765,
+ 1758, 1765, 1758, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1738, 1738, 1739, 1739, 1740, 1740, 1730,
- 1741, 1741, 1742, 1742, 1743, 1743, 1742, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1742, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1759, 1759, 1760, 1760, 1761, 1761,
+ 1751, 1762, 1762, 1763, 1763, 1764, 1764, 1763, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1763, 1757,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1742, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1763, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1742, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1763, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1742, 1736, 1736, 1736, 1736, 1736, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736,
- 1730, 1730, 1736, 1730, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1763, 1757,
+ 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1751, 1751, 1757, 1751, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1763, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757,
- 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1730, 1742, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1763, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736,
- 1736, 1736, 1736, 1736, 1730, 1736, 1730, 1736, 1736, 1736,
- 1730, 1736, 1730, 1736, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1751, 1757, 1757, 1757, 1751,
+ 1757, 1751, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1730, 1736, 1736, 1736, 1736, 1736, 1730, 1730, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1751, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1730, 1736, 1730, 1736, 1730, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1751, 1757, 1751, 1757, 1751, 1757, 1757, 1757,
- 1736, 1730, 1736, 1730, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1730, 1736,
- 1736, 1736, 1730, 1736, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757,
+ 1757, 1757, 1751, 1757, 1751, 1751, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757,
+ 1751, 1757, 1757, 1757, 1751, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1751, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1730, 1736, 1730, 1736, 1736, 1736, 1736, 1730, 1736,
- 1736, 1730, 1736, 1730, 1736, 1736, 1736, 1736, 1730, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736,
+ 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1751, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1751, 1757, 1757, 1751, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
- 1736, 1736, 1736, 1736, 1730, 1730, 1736, 1730, 1730, 1730,
- 1736, 1730, 1730, 1736, 1736, 1730, 1736, 1730, 1736, 1736,
- 1736, 1736, 1736, 1730, 1736, 1730, 1736, 1736, 1736, 1730,
- 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1730, 1736, 1730, 1730, 1736, 1736,
- 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1730, 1736, 1736,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1751, 1751, 1757,
+ 1751, 1751, 1751, 1757, 1751, 1751, 1757, 1757, 1751, 1757,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1751,
+ 1757, 1757, 1757, 1751, 1757, 1751, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1751, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757,
- 1736, 1736, 1730, 1730, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1730, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1730, 1736, 1736, 1736, 1730, 1736, 1730, 1736, 1730, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1730, 1730, 1736, 1736, 1730, 1730, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1730, 1736, 1736,
+ 1751, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757,
+ 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1751, 1751, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757,
+ 1751, 1757, 1751, 1757, 1751, 1751, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1751, 1757,
+ 1757, 1751, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1730, 1730,
- 1730, 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736,
- 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1736, 1730, 1736, 1730, 1736, 1736, 1736, 1736, 1730, 1730,
- 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1730, 1730, 1736, 1736, 1736, 1736, 1730, 1730, 1730,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1751, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1751, 1757, 1757, 1757, 1751, 1751, 1751, 1757, 1757,
+ 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1751,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1751,
+ 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1751, 1751, 1757,
- 1736, 1730, 1736, 1730, 1736, 1730, 1736, 1736, 1730, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730,
- 1730, 1736, 1730, 1736, 1736, 1730, 1736, 1736, 1730, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1730, 1730, 1730,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736,
+ 1757, 1757, 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1751, 1751, 1757, 1757, 1757, 1757, 1751, 1751, 1751, 1757,
+ 1751, 1757, 1751, 1757, 1757, 1751, 1757, 1757, 1751, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1751, 1757, 1751, 1757, 1751, 1757, 1751, 1757, 1757, 1751,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1751, 1751,
+ 1751, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
- 1736, 1736, 1736, 1736, 1730, 1736, 1736, 1736, 1736, 1736,
- 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1730, 1736,
- 1730, 1730, 1736, 1736, 1736, 1736, 1736, 1730, 1730, 0,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730
+ 1757, 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1751, 1757, 1757, 1757, 1757,
+ 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1751,
+ 1757, 1751, 1751, 1757, 1757, 1757, 1757, 1757, 1751, 1751,
+ 0, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751
} ;
-static yyconst flex_int16_t yy_nxt[3471] =
+static yyconst flex_int16_t yy_nxt[3515] =
{ 0,
14, 15, 16, 17, 18, 19, 18, 14, 14, 14,
14, 18, 20, 21, 14, 22, 23, 24, 25, 14,
26, 27, 28, 29, 30, 31, 32, 33, 34, 14,
35, 36, 37, 38, 39, 14, 14, 14, 14, 41,
- 42, 43, 41, 42, 43, 126, 46, 47, 126, 44,
+ 42, 43, 41, 42, 43, 127, 46, 47, 127, 44,
48, 69, 44, 46, 47, 70, 49, 48, 57, 58,
59, 68, 68, 49, 51, 52, 53, 54, 60, 18,
- 57, 58, 59, 124, 124, 55, 51, 52, 53, 54,
- 60, 18, 68, 104, 219, 74, 75, 55, 15, 16,
+ 57, 58, 59, 125, 125, 55, 51, 52, 53, 54,
+ 60, 18, 68, 104, 221, 74, 75, 55, 15, 16,
17, 62, 63, 64, 67, 67, 68, 67, 67, 65,
67, 95, 68, 76, 68, 67, 85, 68, 66, 15,
- 16, 17, 62, 63, 64, 68, 68, 77, 138, 87,
+ 16, 17, 62, 63, 64, 68, 68, 77, 139, 87,
65, 69, 94, 68, 78, 70, 86, 68, 88, 66,
- 72, 79, 72, 72, 134, 72, 89, 134, 96, 68,
- 72, 73, 68, 90, 131, 131, 91, 80, 137, 68,
- 97, 81, 68, 92, 82, 93, 83, 84, 98, 68,
- 68, 101, 68, 139, 99, 102, 68, 117, 100, 118,
- 68, 105, 140, 68, 109, 113, 134, 106, 110, 68,
- 107, 103, 68, 68, 119, 114, 132, 108, 111, 115,
- 116, 112, 68, 120, 68, 122, 144, 156, 121, 123,
+ 72, 79, 72, 72, 135, 72, 89, 68, 96, 68,
+ 72, 73, 68, 90, 132, 132, 91, 80, 138, 68,
+ 97, 81, 68, 92, 82, 93, 83, 84, 98, 148,
+ 68, 101, 68, 110, 99, 102, 121, 111, 100, 68,
+ 68, 122, 68, 118, 114, 119, 68, 112, 68, 123,
+ 113, 103, 68, 124, 115, 68, 192, 105, 116, 117,
+ 120, 106, 171, 129, 144, 129, 129, 107, 129, 72,
- 128, 143, 128, 128, 72, 128, 72, 72, 133, 72,
- 133, 133, 68, 133, 67, 136, 67, 67, 68, 67,
- 68, 141, 68, 68, 67, 72, 68, 72, 72, 68,
- 72, 148, 145, 149, 142, 72, 73, 68, 68, 68,
- 146, 68, 68, 151, 68, 147, 152, 68, 155, 161,
- 158, 150, 68, 159, 68, 153, 157, 154, 68, 68,
- 162, 68, 165, 163, 68, 68, 166, 160, 169, 68,
- 68, 68, 170, 68, 68, 168, 167, 172, 175, 68,
- 68, 68, 171, 164, 173, 177, 68, 68, 68, 178,
- 68, 185, 68, 174, 68, 68, 68, 176, 68, 187,
+ 108, 72, 72, 134, 72, 134, 134, 109, 134, 67,
+ 137, 67, 67, 68, 67, 68, 68, 140, 68, 67,
+ 72, 142, 72, 72, 68, 72, 68, 68, 146, 68,
+ 72, 73, 150, 68, 143, 141, 68, 68, 145, 68,
+ 68, 68, 68, 152, 147, 156, 149, 157, 68, 68,
+ 151, 162, 159, 153, 154, 160, 68, 155, 68, 163,
+ 68, 68, 158, 164, 166, 68, 68, 68, 167, 161,
+ 170, 68, 68, 68, 68, 68, 68, 68, 173, 169,
+ 172, 177, 68, 165, 168, 174, 68, 179, 68, 68,
+ 68, 180, 176, 175, 178, 181, 68, 187, 68, 68,
- 181, 179, 68, 182, 68, 68, 180, 186, 68, 183,
- 184, 68, 189, 192, 68, 68, 258, 195, 190, 188,
- 194, 124, 124, 68, 126, 191, 196, 126, 128, 134,
- 128, 128, 197, 128, 193, 131, 131, 133, 200, 133,
- 133, 72, 133, 72, 72, 68, 72, 68, 199, 68,
- 198, 68, 136, 68, 68, 201, 205, 68, 68, 208,
- 130, 68, 206, 207, 68, 209, 203, 68, 202, 68,
- 216, 68, 68, 68, 204, 220, 217, 218, 221, 68,
- 68, 68, 68, 68, 68, 68, 227, 210, 68, 232,
- 68, 228, 211, 222, 68, 223, 224, 212, 68, 225,
+ 189, 183, 68, 68, 184, 68, 182, 68, 68, 185,
+ 188, 68, 196, 194, 186, 68, 203, 68, 125, 125,
+ 190, 191, 127, 132, 132, 127, 193, 197, 129, 135,
+ 129, 129, 199, 129, 195, 198, 134, 68, 134, 134,
+ 72, 134, 72, 72, 68, 72, 68, 201, 68, 200,
+ 68, 137, 68, 207, 68, 68, 204, 210, 68, 208,
+ 209, 202, 68, 205, 211, 68, 68, 68, 218, 68,
+ 206, 68, 68, 219, 220, 222, 68, 223, 68, 224,
+ 68, 68, 68, 68, 68, 230, 212, 68, 229, 68,
+ 235, 213, 226, 225, 228, 227, 214, 233, 234, 68,
- 226, 231, 213, 230, 68, 233, 234, 236, 214, 215,
- 229, 68, 68, 68, 68, 239, 68, 235, 241, 238,
- 68, 240, 237, 68, 242, 68, 68, 68, 68, 68,
- 68, 68, 243, 244, 245, 68, 246, 68, 68, 248,
- 249, 68, 256, 250, 68, 68, 252, 68, 247, 68,
- 260, 68, 68, 68, 263, 68, 259, 251, 68, 129,
- 253, 264, 254, 255, 262, 257, 68, 266, 134, 68,
- 261, 267, 68, 68, 272, 68, 68, 270, 68, 68,
- 269, 271, 274, 273, 265, 68, 68, 68, 268, 68,
- 275, 68, 279, 277, 276, 68, 280, 281, 68, 282,
+ 236, 215, 232, 68, 231, 68, 68, 216, 217, 238,
+ 68, 237, 241, 68, 68, 239, 243, 68, 242, 244,
+ 240, 68, 68, 246, 68, 68, 68, 68, 68, 245,
+ 68, 247, 68, 249, 68, 68, 68, 252, 251, 68,
+ 68, 255, 259, 68, 68, 68, 248, 68, 68, 253,
+ 250, 68, 262, 261, 135, 254, 265, 263, 257, 258,
+ 68, 256, 68, 260, 68, 266, 267, 264, 269, 135,
+ 68, 68, 68, 68, 270, 275, 68, 68, 274, 273,
+ 68, 272, 276, 277, 68, 68, 68, 68, 68, 268,
+ 282, 271, 68, 280, 279, 68, 283, 284, 68, 278,
- 68, 68, 283, 68, 68, 68, 68, 284, 286, 289,
- 287, 278, 68, 288, 68, 68, 291, 68, 285, 293,
- 68, 68, 292, 68, 68, 68, 290, 68, 298, 68,
- 68, 68, 303, 68, 300, 68, 68, 68, 297, 295,
- 294, 68, 68, 68, 296, 302, 304, 299, 305, 301,
- 308, 68, 306, 68, 68, 307, 312, 313, 314, 68,
- 68, 68, 68, 309, 310, 311, 68, 320, 68, 315,
- 68, 319, 68, 322, 68, 321, 318, 316, 68, 68,
- 317, 326, 68, 68, 68, 68, 68, 336, 328, 323,
- 324, 68, 68, 68, 329, 68, 330, 68, 331, 325,
+ 68, 68, 285, 68, 286, 68, 68, 68, 287, 289,
+ 68, 281, 292, 288, 290, 68, 291, 68, 68, 293,
+ 68, 294, 296, 295, 68, 68, 68, 68, 68, 301,
+ 68, 68, 68, 68, 68, 297, 303, 307, 306, 300,
+ 68, 68, 298, 68, 68, 305, 299, 68, 302, 304,
+ 68, 135, 308, 311, 68, 317, 68, 68, 309, 315,
+ 316, 310, 68, 313, 68, 318, 314, 68, 312, 68,
+ 68, 324, 68, 68, 326, 68, 68, 68, 322, 323,
+ 325, 319, 321, 68, 320, 330, 68, 68, 68, 328,
+ 68, 327, 332, 68, 68, 68, 333, 68, 334, 68,
- 68, 332, 327, 68, 333, 68, 334, 68, 337, 335,
- 342, 68, 340, 68, 338, 339, 134, 68, 68, 341,
- 68, 127, 68, 68, 68, 344, 343, 68, 352, 345,
- 346, 353, 68, 356, 68, 68, 355, 354, 361, 347,
- 357, 348, 349, 350, 358, 68, 351, 359, 363, 68,
- 362, 366, 360, 68, 364, 68, 68, 68, 68, 365,
- 369, 370, 368, 68, 68, 68, 68, 68, 68, 375,
- 376, 367, 68, 68, 68, 68, 68, 388, 371, 68,
- 372, 373, 374, 379, 381, 68, 68, 378, 384, 383,
- 377, 382, 385, 68, 68, 68, 380, 68, 387, 386,
+ 340, 68, 335, 329, 339, 68, 331, 68, 68, 68,
+ 336, 68, 341, 337, 346, 338, 344, 68, 342, 343,
+ 68, 135, 345, 348, 68, 68, 68, 133, 68, 357,
+ 347, 68, 356, 349, 350, 362, 68, 68, 68, 360,
+ 68, 68, 358, 351, 359, 352, 353, 354, 361, 363,
+ 355, 68, 365, 366, 367, 370, 364, 68, 68, 68,
+ 68, 368, 68, 372, 68, 369, 373, 374, 68, 68,
+ 68, 68, 379, 371, 68, 68, 68, 68, 380, 68,
+ 376, 68, 375, 518, 377, 378, 383, 68, 385, 68,
+ 382, 68, 386, 381, 68, 387, 389, 68, 388, 384,
- 389, 68, 68, 391, 392, 68, 68, 68, 68, 68,
- 68, 397, 396, 68, 390, 394, 68, 68, 398, 395,
- 68, 400, 68, 401, 68, 68, 393, 68, 68, 68,
- 68, 68, 403, 68, 404, 68, 68, 399, 402, 405,
- 409, 410, 412, 411, 408, 68, 68, 68, 406, 407,
- 68, 413, 68, 68, 68, 68, 416, 68, 418, 428,
- 68, 417, 68, 430, 68, 68, 68, 414, 68, 429,
- 419, 415, 68, 432, 420, 68, 421, 426, 427, 68,
- 434, 422, 68, 423, 68, 431, 68, 68, 439, 68,
- 68, 424, 68, 433, 440, 68, 436, 435, 445, 441,
+ 390, 68, 68, 68, 392, 68, 391, 68, 68, 395,
+ 393, 396, 68, 68, 68, 68, 68, 68, 397, 400,
+ 394, 398, 68, 401, 68, 399, 68, 404, 68, 402,
+ 68, 405, 68, 68, 68, 403, 407, 68, 406, 68,
+ 68, 408, 68, 68, 68, 417, 410, 68, 415, 68,
+ 68, 414, 416, 409, 413, 68, 68, 411, 68, 412,
+ 421, 68, 68, 68, 68, 418, 423, 68, 68, 433,
+ 68, 419, 68, 422, 68, 435, 420, 131, 424, 434,
+ 432, 68, 425, 68, 426, 68, 437, 431, 436, 427,
+ 68, 428, 68, 439, 68, 438, 440, 68, 68, 429,
- 134, 425, 437, 68, 444, 438, 68, 68, 68, 68,
- 443, 442, 450, 68, 68, 68, 68, 449, 446, 453,
- 68, 448, 68, 68, 125, 447, 451, 452, 68, 458,
- 68, 455, 463, 459, 68, 454, 460, 68, 456, 461,
- 68, 457, 462, 68, 464, 68, 465, 68, 466, 68,
- 470, 467, 68, 68, 468, 68, 469, 68, 68, 68,
- 474, 471, 68, 472, 68, 68, 68, 475, 68, 68,
- 480, 477, 68, 68, 68, 68, 478, 483, 476, 473,
- 479, 494, 68, 484, 481, 68, 482, 68, 485, 68,
- 68, 486, 68, 68, 488, 68, 493, 490, 68, 68,
+ 68, 68, 441, 68, 68, 445, 68, 135, 68, 430,
+ 446, 449, 442, 443, 68, 68, 450, 68, 451, 448,
+ 444, 68, 447, 454, 455, 68, 452, 453, 68, 456,
+ 68, 68, 68, 458, 68, 460, 68, 463, 466, 68,
+ 457, 464, 68, 467, 68, 68, 459, 468, 68, 465,
+ 461, 68, 68, 462, 469, 68, 470, 68, 471, 68,
+ 497, 68, 475, 68, 473, 474, 472, 68, 68, 68,
+ 479, 478, 476, 68, 477, 68, 68, 68, 480, 68,
+ 482, 68, 485, 488, 68, 483, 68, 68, 68, 484,
+ 481, 68, 68, 68, 490, 489, 491, 486, 487, 68,
- 68, 68, 495, 489, 68, 68, 68, 492, 496, 491,
- 68, 497, 553, 487, 499, 500, 498, 68, 68, 68,
- 501, 503, 506, 502, 68, 504, 68, 68, 68, 68,
- 510, 508, 505, 507, 511, 68, 68, 68, 512, 514,
- 68, 68, 68, 68, 68, 68, 509, 68, 513, 519,
- 68, 68, 524, 520, 68, 68, 526, 68, 515, 516,
- 68, 517, 521, 518, 527, 68, 523, 68, 522, 68,
- 68, 68, 529, 525, 68, 68, 528, 68, 68, 68,
- 534, 533, 536, 537, 532, 530, 535, 68, 68, 531,
- 68, 134, 68, 68, 68, 539, 542, 543, 68, 540,
+ 494, 68, 498, 68, 493, 68, 495, 68, 502, 496,
+ 68, 499, 68, 500, 68, 501, 68, 505, 492, 68,
+ 68, 68, 68, 507, 506, 68, 508, 68, 68, 509,
+ 504, 512, 503, 510, 68, 68, 68, 513, 511, 68,
+ 516, 68, 514, 520, 517, 68, 519, 68, 68, 68,
+ 68, 68, 68, 521, 525, 68, 68, 515, 68, 530,
+ 526, 68, 532, 68, 68, 522, 68, 523, 68, 524,
+ 527, 531, 533, 529, 528, 68, 68, 534, 68, 536,
+ 535, 68, 68, 68, 68, 68, 68, 540, 539, 542,
+ 541, 538, 68, 545, 68, 537, 68, 543, 68, 135,
- 68, 546, 544, 68, 68, 538, 541, 68, 549, 547,
- 68, 550, 548, 68, 545, 68, 551, 68, 68, 68,
- 68, 68, 68, 68, 68, 566, 565, 564, 552, 563,
- 68, 68, 68, 554, 561, 562, 574, 68, 578, 68,
- 577, 575, 555, 68, 68, 68, 580, 581, 556, 576,
- 68, 579, 557, 68, 582, 558, 68, 68, 68, 583,
- 68, 68, 559, 584, 68, 560, 68, 567, 568, 585,
- 569, 68, 588, 570, 68, 589, 590, 586, 571, 587,
- 68, 68, 593, 68, 572, 573, 592, 594, 595, 591,
- 68, 68, 68, 68, 596, 68, 597, 68, 600, 68,
+ 68, 549, 68, 544, 548, 546, 550, 68, 547, 68,
+ 552, 68, 555, 68, 68, 556, 554, 68, 553, 68,
+ 68, 551, 68, 68, 68, 557, 68, 559, 68, 68,
+ 68, 572, 558, 571, 570, 569, 68, 68, 560, 567,
+ 568, 68, 580, 68, 584, 68, 583, 561, 68, 68,
+ 68, 586, 130, 562, 68, 582, 585, 563, 68, 581,
+ 564, 68, 588, 68, 68, 68, 589, 565, 68, 587,
+ 566, 68, 573, 574, 68, 575, 68, 591, 576, 590,
+ 68, 68, 595, 577, 592, 68, 621, 593, 594, 578,
+ 579, 596, 68, 599, 68, 600, 601, 598, 68, 68,
- 68, 603, 68, 598, 601, 599, 68, 602, 605, 68,
- 68, 68, 68, 68, 604, 608, 68, 610, 68, 607,
- 68, 68, 68, 612, 68, 609, 68, 615, 606, 68,
- 68, 613, 68, 611, 68, 68, 68, 68, 621, 68,
- 68, 620, 614, 626, 68, 616, 617, 68, 624, 68,
- 619, 618, 629, 622, 625, 623, 68, 68, 630, 68,
- 631, 628, 68, 68, 627, 68, 68, 634, 632, 68,
- 636, 633, 637, 68, 68, 641, 638, 68, 68, 68,
- 68, 643, 68, 68, 639, 68, 635, 640, 644, 134,
- 68, 68, 68, 68, 645, 646, 68, 657, 642, 68,
+ 68, 68, 602, 597, 603, 68, 68, 68, 68, 68,
+ 68, 610, 68, 604, 605, 607, 608, 612, 68, 68,
+ 68, 68, 68, 68, 615, 606, 611, 609, 68, 614,
+ 68, 617, 68, 68, 68, 68, 619, 616, 613, 622,
+ 68, 68, 68, 618, 620, 68, 68, 68, 68, 628,
+ 68, 627, 68, 623, 68, 624, 633, 631, 636, 68,
+ 637, 626, 625, 68, 629, 68, 630, 68, 632, 68,
+ 68, 638, 634, 635, 68, 68, 68, 643, 644, 641,
+ 68, 68, 640, 68, 645, 648, 68, 68, 639, 68,
+ 68, 650, 68, 651, 135, 68, 642, 68, 646, 647,
- 68, 68, 647, 68, 649, 68, 661, 68, 682, 648,
- 134, 658, 650, 68, 660, 68, 651, 662, 652, 663,
- 68, 68, 653, 68, 654, 659, 666, 664, 68, 655,
- 665, 68, 68, 668, 656, 673, 667, 68, 68, 68,
- 68, 670, 68, 672, 679, 669, 671, 68, 674, 68,
- 678, 68, 68, 675, 68, 676, 680, 683, 68, 684,
- 68, 681, 687, 68, 688, 689, 68, 68, 685, 690,
- 68, 68, 68, 677, 68, 68, 68, 686, 68, 693,
- 68, 68, 68, 68, 692, 698, 691, 696, 68, 68,
- 702, 694, 695, 68, 697, 68, 700, 701, 68, 68,
+ 68, 653, 68, 68, 652, 68, 68, 649, 68, 664,
+ 68, 68, 128, 68, 654, 668, 656, 68, 68, 68,
+ 68, 665, 671, 657, 655, 68, 667, 669, 658, 68,
+ 659, 670, 68, 666, 660, 672, 661, 673, 68, 68,
+ 677, 662, 68, 675, 68, 702, 663, 674, 68, 680,
+ 679, 68, 681, 676, 68, 68, 678, 682, 68, 683,
+ 685, 68, 68, 686, 68, 689, 68, 690, 68, 687,
+ 68, 694, 68, 688, 691, 68, 696, 684, 68, 695,
+ 68, 68, 692, 697, 68, 68, 68, 68, 68, 693,
+ 68, 700, 68, 68, 68, 705, 703, 698, 699, 709,
- 68, 699, 703, 706, 707, 708, 68, 704, 705, 68,
- 710, 711, 68, 712, 68, 709, 68, 713, 68, 68,
- 714, 68, 68, 715, 716, 68, 68, 68, 720, 718,
- 68, 68, 717, 724, 68, 722, 723, 68, 727, 68,
- 68, 68, 719, 726, 68, 68, 68, 721, 730, 728,
- 725, 68, 68, 68, 68, 68, 68, 735, 68, 729,
- 736, 738, 731, 68, 741, 732, 734, 739, 742, 68,
- 68, 733, 737, 68, 68, 740, 744, 68, 68, 68,
- 748, 68, 68, 68, 68, 743, 68, 68, 68, 68,
- 68, 747, 746, 745, 782, 750, 68, 68, 756, 749,
+ 68, 68, 708, 701, 68, 68, 68, 704, 707, 68,
+ 68, 713, 706, 68, 714, 715, 712, 68, 717, 710,
+ 718, 68, 716, 711, 720, 68, 68, 722, 721, 68,
+ 723, 68, 68, 68, 719, 724, 68, 68, 68, 68,
+ 728, 68, 68, 68, 730, 68, 731, 68, 726, 732,
+ 68, 725, 68, 734, 735, 68, 727, 68, 733, 729,
+ 738, 736, 68, 737, 68, 68, 68, 68, 739, 68,
+ 68, 743, 744, 746, 68, 749, 68, 750, 742, 68,
+ 68, 740, 68, 68, 741, 747, 68, 745, 748, 752,
+ 68, 68, 756, 68, 751, 68, 68, 68, 68, 68,
- 757, 751, 753, 68, 754, 68, 68, 755, 752, 68,
- 760, 758, 68, 68, 759, 68, 764, 68, 762, 68,
- 767, 68, 68, 68, 68, 68, 761, 68, 771, 769,
- 763, 68, 765, 68, 68, 68, 772, 68, 766, 774,
- 768, 773, 68, 68, 770, 775, 777, 68, 778, 68,
- 68, 776, 780, 68, 779, 68, 68, 68, 68, 783,
- 786, 68, 68, 68, 68, 68, 68, 68, 781, 787,
- 784, 785, 791, 68, 794, 797, 795, 788, 792, 68,
- 790, 68, 789, 68, 793, 800, 68, 796, 799, 801,
- 68, 68, 803, 68, 68, 806, 68, 807, 68, 798,
+ 754, 68, 753, 755, 758, 68, 126, 764, 68, 765,
+ 68, 757, 68, 761, 68, 766, 759, 68, 68, 68,
+ 762, 763, 767, 760, 68, 68, 68, 772, 68, 770,
+ 775, 68, 768, 769, 68, 68, 68, 68, 779, 68,
+ 771, 773, 777, 68, 780, 68, 68, 774, 68, 783,
+ 781, 68, 776, 68, 68, 778, 68, 68, 786, 782,
+ 785, 788, 68, 68, 68, 68, 784, 790, 68, 68,
+ 68, 791, 68, 787, 68, 794, 789, 68, 68, 792,
+ 793, 795, 68, 799, 68, 68, 803, 68, 68, 796,
+ 68, 68, 798, 797, 802, 807, 805, 800, 801, 68,
- 68, 68, 68, 805, 68, 802, 804, 808, 68, 809,
- 68, 810, 813, 68, 68, 815, 816, 811, 812, 814,
- 68, 68, 68, 68, 68, 823, 68, 817, 818, 68,
- 824, 68, 819, 68, 68, 68, 68, 820, 827, 821,
- 68, 822, 828, 68, 825, 68, 68, 829, 831, 826,
- 832, 835, 68, 830, 837, 68, 68, 68, 68, 838,
- 834, 836, 839, 833, 841, 68, 68, 843, 68, 68,
- 845, 68, 68, 68, 844, 68, 68, 840, 847, 68,
- 850, 849, 68, 848, 68, 132, 842, 68, 854, 68,
- 852, 855, 846, 68, 853, 68, 68, 68, 857, 68,
+ 68, 804, 808, 68, 806, 814, 809, 68, 68, 811,
+ 68, 68, 813, 812, 68, 815, 816, 68, 810, 68,
+ 818, 68, 817, 68, 68, 68, 823, 824, 820, 68,
+ 819, 68, 68, 68, 825, 68, 68, 826, 821, 68,
+ 831, 68, 68, 822, 827, 833, 68, 832, 68, 828,
+ 836, 829, 68, 830, 837, 68, 68, 834, 68, 68,
+ 68, 68, 838, 68, 835, 68, 840, 844, 68, 68,
+ 841, 839, 846, 68, 848, 68, 845, 842, 847, 850,
+ 68, 68, 849, 852, 68, 843, 68, 854, 68, 68,
+ 68, 853, 68, 68, 68, 856, 68, 859, 858, 68,
- 851, 68, 856, 68, 858, 861, 68, 68, 859, 864,
- 860, 68, 68, 68, 68, 68, 68, 68, 870, 68,
- 68, 862, 68, 68, 68, 865, 130, 868, 874, 876,
- 863, 866, 867, 871, 869, 877, 68, 68, 873, 878,
- 68, 68, 68, 68, 872, 875, 879, 883, 68, 880,
- 881, 68, 68, 68, 885, 884, 882, 68, 68, 68,
- 68, 68, 887, 889, 68, 892, 68, 68, 68, 68,
- 68, 68, 886, 68, 68, 888, 899, 890, 901, 68,
- 891, 895, 893, 896, 897, 894, 900, 68, 68, 898,
- 68, 68, 902, 68, 908, 909, 903, 905, 907, 68,
+ 857, 851, 863, 68, 68, 861, 864, 68, 68, 855,
+ 862, 68, 860, 865, 866, 68, 68, 870, 68, 68,
+ 68, 68, 68, 868, 867, 873, 68, 869, 68, 68,
+ 68, 68, 68, 879, 68, 68, 874, 68, 68, 135,
+ 871, 877, 875, 883, 872, 68, 876, 886, 880, 878,
+ 885, 887, 68, 882, 68, 68, 68, 890, 68, 881,
+ 884, 892, 68, 888, 889, 68, 68, 68, 68, 893,
+ 68, 68, 891, 894, 68, 68, 898, 68, 68, 68,
+ 68, 901, 68, 68, 68, 68, 895, 909, 897, 68,
+ 68, 68, 899, 133, 896, 900, 902, 904, 903, 905,
- 68, 68, 910, 904, 911, 68, 68, 68, 68, 68,
- 916, 906, 913, 68, 917, 68, 918, 68, 68, 68,
- 68, 68, 914, 68, 912, 924, 68, 923, 915, 68,
- 68, 68, 919, 68, 68, 68, 68, 920, 952, 922,
- 929, 68, 925, 68, 932, 921, 933, 68, 926, 68,
- 927, 931, 928, 934, 68, 930, 68, 68, 937, 68,
- 935, 68, 938, 936, 941, 68, 942, 68, 945, 68,
- 68, 943, 68, 68, 68, 939, 68, 940, 964, 944,
- 949, 947, 68, 948, 68, 68, 956, 946, 950, 68,
- 951, 68, 68, 953, 68, 955, 68, 959, 68, 954,
+ 906, 907, 68, 68, 68, 913, 68, 908, 910, 911,
+ 915, 68, 914, 912, 917, 918, 916, 68, 919, 68,
+ 68, 920, 68, 68, 68, 68, 68, 925, 68, 922,
+ 68, 926, 68, 927, 68, 68, 68, 68, 68, 923,
+ 68, 921, 68, 932, 68, 924, 933, 928, 68, 929,
+ 68, 68, 68, 68, 68, 931, 938, 934, 68, 935,
+ 68, 930, 944, 936, 68, 941, 942, 937, 940, 68,
+ 68, 939, 950, 945, 943, 68, 68, 947, 131, 946,
+ 68, 948, 951, 68, 68, 952, 955, 68, 953, 68,
+ 68, 68, 68, 958, 949, 957, 954, 959, 960, 68,
- 68, 957, 68, 961, 68, 68, 68, 68, 68, 958,
- 68, 68, 966, 68, 969, 68, 963, 68, 68, 68,
- 960, 68, 968, 970, 976, 965, 962, 68, 967, 975,
- 973, 971, 68, 977, 979, 972, 68, 974, 68, 68,
- 981, 68, 68, 68, 68, 984, 68, 68, 982, 68,
- 980, 129, 978, 68, 68, 990, 987, 68, 985, 988,
- 68, 68, 991, 992, 68, 68, 993, 983, 995, 986,
- 996, 989, 994, 68, 997, 68, 68, 68, 68, 1002,
- 68, 68, 998, 1001, 68, 68, 1004, 1005, 68, 68,
- 1006, 68, 68, 68, 68, 999, 68, 1000, 68, 1013,
+ 961, 68, 68, 68, 964, 956, 962, 68, 963, 68,
+ 68, 68, 68, 969, 68, 68, 967, 68, 971, 68,
+ 68, 68, 68, 68, 966, 974, 68, 968, 68, 68,
+ 68, 973, 68, 976, 965, 970, 68, 979, 68, 68,
+ 977, 972, 975, 978, 980, 68, 981, 983, 68, 68,
+ 982, 985, 984, 986, 987, 989, 68, 991, 68, 68,
+ 68, 68, 68, 68, 994, 988, 68, 992, 68, 68,
+ 990, 1000, 997, 68, 68, 998, 68, 68, 995, 1001,
+ 68, 68, 1002, 68, 1005, 1003, 993, 999, 996, 1006,
+ 68, 1007, 68, 68, 68, 68, 68, 68, 1012, 68,
- 68, 68, 68, 1003, 68, 1011, 68, 1007, 1010, 1012,
- 68, 1008, 1009, 1019, 68, 1017, 68, 1018, 1014, 68,
- 1015, 68, 1016, 1020, 1023, 68, 1021, 68, 68, 68,
- 1024, 68, 1022, 1025, 68, 1026, 68, 1032, 1027, 68,
- 1028, 68, 68, 1029, 68, 1031, 1030, 1033, 68, 68,
- 68, 1034, 1035, 68, 1040, 68, 68, 68, 1037, 1036,
- 68, 1042, 68, 1043, 68, 1048, 1045, 1050, 1039, 1046,
- 68, 1041, 68, 68, 1038, 68, 1053, 1044, 1047, 1051,
- 68, 68, 1049, 68, 68, 68, 1055, 68, 68, 1061,
- 68, 68, 1056, 1054, 68, 1052, 1057, 1058, 68, 68,
+ 1011, 1008, 1004, 68, 1014, 1015, 68, 68, 68, 68,
+ 68, 1009, 1016, 1010, 68, 1017, 1023, 68, 68, 1013,
+ 68, 68, 68, 68, 1020, 130, 1021, 68, 1018, 1019,
+ 1022, 68, 1027, 68, 68, 1033, 68, 68, 1024, 1032,
+ 1025, 1029, 1030, 1026, 68, 1031, 1028, 1034, 68, 68,
+ 68, 68, 68, 1035, 1043, 68, 1038, 1042, 68, 1037,
+ 1039, 1041, 68, 1040, 68, 1036, 68, 68, 68, 68,
+ 68, 68, 1051, 68, 68, 68, 1054, 1045, 1044, 1053,
+ 1048, 1047, 68, 68, 1046, 68, 1059, 68, 1050, 1052,
+ 1055, 68, 1056, 1061, 1049, 1057, 68, 68, 68, 1064,
- 68, 68, 68, 1059, 1065, 68, 1060, 1062, 1063, 68,
- 1066, 68, 68, 68, 1067, 1073, 1068, 1071, 1064, 1072,
- 68, 1069, 1070, 68, 68, 1075, 68, 1078, 68, 68,
- 1074, 68, 68, 1082, 68, 68, 1076, 1081, 1083, 68,
- 1079, 1084, 68, 1086, 68, 1077, 68, 1080, 1085, 68,
- 68, 68, 68, 68, 1088, 68, 68, 68, 1087, 1089,
- 1092, 1098, 1093, 1090, 1097, 68, 68, 1091, 68, 68,
- 68, 68, 1096, 1102, 68, 1094, 1095, 1104, 68, 1105,
- 68, 68, 1107, 68, 68, 1106, 1108, 68, 1100, 1099,
- 1101, 1103, 1109, 1111, 68, 1113, 68, 68, 68, 68,
+ 1058, 68, 1062, 1060, 68, 68, 68, 1063, 1066, 1068,
+ 1065, 68, 68, 1072, 1067, 68, 68, 68, 68, 1069,
+ 68, 68, 68, 68, 1076, 68, 1077, 1078, 1079, 1070,
+ 68, 1071, 1073, 1074, 1080, 68, 68, 1075, 1083, 68,
+ 68, 68, 1089, 1085, 68, 68, 68, 68, 68, 68,
+ 1082, 1093, 68, 1081, 1084, 1092, 1086, 1087, 1090, 68,
+ 1088, 68, 1094, 1095, 68, 68, 1091, 1097, 68, 68,
+ 1096, 68, 68, 68, 1099, 68, 68, 1098, 68, 68,
+ 1100, 1103, 1108, 68, 1101, 1109, 68, 1104, 1102, 68,
+ 68, 68, 1113, 68, 1107, 1106, 68, 1115, 68, 68,
- 1114, 1115, 1110, 68, 68, 68, 68, 68, 68, 68,
- 1125, 68, 68, 68, 1127, 1116, 1117, 1118, 68, 1112,
- 68, 68, 1119, 1123, 1120, 1121, 68, 1122, 68, 1124,
- 1129, 1130, 68, 1131, 68, 1132, 68, 1135, 1126, 68,
- 1128, 68, 68, 1133, 1139, 68, 68, 1138, 68, 68,
- 1142, 68, 1134, 68, 1144, 1141, 68, 1137, 1143, 68,
- 68, 68, 68, 1147, 68, 1136, 1140, 68, 1150, 68,
- 68, 1146, 68, 68, 1156, 68, 1145, 68, 1154, 1148,
- 68, 68, 1155, 1152, 1151, 1153, 1159, 68, 1149, 1162,
- 68, 1157, 1163, 68, 68, 1161, 1158, 1164, 1160, 1166,
+ 1105, 1116, 68, 1117, 1118, 68, 68, 1110, 1111, 68,
+ 68, 1112, 1120, 1119, 1122, 68, 1114, 68, 68, 68,
+ 1124, 68, 1126, 1121, 68, 1125, 68, 68, 68, 68,
+ 68, 1123, 1134, 1136, 68, 1131, 68, 68, 1127, 1128,
+ 1129, 68, 1138, 68, 68, 1130, 1141, 68, 1132, 1133,
+ 68, 1135, 1140, 68, 68, 68, 1146, 1139, 68, 1142,
+ 1143, 68, 1137, 1144, 68, 1150, 68, 68, 1153, 1149,
+ 68, 1154, 68, 68, 1152, 68, 1145, 1148, 68, 68,
+ 1155, 68, 68, 68, 1147, 1159, 1151, 1156, 68, 68,
+ 1162, 68, 68, 1158, 68, 68, 68, 1168, 68, 1157,
- 68, 1165, 68, 1169, 68, 68, 68, 68, 68, 68,
- 1171, 68, 1168, 1174, 68, 1176, 1167, 1170, 68, 1172,
- 68, 68, 68, 1179, 1178, 68, 1177, 1180, 68, 1181,
- 68, 68, 68, 1175, 1173, 68, 68, 1183, 1185, 68,
- 1184, 1187, 68, 68, 68, 1182, 1190, 68, 1186, 68,
- 68, 68, 68, 68, 1188, 1189, 1195, 68, 1192, 68,
- 1197, 68, 1196, 127, 1191, 68, 68, 1198, 1193, 68,
- 1194, 68, 1199, 1204, 68, 1202, 1205, 1201, 1203, 68,
- 1207, 68, 68, 1200, 1210, 68, 68, 1209, 1211, 68,
- 68, 68, 68, 1206, 68, 1214, 68, 1212, 1208, 125,
+ 128, 1160, 1166, 68, 1167, 68, 1163, 1171, 68, 1165,
+ 1174, 1164, 68, 68, 1161, 68, 1169, 1175, 68, 68,
+ 1178, 1170, 68, 1176, 1172, 68, 1173, 1177, 68, 1181,
+ 68, 1180, 68, 68, 68, 1186, 1183, 68, 1188, 1179,
+ 68, 68, 1182, 68, 68, 1184, 68, 1185, 126, 1190,
+ 68, 1191, 68, 1189, 1192, 68, 1193, 68, 1195, 1187,
+ 68, 68, 68, 68, 1194, 1196, 68, 1197, 1199, 68,
+ 68, 1198, 1202, 68, 68, 68, 68, 68, 1200, 68,
+ 68, 1201, 1208, 1204, 1207, 68, 1209, 68, 68, 1211,
+ 1203, 68, 68, 1205, 68, 1206, 1214, 1213, 68, 1210,
- 68, 1215, 68, 68, 68, 68, 68, 68, 68, 1224,
- 68, 1213, 1217, 1223, 1218, 1219, 68, 1216, 68, 1220,
- 1228, 68, 68, 68, 68, 1221, 1222, 1226, 1225, 1230,
- 1227, 68, 68, 1231, 68, 68, 68, 1232, 1236, 1233,
- 68, 1234, 68, 68, 68, 1237, 1240, 68, 1229, 68,
- 1239, 1243, 68, 68, 68, 1235, 68, 1244, 68, 1241,
- 1245, 1238, 68, 1247, 1249, 1246, 1248, 68, 68, 1242,
- 68, 68, 68, 68, 68, 1252, 1250, 1253, 68, 68,
- 1251, 68, 68, 68, 1254, 1257, 68, 1258, 1262, 68,
- 1256, 68, 1261, 1255, 68, 1263, 68, 1259, 1264, 68,
+ 1212, 1215, 1216, 68, 68, 1219, 68, 1221, 68, 1217,
+ 68, 68, 1218, 1222, 1223, 68, 68, 68, 1226, 68,
+ 68, 1220, 68, 1224, 68, 68, 68, 68, 1225, 1227,
+ 68, 68, 68, 68, 1229, 68, 1230, 1231, 1235, 68,
+ 1228, 1232, 68, 68, 1236, 1243, 1239, 1233, 1238, 1237,
+ 1234, 1240, 68, 68, 68, 68, 68, 68, 1242, 1244,
+ 1245, 1241, 1248, 68, 68, 68, 68, 68, 1249, 1253,
+ 68, 68, 1250, 68, 1246, 68, 1256, 1247, 68, 68,
+ 1252, 68, 68, 1257, 1251, 68, 1254, 1258, 68, 68,
+ 68, 1259, 1262, 1255, 1264, 68, 68, 1260, 1263, 68,
- 1266, 68, 68, 1260, 1269, 68, 1267, 1268, 68, 68,
- 1265, 1272, 68, 1274, 68, 68, 1270, 68, 1273, 68,
- 1275, 68, 1271, 1279, 68, 68, 1278, 1276, 68, 68,
- 68, 68, 68, 1281, 68, 1277, 1284, 68, 1287, 68,
- 68, 68, 68, 68, 1288, 1283, 1290, 68, 1286, 1289,
- 1280, 68, 1282, 68, 68, 1285, 68, 68, 1299, 68,
- 68, 68, 1292, 1300, 68, 68, 1297, 68, 1291, 1315,
- 1293, 68, 1295, 1383, 1301, 1294, 68, 1296, 1298, 1302,
- 1303, 68, 1304, 1305, 68, 1306, 68, 1308, 68, 1307,
- 1309, 68, 1310, 68, 68, 1312, 68, 1313, 68, 68,
+ 1261, 1265, 68, 68, 1266, 68, 68, 68, 1267, 68,
+ 68, 1270, 1271, 68, 68, 1275, 68, 68, 1280, 1269,
+ 1277, 68, 1268, 1274, 1272, 68, 1276, 68, 68, 1278,
+ 68, 1279, 1273, 1282, 68, 68, 1283, 68, 1281, 1285,
+ 68, 1287, 68, 68, 1286, 68, 1288, 68, 68, 1289,
+ 1284, 68, 1291, 1292, 68, 68, 1294, 68, 68, 68,
+ 68, 1290, 68, 1297, 1300, 68, 1301, 68, 68, 68,
+ 68, 68, 1296, 1293, 1303, 68, 1299, 1298, 1295, 68,
+ 68, 68, 1302, 68, 1312, 68, 1751, 68, 68, 1305,
+ 1313, 68, 68, 1310, 1304, 1307, 68, 1328, 1306, 1308,
- 1316, 68, 68, 1318, 68, 68, 68, 68, 68, 1322,
- 1321, 68, 1320, 1311, 1324, 68, 1326, 68, 1314, 68,
- 68, 1317, 68, 1319, 1323, 68, 1329, 1330, 68, 68,
- 1325, 1332, 68, 68, 1334, 1328, 68, 68, 68, 68,
- 68, 68, 1327, 1337, 1331, 1335, 68, 68, 68, 1336,
- 68, 1341, 68, 1339, 68, 1333, 1343, 68, 1347, 1344,
- 1346, 68, 1340, 1342, 1338, 68, 1345, 68, 1350, 1351,
- 1349, 68, 1352, 68, 68, 68, 68, 1348, 68, 1357,
- 1353, 68, 68, 68, 1355, 68, 1358, 68, 1354, 68,
- 1356, 1360, 68, 1361, 68, 68, 1363, 1362, 68, 1364,
+ 1309, 1314, 68, 1317, 1311, 1315, 1318, 68, 68, 1316,
+ 1319, 68, 1321, 68, 1322, 68, 1323, 68, 68, 1325,
+ 68, 1320, 1326, 68, 68, 1329, 68, 68, 1331, 68,
+ 68, 68, 68, 68, 1334, 68, 1335, 1324, 1333, 1337,
+ 68, 68, 68, 1327, 1340, 68, 1330, 68, 1332, 68,
+ 68, 1336, 1339, 1343, 1344, 68, 1338, 1346, 68, 68,
+ 68, 1348, 1342, 68, 68, 1341, 68, 68, 68, 1345,
+ 68, 1351, 1349, 68, 68, 68, 1350, 68, 1355, 68,
+ 68, 1353, 1360, 1751, 1357, 1347, 1358, 68, 68, 1356,
+ 68, 1354, 1352, 1359, 1361, 68, 1364, 1363, 1365, 68,
- 68, 1367, 1359, 1365, 1366, 68, 68, 68, 68, 1368,
- 1369, 1370, 68, 1371, 68, 68, 68, 1377, 1372, 1374,
- 1373, 1376, 68, 68, 68, 68, 1381, 68, 68, 1378,
- 1380, 68, 68, 1384, 1375, 1382, 1385, 68, 68, 68,
- 1379, 1387, 68, 1386, 1388, 68, 1389, 68, 1390, 68,
- 1392, 68, 1394, 68, 1393, 1391, 1395, 68, 68, 1398,
- 68, 68, 68, 68, 68, 1400, 68, 1399, 1403, 68,
- 68, 1402, 68, 1397, 68, 1396, 1404, 68, 1401, 1405,
- 68, 68, 1406, 68, 68, 68, 1408, 1413, 68, 1411,
- 1407, 68, 68, 1409, 68, 1410, 68, 68, 68, 68,
+ 1362, 68, 1366, 68, 68, 68, 68, 68, 68, 1371,
+ 1367, 68, 1372, 1369, 1368, 1374, 68, 1370, 1375, 68,
+ 68, 1377, 68, 68, 68, 1376, 68, 1381, 1373, 68,
+ 1384, 68, 68, 1382, 1378, 1383, 68, 1379, 68, 68,
+ 68, 1385, 68, 1380, 1388, 68, 1391, 68, 68, 1751,
+ 1390, 68, 68, 1387, 1392, 1395, 68, 1394, 1386, 68,
+ 68, 1397, 1389, 1393, 1396, 68, 1398, 1399, 68, 68,
+ 1401, 68, 1402, 68, 1400, 1403, 68, 1404, 68, 68,
+ 68, 68, 1410, 68, 1409, 68, 1407, 68, 68, 68,
+ 1413, 68, 68, 68, 1405, 1408, 68, 1414, 1415, 68,
- 1414, 68, 68, 68, 68, 1412, 68, 1422, 1423, 1417,
- 1424, 68, 1419, 68, 1416, 1425, 68, 1420, 1415, 68,
- 68, 1418, 68, 1421, 1426, 68, 68, 1433, 1428, 1430,
- 68, 1427, 1434, 68, 68, 68, 68, 1436, 68, 1429,
- 68, 68, 1431, 1432, 1435, 1442, 68, 1443, 68, 1437,
- 68, 68, 68, 68, 1438, 68, 1439, 1440, 68, 1441,
- 68, 1451, 68, 1450, 68, 1445, 1444, 68, 68, 68,
- 1446, 68, 1454, 1447, 1448, 1455, 68, 68, 1449, 1452,
- 1457, 68, 1456, 1459, 68, 1453, 1460, 68, 68, 1461,
- 1458, 68, 68, 68, 68, 68, 68, 1464, 1465, 1462,
+ 68, 1406, 1418, 68, 1412, 1417, 1411, 1416, 1419, 68,
+ 1420, 68, 68, 68, 68, 68, 68, 1422, 68, 1428,
+ 68, 1426, 68, 68, 1421, 1423, 1424, 1425, 68, 68,
+ 68, 1429, 68, 68, 68, 68, 68, 68, 1427, 68,
+ 1437, 1438, 1432, 1439, 68, 68, 1434, 68, 1431, 1430,
+ 68, 1435, 1440, 68, 1433, 68, 1436, 1441, 68, 1445,
+ 68, 1443, 68, 1442, 68, 1448, 68, 1444, 1449, 68,
+ 68, 1450, 68, 1451, 68, 1446, 1447, 68, 1453, 68,
+ 1457, 68, 1458, 68, 68, 1452, 68, 68, 68, 68,
+ 1454, 68, 1459, 1455, 1465, 1466, 68, 68, 1456, 1460,
- 1463, 68, 68, 1467, 68, 1474, 1469, 1470, 1472, 68,
- 68, 1468, 68, 1466, 1473, 68, 68, 1475, 68, 1471,
- 1476, 68, 1477, 68, 1478, 1481, 68, 68, 68, 68,
- 1479, 68, 1480, 1482, 68, 68, 1483, 68, 1486, 1484,
- 68, 68, 68, 1485, 68, 1491, 68, 68, 68, 68,
- 1489, 1490, 68, 1488, 68, 1487, 1492, 1496, 68, 1498,
- 68, 68, 68, 1497, 68, 1493, 68, 1500, 1494, 1499,
- 68, 1495, 68, 1501, 68, 1504, 1505, 68, 68, 1502,
- 68, 1507, 1730, 68, 68, 1503, 1508, 1509, 68, 1510,
- 68, 68, 1506, 1511, 68, 1514, 1512, 1517, 1513, 68,
+ 68, 68, 1461, 68, 68, 1469, 1462, 1463, 1470, 1464,
+ 1471, 68, 1467, 1473, 68, 68, 1472, 68, 1468, 1475,
+ 68, 1476, 68, 68, 1477, 68, 68, 68, 68, 68,
+ 1480, 68, 1481, 68, 1474, 1479, 68, 1483, 1485, 1478,
+ 68, 1486, 1488, 68, 1489, 68, 1484, 1482, 1490, 68,
+ 1492, 68, 68, 68, 1491, 1487, 1493, 68, 1494, 68,
+ 68, 68, 68, 68, 1495, 68, 1496, 1498, 1497, 68,
+ 1499, 68, 68, 68, 1500, 1502, 68, 1501, 68, 68,
+ 1507, 68, 68, 68, 68, 1505, 1504, 1506, 68, 1503,
+ 1508, 1512, 68, 1513, 1514, 68, 68, 68, 68, 68,
- 68, 1515, 68, 1516, 1518, 68, 68, 68, 68, 68,
- 68, 1521, 1525, 68, 68, 68, 68, 1529, 68, 68,
- 1530, 68, 1519, 1520, 1524, 1522, 1527, 68, 1523, 68,
- 68, 68, 1532, 1526, 1528, 68, 68, 1531, 68, 1538,
- 1535, 68, 1540, 68, 68, 68, 68, 68, 1541, 1533,
- 1730, 68, 68, 68, 1542, 1536, 1534, 68, 1537, 1539,
- 1543, 1544, 1545, 1546, 68, 68, 1549, 68, 68, 1548,
- 68, 1547, 68, 1551, 68, 68, 1550, 1553, 1557, 1552,
- 1555, 68, 68, 68, 1559, 68, 68, 68, 1562, 68,
- 1563, 68, 1556, 1554, 68, 68, 68, 68, 68, 68,
+ 68, 1509, 1516, 1510, 1515, 68, 68, 1511, 1517, 1519,
+ 1751, 1518, 68, 1521, 68, 1520, 1522, 68, 68, 1524,
+ 68, 1526, 68, 1525, 1527, 68, 1523, 1528, 68, 68,
+ 1531, 68, 1529, 1532, 68, 68, 68, 1534, 68, 1535,
+ 1533, 68, 68, 1530, 68, 68, 1538, 68, 1542, 68,
+ 68, 68, 68, 68, 1546, 1536, 1537, 68, 1547, 1544,
+ 1539, 1541, 68, 68, 68, 1540, 68, 68, 1549, 1543,
+ 68, 1545, 68, 68, 68, 1555, 1552, 68, 1548, 1557,
+ 68, 68, 68, 1559, 1550, 1558, 68, 68, 68, 68,
+ 1553, 68, 1551, 1554, 68, 1556, 1562, 1560, 1563, 1561,
- 1564, 1560, 1561, 1568, 1567, 68, 1558, 1570, 68, 68,
- 1565, 1572, 68, 68, 1566, 68, 1574, 68, 1571, 68,
- 1573, 68, 1576, 1569, 68, 1575, 68, 1577, 1579, 68,
- 68, 1578, 1580, 68, 1584, 68, 1582, 68, 1581, 68,
- 68, 68, 1585, 1589, 1587, 68, 1583, 68, 68, 1592,
- 68, 1593, 68, 68, 1598, 68, 1730, 1586, 1595, 1588,
- 1594, 1596, 1590, 1591, 68, 1599, 68, 1600, 68, 1597,
- 68, 1602, 68, 68, 1603, 1601, 1604, 68, 68, 1606,
- 68, 68, 68, 1609, 68, 68, 1607, 1605, 68, 68,
- 1608, 68, 68, 1610, 1611, 68, 68, 1612, 68, 68,
+ 1564, 68, 68, 1567, 68, 68, 1566, 68, 68, 68,
+ 1569, 68, 68, 1568, 1571, 68, 1565, 1570, 1575, 68,
+ 1573, 1577, 68, 68, 1580, 68, 68, 1574, 1572, 68,
+ 1581, 1578, 68, 68, 1579, 68, 1576, 68, 1582, 68,
+ 1588, 68, 1586, 1585, 68, 1590, 68, 68, 1583, 68,
+ 1592, 68, 1584, 68, 1591, 68, 1595, 68, 68, 1598,
+ 68, 1599, 68, 1589, 68, 1587, 68, 1593, 68, 1603,
+ 68, 1596, 68, 68, 68, 68, 1594, 1608, 1601, 1606,
+ 1597, 68, 68, 1600, 1604, 1611, 68, 68, 1602, 1612,
+ 68, 68, 68, 1605, 1607, 68, 1614, 1616, 1609, 1610,
- 1620, 68, 68, 1618, 1621, 68, 1622, 68, 1614, 1613,
- 1623, 68, 1615, 1616, 68, 1626, 68, 1617, 1624, 1619,
- 68, 1625, 68, 1629, 68, 1630, 68, 68, 68, 68,
- 68, 68, 68, 1637, 68, 1627, 1634, 1635, 1638, 68,
- 1628, 1639, 68, 1632, 1640, 68, 68, 68, 1642, 1636,
- 1633, 1643, 1631, 68, 68, 68, 68, 68, 1641, 1645,
- 68, 68, 68, 68, 68, 1649, 68, 1644, 68, 68,
- 68, 68, 1657, 68, 1646, 1647, 1648, 1651, 68, 1658,
- 68, 1653, 1650, 1659, 1654, 1652, 1656, 68, 68, 68,
- 1663, 68, 1660, 68, 1655, 68, 1667, 1668, 68, 68,
+ 1617, 68, 1618, 68, 1619, 68, 1613, 68, 68, 1615,
+ 1621, 68, 1620, 68, 1622, 1623, 68, 68, 1626, 68,
+ 68, 68, 1624, 1629, 68, 1627, 1625, 68, 68, 1628,
+ 68, 68, 1630, 1631, 68, 68, 68, 1751, 68, 68,
+ 1640, 68, 1632, 1638, 1641, 68, 68, 68, 68, 1633,
+ 1634, 1642, 1635, 1636, 1643, 68, 68, 1637, 68, 1639,
+ 1644, 1645, 68, 1647, 68, 68, 1649, 1650, 68, 1651,
+ 68, 1652, 1646, 68, 68, 68, 68, 68, 1658, 68,
+ 1648, 1655, 1656, 1659, 68, 1660, 68, 68, 1653, 1661,
+ 68, 68, 1663, 1664, 1657, 1654, 68, 68, 68, 1662,
- 68, 68, 68, 1662, 1665, 1661, 68, 1664, 68, 68,
- 1666, 68, 1669, 1670, 68, 68, 68, 1730, 1671, 68,
- 1672, 1677, 1674, 68, 1675, 68, 1680, 1673, 1678, 68,
- 68, 68, 68, 1676, 1679, 1681, 1682, 1683, 1684, 1685,
- 1686, 68, 68, 68, 68, 1690, 68, 68, 1688, 1687,
- 68, 68, 68, 68, 68, 68, 1693, 68, 1697, 68,
- 1692, 68, 1689, 68, 1698, 1691, 1702, 1696, 68, 1700,
- 1703, 1694, 1695, 68, 1699, 68, 1701, 1705, 68, 68,
- 68, 68, 68, 68, 68, 68, 1706, 1707, 1709, 1711,
- 1712, 68, 1704, 68, 68, 1715, 68, 68, 68, 1718,
+ 68, 68, 1666, 68, 68, 68, 68, 68, 1670, 68,
+ 1665, 68, 68, 68, 68, 1678, 68, 1669, 68, 1667,
+ 1672, 1668, 1679, 1680, 1674, 1671, 68, 1675, 1673, 1677,
+ 68, 1681, 68, 1684, 68, 68, 1688, 1676, 68, 68,
+ 1689, 68, 68, 68, 68, 68, 68, 1683, 1685, 68,
+ 1686, 68, 68, 68, 68, 1682, 1690, 1691, 1687, 1698,
+ 1693, 68, 1692, 68, 1695, 1696, 1699, 68, 1694, 68,
+ 1701, 68, 1697, 68, 68, 1706, 1702, 68, 1703, 1704,
+ 68, 68, 1700, 1707, 68, 68, 1705, 1711, 1708, 68,
+ 68, 68, 68, 68, 68, 68, 1709, 68, 1714, 68,
- 1708, 1710, 1719, 68, 68, 1721, 68, 1722, 68, 68,
- 1713, 1720, 1714, 68, 1724, 1716, 1717, 68, 68, 68,
- 1723, 1730, 1725, 1728, 68, 1729, 68, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1726, 1727, 40,
- 40, 40, 40, 40, 40, 40, 45, 45, 45, 45,
- 45, 45, 45, 50, 50, 50, 50, 50, 50, 50,
- 56, 56, 56, 56, 56, 56, 56, 61, 61, 61,
- 61, 61, 61, 61, 71, 71, 1730, 71, 71, 71,
- 71, 124, 124, 1730, 1730, 1730, 124, 124, 126, 126,
- 1730, 1730, 126, 1730, 126, 128, 1730, 1730, 1730, 1730,
+ 68, 1718, 1719, 1713, 1710, 68, 1721, 68, 1712, 1751,
+ 1715, 68, 1717, 1716, 1720, 68, 1722, 68, 1724, 1726,
+ 68, 68, 1723, 68, 68, 68, 1725, 68, 1727, 68,
+ 1728, 68, 1730, 68, 1732, 68, 1733, 68, 1736, 68,
+ 68, 68, 1739, 1729, 1731, 1740, 68, 1751, 68, 1742,
+ 68, 68, 1734, 68, 1735, 1741, 1743, 68, 1737, 1738,
+ 1744, 68, 68, 68, 1749, 68, 1745, 1746, 1750, 68,
+ 1747, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1748, 40, 40, 40, 40, 40, 40, 40,
+ 45, 45, 45, 45, 45, 45, 45, 50, 50, 50,
- 1730, 128, 131, 131, 1730, 1730, 1730, 131, 131, 133,
- 1730, 1730, 1730, 1730, 1730, 133, 135, 135, 1730, 135,
- 135, 135, 135, 72, 72, 1730, 72, 72, 72, 72,
- 13, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730
+ 50, 50, 50, 50, 56, 56, 56, 56, 56, 56,
+ 56, 61, 61, 61, 61, 61, 61, 61, 71, 71,
+ 1751, 71, 71, 71, 71, 125, 125, 1751, 1751, 1751,
+ 125, 125, 127, 127, 1751, 1751, 127, 1751, 127, 129,
+ 1751, 1751, 1751, 1751, 1751, 129, 132, 132, 1751, 1751,
+ 1751, 132, 132, 134, 1751, 1751, 1751, 1751, 1751, 134,
+ 136, 136, 1751, 136, 136, 136, 136, 72, 72, 1751,
+ 72, 72, 72, 72, 13, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751
} ;
-static yyconst flex_int16_t yy_chk[3471] =
+static yyconst flex_int16_t yy_chk[3515] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -1391,381 +1404,387 @@ static yyconst flex_int16_t yy_chk[3471] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
3, 3, 4, 4, 4, 49, 5, 5, 49, 3,
5, 15, 4, 6, 6, 15, 5, 6, 9, 9,
- 9, 153, 33, 6, 7, 7, 7, 7, 9, 7,
+ 9, 154, 33, 6, 7, 7, 7, 7, 9, 7,
10, 10, 10, 44, 44, 7, 8, 8, 8, 8,
- 10, 8, 21, 33, 153, 21, 21, 8, 11, 11,
- 11, 11, 11, 11, 1736, 20, 29, 20, 20, 11,
+ 10, 8, 21, 33, 154, 21, 21, 8, 11, 11,
+ 11, 11, 11, 11, 1757, 20, 29, 20, 20, 11,
20, 29, 24, 21, 25, 20, 24, 28, 11, 12,
12, 12, 12, 12, 12, 74, 22, 22, 74, 25,
12, 69, 28, 30, 22, 69, 24, 26, 26, 12,
- 19, 22, 19, 19, 66, 19, 26, 644, 30, 27,
+ 19, 22, 19, 19, 66, 19, 26, 82, 30, 27,
19, 19, 23, 27, 60, 60, 27, 23, 66, 31,
- 31, 23, 76, 27, 23, 27, 23, 23, 31, 75,
- 32, 32, 34, 75, 31, 32, 37, 37, 31, 37,
- 36, 34, 76, 35, 35, 36, 133, 34, 35, 38,
- 34, 32, 79, 78, 37, 36, 131, 34, 35, 36,
- 36, 35, 90, 38, 39, 39, 79, 90, 38, 39,
+ 31, 23, 38, 27, 23, 27, 23, 23, 31, 82,
+ 32, 32, 35, 35, 31, 32, 38, 35, 31, 36,
+ 119, 38, 37, 37, 36, 37, 78, 35, 39, 39,
+ 35, 32, 34, 39, 36, 100, 119, 34, 36, 36,
+ 37, 34, 100, 55, 78, 55, 55, 34, 55, 63,
- 55, 78, 55, 55, 63, 55, 63, 63, 65, 63,
- 65, 65, 83, 65, 68, 63, 68, 68, 77, 68,
- 80, 77, 81, 82, 68, 71, 86, 71, 71, 85,
- 71, 83, 80, 84, 77, 71, 71, 87, 84, 88,
- 81, 94, 91, 85, 89, 82, 86, 92, 89, 93,
- 92, 84, 97, 92, 93, 87, 91, 88, 95, 96,
- 94, 98, 96, 95, 99, 100, 96, 92, 99, 101,
- 102, 103, 100, 104, 105, 98, 97, 102, 105, 106,
- 107, 108, 101, 95, 103, 107, 109, 110, 111, 107,
- 112, 114, 113, 104, 117, 115, 114, 106, 116, 116,
+ 34, 63, 63, 65, 63, 65, 65, 34, 65, 68,
+ 63, 68, 68, 75, 68, 76, 80, 75, 77, 68,
+ 71, 77, 71, 71, 79, 71, 81, 83, 80, 85,
+ 71, 71, 84, 86, 77, 76, 87, 84, 79, 88,
+ 94, 89, 90, 85, 81, 89, 83, 90, 91, 92,
+ 84, 93, 92, 86, 87, 92, 93, 88, 95, 94,
+ 97, 96, 91, 95, 96, 98, 99, 101, 96, 92,
+ 99, 102, 103, 104, 105, 109, 107, 106, 102, 98,
+ 101, 106, 108, 95, 97, 103, 110, 108, 111, 112,
+ 113, 108, 105, 104, 107, 109, 114, 115, 116, 117,
- 110, 108, 118, 111, 119, 122, 109, 115, 123, 112,
- 113, 120, 117, 120, 188, 121, 188, 122, 118, 116,
- 121, 125, 125, 140, 127, 119, 123, 127, 129, 137,
- 129, 129, 137, 129, 120, 132, 132, 134, 140, 134,
- 134, 135, 134, 135, 135, 138, 135, 141, 139, 142,
- 138, 143, 135, 139, 144, 141, 145, 151, 146, 147,
- 130, 145, 145, 146, 147, 148, 143, 148, 142, 150,
- 150, 154, 152, 155, 144, 154, 151, 152, 155, 156,
- 157, 160, 159, 162, 158, 163, 160, 148, 149, 164,
- 161, 161, 149, 156, 164, 157, 158, 149, 169, 158,
+ 117, 111, 115, 118, 112, 120, 110, 122, 142, 113,
+ 116, 121, 122, 121, 114, 123, 142, 124, 126, 126,
+ 117, 118, 128, 133, 133, 128, 120, 123, 130, 138,
+ 130, 130, 138, 130, 121, 124, 135, 143, 135, 135,
+ 136, 135, 136, 136, 139, 136, 141, 140, 144, 139,
+ 145, 136, 140, 146, 152, 147, 143, 148, 146, 146,
+ 147, 141, 148, 144, 149, 157, 149, 151, 151, 153,
+ 145, 155, 156, 152, 153, 155, 160, 156, 158, 157,
+ 159, 164, 163, 161, 162, 162, 149, 150, 161, 166,
+ 166, 150, 159, 158, 160, 159, 150, 164, 165, 170,
- 159, 163, 149, 162, 165, 165, 166, 167, 149, 149,
- 161, 166, 167, 168, 176, 170, 171, 166, 172, 169,
- 170, 171, 168, 172, 173, 174, 178, 175, 181, 173,
- 177, 179, 174, 175, 176, 180, 177, 182, 184, 179,
- 180, 183, 186, 181, 185, 187, 183, 186, 178, 189,
- 190, 191, 192, 193, 193, 190, 189, 182, 198, 128,
- 184, 194, 185, 185, 192, 187, 194, 195, 197, 196,
- 191, 196, 195, 199, 200, 203, 204, 198, 201, 200,
- 197, 199, 202, 201, 194, 205, 206, 202, 196, 207,
- 203, 212, 207, 205, 204, 208, 208, 209, 210, 210,
+ 167, 150, 163, 165, 162, 167, 169, 150, 150, 168,
+ 176, 167, 171, 172, 168, 169, 173, 171, 172, 174,
+ 170, 173, 175, 176, 174, 177, 178, 179, 180, 175,
+ 181, 177, 182, 179, 183, 184, 185, 182, 181, 186,
+ 187, 185, 188, 189, 194, 191, 178, 188, 193, 183,
+ 180, 190, 191, 190, 651, 184, 194, 192, 187, 187,
+ 200, 186, 192, 189, 195, 195, 196, 193, 197, 199,
+ 201, 196, 198, 197, 198, 202, 206, 203, 201, 200,
+ 202, 199, 203, 204, 205, 207, 208, 209, 204, 196,
+ 209, 198, 214, 207, 206, 210, 210, 211, 215, 205,
- 209, 211, 211, 213, 216, 214, 215, 212, 214, 217,
- 215, 206, 218, 216, 217, 219, 219, 220, 213, 221,
- 222, 223, 220, 224, 221, 225, 218, 226, 226, 227,
- 228, 229, 231, 230, 228, 234, 233, 231, 225, 223,
- 222, 235, 236, 232, 224, 230, 232, 227, 233, 229,
- 235, 237, 234, 238, 239, 234, 239, 239, 240, 240,
- 242, 243, 244, 236, 237, 238, 241, 245, 245, 241,
- 246, 244, 247, 247, 248, 246, 243, 242, 249, 250,
- 242, 251, 252, 253, 255, 256, 251, 258, 253, 248,
- 249, 254, 258, 260, 254, 261, 254, 262, 255, 250,
+ 211, 212, 212, 213, 213, 220, 216, 218, 214, 216,
+ 217, 208, 219, 215, 217, 224, 218, 219, 222, 220,
+ 221, 221, 223, 222, 225, 226, 227, 223, 228, 228,
+ 229, 231, 230, 232, 234, 224, 230, 234, 233, 227,
+ 235, 236, 225, 233, 237, 232, 226, 238, 229, 231,
+ 239, 134, 235, 237, 240, 242, 242, 241, 236, 241,
+ 241, 236, 243, 239, 244, 243, 240, 245, 238, 246,
+ 247, 248, 248, 250, 250, 249, 251, 252, 246, 247,
+ 249, 244, 245, 253, 244, 254, 255, 256, 258, 252,
+ 254, 251, 256, 257, 259, 260, 257, 263, 257, 264,
- 257, 256, 252, 259, 256, 263, 256, 264, 259, 257,
- 264, 265, 262, 267, 260, 261, 269, 270, 271, 263,
- 272, 126, 268, 276, 274, 265, 264, 266, 267, 266,
- 266, 268, 275, 271, 279, 277, 270, 269, 276, 266,
- 272, 266, 266, 266, 273, 280, 266, 274, 278, 273,
- 277, 281, 275, 278, 279, 282, 281, 283, 285, 280,
- 284, 284, 283, 284, 286, 287, 290, 289, 288, 289,
- 290, 282, 291, 292, 293, 294, 301, 301, 285, 297,
- 286, 287, 288, 293, 294, 296, 295, 292, 297, 296,
- 291, 295, 298, 299, 300, 302, 293, 298, 300, 299,
+ 261, 265, 258, 253, 260, 261, 255, 262, 266, 268,
+ 259, 267, 262, 259, 267, 259, 265, 270, 263, 264,
+ 271, 272, 266, 268, 274, 273, 277, 132, 275, 271,
+ 267, 269, 270, 269, 269, 276, 278, 279, 280, 274,
+ 276, 282, 272, 269, 273, 269, 269, 269, 275, 277,
+ 269, 283, 279, 280, 281, 284, 278, 285, 286, 281,
+ 284, 282, 288, 286, 289, 283, 287, 287, 290, 287,
+ 292, 291, 292, 285, 293, 294, 295, 296, 293, 297,
+ 289, 419, 288, 419, 290, 291, 296, 298, 297, 300,
+ 295, 299, 298, 294, 302, 299, 301, 309, 300, 296,
- 302, 303, 304, 304, 305, 306, 307, 308, 309, 305,
- 310, 310, 309, 311, 303, 307, 312, 316, 311, 308,
- 313, 313, 315, 315, 317, 318, 306, 319, 321, 322,
- 323, 324, 317, 328, 318, 326, 325, 312, 316, 319,
- 324, 325, 327, 326, 323, 329, 332, 327, 321, 322,
- 330, 328, 331, 333, 334, 335, 331, 337, 333, 339,
- 340, 332, 338, 340, 339, 341, 349, 329, 343, 339,
- 334, 330, 342, 342, 335, 336, 336, 337, 338, 344,
- 344, 336, 345, 336, 346, 341, 348, 347, 349, 350,
- 351, 336, 352, 343, 350, 353, 346, 345, 355, 351,
+ 302, 301, 303, 304, 304, 305, 303, 306, 307, 307,
+ 305, 308, 310, 311, 315, 312, 308, 319, 309, 312,
+ 306, 310, 313, 313, 314, 311, 316, 316, 320, 314,
+ 318, 318, 321, 322, 323, 315, 320, 325, 319, 326,
+ 327, 321, 328, 329, 330, 331, 323, 332, 329, 333,
+ 331, 328, 330, 322, 327, 334, 335, 325, 336, 326,
+ 335, 337, 338, 339, 342, 332, 337, 341, 345, 343,
+ 347, 333, 344, 336, 343, 344, 334, 131, 338, 343,
+ 342, 349, 339, 340, 340, 346, 346, 341, 345, 340,
+ 350, 340, 348, 348, 352, 347, 349, 351, 353, 340,
- 354, 336, 347, 355, 354, 348, 356, 357, 358, 359,
- 353, 352, 360, 360, 361, 362, 363, 359, 356, 363,
- 364, 358, 366, 368, 124, 357, 361, 362, 365, 367,
- 375, 365, 371, 367, 367, 364, 368, 371, 366, 369,
- 369, 366, 370, 370, 372, 372, 373, 373, 374, 376,
- 378, 375, 377, 374, 376, 378, 377, 379, 380, 381,
- 382, 379, 383, 380, 384, 382, 387, 383, 385, 386,
- 386, 385, 388, 67, 390, 399, 385, 389, 384, 381,
- 385, 399, 389, 390, 387, 391, 388, 392, 391, 393,
- 394, 392, 395, 396, 393, 397, 398, 395, 403, 400,
+ 354, 355, 350, 356, 357, 354, 360, 358, 361, 340,
+ 355, 358, 351, 352, 362, 363, 359, 365, 360, 357,
+ 353, 359, 356, 363, 364, 364, 361, 362, 366, 365,
+ 367, 368, 369, 367, 370, 369, 372, 371, 373, 373,
+ 366, 371, 371, 374, 374, 379, 368, 375, 401, 372,
+ 370, 385, 375, 370, 376, 376, 377, 377, 378, 380,
+ 401, 381, 382, 378, 380, 381, 379, 382, 383, 384,
+ 386, 385, 383, 387, 384, 386, 388, 389, 387, 391,
+ 389, 390, 390, 393, 392, 389, 394, 398, 393, 389,
+ 388, 395, 396, 400, 395, 394, 396, 391, 392, 397,
- 404, 398, 400, 394, 455, 401, 402, 397, 401, 396,
- 405, 402, 455, 392, 404, 405, 403, 406, 407, 409,
- 406, 408, 410, 407, 411, 408, 408, 410, 412, 415,
- 413, 412, 409, 411, 413, 413, 414, 416, 414, 416,
- 417, 418, 419, 420, 422, 421, 412, 423, 415, 421,
- 424, 425, 426, 422, 427, 428, 428, 426, 417, 418,
- 429, 419, 423, 420, 429, 430, 425, 431, 424, 432,
- 433, 434, 431, 427, 435, 436, 430, 438, 439, 437,
- 436, 435, 438, 439, 434, 432, 437, 440, 441, 433,
- 442, 444, 443, 447, 445, 441, 444, 445, 446, 442,
+ 398, 399, 402, 406, 397, 403, 399, 402, 406, 400,
+ 404, 403, 405, 404, 407, 405, 408, 409, 396, 410,
+ 411, 412, 409, 411, 410, 414, 412, 420, 416, 413,
+ 408, 415, 407, 413, 413, 422, 415, 416, 414, 417,
+ 418, 421, 417, 421, 418, 418, 420, 423, 424, 425,
+ 426, 427, 432, 422, 426, 428, 429, 417, 430, 431,
+ 427, 433, 433, 437, 431, 423, 435, 424, 434, 425,
+ 428, 432, 434, 430, 429, 436, 438, 435, 439, 437,
+ 436, 440, 441, 442, 443, 445, 446, 441, 440, 443,
+ 442, 439, 444, 446, 448, 438, 447, 444, 450, 449,
- 448, 448, 446, 449, 453, 440, 443, 452, 451, 448,
- 454, 452, 449, 451, 447, 456, 453, 457, 463, 460,
- 466, 467, 468, 472, 473, 469, 468, 467, 454, 466,
- 469, 471, 478, 456, 460, 463, 471, 474, 475, 475,
- 474, 472, 457, 458, 476, 477, 477, 478, 458, 473,
- 482, 476, 458, 479, 479, 458, 480, 483, 481, 480,
- 484, 487, 458, 481, 485, 458, 470, 470, 470, 482,
- 470, 488, 485, 470, 486, 486, 487, 483, 470, 484,
- 497, 489, 490, 490, 470, 470, 489, 491, 492, 488,
- 494, 493, 491, 492, 493, 495, 494, 496, 497, 498,
+ 452, 450, 451, 445, 449, 447, 451, 454, 448, 453,
+ 453, 457, 456, 458, 459, 457, 454, 456, 453, 460,
+ 461, 452, 462, 468, 465, 458, 471, 460, 472, 473,
+ 478, 474, 459, 473, 472, 471, 474, 476, 461, 465,
+ 468, 477, 476, 479, 480, 480, 479, 462, 463, 481,
+ 482, 482, 129, 463, 483, 478, 481, 463, 487, 477,
+ 463, 484, 484, 485, 488, 518, 485, 463, 489, 483,
+ 463, 475, 475, 475, 486, 475, 492, 487, 475, 486,
+ 490, 491, 491, 475, 488, 493, 518, 489, 490, 475,
+ 475, 492, 494, 495, 495, 496, 497, 494, 499, 498,
- 499, 500, 500, 495, 498, 496, 501, 499, 502, 503,
- 505, 507, 506, 502, 501, 506, 508, 508, 509, 505,
- 510, 512, 513, 510, 514, 507, 515, 513, 503, 516,
- 517, 510, 518, 509, 519, 520, 521, 524, 519, 522,
- 523, 518, 512, 524, 525, 514, 515, 526, 522, 530,
- 517, 516, 527, 520, 523, 521, 529, 527, 528, 531,
- 529, 526, 532, 528, 525, 533, 537, 532, 530, 534,
- 534, 531, 535, 536, 538, 539, 536, 535, 540, 543,
- 539, 541, 541, 545, 537, 546, 533, 538, 542, 542,
- 547, 544, 548, 550, 543, 544, 551, 550, 540, 553,
+ 496, 497, 498, 493, 499, 500, 501, 502, 505, 504,
+ 503, 506, 506, 500, 501, 503, 504, 508, 507, 509,
+ 511, 512, 508, 513, 512, 502, 507, 505, 515, 511,
+ 514, 514, 520, 516, 519, 521, 516, 513, 509, 519,
+ 522, 523, 524, 515, 516, 525, 526, 527, 528, 525,
+ 530, 524, 531, 520, 529, 521, 530, 528, 533, 532,
+ 534, 523, 522, 533, 526, 534, 527, 535, 529, 536,
+ 537, 535, 531, 532, 538, 539, 540, 540, 541, 538,
+ 543, 542, 537, 541, 542, 545, 544, 546, 536, 549,
+ 545, 547, 547, 548, 548, 551, 539, 550, 543, 544,
- 552, 554, 545, 555, 547, 556, 554, 571, 571, 546,
- 61, 551, 548, 549, 553, 558, 549, 555, 549, 556,
- 562, 559, 549, 557, 549, 552, 559, 557, 560, 549,
- 558, 561, 563, 560, 549, 565, 559, 564, 567, 568,
- 565, 562, 569, 564, 568, 561, 563, 566, 566, 570,
- 567, 573, 572, 566, 574, 566, 569, 572, 575, 573,
- 577, 570, 576, 576, 577, 579, 580, 581, 574, 580,
- 579, 582, 584, 566, 583, 587, 585, 575, 586, 583,
- 588, 589, 590, 594, 582, 588, 581, 586, 591, 595,
- 592, 584, 585, 596, 587, 592, 590, 591, 597, 598,
+ 552, 550, 553, 554, 549, 556, 557, 546, 558, 556,
+ 560, 559, 127, 561, 551, 560, 553, 562, 563, 568,
+ 564, 557, 563, 554, 552, 555, 559, 561, 555, 591,
+ 555, 562, 565, 558, 555, 564, 555, 565, 566, 567,
+ 568, 555, 569, 566, 570, 591, 555, 565, 573, 571,
+ 570, 572, 572, 567, 571, 575, 569, 572, 574, 572,
+ 573, 576, 578, 574, 577, 577, 579, 578, 580, 575,
+ 581, 582, 582, 576, 579, 583, 585, 572, 587, 583,
+ 586, 585, 580, 586, 590, 588, 589, 592, 593, 581,
+ 594, 589, 595, 597, 596, 594, 592, 587, 588, 598,
- 599, 589, 594, 597, 598, 599, 600, 595, 596, 601,
- 601, 602, 607, 604, 608, 600, 602, 604, 604, 605,
- 605, 606, 609, 605, 606, 610, 611, 614, 610, 608,
- 612, 613, 607, 614, 615, 612, 613, 616, 617, 617,
- 618, 619, 609, 616, 621, 620, 622, 611, 620, 618,
- 615, 623, 625, 624, 627, 626, 629, 625, 628, 619,
- 626, 628, 621, 630, 631, 622, 624, 629, 632, 631,
- 633, 623, 627, 632, 635, 630, 634, 634, 636, 637,
- 638, 639, 641, 642, 638, 633, 640, 647, 645, 646,
- 674, 637, 636, 635, 674, 640, 652, 656, 648, 639,
+ 600, 602, 597, 590, 598, 601, 603, 593, 596, 604,
+ 605, 603, 595, 606, 604, 605, 602, 607, 607, 600,
+ 608, 609, 606, 601, 611, 608, 612, 612, 611, 611,
+ 612, 614, 613, 615, 609, 613, 616, 617, 618, 619,
+ 617, 620, 622, 621, 619, 626, 620, 623, 615, 621,
+ 628, 614, 625, 623, 624, 624, 616, 627, 622, 618,
+ 627, 625, 629, 626, 630, 631, 632, 633, 628, 634,
+ 635, 632, 633, 635, 636, 638, 637, 639, 631, 640,
+ 638, 629, 639, 642, 630, 636, 643, 634, 637, 641,
+ 641, 644, 645, 646, 640, 647, 645, 648, 649, 652,
- 649, 641, 645, 648, 646, 649, 650, 647, 642, 651,
- 652, 650, 653, 654, 651, 655, 656, 657, 654, 658,
- 659, 659, 660, 661, 662, 666, 653, 663, 663, 661,
- 655, 664, 657, 668, 665, 671, 664, 669, 658, 666,
- 660, 665, 667, 670, 662, 667, 669, 672, 670, 673,
- 675, 668, 672, 678, 671, 676, 677, 679, 680, 675,
- 678, 681, 682, 684, 685, 686, 683, 690, 673, 679,
- 676, 677, 683, 689, 686, 690, 688, 680, 684, 691,
- 682, 688, 681, 692, 685, 693, 694, 689, 692, 693,
- 693, 695, 695, 696, 697, 698, 699, 699, 705, 691,
+ 643, 654, 642, 644, 647, 653, 125, 655, 663, 656,
+ 657, 646, 655, 652, 656, 657, 648, 658, 659, 660,
+ 653, 654, 658, 649, 661, 662, 664, 663, 665, 661,
+ 666, 666, 659, 660, 667, 669, 668, 670, 670, 671,
+ 662, 664, 668, 672, 671, 673, 674, 665, 675, 674,
+ 672, 676, 667, 677, 678, 669, 679, 680, 677, 673,
+ 676, 679, 682, 681, 683, 684, 675, 681, 685, 686,
+ 687, 682, 688, 678, 689, 685, 680, 690, 692, 683,
+ 684, 686, 691, 690, 698, 693, 695, 696, 697, 687,
+ 699, 695, 689, 688, 693, 699, 697, 691, 692, 701,
- 698, 706, 700, 697, 701, 694, 696, 700, 703, 701,
- 702, 702, 705, 704, 712, 707, 708, 703, 704, 706,
- 707, 708, 709, 711, 710, 712, 714, 709, 710, 715,
- 714, 716, 711, 718, 719, 723, 721, 711, 717, 711,
- 720, 711, 717, 717, 715, 722, 725, 718, 720, 716,
- 721, 724, 724, 719, 726, 726, 728, 729, 730, 728,
- 723, 725, 729, 722, 731, 731, 732, 733, 733, 734,
- 735, 735, 736, 737, 734, 738, 739, 730, 737, 740,
- 740, 739, 741, 738, 742, 56, 732, 743, 745, 750,
- 742, 746, 736, 745, 743, 749, 746, 747, 748, 751,
+ 703, 696, 700, 704, 698, 705, 700, 700, 702, 702,
+ 705, 707, 704, 703, 706, 706, 707, 708, 701, 709,
+ 709, 710, 708, 711, 712, 713, 714, 715, 711, 716,
+ 710, 714, 715, 717, 716, 718, 720, 717, 712, 719,
+ 719, 722, 723, 713, 718, 722, 724, 720, 726, 718,
+ 725, 718, 727, 718, 725, 725, 729, 723, 728, 730,
+ 731, 733, 726, 738, 724, 67, 728, 732, 732, 737,
+ 729, 727, 734, 734, 737, 736, 733, 730, 736, 739,
+ 739, 740, 738, 741, 741, 731, 742, 743, 743, 744,
+ 745, 742, 746, 747, 749, 745, 748, 748, 747, 750,
- 741, 753, 747, 748, 749, 752, 752, 754, 750, 755,
- 751, 756, 757, 761, 755, 758, 759, 760, 760, 762,
- 763, 753, 765, 764, 766, 756, 51, 758, 764, 766,
- 754, 756, 757, 761, 759, 768, 777, 769, 763, 768,
- 768, 770, 772, 775, 762, 765, 769, 773, 771, 770,
- 771, 774, 773, 776, 775, 774, 772, 778, 779, 780,
- 781, 782, 777, 779, 783, 782, 784, 785, 786, 787,
- 788, 789, 776, 791, 792, 778, 789, 780, 791, 790,
- 781, 785, 783, 786, 787, 784, 790, 793, 794, 788,
- 796, 795, 792, 797, 798, 799, 793, 795, 797, 798,
+ 746, 740, 753, 751, 758, 750, 754, 753, 755, 744,
+ 751, 754, 749, 755, 756, 757, 759, 760, 760, 756,
+ 761, 762, 764, 758, 757, 763, 765, 759, 769, 766,
+ 763, 767, 768, 768, 770, 771, 764, 773, 772, 61,
+ 761, 766, 764, 772, 762, 774, 765, 776, 769, 767,
+ 774, 776, 776, 771, 777, 779, 778, 779, 780, 770,
+ 773, 781, 783, 777, 778, 782, 781, 784, 785, 782,
+ 786, 787, 780, 783, 788, 789, 787, 790, 791, 792,
+ 798, 790, 796, 793, 794, 795, 784, 798, 786, 804,
+ 802, 800, 788, 56, 785, 789, 791, 793, 792, 794,
- 799, 800, 800, 794, 802, 802, 803, 804, 805, 806,
- 807, 796, 804, 809, 807, 807, 808, 808, 810, 811,
- 812, 813, 805, 815, 803, 814, 819, 813, 806, 816,
- 814, 817, 809, 818, 820, 846, 821, 810, 846, 812,
- 819, 823, 815, 822, 822, 811, 823, 825, 816, 824,
- 817, 821, 818, 824, 826, 820, 827, 829, 827, 833,
- 825, 831, 827, 826, 830, 830, 831, 832, 834, 836,
- 849, 832, 850, 834, 858, 827, 838, 829, 858, 833,
- 840, 838, 839, 839, 848, 840, 850, 836, 842, 842,
- 844, 844, 847, 847, 852, 849, 851, 853, 853, 848,
+ 795, 796, 797, 799, 801, 802, 803, 797, 799, 800,
+ 804, 805, 803, 801, 806, 807, 805, 808, 808, 806,
+ 807, 810, 810, 811, 812, 813, 814, 815, 817, 812,
+ 818, 815, 815, 816, 816, 819, 820, 821, 823, 813,
+ 824, 811, 827, 821, 825, 814, 822, 817, 826, 818,
+ 828, 822, 838, 829, 831, 820, 827, 823, 833, 824,
+ 834, 819, 833, 825, 830, 830, 831, 826, 829, 832,
+ 835, 828, 838, 834, 832, 836, 842, 836, 51, 835,
+ 840, 836, 839, 839, 841, 840, 843, 845, 841, 857,
+ 847, 843, 848, 848, 836, 847, 842, 849, 851, 851,
- 854, 851, 855, 855, 856, 857, 859, 860, 863, 852,
- 862, 866, 860, 864, 864, 867, 857, 869, 865, 871,
- 854, 868, 863, 865, 871, 859, 856, 870, 862, 870,
- 868, 866, 873, 872, 874, 867, 875, 869, 872, 874,
- 876, 876, 877, 879, 880, 880, 881, 888, 877, 882,
- 875, 50, 873, 883, 886, 884, 883, 885, 881, 883,
- 884, 887, 885, 886, 892, 889, 887, 879, 889, 882,
- 890, 883, 888, 891, 891, 890, 893, 894, 895, 896,
- 897, 898, 892, 895, 896, 900, 898, 899, 899, 901,
- 900, 902, 903, 905, 904, 893, 906, 894, 908, 907,
+ 853, 853, 849, 855, 857, 845, 855, 856, 856, 858,
+ 859, 860, 861, 862, 862, 863, 860, 864, 864, 865,
+ 866, 867, 871, 868, 859, 867, 875, 861, 869, 872,
+ 876, 866, 878, 869, 858, 863, 873, 873, 877, 874,
+ 871, 865, 868, 872, 874, 882, 875, 877, 880, 879,
+ 876, 879, 878, 880, 881, 883, 884, 885, 885, 881,
+ 883, 886, 888, 889, 889, 882, 890, 886, 891, 892,
+ 884, 893, 892, 895, 894, 892, 893, 897, 890, 894,
+ 896, 898, 895, 901, 898, 896, 888, 892, 891, 899,
+ 900, 900, 902, 903, 899, 904, 906, 910, 905, 907,
- 909, 910, 913, 897, 907, 905, 914, 901, 904, 906,
- 912, 902, 903, 914, 915, 912, 916, 913, 908, 922,
- 909, 924, 910, 915, 919, 919, 915, 920, 921, 923,
- 920, 929, 916, 921, 925, 922, 926, 927, 923, 930,
- 924, 931, 927, 925, 932, 926, 925, 928, 928, 933,
- 934, 929, 930, 935, 935, 936, 937, 939, 932, 931,
- 940, 937, 938, 938, 943, 942, 939, 944, 934, 939,
- 942, 936, 944, 945, 933, 946, 947, 938, 940, 945,
- 948, 947, 943, 949, 953, 954, 949, 955, 952, 956,
- 958, 957, 949, 948, 956, 946, 952, 953, 960, 966,
+ 904, 901, 897, 905, 907, 908, 908, 909, 911, 912,
+ 913, 902, 909, 903, 914, 910, 916, 915, 917, 906,
+ 918, 916, 919, 925, 913, 50, 914, 921, 911, 912,
+ 915, 922, 921, 924, 923, 928, 928, 933, 917, 925,
+ 918, 923, 924, 919, 929, 924, 922, 929, 930, 931,
+ 932, 934, 935, 930, 937, 937, 933, 936, 938, 932,
+ 934, 935, 936, 934, 939, 931, 940, 941, 942, 943,
+ 944, 945, 945, 946, 947, 948, 948, 939, 938, 947,
+ 942, 941, 950, 949, 940, 953, 952, 956, 944, 946,
+ 948, 952, 949, 954, 943, 949, 955, 958, 954, 957,
- 961, 969, 967, 954, 961, 962, 955, 957, 958, 963,
- 962, 964, 965, 971, 963, 969, 964, 967, 960, 968,
- 968, 965, 966, 970, 972, 971, 973, 974, 975, 976,
- 970, 977, 974, 978, 978, 979, 972, 977, 979, 982,
- 975, 980, 980, 983, 983, 973, 984, 976, 982, 985,
- 986, 987, 988, 990, 985, 989, 991, 992, 984, 986,
- 989, 994, 990, 987, 993, 993, 994, 988, 995, 996,
- 997, 999, 992, 998, 998, 990, 991, 1000, 1000, 1001,
- 1001, 1002, 1003, 1004, 1007, 1002, 1004, 1003, 996, 995,
- 997, 999, 1006, 1008, 1009, 1010, 1010, 1006, 1008, 1011,
+ 950, 962, 955, 953, 957, 959, 963, 956, 959, 962,
+ 958, 964, 965, 966, 959, 968, 967, 970, 966, 963,
+ 971, 972, 973, 974, 971, 975, 972, 973, 974, 964,
+ 976, 965, 967, 968, 975, 977, 980, 970, 978, 978,
+ 979, 983, 984, 980, 981, 982, 985, 984, 986, 987,
+ 977, 988, 988, 976, 979, 987, 981, 982, 985, 989,
+ 983, 992, 989, 990, 990, 994, 986, 993, 993, 995,
+ 992, 996, 997, 998, 995, 1001, 999, 994, 1000, 1002,
+ 996, 999, 1003, 1003, 997, 1004, 1005, 1000, 998, 1006,
+ 1004, 1007, 1008, 1008, 1002, 1001, 1009, 1010, 1010, 1012,
- 1011, 1012, 1007, 1013, 1014, 1015, 1012, 1016, 1018, 1017,
- 1019, 1019, 1020, 1021, 1021, 1013, 1013, 1013, 1026, 1009,
- 1022, 1024, 1013, 1017, 1014, 1015, 1029, 1016, 1027, 1018,
- 1024, 1025, 1025, 1026, 1028, 1027, 1030, 1030, 1020, 1031,
- 1022, 1032, 1034, 1028, 1035, 1040, 1036, 1034, 1037, 1035,
- 1038, 1038, 1029, 1039, 1040, 1037, 1041, 1032, 1039, 1042,
- 1043, 1044, 1045, 1043, 1048, 1031, 1036, 1046, 1046, 1047,
- 1049, 1042, 1050, 1051, 1052, 1052, 1041, 1055, 1050, 1044,
- 1053, 1056, 1051, 1048, 1047, 1049, 1054, 1054, 1045, 1057,
- 1061, 1053, 1058, 1058, 1057, 1056, 1053, 1059, 1055, 1060,
+ 1000, 1011, 1011, 1012, 1013, 1017, 1019, 1005, 1006, 1013,
+ 1014, 1007, 1016, 1014, 1018, 1024, 1009, 1016, 1027, 1018,
+ 1020, 1020, 1022, 1017, 1021, 1021, 1023, 1022, 1025, 1026,
+ 1028, 1019, 1027, 1029, 1029, 1024, 1030, 1032, 1023, 1023,
+ 1023, 1031, 1031, 1034, 1036, 1023, 1035, 1035, 1025, 1026,
+ 1039, 1028, 1034, 1037, 1038, 1040, 1040, 1032, 1041, 1036,
+ 1037, 1042, 1030, 1038, 1044, 1045, 1046, 1047, 1048, 1044,
+ 1045, 1049, 1049, 1048, 1047, 1050, 1039, 1042, 1051, 1052,
+ 1050, 1053, 1054, 1055, 1041, 1054, 1046, 1051, 1056, 1057,
+ 1057, 1058, 1059, 1053, 1060, 1062, 1061, 1063, 1063, 1052,
- 1062, 1059, 1059, 1063, 1060, 1064, 1065, 1066, 1063, 1067,
- 1065, 1069, 1062, 1068, 1071, 1070, 1061, 1064, 1068, 1066,
- 1070, 1073, 1074, 1074, 1073, 1077, 1071, 1075, 1075, 1076,
- 1076, 1078, 1080, 1069, 1067, 1079, 1083, 1078, 1080, 1081,
- 1079, 1083, 1085, 1087, 1089, 1077, 1088, 1088, 1081, 1090,
- 1091, 1092, 1093, 1096, 1085, 1087, 1093, 1094, 1090, 1099,
- 1095, 1106, 1094, 45, 1089, 1095, 1100, 1096, 1091, 1101,
- 1092, 1098, 1098, 1103, 1103, 1100, 1106, 1099, 1101, 1107,
- 1108, 1109, 1111, 1098, 1111, 1108, 1110, 1110, 1112, 1112,
- 1114, 1115, 1117, 1107, 1116, 1116, 1118, 1114, 1109, 40,
+ 45, 1055, 1061, 1066, 1062, 1064, 1058, 1065, 1065, 1060,
+ 1068, 1059, 1067, 1072, 1056, 1068, 1064, 1069, 1069, 1073,
+ 1071, 1064, 1078, 1070, 1066, 1071, 1067, 1070, 1070, 1074,
+ 1075, 1073, 1076, 1077, 1074, 1079, 1076, 1080, 1081, 1072,
+ 1079, 1082, 1075, 1081, 1088, 1077, 1084, 1078, 40, 1084,
+ 1085, 1085, 1089, 1082, 1086, 1086, 1087, 1087, 1089, 1080,
+ 1090, 1091, 1092, 1094, 1088, 1090, 1096, 1091, 1094, 1098,
+ 1100, 1092, 1099, 1099, 1101, 1102, 1103, 1105, 1096, 1110,
+ 1104, 1098, 1105, 1101, 1104, 1107, 1106, 1111, 1109, 1109,
+ 1100, 1106, 1112, 1102, 1117, 1103, 1111, 1110, 1118, 1107,
- 1119, 1117, 1120, 1121, 1122, 1123, 1124, 1127, 1126, 1127,
- 1128, 1115, 1119, 1126, 1120, 1121, 1131, 1118, 1129, 1122,
- 1132, 1132, 1133, 1138, 1134, 1123, 1124, 1129, 1128, 1134,
- 1131, 1135, 1136, 1135, 1137, 1139, 1144, 1136, 1140, 1137,
- 1141, 1138, 1143, 1140, 1146, 1141, 1145, 1145, 1133, 1147,
- 1144, 1148, 1149, 1151, 1152, 1139, 1148, 1149, 1150, 1146,
- 1150, 1143, 1153, 1152, 1153, 1151, 1152, 1154, 1155, 1147,
- 1157, 1160, 1158, 1161, 1162, 1157, 1154, 1158, 1168, 1164,
- 1155, 1166, 1167, 1169, 1160, 1164, 1171, 1166, 1170, 1170,
- 1162, 1173, 1169, 1161, 1176, 1171, 1174, 1167, 1172, 1172,
+ 1109, 1112, 1114, 1114, 1120, 1119, 1121, 1121, 1126, 1117,
+ 1119, 1122, 1118, 1122, 1123, 1123, 1125, 1127, 1127, 1129,
+ 1128, 1120, 1130, 1125, 1131, 1132, 1133, 1134, 1126, 1128,
+ 1135, 1139, 1142, 1137, 1130, 1144, 1131, 1132, 1137, 1140,
+ 1129, 1133, 1138, 1146, 1138, 1146, 1142, 1134, 1140, 1139,
+ 1135, 1143, 1143, 1145, 1147, 1148, 1149, 1150, 1145, 1147,
+ 1148, 1144, 1151, 1152, 1153, 1155, 1156, 1151, 1152, 1157,
+ 1157, 1158, 1153, 1159, 1149, 14, 1160, 1150, 1161, 1163,
+ 1156, 1160, 1167, 1161, 1155, 1162, 1158, 1162, 1164, 1166,
+ 1165, 1163, 1165, 1159, 1167, 1172, 1169, 1164, 1166, 1170,
- 1174, 1175, 1179, 1168, 1177, 1177, 1175, 1176, 1178, 1183,
- 1173, 1182, 1182, 1184, 1184, 1186, 1178, 1187, 1183, 1185,
- 1185, 1188, 1179, 1189, 1189, 1191, 1188, 1186, 1192, 1193,
- 1194, 1195, 1197, 1192, 1200, 1187, 1195, 1196, 1198, 1198,
- 1199, 1201, 1202, 1203, 1199, 1194, 1201, 1205, 1197, 1200,
- 1191, 1206, 1193, 1207, 1209, 1196, 1208, 1210, 1212, 1212,
- 1213, 1214, 1203, 1213, 1229, 1215, 1209, 1216, 1202, 1229,
- 1205, 1304, 1207, 1304, 1214, 1206, 1220, 1208, 1210, 1215,
- 1216, 1217, 1217, 1218, 1218, 1219, 1219, 1221, 1221, 1220,
- 1222, 1222, 1223, 1223, 1224, 1225, 1225, 1226, 1226, 1227,
+ 1164, 1169, 1173, 1174, 1170, 1176, 1178, 1180, 1172, 1179,
+ 1185, 1176, 1178, 1187, 1181, 1182, 1182, 1183, 1187, 1174,
+ 1184, 1184, 1173, 1181, 1179, 1188, 1183, 1186, 1190, 1185,
+ 1191, 1186, 1180, 1189, 1189, 1195, 1190, 1198, 1188, 1194,
+ 1194, 1196, 1196, 1199, 1195, 1197, 1197, 1200, 1203, 1198,
+ 1191, 1204, 1200, 1201, 1201, 1205, 1204, 1206, 1207, 1208,
+ 1209, 1199, 1211, 1207, 1210, 1210, 1211, 1212, 1214, 1213,
+ 1215, 1218, 1206, 1203, 1213, 1217, 1209, 1208, 1205, 1220,
+ 1219, 1221, 1212, 1222, 1224, 1224, 13, 1225, 1226, 1215,
+ 1225, 1227, 1241, 1221, 1214, 1218, 1228, 1241, 1217, 1219,
- 1230, 1230, 1231, 1232, 1232, 1233, 1234, 1235, 1236, 1236,
- 1235, 1238, 1234, 1224, 1237, 1237, 1239, 1239, 1227, 1241,
- 1242, 1231, 1243, 1233, 1236, 1245, 1243, 1244, 1244, 1247,
- 1238, 1246, 1246, 1248, 1248, 1242, 1249, 1250, 1251, 1252,
- 1253, 1254, 1241, 1251, 1245, 1249, 1255, 1257, 1256, 1250,
- 1258, 1255, 1259, 1253, 1261, 1247, 1257, 1263, 1261, 1258,
- 1260, 1265, 1254, 1256, 1252, 1260, 1259, 1266, 1266, 1267,
- 1265, 1268, 1268, 1270, 1267, 1271, 1275, 1263, 1273, 1275,
- 1268, 1276, 1277, 1281, 1271, 1285, 1276, 1283, 1270, 1284,
- 1273, 1278, 1278, 1280, 1280, 1282, 1282, 1281, 1292, 1283,
+ 1220, 1226, 1229, 1229, 1222, 1227, 1230, 1230, 1232, 1228,
+ 1231, 1231, 1233, 1233, 1234, 1234, 1235, 1235, 1236, 1237,
+ 1237, 1232, 1238, 1238, 1239, 1242, 1242, 1243, 1244, 1244,
+ 1245, 1247, 1246, 1251, 1247, 1248, 1248, 1236, 1246, 1249,
+ 1249, 1250, 1254, 1239, 1252, 1252, 1243, 1255, 1245, 1256,
+ 1258, 1248, 1251, 1256, 1257, 1257, 1250, 1259, 1259, 1260,
+ 1261, 1261, 1255, 1262, 1263, 1254, 1264, 1265, 1266, 1258,
+ 1267, 1264, 1262, 1268, 1269, 1270, 1263, 1271, 1268, 1272,
+ 1276, 1266, 1273, 0, 1270, 1260, 1271, 1273, 1278, 1269,
+ 1274, 1267, 1265, 1272, 1274, 1279, 1279, 1278, 1280, 1283,
- 1286, 1286, 1277, 1284, 1285, 1288, 1293, 1289, 1291, 1288,
- 1289, 1290, 1290, 1291, 1295, 1294, 1296, 1297, 1292, 1294,
- 1293, 1296, 1297, 1298, 1300, 1301, 1302, 1303, 1322, 1298,
- 1301, 1302, 1307, 1307, 1295, 1303, 1311, 1311, 1314, 1321,
- 1300, 1315, 1315, 1314, 1317, 1317, 1319, 1320, 1320, 1323,
- 1322, 1319, 1325, 1325, 1323, 1321, 1327, 1328, 1329, 1331,
- 1331, 1327, 1333, 1334, 1335, 1334, 1336, 1333, 1337, 1337,
- 1340, 1336, 1341, 1329, 1342, 1328, 1338, 1338, 1335, 1339,
- 1339, 1343, 1340, 1344, 1345, 1346, 1342, 1347, 1347, 1345,
- 1341, 1348, 1349, 1343, 1350, 1344, 1351, 1352, 1353, 1354,
+ 1276, 1281, 1281, 1280, 1284, 1286, 1288, 1289, 1290, 1288,
+ 1281, 1294, 1289, 1284, 1283, 1291, 1291, 1286, 1293, 1293,
+ 1295, 1295, 1296, 1297, 1298, 1294, 1299, 1299, 1290, 1301,
+ 1303, 1303, 1302, 1301, 1296, 1302, 1304, 1297, 1305, 1306,
+ 1307, 1304, 1308, 1298, 1307, 1309, 1310, 1313, 1311, 0,
+ 1309, 1310, 1314, 1306, 1311, 1315, 1316, 1314, 1305, 1317,
+ 1315, 1317, 1308, 1313, 1316, 1320, 1320, 1324, 1324, 1327,
+ 1328, 1328, 1330, 1330, 1327, 1332, 1333, 1333, 1334, 1335,
+ 1332, 1336, 1341, 1338, 1339, 1339, 1336, 1341, 1342, 1343,
+ 1345, 1345, 1347, 1349, 1334, 1338, 1348, 1347, 1348, 1355,
- 1348, 1355, 1356, 1357, 1362, 1346, 1364, 1356, 1357, 1351,
- 1358, 1358, 1353, 1363, 1350, 1359, 1359, 1354, 1349, 1365,
- 1366, 1352, 1367, 1355, 1362, 1368, 1369, 1369, 1364, 1366,
- 1373, 1363, 1371, 1371, 1374, 1372, 1375, 1373, 1376, 1365,
- 1378, 1377, 1367, 1368, 1372, 1379, 1379, 1380, 1381, 1374,
- 1382, 1383, 1380, 1384, 1375, 1386, 1376, 1377, 1389, 1378,
- 1390, 1391, 1391, 1390, 1392, 1382, 1381, 1393, 1395, 1397,
- 1383, 1400, 1395, 1384, 1386, 1396, 1396, 1407, 1389, 1392,
- 1399, 1399, 1397, 1401, 1401, 1393, 1402, 1402, 1406, 1406,
- 1400, 1408, 1409, 1410, 1411, 1412, 1414, 1409, 1410, 1407,
+ 1350, 1335, 1351, 1351, 1343, 1350, 1342, 1349, 1352, 1352,
+ 1353, 1353, 1354, 1356, 1357, 1358, 1359, 1355, 1360, 1361,
+ 1361, 1359, 1362, 1363, 1354, 1356, 1357, 1358, 1364, 1365,
+ 1366, 1362, 1367, 1368, 1369, 1370, 1371, 1376, 1360, 1378,
+ 1370, 1371, 1365, 1372, 1372, 1377, 1367, 1379, 1364, 1363,
+ 1380, 1368, 1373, 1373, 1366, 1381, 1369, 1376, 1382, 1380,
+ 1389, 1378, 1386, 1377, 1383, 1383, 1387, 1379, 1385, 1385,
+ 1388, 1386, 1390, 1387, 1395, 1381, 1382, 1391, 1389, 1392,
+ 1393, 1393, 1394, 1397, 1396, 1388, 1398, 1394, 1400, 1403,
+ 1390, 1404, 1395, 1391, 1404, 1405, 1405, 1406, 1392, 1396,
- 1408, 1415, 1416, 1412, 1417, 1420, 1415, 1416, 1418, 1418,
- 1420, 1414, 1421, 1411, 1419, 1419, 1429, 1421, 1430, 1417,
- 1422, 1422, 1423, 1423, 1426, 1429, 1427, 1428, 1431, 1426,
- 1427, 1433, 1428, 1430, 1432, 1435, 1431, 1436, 1435, 1432,
- 1437, 1438, 1439, 1433, 1440, 1440, 1443, 1441, 1444, 14,
- 1438, 1439, 1445, 1437, 1447, 1436, 1441, 1446, 1446, 1448,
- 1448, 1449, 1450, 1447, 1452, 1443, 1453, 1450, 1444, 1449,
- 1454, 1445, 1461, 1452, 1456, 1456, 1458, 1458, 1467, 1453,
- 1462, 1462, 13, 1463, 1468, 1454, 1463, 1464, 1464, 1465,
- 1465, 1474, 1461, 1466, 1466, 1469, 1467, 1474, 1468, 1471,
+ 1407, 1408, 1397, 1412, 1410, 1408, 1398, 1400, 1410, 1403,
+ 1411, 1411, 1406, 1414, 1414, 1415, 1412, 1422, 1407, 1416,
+ 1416, 1417, 1417, 1421, 1421, 1424, 1423, 1425, 1426, 1427,
+ 1424, 1429, 1425, 1430, 1415, 1423, 1431, 1427, 1430, 1422,
+ 1432, 1431, 1433, 1433, 1434, 1434, 1429, 1426, 1435, 1436,
+ 1437, 1437, 1445, 1435, 1436, 1432, 1438, 1438, 1441, 1444,
+ 1442, 1443, 1446, 1441, 1442, 1448, 1443, 1445, 1444, 1447,
+ 1446, 1451, 1450, 1452, 1447, 1450, 1453, 1448, 1454, 1455,
+ 1455, 1456, 1458, 1459, 1462, 1453, 1452, 1454, 1460, 1451,
+ 1456, 1461, 1461, 1462, 1463, 1463, 1464, 1465, 1468, 1467,
- 1469, 1470, 1470, 1471, 1475, 1478, 1479, 1480, 1481, 1475,
- 1482, 1479, 1483, 1483, 1484, 1486, 1487, 1487, 1485, 1488,
- 1488, 1489, 1478, 1478, 1482, 1480, 1485, 1490, 1481, 1491,
- 1492, 1493, 1490, 1484, 1486, 1494, 1497, 1489, 1495, 1497,
- 1493, 1499, 1500, 1500, 1501, 1502, 1508, 1503, 1501, 1491,
- 0, 1507, 1504, 1506, 1502, 1494, 1492, 1518, 1495, 1499,
- 1503, 1504, 1506, 1507, 1512, 1513, 1513, 1514, 1516, 1512,
- 1517, 1508, 1519, 1516, 1521, 1520, 1514, 1518, 1522, 1517,
- 1520, 1523, 1526, 1522, 1524, 1524, 1529, 1527, 1528, 1528,
- 1529, 1530, 1521, 1519, 1531, 1532, 1533, 1535, 1534, 1537,
+ 1470, 1458, 1465, 1459, 1464, 1469, 1477, 1460, 1467, 1469,
+ 0, 1468, 1472, 1472, 1483, 1470, 1474, 1474, 1478, 1478,
+ 1479, 1480, 1480, 1479, 1481, 1481, 1477, 1482, 1482, 1484,
+ 1485, 1490, 1483, 1486, 1486, 1485, 1487, 1490, 1494, 1491,
+ 1487, 1495, 1496, 1484, 1491, 1497, 1495, 1498, 1499, 1499,
+ 1500, 1501, 1502, 1503, 1503, 1494, 1494, 1504, 1504, 1501,
+ 1496, 1498, 1505, 1506, 1507, 1497, 1508, 1509, 1506, 1500,
+ 1510, 1502, 1513, 1511, 1518, 1513, 1509, 1515, 1505, 1516,
+ 1516, 1517, 1519, 1518, 1507, 1517, 1520, 1521, 1524, 1523,
+ 1510, 1525, 1508, 1511, 1535, 1515, 1521, 1519, 1523, 1520,
- 1530, 1526, 1527, 1534, 1533, 1542, 1523, 1536, 1536, 1545,
- 1531, 1538, 1538, 1544, 1532, 1539, 1541, 1541, 1537, 1548,
- 1539, 1543, 1543, 1535, 1549, 1542, 1550, 1544, 1546, 1546,
- 1552, 1545, 1547, 1547, 1551, 1551, 1549, 1553, 1548, 1554,
- 1555, 1561, 1552, 1556, 1554, 1557, 1550, 1564, 1556, 1558,
- 1558, 1560, 1560, 1563, 1566, 1566, 0, 1553, 1563, 1555,
- 1561, 1564, 1557, 1557, 1565, 1567, 1567, 1568, 1568, 1565,
- 1569, 1571, 1571, 1573, 1573, 1569, 1575, 1575, 1576, 1577,
- 1577, 1578, 1581, 1582, 1582, 1586, 1578, 1576, 1583, 1585,
- 1581, 1587, 1588, 1583, 1585, 1589, 1590, 1586, 1591, 1594,
+ 1524, 1529, 1530, 1530, 1531, 1533, 1529, 1536, 1534, 1538,
+ 1533, 1540, 1543, 1531, 1535, 1537, 1525, 1534, 1539, 1544,
+ 1537, 1541, 1541, 1539, 1545, 1545, 1546, 1538, 1536, 1547,
+ 1546, 1543, 1548, 1549, 1544, 1550, 1540, 1551, 1547, 1552,
+ 1553, 1553, 1551, 1550, 1554, 1555, 1555, 1559, 1548, 1556,
+ 1558, 1558, 1549, 1560, 1556, 1561, 1561, 1562, 1563, 1564,
+ 1564, 1565, 1565, 1554, 1566, 1552, 1567, 1559, 1568, 1569,
+ 1569, 1562, 1570, 1571, 1572, 1573, 1560, 1574, 1567, 1572,
+ 1563, 1575, 1574, 1566, 1570, 1576, 1576, 1579, 1568, 1578,
+ 1578, 1581, 1583, 1571, 1573, 1582, 1581, 1583, 1575, 1575,
- 1595, 1595, 1597, 1591, 1596, 1596, 1597, 1605, 1588, 1587,
- 1601, 1601, 1589, 1589, 1603, 1607, 1607, 1590, 1603, 1594,
- 1608, 1605, 1610, 1611, 1611, 1612, 1612, 1613, 1614, 1615,
- 1618, 1616, 1617, 1619, 1619, 1608, 1616, 1617, 1622, 1622,
- 1610, 1624, 1624, 1614, 1625, 1625, 1627, 1628, 1628, 1618,
- 1615, 1631, 1613, 1632, 1633, 1634, 1631, 1635, 1627, 1633,
- 1636, 1641, 1642, 1645, 1643, 1641, 1644, 1632, 1646, 1647,
- 1650, 1648, 1649, 1649, 1634, 1635, 1636, 1643, 1651, 1650,
- 1653, 1645, 1642, 1651, 1646, 1644, 1648, 1652, 1654, 1658,
- 1655, 1659, 1652, 1656, 1647, 1655, 1660, 1661, 1662, 1664,
+ 1584, 1584, 1585, 1585, 1586, 1586, 1579, 1587, 1594, 1582,
+ 1589, 1589, 1587, 1591, 1591, 1593, 1593, 1595, 1596, 1596,
+ 1597, 1600, 1594, 1601, 1601, 1597, 1595, 1602, 1604, 1600,
+ 1605, 1606, 1602, 1604, 1607, 1608, 1609, 0, 1610, 1613,
+ 1614, 1614, 1605, 1610, 1615, 1615, 1633, 1616, 1630, 1606,
+ 1607, 1616, 1608, 1608, 1620, 1620, 1622, 1609, 1625, 1613,
+ 1622, 1624, 1624, 1627, 1627, 1628, 1630, 1631, 1631, 1632,
+ 1632, 1633, 1625, 1634, 1635, 1638, 1636, 1637, 1639, 1639,
+ 1628, 1636, 1637, 1642, 1642, 1644, 1644, 1648, 1634, 1646,
+ 1646, 1649, 1649, 1652, 1638, 1635, 1653, 1654, 1652, 1648,
- 1663, 1660, 1661, 1654, 1658, 1653, 1665, 1656, 1666, 1667,
- 1659, 1668, 1662, 1663, 1669, 1672, 1670, 0, 1664, 1677,
- 1665, 1670, 1667, 1671, 1668, 1673, 1673, 1666, 1671, 1681,
- 1674, 1675, 1676, 1669, 1672, 1674, 1675, 1676, 1677, 1678,
- 1679, 1679, 1680, 1682, 1678, 1683, 1684, 1685, 1681, 1680,
- 1683, 1687, 1688, 1689, 1690, 1693, 1687, 1691, 1691, 1692,
- 1685, 1696, 1682, 1697, 1692, 1684, 1696, 1690, 1694, 1694,
- 1697, 1688, 1689, 1698, 1693, 1695, 1695, 1699, 1699, 1700,
- 1701, 1702, 1704, 1703, 1706, 1707, 1700, 1701, 1703, 1706,
- 1707, 1708, 1698, 1709, 1710, 1710, 1711, 1712, 1713, 1713,
+ 1655, 1657, 1654, 1656, 1662, 1663, 1666, 1664, 1662, 1665,
+ 1653, 1667, 1668, 1671, 1669, 1670, 1670, 1657, 1672, 1655,
+ 1664, 1656, 1671, 1672, 1666, 1663, 1673, 1667, 1665, 1669,
+ 1674, 1673, 1675, 1676, 1677, 1679, 1681, 1668, 1676, 1680,
+ 1682, 1681, 1683, 1685, 1684, 1682, 1686, 1675, 1677, 1687,
+ 1679, 1688, 1689, 1690, 1691, 1674, 1683, 1684, 1680, 1691,
+ 1686, 1692, 1685, 1693, 1688, 1689, 1692, 1698, 1687, 1694,
+ 1694, 1695, 1690, 1696, 1697, 1699, 1695, 1702, 1696, 1697,
+ 1699, 1701, 1693, 1700, 1700, 1703, 1698, 1704, 1701, 1705,
+ 1706, 1709, 1704, 1708, 1710, 1714, 1702, 1713, 1708, 1711,
- 1702, 1704, 1714, 1714, 1715, 1716, 1716, 1717, 1717, 1720,
- 1708, 1715, 1709, 1718, 1720, 1711, 1712, 1723, 1724, 1725,
- 1718, 0, 1723, 1726, 1726, 1727, 1727, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1724, 1725, 1731,
- 1731, 1731, 1731, 1731, 1731, 1731, 1732, 1732, 1732, 1732,
- 1732, 1732, 1732, 1733, 1733, 1733, 1733, 1733, 1733, 1733,
- 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1735, 1735, 1735,
- 1735, 1735, 1735, 1735, 1737, 1737, 0, 1737, 1737, 1737,
- 1737, 1738, 1738, 0, 0, 0, 1738, 1738, 1739, 1739,
- 0, 0, 1739, 0, 1739, 1740, 0, 0, 0, 0,
+ 1712, 1712, 1713, 1706, 1703, 1715, 1715, 1719, 1705, 0,
+ 1709, 1718, 1711, 1710, 1714, 1716, 1716, 1717, 1718, 1720,
+ 1720, 1721, 1717, 1722, 1723, 1725, 1719, 1724, 1721, 1727,
+ 1722, 1728, 1724, 1729, 1727, 1730, 1728, 1731, 1731, 1732,
+ 1733, 1734, 1734, 1723, 1725, 1735, 1735, 0, 1736, 1737,
+ 1737, 1745, 1729, 1739, 1730, 1736, 1738, 1738, 1732, 1733,
+ 1739, 1741, 1744, 1746, 1747, 1747, 1741, 1744, 1748, 1748,
+ 1745, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1746, 1752, 1752, 1752, 1752, 1752, 1752, 1752,
+ 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1754, 1754, 1754,
- 0, 1740, 1741, 1741, 0, 0, 0, 1741, 1741, 1742,
- 0, 0, 0, 0, 0, 1742, 1743, 1743, 0, 1743,
- 1743, 1743, 1743, 1744, 1744, 0, 1744, 1744, 1744, 1744,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730,
- 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730
+ 1754, 1754, 1754, 1754, 1755, 1755, 1755, 1755, 1755, 1755,
+ 1755, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1758, 1758,
+ 0, 1758, 1758, 1758, 1758, 1759, 1759, 0, 0, 0,
+ 1759, 1759, 1760, 1760, 0, 0, 1760, 0, 1760, 1761,
+ 0, 0, 0, 0, 0, 1761, 1762, 1762, 0, 0,
+ 0, 1762, 1762, 1763, 0, 0, 0, 0, 0, 1763,
+ 1764, 1764, 0, 1764, 1764, 1764, 1764, 1765, 1765, 0,
+ 1765, 1765, 1765, 1765, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+
+ 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751,
+ 1751, 1751, 1751, 1751
} ;
static yy_state_type yy_last_accepting_state;
@@ -1966,7 +1985,7 @@ static void config_end_include(void)
#define YY_NO_INPUT 1
#endif
-#line 1968 ""
+#line 1987 ""
#define INITIAL 0
#define quotedstring 1
@@ -2153,7 +2172,7 @@ YY_DECL
#line 197 "./util/configlexer.lex"
-#line 2155 ""
+#line 2174 ""
if ( !(yy_init) )
{
@@ -2212,13 +2231,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 1731 )
+ if ( yy_current_state >= 1752 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 3431 );
+ while ( yy_base[yy_current_state] != 3475 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -2784,274 +2803,279 @@ YY_RULE_SETUP
case 108:
YY_RULE_SETUP
#line 309 "./util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
YY_BREAK
case 109:
YY_RULE_SETUP
#line 310 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
YY_BREAK
case 110:
YY_RULE_SETUP
#line 311 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
YY_BREAK
case 111:
YY_RULE_SETUP
#line 312 "./util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
YY_BREAK
case 112:
YY_RULE_SETUP
#line 313 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
YY_BREAK
case 113:
YY_RULE_SETUP
#line 314 "./util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
YY_BREAK
case 114:
YY_RULE_SETUP
#line 315 "./util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
YY_BREAK
case 115:
YY_RULE_SETUP
#line 316 "./util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
YY_BREAK
case 116:
YY_RULE_SETUP
#line 317 "./util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
YY_BREAK
case 117:
YY_RULE_SETUP
#line 318 "./util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
YY_BREAK
case 118:
YY_RULE_SETUP
#line 319 "./util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
YY_BREAK
case 119:
YY_RULE_SETUP
#line 320 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
YY_BREAK
case 120:
YY_RULE_SETUP
#line 321 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
YY_BREAK
case 121:
YY_RULE_SETUP
#line 322 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
YY_BREAK
case 122:
YY_RULE_SETUP
#line 323 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
YY_BREAK
case 123:
YY_RULE_SETUP
#line 324 "./util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
YY_BREAK
case 124:
YY_RULE_SETUP
#line 325 "./util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
YY_BREAK
case 125:
YY_RULE_SETUP
#line 326 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
YY_BREAK
case 126:
YY_RULE_SETUP
#line 327 "./util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
YY_BREAK
case 127:
YY_RULE_SETUP
#line 328 "./util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
YY_BREAK
case 128:
YY_RULE_SETUP
#line 329 "./util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
YY_BREAK
case 129:
YY_RULE_SETUP
#line 330 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(0, VAR_PYTHON) }
YY_BREAK
case 130:
YY_RULE_SETUP
#line 331 "./util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
YY_BREAK
case 131:
YY_RULE_SETUP
#line 332 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
YY_BREAK
case 132:
YY_RULE_SETUP
#line 333 "./util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
YY_BREAK
case 133:
YY_RULE_SETUP
#line 334 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
YY_BREAK
case 134:
YY_RULE_SETUP
#line 335 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
YY_BREAK
case 135:
YY_RULE_SETUP
#line 336 "./util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
YY_BREAK
case 136:
YY_RULE_SETUP
#line 337 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(0, VAR_DNSTAP) }
YY_BREAK
case 137:
YY_RULE_SETUP
#line 338 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
YY_BREAK
case 138:
YY_RULE_SETUP
#line 339 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
YY_BREAK
case 139:
YY_RULE_SETUP
#line 340 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
YY_BREAK
case 140:
YY_RULE_SETUP
#line 341 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
YY_BREAK
case 141:
YY_RULE_SETUP
#line 342 "./util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
YY_BREAK
case 142:
YY_RULE_SETUP
#line 343 "./util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
YY_BREAK
case 143:
YY_RULE_SETUP
-#line 345 "./util/configlexer.lex"
+#line 344 "./util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
YY_BREAK
case 144:
YY_RULE_SETUP
-#line 347 "./util/configlexer.lex"
+#line 346 "./util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
YY_BREAK
case 145:
YY_RULE_SETUP
-#line 349 "./util/configlexer.lex"
+#line 348 "./util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
YY_BREAK
case 146:
YY_RULE_SETUP
-#line 351 "./util/configlexer.lex"
+#line 350 "./util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
YY_BREAK
case 147:
YY_RULE_SETUP
-#line 353 "./util/configlexer.lex"
+#line 352 "./util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
YY_BREAK
case 148:
YY_RULE_SETUP
-#line 355 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+#line 354 "./util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
YY_BREAK
case 149:
YY_RULE_SETUP
#line 356 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_RATELIMIT) }
YY_BREAK
case 150:
YY_RULE_SETUP
#line 357 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
YY_BREAK
case 151:
YY_RULE_SETUP
#line 358 "./util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
YY_BREAK
case 152:
YY_RULE_SETUP
#line 359 "./util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
YY_BREAK
case 153:
YY_RULE_SETUP
#line 360 "./util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
YY_BREAK
case 154:
-/* rule 154 can match eol */
YY_RULE_SETUP
#line 361 "./util/configlexer.lex"
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+ YY_BREAK
+case 155:
+/* rule 155 can match eol */
+YY_RULE_SETUP
+#line 362 "./util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++; }
YY_BREAK
/* Quoted strings. Strip leading and ending quotes */
-case 155:
+case 156:
YY_RULE_SETUP
-#line 364 "./util/configlexer.lex"
+#line 365 "./util/configlexer.lex"
{ BEGIN(quotedstring); LEXOUT(("QS ")); }
YY_BREAK
case YY_STATE_EOF(quotedstring):
-#line 365 "./util/configlexer.lex"
+#line 366 "./util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 156:
-YY_RULE_SETUP
-#line 370 "./util/configlexer.lex"
-{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
- YY_BREAK
case 157:
-/* rule 157 can match eol */
YY_RULE_SETUP
#line 371 "./util/configlexer.lex"
+{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
+ YY_BREAK
+case 158:
+/* rule 158 can match eol */
+YY_RULE_SETUP
+#line 372 "./util/configlexer.lex"
{ yyerror("newline inside quoted string, no end \"");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 158:
+case 159:
YY_RULE_SETUP
-#line 373 "./util/configlexer.lex"
+#line 374 "./util/configlexer.lex"
{
LEXOUT(("QE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -3064,34 +3088,34 @@ YY_RULE_SETUP
}
YY_BREAK
/* Single Quoted strings. Strip leading and ending quotes */
-case 159:
+case 160:
YY_RULE_SETUP
-#line 385 "./util/configlexer.lex"
+#line 386 "./util/configlexer.lex"
{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
YY_BREAK
case YY_STATE_EOF(singlequotedstr):
-#line 386 "./util/configlexer.lex"
+#line 387 "./util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 160:
-YY_RULE_SETUP
-#line 391 "./util/configlexer.lex"
-{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
- YY_BREAK
case 161:
-/* rule 161 can match eol */
YY_RULE_SETUP
#line 392 "./util/configlexer.lex"
+{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
+ YY_BREAK
+case 162:
+/* rule 162 can match eol */
+YY_RULE_SETUP
+#line 393 "./util/configlexer.lex"
{ yyerror("newline inside quoted string, no end '");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 162:
+case 163:
YY_RULE_SETUP
-#line 394 "./util/configlexer.lex"
+#line 395 "./util/configlexer.lex"
{
LEXOUT(("SQE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -3104,38 +3128,38 @@ YY_RULE_SETUP
}
YY_BREAK
/* include: directive */
-case 163:
+case 164:
YY_RULE_SETUP
-#line 406 "./util/configlexer.lex"
+#line 407 "./util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
YY_BREAK
case YY_STATE_EOF(include):
-#line 408 "./util/configlexer.lex"
+#line 409 "./util/configlexer.lex"
{
yyerror("EOF inside include directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 164:
-YY_RULE_SETUP
-#line 412 "./util/configlexer.lex"
-{ LEXOUT(("ISP ")); /* ignore */ }
- YY_BREAK
case 165:
-/* rule 165 can match eol */
YY_RULE_SETUP
#line 413 "./util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++;}
+{ LEXOUT(("ISP ")); /* ignore */ }
YY_BREAK
case 166:
+/* rule 166 can match eol */
YY_RULE_SETUP
#line 414 "./util/configlexer.lex"
-{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
+{ LEXOUT(("NL\n")); cfg_parser->line++;}
YY_BREAK
case 167:
YY_RULE_SETUP
#line 415 "./util/configlexer.lex"
+{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
+ YY_BREAK
+case 168:
+YY_RULE_SETUP
+#line 416 "./util/configlexer.lex"
{
LEXOUT(("Iunquotedstr(%s) ", yytext));
config_start_include_glob(yytext);
@@ -3143,27 +3167,27 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_quoted):
-#line 420 "./util/configlexer.lex"
+#line 421 "./util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 168:
-YY_RULE_SETUP
-#line 424 "./util/configlexer.lex"
-{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
- YY_BREAK
case 169:
-/* rule 169 can match eol */
YY_RULE_SETUP
#line 425 "./util/configlexer.lex"
+{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
+ YY_BREAK
+case 170:
+/* rule 170 can match eol */
+YY_RULE_SETUP
+#line 426 "./util/configlexer.lex"
{ yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev); }
YY_BREAK
-case 170:
+case 171:
YY_RULE_SETUP
-#line 427 "./util/configlexer.lex"
+#line 428 "./util/configlexer.lex"
{
LEXOUT(("IQE "));
yytext[yyleng - 1] = '\0';
@@ -3173,7 +3197,7 @@ YY_RULE_SETUP
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(val):
-#line 433 "./util/configlexer.lex"
+#line 434 "./util/configlexer.lex"
{
LEXOUT(("LEXEOF "));
yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
@@ -3185,33 +3209,33 @@ case YY_STATE_EOF(val):
}
}
YY_BREAK
-case 171:
+case 172:
YY_RULE_SETUP
-#line 444 "./util/configlexer.lex"
+#line 445 "./util/configlexer.lex"
{ LEXOUT(("unquotedstr(%s) ", yytext));
if(--num_args == 0) { BEGIN(INITIAL); }
yylval.str = strdup(yytext); return STRING_ARG; }
YY_BREAK
-case 172:
+case 173:
YY_RULE_SETUP
-#line 448 "./util/configlexer.lex"
+#line 449 "./util/configlexer.lex"
{
ub_c_error_msg("unknown keyword '%s'", yytext);
}
YY_BREAK
-case 173:
+case 174:
YY_RULE_SETUP
-#line 452 "./util/configlexer.lex"
+#line 453 "./util/configlexer.lex"
{
ub_c_error_msg("stray '%s'", yytext);
}
YY_BREAK
-case 174:
+case 175:
YY_RULE_SETUP
-#line 456 "./util/configlexer.lex"
+#line 457 "./util/configlexer.lex"
ECHO;
YY_BREAK
-#line 3213 ""
+#line 3237 ""
case YY_END_OF_BUFFER:
{
@@ -3501,7 +3525,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 1731 )
+ if ( yy_current_state >= 1752 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3529,11 +3553,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 1731 )
+ if ( yy_current_state >= 1752 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 1730);
+ yy_is_jam = (yy_current_state == 1751);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -4166,7 +4190,7 @@ void yyfree (void * ptr )
#define YYTABLES_NAME "yytables"
-#line 456 "./util/configlexer.lex"
+#line 457 "./util/configlexer.lex"
diff --git a/external/unbound/util/configlexer.lex b/external/unbound/util/configlexer.lex
index 5622f2170..a776c766f 100644
--- a/external/unbound/util/configlexer.lex
+++ b/external/unbound/util/configlexer.lex
@@ -306,6 +306,7 @@ val-nsec3-keysize-iterations{COLON} {
add-holddown{COLON} { YDVAR(1, VAR_ADD_HOLDDOWN) }
del-holddown{COLON} { YDVAR(1, VAR_DEL_HOLDDOWN) }
keep-missing{COLON} { YDVAR(1, VAR_KEEP_MISSING) }
+permit-small-holddown{COLON} { YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
use-syslog{COLON} { YDVAR(1, VAR_USE_SYSLOG) }
log-time-ascii{COLON} { YDVAR(1, VAR_LOG_TIME_ASCII) }
log-queries{COLON} { YDVAR(1, VAR_LOG_QUERIES) }
diff --git a/external/unbound/util/configparser.c b/external/unbound/util/configparser.c
index f7ebd5d51..a571f5c7f 100644
--- a/external/unbound/util/configparser.c
+++ b/external/unbound/util/configparser.c
@@ -284,7 +284,8 @@ extern int yydebug;
VAR_RATELIMIT_BELOW_DOMAIN = 412,
VAR_RATELIMIT_FACTOR = 413,
VAR_CAPS_WHITELIST = 414,
- VAR_CACHE_MAX_NEGATIVE_TTL = 415
+ VAR_CACHE_MAX_NEGATIVE_TTL = 415,
+ VAR_PERMIT_SMALL_HOLDDOWN = 416
};
#endif
/* Tokens. */
@@ -446,6 +447,7 @@ extern int yydebug;
#define VAR_RATELIMIT_FACTOR 413
#define VAR_CAPS_WHITELIST 414
#define VAR_CACHE_MAX_NEGATIVE_TTL 415
+#define VAR_PERMIT_SMALL_HOLDDOWN 416
@@ -459,7 +461,7 @@ typedef union YYSTYPE
/* Line 387 of yacc.c */
-#line 463 "util/configparser.c"
+#line 465 "util/configparser.c"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -487,7 +489,7 @@ int yyparse ();
/* Copy the second part of user declarations. */
/* Line 390 of yacc.c */
-#line 491 "util/configparser.c"
+#line 493 "util/configparser.c"
#ifdef short
# undef short
@@ -707,20 +709,20 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 2
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 301
+#define YYLAST 303
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 161
+#define YYNTOKENS 162
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 166
+#define YYNNTS 167
/* YYNRULES -- Number of rules. */
-#define YYNRULES 317
+#define YYNRULES 319
/* YYNRULES -- Number of states. */
-#define YYNSTATES 467
+#define YYNSTATES 470
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
-#define YYMAXUTOK 415
+#define YYMAXUTOK 416
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -769,7 +771,7 @@ static const yytype_uint8 yytranslate[] =
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
+ 155, 156, 157, 158, 159, 160, 161
};
#if YYDEBUG
@@ -790,109 +792,110 @@ static const yytype_uint16 yyprhs[] =
205, 207, 209, 211, 213, 215, 217, 219, 221, 223,
225, 227, 229, 231, 233, 235, 237, 239, 241, 243,
245, 247, 249, 251, 253, 255, 257, 259, 261, 263,
- 266, 267, 269, 271, 273, 275, 277, 279, 282, 283,
- 285, 287, 289, 291, 294, 297, 300, 303, 306, 309,
- 312, 315, 318, 321, 324, 327, 330, 333, 336, 339,
- 342, 345, 348, 351, 354, 357, 360, 363, 366, 369,
- 372, 375, 378, 381, 384, 387, 390, 393, 396, 399,
- 402, 405, 408, 411, 414, 417, 420, 423, 426, 429,
- 432, 435, 438, 441, 444, 447, 450, 453, 456, 459,
- 462, 465, 468, 471, 474, 477, 480, 483, 486, 489,
- 492, 495, 498, 501, 504, 507, 510, 513, 516, 519,
- 522, 525, 528, 531, 534, 538, 541, 544, 547, 550,
- 553, 556, 559, 562, 565, 568, 571, 574, 577, 580,
- 583, 586, 589, 592, 595, 599, 602, 605, 608, 611,
- 614, 617, 620, 623, 626, 629, 633, 637, 640, 643,
- 646, 649, 652, 655, 658, 661, 664, 667, 669, 672,
- 673, 675, 677, 679, 681, 683, 685, 687, 689, 692,
- 695, 698, 701, 704, 707, 710, 713, 715, 718, 719,
- 721, 723, 725, 727, 729, 731, 733, 735, 737, 739,
- 741, 743, 746, 749, 752, 755, 758, 761, 764, 767,
- 770, 773, 776, 779, 781, 784, 785, 787
+ 265, 268, 269, 271, 273, 275, 277, 279, 281, 284,
+ 285, 287, 289, 291, 293, 296, 299, 302, 305, 308,
+ 311, 314, 317, 320, 323, 326, 329, 332, 335, 338,
+ 341, 344, 347, 350, 353, 356, 359, 362, 365, 368,
+ 371, 374, 377, 380, 383, 386, 389, 392, 395, 398,
+ 401, 404, 407, 410, 413, 416, 419, 422, 425, 428,
+ 431, 434, 437, 440, 443, 446, 449, 452, 455, 458,
+ 461, 464, 467, 470, 473, 476, 479, 482, 485, 488,
+ 491, 494, 497, 500, 503, 506, 509, 512, 515, 518,
+ 521, 524, 527, 530, 533, 536, 540, 543, 546, 549,
+ 552, 555, 558, 561, 564, 567, 570, 573, 576, 579,
+ 582, 585, 588, 591, 594, 597, 600, 604, 607, 610,
+ 613, 616, 619, 622, 625, 628, 631, 634, 638, 642,
+ 645, 648, 651, 654, 657, 660, 663, 666, 669, 672,
+ 674, 677, 678, 680, 682, 684, 686, 688, 690, 692,
+ 694, 697, 700, 703, 706, 709, 712, 715, 718, 720,
+ 723, 724, 726, 728, 730, 732, 734, 736, 738, 740,
+ 742, 744, 746, 748, 751, 754, 757, 760, 763, 766,
+ 769, 772, 775, 778, 781, 784, 786, 789, 790, 792
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const yytype_int16 yyrhs[] =
{
- 162, 0, -1, -1, 162, 163, -1, 164, 165, -1,
- 167, 168, -1, 170, 171, -1, 323, 324, -1, 297,
- 298, -1, 308, 309, -1, 11, -1, 165, 166, -1,
- -1, 173, -1, 174, -1, 178, -1, 181, -1, 187,
- -1, 188, -1, 189, -1, 190, -1, 179, -1, 200,
- -1, 201, -1, 202, -1, 203, -1, 204, -1, 223,
- -1, 224, -1, 225, -1, 229, -1, 230, -1, 184,
- -1, 231, -1, 232, -1, 235, -1, 233, -1, 234,
- -1, 237, -1, 238, -1, 239, -1, 252, -1, 213,
- -1, 214, -1, 215, -1, 216, -1, 240, -1, 255,
- -1, 209, -1, 211, -1, 256, -1, 262, -1, 263,
- -1, 264, -1, 185, -1, 222, -1, 271, -1, 272,
- -1, 210, -1, 267, -1, 197, -1, 180, -1, 205,
- -1, 253, -1, 259, -1, 241, -1, 254, -1, 274,
- -1, 275, -1, 186, -1, 175, -1, 196, -1, 245,
- -1, 176, -1, 182, -1, 183, -1, 206, -1, 207,
- -1, 273, -1, 243, -1, 247, -1, 248, -1, 177,
- -1, 276, -1, 226, -1, 251, -1, 198, -1, 212,
- -1, 257, -1, 258, -1, 261, -1, 266, -1, 208,
- -1, 268, -1, 269, -1, 270, -1, 217, -1, 221,
- -1, 249, -1, 250, -1, 218, -1, 242, -1, 265,
- -1, 199, -1, 191, -1, 192, -1, 193, -1, 194,
- -1, 195, -1, 277, -1, 278, -1, 279, -1, 219,
- -1, 227, -1, 228, -1, 280, -1, 281, -1, 236,
- -1, 244, -1, 220, -1, 282, -1, 284, -1, 283,
- -1, 285, -1, 286, -1, 287, -1, 246, -1, 260,
- -1, 38, -1, 168, 169, -1, -1, 288, -1, 289,
- -1, 290, -1, 292, -1, 291, -1, 44, -1, 171,
- 172, -1, -1, 293, -1, 294, -1, 295, -1, 296,
- -1, 13, 10, -1, 12, 10, -1, 76, 10, -1,
- 79, 10, -1, 97, 10, -1, 14, 10, -1, 16,
- 10, -1, 67, 10, -1, 15, 10, -1, 80, 10,
- -1, 81, 10, -1, 31, 10, -1, 60, 10, -1,
- 75, 10, -1, 17, 10, -1, 18, 10, -1, 19,
- 10, -1, 20, 10, -1, 123, 10, -1, 124, 10,
- -1, 125, 10, -1, 126, 10, -1, 127, 10, -1,
- 77, 10, -1, 66, 10, -1, 102, 10, -1, 122,
- 10, -1, 21, 10, -1, 22, 10, -1, 23, 10,
- -1, 24, 10, -1, 25, 10, -1, 68, 10, -1,
- 82, 10, -1, 83, 10, -1, 110, 10, -1, 54,
- 10, -1, 64, 10, -1, 55, 10, -1, 103, 10,
- -1, 48, 10, -1, 49, 10, -1, 50, 10, -1,
- 51, 10, -1, 114, 10, -1, 118, 10, -1, 119,
- 10, -1, 152, 10, -1, 115, 10, -1, 61, 10,
- -1, 26, 10, -1, 27, 10, -1, 28, 10, -1,
- 99, 10, -1, 133, 10, -1, 134, 10, -1, 29,
- 10, -1, 30, 10, -1, 32, 10, -1, 33, 10,
- -1, 35, 10, -1, 36, 10, -1, 34, 10, -1,
- 135, 10, -1, 41, 10, -1, 42, 10, -1, 43,
- 10, -1, 52, 10, -1, 71, 10, -1, 120, 10,
- -1, 85, 10, -1, 151, 10, -1, 78, 10, -1,
- 159, 10, -1, 86, 10, -1, 87, 10, -1, 116,
- 10, -1, 117, 10, -1, 101, 10, -1, 47, 10,
- -1, 69, 10, -1, 72, 10, 10, -1, 53, 10,
- -1, 56, 10, -1, 106, 10, -1, 107, 10, -1,
- 70, 10, -1, 160, 10, -1, 108, 10, -1, 57,
- 10, -1, 58, 10, -1, 59, 10, -1, 121, 10,
- -1, 109, 10, -1, 65, 10, -1, 112, 10, -1,
- 113, 10, -1, 111, 10, -1, 62, 10, -1, 63,
- 10, -1, 84, 10, -1, 73, 10, 10, -1, 74,
- 10, -1, 98, 10, -1, 130, 10, -1, 131, 10,
- -1, 132, 10, -1, 136, 10, -1, 137, 10, -1,
- 153, 10, -1, 155, 10, -1, 154, 10, -1, 156,
- 10, 10, -1, 157, 10, 10, -1, 158, 10, -1,
- 37, 10, -1, 39, 10, -1, 40, 10, -1, 129,
- 10, -1, 100, 10, -1, 37, 10, -1, 45, 10,
- -1, 46, 10, -1, 128, 10, -1, 88, -1, 298,
- 299, -1, -1, 300, -1, 302, -1, 301, -1, 304,
- -1, 305, -1, 306, -1, 307, -1, 303, -1, 89,
- 10, -1, 91, 10, -1, 90, 10, -1, 96, 10,
- -1, 92, 10, -1, 93, 10, -1, 94, 10, -1,
- 95, 10, -1, 138, -1, 309, 310, -1, -1, 311,
- -1, 312, -1, 313, -1, 314, -1, 315, -1, 316,
- -1, 317, -1, 318, -1, 319, -1, 320, -1, 321,
- -1, 322, -1, 139, 10, -1, 140, 10, -1, 141,
- 10, -1, 142, 10, -1, 143, 10, -1, 144, 10,
- -1, 145, 10, -1, 146, 10, -1, 147, 10, -1,
- 148, 10, -1, 149, 10, -1, 150, 10, -1, 104,
- -1, 324, 325, -1, -1, 326, -1, 105, 10, -1
+ 163, 0, -1, -1, 163, 164, -1, 165, 166, -1,
+ 168, 169, -1, 171, 172, -1, 325, 326, -1, 299,
+ 300, -1, 310, 311, -1, 11, -1, 166, 167, -1,
+ -1, 174, -1, 175, -1, 179, -1, 182, -1, 188,
+ -1, 189, -1, 190, -1, 191, -1, 180, -1, 201,
+ -1, 202, -1, 203, -1, 204, -1, 205, -1, 224,
+ -1, 225, -1, 226, -1, 230, -1, 231, -1, 185,
+ -1, 232, -1, 233, -1, 236, -1, 234, -1, 235,
+ -1, 238, -1, 239, -1, 240, -1, 253, -1, 214,
+ -1, 215, -1, 216, -1, 217, -1, 241, -1, 256,
+ -1, 210, -1, 212, -1, 257, -1, 263, -1, 264,
+ -1, 265, -1, 186, -1, 223, -1, 273, -1, 274,
+ -1, 211, -1, 268, -1, 198, -1, 181, -1, 206,
+ -1, 254, -1, 260, -1, 242, -1, 255, -1, 276,
+ -1, 277, -1, 187, -1, 176, -1, 197, -1, 246,
+ -1, 177, -1, 183, -1, 184, -1, 207, -1, 208,
+ -1, 275, -1, 244, -1, 248, -1, 249, -1, 178,
+ -1, 278, -1, 227, -1, 252, -1, 199, -1, 213,
+ -1, 258, -1, 259, -1, 262, -1, 267, -1, 209,
+ -1, 269, -1, 270, -1, 271, -1, 218, -1, 222,
+ -1, 250, -1, 251, -1, 219, -1, 243, -1, 266,
+ -1, 200, -1, 192, -1, 193, -1, 194, -1, 195,
+ -1, 196, -1, 279, -1, 280, -1, 281, -1, 220,
+ -1, 228, -1, 229, -1, 282, -1, 283, -1, 237,
+ -1, 245, -1, 221, -1, 284, -1, 286, -1, 285,
+ -1, 287, -1, 288, -1, 289, -1, 247, -1, 261,
+ -1, 272, -1, 38, -1, 169, 170, -1, -1, 290,
+ -1, 291, -1, 292, -1, 294, -1, 293, -1, 44,
+ -1, 172, 173, -1, -1, 295, -1, 296, -1, 297,
+ -1, 298, -1, 13, 10, -1, 12, 10, -1, 76,
+ 10, -1, 79, 10, -1, 97, 10, -1, 14, 10,
+ -1, 16, 10, -1, 67, 10, -1, 15, 10, -1,
+ 80, 10, -1, 81, 10, -1, 31, 10, -1, 60,
+ 10, -1, 75, 10, -1, 17, 10, -1, 18, 10,
+ -1, 19, 10, -1, 20, 10, -1, 123, 10, -1,
+ 124, 10, -1, 125, 10, -1, 126, 10, -1, 127,
+ 10, -1, 77, 10, -1, 66, 10, -1, 102, 10,
+ -1, 122, 10, -1, 21, 10, -1, 22, 10, -1,
+ 23, 10, -1, 24, 10, -1, 25, 10, -1, 68,
+ 10, -1, 82, 10, -1, 83, 10, -1, 110, 10,
+ -1, 54, 10, -1, 64, 10, -1, 55, 10, -1,
+ 103, 10, -1, 48, 10, -1, 49, 10, -1, 50,
+ 10, -1, 51, 10, -1, 114, 10, -1, 118, 10,
+ -1, 119, 10, -1, 152, 10, -1, 115, 10, -1,
+ 61, 10, -1, 26, 10, -1, 27, 10, -1, 28,
+ 10, -1, 99, 10, -1, 133, 10, -1, 134, 10,
+ -1, 29, 10, -1, 30, 10, -1, 32, 10, -1,
+ 33, 10, -1, 35, 10, -1, 36, 10, -1, 34,
+ 10, -1, 135, 10, -1, 41, 10, -1, 42, 10,
+ -1, 43, 10, -1, 52, 10, -1, 71, 10, -1,
+ 120, 10, -1, 85, 10, -1, 151, 10, -1, 78,
+ 10, -1, 159, 10, -1, 86, 10, -1, 87, 10,
+ -1, 116, 10, -1, 117, 10, -1, 101, 10, -1,
+ 47, 10, -1, 69, 10, -1, 72, 10, 10, -1,
+ 53, 10, -1, 56, 10, -1, 106, 10, -1, 107,
+ 10, -1, 70, 10, -1, 160, 10, -1, 108, 10,
+ -1, 57, 10, -1, 58, 10, -1, 59, 10, -1,
+ 121, 10, -1, 109, 10, -1, 65, 10, -1, 112,
+ 10, -1, 113, 10, -1, 111, 10, -1, 161, 10,
+ -1, 62, 10, -1, 63, 10, -1, 84, 10, -1,
+ 73, 10, 10, -1, 74, 10, -1, 98, 10, -1,
+ 130, 10, -1, 131, 10, -1, 132, 10, -1, 136,
+ 10, -1, 137, 10, -1, 153, 10, -1, 155, 10,
+ -1, 154, 10, -1, 156, 10, 10, -1, 157, 10,
+ 10, -1, 158, 10, -1, 37, 10, -1, 39, 10,
+ -1, 40, 10, -1, 129, 10, -1, 100, 10, -1,
+ 37, 10, -1, 45, 10, -1, 46, 10, -1, 128,
+ 10, -1, 88, -1, 300, 301, -1, -1, 302, -1,
+ 304, -1, 303, -1, 306, -1, 307, -1, 308, -1,
+ 309, -1, 305, -1, 89, 10, -1, 91, 10, -1,
+ 90, 10, -1, 96, 10, -1, 92, 10, -1, 93,
+ 10, -1, 94, 10, -1, 95, 10, -1, 138, -1,
+ 311, 312, -1, -1, 313, -1, 314, -1, 315, -1,
+ 316, -1, 317, -1, 318, -1, 319, -1, 320, -1,
+ 321, -1, 322, -1, 323, -1, 324, -1, 139, 10,
+ -1, 140, 10, -1, 141, 10, -1, 142, 10, -1,
+ 143, 10, -1, 144, 10, -1, 145, 10, -1, 146,
+ 10, -1, 147, 10, -1, 148, 10, -1, 149, 10,
+ -1, 150, 10, -1, 104, -1, 326, 327, -1, -1,
+ 328, -1, 105, 10, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
@@ -910,26 +913,26 @@ static const yytype_uint16 yyrline[] =
174, 174, 175, 175, 176, 176, 176, 177, 177, 177,
178, 178, 178, 179, 179, 179, 180, 180, 180, 181,
181, 181, 182, 182, 182, 183, 183, 184, 184, 185,
- 185, 185, 186, 186, 187, 187, 188, 188, 190, 202,
- 203, 204, 204, 204, 204, 204, 206, 218, 219, 220,
- 220, 220, 220, 222, 231, 240, 251, 260, 269, 278,
- 291, 306, 315, 324, 333, 342, 351, 360, 369, 378,
- 387, 396, 405, 414, 421, 428, 437, 446, 460, 469,
- 478, 485, 492, 499, 507, 514, 521, 528, 535, 543,
- 551, 559, 566, 573, 582, 591, 598, 605, 613, 621,
- 631, 641, 654, 665, 673, 686, 695, 704, 713, 723,
- 731, 744, 753, 761, 770, 778, 791, 800, 807, 817,
- 827, 837, 847, 857, 867, 877, 887, 894, 901, 908,
- 917, 926, 935, 942, 952, 969, 976, 994, 1007, 1020,
- 1029, 1038, 1047, 1056, 1066, 1076, 1085, 1094, 1101, 1110,
- 1119, 1128, 1136, 1149, 1157, 1181, 1188, 1203, 1213, 1223,
- 1230, 1237, 1246, 1255, 1263, 1276, 1289, 1302, 1311, 1321,
- 1328, 1335, 1344, 1354, 1364, 1371, 1378, 1387, 1392, 1393,
- 1394, 1394, 1394, 1395, 1395, 1395, 1396, 1396, 1398, 1408,
- 1417, 1424, 1434, 1441, 1448, 1455, 1462, 1467, 1468, 1469,
- 1469, 1470, 1470, 1471, 1471, 1472, 1473, 1474, 1475, 1476,
- 1477, 1479, 1487, 1494, 1502, 1510, 1517, 1524, 1533, 1542,
- 1551, 1560, 1569, 1578, 1583, 1584, 1585, 1587
+ 185, 185, 186, 186, 187, 187, 188, 188, 189, 191,
+ 203, 204, 205, 205, 205, 205, 205, 207, 219, 220,
+ 221, 221, 221, 221, 223, 232, 241, 252, 261, 270,
+ 279, 292, 307, 316, 325, 334, 343, 352, 361, 370,
+ 379, 388, 397, 406, 415, 422, 429, 438, 447, 461,
+ 470, 479, 486, 493, 500, 508, 515, 522, 529, 536,
+ 544, 552, 560, 567, 574, 583, 592, 599, 606, 614,
+ 622, 632, 642, 655, 666, 674, 687, 696, 705, 714,
+ 724, 732, 745, 754, 762, 771, 779, 792, 801, 808,
+ 818, 828, 838, 848, 858, 868, 878, 888, 895, 902,
+ 909, 918, 927, 936, 943, 953, 970, 977, 995, 1008,
+ 1021, 1030, 1039, 1048, 1057, 1067, 1077, 1086, 1095, 1102,
+ 1111, 1120, 1129, 1138, 1146, 1159, 1167, 1191, 1198, 1213,
+ 1223, 1233, 1240, 1247, 1256, 1265, 1273, 1286, 1299, 1312,
+ 1321, 1331, 1338, 1345, 1354, 1364, 1374, 1381, 1388, 1397,
+ 1402, 1403, 1404, 1404, 1404, 1405, 1405, 1405, 1406, 1406,
+ 1408, 1418, 1427, 1434, 1444, 1451, 1458, 1465, 1472, 1477,
+ 1478, 1479, 1479, 1480, 1480, 1481, 1481, 1482, 1483, 1484,
+ 1485, 1486, 1487, 1489, 1497, 1504, 1512, 1520, 1527, 1534,
+ 1543, 1552, 1561, 1570, 1579, 1588, 1593, 1594, 1595, 1597
};
#endif
@@ -994,17 +997,18 @@ static const char *const yytname[] =
"VAR_HARDEN_ALGO_DOWNGRADE", "VAR_IP_TRANSPARENT", "VAR_RATELIMIT",
"VAR_RATELIMIT_SLABS", "VAR_RATELIMIT_SIZE", "VAR_RATELIMIT_FOR_DOMAIN",
"VAR_RATELIMIT_BELOW_DOMAIN", "VAR_RATELIMIT_FACTOR",
- "VAR_CAPS_WHITELIST", "VAR_CACHE_MAX_NEGATIVE_TTL", "$accept",
- "toplevelvars", "toplevelvar", "serverstart", "contents_server",
- "content_server", "stubstart", "contents_stub", "content_stub",
- "forwardstart", "contents_forward", "content_forward",
- "server_num_threads", "server_verbosity", "server_statistics_interval",
- "server_statistics_cumulative", "server_extended_statistics",
- "server_port", "server_interface", "server_outgoing_interface",
- "server_outgoing_range", "server_outgoing_port_permit",
- "server_outgoing_port_avoid", "server_outgoing_num_tcp",
- "server_incoming_num_tcp", "server_interface_automatic", "server_do_ip4",
- "server_do_ip6", "server_do_udp", "server_do_tcp", "server_tcp_upstream",
+ "VAR_CAPS_WHITELIST", "VAR_CACHE_MAX_NEGATIVE_TTL",
+ "VAR_PERMIT_SMALL_HOLDDOWN", "$accept", "toplevelvars", "toplevelvar",
+ "serverstart", "contents_server", "content_server", "stubstart",
+ "contents_stub", "content_stub", "forwardstart", "contents_forward",
+ "content_forward", "server_num_threads", "server_verbosity",
+ "server_statistics_interval", "server_statistics_cumulative",
+ "server_extended_statistics", "server_port", "server_interface",
+ "server_outgoing_interface", "server_outgoing_range",
+ "server_outgoing_port_permit", "server_outgoing_port_avoid",
+ "server_outgoing_num_tcp", "server_incoming_num_tcp",
+ "server_interface_automatic", "server_do_ip4", "server_do_ip6",
+ "server_do_udp", "server_do_tcp", "server_tcp_upstream",
"server_ssl_upstream", "server_ssl_service_key",
"server_ssl_service_pem", "server_ssl_port", "server_do_daemonize",
"server_use_syslog", "server_log_time_ascii", "server_log_queries",
@@ -1039,7 +1043,8 @@ static const char *const yytname[] =
"server_val_clean_additional", "server_val_permissive_mode",
"server_ignore_cd_flag", "server_val_log_level",
"server_val_nsec3_keysize_iterations", "server_add_holddown",
- "server_del_holddown", "server_keep_missing", "server_key_cache_size",
+ "server_del_holddown", "server_keep_missing",
+ "server_permit_small_holddown", "server_key_cache_size",
"server_key_cache_slabs", "server_neg_cache_size", "server_local_zone",
"server_local_data", "server_local_data_ptr", "server_minimal_responses",
"server_rrset_roundrobin", "server_max_udp_size", "server_dns64_prefix",
@@ -1085,28 +1090,28 @@ static const yytype_uint16 yytoknum[] =
385, 386, 387, 388, 389, 390, 391, 392, 393, 394,
395, 396, 397, 398, 399, 400, 401, 402, 403, 404,
405, 406, 407, 408, 409, 410, 411, 412, 413, 414,
- 415
+ 415, 416
};
# endif
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_uint16 yyr1[] =
{
- 0, 161, 162, 162, 163, 163, 163, 163, 163, 163,
- 164, 165, 165, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
- 166, 166, 166, 166, 166, 166, 166, 166, 167, 168,
- 168, 169, 169, 169, 169, 169, 170, 171, 171, 172,
- 172, 172, 172, 173, 174, 175, 176, 177, 178, 179,
+ 0, 162, 163, 163, 164, 164, 164, 164, 164, 164,
+ 165, 166, 166, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 167, 167, 167, 167, 168,
+ 169, 169, 170, 170, 170, 170, 170, 171, 172, 172,
+ 173, 173, 173, 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,
@@ -1118,12 +1123,12 @@ static const yytype_uint16 yyr1[] =
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, 298,
- 299, 299, 299, 299, 299, 299, 299, 299, 300, 301,
- 302, 303, 304, 305, 306, 307, 308, 309, 309, 310,
- 310, 310, 310, 310, 310, 310, 310, 310, 310, 310,
- 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
- 320, 321, 322, 323, 324, 324, 325, 326
+ 290, 291, 292, 293, 294, 295, 296, 297, 298, 299,
+ 300, 300, 301, 301, 301, 301, 301, 301, 301, 301,
+ 302, 303, 304, 305, 306, 307, 308, 309, 310, 311,
+ 311, 312, 312, 312, 312, 312, 312, 312, 312, 312,
+ 312, 312, 312, 313, 314, 315, 316, 317, 318, 319,
+ 320, 321, 322, 323, 324, 325, 326, 326, 327, 328
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@@ -1141,26 +1146,26 @@ static const yytype_uint8 yyr2[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 0, 1, 1, 1, 1, 1, 1, 2, 0, 1,
- 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 3, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 3, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 3, 3, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 1, 2, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 1, 2, 0, 1, 2
+ 2, 0, 1, 1, 1, 1, 1, 1, 2, 0,
+ 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 3, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 3, 3, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 1,
+ 2, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 1, 2,
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 1, 2, 0, 1, 2
};
/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -1168,8 +1173,8 @@ static const yytype_uint8 yyr2[] =
means the default is an error. */
static const yytype_uint16 yydefact[] =
{
- 2, 0, 1, 10, 128, 136, 267, 313, 286, 3,
- 12, 130, 138, 269, 288, 315, 4, 5, 6, 8,
+ 2, 0, 1, 10, 129, 137, 269, 315, 288, 3,
+ 12, 131, 139, 271, 290, 317, 4, 5, 6, 8,
9, 7, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1181,62 +1186,62 @@ static const yytype_uint16 yydefact[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 11, 13, 14,
- 70, 73, 82, 15, 21, 61, 16, 74, 75, 32,
- 54, 69, 17, 18, 19, 20, 104, 105, 106, 107,
- 108, 71, 60, 86, 103, 22, 23, 24, 25, 26,
- 62, 76, 77, 92, 48, 58, 49, 87, 42, 43,
- 44, 45, 96, 100, 112, 119, 97, 55, 27, 28,
- 29, 84, 113, 114, 30, 31, 33, 34, 36, 37,
- 35, 117, 38, 39, 40, 46, 65, 101, 79, 118,
- 72, 126, 80, 81, 98, 99, 85, 41, 63, 66,
- 47, 50, 88, 89, 64, 127, 90, 51, 52, 53,
- 102, 91, 59, 93, 94, 95, 56, 57, 78, 67,
- 68, 83, 109, 110, 111, 115, 116, 120, 122, 121,
- 123, 124, 125, 0, 0, 0, 0, 0, 129, 131,
- 132, 133, 135, 134, 0, 0, 0, 0, 137, 139,
- 140, 141, 142, 0, 0, 0, 0, 0, 0, 0,
- 0, 268, 270, 272, 271, 277, 273, 274, 275, 276,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 287, 289, 290, 291, 292, 293, 294, 295,
- 296, 297, 298, 299, 300, 0, 314, 316, 144, 143,
- 148, 151, 149, 157, 158, 159, 160, 170, 171, 172,
- 173, 174, 193, 194, 195, 199, 200, 154, 201, 202,
- 205, 203, 204, 207, 208, 209, 222, 183, 184, 185,
- 186, 210, 225, 179, 181, 226, 232, 233, 234, 155,
- 192, 241, 242, 180, 237, 167, 150, 175, 223, 229,
- 211, 0, 0, 245, 156, 145, 166, 215, 146, 152,
- 153, 176, 177, 243, 213, 217, 218, 147, 246, 196,
- 221, 168, 182, 227, 228, 231, 236, 178, 240, 238,
- 239, 187, 191, 219, 220, 188, 189, 212, 235, 169,
- 161, 162, 163, 164, 165, 247, 248, 249, 197, 198,
- 206, 250, 251, 214, 190, 252, 254, 253, 0, 0,
- 257, 216, 230, 258, 259, 260, 262, 261, 263, 264,
- 265, 266, 278, 280, 279, 282, 283, 284, 285, 281,
- 301, 302, 303, 304, 305, 306, 307, 308, 309, 310,
- 311, 312, 317, 224, 244, 255, 256
+ 0, 0, 0, 0, 0, 0, 0, 0, 11, 13,
+ 14, 70, 73, 82, 15, 21, 61, 16, 74, 75,
+ 32, 54, 69, 17, 18, 19, 20, 104, 105, 106,
+ 107, 108, 71, 60, 86, 103, 22, 23, 24, 25,
+ 26, 62, 76, 77, 92, 48, 58, 49, 87, 42,
+ 43, 44, 45, 96, 100, 112, 119, 97, 55, 27,
+ 28, 29, 84, 113, 114, 30, 31, 33, 34, 36,
+ 37, 35, 117, 38, 39, 40, 46, 65, 101, 79,
+ 118, 72, 126, 80, 81, 98, 99, 85, 41, 63,
+ 66, 47, 50, 88, 89, 64, 127, 90, 51, 52,
+ 53, 102, 91, 59, 93, 94, 95, 128, 56, 57,
+ 78, 67, 68, 83, 109, 110, 111, 115, 116, 120,
+ 122, 121, 123, 124, 125, 0, 0, 0, 0, 0,
+ 130, 132, 133, 134, 136, 135, 0, 0, 0, 0,
+ 138, 140, 141, 142, 143, 0, 0, 0, 0, 0,
+ 0, 0, 0, 270, 272, 274, 273, 279, 275, 276,
+ 277, 278, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 289, 291, 292, 293, 294, 295,
+ 296, 297, 298, 299, 300, 301, 302, 0, 316, 318,
+ 145, 144, 149, 152, 150, 158, 159, 160, 161, 171,
+ 172, 173, 174, 175, 194, 195, 196, 200, 201, 155,
+ 202, 203, 206, 204, 205, 208, 209, 210, 223, 184,
+ 185, 186, 187, 211, 226, 180, 182, 227, 233, 234,
+ 235, 156, 193, 243, 244, 181, 238, 168, 151, 176,
+ 224, 230, 212, 0, 0, 247, 157, 146, 167, 216,
+ 147, 153, 154, 177, 178, 245, 214, 218, 219, 148,
+ 248, 197, 222, 169, 183, 228, 229, 232, 237, 179,
+ 241, 239, 240, 188, 192, 220, 221, 189, 190, 213,
+ 236, 170, 162, 163, 164, 165, 166, 249, 250, 251,
+ 198, 199, 207, 252, 253, 215, 191, 254, 256, 255,
+ 0, 0, 259, 217, 231, 242, 260, 261, 262, 264,
+ 263, 265, 266, 267, 268, 280, 282, 281, 284, 285,
+ 286, 287, 283, 303, 304, 305, 306, 307, 308, 309,
+ 310, 311, 312, 313, 314, 319, 225, 246, 257, 258
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 9, 10, 16, 137, 11, 17, 258, 12,
- 18, 268, 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, 259, 260, 261,
- 262, 263, 269, 270, 271, 272, 13, 19, 281, 282,
- 283, 284, 285, 286, 287, 288, 289, 14, 20, 302,
- 303, 304, 305, 306, 307, 308, 309, 310, 311, 312,
- 313, 314, 15, 21, 316, 317
+ -1, 1, 9, 10, 16, 138, 11, 17, 260, 12,
+ 18, 270, 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, 261, 262,
+ 263, 264, 265, 271, 272, 273, 274, 13, 19, 283,
+ 284, 285, 286, 287, 288, 289, 290, 291, 14, 20,
+ 304, 305, 306, 307, 308, 309, 310, 311, 312, 313,
+ 314, 315, 316, 15, 21, 318, 319
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
@@ -1247,17 +1252,17 @@ static const yytype_int16 yypact[] =
-81, 116, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -12, 89, 47, -13,
22, -80, 16, 17, 18, 23, 24, 78, 107, 120,
- 121, 122, 123, 124, 125, 126, 127, 128, 139, 140,
- 141, 142, 143, 145, 146, 147, 148, 149, 163, 164,
- 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
- 176, 177, 178, 180, 181, 182, 183, 184, 185, 186,
- 187, 188, 189, 190, 191, 192, 193, 195, 196, 197,
- 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
- 209, 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, 245, 246, 247, 248, 249, 250,
- 251, 252, 253, 254, 255, 256, 257, -81, -81, -81,
+ 121, 122, 123, 124, 125, 126, 127, 128, 140, 141,
+ 142, 143, 145, 146, 147, 148, 149, 163, 164, 166,
+ 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
+ 177, 178, 180, 181, 182, 183, 184, 185, 186, 187,
+ 188, 189, 190, 191, 192, 193, 195, 196, 197, 198,
+ 199, 200, 201, 202, 203, 204, 205, 206, 207, 209,
+ 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, 245, 246, 247, 248, 249, 250, 251,
+ 252, 253, 254, 255, 256, 257, 258, 259, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
@@ -1269,28 +1274,28 @@ static const yytype_int16 yypact[] =
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, 258, 259, 260, 261, 262, -81, -81,
- -81, -81, -81, -81, 263, 264, 265, 266, -81, -81,
- -81, -81, -81, 267, 268, 269, 270, 271, 272, 273,
- 274, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, -81, -81, 287, -81, -81, -81, -81,
+ -81, -81, -81, -81, -81, 260, 261, 262, 263, 264,
+ -81, -81, -81, -81, -81, -81, 265, 266, 267, 268,
+ -81, -81, -81, -81, -81, 269, 270, 271, 272, 273,
+ 274, 275, 276, -81, -81, -81, -81, -81, -81, -81,
+ -81, -81, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288, -81, -81, -81, -81, -81, -81,
+ -81, -81, -81, -81, -81, -81, -81, 289, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, 288, 289, -81, -81, -81, -81, -81, -81, -81,
+ -81, -81, -81, 290, 291, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, -81, -81, -81, -81, -81, 290, 291,
+ -81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
+ 292, 293, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, -81, -81, -81, -81
+ -81, -81, -81, -81, -81, -81, -81, -81, -81, -81
};
/* YYPGOTO[NTERM-NUM]. */
@@ -1312,7 +1317,7 @@ static const yytype_int8 yypgoto[] =
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
-81, -81, -81, -81, -81, -81, -81, -81, -81, -81,
- -81, -81, -81, -81, -81, -81
+ -81, -81, -81, -81, -81, -81, -81
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
@@ -1323,35 +1328,35 @@ static const yytype_uint16 yytable[] =
{
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, 315, 318, 319, 320, 47,
- 48, 49, 0, 321, 322, 50, 51, 52, 53, 54,
+ 42, 43, 44, 45, 46, 317, 320, 321, 322, 47,
+ 48, 49, 0, 323, 324, 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, 273, 274, 275, 276,
- 277, 278, 279, 280, 264, 91, 92, 93, 323, 94,
- 95, 96, 265, 266, 97, 98, 99, 100, 101, 102,
+ 85, 86, 87, 88, 89, 90, 275, 276, 277, 278,
+ 279, 280, 281, 282, 266, 91, 92, 93, 325, 94,
+ 95, 96, 267, 268, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
- 113, 114, 115, 116, 117, 118, 2, 324, 119, 120,
- 121, 122, 123, 124, 125, 126, 253, 3, 254, 255,
- 325, 326, 327, 328, 329, 330, 331, 332, 333, 127,
- 128, 129, 130, 131, 132, 133, 134, 135, 136, 334,
- 335, 336, 337, 338, 4, 339, 340, 341, 342, 343,
- 5, 290, 291, 292, 293, 294, 295, 296, 297, 298,
- 299, 300, 301, 344, 345, 267, 346, 347, 348, 349,
- 350, 351, 352, 353, 354, 355, 356, 357, 358, 256,
- 359, 360, 361, 362, 363, 364, 365, 366, 367, 368,
- 369, 370, 371, 372, 6, 373, 374, 375, 376, 377,
- 378, 379, 380, 381, 382, 383, 384, 385, 257, 386,
- 7, 387, 388, 389, 390, 391, 392, 393, 394, 395,
- 396, 397, 398, 399, 400, 401, 402, 403, 404, 405,
- 406, 407, 408, 409, 410, 411, 412, 413, 414, 415,
- 416, 417, 418, 419, 8, 420, 421, 422, 423, 424,
- 425, 426, 427, 428, 429, 430, 431, 432, 433, 434,
- 435, 436, 437, 438, 439, 440, 441, 442, 443, 444,
- 445, 446, 447, 448, 449, 450, 451, 452, 453, 454,
- 455, 456, 457, 458, 459, 460, 461, 462, 463, 464,
- 465, 466
+ 113, 114, 115, 116, 117, 118, 2, 326, 119, 120,
+ 121, 122, 123, 124, 125, 126, 255, 3, 256, 257,
+ 327, 328, 329, 330, 331, 332, 333, 334, 335, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135, 136, 137,
+ 336, 337, 338, 339, 4, 340, 341, 342, 343, 344,
+ 5, 292, 293, 294, 295, 296, 297, 298, 299, 300,
+ 301, 302, 303, 345, 346, 269, 347, 348, 349, 350,
+ 351, 352, 353, 354, 355, 356, 357, 358, 359, 258,
+ 360, 361, 362, 363, 364, 365, 366, 367, 368, 369,
+ 370, 371, 372, 373, 6, 374, 375, 376, 377, 378,
+ 379, 380, 381, 382, 383, 384, 385, 386, 259, 387,
+ 7, 388, 389, 390, 391, 392, 393, 394, 395, 396,
+ 397, 398, 399, 400, 401, 402, 403, 404, 405, 406,
+ 407, 408, 409, 410, 411, 412, 413, 414, 415, 416,
+ 417, 418, 419, 420, 8, 421, 422, 423, 424, 425,
+ 426, 427, 428, 429, 430, 431, 432, 433, 434, 435,
+ 436, 437, 438, 439, 440, 441, 442, 443, 444, 445,
+ 446, 447, 448, 449, 450, 451, 452, 453, 454, 455,
+ 456, 457, 458, 459, 460, 461, 462, 463, 464, 465,
+ 466, 467, 468, 469
};
#define yypact_value_is_default(Yystate) \
@@ -1376,7 +1381,7 @@ static const yytype_int16 yycheck[] =
122, 123, 124, 125, 126, 127, 0, 10, 130, 131,
132, 133, 134, 135, 136, 137, 37, 11, 39, 40,
10, 10, 10, 10, 10, 10, 10, 10, 10, 151,
- 152, 153, 154, 155, 156, 157, 158, 159, 160, 10,
+ 152, 153, 154, 155, 156, 157, 158, 159, 160, 161,
10, 10, 10, 10, 38, 10, 10, 10, 10, 10,
44, 139, 140, 141, 142, 143, 144, 145, 146, 147,
148, 149, 150, 10, 10, 128, 10, 10, 10, 10,
@@ -1392,16 +1397,16 @@ static const yytype_int16 yycheck[] =
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10
+ 10, 10, 10, 10
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_uint16 yystos[] =
{
- 0, 162, 0, 11, 38, 44, 88, 104, 138, 163,
- 164, 167, 170, 297, 308, 323, 165, 168, 171, 298,
- 309, 324, 12, 13, 14, 15, 16, 17, 18, 19,
+ 0, 163, 0, 11, 38, 44, 88, 104, 138, 164,
+ 165, 168, 171, 299, 310, 325, 166, 169, 172, 300,
+ 311, 326, 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, 41, 42, 43,
47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
@@ -1412,7 +1417,7 @@ static const yytype_uint16 yystos[] =
109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 123, 124, 125, 126, 127, 130,
131, 132, 133, 134, 135, 136, 137, 151, 152, 153,
- 154, 155, 156, 157, 158, 159, 160, 166, 173, 174,
+ 154, 155, 156, 157, 158, 159, 160, 161, 167, 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,
@@ -1424,13 +1429,13 @@ static const yytype_uint16 yystos[] =
255, 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, 37, 39, 40, 100, 129, 169, 288,
- 289, 290, 291, 292, 37, 45, 46, 128, 172, 293,
- 294, 295, 296, 89, 90, 91, 92, 93, 94, 95,
- 96, 299, 300, 301, 302, 303, 304, 305, 306, 307,
- 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
- 149, 150, 310, 311, 312, 313, 314, 315, 316, 317,
- 318, 319, 320, 321, 322, 105, 325, 326, 10, 10,
+ 285, 286, 287, 288, 289, 37, 39, 40, 100, 129,
+ 170, 290, 291, 292, 293, 294, 37, 45, 46, 128,
+ 173, 295, 296, 297, 298, 89, 90, 91, 92, 93,
+ 94, 95, 96, 301, 302, 303, 304, 305, 306, 307,
+ 308, 309, 139, 140, 141, 142, 143, 144, 145, 146,
+ 147, 148, 149, 150, 312, 313, 314, 315, 316, 317,
+ 318, 319, 320, 321, 322, 323, 324, 105, 327, 328,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
@@ -1445,7 +1450,7 @@ static const yytype_uint16 yystos[] =
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
};
#define yyerrok (yyerrstatus = 0)
@@ -2253,9 +2258,9 @@ yyreduce:
}
break;
- case 128:
+ case 129:
/* Line 1792 of yacc.c */
-#line 191 "./util/configparser.y"
+#line 192 "./util/configparser.y"
{
struct config_stub* s;
OUTYY(("\nP(stub_zone:)\n"));
@@ -2268,9 +2273,9 @@ yyreduce:
}
break;
- case 136:
+ case 137:
/* Line 1792 of yacc.c */
-#line 207 "./util/configparser.y"
+#line 208 "./util/configparser.y"
{
struct config_stub* s;
OUTYY(("\nP(forward_zone:)\n"));
@@ -2283,9 +2288,9 @@ yyreduce:
}
break;
- case 143:
+ case 144:
/* Line 1792 of yacc.c */
-#line 223 "./util/configparser.y"
+#line 224 "./util/configparser.y"
{
OUTYY(("P(server_num_threads:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2295,9 +2300,9 @@ yyreduce:
}
break;
- case 144:
+ case 145:
/* Line 1792 of yacc.c */
-#line 232 "./util/configparser.y"
+#line 233 "./util/configparser.y"
{
OUTYY(("P(server_verbosity:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2307,9 +2312,9 @@ yyreduce:
}
break;
- case 145:
+ case 146:
/* Line 1792 of yacc.c */
-#line 241 "./util/configparser.y"
+#line 242 "./util/configparser.y"
{
OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "") == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0)
@@ -2321,9 +2326,9 @@ yyreduce:
}
break;
- case 146:
+ case 147:
/* Line 1792 of yacc.c */
-#line 252 "./util/configparser.y"
+#line 253 "./util/configparser.y"
{
OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2333,9 +2338,9 @@ yyreduce:
}
break;
- case 147:
+ case 148:
/* Line 1792 of yacc.c */
-#line 261 "./util/configparser.y"
+#line 262 "./util/configparser.y"
{
OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2345,9 +2350,9 @@ yyreduce:
}
break;
- case 148:
+ case 149:
/* Line 1792 of yacc.c */
-#line 270 "./util/configparser.y"
+#line 271 "./util/configparser.y"
{
OUTYY(("P(server_port:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2357,9 +2362,9 @@ yyreduce:
}
break;
- case 149:
+ case 150:
/* Line 1792 of yacc.c */
-#line 279 "./util/configparser.y"
+#line 280 "./util/configparser.y"
{
OUTYY(("P(server_interface:%s)\n", (yyvsp[(2) - (2)].str)));
if(cfg_parser->cfg->num_ifs == 0)
@@ -2373,9 +2378,9 @@ yyreduce:
}
break;
- case 150:
+ case 151:
/* Line 1792 of yacc.c */
-#line 292 "./util/configparser.y"
+#line 293 "./util/configparser.y"
{
OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[(2) - (2)].str)));
if(cfg_parser->cfg->num_out_ifs == 0)
@@ -2391,9 +2396,9 @@ yyreduce:
}
break;
- case 151:
+ case 152:
/* Line 1792 of yacc.c */
-#line 307 "./util/configparser.y"
+#line 308 "./util/configparser.y"
{
OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2403,9 +2408,9 @@ yyreduce:
}
break;
- case 152:
+ case 153:
/* Line 1792 of yacc.c */
-#line 316 "./util/configparser.y"
+#line 317 "./util/configparser.y"
{
OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 1,
@@ -2415,9 +2420,9 @@ yyreduce:
}
break;
- case 153:
+ case 154:
/* Line 1792 of yacc.c */
-#line 325 "./util/configparser.y"
+#line 326 "./util/configparser.y"
{
OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_mark_ports((yyvsp[(2) - (2)].str), 0,
@@ -2427,9 +2432,9 @@ yyreduce:
}
break;
- case 154:
+ case 155:
/* Line 1792 of yacc.c */
-#line 334 "./util/configparser.y"
+#line 335 "./util/configparser.y"
{
OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2439,9 +2444,9 @@ yyreduce:
}
break;
- case 155:
+ case 156:
/* Line 1792 of yacc.c */
-#line 343 "./util/configparser.y"
+#line 344 "./util/configparser.y"
{
OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2451,9 +2456,9 @@ yyreduce:
}
break;
- case 156:
+ case 157:
/* Line 1792 of yacc.c */
-#line 352 "./util/configparser.y"
+#line 353 "./util/configparser.y"
{
OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2463,9 +2468,9 @@ yyreduce:
}
break;
- case 157:
+ case 158:
/* Line 1792 of yacc.c */
-#line 361 "./util/configparser.y"
+#line 362 "./util/configparser.y"
{
OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2475,9 +2480,9 @@ yyreduce:
}
break;
- case 158:
+ case 159:
/* Line 1792 of yacc.c */
-#line 370 "./util/configparser.y"
+#line 371 "./util/configparser.y"
{
OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2487,9 +2492,9 @@ yyreduce:
}
break;
- case 159:
+ case 160:
/* Line 1792 of yacc.c */
-#line 379 "./util/configparser.y"
+#line 380 "./util/configparser.y"
{
OUTYY(("P(server_do_udp:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2499,9 +2504,9 @@ yyreduce:
}
break;
- case 160:
+ case 161:
/* Line 1792 of yacc.c */
-#line 388 "./util/configparser.y"
+#line 389 "./util/configparser.y"
{
OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2511,9 +2516,9 @@ yyreduce:
}
break;
- case 161:
+ case 162:
/* Line 1792 of yacc.c */
-#line 397 "./util/configparser.y"
+#line 398 "./util/configparser.y"
{
OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2523,9 +2528,9 @@ yyreduce:
}
break;
- case 162:
+ case 163:
/* Line 1792 of yacc.c */
-#line 406 "./util/configparser.y"
+#line 407 "./util/configparser.y"
{
OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2535,9 +2540,9 @@ yyreduce:
}
break;
- case 163:
+ case 164:
/* Line 1792 of yacc.c */
-#line 415 "./util/configparser.y"
+#line 416 "./util/configparser.y"
{
OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->ssl_service_key);
@@ -2545,9 +2550,9 @@ yyreduce:
}
break;
- case 164:
+ case 165:
/* Line 1792 of yacc.c */
-#line 422 "./util/configparser.y"
+#line 423 "./util/configparser.y"
{
OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->ssl_service_pem);
@@ -2555,9 +2560,9 @@ yyreduce:
}
break;
- case 165:
+ case 166:
/* Line 1792 of yacc.c */
-#line 429 "./util/configparser.y"
+#line 430 "./util/configparser.y"
{
OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2567,9 +2572,9 @@ yyreduce:
}
break;
- case 166:
+ case 167:
/* Line 1792 of yacc.c */
-#line 438 "./util/configparser.y"
+#line 439 "./util/configparser.y"
{
OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2579,9 +2584,9 @@ yyreduce:
}
break;
- case 167:
+ case 168:
/* Line 1792 of yacc.c */
-#line 447 "./util/configparser.y"
+#line 448 "./util/configparser.y"
{
OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2596,9 +2601,9 @@ yyreduce:
}
break;
- case 168:
+ case 169:
/* Line 1792 of yacc.c */
-#line 461 "./util/configparser.y"
+#line 462 "./util/configparser.y"
{
OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2608,9 +2613,9 @@ yyreduce:
}
break;
- case 169:
+ case 170:
/* Line 1792 of yacc.c */
-#line 470 "./util/configparser.y"
+#line 471 "./util/configparser.y"
{
OUTYY(("P(server_log_queries:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2620,9 +2625,9 @@ yyreduce:
}
break;
- case 170:
+ case 171:
/* Line 1792 of yacc.c */
-#line 479 "./util/configparser.y"
+#line 480 "./util/configparser.y"
{
OUTYY(("P(server_chroot:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->chrootdir);
@@ -2630,9 +2635,9 @@ yyreduce:
}
break;
- case 171:
+ case 172:
/* Line 1792 of yacc.c */
-#line 486 "./util/configparser.y"
+#line 487 "./util/configparser.y"
{
OUTYY(("P(server_username:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->username);
@@ -2640,9 +2645,9 @@ yyreduce:
}
break;
- case 172:
+ case 173:
/* Line 1792 of yacc.c */
-#line 493 "./util/configparser.y"
+#line 494 "./util/configparser.y"
{
OUTYY(("P(server_directory:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->directory);
@@ -2650,9 +2655,9 @@ yyreduce:
}
break;
- case 173:
+ case 174:
/* Line 1792 of yacc.c */
-#line 500 "./util/configparser.y"
+#line 501 "./util/configparser.y"
{
OUTYY(("P(server_logfile:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->logfile);
@@ -2661,9 +2666,9 @@ yyreduce:
}
break;
- case 174:
+ case 175:
/* Line 1792 of yacc.c */
-#line 508 "./util/configparser.y"
+#line 509 "./util/configparser.y"
{
OUTYY(("P(server_pidfile:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->pidfile);
@@ -2671,9 +2676,9 @@ yyreduce:
}
break;
- case 175:
+ case 176:
/* Line 1792 of yacc.c */
-#line 515 "./util/configparser.y"
+#line 516 "./util/configparser.y"
{
OUTYY(("P(server_root_hints:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[(2) - (2)].str)))
@@ -2681,9 +2686,9 @@ yyreduce:
}
break;
- case 176:
+ case 177:
/* Line 1792 of yacc.c */
-#line 522 "./util/configparser.y"
+#line 523 "./util/configparser.y"
{
OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->dlv_anchor_file);
@@ -2691,9 +2696,9 @@ yyreduce:
}
break;
- case 177:
+ case 178:
/* Line 1792 of yacc.c */
-#line 529 "./util/configparser.y"
+#line 530 "./util/configparser.y"
{
OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, (yyvsp[(2) - (2)].str)))
@@ -2701,9 +2706,9 @@ yyreduce:
}
break;
- case 178:
+ case 179:
/* Line 1792 of yacc.c */
-#line 536 "./util/configparser.y"
+#line 537 "./util/configparser.y"
{
OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
@@ -2712,9 +2717,9 @@ yyreduce:
}
break;
- case 179:
+ case 180:
/* Line 1792 of yacc.c */
-#line 544 "./util/configparser.y"
+#line 545 "./util/configparser.y"
{
OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
@@ -2723,9 +2728,9 @@ yyreduce:
}
break;
- case 180:
+ case 181:
/* Line 1792 of yacc.c */
-#line 552 "./util/configparser.y"
+#line 553 "./util/configparser.y"
{
OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
@@ -2734,9 +2739,9 @@ yyreduce:
}
break;
- case 181:
+ case 182:
/* Line 1792 of yacc.c */
-#line 560 "./util/configparser.y"
+#line 561 "./util/configparser.y"
{
OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[(2) - (2)].str)))
@@ -2744,9 +2749,9 @@ yyreduce:
}
break;
- case 182:
+ case 183:
/* Line 1792 of yacc.c */
-#line 567 "./util/configparser.y"
+#line 568 "./util/configparser.y"
{
OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[(2) - (2)].str)))
@@ -2754,9 +2759,9 @@ yyreduce:
}
break;
- case 183:
+ case 184:
/* Line 1792 of yacc.c */
-#line 574 "./util/configparser.y"
+#line 575 "./util/configparser.y"
{
OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2766,9 +2771,9 @@ yyreduce:
}
break;
- case 184:
+ case 185:
/* Line 1792 of yacc.c */
-#line 583 "./util/configparser.y"
+#line 584 "./util/configparser.y"
{
OUTYY(("P(server_hide_version:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2778,9 +2783,9 @@ yyreduce:
}
break;
- case 185:
+ case 186:
/* Line 1792 of yacc.c */
-#line 592 "./util/configparser.y"
+#line 593 "./util/configparser.y"
{
OUTYY(("P(server_identity:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->identity);
@@ -2788,9 +2793,9 @@ yyreduce:
}
break;
- case 186:
+ case 187:
/* Line 1792 of yacc.c */
-#line 599 "./util/configparser.y"
+#line 600 "./util/configparser.y"
{
OUTYY(("P(server_version:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->version);
@@ -2798,9 +2803,9 @@ yyreduce:
}
break;
- case 187:
+ case 188:
/* Line 1792 of yacc.c */
-#line 606 "./util/configparser.y"
+#line 607 "./util/configparser.y"
{
OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->so_rcvbuf))
@@ -2809,9 +2814,9 @@ yyreduce:
}
break;
- case 188:
+ case 189:
/* Line 1792 of yacc.c */
-#line 614 "./util/configparser.y"
+#line 615 "./util/configparser.y"
{
OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->so_sndbuf))
@@ -2820,9 +2825,9 @@ yyreduce:
}
break;
- case 189:
+ case 190:
/* Line 1792 of yacc.c */
-#line 622 "./util/configparser.y"
+#line 623 "./util/configparser.y"
{
OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2833,9 +2838,9 @@ yyreduce:
}
break;
- case 190:
+ case 191:
/* Line 1792 of yacc.c */
-#line 632 "./util/configparser.y"
+#line 633 "./util/configparser.y"
{
OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2846,9 +2851,9 @@ yyreduce:
}
break;
- case 191:
+ case 192:
/* Line 1792 of yacc.c */
-#line 642 "./util/configparser.y"
+#line 643 "./util/configparser.y"
{
OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2862,9 +2867,9 @@ yyreduce:
}
break;
- case 192:
+ case 193:
/* Line 1792 of yacc.c */
-#line 655 "./util/configparser.y"
+#line 656 "./util/configparser.y"
{
OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2876,9 +2881,9 @@ yyreduce:
}
break;
- case 193:
+ case 194:
/* Line 1792 of yacc.c */
-#line 666 "./util/configparser.y"
+#line 667 "./util/configparser.y"
{
OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->msg_cache_size))
@@ -2887,9 +2892,9 @@ yyreduce:
}
break;
- case 194:
+ case 195:
/* Line 1792 of yacc.c */
-#line 674 "./util/configparser.y"
+#line 675 "./util/configparser.y"
{
OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2903,9 +2908,9 @@ yyreduce:
}
break;
- case 195:
+ case 196:
/* Line 1792 of yacc.c */
-#line 687 "./util/configparser.y"
+#line 688 "./util/configparser.y"
{
OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2915,9 +2920,9 @@ yyreduce:
}
break;
- case 196:
+ case 197:
/* Line 1792 of yacc.c */
-#line 696 "./util/configparser.y"
+#line 697 "./util/configparser.y"
{
OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2927,9 +2932,9 @@ yyreduce:
}
break;
- case 197:
+ case 198:
/* Line 1792 of yacc.c */
-#line 705 "./util/configparser.y"
+#line 706 "./util/configparser.y"
{
OUTYY(("P(server_delay_close:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2939,9 +2944,9 @@ yyreduce:
}
break;
- case 198:
+ case 199:
/* Line 1792 of yacc.c */
-#line 714 "./util/configparser.y"
+#line 715 "./util/configparser.y"
{
OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -2952,9 +2957,9 @@ yyreduce:
}
break;
- case 199:
+ case 200:
/* Line 1792 of yacc.c */
-#line 724 "./util/configparser.y"
+#line 725 "./util/configparser.y"
{
OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->rrset_cache_size))
@@ -2963,9 +2968,9 @@ yyreduce:
}
break;
- case 200:
+ case 201:
/* Line 1792 of yacc.c */
-#line 732 "./util/configparser.y"
+#line 733 "./util/configparser.y"
{
OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -2979,9 +2984,9 @@ yyreduce:
}
break;
- case 201:
+ case 202:
/* Line 1792 of yacc.c */
-#line 745 "./util/configparser.y"
+#line 746 "./util/configparser.y"
{
OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -2991,9 +2996,9 @@ yyreduce:
}
break;
- case 202:
+ case 203:
/* Line 1792 of yacc.c */
-#line 754 "./util/configparser.y"
+#line 755 "./util/configparser.y"
{
OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
@@ -3002,9 +3007,9 @@ yyreduce:
}
break;
- case 203:
+ case 204:
/* Line 1792 of yacc.c */
-#line 762 "./util/configparser.y"
+#line 763 "./util/configparser.y"
{
OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -3014,9 +3019,9 @@ yyreduce:
}
break;
- case 204:
+ case 205:
/* Line 1792 of yacc.c */
-#line 771 "./util/configparser.y"
+#line 772 "./util/configparser.y"
{
OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[(2) - (2)].str)));
verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
@@ -3025,9 +3030,9 @@ yyreduce:
}
break;
- case 205:
+ case 206:
/* Line 1792 of yacc.c */
-#line 779 "./util/configparser.y"
+#line 780 "./util/configparser.y"
{
OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -3041,9 +3046,9 @@ yyreduce:
}
break;
- case 206:
+ case 207:
/* Line 1792 of yacc.c */
-#line 792 "./util/configparser.y"
+#line 793 "./util/configparser.y"
{
OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3053,9 +3058,9 @@ yyreduce:
}
break;
- case 207:
+ case 208:
/* Line 1792 of yacc.c */
-#line 801 "./util/configparser.y"
+#line 802 "./util/configparser.y"
{
OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->target_fetch_policy);
@@ -3063,9 +3068,9 @@ yyreduce:
}
break;
- case 208:
+ case 209:
/* Line 1792 of yacc.c */
-#line 808 "./util/configparser.y"
+#line 809 "./util/configparser.y"
{
OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3076,9 +3081,9 @@ yyreduce:
}
break;
- case 209:
+ case 210:
/* Line 1792 of yacc.c */
-#line 818 "./util/configparser.y"
+#line 819 "./util/configparser.y"
{
OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3089,9 +3094,9 @@ yyreduce:
}
break;
- case 210:
+ case 211:
/* Line 1792 of yacc.c */
-#line 828 "./util/configparser.y"
+#line 829 "./util/configparser.y"
{
OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3102,9 +3107,9 @@ yyreduce:
}
break;
- case 211:
+ case 212:
/* Line 1792 of yacc.c */
-#line 838 "./util/configparser.y"
+#line 839 "./util/configparser.y"
{
OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3115,9 +3120,9 @@ yyreduce:
}
break;
- case 212:
+ case 213:
/* Line 1792 of yacc.c */
-#line 848 "./util/configparser.y"
+#line 849 "./util/configparser.y"
{
OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3128,9 +3133,9 @@ yyreduce:
}
break;
- case 213:
+ case 214:
/* Line 1792 of yacc.c */
-#line 858 "./util/configparser.y"
+#line 859 "./util/configparser.y"
{
OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3141,9 +3146,9 @@ yyreduce:
}
break;
- case 214:
+ case 215:
/* Line 1792 of yacc.c */
-#line 868 "./util/configparser.y"
+#line 869 "./util/configparser.y"
{
OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3154,9 +3159,9 @@ yyreduce:
}
break;
- case 215:
+ case 216:
/* Line 1792 of yacc.c */
-#line 878 "./util/configparser.y"
+#line 879 "./util/configparser.y"
{
OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3167,9 +3172,9 @@ yyreduce:
}
break;
- case 216:
+ case 217:
/* Line 1792 of yacc.c */
-#line 888 "./util/configparser.y"
+#line 889 "./util/configparser.y"
{
OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[(2) - (2)].str)))
@@ -3177,9 +3182,9 @@ yyreduce:
}
break;
- case 217:
+ case 218:
/* Line 1792 of yacc.c */
-#line 895 "./util/configparser.y"
+#line 896 "./util/configparser.y"
{
OUTYY(("P(server_private_address:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[(2) - (2)].str)))
@@ -3187,9 +3192,9 @@ yyreduce:
}
break;
- case 218:
+ case 219:
/* Line 1792 of yacc.c */
-#line 902 "./util/configparser.y"
+#line 903 "./util/configparser.y"
{
OUTYY(("P(server_private_domain:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[(2) - (2)].str)))
@@ -3197,9 +3202,9 @@ yyreduce:
}
break;
- case 219:
+ case 220:
/* Line 1792 of yacc.c */
-#line 909 "./util/configparser.y"
+#line 910 "./util/configparser.y"
{
OUTYY(("P(server_prefetch:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3209,9 +3214,9 @@ yyreduce:
}
break;
- case 220:
+ case 221:
/* Line 1792 of yacc.c */
-#line 918 "./util/configparser.y"
+#line 919 "./util/configparser.y"
{
OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3221,9 +3226,9 @@ yyreduce:
}
break;
- case 221:
+ case 222:
/* Line 1792 of yacc.c */
-#line 927 "./util/configparser.y"
+#line 928 "./util/configparser.y"
{
OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3233,9 +3238,9 @@ yyreduce:
}
break;
- case 222:
+ case 223:
/* Line 1792 of yacc.c */
-#line 936 "./util/configparser.y"
+#line 937 "./util/configparser.y"
{
OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[(2) - (2)].str)))
@@ -3243,9 +3248,9 @@ yyreduce:
}
break;
- case 223:
+ case 224:
/* Line 1792 of yacc.c */
-#line 943 "./util/configparser.y"
+#line 944 "./util/configparser.y"
{
OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3256,9 +3261,9 @@ yyreduce:
}
break;
- case 224:
+ case 225:
/* Line 1792 of yacc.c */
-#line 953 "./util/configparser.y"
+#line 954 "./util/configparser.y"
{
OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
if(strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && strcmp((yyvsp[(3) - (3)].str), "refuse")!=0 &&
@@ -3276,9 +3281,9 @@ yyreduce:
}
break;
- case 225:
+ case 226:
/* Line 1792 of yacc.c */
-#line 970 "./util/configparser.y"
+#line 971 "./util/configparser.y"
{
OUTYY(("P(server_module_conf:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->module_conf);
@@ -3286,9 +3291,9 @@ yyreduce:
}
break;
- case 226:
+ case 227:
/* Line 1792 of yacc.c */
-#line 977 "./util/configparser.y"
+#line 978 "./util/configparser.y"
{
OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[(2) - (2)].str)));
if(strlen((yyvsp[(2) - (2)].str)) == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) {
@@ -3307,9 +3312,9 @@ yyreduce:
}
break;
- case 227:
+ case 228:
/* Line 1792 of yacc.c */
-#line 995 "./util/configparser.y"
+#line 996 "./util/configparser.y"
{
OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[(2) - (2)].str)));
if(strlen((yyvsp[(2) - (2)].str)) == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) {
@@ -3323,9 +3328,9 @@ yyreduce:
}
break;
- case 228:
+ case 229:
/* Line 1792 of yacc.c */
-#line 1008 "./util/configparser.y"
+#line 1009 "./util/configparser.y"
{
OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[(2) - (2)].str)));
if(strlen((yyvsp[(2) - (2)].str)) == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) {
@@ -3339,9 +3344,9 @@ yyreduce:
}
break;
- case 229:
+ case 230:
/* Line 1792 of yacc.c */
-#line 1021 "./util/configparser.y"
+#line 1022 "./util/configparser.y"
{
OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3351,9 +3356,9 @@ yyreduce:
}
break;
- case 230:
+ case 231:
/* Line 1792 of yacc.c */
-#line 1030 "./util/configparser.y"
+#line 1031 "./util/configparser.y"
{
OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3363,9 +3368,9 @@ yyreduce:
}
break;
- case 231:
+ case 232:
/* Line 1792 of yacc.c */
-#line 1039 "./util/configparser.y"
+#line 1040 "./util/configparser.y"
{
OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3375,9 +3380,9 @@ yyreduce:
}
break;
- case 232:
+ case 233:
/* Line 1792 of yacc.c */
-#line 1048 "./util/configparser.y"
+#line 1049 "./util/configparser.y"
{
OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3387,9 +3392,9 @@ yyreduce:
}
break;
- case 233:
+ case 234:
/* Line 1792 of yacc.c */
-#line 1057 "./util/configparser.y"
+#line 1058 "./util/configparser.y"
{
OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3400,9 +3405,9 @@ yyreduce:
}
break;
- case 234:
+ case 235:
/* Line 1792 of yacc.c */
-#line 1067 "./util/configparser.y"
+#line 1068 "./util/configparser.y"
{
OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3413,9 +3418,9 @@ yyreduce:
}
break;
- case 235:
+ case 236:
/* Line 1792 of yacc.c */
-#line 1077 "./util/configparser.y"
+#line 1078 "./util/configparser.y"
{
OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3425,9 +3430,9 @@ yyreduce:
}
break;
- case 236:
+ case 237:
/* Line 1792 of yacc.c */
-#line 1086 "./util/configparser.y"
+#line 1087 "./util/configparser.y"
{
OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3437,9 +3442,9 @@ yyreduce:
}
break;
- case 237:
+ case 238:
/* Line 1792 of yacc.c */
-#line 1095 "./util/configparser.y"
+#line 1096 "./util/configparser.y"
{
OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->val_nsec3_key_iterations);
@@ -3447,9 +3452,9 @@ yyreduce:
}
break;
- case 238:
+ case 239:
/* Line 1792 of yacc.c */
-#line 1102 "./util/configparser.y"
+#line 1103 "./util/configparser.y"
{
OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3459,9 +3464,9 @@ yyreduce:
}
break;
- case 239:
+ case 240:
/* Line 1792 of yacc.c */
-#line 1111 "./util/configparser.y"
+#line 1112 "./util/configparser.y"
{
OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3471,9 +3476,9 @@ yyreduce:
}
break;
- case 240:
+ case 241:
/* Line 1792 of yacc.c */
-#line 1120 "./util/configparser.y"
+#line 1121 "./util/configparser.y"
{
OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3483,9 +3488,22 @@ yyreduce:
}
break;
- case 241:
+ case 242:
/* Line 1792 of yacc.c */
-#line 1129 "./util/configparser.y"
+#line 1130 "./util/configparser.y"
+ {
+ OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[(2) - (2)].str)));
+ if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->permit_small_holddown =
+ (strcmp((yyvsp[(2) - (2)].str), "yes")==0);
+ free((yyvsp[(2) - (2)].str));
+ }
+ break;
+
+ case 243:
+/* Line 1792 of yacc.c */
+#line 1139 "./util/configparser.y"
{
OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->key_cache_size))
@@ -3494,9 +3512,9 @@ yyreduce:
}
break;
- case 242:
+ case 244:
/* Line 1792 of yacc.c */
-#line 1137 "./util/configparser.y"
+#line 1147 "./util/configparser.y"
{
OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -3510,9 +3528,9 @@ yyreduce:
}
break;
- case 243:
+ case 245:
/* Line 1792 of yacc.c */
-#line 1150 "./util/configparser.y"
+#line 1160 "./util/configparser.y"
{
OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->neg_cache_size))
@@ -3521,9 +3539,9 @@ yyreduce:
}
break;
- case 244:
+ case 246:
/* Line 1792 of yacc.c */
-#line 1158 "./util/configparser.y"
+#line 1168 "./util/configparser.y"
{
OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
if(strcmp((yyvsp[(3) - (3)].str), "static")!=0 && strcmp((yyvsp[(3) - (3)].str), "deny")!=0 &&
@@ -3548,9 +3566,9 @@ yyreduce:
}
break;
- case 245:
+ case 247:
/* Line 1792 of yacc.c */
-#line 1182 "./util/configparser.y"
+#line 1192 "./util/configparser.y"
{
OUTYY(("P(server_local_data:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[(2) - (2)].str)))
@@ -3558,9 +3576,9 @@ yyreduce:
}
break;
- case 246:
+ case 248:
/* Line 1792 of yacc.c */
-#line 1189 "./util/configparser.y"
+#line 1199 "./util/configparser.y"
{
char* ptr;
OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[(2) - (2)].str)));
@@ -3576,9 +3594,9 @@ yyreduce:
}
break;
- case 247:
+ case 249:
/* Line 1792 of yacc.c */
-#line 1204 "./util/configparser.y"
+#line 1214 "./util/configparser.y"
{
OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3589,9 +3607,9 @@ yyreduce:
}
break;
- case 248:
+ case 250:
/* Line 1792 of yacc.c */
-#line 1214 "./util/configparser.y"
+#line 1224 "./util/configparser.y"
{
OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3602,9 +3620,9 @@ yyreduce:
}
break;
- case 249:
+ case 251:
/* Line 1792 of yacc.c */
-#line 1224 "./util/configparser.y"
+#line 1234 "./util/configparser.y"
{
OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[(2) - (2)].str)));
cfg_parser->cfg->max_udp_size = atoi((yyvsp[(2) - (2)].str));
@@ -3612,9 +3630,9 @@ yyreduce:
}
break;
- case 250:
+ case 252:
/* Line 1792 of yacc.c */
-#line 1231 "./util/configparser.y"
+#line 1241 "./util/configparser.y"
{
OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->dns64_prefix);
@@ -3622,9 +3640,9 @@ yyreduce:
}
break;
- case 251:
+ case 253:
/* Line 1792 of yacc.c */
-#line 1238 "./util/configparser.y"
+#line 1248 "./util/configparser.y"
{
OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3634,9 +3652,9 @@ yyreduce:
}
break;
- case 252:
+ case 254:
/* Line 1792 of yacc.c */
-#line 1247 "./util/configparser.y"
+#line 1257 "./util/configparser.y"
{
OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3646,9 +3664,9 @@ yyreduce:
}
break;
- case 253:
+ case 255:
/* Line 1792 of yacc.c */
-#line 1256 "./util/configparser.y"
+#line 1266 "./util/configparser.y"
{
OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->ratelimit_size))
@@ -3657,9 +3675,9 @@ yyreduce:
}
break;
- case 254:
+ case 256:
/* Line 1792 of yacc.c */
-#line 1264 "./util/configparser.y"
+#line 1274 "./util/configparser.y"
{
OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -3673,9 +3691,9 @@ yyreduce:
}
break;
- case 255:
+ case 257:
/* Line 1792 of yacc.c */
-#line 1277 "./util/configparser.y"
+#line 1287 "./util/configparser.y"
{
OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
if(atoi((yyvsp[(3) - (3)].str)) == 0 && strcmp((yyvsp[(3) - (3)].str), "0") != 0) {
@@ -3689,9 +3707,9 @@ yyreduce:
}
break;
- case 256:
+ case 258:
/* Line 1792 of yacc.c */
-#line 1290 "./util/configparser.y"
+#line 1300 "./util/configparser.y"
{
OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
if(atoi((yyvsp[(3) - (3)].str)) == 0 && strcmp((yyvsp[(3) - (3)].str), "0") != 0) {
@@ -3705,9 +3723,9 @@ yyreduce:
}
break;
- case 257:
+ case 259:
/* Line 1792 of yacc.c */
-#line 1303 "./util/configparser.y"
+#line 1313 "./util/configparser.y"
{
OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
@@ -3717,9 +3735,9 @@ yyreduce:
}
break;
- case 258:
+ case 260:
/* Line 1792 of yacc.c */
-#line 1312 "./util/configparser.y"
+#line 1322 "./util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
if(cfg_parser->cfg->stubs->name)
@@ -3730,9 +3748,9 @@ yyreduce:
}
break;
- case 259:
+ case 261:
/* Line 1792 of yacc.c */
-#line 1322 "./util/configparser.y"
+#line 1332 "./util/configparser.y"
{
OUTYY(("P(stub-host:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[(2) - (2)].str)))
@@ -3740,9 +3758,9 @@ yyreduce:
}
break;
- case 260:
+ case 262:
/* Line 1792 of yacc.c */
-#line 1329 "./util/configparser.y"
+#line 1339 "./util/configparser.y"
{
OUTYY(("P(stub-addr:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[(2) - (2)].str)))
@@ -3750,9 +3768,9 @@ yyreduce:
}
break;
- case 261:
+ case 263:
/* Line 1792 of yacc.c */
-#line 1336 "./util/configparser.y"
+#line 1346 "./util/configparser.y"
{
OUTYY(("P(stub-first:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3762,9 +3780,9 @@ yyreduce:
}
break;
- case 262:
+ case 264:
/* Line 1792 of yacc.c */
-#line 1345 "./util/configparser.y"
+#line 1355 "./util/configparser.y"
{
OUTYY(("P(stub-prime:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3775,9 +3793,9 @@ yyreduce:
}
break;
- case 263:
+ case 265:
/* Line 1792 of yacc.c */
-#line 1355 "./util/configparser.y"
+#line 1365 "./util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
if(cfg_parser->cfg->forwards->name)
@@ -3788,9 +3806,9 @@ yyreduce:
}
break;
- case 264:
+ case 266:
/* Line 1792 of yacc.c */
-#line 1365 "./util/configparser.y"
+#line 1375 "./util/configparser.y"
{
OUTYY(("P(forward-host:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[(2) - (2)].str)))
@@ -3798,9 +3816,9 @@ yyreduce:
}
break;
- case 265:
+ case 267:
/* Line 1792 of yacc.c */
-#line 1372 "./util/configparser.y"
+#line 1382 "./util/configparser.y"
{
OUTYY(("P(forward-addr:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[(2) - (2)].str)))
@@ -3808,9 +3826,9 @@ yyreduce:
}
break;
- case 266:
+ case 268:
/* Line 1792 of yacc.c */
-#line 1379 "./util/configparser.y"
+#line 1389 "./util/configparser.y"
{
OUTYY(("P(forward-first:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3820,17 +3838,17 @@ yyreduce:
}
break;
- case 267:
+ case 269:
/* Line 1792 of yacc.c */
-#line 1388 "./util/configparser.y"
+#line 1398 "./util/configparser.y"
{
OUTYY(("\nP(remote-control:)\n"));
}
break;
- case 278:
+ case 280:
/* Line 1792 of yacc.c */
-#line 1399 "./util/configparser.y"
+#line 1409 "./util/configparser.y"
{
OUTYY(("P(control_enable:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3841,9 +3859,9 @@ yyreduce:
}
break;
- case 279:
+ case 281:
/* Line 1792 of yacc.c */
-#line 1409 "./util/configparser.y"
+#line 1419 "./util/configparser.y"
{
OUTYY(("P(control_port:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
@@ -3853,9 +3871,9 @@ yyreduce:
}
break;
- case 280:
+ case 282:
/* Line 1792 of yacc.c */
-#line 1418 "./util/configparser.y"
+#line 1428 "./util/configparser.y"
{
OUTYY(("P(control_interface:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, (yyvsp[(2) - (2)].str)))
@@ -3863,9 +3881,9 @@ yyreduce:
}
break;
- case 281:
+ case 283:
/* Line 1792 of yacc.c */
-#line 1425 "./util/configparser.y"
+#line 1435 "./util/configparser.y"
{
OUTYY(("P(control_use_cert:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3876,9 +3894,9 @@ yyreduce:
}
break;
- case 282:
+ case 284:
/* Line 1792 of yacc.c */
-#line 1435 "./util/configparser.y"
+#line 1445 "./util/configparser.y"
{
OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->server_key_file);
@@ -3886,9 +3904,9 @@ yyreduce:
}
break;
- case 283:
+ case 285:
/* Line 1792 of yacc.c */
-#line 1442 "./util/configparser.y"
+#line 1452 "./util/configparser.y"
{
OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->server_cert_file);
@@ -3896,9 +3914,9 @@ yyreduce:
}
break;
- case 284:
+ case 286:
/* Line 1792 of yacc.c */
-#line 1449 "./util/configparser.y"
+#line 1459 "./util/configparser.y"
{
OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->control_key_file);
@@ -3906,9 +3924,9 @@ yyreduce:
}
break;
- case 285:
+ case 287:
/* Line 1792 of yacc.c */
-#line 1456 "./util/configparser.y"
+#line 1466 "./util/configparser.y"
{
OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->control_cert_file);
@@ -3916,17 +3934,17 @@ yyreduce:
}
break;
- case 286:
+ case 288:
/* Line 1792 of yacc.c */
-#line 1463 "./util/configparser.y"
+#line 1473 "./util/configparser.y"
{
OUTYY(("\nP(dnstap:)\n"));
}
break;
- case 301:
+ case 303:
/* Line 1792 of yacc.c */
-#line 1480 "./util/configparser.y"
+#line 1490 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3935,9 +3953,9 @@ yyreduce:
}
break;
- case 302:
+ case 304:
/* Line 1792 of yacc.c */
-#line 1488 "./util/configparser.y"
+#line 1498 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->dnstap_socket_path);
@@ -3945,9 +3963,9 @@ yyreduce:
}
break;
- case 303:
+ case 305:
/* Line 1792 of yacc.c */
-#line 1495 "./util/configparser.y"
+#line 1505 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3956,9 +3974,9 @@ yyreduce:
}
break;
- case 304:
+ case 306:
/* Line 1792 of yacc.c */
-#line 1503 "./util/configparser.y"
+#line 1513 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3967,9 +3985,9 @@ yyreduce:
}
break;
- case 305:
+ case 307:
/* Line 1792 of yacc.c */
-#line 1511 "./util/configparser.y"
+#line 1521 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->dnstap_identity);
@@ -3977,9 +3995,9 @@ yyreduce:
}
break;
- case 306:
+ case 308:
/* Line 1792 of yacc.c */
-#line 1518 "./util/configparser.y"
+#line 1528 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->dnstap_version);
@@ -3987,9 +4005,9 @@ yyreduce:
}
break;
- case 307:
+ case 309:
/* Line 1792 of yacc.c */
-#line 1525 "./util/configparser.y"
+#line 1535 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -3999,9 +4017,9 @@ yyreduce:
}
break;
- case 308:
+ case 310:
/* Line 1792 of yacc.c */
-#line 1534 "./util/configparser.y"
+#line 1544 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -4011,9 +4029,9 @@ yyreduce:
}
break;
- case 309:
+ case 311:
/* Line 1792 of yacc.c */
-#line 1543 "./util/configparser.y"
+#line 1553 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -4023,9 +4041,9 @@ yyreduce:
}
break;
- case 310:
+ case 312:
/* Line 1792 of yacc.c */
-#line 1552 "./util/configparser.y"
+#line 1562 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -4035,9 +4053,9 @@ yyreduce:
}
break;
- case 311:
+ case 313:
/* Line 1792 of yacc.c */
-#line 1561 "./util/configparser.y"
+#line 1571 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -4047,9 +4065,9 @@ yyreduce:
}
break;
- case 312:
+ case 314:
/* Line 1792 of yacc.c */
-#line 1570 "./util/configparser.y"
+#line 1580 "./util/configparser.y"
{
OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@@ -4059,17 +4077,17 @@ yyreduce:
}
break;
- case 313:
+ case 315:
/* Line 1792 of yacc.c */
-#line 1579 "./util/configparser.y"
+#line 1589 "./util/configparser.y"
{
OUTYY(("\nP(python:)\n"));
}
break;
- case 317:
+ case 319:
/* Line 1792 of yacc.c */
-#line 1588 "./util/configparser.y"
+#line 1598 "./util/configparser.y"
{
OUTYY(("P(python-script:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->python_script);
@@ -4079,7 +4097,7 @@ yyreduce:
/* Line 1792 of yacc.c */
-#line 4083 "util/configparser.c"
+#line 4101 "util/configparser.c"
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -4311,7 +4329,7 @@ yyreturn:
/* Line 2055 of yacc.c */
-#line 1593 "./util/configparser.y"
+#line 1603 "./util/configparser.y"
/* parse helper routines could be here */
diff --git a/external/unbound/util/configparser.h b/external/unbound/util/configparser.h
index 52ec99221..ca2daeefd 100644
--- a/external/unbound/util/configparser.h
+++ b/external/unbound/util/configparser.h
@@ -203,7 +203,8 @@ extern int yydebug;
VAR_RATELIMIT_BELOW_DOMAIN = 412,
VAR_RATELIMIT_FACTOR = 413,
VAR_CAPS_WHITELIST = 414,
- VAR_CACHE_MAX_NEGATIVE_TTL = 415
+ VAR_CACHE_MAX_NEGATIVE_TTL = 415,
+ VAR_PERMIT_SMALL_HOLDDOWN = 416
};
#endif
/* Tokens. */
@@ -365,6 +366,7 @@ extern int yydebug;
#define VAR_RATELIMIT_FACTOR 413
#define VAR_CAPS_WHITELIST 414
#define VAR_CACHE_MAX_NEGATIVE_TTL 415
+#define VAR_PERMIT_SMALL_HOLDDOWN 416
@@ -378,7 +380,7 @@ typedef union YYSTYPE
/* Line 2058 of yacc.c */
-#line 382 "util/configparser.h"
+#line 384 "util/configparser.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
diff --git a/external/unbound/util/configparser.y b/external/unbound/util/configparser.y
index ad7f3d292..d6db3c86f 100644
--- a/external/unbound/util/configparser.y
+++ b/external/unbound/util/configparser.y
@@ -121,7 +121,7 @@ extern struct config_parser_state* cfg_parser;
%token VAR_HARDEN_ALGO_DOWNGRADE VAR_IP_TRANSPARENT
%token VAR_RATELIMIT VAR_RATELIMIT_SLABS VAR_RATELIMIT_SIZE
%token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN VAR_RATELIMIT_FACTOR
-%token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL
+%token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
%%
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -185,7 +185,8 @@ content_server: server_num_threads | server_verbosity | server_port |
server_ip_transparent | server_ratelimit | server_ratelimit_slabs |
server_ratelimit_size | server_ratelimit_for_domain |
server_ratelimit_below_domain | server_ratelimit_factor |
- server_caps_whitelist | server_cache_max_negative_ttl
+ server_caps_whitelist | server_cache_max_negative_ttl |
+ server_permit_small_holddown
;
stubstart: VAR_STUB_ZONE
{
@@ -1125,6 +1126,15 @@ server_keep_missing: VAR_KEEP_MISSING STRING_ARG
free($2);
}
;
+server_permit_small_holddown: VAR_PERMIT_SMALL_HOLDDOWN STRING_ARG
+ {
+ OUTYY(("P(server_permit_small_holddown:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->permit_small_holddown =
+ (strcmp($2, "yes")==0);
+ free($2);
+ }
server_key_cache_size: VAR_KEY_CACHE_SIZE STRING_ARG
{
OUTYY(("P(server_key_cache_size:%s)\n", $2));
diff --git a/external/unbound/util/data/msgencode.c b/external/unbound/util/data/msgencode.c
index f9a8c5f67..43464e9bb 100644
--- a/external/unbound/util/data/msgencode.c
+++ b/external/unbound/util/data/msgencode.c
@@ -283,7 +283,7 @@ compress_owner(struct ub_packed_rrset_key* key, sldns_buffer* pkt,
size_t owner_pos, uint16_t* owner_ptr, int owner_labs)
{
struct compress_tree_node* p;
- struct compress_tree_node** insertpt;
+ struct compress_tree_node** insertpt = NULL;
if(!*owner_ptr) {
/* compress first time dname */
if((p = compress_tree_lookup(tree, key->rk.dname,
diff --git a/external/unbound/util/data/msgreply.c b/external/unbound/util/data/msgreply.c
index b1d3df639..06593ffe1 100644
--- a/external/unbound/util/data/msgreply.c
+++ b/external/unbound/util/data/msgreply.c
@@ -822,13 +822,13 @@ log_query_info(enum verbosity_value v, const char* str,
}
int
-reply_check_cname_chain(struct reply_info* rep)
+reply_check_cname_chain(struct query_info* qinfo, struct reply_info* rep)
{
/* check only answer section rrs for matching cname chain.
* the cache may return changed rdata, but owner names are untouched.*/
size_t i;
- uint8_t* sname = rep->rrsets[0]->rk.dname;
- size_t snamelen = rep->rrsets[0]->rk.dname_len;
+ uint8_t* sname = qinfo->qname;
+ size_t snamelen = qinfo->qname_len;
for(i=0; ian_numrrsets; i++) {
uint16_t t = ntohs(rep->rrsets[i]->rk.type);
if(t == LDNS_RR_TYPE_DNAME)
diff --git a/external/unbound/util/data/msgreply.h b/external/unbound/util/data/msgreply.h
index e8d6d762e..708897950 100644
--- a/external/unbound/util/data/msgreply.h
+++ b/external/unbound/util/data/msgreply.h
@@ -359,10 +359,11 @@ uint8_t* reply_find_final_cname_target(struct query_info* qinfo,
/**
* Check if cname chain in cached reply is still valid.
+ * @param qinfo: query info with query name.
* @param rep: reply to check.
* @return: true if valid, false if invalid.
*/
-int reply_check_cname_chain(struct reply_info* rep);
+int reply_check_cname_chain(struct query_info* qinfo, struct reply_info* rep);
/**
* Check security status of all RRs in the message.
diff --git a/external/unbound/util/iana_ports.inc b/external/unbound/util/iana_ports.inc
index 03ad2baaf..91dd39abe 100644
--- a/external/unbound/util/iana_ports.inc
+++ b/external/unbound/util/iana_ports.inc
@@ -1066,7 +1066,6 @@
1404,
1405,
1406,
-1407,
1408,
1409,
1410,
@@ -4667,6 +4666,7 @@
7725,
7726,
7727,
+7728,
7734,
7738,
7741,
@@ -4781,6 +4781,7 @@
8301,
8320,
8321,
+8322,
8351,
8376,
8377,
@@ -4788,6 +4789,7 @@
8379,
8380,
8383,
+8384,
8400,
8401,
8402,
@@ -4804,6 +4806,7 @@
8474,
8500,
8501,
+8503,
8554,
8555,
8567,
@@ -5034,6 +5037,7 @@
10200,
10201,
10252,
+10253,
10260,
10288,
10439,
@@ -5168,6 +5172,8 @@
17220,
17221,
17222,
+17224,
+17225,
17234,
17235,
17500,
@@ -5380,6 +5386,7 @@
40843,
40853,
41111,
+41230,
41794,
41795,
42508,
diff --git a/external/unbound/util/net_help.c b/external/unbound/util/net_help.c
index 8b39af6b3..07605b19f 100644
--- a/external/unbound/util/net_help.c
+++ b/external/unbound/util/net_help.c
@@ -629,9 +629,9 @@ void* listen_sslctx_create(char* key, char* pem, char* verifypem)
SSL_CTX_free(ctx);
return NULL;
}
- if(!SSL_CTX_use_certificate_file(ctx, pem, SSL_FILETYPE_PEM)) {
+ if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
log_err("error for cert file: %s", pem);
- log_crypto_err("error in SSL_CTX use_certificate_file");
+ log_crypto_err("error in SSL_CTX use_certificate_chain_file");
SSL_CTX_free(ctx);
return NULL;
}
@@ -647,6 +647,23 @@ void* listen_sslctx_create(char* key, char* pem, char* verifypem)
SSL_CTX_free(ctx);
return NULL;
}
+#if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
+ if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
+ log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
+ }
+#elif defined(USE_ECDSA)
+ if(1) {
+ EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
+ if (!ecdh) {
+ log_crypto_err("could not find p256, not enabling ECDHE");
+ } else {
+ if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
+ log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
+ }
+ EC_KEY_free (ecdh);
+ }
+ }
+#endif
if(verifypem && verifypem[0]) {
if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
@@ -684,7 +701,7 @@ void* connect_sslctx_create(char* key, char* pem, char* verifypem)
return NULL;
}
if(key && key[0]) {
- if(!SSL_CTX_use_certificate_file(ctx, pem, SSL_FILETYPE_PEM)) {
+ if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
log_err("error in client certificate %s", pem);
log_crypto_err("error in certificate file");
SSL_CTX_free(ctx);
diff --git a/external/unbound/validator/autotrust.c b/external/unbound/validator/autotrust.c
index d90eec9eb..e63b086e6 100644
--- a/external/unbound/validator/autotrust.c
+++ b/external/unbound/validator/autotrust.c
@@ -1225,7 +1225,7 @@ verify_dnskey(struct module_env* env, struct val_env* ve,
{
char* reason = NULL;
uint8_t sigalg[ALGO_NEEDS_MAX+1];
- int downprot = 1;
+ int downprot = env->cfg->harden_algo_downgrade;
enum sec_status sec = val_verify_DNSKEY_with_TA(env, ve, rrset,
tp->ds_rrset, tp->dnskey_rrset, downprot?sigalg:NULL, &reason);
/* sigalg is ignored, it returns algorithms signalled to exist, but
@@ -1447,9 +1447,11 @@ set_tp_times(struct trust_anchor* tp, time_t rrsig_exp_interval,
if(rrsig_exp_interval/2 < x)
x = rrsig_exp_interval/2;
/* MAX(1hr, x) */
- if(x < 3600)
- tp->autr->query_interval = 3600;
- else tp->autr->query_interval = x;
+ if(!autr_permit_small_holddown) {
+ if(x < 3600)
+ tp->autr->query_interval = 3600;
+ else tp->autr->query_interval = x;
+ } else tp->autr->query_interval = x;
/* x= MIN(1day, ttl/10, expire/10) */
x = 24 * 3600;
@@ -1458,9 +1460,11 @@ set_tp_times(struct trust_anchor* tp, time_t rrsig_exp_interval,
if(rrsig_exp_interval/10 < x)
x = rrsig_exp_interval/10;
/* MAX(1hr, x) */
- if(x < 3600)
- tp->autr->retry_time = 3600;
- else tp->autr->retry_time = x;
+ if(!autr_permit_small_holddown) {
+ if(x < 3600)
+ tp->autr->retry_time = 3600;
+ else tp->autr->retry_time = x;
+ } else tp->autr->retry_time = x;
if(qi != tp->autr->query_interval || rt != tp->autr->retry_time) {
*changed = 1;
@@ -1959,8 +1963,12 @@ calc_next_probe(struct module_env* env, time_t wait)
{
/* make it random, 90-100% */
time_t rnd, rest;
- if(wait < 3600)
- wait = 3600;
+ if(!autr_permit_small_holddown) {
+ if(wait < 3600)
+ wait = 3600;
+ } else {
+ if(wait == 0) wait = 1;
+ }
rnd = wait/10;
rest = wait-rnd;
rnd = (time_t)ub_random_max(env->rnd, (long int)rnd);
@@ -2349,6 +2357,8 @@ todo_probe(struct module_env* env, time_t* next)
if( (el=rbtree_first(&env->anchors->autr->probe)) == RBTREE_NULL) {
/* in case of revoked anchors */
lock_basic_unlock(&env->anchors->lock);
+ /* signal that there are no anchors to probe */
+ *next = 0;
return NULL;
}
tp = (struct trust_anchor*)el->key;
@@ -2378,6 +2388,7 @@ autr_probe_timer(struct module_env* env)
struct trust_anchor* tp;
time_t next_probe = 3600;
int num = 0;
+ if(autr_permit_small_holddown) next_probe = 1;
verbose(VERB_ALGO, "autotrust probe timer callback");
/* while there are still anchors to probe */
while( (tp = todo_probe(env, &next_probe)) ) {
@@ -2386,7 +2397,7 @@ autr_probe_timer(struct module_env* env)
num++;
}
regional_free_all(env->scratch);
- if(num == 0)
+ if(next_probe == 0)
return 0; /* no trust points to probe */
verbose(VERB_ALGO, "autotrust probe timer %d callbacks done", num);
return next_probe;
diff --git a/external/unbound/validator/validator.c b/external/unbound/validator/validator.c
index 74068659f..f8b429e52 100644
--- a/external/unbound/validator/validator.c
+++ b/external/unbound/validator/validator.c
@@ -2769,7 +2769,7 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
vq->state = VAL_VALIDATE_STATE;
return;
}
- downprot = 1;
+ downprot = qstate->env->cfg->harden_algo_downgrade;
vq->key_entry = val_verify_new_DNSKEYs(qstate->region, qstate->env,
ve, dnskey, vq->ds_rrset, downprot, &reason);
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0b04af334..9b094a358 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -106,3 +106,7 @@ add_subdirectory(daemonizer)
add_subdirectory(daemon)
add_subdirectory(blockchain_utilities)
+
+if(PER_BLOCK_CHECKPOINT)
+ add_subdirectory(blocks)
+endif()
diff --git a/src/blockchain_db/CMakeLists.txt b/src/blockchain_db/CMakeLists.txt
index adbe804aa..7301cab85 100644
--- a/src/blockchain_db/CMakeLists.txt
+++ b/src/blockchain_db/CMakeLists.txt
@@ -31,7 +31,7 @@ set(blockchain_db_sources
lmdb/db_lmdb.cpp
)
-if (NOT STATIC)
+if (BERKELEY_DB)
set(blockchain_db_sources
${blockchain_db_sources}
berkeleydb/db_bdb.cpp
@@ -46,7 +46,7 @@ set(blockchain_db_private_headers
lmdb/db_lmdb.h
)
-if (NOT STATIC)
+if (BERKELEY_DB)
set(blockchain_db_private_headers
${blockchain_db_private_headers}
berkeleydb/db_bdb.h
diff --git a/src/blockchain_db/berkeleydb/db_bdb.cpp b/src/blockchain_db/berkeleydb/db_bdb.cpp
index 221c0cf2e..a990d7aaf 100644
--- a/src/blockchain_db/berkeleydb/db_bdb.cpp
+++ b/src/blockchain_db/berkeleydb/db_bdb.cpp
@@ -1,20 +1,20 @@
// Copyright (c) 2014, The Monero Project
// All rights reserved.
-//
+//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
-//
+//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
-//
+//
// 2. 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.
-//
+//
// 3. Neither the name of the copyright holder 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
@@ -36,6 +36,7 @@
#include "profile_tools.h"
using epee::string_tools::pod_to_hex;
+#define DB_DEFAULT_TX (m_write_txn != nullptr ? *m_write_txn : (DbTxn*) nullptr)
namespace
{
@@ -43,46 +44,58 @@ namespace
template
inline void throw0(const T &e)
{
- LOG_PRINT_L0(e.what());
- throw e;
+ LOG_PRINT_L0(e.what());
+ throw e;
}
template
inline void throw1(const T &e)
{
- LOG_PRINT_L1(e.what());
- throw e;
+ LOG_PRINT_L1(e.what());
+ throw e;
}
// cursor needs to be closed when it goes out of scope,
// this helps if the function using it throws
struct bdb_cur
{
- bdb_cur(DbTxn* txn, Db* dbi)
- {
- if (dbi->cursor(txn, &m_cur, 0))
- throw0(cryptonote::DB_ERROR("Error opening db cursor"));
- done = false;
- }
-
- ~bdb_cur() { close(); }
-
- operator Dbc*() { return m_cur; }
- operator Dbc**() { return &m_cur; }
- Dbc* operator->() { return m_cur; }
-
- void close()
- {
- if (!done)
+ bdb_cur(DbTxn* txn, Db* dbi)
{
- m_cur->close();
- done = true;
+ if (dbi->cursor(txn, &m_cur, 0))
+ throw0(cryptonote::DB_ERROR("Error opening db cursor"));
+ done = false;
+ }
+
+ ~bdb_cur()
+ {
+ close();
+ }
+
+ operator Dbc*()
+ {
+ return m_cur;
+ }
+ operator Dbc**()
+ {
+ return &m_cur;
+ }
+ Dbc* operator->()
+ {
+ return m_cur;
+ }
+
+ void close()
+ {
+ if (!done)
+ {
+ m_cur->close();
+ done = true;
+ }
}
- }
private:
- Dbc* m_cur;
- bool done;
+ Dbc* m_cur;
+ bool done;
};
const char* const BDB_BLOCKS = "blocks";
@@ -105,65 +118,80 @@ const char* const BDB_OUTPUT_KEYS = "output_keys";
const char* const BDB_SPENT_KEYS = "spent_keys";
+const unsigned int MB = 1024 * 1024;
+// ND: FIXME: db keeps running out of locks when doing full syncs. Possible bug??? Set it to 5K for now.
+const unsigned int DB_MAX_LOCKS = 5000;
+const unsigned int DB_BUFFER_LENGTH = 32 * MB;
+// 256MB cache adjust as necessary using DB_CONFIG
+const unsigned int DB_DEF_CACHESIZE = 256 * MB;
+
+#if defined(BDB_BULK_CAN_THREAD)
+const unsigned int DB_BUFFER_COUNT = std::thread::hardware_concurrency();
+#else
+const unsigned int DB_BUFFER_COUNT = 1;
+#endif
+
template
struct Dbt_copy: public Dbt
{
- Dbt_copy(const T &t): t_copy(t)
- {
- init();
- }
+ Dbt_copy(const T &t) :
+ t_copy(t)
+ {
+ init();
+ }
- Dbt_copy()
- {
- init();
- }
+ Dbt_copy()
+ {
+ init();
+ }
- void init()
- {
- set_data(&t_copy);
- set_size(sizeof(T));
- set_ulen(sizeof(T));
- set_flags(DB_DBT_USERMEM);
- }
+ void init()
+ {
+ set_data(&t_copy);
+ set_size(sizeof(T));
+ set_ulen(sizeof(T));
+ set_flags(DB_DBT_USERMEM);
+ }
- operator T()
- {
- return t_copy;
- }
+ operator T()
+ {
+ return t_copy;
+ }
private:
- T t_copy;
+ T t_copy;
};
template<>
struct Dbt_copy: public Dbt
{
- Dbt_copy(const cryptonote::blobdata &bd) : m_data(new char[bd.size()])
- {
- memcpy(m_data.get(), bd.data(), bd.size());
- set_data(m_data.get());
- set_size(bd.size());
- set_ulen(bd.size());
- set_flags(DB_DBT_USERMEM);
- }
+ Dbt_copy(const cryptonote::blobdata &bd) :
+ m_data(new char[bd.size()])
+ {
+ memcpy(m_data.get(), bd.data(), bd.size());
+ set_data(m_data.get());
+ set_size(bd.size());
+ set_ulen(bd.size());
+ set_flags(DB_DBT_USERMEM);
+ }
private:
- std::unique_ptr m_data;
+ std::unique_ptr m_data;
};
struct Dbt_safe : public Dbt
{
- Dbt_safe()
- {
- set_data(NULL);
- set_flags(DB_DBT_MALLOC);
- }
- ~Dbt_safe()
- {
- void* buf = get_data();
- if (buf != NULL)
+ Dbt_safe()
{
- free(buf);
+ set_data(NULL);
+ set_flags(DB_DBT_MALLOC);
+ }
+ ~Dbt_safe()
+ {
+ void* buf = get_data();
+ if (buf != NULL)
+ {
+ free(buf);
+ }
}
- }
};
} // anonymous namespace
@@ -171,1519 +199,1666 @@ struct Dbt_safe : public Dbt
namespace cryptonote
{
-void BlockchainBDB::add_block( const block& blk
- , const size_t& block_size
- , const difficulty_type& cumulative_difficulty
- , const uint64_t& coins_generated
- , const crypto::hash& blk_hash
- )
+void BlockchainBDB::add_block(const block& blk, const size_t& block_size, const difficulty_type& cumulative_difficulty, const uint64_t& coins_generated, const crypto::hash& blk_hash)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- Dbt_copy val_h(blk_hash);
- if (m_block_heights->exists(*m_write_txn, &val_h, 0) == 0)
- throw1(BLOCK_EXISTS("Attempting to add block that's already in the db"));
+ Dbt_copy val_h(blk_hash);
+ if (m_block_heights->exists(DB_DEFAULT_TX, &val_h, 0) == 0)
+ throw1(BLOCK_EXISTS("Attempting to add block that's already in the db"));
- if (m_height > 0)
- {
- Dbt_copy parent_key(blk.prev_id);
- Dbt_copy parent_h;
- if (m_block_heights->get(*m_write_txn, &parent_key, &parent_h, 0))
+ if (m_height > 0)
{
- LOG_PRINT_L3("m_height: " << m_height);
- LOG_PRINT_L3("parent_key: " << blk.prev_id);
- throw0(DB_ERROR("Failed to get top block hash to check for new block's parent"));
+ Dbt_copy parent_key(blk.prev_id);
+ Dbt_copy parent_h;
+ if (m_block_heights->get(DB_DEFAULT_TX, &parent_key, &parent_h, 0))
+ {
+ LOG_PRINT_L3("m_height: " << m_height);
+ LOG_PRINT_L3("parent_key: " << blk.prev_id);
+ throw0(DB_ERROR("Failed to get top block hash to check for new block's parent"));
+ }
+ uint32_t parent_height = parent_h;
+ if (parent_height != m_height)
+ throw0(BLOCK_PARENT_DNE("Top block is not new block's parent"));
}
- uint32_t parent_height = parent_h;
- if (parent_height != m_height)
- throw0(BLOCK_PARENT_DNE("Top block is not new block's parent"));
- }
- Dbt_copy key(m_height + 1);
+ Dbt_copy key(m_height + 1);
- Dbt_copy blob(block_to_blob(blk));
- auto res = m_blocks->put(*m_write_txn, &key, &blob, 0);
- if (res)
- throw0(DB_ERROR("Failed to add block blob to db transaction."));
+ Dbt_copy blob(block_to_blob(blk));
+ auto res = m_blocks->put(DB_DEFAULT_TX, &key, &blob, 0);
+ if (res)
+ throw0(DB_ERROR("Failed to add block blob to db transaction."));
- Dbt_copy sz(block_size);
- if (m_block_sizes->put(*m_write_txn, &key, &sz, 0))
- throw0(DB_ERROR("Failed to add block size to db transaction."));
+ Dbt_copy sz(block_size);
+ if (m_block_sizes->put(DB_DEFAULT_TX, &key, &sz, 0))
+ throw0(DB_ERROR("Failed to add block size to db transaction."));
- Dbt_copy ts(blk.timestamp);
- if (m_block_timestamps->put(*m_write_txn, &key, &ts, 0))
- throw0(DB_ERROR("Failed to add block timestamp to db transaction."));
+ Dbt_copy ts(blk.timestamp);
+ if (m_block_timestamps->put(DB_DEFAULT_TX, &key, &ts, 0))
+ throw0(DB_ERROR("Failed to add block timestamp to db transaction."));
- Dbt_copy diff(cumulative_difficulty);
- if (m_block_diffs->put(*m_write_txn, &key, &diff, 0))
- throw0(DB_ERROR("Failed to add block cumulative difficulty to db transaction."));
+ Dbt_copy diff(cumulative_difficulty);
+ if (m_block_diffs->put(DB_DEFAULT_TX, &key, &diff, 0))
+ throw0(DB_ERROR("Failed to add block cumulative difficulty to db transaction."));
- Dbt_copy coinsgen(coins_generated);
- if (m_block_coins->put(*m_write_txn, &key, &coinsgen, 0))
- throw0(DB_ERROR("Failed to add block total generated coins to db transaction."));
+ Dbt_copy coinsgen(coins_generated);
+ if (m_block_coins->put(DB_DEFAULT_TX, &key, &coinsgen, 0))
+ throw0(DB_ERROR("Failed to add block total generated coins to db transaction."));
- if (m_block_heights->put(*m_write_txn, &val_h, &key, 0))
- throw0(DB_ERROR("Failed to add block height by hash to db transaction."));
+ if (m_block_heights->put(DB_DEFAULT_TX, &val_h, &key, 0))
+ throw0(DB_ERROR("Failed to add block height by hash to db transaction."));
- if (m_block_hashes->put(*m_write_txn, &key, &val_h, 0))
- throw0(DB_ERROR("Failed to add block hash to db transaction."));
+ if (m_block_hashes->put(DB_DEFAULT_TX, &key, &val_h, 0))
+ throw0(DB_ERROR("Failed to add block hash to db transaction."));
}
void BlockchainBDB::remove_block()
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- if (m_height == 0)
- throw0(BLOCK_DNE ("Attempting to remove block from an empty blockchain"));
+ if (m_height == 0)
+ throw0(BLOCK_DNE ("Attempting to remove block from an empty blockchain"));
- Dbt_copy k(m_height);
- Dbt_copy h;
- if (m_block_hashes->get(*m_write_txn, &k, &h, 0))
- throw1(BLOCK_DNE("Attempting to remove block that's not in the db"));
+ Dbt_copy k(m_height);
+ Dbt_copy h;
+ if (m_block_hashes->get(DB_DEFAULT_TX, &k, &h, 0))
+ throw1(BLOCK_DNE("Attempting to remove block that's not in the db"));
- if (m_blocks->del(*m_write_txn, &k, 0))
- throw1(DB_ERROR("Failed to add removal of block to db transaction"));
+ if (m_blocks->del(DB_DEFAULT_TX, &k, 0))
+ throw1(DB_ERROR("Failed to add removal of block to db transaction"));
- if (m_block_sizes->del(*m_write_txn, &k, 0))
- throw1(DB_ERROR("Failed to add removal of block size to db transaction"));
+ if (m_block_sizes->del(DB_DEFAULT_TX, &k, 0))
+ throw1(DB_ERROR("Failed to add removal of block size to db transaction"));
- if (m_block_diffs->del(*m_write_txn, &k, 0))
- throw1(DB_ERROR("Failed to add removal of block cumulative difficulty to db transaction"));
+ if (m_block_diffs->del(DB_DEFAULT_TX, &k, 0))
+ throw1(DB_ERROR("Failed to add removal of block cumulative difficulty to db transaction"));
- if (m_block_coins->del(*m_write_txn, &k, 0))
- throw1(DB_ERROR("Failed to add removal of block total generated coins to db transaction"));
+ if (m_block_coins->del(DB_DEFAULT_TX, &k, 0))
+ throw1(DB_ERROR("Failed to add removal of block total generated coins to db transaction"));
- if (m_block_timestamps->del(*m_write_txn, &k, 0))
- throw1(DB_ERROR("Failed to add removal of block timestamp to db transaction"));
+ if (m_block_timestamps->del(DB_DEFAULT_TX, &k, 0))
+ throw1(DB_ERROR("Failed to add removal of block timestamp to db transaction"));
- if (m_block_heights->del(*m_write_txn, &h, 0))
- throw1(DB_ERROR("Failed to add removal of block height by hash to db transaction"));
+ if (m_block_heights->del(DB_DEFAULT_TX, &h, 0))
+ throw1(DB_ERROR("Failed to add removal of block height by hash to db transaction"));
- if (m_block_hashes->del(*m_write_txn, &k, 0))
- throw1(DB_ERROR("Failed to add removal of block hash to db transaction"));
+ if (m_block_hashes->del(DB_DEFAULT_TX, &k, 0))
+ throw1(DB_ERROR("Failed to add removal of block hash to db transaction"));
}
void BlockchainBDB::add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash& tx_hash)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- Dbt_copy val_h(tx_hash);
+ Dbt_copy val_h(tx_hash);
- if (m_txs->exists(*m_write_txn, &val_h, 0) == 0)
- throw1(TX_EXISTS("Attempting to add transaction that's already in the db"));
+ if (m_txs->exists(DB_DEFAULT_TX, &val_h, 0) == 0)
+ throw1(TX_EXISTS("Attempting to add transaction that's already in the db"));
- Dbt_copy blob(tx_to_blob(tx));
- if (m_txs->put(*m_write_txn, &val_h, &blob, 0))
- throw0(DB_ERROR("Failed to add tx blob to db transaction"));
+ Dbt_copy blob(tx_to_blob(tx));
+ if (m_txs->put(DB_DEFAULT_TX, &val_h, &blob, 0))
+ throw0(DB_ERROR("Failed to add tx blob to db transaction"));
- Dbt_copy height(m_height + 1);
- if (m_tx_heights->put(*m_write_txn, &val_h, &height, 0))
- throw0(DB_ERROR("Failed to add tx block height to db transaction"));
+ Dbt_copy height(m_height + 1);
+ if (m_tx_heights->put(DB_DEFAULT_TX, &val_h, &height, 0))
+ throw0(DB_ERROR("Failed to add tx block height to db transaction"));
- Dbt_copy unlock_time(tx.unlock_time);
- if (m_tx_unlocks->put(*m_write_txn, &val_h, &unlock_time, 0))
- throw0(DB_ERROR("Failed to add tx unlock time to db transaction"));
+ Dbt_copy unlock_time(tx.unlock_time);
+ if (m_tx_unlocks->put(DB_DEFAULT_TX, &val_h, &unlock_time, 0))
+ throw0(DB_ERROR("Failed to add tx unlock time to db transaction"));
}
void BlockchainBDB::remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- Dbt_copy val_h(tx_hash);
- if (m_txs->exists(*m_write_txn, &val_h, 0))
- throw1(TX_DNE("Attempting to remove transaction that isn't in the db"));
+ Dbt_copy val_h(tx_hash);
+ if (m_txs->exists(DB_DEFAULT_TX, &val_h, 0))
+ throw1(TX_DNE("Attempting to remove transaction that isn't in the db"));
- if (m_txs->del(*m_write_txn, &val_h, 0))
- throw1(DB_ERROR("Failed to add removal of tx to db transaction"));
- if (m_tx_unlocks->del(*m_write_txn, &val_h, 0))
- throw1(DB_ERROR("Failed to add removal of tx unlock time to db transaction"));
- if (m_tx_heights->del(*m_write_txn, &val_h, 0))
- throw1(DB_ERROR("Failed to add removal of tx block height to db transaction"));
+ if (m_txs->del(DB_DEFAULT_TX, &val_h, 0))
+ throw1(DB_ERROR("Failed to add removal of tx to db transaction"));
+ if (m_tx_unlocks->del(DB_DEFAULT_TX, &val_h, 0))
+ throw1(DB_ERROR("Failed to add removal of tx unlock time to db transaction"));
+ if (m_tx_heights->del(DB_DEFAULT_TX, &val_h, 0))
+ throw1(DB_ERROR("Failed to add removal of tx block height to db transaction"));
- remove_tx_outputs(tx_hash, tx);
+ remove_tx_outputs(tx_hash, tx);
- if (m_tx_outputs->del(*m_write_txn, &val_h, 0))
- throw1(DB_ERROR("Failed to add removal of tx outputs to db transaction"));
+ if (m_tx_outputs->del(DB_DEFAULT_TX, &val_h, 0))
+ throw1(DB_ERROR("Failed to add removal of tx outputs to db transaction"));
}
-void BlockchainBDB::add_output(const crypto::hash& tx_hash, const tx_out& tx_output, const uint64_t& local_index)
+void BlockchainBDB::add_output(const crypto::hash& tx_hash, const tx_out& tx_output, const uint64_t& local_index, const uint64_t unlock_time)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- Dbt_copy k(m_num_outputs + 1);
- Dbt_copy v(tx_hash);
+ Dbt_copy k(m_num_outputs + 1);
+ Dbt_copy v(tx_hash);
- if (m_output_txs->put(*m_write_txn, &k, &v, 0))
- throw0(DB_ERROR("Failed to add output tx hash to db transaction"));
- if (m_tx_outputs->put(*m_write_txn, &v, &k, 0))
- throw0(DB_ERROR("Failed to add tx output index to db transaction"));
+ if (m_output_txs->put(DB_DEFAULT_TX, &k, &v, 0))
+ throw0(DB_ERROR("Failed to add output tx hash to db transaction"));
+ if (m_tx_outputs->put(DB_DEFAULT_TX, &v, &k, 0))
+ throw0(DB_ERROR("Failed to add tx output index to db transaction"));
- Dbt_copy val_local_index(local_index);
- if (m_output_indices->put(*m_write_txn, &k, &val_local_index, 0))
- throw0(DB_ERROR("Failed to add tx output index to db transaction"));
+ Dbt_copy val_local_index(local_index);
+ if (m_output_indices->put(DB_DEFAULT_TX, &k, &val_local_index, 0))
+ throw0(DB_ERROR("Failed to add tx output index to db transaction"));
- Dbt_copy val_amount(tx_output.amount);
- if (m_output_amounts->put(*m_write_txn, &val_amount, &k, 0))
- throw0(DB_ERROR("Failed to add output amount to db transaction."));
+ Dbt_copy val_amount(tx_output.amount);
+ if (m_output_amounts->put(DB_DEFAULT_TX, &val_amount, &k, 0))
+ throw0(DB_ERROR("Failed to add output amount to db transaction."));
- if (tx_output.target.type() == typeid(txout_to_key))
- {
- Dbt_copy val_pubkey(boost::get(tx_output.target).key);
- if (m_output_keys->put(*m_write_txn, &k, &val_pubkey, 0))
- throw0(DB_ERROR("Failed to add output pubkey to db transaction"));
- }
+ if (tx_output.target.type() == typeid(txout_to_key))
+ {
+ output_data_t od;
+ od.pubkey = boost::get < txout_to_key > (tx_output.target).key;
+ od.unlock_time = unlock_time;
+ od.height = m_height;
- m_num_outputs++;
+ Dbt_copy data(od);
+ if (m_output_keys->put(DB_DEFAULT_TX, &k, &data, 0))
+ throw0(DB_ERROR("Failed to add output pubkey to db transaction"));
+ }
+
+ m_num_outputs++;
}
void BlockchainBDB::remove_tx_outputs(const crypto::hash& tx_hash, const transaction& tx)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
- bdb_cur cur(*m_write_txn, m_tx_outputs);
+ bdb_cur cur(DB_DEFAULT_TX, m_tx_outputs);
- Dbt_copy k(tx_hash);
- Dbt_copy v;
+ Dbt_copy k(tx_hash);
+ Dbt_copy v;
- auto result = cur->get(&k, &v, DB_SET);
- if (result == DB_NOTFOUND)
- {
- throw0(DB_ERROR("Attempting to remove a tx's outputs, but none found."));
- }
- else if (result)
- {
- throw0(DB_ERROR("DB error attempting to get an output"));
- }
- else
- {
- db_recno_t num_elems = 0;
- cur->count(&num_elems, 0);
-
- for (uint64_t i = 0; i < num_elems; ++i)
+ auto result = cur->get(&k, &v, DB_SET);
+ if (result == DB_NOTFOUND)
{
- const tx_out tx_output = tx.vout[i];
- remove_output(v, tx_output.amount);
- if (i < num_elems - 1)
- {
- cur->get(&k, &v, DB_NEXT_DUP);
- }
+ throw0(DB_ERROR("Attempting to remove a tx's outputs, but none found."));
}
- }
+ else if (result)
+ {
+ throw0(DB_ERROR("DB error attempting to get an output"));
+ }
+ else
+ {
+ db_recno_t num_elems = 0;
+ cur->count(&num_elems, 0);
- cur.close();
+ for (uint64_t i = 0; i < num_elems; ++i)
+ {
+ const tx_out tx_output = tx.vout[i];
+ remove_output(v, tx_output.amount);
+ if (i < num_elems - 1)
+ {
+ cur->get(&k, &v, DB_NEXT_DUP);
+ }
+ }
+ }
+
+ cur.close();
}
// TODO: probably remove this function
void BlockchainBDB::remove_output(const tx_out& tx_output)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__ << " (unused version - does nothing)");
- return;
+ LOG_PRINT_L3("BlockchainBDB::" << __func__ << " (unused version - does nothing)");
+ return;
}
void BlockchainBDB::remove_output(const uint64_t& out_index, const uint64_t amount)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- Dbt_copy k(out_index);
+ Dbt_copy k(out_index);
- auto result = m_output_indices->del(*m_write_txn, &k, 0);
- if (result == DB_NOTFOUND)
- {
- LOG_PRINT_L0("Unexpected: global output index not found in m_output_indices");
- }
- else if (result)
- {
- throw1(DB_ERROR("Error adding removal of output tx index to db transaction"));
- }
+ auto result = m_output_indices->del(DB_DEFAULT_TX, &k, 0);
+ if (result == DB_NOTFOUND)
+ {
+ LOG_PRINT_L0("Unexpected: global output index not found in m_output_indices");
+ }
+ else if (result)
+ {
+ throw1(DB_ERROR("Error adding removal of output tx index to db transaction"));
+ }
- result = m_output_txs->del(*m_write_txn, &k, 0);
- // if (result != 0 && result != DB_NOTFOUND)
- // throw1(DB_ERROR("Error adding removal of output tx hash to db transaction"));
- if (result == DB_NOTFOUND)
- {
- LOG_PRINT_L0("Unexpected: global output index not found in m_output_txs");
- }
- else if (result)
- {
- throw1(DB_ERROR("Error adding removal of output tx hash to db transaction"));
- }
+ result = m_output_txs->del(DB_DEFAULT_TX, &k, 0);
+ // if (result != 0 && result != DB_NOTFOUND)
+ // throw1(DB_ERROR("Error adding removal of output tx hash to db transaction"));
+ if (result == DB_NOTFOUND)
+ {
+ LOG_PRINT_L0("Unexpected: global output index not found in m_output_txs");
+ }
+ else if (result)
+ {
+ throw1(DB_ERROR("Error adding removal of output tx hash to db transaction"));
+ }
- result = m_output_keys->del(*m_write_txn, &k, 0);
- if (result == DB_NOTFOUND)
- {
- LOG_PRINT_L0("Unexpected: global output index not found in m_output_keys");
- }
- else if (result)
- throw1(DB_ERROR("Error adding removal of output pubkey to db transaction"));
+ result = m_output_keys->del(DB_DEFAULT_TX, &k, 0);
+ if (result == DB_NOTFOUND)
+ {
+ LOG_PRINT_L0("Unexpected: global output index not found in m_output_keys");
+ }
+ else if (result)
+ throw1(DB_ERROR("Error adding removal of output pubkey to db transaction"));
- remove_amount_output_index(amount, out_index);
+ remove_amount_output_index(amount, out_index);
- m_num_outputs--;
+ m_num_outputs--;
}
void BlockchainBDB::remove_amount_output_index(const uint64_t amount, const uint64_t global_output_index)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- bdb_cur cur(*m_write_txn, m_output_amounts);
+ bdb_cur cur(DB_DEFAULT_TX, m_output_amounts);
- Dbt_copy k(amount);
- Dbt_copy v;
+ Dbt_copy k(amount);
+ Dbt_copy v;
- auto result = cur->get(&k, &v, DB_SET);
- if (result == DB_NOTFOUND)
- throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
- else if (result)
- throw0(DB_ERROR("DB error attempting to get an output"));
+ auto result = cur->get(&k, &v, DB_SET);
+ if (result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
+ else if (result)
+ throw0(DB_ERROR("DB error attempting to get an output"));
- db_recno_t num_elems = 0;
- cur->count(&num_elems, 0);
+ db_recno_t num_elems = 0;
+ cur->count(&num_elems, 0);
- uint64_t amount_output_index = 0;
- uint64_t goi = 0;
- bool found_index = false;
- for (uint64_t i = 0; i < num_elems; ++i)
- {
- goi = v;
- if (goi == global_output_index)
+ uint64_t amount_output_index = 0;
+ uint64_t goi = 0;
+ bool found_index = false;
+ for (uint64_t i = 0; i < num_elems; ++i)
{
- amount_output_index = i;
- found_index = true;
- break;
+ goi = v;
+ if (goi == global_output_index)
+ {
+ amount_output_index = i;
+ found_index = true;
+ break;
+ }
+ cur->get(&k, &v, DB_NEXT_DUP);
}
- cur->get(&k, &v, DB_NEXT_DUP);
- }
- if (found_index)
- {
- // found the amount output index
- // now delete it
- result = cur->del(0);
- if (result)
- throw0(DB_ERROR(std::string("Error deleting amount output index ").append(boost::lexical_cast(amount_output_index)).c_str()));
- }
- else
- {
- // not found
- throw1(OUTPUT_DNE("Failed to find amount output index"));
- }
- cur.close();
+ if (found_index)
+ {
+ // found the amount output index
+ // now delete it
+ result = cur->del(0);
+ if (result)
+ throw0(DB_ERROR(std::string("Error deleting amount output index ").append(boost::lexical_cast(amount_output_index)).c_str()));
+ }
+ else
+ {
+ // not found
+ throw1(OUTPUT_DNE("Failed to find amount output index"));
+ }
+ cur.close();
}
void BlockchainBDB::add_spent_key(const crypto::key_image& k_image)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- Dbt_copy val_key(k_image);
- if (m_spent_keys->exists(*m_write_txn, &val_key, 0) == 0)
- throw1(KEY_IMAGE_EXISTS("Attempting to add spent key image that's already in the db"));
+ Dbt_copy val_key(k_image);
+ if (m_spent_keys->exists(DB_DEFAULT_TX, &val_key, 0) == 0)
+ throw1(KEY_IMAGE_EXISTS("Attempting to add spent key image that's already in the db"));
- Dbt_copy val('\0');
- if (m_spent_keys->put(*m_write_txn, &val_key, &val, 0))
- throw1(DB_ERROR("Error adding spent key image to db transaction."));
+ Dbt_copy val('\0');
+ if (m_spent_keys->put(DB_DEFAULT_TX, &val_key, &val, 0))
+ throw1(DB_ERROR("Error adding spent key image to db transaction."));
}
void BlockchainBDB::remove_spent_key(const crypto::key_image& k_image)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- Dbt_copy k(k_image);
- auto result = m_spent_keys->del(*m_write_txn, &k, 0);
- if (result != 0 && result != DB_NOTFOUND)
- throw1(DB_ERROR("Error adding removal of key image to db transaction"));
+ Dbt_copy k(k_image);
+ auto result = m_spent_keys->del(DB_DEFAULT_TX, &k, 0);
+ if (result != 0 && result != DB_NOTFOUND)
+ throw1(DB_ERROR("Error adding removal of key image to db transaction"));
}
blobdata BlockchainBDB::output_to_blob(const tx_out& output) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- blobdata b;
- if (!t_serializable_object_to_blob(output, b))
- throw1(DB_ERROR("Error serializing output to blob"));
- return b;
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ blobdata b;
+ if (!t_serializable_object_to_blob(output, b))
+ throw1(DB_ERROR("Error serializing output to blob"));
+ return b;
}
tx_out BlockchainBDB::output_from_blob(const blobdata& blob) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- std::stringstream ss;
- ss << blob;
- binary_archive ba(ss);
- tx_out o;
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ std::stringstream ss;
+ ss << blob;
+ binary_archive ba(ss);
+ tx_out o;
- if (!(::serialization::serialize(ba, o)))
- throw1(DB_ERROR("Error deserializing tx output blob"));
+ if (!(::serialization::serialize(ba, o)))
+ throw1(DB_ERROR("Error deserializing tx output blob"));
- return o;
+ return o;
}
-uint64_t BlockchainBDB::get_output_global_index(const uint64_t& amount, const uint64_t& index) const
+uint64_t BlockchainBDB::get_output_global_index(const uint64_t& amount, const uint64_t& index)
{
- LOG_PRINT_L3("BlockchainLMDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
+ std::vector < uint64_t > offsets;
+ std::vector < uint64_t > global_indices;
+ offsets.push_back(index);
+ get_output_global_indices(amount, offsets, global_indices);
+ if (!global_indices.size())
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
- bdb_cur cur(txn, m_output_amounts);
-
- Dbt_copy k(amount);
- Dbt_copy v;
-
- auto result = cur->get(&k, &v, DB_SET);
- if (result == DB_NOTFOUND)
- throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
- else if (result)
- throw0(DB_ERROR("DB error attempting to get an output"));
-
- db_recno_t num_elems;
- cur->count(&num_elems, 0);
-
- if (num_elems <= index)
- throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but output not found"));
-
- for (uint64_t i = 0; i < index; ++i)
- {
- cur->get(&k, &v, DB_NEXT_DUP);
- }
-
- uint64_t glob_index = v;
-
- cur.close();
-
- txn.commit();
-
- return glob_index;
+ return global_indices[0];
}
void BlockchainBDB::check_open() const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- if (!m_open)
- throw0(DB_ERROR("DB operation attempted on a not-open DB instance"));
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ if (!m_open)
+ throw0(DB_ERROR("DB operation attempted on a not-open DB instance"));
}
BlockchainBDB::~BlockchainBDB()
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
- if (m_open)
- {
- close();
- }
+ if (m_open)
+ {
+ close();
+ }
}
-BlockchainBDB::BlockchainBDB(bool batch_transactions)
+BlockchainBDB::BlockchainBDB(bool batch_transactions) :
+ m_buffer(DB_BUFFER_COUNT, DB_BUFFER_LENGTH)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- // initialize folder to something "safe" just in case
- // someone accidentally misuses this class...
- m_folder = "thishsouldnotexistbecauseitisgibberish";
- m_open = false;
-
- m_batch_transactions = batch_transactions;
- m_write_txn = nullptr;
- m_height = 0;
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ // initialize folder to something "safe" just in case
+ // someone accidentally misuses this class...
+ m_folder = "thishsouldnotexistbecauseitisgibberish";
+ m_open = false;
+ m_run_checkpoint = 0;
+ m_batch_transactions = batch_transactions;
+ m_write_txn = nullptr;
+ m_height = 0;
}
void BlockchainBDB::open(const std::string& filename, const int db_flags)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
- if (m_open)
- throw0(DB_OPEN_FAILURE("Attempted to open db, but it's already open"));
+ if (m_open)
+ throw0(DB_OPEN_FAILURE("Attempted to open db, but it's already open"));
- boost::filesystem::path direc(filename);
- if (boost::filesystem::exists(direc))
- {
- if (!boost::filesystem::is_directory(direc))
- throw0(DB_OPEN_FAILURE("DB needs a directory path, but a file was passed"));
- }
- else
- {
- if (!boost::filesystem::create_directory(direc))
- throw0(DB_OPEN_FAILURE(std::string("Failed to create directory ").append(filename).c_str()));
- }
+ boost::filesystem::path direc(filename);
+ if (boost::filesystem::exists(direc))
+ {
+ if (!boost::filesystem::is_directory(direc))
+ throw0(DB_OPEN_FAILURE("DB needs a directory path, but a file was passed"));
+ }
+ else
+ {
+ if (!boost::filesystem::create_directory(direc))
+ throw0(DB_OPEN_FAILURE(std::string("Failed to create directory ").append(filename).c_str()));
+ }
- m_folder = filename;
+ m_folder = filename;
- try
- {
+ try
+ {
- //Create BerkeleyDB environment
- m_env = new DbEnv(0); // no flags needed for DbEnv
+ //Create BerkeleyDB environment
+ m_env = new DbEnv(0); // no flags needed for DbEnv
- uint32_t db_env_open_flags = DB_CREATE | DB_INIT_MPOOL | DB_INIT_LOCK
- | DB_INIT_LOG | DB_INIT_TXN | DB_RECOVER
- | DB_THREAD;
+ uint32_t db_env_open_flags = DB_CREATE | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN | DB_RECOVER | DB_THREAD;
- // last parameter left 0, files will be created with default rw access
- m_env->open(filename.c_str(), db_env_open_flags, 0);
+ // Set some default values for these parameters.
+ // They can be overridden using the DB_CONFIG file.
+ m_env->set_cachesize(0, DB_DEF_CACHESIZE, 1);
+ m_env->set_lk_max_locks(DB_MAX_LOCKS);
+ m_env->set_lk_max_lockers(DB_MAX_LOCKS);
+ m_env->set_lk_max_objects(DB_MAX_LOCKS);
+
+ // last parameter left 0, files will be created with default rw access
+ m_env->open(filename.c_str(), db_env_open_flags, 0);
+ m_env->set_flags(db_flags, 1);
- // begin transaction to init dbs
- bdb_txn_safe txn;
- m_env->txn_begin(NULL, txn, 0);
+ if(m_auto_remove_logs)
+ m_env->log_set_config(DB_LOG_AUTO_REMOVE, 1);
- // create Dbs in the environment
- m_blocks = new Db(m_env, 0);
- m_block_heights = new Db(m_env, 0);
- m_block_hashes = new Db(m_env, 0);
- m_block_timestamps = new Db(m_env, 0);
- m_block_sizes = new Db(m_env, 0);
- m_block_diffs = new Db(m_env, 0);
- m_block_coins = new Db(m_env, 0);
+ // begin transaction to init dbs
+ bdb_txn_safe txn;
+ m_env->txn_begin(NULL, txn, 0);
- m_txs = new Db(m_env, 0);
- m_tx_unlocks = new Db(m_env, 0);
- m_tx_heights = new Db(m_env, 0);
- m_tx_outputs = new Db(m_env, 0);
+ // create Dbs in the environment
+ m_blocks = new Db(m_env, 0);
+ m_block_heights = new Db(m_env, 0);
+ m_block_hashes = new Db(m_env, 0);
+ m_block_timestamps = new Db(m_env, 0);
+ m_block_sizes = new Db(m_env, 0);
+ m_block_diffs = new Db(m_env, 0);
+ m_block_coins = new Db(m_env, 0);
- m_output_txs = new Db(m_env, 0);
- m_output_indices = new Db(m_env, 0);
- m_output_amounts = new Db(m_env, 0);
- m_output_keys = new Db(m_env, 0);
+ m_txs = new Db(m_env, 0);
+ m_tx_unlocks = new Db(m_env, 0);
+ m_tx_heights = new Db(m_env, 0);
+ m_tx_outputs = new Db(m_env, 0);
- m_spent_keys = new Db(m_env, 0);
+ m_output_txs = new Db(m_env, 0);
+ m_output_indices = new Db(m_env, 0);
+ m_output_amounts = new Db(m_env, 0);
+ m_output_keys = new Db(m_env, 0);
- // Tell DB about Dbs that need duplicate support
- // Note: no need to tell about sorting,
- // as the default is insertion order, which we want
- m_tx_outputs->set_flags(DB_DUP);
- m_output_amounts->set_flags(DB_DUP);
+ m_spent_keys = new Db(m_env, 0);
- // Tell DB about fixed-size values.
- m_block_hashes->set_re_len(sizeof(crypto::hash));
- m_block_timestamps->set_re_len(sizeof(uint64_t));
- m_block_sizes->set_re_len(sizeof(size_t)); // should really store block size as uint64_t...
- m_block_diffs->set_re_len(sizeof(difficulty_type));
- m_block_coins->set_re_len(sizeof(uint64_t));
+ // Tell DB about Dbs that need duplicate support
+ // Note: no need to tell about sorting,
+ // as the default is insertion order, which we want
+ m_tx_outputs->set_flags(DB_DUP);
+ m_output_amounts->set_flags(DB_DUP);
- m_output_txs->set_re_len(sizeof(crypto::hash));
- m_output_indices->set_re_len(sizeof(uint64_t));
- m_output_keys->set_re_len(sizeof(crypto::public_key));
+ // Tell DB about fixed-size values.
+ m_block_hashes->set_re_len(sizeof(crypto::hash));
+ m_block_timestamps->set_re_len(sizeof(uint64_t));
+ m_block_sizes->set_re_len(sizeof(size_t)); // should really store block size as uint64_t...
+ m_block_diffs->set_re_len(sizeof(difficulty_type));
+ m_block_coins->set_re_len(sizeof(uint64_t));
- //TODO: Find out if we need to do Db::set_flags(DB_RENUMBER)
- // for the RECNO databases. We shouldn't as we're only
- // inserting/removing from the end, but we'll see.
+ m_output_txs->set_re_len(sizeof(crypto::hash));
+ m_output_indices->set_re_len(sizeof(uint64_t));
+ m_output_keys->set_re_len(sizeof(output_data_t));
- // open Dbs in the environment
- // m_tx_outputs and m_output_amounts must be DB_HASH or DB_BTREE
- // because they need duplicate entry support. The rest are DB_RECNO,
- // as it seems that will be the most performant choice.
- m_blocks->open(txn, BDB_BLOCKS, NULL, DB_RECNO, DB_CREATE, 0);
+ //TODO: Find out if we need to do Db::set_flags(DB_RENUMBER)
+ // for the RECNO databases. We shouldn't as we're only
+ // inserting/removing from the end, but we'll see.
- m_block_timestamps->open(txn, BDB_BLOCK_TIMESTAMPS, NULL, DB_RECNO, DB_CREATE, 0);
- m_block_heights->open(txn, BDB_BLOCK_HEIGHTS, NULL, DB_HASH, DB_CREATE, 0);
- m_block_hashes->open(txn, BDB_BLOCK_HASHES, NULL, DB_RECNO, DB_CREATE, 0);
- m_block_sizes->open(txn, BDB_BLOCK_SIZES, NULL, DB_RECNO, DB_CREATE, 0);
- m_block_diffs->open(txn, BDB_BLOCK_DIFFS, NULL, DB_RECNO, DB_CREATE, 0);
- m_block_coins->open(txn, BDB_BLOCK_COINS, NULL, DB_RECNO, DB_CREATE, 0);
+ // open Dbs in the environment
+ // m_tx_outputs and m_output_amounts must be DB_HASH or DB_BTREE
+ // because they need duplicate entry support. The rest are DB_RECNO,
+ // as it seems that will be the most performant choice.
+ m_blocks->open(txn, BDB_BLOCKS, NULL, DB_RECNO, DB_CREATE, 0);
- m_txs->open(txn, BDB_TXS, NULL, DB_HASH, DB_CREATE, 0);
- m_tx_unlocks->open(txn, BDB_TX_UNLOCKS, NULL, DB_HASH, DB_CREATE, 0);
- m_tx_heights->open(txn, BDB_TX_HEIGHTS, NULL, DB_HASH, DB_CREATE, 0);
- m_tx_outputs->open(txn, BDB_TX_OUTPUTS, NULL, DB_HASH, DB_CREATE, 0);
+ m_block_timestamps->open(txn, BDB_BLOCK_TIMESTAMPS, NULL, DB_RECNO, DB_CREATE, 0);
+ m_block_heights->open(txn, BDB_BLOCK_HEIGHTS, NULL, DB_HASH, DB_CREATE, 0);
+ m_block_hashes->open(txn, BDB_BLOCK_HASHES, NULL, DB_RECNO, DB_CREATE, 0);
+ m_block_sizes->open(txn, BDB_BLOCK_SIZES, NULL, DB_RECNO, DB_CREATE, 0);
+ m_block_diffs->open(txn, BDB_BLOCK_DIFFS, NULL, DB_RECNO, DB_CREATE, 0);
+ m_block_coins->open(txn, BDB_BLOCK_COINS, NULL, DB_RECNO, DB_CREATE, 0);
- m_output_txs->open(txn, BDB_OUTPUT_TXS, NULL, DB_RECNO, DB_CREATE, 0);
- m_output_indices->open(txn, BDB_OUTPUT_INDICES, NULL, DB_RECNO, DB_CREATE, 0);
- m_output_amounts->open(txn, BDB_OUTPUT_AMOUNTS, NULL, DB_HASH, DB_CREATE, 0);
- m_output_keys->open(txn, BDB_OUTPUT_KEYS, NULL, DB_RECNO, DB_CREATE, 0);
+ m_txs->open(txn, BDB_TXS, NULL, DB_HASH, DB_CREATE, 0);
+ m_tx_unlocks->open(txn, BDB_TX_UNLOCKS, NULL, DB_HASH, DB_CREATE, 0);
+ m_tx_heights->open(txn, BDB_TX_HEIGHTS, NULL, DB_HASH, DB_CREATE, 0);
+ m_tx_outputs->open(txn, BDB_TX_OUTPUTS, NULL, DB_HASH, DB_CREATE, 0);
- m_spent_keys->open(txn, BDB_SPENT_KEYS, NULL, DB_HASH, DB_CREATE, 0);
+ m_output_txs->open(txn, BDB_OUTPUT_TXS, NULL, DB_RECNO, DB_CREATE, 0);
+ m_output_indices->open(txn, BDB_OUTPUT_INDICES, NULL, DB_RECNO, DB_CREATE, 0);
+ m_output_amounts->open(txn, BDB_OUTPUT_AMOUNTS, NULL, DB_HASH, DB_CREATE, 0);
+ m_output_keys->open(txn, BDB_OUTPUT_KEYS, NULL, DB_RECNO, DB_CREATE, 0);
+
+ m_spent_keys->open(txn, BDB_SPENT_KEYS, NULL, DB_HASH, DB_CREATE, 0);
+
+ txn.commit();
+
+ DB_BTREE_STAT* stats;
+
+ // DB_FAST_STAT can apparently cause an incorrect number of records
+ // to be returned. The flag should be set to 0 instead if this proves
+ // to be the case.
+
+ // ND: The bug above can occur when a block is popped and the application
+ // exits without pushing a new block to the db. Set txn to NULL and DB_FAST_STAT
+ // to zero (0) for reliability.
+ m_blocks->stat(NULL, &stats, 0);
+ m_height = stats->bt_nkeys;
+ delete stats;
+
+ // see above comment about DB_FAST_STAT
+ m_output_indices->stat(NULL, &stats, 0);
+ m_num_outputs = stats->bt_nkeys;
+ delete stats;
+
+ // run checkpoint thread
+ m_run_checkpoint = true;
+ m_checkpoint_thread.reset(new boost::thread(&BlockchainBDB::checkpoint_worker, this));
+ }
+ catch (const std::exception& e)
+ {
+ throw0(DB_OPEN_FAILURE(e.what()));
+ }
+
+ m_open = true;
+}
+
+void BlockchainBDB::close()
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ this->sync();
+
+ m_run_checkpoint = false;
+ m_checkpoint_thread->join();
+ m_checkpoint_thread.reset();
+
+ // FIXME: not yet thread safe!!! Use with care.
+ m_open = false;
+ m_env->close(DB_FORCESYNC);
+}
+
+void BlockchainBDB::sync()
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ try
+ {
+ m_blocks->sync(0);
+ m_block_heights->sync(0);
+ m_block_hashes->sync(0);
+ m_block_timestamps->sync(0);
+ m_block_sizes->sync(0);
+ m_block_diffs->sync(0);
+ m_block_coins->sync(0);
+
+ m_txs->sync(0);
+ m_tx_unlocks->sync(0);
+ m_tx_heights->sync(0);
+ m_tx_outputs->sync(0);
+
+ m_output_txs->sync(0);
+ m_output_indices->sync(0);
+ m_output_amounts->sync(0);
+ m_output_keys->sync(0);
+
+ m_spent_keys->sync(0);
+ }
+ catch (const std::exception& e)
+ {
+ throw0(DB_ERROR(std::string("Failed to sync database: ").append(e.what()).c_str()));
+ }
+}
+
+void BlockchainBDB::reset()
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ // TODO: this
+}
+
+std::vector BlockchainBDB::get_filenames() const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ std::vector filenames;
+
+ char *fname, *dbname;
+ const char **pfname, **pdbname;
+
+ pfname = (const char **)&fname;
+ pdbname = (const char **)&dbname;
+
+ m_blocks->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_block_heights->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_block_hashes->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_block_timestamps->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_block_sizes->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_block_diffs->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_block_coins->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_txs->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_tx_unlocks->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_tx_heights->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_tx_outputs->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_output_txs->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_output_indices->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_output_amounts->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_output_keys->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ m_spent_keys->get_dbname(pfname, pdbname);
+ filenames.push_back(fname);
+
+ std::vector full_paths;
+
+ for (auto& filename : filenames)
+ {
+ boost::filesystem::path p(m_folder);
+ p /= filename;
+ full_paths.push_back(p.string());
+ }
+
+ return full_paths;
+}
+
+std::string BlockchainBDB::get_db_name() const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+
+ return std::string("BerkeleyDB");
+}
+
+// TODO: this?
+bool BlockchainBDB::lock()
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ return false;
+}
+
+// TODO: this?
+void BlockchainBDB::unlock()
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+}
+
+bool BlockchainBDB::block_exists(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(h);
+
+ auto get_result = m_block_heights->exists(DB_DEFAULT_TX, &key, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ LOG_PRINT_L3("Block with hash " << epee::string_tools::pod_to_hex(h) << " not found in db");
+ return false;
+ }
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch block index from hash"));
+
+ return true;
+}
+
+block BlockchainBDB::get_block(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ return get_block_from_height(get_block_height(h));
+}
+
+uint64_t BlockchainBDB::get_block_height(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(h);
+ Dbt_copy result;
+
+ auto get_result = m_block_heights->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(BLOCK_DNE("Attempted to retrieve non-existent block height"));
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve a block height from the db"));
+
+ return result - 1;
+}
+
+block_header BlockchainBDB::get_block_header(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ // block_header object is automatically cast from block object
+ return get_block(h);
+}
+
+block BlockchainBDB::get_block_from_height(const uint64_t& height) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(height + 1);
+ Dbt_safe result;
+ auto get_result = m_blocks->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ throw0(DB_ERROR(std::string("Attempt to get block from height ").append(boost::lexical_cast(height)).append(" failed -- block not in db").c_str()));
+ }
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve a block from the db"));
+
+ blobdata bd;
+ bd.assign(reinterpret_cast(result.get_data()), result.get_size());
+
+ block b;
+ if (!parse_and_validate_block_from_blob(bd, b))
+ throw0(DB_ERROR("Failed to parse block from blob retrieved from the db"));
+
+ return b;
+}
+
+uint64_t BlockchainBDB::get_block_timestamp(const uint64_t& height) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(height + 1);
+ Dbt_copy result;
+ auto get_result = m_block_timestamps->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ throw0(DB_ERROR(std::string("Attempt to get timestamp from height ").append(boost::lexical_cast(height)).append(" failed -- timestamp not in db").c_str()));
+ }
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve a timestamp from the db"));
+
+ return result;
+}
+
+uint64_t BlockchainBDB::get_top_block_timestamp() const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ // if no blocks, return 0
+ if (m_height == 0)
+ {
+ return 0;
+ }
+
+ return get_block_timestamp(m_height - 1);
+}
+
+size_t BlockchainBDB::get_block_size(const uint64_t& height) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(height + 1);
+ Dbt_copy result;
+ auto get_result = m_block_sizes->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ throw0(DB_ERROR(std::string("Attempt to get block size from height ").append(boost::lexical_cast(height)).append(" failed -- block size not in db").c_str()));
+ }
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve a block size from the db"));
+
+ return result;
+}
+
+difficulty_type BlockchainBDB::get_block_cumulative_difficulty(const uint64_t& height) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__ << " height: " << height);
+ check_open();
+
+ Dbt_copy key(height + 1);
+ Dbt_copy result;
+ auto get_result = m_block_diffs->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ throw0(DB_ERROR(std::string("Attempt to get cumulative difficulty from height ").append(boost::lexical_cast(height)).append(" failed -- difficulty not in db").c_str()));
+ }
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve a cumulative difficulty from the db"));
+
+ return result;
+}
+
+difficulty_type BlockchainBDB::get_block_difficulty(const uint64_t& height) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ difficulty_type diff1 = 0;
+ difficulty_type diff2 = 0;
+
+ diff1 = get_block_cumulative_difficulty(height);
+ if (height != 0)
+ {
+ diff2 = get_block_cumulative_difficulty(height - 1);
+ }
+
+ return diff1 - diff2;
+}
+
+uint64_t BlockchainBDB::get_block_already_generated_coins(const uint64_t& height) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(height + 1);
+ Dbt_copy result;
+ auto get_result = m_block_coins->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ throw0(DB_ERROR(std::string("Attempt to get generated coins from height ").append(boost::lexical_cast(height)).append(" failed -- block size not in db").c_str()));
+ }
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve a total generated coins from the db"));
+
+ return result;
+}
+
+crypto::hash BlockchainBDB::get_block_hash_from_height(const uint64_t& height) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(height + 1);
+ Dbt_copy result;
+ auto get_result = m_block_hashes->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ throw0(BLOCK_DNE(std::string("Attempt to get hash from height ").append(boost::lexical_cast(height)).append(" failed -- hash not in db").c_str()));
+ }
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve a block hash from the db."));
+
+ return result;
+}
+
+std::vector BlockchainBDB::get_blocks_range(const uint64_t& h1, const uint64_t& h2) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ std::vector v;
+
+ for (uint64_t height = h1; height <= h2; ++height)
+ {
+ v.push_back(get_block_from_height(height));
+ }
+
+ return v;
+}
+
+std::vector BlockchainBDB::get_hashes_range(const uint64_t& h1, const uint64_t& h2) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ std::vector v;
+
+ for (uint64_t height = h1; height <= h2; ++height)
+ {
+ v.push_back(get_block_hash_from_height(height));
+ }
+
+ return v;
+}
+
+crypto::hash BlockchainBDB::top_block_hash() const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ if (m_height > 0)
+ {
+ return get_block_hash_from_height(m_height - 1);
+ }
+
+ return null_hash;
+}
+
+block BlockchainBDB::get_top_block() const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ if (m_height > 0)
+ {
+ return get_block_from_height(m_height - 1);
+ }
+
+ block b;
+ return b;
+}
+
+uint64_t BlockchainBDB::height() const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ return m_height;
+}
+
+bool BlockchainBDB::tx_exists(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(h);
+
+ TIME_MEASURE_START(time1);
+ auto get_result = m_txs->exists(DB_DEFAULT_TX, &key, 0);
+ TIME_MEASURE_FINISH(time1);
+ time_tx_exists += time1;
+ if (get_result == DB_NOTFOUND)
+ {
+ LOG_PRINT_L1("transaction with hash " << epee::string_tools::pod_to_hex(h) << " not found in db");
+ return false;
+ }
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch transaction from hash"));
+
+ return true;
+}
+
+uint64_t BlockchainBDB::get_tx_unlock_time(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(h);
+ Dbt_copy result;
+ auto get_result = m_tx_unlocks->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(TX_DNE(std::string("tx unlock time with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str()));
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch tx unlock time from hash"));
+
+ return result;
+}
+
+transaction BlockchainBDB::get_tx(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy key(h);
+ Dbt_safe result;
+ auto get_result = m_txs->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(TX_DNE(std::string("tx with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str()));
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch tx from hash"));
+
+ blobdata bd;
+ bd.assign(reinterpret_cast(result.get_data()), result.get_size());
+
+ transaction tx;
+ if (!parse_and_validate_tx_from_blob(bd, tx))
+ throw0(DB_ERROR("Failed to parse tx from blob retrieved from the db"));
+
+ return tx;
+}
+
+uint64_t BlockchainBDB::get_tx_count() const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
DB_BTREE_STAT* stats;
// DB_FAST_STAT can apparently cause an incorrect number of records
// to be returned. The flag should be set to 0 instead if this proves
// to be the case.
- m_blocks->stat(txn, &stats, DB_FAST_STAT);
- m_height = stats->bt_nkeys;
+ m_txs->stat(DB_DEFAULT_TX, &stats, DB_FAST_STAT);
+ auto num_txs = stats->bt_nkeys;
delete stats;
- // see above comment about DB_FAST_STAT
- m_output_indices->stat(txn, &stats, DB_FAST_STAT);
- m_num_outputs = stats->bt_nkeys;
- delete stats;
-
- txn.commit();
- }
- catch (const std::exception& e)
- {
- throw0(DB_OPEN_FAILURE(e.what()));
- }
-
- m_open = true;
-}
-
-void BlockchainBDB::close()
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- this->sync();
-
- // FIXME: not yet thread safe!!! Use with care.
- m_open = false;
- m_env->close(DB_FORCESYNC);
-}
-
-void BlockchainBDB::sync()
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- try
- {
- m_blocks->sync(0);
- m_block_heights->sync(0);
- m_block_hashes->sync(0);
- m_block_timestamps->sync(0);
- m_block_sizes->sync(0);
- m_block_diffs->sync(0);
- m_block_coins->sync(0);
-
- m_txs->sync(0);
- m_tx_unlocks->sync(0);
- m_tx_heights->sync(0);
- m_tx_outputs->sync(0);
-
- m_output_txs->sync(0);
- m_output_indices->sync(0);
- m_output_amounts->sync(0);
- m_output_keys->sync(0);
-
- m_spent_keys->sync(0);
- }
- catch (const std::exception& e)
- {
- throw0(DB_ERROR(std::string("Failed to sync database: ").append(e.what()).c_str()));
- }
-}
-
-void BlockchainBDB::reset()
-{
- LOG_PRINT_L3("BlockchainLMDB::" << __func__);
- // TODO: this
-}
-
-std::vector BlockchainBDB::get_filenames() const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- std::vector filenames;
-
- char *fname, *dbname;
- const char **pfname, **pdbname;
-
- pfname = (const char **)&fname;
- pdbname = (const char **)&dbname;
-
- m_blocks->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_block_heights->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_block_hashes->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_block_timestamps->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_block_sizes->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_block_diffs->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_block_coins->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_txs->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_tx_unlocks->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_tx_heights->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_tx_outputs->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_output_txs->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_output_indices->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_output_amounts->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_output_keys->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- m_spent_keys->get_dbname(pfname, pdbname);
- filenames.push_back(fname);
-
- std::vector full_paths;
-
- for (auto& filename : filenames)
- {
- boost::filesystem::path p(m_folder);
- p /= filename;
- full_paths.push_back(p.string());
- }
-
- return full_paths;
-}
-
-std::string BlockchainBDB::get_db_name() const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
-
- return std::string("BerkeleyDB");
-}
-
-// TODO: this?
-bool BlockchainBDB::lock()
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
- return false;
-}
-
-// TODO: this?
-void BlockchainBDB::unlock()
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-}
-
-bool BlockchainBDB::block_exists(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(h);
-
- auto get_result = m_block_heights->exists(txn, &key, 0);
- if (get_result == DB_NOTFOUND)
- {
- txn.commit();
- LOG_PRINT_L3("Block with hash " << epee::string_tools::pod_to_hex(h) << " not found in db");
- return false;
- }
- else if (get_result)
- throw0(DB_ERROR("DB error attempting to fetch block index from hash"));
-
- txn.commit();
- return true;
-}
-
-block BlockchainBDB::get_block(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- return get_block_from_height(get_block_height(h));
-}
-
-uint64_t BlockchainBDB::get_block_height(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(h);
- Dbt_copy result;
-
- auto get_result = m_block_heights->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- throw1(BLOCK_DNE("Attempted to retrieve non-existent block height"));
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve a block height from the db"));
-
- txn.commit();
-
- return (uint64_t)result - 1;
-}
-
-block_header BlockchainBDB::get_block_header(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- // block_header object is automatically cast from block object
- return get_block(h);
-}
-
-block BlockchainBDB::get_block_from_height(const uint64_t& height) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(height + 1);
- Dbt_safe result;
- auto get_result = m_blocks->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- {
- throw0(DB_ERROR(std::string("Attempt to get block from height ").append(boost::lexical_cast(height)).append(" failed -- block not in db").c_str()));
- }
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve a block from the db"));
-
- txn.commit();
-
- blobdata bd;
- bd.assign(reinterpret_cast(result.get_data()), result.get_size());
-
- block b;
- if (!parse_and_validate_block_from_blob(bd, b))
- throw0(DB_ERROR("Failed to parse block from blob retrieved from the db"));
-
- return b;
-}
-
-uint64_t BlockchainBDB::get_block_timestamp(const uint64_t& height) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(height + 1);
- Dbt_copy result;
- auto get_result = m_block_timestamps->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- {
- throw0(DB_ERROR(std::string("Attempt to get timestamp from height ").append(boost::lexical_cast(height)).append(" failed -- timestamp not in db").c_str()));
- }
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve a timestamp from the db"));
-
- txn.commit();
- return result;
-}
-
-uint64_t BlockchainBDB::get_top_block_timestamp() const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- // if no blocks, return 0
- if (m_height == 0)
- {
- return 0;
- }
-
- return get_block_timestamp(m_height - 1);
-}
-
-size_t BlockchainBDB::get_block_size(const uint64_t& height) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(height + 1);
- Dbt_copy result;
- auto get_result = m_block_sizes->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- {
- throw0(DB_ERROR(std::string("Attempt to get block size from height ").append(boost::lexical_cast(height)).append(" failed -- block size not in db").c_str()));
- }
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve a block size from the db"));
-
- txn.commit();
- return result;
-}
-
-difficulty_type BlockchainBDB::get_block_cumulative_difficulty(const uint64_t& height) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__ << " height: " << height);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(height + 1);
- Dbt_copy result;
- auto get_result = m_block_diffs->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- {
- throw0(DB_ERROR(std::string("Attempt to get cumulative difficulty from height ").append(boost::lexical_cast(height)).append(" failed -- difficulty not in db").c_str()));
- }
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve a cumulative difficulty from the db"));
-
- txn.commit();
- return result;
-}
-
-difficulty_type BlockchainBDB::get_block_difficulty(const uint64_t& height) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- difficulty_type diff1 = 0;
- difficulty_type diff2 = 0;
-
- diff1 = get_block_cumulative_difficulty(height);
- if (height != 0)
- {
- diff2 = get_block_cumulative_difficulty(height - 1);
- }
-
- return diff1 - diff2;
-}
-
-uint64_t BlockchainBDB::get_block_already_generated_coins(const uint64_t& height) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(height + 1);
- Dbt_copy result;
- auto get_result = m_block_coins->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- {
- throw0(DB_ERROR(std::string("Attempt to get generated coins from height ").append(boost::lexical_cast(height)).append(" failed -- block size not in db").c_str()));
- }
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve a total generated coins from the db"));
-
- txn.commit();
- return result;
-}
-
-crypto::hash BlockchainBDB::get_block_hash_from_height(const uint64_t& height) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(height + 1);
- Dbt_copy result;
- auto get_result = m_block_hashes->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- {
- throw0(BLOCK_DNE(std::string("Attempt to get hash from height ").append(boost::lexical_cast(height)).append(" failed -- hash not in db").c_str()));
- }
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve a block hash from the db."));
-
- txn.commit();
- return result;
-}
-
-std::vector BlockchainBDB::get_blocks_range(const uint64_t& h1, const uint64_t& h2) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
- std::vector v;
-
- for (uint64_t height = h1; height <= h2; ++height)
- {
- v.push_back(get_block_from_height(height));
- }
-
- return v;
-}
-
-std::vector BlockchainBDB::get_hashes_range(const uint64_t& h1, const uint64_t& h2) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
- std::vector v;
-
- for (uint64_t height = h1; height <= h2; ++height)
- {
- v.push_back(get_block_hash_from_height(height));
- }
-
- return v;
-}
-
-crypto::hash BlockchainBDB::top_block_hash() const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
- if (m_height > 0)
- {
- return get_block_hash_from_height(m_height - 1);
- }
-
- return null_hash;
-}
-
-block BlockchainBDB::get_top_block() const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- if (m_height > 0)
- {
- return get_block_from_height(m_height - 1);
- }
-
- block b;
- return b;
-}
-
-uint64_t BlockchainBDB::height() const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- return m_height;
-}
-
-bool BlockchainBDB::tx_exists(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(h);
-
- TIME_MEASURE_START(time1);
- auto get_result = m_txs->exists(txn, &key, 0);
- TIME_MEASURE_FINISH(time1);
- time_tx_exists += time1;
- if (get_result == DB_NOTFOUND)
- {
- txn.commit();
- LOG_PRINT_L1("transaction with hash " << epee::string_tools::pod_to_hex(h) << " not found in db");
- return false;
- }
- else if (get_result)
- throw0(DB_ERROR("DB error attempting to fetch transaction from hash"));
-
- return true;
-}
-
-uint64_t BlockchainBDB::get_tx_unlock_time(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainLMDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(h);
- Dbt_copy result;
- auto get_result = m_tx_unlocks->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- throw1(TX_DNE(std::string("tx unlock time with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str()));
- else if (get_result)
- throw0(DB_ERROR("DB error attempting to fetch tx unlock time from hash"));
-
- return result;
-}
-
-transaction BlockchainBDB::get_tx(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy key(h);
- Dbt_safe result;
- auto get_result = m_txs->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- throw1(TX_DNE(std::string("tx with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str()));
- else if (get_result)
- throw0(DB_ERROR("DB error attempting to fetch tx from hash"));
-
- blobdata bd;
- bd.assign(reinterpret_cast(result.get_data()), result.get_size());
-
- transaction tx;
- if (!parse_and_validate_tx_from_blob(bd, tx))
- throw0(DB_ERROR("Failed to parse tx from blob retrieved from the db"));
-
- txn.commit();
-
- return tx;
-}
-
-uint64_t BlockchainBDB::get_tx_count() const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- DB_BTREE_STAT* stats;
-
- // DB_FAST_STAT can apparently cause an incorrect number of records
- // to be returned. The flag should be set to 0 instead if this proves
- // to be the case.
- m_txs->stat(txn, &stats, DB_FAST_STAT);
- auto num_txs = stats->bt_nkeys;
- delete stats;
-
- txn.commit();
-
- return num_txs;
+ return num_txs;
}
std::vector BlockchainBDB::get_tx_list(const std::vector& hlist) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
- std::vector v;
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ std::vector v;
- for (auto& h : hlist)
- {
- v.push_back(get_tx(h));
- }
+for (auto& h : hlist)
+ {
+ v.push_back(get_tx(h));
+ }
- return v;
+ return v;
}
uint64_t BlockchainBDB::get_tx_block_height(const crypto::hash& h) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
+ Dbt_copy key(h);
+ Dbt_copy result;
+ auto get_result = m_tx_heights->get(DB_DEFAULT_TX, &key, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ {
+ throw1(TX_DNE(std::string("tx height with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str()));
+ }
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch tx height from hash"));
- Dbt_copy key(h);
- Dbt_copy result;
- auto get_result = m_tx_heights->get(txn, &key, &result, 0);
- if (get_result == DB_NOTFOUND)
- {
- throw1(TX_DNE(std::string("tx height with hash ").append(epee::string_tools::pod_to_hex(h)).append(" not found in db").c_str()));
- }
- else if (get_result)
- throw0(DB_ERROR("DB error attempting to fetch tx height from hash"));
-
- txn.commit();
-
- return (uint64_t)result - 1;
-}
-
-//FIXME: make sure the random method used here is appropriate
-uint64_t BlockchainBDB::get_random_output(const uint64_t& amount) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- uint64_t num_outputs = get_num_outputs(amount);
- if (num_outputs == 0)
- throw1(OUTPUT_DNE("Attempting to get a random output for an amount, but none exist"));
-
- return crypto::rand() % num_outputs;
+ return (uint64_t)result - 1;
}
uint64_t BlockchainBDB::get_num_outputs(const uint64_t& amount) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
+ bdb_cur cur(DB_DEFAULT_TX, m_output_amounts);
- bdb_cur cur(txn, m_output_amounts);
+ Dbt_copy k(amount);
+ Dbt_copy v;
+ auto result = cur->get(&k, &v, DB_SET);
+ if (result == DB_NOTFOUND)
+ {
+ return 0;
+ }
+ else if (result)
+ throw0(DB_ERROR("DB error attempting to get number of outputs of an amount"));
- Dbt_copy k(amount);
- Dbt_copy v;
- auto result = cur->get(&k, &v, DB_SET);
- if (result == DB_NOTFOUND)
- {
- return 0;
- }
- else if (result)
- throw0(DB_ERROR("DB error attempting to get number of outputs of an amount"));
+ db_recno_t num_elems = 0;
+ cur->count(&num_elems, 0);
- db_recno_t num_elems = 0;
- cur->count(&num_elems, 0);
+ cur.close();
- txn.commit();
-
- return num_elems;
+ return num_elems;
}
-crypto::public_key BlockchainBDB::get_output_key(const uint64_t& amount, const uint64_t& index) const
+output_data_t BlockchainBDB::get_output_key(const uint64_t& global_index) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- uint64_t glob_index = get_output_global_index(amount, index);
+ Dbt_copy k(global_index);
+ Dbt_copy v;
+ auto get_result = m_output_keys->get(DB_DEFAULT_TX, &k, &v, 0);
+ if (get_result == DB_NOTFOUND)
+ throw0(DB_ERROR("Attempting to get output pubkey by global index, but key does not exist"));
+ else if (get_result)
+ throw0(DB_ERROR("Error attempting to retrieve an output pubkey from the db"));
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
+ return v;
+}
- Dbt_copy k(glob_index);
- Dbt_copy v;
- auto get_result = m_output_keys->get(txn, &k, &v, 0);
- if (get_result == DB_NOTFOUND)
- throw0(DB_ERROR("Attempting to get output pubkey by global index, but key does not exist"));
- else if (get_result)
- throw0(DB_ERROR("Error attempting to retrieve an output pubkey from the db"));
+output_data_t BlockchainBDB::get_output_key(const uint64_t& amount, const uint64_t& index)
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- return v;
+ uint64_t glob_index = get_output_global_index(amount, index);
+ return get_output_key(glob_index);
}
// As this is not used, its return is now a blank output.
// This will save on space in the db.
tx_out BlockchainBDB::get_output(const crypto::hash& h, const uint64_t& index) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- return tx_out();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ return tx_out();
}
// As this is not used, its return is now a blank output.
// This will save on space in the db.
tx_out BlockchainBDB::get_output(const uint64_t& index) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- return tx_out();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ return tx_out();
}
-tx_out_index BlockchainBDB::get_output_tx_and_index_from_global(const uint64_t& index) const
+tx_out_index BlockchainBDB::get_output_tx_and_index(const uint64_t& amount, const uint64_t& index)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ std::vector < uint64_t > offsets;
+ std::vector indices;
+ offsets.push_back(index);
+ get_output_tx_and_index(amount, offsets, indices);
+ if (!indices.size())
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- Dbt_copy k(index);
- Dbt_copy v;
-
- auto get_result = m_output_txs->get(txn, &k, &v, 0);
- if (get_result == DB_NOTFOUND)
- throw1(OUTPUT_DNE("output with given index not in db"));
- else if (get_result)
- throw0(DB_ERROR("DB error attempting to fetch output tx hash"));
-
- crypto::hash tx_hash = v;
-
- Dbt_copy result;
- get_result = m_output_indices->get(txn, &k, &result, 0);
- if (get_result == DB_NOTFOUND)
- throw1(OUTPUT_DNE("output with given index not in db"));
- else if (get_result)
- throw0(DB_ERROR("DB error attempting to fetch output tx index"));
-
- txn.commit();
-
- return tx_out_index(tx_hash, result);
-}
-
-tx_out_index BlockchainBDB::get_output_tx_and_index(const uint64_t& amount, const uint64_t& index) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- bdb_cur cur(txn, m_output_amounts);
-
- Dbt_copy k(amount);
- Dbt_copy v;
-
- auto result = cur->get(&k, &v, DB_SET);
- if (result == DB_NOTFOUND)
- throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
- else if (result)
- throw0(DB_ERROR("DB error attempting to get an output"));
-
- db_recno_t num_elems = 0;
- cur->count(&num_elems, 0);
-
- if (num_elems <= index)
- throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but output not found"));
-
- for (uint64_t i = 0; i < index; ++i)
- {
- cur->get(&k, &v, DB_NEXT_DUP);
- }
-
- uint64_t glob_index = v;
-
- cur.close();
-
- txn.commit();
-
- return get_output_tx_and_index_from_global(glob_index);
+ return indices[0];
}
std::vector BlockchainBDB::get_tx_output_indices(const crypto::hash& h) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
- std::vector index_vec;
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ std::vector index_vec;
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- bdb_cur cur(txn, m_tx_outputs);
-
- Dbt_copy k(h);
- Dbt_copy v;
- auto result = cur->get(&k, &v, DB_SET);
- if (result == DB_NOTFOUND)
- throw1(OUTPUT_DNE("Attempting to get an output by tx hash and tx index, but output not found"));
- else if (result)
- throw0(DB_ERROR("DB error attempting to get an output"));
-
- db_recno_t num_elems = 0;
- cur->count(&num_elems, 0);
-
- for (uint64_t i = 0; i < num_elems; ++i)
- {
- index_vec.push_back(v);
- cur->get(&k, &v, DB_NEXT_DUP);
- }
-
- cur.close();
- txn.commit();
-
- return index_vec;
-}
-
-std::vector BlockchainBDB::get_tx_amount_output_indices(const crypto::hash& h) const
-{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
- std::vector index_vec;
- std::vector index_vec2;
-
- // get the transaction's global output indices first
- index_vec = get_tx_output_indices(h);
- // these are next used to obtain the amount output indices
-
- transaction tx = get_tx(h);
-
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
-
- uint64_t i = 0;
- uint64_t global_index;
- for (const auto& vout : tx.vout)
- {
- uint64_t amount = vout.amount;
-
- global_index = index_vec[i];
-
- bdb_cur cur(txn, m_output_amounts);
-
- Dbt_copy k(amount);
- Dbt_copy v;
+ bdb_cur cur(DB_DEFAULT_TX, m_tx_outputs);
+ Dbt_copy k(h);
+ Dbt_copy v;
auto result = cur->get(&k, &v, DB_SET);
if (result == DB_NOTFOUND)
- throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
+ throw1(OUTPUT_DNE("Attempting to get an output by tx hash and tx index, but output not found"));
else if (result)
- throw0(DB_ERROR("DB error attempting to get an output"));
+ throw0(DB_ERROR("DB error attempting to get an output"));
db_recno_t num_elems = 0;
cur->count(&num_elems, 0);
- uint64_t amount_output_index = 0;
- uint64_t output_index = 0;
- bool found_index = false;
- for (uint64_t j = 0; j < num_elems; ++j)
+ for (uint64_t i = 0; i < num_elems; ++i)
{
- output_index = v;
- if (output_index == global_index)
- {
- amount_output_index = j;
- found_index = true;
- break;
- }
- cur->get(&k, &v, DB_NEXT_DUP);
- }
- if (found_index)
- {
- index_vec2.push_back(amount_output_index);
- }
- else
- {
- // not found
- cur.close();
- txn.commit();
- throw1(OUTPUT_DNE("specified output not found in db"));
+ index_vec.push_back(v);
+ cur->get(&k, &v, DB_NEXT_DUP);
}
cur.close();
- ++i;
- }
- txn.commit();
+ return index_vec;
+}
- return index_vec2;
+std::vector BlockchainBDB::get_tx_amount_output_indices(const crypto::hash& h) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ std::vector index_vec;
+ std::vector index_vec2;
+
+ // get the transaction's global output indices first
+ index_vec = get_tx_output_indices(h);
+ // these are next used to obtain the amount output indices
+
+ transaction tx = get_tx(h);
+
+ uint64_t i = 0;
+ uint64_t global_index;
+ for (const auto& vout : tx.vout)
+ {
+ uint64_t amount = vout.amount;
+
+ global_index = index_vec[i];
+
+ bdb_cur cur(DB_DEFAULT_TX, m_output_amounts);
+
+ Dbt_copy k(amount);
+ Dbt_copy v;
+
+ auto result = cur->get(&k, &v, DB_SET);
+ if (result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
+ else if (result)
+ throw0(DB_ERROR("DB error attempting to get an output"));
+
+ db_recno_t num_elems = 0;
+ cur->count(&num_elems, 0);
+
+ uint64_t amount_output_index = 0;
+ uint64_t output_index = 0;
+ bool found_index = false;
+ for (uint64_t j = 0; j < num_elems; ++j)
+ {
+ output_index = v;
+ if (output_index == global_index)
+ {
+ amount_output_index = j;
+ found_index = true;
+ break;
+ }
+ cur->get(&k, &v, DB_NEXT_DUP);
+ }
+ if (found_index)
+ {
+ index_vec2.push_back(amount_output_index);
+ }
+ else
+ {
+ // not found
+ cur.close();
+ throw1(OUTPUT_DNE("specified output not found in db"));
+ }
+
+ cur.close();
+ ++i;
+ }
+
+ return index_vec2;
}
+tx_out_index BlockchainBDB::get_output_tx_and_index_from_global(const uint64_t& index) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ Dbt_copy k(index);
+ Dbt_copy v;
+
+ auto get_result = m_output_txs->get(DB_DEFAULT_TX, &k, &v, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("output with given index not in db"));
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch output tx hash"));
+
+ crypto::hash tx_hash = v;
+
+ Dbt_copy result;
+ get_result = m_output_indices->get(DB_DEFAULT_TX, &k, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("output with given index not in db"));
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch output tx index"));
+
+ return tx_out_index(tx_hash, result);
+}
bool BlockchainBDB::has_key_image(const crypto::key_image& img) const
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
+ Dbt_copy val_key(img);
+ if (m_spent_keys->exists(DB_DEFAULT_TX, &val_key, 0) == 0)
+ {
+ return true;
+ }
- Dbt_copy val_key(img);
- if (m_spent_keys->exists(txn, &val_key, 0) == 0)
- {
- txn.commit();
- return true;
- }
-
- txn.commit();
- return false;
+ return false;
}
// Ostensibly BerkeleyDB has batch transaction support built-in,
// so the following few functions will be NOP.
-void BlockchainBDB::batch_start()
+void BlockchainBDB::batch_start(uint64_t batch_num_blocks)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
}
void BlockchainBDB::batch_commit()
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
}
void BlockchainBDB::batch_stop()
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
}
void BlockchainBDB::batch_abort()
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
}
void BlockchainBDB::set_batch_transactions(bool batch_transactions)
{
- LOG_PRINT_L3("BlockchainLMDB::" << __func__);
- m_batch_transactions = batch_transactions;
- LOG_PRINT_L3("batch transactions " << (m_batch_transactions ? "enabled" : "disabled"));
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ m_batch_transactions = batch_transactions;
+ LOG_PRINT_L3("batch transactions " << (m_batch_transactions ? "enabled" : "disabled"));
}
-uint64_t BlockchainBDB::add_block( const block& blk
- , const size_t& block_size
- , const difficulty_type& cumulative_difficulty
- , const uint64_t& coins_generated
- , const std::vector& txs
- )
+uint64_t BlockchainBDB::add_block(const block& blk, const size_t& block_size, const difficulty_type& cumulative_difficulty, const uint64_t& coins_generated, const std::vector& txs)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
- m_write_txn = &txn;
+ bdb_txn_safe txn;
+ if (m_env->txn_begin(NULL, txn, 0))
+ throw0(DB_ERROR("Failed to create a transaction for the db"));
+ m_write_txn = &txn;
- uint64_t num_outputs = m_num_outputs;
- try
- {
- BlockchainDB::add_block(blk, block_size, cumulative_difficulty, coins_generated, txs);
- m_write_txn = NULL;
+ uint64_t num_outputs = m_num_outputs;
+ try
+ {
+ BlockchainDB::add_block(blk, block_size, cumulative_difficulty, coins_generated, txs);
+ m_write_txn = NULL;
- TIME_MEASURE_START(time1);
- txn.commit();
- TIME_MEASURE_FINISH(time1);
- time_commit1 += time1;
- }
- catch (const std::exception& e)
- {
- m_num_outputs = num_outputs;
- m_write_txn = NULL;
- throw;
- }
+ TIME_MEASURE_START(time1);
+ txn.commit();
+ TIME_MEASURE_FINISH(time1);
+ time_commit1 += time1;
+ }
+ catch (const std::exception& e)
+ {
+ m_num_outputs = num_outputs;
+ m_write_txn = NULL;
+ throw;
+ }
- return ++m_height;
+ return ++m_height;
}
void BlockchainBDB::pop_block(block& blk, std::vector& txs)
{
- LOG_PRINT_L3("BlockchainBDB::" << __func__);
- check_open();
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
- bdb_txn_safe txn;
- if (m_env->txn_begin(NULL, txn, 0))
- throw0(DB_ERROR("Failed to create a transaction for the db"));
- m_write_txn = &txn;
+ bdb_txn_safe txn;
+ if (m_env->txn_begin(NULL, txn, 0))
+ throw0(DB_ERROR("Failed to create a transaction for the db"));
+ m_write_txn = &txn;
- uint64_t num_outputs = m_num_outputs;
- try
- {
- BlockchainDB::pop_block(blk, txs);
+ uint64_t num_outputs = m_num_outputs;
+ try
+ {
+ BlockchainDB::pop_block(blk, txs);
- m_write_txn = NULL;
- txn.commit();
- }
- catch (...)
- {
- m_num_outputs = num_outputs;
- m_write_txn = NULL;
- throw;
- }
+ m_write_txn = NULL;
+ txn.commit();
+ }
+ catch (...)
+ {
+ m_num_outputs = num_outputs;
+ m_write_txn = NULL;
+ throw;
+ }
- --m_height;
+ --m_height;
+}
+
+void BlockchainBDB::get_output_tx_and_index_from_global(const std::vector &global_indices, std::vector &tx_out_indices) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ tx_out_indices.clear();
+
+ for (const uint64_t &index : global_indices)
+ {
+ Dbt_copy k(index);
+ Dbt_copy v;
+
+ auto get_result = m_output_txs->get(DB_DEFAULT_TX, &k, &v, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("output with given index not in db"));
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch output tx hash"));
+
+ crypto::hash tx_hash = v;
+
+ Dbt_copy result;
+ get_result = m_output_indices->get(DB_DEFAULT_TX, &k, &result, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("output with given index not in db"));
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch output tx index"));
+ auto hashindex = tx_out_index(tx_hash, result);
+ tx_out_indices.push_back(hashindex);
+ }
+}
+
+void BlockchainBDB::get_output_global_indices(const uint64_t& amount, const std::vector &offsets, std::vector &global_indices)
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ TIME_MEASURE_START(txx);
+ check_open();
+
+ bdb_cur cur(DB_DEFAULT_TX, m_output_amounts);
+ uint64_t max = 0;
+ for (const uint64_t& index : offsets)
+ {
+ if (index > max)
+ max = index;
+ }
+
+ // get returned keypairs count
+#define DB_COUNT_RECORDS(dbt, cnt) \
+ do { \
+ uint32_t *_p = (uint32_t *) ((uint8_t *)(dbt)->data + \
+ (dbt)->ulen - sizeof(uint32_t)); \
+ cnt = 0; \
+ while(*_p != (uint32_t) -1) { \
+ _p -= 2; \
+ ++cnt; \
+ } \
+ } while(0); \
+
+ Dbt_copy k(amount);
+ Dbt_copy v;
+ uint64_t buflen = 0;
+ uint64_t t_dbmul = 0;
+ uint64_t t_dbscan = 0;
+
+ auto result = cur->get(&k, &v, DB_SET);
+ if (result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
+ else if (result)
+ throw0(DB_ERROR("DB error attempting to get an output"));
+
+ db_recno_t num_elems = 0;
+ cur->count(&num_elems, 0);
+
+ if (max <= 1 && num_elems <= max)
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but output not found"));
+
+ TIME_MEASURE_START(db2);
+ if (max <= 1)
+ {
+ for (const uint64_t& index : offsets)
+ {
+ TIME_MEASURE_START(t_seek);
+
+ auto result = cur->get(&k, &v, DB_SET);
+ if (result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
+ else if (result)
+ throw0(DB_ERROR("DB error attempting to get an output"));
+
+ for (uint64_t i = 0; i < index; ++i)
+ cur->get(&k, &v, DB_NEXT_DUP);
+
+ uint64_t glob_index = v;
+
+ LOG_PRINT_L3("L0->v: " << glob_index);
+ global_indices.push_back(glob_index);
+
+ TIME_MEASURE_FINISH(t_seek);
+ }
+ }
+ else
+ {
+ // setup a 256KB minimum buffer size
+ uint32_t pagesize = 256 * 1024;
+
+ // Retrieve only a suitable portion of the kvp data, up to somewhere near
+ // the maximum offset value being retrieved
+ buflen = (max + 1) * 4 * sizeof(uint64_t);
+ buflen = ((buflen / pagesize) + ((buflen % pagesize) > 0 ? 1 : 0)) * pagesize;
+
+ bool nomem = false;
+ Dbt data;
+
+ bool singlebuff = buflen <= m_buffer.get_buffer_size();
+ buflen = buflen < m_buffer.get_buffer_size() ? buflen : m_buffer.get_buffer_size();
+ bdb_safe_buffer_t::type buffer = nullptr;
+ bdb_safe_buffer_autolock lock(m_buffer, buffer);
+
+ data.set_data(buffer);
+ data.set_ulen(buflen);
+ data.set_size(buflen);
+ data.set_flags(DB_DBT_USERMEM);
+
+ uint32_t curcount = 0;
+ uint32_t blockstart = 0;
+ for (const uint64_t& index : offsets)
+ {
+ if (index >= num_elems)
+ {
+ LOG_PRINT_L1("Index: " << index << " Elems: " << num_elems << " partial results found for get_output_tx_and_index");
+ break;
+ }
+
+ // fixme! for whatever reason, the first call to DB_MULTIPLE | DB_SET does not
+ // retrieve the first value.
+ if (index <= 1 || nomem)
+ {
+ auto result = cur->get(&k, &v, DB_SET);
+ if (result == DB_NOTFOUND)
+ {
+ throw1(OUTPUT_DNE("Attempting to get an output index by amount and amount index, but amount not found"));
+ }
+ else if (result)
+ {
+ throw0(DB_ERROR("DB error attempting to get an output"));
+ }
+
+ for (uint64_t i = 0; i < index; ++i)
+ cur->get(&k, &v, DB_NEXT_DUP);
+ }
+ else
+ {
+ while (index >= curcount)
+ {
+ TIME_MEASURE_START(t_db1);
+ try
+ {
+ cur->get(&k, &data, DB_MULTIPLE | (curcount == 0 ? DB_SET : DB_NEXT_DUP));
+ blockstart = curcount;
+
+ int count = 0;
+ DB_COUNT_RECORDS((DBT * ) &data, count);
+ curcount += count;
+ }
+ catch (const std::exception &e)
+ {
+ cur.close();
+ throw0(DB_ERROR(std::string("Failed on DB_MULTIPLE: ").append(e.what()).c_str()));
+ }
+
+ TIME_MEASURE_FINISH(t_db1);
+ t_dbmul += t_db1;
+ if (singlebuff)
+ break;
+ }
+
+ LOG_PRINT_L3("Records returned: " << curcount << " Index: " << index);
+ TIME_MEASURE_START(t_db2);
+ DBT *pdata = (DBT *) &data;
+
+ uint8_t *value;
+ uint64_t dlen = 0;
+
+ void *pbase = ((uint8_t *) (pdata->data)) + pdata->ulen - sizeof(uint32_t);
+ uint32_t *p = (uint32_t *) pbase;
+ if (*p == (uint32_t) -1)
+ {
+ value = NULL;
+ }
+ else
+ {
+ p -= (index - blockstart) * 2; // index * 4 + 2; <- if DB_MULTIPLE_KEY
+ value = (uint8_t *) pdata->data + *p--;
+ dlen = *p--;
+ if (value == (uint8_t *) pdata->data)
+ value = NULL;
+ }
+
+ if (value != NULL)
+ {
+ v = dlen == sizeof(uint64_t) ? *((uint64_t *) value) : *((uint32_t *) value);
+ }
+ TIME_MEASURE_FINISH(t_db2);
+ t_dbscan += t_db2;
+ }
+
+ uint64_t glob_index = v;
+
+ LOG_PRINT_L3("L1->v: " << glob_index);
+ global_indices.push_back(glob_index);
+ }
+ }
+ TIME_MEASURE_FINISH(db2);
+
+ cur.close();
+
+ TIME_MEASURE_FINISH(txx);
+
+ LOG_PRINT_L3("blen: " << buflen << " txx: " << txx << " db1: " << t_dbmul << " db2: " << t_dbscan);
+
+}
+
+void BlockchainBDB::get_output_key(const uint64_t &amount, const std::vector &offsets, std::vector &outputs)
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+ TIME_MEASURE_START(txx);
+ outputs.clear();
+
+ std::vector < uint64_t > global_indices;
+ get_output_global_indices(amount, offsets, global_indices);
+
+ TIME_MEASURE_START(db3);
+ if (global_indices.size() > 0)
+ {
+ for (const uint64_t &index : global_indices)
+ {
+ Dbt_copy k(index);
+ Dbt_copy v;
+
+ auto get_result = m_output_keys->get(DB_DEFAULT_TX, &k, &v, 0);
+ if (get_result == DB_NOTFOUND)
+ throw1(OUTPUT_DNE("output with given index not in db"));
+ else if (get_result)
+ throw0(DB_ERROR("DB error attempting to fetch output tx hash"));
+
+ output_data_t data = *(output_data_t *) v.get_data();
+ outputs.push_back(data);
+ }
+ }
+
+ TIME_MEASURE_FINISH(txx);
+ LOG_PRINT_L3("db3: " << db3);
+}
+
+void BlockchainBDB::get_output_tx_and_index(const uint64_t& amount, const std::vector &offsets, std::vector &indices)
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ std::vector < uint64_t > global_indices;
+ get_output_global_indices(amount, offsets, global_indices);
+
+ TIME_MEASURE_START(db3);
+ if (global_indices.size() > 0)
+ get_output_tx_and_index_from_global(global_indices, indices);
+ TIME_MEASURE_FINISH(db3);
+
+ LOG_PRINT_L3("db3: " << db3);
+}
+
+void BlockchainBDB::checkpoint_worker() const
+{
+ LOG_PRINT_L0("Entering BDB checkpoint thread.")
+ int count = 0;
+ while(m_run_checkpoint && m_open)
+ {
+ // sleep every second, so we don't delay exit condition m_run_checkpoint = false
+ sleep(1);
+ // checkpoint every 5 minutes
+ if(count++ >= 300)
+ {
+ count = 0;
+ if(m_env->txn_checkpoint(0, 0, 0) != 0)
+ {
+ LOG_PRINT_L0("BDB txn_checkpoint failed.")
+ break;
+ }
+ }
+ }
+ LOG_PRINT_L0("Leaving BDB checkpoint thread.")
}
} // namespace cryptonote
diff --git a/src/blockchain_db/berkeleydb/db_bdb.h b/src/blockchain_db/berkeleydb/db_bdb.h
index 83588b031..f92bbef68 100644
--- a/src/blockchain_db/berkeleydb/db_bdb.h
+++ b/src/blockchain_db/berkeleydb/db_bdb.h
@@ -30,6 +30,11 @@
#include "blockchain_db/blockchain_db.h"
#include "cryptonote_protocol/blobdatatype.h" // for type blobdata
+#include
+
+// ND: Enables multi-threaded bulk reads for when getting indices.
+// TODO: Disabled for now, as it doesn't seem to provide noticeable improvements (??. Reason: TBD.
+// #define BDB_BULK_CAN_THREAD
namespace cryptonote
{
@@ -83,10 +88,145 @@ struct bdb_txn_safe
{
return &m_txn;
}
-
+private:
DbTxn* m_txn;
};
+// ND: Class to handle buffer management when doing bulk queries
+// (DB_MULTIPLE). Allocates buffers then handles thread queuing
+// so a fixed set of buffers can be used (instead of allocating
+// every time a bulk query is needed).
+template
+class bdb_safe_buffer
+{
+ // limit the number of buffers to 8
+ const size_t MaxAllowedBuffers = 8;
+public:
+ bdb_safe_buffer(size_t num_buffers, size_t count)
+ {
+ if(num_buffers > MaxAllowedBuffers)
+ num_buffers = MaxAllowedBuffers;
+
+ set_count(num_buffers);
+ for (size_t i = 0; i < num_buffers; i++)
+ m_buffers.push_back((T) malloc(sizeof(T) * count));
+ m_buffer_count = count;
+ }
+
+ ~bdb_safe_buffer()
+ {
+ for (size_t i = 0; i < m_buffers.size(); i++)
+ {
+ if (m_buffers[i])
+ {
+ free(m_buffers[i]);
+ m_buffers[i] = nullptr;
+ }
+ }
+
+ m_buffers.resize(0);
+ }
+
+ T acquire_buffer()
+ {
+ std::unique_lock lock(m_lock);
+ m_cv.wait(lock, [&]{ return m_count > 0; });
+
+ --m_count;
+ size_t index = -1;
+ for (size_t i = 0; i < m_open_slot.size(); i++)
+ {
+ if (m_open_slot[i])
+ {
+ m_open_slot[i] = false;
+ index = i;
+ break;
+ }
+ }
+
+ assert(index >= 0);
+
+ T buffer = m_buffers[index];
+ m_buffer_map.emplace(buffer, index);
+ return buffer;
+ }
+
+ void release_buffer(T buffer)
+ {
+ std::unique_lock lock(m_lock);
+
+ assert(buffer != nullptr);
+ auto it = m_buffer_map.find(buffer);
+ if (it != m_buffer_map.end())
+ {
+ auto index = it->second;
+
+ assert(index < m_open_slot.size());
+ assert(m_open_slot[index] == false);
+ assert(m_count < m_open_slot.size());
+
+ ++m_count;
+ m_open_slot[index] = true;
+ m_buffer_map.erase(it);
+ m_cv.notify_one();
+ }
+ }
+
+ size_t get_buffer_size() const
+ {
+ return m_buffer_count * sizeof(T);
+ }
+
+ size_t get_buffer_count() const
+ {
+ return m_buffer_count;
+ }
+
+ typedef T type;
+
+private:
+ void set_count(size_t count)
+ {
+ assert(count > 0);
+ m_open_slot.resize(count, true);
+ m_count = count;
+ }
+
+ std::vector m_buffers;
+ std::unordered_map m_buffer_map;
+
+ std::condition_variable m_cv;
+ std::vector m_open_slot;
+ size_t m_count;
+ std::mutex m_lock;
+
+ size_t m_buffer_count;
+};
+
+template
+class bdb_safe_buffer_autolock
+{
+public:
+ bdb_safe_buffer_autolock(T &safe_buffer, typename T::type &buffer) :
+ m_safe_buffer(safe_buffer), m_buffer(nullptr)
+ {
+ m_buffer = m_safe_buffer.acquire_buffer();
+ buffer = m_buffer;
+ }
+
+ ~bdb_safe_buffer_autolock()
+ {
+ if (m_buffer != nullptr)
+ {
+ m_safe_buffer.release_buffer(m_buffer);
+ m_buffer = nullptr;
+ }
+ }
+private:
+ T &m_safe_buffer;
+ typename T::type m_buffer;
+};
+
class BlockchainBDB : public BlockchainDB
{
public:
@@ -155,12 +295,11 @@ public:
virtual uint64_t get_tx_block_height(const crypto::hash& h) const;
- virtual uint64_t get_random_output(const uint64_t& amount) const;
-
virtual uint64_t get_num_outputs(const uint64_t& amount) const;
- virtual crypto::public_key get_output_key(const uint64_t& amount, const uint64_t& index) const;
-
+ virtual output_data_t get_output_key(const uint64_t& amount, const uint64_t& index);
+ virtual output_data_t get_output_key(const uint64_t& global_index) const;
+ virtual void get_output_key(const uint64_t &amount, const std::vector &offsets, std::vector &outputs);
virtual tx_out get_output(const crypto::hash& h, const uint64_t& index) const;
/**
@@ -175,8 +314,11 @@ public:
tx_out get_output(const uint64_t& index) const;
virtual tx_out_index get_output_tx_and_index_from_global(const uint64_t& index) const;
+ virtual void get_output_tx_and_index_from_global(const std::vector &global_indices,
+ std::vector &tx_out_indices) const;
- virtual tx_out_index get_output_tx_and_index(const uint64_t& amount, const uint64_t& index) const;
+ virtual tx_out_index get_output_tx_and_index(const uint64_t& amount, const uint64_t& index);
+ virtual void get_output_tx_and_index(const uint64_t& amount, const std::vector &offsets, std::vector &indices);
virtual std::vector get_tx_output_indices(const crypto::hash& h) const;
virtual std::vector get_tx_amount_output_indices(const crypto::hash& h) const;
@@ -191,13 +333,19 @@ public:
);
virtual void set_batch_transactions(bool batch_transactions);
- virtual void batch_start();
+ virtual void batch_start(uint64_t batch_num_blocks=0);
virtual void batch_commit();
virtual void batch_stop();
virtual void batch_abort();
virtual void pop_block(block& blk, std::vector