diff options
author | Gaurav Sinha <gaurav.sinha@vyatta.com> | 2012-01-12 14:45:24 -0800 |
---|---|---|
committer | Gaurav Sinha <gaurav.sinha@vyatta.com> | 2012-01-12 14:45:24 -0800 |
commit | ca37a710d526d17490ebdc3af760bfddd316426d (patch) | |
tree | caeb883cf2302d30e010909bc543b09e191472cb | |
parent | c4414d9a8b31bedfb7471cd2365aaf5ea5cf55d5 (diff) | |
parent | 414fedd879fdc3cd0a910acd2fd9262251a6bfe7 (diff) | |
download | conntrack-tools-ca37a710d526d17490ebdc3af760bfddd316426d.tar.gz conntrack-tools-ca37a710d526d17490ebdc3af760bfddd316426d.zip |
Updating upstream with merged content from netfilter conntrack-tools version 1.0.1
72 files changed, 9905 insertions, 7042 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..928e44b --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +.deps/ +.libs/ +Makefile +Makefile.in +*.o +*.la +*.lo + +/aclocal.m4 +/autom4te.cache/ +/build-aux/ +/config.* +/configure +/libtool diff --git a/CONTRIBUTORS b/CONTRIBUTORS new file mode 100644 index 0000000..c5e40b4 --- /dev/null +++ b/CONTRIBUTORS @@ -0,0 +1,3 @@ +Maik Hentsche <netfilter@mm-double.de>: + - Feedback & Brainstorming + - Bug hunting diff --git a/Make_global.am b/Make_global.am index 810253a..e8f603a 100644 --- a/Make_global.am +++ b/Make_global.am @@ -1,5 +1,6 @@ -AM_CPPFLAGS=$(all_includes) -I$(top_srcdir)/include +AM_CPPFLAGS = -I$(top_srcdir)/include AM_CFLAGS = -std=gnu99 -W -Wall \ -Wmissing-prototypes -Wwrite-strings -Wcast-qual -Wfloat-equal -Wshadow -Wpointer-arith -Wbad-function-cast -Wsign-compare -Waggregate-return -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wundef \ - -Wno-unused-parameter + -Wno-unused-parameter ${LIBNFNETLINK_CFLAGS} \ + ${LIBNETFILTER_CONNTRACK_CFLAGS} diff --git a/Makefile.am b/Makefile.am index 70c1bd0..afb4595 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,9 +1,6 @@ include Make_global.am -# not a GNU package. You can remove this line, if -# have all needed files, that a GNU package needs ACLOCAL_AMFLAGS = -I m4 -AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6 man_MANS = conntrack.8 conntrackd.8 EXTRA_DIST = $(man_MANS) Make_global.am doc m4 @@ -12,9 +9,5 @@ SUBDIRS = extensions src DIST_SUBDIRS = include src extensions LIBS = @LIBNETFILTER_CONNTRACK_LIBS@ -$(OBJECTS): libtool -libtool: $(LIBTOOL_DEPS) - $(SHELL) ./config.status --recheck - dist-hook: rm -rf `find $(distdir)/doc -name .svn` diff --git a/Makefile.in b/Makefile.in index f42f51f..f7c9656 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11 from Makefile.am. +# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -33,18 +33,19 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ DIST_COMMON = $(am__configure_deps) $(srcdir)/Make_global.am \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/configure AUTHORS COPYING INSTALL TODO \ - config.guess config.sub depcomp install-sh ltmain.sh missing \ - ylwrap + build-aux/config.guess build-aux/config.sub build-aux/depcomp \ + build-aux/install-sh build-aux/ltmain.sh build-aux/missing \ + build-aux/ylwrap config.guess config.sub depcomp install-sh \ + ltmain.sh missing ylwrap subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -52,6 +53,12 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ @@ -125,12 +132,13 @@ am__relativize = \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" -DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best +DIST_ARCHIVES = $(distdir).tar.bz2 distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -153,7 +161,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAVE_PKG_CONFIG = @HAVE_PKG_CONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -191,14 +198,14 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ -XLEX = @XLEX@ -XYACC = @XYACC@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -249,24 +256,17 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ -target = @target@ target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include +AM_CPPFLAGS = -I$(top_srcdir)/include AM_CFLAGS = -std=gnu99 -W -Wall \ -Wmissing-prototypes -Wwrite-strings -Wcast-qual -Wfloat-equal -Wshadow -Wpointer-arith -Wbad-function-cast -Wsign-compare -Waggregate-return -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wundef \ - -Wno-unused-parameter + -Wno-unused-parameter ${LIBNFNETLINK_CFLAGS} \ + ${LIBNETFILTER_CONNTRACK_CFLAGS} - -# not a GNU package. You can remove this line, if -# have all needed files, that a GNU package needs ACLOCAL_AMFLAGS = -I m4 -AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6 man_MANS = conntrack.8 conntrackd.8 EXTRA_DIST = $(man_MANS) Make_global.am doc m4 SUBDIRS = extensions src @@ -363,7 +363,7 @@ uninstall-man8: # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): - @failcom='exit 1'; \ + @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ @@ -388,7 +388,7 @@ $(RECURSIVE_TARGETS): fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ + @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ @@ -568,7 +568,8 @@ distdir: $(DISTFILES) top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ - || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ @@ -602,7 +603,6 @@ dist-zip: distdir $(am__remove_distdir) dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) @@ -612,17 +612,17 @@ dist dist-all: distdir distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ - bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ - unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac @@ -807,10 +807,6 @@ uninstall-man: uninstall-man8 uninstall uninstall-am uninstall-man uninstall-man8 -$(OBJECTS): libtool -libtool: $(LIBTOOL_DEPS) - $(SHELL) ./config.status --recheck - dist-hook: rm -rf `find $(distdir)/doc -name .svn` @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.11 -*- Autoconf -*- +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. @@ -13,13 +13,14 @@ m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.64],, -[m4_warning([this file was generated for autoconf 2.64. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],, +[m4_warning([this file was generated for autoconf 2.67. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant <scott@netsplit.com>. # @@ -47,7 +48,10 @@ To do so, use the procedure documented by the package, typically `autoreconf'.]) AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi @@ -60,7 +64,6 @@ if test -n "$PKG_CONFIG"; then AC_MSG_RESULT([no]) PKG_CONFIG="" fi - fi[]dnl ])# PKG_PROG_PKG_CONFIG @@ -69,34 +72,31 @@ fi[]dnl # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # -# -# Similar to PKG_CHECK_MODULES, make sure that the first instance of -# this or PKG_CHECK_MODULES is called, or make sure to call -# PKG_CHECK_EXISTS manually +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_ifval([$2], [$2], [:]) + m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) - # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + else + pkg_failed=untried fi[]dnl ])# _PKG_CONFIG @@ -138,16 +138,17 @@ and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - ifelse([$4], , [AC_MSG_ERROR(dnl + m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS @@ -155,25 +156,24 @@ $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. -_PKG_TEXT -])], - [AC_MSG_RESULT([no]) - $4]) +_PKG_TEXT])[]dnl + ]) elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT -To get pkg-config, see <http://pkg-config.freedesktop.org/>.])], - [$4]) +To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl + ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) + $3 fi[]dnl ])# PKG_CHECK_MODULES @@ -192,7 +192,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.11], [], +m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -208,7 +208,7 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.11])dnl +[AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) @@ -920,6 +920,23 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 @@ -985,6 +1002,33 @@ Check your system clock]) fi AC_MSG_RESULT(yes)]) +# Copyright (C) 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# (`yes' being less verbose, `no' or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..36b2a2a --- /dev/null +++ b/autogen.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +autoreconf -fi; +rm -Rf autom4te.cache; @@ -1,13 +1,15 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.64 for conntrack-tools 0.9.14. +# Generated by GNU Autoconf 2.67 for conntrack-tools 1.0.1. # # Report bugs to <pablo@netfilter.org>. # +# # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # +# # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## @@ -317,7 +319,7 @@ $as_echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p @@ -357,19 +359,19 @@ else fi # as_fn_arith -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -676,10 +678,11 @@ fi -exec 7<&0 </dev/null 6>&1 +test -n "$DJDIR" || exec 7<&0 </dev/null +exec 6>&1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -698,8 +701,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='conntrack-tools' PACKAGE_TARNAME='conntrack-tools' -PACKAGE_VERSION='0.9.14' -PACKAGE_STRING='conntrack-tools 0.9.14' +PACKAGE_VERSION='1.0.1' +PACKAGE_STRING='conntrack-tools 1.0.1' PACKAGE_BUGREPORT='pablo@netfilter.org' PACKAGE_URL='' @@ -743,14 +746,13 @@ ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS -XLEX -XYACC LIBNETFILTER_CONNTRACK_LIBS LIBNETFILTER_CONNTRACK_CFLAGS LIBNFNETLINK_LIBS LIBNFNETLINK_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH PKG_CONFIG -HAVE_PKG_CONFIG YFLAGS YACC LEXLIB @@ -792,6 +794,8 @@ CPPFLAGS LDFLAGS CFLAGS CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY am__untar am__tar AMTAR @@ -815,10 +819,6 @@ am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM -target_os -target_vendor -target_cpu -target host_os host_vendor host_cpu @@ -868,9 +868,10 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules enable_dependency_tracking -enable_shared enable_static +enable_shared with_pic enable_fast_install with_gnu_ld @@ -888,6 +889,8 @@ CPP YACC YFLAGS PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR LIBNFNETLINK_CFLAGS LIBNFNETLINK_LIBS LIBNETFILTER_CONNTRACK_CFLAGS @@ -954,8 +957,9 @@ do fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -1000,7 +1004,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1026,7 +1030,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1230,7 +1234,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1246,7 +1250,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1276,8 +1280,8 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information." + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) @@ -1285,7 +1289,7 @@ Try \`$0 --help' for more information." # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error "invalid variable name: \`$ac_envvar'" ;; + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1303,13 +1307,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error "missing argument to $ac_option" + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1332,7 +1336,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1346,8 +1350,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1362,9 +1366,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error "working directory cannot be determined" + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error "pwd does not report name of working directory" + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1403,11 +1407,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1433,7 +1437,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 conntrack-tools 0.9.14 to adapt to many kinds of systems. +\`configure' configures conntrack-tools 1.0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1447,7 +1451,7 @@ Configuration: --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1498,13 +1502,12 @@ Program names: System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] - --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of conntrack-tools 0.9.14:";; + short | recursive ) echo "Configuration of conntrack-tools 1.0.1:";; esac cat <<\_ACEOF @@ -1512,10 +1515,12 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0') --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors + --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) @@ -1533,7 +1538,7 @@ Some influential environment variables: LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I<include dir> if + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor YACC The `Yet Another C Compiler' implementation to use. Defaults to @@ -1542,6 +1547,10 @@ Some influential environment variables: This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path LIBNFNETLINK_CFLAGS C compiler flags for LIBNFNETLINK, overriding pkg-config LIBNFNETLINK_LIBS @@ -1618,10 +1627,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -conntrack-tools configure 0.9.14 -generated by GNU Autoconf 2.64 +conntrack-tools configure 1.0.1 +generated by GNU Autoconf 2.67 -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1666,7 +1675,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - return $ac_retval + as_fn_set_status $ac_retval } # ac_fn_c_try_compile @@ -1712,7 +1721,7 @@ fi # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - return $ac_retval + as_fn_set_status $ac_retval } # ac_fn_c_try_link @@ -1725,7 +1734,7 @@ ac_fn_c_check_header_compile () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1768,7 +1777,7 @@ $as_echo "$ac_try_echo"; } >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } >/dev/null && { + test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : @@ -1780,7 +1789,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - return $ac_retval + as_fn_set_status $ac_retval } # ac_fn_c_try_cpp @@ -1822,7 +1831,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - return $ac_retval + as_fn_set_status $ac_retval } # ac_fn_c_try_run @@ -1834,7 +1843,7 @@ ac_fn_c_check_func () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1901,10 +1910,10 @@ $as_echo "$ac_res" >&6; } ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 @@ -1940,7 +1949,7 @@ if ac_fn_c_try_cpp "$LINENO"; then : else ac_header_preproc=no fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } @@ -1963,17 +1972,15 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( cat <<\_ASBOX -## ---------------------------------- ## +( $as_echo "## ---------------------------------- ## ## Report this to pablo@netfilter.org ## -## ---------------------------------- ## -_ASBOX +## ---------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" @@ -1989,8 +1996,8 @@ 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 conntrack-tools $as_me 0.9.14, which was -generated by GNU Autoconf 2.64. Invocation command line was +It was created by conntrack-tools $as_me 1.0.1, which was +generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2100,11 +2107,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -2138,11 +2143,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -2155,11 +2158,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -2173,11 +2174,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -2232,7 +2231,12 @@ _ACEOF ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2243,18 +2247,22 @@ fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue - if test -r "$ac_site_file"; then + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5 ; } fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in @@ -2323,7 +2331,7 @@ if $ac_cache_corrupted; then $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -2336,19 +2344,24 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - for ac_t in install-sh install.sh shtool; do - if test -f "$ac_dir/$ac_t"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/$ac_t -c" - break 2 - fi - done +for ac_dir in build-aux "$srcdir"/build-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi done if test -z "$ac_aux_dir"; then - as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -2360,9 +2373,10 @@ ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } @@ -2373,16 +2387,16 @@ else test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && - as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' @@ -2407,7 +2421,7 @@ else ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi @@ -2415,7 +2429,7 @@ fi $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' @@ -2431,47 +2445,6 @@ IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -$as_echo_n "checking target system type... " >&6; } -if test "${ac_cv_target+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "x$target_alias" = x; then - ac_cv_target=$ac_cv_host -else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -$as_echo "$ac_cv_target" >&6; } -case $ac_cv_target in -*-*-*) ;; -*) as_fn_error "invalid value of canonical target" "$LINENO" 5;; -esac -target=$ac_cv_target -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_target -shift -target_cpu=$1 -target_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -target_os=$* -IFS=$ac_save_IFS -case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - - am__api_version='1.11' @@ -2579,11 +2552,11 @@ am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5 ;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5 ;; esac # Do `set' in a subshell so we don't clobber the current shell's @@ -2605,7 +2578,7 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - as_fn_error "ls -t appears to fail. Make sure there is not a broken + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi @@ -2615,7 +2588,7 @@ then # Ok. : else - as_fn_error "newly created file is older than distributed files! + as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -2787,6 +2760,7 @@ IFS=$as_save_IFS fi + test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else @@ -2794,7 +2768,6 @@ fi # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. - test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi @@ -2853,7 +2826,7 @@ done $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -2861,7 +2834,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -2895,7 +2868,7 @@ if test "`cd $srcdir && pwd`" != "`pwd`"; then am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -2911,7 +2884,7 @@ fi # Define the identity of the package. PACKAGE='conntrack-tools' - VERSION='0.9.14' + VERSION='1.0.1' cat >>confdefs.h <<_ACEOF @@ -2945,13 +2918,107 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} AMTAR=${AMTAR-"${am_missing_run}tar"} -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 +$as_echo_n "checking how to create a pax tar archive... " >&6; } +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' +_am_tools=${am_cv_prog_tar_pax-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + { echo "$as_me:$LINENO: $_am_tar --version" >&5 + ($_am_tar --version) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && break + done + am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x pax -w "$$tardir"' + am__tar_='pax -L -x pax -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H pax -L' + am__tar_='find "$tardir" -print | cpio -o -H pax -L' + am__untar='cpio -i -H pax -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_pax}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 + (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + rm -rf conftest.dir + if test -s conftest.tar; then + { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5 + ($am__untar <conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +if test "${am_cv_prog_tar_pax+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + am_cv_prog_tar_pax=$_am_tool +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 +$as_echo "$am_cv_prog_tar_pax" >&6; } + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=0;; +esac +AM_BACKSLASH='\' + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3252,8 +3319,8 @@ fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5 ; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -3274,32 +3341,30 @@ $as_echo "$ac_try_echo"; } >&5 ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 - rm -f conftest.er1 conftest.err fi + rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include <stdio.h> + int main () { -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: @@ -3361,62 +3426,28 @@ test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } if test -z "$ac_file"; then : - $as_echo "$as_me: failed program was:" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "C compiler cannot create executables -See \`config.log' for more details." "$LINENO" 5; }; } +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5 ; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" @@ -3446,16 +3477,75 @@ done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5 ; } fi -rm -f conftest$ac_cv_exeext +rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdio.h> +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5 ; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : @@ -3498,8 +3588,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of object files: cannot compile -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi @@ -3908,6 +3998,37 @@ else fi +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=no +fi + + + + + + + + + case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 @@ -3916,8 +4037,8 @@ esac -macro_version='2.2.6' -macro_revision='1.3012' +macro_version='2.2.6b' +macro_revision='1.3017' @@ -3990,7 +4111,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then - as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED @@ -4066,7 +4187,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP @@ -4132,7 +4253,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4199,7 +4320,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then - as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP @@ -4315,7 +4436,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : @@ -4517,13 +4638,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:4520: $ac_compile\"" >&5) + (eval echo "\"\$as_me:4641: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:4523: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:4644: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:4526: output\"" >&5) + (eval echo "\"\$as_me:4647: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -4989,7 +5110,7 @@ irix5* | irix6* | nonstopux*) ;; # This must be Linux ELF. -linux* | k*bsd*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; @@ -5729,7 +5850,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5732 "configure"' > conftest.$ac_ext + echo '#line 5853 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -6518,7 +6639,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -6534,11 +6655,11 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi @@ -6577,7 +6698,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -6593,18 +6714,18 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5 ; } fi ac_ext=c @@ -6733,8 +6854,7 @@ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -6800,36 +6920,6 @@ fi - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=yes -fi - - - - - - - - # Check whether --with-pic was given. @@ -7259,11 +7349,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7262: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7352: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7266: \$? = $ac_status" >&5 + echo "$as_me:7356: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7428,7 +7518,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; } lt_prog_compiler_static='-non_shared' ;; - linux* | k*bsd*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) @@ -7598,11 +7688,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7601: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7691: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:7605: \$? = $ac_status" >&5 + echo "$as_me:7695: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7703,11 +7793,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7706: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7796: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7710: \$? = $ac_status" >&5 + echo "$as_me:7800: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -7758,11 +7848,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7761: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7851: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7765: \$? = $ac_status" >&5 + echo "$as_me:7855: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -7901,6 +7991,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie fi supports_anon_versioning=no case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... @@ -7992,7 +8083,7 @@ _LT_EOF archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; - gnu* | linux* | tpf* | k*bsd*-gnu) + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in @@ -9454,7 +9545,7 @@ linux*oldld* | linux*aout* | linux*coff*) ;; # This must be Linux ELF. -linux* | k*bsd*-gnu) +linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no @@ -10141,7 +10232,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10144 "configure" +#line 10235 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10237,7 +10328,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 10240 "configure" +#line 10331 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -10561,7 +10652,7 @@ if test -f lex.yy.c; then elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else - as_fn_error "cannot find output from $LEX; giving up" "$LINENO" 5 + as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 @@ -10680,57 +10771,48 @@ done test -n "$YACC" || YACC="yacc" -case $target in +case "$host" in *-*-linux*) ;; -*) as_fn_error "Linux only, dude!" "$LINENO" 5;; +*) as_fn_error $? "Linux only, dude!" "$LINENO" 5 ;; esac -LIBNFNETLINK_REQUIRED=1.0.0 -LIBNETFILTER_CONNTRACK_REQUIRED=0.0.101 - -# Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_HAVE_PKG_CONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$HAVE_PKG_CONFIG"; then - ac_cv_prog_HAVE_PKG_CONFIG="$HAVE_PKG_CONFIG" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_HAVE_PKG_CONFIG="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - +if test -z "$ac_cv_prog_YACC" +then + echo "*** Error: No suitable bison/yacc found. ***" + echo " Please install the 'bison' package." + exit 1 fi +if test -z "$ac_cv_prog_LEX" +then + echo "*** Error: No suitable flex/lex found. ***" + echo " Please install the 'flex' package." + exit 1 fi -HAVE_PKG_CONFIG=$ac_cv_prog_HAVE_PKG_CONFIG -if test -n "$HAVE_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_PKG_CONFIG" >&5 -$as_echo "$HAVE_PKG_CONFIG" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking flex version" >&5 +$as_echo_n "checking flex version... " >&6; } +flex_version=`$ac_cv_prog_LEX --version | sed 's/version//g' | awk '/flex/ {print $2}'` +flex_major=`echo $flex_version| cut -d . -f 1` +flex_minor=`echo $flex_version| cut -d . -f 2` +flex_rev=`echo $flex_version| cut -d . -f 3` + +if test "$flex_major" -eq "2" && test "$flex_minor" -eq "5" && test "$flex_rev" -ge "33"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flex_version. OK" >&5 +$as_echo "$flex_version. OK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flex version $flex_version found. + Version 2.5.33 or greater is required. You may experience problems + while compilating the conntrack-tools. Please, consider to upgrade + flex." >&5 +$as_echo "$as_me: WARNING: flex version $flex_version found. + Version 2.5.33 or greater is required. You may experience problems + while compilating the conntrack-tools. Please, consider to upgrade + flex." >&2;} fi -if test "x$HAVE_PKG_CONFIG" = "x" -then - echo "*** Error: No suitable pkg-config found. ***" - echo " Please install the 'pkg-config' package." - exit 1 -fi + + @@ -10846,53 +10928,50 @@ $as_echo "yes" >&6; } $as_echo "no" >&6; } PKG_CONFIG="" fi - fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBNFNETLINK" >&5 $as_echo_n "checking for LIBNFNETLINK... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$LIBNFNETLINK_CFLAGS"; then - pkg_cv_LIBNFNETLINK_CFLAGS="$LIBNFNETLINK_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnfnetlink >= \$LIBNFNETLINK_REQUIRED\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libnfnetlink >= $LIBNFNETLINK_REQUIRED") 2>&5 +if test -n "$LIBNFNETLINK_CFLAGS"; then + pkg_cv_LIBNFNETLINK_CFLAGS="$LIBNFNETLINK_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnfnetlink >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libnfnetlink >= 1.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_LIBNFNETLINK_CFLAGS=`$PKG_CONFIG --cflags "libnfnetlink >= $LIBNFNETLINK_REQUIRED" 2>/dev/null` + pkg_cv_LIBNFNETLINK_CFLAGS=`$PKG_CONFIG --cflags "libnfnetlink >= 1.0.0" 2>/dev/null` else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$LIBNFNETLINK_LIBS"; then - pkg_cv_LIBNFNETLINK_LIBS="$LIBNFNETLINK_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnfnetlink >= \$LIBNFNETLINK_REQUIRED\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libnfnetlink >= $LIBNFNETLINK_REQUIRED") 2>&5 +if test -n "$LIBNFNETLINK_LIBS"; then + pkg_cv_LIBNFNETLINK_LIBS="$LIBNFNETLINK_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnfnetlink >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libnfnetlink >= 1.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_LIBNFNETLINK_LIBS=`$PKG_CONFIG --libs "libnfnetlink >= $LIBNFNETLINK_REQUIRED" 2>/dev/null` + pkg_cv_LIBNFNETLINK_LIBS=`$PKG_CONFIG --libs "libnfnetlink >= 1.0.0" 2>/dev/null` else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -10900,71 +10979,88 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - LIBNFNETLINK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libnfnetlink >= $LIBNFNETLINK_REQUIRED"` + LIBNFNETLINK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libnfnetlink >= 1.0.0" 2>&1` else - LIBNFNETLINK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libnfnetlink >= $LIBNFNETLINK_REQUIRED"` + LIBNFNETLINK_PKG_ERRORS=`$PKG_CONFIG --print-errors "libnfnetlink >= 1.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBNFNETLINK_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error "Cannot find libnfnetlink >= $LIBNFNETLINK_REQUIRED" "$LINENO" 5 + as_fn_error $? "Package requirements (libnfnetlink >= 1.0.0) were not met: + +$LIBNFNETLINK_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables LIBNFNETLINK_CFLAGS +and LIBNFNETLINK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - as_fn_error "Cannot find libnfnetlink >= $LIBNFNETLINK_REQUIRED" "$LINENO" 5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables LIBNFNETLINK_CFLAGS +and LIBNFNETLINK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5 ; } else LIBNFNETLINK_CFLAGS=$pkg_cv_LIBNFNETLINK_CFLAGS LIBNFNETLINK_LIBS=$pkg_cv_LIBNFNETLINK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - : -fi +fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBNETFILTER_CONNTRACK" >&5 $as_echo_n "checking for LIBNETFILTER_CONNTRACK... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$LIBNETFILTER_CONNTRACK_CFLAGS"; then - pkg_cv_LIBNETFILTER_CONNTRACK_CFLAGS="$LIBNETFILTER_CONNTRACK_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= \$LIBNETFILTER_CONNTRACK_REQUIRED\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED") 2>&5 +if test -n "$LIBNETFILTER_CONNTRACK_CFLAGS"; then + pkg_cv_LIBNETFILTER_CONNTRACK_CFLAGS="$LIBNETFILTER_CONNTRACK_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= 1.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_LIBNETFILTER_CONNTRACK_CFLAGS=`$PKG_CONFIG --cflags "libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED" 2>/dev/null` + pkg_cv_LIBNETFILTER_CONNTRACK_CFLAGS=`$PKG_CONFIG --cflags "libnetfilter_conntrack >= 1.0.0" 2>/dev/null` else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi -if test -n "$PKG_CONFIG"; then - if test -n "$LIBNETFILTER_CONNTRACK_LIBS"; then - pkg_cv_LIBNETFILTER_CONNTRACK_LIBS="$LIBNETFILTER_CONNTRACK_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= \$LIBNETFILTER_CONNTRACK_REQUIRED\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED") 2>&5 +if test -n "$LIBNETFILTER_CONNTRACK_LIBS"; then + pkg_cv_LIBNETFILTER_CONNTRACK_LIBS="$LIBNETFILTER_CONNTRACK_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= 1.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= 1.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_LIBNETFILTER_CONNTRACK_LIBS=`$PKG_CONFIG --libs "libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED" 2>/dev/null` + pkg_cv_LIBNETFILTER_CONNTRACK_LIBS=`$PKG_CONFIG --libs "libnetfilter_conntrack >= 1.0.0" 2>/dev/null` else pkg_failed=yes fi - fi -else - pkg_failed=untried + else + pkg_failed=untried fi if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes @@ -10972,144 +11068,44 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - LIBNETFILTER_CONNTRACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED"` + LIBNETFILTER_CONNTRACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libnetfilter_conntrack >= 1.0.0" 2>&1` else - LIBNETFILTER_CONNTRACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED"` + LIBNETFILTER_CONNTRACK_PKG_ERRORS=`$PKG_CONFIG --print-errors "libnetfilter_conntrack >= 1.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBNETFILTER_CONNTRACK_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error "Cannot find libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED" "$LINENO" 5 -elif test $pkg_failed = untried; then - as_fn_error "Cannot find libnetfilter_conntrack >= $LIBNETFILTER_CONNTRACK_REQUIRED" "$LINENO" 5 -else - LIBNETFILTER_CONNTRACK_CFLAGS=$pkg_cv_LIBNETFILTER_CONNTRACK_CFLAGS - LIBNETFILTER_CONNTRACK_LIBS=$pkg_cv_LIBNETFILTER_CONNTRACK_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - : -fi + as_fn_error $? "Package requirements (libnetfilter_conntrack >= 1.0.0) were not met: -for ac_prog in $YACC bison yacc -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_XYACC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$XYACC"; then - ac_cv_prog_XYACC="$XYACC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_XYACC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -XYACC=$ac_cv_prog_XYACC -if test -n "$XYACC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XYACC" >&5 -$as_echo "$XYACC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$XYACC" && break -done -test -n "$XYACC" || XYACC="none" +$LIBNETFILTER_CONNTRACK_PKG_ERRORS -if test "$XYACC" = "none" -then - echo "*** Error: No suitable bison/yacc found. ***" - echo " Please install the 'bison' package." - exit 1 -fi -for ac_prog in $LEX flex lex -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_XLEX+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$XLEX"; then - ac_cv_prog_XLEX="$XLEX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_XLEX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. -fi -fi -XLEX=$ac_cv_prog_XLEX -if test -n "$XLEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XLEX" >&5 -$as_echo "$XLEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +Alternatively, you may set the environment variables LIBNETFILTER_CONNTRACK_CFLAGS +and LIBNETFILTER_CONNTRACK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } -fi - - - test -n "$XLEX" && break -done -test -n "$XLEX" || XLEX="none" - -if test "$XLEX" = "none" -then - echo "*** Error: No suitable flex/lex found. ***" - echo " Please install the 'flex' package." - exit 1 -fi + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking flex version" >&5 -$as_echo_n "checking flex version... " >&6; } -flex_version=`$LEX --version | sed 's/version//g' | awk '/flex/ {print $2}'` -flex_major=`echo $flex_version| cut -d . -f 1` -flex_minor=`echo $flex_version| cut -d . -f 2` -flex_rev=`echo $flex_version| cut -d . -f 3` +Alternatively, you may set the environment variables LIBNETFILTER_CONNTRACK_CFLAGS +and LIBNETFILTER_CONNTRACK_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. -if test "$flex_major" -eq "2" && test "$flex_minor" -eq "5" && test "$flex_rev" -ge "33"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flex_version. OK" >&5 -$as_echo "$flex_version. OK" >&6; } +To get pkg-config, see <http://pkg-config.freedesktop.org/>. +See \`config.log' for more details" "$LINENO" 5 ; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flex version $flex_version found. - Version 2.5.33 or greater is required. You may experience problems - while compilating the conntrack-tools. Please, consider to upgrade - flex." >&5 -$as_echo "$as_me: WARNING: flex version $flex_version found. - Version 2.5.33 or greater is required. You may experience problems - while compilating the conntrack-tools. Please, consider to upgrade - flex." >&2;} + LIBNETFILTER_CONNTRACK_CFLAGS=$pkg_cv_LIBNETFILTER_CONNTRACK_CFLAGS + LIBNETFILTER_CONNTRACK_LIBS=$pkg_cv_LIBNETFILTER_CONNTRACK_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fi for ac_header in linux/capability.h @@ -11121,7 +11117,7 @@ if test "x$ac_cv_header_linux_capability_h" = x""yes; then : _ACEOF else - as_fn_error "Cannot find linux/capabibility.h" "$LINENO" 5 + as_fn_error $? "Cannot find linux/capabibility.h" "$LINENO" 5 fi done @@ -11131,97 +11127,6 @@ done # FIXME: Replace `main' with a function in `-lc': # FIXME: Replace `main' with a function in `-ldl': -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nfnl_query in -lnfnetlink" >&5 -$as_echo_n "checking for nfnl_query in -lnfnetlink... " >&6; } -if test "${ac_cv_lib_nfnetlink_nfnl_query_+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnfnetlink -lnfnetlink $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char nfnl_query (); -int -main () -{ -return nfnl_query (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_nfnetlink_nfnl_query_=yes -else - ac_cv_lib_nfnetlink_nfnl_query_=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nfnetlink_nfnl_query_" >&5 -$as_echo "$ac_cv_lib_nfnetlink_nfnl_query_" >&6; } -if test "x$ac_cv_lib_nfnetlink_nfnl_query_" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBNFNETLINK 1 -_ACEOF - - LIBS="-lnfnetlink $LIBS" - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nfct_query in -lnetfilter_conntrack" >&5 -$as_echo_n "checking for nfct_query in -lnetfilter_conntrack... " >&6; } -if test "${ac_cv_lib_netfilter_conntrack_nfct_query_+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnetfilter_conntrack -lnetfilter_conntrack $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char nfct_query (); -int -main () -{ -return nfct_query (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_netfilter_conntrack_nfct_query_=yes -else - ac_cv_lib_netfilter_conntrack_nfct_query_=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_netfilter_conntrack_nfct_query_" >&5 -$as_echo "$ac_cv_lib_netfilter_conntrack_nfct_query_" >&6; } -if test "x$ac_cv_lib_netfilter_conntrack_nfct_query_" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBNETFILTER_CONNTRACK 1 -_ACEOF - - LIBS="-lnetfilter_conntrack $LIBS" - -fi - - for ac_header in arpa/inet.h do : ac_fn_c_check_header_mongrel "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default" @@ -11303,10 +11208,6 @@ fi # Checks for library functions. -CFLAGS="$CFLAGS $LIBNETFILTER_CONNTRACK_CFLAGS" - - - ac_config_files="$ac_config_files Makefile src/Makefile include/Makefile extensions/Makefile" cat >confcache <<\_ACEOF @@ -11428,6 +11329,7 @@ DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' @@ -11451,11 +11353,11 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error "conditional \"AMDEP\" was never defined. + as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error "conditional \"am__fastdepCC\" was never defined. + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi @@ -11605,19 +11507,19 @@ export LANGUAGE (unset CDPATH) >/dev/null 2>&1 && unset CDPATH -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -11813,7 +11715,7 @@ $as_echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p @@ -11866,8 +11768,8 @@ 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 conntrack-tools $as_me 0.9.14, which was -generated by GNU Autoconf 2.64. Invocation command line was +This file was extended by conntrack-tools $as_me 1.0.1, which was +generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -11903,6 +11805,7 @@ Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit + --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files @@ -11920,12 +11823,13 @@ Report bugs to <pablo@netfilter.org>." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -conntrack-tools config.status 0.9.14 -configured by $0, generated by GNU Autoconf 2.64, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" +conntrack-tools config.status 1.0.1 +configured by $0, generated by GNU Autoconf 2.67, + with options \\"\$ac_cs_config\\" -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -11943,11 +11847,16 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=*) + --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; *) ac_option=$1 ac_optarg=$2 @@ -11961,12 +11870,15 @@ do ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; @@ -11977,7 +11889,7 @@ do ac_cs_silent=: ;; # This is an error. - -*) as_fn_error "unrecognized option: \`$1' + -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" @@ -12031,10 +11943,10 @@ AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' -enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' @@ -12293,7 +12205,7 @@ do "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "extensions/Makefile") CONFIG_FILES="$CONFIG_FILES extensions/Makefile" ;; - *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac done @@ -12330,7 +12242,7 @@ $debug || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -12347,7 +12259,7 @@ if test "x$ac_cr" = x; then fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\r' + ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi @@ -12361,18 +12273,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -12394,7 +12306,7 @@ s/'"$ac_delim"'$// t delim :nl h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p @@ -12408,7 +12320,7 @@ s/.\{148\}// t nl :delim h -s/\(.\{148\}\).*/\1/ +s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p @@ -12461,20 +12373,28 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error "could not setup config files machinery" "$LINENO" 5 + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -12492,7 +12412,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -12520,7 +12440,7 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" @@ -12547,7 +12467,7 @@ $as_echo "$as_me: creating $ac_file" >&6;} case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -12684,22 +12604,22 @@ s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; @@ -12858,6 +12778,9 @@ available_tags="" # ### BEGIN LIBTOOL CONFIG +# Whether or not to build static libraries. +build_old_libs=$enable_static + # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision @@ -12865,9 +12788,6 @@ macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared -# Whether or not to build static libraries. -build_old_libs=$enable_static - # What type of objects to build. pic_mode=$pic_mode @@ -13450,7 +13370,7 @@ _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -13471,7 +13391,7 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit $? + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..26a7e02 --- /dev/null +++ b/configure.ac @@ -0,0 +1,116 @@ +AC_INIT(conntrack-tools, 1.0.1, pablo@netfilter.org) +AC_CONFIG_AUX_DIR([build-aux]) + +AC_CANONICAL_HOST +AC_CONFIG_MACRO_DIR([m4]) +AM_INIT_AUTOMAKE([-Wall foreign subdir-objects + tar-pax no-dist-gzip dist-bzip2 1.6]) + +dnl kernel style compile messages +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_PROG_CC +AC_DISABLE_STATIC +AM_PROG_LIBTOOL +AC_PROG_INSTALL +AC_PROG_LN_S +AM_PROG_LEX +AC_PROG_YACC + +case "$host" in +*-*-linux*) ;; +*) AC_MSG_ERROR([Linux only, dude!]);; +esac + +dnl Dependencies +if test -z "$ac_cv_prog_YACC" +then + echo "*** Error: No suitable bison/yacc found. ***" + echo " Please install the 'bison' package." + exit 1 +fi +if test -z "$ac_cv_prog_LEX" +then + echo "*** Error: No suitable flex/lex found. ***" + echo " Please install the 'flex' package." + exit 1 +fi + +AC_MSG_CHECKING(flex version) +flex_version=`$ac_cv_prog_LEX --version | sed 's/version//g' | awk '/flex/ {print $2}'` +flex_major=`echo $flex_version| cut -d . -f 1` +flex_minor=`echo $flex_version| cut -d . -f 2` +flex_rev=`echo $flex_version| cut -d . -f 3` + +if test "$flex_major" -eq "2" && test "$flex_minor" -eq "5" && test "$flex_rev" -ge "33"; then + AC_MSG_RESULT([$flex_version. OK]) +else + AC_MSG_WARN([flex version $flex_version found. + Version 2.5.33 or greater is required. You may experience problems + while compilating the conntrack-tools. Please, consider to upgrade + flex.]) +fi + +PKG_CHECK_MODULES([LIBNFNETLINK], [libnfnetlink >= 1.0.0]) +PKG_CHECK_MODULES([LIBNETFILTER_CONNTRACK], [libnetfilter_conntrack >= 1.0.0]) + +AC_CHECK_HEADERS([linux/capability.h],, [AC_MSG_ERROR([Cannot find linux/capabibility.h])]) + +# Checks for libraries. +# FIXME: Replace `main' with a function in `-lc': +dnl AC_CHECK_LIB([c], [main]) +# FIXME: Replace `main' with a function in `-ldl': + +AC_CHECK_HEADERS(arpa/inet.h) +dnl check for inet_pton +AC_CHECK_FUNCS(inet_pton) +dnl Some systems have it, but not IPv6 +if test "$ac_cv_func_inet_pton" = "yes" ; then +AC_MSG_CHECKING(if inet_pton supports IPv6) +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#ifdef HAVE_ARPA_INET_H +#include <arpa/inet.h> +#endif +int main() + { + struct in6_addr addr6; + if (inet_pton(AF_INET6, "::1", &addr6) < 1) + exit(1); + else + exit(0); + } + ]])],[ AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6, 1, [Define to 1 if inet_pton supports IPv6.]) + ],[AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)]) +fi + +# Checks for header files. +dnl AC_HEADER_STDC +dnl AC_CHECK_HEADERS([netinet/in.h stdlib.h]) + +# Checks for typedefs, structures, and compiler characteristics. +dnl AC_C_CONST +dnl AC_C_INLINE + +# Checks for library functions. +dnl AC_FUNC_MALLOC +dnl AC_FUNC_VPRINTF +dnl AC_CHECK_FUNCS([memset]) + +dnl AC_CONFIG_FILES([Makefile +dnl debug/Makefile +dnl debug/src/Makefile +dnl extensions/Makefile +dnl src/Makefile]) + +AC_CONFIG_FILES([Makefile src/Makefile include/Makefile extensions/Makefile]) +AC_OUTPUT diff --git a/conntrack.8 b/conntrack.8 index 0e7c410..6525123 100644 --- a/conntrack.8 +++ b/conntrack.8 @@ -1,4 +1,4 @@ -.TH CONNTRACK 8 "Apr 11, 2009" "" "" +.TH CONNTRACK 8 "Jul 5, 2010" "" "" .\" Man page written by Harald Welte <laforge@netfilter.org (Jun 2005) .\" Maintained by Pablo Neira Ayuso <pablo@netfilter.org (May 2007) @@ -88,8 +88,11 @@ Show the in-kernel connection tracking system statistics. Atomically zero counters after reading them. This option is only valid in combination with the "-L, --dump" command options. .TP -.BI "-o, --output [extended,xml,timestamp,id] " -Display output in a certain format. +.BI "-o, --output [extended,xml,timestamp,id,ktimestamp] " +Display output in a certain format. With the extended output option, this tool +displays the layer 3 information. With ktimestamp, it displays the in-kernel +timestamp available since 2.6.38 (you can enable it via echo 1 > +/proc/sys/net/netfilter/nf_conntrack_timestamp). .TP .BI "-e, --event-mask " "[ALL|NEW|UPDATES|DESTROY][,...]" Set the bitmask of events that are to be generated by the in-kernel ctnetlink @@ -97,6 +100,7 @@ event code. Using this parameter, you can reduce the event messages generated by the kernel to those types to those that you are actually interested in. . This option can only be used in conjunction with "-E, --event". +.TP .BI "-b, --buffer-size " "value (in bytes)" Set the Netlink socket buffer size. This option is useful if the command line tool reports ENOBUFS errors. If you do not pass this option, the default value @@ -130,8 +134,13 @@ This option is only required in conjunction with "-L, --dump". If this option is .TP .BI "-t, --timeout " "TIMEOUT" Specify the timeout. -.BI "-m, --mark " "MARK" -Specify the conntrack mark. +.TP +.BI "-m, --mark " "MARK[/MASK]" +Specify the conntrack mark. Optionally, a mask value can be specified. +In "--update" mode, this mask specifies the bits that should be zeroed before XORing +the MARK value into the ctmark. +Otherwise, the mask is logically ANDed with the existing mark before the comparision. +In "--create" mode, the mask is ignored. .TP .BI "-c, --secmark " "SECMARK" Specify the conntrack selinux security mark. @@ -145,6 +154,12 @@ Filter source NAT connections. .BI "-g, --dst-nat " Filter destination NAT connections. .TP +.BI "-j, --any-nat " +Filter any NAT connections. +.TP +.BI "-w, --zone " +Filter by conntrack zone. See iptables CT target for more information. +.TP .BI "--tuple-src " IP_ADDRESS Specify the tuple source address of an expectation. .TP diff --git a/conntrackd.8 b/conntrackd.8 index 0c9054e..f07ad7a 100644 --- a/conntrackd.8 +++ b/conntrackd.8 @@ -24,10 +24,10 @@ Run conntrackd in daemon mode. .B conntrackd can be used in client mode to request several information and operations to a running daemon .TP -.BI "-i " +.BI "-i "[ct|expect]" Dump the internal cache, i.e. show local states .TP -.BI "-e " +.BI "-e "[ct|expect]" Dump the external cache, i.e. show foreign states .TP .BI "-x " @@ -37,7 +37,7 @@ with "-i" and "-e" parameters. .BI "-f " "[|internal|external]" Flush the internal and/or external cache .TP -.BI "-F " +.BI "-F [ct|expect]" Flush the kernel conntrack table (if you use a Linux kernel >= 2.6.29, this option will not flush your internal and external cache). .TP @@ -48,15 +48,17 @@ ask conntrackd to send the state-entries that it owns to others. .BI "-k " Kill the daemon .TP -.BI "-s " "[|network|cache|runtime|link|rsqueue|process|queue]" +.BI "-s " "[|network|cache|runtime|link|rsqueue|process|queue|ct|expect]" Dump statistics. If no parameter is passed, it displays the general statistics. If "network" is passed as parameter it displays the networking statistics. If "cache" is passed as parameter, it shows the extended cache statistics. If "runtime" is passed as parameter, it shows the run-time statistics. If "process" is passed as parameter, it shows existing child processes (if any). If "queue" is passed as parameter, it shows queue statistics. +If "ct" is passed, it displays the general statistics. +If "expect" is passed as parameter, it shows expectation statistics. .TP -.BI "-R " +.BI "-R " "[ct|expect]" Force a resync against the kernel connection tracking table .TP .BI "-t " diff --git a/debian/patches/00list b/debian/patches/00list index 8c83bcc..e69de29 100644 --- a/debian/patches/00list +++ b/debian/patches/00list @@ -1 +0,0 @@ -10-fix_udp_support diff --git a/debian/patches/10-fix_udp_support.dpatch b/debian/patches/10-fix_udp_support.dpatch index 4eed834..4eed834 100644..100755 --- a/debian/patches/10-fix_udp_support.dpatch +++ b/debian/patches/10-fix_udp_support.dpatch diff --git a/doc/manual/conntrack-tools.tmpl b/doc/manual/conntrack-tools.tmpl index b897318..4936a76 100644 --- a/doc/manual/conntrack-tools.tmpl +++ b/doc/manual/conntrack-tools.tmpl @@ -19,7 +19,7 @@ </authorgroup> <copyright> - <year>2008</year> + <year>2008-2011</year> <holder>Pablo Neira Ayuso</holder> </copyright> @@ -37,9 +37,8 @@ <releaseinfo> This document details how to install and configure the <ulink url="http://conntrack-tools.netfilter.org">conntrack-tools</ulink> - 0.9.8. This software is under development, for that reason, it is likely - that this document will evolve in the future to cover new features and - changes.</releaseinfo> + >= 1.0.0. This document will evolve in the future to cover new features + and changes.</releaseinfo> </bookinfo> @@ -198,7 +197,12 @@ conntrack v0.9.7 (conntrack-tools): 1 flow entries have been shown. conntrack v0.9.7 (conntrack-tools): 1 flow entries has been updated. </programlisting> -<para>Delete one entry, this can be used to block traffic (you have to set <emphasis>/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_be_liberal</emphasis> to zero).</para> +<para>Delete one entry, this can be used to block traffic if:</para> +<itemizedlist> + <listitem><para>You have a stateful rule-set that blocks traffic in INVALID state.</para></listitem> + <listitem><para>You have set <emphasis>/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_loose</emphasis> or <emphasis>/proc/sys/net/netfilter/nf_conntrack_tcp_loose</emphasis>, depending on your kernel version, to zero.</para></listitem> +</itemizedlist> + <programlisting> # conntrack -D -p tcp --dport 3486 tcp 6 431982 ESTABLISHED src=192.168.2.100 dst=123.59.27.117 sport=34846 dport=993 packets=169 bytes=14322 src=123.59.27.117 dst=192.168.2.100 sport=993 dport=34846 packets=113 bytes=34787 [ASSURED] mark=1 secmark=0 use=1 @@ -341,6 +345,11 @@ conntrack v0.9.7 (conntrack-tools): 1 flow entries has been deleted. <sect2 id="sync-pb"><title>Active-Backup setup</title> + <note><title>Stateful firewall architectures</title> + <para>A good reading to extend the information about firewall architectures is <ulink url="http://1984.lsi.us.es/~pablo/docs/intcomp09.pdf">Demystifying cluster-based fault-tolerant firewalls</ulink> published in IEEE Internet Computing magazine. + </para> + </note> + <para>In the Active-Backup setup, one of the stateful firewall replicas filters traffic and the other acts as backup. If you use this approach, you have to copy the script <emphasis>primary-backup.sh</emphasis> to: @@ -507,6 +516,307 @@ conntrack v0.9.7 (conntrack-tools): 1 flow entries has been deleted. </sect2> +<sect2 id="sync-options"><title>Other configuration options</title> + + <para>The daemon allows several configuration options that you may want to + enable. This section contains some information about them.</para> + +<sect3 id="sync-disable-external"><title>Disabling external cache</title> + + <para>It is possible to disable the external cache. Thus, + <emphasis>conntrackd</emphasis> directly injects the flow-states into the + in-kernel Connection Tracking System of the backup firewall. You can do it + by enabling the <emphasis>DisableExternalCache</emphasis> option in the + <emphasis>conntrackd.conf</emphasis> configuration file: + </para> + + <programlisting> +Sync { + Mode FTFW { + [...] + DisableExternalCache Off + } +} + </programlisting> + + <para>You can also use this option with the NOTRACK and ALARM modes. This + increases CPU consumption in the backup firewall but now you do not need + to commit the flow-states during the master failures since they are already + in the in-kernel Connection Tracking table. Moreover, you save memory in + the backup firewall since you do not need to store the foreign flow-states + anymore. + </para> + +</sect3> + +<sect3 id="sync-disable-internal"><title>Disabling internal cache</title> + + <para>You can also disable the internal cache by means of the + <emphasis>DisableInternalCache</emphasis> option in the + <emphasis>conntrackd.conf</emphasis> configuration file: + </para> + + <programlisting> +Sync { + Mode NOTRACK { + [...] + DisableInternalCache Off + } +} + </programlisting> + + <para>However, this option is only available for the NOTRACK mode. This + mode provides unreliable flow-state synchronization between firewalls. + Thus, if flow-states are lost during the synchronization, the protocol + provides no way to recover them.</para> + +</sect3> + +<sect3 id="sync-transport-protocol"> +<title>Using UDP, TCP or multicast for flow-state synchronization</title> + + <para>You can use up to three different transport layer protocols to + synchronize flow-state changes between the firewalls: UDP, TCP and + Multicast. UDP and multicast are unreliable but together with the FT-FW + mode provide partial reliable flow-state synchronization. + </para> + + <para>The preferred choice is FT-FW over UDP, or multicast alternatively. + TCP introduces latency in the flow-state synchronization due to the + congestion control. Under flow-state message are lost, the FIFO delivery + becomes also a problem since the backup firewall quickly gets out of + sync. For that reason, its use is discouraged. Note that using TCP only + makes sense with the NOTRACK mode. + </para> + +</sect3> + +<sect3 id="sync-redundant-link"><title>Redundant dedicated links</title> + + <para>You can set redundant dedicated links without using bonding, you have + to configure as many redundant links as you want in the configuration file. + In case of failure of the master dedicated link, conntrackd failovers to one + of the backups. An example of this configuration is the following: + </para> + + <programlisting> +Sync { + Mode FTFW { + [...] + } + # default master dedicated link + UDP Default { + IPv4_address 192.168.2.1 + IPv4_Destination_Address 192.168.2.2 + Port 3780 + Interface eth3 + SndSocketBuffer 24985600 + RcvSocketBuffer 24985600 + Checksum on + } + # backup dedicated link + UDP { + IPv4_address 192.168.1.3 + IPv4_Destination_Address 192.168.1.4 + Port 3780 + Interface eth2 + SndSocketBuffer 24985600 + RcvSocketBuffer 24985600 + Checksum on + } + [...] +} + </programlisting> + +</sect3> + +<sect3 id="sync-iptables-filtering"> +<title>Filtering Connection tracking events with iptables</title> + + <para>Since Linux kernel >= 2.6.34, iptables provides the + <emphasis>CT</emphasis> iptables target that allows to reduce the + amount of Connection Tracking events that are delivered to user-space. + However, you will have to use a Linux kernel >= 2.6.38 to profit + from this feature, since several aspects of the event filtering were + broken.</para> + + <para>The following example shows how to only generate the + <emphasis>assured</emphasis> event:</para> + + <programlisting> + # iptables -I PREROUTING -t raw -j CT --ctevents assured + </programlisting> + + <note><title>Assured flows</title> + <para>One flow is assured if the firewall has seen traffic for it in + both directions.</para> + </note> + + <para>Reducing the amount of events generated helps to reduce CPU + consumption in the active firewall.</para> + +</sect3> + +<sect3 id="sync-expect"><title>Synchronization of expectations</title> + + <para>The connection tracking system provides helpers that allows you to + filter multi-flow application protocols like FTP, H.323 and SIP among many + others. These protocols usually split the control and data traffic in + different flows. Moreover, the control flow usually announces layer 3 and + 4 information to let the other peer know where the data flows will be + open. This sort of protocols require that the firewall inspects the + content of the packet, otherwise filtering by layer 3 and 4 selectors + like addresses and ports become a real nightmare. Netfilter already + provides the so-called <emphasis>helpers</emphasis> that track this + protocol aspects to allow deploying appropriate filtering. These + helpers create <emphasis>expectation</emphasis> entries that + represent expected traffic that will arrive to the firewall according + to the inspected packets.</para> + + <para>In case that you have enabled tracking of these protocols, you + may want to enable the state-synchronization of expectation as well. + Thus, established flows for this specific protocols will not suffer + any disruption.</para> + + <para>To enable the expectation support in the configuration file, you + have to use the following option:</para> + + <programlisting> +Sync { + ... + Options { + ExpectationSync { + ftp + sip + h323 + } + } +}</programlisting> + + <para>The example above enables the synchronization of the expectations + for the FTP, SIP and H.323 helpers.</para> + + <para>In my testbed, there are two firewalls in a primary-backup + configuration running keepalived. They use a couple of floating cluster + IP address (192.168.0.100 and 192.168.1.100) that are used by the client. + These firewalls protect one FTP server (192.168.1.2) that will be accessed + by one client.</para> + + <para>In ASCII art, it looks like this:</para> + + <programlisting> + 192.168.0.100 192.168.1.100 + eth1 eth2 + fw-1 + / \ FTP + client ------ ------ server + 192.168.0.2 \ / 192.168.1.2 + fw-2 + </programlisting> + + <para>This is the rule-set for the firewalls:</para> + + <programlisting> + -A FORWARD -m state --state RELATED -j ACCEPT + -A FORWARD -i eth2 -m state --state ESTABLISHED -j ACCEPT + -A FORWARD -i eth1 -p tcp -m tcp --dport 21 --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j ACCEPT + -A FORWARD -i eth1 -p tcp -m state --state ESTABLISHED -j ACCEPT + -A FORWARD -m state --state INVALID -j LOG --log-prefix "invalid: "</programlisting> + + <para>Before going ahead, make sure <emphasis>nf_conntrack_ftp</emphasis> is + loaded.</para> + + <para>The following steps detail how to check that the expectation support + works fine with FTP traffic:</para> + + <orderedlist> + <listitem> + <para>Switch to the client. Start one FTP control connection to one + server that is protected by the firewalls, enter passive mode:</para> + + <programlisting> + (term-1) user@client$ nc 192.168.1.2 21 + 220 dummy FTP server + USER anonymous + 331 Please specify the password. + PASS nothing + 230 Login successful. + PASV + 227 Entering Passive Mode (192,168,1,2,163,11).</programlisting> + + <para>This means that port 163*256+11=41739 will be used for the data + traffic. I suggest you to read <ulink url="http://www.freefire.org/articles/ftpexample.php">djb's FTP protocol description</ulink> in case that you + don't understand how this calculation is done.</para> + </listitem> + + <listitem> + <para> Switch to fw-1 (primary) to check that the expectation is in the + internal cache.</para> + + <programlisting> + root@fw1# conntrackd -i exp + proto=6 src=192.168.0.2 dst=192.168.1.2 sport=0 dport=41739 mask-src=255.255.255.255 mask-dst=255.255.255.255 sport=0 dport=65535 master-src=192.168.0.2 master-dst=192.168.1.2 sport=36390 dport=21 helper=ftp [active since 5s] + </programlisting> + </listitem> + + <listitem> + <para> Switch to fw-2 (backup) to check that the expectation has been + successfully replicated.</para> + + <programlisting> + root@fw2# conntrackd -e exp + proto=6 src=192.168.0.2 dst=192.168.1.2 sport=0 dport=41739 mask-src=255.255.255.255 mask-dst=255.255.255.255 sport=0 dport=65535 master-src=192.168.0.2 master-dst=192.168.1.2 sport=36390 dport=21 [active since 8s] + </programlisting> + </listitem> + + <listitem> + <para>Make the primary firewall fw-1 fail. Now fw-2 becomes primary.</para> + </listitem> + + <listitem> + <para>Switch to fw-2 (primary) to commit the external cache into the + kernel. The logs should display that the commit was successful:</para> + + <programlisting> + root@fw2# tail -100f /var/log/conntrackd.log + [Wed Dec 7 22:16:31 2011] (pid=19195) [notice] committing external cache: expectations + [Wed Dec 7 22:16:31 2011] (pid=19195) [notice] Committed 1 new entries + [Wed Dec 7 22:16:31 2011] (pid=19195) [notice] commit has taken 0.000366 seconds</programlisting> + </listitem> + + <listitem> + <para> Switch to the client. Open a new terminal and connect to the port that + has been announced by the server:</para> + + <programlisting> + (term-2) user@client$ nc -vvv 192.168.1.2 41739 + (UNKNOWN) [192.168.1.2] 41739 (?) open</programlisting> + </listitem> + + <listitem> + <para>Switch to term-1 and ask for the file listing:</para> + + <programlisting> + [...] + 227 Entering Passive Mode (192,168,1,2,163,11). + LIST</programlisting> + </listitem> + + <listitem> + <para>Switch to term-2, it should display the listing. That means + everything has worked fine.</para> + </listitem> + + </orderedlist> + + <para>You may want to try disabling the expectation support and + repeating the steps to check that <emphasis>it does not work</emphasis> + without the state-synchronization.</para> + +</sect3> + +</sect2> + <sect2 id="sync-trouble"><title>Troubleshooting</title> <para>Problems with <emphasis>conntrackd</emphasis>? The following list @@ -566,6 +876,151 @@ conntrack v0.9.7 (conntrack-tools): 1 flow entries has been deleted. </answer> </qandaentry> + <qandaentry> + <question> + <para> + Does conntrackd support TCP flow-recovery with window tracking enabled? + </para> + </question> + <answer> + <para> + Yes, but you require a Linux kernel >= 2.6.36 and the conntrack-tools >= 0.9.15. To enable it, check the TCPWindowTracking clause in the example configuration files. + </para> + </answer> + </qandaentry> + + <qandaentry> + <question> + <para> + Does conntrackd support the H.323 and SIP connection tracking helpers? + </para> + </question> + <answer> + <para> + Yes, conntrackd includes expectation support since version 1.2.0. + </para> + </answer> + </qandaentry> + + <qandaentry> + <question> + <para> + Is there any way to set up a more verbose mode in the log message for debugging? + </para> + </question> + <answer> + <para> + No, but conntrackd provides lots of information that you can look up in + runtime via -s option.</para> + + <para>You can check network statistics to find anomalies:</para> + <programlisting> +# conntrackd -s network + network statistics: + recv: + Malformed messages: 0 + Wrong protocol version: 0 + Malformed header: 0 + Malformed payload: 0 + Bad message type: 0 + Truncated message: 0 + Bad message size: 0 + send: + Malformed messages: 0 + +sequence tracking statistics: + recv: + Packets lost: 42726 + Packets before: 0 + +UDP traffic (active device=eth3): + 564232 Bytes sent 1979844 Bytes recv + 2844 Pckts sent 8029 Pckts recv + 0 Error send 0 Error recv + </programlisting> + + <para>You can check cache statistics:</para> + <programlisting> +# conntrackd -s cache +cache:internal active objects: 0 + active/total entries: 0/ 0 + creation OK/failed: 11068/ 0 + no memory available: 0 + no space left in cache: 0 + update OK/failed: 4128/ 0 + entry not found: 0 + deletion created/failed: 11068/ 0 + entry not found: 0 + +cache:external active objects: 0 + active/total entries: 0/ 0 + creation OK/failed: 10521/ 0 + no memory available: 0 + no space left in cache: 0 + update OK/failed: 8832/ 0 + entry not found: 0 + deletion created/failed: 10521/ 0 + entry not found: 0 + </programlisting> + + <para>You can check runtime miscelaneous statistics:</para> + <programlisting> +# conntrackd -s runtime +daemon uptime: 14 min + +netlink stats: + events received: 24736 + events filtered: 0 + events unknown type: 0 + catch event failed: 0 + dump unknown type: 0 + netlink overrun: 0 + flush kernel table: 1 + resync with kernel table: 0 + current buffer size (in bytes): 8000000 + +runtime stats: + child process failed: 0 + child process segfault: 0 + child process termsig: 0 + select failed: 0 + wait failed: 0 + local read failed: 0 + local unknown request: 0 + </programlisting> + + <para>You can check dedicated link statistics:</para> + <programlisting> +# conntrackd -s link +UDP traffic device=eth3 status=RUNNING role=ACTIVE: + 566848 Bytes sent 1982612 Bytes recv + 3018 Pckts sent 8203 Pckts recv + 0 Error send 0 Error recv + </programlisting> + + <para>You can check network queue statistics:</para> + <programlisting> +# conntrackd -s queue +allocated queue nodes: 1 + +queue txqueue: +current elements: 0 +maximum elements: 2147483647 +not enough space errors: 0 + +queue errorq: +current elements: 0 +maximum elements: 128 +not enough space errors: 0 + +queue rsqueue: +current elements: 1 +maximum elements: 131072 +not enough space errors: 0 + </programlisting> + </answer> + </qandaentry> + </qandaset> </sect2> diff --git a/doc/stats/conntrackd.conf b/doc/stats/conntrackd.conf index 0941f64..16d7a80 100644 --- a/doc/stats/conntrackd.conf +++ b/doc/stats/conntrackd.conf @@ -67,6 +67,18 @@ General { # NetlinkBufferSizeMaxGrowth 655355 + # + # By default, the daemon receives state updates following an + # event-driven model. You can modify this behaviour by switching to + # polling mode with the PollSecs clause. This clause tells conntrackd + # to dump the states in the kernel every N seconds. With regards to + # synchronization mode, the polling mode can only guarantee that + # long-lifetime states are recovered. The main advantage of this method + # is the reduction in the state replication at the cost of reducing the + # chances of recovering connections. + # + # PollSecs 15 + # # Event filtering: This clause allows you to filter certain traffic, # There are currently three filter-sets: Protocol, Address and @@ -81,6 +93,7 @@ General { # Protocol Accept { TCP + # UDP } # @@ -118,18 +131,6 @@ Stats { # # NetlinkEventsReliable Off - # - # By default, the daemon receives state updates following an - # event-driven model. You can modify this behaviour by switching to - # polling mode with the PollSecs clause. This clause tells conntrackd - # to dump the states in the kernel every N seconds. With regards to - # synchronization mode, the polling mode can only guarantee that - # long-lifetime states are recovered. The main advantage of this method - # is the reduction in the state replication at the cost of reducing the - # chances of recovering connections. - # - # PollSecs 15 - # # Enable connection logging via Syslog. Default is off. # Syslog: on, off or a facility name (daemon (default) or local0..7) diff --git a/doc/stats/conntrackd.conf.orig b/doc/stats/conntrackd.conf.orig deleted file mode 100644 index 1f1a697..0000000 --- a/doc/stats/conntrackd.conf.orig +++ /dev/null @@ -1,121 +0,0 @@ -# -# General settings -# -General { - # - # Set the nice value of the daemon. This value goes from -20 - # (most favorable scheduling) to 19 (least favorable). Using a - # negative value reduces the chances to lose state-change events. - # Default is 0. See man nice(1) for more information. - # - Nice -1 - - # - # Number of buckets in the caches: hash table - # - HashSize 8192 - - # - # Maximum number of conntracks: - # it must be >= $ cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max - # - HashLimit 65535 - - # - # Logfile: on (/var/log/conntrackd.log), off, or a filename - # Default: off - # - #LogFile on - - # - # Syslog: on, off or a facility name (daemon (default) or local0..7) - # Default: off - # - #Syslog on - - # - # Lockfile - # - LockFile /var/lock/conntrack.lock - - # - # Unix socket configuration - # - UNIX { - Path /var/run/conntrackd.ctl - Backlog 20 - } - - # - # Netlink socket buffer size - # - NetlinkBufferSize 262142 - - # - # Increase the socket buffer up to maximun if required - # - NetlinkBufferSizeMaxGrowth 655355 - - # - # Event filtering: This clause allows you to filter certain traffic, - # There are currently three filter-sets: Protocol, Address and - # State. The filter is attached to an action that can be: Accept or - # Ignore. Thus, you can define the event filtering policy of the - # filter-sets in positive or negative logic depending on your needs. - # - Filter { - # - # Accept only certain protocols: You may want to log the - # state of flows depending on their layer 4 protocol. - # - Protocol Accept { - TCP - } - - # - # Ignore traffic for a certain set of IP's. - # - Address Ignore { - IPv4_address 127.0.0.1 # loopback - } - - # - # Uncomment this line below if you want to filter by flow state. - # The existing TCP states are: SYN_SENT, SYN_RECV, ESTABLISHED, - # FIN_WAIT, CLOSE_WAIT, LAST_ACK, TIME_WAIT, CLOSED, LISTEN. - # - # State Accept { - # ESTABLISHED CLOSED TIME_WAIT CLOSE_WAIT for TCP - # } - } -} - -Stats { - # - # If you enable this option, the daemon writes the information about - # destroyed connections to a logfile. Default is off. - # Logfile: on, off, or a filename - # Default file: (/var/log/conntrackd-stats.log) - # - LogFile on - - # - # By default, the daemon receives state updates following an - # event-driven model. You can modify this behaviour by switching to - # polling mode with the PollSecs clause. This clause tells conntrackd - # to dump the states in the kernel every N seconds. With regards to - # synchronization mode, the polling mode can only guarantee that - # long-lifetime states are recovered. The main advantage of this method - # is the reduction in the state replication at the cost of reducing the - # chances of recovering connections. - # - # PollSecs 15 - - # - # Enable connection logging via Syslog. Default is off. - # Syslog: on, off or a facility name (daemon (default) or local0..7) - # If you set the facility, use the same as in the General clause, - # otherwise you'll get a warning message. - # - #Syslog on -} diff --git a/doc/sync/alarm/conntrackd.conf b/doc/sync/alarm/conntrackd.conf index 3424e39..deed291 100644 --- a/doc/sync/alarm/conntrackd.conf +++ b/doc/sync/alarm/conntrackd.conf @@ -180,6 +180,34 @@ Sync { # # Checksum on # } + + # + # Other unsorted options that are related to the synchronization. + # + # Options { + # + # TCP state-entries have window tracking disabled by default, + # you can enable it with this option. As said, default is off. + # This feature requires a Linux kernel >= 2.6.36. + # + # TCPWindowTracking Off + + # Set this option on if you want to enable the synchronization + # of expectations. You have to specify the list of helpers that + # you want to enable. Default is off. + # + # ExpectationSync { + # ftp + # h323 + # sip + # } + # + # You can use this alternatively: + # + # ExpectationSync On + # + # If you want to synchronize expectations of all helpers. + # } } # @@ -332,7 +360,9 @@ General { TCP SCTP DCCP + # UDP # ICMP # This requires a Linux kernel >= 2.6.31 + # IPv6-ICMP # This requires a Linux kernel >= 2.6.31 } # diff --git a/doc/sync/alarm/conntrackd.conf.orig b/doc/sync/alarm/conntrackd.conf.orig deleted file mode 100644 index ca6e661..0000000 --- a/doc/sync/alarm/conntrackd.conf.orig +++ /dev/null @@ -1,348 +0,0 @@ -# -# Synchronizer settings -# -Sync { - Mode ALARM { - # - # If a conntrack entry is not modified in <= 15 seconds, then - # a message is broadcasted. This mechanism is used to - # resynchronize nodes that just joined the multicast group - # - RefreshTime 15 - - # - # If we don't receive a notification about the state of - # an entry in the external cache after N seconds, then - # remove it. - # - CacheTimeout 180 - - # - # This parameter allows you to set an initial fixed timeout - # for the committed entries when this node goes from backup - # to primary. This mechanism provides a way to purge entries - # that were not recovered appropriately after the specified - # fixed timeout. If you set a low value, TCP entries in - # Established states with no traffic may hang. For example, - # an SSH connection without KeepAlive enabled. If not set, - # the daemon uses an approximate timeout value calculation - # mechanism. By default, this option is not set. - # - # CommitTimeout 180 - - # - # If the firewall replica goes from primary to backup, - # the conntrackd -t command is invoked in the script. - # This command schedules a flush of the table in N seconds. - # This is useful to purge the connection tracking table of - # zombie entries and avoid clashes with old entries if you - # trigger several consecutive hand-overs. Default is 60 seconds - # - # PurgeTimeout 60 - } - - # - # Multicast IP and interface where messages are - # broadcasted (dedicated link). IMPORTANT: Make sure - # that iptables accepts traffic for destination - # 225.0.0.50, eg: - # - # iptables -I INPUT -d 225.0.0.50 -j ACCEPT - # iptables -I OUTPUT -d 225.0.0.50 -j ACCEPT - # - Multicast { - # - # Multicast address: The address that you use as destination - # in the synchronization messages. You do not have to add - # this IP to any of your existing interfaces. If any doubt, - # do not modify this value. - # - IPv4_address 225.0.0.50 - - # - # The multicast group that identifies the cluster. If any - # doubt, do not modify this value. - # - Group 3780 - - # - # IP address of the interface that you are going to use to - # send the synchronization messages. Remember that you must - # use a dedicated link for the synchronization messages. - # - IPv4_interface 192.168.100.100 - - # - # The name of the interface that you are going to use to - # send the synchronization messages. - # - Interface eth2 - - # The multicast sender uses a buffer to enqueue the packets - # that are going to be transmitted. The default size of this - # socket buffer is available at /proc/sys/net/core/wmem_default. - # This value determines the chances to have an overrun in the - # sender queue. The overrun results packet loss, thus, losing - # state information that would have to be retransmitted. If you - # notice some packet loss, you may want to increase the size - # of the sender buffer. The default size is usually around - # ~100 KBytes which is fairly small for busy firewalls. - # - SndSocketBuffer 1249280 - - # The multicast receiver uses a buffer to enqueue the packets - # that the socket is pending to handle. The default size of this - # socket buffer is available at /proc/sys/net/core/rmem_default. - # This value determines the chances to have an overrun in the - # receiver queue. The overrun results packet loss, thus, losing - # state information that would have to be retransmitted. If you - # notice some packet loss, you may want to increase the size of - # the receiver buffer. The default size is usually around - # ~100 KBytes which is fairly small for busy firewalls. - # - RcvSocketBuffer 1249280 - - # - # Enable/Disable message checksumming. This is a good - # property to achieve fault-tolerance. In case of doubt, do - # not modify this value. - # - Checksum on - } - # - # You can specify more than one dedicated link. Thus, if one dedicated - # link fails, conntrackd can fail-over to another. Note that adding - # more than one dedicated link does not mean that state-updates will - # be sent to all of them. There is only one active dedicated link at - # a given moment. The `Default' keyword indicates that this interface - # will be selected as the initial dedicated link. You can have - # up to 4 redundant dedicated links. Note: Use different multicast - # groups for every redundant link. - # - # Multicast Default { - # IPv4_address 225.0.0.51 - # Group 3781 - # IPv4_interface 192.168.100.101 - # Interface eth3 - # # SndSocketBuffer 1249280 - # # RcvSocketBuffer 1249280 - # Checksum on - # } - - # - # You can use Unicast UDP instead of Multicast to propagate events. - # Note that you cannot use unicast UDP and Multicast at the same - # time, you can only select one. - # - # UDP { - # - # UDP address that this firewall uses to listen to events. - # - # IPv4_address 192.168.2.100 - # - # or you may want to use an IPv6 address: - # - # IPv6_address fe80::215:58ff:fe28:5a27 - - # - # Destination UDP address that receives events, ie. the other - # firewall's dedicated link address. - # - # IPv4_Destination_Address 192.168.2.101 - # - # or you may want to use an IPv6 address: - # - # IPv6_Destination_Address fe80::2d0:59ff:fe2a:775c - - # - # UDP port used - # - # Port 3780 - - # - # The name of the interface that you are going to use to - # send the synchronization messages. - # - # Interface eth2 - - # - # The sender socket buffer size - # - # SndSocketBuffer 1249280 - - # - # The receiver socket buffer size - # - # RcvSocketBuffer 1249280 - - # - # Enable/Disable message checksumming. - # - # Checksum on - # } -} - -# -# General settings -# -General { - # - # Set the nice value of the daemon, this value goes from -20 - # (most favorable scheduling) to 19 (least favorable). Using a - # very low value reduces the chances to lose state-change events. - # Default is 0 but this example file sets it to most favourable - # scheduling as this is generally a good idea. See man nice(1) for - # more information. - # - Nice -20 - - # - # Number of buckets in the cache hashtable. The bigger it is, - # the closer it gets to O(1) at the cost of consuming more memory. - # Read some documents about tuning hashtables for further reference. - # - HashSize 32768 - - # - # Maximum number of conntracks, it should be double of: - # $ cat /proc/sys/net/netfilter/nf_conntrack_max - # since the daemon may keep some dead entries cached for possible - # retransmission during state synchronization. - # - HashLimit 131072 - - # - # Logfile: on (/var/log/conntrackd.log), off, or a filename - # Default: off - # - LogFile on - - # - # Syslog: on, off or a facility name (daemon (default) or local0..7) - # Default: off - # - #Syslog on - - # - # Lockfile - # - LockFile /var/lock/conntrack.lock - - # - # Unix socket configuration - # - UNIX { - Path /var/run/conntrackd.ctl - Backlog 20 - } - - # - # Netlink event socket buffer size. If you do not specify this clause, - # the default buffer size value in /proc/net/core/rmem_default is - # used. This default value is usually around 100 Kbytes which is - # fairly small for busy firewalls. This leads to event message dropping - # and high CPU consumption. This example configuration file sets the - # size to 2 MBytes to avoid this sort of problems. - # - NetlinkBufferSize 2097152 - - # - # The daemon doubles the size of the netlink event socket buffer size - # if it detects netlink event message dropping. This clause sets the - # maximum buffer size growth that can be reached. This example file - # sets the size to 8 MBytes. - # - NetlinkBufferSizeMaxGrowth 8388608 - - # - # If the daemon detects that Netlink is dropping state-change events, - # it automatically schedules a resynchronization against the Kernel - # after 30 seconds (default value). Resynchronizations are expensive - # in terms of CPU consumption since the daemon has to get the full - # kernel state-table and purge state-entries that do not exist anymore. - # Be careful of setting a very small value here. You have the following - # choices: On (enabled, use default 30 seconds value), Off (disabled) - # or Value (in seconds, to set a specific amount of time). If not - # specified, the daemon assumes that this option is enabled. - # - # NetlinkOverrunResync On - - # - # By default, the daemon receives state updates following an - # event-driven model. You can modify this behaviour by switching to - # polling mode with the PollSecs clause. This clause tells conntrackd - # to dump the states in the kernel every N seconds. With regards to - # synchronization mode, the polling mode can only guarantee that - # long-lifetime states are recovered. The main advantage of this method - # is the reduction in the state replication at the cost of reducing the - # chances of recovering connections. - # - # PollSecs 15 - - # - # The daemon prioritizes the handling of state-change events coming - # from the core. With this clause, you can set the maximum number of - # state-change events (those coming from kernel-space) that the daemon - # will handle after which it will handle other events coming from the - # network or userspace. A low value improves interactivity (in terms of - # real-time behaviour) at the cost of extra CPU consumption. - # Default (if not set) is 100. - # - # EventIterationLimit 100 - - # - # Event filtering: This clause allows you to filter certain traffic, - # There are currently three filter-sets: Protocol, Address and - # State. The filter is attached to an action that can be: Accept or - # Ignore. Thus, you can define the event filtering policy of the - # filter-sets in positive or negative logic depending on your needs. - # You can select if conntrackd filters the event messages from - # user-space or kernel-space. The kernel-space event filtering - # saves some CPU cycles by avoiding the copy of the event message - # from kernel-space to user-space. The kernel-space event filtering - # is prefered, however, you require a Linux kernel >= 2.6.29 to - # filter from kernel-space. If you want to select kernel-space - # event filtering, use the keyword 'Kernelspace' instead of - # 'Userspace'. - # - Filter From Userspace { - # - # Accept only certain protocols: You may want to replicate - # the state of flows depending on their layer 4 protocol. - # - Protocol Accept { - TCP - } - - # - # Ignore traffic for a certain set of IP's: Usually all the - # IP assigned to the firewall since local traffic must be - # ignored, only forwarded connections are worth to replicate. - # Note that these values depends on the local IPs that are - # assigned to the firewall. - # - Address Ignore { - IPv4_address 127.0.0.1 # loopback - IPv4_address 192.168.0.100 # virtual IP 1 - IPv4_address 192.168.1.100 # virtual IP 2 - IPv4_address 192.168.0.1 - IPv4_address 192.168.1.1 - IPv4_address 192.168.100.100 # dedicated link ip - # - # You can also specify networks in format IP/cidr. - # IPv4_address 192.168.0.0/24 - } - - # - # Uncomment this line below if you want to filter by flow state. - # This option introduces a trade-off in the replication: it - # reduces CPU consumption at the cost of having lazy backup - # firewall replicas. The existing TCP states are: SYN_SENT, - # SYN_RECV, ESTABLISHED, FIN_WAIT, CLOSE_WAIT, LAST_ACK, - # TIME_WAIT, CLOSED, LISTEN. - # - # State Accept { - # ESTABLISHED CLOSED TIME_WAIT CLOSE_WAIT for TCP - # } - } -} diff --git a/doc/sync/alarm/conntrackd.conf.rej b/doc/sync/alarm/conntrackd.conf.rej deleted file mode 100644 index 108546f..0000000 --- a/doc/sync/alarm/conntrackd.conf.rej +++ /dev/null @@ -1,30 +0,0 @@ -*************** Sync { -*** 23,36 **** - - # - # If the firewall replica goes from primary to backup, -- # the conntrackd -t command is invoked in the script. -- # This command resets the timers of the conntracks that -- # live in the kernel to this new value. This is useful -- # to purge the connection tracking table of zombie entries -- # and avoid clashes with old entries if you trigger -- # several consecutive hand-overs. - # -- PurgeTimeout 15 - - # Set the acknowledgement window size. If you decrease this - # value, the number of acknowlegdments increases. More ---- 23,35 ---- - - # - # If the firewall replica goes from primary to backup, -+ # the conntrackd -t command is invoked in the script. -+ # This command schedules a flush of the table in N seconds. -+ # This is useful to purge the connection tracking table of -+ # zombie entries and avoid clashes with old entries if you -+ # trigger several consecutive hand-overs. Default is 60 seconds. - # -+ # PurgeTimeout 60 - - # Set the acknowledgement window size. If you decrease this - # value, the number of acknowlegdments increases. More diff --git a/doc/sync/ftfw/conntrackd.conf b/doc/sync/ftfw/conntrackd.conf index df10aca..0304f0f 100644 --- a/doc/sync/ftfw/conntrackd.conf +++ b/doc/sync/ftfw/conntrackd.conf @@ -204,6 +204,33 @@ Sync { # Checksum on # } + # + # Other unsorted options that are related to the synchronization. + # + # Options { + # + # TCP state-entries have window tracking disabled by default, + # you can enable it with this option. As said, default is off. + # This feature requires a Linux kernel >= 2.6.36. + # + # TCPWindowTracking Off + + # Set this option on if you want to enable the synchronization + # of expectations. You have to specify the list of helpers that + # you want to enable. Default is off. + # + # ExpectationSync { + # ftp + # h323 + # sip + # } + # + # You can use this alternatively: + # + # ExpectationSync On + # + # If you want to synchronize expectations of all helpers. + # } } # @@ -357,7 +384,9 @@ General { TCP SCTP DCCP + # UDP # ICMP # This requires a Linux kernel >= 2.6.31 + # IPv6-ICMP # This requires a Linux kernel >= 2.6.31 } # diff --git a/doc/sync/ftfw/conntrackd.conf.orig b/doc/sync/ftfw/conntrackd.conf.orig deleted file mode 100644 index c1208f9..0000000 --- a/doc/sync/ftfw/conntrackd.conf.orig +++ /dev/null @@ -1,370 +0,0 @@ -# -# Synchronizer settings -# -Sync { - Mode FTFW { - # - # Size of the resend queue (in objects). This is the maximum - # number of objects that can be stored waiting to be confirmed - # via acknoledgment. If you keep this value low, the daemon - # will have less chances to recover state-changes under message - # omission. On the other hand, if you keep this value high, - # the daemon will consume more memory to store dead objects. - # Default is 131072 objects. - # - # ResendQueueSize 131072 - - # - # This parameter allows you to set an initial fixed timeout - # for the committed entries when this node goes from backup - # to primary. This mechanism provides a way to purge entries - # that were not recovered appropriately after the specified - # fixed timeout. If you set a low value, TCP entries in - # Established states with no traffic may hang. For example, - # an SSH connection without KeepAlive enabled. If not set, - # the daemon uses an approximate timeout value calculation - # mechanism. By default, this option is not set. - # - # CommitTimeout 180 - - # - # If the firewall replica goes from primary to backup, - # the conntrackd -t command is invoked in the script. - # This command schedules a flush of the table in N seconds. - # This is useful to purge the connection tracking table of - # zombie entries and avoid clashes with old entries if you - # trigger several consecutive hand-overs. Default is 60 seconds. - # - # PurgeTimeout 60 - - # Set the acknowledgement window size. If you decrease this - # value, the number of acknowlegdments increases. More - # acknowledgments means more overhead as conntrackd has to - # handle more control messages. On the other hand, if you - # increase this value, the resend queue gets more populated. - # This results in more overhead in the queue releasing. - # The following value is based on some practical experiments - # measuring the cycles spent by the acknowledgment handling - # with oprofile. If not set, default window size is 300. - # - # ACKWindowSize 300 - } - - # - # Multicast IP and interface where messages are - # broadcasted (dedicated link). IMPORTANT: Make sure - # that iptables accepts traffic for destination - # 225.0.0.50, eg: - # - # iptables -I INPUT -d 225.0.0.50 -j ACCEPT - # iptables -I OUTPUT -d 225.0.0.50 -j ACCEPT - # - Multicast { - # - # Multicast address: The address that you use as destination - # in the synchronization messages. You do not have to add - # this IP to any of your existing interfaces. If any doubt, - # do not modify this value. - # - IPv4_address 225.0.0.50 - - # - # The multicast group that identifies the cluster. If any - # doubt, do not modify this value. - # - Group 3780 - - # - # IP address of the interface that you are going to use to - # send the synchronization messages. Remember that you must - # use a dedicated link for the synchronization messages. - # - IPv4_interface 192.168.100.100 - - # - # The name of the interface that you are going to use to - # send the synchronization messages. - # - Interface eth2 - - # The multicast sender uses a buffer to enqueue the packets - # that are going to be transmitted. The default size of this - # socket buffer is available at /proc/sys/net/core/wmem_default. - # This value determines the chances to have an overrun in the - # sender queue. The overrun results packet loss, thus, losing - # state information that would have to be retransmitted. If you - # notice some packet loss, you may want to increase the size - # of the sender buffer. The default size is usually around - # ~100 KBytes which is fairly small for busy firewalls. - # - SndSocketBuffer 1249280 - - # The multicast receiver uses a buffer to enqueue the packets - # that the socket is pending to handle. The default size of this - # socket buffer is available at /proc/sys/net/core/rmem_default. - # This value determines the chances to have an overrun in the - # receiver queue. The overrun results packet loss, thus, losing - # state information that would have to be retransmitted. If you - # notice some packet loss, you may want to increase the size of - # the receiver buffer. The default size is usually around - # ~100 KBytes which is fairly small for busy firewalls. - # - RcvSocketBuffer 1249280 - - # - # Enable/Disable message checksumming. This is a good - # property to achieve fault-tolerance. In case of doubt, do - # not modify this value. - # - Checksum on - } - # - # You can specify more than one dedicated link. Thus, if one dedicated - # link fails, conntrackd can fail-over to another. Note that adding - # more than one dedicated link does not mean that state-updates will - # be sent to all of them. There is only one active dedicated link at - # a given moment. The `Default' keyword indicates that this interface - # will be selected as the initial dedicated link. You can have - # up to 4 redundant dedicated links. Note: Use different multicast - # groups for every redundant link. - # - # Multicast Default { - # IPv4_address 225.0.0.51 - # Group 3781 - # IPv4_interface 192.168.100.101 - # Interface eth3 - # # SndSocketBuffer 1249280 - # # RcvSocketBuffer 1249280 - # Checksum on - # } - - # - # You can use Unicast UDP instead of Multicast to propagate events. - # Note that you cannot use unicast UDP and Multicast at the same - # time, you can only select one. - # - # UDP { - # - # UDP address that this firewall uses to listen to events. - # - # IPv4_address 192.168.2.100 - # - # or you may want to use an IPv6 address: - # - # IPv6_address fe80::215:58ff:fe28:5a27 - - # - # Destination UDP address that receives events, ie. the other - # firewall's dedicated link address. - # - # IPv4_Destination_Address 192.168.2.101 - # - # or you may want to use an IPv6 address: - # - # IPv6_Destination_Address fe80::2d0:59ff:fe2a:775c - - # - # UDP port used - # - # Port 3780 - - # - # The name of the interface that you are going to use to - # send the synchronization messages. - # - # Interface eth2 - - # - # The sender socket buffer size - # - # SndSocketBuffer 1249280 - - # - # The receiver socket buffer size - # - # RcvSocketBuffer 1249280 - - # - # Enable/Disable message checksumming. - # - # Checksum on - # } -} - -# -# General settings -# -General { - # - # Set the nice value of the daemon, this value goes from -20 - # (most favorable scheduling) to 19 (least favorable). Using a - # very low value reduces the chances to lose state-change events. - # Default is 0 but this example file sets it to most favourable - # scheduling as this is generally a good idea. See man nice(1) for - # more information. - # - Nice -20 - - # - # Select a different scheduler for the daemon, you can select between - # RR and FIFO and the process priority (minimum is 0, maximum is 99). - # See man sched_setscheduler(2) for more information. Using a RT - # scheduler reduces the chances to overrun the Netlink buffer. - # - # Scheduler { - # Type FIFO - # Priority 99 - # } - - # - # Number of buckets in the cache hashtable. The bigger it is, - # the closer it gets to O(1) at the cost of consuming more memory. - # Read some documents about tuning hashtables for further reference. - # - HashSize 32768 - - # - # Maximum number of conntracks, it should be double of: - # $ cat /proc/sys/net/netfilter/nf_conntrack_max - # since the daemon may keep some dead entries cached for possible - # retransmission during state synchronization. - # - HashLimit 131072 - - # - # Logfile: on (/var/log/conntrackd.log), off, or a filename - # Default: off - # - LogFile on - - # - # Syslog: on, off or a facility name (daemon (default) or local0..7) - # Default: off - # - #Syslog on - - # - # Lockfile - # - LockFile /var/lock/conntrack.lock - - # - # Unix socket configuration - # - UNIX { - Path /var/run/conntrackd.ctl - Backlog 20 - } - - # - # Netlink event socket buffer size. If you do not specify this clause, - # the default buffer size value in /proc/net/core/rmem_default is - # used. This default value is usually around 100 Kbytes which is - # fairly small for busy firewalls. This leads to event message dropping - # and high CPU consumption. This example configuration file sets the - # size to 2 MBytes to avoid this sort of problems. - # - NetlinkBufferSize 2097152 - - # - # The daemon doubles the size of the netlink event socket buffer size - # if it detects netlink event message dropping. This clause sets the - # maximum buffer size growth that can be reached. This example file - # sets the size to 8 MBytes. - # - NetlinkBufferSizeMaxGrowth 8388608 - - # - # If the daemon detects that Netlink is dropping state-change events, - # it automatically schedules a resynchronization against the Kernel - # after 30 seconds (default value). Resynchronizations are expensive - # in terms of CPU consumption since the daemon has to get the full - # kernel state-table and purge state-entries that do not exist anymore. - # Be careful of setting a very small value here. You have the following - # choices: On (enabled, use default 30 seconds value), Off (disabled) - # or Value (in seconds, to set a specific amount of time). If not - # specified, the daemon assumes that this option is enabled. - # - # NetlinkOverrunResync On - - # - # By default, the daemon receives state updates following an - # event-driven model. You can modify this behaviour by switching to - # polling mode with the PollSecs clause. This clause tells conntrackd - # to dump the states in the kernel every N seconds. With regards to - # synchronization mode, the polling mode can only guarantee that - # long-lifetime states are recovered. The main advantage of this method - # is the reduction in the state replication at the cost of reducing the - # chances of recovering connections. - # - # PollSecs 15 - - # - # The daemon prioritizes the handling of state-change events coming - # from the core. With this clause, you can set the maximum number of - # state-change events (those coming from kernel-space) that the daemon - # will handle after which it will handle other events coming from the - # network or userspace. A low value improves interactivity (in terms of - # real-time behaviour) at the cost of extra CPU consumption. - # Default (if not set) is 100. - # - # EventIterationLimit 100 - - # - # Event filtering: This clause allows you to filter certain traffic, - # There are currently three filter-sets: Protocol, Address and - # State. The filter is attached to an action that can be: Accept or - # Ignore. Thus, you can define the event filtering policy of the - # filter-sets in positive or negative logic depending on your needs. - # You can select if conntrackd filters the event messages from - # user-space or kernel-space. The kernel-space event filtering - # saves some CPU cycles by avoiding the copy of the event message - # from kernel-space to user-space. The kernel-space event filtering - # is prefered, however, you require a Linux kernel >= 2.6.29 to - # filter from kernel-space. If you want to select kernel-space - # event filtering, use the keyword 'Kernelspace' instead of - # 'Userspace'. - # - Filter From Userspace { - # - # Accept only certain protocols: You may want to replicate - # the state of flows depending on their layer 4 protocol. - # - Protocol Accept { - TCP - SCTP - DCCP - } - - # - # Ignore traffic for a certain set of IP's: Usually all the - # IP assigned to the firewall since local traffic must be - # ignored, only forwarded connections are worth to replicate. - # Note that these values depends on the local IPs that are - # assigned to the firewall. - # - Address Ignore { - IPv4_address 127.0.0.1 # loopback - IPv4_address 192.168.0.100 # virtual IP 1 - IPv4_address 192.168.1.100 # virtual IP 2 - IPv4_address 192.168.0.1 - IPv4_address 192.168.1.1 - IPv4_address 192.168.100.100 # dedicated link ip - # - # You can also specify networks in format IP/cidr. - # IPv4_address 192.168.0.0/24 - } - - # - # Uncomment this line below if you want to filter by flow state. - # This option introduces a trade-off in the replication: it - # reduces CPU consumption at the cost of having lazy backup - # firewall replicas. The existing TCP states are: SYN_SENT, - # SYN_RECV, ESTABLISHED, FIN_WAIT, CLOSE_WAIT, LAST_ACK, - # TIME_WAIT, CLOSED, LISTEN. - # - # State Accept { - # ESTABLISHED CLOSED TIME_WAIT CLOSE_WAIT for TCP - # } - } -} diff --git a/doc/sync/notrack/conntrackd.conf b/doc/sync/notrack/conntrackd.conf index f8bccc4..34e7b32 100644 --- a/doc/sync/notrack/conntrackd.conf +++ b/doc/sync/notrack/conntrackd.conf @@ -242,6 +242,34 @@ Sync { # # Checksum on # } + + # + # Other unsorted options that are related to the synchronization. + # + # Options { + # + # TCP state-entries have window tracking disabled by default, + # you can enable it with this option. As said, default is off. + # This feature requires a Linux kernel >= 2.6.36. + # + # TCPWindowTracking Off + + # Set this option on if you want to enable the synchronization + # of expectations. You have to specify the list of helpers that + # you want to enable. Default is off. + # + # ExpectationSync { + # ftp + # h323 + # sip + # } + # + # You can use this alternatively: + # + # ExpectationSync On + # + # If you want to synchronize expectations of all helpers. + # } } # @@ -394,7 +422,9 @@ General { TCP SCTP DCCP + # UDP # ICMP # This requires a Linux kernel >= 2.6.31 + # IPv6-ICMP # This requires a Linux kernel >= 2.6.31 } # diff --git a/doc/sync/primary-backup.sh b/doc/sync/primary-backup.sh index 34c1cfa..fb74adc 100755 --- a/doc/sync/primary-backup.sh +++ b/doc/sync/primary-backup.sh @@ -1,9 +1,11 @@ #!/bin/sh -# -# (C) 2008 by Pablo Neira Ayuso <pablo@netfilter.org> # -# This software may be used and distributed according to the terms -# of the GNU General Public License, incorporated herein by reference. +# (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # # Description: # diff --git a/extensions/Makefile.in b/extensions/Makefile.in index ea3b62f..5f01bcf 100644 --- a/extensions/Makefile.in +++ b/extensions/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11 from Makefile.am. +# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -34,7 +34,6 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/Make_global.am subdir = extensions @@ -42,7 +41,7 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -52,6 +51,9 @@ LTLIBRARIES = $(noinst_LTLIBRARIES) libct_proto_dccp_la_LIBADD = am_libct_proto_dccp_la_OBJECTS = libct_proto_dccp.lo libct_proto_dccp_la_OBJECTS = $(am_libct_proto_dccp_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent libct_proto_gre_la_LIBADD = am_libct_proto_gre_la_OBJECTS = libct_proto_gre.lo libct_proto_gre_la_OBJECTS = $(am_libct_proto_gre_la_OBJECTS) @@ -77,18 +79,31 @@ libct_proto_unknown_la_LIBADD = am_libct_proto_unknown_la_OBJECTS = libct_proto_unknown.lo libct_proto_unknown_la_OBJECTS = $(am_libct_proto_unknown_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libct_proto_dccp_la_SOURCES) $(libct_proto_gre_la_SOURCES) \ $(libct_proto_icmp_la_SOURCES) \ $(libct_proto_icmpv6_la_SOURCES) \ @@ -108,6 +123,7 @@ CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -130,7 +146,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAVE_PKG_CONFIG = @HAVE_PKG_CONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -168,14 +183,14 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ -XLEX = @XLEX@ -XYACC = @XYACC@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -226,18 +241,15 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ -target = @target@ target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include +AM_CPPFLAGS = -I$(top_srcdir)/include AM_CFLAGS = -std=gnu99 -W -Wall \ -Wmissing-prototypes -Wwrite-strings -Wcast-qual -Wfloat-equal -Wshadow -Wpointer-arith -Wbad-function-cast -Wsign-compare -Waggregate-return -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wundef \ - -Wno-unused-parameter + -Wno-unused-parameter ${LIBNFNETLINK_CFLAGS} \ + ${LIBNETFILTER_CONNTRACK_CFLAGS} noinst_LTLIBRARIES = libct_proto_tcp.la libct_proto_udp.la \ libct_proto_icmp.la libct_proto_icmpv6.la \ @@ -267,9 +279,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Make_global.am $(am_ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu extensions/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign extensions/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu extensions/Makefile + $(AUTOMAKE) --foreign extensions/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -298,23 +310,23 @@ clean-noinstLTLIBRARIES: rm -f "$${dir}/so_locations"; \ done libct_proto_dccp.la: $(libct_proto_dccp_la_OBJECTS) $(libct_proto_dccp_la_DEPENDENCIES) - $(LINK) $(libct_proto_dccp_la_OBJECTS) $(libct_proto_dccp_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_dccp_la_OBJECTS) $(libct_proto_dccp_la_LIBADD) $(LIBS) libct_proto_gre.la: $(libct_proto_gre_la_OBJECTS) $(libct_proto_gre_la_DEPENDENCIES) - $(LINK) $(libct_proto_gre_la_OBJECTS) $(libct_proto_gre_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_gre_la_OBJECTS) $(libct_proto_gre_la_LIBADD) $(LIBS) libct_proto_icmp.la: $(libct_proto_icmp_la_OBJECTS) $(libct_proto_icmp_la_DEPENDENCIES) - $(LINK) $(libct_proto_icmp_la_OBJECTS) $(libct_proto_icmp_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_icmp_la_OBJECTS) $(libct_proto_icmp_la_LIBADD) $(LIBS) libct_proto_icmpv6.la: $(libct_proto_icmpv6_la_OBJECTS) $(libct_proto_icmpv6_la_DEPENDENCIES) - $(LINK) $(libct_proto_icmpv6_la_OBJECTS) $(libct_proto_icmpv6_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_icmpv6_la_OBJECTS) $(libct_proto_icmpv6_la_LIBADD) $(LIBS) libct_proto_sctp.la: $(libct_proto_sctp_la_OBJECTS) $(libct_proto_sctp_la_DEPENDENCIES) - $(LINK) $(libct_proto_sctp_la_OBJECTS) $(libct_proto_sctp_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_sctp_la_OBJECTS) $(libct_proto_sctp_la_LIBADD) $(LIBS) libct_proto_tcp.la: $(libct_proto_tcp_la_OBJECTS) $(libct_proto_tcp_la_DEPENDENCIES) - $(LINK) $(libct_proto_tcp_la_OBJECTS) $(libct_proto_tcp_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_tcp_la_OBJECTS) $(libct_proto_tcp_la_LIBADD) $(LIBS) libct_proto_udp.la: $(libct_proto_udp_la_OBJECTS) $(libct_proto_udp_la_DEPENDENCIES) - $(LINK) $(libct_proto_udp_la_OBJECTS) $(libct_proto_udp_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_udp_la_OBJECTS) $(libct_proto_udp_la_LIBADD) $(LIBS) libct_proto_udplite.la: $(libct_proto_udplite_la_OBJECTS) $(libct_proto_udplite_la_DEPENDENCIES) - $(LINK) $(libct_proto_udplite_la_OBJECTS) $(libct_proto_udplite_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_udplite_la_OBJECTS) $(libct_proto_udplite_la_LIBADD) $(LIBS) libct_proto_unknown.la: $(libct_proto_unknown_la_OBJECTS) $(libct_proto_unknown_la_DEPENDENCIES) - $(LINK) $(libct_proto_unknown_la_OBJECTS) $(libct_proto_unknown_la_LIBADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(libct_proto_unknown_la_OBJECTS) $(libct_proto_unknown_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -333,22 +345,28 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libct_proto_unknown.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< diff --git a/extensions/libct_proto_tcp.c b/extensions/libct_proto_tcp.c index cb573d0..0b43bf5 100644 --- a/extensions/libct_proto_tcp.c +++ b/extensions/libct_proto_tcp.c @@ -82,7 +82,8 @@ static const char *tcp_states[TCP_CONNTRACK_MAX] = { [TCP_CONNTRACK_LAST_ACK] = "LAST_ACK", [TCP_CONNTRACK_TIME_WAIT] = "TIME_WAIT", [TCP_CONNTRACK_CLOSE] = "CLOSE", - [TCP_CONNTRACK_LISTEN] = "LISTEN" + /* Since Linux kernel 2.6.31, LISTEN is SYN_SENT2. */ + [TCP_CONNTRACK_SYN_SENT2] = "SYN_SENT2" }; static void help(void) @@ -151,7 +152,11 @@ static int parse_options(char c, break; } } - if (i == TCP_CONNTRACK_MAX) + /* For backward compatibility with Linux kernel < 2.6.31. */ + if (strcmp(optarg, "LISTEN") == 0) { + nfct_set_attr_u8(ct, ATTR_TCP_STATE, + TCP_CONNTRACK_LISTEN); + } else if (i == TCP_CONNTRACK_MAX) exit_error(PARAMETER_PROBLEM, "unknown TCP state `%s'", optarg); *flags |= CT_TCP_STATE; diff --git a/include/Makefile.in b/include/Makefile.in index 5a38ca1..edf1d83 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11 from Makefile.am. +# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -34,7 +34,6 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ subdir = include DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -42,12 +41,18 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) @@ -56,6 +61,7 @@ CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -78,7 +84,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAVE_PKG_CONFIG = @HAVE_PKG_CONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -116,14 +121,14 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ -XLEX = @XLEX@ -XYACC = @XYACC@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -174,11 +179,7 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ -target = @target@ target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @@ -201,9 +202,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu include/Makefile + $(AUTOMAKE) --foreign include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ diff --git a/include/cache.h b/include/cache.h index 28917f2..3af2741 100644 --- a/include/cache.h +++ b/include/cache.h @@ -21,13 +21,14 @@ enum { C_OBJ_NONE = 0, /* not in the cache */ C_OBJ_NEW, /* just added to the cache */ C_OBJ_ALIVE, /* in the cache, alive */ - C_OBJ_DEAD /* still in the cache, but dead */ + C_OBJ_DEAD, /* still in the cache, but dead */ + C_OBJ_MAX }; struct cache; struct cache_object { struct hashtable_node hashnode; - struct nf_conntrack *ct; + void *ptr; struct cache *cache; int status; int refcnt; @@ -48,14 +49,23 @@ extern struct cache_feature timer_feature; #define CACHE_MAX_NAMELEN 32 +enum cache_type { + CACHE_T_NONE = 0, + CACHE_T_CT, + CACHE_T_EXP, + CACHE_T_MAX +}; + struct cache { char name[CACHE_MAX_NAMELEN]; + enum cache_type type; struct hashtable *h; unsigned int num_features; struct cache_feature **features; unsigned int feature_type[CACHE_MAX_FEATURE]; unsigned int *feature_offset; + struct cache_ops *ops; struct cache_extra *extra; unsigned int extra_offset; size_t object_size; @@ -94,34 +104,73 @@ struct cache_extra { void (*destroy)(struct cache_object *obj, void *data); }; +struct nfct_handle; + +/* cache options depends on the object type: conntrack or expectation. */ +struct cache_ops { + /* hashing and comparison of objects. */ + uint32_t (*hash)(const void *data, const struct hashtable *table); + int (*cmp)(const void *data1, const void *data2); + + /* object allocation, copy and release. */ + void *(*alloc)(void); + void (*copy)(void *dst, void *src, unsigned int flags); + void (*free)(void *ptr); + + /* dump and commit. */ + int (*dump_step)(void *data1, void *n); + int (*commit)(struct cache *c, struct nfct_handle *h, int clientfd); + + /* build network message from object. */ + struct nethdr *(*build_msg)(const struct cache_object *obj, int type); +}; + +/* templates to configure conntrack caching. */ +extern struct cache_ops cache_sync_internal_ct_ops; +extern struct cache_ops cache_sync_external_ct_ops; +extern struct cache_ops cache_stats_ct_ops; +/* templates to configure expectation caching. */ +extern struct cache_ops cache_sync_internal_exp_ops; +extern struct cache_ops cache_sync_external_exp_ops; + struct nf_conntrack; -struct cache *cache_create(const char *name, unsigned int features, struct cache_extra *extra); +struct cache *cache_create(const char *name, enum cache_type type, unsigned int features, struct cache_extra *extra, struct cache_ops *ops); void cache_destroy(struct cache *e); -struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct); +struct cache_object *cache_object_new(struct cache *c, void *ptr); void cache_object_free(struct cache_object *obj); void cache_object_get(struct cache_object *obj); int cache_object_put(struct cache_object *obj); void cache_object_set_status(struct cache_object *obj, int status); int cache_add(struct cache *c, struct cache_object *obj, int id); -void cache_update(struct cache *c, struct cache_object *obj, int id, struct nf_conntrack *ct); -struct cache_object *cache_update_force(struct cache *c, struct nf_conntrack *ct); +void cache_update(struct cache *c, struct cache_object *obj, int id, void *ptr); +struct cache_object *cache_update_force(struct cache *c, void *ptr); void cache_del(struct cache *c, struct cache_object *obj); -struct cache_object *cache_find(struct cache *c, struct nf_conntrack *ct, int *pos); +struct cache_object *cache_find(struct cache *c, void *ptr, int *pos); void cache_stats(const struct cache *c, int fd); void cache_stats_extended(const struct cache *c, int fd); -struct cache_object *cache_data_get_object(struct cache *c, void *data); -void *cache_get_extra(struct cache *, void *); +void *cache_get_extra(struct cache_object *); void cache_iterate(struct cache *c, void *data, int (*iterate)(void *data1, void *data2)); void cache_iterate_limit(struct cache *c, void *data, uint32_t from, uint32_t steps, int (*iterate)(void *data1, void *data2)); /* iterators */ struct nfct_handle; +struct __dump_container { + int fd; + int type; +}; + void cache_dump(struct cache *c, int fd, int type); -void cache_commit(struct cache *c, struct nfct_handle *h, int clientfd); + +struct __commit_container { + struct nfct_handle *h; + struct cache *c; +}; + +int cache_commit(struct cache *c, struct nfct_handle *h, int clientfd); void cache_flush(struct cache *c); void cache_bulk(struct cache *c); diff --git a/include/conntrack.h b/include/conntrack.h index 61e7581..3882de7 100644 --- a/include/conntrack.h +++ b/include/conntrack.h @@ -9,149 +9,8 @@ #include <netinet/in.h> -enum action { - CT_NONE = 0, - - CT_LIST_BIT = 0, - CT_LIST = (1 << CT_LIST_BIT), - - CT_CREATE_BIT = 1, - CT_CREATE = (1 << CT_CREATE_BIT), - - CT_UPDATE_BIT = 2, - CT_UPDATE = (1 << CT_UPDATE_BIT), - - CT_DELETE_BIT = 3, - CT_DELETE = (1 << CT_DELETE_BIT), - - CT_GET_BIT = 4, - CT_GET = (1 << CT_GET_BIT), - - CT_FLUSH_BIT = 5, - CT_FLUSH = (1 << CT_FLUSH_BIT), - - CT_EVENT_BIT = 6, - CT_EVENT = (1 << CT_EVENT_BIT), - - CT_VERSION_BIT = 7, - CT_VERSION = (1 << CT_VERSION_BIT), - - CT_HELP_BIT = 8, - CT_HELP = (1 << CT_HELP_BIT), - - EXP_LIST_BIT = 9, - EXP_LIST = (1 << EXP_LIST_BIT), - - EXP_CREATE_BIT = 10, - EXP_CREATE = (1 << EXP_CREATE_BIT), - - EXP_DELETE_BIT = 11, - EXP_DELETE = (1 << EXP_DELETE_BIT), - - EXP_GET_BIT = 12, - EXP_GET = (1 << EXP_GET_BIT), - - EXP_FLUSH_BIT = 13, - EXP_FLUSH = (1 << EXP_FLUSH_BIT), - - EXP_EVENT_BIT = 14, - EXP_EVENT = (1 << EXP_EVENT_BIT), - - CT_COUNT_BIT = 15, - CT_COUNT = (1 << CT_COUNT_BIT), - - EXP_COUNT_BIT = 16, - EXP_COUNT = (1 << EXP_COUNT_BIT), - - X_STATS_BIT = 17, - X_STATS = (1 << X_STATS_BIT), -}; #define NUMBER_OF_CMD 18 - -enum options { - CT_OPT_ORIG_SRC_BIT = 0, - CT_OPT_ORIG_SRC = (1 << CT_OPT_ORIG_SRC_BIT), - - CT_OPT_ORIG_DST_BIT = 1, - CT_OPT_ORIG_DST = (1 << CT_OPT_ORIG_DST_BIT), - - CT_OPT_ORIG = (CT_OPT_ORIG_SRC | CT_OPT_ORIG_DST), - - CT_OPT_REPL_SRC_BIT = 2, - CT_OPT_REPL_SRC = (1 << CT_OPT_REPL_SRC_BIT), - - CT_OPT_REPL_DST_BIT = 3, - CT_OPT_REPL_DST = (1 << CT_OPT_REPL_DST_BIT), - - CT_OPT_REPL = (CT_OPT_REPL_SRC | CT_OPT_REPL_DST), - - CT_OPT_PROTO_BIT = 4, - CT_OPT_PROTO = (1 << CT_OPT_PROTO_BIT), - - CT_OPT_TUPLE_ORIG = (CT_OPT_ORIG | CT_OPT_PROTO), - CT_OPT_TUPLE_REPL = (CT_OPT_REPL | CT_OPT_PROTO), - - CT_OPT_TIMEOUT_BIT = 5, - CT_OPT_TIMEOUT = (1 << CT_OPT_TIMEOUT_BIT), - - CT_OPT_STATUS_BIT = 6, - CT_OPT_STATUS = (1 << CT_OPT_STATUS_BIT), - - CT_OPT_ZERO_BIT = 7, - CT_OPT_ZERO = (1 << CT_OPT_ZERO_BIT), - - CT_OPT_EVENT_MASK_BIT = 8, - CT_OPT_EVENT_MASK = (1 << CT_OPT_EVENT_MASK_BIT), - - CT_OPT_EXP_SRC_BIT = 9, - CT_OPT_EXP_SRC = (1 << CT_OPT_EXP_SRC_BIT), - - CT_OPT_EXP_DST_BIT = 10, - CT_OPT_EXP_DST = (1 << CT_OPT_EXP_DST_BIT), - - CT_OPT_MASK_SRC_BIT = 11, - CT_OPT_MASK_SRC = (1 << CT_OPT_MASK_SRC_BIT), - - CT_OPT_MASK_DST_BIT = 12, - CT_OPT_MASK_DST = (1 << CT_OPT_MASK_DST_BIT), - - CT_OPT_NATRANGE_BIT = 13, - CT_OPT_NATRANGE = (1 << CT_OPT_NATRANGE_BIT), - - CT_OPT_MARK_BIT = 14, - CT_OPT_MARK = (1 << CT_OPT_MARK_BIT), - - CT_OPT_ID_BIT = 15, - CT_OPT_ID = (1 << CT_OPT_ID_BIT), - - CT_OPT_FAMILY_BIT = 16, - CT_OPT_FAMILY = (1 << CT_OPT_FAMILY_BIT), - - CT_OPT_SRC_NAT_BIT = 17, - CT_OPT_SRC_NAT = (1 << CT_OPT_SRC_NAT_BIT), - - CT_OPT_DST_NAT_BIT = 18, - CT_OPT_DST_NAT = (1 << CT_OPT_DST_NAT_BIT), - - CT_OPT_OUTPUT_BIT = 19, - CT_OPT_OUTPUT = (1 << CT_OPT_OUTPUT_BIT), - - CT_OPT_SECMARK_BIT = 20, - CT_OPT_SECMARK = (1 << CT_OPT_SECMARK_BIT), - - CT_OPT_BUFFERSIZE_BIT = 21, - CT_OPT_BUFFERSIZE = (1 << CT_OPT_BUFFERSIZE_BIT), - - CT_OPT_MAX = CT_OPT_BUFFERSIZE_BIT -}; -#define NUMBER_OF_OPT CT_OPT_MAX+1 - -enum { - _O_XML = (1 << 0), - _O_EXT = (1 << 1), - _O_TMS = (1 << 2), - _O_ID = (1 << 3), -}; +#define NUMBER_OF_OPT 24 struct ctproto_handler { struct list_head head; diff --git a/include/conntrackd.h b/include/conntrackd.h index c7f33f0..8baa088 100644 --- a/include/conntrackd.h +++ b/include/conntrackd.h @@ -14,29 +14,39 @@ #include <syslog.h> /* UNIX facilities */ -#define FLUSH_MASTER 0 /* flush kernel conntrack table */ -#define RESYNC_MASTER 1 /* resync with kernel conntrack table */ -#define DUMP_INTERNAL 16 /* dump internal cache */ -#define DUMP_EXTERNAL 17 /* dump external cache */ -#define COMMIT 18 /* commit external cache */ -#define FLUSH_CACHE 19 /* flush cache */ -#define KILL 20 /* kill conntrackd */ -#define STATS 21 /* dump statistics */ -#define SEND_BULK 22 /* send a bulk */ -#define REQUEST_DUMP 23 /* request dump */ -#define DUMP_INT_XML 24 /* dump internal cache in XML */ -#define DUMP_EXT_XML 25 /* dump external cache in XML */ -#define RESET_TIMERS 26 /* reset kernel timers */ -#define DEBUG_INFO 27 /* unused */ -#define STATS_NETWORK 28 /* extended network stats */ -#define STATS_CACHE 29 /* extended cache stats */ -#define STATS_RUNTIME 30 /* extended runtime stats */ -#define STATS_LINK 31 /* dedicated link stats */ -#define STATS_RSQUEUE 32 /* resend queue stats */ -#define FLUSH_INT_CACHE 33 /* flush internal cache */ -#define FLUSH_EXT_CACHE 34 /* flush external cache */ -#define STATS_PROCESS 35 /* child process stats */ -#define STATS_QUEUE 36 /* queue stats */ +#define CT_FLUSH_MASTER 0 /* flush kernel conntrack table */ +#define CT_RESYNC_MASTER 1 /* resync with kernel ct table */ +#define CT_DUMP_INTERNAL 16 /* dump internal cache */ +#define CT_DUMP_EXTERNAL 17 /* dump external cache */ +#define CT_COMMIT 18 /* commit external cache */ +#define CT_FLUSH_CACHE 19 /* flush cache */ +#define KILL 20 /* kill conntrackd */ +#define STATS 21 /* dump statistics */ +#define SEND_BULK 22 /* send a bulk */ +#define REQUEST_DUMP 23 /* request dump */ +#define CT_DUMP_INT_XML 24 /* dump internal cache in XML */ +#define CT_DUMP_EXT_XML 25 /* dump external cache in XML */ +#define RESET_TIMERS 26 /* reset kernel timers */ +#define DEBUG_INFO 27 /* unused */ +#define STATS_NETWORK 28 /* extended network stats */ +#define STATS_CACHE 29 /* extended cache stats */ +#define STATS_RUNTIME 30 /* extended runtime stats */ +#define STATS_LINK 31 /* dedicated link stats */ +#define STATS_RSQUEUE 32 /* resend queue stats */ +#define CT_FLUSH_INT_CACHE 33 /* flush internal cache */ +#define CT_FLUSH_EXT_CACHE 34 /* flush external cache */ +#define STATS_PROCESS 35 /* child process stats */ +#define STATS_QUEUE 36 /* queue stats */ +#define EXP_STATS 37 /* dump statistics */ +#define EXP_FLUSH_MASTER 38 /* flush kernel expect table */ +#define EXP_RESYNC_MASTER 39 /* resync with kernel exp table */ +#define EXP_DUMP_INTERNAL 40 /* dump internal expect cache */ +#define EXP_DUMP_EXTERNAL 41 /* dump external expect cache */ +#define EXP_COMMIT 42 /* commit expectations */ +#define ALL_FLUSH_MASTER 43 /* flush all kernel tables */ +#define ALL_RESYNC_MASTER 44 /* resync w/all kernel tables */ +#define ALL_FLUSH_CACHE 45 /* flush all caches */ +#define ALL_COMMIT 46 /* commit all tables */ #define DEFAULT_CONFIGFILE "/etc/conntrackd/conntrackd.conf" #define DEFAULT_LOCKFILE "/var/lock/conntrackd.lock" @@ -56,6 +66,7 @@ #define CTD_SYNC_ALARM (1UL << 3) #define CTD_SYNC_NOTRACK (1UL << 4) #define CTD_POLL (1UL << 5) +#define CTD_EXPECT (1UL << 6) /* FILENAME_MAX is 4096 on my system, perhaps too much? */ #ifndef FILENAME_MAXLEN @@ -102,8 +113,11 @@ struct ct_conf { struct { int internal_cache_disable; int external_cache_disable; + int tcp_window_tracking; } sync; struct { + int subsys_id; + int groups; int events_reliable; } netlink; struct { @@ -129,6 +143,7 @@ struct ct_general_state { struct local_server local; struct ct_mode *mode; struct ct_filter *us_filter; + struct exp_filter *exp_filter; struct nfct_handle *event; /* event handler */ struct nfct_filter *filter; /* event filter */ @@ -176,6 +191,10 @@ struct ct_general_state { } stats; }; +struct commit_runqueue { + int (*cb)(struct nfct_handle *h, int step); +}; + #define STATE_SYNC(x) state.sync->x struct ct_sync_state { @@ -195,6 +214,7 @@ struct ct_sync_state { struct nfct_handle *h; struct evfd *evfd; int current; + struct commit_runqueue rq[2]; struct { int ok; int fail; diff --git a/include/external.h b/include/external.h index 938941a..70f0c5c 100644 --- a/include/external.h +++ b/include/external.h @@ -7,15 +7,28 @@ struct external_handler { int (*init)(void); void (*close)(void); - void (*new)(struct nf_conntrack *ct); - void (*update)(struct nf_conntrack *ct); - void (*destroy)(struct nf_conntrack *ct); + struct { + void (*new)(struct nf_conntrack *ct); + void (*upd)(struct nf_conntrack *ct); + void (*del)(struct nf_conntrack *ct); - void (*dump)(int fd, int type); - void (*flush)(void); - void (*commit)(struct nfct_handle *h, int fd); - void (*stats)(int fd); - void (*stats_ext)(int fd); + void (*dump)(int fd, int type); + void (*flush)(void); + int (*commit)(struct nfct_handle *h, int fd); + void (*stats)(int fd); + void (*stats_ext)(int fd); + } ct; + struct { + void (*new)(struct nf_expect *exp); + void (*upd)(struct nf_expect *exp); + void (*del)(struct nf_expect *exp); + + void (*dump)(int fd, int type); + void (*flush)(void); + int (*commit)(struct nfct_handle *h, int fd); + void (*stats)(int fd); + void (*stats_ext)(int fd); + } exp; }; extern struct external_handler external_cache; diff --git a/include/filter.h b/include/filter.h index 72c2aa4..3c7c8cc 100644 --- a/include/filter.h +++ b/include/filter.h @@ -50,6 +50,13 @@ void ct_filter_add_state(struct ct_filter *f, int protonum, int state); void ct_filter_set_logic(struct ct_filter *f, enum ct_filter_type type, enum ct_filter_logic logic); -int ct_filter_conntrack(struct nf_conntrack *ct, int userspace); +int ct_filter_conntrack(const struct nf_conntrack *ct, int userspace); + +struct exp_filter; +struct nf_expect; + +struct exp_filter *exp_filter_create(void); +int exp_filter_add(struct exp_filter *f, const char *helper_name); +int exp_filter_find(struct exp_filter *f, const struct nf_expect *exp); #endif diff --git a/include/internal.h b/include/internal.h index 1f11340..2ba9714 100644 --- a/include/internal.h +++ b/include/internal.h @@ -12,25 +12,45 @@ enum { }; struct internal_handler { - void *data; unsigned int flags; int (*init)(void); void (*close)(void); - void (*new)(struct nf_conntrack *ct, int origin_type); - void (*update)(struct nf_conntrack *ct, int origin_type); - int (*destroy)(struct nf_conntrack *ct, int origin_type); - - void (*dump)(int fd, int type); - void (*populate)(struct nf_conntrack *ct); - void (*purge)(void); - int (*resync)(enum nf_conntrack_msg_type type, - struct nf_conntrack *ct, void *data); - void (*flush)(void); - - void (*stats)(int fd); - void (*stats_ext)(int fd); + struct { + void *data; + + void (*new)(struct nf_conntrack *ct, int origin_type); + void (*upd)(struct nf_conntrack *ct, int origin_type); + int (*del)(struct nf_conntrack *ct, int origin_type); + + void (*dump)(int fd, int type); + void (*populate)(struct nf_conntrack *ct); + void (*purge)(void); + int (*resync)(enum nf_conntrack_msg_type type, + struct nf_conntrack *ct, void *data); + void (*flush)(void); + + void (*stats)(int fd); + void (*stats_ext)(int fd); + } ct; + struct { + void *data; + + void (*new)(struct nf_expect *exp, int origin_type); + void (*upd)(struct nf_expect *exp, int origin_type); + int (*del)(struct nf_expect *exp, int origin_type); + + void (*dump)(int fd, int type); + void (*populate)(struct nf_expect *exp); + void (*purge)(void); + int (*resync)(enum nf_conntrack_msg_type type, + struct nf_expect *exp, void *data); + void (*flush)(void); + + void (*stats)(int fd); + void (*stats_ext)(int fd); + } exp; }; extern struct internal_handler internal_cache; diff --git a/include/log.h b/include/log.h index f5c5b4f..ae58e79 100644 --- a/include/log.h +++ b/include/log.h @@ -4,10 +4,12 @@ #include <stdio.h> struct nf_conntrack; +struct nf_expect; int init_log(void); void dlog(int priority, const char *format, ...); void dlog_ct(FILE *fd, struct nf_conntrack *ct, unsigned int type); +void dlog_exp(FILE *fd, struct nf_expect *exp, unsigned int type); void close_log(void); #endif diff --git a/include/netlink.h b/include/netlink.h index 0df0cbb..3bde30c 100644 --- a/include/netlink.h +++ b/include/netlink.h @@ -30,4 +30,11 @@ static inline int ct_is_related(const struct nf_conntrack *ct) nfct_attr_is_set(ct, ATTR_MASTER_PORT_DST)); } +int nl_create_expect(struct nfct_handle *h, const struct nf_expect *orig, int timeout); +int nl_destroy_expect(struct nfct_handle *h, const struct nf_expect *exp); +int nl_get_expect(struct nfct_handle *h, const struct nf_expect *exp); +int nl_dump_expect_table(struct nfct_handle *h); +int nl_flush_expect_table(struct nfct_handle *h); +int nl_send_expect_resync(struct nfct_handle *h); + #endif diff --git a/include/network.h b/include/network.h index 70812b1..ab95499 100644 --- a/include/network.h +++ b/include/network.h @@ -4,9 +4,10 @@ #include <stdint.h> #include <sys/types.h> -#define CONNTRACKD_PROTOCOL_VERSION 0 +#define CONNTRACKD_PROTOCOL_VERSION 1 struct nf_conntrack; +struct nf_expect; struct nethdr { #if __BYTE_ORDER == __LITTLE_ENDIAN @@ -25,10 +26,13 @@ struct nethdr { #define NETHDR_SIZ nethdr_align(sizeof(struct nethdr)) enum nethdr_type { - NET_T_STATE_NEW = 0, - NET_T_STATE_UPD, - NET_T_STATE_DEL, - NET_T_STATE_MAX = NET_T_STATE_DEL, + NET_T_STATE_CT_NEW = 0, + NET_T_STATE_CT_UPD, + NET_T_STATE_CT_DEL, + NET_T_STATE_EXP_NEW = 3, + NET_T_STATE_EXP_UPD, + NET_T_STATE_EXP_DEL, + NET_T_STATE_MAX = NET_T_STATE_EXP_DEL, NET_T_CTL = 10, }; @@ -37,7 +41,9 @@ int nethdr_size(int len); void nethdr_set(struct nethdr *net, int type); void nethdr_set_ack(struct nethdr *net); void nethdr_set_ctl(struct nethdr *net); -int object_status_to_network_type(int status); + +struct cache_object; +int object_status_to_network_type(struct cache_object *obj); #define NETHDR_DATA(x) \ (struct netattr *)(((char *)x) + NETHDR_SIZ) @@ -79,13 +85,24 @@ enum { MSG_BAD, }; -#define BUILD_NETMSG(ct, query) \ +#define BUILD_NETMSG_FROM_CT(ct, query) \ ({ \ static char __net[4096]; \ struct nethdr *__hdr = (struct nethdr *) __net; \ memset(__hdr, 0, NETHDR_SIZ); \ nethdr_set(__hdr, query); \ - build_payload(ct, __hdr); \ + ct2msg(ct, __hdr); \ + HDR_HOST2NETWORK(__hdr); \ + __hdr; \ +}) + +#define BUILD_NETMSG_FROM_EXP(exp, query) \ +({ \ + static char __net[4096]; \ + struct nethdr *__hdr = (struct nethdr *) __net; \ + memset(__hdr, 0, NETHDR_SIZ); \ + nethdr_set(__hdr, query); \ + exp2msg(exp, __hdr); \ HDR_HOST2NETWORK(__hdr); \ __hdr; \ }) @@ -220,6 +237,8 @@ enum nta_attr { NTA_ICMP_TYPE, /* uint8_t */ NTA_ICMP_CODE, /* uint8_t */ NTA_ICMP_ID, /* uint16_t */ + NTA_TCP_WSCALE_ORIG, /* uint8_t */ + NTA_TCP_WSCALE_REPL, /* uint8_t */ NTA_MAX }; @@ -232,8 +251,28 @@ struct nta_attr_natseqadj { uint32_t repl_seq_offset_after; }; -void build_payload(const struct nf_conntrack *ct, struct nethdr *n); +void ct2msg(const struct nf_conntrack *ct, struct nethdr *n); +int msg2ct(struct nf_conntrack *ct, struct nethdr *n, size_t remain); + +enum nta_exp_attr { + NTA_EXP_MASTER_IPV4 = 0, /* struct nfct_attr_grp_ipv4 */ + NTA_EXP_MASTER_IPV6, /* struct nfct_attr_grp_ipv6 */ + NTA_EXP_MASTER_L4PROTO, /* uint8_t */ + NTA_EXP_MASTER_PORT, /* struct nfct_attr_grp_port */ + NTA_EXP_EXPECT_IPV4 = 4, /* struct nfct_attr_grp_ipv4 */ + NTA_EXP_EXPECT_IPV6, /* struct nfct_attr_grp_ipv6 */ + NTA_EXP_EXPECT_L4PROTO, /* uint8_t */ + NTA_EXP_EXPECT_PORT, /* struct nfct_attr_grp_port */ + NTA_EXP_MASK_IPV4 = 8, /* struct nfct_attr_grp_ipv4 */ + NTA_EXP_MASK_IPV6, /* struct nfct_attr_grp_ipv6 */ + NTA_EXP_MASK_L4PROTO, /* uint8_t */ + NTA_EXP_MASK_PORT, /* struct nfct_attr_grp_port */ + NTA_EXP_TIMEOUT, /* uint32_t */ + NTA_EXP_FLAGS, /* uint32_t */ + NTA_EXP_MAX +}; -int parse_payload(struct nf_conntrack *ct, struct nethdr *n, size_t remain); +void exp2msg(const struct nf_expect *exp, struct nethdr *n); +int msg2exp(struct nf_expect *exp, struct nethdr *n, size_t remain); #endif diff --git a/qa/test-conntrack.c b/qa/test-conntrack.c new file mode 100644 index 0000000..c9097b6 --- /dev/null +++ b/qa/test-conntrack.c @@ -0,0 +1,94 @@ +/* + * Very simple test-tool for the command line tool `conntrack'. + * This code is released under GPLv2 or any later at your option. + * + * gcc test-conntrack.c -o test + * + * Do not forget that you need *root* or CAP_NET_ADMIN capabilities ;-) + * + * (c) 2008 Pablo Neira Ayuso <pablo@netfilter.org> + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <dirent.h> + +#define CT_PROG "/usr/sbin/conntrack" + +int main() +{ + int ret, ok = 0, bad = 0, line; + FILE *fp; + DIR *d; + char buf[1024]; + struct dirent *dent; + char file[1024]; + + d = opendir("testsuite"); + + while ((dent = readdir(d)) != NULL) { + + sprintf(file, "testsuite/%s", dent->d_name); + + line = 0; + + fp = fopen(file, "r"); + if (fp == NULL) { + perror("cannot find testsuite file"); + exit(EXIT_FAILURE); + } + + while (fgets(buf, sizeof(buf), fp)) { + char tmp[1024] = CT_PROG, *res; + tmp[strlen(CT_PROG)] = ' '; + + line++; + + if (buf[0] == '#' || buf[0] == ' ') + continue; + + res = strchr(buf, ';'); + if (!res) { + printf("malformed file %s at line %d\n", + dent->d_name, line); + exit(EXIT_FAILURE); + } + *res = '\0'; + res+=2; + + strcpy(tmp + strlen(CT_PROG) + 1, buf); + printf("(%d) Executing: %s\n", line, tmp); + + ret = system(tmp); + + if (WIFEXITED(ret) && + WEXITSTATUS(ret) == EXIT_SUCCESS) { + if (res[0] == 'O' && + res[1] == 'K') + ok++; + else { + bad++; + printf("^----- BAD\n"); + } + } else { + if (res[0] == 'B' && + res[1] == 'A' && + res[2] == 'D') + ok++; + else { + bad++; + printf("^----- BAD\n"); + } + } + printf("=====\n"); + } + fclose(fp); + } + closedir(d); + + fprintf(stdout, "OK: %d BAD: %d\n", ok, bad); +} diff --git a/qa/testsuite/00create b/qa/testsuite/00create new file mode 100644 index 0000000..40e2c19 --- /dev/null +++ b/qa/testsuite/00create @@ -0,0 +1,20 @@ +#missing destination +-I -s 1.1.1.1 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; BAD +#missing source +-I -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; BAD +#missing protocol +-I -s 1.1.1.1 -d 2.2.2.2 --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; BAD +#missing source port +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; BAD +#missing timeout +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY ; BAD +# create a conntrack +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; OK +# create again +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; BAD +# delete +-D -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 ; OK +# create from reply +-I -r 2.2.2.2 -q 1.1.1.1 -p tcp --reply-port-src 11 --reply-port-dst 21 --state LISTEN -u SEEN_REPLY -t 50 ; OK +# delete reverse +-D -r 2.2.2.2 -q 1.1.1.1 -p tcp --reply-port-src 11 --reply-port-dst 21 ; OK diff --git a/qa/testsuite/01delete b/qa/testsuite/01delete new file mode 100644 index 0000000..3c38ac5 --- /dev/null +++ b/qa/testsuite/01delete @@ -0,0 +1,6 @@ +# create dummy +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; OK +# delete bad source +-D -s 2.2.2.2 -p tcp --sport 10 --dport 20 ; BAD +# delete by source +-D -s 1.1.1.1 ; OK diff --git a/qa/testsuite/02filter b/qa/testsuite/02filter new file mode 100644 index 0000000..204c4e8 --- /dev/null +++ b/qa/testsuite/02filter @@ -0,0 +1,23 @@ +# create dummy +conntrack -I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; OK +# filter by source +conntrack -L -s 1.1.1.1 ; OK +# filter by destination +conntrack -L -d 2.2.2.2 ; OK +# filter by protocol +conntrack -L -p tcp ; OK +# filter by status +conntrack -L -u SEEN_REPLY ; OK +# filter by TCP protocol state +conntrack -L -p tcp --state LISTEN ; OK +# update mark of dummy conntrack +conntrack -U -s 1.1.1.1 -m 1 ; OK +# filter by mark +conntrack -L -m 1 ; OK +# filter by layer 3 protocol +conntrack -L -f ipv4 ; OK +# filter by mark +conntrack -L --mark 0 ; OK +conntrack -L --mark 0/0xffffffff; OK +# delete dummy +conntrack -D -d 2.2.2.2 ; OK diff --git a/qa/testsuite/03nat b/qa/testsuite/03nat new file mode 100644 index 0000000..f94e8ff --- /dev/null +++ b/qa/testsuite/03nat @@ -0,0 +1,40 @@ +# create dummy +-I -s 1.1.1.1 -d 2.2.2.2 --dst-nat 3.3.3.3 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; OK +# show +-L --dst-nat ; OK +# show +-L --dst-nat 3.3.3.3 ; OK +# show +-L --src-nat ; OK +# delete +-D -s 1.1.1.1 ; OK +# create dummy again +-I -s 1.1.1.1 -d 2.2.2.2 --src-nat 3.3.3.3 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; OK +# show +-L --src-nat ; OK +# show +-L --src-nat 3.3.3.3 ; OK +# show +-L --dst-nat ; OK +# show any-nat +-L --any-nat ; OK +# delete +-D -s 1.1.1.1 ; OK +# bad combination +-L --dst-nat --any-nat ; BAD +# bad combination +-L --src-nat --any-nat ; BAD +# bad combination +-L --src-nat --dst-nat --any-nat ; BAD +# create +-I -s 1.1.1.1 -d 2.2.2.2 --dst-nat 3.3.3.3:80 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 ; OK +# show +-L --dst-nat 3.3.3.3:80 ; OK +# show +-L --any-nat 3.3.3.3:80 ; OK +# show +-L --dst-nat 3.3.3.3:81 ; OK +# show +-L --dst-nat 1.1.1.1:80 ; OK +# delete +-D -s 1.1.1.1 ; OK diff --git a/qa/testsuite/04zone b/qa/testsuite/04zone new file mode 100644 index 0000000..4ff3d34 --- /dev/null +++ b/qa/testsuite/04zone @@ -0,0 +1,8 @@ +# create dummy +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 --zone 1; OK +# display dummy +-L --zone 1; OK +# display dummy +-L --zone 0; OK +# delete dummy +-D --zone 1; OK diff --git a/qa/testsuite/05mark b/qa/testsuite/05mark new file mode 100644 index 0000000..4d99dea --- /dev/null +++ b/qa/testsuite/05mark @@ -0,0 +1,27 @@ +# create with a mark +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 --mark 42 ; OK +# find it again using mark +-L -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 42 ; OK +-L --mark 42; OK +# ct already exists +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 --mark 42/0xffffffff ; BAD +# delete by mark +-D -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 42/0xffffffff ; OK +# try again after del +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 --mark 417889/0xffffffff ; OK +# delete by mark +-D --mark 417889 ; OK +-I -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --state LISTEN -u SEEN_REPLY -t 50 --mark 0xffffffff ; OK +# zap top 16. +-U -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 0/0xffff0000 ; OK +-L -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 0x0000ffff ; OK +-U -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 42/0xffff ; OK +-L -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 42/0x0000ffff ; OK +-L -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 42/42 ; OK +-L -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 2/2 ; OK +-L -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 2/3 ; OK +# OK, but no flow entries should be shown here: +-L -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 2/0xf ; OK +# BAD, because no updates done (mark is already 42). +-U -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 42 ; BAD +-D -s 1.1.1.1 -d 2.2.2.2 -p tcp --sport 10 --dport 20 --mark 42 ; OK diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..6e6763d --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,6 @@ +/conntrack +/conntrackd + +/read_config_lex.c +/read_config_yy.c +/read_config_yy.h diff --git a/src/Makefile.am b/src/Makefile.am index 76f0e73..7d7b2ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,19 +1,18 @@ include $(top_srcdir)/Make_global.am -YACC=@YACC@ -d +AM_YFLAGS = -d CLEANFILES = read_config_yy.c read_config_lex.c sbin_PROGRAMS = conntrack conntrackd conntrack_SOURCES = conntrack.c -conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la -conntrack_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la ${LIBNETFILTER_CONNTRACK_LIBS} conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \ local.c log.c mcast.c udp.c netlink.c vector.c \ filter.c fds.c event.c process.c origin.c date.c \ - cache.c cache_iterators.c \ + cache.c cache-ct.c cache-exp.c \ cache_timer.c \ sync-mode.c sync-alarm.c sync-ftfw.c sync-notrack.c \ traffic_stats.c stats-mode.c \ @@ -22,12 +21,12 @@ conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \ channel.c multichannel.c channel_mcast.c channel_udp.c \ tcp.c channel_tcp.c \ external_cache.c external_inject.c \ - internal_cache.c internal_bypass.c \ + internal_cache.c internal_bypass.c \ read_config_yy.y read_config_lex.l # yacc and lex generate dirty code read_config_yy.o read_config_lex.o: AM_CFLAGS += -Wno-missing-prototypes -Wno-missing-declarations -Wno-implicit-function-declaration -Wno-nested-externs -Wno-undef -Wno-redundant-decls -conntrackd_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrackd_LDADD = ${LIBNETFILTER_CONNTRACK_LIBS} EXTRA_DIST = read_config_yy.h diff --git a/src/Makefile.in b/src/Makefile.in index 94c36c3..571a811 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.11 from Makefile.am. +# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, @@ -34,17 +34,16 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -target_triplet = @target@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/Make_global.am read_config_lex.c \ - read_config_yy.c + read_config_yy.c read_config_yy.h sbin_PROGRAMS = conntrack$(EXEEXT) conntrackd$(EXEEXT) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ - $(top_srcdir)/configure.in + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -54,6 +53,7 @@ am__installdirs = "$(DESTDIR)$(sbindir)" PROGRAMS = $(sbin_PROGRAMS) am_conntrack_OBJECTS = conntrack.$(OBJEXT) conntrack_OBJECTS = $(am_conntrack_OBJECTS) +am__DEPENDENCIES_1 = conntrack_DEPENDENCIES = ../extensions/libct_proto_tcp.la \ ../extensions/libct_proto_udp.la \ ../extensions/libct_proto_udplite.la \ @@ -62,17 +62,17 @@ conntrack_DEPENDENCIES = ../extensions/libct_proto_tcp.la \ ../extensions/libct_proto_sctp.la \ ../extensions/libct_proto_dccp.la \ ../extensions/libct_proto_gre.la \ - ../extensions/libct_proto_unknown.la -conntrack_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(conntrack_LDFLAGS) $(LDFLAGS) -o $@ + ../extensions/libct_proto_unknown.la $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent am_conntrackd_OBJECTS = alarm.$(OBJEXT) main.$(OBJEXT) run.$(OBJEXT) \ hash.$(OBJEXT) queue.$(OBJEXT) rbtree.$(OBJEXT) \ local.$(OBJEXT) log.$(OBJEXT) mcast.$(OBJEXT) udp.$(OBJEXT) \ netlink.$(OBJEXT) vector.$(OBJEXT) filter.$(OBJEXT) \ fds.$(OBJEXT) event.$(OBJEXT) process.$(OBJEXT) \ origin.$(OBJEXT) date.$(OBJEXT) cache.$(OBJEXT) \ - cache_iterators.$(OBJEXT) cache_timer.$(OBJEXT) \ + cache-ct.$(OBJEXT) cache-exp.$(OBJEXT) cache_timer.$(OBJEXT) \ sync-mode.$(OBJEXT) sync-alarm.$(OBJEXT) sync-ftfw.$(OBJEXT) \ sync-notrack.$(OBJEXT) traffic_stats.$(OBJEXT) \ stats-mode.$(OBJEXT) network.$(OBJEXT) cidr.$(OBJEXT) \ @@ -83,30 +83,46 @@ am_conntrackd_OBJECTS = alarm.$(OBJEXT) main.$(OBJEXT) run.$(OBJEXT) \ internal_cache.$(OBJEXT) internal_bypass.$(OBJEXT) \ read_config_yy.$(OBJEXT) read_config_lex.$(OBJEXT) conntrackd_OBJECTS = $(am_conntrackd_OBJECTS) -conntrackd_LDADD = $(LDADD) -conntrackd_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(conntrackd_LDFLAGS) $(LDFLAGS) -o $@ +conntrackd_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ -depcomp = $(SHELL) $(top_srcdir)/depcomp +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) -YLWRAP = $(top_srcdir)/ylwrap +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +AM_V_LEX = $(am__v_LEX_$(V)) +am__v_LEX_ = $(am__v_LEX_$(AM_DEFAULT_VERBOSITY)) +am__v_LEX_0 = @echo " LEX " $@; +YLWRAP = $(top_srcdir)/build-aux/ylwrap YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +AM_V_YACC = $(am__v_YACC_$(V)) +am__v_YACC_ = $(am__v_YACC_$(AM_DEFAULT_VERBOSITY)) +am__v_YACC_0 = @echo " YACC " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(conntrack_SOURCES) $(conntrackd_SOURCES) DIST_SOURCES = $(conntrack_SOURCES) $(conntrackd_SOURCES) ETAGS = etags @@ -114,6 +130,7 @@ CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -136,7 +153,6 @@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ -HAVE_PKG_CONFIG = @HAVE_PKG_CONFIG@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -174,15 +190,15 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ -XLEX = @XLEX@ -XYACC = @XYACC@ -YACC = @YACC@ -d +YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -232,27 +248,24 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ -target = @target@ target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include +AM_CPPFLAGS = -I$(top_srcdir)/include AM_CFLAGS = -std=gnu99 -W -Wall \ -Wmissing-prototypes -Wwrite-strings -Wcast-qual -Wfloat-equal -Wshadow -Wpointer-arith -Wbad-function-cast -Wsign-compare -Waggregate-return -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wundef \ - -Wno-unused-parameter + -Wno-unused-parameter ${LIBNFNETLINK_CFLAGS} \ + ${LIBNETFILTER_CONNTRACK_CFLAGS} +AM_YFLAGS = -d CLEANFILES = read_config_yy.c read_config_lex.c conntrack_SOURCES = conntrack.c -conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la -conntrack_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrack_LDADD = ../extensions/libct_proto_tcp.la ../extensions/libct_proto_udp.la ../extensions/libct_proto_udplite.la ../extensions/libct_proto_icmp.la ../extensions/libct_proto_icmpv6.la ../extensions/libct_proto_sctp.la ../extensions/libct_proto_dccp.la ../extensions/libct_proto_gre.la ../extensions/libct_proto_unknown.la ${LIBNETFILTER_CONNTRACK_LIBS} conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \ local.c log.c mcast.c udp.c netlink.c vector.c \ filter.c fds.c event.c process.c origin.c date.c \ - cache.c cache_iterators.c \ + cache.c cache-ct.c cache-exp.c \ cache_timer.c \ sync-mode.c sync-alarm.c sync-ftfw.c sync-notrack.c \ traffic_stats.c stats-mode.c \ @@ -264,7 +277,7 @@ conntrackd_SOURCES = alarm.c main.c run.c hash.c queue.c rbtree.c \ internal_cache.c internal_bypass.c \ read_config_yy.y read_config_lex.l -conntrackd_LDFLAGS = $(all_libraries) @LIBNETFILTER_CONNTRACK_LIBS@ +conntrackd_LDADD = ${LIBNETFILTER_CONNTRACK_LIBS} EXTRA_DIST = read_config_yy.h all: all-am @@ -279,9 +292,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/Make_global.am $(am_ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile + $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -345,10 +358,15 @@ clean-sbinPROGRAMS: rm -f $$list conntrack$(EXEEXT): $(conntrack_OBJECTS) $(conntrack_DEPENDENCIES) @rm -f conntrack$(EXEEXT) - $(conntrack_LINK) $(conntrack_OBJECTS) $(conntrack_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(conntrack_OBJECTS) $(conntrack_LDADD) $(LIBS) +read_config_yy.h: read_config_yy.c + @if test ! -f $@; then \ + rm -f read_config_yy.c; \ + $(MAKE) $(AM_MAKEFLAGS) read_config_yy.c; \ + else :; fi conntrackd$(EXEEXT): $(conntrackd_OBJECTS) $(conntrackd_DEPENDENCIES) @rm -f conntrackd$(EXEEXT) - $(conntrackd_LINK) $(conntrackd_OBJECTS) $(conntrackd_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(conntrackd_OBJECTS) $(conntrackd_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -358,8 +376,9 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alarm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/build.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache-ct.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache-exp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_iterators.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_timer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/channel_mcast.Po@am__quote@ @@ -402,31 +421,37 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< .l.c: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) + $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo @@ -551,6 +576,7 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." -rm -f read_config_lex.c -rm -f read_config_yy.c + -rm -f read_config_yy.h clean: clean-am clean-am: clean-generic clean-libtool clean-sbinPROGRAMS \ diff --git a/src/build.c b/src/build.c index 6d8b12e..3193884 100644 --- a/src/build.c +++ b/src/build.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2008 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -42,14 +43,14 @@ addattr(struct nethdr *n, int attr, const void *data, size_t len) } static inline void -__build_u8(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) +ct_build_u8(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) { void *ptr = put_header(n, b, sizeof(uint8_t)); memcpy(ptr, nfct_get_attr(ct, a), sizeof(uint8_t)); } static inline void -__build_u16(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) +ct_build_u16(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) { uint16_t data = nfct_get_attr_u16(ct, a); data = htons(data); @@ -57,7 +58,7 @@ __build_u16(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) } static inline void -__build_u32(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) +ct_build_u32(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) { uint32_t data = nfct_get_attr_u32(ct, a); data = htonl(data); @@ -65,7 +66,7 @@ __build_u32(const struct nf_conntrack *ct, int a, struct nethdr *n, int b) } static inline void -__build_group(const struct nf_conntrack *ct, int a, struct nethdr *n, +ct_build_group(const struct nf_conntrack *ct, int a, struct nethdr *n, int b, int size) { void *ptr = put_header(n, b, size); @@ -73,7 +74,7 @@ __build_group(const struct nf_conntrack *ct, int a, struct nethdr *n, } static inline void -__build_natseqadj(const struct nf_conntrack *ct, struct nethdr *n) +ct_build_natseqadj(const struct nf_conntrack *ct, struct nethdr *n) { struct nta_attr_natseqadj data = { .orig_seq_correction_pos = @@ -99,36 +100,55 @@ static enum nf_conntrack_attr nat_type[] = static void build_l4proto_tcp(const struct nf_conntrack *ct, struct nethdr *n) { + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, + sizeof(struct nfct_attr_grp_port)); + if (!nfct_attr_is_set(ct, ATTR_TCP_STATE)) return; - __build_u8(ct, ATTR_TCP_STATE, n, NTA_TCP_STATE); + ct_build_u8(ct, ATTR_TCP_STATE, n, NTA_TCP_STATE); + if (CONFIG(sync).tcp_window_tracking) { + ct_build_u8(ct, ATTR_TCP_WSCALE_ORIG, n, NTA_TCP_WSCALE_ORIG); + ct_build_u8(ct, ATTR_TCP_WSCALE_REPL, n, NTA_TCP_WSCALE_REPL); + } } static void build_l4proto_sctp(const struct nf_conntrack *ct, struct nethdr *n) { + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, + sizeof(struct nfct_attr_grp_port)); + if (!nfct_attr_is_set(ct, ATTR_SCTP_STATE)) return; - __build_u8(ct, ATTR_SCTP_STATE, n, NTA_SCTP_STATE); - __build_u32(ct, ATTR_SCTP_VTAG_ORIG, n, NTA_SCTP_VTAG_ORIG); - __build_u32(ct, ATTR_SCTP_VTAG_REPL, n, NTA_SCTP_VTAG_REPL); + ct_build_u8(ct, ATTR_SCTP_STATE, n, NTA_SCTP_STATE); + ct_build_u32(ct, ATTR_SCTP_VTAG_ORIG, n, NTA_SCTP_VTAG_ORIG); + ct_build_u32(ct, ATTR_SCTP_VTAG_REPL, n, NTA_SCTP_VTAG_REPL); } static void build_l4proto_dccp(const struct nf_conntrack *ct, struct nethdr *n) { + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, + sizeof(struct nfct_attr_grp_port)); + if (!nfct_attr_is_set(ct, ATTR_DCCP_STATE)) return; - __build_u8(ct, ATTR_DCCP_STATE, n, NTA_DCCP_STATE); - __build_u8(ct, ATTR_DCCP_ROLE, n, NTA_DCCP_ROLE); + ct_build_u8(ct, ATTR_DCCP_STATE, n, NTA_DCCP_STATE); + ct_build_u8(ct, ATTR_DCCP_ROLE, n, NTA_DCCP_ROLE); } static void build_l4proto_icmp(const struct nf_conntrack *ct, struct nethdr *n) { - __build_u8(ct, ATTR_ICMP_TYPE, n, NTA_ICMP_TYPE); - __build_u8(ct, ATTR_ICMP_CODE, n, NTA_ICMP_CODE); - __build_u16(ct, ATTR_ICMP_ID, n, NTA_ICMP_ID); + ct_build_u8(ct, ATTR_ICMP_TYPE, n, NTA_ICMP_TYPE); + ct_build_u8(ct, ATTR_ICMP_CODE, n, NTA_ICMP_CODE); + ct_build_u16(ct, ATTR_ICMP_ID, n, NTA_ICMP_ID); +} + +static void build_l4proto_udp(const struct nf_conntrack *ct, struct nethdr *n) +{ + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, + sizeof(struct nfct_attr_grp_port)); } #ifndef IPPROTO_DCCP @@ -142,52 +162,49 @@ static struct build_l4proto { [IPPROTO_SCTP] = { .build = build_l4proto_sctp }, [IPPROTO_DCCP] = { .build = build_l4proto_dccp }, [IPPROTO_ICMP] = { .build = build_l4proto_icmp }, + [IPPROTO_ICMPV6] = { .build = build_l4proto_icmp }, + [IPPROTO_UDP] = { .build = build_l4proto_udp }, }; -void build_payload(const struct nf_conntrack *ct, struct nethdr *n) +void ct2msg(const struct nf_conntrack *ct, struct nethdr *n) { uint8_t l4proto = nfct_get_attr_u8(ct, ATTR_L4PROTO); if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { - __build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_IPV4, + ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_IPV4, sizeof(struct nfct_attr_grp_ipv4)); } else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { - __build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_IPV6, + ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_IPV6, sizeof(struct nfct_attr_grp_ipv6)); } - __build_u8(ct, ATTR_L4PROTO, n, NTA_L4PROTO); - if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_PORT)) { - __build_group(ct, ATTR_GRP_ORIG_PORT, n, NTA_PORT, - sizeof(struct nfct_attr_grp_port)); - } - - __build_u32(ct, ATTR_STATUS, n, NTA_STATUS); + ct_build_u32(ct, ATTR_STATUS, n, NTA_STATUS); + ct_build_u8(ct, ATTR_L4PROTO, n, NTA_L4PROTO); if (l4proto_fcn[l4proto].build) l4proto_fcn[l4proto].build(ct, n); if (!CONFIG(commit_timeout) && nfct_attr_is_set(ct, ATTR_TIMEOUT)) - __build_u32(ct, ATTR_TIMEOUT, n, NTA_TIMEOUT); + ct_build_u32(ct, ATTR_TIMEOUT, n, NTA_TIMEOUT); if (nfct_attr_is_set(ct, ATTR_MARK)) - __build_u32(ct, ATTR_MARK, n, NTA_MARK); + ct_build_u32(ct, ATTR_MARK, n, NTA_MARK); /* setup the master conntrack */ if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_IPV4)) { - __build_group(ct, ATTR_GRP_MASTER_IPV4, n, NTA_MASTER_IPV4, + ct_build_group(ct, ATTR_GRP_MASTER_IPV4, n, NTA_MASTER_IPV4, sizeof(struct nfct_attr_grp_ipv4)); - __build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO); + ct_build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO); if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_PORT)) { - __build_group(ct, ATTR_GRP_MASTER_PORT, + ct_build_group(ct, ATTR_GRP_MASTER_PORT, n, NTA_MASTER_PORT, sizeof(struct nfct_attr_grp_port)); } } else if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_IPV6)) { - __build_group(ct, ATTR_GRP_MASTER_IPV6, n, NTA_MASTER_IPV6, + ct_build_group(ct, ATTR_GRP_MASTER_IPV6, n, NTA_MASTER_IPV6, sizeof(struct nfct_attr_grp_ipv6)); - __build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO); + ct_build_u8(ct, ATTR_MASTER_L4PROTO, n, NTA_MASTER_L4PROTO); if (nfct_attr_grp_is_set(ct, ATTR_GRP_MASTER_PORT)) { - __build_group(ct, ATTR_GRP_MASTER_PORT, + ct_build_group(ct, ATTR_GRP_MASTER_PORT, n, NTA_MASTER_PORT, sizeof(struct nfct_attr_grp_port)); } @@ -195,15 +212,114 @@ void build_payload(const struct nf_conntrack *ct, struct nethdr *n) /* NAT */ if (nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT)) - __build_u32(ct, ATTR_REPL_IPV4_DST, n, NTA_SNAT_IPV4); + ct_build_u32(ct, ATTR_REPL_IPV4_DST, n, NTA_SNAT_IPV4); if (nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT)) - __build_u32(ct, ATTR_REPL_IPV4_SRC, n, NTA_DNAT_IPV4); + ct_build_u32(ct, ATTR_REPL_IPV4_SRC, n, NTA_DNAT_IPV4); if (nfct_getobjopt(ct, NFCT_GOPT_IS_SPAT)) - __build_u16(ct, ATTR_REPL_PORT_DST, n, NTA_SPAT_PORT); + ct_build_u16(ct, ATTR_REPL_PORT_DST, n, NTA_SPAT_PORT); if (nfct_getobjopt(ct, NFCT_GOPT_IS_DPAT)) - __build_u16(ct, ATTR_REPL_PORT_SRC, n, NTA_DPAT_PORT); + ct_build_u16(ct, ATTR_REPL_PORT_SRC, n, NTA_DPAT_PORT); /* NAT sequence adjustment */ if (nfct_attr_is_set_array(ct, nat_type, 6)) - __build_natseqadj(ct, n); + ct_build_natseqadj(ct, n); +} + +static void +exp_build_l4proto_tcp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, + sizeof(struct nfct_attr_grp_port)); +} + +static void +exp_build_l4proto_sctp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, + sizeof(struct nfct_attr_grp_port)); +} + +static void +exp_build_l4proto_dccp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, + sizeof(struct nfct_attr_grp_port)); +} + +static void +exp_build_l4proto_udp(const struct nf_conntrack *ct, struct nethdr *n, int a) +{ + ct_build_group(ct, ATTR_GRP_ORIG_PORT, n, a, + sizeof(struct nfct_attr_grp_port)); +} + +static struct exp_build_l4proto { + void (*build)(const struct nf_conntrack *, struct nethdr *n, int a); +} exp_l4proto_fcn[IPPROTO_MAX] = { + [IPPROTO_TCP] = { .build = exp_build_l4proto_tcp }, + [IPPROTO_SCTP] = { .build = exp_build_l4proto_sctp }, + [IPPROTO_DCCP] = { .build = exp_build_l4proto_dccp }, + [IPPROTO_UDP] = { .build = exp_build_l4proto_udp }, +}; + +static inline void +exp_build_u32(const struct nf_expect *exp, int a, struct nethdr *n, int b) +{ + uint32_t data = nfexp_get_attr_u32(exp, a); + data = htonl(data); + addattr(n, b, &data, sizeof(uint32_t)); +} + +void exp2msg(const struct nf_expect *exp, struct nethdr *n) +{ + const struct nf_conntrack *ct = nfexp_get_attr(exp, ATTR_EXP_MASTER); + uint8_t l4proto = nfct_get_attr_u8(ct, ATTR_L4PROTO); + + /* master conntrack for this expectation. */ + if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { + ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_EXP_MASTER_IPV4, + sizeof(struct nfct_attr_grp_ipv4)); + } else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { + ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_EXP_MASTER_IPV6, + sizeof(struct nfct_attr_grp_ipv6)); + } + ct_build_u8(ct, ATTR_L4PROTO, n, NTA_EXP_MASTER_L4PROTO); + + if (exp_l4proto_fcn[l4proto].build) + exp_l4proto_fcn[l4proto].build(ct, n, NTA_EXP_MASTER_PORT); + + /* the expectation itself. */ + ct = nfexp_get_attr(exp, ATTR_EXP_EXPECTED); + + if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { + ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_EXP_EXPECT_IPV4, + sizeof(struct nfct_attr_grp_ipv4)); + } else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { + ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_EXP_EXPECT_IPV6, + sizeof(struct nfct_attr_grp_ipv6)); + } + ct_build_u8(ct, ATTR_L4PROTO, n, NTA_EXP_EXPECT_L4PROTO); + + if (exp_l4proto_fcn[l4proto].build) + exp_l4proto_fcn[l4proto].build(ct, n, NTA_EXP_EXPECT_PORT); + + /* mask for the expectation. */ + ct = nfexp_get_attr(exp, ATTR_EXP_MASK); + + if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV4)) { + ct_build_group(ct, ATTR_GRP_ORIG_IPV4, n, NTA_EXP_MASK_IPV4, + sizeof(struct nfct_attr_grp_ipv4)); + } else if (nfct_attr_grp_is_set(ct, ATTR_GRP_ORIG_IPV6)) { + ct_build_group(ct, ATTR_GRP_ORIG_IPV6, n, NTA_EXP_MASK_IPV6, + sizeof(struct nfct_attr_grp_ipv6)); + } + ct_build_u8(ct, ATTR_L4PROTO, n, NTA_EXP_MASK_L4PROTO); + + if (exp_l4proto_fcn[l4proto].build) + exp_l4proto_fcn[l4proto].build(ct, n, NTA_EXP_MASK_PORT); + + if (!CONFIG(commit_timeout) && nfexp_attr_is_set(exp, ATTR_EXP_TIMEOUT)) + exp_build_u32(exp, ATTR_EXP_TIMEOUT, n, NTA_EXP_TIMEOUT); + + exp_build_u32(exp, ATTR_EXP_FLAGS, n, NTA_EXP_FLAGS); } diff --git a/src/cache-ct.c b/src/cache-ct.c new file mode 100644 index 0000000..0ad8d2a --- /dev/null +++ b/src/cache-ct.c @@ -0,0 +1,356 @@ +/* + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "cache.h" +#include "hash.h" +#include "log.h" +#include "conntrackd.h" +#include "netlink.h" +#include "event.h" +#include "jhash.h" +#include "network.h" + +#include <errno.h> +#include <string.h> +#include <time.h> +#include <libnetfilter_conntrack/libnetfilter_conntrack.h> + +static uint32_t +cache_hash4_ct(const struct nf_conntrack *ct, const struct hashtable *table) +{ + uint32_t a[4] = { + [0] = nfct_get_attr_u32(ct, ATTR_IPV4_SRC), + [1] = nfct_get_attr_u32(ct, ATTR_IPV4_DST), + [2] = nfct_get_attr_u8(ct, ATTR_L3PROTO) << 16 | + nfct_get_attr_u8(ct, ATTR_L4PROTO), + [3] = nfct_get_attr_u16(ct, ATTR_PORT_SRC) << 16 | + nfct_get_attr_u16(ct, ATTR_PORT_DST), + }; + + /* + * Instead of returning hash % table->hashsize (implying a divide) + * we return the high 32 bits of the (hash * table->hashsize) that will + * give results between [0 and hashsize-1] and same hash distribution, + * but using a multiply, less expensive than a divide. See: + * http://www.mail-archive.com/netdev@vger.kernel.org/msg56623.html + */ + return ((uint64_t)jhash2(a, 4, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_hash6_ct(const struct nf_conntrack *ct, const struct hashtable *table) +{ + uint32_t a[10]; + + memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); + memcpy(&a[4], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); + a[8] = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) << 16 | + nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); + a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 | + nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); + + return ((uint64_t)jhash2(a, 10, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_ct_hash(const void *data, const struct hashtable *table) +{ + int ret = 0; + const struct nf_conntrack *ct = data; + + switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) { + case AF_INET: + ret = cache_hash4_ct(ct, table); + break; + case AF_INET6: + ret = cache_hash6_ct(ct, table); + break; + default: + dlog(LOG_ERR, "unknown layer 3 proto in hash"); + break; + } + return ret; +} + +static int cache_ct_cmp(const void *data1, const void *data2) +{ + const struct cache_object *obj = data1; + const struct nf_conntrack *ct = data2; + + return nfct_cmp(obj->ptr, ct, NFCT_CMP_ORIG) && + nfct_get_attr_u32(obj->ptr, ATTR_ID) == + nfct_get_attr_u32(ct, ATTR_ID); +} + +static void *cache_ct_alloc(void) +{ + return nfct_new(); +} + +static void cache_ct_free(void *ptr) +{ + nfct_destroy(ptr); +} + +static void cache_ct_copy(void *dst, void *src, unsigned int flags) +{ + nfct_copy(dst, src, flags); +} + +static int cache_ct_dump_step(void *data1, void *n) +{ + char buf[1024]; + int size; + struct __dump_container *container = data1; + struct cache_object *obj = n; + char *data = obj->data; + unsigned i; + + /* + * XXX: Do not dump the entries that are scheduled to expire. + * These entries talk about already destroyed connections + * that we keep for some time just in case that we have to + * resent some lost messages. We do not show them to the + * user as he may think that the firewall replicas are not + * in sync. The branch below is a hack as it is quite + * specific and it breaks conntrackd modularity. Probably + * there's a nicer way to do this but until I come up with it... + */ + if (CONFIG(flags) & CTD_SYNC_FTFW && obj->status == C_OBJ_DEAD) + return 0; + + /* do not show cached timeout, this may confuse users */ + if (nfct_attr_is_set(obj->ptr, ATTR_TIMEOUT)) + nfct_attr_unset(obj->ptr, ATTR_TIMEOUT); + + memset(buf, 0, sizeof(buf)); + size = nfct_snprintf(buf, + sizeof(buf), + obj->ptr, + NFCT_T_UNKNOWN, + container->type, + 0); + + for (i = 0; i < obj->cache->num_features; i++) { + if (obj->cache->features[i]->dump) { + size += obj->cache->features[i]->dump(obj, + data, + buf+size, + container->type); + data += obj->cache->features[i]->size; + } + } + if (container->type != NFCT_O_XML) { + long tm = time(NULL); + size += sprintf(buf+size, " [active since %lds]", + tm - obj->lifetime); + } + size += sprintf(buf+size, "\n"); + if (send(container->fd, buf, size, 0) == -1) { + if (errno != EPIPE) + return -1; + } + + return 0; +} + +static void +cache_ct_commit_step(struct __commit_container *tmp, struct cache_object *obj) +{ + int ret, retry = 1, timeout; + struct nf_conntrack *ct = obj->ptr; + + if (CONFIG(commit_timeout)) { + timeout = CONFIG(commit_timeout); + } else { + timeout = time(NULL) - obj->lastupdate; + if (timeout < 0) { + /* XXX: Arbitrarily set the timer to one minute, how + * can this happen? For example, an adjustment due to + * daylight-saving. Probably other situations can + * trigger this. */ + timeout = 60; + } + /* calculate an estimation of the current timeout */ + timeout = nfct_get_attr_u32(ct, ATTR_TIMEOUT) - timeout; + if (timeout < 0) { + timeout = 60; + } + } + +retry: + if (nl_create_conntrack(tmp->h, ct, timeout) == -1) { + if (errno == EEXIST && retry == 1) { + ret = nl_destroy_conntrack(tmp->h, ct); + if (ret == 0 || (ret == -1 && errno == ENOENT)) { + if (retry) { + retry = 0; + goto retry; + } + } + dlog(LOG_ERR, "commit-destroy: %s", strerror(errno)); + dlog_ct(STATE(log), ct, NFCT_O_PLAIN); + tmp->c->stats.commit_fail++; + } else { + dlog(LOG_ERR, "commit-create: %s", strerror(errno)); + dlog_ct(STATE(log), ct, NFCT_O_PLAIN); + tmp->c->stats.commit_fail++; + } + } else { + tmp->c->stats.commit_ok++; + } +} + +static int cache_ct_commit_related(void *data, void *n) +{ + struct cache_object *obj = n; + + if (ct_is_related(obj->ptr)) + cache_ct_commit_step(data, obj); + + /* keep iterating even if we have found errors */ + return 0; +} + +static int cache_ct_commit_master(void *data, void *n) +{ + struct cache_object *obj = n; + + if (ct_is_related(obj->ptr)) + return 0; + + cache_ct_commit_step(data, obj); + return 0; +} + +static int cache_ct_commit(struct cache *c, struct nfct_handle *h, int clientfd) +{ + unsigned int commit_ok, commit_fail; + struct __commit_container tmp = { + .h = h, + .c = c, + }; + struct timeval commit_stop, res; + + /* we already have one commit in progress, skip this. The clientfd + * descriptor has to be closed by the caller. */ + if (clientfd && STATE_SYNC(commit).clientfd != -1) + return -1; + + switch(STATE_SYNC(commit).state) { + case COMMIT_STATE_INACTIVE: + gettimeofday(&STATE_SYNC(commit).stats.start, NULL); + STATE_SYNC(commit).stats.ok = c->stats.commit_ok; + STATE_SYNC(commit).stats.fail = c->stats.commit_fail; + STATE_SYNC(commit).clientfd = clientfd; + case COMMIT_STATE_MASTER: + STATE_SYNC(commit).current = + hashtable_iterate_limit(c->h, &tmp, + STATE_SYNC(commit).current, + CONFIG(general).commit_steps, + cache_ct_commit_master); + if (STATE_SYNC(commit).current < CONFIG(hashsize)) { + STATE_SYNC(commit).state = COMMIT_STATE_MASTER; + /* give it another step as soon as possible */ + write_evfd(STATE_SYNC(commit).evfd); + return 1; + } + STATE_SYNC(commit).current = 0; + STATE_SYNC(commit).state = COMMIT_STATE_RELATED; + case COMMIT_STATE_RELATED: + STATE_SYNC(commit).current = + hashtable_iterate_limit(c->h, &tmp, + STATE_SYNC(commit).current, + CONFIG(general).commit_steps, + cache_ct_commit_related); + if (STATE_SYNC(commit).current < CONFIG(hashsize)) { + STATE_SYNC(commit).state = COMMIT_STATE_RELATED; + /* give it another step as soon as possible */ + write_evfd(STATE_SYNC(commit).evfd); + return 1; + } + /* calculate the time that commit has taken */ + gettimeofday(&commit_stop, NULL); + timersub(&commit_stop, &STATE_SYNC(commit).stats.start, &res); + + /* calculate new entries committed */ + commit_ok = c->stats.commit_ok - STATE_SYNC(commit).stats.ok; + commit_fail = + c->stats.commit_fail - STATE_SYNC(commit).stats.fail; + + /* log results */ + dlog(LOG_NOTICE, "Committed %u new entries", commit_ok); + + if (commit_fail) + dlog(LOG_NOTICE, "%u entries can't be " + "committed", commit_fail); + + dlog(LOG_NOTICE, "commit has taken %lu.%06lu seconds", + res.tv_sec, res.tv_usec); + + /* prepare the state machine for new commits */ + STATE_SYNC(commit).current = 0; + STATE_SYNC(commit).state = COMMIT_STATE_INACTIVE; + + return 0; + } + return 1; +} + +static struct nethdr * +cache_ct_build_msg(const struct cache_object *obj, int type) +{ + return BUILD_NETMSG_FROM_CT(obj->ptr, type); +} + +/* template to cache conntracks coming from the kernel. */ +struct cache_ops cache_sync_internal_ct_ops = { + .hash = cache_ct_hash, + .cmp = cache_ct_cmp, + .alloc = cache_ct_alloc, + .free = cache_ct_free, + .copy = cache_ct_copy, + .dump_step = cache_ct_dump_step, + .commit = NULL, + .build_msg = cache_ct_build_msg, +}; + +/* template to cache conntracks coming from the network. */ +struct cache_ops cache_sync_external_ct_ops = { + .hash = cache_ct_hash, + .cmp = cache_ct_cmp, + .alloc = cache_ct_alloc, + .free = cache_ct_free, + .copy = cache_ct_copy, + .dump_step = cache_ct_dump_step, + .commit = cache_ct_commit, + .build_msg = NULL, +}; + +/* template to cache conntracks for the statistics mode. */ +struct cache_ops cache_stats_ct_ops = { + .hash = cache_ct_hash, + .cmp = cache_ct_cmp, + .alloc = cache_ct_alloc, + .free = cache_ct_free, + .copy = cache_ct_copy, + .dump_step = cache_ct_dump_step, + .commit = NULL, + .build_msg = NULL, +}; diff --git a/src/cache-exp.c b/src/cache-exp.c new file mode 100644 index 0000000..e88877a --- /dev/null +++ b/src/cache-exp.c @@ -0,0 +1,308 @@ +/* + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "cache.h" +#include "hash.h" +#include "log.h" +#include "conntrackd.h" +#include "netlink.h" +#include "event.h" +#include "jhash.h" +#include "network.h" + +#include <errno.h> +#include <string.h> +#include <time.h> +#include <libnetfilter_conntrack/libnetfilter_conntrack.h> + +static uint32_t +cache_hash4_exp(const struct nf_conntrack *ct, const struct hashtable *table) +{ + uint32_t a[4] = { + [0] = nfct_get_attr_u32(ct, ATTR_IPV4_SRC), + [1] = nfct_get_attr_u32(ct, ATTR_IPV4_DST), + [2] = nfct_get_attr_u8(ct, ATTR_L3PROTO) << 16 | + nfct_get_attr_u8(ct, ATTR_L4PROTO), + [3] = nfct_get_attr_u16(ct, ATTR_PORT_SRC) << 16 | + nfct_get_attr_u16(ct, ATTR_PORT_DST), + }; + + /* + * Instead of returning hash % table->hashsize (implying a divide) + * we return the high 32 bits of the (hash * table->hashsize) that will + * give results between [0 and hashsize-1] and same hash distribution, + * but using a multiply, less expensive than a divide. See: + * http://www.mail-archive.com/netdev@vger.kernel.org/msg56623.html + */ + return ((uint64_t)jhash2(a, 4, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_hash6_exp(const struct nf_conntrack *ct, const struct hashtable *table) +{ + uint32_t a[10]; + + memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); + memcpy(&a[4], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); + a[8] = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) << 16 | + nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); + a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 | + nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); + + return ((uint64_t)jhash2(a, 10, 0) * table->hashsize) >> 32; +} + +static uint32_t +cache_exp_hash(const void *data, const struct hashtable *table) +{ + int ret = 0; + const struct nf_expect *exp = data; + const struct nf_conntrack *ct = nfexp_get_attr(exp, ATTR_EXP_MASTER); + + switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) { + case AF_INET: + ret = cache_hash4_exp(ct, table); + break; + case AF_INET6: + ret = cache_hash6_exp(ct, table); + break; + default: + dlog(LOG_ERR, "unknown layer 3 proto in hash"); + break; + } + return ret; +} + +static int cache_exp_cmp(const void *data1, const void *data2) +{ + const struct cache_object *obj = data1; + const struct nf_expect *exp = data2; + + return nfexp_cmp(obj->ptr, exp, 0); +} + +static void *cache_exp_alloc(void) +{ + return nfexp_new(); +} + +static void cache_exp_free(void *ptr) +{ + nfexp_destroy(ptr); +} + +static void cache_exp_copy(void *dst, void *src, unsigned int flags) +{ + /* XXX: add nfexp_copy(...) to libnetfilter_conntrack. */ + memcpy(dst, src, nfexp_maxsize()); +} + +static int cache_exp_dump_step(void *data1, void *n) +{ + char buf[1024]; + int size; + struct __dump_container *container = data1; + struct cache_object *obj = n; + char *data = obj->data; + unsigned i; + + /* + * XXX: Do not dump the entries that are scheduled to expire. + * These entries talk about already destroyed connections + * that we keep for some time just in case that we have to + * resent some lost messages. We do not show them to the + * user as he may think that the firewall replicas are not + * in sync. The branch below is a hack as it is quite + * specific and it breaks conntrackd modularity. Probably + * there's a nicer way to do this but until I come up with it... + */ + if (CONFIG(flags) & CTD_SYNC_FTFW && obj->status == C_OBJ_DEAD) + return 0; + + /* do not show cached timeout, this may confuse users */ + if (nfexp_attr_is_set(obj->ptr, ATTR_EXP_TIMEOUT)) + nfexp_attr_unset(obj->ptr, ATTR_EXP_TIMEOUT); + + memset(buf, 0, sizeof(buf)); + size = nfexp_snprintf(buf, sizeof(buf),obj->ptr, + NFCT_T_UNKNOWN, container->type, 0); + + for (i = 0; i < obj->cache->num_features; i++) { + if (obj->cache->features[i]->dump) { + size += obj->cache->features[i]->dump(obj, data, + buf+size, + container->type); + data += obj->cache->features[i]->size; + } + } + if (container->type != NFCT_O_XML) { + long tm = time(NULL); + size += sprintf(buf+size, " [active since %lds]", + tm - obj->lifetime); + } + size += sprintf(buf+size, "\n"); + if (send(container->fd, buf, size, 0) == -1) { + if (errno != EPIPE) + return -1; + } + + return 0; +} + +static int cache_exp_commit_step(void *data, void *n) +{ + struct cache_object *obj = n; + struct __commit_container *tmp = data; + int ret, retry = 1, timeout; + struct nf_expect *exp = obj->ptr; + + if (CONFIG(commit_timeout)) { + timeout = CONFIG(commit_timeout); + } else { + timeout = time(NULL) - obj->lastupdate; + if (timeout < 0) { + /* XXX: Arbitrarily set the timer to one minute, how + * can this happen? For example, an adjustment due to + * daylight-saving. Probably other situations can + * trigger this. */ + timeout = 60; + } + /* calculate an estimation of the current timeout */ + timeout = nfexp_get_attr_u32(exp, ATTR_EXP_TIMEOUT) - timeout; + if (timeout < 0) { + timeout = 60; + } + } + +retry: + if (nl_create_expect(tmp->h, exp, timeout) == -1) { + if (errno == EEXIST && retry == 1) { + ret = nl_destroy_expect(tmp->h, exp); + if (ret == 0 || (ret == -1 && errno == ENOENT)) { + if (retry) { + retry = 0; + goto retry; + } + } + dlog(LOG_ERR, "commit-destroy: %s", strerror(errno)); + dlog_exp(STATE(log), exp, NFCT_O_PLAIN); + tmp->c->stats.commit_fail++; + } else { + dlog(LOG_ERR, "commit-create: %s", strerror(errno)); + dlog_exp(STATE(log), exp, NFCT_O_PLAIN); + tmp->c->stats.commit_fail++; + } + } else { + tmp->c->stats.commit_ok++; + } + /* keep iterating even if we have found errors */ + return 0; +} + +static int +cache_exp_commit(struct cache *c, struct nfct_handle *h, int clientfd) +{ + unsigned int commit_ok, commit_fail; + struct timeval commit_stop, res; + struct __commit_container tmp = { + .h = h, + .c = c, + }; + + /* we already have one commit in progress, skip this. The clientfd + * descriptor has to be closed by the caller. */ + if (clientfd && STATE_SYNC(commit).clientfd != -1) + return -1; + + switch(STATE_SYNC(commit).state) { + case COMMIT_STATE_INACTIVE: + gettimeofday(&STATE_SYNC(commit).stats.start, NULL); + STATE_SYNC(commit).stats.ok = c->stats.commit_ok; + STATE_SYNC(commit).stats.fail = c->stats.commit_fail; + STATE_SYNC(commit).clientfd = clientfd; + case COMMIT_STATE_MASTER: + STATE_SYNC(commit).current = + hashtable_iterate_limit(c->h, &tmp, + STATE_SYNC(commit).current, + CONFIG(general).commit_steps, + cache_exp_commit_step); + if (STATE_SYNC(commit).current < CONFIG(hashsize)) { + STATE_SYNC(commit).state = COMMIT_STATE_MASTER; + /* give it another step as soon as possible */ + write_evfd(STATE_SYNC(commit).evfd); + return 1; + } + + /* calculate the time that commit has taken */ + gettimeofday(&commit_stop, NULL); + timersub(&commit_stop, &STATE_SYNC(commit).stats.start, &res); + + /* calculate new entries committed */ + commit_ok = c->stats.commit_ok - STATE_SYNC(commit).stats.ok; + commit_fail = + c->stats.commit_fail - STATE_SYNC(commit).stats.fail; + + /* log results */ + dlog(LOG_NOTICE, "Committed %u new expectations", commit_ok); + + if (commit_fail) + dlog(LOG_NOTICE, "%u expectations can't be " + "committed", commit_fail); + + dlog(LOG_NOTICE, "commit has taken %lu.%06lu seconds", + res.tv_sec, res.tv_usec); + + /* prepare the state machine for new commits */ + STATE_SYNC(commit).current = 0; + STATE_SYNC(commit).state = COMMIT_STATE_INACTIVE; + + return 0; + } + return 1; +} + +static struct nethdr * +cache_exp_build_msg(const struct cache_object *obj, int type) +{ + return BUILD_NETMSG_FROM_EXP(obj->ptr, type); +} + +/* template to cache expectations coming from the kernel. */ +struct cache_ops cache_sync_internal_exp_ops = { + .hash = cache_exp_hash, + .cmp = cache_exp_cmp, + .alloc = cache_exp_alloc, + .free = cache_exp_free, + .copy = cache_exp_copy, + .dump_step = cache_exp_dump_step, + .commit = NULL, + .build_msg = cache_exp_build_msg, +}; + +/* template to cache expectations coming from the network. */ +struct cache_ops cache_sync_external_exp_ops = { + .hash = cache_exp_hash, + .cmp = cache_exp_cmp, + .alloc = cache_exp_alloc, + .free = cache_exp_free, + .copy = cache_exp_copy, + .dump_step = cache_exp_dump_step, + .commit = cache_exp_commit, + .build_msg = NULL, +}; diff --git a/src/cache.c b/src/cache.c index 74c5c4b..7c41e54 100644 --- a/src/cache.c +++ b/src/cache.c @@ -1,5 +1,6 @@ /* - * (C) 2006-2009 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,80 +29,14 @@ #include <string.h> #include <time.h> -static uint32_t -__hash4(const struct nf_conntrack *ct, const struct hashtable *table) -{ - uint32_t a[4] = { - [0] = nfct_get_attr_u32(ct, ATTR_IPV4_SRC), - [1] = nfct_get_attr_u32(ct, ATTR_IPV4_DST), - [2] = nfct_get_attr_u8(ct, ATTR_L3PROTO) << 16 | - nfct_get_attr_u8(ct, ATTR_L4PROTO), - [3] = nfct_get_attr_u16(ct, ATTR_PORT_SRC) << 16 | - nfct_get_attr_u16(ct, ATTR_PORT_DST), - }; - - /* - * Instead of returning hash % table->hashsize (implying a divide) - * we return the high 32 bits of the (hash * table->hashsize) that will - * give results between [0 and hashsize-1] and same hash distribution, - * but using a multiply, less expensive than a divide. See: - * http://www.mail-archive.com/netdev@vger.kernel.org/msg56623.html - */ - return ((uint64_t)jhash2(a, 4, 0) * table->hashsize) >> 32; -} - -static uint32_t -__hash6(const struct nf_conntrack *ct, const struct hashtable *table) -{ - uint32_t a[10]; - - memcpy(&a[0], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); - memcpy(&a[4], nfct_get_attr(ct, ATTR_IPV6_SRC), sizeof(uint32_t)*4); - a[8] = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) << 16 | - nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); - a[9] = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC) << 16 | - nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); - - return ((uint64_t)jhash2(a, 10, 0) * table->hashsize) >> 32; -} - -static uint32_t hash(const void *data, const struct hashtable *table) -{ - int ret = 0; - const struct nf_conntrack *ct = data; - - switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) { - case AF_INET: - ret = __hash4(ct, table); - break; - case AF_INET6: - ret = __hash6(ct, table); - break; - default: - dlog(LOG_ERR, "unknown layer 3 proto in hash"); - break; - } - - return ret; -} - -static int compare(const void *data1, const void *data2) -{ - const struct cache_object *obj = data1; - const struct nf_conntrack *ct = data2; - - return nfct_cmp(obj->ct, ct, NFCT_CMP_ORIG) && - nfct_get_attr_u32(obj->ct, ATTR_ID) == - nfct_get_attr_u32(ct, ATTR_ID); -} - struct cache_feature *cache_feature[CACHE_MAX_FEATURE] = { [TIMER_FEATURE] = &timer_feature, }; -struct cache *cache_create(const char *name, +struct cache *cache_create(const char *name, enum cache_type type, unsigned int features, - struct cache_extra *extra) + struct cache_extra *extra, + struct cache_ops *ops) { size_t size = sizeof(struct cache_object); int i, j = 0; @@ -110,12 +45,16 @@ struct cache *cache_create(const char *name, unsigned int feature_offset[CACHE_MAX_FEATURE] = {}; unsigned int feature_type[CACHE_MAX_FEATURE] = {}; + if (type == CACHE_T_NONE || type >= CACHE_T_MAX) + return NULL; + c = malloc(sizeof(struct cache)); if (!c) return NULL; memset(c, 0, sizeof(struct cache)); strcpy(c->name, name); + c->type = type; for (i = 0; i < CACHE_MAX_FEATURE; i++) { if ((1 << i) & features) { @@ -150,11 +89,19 @@ struct cache *cache_create(const char *name, } memcpy(c->feature_offset, feature_offset, sizeof(unsigned int) * j); + if (!ops || !ops->hash || !ops->cmp || + !ops->alloc || !ops->copy || !ops->free) { + free(c->feature_offset); + free(c->features); + free(c); + return NULL; + } + c->ops = ops; + c->h = hashtable_create(CONFIG(hashsize), CONFIG(limit), - hash, - compare); - + c->ops->hash, + c->ops->cmp); if (!c->h) { free(c->features); free(c->feature_offset); @@ -175,7 +122,7 @@ void cache_destroy(struct cache *c) free(c); } -struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct) +struct cache_object *cache_object_new(struct cache *c, void *ptr) { struct cache_object *obj; @@ -187,13 +134,14 @@ struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct) } obj->cache = c; - if ((obj->ct = nfct_new()) == NULL) { + obj->ptr = c->ops->alloc(); + if (obj->ptr == NULL) { free(obj); errno = ENOMEM; c->stats.add_fail_enomem++; return NULL; } - memcpy(obj->ct, ct, nfct_sizeof(ct)); + c->ops->copy(obj->ptr, ptr, NFCT_CP_OVERRIDE); obj->status = C_OBJ_NONE; c->stats.objects++; @@ -203,7 +151,8 @@ struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct) void cache_object_free(struct cache_object *obj) { obj->cache->stats.objects--; - nfct_destroy(obj->ct); + obj->cache->ops->free(obj->ptr); + free(obj); } @@ -271,13 +220,12 @@ int cache_add(struct cache *c, struct cache_object *obj, int id) return 0; } -void cache_update(struct cache *c, struct cache_object *obj, int id, - struct nf_conntrack *ct) +void cache_update(struct cache *c, struct cache_object *obj, int id, void *ptr) { char *data = obj->data; unsigned int i; - nfct_copy(obj->ct, ct, NFCT_CP_META); + c->ops->copy(obj->ptr, ptr, NFCT_CP_META); for (i = 0; i < c->num_features; i++) { c->features[i]->update(obj, data); @@ -322,23 +270,22 @@ void cache_del(struct cache *c, struct cache_object *obj) __del(c, obj); } -struct cache_object * -cache_update_force(struct cache *c, struct nf_conntrack *ct) +struct cache_object *cache_update_force(struct cache *c, void *ptr) { struct cache_object *obj; int id; - obj = cache_find(c, ct, &id); + obj = cache_find(c, ptr, &id); if (obj) { if (obj->status != C_OBJ_DEAD) { - cache_update(c, obj, id, ct); + cache_update(c, obj, id, ptr); return obj; } else { cache_del(c, obj); cache_object_free(obj); } } - obj = cache_object_new(c, ct); + obj = cache_object_new(c, ptr); if (obj == NULL) return NULL; @@ -350,21 +297,15 @@ cache_update_force(struct cache *c, struct nf_conntrack *ct) return obj; } -struct cache_object * -cache_find(struct cache *c, struct nf_conntrack *ct, int *id) +struct cache_object *cache_find(struct cache *c, void *ptr, int *id) { - *id = hashtable_hash(c->h, ct); - return ((struct cache_object *) hashtable_find(c->h, ct, *id)); + *id = hashtable_hash(c->h, ptr); + return ((struct cache_object *) hashtable_find(c->h, ptr, *id)); } -struct cache_object *cache_data_get_object(struct cache *c, void *data) +void *cache_get_extra(struct cache_object *obj) { - return (struct cache_object *)((char*)data - c->extra_offset); -} - -void *cache_get_extra(struct cache *c, void *data) -{ - return (char*)data + c->extra_offset; + return (char*)obj + obj->cache->extra_offset; } void cache_stats(const struct cache *c, int fd) @@ -432,3 +373,33 @@ void cache_iterate_limit(struct cache *c, void *data, { hashtable_iterate_limit(c->h, data, from, steps, iterate); } + +void cache_dump(struct cache *c, int fd, int type) +{ + struct __dump_container tmp = { + .fd = fd, + .type = type + }; + hashtable_iterate(c->h, (void *) &tmp, c->ops->dump_step); +} + +int cache_commit(struct cache *c, struct nfct_handle *h, int clientfd) +{ + return c->ops->commit(c, h, clientfd); +} + +static int do_flush(void *data, void *n) +{ + struct cache *c = data; + struct cache_object *obj = n; + + cache_del(c, obj); + cache_object_free(obj); + return 0; +} + +void cache_flush(struct cache *c) +{ + hashtable_iterate(c->h, c, do_flush); + c->stats.flush++; +} diff --git a/src/conntrack.c b/src/conntrack.c index eec3868..9602e2e 100644 --- a/src/conntrack.c +++ b/src/conntrack.c @@ -58,10 +58,219 @@ #include <fcntl.h> #include <libnetfilter_conntrack/libnetfilter_conntrack.h> +struct u32_mask { + uint32_t value; + uint32_t mask; +}; + +/* These are the template objects that are used to send commands. */ +static struct { + struct nf_conntrack *ct; + struct nf_expect *exp; + /* Expectations require the expectation tuple and the mask. */ + struct nf_conntrack *exptuple, *mask; + + /* Allows filtering/setting specific bits in the ctmark */ + struct u32_mask mark; +} tmpl; + +static int alloc_tmpl_objects(void) +{ + tmpl.ct = nfct_new(); + tmpl.exptuple = nfct_new(); + tmpl.mask = nfct_new(); + tmpl.exp = nfexp_new(); + + memset(&tmpl.mark, 0, sizeof(tmpl.mark)); + + return tmpl.ct != NULL && tmpl.exptuple != NULL && + tmpl.mask != NULL && tmpl.exp != NULL; +} + +static void free_tmpl_objects(void) +{ + if (tmpl.ct) + nfct_destroy(tmpl.ct); + if (tmpl.exptuple) + nfct_destroy(tmpl.exptuple); + if (tmpl.mask) + nfct_destroy(tmpl.mask); + if (tmpl.exp) + nfexp_destroy(tmpl.exp); +} + +enum ct_command { + CT_NONE = 0, + + CT_LIST_BIT = 0, + CT_LIST = (1 << CT_LIST_BIT), + + CT_CREATE_BIT = 1, + CT_CREATE = (1 << CT_CREATE_BIT), + + CT_UPDATE_BIT = 2, + CT_UPDATE = (1 << CT_UPDATE_BIT), + + CT_DELETE_BIT = 3, + CT_DELETE = (1 << CT_DELETE_BIT), + + CT_GET_BIT = 4, + CT_GET = (1 << CT_GET_BIT), + + CT_FLUSH_BIT = 5, + CT_FLUSH = (1 << CT_FLUSH_BIT), + + CT_EVENT_BIT = 6, + CT_EVENT = (1 << CT_EVENT_BIT), + + CT_VERSION_BIT = 7, + CT_VERSION = (1 << CT_VERSION_BIT), + + CT_HELP_BIT = 8, + CT_HELP = (1 << CT_HELP_BIT), + + EXP_LIST_BIT = 9, + EXP_LIST = (1 << EXP_LIST_BIT), + + EXP_CREATE_BIT = 10, + EXP_CREATE = (1 << EXP_CREATE_BIT), + + EXP_DELETE_BIT = 11, + EXP_DELETE = (1 << EXP_DELETE_BIT), + + EXP_GET_BIT = 12, + EXP_GET = (1 << EXP_GET_BIT), + + EXP_FLUSH_BIT = 13, + EXP_FLUSH = (1 << EXP_FLUSH_BIT), + + EXP_EVENT_BIT = 14, + EXP_EVENT = (1 << EXP_EVENT_BIT), + + CT_COUNT_BIT = 15, + CT_COUNT = (1 << CT_COUNT_BIT), + + EXP_COUNT_BIT = 16, + EXP_COUNT = (1 << EXP_COUNT_BIT), + + X_STATS_BIT = 17, + X_STATS = (1 << X_STATS_BIT), +}; +/* If you add a new command, you have to update NUMBER_OF_CMD in conntrack.h */ + +enum ct_options { + CT_OPT_ORIG_SRC_BIT = 0, + CT_OPT_ORIG_SRC = (1 << CT_OPT_ORIG_SRC_BIT), + + CT_OPT_ORIG_DST_BIT = 1, + CT_OPT_ORIG_DST = (1 << CT_OPT_ORIG_DST_BIT), + + CT_OPT_ORIG = (CT_OPT_ORIG_SRC | CT_OPT_ORIG_DST), + + CT_OPT_REPL_SRC_BIT = 2, + CT_OPT_REPL_SRC = (1 << CT_OPT_REPL_SRC_BIT), + + CT_OPT_REPL_DST_BIT = 3, + CT_OPT_REPL_DST = (1 << CT_OPT_REPL_DST_BIT), + + CT_OPT_REPL = (CT_OPT_REPL_SRC | CT_OPT_REPL_DST), + + CT_OPT_PROTO_BIT = 4, + CT_OPT_PROTO = (1 << CT_OPT_PROTO_BIT), + + CT_OPT_TUPLE_ORIG = (CT_OPT_ORIG | CT_OPT_PROTO), + CT_OPT_TUPLE_REPL = (CT_OPT_REPL | CT_OPT_PROTO), + + CT_OPT_TIMEOUT_BIT = 5, + CT_OPT_TIMEOUT = (1 << CT_OPT_TIMEOUT_BIT), + + CT_OPT_STATUS_BIT = 6, + CT_OPT_STATUS = (1 << CT_OPT_STATUS_BIT), + + CT_OPT_ZERO_BIT = 7, + CT_OPT_ZERO = (1 << CT_OPT_ZERO_BIT), + + CT_OPT_EVENT_MASK_BIT = 8, + CT_OPT_EVENT_MASK = (1 << CT_OPT_EVENT_MASK_BIT), + + CT_OPT_EXP_SRC_BIT = 9, + CT_OPT_EXP_SRC = (1 << CT_OPT_EXP_SRC_BIT), + + CT_OPT_EXP_DST_BIT = 10, + CT_OPT_EXP_DST = (1 << CT_OPT_EXP_DST_BIT), + + CT_OPT_MASK_SRC_BIT = 11, + CT_OPT_MASK_SRC = (1 << CT_OPT_MASK_SRC_BIT), + + CT_OPT_MASK_DST_BIT = 12, + CT_OPT_MASK_DST = (1 << CT_OPT_MASK_DST_BIT), + + CT_OPT_NATRANGE_BIT = 13, + CT_OPT_NATRANGE = (1 << CT_OPT_NATRANGE_BIT), + + CT_OPT_MARK_BIT = 14, + CT_OPT_MARK = (1 << CT_OPT_MARK_BIT), + + CT_OPT_ID_BIT = 15, + CT_OPT_ID = (1 << CT_OPT_ID_BIT), + + CT_OPT_FAMILY_BIT = 16, + CT_OPT_FAMILY = (1 << CT_OPT_FAMILY_BIT), + + CT_OPT_SRC_NAT_BIT = 17, + CT_OPT_SRC_NAT = (1 << CT_OPT_SRC_NAT_BIT), + + CT_OPT_DST_NAT_BIT = 18, + CT_OPT_DST_NAT = (1 << CT_OPT_DST_NAT_BIT), + + CT_OPT_OUTPUT_BIT = 19, + CT_OPT_OUTPUT = (1 << CT_OPT_OUTPUT_BIT), + + CT_OPT_SECMARK_BIT = 20, + CT_OPT_SECMARK = (1 << CT_OPT_SECMARK_BIT), + + CT_OPT_BUFFERSIZE_BIT = 21, + CT_OPT_BUFFERSIZE = (1 << CT_OPT_BUFFERSIZE_BIT), + + CT_OPT_ANY_NAT_BIT = 22, + CT_OPT_ANY_NAT = (1 << CT_OPT_ANY_NAT_BIT), + + CT_OPT_ZONE_BIT = 23, + CT_OPT_ZONE = (1 << CT_OPT_ZONE_BIT), +}; +/* If you add a new option, you have to update NUMBER_OF_OPT in conntrack.h */ + +/* Update this mask to allow to filter based on new options. */ +#define CT_COMPARISON (CT_OPT_PROTO | CT_OPT_ORIG | CT_OPT_REPL | \ + CT_OPT_MARK | CT_OPT_SECMARK | CT_OPT_STATUS | \ + CT_OPT_ID | CT_OPT_ZONE) + static const char *optflags[NUMBER_OF_OPT] = { -"src","dst","reply-src","reply-dst","protonum","timeout","status","zero", -"event-mask","tuple-src","tuple-dst","mask-src","mask-dst","nat-range","mark", -"id","family","src-nat","dst-nat","output","secmark","buffersize"}; + [CT_OPT_ORIG_SRC_BIT] = "src", + [CT_OPT_ORIG_DST_BIT] = "dst", + [CT_OPT_REPL_SRC_BIT] = "reply-src", + [CT_OPT_REPL_DST_BIT] = "reply-dst", + [CT_OPT_PROTO_BIT] = "protonum", + [CT_OPT_TIMEOUT_BIT] = "timeout", + [CT_OPT_STATUS_BIT] = "status", + [CT_OPT_ZERO_BIT] = "zero", + [CT_OPT_EVENT_MASK_BIT] = "event-mask", + [CT_OPT_EXP_SRC_BIT] = "tuple-src", + [CT_OPT_EXP_DST_BIT] = "tuple-dst", + [CT_OPT_MASK_SRC_BIT] = "mask-src", + [CT_OPT_MASK_DST_BIT] = "mask-dst", + [CT_OPT_NATRANGE_BIT] = "nat-range", + [CT_OPT_MARK_BIT] = "mark", + [CT_OPT_ID_BIT] = "id", + [CT_OPT_FAMILY_BIT] = "family", + [CT_OPT_SRC_NAT_BIT] = "src-nat", + [CT_OPT_DST_NAT_BIT] = "dst-nat", + [CT_OPT_OUTPUT_BIT] = "output", + [CT_OPT_SECMARK_BIT] = "secmark", + [CT_OPT_BUFFERSIZE_BIT] = "buffer-size", + [CT_OPT_ANY_NAT_BIT] = "any-nat", + [CT_OPT_ZONE_BIT] = "zone", +}; static struct option original_opts[] = { {"dump", 2, 0, 'L'}, @@ -99,14 +308,14 @@ static struct option original_opts[] = { {"dst-nat", 2, 0, 'g'}, {"output", 1, 0, 'o'}, {"buffer-size", 1, 0, 'b'}, + {"any-nat", 2, 0, 'j'}, + {"zone", 1, 0, 'w'}, {0, 0, 0, 0} }; -#define OPTION_OFFSET 256 - -static struct nfct_handle *cth, *ith; -static struct option *opts = original_opts; -static unsigned int global_option_offset = 0; +static const char *getopt_str = "L::I::U::D::G::E::F::hVs:d:r:q:" + "p:t:u:e:a:z[:]:{:}:m:i:f:o:n::" + "g::c:b:C::Sj::w:"; /* Table of legal combinations of commands and options. If any of the * given commands make an option legal, that option is legal (applies to @@ -121,27 +330,143 @@ static unsigned int global_option_offset = 0; static char commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT] = /* Well, it's better than "Re: Linux vs FreeBSD" */ { - /* s d r q p t u z e [ ] { } a m i f n g o c b*/ -/*CT_LIST*/ {2,2,2,2,2,0,2,2,0,0,0,0,0,0,2,0,2,2,2,2,2,0}, -/*CT_CREATE*/ {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0}, -/*CT_UPDATE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0}, -/*CT_DELETE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0}, -/*CT_GET*/ {3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0}, -/*CT_FLUSH*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*CT_EVENT*/ {2,2,2,2,2,0,0,0,2,0,0,0,0,0,2,0,0,2,2,2,2,2}, -/*VERSION*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*HELP*/ {0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_LIST*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0}, -/*EXP_CREATE*/{1,1,2,2,1,1,2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0}, -/*EXP_DELETE*/{1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_GET*/ {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_FLUSH*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_EVENT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*CT_COUNT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*EXP_COUNT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, -/*X_STATS*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + /* s d r q p t u z e [ ] { } a m i f n g o c b j w*/ +/*CT_LIST*/ {2,2,2,2,2,0,2,2,0,0,0,0,0,0,2,0,2,2,2,2,2,0,2,2}, +/*CT_CREATE*/ {3,3,3,3,1,1,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,0,0,2}, +/*CT_UPDATE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0}, +/*CT_DELETE*/ {2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,2}, +/*CT_GET*/ {3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0}, +/*CT_FLUSH*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*CT_EVENT*/ {2,2,2,2,2,0,0,0,2,0,0,0,0,0,2,0,0,2,2,2,2,2,2,2}, +/*VERSION*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*HELP*/ {0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_LIST*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0}, +/*EXP_CREATE*/{1,1,2,2,1,1,2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_DELETE*/{1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_GET*/ {1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_FLUSH*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_EVENT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*CT_COUNT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*EXP_COUNT*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +/*X_STATS*/ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, +}; + +static const int cmd2type[][2] = { + ['L'] = { CT_LIST, EXP_LIST }, + ['I'] = { CT_CREATE, EXP_CREATE }, + ['D'] = { CT_DELETE, EXP_DELETE }, + ['G'] = { CT_GET, EXP_GET }, + ['F'] = { CT_FLUSH, EXP_FLUSH }, + ['E'] = { CT_EVENT, EXP_EVENT }, + ['V'] = { CT_VERSION, CT_VERSION }, + ['h'] = { CT_HELP, CT_HELP }, + ['C'] = { CT_COUNT, EXP_COUNT }, +}; + +static const int opt2type[] = { + ['s'] = CT_OPT_ORIG_SRC, + ['d'] = CT_OPT_ORIG_DST, + ['r'] = CT_OPT_REPL_SRC, + ['q'] = CT_OPT_REPL_DST, + ['{'] = CT_OPT_MASK_SRC, + ['}'] = CT_OPT_MASK_DST, + ['['] = CT_OPT_EXP_SRC, + [']'] = CT_OPT_EXP_DST, + ['n'] = CT_OPT_SRC_NAT, + ['g'] = CT_OPT_DST_NAT, + ['m'] = CT_OPT_MARK, + ['c'] = CT_OPT_SECMARK, + ['i'] = CT_OPT_ID, + ['j'] = CT_OPT_ANY_NAT, + ['w'] = CT_OPT_ZONE, }; +static const int opt2family_attr[][2] = { + ['s'] = { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, + ['d'] = { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, + ['r'] = { ATTR_REPL_IPV4_SRC, ATTR_REPL_IPV6_SRC }, + ['q'] = { ATTR_REPL_IPV4_DST, ATTR_REPL_IPV6_DST }, + ['{'] = { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, + ['}'] = { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, + ['['] = { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, + [']'] = { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, +}; + +static const int opt2attr[] = { + ['s'] = ATTR_ORIG_L3PROTO, + ['d'] = ATTR_ORIG_L3PROTO, + ['r'] = ATTR_REPL_L3PROTO, + ['q'] = ATTR_REPL_L3PROTO, + ['m'] = ATTR_MARK, + ['c'] = ATTR_SECMARK, + ['i'] = ATTR_ID, + ['w'] = ATTR_ZONE, +}; + +static char exit_msg[NUMBER_OF_CMD][64] = { + [CT_LIST_BIT] = "%d flow entries have been shown.\n", + [CT_CREATE_BIT] = "%d flow entries have been created.\n", + [CT_UPDATE_BIT] = "%d flow entries have been updated.\n", + [CT_DELETE_BIT] = "%d flow entries have been deleted.\n", + [CT_GET_BIT] = "%d flow entries have been shown.\n", + [CT_EVENT_BIT] = "%d flow events have been shown.\n", + [EXP_LIST_BIT] = "%d expectations have been shown.\n", + [EXP_DELETE_BIT] = "%d expectations have been shown.\n", +}; + +static const char usage_commands[] = + "Commands:\n" + " -L [table] [options]\t\tList conntrack or expectation table\n" + " -G [table] parameters\t\tGet conntrack or expectation\n" + " -D [table] parameters\t\tDelete conntrack or expectation\n" + " -I [table] parameters\t\tCreate a conntrack or expectation\n" + " -U [table] parameters\t\tUpdate a conntrack\n" + " -E [table] [options]\t\tShow events\n" + " -F [table]\t\t\tFlush table\n" + " -C [table]\t\t\tShow counter\n" + " -S\t\t\t\tShow statistics\n"; + +static const char usage_tables[] = + "Tables: conntrack, expect\n"; + +static const char usage_conntrack_parameters[] = + "Conntrack parameters and options:\n" + " -n, --src-nat ip\t\t\tsource NAT ip\n" + " -g, --dst-nat ip\t\t\tdestination NAT ip\n" + " -j, --any-nat ip\t\t\tsource or destination NAT ip\n" + " -m, --mark mark\t\t\tSet mark\n" + " -c, --secmark secmark\t\t\tSet selinux secmark\n" + " -e, --event-mask eventmask\t\tEvent mask, eg. NEW,DESTROY\n" + " -z, --zero \t\t\t\tZero counters while listing\n" + " -o, --output type[,...]\t\tOutput format, eg. xml\n"; + +static const char usage_expectation_parameters[] = + "Expectation parameters and options:\n" + " --tuple-src ip\tSource address in expect tuple\n" + " --tuple-dst ip\tDestination address in expect tuple\n" + " --mask-src ip\t\tSource mask address\n" + " --mask-dst ip\t\tDestination mask address\n"; + +static const char usage_parameters[] = + "Common parameters and options:\n" + " -s, --orig-src ip\t\tSource address from original direction\n" + " -d, --orig-dst ip\t\tDestination address from original direction\n" + " -r, --reply-src ip\t\tSource addres from reply direction\n" + " -q, --reply-dst ip\t\tDestination address from reply direction\n" + " -p, --protonum proto\t\tLayer 4 Protocol, eg. 'tcp'\n" + " -f, --family proto\t\tLayer 3 Protocol, eg. 'ipv6'\n" + " -t, --timeout timeout\t\tSet timeout\n" + " -u, --status status\t\tSet status, eg. ASSURED\n" + " -w, --zone value\t\tSet conntrack zone\n" + " -b, --buffer-size\t\tNetlink socket buffer size\n" + ; + +#define OPTION_OFFSET 256 + +static struct nfct_handle *cth, *ith; +static struct option *opts = original_opts; +static unsigned int global_option_offset = 0; + #define ADDR_VALID_FLAGS_MAX 2 static unsigned int addr_valid_flags[ADDR_VALID_FLAGS_MAX] = { CT_OPT_ORIG_SRC | CT_OPT_ORIG_DST, @@ -152,9 +477,6 @@ static LIST_HEAD(proto_list); static unsigned int options; -#define CT_COMPARISON (CT_OPT_PROTO | CT_OPT_ORIG | CT_OPT_REPL | CT_OPT_MARK |\ - CT_OPT_SECMARK | CT_OPT_STATUS | CT_OPT_ID) - void register_proto(struct ctproto_handler *h) { if (strcmp(h->version, VERSION) != 0) { @@ -348,11 +670,11 @@ merge_options(struct option *oldopts, const struct option *newopts, /* Translates errno numbers into more human-readable form than strerror. */ static const char * -err2str(int err, enum action command) +err2str(int err, enum ct_command command) { unsigned int i; struct table_struct { - enum action act; + enum ct_command act; int err; const char *message; } table [] = @@ -378,11 +700,32 @@ err2str(int err, enum action command) return strerror(err); } +static int mark_cmp(const struct u32_mask *m, const struct nf_conntrack *ct) +{ + return nfct_attr_is_set(ct, ATTR_MARK) && + (nfct_get_attr_u32(ct, ATTR_MARK) & m->mask) == m->value; +} + #define PARSE_STATUS 0 #define PARSE_EVENT 1 #define PARSE_OUTPUT 2 #define PARSE_MAX 3 +enum { + _O_XML = (1 << 0), + _O_EXT = (1 << 1), + _O_TMS = (1 << 2), + _O_ID = (1 << 3), + _O_KTMS = (1 << 4), +}; + +enum { + CT_EVENT_F_NEW = (1 << 0), + CT_EVENT_F_UPD = (1 << 1), + CT_EVENT_F_DEL = (1 << 2), + CT_EVENT_F_ALL = CT_EVENT_F_NEW | CT_EVENT_F_UPD | CT_EVENT_F_DEL, +}; + static struct parse_parameter { const char *parameter[6]; size_t size; @@ -391,10 +734,9 @@ static struct parse_parameter { { {"ASSURED", "SEEN_REPLY", "UNSET", "FIXED_TIMEOUT", "EXPECTED"}, 5, { IPS_ASSURED, IPS_SEEN_REPLY, 0, IPS_FIXED_TIMEOUT, IPS_EXPECTED} }, { {"ALL", "NEW", "UPDATES", "DESTROY"}, 4, - {~0U, NF_NETLINK_CONNTRACK_NEW, NF_NETLINK_CONNTRACK_UPDATE, - NF_NETLINK_CONNTRACK_DESTROY} }, - { {"xml", "extended", "timestamp", "id" }, 4, - { _O_XML, _O_EXT, _O_TMS, _O_ID }, + { CT_EVENT_F_ALL, CT_EVENT_F_NEW, CT_EVENT_F_UPD, CT_EVENT_F_DEL } }, + { {"xml", "extended", "timestamp", "id", "ktimestamp"}, 5, + { _O_XML, _O_EXT, _O_TMS, _O_ID, _O_KTMS }, }, }; @@ -446,6 +788,19 @@ parse_parameter(const char *arg, unsigned int *status, int parse_type) } static void +parse_u32_mask(const char *arg, struct u32_mask *m) +{ + char *end; + + m->value = (uint32_t) strtoul(arg, &end, 0); + + if (*end == '/') + m->mask = (uint32_t) strtoul(end+1, NULL, 0); + else + m->mask = ~0; +} + +static void add_command(unsigned int *cmd, const int newcmd) { if (*cmd) @@ -503,8 +858,7 @@ parse_inetaddr(const char *cp, struct addr_parse *parse) else if (inet_pton(AF_INET6, cp, &parse->addr6) > 0) return AF_INET6; #endif - - exit_error(PARAMETER_PROBLEM, "Invalid IP address `%s'", cp); + return AF_UNSPEC; } union ct_address { @@ -526,9 +880,8 @@ parse_addr(const char *cp, union ct_address *address) return ret; } -/* Shamelessly stolen from libipt_DNAT ;). Ranges expected in network order. */ static void -nat_parse(char *arg, int portok, struct nf_conntrack *obj, int type) +nat_parse(char *arg, struct nf_conntrack *obj, int type) { char *colon, *error; union ct_address parse; @@ -538,14 +891,18 @@ nat_parse(char *arg, int portok, struct nf_conntrack *obj, int type) if (colon) { uint16_t port; - if (!portok) - exit_error(PARAMETER_PROBLEM, - "Need TCP or UDP with port specification"); + *colon = '\0'; port = (uint16_t)atoi(colon+1); - if (port == 0) - exit_error(PARAMETER_PROBLEM, - "Port `%s' not valid", colon+1); + if (port == 0) { + if (strlen(colon+1) == 0) { + exit_error(PARAMETER_PROBLEM, + "No port specified after `:'"); + } else { + exit_error(PARAMETER_PROBLEM, + "Port `%s' not valid", colon+1); + } + } error = strchr(colon+1, ':'); if (error) @@ -553,66 +910,30 @@ nat_parse(char *arg, int portok, struct nf_conntrack *obj, int type) "Invalid port:port syntax"); if (type == CT_OPT_SRC_NAT) - nfct_set_attr_u16(obj, ATTR_SNAT_PORT, port); + nfct_set_attr_u16(tmpl.ct, ATTR_SNAT_PORT, ntohs(port)); else if (type == CT_OPT_DST_NAT) - nfct_set_attr_u16(obj, ATTR_DNAT_PORT, port); + nfct_set_attr_u16(tmpl.ct, ATTR_DNAT_PORT, ntohs(port)); + else if (type == CT_OPT_ANY_NAT) { + nfct_set_attr_u16(tmpl.ct, ATTR_SNAT_PORT, ntohs(port)); + nfct_set_attr_u16(tmpl.ct, ATTR_DNAT_PORT, ntohs(port)); + } } - if (parse_addr(arg, &parse) != AF_INET) - return; + if (parse_addr(arg, &parse) == AF_UNSPEC) { + if (strlen(arg) == 0) { + exit_error(PARAMETER_PROBLEM, "No IP specified"); + } else { + exit_error(PARAMETER_PROBLEM, + "Invalid IP address `%s'", arg); + } + } - if (type == CT_OPT_SRC_NAT) - nfct_set_attr_u32(obj, ATTR_SNAT_IPV4, parse.v4); - else if (type == CT_OPT_DST_NAT) - nfct_set_attr_u32(obj, ATTR_DNAT_IPV4, parse.v4); + if (type == CT_OPT_SRC_NAT || type == CT_OPT_ANY_NAT) + nfct_set_attr_u32(tmpl.ct, ATTR_SNAT_IPV4, parse.v4); + else if (type == CT_OPT_DST_NAT || type == CT_OPT_ANY_NAT) + nfct_set_attr_u32(tmpl.ct, ATTR_DNAT_IPV4, parse.v4); } -static const char usage_commands[] = - "Commands:\n" - " -L [table] [options]\t\tList conntrack or expectation table\n" - " -G [table] parameters\t\tGet conntrack or expectation\n" - " -D [table] parameters\t\tDelete conntrack or expectation\n" - " -I [table] parameters\t\tCreate a conntrack or expectation\n" - " -U [table] parameters\t\tUpdate a conntrack\n" - " -E [table] [options]\t\tShow events\n" - " -F [table]\t\t\tFlush table\n" - " -C [table]\t\t\tShow counter\n" - " -S\t\t\t\tShow statistics\n"; - -static const char usage_tables[] = - "Tables: conntrack, expect\n"; - -static const char usage_conntrack_parameters[] = - "Conntrack parameters and options:\n" - " -n, --src-nat ip\t\t\tsource NAT ip\n" - " -g, --dst-nat ip\t\t\tdestination NAT ip\n" - " -m, --mark mark\t\t\tSet mark\n" - " -c, --secmark secmark\t\t\tSet selinux secmark\n" - " -e, --event-mask eventmask\t\tEvent mask, eg. NEW,DESTROY\n" - " -z, --zero \t\t\t\tZero counters while listing\n" - " -o, --output type[,...]\t\tOutput format, eg. xml\n"; - -static const char usage_expectation_parameters[] = - "Expectation parameters and options:\n" - " --tuple-src ip\tSource address in expect tuple\n" - " --tuple-dst ip\tDestination address in expect tuple\n" - " --mask-src ip\t\tSource mask address\n" - " --mask-dst ip\t\tDestination mask address\n"; - -static const char usage_parameters[] = - "Common parameters and options:\n" - " -s, --orig-src ip\t\tSource address from original direction\n" - " -d, --orig-dst ip\t\tDestination address from original direction\n" - " -r, --reply-src ip\t\tSource addres from reply direction\n" - " -q, --reply-dst ip\t\tDestination address from reply direction\n" - " -p, --protonum proto\t\tLayer 4 Protocol, eg. 'tcp'\n" - " -f, --family proto\t\tLayer 3 Protocol, eg. 'ipv6'\n" - " -t, --timeout timeout\t\tSet timeout\n" - " -u, --status status\t\tSet status, eg. ASSURED\n" - " -b, --buffer-size\t\tNetlink socket buffer size\n" - ; - - static void usage(char *prog) { @@ -629,31 +950,97 @@ usage(char *prog) static unsigned int output_mask; + +static int +filter_mark(const struct nf_conntrack *ct) +{ + if ((options & CT_OPT_MARK) && + !mark_cmp(&tmpl.mark, ct)) + return 1; + return 0; +} + + static int filter_nat(const struct nf_conntrack *obj, const struct nf_conntrack *ct) { + int check_srcnat = options & CT_OPT_SRC_NAT ? 1 : 0; + int check_dstnat = options & CT_OPT_DST_NAT ? 1 : 0; + int has_srcnat = 0, has_dstnat = 0; uint32_t ip; + uint16_t port; + + if (options & CT_OPT_ANY_NAT) + check_srcnat = check_dstnat = 1; - if (options & CT_OPT_SRC_NAT) { - if (!nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT)) - return 1; + if (check_srcnat) { + int check_address = 0, check_port = 0; if (nfct_attr_is_set(obj, ATTR_SNAT_IPV4)) { + check_address = 1; ip = nfct_get_attr_u32(obj, ATTR_SNAT_IPV4); - if (ip != nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST)) - return 1; + if (nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT) && + ip == nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST)) + has_srcnat = 1; + } + if (nfct_attr_is_set(obj, ATTR_SNAT_PORT)) { + int ret = 0; + + check_port = 1; + port = nfct_get_attr_u16(obj, ATTR_SNAT_PORT); + if (nfct_getobjopt(ct, NFCT_GOPT_IS_SPAT) && + port == nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST)) + ret = 1; + + /* the address matches but the port does not. */ + if (check_address && has_srcnat && !ret) + has_srcnat = 0; + if (!check_address && ret) + has_srcnat = 1; } + if (!check_address && !check_port && + (nfct_getobjopt(ct, NFCT_GOPT_IS_SNAT) || + nfct_getobjopt(ct, NFCT_GOPT_IS_SPAT))) + has_srcnat = 1; } - if (options & CT_OPT_DST_NAT) { - if (!nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT)) - return 1; + if (check_dstnat) { + int check_address = 0, check_port = 0; if (nfct_attr_is_set(obj, ATTR_DNAT_IPV4)) { + check_address = 1; ip = nfct_get_attr_u32(obj, ATTR_DNAT_IPV4); - if (ip != nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC)) - return 1; + if (nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT) && + ip == nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC)) + has_dstnat = 1; } + if (nfct_attr_is_set(obj, ATTR_DNAT_PORT)) { + int ret = 0; + + check_port = 1; + port = nfct_get_attr_u16(obj, ATTR_DNAT_PORT); + if (nfct_getobjopt(ct, NFCT_GOPT_IS_DPAT) && + port == nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC)) + ret = 1; + + /* the address matches but the port does not. */ + if (check_address && has_dstnat && !ret) + has_dstnat = 0; + if (!check_address && ret) + has_dstnat = 1; + } + if (!check_address && !check_port && + (nfct_getobjopt(ct, NFCT_GOPT_IS_DNAT) || + nfct_getobjopt(ct, NFCT_GOPT_IS_DPAT))) + has_dstnat = 1; } + if (options & CT_OPT_ANY_NAT) + return !(has_srcnat || has_dstnat); + else if ((options & CT_OPT_SRC_NAT) && (options & CT_OPT_DST_NAT)) + return !(has_srcnat && has_dstnat); + else if (options & CT_OPT_SRC_NAT) + return !has_srcnat; + else if (options & CT_OPT_DST_NAT) + return !has_dstnat; return 0; } @@ -687,6 +1074,9 @@ static int event_cb(enum nf_conntrack_msg_type type, if (filter_nat(obj, ct)) return NFCT_CB_CONTINUE; + if (filter_mark(ct)) + return NFCT_CB_CONTINUE; + if (options & CT_COMPARISON && !nfct_cmp(obj, ct, NFCT_CMP_ALL | NFCT_CMP_MASK)) return NFCT_CB_CONTINUE; @@ -709,6 +1099,8 @@ static int event_cb(enum nf_conntrack_msg_type type, } else op_flags |= NFCT_OF_TIME; } + if (output_mask & _O_KTMS) + op_flags |= NFCT_OF_TIMESTAMP; if (output_mask & _O_ID) op_flags |= NFCT_OF_ID; @@ -734,6 +1126,9 @@ static int dump_cb(enum nf_conntrack_msg_type type, if (filter_nat(obj, ct)) return NFCT_CB_CONTINUE; + if (filter_mark(ct)) + return NFCT_CB_CONTINUE; + if (options & CT_COMPARISON && !nfct_cmp(obj, ct, NFCT_CMP_ALL | NFCT_CMP_MASK)) return NFCT_CB_CONTINUE; @@ -748,6 +1143,8 @@ static int dump_cb(enum nf_conntrack_msg_type type, } if (output_mask & _O_EXT) op_flags = NFCT_OF_SHOW_LAYER3; + if (output_mask & _O_KTMS) + op_flags |= NFCT_OF_TIMESTAMP; if (output_mask & _O_ID) op_flags |= NFCT_OF_ID; @@ -772,6 +1169,9 @@ static int delete_cb(enum nf_conntrack_msg_type type, if (filter_nat(obj, ct)) return NFCT_CB_CONTINUE; + if (filter_mark(ct)) + return NFCT_CB_CONTINUE; + if (options & CT_COMPARISON && !nfct_cmp(obj, ct, NFCT_CMP_ALL | NFCT_CMP_MASK)) return NFCT_CB_CONTINUE; @@ -818,16 +1218,23 @@ static int print_cb(enum nf_conntrack_msg_type type, return NFCT_CB_CONTINUE; } +static void copy_mark(struct nf_conntrack *tmp, + const struct nf_conntrack *ct, + const struct u32_mask *m) +{ + if (options & CT_OPT_MARK) { + uint32_t mark = nfct_get_attr_u32(ct, ATTR_MARK); + mark = (mark & ~m->mask) ^ m->value; + nfct_set_attr_u32(tmp, ATTR_MARK, mark); + } +} + static int update_cb(enum nf_conntrack_msg_type type, struct nf_conntrack *ct, void *data) { int res; - struct nf_conntrack *obj = data; - char __tmp[nfct_maxsize()]; - struct nf_conntrack *tmp = (struct nf_conntrack *) (void *)__tmp; - - memset(tmp, 0, sizeof(__tmp)); + struct nf_conntrack *obj = data, *tmp; if (filter_nat(obj, ct)) return NFCT_CB_CONTINUE; @@ -841,30 +1248,42 @@ static int update_cb(enum nf_conntrack_msg_type type, if (options & CT_OPT_TUPLE_REPL && !nfct_cmp(obj, ct, NFCT_CMP_REPL)) return NFCT_CB_CONTINUE; + tmp = nfct_new(); + if (tmp == NULL) + exit_error(OTHER_PROBLEM, "out of memory"); + nfct_copy(tmp, ct, NFCT_CP_ORIG); nfct_copy(tmp, obj, NFCT_CP_META); + copy_mark(tmp, ct, &tmpl.mark); + + /* do not send NFCT_Q_UPDATE if ct appears unchanged */ + if (nfct_cmp(tmp, ct, NFCT_CMP_ALL | NFCT_CMP_MASK)) { + nfct_destroy(tmp); + return NFCT_CB_CONTINUE; + } res = nfct_query(ith, NFCT_Q_UPDATE, tmp); - if (res < 0) + if (res < 0) { + nfct_destroy(tmp); exit_error(OTHER_PROBLEM, "Operation failed: %s", err2str(errno, CT_UPDATE)); - + } nfct_callback_register(ith, NFCT_T_ALL, print_cb, NULL); res = nfct_query(ith, NFCT_Q_GET, tmp); if (res < 0) { + nfct_destroy(tmp); /* the entry has vanish in middle of the update */ if (errno == ENOENT) { nfct_callback_unregister(ith); return NFCT_CB_CONTINUE; } - exit_error(OTHER_PROBLEM, "Operation failed: %s", err2str(errno, CT_UPDATE)); } - + nfct_destroy(tmp); nfct_callback_unregister(ith); counter++; @@ -885,6 +1304,18 @@ static int dump_exp_cb(enum nf_conntrack_msg_type type, return NFCT_CB_CONTINUE; } +static int event_exp_cb(enum nf_conntrack_msg_type type, + struct nf_expect *exp, void *data) +{ + char buf[1024]; + + nfexp_snprintf(buf,sizeof(buf), exp, type, NFCT_O_DEFAULT, 0); + printf("%s\n", buf); + counter++; + + return NFCT_CB_CONTINUE; +} + static int count_exp_cb(enum nf_conntrack_msg_type type, struct nf_expect *exp, void *data) @@ -926,10 +1357,9 @@ static int display_proc_conntrack_stats(void) /* trim off trailing \n */ nl = strchr(buf, '\n'); - if (nl != NULL) { + if (nl != NULL) *nl = '\0'; - nl = strchr(buf, '\n'); - } + token = strtok(buf, " "); for (i=0; token != NULL && i<CT_STATS_ENTRIES_MAX; i++) { strncpy(output[i], token, CT_STATS_STRING_MAX); @@ -964,66 +1394,6 @@ out_err: static struct ctproto_handler *h; -static const int cmd2type[][2] = { - ['L'] = { CT_LIST, EXP_LIST }, - ['I'] = { CT_CREATE, EXP_CREATE }, - ['D'] = { CT_DELETE, EXP_DELETE }, - ['G'] = { CT_GET, EXP_GET }, - ['F'] = { CT_FLUSH, EXP_FLUSH }, - ['E'] = { CT_EVENT, EXP_EVENT }, - ['V'] = { CT_VERSION, CT_VERSION }, - ['h'] = { CT_HELP, CT_HELP }, - ['C'] = { CT_COUNT, EXP_COUNT }, -}; - -static const int opt2type[] = { - ['s'] = CT_OPT_ORIG_SRC, - ['d'] = CT_OPT_ORIG_DST, - ['r'] = CT_OPT_REPL_SRC, - ['q'] = CT_OPT_REPL_DST, - ['{'] = CT_OPT_MASK_SRC, - ['}'] = CT_OPT_MASK_DST, - ['['] = CT_OPT_EXP_SRC, - [']'] = CT_OPT_EXP_DST, - ['n'] = CT_OPT_SRC_NAT, - ['g'] = CT_OPT_DST_NAT, - ['m'] = CT_OPT_MARK, - ['c'] = CT_OPT_SECMARK, - ['i'] = CT_OPT_ID, -}; - -static const int opt2family_attr[][2] = { - ['s'] = { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, - ['d'] = { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, - ['r'] = { ATTR_REPL_IPV4_SRC, ATTR_REPL_IPV6_SRC }, - ['q'] = { ATTR_REPL_IPV4_DST, ATTR_REPL_IPV6_DST }, - ['{'] = { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, - ['}'] = { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, - ['['] = { ATTR_ORIG_IPV4_SRC, ATTR_ORIG_IPV6_SRC }, - [']'] = { ATTR_ORIG_IPV4_DST, ATTR_ORIG_IPV6_DST }, -}; - -static const int opt2attr[] = { - ['s'] = ATTR_ORIG_L3PROTO, - ['d'] = ATTR_ORIG_L3PROTO, - ['r'] = ATTR_REPL_L3PROTO, - ['q'] = ATTR_REPL_L3PROTO, - ['m'] = ATTR_MARK, - ['c'] = ATTR_SECMARK, - ['i'] = ATTR_ID, -}; - -static char exit_msg[NUMBER_OF_CMD][64] = { - [CT_LIST_BIT] = "%d flow entries have been shown.\n", - [CT_CREATE_BIT] = "%d flow entries have been created.\n", - [CT_UPDATE_BIT] = "%d flow entries have been updated.\n", - [CT_DELETE_BIT] = "%d flow entries have been deleted.\n", - [CT_GET_BIT] = "%d flow entries have been shown.\n", - [CT_EVENT_BIT] = "%d flow events have been shown.\n", - [EXP_LIST_BIT] = "%d expectations have been shown.\n", - [EXP_DELETE_BIT] = "%d expectations have been shown.\n", -}; - int main(int argc, char *argv[]) { int c, cmd; @@ -1031,23 +1401,13 @@ int main(int argc, char *argv[]) int res = 0, partial; size_t socketbuffersize = 0; int family = AF_UNSPEC; - char __obj[nfct_maxsize()]; - char __exptuple[nfct_maxsize()]; - char __mask[nfct_maxsize()]; - struct nf_conntrack *obj = (struct nf_conntrack *)(void*) __obj; - struct nf_conntrack *exptuple = - (struct nf_conntrack *)(void*) __exptuple; - struct nf_conntrack *mask = (struct nf_conntrack *)(void*) __mask; - char __exp[nfexp_maxsize()]; - struct nf_expect *exp = (struct nf_expect *)(void*) __exp; int l3protonum, protonum = 0; union ct_address ad; unsigned int command = 0; - memset(__obj, 0, sizeof(__obj)); - memset(__exptuple, 0, sizeof(__exptuple)); - memset(__mask, 0, sizeof(__mask)); - memset(__exp, 0, sizeof(__exp)); + /* we release these objects in the exit_error() path. */ + if (!alloc_tmpl_objects()) + exit_error(OTHER_PROBLEM, "out of memory"); register_tcp(); register_udp(); @@ -1062,10 +1422,7 @@ int main(int argc, char *argv[]) /* disable explicit missing arguments error output from getopt_long */ opterr = 0; - while ((c = getopt_long(argc, argv, "L::I::U::D::G::E::F::hVs:d:r:q:" - "p:t:u:e:a:z[:]:{:}:m:i:f:o:n::" - "g::c:b:C::S", - opts, NULL)) != -1) { + while ((c = getopt_long(argc, argv, getopt_str, opts, NULL)) != -1) { switch(c) { /* commands */ case 'L': @@ -1099,17 +1456,21 @@ int main(int argc, char *argv[]) options |= opt2type[c]; l3protonum = parse_addr(optarg, &ad); + if (l3protonum == AF_UNSPEC) { + exit_error(PARAMETER_PROBLEM, + "Invalid IP address `%s'", optarg); + } set_family(&family, l3protonum); if (l3protonum == AF_INET) { - nfct_set_attr_u32(obj, + nfct_set_attr_u32(tmpl.ct, opt2family_attr[c][0], ad.v4); } else if (l3protonum == AF_INET6) { - nfct_set_attr(obj, + nfct_set_attr(tmpl.ct, opt2family_attr[c][1], &ad.v6); } - nfct_set_attr_u8(obj, opt2attr[c], l3protonum); + nfct_set_attr_u8(tmpl.ct, opt2attr[c], l3protonum); break; case '{': case '}': @@ -1117,17 +1478,22 @@ int main(int argc, char *argv[]) case ']': options |= opt2type[c]; l3protonum = parse_addr(optarg, &ad); + if (l3protonum == AF_UNSPEC) { + exit_error(PARAMETER_PROBLEM, + "Invalid IP address `%s'", optarg); + } set_family(&family, l3protonum); if (l3protonum == AF_INET) { - nfct_set_attr_u32(mask, + nfct_set_attr_u32(tmpl.mask, opt2family_attr[c][0], ad.v4); } else if (l3protonum == AF_INET6) { - nfct_set_attr(mask, + nfct_set_attr(tmpl.mask, opt2family_attr[c][1], &ad.v6); } - nfct_set_attr_u8(mask, ATTR_ORIG_L3PROTO, l3protonum); + nfct_set_attr_u8(tmpl.mask, + ATTR_ORIG_L3PROTO, l3protonum); break; case 'p': options |= CT_OPT_PROTO; @@ -1141,17 +1507,18 @@ int main(int argc, char *argv[]) if (opts == NULL) exit_error(OTHER_PROBLEM, "out of memory"); - nfct_set_attr_u8(obj, ATTR_L4PROTO, protonum); + nfct_set_attr_u8(tmpl.ct, ATTR_L4PROTO, protonum); break; case 't': options |= CT_OPT_TIMEOUT; - nfct_set_attr_u32(obj, ATTR_TIMEOUT, atol(optarg)); - nfexp_set_attr_u32(exp, ATTR_EXP_TIMEOUT, atol(optarg)); + nfct_set_attr_u32(tmpl.ct, ATTR_TIMEOUT, atol(optarg)); + nfexp_set_attr_u32(tmpl.exp, + ATTR_EXP_TIMEOUT, atol(optarg)); break; case 'u': options |= CT_OPT_STATUS; parse_parameter(optarg, &status, PARSE_STATUS); - nfct_set_attr_u32(obj, ATTR_STATUS, status); + nfct_set_attr_u32(tmpl.ct, ATTR_STATUS, status); break; case 'e': options |= CT_OPT_EVENT_MASK; @@ -1165,7 +1532,8 @@ int main(int argc, char *argv[]) options |= CT_OPT_ZERO; break; case 'n': - case 'g': { + case 'g': + case 'j': { char *tmp = NULL; options |= opt2type[c]; @@ -1180,17 +1548,26 @@ int main(int argc, char *argv[]) continue; set_family(&family, AF_INET); - nat_parse(tmp, 1, obj, opt2type[c]); + nat_parse(tmp, tmpl.ct, opt2type[c]); break; } + case 'w': + options |= opt2type[c]; + nfct_set_attr_u16(tmpl.ct, + opt2attr[c], + strtoul(optarg, NULL, 0)); + break; case 'i': - case 'm': case 'c': options |= opt2type[c]; - nfct_set_attr_u32(obj, + nfct_set_attr_u32(tmpl.ct, opt2attr[c], strtoul(optarg, NULL, 0)); break; + case 'm': + options |= opt2type[c]; + parse_u32_mask(optarg, &tmpl.mark); + break; case 'a': fprintf(stderr, "WARNING: ignoring -%c, " "deprecated option.\n", c); @@ -1222,8 +1599,9 @@ int main(int argc, char *argv[]) break; default: if (h && h->parse_opts - &&!h->parse_opts(c - h->option_offset, obj, - exptuple, mask, &l4flags)) + &&!h->parse_opts(c - h->option_offset, tmpl.ct, + tmpl.exptuple, tmpl.mask, + &l4flags)) exit_error(PARAMETER_PROBLEM, "parse error"); break; } @@ -1233,6 +1611,12 @@ int main(int argc, char *argv[]) if (family == AF_UNSPEC) family = AF_INET; + /* we cannot check this combination with generic_opt_check. */ + if (options & CT_OPT_ANY_NAT && + ((options & CT_OPT_SRC_NAT) || (options & CT_OPT_DST_NAT))) { + exit_error(PARAMETER_PROBLEM, "cannot specify `--src-nat' or " + "`--dst-nat' with `--any-nat'"); + } cmd = bit2cmd(command); res = generic_opt_check(options, NUMBER_OF_OPT, commands_v_options[cmd], optflags, @@ -1253,7 +1637,7 @@ int main(int argc, char *argv[]) } } if (!(command & CT_HELP) && h && h->final_check) - h->final_check(l4flags, cmd, obj); + h->final_check(l4flags, cmd, tmpl.ct); switch(command) { @@ -1267,7 +1651,7 @@ int main(int argc, char *argv[]) exit_error(PARAMETER_PROBLEM, "Can't use -z with " "filtering parameters"); - nfct_callback_register(cth, NFCT_T_ALL, dump_cb, obj); + nfct_callback_register(cth, NFCT_T_ALL, dump_cb, tmpl.ct); if (options & CT_OPT_ZERO) res = nfct_query(cth, NFCT_Q_DUMP_RESET, &family); @@ -1294,30 +1678,33 @@ int main(int argc, char *argv[]) case CT_CREATE: if ((options & CT_OPT_ORIG) && !(options & CT_OPT_REPL)) - nfct_setobjopt(obj, NFCT_SOPT_SETUP_REPLY); + nfct_setobjopt(tmpl.ct, NFCT_SOPT_SETUP_REPLY); else if (!(options & CT_OPT_ORIG) && (options & CT_OPT_REPL)) - nfct_setobjopt(obj, NFCT_SOPT_SETUP_ORIGINAL); + nfct_setobjopt(tmpl.ct, NFCT_SOPT_SETUP_ORIGINAL); + + if (options & CT_OPT_MARK) + nfct_set_attr_u32(tmpl.ct, ATTR_MARK, tmpl.mark.value); cth = nfct_open(CONNTRACK, 0); if (!cth) exit_error(OTHER_PROBLEM, "Can't open handler"); - res = nfct_query(cth, NFCT_Q_CREATE, obj); + res = nfct_query(cth, NFCT_Q_CREATE, tmpl.ct); if (res != -1) counter++; nfct_close(cth); break; case EXP_CREATE: - nfexp_set_attr(exp, ATTR_EXP_MASTER, obj); - nfexp_set_attr(exp, ATTR_EXP_EXPECTED, exptuple); - nfexp_set_attr(exp, ATTR_EXP_MASK, mask); + nfexp_set_attr(tmpl.exp, ATTR_EXP_MASTER, tmpl.ct); + nfexp_set_attr(tmpl.exp, ATTR_EXP_EXPECTED, tmpl.exptuple); + nfexp_set_attr(tmpl.exp, ATTR_EXP_MASK, tmpl.mask); cth = nfct_open(EXPECT, 0); if (!cth) exit_error(OTHER_PROBLEM, "Can't open handler"); - res = nfexp_query(cth, NFCT_Q_CREATE, exp); + res = nfexp_query(cth, NFCT_Q_CREATE, tmpl.exp); nfct_close(cth); break; @@ -1328,7 +1715,7 @@ int main(int argc, char *argv[]) if (!cth || !ith) exit_error(OTHER_PROBLEM, "Can't open handler"); - nfct_callback_register(cth, NFCT_T_ALL, update_cb, obj); + nfct_callback_register(cth, NFCT_T_ALL, update_cb, tmpl.ct); res = nfct_query(cth, NFCT_Q_DUMP, &family); nfct_close(ith); @@ -1341,7 +1728,7 @@ int main(int argc, char *argv[]) if (!cth || !ith) exit_error(OTHER_PROBLEM, "Can't open handler"); - nfct_callback_register(cth, NFCT_T_ALL, delete_cb, obj); + nfct_callback_register(cth, NFCT_T_ALL, delete_cb, tmpl.ct); res = nfct_query(cth, NFCT_Q_DUMP, &family); nfct_close(ith); @@ -1349,13 +1736,13 @@ int main(int argc, char *argv[]) break; case EXP_DELETE: - nfexp_set_attr(exp, ATTR_EXP_EXPECTED, obj); + nfexp_set_attr(tmpl.exp, ATTR_EXP_EXPECTED, tmpl.ct); cth = nfct_open(EXPECT, 0); if (!cth) exit_error(OTHER_PROBLEM, "Can't open handler"); - res = nfexp_query(cth, NFCT_Q_DESTROY, exp); + res = nfexp_query(cth, NFCT_Q_DESTROY, tmpl.exp); nfct_close(cth); break; @@ -1364,20 +1751,20 @@ int main(int argc, char *argv[]) if (!cth) exit_error(OTHER_PROBLEM, "Can't open handler"); - nfct_callback_register(cth, NFCT_T_ALL, dump_cb, obj); - res = nfct_query(cth, NFCT_Q_GET, obj); + nfct_callback_register(cth, NFCT_T_ALL, dump_cb, tmpl.ct); + res = nfct_query(cth, NFCT_Q_GET, tmpl.ct); nfct_close(cth); break; case EXP_GET: - nfexp_set_attr(exp, ATTR_EXP_MASTER, obj); + nfexp_set_attr(tmpl.exp, ATTR_EXP_MASTER, tmpl.ct); cth = nfct_open(EXPECT, 0); if (!cth) exit_error(OTHER_PROBLEM, "Can't open handler"); nfexp_callback_register(cth, NFCT_T_ALL, dump_exp_cb, NULL); - res = nfexp_query(cth, NFCT_Q_GET, exp); + res = nfexp_query(cth, NFCT_Q_GET, tmpl.exp); nfct_close(cth); break; @@ -1397,14 +1784,28 @@ int main(int argc, char *argv[]) exit_error(OTHER_PROBLEM, "Can't open handler"); res = nfexp_query(cth, NFCT_Q_FLUSH, &family); nfct_close(cth); + fprintf(stderr, "%s v%s (conntrack-tools): ",PROGNAME,VERSION); + fprintf(stderr,"expectation table has been emptied.\n"); break; case CT_EVENT: - if (options & CT_OPT_EVENT_MASK) + if (options & CT_OPT_EVENT_MASK) { + unsigned int nl_events = 0; + + if (event_mask & CT_EVENT_F_NEW) + nl_events |= NF_NETLINK_CONNTRACK_NEW; + if (event_mask & CT_EVENT_F_UPD) + nl_events |= NF_NETLINK_CONNTRACK_UPDATE; + if (event_mask & CT_EVENT_F_DEL) + nl_events |= NF_NETLINK_CONNTRACK_DESTROY; + + cth = nfct_open(CONNTRACK, nl_events); + } else { cth = nfct_open(CONNTRACK, - event_mask & NFCT_ALL_CT_GROUPS); - else - cth = nfct_open(CONNTRACK, NFCT_ALL_CT_GROUPS); + NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY); + } if (!cth) exit_error(OTHER_PROBLEM, "Can't open handler"); @@ -1417,7 +1818,7 @@ int main(int argc, char *argv[]) } signal(SIGINT, event_sighandler); signal(SIGTERM, event_sighandler); - nfct_callback_register(cth, NFCT_T_ALL, event_cb, obj); + nfct_callback_register(cth, NFCT_T_ALL, event_cb, tmpl.ct); res = nfct_catch(cth); if (res == -1) { if (errno == ENOBUFS) { @@ -1434,12 +1835,29 @@ int main(int argc, char *argv[]) break; case EXP_EVENT: - cth = nfct_open(EXPECT, NF_NETLINK_CONNTRACK_EXP_NEW); + if (options & CT_OPT_EVENT_MASK) { + unsigned int nl_events = 0; + + if (event_mask & CT_EVENT_F_NEW) + nl_events |= NF_NETLINK_CONNTRACK_EXP_NEW; + if (event_mask & CT_EVENT_F_UPD) + nl_events |= NF_NETLINK_CONNTRACK_EXP_UPDATE; + if (event_mask & CT_EVENT_F_DEL) + nl_events |= NF_NETLINK_CONNTRACK_EXP_DESTROY; + + cth = nfct_open(CONNTRACK, nl_events); + } else { + cth = nfct_open(EXPECT, + NF_NETLINK_CONNTRACK_EXP_NEW | + NF_NETLINK_CONNTRACK_EXP_UPDATE | + NF_NETLINK_CONNTRACK_EXP_DESTROY); + } + if (!cth) exit_error(OTHER_PROBLEM, "Can't open handler"); signal(SIGINT, event_sighandler); signal(SIGTERM, event_sighandler); - nfexp_callback_register(cth, NFCT_T_ALL, dump_exp_cb, NULL); + nfexp_callback_register(cth, NFCT_T_ALL, event_exp_cb, NULL); res = nfexp_catch(cth); nfct_close(cth); break; @@ -1491,6 +1909,7 @@ int main(int argc, char *argv[]) exit_error(OTHER_PROBLEM, "Operation failed: %s", err2str(errno, command)); + free_tmpl_objects(); free_options(); if (command && exit_msg[cmd][0]) { diff --git a/src/external_cache.c b/src/external_cache.c index c70c818..e290249 100644 --- a/src/external_cache.c +++ b/src/external_cache.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2009 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -25,25 +26,35 @@ #include <stdlib.h> static struct cache *external; +static struct cache *external_exp; static int external_cache_init(void) { - external = cache_create("external", + external = cache_create("external", CACHE_T_CT, STATE_SYNC(sync)->external_cache_flags, - NULL); + NULL, &cache_sync_external_ct_ops); if (external == NULL) { dlog(LOG_ERR, "can't allocate memory for the external cache"); return -1; } + external_exp = cache_create("external", CACHE_T_EXP, + STATE_SYNC(sync)->external_cache_flags, + NULL, &cache_sync_external_exp_ops); + if (external_exp == NULL) { + dlog(LOG_ERR, "can't allocate memory for the external cache"); + return -1; + } + return 0; } static void external_cache_close(void) { cache_destroy(external); + cache_destroy(external_exp); } -static void external_cache_new(struct nf_conntrack *ct) +static void external_cache_ct_new(struct nf_conntrack *ct) { struct cache_object *obj; int id; @@ -66,12 +77,12 @@ retry: } } -static void external_cache_upd(struct nf_conntrack *ct) +static void external_cache_ct_upd(struct nf_conntrack *ct) { cache_update_force(external, ct); } -static void external_cache_del(struct nf_conntrack *ct) +static void external_cache_ct_del(struct nf_conntrack *ct) { struct cache_object *obj; int id; @@ -83,40 +94,117 @@ static void external_cache_del(struct nf_conntrack *ct) } } -static void external_cache_dump(int fd, int type) +static void external_cache_ct_dump(int fd, int type) { cache_dump(external, fd, type); } -static void external_cache_commit(struct nfct_handle *h, int fd) +static int external_cache_ct_commit(struct nfct_handle *h, int fd) { - cache_commit(external, h, fd); + return cache_commit(external, h, fd); } -static void external_cache_flush(void) +static void external_cache_ct_flush(void) { cache_flush(external); } -static void external_cache_stats(int fd) +static void external_cache_ct_stats(int fd) { cache_stats(external, fd); } -static void external_cache_stats_ext(int fd) +static void external_cache_ct_stats_ext(int fd) { cache_stats_extended(external, fd); } +static void external_cache_exp_new(struct nf_expect *exp) +{ + struct cache_object *obj; + int id; + + obj = cache_find(external_exp, exp, &id); + if (obj == NULL) { +retry: + obj = cache_object_new(external_exp, exp); + if (obj == NULL) + return; + + if (cache_add(external_exp, obj, id) == -1) { + cache_object_free(obj); + return; + } + } else { + cache_del(external_exp, obj); + cache_object_free(obj); + goto retry; + } +} + +static void external_cache_exp_upd(struct nf_expect *exp) +{ + cache_update_force(external_exp, exp); +} + +static void external_cache_exp_del(struct nf_expect *exp) +{ + struct cache_object *obj; + int id; + + obj = cache_find(external_exp, exp, &id); + if (obj) { + cache_del(external_exp, obj); + cache_object_free(obj); + } +} + +static void external_cache_exp_dump(int fd, int type) +{ + cache_dump(external_exp, fd, type); +} + +static int external_cache_exp_commit(struct nfct_handle *h, int fd) +{ + return cache_commit(external_exp, h, fd); +} + +static void external_cache_exp_flush(void) +{ + cache_flush(external_exp); +} + +static void external_cache_exp_stats(int fd) +{ + cache_stats(external_exp, fd); +} + +static void external_cache_exp_stats_ext(int fd) +{ + cache_stats_extended(external_exp, fd); +} + struct external_handler external_cache = { .init = external_cache_init, .close = external_cache_close, - .new = external_cache_new, - .update = external_cache_upd, - .destroy = external_cache_del, - .dump = external_cache_dump, - .commit = external_cache_commit, - .flush = external_cache_flush, - .stats = external_cache_stats, - .stats_ext = external_cache_stats_ext, + .ct = { + .new = external_cache_ct_new, + .upd = external_cache_ct_upd, + .del = external_cache_ct_del, + .dump = external_cache_ct_dump, + .commit = external_cache_ct_commit, + .flush = external_cache_ct_flush, + .stats = external_cache_ct_stats, + .stats_ext = external_cache_ct_stats_ext, + }, + .exp = { + .new = external_cache_exp_new, + .upd = external_cache_exp_upd, + .del = external_cache_exp_del, + .dump = external_cache_exp_dump, + .commit = external_cache_exp_commit, + .flush = external_cache_exp_flush, + .stats = external_cache_exp_stats, + .stats_ext = external_cache_exp_stats_ext, + }, }; diff --git a/src/external_inject.c b/src/external_inject.c index a54bb13..0ad3478 100644 --- a/src/external_inject.c +++ b/src/external_inject.c @@ -1,6 +1,7 @@ /* - * (C) 2009 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -41,7 +42,7 @@ struct { static int external_inject_init(void) { /* handler to directly inject conntracks into kernel-space */ - inject = nfct_open(CONNTRACK, 0); + inject = nfct_open(CONFIG(netlink).subsys_id, 0); if (inject == NULL) { dlog(LOG_ERR, "can't open netlink handler: %s", strerror(errno)); @@ -59,7 +60,7 @@ static void external_inject_close(void) nfct_close(inject); } -static void external_inject_new(struct nf_conntrack *ct) +static void external_inject_ct_new(struct nf_conntrack *ct) { int ret, retry = 1; @@ -87,7 +88,7 @@ retry: } } -static void external_inject_upd(struct nf_conntrack *ct) +static void external_inject_ct_upd(struct nf_conntrack *ct) { int ret; @@ -128,7 +129,7 @@ static void external_inject_upd(struct nf_conntrack *ct) dlog_ct(STATE(log), ct, NFCT_O_PLAIN); } -static void external_inject_del(struct nf_conntrack *ct) +static void external_inject_ct_del(struct nf_conntrack *ct) { if (nl_destroy_conntrack(inject, ct) == -1) { if (errno != ENOENT) { @@ -141,19 +142,21 @@ static void external_inject_del(struct nf_conntrack *ct) } } -static void external_inject_dump(int fd, int type) +static void external_inject_ct_dump(int fd, int type) { } -static void external_inject_commit(struct nfct_handle *h, int fd) +static int external_inject_ct_commit(struct nfct_handle *h, int fd) { + /* close the commit socket. */ + return LOCAL_RET_OK; } -static void external_inject_flush(void) +static void external_inject_ct_flush(void) { } -static void external_inject_stats(int fd) +static void external_inject_ct_stats(int fd) { char buf[512]; int size; @@ -172,15 +175,110 @@ static void external_inject_stats(int fd) send(fd, buf, size, 0); } +struct { + uint32_t add_ok; + uint32_t add_fail; + uint32_t upd_ok; + uint32_t upd_fail; + uint32_t del_ok; + uint32_t del_fail; +} exp_external_inject_stat; + +static void external_inject_exp_new(struct nf_expect *exp) +{ + int ret, retry = 1; + +retry: + if (nl_create_expect(inject, exp, 0) == -1) { + /* if the state entry exists, we delete and try again */ + if (errno == EEXIST && retry == 1) { + ret = nl_destroy_expect(inject, exp); + if (ret == 0 || (ret == -1 && errno == ENOENT)) { + if (retry) { + retry = 0; + goto retry; + } + } + exp_external_inject_stat.add_fail++; + dlog(LOG_ERR, "inject-add1: %s", strerror(errno)); + dlog_exp(STATE(log), exp, NFCT_O_PLAIN); + return; + } + exp_external_inject_stat.add_fail++; + dlog(LOG_ERR, "inject-add2: %s", strerror(errno)); + dlog_exp(STATE(log), exp, NFCT_O_PLAIN); + } else { + exp_external_inject_stat.add_ok++; + } +} + +static void external_inject_exp_del(struct nf_expect *exp) +{ + if (nl_destroy_expect(inject, exp) == -1) { + if (errno != ENOENT) { + exp_external_inject_stat.del_fail++; + dlog(LOG_ERR, "inject-del: %s", strerror(errno)); + dlog_exp(STATE(log), exp, NFCT_O_PLAIN); + } + } else { + exp_external_inject_stat.del_ok++; + } +} + +static void external_inject_exp_dump(int fd, int type) +{ +} + +static int external_inject_exp_commit(struct nfct_handle *h, int fd) +{ + /* close the commit socket. */ + return LOCAL_RET_OK; +} + +static void external_inject_exp_flush(void) +{ +} + +static void external_inject_exp_stats(int fd) +{ + char buf[512]; + int size; + + size = sprintf(buf, "external inject:\n" + "connections created:\t\t%12u\tfailed:\t%12u\n" + "connections updated:\t\t%12u\tfailed:\t%12u\n" + "connections destroyed:\t\t%12u\tfailed:\t%12u\n\n", + exp_external_inject_stat.add_ok, + exp_external_inject_stat.add_fail, + exp_external_inject_stat.upd_ok, + exp_external_inject_stat.upd_fail, + exp_external_inject_stat.del_ok, + exp_external_inject_stat.del_fail); + + send(fd, buf, size, 0); +} + struct external_handler external_inject = { .init = external_inject_init, .close = external_inject_close, - .new = external_inject_new, - .update = external_inject_upd, - .destroy = external_inject_del, - .dump = external_inject_dump, - .commit = external_inject_commit, - .flush = external_inject_flush, - .stats = external_inject_stats, - .stats_ext = external_inject_stats, + .ct = { + .new = external_inject_ct_new, + .upd = external_inject_ct_upd, + .del = external_inject_ct_del, + .dump = external_inject_ct_dump, + .commit = external_inject_ct_commit, + .flush = external_inject_ct_flush, + .stats = external_inject_ct_stats, + .stats_ext = external_inject_ct_stats, + }, + .exp = { + .new = external_inject_exp_new, + .upd = external_inject_exp_new, + .del = external_inject_exp_del, + .dump = external_inject_exp_dump, + .commit = external_inject_exp_commit, + .flush = external_inject_exp_flush, + .stats = external_inject_exp_stats, + .stats_ext = external_inject_exp_stats, + }, }; diff --git a/src/filter.c b/src/filter.c index 6a09c77..e8515d6 100644 --- a/src/filter.c +++ b/src/filter.c @@ -235,7 +235,7 @@ void ct_filter_add_state(struct ct_filter *f, int protonum, int val) } static inline int -__ct_filter_test_ipv4(struct ct_filter *f, struct nf_conntrack *ct) +__ct_filter_test_ipv4(struct ct_filter *f, const struct nf_conntrack *ct) { int id_src, id_dst; uint32_t src, dst; @@ -252,7 +252,7 @@ __ct_filter_test_ipv4(struct ct_filter *f, struct nf_conntrack *ct) } static inline int -__ct_filter_test_ipv6(struct ct_filter *f, struct nf_conntrack *ct) +__ct_filter_test_ipv6(struct ct_filter *f, const struct nf_conntrack *ct) { int id_src, id_dst; const uint32_t *src, *dst; @@ -295,7 +295,8 @@ __ct_filter_test_mask6(const void *ptr, const void *ct) (elem->ip[3] & elem->mask[3]) == (dst[3] & elem->mask[3]))); } -static int __ct_filter_test_state(struct ct_filter *f, struct nf_conntrack *ct) +static int +__ct_filter_test_state(struct ct_filter *f, const struct nf_conntrack *ct) { uint16_t val = 0; uint8_t protonum = nfct_get_attr_u8(ct, ATTR_L4PROTO); @@ -314,7 +315,8 @@ static int __ct_filter_test_state(struct ct_filter *f, struct nf_conntrack *ct) return test_bit_u16(val, &f->statemap[protonum]); } -static int ct_filter_check(struct ct_filter *f, struct nf_conntrack *ct) +static int +ct_filter_check(struct ct_filter *f, const struct nf_conntrack *ct) { int ret, protonum = nfct_get_attr_u8(ct, ATTR_L4PROTO); @@ -361,7 +363,7 @@ static int ct_filter_check(struct ct_filter *f, struct nf_conntrack *ct) return 1; } -static inline int ct_filter_sanity_check(struct nf_conntrack *ct) +static inline int ct_filter_sanity_check(const struct nf_conntrack *ct) { if (!nfct_attr_is_set(ct, ATTR_L3PROTO)) { dlog(LOG_ERR, "missing layer 3 protocol"); @@ -371,9 +373,7 @@ static inline int ct_filter_sanity_check(struct nf_conntrack *ct) switch(nfct_get_attr_u8(ct, ATTR_L3PROTO)) { case AF_INET: if (!nfct_attr_is_set(ct, ATTR_IPV4_SRC) || - !nfct_attr_is_set(ct, ATTR_IPV4_DST) || - !nfct_attr_is_set(ct, ATTR_REPL_IPV4_SRC) || - !nfct_attr_is_set(ct, ATTR_REPL_IPV4_DST)) { + !nfct_attr_is_set(ct, ATTR_IPV4_DST)) { dlog(LOG_ERR, "missing IPv4 address. " "You forgot to load " "nf_conntrack_ipv4?"); @@ -382,9 +382,7 @@ static inline int ct_filter_sanity_check(struct nf_conntrack *ct) break; case AF_INET6: if (!nfct_attr_is_set(ct, ATTR_IPV6_SRC) || - !nfct_attr_is_set(ct, ATTR_IPV6_DST) || - !nfct_attr_is_set(ct, ATTR_REPL_IPV6_SRC) || - !nfct_attr_is_set(ct, ATTR_REPL_IPV6_DST)) { + !nfct_attr_is_set(ct, ATTR_IPV6_DST)) { dlog(LOG_ERR, "missing IPv6 address. " "You forgot to load " "nf_conntrack_ipv6?"); @@ -396,7 +394,7 @@ static inline int ct_filter_sanity_check(struct nf_conntrack *ct) } /* we do user-space filtering for dump and resyncs */ -int ct_filter_conntrack(struct nf_conntrack *ct, int userspace) +int ct_filter_conntrack(const struct nf_conntrack *ct, int userspace) { /* missing mandatory attributes in object */ if (!ct_filter_sanity_check(ct)) @@ -407,3 +405,79 @@ int ct_filter_conntrack(struct nf_conntrack *ct, int userspace) return 0; } + +struct exp_filter { + struct list_head list; +}; + +struct exp_filter *exp_filter_create(void) +{ + struct exp_filter *f; + + f = calloc(1, sizeof(struct exp_filter)); + if (f == NULL) + return NULL; + + INIT_LIST_HEAD(&f->list); + return f; +} + +struct exp_filter_item { + struct list_head head; + char helper_name[NFCT_HELPER_NAME_MAX]; +}; + +/* this is ugly, but it simplifies read_config_yy.y */ +static struct exp_filter *exp_filter_alloc(void) +{ + if (STATE(exp_filter) == NULL) { + STATE(exp_filter) = exp_filter_create(); + if (STATE(exp_filter) == NULL) { + fprintf(stderr, "Can't init expectation filtering!\n"); + return NULL; + } + } + return STATE(exp_filter);; +} + +int exp_filter_add(struct exp_filter *f, const char *helper_name) +{ + struct exp_filter_item *item; + + f = exp_filter_alloc(); + if (f == NULL) + return -1; + + list_for_each_entry(item, &f->list, head) { + if (strncmp(item->helper_name, helper_name, + NFCT_HELPER_NAME_MAX) == 0) { + return -1; + } + } + item = calloc(1, sizeof(struct exp_filter_item)); + if (item == NULL) + return -1; + + strncpy(item->helper_name, helper_name, NFCT_HELPER_NAME_MAX); + list_add(&item->head, &f->list); + return 0; +} + +int exp_filter_find(struct exp_filter *f, const struct nf_expect *exp) +{ + struct exp_filter_item *item; + + if (f == NULL) + return 0; + + list_for_each_entry(item, &f->list, head) { + const char *name = nfexp_get_attr(exp, ATTR_EXP_HELPER_NAME); + + /* we allow partial matching to support things like sip-PORT. */ + if (strncmp(item->helper_name, name, + strlen(item->helper_name)) == 0) { + return 1; + } + } + return 0; +} diff --git a/src/internal_bypass.c b/src/internal_bypass.c index 4caaf4f..5c83c21 100644 --- a/src/internal_bypass.c +++ b/src/internal_bypass.c @@ -1,6 +1,7 @@ /* - * (C) 2009 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -16,21 +17,25 @@ #include "network.h" #include "origin.h" -static int _init(void) +static int internal_bypass_init(void) { return 0; } -static void _close(void) +static void internal_bypass_close(void) { } -static int dump_cb(enum nf_conntrack_msg_type type, - struct nf_conntrack *ct, void *data) +static int +internal_bypass_ct_dump_cb(enum nf_conntrack_msg_type type, + struct nf_conntrack *ct, void *data) { char buf[1024]; int size, *fd = data; + if (ct_filter_conntrack(ct, 1)) + return NFCT_CB_CONTINUE; + size = nfct_snprintf(buf, 1024, ct, NFCT_T_UNKNOWN, NFCT_O_DEFAULT, 0); if (size < 1024) { buf[size] = '\n'; @@ -41,18 +46,18 @@ static int dump_cb(enum nf_conntrack_msg_type type, return NFCT_CB_CONTINUE; } -static void dump(int fd, int type) +static void internal_bypass_ct_dump(int fd, int type) { struct nfct_handle *h; u_int32_t family = AF_UNSPEC; int ret; - h = nfct_open(CONNTRACK, 0); + h = nfct_open(CONFIG(netlink).subsys_id, 0); if (h == NULL) { dlog(LOG_ERR, "can't allocate memory for the internal cache"); return; } - nfct_callback_register(h, NFCT_T_ALL, dump_cb, &fd); + nfct_callback_register(h, NFCT_T_ALL, internal_bypass_ct_dump_cb, &fd); ret = nfct_query(h, NFCT_Q_DUMP, &family); if (ret == -1) { dlog(LOG_ERR, "can't dump kernel table"); @@ -60,7 +65,7 @@ static void dump(int fd, int type) nfct_close(h); } -static void flush(void) +static void internal_bypass_ct_flush(void) { nl_flush_conntrack_table(STATE(flush)); } @@ -71,7 +76,7 @@ struct { uint32_t del; } internal_bypass_stats; -static void stats(int fd) +static void internal_bypass_ct_stats(int fd) { char buf[512]; int size; @@ -88,25 +93,24 @@ static void stats(int fd) } /* unused, INTERNAL_F_POPULATE is unset. No cache, nothing to populate. */ -static void populate(struct nf_conntrack *ct) +static void internal_bypass_ct_populate(struct nf_conntrack *ct) { } /* unused, INTERNAL_F_RESYNC is unset. */ -static void purge(void) +static void internal_bypass_ct_purge(void) { } /* unused, INTERNAL_F_RESYNC is unset. Nothing to resync, we have no cache. */ -static int resync(enum nf_conntrack_msg_type type, - struct nf_conntrack *ct, - void *data) +static int +internal_bypass_ct_resync(enum nf_conntrack_msg_type type, + struct nf_conntrack *ct, void *data) { return NFCT_CB_CONTINUE; } -static void -event_new_sync(struct nf_conntrack *ct, int origin) +static void internal_bypass_ct_event_new(struct nf_conntrack *ct, int origin) { struct nethdr *net; @@ -114,13 +118,12 @@ event_new_sync(struct nf_conntrack *ct, int origin) if (origin != CTD_ORIGIN_NOT_ME) return; - net = BUILD_NETMSG(ct, NET_T_STATE_NEW); + net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_NEW); multichannel_send(STATE_SYNC(channel), net); internal_bypass_stats.new++; } -static void -event_update_sync(struct nf_conntrack *ct, int origin) +static void internal_bypass_ct_event_upd(struct nf_conntrack *ct, int origin) { struct nethdr *net; @@ -128,13 +131,12 @@ event_update_sync(struct nf_conntrack *ct, int origin) if (origin != CTD_ORIGIN_NOT_ME) return; - net = BUILD_NETMSG(ct, NET_T_STATE_UPD); + net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_UPD); multichannel_send(STATE_SYNC(channel), net); internal_bypass_stats.upd++; } -static int -event_destroy_sync(struct nf_conntrack *ct, int origin) +static int internal_bypass_ct_event_del(struct nf_conntrack *ct, int origin) { struct nethdr *net; @@ -142,24 +144,170 @@ event_destroy_sync(struct nf_conntrack *ct, int origin) if (origin != CTD_ORIGIN_NOT_ME) return 1; - net = BUILD_NETMSG(ct, NET_T_STATE_DEL); + net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_DEL); multichannel_send(STATE_SYNC(channel), net); internal_bypass_stats.del++; return 1; } +static int +internal_bypass_exp_dump_cb(enum nf_conntrack_msg_type type, + struct nf_expect *exp, void *data) +{ + char buf[1024]; + int size, *fd = data; + const struct nf_conntrack *master = + nfexp_get_attr(exp, ATTR_EXP_MASTER); + + if (!exp_filter_find(STATE(exp_filter), exp)) + return NFCT_CB_CONTINUE; + + if (ct_filter_conntrack(master, 1)) + return NFCT_CB_CONTINUE; + + size = nfexp_snprintf(buf, 1024, exp, + NFCT_T_UNKNOWN, NFCT_O_DEFAULT, 0); + if (size < 1024) { + buf[size] = '\n'; + size++; + } + send(*fd, buf, size, 0); + + return NFCT_CB_CONTINUE; +} + +static void internal_bypass_exp_dump(int fd, int type) +{ + struct nfct_handle *h; + u_int32_t family = AF_UNSPEC; + int ret; + + h = nfct_open(CONFIG(netlink).subsys_id, 0); + if (h == NULL) { + dlog(LOG_ERR, "can't allocate memory for the internal cache"); + return; + } + nfexp_callback_register(h, NFCT_T_ALL, + internal_bypass_exp_dump_cb, &fd); + ret = nfexp_query(h, NFCT_Q_DUMP, &family); + if (ret == -1) { + dlog(LOG_ERR, "can't dump kernel table"); + } + nfct_close(h); +} + +static void internal_bypass_exp_flush(void) +{ + nl_flush_expect_table(STATE(flush)); +} + +struct { + uint32_t new; + uint32_t upd; + uint32_t del; +} exp_internal_bypass_stats; + +static void internal_bypass_exp_stats(int fd) +{ + char buf[512]; + int size; + + size = sprintf(buf, "internal bypass:\n" + "connections new:\t\t%12u\n" + "connections updated:\t\t%12u\n" + "connections destroyed:\t\t%12u\n\n", + exp_internal_bypass_stats.new, + exp_internal_bypass_stats.upd, + exp_internal_bypass_stats.del); + + send(fd, buf, size, 0); +} + +/* unused, INTERNAL_F_POPULATE is unset. No cache, nothing to populate. */ +static void internal_bypass_exp_populate(struct nf_expect *exp) +{ +} + +/* unused, INTERNAL_F_RESYNC is unset. */ +static void internal_bypass_exp_purge(void) +{ +} + +/* unused, INTERNAL_F_RESYNC is unset. Nothing to resync, we have no cache. */ +static int +internal_bypass_exp_resync(enum nf_conntrack_msg_type type, + struct nf_expect *exp, void *data) +{ + return NFCT_CB_CONTINUE; +} + +static void internal_bypass_exp_event_new(struct nf_expect *exp, int origin) +{ + struct nethdr *net; + + /* this event has been triggered by me, skip */ + if (origin != CTD_ORIGIN_NOT_ME) + return; + + net = BUILD_NETMSG_FROM_EXP(exp, NET_T_STATE_EXP_NEW); + multichannel_send(STATE_SYNC(channel), net); + exp_internal_bypass_stats.new++; +} + +static void internal_bypass_exp_event_upd(struct nf_expect *exp, int origin) +{ + struct nethdr *net; + + /* this event has been triggered by me, skip */ + if (origin != CTD_ORIGIN_NOT_ME) + return; + + net = BUILD_NETMSG_FROM_EXP(exp, NET_T_STATE_EXP_UPD); + multichannel_send(STATE_SYNC(channel), net); + exp_internal_bypass_stats.upd++; +} + +static int internal_bypass_exp_event_del(struct nf_expect *exp, int origin) +{ + struct nethdr *net; + + /* this event has been triggered by me, skip */ + if (origin != CTD_ORIGIN_NOT_ME) + return 1; + + net = BUILD_NETMSG_FROM_EXP(exp, NET_T_STATE_EXP_DEL); + multichannel_send(STATE_SYNC(channel), net); + exp_internal_bypass_stats.del++; + + return 1; +} + struct internal_handler internal_bypass = { - .init = _init, - .close = _close, - .dump = dump, - .flush = flush, - .stats = stats, - .stats_ext = stats, - .populate = populate, - .purge = purge, - .resync = resync, - .new = event_new_sync, - .update = event_update_sync, - .destroy = event_destroy_sync, + .init = internal_bypass_init, + .close = internal_bypass_close, + .ct = { + .dump = internal_bypass_ct_dump, + .flush = internal_bypass_ct_flush, + .stats = internal_bypass_ct_stats, + .stats_ext = internal_bypass_ct_stats, + .populate = internal_bypass_ct_populate, + .purge = internal_bypass_ct_purge, + .resync = internal_bypass_ct_resync, + .new = internal_bypass_ct_event_new, + .upd = internal_bypass_ct_event_upd, + .del = internal_bypass_ct_event_del, + }, + .exp = { + .dump = internal_bypass_exp_dump, + .flush = internal_bypass_exp_flush, + .stats = internal_bypass_exp_stats, + .stats_ext = internal_bypass_exp_stats, + .populate = internal_bypass_exp_populate, + .purge = internal_bypass_exp_purge, + .resync = internal_bypass_exp_resync, + .new = internal_bypass_exp_event_new, + .upd = internal_bypass_exp_event_upd, + .del = internal_bypass_exp_event_del, + }, }; diff --git a/src/internal_cache.c b/src/internal_cache.c index daadfd6..ba2d74b 100644 --- a/src/internal_cache.c +++ b/src/internal_cache.c @@ -1,6 +1,7 @@ /* - * (C) 2009 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -19,46 +20,60 @@ static inline void sync_send(struct cache_object *obj, int query) STATE_SYNC(sync)->enqueue(obj, query); } -static int _init(void) +static int internal_cache_init(void) { - STATE(mode)->internal->data = - cache_create("internal", + STATE(mode)->internal->ct.data = + cache_create("internal", CACHE_T_CT, STATE_SYNC(sync)->internal_cache_flags, - STATE_SYNC(sync)->internal_cache_extra); + STATE_SYNC(sync)->internal_cache_extra, + &cache_sync_internal_ct_ops); - if (!STATE(mode)->internal->data) { + if (!STATE(mode)->internal->ct.data) { dlog(LOG_ERR, "can't allocate memory for the internal cache"); return -1; } + + STATE(mode)->internal->exp.data = + cache_create("internal", CACHE_T_EXP, + STATE_SYNC(sync)->internal_cache_flags, + STATE_SYNC(sync)->internal_cache_extra, + &cache_sync_internal_exp_ops); + + if (!STATE(mode)->internal->exp.data) { + dlog(LOG_ERR, "can't allocate memory for the internal cache"); + return -1; + } + return 0; } -static void _close(void) +static void internal_cache_close(void) { - cache_destroy(STATE(mode)->internal->data); + cache_destroy(STATE(mode)->internal->ct.data); + cache_destroy(STATE(mode)->internal->exp.data); } -static void dump(int fd, int type) +static void internal_cache_ct_dump(int fd, int type) { - cache_dump(STATE(mode)->internal->data, fd, NFCT_O_PLAIN); + cache_dump(STATE(mode)->internal->ct.data, fd, type); } -static void flush(void) +static void internal_cache_ct_flush(void) { - cache_flush(STATE(mode)->internal->data); + cache_flush(STATE(mode)->internal->ct.data); } -static void stats(int fd) +static void internal_cache_ct_stats(int fd) { - cache_stats(STATE(mode)->internal->data, fd); + cache_stats(STATE(mode)->internal->ct.data, fd); } -static void stats_ext(int fd) +static void internal_cache_ct_stats_ext(int fd) { - cache_stats_extended(STATE(mode)->internal->data, fd); + cache_stats_extended(STATE(mode)->internal->ct.data, fd); } -static void populate(struct nf_conntrack *ct) +static void internal_cache_ct_populate(struct nf_conntrack *ct) { /* This is required by kernels < 2.6.20 */ nfct_attr_unset(ct, ATTR_ORIG_COUNTER_BYTES); @@ -67,19 +82,19 @@ static void populate(struct nf_conntrack *ct) nfct_attr_unset(ct, ATTR_REPL_COUNTER_PACKETS); nfct_attr_unset(ct, ATTR_USE); - cache_update_force(STATE(mode)->internal->data, ct); + cache_update_force(STATE(mode)->internal->ct.data, ct); } -static int purge_step(void *data1, void *data2) +static int internal_cache_ct_purge_step(void *data1, void *data2) { struct cache_object *obj = data2; STATE(get_retval) = 0; - nl_get_conntrack(STATE(get), obj->ct); /* modifies STATE(get_reval) */ + nl_get_conntrack(STATE(get), obj->ptr); /* modifies STATE(get_reval) */ if (!STATE(get_retval)) { if (obj->status != C_OBJ_DEAD) { cache_object_set_status(obj, C_OBJ_DEAD); - sync_send(obj, NET_T_STATE_DEL); + sync_send(obj, NET_T_STATE_CT_DEL); cache_object_put(obj); } } @@ -87,14 +102,15 @@ static int purge_step(void *data1, void *data2) return 0; } -static void purge(void) +static void internal_cache_ct_purge(void) { - cache_iterate(STATE(mode)->internal->data, NULL, purge_step); + cache_iterate(STATE(mode)->internal->ct.data, NULL, + internal_cache_ct_purge_step); } -static int resync(enum nf_conntrack_msg_type type, - struct nf_conntrack *ct, - void *data) +static int +internal_cache_ct_resync(enum nf_conntrack_msg_type type, + struct nf_conntrack *ct, void *data) { struct cache_object *obj; @@ -108,23 +124,22 @@ static int resync(enum nf_conntrack_msg_type type, nfct_attr_unset(ct, ATTR_REPL_COUNTER_PACKETS); nfct_attr_unset(ct, ATTR_USE); - obj = cache_update_force(STATE(mode)->internal->data, ct); + obj = cache_update_force(STATE(mode)->internal->ct.data, ct); if (obj == NULL) return NFCT_CB_CONTINUE; switch (obj->status) { case C_OBJ_NEW: - sync_send(obj, NET_T_STATE_NEW); + sync_send(obj, NET_T_STATE_CT_NEW); break; case C_OBJ_ALIVE: - sync_send(obj, NET_T_STATE_UPD); + sync_send(obj, NET_T_STATE_CT_UPD); break; } return NFCT_CB_CONTINUE; } -static void -event_new_sync(struct nf_conntrack *ct, int origin) +static void internal_cache_ct_event_new(struct nf_conntrack *ct, int origin) { struct cache_object *obj; int id; @@ -139,13 +154,13 @@ event_new_sync(struct nf_conntrack *ct, int origin) nfct_attr_unset(ct, ATTR_REPL_COUNTER_BYTES); nfct_attr_unset(ct, ATTR_REPL_COUNTER_PACKETS); - obj = cache_find(STATE(mode)->internal->data, ct, &id); + obj = cache_find(STATE(mode)->internal->ct.data, ct, &id); if (obj == NULL) { retry: - obj = cache_object_new(STATE(mode)->internal->data, ct); + obj = cache_object_new(STATE(mode)->internal->ct.data, ct); if (obj == NULL) return; - if (cache_add(STATE(mode)->internal->data, obj, id) == -1) { + if (cache_add(STATE(mode)->internal->ct.data, obj, id) == -1) { cache_object_free(obj); return; } @@ -153,16 +168,15 @@ retry: * processes or the kernel, but don't propagate events that * have been triggered by conntrackd itself, eg. commits. */ if (origin == CTD_ORIGIN_NOT_ME) - sync_send(obj, NET_T_STATE_NEW); + sync_send(obj, NET_T_STATE_CT_NEW); } else { - cache_del(STATE(mode)->internal->data, obj); + cache_del(STATE(mode)->internal->ct.data, obj); cache_object_free(obj); goto retry; } } -static void -event_update_sync(struct nf_conntrack *ct, int origin) +static void internal_cache_ct_event_upd(struct nf_conntrack *ct, int origin) { struct cache_object *obj; @@ -170,16 +184,163 @@ event_update_sync(struct nf_conntrack *ct, int origin) if (origin == CTD_ORIGIN_INJECT) return; - obj = cache_update_force(STATE(mode)->internal->data, ct); + obj = cache_update_force(STATE(mode)->internal->ct.data, ct); if (obj == NULL) return; if (origin == CTD_ORIGIN_NOT_ME) - sync_send(obj, NET_T_STATE_UPD); + sync_send(obj, NET_T_STATE_CT_UPD); +} + +static int internal_cache_ct_event_del(struct nf_conntrack *ct, int origin) +{ + struct cache_object *obj; + int id; + + /* this event has been triggered by a direct inject, skip */ + if (origin == CTD_ORIGIN_INJECT) + return 0; + + /* we don't synchronize events for objects that are not in the cache */ + obj = cache_find(STATE(mode)->internal->ct.data, ct, &id); + if (obj == NULL) + return 0; + + if (obj->status != C_OBJ_DEAD) { + cache_object_set_status(obj, C_OBJ_DEAD); + if (origin == CTD_ORIGIN_NOT_ME) { + sync_send(obj, NET_T_STATE_CT_DEL); + } + cache_object_put(obj); + } + return 1; +} + +static void internal_cache_exp_dump(int fd, int type) +{ + cache_dump(STATE(mode)->internal->exp.data, fd, type); +} + +static void internal_cache_exp_flush(void) +{ + cache_flush(STATE(mode)->internal->exp.data); +} + +static void internal_cache_exp_stats(int fd) +{ + cache_stats(STATE(mode)->internal->exp.data, fd); +} + +static void internal_cache_exp_stats_ext(int fd) +{ + cache_stats_extended(STATE(mode)->internal->exp.data, fd); +} + +static void internal_cache_exp_populate(struct nf_expect *exp) +{ + cache_update_force(STATE(mode)->internal->exp.data, exp); +} + +static int internal_cache_exp_purge_step(void *data1, void *data2) +{ + struct cache_object *obj = data2; + + STATE(get_retval) = 0; + nl_get_expect(STATE(get), obj->ptr); /* modifies STATE(get_reval) */ + if (!STATE(get_retval)) { + if (obj->status != C_OBJ_DEAD) { + cache_object_set_status(obj, C_OBJ_DEAD); + sync_send(obj, NET_T_STATE_EXP_DEL); + cache_object_put(obj); + } + } + + return 0; +} + +static void internal_cache_exp_purge(void) +{ + cache_iterate(STATE(mode)->internal->exp.data, NULL, + internal_cache_exp_purge_step); } static int -event_destroy_sync(struct nf_conntrack *ct, int origin) +internal_cache_exp_resync(enum nf_conntrack_msg_type type, + struct nf_expect *exp, void *data) +{ + struct cache_object *obj; + const struct nf_conntrack *master = + nfexp_get_attr(exp, ATTR_EXP_MASTER); + + if (!exp_filter_find(STATE(exp_filter), exp)) + return NFCT_CB_CONTINUE; + + if (ct_filter_conntrack(master, 1)) + return NFCT_CB_CONTINUE; + + obj = cache_update_force(STATE(mode)->internal->exp.data, exp); + if (obj == NULL) + return NFCT_CB_CONTINUE; + + switch (obj->status) { + case C_OBJ_NEW: + sync_send(obj, NET_T_STATE_EXP_NEW); + break; + case C_OBJ_ALIVE: + sync_send(obj, NET_T_STATE_EXP_UPD); + break; + } + return NFCT_CB_CONTINUE; +} + +static void internal_cache_exp_event_new(struct nf_expect *exp, int origin) +{ + struct cache_object *obj; + int id; + + /* this event has been triggered by a direct inject, skip */ + if (origin == CTD_ORIGIN_INJECT) + return; + + obj = cache_find(STATE(mode)->internal->exp.data, exp, &id); + if (obj == NULL) { +retry: + obj = cache_object_new(STATE(mode)->internal->exp.data, exp); + if (obj == NULL) + return; + if (cache_add(STATE(mode)->internal->exp.data, obj, id) == -1) { + cache_object_free(obj); + return; + } + /* only synchronize events that have been triggered by other + * processes or the kernel, but don't propagate events that + * have been triggered by conntrackd itself, eg. commits. */ + if (origin == CTD_ORIGIN_NOT_ME) + sync_send(obj, NET_T_STATE_EXP_NEW); + } else { + cache_del(STATE(mode)->internal->exp.data, obj); + cache_object_free(obj); + goto retry; + } +} + +static void internal_cache_exp_event_upd(struct nf_expect *exp, int origin) +{ + struct cache_object *obj; + + /* this event has been triggered by a direct inject, skip */ + if (origin == CTD_ORIGIN_INJECT) + return; + + obj = cache_update_force(STATE(mode)->internal->exp.data, exp); + if (obj == NULL) + return; + + if (origin == CTD_ORIGIN_NOT_ME) + sync_send(obj, NET_T_STATE_EXP_UPD); +} + +static int internal_cache_exp_event_del(struct nf_expect *exp, int origin) { struct cache_object *obj; int id; @@ -189,14 +350,14 @@ event_destroy_sync(struct nf_conntrack *ct, int origin) return 0; /* we don't synchronize events for objects that are not in the cache */ - obj = cache_find(STATE(mode)->internal->data, ct, &id); + obj = cache_find(STATE(mode)->internal->exp.data, exp, &id); if (obj == NULL) return 0; if (obj->status != C_OBJ_DEAD) { cache_object_set_status(obj, C_OBJ_DEAD); if (origin == CTD_ORIGIN_NOT_ME) { - sync_send(obj, NET_T_STATE_DEL); + sync_send(obj, NET_T_STATE_EXP_DEL); } cache_object_put(obj); } @@ -205,16 +366,30 @@ event_destroy_sync(struct nf_conntrack *ct, int origin) struct internal_handler internal_cache = { .flags = INTERNAL_F_POPULATE | INTERNAL_F_RESYNC, - .init = _init, - .close = _close, - .dump = dump, - .flush = flush, - .stats = stats, - .stats_ext = stats_ext, - .populate = populate, - .purge = purge, - .resync = resync, - .new = event_new_sync, - .update = event_update_sync, - .destroy = event_destroy_sync, + .init = internal_cache_init, + .close = internal_cache_close, + .ct = { + .dump = internal_cache_ct_dump, + .flush = internal_cache_ct_flush, + .stats = internal_cache_ct_stats, + .stats_ext = internal_cache_ct_stats_ext, + .populate = internal_cache_ct_populate, + .purge = internal_cache_ct_purge, + .resync = internal_cache_ct_resync, + .new = internal_cache_ct_event_new, + .upd = internal_cache_ct_event_upd, + .del = internal_cache_ct_event_del, + }, + .exp = { + .dump = internal_cache_exp_dump, + .flush = internal_cache_exp_flush, + .stats = internal_cache_exp_stats, + .stats_ext = internal_cache_exp_stats_ext, + .populate = internal_cache_exp_populate, + .purge = internal_cache_exp_purge, + .resync = internal_cache_exp_resync, + .new = internal_cache_exp_event_new, + .upd = internal_cache_exp_event_upd, + .del = internal_cache_exp_event_del, + }, }; diff --git a/src/lock.c b/src/lock.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/lock.c @@ -145,6 +145,43 @@ void dlog_ct(FILE *fd, struct nf_conntrack *ct, unsigned int type) } } +void dlog_exp(FILE *fd, struct nf_expect *exp, unsigned int type) +{ + time_t t; + char buf[1024]; + char *tmp; + unsigned int flags = 0; + + buf[0]='\0'; + + switch(type) { + case NFCT_O_PLAIN: + t = time(NULL); + ctime_r(&t, buf); + tmp = buf + strlen(buf); + buf[strlen(buf)-1]='\t'; + break; + default: + return; + } + nfexp_snprintf(buf+strlen(buf), 1024-strlen(buf), exp, 0, type, flags); + + if (fd) { + snprintf(buf+strlen(buf), 1024-strlen(buf), "\n"); + fputs(buf, fd); + } + + if (fd == STATE(log)) { + /* error reporting */ + if (CONFIG(syslog_facility) != -1) + syslog(LOG_ERR, "%s", tmp); + } else if (fd == STATE(stats_log)) { + /* connection logging */ + if (CONFIG(stats).syslog_facility != -1) + syslog(LOG_INFO, "%s", tmp); + } +} + void close_log(void) { if (STATE(log) != NULL) @@ -1,5 +1,6 @@ /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,14 +39,15 @@ static const char usage_daemon_commands[] = static const char usage_client_commands[] = "Client mode commands:\n" - " -c, commit external cache to conntrack table\n" + " -c [ct|expect], commit external cache to conntrack table\n" " -f [|internal|external], flush internal and external cache\n" - " -F, flush kernel conntrack table\n" - " -i, display content of the internal cache\n" - " -e, display the content of the external cache\n" + " -F [ct|expect], flush kernel conntrack table\n" + " -i [ct|expect], display content of the internal cache\n" + " -e [ct|expect], display the content of the external cache\n" " -k, kill conntrack daemon\n" - " -s [|network|cache|runtime|link|rsqueue|queue], dump statistics\n" - " -R, resync with kernel conntrack table\n" + " -s [|network|cache|runtime|link|rsqueue|queue|ct|expect], " + "dump statistics\n" + " -R [ct|expect], resync with kernel conntrack table\n" " -n, request resync with other node (only FT-FW and NOTRACK modes)\n" " -x, dump cache in XML format (requires -i or -e)\n" " -t, reset the kernel timeout (see PurgeTimeout clause)\n" @@ -89,6 +91,25 @@ set_operation_mode(int *current, int want, char *argv[]) } } +static int +set_action_by_table(int i, int argc, char *argv[], + int ct_action, int exp_action, int dfl_action, int *action) +{ + if (i+1 < argc && argv[i+1][0] != '-') { + if (strncmp(argv[i+1], "ct", strlen(argv[i+1])) == 0) { + *action = ct_action; + i++; + } else if (strncmp(argv[i+1], "expect", + strlen(argv[i+1])) == 0) { + *action = exp_action; + i++; + } + } else + *action = dfl_action; + + return i; +} + int main(int argc, char *argv[]) { int ret, i, action = -1; @@ -115,15 +136,23 @@ int main(int argc, char *argv[]) break; case 'c': set_operation_mode(&type, REQUEST, argv); - action = COMMIT; + i = set_action_by_table(i, argc, argv, + CT_COMMIT, EXP_COMMIT, + ALL_COMMIT, &action); break; case 'i': set_operation_mode(&type, REQUEST, argv); - action = DUMP_INTERNAL; + i = set_action_by_table(i, argc, argv, + CT_DUMP_INTERNAL, + EXP_DUMP_INTERNAL, + CT_DUMP_INTERNAL, &action); break; case 'e': set_operation_mode(&type, REQUEST, argv); - action = DUMP_EXTERNAL; + i = set_action_by_table(i, argc, argv, + CT_DUMP_EXTERNAL, + EXP_DUMP_EXTERNAL, + CT_DUMP_EXTERNAL, &action); break; case 'C': if (++i < argc) { @@ -142,18 +171,21 @@ int main(int argc, char *argv[]) break; case 'F': set_operation_mode(&type, REQUEST, argv); - action = FLUSH_MASTER; + i = set_action_by_table(i, argc, argv, + CT_FLUSH_MASTER, + EXP_FLUSH_MASTER, + ALL_FLUSH_MASTER, &action); break; case 'f': set_operation_mode(&type, REQUEST, argv); if (i+1 < argc && argv[i+1][0] != '-') { if (strncmp(argv[i+1], "internal", strlen(argv[i+1])) == 0) { - action = FLUSH_INT_CACHE; + action = CT_FLUSH_INT_CACHE; i++; } else if (strncmp(argv[i+1], "external", strlen(argv[i+1])) == 0) { - action = FLUSH_EXT_CACHE; + action = CT_FLUSH_EXT_CACHE; i++; } else { fprintf(stderr, "ERROR: unknown " @@ -164,12 +196,15 @@ int main(int argc, char *argv[]) } } else { /* default to general flushing */ - action = FLUSH_CACHE; + action = ALL_FLUSH_CACHE; } break; case 'R': set_operation_mode(&type, REQUEST, argv); - action = RESYNC_MASTER; + i = set_action_by_table(i, argc, argv, + CT_RESYNC_MASTER, + EXP_RESYNC_MASTER, + ALL_RESYNC_MASTER, &action); break; case 'B': set_operation_mode(&type, REQUEST, argv); @@ -222,6 +257,14 @@ int main(int argc, char *argv[]) strlen(argv[i+1])) == 0) { action = STATS_QUEUE; i++; + } else if (strncmp(argv[i+1], "ct", + strlen(argv[i+1])) == 0) { + action = STATS; + i++; + } else if (strncmp(argv[i+1], "expect", + strlen(argv[i+1])) == 0) { + action = EXP_STATS; + i++; } else { fprintf(stderr, "ERROR: unknown " "parameter `%s' for " @@ -243,10 +286,10 @@ int main(int argc, char *argv[]) action = REQUEST_DUMP; break; case 'x': - if (action == DUMP_INTERNAL) - action = DUMP_INT_XML; - else if (action == DUMP_EXTERNAL) - action = DUMP_EXT_XML; + if (action == CT_DUMP_INTERNAL) + action = CT_DUMP_INT_XML; + else if (action == CT_DUMP_EXTERNAL) + action = CT_DUMP_EXT_XML; else { show_usage(argv[0]); fprintf(stderr, "Error: Invalid parameters\n"); diff --git a/src/netlink.c b/src/netlink.c index a43f782..fe979e3 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -1,5 +1,6 @@ /* - * (C) 2006 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,10 +33,23 @@ struct nfct_handle *nl_init_event_handler(void) { struct nfct_handle *h; - h = nfct_open(CONNTRACK, NFCT_ALL_CT_GROUPS); + h = nfct_open(CONFIG(netlink).subsys_id, CONFIG(netlink).groups); if (h == NULL) return NULL; + if (CONFIG(netlink).events_reliable) { + int on = 1; + + setsockopt(nfct_fd(h), SOL_NETLINK, + NETLINK_BROADCAST_SEND_ERROR, &on, sizeof(int)); + + setsockopt(nfct_fd(h), SOL_NETLINK, + NETLINK_NO_ENOBUFS, &on, sizeof(int)); + + dlog(LOG_NOTICE, "reliable ctnetlink event delivery " + "is ENABLED."); + } + if (STATE(filter)) { if (CONFIG(filter_from_kernelspace)) { if (nfct_filter_attach(nfct_fd(h), @@ -53,10 +67,18 @@ struct nfct_handle *nl_init_event_handler(void) fcntl(nfct_fd(h), F_SETFL, O_NONBLOCK); /* set up socket buffer size */ - if (CONFIG(netlink_buffer_size)) { - CONFIG(netlink_buffer_size) = - nfnl_rcvbufsiz(nfct_nfnlh(h), CONFIG(netlink_buffer_size)); + if (CONFIG(netlink_buffer_size) && + CONFIG(netlink_buffer_size) <= + CONFIG(netlink_buffer_size_max_grown)) { + /* we divide netlink_buffer_size by 2 here since value passed + to kernel gets doubled in SO_RCVBUF; see net/core/sock.c */ + CONFIG(netlink_buffer_size) = + nfnl_rcvbufsiz(nfct_nfnlh(h), CONFIG(netlink_buffer_size)/2); } else { + dlog(LOG_NOTICE, "NetlinkBufferSize is either not set or " + "is greater than NetlinkBufferSizeMaxGrowth. " + "Using current system buffer size"); + socklen_t socklen = sizeof(unsigned int); unsigned int read_size; @@ -70,23 +92,6 @@ struct nfct_handle *nl_init_event_handler(void) dlog(LOG_NOTICE, "netlink event socket buffer size has been set " "to %u bytes", CONFIG(netlink_buffer_size)); - /* ensure that maximum grown size is >= than maximum size */ - if (CONFIG(netlink_buffer_size_max_grown) < CONFIG(netlink_buffer_size)) - CONFIG(netlink_buffer_size_max_grown) = - CONFIG(netlink_buffer_size); - - if (CONFIG(netlink).events_reliable) { - int on = 1; - - setsockopt(nfct_fd(h), SOL_NETLINK, - NETLINK_BROADCAST_SEND_ERROR, &on, sizeof(int)); - - setsockopt(nfct_fd(h), SOL_NETLINK, - NETLINK_NO_ENOBUFS, &on, sizeof(int)); - - dlog(LOG_NOTICE, "reliable ctnetlink event delivery " - "is ENABLED."); - } return h; } @@ -110,31 +115,34 @@ static int warned = 0; void nl_resize_socket_buffer(struct nfct_handle *h) { - /* sock_setsockopt in net/core/sock.c doubles the size of the buffer */ unsigned int s = CONFIG(netlink_buffer_size); /* already warned that we have reached the maximum buffer size */ if (warned) return; - if (s > CONFIG(netlink_buffer_size_max_grown)) { + /* since sock_setsockopt in net/core/sock.c doubles the size of socket + buffer passed to it using nfnl_rcvbufsiz, only call nfnl_rcvbufsiz + if new value is not greater than netlink_buffer_size_max_grown */ + if (s*2 > CONFIG(netlink_buffer_size_max_grown)) { dlog(LOG_WARNING, - "maximum netlink socket buffer " - "size has been reached. We are likely to " + "netlink event socket buffer size cannot " + "be doubled further since it will exceed " + "NetlinkBufferSizeMaxGrowth. We are likely to " "be losing events, this may lead to " "unsynchronized replicas. Please, consider " "increasing netlink socket buffer size via " - "SocketBufferSize and " - "SocketBufferSizeMaxGrowth clauses in " + "NetlinkBufferSize and " + "NetlinkBufferSizeMaxGrowth clauses in " "conntrackd.conf"); - s = CONFIG(netlink_buffer_size_max_grown); warned = 1; + return; } CONFIG(netlink_buffer_size) = nfnl_rcvbufsiz(nfct_nfnlh(h), s); /* notify the sysadmin */ - dlog(LOG_NOTICE, "netlink socket buffer size has been increased " + dlog(LOG_NOTICE, "netlink event socket buffer size has been doubled " "to %u bytes", CONFIG(netlink_buffer_size)); } @@ -157,20 +165,21 @@ int nl_send_resync(struct nfct_handle *h) /* if the handle has no callback, check for existence, otherwise, update */ int nl_get_conntrack(struct nfct_handle *h, const struct nf_conntrack *ct) { - int ret; - char __tmp[nfct_maxsize()]; - struct nf_conntrack *tmp = (struct nf_conntrack *) (void *)__tmp; + int ret = 1; + struct nf_conntrack *tmp; - memset(__tmp, 0, sizeof(__tmp)); + tmp = nfct_new(); + if (tmp == NULL) + return -1; /* use the original tuple to check if it is there */ nfct_copy(tmp, ct, NFCT_CP_ORIG); - ret = nfct_query(h, NFCT_Q_GET, tmp); - if (ret == -1) - return errno == ENOENT ? 0 : -1; + if (nfct_query(h, NFCT_Q_GET, tmp) == -1) + ret = (errno == ENOENT) ? 0 : -1; - return 1; + nfct_destroy(tmp); + return ret; } int nl_create_conntrack(struct nfct_handle *h, @@ -196,12 +205,14 @@ int nl_create_conntrack(struct nfct_handle *h, nfct_setobjopt(ct, NFCT_SOPT_SETUP_REPLY); - /* - * TCP flags to overpass window tracking for recovered connections - */ + /* disable TCP window tracking for recovered connections if required */ if (nfct_attr_is_set(ct, ATTR_TCP_STATE)) { - uint8_t flags = IP_CT_TCP_FLAG_BE_LIBERAL | - IP_CT_TCP_FLAG_SACK_PERM; + uint8_t flags = IP_CT_TCP_FLAG_SACK_PERM; + + if (!CONFIG(sync).tcp_window_tracking) + flags |= IP_CT_TCP_FLAG_BE_LIBERAL; + else + flags |= IP_CT_TCP_FLAG_WINDOW_SCALE; /* FIXME: workaround, we should send TCP flags in updates */ if (nfct_get_attr_u8(ct, ATTR_TCP_STATE) >= @@ -261,12 +272,14 @@ int nl_update_conntrack(struct nfct_handle *h, nfct_attr_unset(ct, ATTR_MASTER_PORT_DST); } - /* - * TCP flags to overpass window tracking for recovered connections - */ + /* disable TCP window tracking for recovered connections if required */ if (nfct_attr_is_set(ct, ATTR_TCP_STATE)) { - uint8_t flags = IP_CT_TCP_FLAG_BE_LIBERAL | - IP_CT_TCP_FLAG_SACK_PERM; + uint8_t flags = IP_CT_TCP_FLAG_SACK_PERM; + + if (!CONFIG(sync).tcp_window_tracking) + flags |= IP_CT_TCP_FLAG_BE_LIBERAL; + else + flags |= IP_CT_TCP_FLAG_WINDOW_SCALE; /* FIXME: workaround, we should send TCP flags in updates */ if (nfct_get_attr_u8(ct, ATTR_TCP_STATE) >= @@ -289,3 +302,61 @@ int nl_destroy_conntrack(struct nfct_handle *h, const struct nf_conntrack *ct) { return nfct_query(h, NFCT_Q_DESTROY, ct); } + +int nl_create_expect(struct nfct_handle *h, const struct nf_expect *orig, + int timeout) +{ + int ret; + struct nf_expect *exp; + + exp = nfexp_clone(orig); + if (exp == NULL) + return -1; + + if (timeout > 0) + nfexp_set_attr_u32(exp, ATTR_EXP_TIMEOUT, timeout); + + ret = nfexp_query(h, NFCT_Q_CREATE, exp); + nfexp_destroy(exp); + + return ret; +} + +int nl_destroy_expect(struct nfct_handle *h, const struct nf_expect *exp) +{ + return nfexp_query(h, NFCT_Q_DESTROY, exp); +} + +/* if the handle has no callback, check for existence, otherwise, update */ +int nl_get_expect(struct nfct_handle *h, const struct nf_expect *exp) +{ + int ret = 1; + struct nf_expect *tmp; + + /* XXX: we only need the expectation, not the mask and the master. */ + tmp = nfexp_clone(exp); + if (tmp == NULL) + return -1; + + if (nfexp_query(h, NFCT_Q_GET, tmp) == -1) + ret = (errno == ENOENT) ? 0 : -1; + + nfexp_destroy(tmp); + return ret; +} + +int nl_dump_expect_table(struct nfct_handle *h) +{ + return nfexp_query(h, NFCT_Q_DUMP, &CONFIG(family)); +} + +int nl_flush_expect_table(struct nfct_handle *h) +{ + return nfexp_query(h, NFCT_Q_FLUSH, &CONFIG(family)); +} + +int nl_send_expect_resync(struct nfct_handle *h) +{ + int family = CONFIG(family); + return nfexp_send(h, NFCT_Q_DUMP, &family); +} diff --git a/src/network.c b/src/network.c index 6a66a2b..13db37c 100644 --- a/src/network.c +++ b/src/network.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -119,13 +120,20 @@ int nethdr_track_is_seq_set() #include "cache.h" -static int status2type[] = { - [C_OBJ_NEW] = NET_T_STATE_NEW, - [C_OBJ_ALIVE] = NET_T_STATE_UPD, - [C_OBJ_DEAD] = NET_T_STATE_DEL, +static int status2type[CACHE_T_MAX][C_OBJ_MAX] = { + [CACHE_T_CT] = { + [C_OBJ_NEW] = NET_T_STATE_CT_NEW, + [C_OBJ_ALIVE] = NET_T_STATE_CT_UPD, + [C_OBJ_DEAD] = NET_T_STATE_CT_DEL, + }, + [CACHE_T_EXP] = { + [C_OBJ_NEW] = NET_T_STATE_EXP_NEW, + [C_OBJ_ALIVE] = NET_T_STATE_EXP_UPD, + [C_OBJ_DEAD] = NET_T_STATE_EXP_DEL, + }, }; -int object_status_to_network_type(int status) +int object_status_to_network_type(struct cache_object *obj) { - return status2type[status]; + return status2type[obj->cache->type][obj->status]; } diff --git a/src/parse.c b/src/parse.c index e6eefe4..81e9c6b 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -24,191 +25,201 @@ #define ssizeof(x) (int)sizeof(x) #endif -static void parse_u8(struct nf_conntrack *ct, int attr, void *data); -static void parse_u16(struct nf_conntrack *ct, int attr, void *data); -static void parse_u32(struct nf_conntrack *ct, int attr, void *data); -static void parse_group(struct nf_conntrack *ct, int attr, void *data); -static void parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_u8(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_u16(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_u32(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_group(struct nf_conntrack *ct, int attr, void *data); +static void ct_parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data); -struct parser { +struct ct_parser { void (*parse)(struct nf_conntrack *ct, int attr, void *data); int attr; int size; }; -static struct parser h[NTA_MAX] = { +static struct ct_parser h[NTA_MAX] = { [NTA_IPV4] = { - .parse = parse_group, + .parse = ct_parse_group, .attr = ATTR_GRP_ORIG_IPV4, .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), }, [NTA_IPV6] = { - .parse = parse_group, + .parse = ct_parse_group, .attr = ATTR_GRP_ORIG_IPV6, .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), }, [NTA_PORT] = { - .parse = parse_group, + .parse = ct_parse_group, .attr = ATTR_GRP_ORIG_PORT, .size = NTA_SIZE(sizeof(struct nfct_attr_grp_port)), }, [NTA_L4PROTO] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_L4PROTO, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_TCP_STATE] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_TCP_STATE, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_STATUS] = { - .parse = parse_u32, + .parse = ct_parse_u32, .attr = ATTR_STATUS, .size = NTA_SIZE(sizeof(uint32_t)), }, [NTA_MARK] = { - .parse = parse_u32, + .parse = ct_parse_u32, .attr = ATTR_MARK, .size = NTA_SIZE(sizeof(uint32_t)), }, [NTA_TIMEOUT] = { - .parse = parse_u32, + .parse = ct_parse_u32, .attr = ATTR_TIMEOUT, .size = NTA_SIZE(sizeof(uint32_t)), }, [NTA_MASTER_IPV4] = { - .parse = parse_group, + .parse = ct_parse_group, .attr = ATTR_GRP_MASTER_IPV4, .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), }, [NTA_MASTER_IPV6] = { - .parse = parse_group, + .parse = ct_parse_group, .attr = ATTR_GRP_MASTER_IPV6, .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), }, [NTA_MASTER_L4PROTO] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_MASTER_L4PROTO, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_MASTER_PORT] = { - .parse = parse_group, + .parse = ct_parse_group, .attr = ATTR_GRP_MASTER_PORT, .size = NTA_SIZE(sizeof(struct nfct_attr_grp_port)), }, [NTA_SNAT_IPV4] = { - .parse = parse_u32, + .parse = ct_parse_u32, .attr = ATTR_SNAT_IPV4, .size = NTA_SIZE(sizeof(uint32_t)), }, [NTA_DNAT_IPV4] = { - .parse = parse_u32, + .parse = ct_parse_u32, .attr = ATTR_DNAT_IPV4, .size = NTA_SIZE(sizeof(uint32_t)), }, [NTA_SPAT_PORT] = { - .parse = parse_u16, + .parse = ct_parse_u16, .attr = ATTR_SNAT_PORT, .size = NTA_SIZE(sizeof(uint16_t)), }, [NTA_DPAT_PORT] = { - .parse = parse_u16, + .parse = ct_parse_u16, .attr = ATTR_DNAT_PORT, .size = NTA_SIZE(sizeof(uint16_t)), }, [NTA_NAT_SEQ_ADJ] = { - .parse = parse_nat_seq_adj, + .parse = ct_parse_nat_seq_adj, .size = NTA_SIZE(sizeof(struct nta_attr_natseqadj)), }, [NTA_SCTP_STATE] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_SCTP_STATE, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_SCTP_VTAG_ORIG] = { - .parse = parse_u32, + .parse = ct_parse_u32, .attr = ATTR_SCTP_VTAG_ORIG, .size = NTA_SIZE(sizeof(uint32_t)), }, [NTA_SCTP_VTAG_REPL] = { - .parse = parse_u32, + .parse = ct_parse_u32, .attr = ATTR_SCTP_VTAG_REPL, .size = NTA_SIZE(sizeof(uint32_t)), }, [NTA_DCCP_STATE] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_DCCP_STATE, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_DCCP_ROLE] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_DCCP_ROLE, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_ICMP_TYPE] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_ICMP_TYPE, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_ICMP_CODE] = { - .parse = parse_u8, + .parse = ct_parse_u8, .attr = ATTR_ICMP_CODE, .size = NTA_SIZE(sizeof(uint8_t)), }, [NTA_ICMP_ID] = { - .parse = parse_u16, + .parse = ct_parse_u16, .attr = ATTR_ICMP_ID, .size = NTA_SIZE(sizeof(uint16_t)), }, + [NTA_TCP_WSCALE_ORIG] = { + .parse = ct_parse_u8, + .attr = ATTR_TCP_WSCALE_ORIG, + .size = NTA_SIZE(sizeof(uint8_t)), + }, + [NTA_TCP_WSCALE_REPL] = { + .parse = ct_parse_u8, + .attr = ATTR_TCP_WSCALE_REPL, + .size = NTA_SIZE(sizeof(uint8_t)), + }, }; static void -parse_u8(struct nf_conntrack *ct, int attr, void *data) +ct_parse_u8(struct nf_conntrack *ct, int attr, void *data) { uint8_t *value = (uint8_t *) data; nfct_set_attr_u8(ct, h[attr].attr, *value); } static void -parse_u16(struct nf_conntrack *ct, int attr, void *data) +ct_parse_u16(struct nf_conntrack *ct, int attr, void *data) { uint16_t *value = (uint16_t *) data; nfct_set_attr_u16(ct, h[attr].attr, ntohs(*value)); } static void -parse_u32(struct nf_conntrack *ct, int attr, void *data) +ct_parse_u32(struct nf_conntrack *ct, int attr, void *data) { uint32_t *value = (uint32_t *) data; nfct_set_attr_u32(ct, h[attr].attr, ntohl(*value)); } static void -parse_group(struct nf_conntrack *ct, int attr, void *data) +ct_parse_group(struct nf_conntrack *ct, int attr, void *data) { nfct_set_attr_grp(ct, h[attr].attr, data); } static void -parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data) +ct_parse_nat_seq_adj(struct nf_conntrack *ct, int attr, void *data) { struct nta_attr_natseqadj *this = data; nfct_set_attr_u32(ct, ATTR_ORIG_NAT_SEQ_CORRECTION_POS, ntohl(this->orig_seq_correction_pos)); nfct_set_attr_u32(ct, ATTR_ORIG_NAT_SEQ_OFFSET_BEFORE, - ntohl(this->orig_seq_correction_pos)); + ntohl(this->orig_seq_offset_before)); nfct_set_attr_u32(ct, ATTR_ORIG_NAT_SEQ_OFFSET_AFTER, - ntohl(this->orig_seq_correction_pos)); + ntohl(this->orig_seq_offset_after)); nfct_set_attr_u32(ct, ATTR_REPL_NAT_SEQ_CORRECTION_POS, - ntohl(this->orig_seq_correction_pos)); + ntohl(this->repl_seq_correction_pos)); nfct_set_attr_u32(ct, ATTR_REPL_NAT_SEQ_OFFSET_BEFORE, - ntohl(this->orig_seq_correction_pos)); + ntohl(this->repl_seq_offset_before)); nfct_set_attr_u32(ct, ATTR_REPL_NAT_SEQ_OFFSET_AFTER, - ntohl(this->orig_seq_correction_pos)); + ntohl(this->repl_seq_offset_after)); } -int parse_payload(struct nf_conntrack *ct, struct nethdr *net, size_t remain) +int msg2ct(struct nf_conntrack *ct, struct nethdr *net, size_t remain) { int len; struct netattr *attr; @@ -237,3 +248,195 @@ int parse_payload(struct nf_conntrack *ct, struct nethdr *net, size_t remain) return 0; } + +static void exp_parse_ct_group(void *ct, int attr, void *data); +static void exp_parse_ct_u8(void *ct, int attr, void *data); +static void exp_parse_u32(void *exp, int attr, void *data); + +static struct exp_parser { + void (*parse)(void *obj, int attr, void *data); + int exp_attr; + int ct_attr; + int size; +} exp_h[NTA_EXP_MAX] = { + [NTA_EXP_MASTER_IPV4] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_MASTER, + .ct_attr = ATTR_GRP_ORIG_IPV4, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), + }, + [NTA_EXP_MASTER_IPV6] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_MASTER, + .ct_attr = ATTR_GRP_ORIG_IPV6, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), + }, + [NTA_EXP_MASTER_L4PROTO] = { + .parse = exp_parse_ct_u8, + .exp_attr = ATTR_EXP_MASTER, + .ct_attr = ATTR_L4PROTO, + .size = NTA_SIZE(sizeof(uint8_t)), + }, + [NTA_EXP_MASTER_PORT] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_MASTER, + .ct_attr = ATTR_GRP_ORIG_PORT, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_port)), + }, + [NTA_EXP_EXPECT_IPV4] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_EXPECTED, + .ct_attr = ATTR_GRP_ORIG_IPV4, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), + }, + [NTA_EXP_EXPECT_IPV6] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_EXPECTED, + .ct_attr = ATTR_GRP_ORIG_IPV6, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), + }, + [NTA_EXP_EXPECT_L4PROTO] = { + .parse = exp_parse_ct_u8, + .exp_attr = ATTR_EXP_EXPECTED, + .ct_attr = ATTR_L4PROTO, + .size = NTA_SIZE(sizeof(uint8_t)), + }, + [NTA_EXP_EXPECT_PORT] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_EXPECTED, + .ct_attr = ATTR_GRP_ORIG_PORT, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_port)), + }, + [NTA_EXP_MASK_IPV4] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_MASK, + .ct_attr = ATTR_GRP_ORIG_IPV4, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv4)), + }, + [NTA_EXP_MASK_IPV6] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_MASK, + .ct_attr = ATTR_GRP_ORIG_IPV6, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_ipv6)), + }, + [NTA_EXP_MASK_L4PROTO] = { + .parse = exp_parse_ct_u8, + .exp_attr = ATTR_EXP_MASK, + .ct_attr = ATTR_L4PROTO, + .size = NTA_SIZE(sizeof(uint8_t)), + }, + [NTA_EXP_MASK_PORT] = { + .parse = exp_parse_ct_group, + .exp_attr = ATTR_EXP_MASK, + .ct_attr = ATTR_GRP_ORIG_PORT, + .size = NTA_SIZE(sizeof(struct nfct_attr_grp_port)), + }, + [NTA_EXP_TIMEOUT] = { + .parse = exp_parse_u32, + .exp_attr = ATTR_EXP_TIMEOUT, + .size = NTA_SIZE(sizeof(uint32_t)), + }, + [NTA_EXP_FLAGS] = { + .parse = exp_parse_u32, + .exp_attr = ATTR_EXP_FLAGS, + .size = NTA_SIZE(sizeof(uint32_t)), + }, +}; + +static void exp_parse_ct_group(void *ct, int attr, void *data) +{ + nfct_set_attr_grp(ct, exp_h[attr].ct_attr, data); +} + +static void exp_parse_ct_u8(void *ct, int attr, void *data) +{ + uint8_t *value = (uint8_t *) data; + nfct_set_attr_u8(ct, exp_h[attr].ct_attr, *value); +} + +static void exp_parse_u32(void *exp, int attr, void *data) +{ + uint32_t *value = (uint32_t *) data; + nfexp_set_attr_u32(exp, exp_h[attr].exp_attr, ntohl(*value)); +} + +int msg2exp(struct nf_expect *exp, struct nethdr *net, size_t remain) +{ + int len; + struct netattr *attr; + struct nf_conntrack *master, *expected, *mask; + + if (remain < net->len) + return -1; + + len = net->len - NETHDR_SIZ; + attr = NETHDR_DATA(net); + + master = nfct_new(); + if (master == NULL) + goto err_master; + + expected = nfct_new(); + if (expected == NULL) + goto err_expected; + + mask = nfct_new(); + if (mask == NULL) + goto err_mask; + + while (len > ssizeof(struct netattr)) { + ATTR_NETWORK2HOST(attr); + if (attr->nta_len > len) + goto err; + if (attr->nta_attr > NTA_MAX) + goto err; + if (attr->nta_len != exp_h[attr->nta_attr].size) + goto err; + if (exp_h[attr->nta_attr].parse == NULL) { + attr = NTA_NEXT(attr, len); + continue; + } + switch(exp_h[attr->nta_attr].exp_attr) { + case ATTR_EXP_MASTER: + exp_h[attr->nta_attr].parse(master, attr->nta_attr, + NTA_DATA(attr)); + case ATTR_EXP_EXPECTED: + exp_h[attr->nta_attr].parse(expected, attr->nta_attr, + NTA_DATA(attr)); + case ATTR_EXP_MASK: + exp_h[attr->nta_attr].parse(mask, attr->nta_attr, + NTA_DATA(attr)); + break; + case ATTR_EXP_TIMEOUT: + case ATTR_EXP_FLAGS: + exp_h[attr->nta_attr].parse(exp, attr->nta_attr, + NTA_DATA(attr)); + break; + } + attr = NTA_NEXT(attr, len); + } + + nfexp_set_attr(exp, ATTR_EXP_MASTER, master); + nfexp_set_attr(exp, ATTR_EXP_EXPECTED, expected); + nfexp_set_attr(exp, ATTR_EXP_MASK, mask); + + /* We can release the conntrack objects at this point because the + * setter makes a copy of them. This is not efficient, it would be + * better to save that extra copy but this is how the library works. + * I'm sorry, I cannot change it without breaking backward + * compatibility. Probably it is a good idea to think of adding new + * interfaces in the near future to get it better. */ + nfct_destroy(mask); + nfct_destroy(expected); + nfct_destroy(master); + + return 0; +err: + nfct_destroy(mask); +err_mask: + nfct_destroy(expected); +err_expected: + nfct_destroy(master); +err_master: + return -1; +} diff --git a/src/read_config_lex.c b/src/read_config_lex.c index c463526..a6bcd17 100644 --- a/src/read_config_lex.c +++ b/src/read_config_lex.c @@ -381,8 +381,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 102 -#define YY_END_OF_BUFFER 103 +#define YY_NUM_RULES 105 +#define YY_END_OF_BUFFER 106 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -390,319 +390,323 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[2830] = +static yyconst flex_int16_t yy_accept[2865] = { 0, - 0, 0, 103, 101, 99, 100, 100, 101, 101, 91, - 87, 87, 101, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 101, 99, - 0, 98, 88, 91, 0, 87, 87, 0, 0, 90, - 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 0, 97, 85, 85, 97, 97, 97, 97, 97, - - 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 0, 0, 85, 0, - 85, 0, 0, 87, 87, 0, 0, 0, 90, 0, - 90, 97, 97, 97, 0, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 0, 97, 0, 97, 97, 0, 86, 86, 97, - 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - - 11, 97, 97, 10, 97, 97, 45, 86, 86, 0, - 87, 87, 0, 0, 0, 0, 0, 90, 90, 90, - 90, 97, 97, 97, 0, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, - 94, 94, 97, 97, 70, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 37, - 97, 95, 95, 97, 0, 97, 77, 95, 97, 0, - 18, 97, 24, 97, 97, 97, 97, 97, 97, 97, - 97, 0, 97, 97, 97, 97, 97, 29, 97, 97, - 79, 1, 97, 0, 94, 0, 0, 87, 87, 0, - - 0, 0, 0, 0, 0, 0, 90, 90, 90, 97, - 97, 92, 92, 97, 97, 97, 54, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, - 97, 23, 97, 97, 0, 0, 97, 97, 97, 0, - 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, - 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 0, 0, 97, 97, 97, 66, 30, 97, 97, 0, - 97, 92, 92, 0, 87, 87, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, - 90, 97, 97, 67, 97, 97, 55, 0, 97, 97, - - 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, - 39, 63, 97, 97, 97, 0, 0, 0, 0, 0, - 0, 68, 97, 97, 0, 56, 97, 97, 97, 97, - 97, 97, 97, 0, 97, 97, 0, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, - 97, 97, 26, 0, 97, 0, 89, 89, 87, 87, + 0, 0, 106, 104, 102, 103, 103, 104, 104, 94, + 90, 90, 104, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 104, + 102, 0, 101, 91, 94, 0, 90, 90, 0, 0, + 93, 100, 100, 100, 100, 100, 100, 0, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 0, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 0, 100, 88, 100, 88, 100, 100, + + 100, 100, 100, 0, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, + 0, 88, 0, 88, 0, 0, 90, 90, 0, 0, + 0, 93, 0, 93, 100, 100, 100, 0, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 0, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 0, 100, 0, 100, 100, + 0, 89, 89, 100, 100, 0, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + + 100, 100, 100, 100, 100, 11, 100, 100, 10, 100, + 100, 45, 89, 89, 0, 90, 90, 0, 0, 0, + 0, 0, 93, 93, 93, 93, 100, 100, 100, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 0, 97, 97, 100, 100, + 70, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 37, 100, 98, 98, 100, + 0, 100, 77, 98, 100, 100, 0, 18, 100, 24, + 100, 100, 100, 100, 100, 100, 100, 100, 0, 100, + 100, 100, 100, 100, 29, 100, 100, 100, 79, 1, + + 100, 0, 97, 0, 0, 90, 90, 0, 0, 0, + 0, 0, 0, 0, 93, 93, 93, 100, 100, 95, + 95, 100, 100, 100, 54, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 0, 100, 100, 100, + 23, 100, 100, 0, 0, 100, 100, 100, 0, 100, + 100, 100, 100, 100, 100, 100, 0, 100, 100, 100, + 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 0, 0, 100, 100, 100, 66, 30, 100, 100, 100, + 0, 100, 95, 95, 0, 90, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, + + 93, 93, 100, 100, 67, 100, 100, 55, 0, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 0, 39, 63, 100, 100, 100, 0, 0, 0, + 0, 0, 0, 68, 100, 100, 0, 56, 100, 100, + 100, 100, 100, 100, 100, 0, 100, 100, 100, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, + 0, 100, 100, 100, 100, 26, 100, 0, 100, 0, + 92, 92, 90, 90, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, + 93, 93, 93, 93, 100, 100, 65, 22, 0, 100, + + 100, 100, 100, 74, 100, 100, 100, 100, 100, 100, + 100, 0, 28, 100, 100, 0, 0, 0, 0, 0, + 0, 100, 100, 100, 100, 0, 100, 100, 25, 100, + 100, 100, 99, 99, 100, 84, 100, 0, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, + 100, 100, 100, 100, 100, 0, 100, 99, 0, 90, + 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 100, + 100, 0, 100, 100, 42, 100, 100, 100, 100, 100, + + 100, 100, 100, 100, 50, 100, 12, 0, 0, 0, + 0, 0, 0, 100, 100, 100, 100, 52, 38, 27, + 100, 100, 100, 100, 100, 100, 100, 100, 0, 75, + 80, 64, 100, 100, 100, 100, 100, 100, 100, 48, + 47, 100, 100, 100, 21, 100, 0, 100, 92, 92, + 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 97, 97, 65, 22, 0, 97, 97, 97, 97, 74, - 97, 97, 97, 97, 97, 97, 0, 28, 97, 97, - - 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, - 0, 97, 97, 25, 97, 97, 97, 96, 96, 97, - 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 0, 0, 97, 97, 97, 97, 0, 97, - 96, 0, 87, 87, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 100, 100, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + + 100, 17, 0, 0, 0, 0, 0, 0, 100, 100, + 8, 100, 100, 100, 100, 9, 100, 100, 100, 100, + 0, 100, 100, 100, 100, 44, 100, 100, 78, 100, + 100, 100, 53, 71, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 97, 97, 0, 97, 97, 42, 97, 97, - 97, 97, 97, 97, 97, 97, 50, 97, 12, 0, - 0, 0, 0, 0, 0, 97, 97, 97, 97, 52, - - 38, 27, 97, 97, 97, 97, 97, 97, 97, 97, - 0, 75, 80, 64, 97, 97, 97, 97, 97, 97, - 97, 48, 47, 97, 97, 97, 21, 0, 97, 89, - 89, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 97, 97, - 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 17, 0, 0, 0, 0, 0, 0, 97, 97, - 8, 97, 97, 97, 97, 9, 97, 97, 97, 97, - - 0, 97, 97, 97, 97, 44, 97, 97, 78, 97, - 97, 53, 71, 87, 87, 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, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 97, - 97, 51, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 0, 0, 0, 0, 0, 0, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 93, 93, 97, - 97, 97, 97, 97, 97, 97, 97, 87, 87, 0, - + 0, 0, 0, 0, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 100, 100, 51, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 0, 0, 0, 0, 0, 0, + + 100, 100, 100, 100, 100, 100, 100, 100, 100, 96, + 96, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 90, 90, 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, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 49, 100, 100, 100, 0, 0, 0, 0, 0, + 0, 100, 100, 72, 100, 100, 100, 100, 100, 100, + + 100, 100, 13, 100, 100, 100, 100, 100, 100, 90, + 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 49, 97, - 97, 0, 0, 0, 0, 0, 0, 97, 97, 72, - 97, 97, 97, 97, 97, 97, 97, 97, 13, 97, - 97, 97, 97, 97, 87, 87, 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, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 100, 100, 14, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 0, 2, 0, 0, 3, 0, 100, 100, + 100, 100, 100, 100, 100, 100, 69, 100, 100, 100, + + 100, 100, 100, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 97, 97, 14, 97, 97, - 97, 97, 97, 97, 97, 97, 0, 2, 0, 0, - 3, 0, 97, 97, 97, 97, 97, 97, 97, 97, - 69, 97, 97, 97, 97, 97, 97, 87, 87, 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, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 100, 43, 100, 15, 100, 100, 100, 100, 100, + 100, 100, 0, 0, 0, 0, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + + 100, 90, 90, 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, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 97, 43, 97, 15, 97, 97, - 97, 97, 97, 97, 0, 0, 0, 0, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 87, 87, 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, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 100, 100, 100, + 58, 100, 100, 100, 100, 100, 0, 6, 0, 7, + 19, 100, 100, 100, 100, 100, 100, 100, 100, 100, + + 100, 100, 100, 100, 100, 90, 90, 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, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 97, 97, - 97, 58, 97, 97, 97, 97, 0, 6, 0, 7, - 19, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 100, 100, 100, + 100, 100, 100, 100, 86, 0, 0, 100, 100, 100, + + 100, 100, 100, 100, 62, 100, 100, 41, 61, 100, + 100, 90, 90, 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, - 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 97, 97, 97, 97, - 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, - 97, 97, 62, 97, 97, 41, 61, 97, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + + 93, 93, 100, 100, 100, 100, 100, 87, 100, 0, + 0, 20, 100, 100, 100, 100, 100, 100, 31, 40, + 32, 100, 90, 90, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 97, - 97, 97, 97, 97, 84, 97, 0, 0, 20, 97, - 97, 97, 97, 97, 97, 31, 40, 32, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 100, + 46, 100, 100, 100, 100, 0, 0, 57, 100, 100, + 35, 100, 100, 100, 85, 90, 90, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 97, 46, 97, 97, 97, - 97, 0, 0, 57, 97, 97, 35, 97, 97, 97, - - 87, 87, 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, 93, + + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 100, + 100, 100, 100, 100, 0, 0, 100, 100, 100, 100, + 100, 100, 90, 90, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 97, 97, 97, 97, 97, 0, - 0, 97, 97, 97, 97, 97, 97, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 100, 100, 100, 100, 73, 0, 0, 100, 100, 100, + 100, 100, 100, 90, 90, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 100, 16, 83, 82, 0, 0, 60, + 59, 100, 100, 76, 100, 90, 90, 0, 0, 0, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 97, 97, 97, 97, 73, - 0, 0, 97, 97, 97, 97, 97, 97, 87, 87, - 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, 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, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 97, 16, - 83, 82, 0, 0, 60, 59, 97, 97, 76, 97, - 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 93, 93, 100, 0, 0, 100, 81, 100, 90, 90, 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, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 97, 0, 0, - 97, 81, 97, 87, 87, 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, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 100, 0, 0, 100, 100, 90, 90, 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, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 97, 0, 0, 97, - 97, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 100, 0, 0, 100, 100, 90, 90, 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, 0, 0, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 97, 0, 0, 97, - 97, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 100, 4, 5, 100, 33, 100, 90, + 90, 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, 0, 0, - 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 97, 4, - 5, 97, 33, 97, 87, 87, 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, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 100, 100, 34, + 90, 90, 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, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 97, 97, 34, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 100, 36, 90, 90, 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, 90, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 97, 36, 87, 87, 0, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 100, 90, 90, 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, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 97, 87, - 87, 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, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 97, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 97, 87, - 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 97, 87, 87, + + 0, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 100, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 97, 87, - 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 97, 87, 87, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - - 90, 90, 90, 90, 97, 87, 87, 0, 0, 0, - 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 90, 97, 87, 87, 0, 0, 90, 90, 90, 90, - 90, 90, 90, 97, 87, 87, 0, 90, 90, 90, - 97, 87, 87, 90, 97, 87, 87, 97, 87, 87, - 97, 87, 87, 97, 87, 87, 97, 87, 87, 97, - 87, 87, 97, 87, 87, 97, 87, 87, 97, 87, - 87, 97, 87, 87, 97, 87, 87, 97, 87, 87, - 97, 87, 87, 97, 87, 87, 97, 87, 87, 97, - 87, 87, 97, 87, 87, 97, 87, 87, 97, 87, - - 87, 97, 87, 87, 97, 87, 87, 97, 87, 87, - 97, 87, 87, 97, 87, 87, 97, 87, 87, 97, - 87, 87, 97, 87, 87, 97, 87, 87, 0 + 0, 0, 0, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 100, 90, 90, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 100, 90, 90, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 100, + 90, 90, 0, 0, 0, 0, 0, 0, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 100, + 90, 90, 0, 0, 0, 0, 0, 0, 93, 93, + 93, 93, 93, 93, 93, 93, 100, 90, 90, 0, + 0, 93, 93, 93, 93, 93, 93, 93, 100, 90, + 90, 0, 93, 93, 93, 100, 90, 90, 93, 100, + 90, 90, 100, 90, 90, 100, 90, 90, 100, 90, + 90, 100, 90, 90, 100, 90, 90, 100, 90, 90, + + 100, 90, 90, 100, 90, 90, 100, 90, 90, 100, + 90, 90, 100, 90, 90, 100, 90, 90, 100, 90, + 90, 100, 90, 90, 100, 90, 90, 100, 90, 90, + 100, 90, 90, 100, 90, 90, 100, 90, 90, 100, + 90, 90, 100, 90, 90, 100, 90, 90, 100, 90, + 90, 100, 90, 90, 100, 90, 90, 100, 90, 90, + 100, 90, 90, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -711,16 +715,16 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 6, 7, 1, 1, 1, 1, 1, - 1, 1, 8, 1, 8, 9, 10, 11, 11, 12, - 13, 14, 13, 15, 13, 13, 13, 16, 1, 1, - 1, 1, 1, 1, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 26, - 1, 1, 1, 1, 42, 1, 43, 44, 45, 46, - - 47, 48, 49, 50, 51, 26, 52, 53, 54, 55, - 56, 57, 26, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 1, 67, 1, 1, 1, 1, 1, 1, + 1, 1, 8, 1, 9, 10, 11, 12, 12, 13, + 14, 15, 14, 16, 14, 14, 14, 17, 1, 1, + 1, 1, 1, 1, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 27, + 1, 1, 1, 1, 43, 1, 44, 45, 46, 47, + + 48, 49, 50, 51, 52, 27, 53, 54, 55, 56, + 57, 58, 27, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 1, 68, 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, @@ -737,2211 +741,2229 @@ static yyconst flex_int32_t yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[68] = +static yyconst flex_int32_t yy_meta[69] = { 0, 1, 1, 2, 1, 2, 2, 1, 1, 3, 4, - 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, - 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 1, 5, 5, 5, 5, 5, 5, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 8 + 5, 6, 6, 6, 6, 6, 7, 6, 6, 6, + 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 6, 6, 6, 6, 6, 6, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 8 } ; -static yyconst flex_int16_t yy_base[4541] = +static yyconst flex_int16_t yy_base[4576] = { 0, - 0, 0,10684,10685, 66,10685,10685,10680, 61, 0, - 68, 76,10666, 82, 139, 81, 64, 78, 137, 123, - 98, 147, 53, 100, 152, 155, 182, 193, 189, 127, - 210, 202, 204, 164,10638, 201, 242, 258, 309, 103, - 10677,10685, 269, 0, 275, 288, 299,10663, 103,10668, - 122, 366,10650, 275,10631,10629, 211,10629, 291,10628, - 277, 185, 187, 260, 280, 301, 304, 305, 307,10618, - 279, 333, 306, 175, 334, 332, 354, 337, 359, 350, - 227, 380, 377, 378, 379, 351, 382, 386, 404, 390, - 387, 388, 412, 126, 403, 422, 414, 425, 421, 426, - - 409, 423, 443, 436, 445, 452, 442, 470, 449, 483, - 453, 457, 485, 481, 478, 489, 99, 496,10685, 471, - 547, 521, 546, 559, 573,10655, 325,10654, 107, 528, - 511, 604, 510, 495, 533,10622,10610,10615, 530,10616, - 535, 577,10622, 560, 578, 563, 592, 597, 588, 594, - 595, 593, 612, 613, 617, 619, 621, 624, 653, 625, - 623, 630, 641, 659, 638, 626, 667, 656, 649, 671, - 683, 673, 660, 670, 686, 685, 690, 687,10685, 706, - 677, 693, 703, 691, 705, 695, 697, 714, 713, 731, - 729, 743, 747, 750, 751, 717, 752, 760, 759, 762, - - 761, 767, 769, 763, 783, 775, 771, 768, 805, 834, - 862, 870,10648, 327,10647,10646,10645, 840, 847, 784, - 10650, 876, 849, 851, 872,10602, 883, 850, 886, 888, - 789, 890,10597, 893, 894, 776, 895, 896, 899,10618, - 898,10685, 911, 909, 912, 913, 915, 916, 926, 927, - 917, 929, 930, 931, 965, 954, 918, 951, 932, 921, - 958, 922,10685, 974, 983, 979, 987, 988, 991, 81, - 990, 992, 994, 995, 996, 997, 1004, 998, 1003, 1017, - 1018, 99, 1020, 1013, 1027, 1031, 1019, 1008, 1021, 1040, - 1012, 1022, 1024, 1075, 1076, 1097, 1111, 1122, 1135,10640, - - 786,10639,10638,10637,10636,10635, 793,10640, 1086, 1141, - 1112, 1032,10685, 1105, 1116, 1124, 1097, 1154, 1150, 1152, - 1125, 1153, 1155, 1129, 1178, 1165, 1179,10632, 1158, 1160, - 1181, 1033, 1183, 1184, 1052, 1185, 1186, 1191, 1185,10631, - 1199, 1187, 1192, 1194, 1221, 1215, 1225, 1195, 1210, 1214, - 1228, 1251, 1248, 1241, 1253, 1252, 1255, 1258, 1256, 1259, - 10626,10625, 1260, 1262, 1264, 1263, 1267, 1274, 1268,10606, - 1275, 1266, 1293, 1332, 1342, 1350,10628, 792,10627,10626, - 10625,10624,10623,10622,10621,10620, 1286,10625, 1290, 1293, - 10624, 1356, 1363, 1320, 1321, 1365, 1323,10594, 1366, 1367, - - 1324, 1370, 1368, 1373, 1376, 1377, 1380, 1378, 1382,10607, - 1379, 1381, 1397, 1399, 1391,10584,10584,10574,10581,10581, - 10571, 1395, 1413, 1392,10606, 1394, 1400, 1402, 1405, 1438, - 1410, 1444, 1447, 1441, 1454, 1455, 1437, 1462, 1422, 1460, - 1459, 1465, 1463, 1470, 1469, 1476,10605,10593, 1472, 1468, - 1480, 1484, 1474,10605, 1502, 1497, 1548, 1560, 1567, 1575, - 10605, 797,10604,10603,10602,10601,10600,10599,10598,10597, - 10596,10595,10594, 1300,10599, 1524, 1528,10598, 1532, 1536, - 1581, 1549, 1486, 1487,10590, 1550, 1569, 1552, 1591, 1551, - 1592, 1594, 1616, 1596, 1593, 1597,10570, 1595, 1598, 1599, - - 10546,10558,10543,10543,10555,10540, 1617, 1618, 1605, 1622, - 10572, 1631, 1606, 1627, 1607, 1632, 1623, 1619,10685, 1636, - 1672, 1634, 1654, 1640, 1655, 1661, 1664, 1676, 1675, 1680, - 1684, 1688,10560,10561, 1679, 1686, 1693, 1681,10571, 1690, - 1689, 1750, 1757, 1765,10579, 1006,10578,10577,10576,10575, - 10574,10573,10572,10571,10570,10569,10568,10567,10566,10565, - 10564,10563, 1540,10568, 1704, 1713,10567, 1714, 1722, 1734, - 1742,10566, 1771, 459,10550, 129, 62,10558, 854, 538, - 988, 148, 1161, 248, 808, 1709,10685, 777,10557,10512, - 10513,10523,10509,10510,10520, 1743, 290, 1759, 1778,10685, - - 10550,10549, 1779, 1081, 1785, 1781, 1782, 1515, 1780, 1792, - 1770,10548,10547,10546, 1786, 1788, 1297, 1789, 1787, 130, - 1791,10685,10685, 1793, 1794, 1507,10545,10524, 1808, 1815, - 1849, 1856, 1864,10543, 1403,10542,10541,10540,10539,10538, - 10537,10536,10535,10534,10533,10532,10531,10530,10529,10528, - 10527,10526,10525,10524,10523,10522, 1829,10527, 1836, 1840, - 1871, 1872, 1873, 1874,10526, 1875, 1876, 1883, 1889, 1796, - 10499, 1797, 1819, 1878, 1816, 1795, 1879, 1880, 580, 1881, - 1898,10518,10482,10485,10473,10479,10482,10470, 1882, 1896, - 10511, 1900, 1899, 1897, 1901,10510, 1902, 1904, 1905, 1907, - - 1888, 1903, 345, 1906, 1910,10509, 1913, 1911,10508, 1930, - 1914,10685,10507, 1964, 1972,10506, 1718,10505,10504,10503, - 10502,10501,10500,10499,10498,10497,10496,10495,10494,10493, - 10492,10491,10490,10489,10488,10487,10486,10485,10484,10483, - 10482,10481,10480, 1948,10485, 1955, 1979,10484, 1980, 1981, - 1982,10483, 1983, 1984, 1991, 1992, 1993, 1994,10480, 2000, - 1807,10685, 1966, 1989, 1950, 2007, 2008, 2010, 2012, 805, - 1940, 2013,10431,10423,10430,10419,10411,10418, 2014, 1915, - 2015, 1922, 2016, 2019, 2017, 2020, 2018,10446,10685, 2021, - 2022, 2024, 2023, 2025, 2033, 2026, 2034, 2077, 2085,10442, - - 2042,10438,10434,10430,10426,10422,10418,10414,10410,10406, - 10402,10398,10394,10390,10386,10382,10378,10374,10370,10363, - 10349,10327,10295,10251,10197,10192,10110,10105,10010,10005, - 9890, 2044, 9891, 2068, 2069, 9762, 2092, 2093, 2094, 2095, - 2096, 2097, 2104, 2105, 9757, 2106, 2107, 2108, 2109, 2115, - 2079, 2122, 413, 2123, 2124, 2125, 2127, 2128, 9600, 2126, - 2132, 9568, 9388, 9399, 9213, 9192, 9006, 2130, 2136, 9028, - 2131, 2138, 2139, 2133, 2134, 2135, 2137, 2140, 8804, 2141, - 2148, 2160, 2150, 2149, 2199, 2207, 8799, 2158, 8574, 8569, - 8332, 8327, 8101, 8096, 7870, 7865, 7663, 7658, 7461, 7456, - - 7285, 7280, 7115, 7110, 6969, 6964, 6832, 6827, 6717, 6712, - 6612, 6607, 6527, 6522, 6457, 6410, 6375, 6351, 6334, 6323, - 6315, 6309, 6305, 2161, 6303, 2186, 2189, 6287, 2193, 2214, - 2215, 2216, 6286, 2217, 2218, 2219, 6285, 2226, 2227, 2228, - 2229, 2230, 2231, 2238, 6284, 2244, 2153, 6277, 2235, 2234, - 583, 2156, 2251, 2252, 2253, 2254, 6232,10685, 6241, 6219, - 10685, 6226, 2255, 2233, 2237, 2236, 2256, 2257, 2258, 2259, - 6243, 2261, 2263, 2264, 2265, 2270, 2266, 2310, 2318, 6242, - 2288, 6241, 6240, 6233, 6225, 6217, 6205, 6204, 6203, 6202, - 6195, 6187, 6179, 6167, 6166, 6165, 6164, 6157, 6149, 6129, - - 6128, 6127, 6126, 6119, 6111, 6103, 6091, 6090, 6089, 6088, - 6081, 6073, 6065, 6053, 6052, 6051, 6050, 6043, 6035, 6027, - 2286, 6021, 2325, 2326, 2327, 2328, 2329, 2330, 6020, 2337, - 2338, 2339, 2340, 2341, 2342, 2349, 2350, 2351, 2352, 6019, - 2353, 2354, 2361, 2362, 2368, 6012, 2375, 6005, 2357, 2268, - 2269, 2358, 1065, 2377, 5962, 5946, 5941, 5944, 2260, 2376, - 2359, 2360, 2379, 2383, 1933, 2380, 2381, 2384, 2386, 2387, - 2389, 2390, 2410, 2433, 5974, 2289, 5967, 5959, 5951, 5939, - 5938, 5937, 5936, 5929, 5921, 5913, 5901, 5900, 5899, 5898, - 5891, 5883, 5875, 5863, 5862, 5861, 5860, 5853, 5845, 5825, - - 5824, 5823, 5822, 5815, 5807, 5799, 5787, 5786, 5785, 5784, - 5777, 5769, 5761, 5749, 5748, 5747, 5746, 5739, 5731, 5723, - 2417, 5717, 2440, 2441, 5716, 2442, 2444, 2445, 5715, 2449, - 2452, 2453, 2454, 2456, 2457, 5714, 2461, 2464, 2465, 5707, - 2466, 2468, 2469, 2473, 2476, 2477, 2478, 5699, 2484, 2474, - 2475, 5673, 2491, 2492, 2493, 2040, 5632,10685, 5631,10685, - 5670, 2494, 2392, 2051, 2152, 2495, 2391, 2499, 2496, 2497, - 2498, 2500, 2501, 2502, 2510, 2527, 5663, 2401, 5655, 5647, - 5635, 5634, 5633, 5632, 5625, 5617, 5609, 5597, 5596, 5595, - 5594, 5587, 5579, 5571, 5559, 5558, 5557, 5556, 5549, 5541, - - 5521, 5520, 5519, 5518, 5511, 5503, 5495, 5483, 5482, 5481, - 5480, 5473, 5465, 5457, 5445, 5444, 5443, 5442, 5435, 5427, - 5419, 5407, 5406, 5405, 5404, 5397, 2539, 5395, 2541, 2546, - 5375, 2550, 2551, 2553, 2555, 2560, 2562, 2563, 2564, 5374, - 2565, 2567, 2572, 2574, 2575, 2576, 2577, 2579, 2584, 2586, - 2587, 5373, 2588, 2589, 2591, 2596, 2602, 2592, 2593, 2609, - 2610, 2594, 2611, 5327, 5320, 2595, 2614, 2615, 2616, 2617, - 2618, 2619, 5351, 2620, 2621, 5343, 5331, 2622, 2645, 2673, - 5330, 2654, 5329, 5328, 5321, 5313, 5305, 5293, 5292, 5291, - 5290, 5283, 5275, 5267, 5255, 5254, 5253, 5252, 5245, 5237, - - 5222, 5221, 5220, 5219, 5218, 5210, 5209, 5208, 5207, 5200, - 5192, 5184, 5176, 5175, 5174, 5173, 5164, 5163, 5162, 5161, - 5154, 5146, 5138, 5128, 5127, 5106, 5105, 5104, 54, 70, - 159, 237, 322, 344, 446, 2657, 513, 2662, 2665, 568, - 2680, 2681, 2682, 2683, 696, 2684, 2685, 2692, 704, 2693, - 2694, 2695, 2696, 2697, 2704, 2705, 812, 2706, 2707, 2708, - 926, 2709, 2716, 2717, 2718, 2719, 2720, 2721, 939, 2727, - 2624, 2734, 2735, 2736, 1007, 2504, 1009, 1073, 1197, 2737, - 2738, 2739, 2741, 2740, 2742, 1277, 1333, 2037, 2750, 2781, - 1334, 2751, 1406, 1407, 1479, 1503, 1652, 1700, 1721, 1725, - - 1820, 1841, 1938, 2036, 2061, 2163, 2176, 2188, 2284, 2393, - 2413, 2414, 2418, 2521, 2532, 2623, 2626, 2627, 2635, 2639, - 2648, 2649, 2752, 2753, 2760, 2764, 2765, 2766, 2767, 2769, - 2773, 2782, 2783, 2784, 2786, 2787, 2788, 2789, 2790, 2791, - 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, 2807, - 2808, 2809, 2810, 2811, 2812, 2814, 2819, 2821, 2822, 2823, - 2824, 2826, 2827, 2831, 2834, 2835, 2836, 2838, 2839, 2843, - 2845, 2846, 2847, 2848, 2850, 2855, 2857, 2858, 2859, 2860, - 2862, 2867, 2868, 2869, 2870, 2876, 2865, 2866, 2883, 2884, - 2885, 2885, 2886, 2888, 2889, 2890, 2896, 2891, 2892, 2897, - - 2930, 2938, 2893, 2901, 2895, 2898, 2900, 2902, 2910, 2911, - 2914, 2915, 2916, 2917, 2919, 2932, 2939, 2940, 2942, 2943, - 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, - 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, - 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, - 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, - 2984, 2985, 2986, 2987, 2994, 2995, 2996, 2997, 2998, 2999, - 3001, 3004, 3006, 3008, 3009, 3011, 3012, 3013, 3016, 3020, - 3021, 3023, 3024, 3025, 3026, 3028, 3031, 3033, 3035, 3036, - 3038, 3040, 3043, 3045, 3046, 3047, 3048, 3050, 3053, 3055, - - 3057, 3058, 3060, 3062, 3066, 3059, 3073, 3074, 3075, 3046, - 3047, 3078, 3079, 3084, 3085, 3081, 3080, 3106, 3134, 3089, - 3121, 3083, 3086, 3087, 3088, 3091, 3092, 3122, 3100, 3112, - 3116, 3117, 3118, 3123, 3124, 3125, 3126, 3135, 3136, 3137, - 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 3147, - 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, - 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, - 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, - 3178, 3179, 3180, 3187, 3188, 3189, 3190, 3191, 3192, 3194, - 3197, 3199, 3201, 3202, 3204, 3206, 3209, 3211, 3213, 3214, - - 3215, 3216, 3218, 3223, 3225, 3226, 3227, 3228, 3230, 3235, - 3236, 3237, 3238, 3239, 3240, 3247, 3248, 3249, 3250, 3251, - 3252, 3258, 3259, 3260, 3261, 3267, 3257, 3256, 3274, 3275, - 3246, 3247, 3278, 3279, 3280, 3281, 3282, 3283, 3317, 3334, - 3291, 3285, 3286, 3288, 3289, 3292, 3293, 3301, 3302, 3303, - 3304, 3306, 3307, 3308, 3309, 3319, 3322, 3323, 3324, 3325, - 3326, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, - 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, - 3354, 3355, 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, - 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 3372, 3373, - - 3374, 3375, 3376, 3377, 3384, 3385, 3386, 3387, 3388, 3389, - 3391, 3396, 3398, 3399, 3400, 3401, 3402, 3403, 3407, 3410, - 3411, 3412, 3414, 3415, 3419, 3421, 3422, 3423, 3424, 3426, - 3429, 3431, 3433, 3434, 3436, 3438, 3441, 3443, 3444, 3445, - 3446, 3448, 3451, 3453, 3455, 3456, 3458, 3460, 3464, 3457, - 3471, 3472, 3431, 3432, 3475, 3476, 3477, 3478, 3479, 3480, - 3490, 3504, 3481, 3482, 3498, 3505, 3506, 3507, 3508, 3510, - 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, - 3521, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, - 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, - - 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, - 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, - 3562, 3563, 3564, 3571, 3572, 3573, 3574, 3575, 3576, 3581, - 3583, 3584, 3585, 3586, 3588, 3593, 3595, 3596, 3597, 3598, - 3600, 3603, 3605, 3607, 3608, 3610, 3612, 3615, 3617, 3619, - 3620, 3622, 3624, 3626, 3627, 3629, 3631, 3634, 3636, 3638, - 3639, 3641, 3643, 3646, 3648, 3649, 3650, 3656, 3614, 3616, - 3663, 3664, 3666, 3672, 3680, 3674, 3681, 3682, 3689, 3690, - 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, 3699, 3700, - 3701, 3702, 3703, 3704, 3707, 3708, 3709, 3710, 3711, 3712, - - 3713, 3714, 3715, 3716, 3717, 3718, 3719, 3720, 3721, 3722, - 3723, 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, 3732, - 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741, 3742, - 3743, 3744, 3745, 3752, 3753, 3754, 3755, 3756, 3757, 3764, - 3765, 3766, 3767, 3768, 3769, 3770, 3774, 3777, 3778, 3779, - 3781, 3782, 3786, 3788, 3789, 3790, 3791, 3793, 3796, 3798, - 3800, 3801, 3803, 3805, 3808, 3810, 3811, 3812, 3813, 3815, - 3818, 3820, 3822, 3823, 3825, 3827, 3831, 3781, 3795, 3839, - 3840, 3848, 3856, 3842, 3850, 3857, 3864, 3865, 3866, 3867, - 3868, 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, - - 3878, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3888, 3889, - 3890, 3891, 3892, 3893, 3894, 3895, 3896, 3897, 3898, 3899, - 3900, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3909, - 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3923, 3924, 3925, - 3926, 3927, 3928, 3935, 3936, 3937, 3938, 3939, 3940, 3945, - 3947, 3948, 3949, 3950, 3952, 3957, 3959, 3960, 3961, 3962, - 3964, 3968, 3969, 3971, 3972, 3973, 3976, 3980, 3981, 3983, - 3984, 3985, 3988, 3991, 3992, 3993, 3999, 3946, 3947, 4006, - 4007, 4015, 4023, 4009, 4017, 4024, 4025, 4032, 4033, 4034, - 4035, 4036, 4037, 4038, 4039, 4040, 4041, 4042, 4043, 4044, - - 4045, 4047, 4055, 4049, 4050, 4052, 4054, 4056, 4057, 4058, - 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, - 4069, 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, 4078, - 4079, 4086, 4087, 4088, 4089, 4090, 4091, 4095, 4098, 4099, - 4100, 4102, 4103, 4107, 4110, 4111, 4112, 4113, 4114, 4115, - 4119, 4122, 4123, 4124, 4126, 4127, 4131, 4133, 4134, 4135, - 4136, 4138, 4141, 4143, 4145, 4146, 4148, 4150, 4154,10685, - 10685, 4147, 4161, 4162, 4170, 4178, 4164, 4172, 4179, 4180, - 4187, 4188, 4189, 4190, 4192, 4193, 4194, 4195, 4197, 4198, - 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, 4207, 4208, - - 4209, 4210, 4211, 4212, 4213, 4214, 4215, 4216, 4217, 4218, - 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4233, 4234, - 4235, 4236, 4237, 4238, 4244, 4245, 4246, 4247, 4248, 4249, - 4256, 4257, 4258, 4259, 4260, 4261, 4267, 4268, 4269, 4270, - 4271, 4272, 4279, 4280, 4281, 4282, 4283, 4284, 4290, 4291, - 4292, 4293, 4299, 4288, 4289, 4313, 4321, 4307, 4315, 4323, - 4324, 4325, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, - 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, - 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, - 4360, 4361, 4362, 4363, 4370, 4371, 4372, 4373, 4374, 4375, - - 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4392, 4395, 4396, - 4397, 4399, 4400, 4404, 4406, 4407, 4408, 4409, 4411, 4414, - 4416, 4418, 4419, 4421, 4423, 4427, 4420, 4441, 4449, 4435, - 4443, 4450, 4451, 4452, 4453, 4460, 4461, 4462, 4463, 4464, - 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, - 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, - 4485, 4492, 4493, 4494, 4495, 4496, 4497, 4504, 4505, 4506, - 4507, 4508, 4509, 4514, 4516, 4517, 4518, 4519, 4521, 4526, - 4528, 4529, 4530, 4531, 4533, 4537, 4538, 4540, 4546, 4560, - 4568, 4535, 4536, 4539, 4554, 4562, 4569, 4570, 4571, 4572, - - 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, 4587, 4588, - 4589, 4590, 4591, 4592, 4593, 4594, 4595, 4602, 4603, 4604, - 4605, 4606, 4607, 4611, 4614, 4615, 4616, 4618, 4619, 4623, - 4626, 4627, 4628, 4629, 4630, 4631, 4635, 4638, 4639, 4640, - 4642, 4643, 4648, 4662, 4670, 4641, 4656, 4664, 4671, 4672, - 4673, 4674, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, - 4689, 4690, 4691, 4692, 4693, 4694, 4701, 4702, 4703, 4704, - 4705, 4706, 4712, 4713, 4714, 4715, 4716, 4717, 4724, 4725, - 4726, 4727, 4728, 4729, 4735, 4736, 4737, 4738, 4744, 4758, - 4766, 4733, 4734, 4752, 4760, 4767, 4768, 4769, 4770, 4777, - - 4778, 4779, 4780, 4781, 4782, 4783, 4784, 4785, 4792, 4793, - 4794, 4795, 4796, 4797, 4804, 4805, 4806, 4807, 4808, 4809, - 4810, 4814, 4817, 4818, 4819, 4821, 4822, 4827, 4841, 4849, - 4820, 4835, 4843, 4850, 4851, 4852, 4853, 4860, 4861, 4862, - 4863, 4864, 4865, 4872, 4873, 4874, 4875, 4876, 4877, 4884, - 4885, 4886, 4887, 4888, 4889, 4894, 4896, 4897, 4903, 4917, - 4925, 4892, 4893, 4895, 4911, 4919, 4926, 4927, 4928, 4929, - 4936, 4943, 4944, 4945, 4946, 4947, 4948, 4952, 4955, 4956, - 4957, 4959, 4960, 4964, 4966, 4980, 4988, 4966, 4974, 4982, - 4989, 4990, 4991, 4998, 5005, 5006, 5007, 5008, 5009, 5010, - - 5016, 5017, 5018, 5019, 5025, 5039, 5047, 5014, 5015, 5033, - 5041, 5048, 5063, 5055, 5069, 5070, 5071, 5072, 5073, 5074, - 5056, 5080, 5094, 5102, 5051, 5080, 5118, 5123, 5094, 5129, - 5130, 5131, 5132, 5138, 5152, 5160, 5096, 5109, 5177, 5178, - 5184, 5198, 5206, 5223, 5229, 5243, 5251, 5267, 5281, 5289, - 5305, 5319, 5327, 5343, 5357, 5365, 5381, 5395, 5403, 5419, - 5433, 5441, 5457, 5471, 5479, 5495, 5509, 5517, 5533, 5547, - 5555, 5571, 5585, 5593, 5609, 5623, 5631, 5647, 5661, 5669, - 5685, 5699, 5707, 5723, 5737, 5745, 5761, 5775, 5783, 5799, - 5813, 5821, 5837, 5851, 5859, 5875, 5889, 5897, 5913, 5927, - - 5935, 5951, 5965, 5973, 5989, 6003, 6011, 6027, 6041, 6049, - 6065, 6079, 6087, 6103, 6117, 6125, 6141, 6155, 6163, 6179, - 6193, 6201, 6217, 6231, 6239, 6255, 6269, 6276,10685, 6303, - 6311, 6317, 6321, 6327, 6329, 6332, 6335, 6337, 6339, 6342, - 6346, 6348, 6350, 6352, 6354, 6357, 6360, 6363, 6365, 6367, - 6369, 6371, 6373, 6375, 6378, 6381, 6383, 6387, 6389, 6391, - 6393, 6395, 6397, 6399, 6401, 6403, 6405, 6408, 6411, 6413, - 6416, 6419, 6422, 6424, 6426, 6428, 6430, 6432, 6434, 6436, - 6438, 6440, 6442, 6444, 6446, 6449, 6452, 6454, 6457, 6460, - 6462, 6465, 6469, 6471, 6473, 6475, 6477, 6479, 6481, 6483, - - 6485, 6487, 6489, 6491, 6493, 6495, 6497, 6499, 6501, 6503, - 6506, 6509, 6511, 6514, 6517, 6519, 6522, 6525, 6528, 6531, - 6534, 6539, 6541, 6543, 6545, 6547, 6549, 6551, 6553, 6555, - 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6575, - 6577, 6579, 6581, 6584, 6587, 6589, 6592, 6595, 6598, 6601, - 6604, 6607, 6609, 6612, 6615, 6619, 6624, 6626, 6628, 6630, - 6632, 6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, - 6652, 6654, 6656, 6658, 6660, 6662, 6664, 6666, 6668, 6670, - 6672, 6674, 6676, 6679, 6682, 6684, 6687, 6690, 6692, 6695, - 6698, 6701, 6703, 6706, 6709, 6712, 6715, 6718, 6721, 6724, - - 6729, 6731, 6733, 6735, 6737, 6739, 6741, 6743, 6745, 6747, - 6749, 6751, 6753, 6755, 6757, 6759, 6761, 6763, 6765, 6767, - 6769, 6771, 6773, 6775, 6777, 6779, 6781, 6783, 6785, 6787, - 6790, 6793, 6795, 6798, 6801, 6803, 6806, 6809, 6812, 6815, - 6818, 6821, 6824, 6827, 6829, 6832, 6835, 6839, 6844, 6846, - 6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, 6864, 6866, - 6868, 6870, 6872, 6874, 6876, 6878, 6880, 6882, 6884, 6886, - 6888, 6890, 6892, 6894, 6896, 6898, 6900, 6902, 6904, 6906, - 6908, 6910, 6912, 6914, 6917, 6920, 6922, 6925, 6928, 6930, - 6933, 6936, 6939, 6942, 6944, 6947, 6950, 6953, 6955, 6958, - - 6961, 6964, 6967, 6970, 6973, 6976, 6981, 6983, 6985, 6987, - 6989, 6991, 6993, 6995, 6997, 6999, 7001, 7003, 7005, 7007, - 7009, 7011, 7013, 7015, 7017, 7019, 7021, 7023, 7025, 7027, - 7029, 7031, 7033, 7035, 7037, 7039, 7041, 7043, 7045, 7047, - 7049, 7051, 7053, 7055, 7058, 7061, 7063, 7066, 7069, 7072, - 7075, 7078, 7081, 7083, 7086, 7089, 7092, 7095, 7098, 7101, - 7104, 7107, 7110, 7112, 7115, 7118, 7122, 7127, 7129, 7131, - 7133, 7135, 7137, 7139, 7141, 7143, 7145, 7147, 7149, 7151, - 7153, 7155, 7157, 7159, 7161, 7163, 7165, 7167, 7169, 7171, - 7173, 7175, 7177, 7179, 7181, 7183, 7185, 7187, 7189, 7191, - - 7193, 7195, 7197, 7199, 7201, 7203, 7205, 7207, 7209, 7211, - 7213, 7216, 7219, 7221, 7224, 7227, 7229, 7232, 7235, 7238, - 7240, 7243, 7246, 7249, 7252, 7255, 7258, 7260, 7263, 7266, - 7269, 7271, 7274, 7277, 7280, 7283, 7286, 7289, 7292, 7297, - 7299, 7301, 7303, 7305, 7307, 7309, 7311, 7313, 7315, 7317, - 7319, 7321, 7323, 7325, 7327, 7329, 7331, 7333, 7335, 7337, - 7339, 7341, 7343, 7345, 7347, 7349, 7351, 7353, 7355, 7357, - 7359, 7361, 7363, 7365, 7367, 7369, 7371, 7373, 7375, 7377, - 7379, 7381, 7383, 7385, 7387, 7390, 7393, 7395, 7398, 7401, - 7403, 7406, 7409, 7412, 7415, 7418, 7421, 7424, 7427, 7429, - - 7432, 7435, 7438, 7441, 7444, 7447, 7450, 7453, 7456, 7458, - 7461, 7464, 7468, 7473, 7475, 7477, 7479, 7481, 7483, 7485, - 7487, 7489, 7491, 7493, 7495, 7497, 7499, 7501, 7503, 7505, - 7507, 7509, 7511, 7513, 7515, 7517, 7519, 7521, 7523, 7525, - 7527, 7529, 7531, 7533, 7535, 7537, 7539, 7541, 7543, 7545, - 7547, 7549, 7551, 7553, 7555, 7557, 7559, 7561, 7563, 7565, - 7567, 7569, 7571, 7573, 7575, 7577, 7580, 7583, 7585, 7588, - 7591, 7593, 7596, 7599, 7602, 7605, 7607, 7610, 7613, 7616, - 7618, 7621, 7624, 7627, 7630, 7633, 7636, 7638, 7641, 7644, - 7647, 7649, 7652, 7655, 7658, 7661, 7664, 7667, 7670, 7675, - - 7677, 7679, 7681, 7683, 7685, 7687, 7689, 7691, 7693, 7695, - 7697, 7699, 7701, 7703, 7705, 7707, 7709, 7711, 7713, 7715, - 7717, 7719, 7721, 7723, 7725, 7727, 7729, 7731, 7733, 7735, - 7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, 7753, 7755, - 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, - 7777, 7779, 7781, 7784, 7787, 7789, 7792, 7795, 7798, 7801, - 7804, 7807, 7809, 7812, 7815, 7818, 7821, 7824, 7827, 7830, - 7833, 7836, 7838, 7841, 7844, 7847, 7850, 7853, 7856, 7859, - 7862, 7865, 7867, 7870, 7873, 7877, 7882, 7884, 7886, 7888, - 7890, 7892, 7894, 7896, 7898, 7900, 7902, 7904, 7906, 7908, - - 7910, 7912, 7914, 7916, 7918, 7920, 7922, 7924, 7926, 7928, - 7930, 7932, 7934, 7936, 7938, 7940, 7942, 7944, 7946, 7948, - 7950, 7952, 7954, 7956, 7958, 7960, 7962, 7964, 7966, 7968, - 7970, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, - 7990, 7992, 7994, 7996, 7998, 8001, 8004, 8006, 8009, 8012, - 8014, 8017, 8020, 8023, 8025, 8028, 8031, 8034, 8037, 8040, - 8043, 8045, 8048, 8051, 8054, 8056, 8059, 8062, 8065, 8068, - 8071, 8074, 8076, 8079, 8082, 8085, 8087, 8090, 8093, 8096, - 8099, 8102, 8105, 8108, 8113, 8115, 8117, 8119, 8121, 8123, - 8125, 8127, 8129, 8131, 8133, 8135, 8137, 8139, 8141, 8143, - - 8145, 8147, 8149, 8151, 8153, 8155, 8157, 8159, 8161, 8163, - 8165, 8167, 8169, 8171, 8173, 8175, 8177, 8179, 8181, 8183, - 8185, 8187, 8189, 8191, 8193, 8195, 8197, 8199, 8201, 8203, + 0, 0,10775,10776, 67,10776,10776,10771, 61, 0, + 68, 76,10756, 82, 139, 81, 64, 78, 137, 123, + 98, 147, 53, 100, 152, 155, 182, 193, 196, 127, + 191, 202, 214, 192,10728, 219, 249, 248, 221, 300, + 104,10768,10776, 286, 0, 295, 326, 350,10753, 103, + 10758, 122, 357,10740, 277,10721,10719, 244,10719, 258, + 10718, 224, 260, 224, 329, 266, 237, 342, 330, 364, + 368,10708, 365, 366, 363, 370, 367, 377, 376, 390, + 379, 341, 375, 382, 391, 403, 397, 159, 398, 396, + 411, 408, 410, 437, 438, 405, 443, 431, 450, 446, + + 458, 445, 451, 435, 460, 467, 464, 469, 475, 483, + 471, 484, 491, 516, 473, 517, 519, 521, 531, 99, + 524,10776, 518, 582, 548, 562, 581, 594,10745, 215, + 10744, 107, 600, 274, 639, 604, 566, 568,10712,10700, + 10705, 601,10706, 603, 612,10712, 621, 571, 629, 606, + 565, 623, 628, 625, 630, 287, 647, 646, 649, 658, + 660, 661, 685, 664, 665, 675, 673, 686, 678, 691, + 688, 692, 699, 701, 702, 696, 723, 707, 703, 717, + 733, 474,10776, 720, 757, 727, 728, 756, 759, 721, + 760, 731, 766, 763, 767, 783, 781, 773, 788, 777, + + 780, 786, 787, 792, 789, 790, 797, 798, 791, 801, + 809, 795, 810, 836, 867, 893, 901,10738, 303,10737, + 10736,10735, 872, 878, 308,10740, 907, 880, 882, 903, + 10692, 914, 881, 917, 919, 921, 923,10687, 924, 925, + 927, 926, 929, 940, 930,10708, 942,10776, 946, 948, + 943, 944, 947, 989, 956, 961, 960, 962, 969, 964, + 1005, 985, 1003, 992, 1006, 963, 996, 966,10776, 1018, + 1021, 1023, 1024, 1025, 1028, 1029, 81, 1030, 1032, 1033, + 1035, 1042, 1034, 1049, 1039, 1044, 1053, 1055, 99, 1061, + 1059, 1066, 1071, 1060, 1062, 1067, 1073, 1103, 1087, 1096, + + 1098, 1108, 1118, 1165, 1175, 1182, 1190,10730, 472,10729, + 10728,10727,10726,10725, 313,10730, 554, 1196, 1116, 1115, + 10776, 1165, 1133, 1203, 1204, 1211, 1205, 1206, 1207, 1210, + 1212, 1222, 1217, 1215, 1233, 1220,10722, 1218, 1235, 1219, + 1221, 1239, 1240, 823, 1101, 1245, 1247, 1241,10721, 1237, + 1260, 1265, 1280, 1283, 1253, 1294, 1278, 1285, 1287, 1289, + 1101, 1306, 1293, 1310, 1295, 1312, 1305, 1313, 1314, 1319, + 10716,10715, 1309, 1318, 1322, 1320, 1321, 1353, 1325, 1335, + 10696, 1327, 1348, 1372, 1384, 1397, 1410,10718, 539,10717, + 10716,10715,10714,10713,10712,10711,10710, 1132,10715, 1140, + + 1143,10714, 1429, 1387, 1362, 1398, 1385, 1388,10684, 1402, + 1400, 1419, 1420, 1411, 1412, 1416, 1421, 1445, 1444, 1422, + 1447,10697, 1446, 1448, 1450, 1468, 1475,10674,10674,10664, + 10671,10671,10661, 1484, 1476, 1469,10696, 1477, 1482, 1478, + 1479, 1480, 1483, 1481, 1505, 1500, 1488, 1494, 1518, 1470, + 1513, 1517, 1507, 1540, 1523, 1543, 1544, 1546, 1548,10695, + 10683, 1552, 1549, 1553, 1566, 1554, 1557,10695, 1563, 1582, + 1584, 1625, 1632, 1641,10695, 1130,10694,10693,10692,10691, + 10690,10689,10688,10687,10686,10685,10684, 1148,10689, 1157, + 1491,10688, 1492, 1576, 1647, 1615, 1560, 1584,10680, 1616, + + 1656, 1657, 1658, 1609, 1659, 1661, 1663, 1664, 1665, 1669, + 1662,10660, 1670, 1682, 1673,10636,10648,10633,10633,10645, + 10630, 1680, 1684, 1689, 1686,10662, 1685, 1688, 1690, 1697, + 1698, 1687, 1694,10776, 1742, 1699, 1729, 1727, 1703, 1723, + 1751, 1752, 1753, 1755, 1756, 1761, 1763, 1764,10650,10651, + 1765, 1766, 1768, 1759, 1771,10661, 1769, 1787, 1828, 1835, + 1844,10669, 1359,10668,10667,10666,10665,10664,10663,10662, + 10661,10660,10659,10658,10657,10656,10655,10654,10653, 1598, + 10658, 1607, 1612,10657, 1711, 1773, 1776, 1787,10656, 1850, + 129,10640, 853, 62,10648, 297, 1777, 177, 1836, 806, + + 404, 130, 1021, 1794,10776, 1857,10647,10602,10603,10613, + 10599,10600,10610, 1858, 536, 1859, 537,10776,10640,10639, + 1860, 1782, 1864, 1862, 1863, 148, 1861, 1871, 1852,10638, + 10637,10636, 1865, 1867, 1869, 1303, 1868, 1046, 1886,10776, + 10776, 1571, 1870, 1887,10635, 269,10614, 1889, 1877, 1928, + 1935, 1943,10633, 1895,10632,10631,10630,10629,10628,10627, + 10626,10625,10624,10623,10622,10621,10620,10619,10618,10617, + 10616,10615,10614,10613,10612, 1791,10617, 1795, 1900, 1915, + 1918, 1950, 1951,10616, 1952, 1953, 1954, 1960, 1897,10589, + 1929, 1937, 1949, 1967, 1572, 1970, 1971, 613, 1972, 1973, + + 1976,10608,10572,10575,10563,10569,10572,10560, 1974, 1975, + 10601, 815, 1978, 1977, 1979,10600, 1981, 1993, 1994, 1982, + 1975, 1983, 160, 1762, 1984,10599, 1996, 1985,10598, 549, + 1997, 836,10776,10597, 2039, 2047,10596, 2005,10595,10594, + 10593,10592,10591,10590,10589,10588,10587,10586,10585,10584, + 10583,10582,10581,10580,10579,10578,10577,10576,10575,10574, + 10573,10572,10571,10570, 2012,10575, 2054, 2055,10574, 2056, + 2057, 2058,10573, 2059, 2066, 2067, 2068, 2069, 2070,10570, + 2076, 1986,10776, 2020, 1330, 2001, 2083, 2084, 2085, 2086, + 949, 823, 2087, 2088,10521,10513,10520,10509,10501,10508, + + 2089, 1999, 2090, 2092, 1355, 1892, 2093, 2091, 2094,10536, + 10776, 2095, 2096, 2097, 2098, 2101, 2111, 2099, 2112, 2109, + 2157, 2165,10532, 2011,10528,10524,10520,10516,10512,10508, + 10504,10500,10496,10492,10488,10484,10480,10476,10472,10468, + 10464,10460,10453,10439,10417,10385,10341,10287,10283,10200, + 10196,10100,10096, 9980, 2119, 9982, 2120, 2145, 9852, 2172, + 2173, 2174, 2175, 2176, 2177, 2184, 2185, 9848, 2186, 2187, + 2188, 2189, 2195, 2159, 2102, 2100, 2202, 2203, 2204, 2206, + 2207, 9690, 2118, 2205, 2210, 9659, 9478, 9490, 9303, 9283, + 9096, 2208, 2211, 9119, 2212, 1213, 2214, 2220, 2213, 2216, + + 2215, 2221, 8894, 2217, 2218, 2219, 2230, 2228, 2110, 2276, + 2284, 8890, 2239, 8664, 8660, 8422, 8418, 8191, 8187, 7960, + 7956, 7753, 7749, 7551, 7547, 7375, 7371, 7205, 7201, 7059, + 7055, 6922, 6918, 6807, 6803, 6702, 6698, 6617, 6613, 6547, + 6500, 6465, 6441, 6424, 6413, 6405, 6400, 6395, 2241, 6393, + 2242, 2291, 6377, 2292, 2293, 2294, 2295, 6376, 2296, 2303, + 2304, 6375, 2305, 2306, 2307, 2308, 2315, 2316, 2317, 6374, + 2323, 2233, 6367, 2314, 2234, 540, 2267, 2330, 2331, 2332, + 2333, 2313, 6322,10776, 6331, 6309,10776, 6316, 2334, 2335, + 2336, 2337, 2341, 2338, 2339, 2340, 6333, 2231, 2342, 2344, + + 2346, 2343, 2347, 2357, 2394, 2402, 6332, 2365, 6331, 6330, + 6323, 6315, 6307, 6295, 6294, 6293, 6292, 6285, 6277, 6269, + 6257, 6256, 6255, 6254, 6247, 6239, 6219, 6218, 6217, 6216, + 6209, 6201, 6193, 6181, 6180, 6179, 6178, 6171, 6163, 6155, + 6143, 6142, 6141, 6140, 6133, 6125, 6117, 2367, 6111, 2409, + 2410, 2411, 2412, 2413, 2414, 6110, 2421, 2422, 2423, 2424, + 2425, 2426, 2433, 2434, 2435, 2436, 6109, 2437, 2438, 2445, + 2446, 2452, 6102, 2348, 6095, 2345, 2441, 2442, 2443, 2444, + 2459, 2460, 6052, 6036, 6031, 6034, 2359, 2461, 2360, 2462, + 2463, 2468, 318, 2464, 2465, 2471, 2349, 2466, 2473, 2474, + + 2472, 2493, 2522, 6064, 2501, 6057, 6049, 6041, 6029, 6028, + 6027, 6026, 6019, 6011, 6003, 5991, 5990, 5989, 5988, 5981, + 5973, 5965, 5953, 5952, 5951, 5950, 5943, 5935, 5915, 5914, + 5913, 5912, 5905, 5897, 5889, 5877, 5876, 5875, 5874, 5867, + 5859, 5851, 5839, 5838, 5837, 5836, 5829, 5821, 5813, 2529, + 5807, 2530, 2531, 5806, 2532, 2533, 2534, 5805, 2541, 2542, + 2543, 2544, 2545, 2546, 5804, 2553, 2554, 2555, 5797, 2556, + 2557, 2558, 2565, 2566, 2567, 2568, 5789, 2574, 2563, 2564, + 5763, 2475, 2476, 2581, 1025, 2582, 5722,10776, 5721,10776, + 5760, 2583, 2584, 708, 1236, 2585, 2586, 2591, 2587, 2588, + + 2589, 2590, 2592, 2593, 2595, 2649, 2657, 5753, 2502, 5745, + 5737, 5725, 5724, 5723, 5722, 5715, 5707, 5699, 5687, 5686, + 5685, 5684, 5677, 5669, 5661, 5649, 5648, 5647, 5646, 5639, + 5631, 5611, 5610, 5609, 5608, 5601, 5593, 5585, 5573, 5572, + 5571, 5570, 5563, 5555, 5547, 5535, 5534, 5533, 5532, 5525, + 5517, 5509, 5497, 5496, 5495, 5494, 5487, 2600, 5485, 2616, + 2618, 5465, 2628, 2632, 2637, 2641, 2664, 2665, 2666, 2667, + 5464, 2668, 2669, 2676, 2677, 2678, 2679, 2680, 2681, 2688, + 2689, 2690, 5463, 2691, 2692, 2693, 2700, 2706, 2695, 2597, + 476, 2135, 2599, 2696, 5456, 5410, 5402, 2596, 2697, 2698, + + 2699, 2713, 2614, 2714, 5433, 2715, 2717, 5421, 5420, 2718, + 2716, 2726, 2769, 5419, 2727, 5418, 5411, 5403, 5395, 5383, + 5382, 5381, 5380, 5373, 5365, 5357, 5345, 5344, 5343, 5342, + 5335, 5327, 5312, 5311, 5310, 5309, 5308, 5300, 5299, 5298, + 5297, 5290, 5282, 5274, 5266, 5265, 5264, 5263, 5254, 5253, + 5252, 5251, 5244, 5236, 5228, 5218, 5217, 5196, 5195, 5194, + 54, 70, 185, 333, 413, 550, 631, 718, 2746, 725, + 2756, 2757, 739, 2759, 2760, 2776, 2777, 740, 2778, 2779, + 2780, 891, 2781, 2788, 2789, 2790, 2791, 2792, 2793, 957, + 2800, 2801, 2802, 958, 2803, 2804, 2805, 2812, 2813, 2814, + + 2815, 1047, 2821, 2810, 2478, 2811, 2828, 1125, 2598, 1113, + 1124, 1389, 2730, 2829, 2830, 2832, 2831, 2833, 1414, 1493, + 1786, 2834, 2875, 2884, 1588, 2739, 1596, 1671, 1701, 1893, + 1902, 1913, 2008, 2022, 2122, 2126, 2147, 2148, 2245, 2254, + 2255, 2256, 2265, 2266, 2268, 2383, 2497, 2500, 2510, 2514, + 2613, 2615, 2624, 2729, 2741, 2742, 2752, 2835, 2836, 2837, + 2839, 2840, 2841, 2842, 2843, 2845, 2846, 2847, 2854, 2856, + 2857, 2858, 2859, 2860, 2864, 2865, 2869, 2878, 2885, 2886, + 2887, 2888, 2889, 2896, 2897, 2898, 2899, 2900, 2901, 2903, + 2908, 2910, 2911, 2912, 2913, 2915, 2916, 2920, 2923, 2924, + + 2925, 2927, 2928, 2932, 2934, 2935, 2936, 2937, 2939, 2944, + 2946, 2947, 2948, 2949, 2951, 2956, 2957, 2958, 2959, 2965, + 2954, 2955, 2972, 2973, 2974, 2974, 2975, 2977, 2978, 2979, + 2985, 2980, 2981, 2986, 2982, 3019, 3027, 2983, 2991, 2987, + 2989, 2990, 2999, 3000, 3003, 3004, 3005, 3006, 3008, 3021, + 3028, 3029, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, + 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, + 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, + 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, + 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3084, + + 3085, 3086, 3087, 3088, 3089, 3091, 3094, 3096, 3098, 3099, + 3101, 3102, 3103, 3106, 3110, 3111, 3113, 3114, 3115, 3116, + 3118, 3121, 3123, 3125, 3126, 3128, 3130, 3133, 3135, 3136, + 3137, 3138, 3140, 3143, 3145, 3147, 3148, 3150, 3152, 3156, + 3149, 3163, 3164, 3165, 3136, 3137, 3168, 3169, 3174, 3175, + 3171, 3170, 3196, 3224, 3179, 3211, 3173, 3176, 3177, 3178, + 3181, 3182, 3212, 3190, 3202, 3206, 3207, 3208, 3213, 3214, + 3215, 3216, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, + 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, 3241, 3242, + 3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3252, + + 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, + 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3277, 3278, + 3279, 3280, 3281, 3282, 3284, 3287, 3289, 3291, 3292, 3294, + 3296, 3299, 3301, 3303, 3304, 3305, 3306, 3308, 3313, 3315, + 3316, 3317, 3318, 3320, 3325, 3326, 3327, 3328, 3329, 3330, + 3337, 3338, 3339, 3340, 3341, 3342, 3348, 3349, 3350, 3351, + 3357, 3347, 3346, 3364, 3365, 3336, 3337, 3368, 3369, 3370, + 3371, 3372, 3373, 3407, 3424, 3381, 3375, 3376, 3378, 3379, + 3382, 3383, 3391, 3392, 3393, 3394, 3396, 3397, 3398, 3399, + 3409, 3412, 3413, 3414, 3415, 3416, 3425, 3426, 3427, 3428, + + 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, + 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, + 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, + 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, 3474, + 3475, 3476, 3477, 3478, 3479, 3481, 3486, 3488, 3489, 3490, + 3491, 3492, 3493, 3497, 3500, 3501, 3502, 3504, 3505, 3509, + 3511, 3512, 3513, 3514, 3516, 3519, 3521, 3523, 3524, 3526, + 3528, 3531, 3533, 3534, 3535, 3536, 3538, 3541, 3543, 3545, + 3546, 3548, 3550, 3554, 3547, 3561, 3562, 3521, 3522, 3565, + 3566, 3567, 3568, 3569, 3570, 3580, 3594, 3571, 3572, 3588, + + 3595, 3596, 3597, 3598, 3600, 3601, 3602, 3603, 3604, 3605, + 3606, 3607, 3608, 3609, 3610, 3611, 3613, 3614, 3615, 3616, + 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, + 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, + 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, 3645, 3646, + 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3661, 3662, + 3663, 3664, 3665, 3666, 3671, 3673, 3674, 3675, 3676, 3678, + 3683, 3685, 3686, 3687, 3688, 3690, 3693, 3695, 3697, 3698, + 3700, 3702, 3705, 3707, 3709, 3710, 3712, 3714, 3716, 3717, + 3719, 3721, 3724, 3726, 3728, 3729, 3731, 3733, 3736, 3738, + + 3739, 3740, 3746, 3704, 3706, 3753, 3754, 3756, 3762, 3770, + 3764, 3771, 3772, 3779, 3780, 3781, 3782, 3783, 3784, 3785, + 3786, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 3797, + 3798, 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, + 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, + 3818, 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, + 3828, 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3842, 3843, + 3844, 3845, 3846, 3847, 3854, 3855, 3856, 3857, 3858, 3859, + 3860, 3864, 3867, 3868, 3869, 3871, 3872, 3876, 3878, 3879, + 3880, 3881, 3883, 3886, 3888, 3890, 3891, 3893, 3895, 3898, + + 3900, 3901, 3902, 3903, 3905, 3908, 3910, 3912, 3913, 3915, + 3917, 3921, 3871, 3885, 3929, 3930, 3938, 3946, 3932, 3940, + 3947, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, + 3963, 3964, 3965, 3966, 3967, 3968, 3970, 3971, 3972, 3973, + 3974, 3975, 3976, 3978, 3979, 3980, 3981, 3982, 3983, 3984, + 3985, 3986, 3987, 3988, 3989, 3990, 3991, 3992, 3993, 3994, + 3995, 3996, 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, + 4005, 4006, 4013, 4014, 4015, 4016, 4017, 4018, 4025, 4026, + 4027, 4028, 4029, 4030, 4035, 4037, 4038, 4039, 4040, 4042, + 4047, 4049, 4050, 4051, 4052, 4054, 4058, 4059, 4061, 4062, + + 4063, 4066, 4070, 4071, 4073, 4074, 4075, 4078, 4081, 4082, + 4083, 4089, 4036, 4037, 4096, 4097, 4105, 4113, 4099, 4107, + 4114, 4115, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, + 4130, 4131, 4132, 4133, 4134, 4135, 4137, 4145, 4139, 4140, + 4142, 4144, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, + 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, + 4164, 4165, 4166, 4167, 4168, 4169, 4176, 4177, 4178, 4179, + 4180, 4181, 4185, 4188, 4189, 4190, 4192, 4193, 4197, 4200, + 4201, 4202, 4203, 4204, 4205, 4209, 4212, 4213, 4214, 4216, + 4217, 4221, 4223, 4224, 4225, 4226, 4228, 4231, 4233, 4235, + + 4236, 4238, 4240, 4244,10776,10776, 4237, 4251, 4252, 4260, + 4268, 4254, 4262, 4269, 4270, 4277, 4278, 4279, 4280, 4282, + 4283, 4284, 4285, 4287, 4288, 4289, 4290, 4291, 4292, 4293, + 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4301, 4302, 4303, + 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, + 4314, 4315, 4316, 4323, 4324, 4325, 4326, 4327, 4328, 4334, + 4335, 4336, 4337, 4338, 4339, 4346, 4347, 4348, 4349, 4350, + 4351, 4357, 4358, 4359, 4360, 4361, 4362, 4369, 4370, 4371, + 4372, 4373, 4374, 4380, 4381, 4382, 4383, 4389, 4378, 4379, + 4403, 4411, 4397, 4405, 4413, 4414, 4415, 4422, 4423, 4424, + + 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, + 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4444, + 4445, 4446, 4447, 4448, 4449, 4450, 4451, 4452, 4453, 4460, + 4461, 4462, 4463, 4464, 4465, 4472, 4473, 4474, 4475, 4476, + 4477, 4478, 4482, 4485, 4486, 4487, 4489, 4490, 4494, 4496, + 4497, 4498, 4499, 4501, 4504, 4506, 4508, 4509, 4511, 4513, + 4517, 4510, 4531, 4539, 4525, 4533, 4540, 4541, 4542, 4543, + 4550, 4551, 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, + 4560, 4561, 4562, 4563, 4564, 4565, 4566, 4567, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 4575, 4582, 4583, 4584, 4585, + + 4586, 4587, 4594, 4595, 4596, 4597, 4598, 4599, 4604, 4606, + 4607, 4608, 4609, 4611, 4616, 4618, 4619, 4620, 4621, 4623, + 4627, 4628, 4630, 4636, 4650, 4658, 4625, 4626, 4629, 4644, + 4652, 4659, 4660, 4661, 4662, 4669, 4670, 4671, 4672, 4673, + 4674, 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, 4683, + 4684, 4685, 4692, 4693, 4694, 4695, 4696, 4697, 4701, 4704, + 4705, 4706, 4708, 4709, 4713, 4716, 4717, 4718, 4719, 4720, + 4721, 4725, 4728, 4729, 4730, 4732, 4733, 4738, 4752, 4760, + 4731, 4746, 4754, 4761, 4762, 4763, 4764, 4771, 4772, 4773, + 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4783, + + 4784, 4791, 4792, 4793, 4794, 4795, 4796, 4802, 4803, 4804, + 4805, 4806, 4807, 4814, 4815, 4816, 4817, 4818, 4819, 4825, + 4826, 4827, 4828, 4834, 4848, 4856, 4823, 4824, 4842, 4850, + 4857, 4858, 4859, 4860, 4867, 4868, 4869, 4870, 4871, 4872, + 4873, 4874, 4875, 4882, 4883, 4884, 4885, 4886, 4887, 4894, + 4895, 4896, 4897, 4898, 4899, 4900, 4904, 4907, 4908, 4909, + 4911, 4912, 4917, 4931, 4939, 4910, 4925, 4933, 4940, 4941, + 4942, 4943, 4950, 4951, 4952, 4953, 4954, 4955, 4962, 4963, + 4964, 4965, 4966, 4967, 4974, 4975, 4976, 4977, 4978, 4979, + 4984, 4986, 4987, 4993, 5007, 5015, 4982, 4983, 4985, 5001, + + 5009, 5016, 5017, 5018, 5019, 5026, 5033, 5034, 5035, 5036, + 5037, 5038, 5042, 5045, 5046, 5047, 5049, 5050, 5054, 5056, + 5070, 5078, 5056, 5064, 5072, 5079, 5080, 5081, 5088, 5095, + 5096, 5097, 5098, 5099, 5100, 5106, 5107, 5108, 5109, 5115, + 5129, 5137, 5104, 5105, 5123, 5131, 5138, 5153, 5145, 5159, + 5160, 5161, 5162, 5163, 5164, 5146, 5170, 5184, 5192, 5141, + 5170, 5208, 5213, 5184, 5219, 5220, 5221, 5222, 5228, 5242, + 5250, 5186, 5199, 5267, 5268, 5274, 5288, 5296, 5313, 5319, + 5333, 5341, 5357, 5371, 5379, 5395, 5409, 5417, 5433, 5447, + 5455, 5471, 5485, 5493, 5509, 5523, 5531, 5547, 5561, 5569, + + 5585, 5599, 5607, 5623, 5637, 5645, 5661, 5675, 5683, 5699, + 5713, 5721, 5737, 5751, 5759, 5775, 5789, 5797, 5813, 5827, + 5835, 5851, 5865, 5873, 5889, 5903, 5911, 5927, 5941, 5949, + 5965, 5979, 5987, 6003, 6017, 6025, 6041, 6055, 6063, 6079, + 6093, 6101, 6117, 6131, 6139, 6155, 6169, 6177, 6193, 6207, + 6215, 6231, 6245, 6253, 6269, 6283, 6291, 6307, 6321, 6329, + 6345, 6359, 6366,10776, 6394, 6402, 6407, 6412, 6417, 6419, + 6422, 6425, 6427, 6429, 6432, 6436, 6438, 6440, 6442, 6444, + 6447, 6450, 6453, 6455, 6457, 6459, 6461, 6463, 6465, 6468, + 6471, 6473, 6477, 6479, 6481, 6483, 6485, 6487, 6489, 6491, + + 6493, 6495, 6498, 6501, 6503, 6506, 6509, 6512, 6514, 6516, + 6518, 6520, 6522, 6524, 6526, 6528, 6530, 6532, 6534, 6536, + 6539, 6542, 6544, 6547, 6550, 6552, 6555, 6559, 6561, 6563, + 6565, 6567, 6569, 6571, 6573, 6575, 6577, 6579, 6581, 6583, + 6585, 6587, 6589, 6591, 6593, 6596, 6599, 6601, 6604, 6607, + 6609, 6612, 6615, 6618, 6621, 6625, 6629, 6631, 6633, 6635, + 6637, 6639, 6641, 6643, 6645, 6647, 6649, 6651, 6653, 6655, + 6657, 6659, 6661, 6663, 6665, 6667, 6669, 6671, 6674, 6677, + 6679, 6682, 6685, 6688, 6691, 6694, 6697, 6699, 6702, 6705, + 6710, 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, + + 6732, 6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, + 6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, 6769, 6772, + 6774, 6777, 6780, 6782, 6785, 6788, 6791, 6793, 6796, 6799, + 6802, 6805, 6808, 6811, 6815, 6819, 6821, 6823, 6825, 6827, + 6829, 6831, 6833, 6835, 6837, 6839, 6841, 6843, 6845, 6847, + 6849, 6851, 6853, 6855, 6857, 6859, 6861, 6863, 6865, 6867, + 6869, 6871, 6873, 6875, 6877, 6880, 6883, 6885, 6888, 6891, + 6893, 6896, 6899, 6902, 6905, 6908, 6911, 6914, 6917, 6919, + 6922, 6925, 6930, 6934, 6936, 6938, 6940, 6942, 6944, 6946, + 6948, 6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, + + 6968, 6970, 6972, 6974, 6976, 6978, 6980, 6982, 6984, 6986, + 6988, 6990, 6992, 6994, 6996, 6998, 7000, 7002, 7004, 7007, + 7010, 7012, 7015, 7018, 7020, 7023, 7026, 7029, 7032, 7034, + 7037, 7040, 7043, 7045, 7048, 7051, 7054, 7057, 7060, 7063, + 7067, 7071, 7073, 7075, 7077, 7079, 7081, 7083, 7085, 7087, + 7089, 7091, 7093, 7095, 7097, 7099, 7101, 7103, 7105, 7107, + 7109, 7111, 7113, 7115, 7117, 7119, 7121, 7123, 7125, 7127, + 7129, 7131, 7133, 7135, 7137, 7139, 7141, 7143, 7145, 7148, + 7151, 7153, 7156, 7159, 7162, 7165, 7168, 7171, 7173, 7176, + 7179, 7182, 7185, 7188, 7191, 7194, 7197, 7200, 7202, 7205, + + 7208, 7213, 7217, 7219, 7221, 7223, 7225, 7227, 7229, 7231, + 7233, 7235, 7237, 7239, 7241, 7243, 7245, 7247, 7249, 7251, + 7253, 7255, 7257, 7259, 7261, 7263, 7265, 7267, 7269, 7271, + 7273, 7275, 7277, 7279, 7281, 7283, 7285, 7287, 7289, 7291, + 7293, 7295, 7297, 7299, 7301, 7303, 7306, 7309, 7311, 7314, + 7317, 7319, 7322, 7325, 7328, 7330, 7333, 7336, 7339, 7342, + 7345, 7348, 7350, 7353, 7356, 7359, 7361, 7364, 7367, 7370, + 7373, 7376, 7379, 7383, 7387, 7389, 7391, 7393, 7395, 7397, + 7399, 7401, 7403, 7405, 7407, 7409, 7411, 7413, 7415, 7417, + 7419, 7421, 7423, 7425, 7427, 7429, 7431, 7433, 7435, 7437, + + 7439, 7441, 7443, 7445, 7447, 7449, 7451, 7453, 7455, 7457, + 7459, 7461, 7463, 7465, 7467, 7469, 7471, 7473, 7475, 7477, + 7480, 7483, 7485, 7488, 7491, 7493, 7496, 7499, 7502, 7505, + 7508, 7511, 7514, 7517, 7519, 7522, 7525, 7528, 7531, 7534, + 7537, 7540, 7543, 7546, 7548, 7551, 7554, 7559, 7563, 7565, + 7567, 7569, 7571, 7573, 7575, 7577, 7579, 7581, 7583, 7585, + 7587, 7589, 7591, 7593, 7595, 7597, 7599, 7601, 7603, 7605, + 7607, 7609, 7611, 7613, 7615, 7617, 7619, 7621, 7623, 7625, + 7627, 7629, 7631, 7633, 7635, 7637, 7639, 7641, 7643, 7645, + 7647, 7649, 7651, 7653, 7655, 7657, 7659, 7661, 7663, 7665, + + 7667, 7670, 7673, 7675, 7678, 7681, 7683, 7686, 7689, 7692, + 7695, 7697, 7700, 7703, 7706, 7708, 7711, 7714, 7717, 7720, + 7723, 7726, 7728, 7731, 7734, 7737, 7739, 7742, 7745, 7748, + 7751, 7754, 7757, 7761, 7765, 7767, 7769, 7771, 7773, 7775, + 7777, 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, + 7797, 7799, 7801, 7803, 7805, 7807, 7809, 7811, 7813, 7815, + 7817, 7819, 7821, 7823, 7825, 7827, 7829, 7831, 7833, 7835, + 7837, 7839, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, + 7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, 7874, 7877, + 7879, 7882, 7885, 7888, 7891, 7894, 7897, 7899, 7902, 7905, + + 7908, 7911, 7914, 7917, 7920, 7923, 7926, 7928, 7931, 7934, + 7937, 7940, 7943, 7946, 7949, 7952, 7955, 7957, 7960, 7963, + 7968, 7972, 7974, 7976, 7978, 7980, 7982, 7984, 7986, 7988, + 7990, 7992, 7994, 7996, 7998, 8000, 8002, 8004, 8006, 8008, + 8010, 8012, 8014, 8016, 8018, 8020, 8022, 8024, 8026, 8028, + 8030, 8032, 8034, 8036, 8038, 8040, 8042, 8044, 8046, 8048, + 8050, 8052, 8054, 8056, 8058, 8060, 8062, 8064, 8066, 8068, + 8070, 8072, 8074, 8076, 8078, 8080, 8082, 8084, 8086, 8088, + 8091, 8094, 8096, 8099, 8102, 8104, 8107, 8110, 8113, 8115, + 8118, 8121, 8124, 8127, 8130, 8133, 8135, 8138, 8141, 8144, + + 8146, 8149, 8152, 8155, 8158, 8161, 8164, 8166, 8169, 8172, + 8175, 8177, 8180, 8183, 8186, 8189, 8192, 8195, 8199, 8203, 8205, 8207, 8209, 8211, 8213, 8215, 8217, 8219, 8221, 8223, - 8225, 8227, 8229, 8232, 8235, 8237, 8240, 8243, 8245, 8248, - 8251, 8254, 8257, 8260, 8263, 8266, 8269, 8271, 8274, 8277, - 8280, 8283, 8286, 8289, 8292, 8295, 8298, 8300, 8303, 8306, - 8309, 8312, 8315, 8318, 8321, 8324, 8327, 8329, 8332, 8335, - 8339, 8344, 8346, 8348, 8350, 8352, 8354, 8356, 8358, 8360, - 8362, 8364, 8366, 8368, 8370, 8372, 8374, 8376, 8378, 8380, - - 8382, 8384, 8386, 8388, 8390, 8392, 8394, 8396, 8398, 8400, - 8402, 8404, 8406, 8408, 8410, 8412, 8414, 8416, 8418, 8420, - 8422, 8424, 8426, 8428, 8430, 8432, 8434, 8436, 8438, 8440, + 8225, 8227, 8229, 8231, 8233, 8235, 8237, 8239, 8241, 8243, + 8245, 8247, 8249, 8251, 8253, 8255, 8257, 8259, 8261, 8263, + 8265, 8267, 8269, 8271, 8273, 8275, 8277, 8279, 8281, 8283, + 8285, 8287, 8289, 8291, 8293, 8295, 8297, 8299, 8301, 8303, + 8305, 8307, 8309, 8311, 8313, 8315, 8317, 8319, 8322, 8325, + 8327, 8330, 8333, 8335, 8338, 8341, 8344, 8347, 8350, 8353, + 8356, 8359, 8361, 8364, 8367, 8370, 8373, 8376, 8379, 8382, + + 8385, 8388, 8390, 8393, 8396, 8399, 8402, 8405, 8408, 8411, + 8414, 8417, 8419, 8422, 8425, 8430, 8434, 8436, 8438, 8440, 8442, 8444, 8446, 8448, 8450, 8452, 8454, 8456, 8458, 8460, - 8462, 8465, 8468, 8470, 8473, 8476, 8479, 8482, 8485, 8487, - 8490, 8493, 8496, 8498, 8501, 8504, 8507, 8510, 8513, 8516, - 8518, 8521, 8524, 8527, 8529, 8532, 8535, 8538, 8541, 8544, - 8547, 8549, 8552, 8555, 8558, 8560, 8563, 8566, 8569, 8572, - 8575, 8578, 8581, 8586, 8588, 8590, 8592, 8594, 8596, 8598, - 8600, 8602, 8604, 8606, 8608, 8610, 8612, 8614, 8616, 8618, - - 8620, 8622, 8624, 8626, 8628, 8630, 8632, 8634, 8636, 8638, - 8640, 8642, 8644, 8646, 8648, 8650, 8652, 8654, 8656, 8658, - 8660, 8662, 8664, 8666, 8668, 8670, 8672, 8674, 8676, 8678, + 8462, 8464, 8466, 8468, 8470, 8472, 8474, 8476, 8478, 8480, + 8482, 8484, 8486, 8488, 8490, 8492, 8494, 8496, 8498, 8500, + 8502, 8504, 8506, 8508, 8510, 8512, 8514, 8516, 8518, 8520, + 8522, 8524, 8526, 8528, 8530, 8532, 8534, 8536, 8538, 8540, + 8542, 8544, 8546, 8548, 8550, 8552, 8555, 8558, 8560, 8563, + 8566, 8569, 8572, 8575, 8577, 8580, 8583, 8586, 8588, 8591, + 8594, 8597, 8600, 8603, 8606, 8608, 8611, 8614, 8617, 8619, + + 8622, 8625, 8628, 8631, 8634, 8637, 8639, 8642, 8645, 8648, + 8650, 8653, 8656, 8659, 8662, 8665, 8668, 8672, 8676, 8678, 8680, 8682, 8684, 8686, 8688, 8690, 8692, 8694, 8696, 8698, - 8700, 8703, 8706, 8709, 8712, 8714, 8717, 8720, 8723, 8726, - 8729, 8732, 8735, 8738, 8741, 8743, 8746, 8749, 8752, 8755, - 8758, 8761, 8764, 8767, 8770, 8772, 8775, 8778, 8781, 8784, - 8787, 8790, 8793, 8796, 8799, 8801, 8804, 8807, 8811, 8816, - 8818, 8820, 8822, 8824, 8826, 8828, 8830, 8832, 8834, 8836, - 8838, 8840, 8842, 8844, 8846, 8848, 8850, 8852, 8854, 8856, - - 8858, 8860, 8862, 8864, 8866, 8868, 8870, 8872, 8874, 8876, - 8878, 8880, 8882, 8884, 8886, 8888, 8890, 8892, 8894, 8896, - 8898, 8900, 8902, 8904, 8906, 8908, 8910, 8912, 8914, 8916, - 8918, 8920, 8922, 8924, 8926, 8928, 8931, 8934, 8937, 8940, - 8943, 8946, 8949, 8951, 8954, 8957, 8960, 8963, 8966, 8969, - 8972, 8975, 8977, 8980, 8983, 8986, 8988, 8991, 8994, 8997, - 9000, 9003, 9006, 9008, 9011, 9014, 9017, 9019, 9022, 9025, - 9028, 9031, 9034, 9037, 9040, 9045, 9047, 9049, 9051, 9053, - 9055, 9057, 9059, 9061, 9063, 9065, 9067, 9069, 9071, 9073, - 9075, 9077, 9079, 9081, 9083, 9085, 9087, 9089, 9091, 9093, - - 9095, 9097, 9099, 9101, 9103, 9105, 9107, 9109, 9111, 9113, - 9115, 9117, 9119, 9121, 9123, 9125, 9127, 9129, 9131, 9133, - 9135, 9137, 9139, 9141, 9143, 9145, 9147, 9150, 9153, 9156, - 9159, 9162, 9165, 9168, 9171, 9174, 9177, 9179, 9182, 9185, - 9188, 9191, 9194, 9197, 9200, 9203, 9206, 9208, 9211, 9214, - 9217, 9220, 9223, 9226, 9229, 9232, 9235, 9237, 9240, 9243, - 9247, 9252, 9254, 9256, 9258, 9260, 9262, 9264, 9266, 9268, - 9270, 9272, 9274, 9276, 9278, 9280, 9282, 9284, 9286, 9288, - 9290, 9292, 9294, 9296, 9298, 9300, 9302, 9304, 9306, 9308, - 9310, 9312, 9314, 9316, 9318, 9320, 9322, 9324, 9326, 9328, - - 9330, 9332, 9334, 9336, 9338, 9341, 9344, 9347, 9350, 9352, - 9355, 9358, 9361, 9364, 9367, 9370, 9373, 9375, 9378, 9381, - 9384, 9386, 9389, 9392, 9395, 9398, 9401, 9404, 9406, 9409, - 9412, 9415, 9417, 9420, 9423, 9426, 9429, 9432, 9435, 9438, - 9443, 9445, 9447, 9449, 9451, 9453, 9455, 9457, 9459, 9461, - 9463, 9465, 9467, 9469, 9471, 9473, 9475, 9477, 9479, 9481, - 9483, 9485, 9487, 9489, 9491, 9493, 9495, 9497, 9499, 9501, - 9503, 9505, 9507, 9509, 9511, 9513, 9515, 9517, 9519, 9522, - 9525, 9528, 9531, 9534, 9537, 9539, 9542, 9545, 9548, 9551, - 9554, 9557, 9560, 9563, 9566, 9568, 9571, 9574, 9577, 9580, - - 9583, 9586, 9589, 9592, 9595, 9597, 9600, 9603, 9607, 9612, - 9614, 9616, 9618, 9620, 9622, 9624, 9626, 9628, 9630, 9632, - 9634, 9636, 9638, 9640, 9642, 9644, 9646, 9648, 9650, 9652, - 9654, 9656, 9658, 9660, 9662, 9664, 9666, 9668, 9670, 9672, - 9674, 9676, 9678, 9680, 9682, 9685, 9688, 9691, 9694, 9697, - 9700, 9703, 9705, 9708, 9711, 9714, 9717, 9720, 9723, 9726, - 9729, 9731, 9734, 9737, 9740, 9742, 9745, 9748, 9751, 9754, - 9757, 9760, 9763, 9768, 9770, 9772, 9774, 9776, 9778, 9780, - 9782, 9784, 9786, 9788, 9790, 9792, 9794, 9796, 9798, 9800, - 9802, 9804, 9806, 9808, 9810, 9812, 9814, 9816, 9818, 9820, - - 9822, 9824, 9826, 9829, 9832, 9835, 9838, 9841, 9844, 9847, - 9850, 9853, 9856, 9858, 9861, 9864, 9867, 9870, 9873, 9876, - 9879, 9882, 9885, 9887, 9890, 9893, 9897, 9902, 9904, 9906, - 9908, 9910, 9912, 9914, 9916, 9918, 9920, 9922, 9924, 9926, - 9928, 9930, 9932, 9934, 9936, 9938, 9940, 9942, 9944, 9946, - 9948, 9951, 9954, 9957, 9960, 9962, 9965, 9968, 9971, 9974, - 9977, 9980, 9983, 9985, 9988, 9991, 9994, 9996, 9999,10002, - 10005,10008,10011,10014,10017,10022,10024,10026,10028,10030, - 10032,10034,10036,10038,10040,10042,10044,10046,10048,10050, - 10052,10054,10056,10058,10061,10064,10067,10070,10073,10076, - - 10078,10081,10084,10087,10090,10093,10096,10099,10102,10105, - 10107,10110,10113,10117,10122,10124,10126,10128,10130,10132, - 10134,10136,10138,10140,10142,10144,10146,10148,10150,10152, - 10154,10157,10160,10163,10166,10169,10172,10175,10177,10180, - 10183,10186,10189,10192,10195,10198,10201,10204,10209,10211, - 10213,10215,10217,10219,10221,10223,10225,10227,10230,10233, - 10236,10239,10242,10245,10248,10251,10253,10256,10259,10263, - 10265,10267,10269,10271,10273,10275,10277,10280,10283,10286, - 10289,10292,10295,10298,10301,10304,10307,10309,10311,10313, - 10315,10318,10320,10323,10326,10329,10332,10335,10339,10341, - - 10343,10346,10348,10351,10354,10357,10361,10363,10366,10368, - 10371,10375,10378,10382,10386,10390,10394,10398,10402,10406, - 10410,10414,10418,10422,10426,10430,10434,10438,10442,10446, - 10450,10454,10458,10462,10466,10470,10474,10478,10482,10486 + 8700, 8702, 8704, 8706, 8708, 8710, 8712, 8714, 8716, 8718, + 8720, 8722, 8724, 8726, 8728, 8730, 8732, 8734, 8736, 8738, + 8740, 8742, 8744, 8746, 8748, 8750, 8752, 8754, 8756, 8758, + 8760, 8762, 8764, 8766, 8768, 8770, 8772, 8774, 8776, 8778, + 8780, 8782, 8784, 8786, 8788, 8790, 8793, 8796, 8799, 8802, + 8804, 8807, 8810, 8813, 8816, 8819, 8822, 8825, 8828, 8831, + 8833, 8836, 8839, 8842, 8845, 8848, 8851, 8854, 8857, 8860, + + 8862, 8865, 8868, 8871, 8874, 8877, 8880, 8883, 8886, 8889, + 8891, 8894, 8897, 8902, 8906, 8908, 8910, 8912, 8914, 8916, + 8918, 8920, 8922, 8924, 8926, 8928, 8930, 8932, 8934, 8936, + 8938, 8940, 8942, 8944, 8946, 8948, 8950, 8952, 8954, 8956, + 8958, 8960, 8962, 8964, 8966, 8968, 8970, 8972, 8974, 8976, + 8978, 8980, 8982, 8984, 8986, 8988, 8990, 8992, 8994, 8996, + 8998, 9000, 9002, 9004, 9006, 9008, 9010, 9012, 9014, 9016, + 9018, 9021, 9024, 9027, 9030, 9033, 9036, 9039, 9041, 9044, + 9047, 9050, 9053, 9056, 9059, 9062, 9065, 9067, 9070, 9073, + 9076, 9078, 9081, 9084, 9087, 9090, 9093, 9096, 9098, 9101, + + 9104, 9107, 9109, 9112, 9115, 9118, 9121, 9124, 9127, 9131, + 9135, 9137, 9139, 9141, 9143, 9145, 9147, 9149, 9151, 9153, + 9155, 9157, 9159, 9161, 9163, 9165, 9167, 9169, 9171, 9173, + 9175, 9177, 9179, 9181, 9183, 9185, 9187, 9189, 9191, 9193, + 9195, 9197, 9199, 9201, 9203, 9205, 9207, 9209, 9211, 9213, + 9215, 9217, 9219, 9221, 9223, 9225, 9227, 9229, 9231, 9233, + 9235, 9237, 9240, 9243, 9246, 9249, 9252, 9255, 9258, 9261, + 9264, 9267, 9269, 9272, 9275, 9278, 9281, 9284, 9287, 9290, + 9293, 9296, 9298, 9301, 9304, 9307, 9310, 9313, 9316, 9319, + 9322, 9325, 9327, 9330, 9333, 9338, 9342, 9344, 9346, 9348, + + 9350, 9352, 9354, 9356, 9358, 9360, 9362, 9364, 9366, 9368, + 9370, 9372, 9374, 9376, 9378, 9380, 9382, 9384, 9386, 9388, + 9390, 9392, 9394, 9396, 9398, 9400, 9402, 9404, 9406, 9408, + 9410, 9412, 9414, 9416, 9418, 9420, 9422, 9424, 9426, 9428, + 9431, 9434, 9437, 9440, 9442, 9445, 9448, 9451, 9454, 9457, + 9460, 9463, 9465, 9468, 9471, 9474, 9476, 9479, 9482, 9485, + 9488, 9491, 9494, 9496, 9499, 9502, 9505, 9507, 9510, 9513, + 9516, 9519, 9522, 9525, 9529, 9533, 9535, 9537, 9539, 9541, + 9543, 9545, 9547, 9549, 9551, 9553, 9555, 9557, 9559, 9561, + 9563, 9565, 9567, 9569, 9571, 9573, 9575, 9577, 9579, 9581, + + 9583, 9585, 9587, 9589, 9591, 9593, 9595, 9597, 9599, 9601, + 9603, 9605, 9607, 9609, 9612, 9615, 9618, 9621, 9624, 9627, + 9629, 9632, 9635, 9638, 9641, 9644, 9647, 9650, 9653, 9656, + 9658, 9661, 9664, 9667, 9670, 9673, 9676, 9679, 9682, 9685, + 9687, 9690, 9693, 9698, 9702, 9704, 9706, 9708, 9710, 9712, + 9714, 9716, 9718, 9720, 9722, 9724, 9726, 9728, 9730, 9732, + 9734, 9736, 9738, 9740, 9742, 9744, 9746, 9748, 9750, 9752, + 9754, 9756, 9758, 9760, 9762, 9764, 9766, 9768, 9770, 9772, + 9775, 9778, 9781, 9784, 9787, 9790, 9793, 9795, 9798, 9801, + 9804, 9807, 9810, 9813, 9816, 9819, 9821, 9824, 9827, 9830, + + 9832, 9835, 9838, 9841, 9844, 9847, 9850, 9854, 9858, 9860, + 9862, 9864, 9866, 9868, 9870, 9872, 9874, 9876, 9878, 9880, + 9882, 9884, 9886, 9888, 9890, 9892, 9894, 9896, 9898, 9900, + 9902, 9904, 9906, 9908, 9910, 9912, 9914, 9916, 9919, 9922, + 9925, 9928, 9931, 9934, 9937, 9940, 9943, 9946, 9948, 9951, + 9954, 9957, 9960, 9963, 9966, 9969, 9972, 9975, 9977, 9980, + 9983, 9988, 9992, 9994, 9996, 9998,10000,10002,10004,10006, + 10008,10010,10012,10014,10016,10018,10020,10022,10024,10026, + 10028,10030,10032,10034,10036,10038,10041,10044,10047,10050, + 10052,10055,10058,10061,10064,10067,10070,10073,10075,10078, + + 10081,10084,10086,10089,10092,10095,10098,10101,10104,10108, + 10112,10114,10116,10118,10120,10122,10124,10126,10128,10130, + 10132,10134,10136,10138,10140,10142,10144,10146,10148,10151, + 10154,10157,10160,10163,10166,10168,10171,10174,10177,10180, + 10183,10186,10189,10192,10195,10197,10200,10203,10208,10212, + 10214,10216,10218,10220,10222,10224,10226,10228,10230,10232, + 10234,10236,10238,10240,10242,10244,10247,10250,10253,10256, + 10259,10262,10265,10267,10270,10273,10276,10279,10282,10285, + 10288,10291,10295,10299,10301,10303,10305,10307,10309,10311, + 10313,10315,10317,10320,10323,10326,10329,10332,10335,10338, + + 10341,10343,10346,10349,10353,10355,10357,10359,10361,10363, + 10365,10367,10370,10373,10376,10379,10382,10385,10388,10391, + 10394,10397,10399,10401,10403,10405,10408,10410,10413,10416, + 10419,10422,10425,10429,10431,10433,10436,10438,10441,10444, + 10447,10451,10453,10456,10458,10461,10465,10468,10472,10476, + 10480,10484,10488,10492,10496,10500,10504,10508,10512,10516, + 10520,10524,10528,10532,10536,10540,10544,10548,10552,10556, + 10560,10564,10568,10572,10576 } ; -static yyconst flex_int16_t yy_def[4541] = +static yyconst flex_int16_t yy_def[4576] = { 0, - 2829, 1, 2829, 2829, 2829, 2829, 2829, 2830, 2829, 2831, - 2832, 2832, 2829, 2833, 2833, 15, 15, 15, 15, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 15, 15, 15, 2833, 2833, 2829, 2829, - 2830, 2829, 2829, 2831, 2829, 2834, 2834, 2835, 2834, 2836, - 2833, 15, 52, 2833, 52, 52, 2829, 52, 2833, 52, - 2833, 2833, 52, 2833, 2833, 2833, 2833, 2833, 2833, 52, - 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2829, 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, - - 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2837, 2837, 2838, 2837, 2839, 2836, 2829, - 2840, 52, 2833, 2833, 2829, 132, 132, 132, 2833, 132, - 2833, 2833, 132, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2829, 2833, 2829, 2833, 2833, 2829, 2833, 2829, 2833, - 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2829, 2829, - 2841, 2841, 2842, 2841, 2843, 2844, 2845, 2829, 2829, 2846, - 2847, 132, 2833, 2833, 2829, 222, 2833, 2833, 2833, 2833, - 2833, 2833, 222, 2833, 2833, 2833, 2833, 2833, 2833, 2829, - 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2829, 2833, 2829, 2833, 2833, 2829, 2833, 2829, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2829, 2829, 2829, 2829, 2848, 2848, 2849, - - 2848, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857, 222, - 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, - 2833, 2833, 2833, 2833, 2829, 2829, 2833, 2833, 2833, 2829, - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, - 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2829, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, - 2833, 2829, 2829, 2829, 2858, 2858, 2859, 2858, 2860, 2861, - 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, - 2872, 222, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, - - 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, - 2833, 2833, 2833, 2833, 2833, 2829, 2829, 2829, 2829, 2829, - 2829, 2833, 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2829, 2833, 2833, 2829, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2829, 2833, 2833, - 2833, 2833, 2833, 2829, 2833, 2829, 2829, 2829, 2873, 2873, - 2874, 2873, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, - 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, - 222, 2833, 2833, 2833, 2829, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, 2833, 2833, - - 2829, 2829, 2829, 2829, 2829, 2829, 2833, 2833, 2833, 2833, - 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2829, 2833, - 2833, 2829, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, - 2833, 2833, 2829, 2829, 2833, 2833, 2833, 2833, 2829, 2833, - 2829, 2829, 2893, 2893, 2894, 2893, 2895, 2896, 2897, 2898, - 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, - 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, - 2919, 2920, 2921, 2921, 2829, 2921, 2921, 2921, 2921, 2921, - 2921, 2921, 2921, 2921, 2921, 2921, 2829, 2921, 2921, 2829, - 2829, 2829, 2829, 2829, 2829, 2921, 2921, 2921, 2921, 2829, - - 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, - 2829, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, - 2921, 2829, 2829, 2921, 2921, 2921, 2921, 2829, 2921, 2829, - 2829, 2922, 2922, 2923, 2922, 2924, 2925, 2926, 2927, 2928, - 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, - 2939, 2940, 2927, 2941, 2942, 2943, 2944, 2945, 2946, 2947, - 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2956, - 2829, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, - 2956, 2956, 2829, 2829, 2829, 2829, 2829, 2829, 2956, 2956, - 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, - - 2829, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, - 2956, 2829, 2956, 2957, 2957, 2958, 2957, 2959, 2960, 2961, - 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, - 2972, 2973, 2974, 2975, 2976, 2962, 2977, 2978, 2979, 2980, - 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, - 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, - 3000, 2829, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, - 3000, 3000, 2829, 2829, 2829, 2829, 2829, 2829, 3000, 3000, - 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3000, 2829, 3000, - 3000, 3000, 3000, 3000, 3000, 3000, 3000, 3001, 3001, 3002, - - 3001, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, - 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3005, - 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3011, 3028, 3029, - 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, - 3040, 3041, 3042, 3043, 3044, 3036, 3045, 3046, 3047, 3048, - 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, - 3048, 2829, 2829, 2829, 2829, 2829, 2829, 3048, 3048, 3048, - 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, 3048, - 3048, 3048, 3048, 3048, 3049, 3049, 3050, 3049, 3051, 3052, - 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, - - 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, - 3073, 3074, 3075, 3076, 3077, 3059, 3078, 3079, 3080, 3081, - 3082, 3083, 3084, 3085, 3086, 3087, 3088, 3089, 3090, 3091, - 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3090, 3099, 3100, - 3101, 3102, 3103, 3104, 3105, 3106, 3106, 3106, 3106, 3106, - 3106, 3106, 3106, 3106, 3106, 3106, 2829, 2829, 2829, 2829, - 2829, 2829, 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3106, - 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3107, 3107, 3108, - 3107, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, - 3118, 3119, 3120, 3112, 3121, 3122, 3123, 3124, 3125, 3126, - - 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3115, 3135, - 3136, 3137, 3138, 3139, 3140, 3141, 3122, 3142, 3143, 3144, - 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, - 3155, 3156, 3149, 3157, 3158, 3159, 3160, 3161, 3162, 3163, - 3155, 3164, 3165, 3166, 3167, 3167, 3167, 3167, 3167, 3167, - 3167, 3167, 3167, 3167, 2829, 2829, 2829, 2829, 3167, 3167, - 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, - 3167, 3167, 3168, 3168, 3169, 3168, 3170, 3171, 3172, 3173, - 3174, 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3173, 3182, - 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, - - 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, - 3203, 3204, 3183, 3205, 3206, 3207, 3208, 3209, 3210, 3211, - 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, - 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, - 3222, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3239, - 3239, 3239, 3239, 3239, 3239, 3239, 2829, 2829, 2829, 2829, - 3239, 3239, 3239, 3239, 3239, 3239, 3239, 3239, 3239, 3239, - 3239, 3239, 3239, 3239, 3240, 3240, 3241, 3240, 3242, 3243, - 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3244, 3252, - 3253, 3254, 3255, 3256, 3257, 3258, 3250, 3259, 3260, 3261, - - 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, - 3272, 3273, 3274, 3275, 3253, 3276, 3277, 3278, 3279, 3280, - 3281, 3282, 3260, 3283, 3284, 3285, 3286, 3287, 3288, 3289, - 3290, 3291, 3292, 3293, 3294, 3295, 3296, 3297, 3298, 3299, - 3291, 3300, 3301, 3302, 3294, 3303, 3304, 3305, 3306, 3307, - 3308, 3309, 3301, 3310, 3311, 3312, 3313, 3313, 3313, 3313, - 3313, 3313, 3313, 2829, 2829, 3313, 3313, 3313, 3313, 3313, - 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3313, 3314, 3314, - 3315, 3314, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, + 2864, 1, 2864, 2864, 2864, 2864, 2864, 2865, 2864, 2866, + 2867, 2867, 2864, 2868, 2868, 15, 15, 15, 15, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 15, 15, 15, 2868, 2868, 2868, 2864, + 2864, 2865, 2864, 2864, 2866, 2864, 2869, 2869, 2870, 2869, + 2871, 2868, 15, 53, 2868, 53, 53, 2864, 53, 2868, + 53, 2868, 2868, 53, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 53, 2868, 2868, 2864, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2864, 2868, 2868, + + 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2872, 2872, 2873, 2872, + 2874, 2871, 2864, 2875, 53, 2868, 2868, 2864, 135, 135, + 135, 2868, 135, 2868, 2868, 135, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, 2868, 2868, + 2864, 2868, 2864, 2868, 2868, 2864, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2864, 2864, 2864, 2876, 2876, 2877, 2876, 2878, + 2879, 2880, 2864, 2864, 2881, 2882, 135, 2868, 2868, 2864, + 227, 2868, 2868, 2868, 2868, 2868, 2868, 227, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, + 2864, 2868, 2868, 2864, 2868, 2868, 2864, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + + 2868, 2864, 2864, 2864, 2864, 2883, 2883, 2884, 2883, 2885, + 2886, 2887, 2888, 2889, 2890, 2891, 2892, 227, 2868, 2868, + 2864, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, + 2868, 2868, 2868, 2864, 2864, 2868, 2868, 2868, 2864, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, + 2864, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2864, 2864, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2864, 2868, 2864, 2864, 2864, 2893, 2893, 2894, 2893, 2895, + 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, + + 2906, 2907, 227, 2868, 2868, 2868, 2868, 2868, 2864, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2864, 2868, 2868, 2868, 2868, 2868, 2864, 2864, 2864, + 2864, 2864, 2864, 2868, 2868, 2868, 2864, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2864, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, + 2864, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, + 2864, 2864, 2908, 2908, 2909, 2908, 2910, 2911, 2912, 2913, + 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, + 2924, 2925, 2926, 2927, 227, 2868, 2868, 2868, 2864, 2868, + + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, + 2868, 2864, 2868, 2868, 2868, 2864, 2864, 2864, 2864, 2864, + 2864, 2868, 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2864, 2868, 2868, 2868, 2864, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2868, 2864, 2864, + 2868, 2868, 2868, 2868, 2868, 2864, 2868, 2864, 2864, 2928, + 2928, 2929, 2928, 2930, 2931, 2932, 2933, 2934, 2935, 2936, + 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, + 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, + 2956, 2864, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, + + 2956, 2956, 2956, 2956, 2864, 2956, 2956, 2864, 2864, 2864, + 2864, 2864, 2864, 2956, 2956, 2956, 2956, 2864, 2956, 2956, + 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2864, 2956, + 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2956, 2864, + 2864, 2956, 2956, 2956, 2956, 2956, 2864, 2956, 2864, 2864, + 2957, 2957, 2958, 2957, 2959, 2960, 2961, 2962, 2963, 2964, + 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, + 2975, 2962, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, + 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2991, 2864, + 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, + + 2991, 2991, 2864, 2864, 2864, 2864, 2864, 2864, 2991, 2991, + 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, + 2864, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, + 2991, 2991, 2864, 2991, 2992, 2992, 2993, 2992, 2994, 2995, + 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, + 3006, 3007, 3008, 3009, 3010, 3011, 2997, 3012, 3013, 3014, + 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, + 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, + 3035, 3035, 2864, 3035, 3035, 3035, 3035, 3035, 3035, 3035, + 3035, 3035, 3035, 3035, 2864, 2864, 2864, 2864, 2864, 2864, + + 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, + 2864, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, 3035, + 3036, 3036, 3037, 3036, 3038, 3039, 3040, 3041, 3042, 3043, + 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, + 3054, 3055, 3040, 3056, 3057, 3058, 3059, 3060, 3061, 3062, + 3046, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, + 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3071, 3080, + 3081, 3082, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, + 3083, 3083, 3083, 3083, 3083, 2864, 2864, 2864, 2864, 2864, + 2864, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, + + 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3083, 3084, + 3084, 3085, 3084, 3086, 3087, 3088, 3089, 3090, 3091, 3092, + 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, + 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, + 3094, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, 3121, + 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, + 3132, 3133, 3125, 3134, 3135, 3136, 3137, 3138, 3139, 3140, + 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, + 3141, 3141, 2864, 2864, 2864, 2864, 2864, 2864, 3141, 3141, + 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, 3141, + + 3141, 3141, 3141, 3141, 3142, 3142, 3143, 3142, 3144, 3145, + 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, + 3147, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, + 3165, 3166, 3167, 3168, 3169, 3150, 3170, 3171, 3172, 3173, + 3174, 3175, 3176, 3157, 3177, 3178, 3179, 3180, 3181, 3182, + 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3184, + 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3190, 3199, 3200, + 3201, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, + 3202, 3202, 2864, 2864, 2864, 2864, 3202, 3202, 3202, 3202, + 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, 3202, + + 3202, 3203, 3203, 3204, 3203, 3205, 3206, 3207, 3208, 3209, + 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3208, 3217, 3218, + 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, + 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, + 3239, 3218, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, + 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, 3257, + 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 3257, + 3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3274, 3274, + 3274, 3274, 3274, 3274, 3274, 3274, 2864, 2864, 2864, 2864, + 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, 3274, + + 3274, 3274, 3274, 3274, 3274, 3275, 3275, 3276, 3275, 3277, + 3278, 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3279, + 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3285, 3294, 3295, + 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, + 3306, 3307, 3308, 3309, 3310, 3288, 3311, 3312, 3313, 3314, + 3315, 3316, 3317, 3295, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, 3329, 3330, 3331, 3332, 3333, - - 3324, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, - 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, - 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3335, 3360, 3361, - 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, - 3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3372, - 3381, 3382, 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, - 3391, 3382, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, - 3399, 3399, 3399, 3399, 3399, 3399, 2829, 2829, 3399, 3399, - 3399, 3399, 3399, 3399, 3399, 3399, 3399, 3399, 3400, 3400, - 3401, 3400, 3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, - - 3410, 3411, 3412, 3413, 3405, 3414, 3415, 3416, 3408, 3417, - 3418, 3419, 3420, 3421, 3422, 3423, 3415, 3424, 3425, 3426, - 3427, 3428, 3429, 3430, 3431, 3432, 3433, 3434, 3435, 3436, - 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3418, 3444, 3445, - 3446, 3447, 3448, 3449, 3450, 3425, 3451, 3452, 3453, 3454, - 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, - 3465, 3458, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3464, - 3473, 3474, 3475, 3467, 3476, 3477, 3478, 3479, 3480, 3481, - 3482, 3474, 3483, 3484, 3485, 3486, 3486, 3486, 3486, 3486, - 3486, 2829, 2829, 3486, 3486, 3486, 3486, 3486, 3486, 3486, - - 3487, 3487, 3488, 3487, 3489, 3490, 3491, 3492, 3493, 3494, - 3495, 3496, 3497, 3498, 3490, 3499, 3500, 3501, 3502, 3503, - 3504, 3505, 3506, 3507, 3508, 3509, 3500, 3510, 3511, 3512, - 3513, 3514, 3515, 3516, 3517, 3518, 3519, 3520, 3521, 3522, - 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, - 3533, 3534, 3535, 3536, 3537, 3538, 3511, 3539, 3540, 3541, - 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, - 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, - 3562, 3563, 3564, 3565, 3556, 3566, 3567, 3568, 3569, 3570, - 3571, 3572, 3573, 3574, 3575, 3576, 3567, 3577, 3578, 3579, - - 3580, 3581, 3582, 3583, 3584, 3584, 3584, 3584, 3584, 2829, - 2829, 3584, 3584, 3584, 3584, 3584, 3584, 3585, 3585, 3585, - 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3585, 3592, 3593, - 3594, 3595, 3596, 3597, 3598, 3590, 3599, 3600, 3601, 3593, - 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3600, 3609, 3610, - 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, - 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, - 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, - 3641, 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, - 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3649, 3658, 3659, - - 3660, 3652, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3659, - 3668, 3669, 3670, 3662, 3671, 3672, 3673, 3674, 3675, 3676, - 3677, 3669, 3678, 3679, 3680, 3681, 3681, 3681, 3681, 3681, - 2829, 2829, 3681, 3681, 3681, 3681, 3681, 3681, 3682, 3682, - 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3685, 3689, 3690, - 3688, 3684, 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, - 3699, 3700, 3701, 3692, 3702, 3703, 3704, 3705, 3706, 3707, - 3708, 3709, 3710, 3711, 3712, 3713, 3714, 3715, 3716, 3717, - 3718, 3719, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, - 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, + 3334, 3326, 3335, 3336, 3337, 3329, 3338, 3339, 3340, 3341, + 3342, 3343, 3344, 3336, 3345, 3346, 3347, 3348, 3348, 3348, + 3348, 3348, 3348, 3348, 3348, 2864, 2864, 3348, 3348, 3348, + + 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, + 3348, 3349, 3349, 3350, 3349, 3351, 3352, 3353, 3354, 3355, + 3356, 3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, + 3366, 3367, 3368, 3359, 3369, 3370, 3371, 3372, 3373, 3374, + 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, + 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, + 3370, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, + 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, + 3414, 3415, 3407, 3416, 3417, 3418, 3419, 3420, 3421, 3422, + 3423, 3424, 3425, 3426, 3417, 3427, 3428, 3429, 3430, 3431, + + 3432, 3433, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 2864, + 2864, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, + 3434, 3434, 3435, 3435, 3436, 3435, 3437, 3438, 3439, 3440, + 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, 3440, 3449, + 3450, 3451, 3443, 3452, 3453, 3454, 3455, 3456, 3457, 3458, + 3450, 3459, 3460, 3461, 3462, 3463, 3464, 3465, 3466, 3467, + 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 3477, + 3478, 3453, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3460, + 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, + 3496, 3497, 3498, 3499, 3500, 3493, 3501, 3502, 3503, 3504, + + 3505, 3506, 3507, 3499, 3508, 3509, 3510, 3502, 3511, 3512, + 3513, 3514, 3515, 3516, 3517, 3509, 3518, 3519, 3520, 3521, + 3521, 3521, 3521, 3521, 3521, 2864, 2864, 3521, 3521, 3521, + 3521, 3521, 3521, 3521, 3521, 3522, 3522, 3523, 3522, 3524, + 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3525, + 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, + 3544, 3535, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, + 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, + 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570, 3571, 3572, + 3573, 3546, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, + + 3582, 3583, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, + 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3591, + 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, + 3611, 3602, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, + 3619, 3619, 3619, 3619, 2864, 2864, 3619, 3619, 3619, 3619, + 3619, 3619, 3620, 3620, 3620, 3620, 3621, 3622, 3623, 3624, + 3625, 3626, 3620, 3627, 3628, 3629, 3630, 3631, 3632, 3633, + 3625, 3634, 3635, 3636, 3628, 3637, 3638, 3639, 3640, 3641, + 3642, 3643, 3635, 3644, 3645, 3646, 3647, 3648, 3649, 3650, + 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, + + 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, + 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, + 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, + 3691, 3692, 3684, 3693, 3694, 3695, 3687, 3696, 3697, 3698, + 3699, 3700, 3701, 3702, 3694, 3703, 3704, 3705, 3697, 3706, + 3707, 3708, 3709, 3710, 3711, 3712, 3704, 3713, 3714, 3715, + 3716, 3716, 3716, 3716, 3716, 2864, 2864, 3716, 3716, 3716, + 3716, 3716, 3716, 3717, 3717, 3717, 3718, 3719, 3720, 3721, + 3722, 3723, 3720, 3724, 3725, 3723, 3719, 3726, 3727, 3728, + 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3727, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 3744, 3745, 3746, 3747, - 3748, 3749, 3750, 3751, 3752, 3753, 3745, 3754, 3755, 3756, - 3757, 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3755, 3765, - 3766, 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, - 3766, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 3783, - 3783, 3783, 2829, 2829, 3783, 3783, 3783, 3783, 3783, 3783, - 3784, 3784, 3785, 3786, 3787, 3788, 3789, 3787, 3790, 3791, - 3792, 3793, 3794, 3788, 3795, 3796, 3797, 3790, 3798, 3799, - 3800, 3801, 3802, 3803, 3804, 3796, 3805, 3806, 3807, 3808, - 3809, 3810, 3811, 3812, 3813, 3814, 3815, 3816, 3817, 3818, - - 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, 3828, - 3829, 3830, 3831, 3832, 3833, 3834, 3835, 3836, 3837, 3838, - 3839, 3840, 3841, 3842, 3842, 3843, 3844, 3845, 3846, 3847, - 3848, 3842, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3847, - 3856, 3857, 3858, 3850, 3859, 3860, 3861, 3862, 3863, 3864, - 3865, 3857, 3866, 3867, 3868, 3860, 3869, 3870, 3871, 3872, - 3873, 3874, 3875, 3867, 3876, 3877, 3878, 3879, 2829, 2829, - 3879, 3879, 3879, 3880, 3880, 3881, 3882, 3883, 3884, 3882, - 3885, 3886, 3887, 3888, 3889, 3890, 3891, 3892, 3893, 3894, - 3895, 3896, 3887, 3897, 3898, 3899, 3900, 3901, 3902, 3903, - - 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 3912, 3913, - 3914, 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, 3923, - 3924, 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3932, 3933, + 3748, 3749, 3750, 3751, 3752, 3753, 3754, 3755, 3756, 3757, + 3758, 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, + 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 3776, 3777, + 3778, 3779, 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3787, + 3788, 3780, 3789, 3790, 3791, 3792, 3793, 3794, 3795, 3796, + 3797, 3798, 3799, 3790, 3800, 3801, 3802, 3803, 3804, 3805, + 3806, 3807, 3808, 3809, 3810, 3801, 3811, 3812, 3813, 3814, + 3815, 3816, 3817, 3818, 3818, 3818, 3818, 2864, 2864, 3818, + 3818, 3818, 3818, 3818, 3818, 3819, 3819, 3820, 3821, 3822, + + 3823, 3824, 3822, 3825, 3826, 3827, 3828, 3829, 3823, 3830, + 3831, 3832, 3825, 3833, 3834, 3835, 3836, 3837, 3838, 3839, + 3831, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 3848, + 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, + 3859, 3860, 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, + 3869, 3870, 3871, 3872, 3873, 3874, 3875, 3876, 3877, 3877, + 3878, 3879, 3880, 3881, 3882, 3883, 3877, 3884, 3885, 3886, + 3887, 3888, 3889, 3890, 3882, 3891, 3892, 3893, 3885, 3894, + 3895, 3896, 3897, 3898, 3899, 3900, 3892, 3901, 3902, 3903, + 3895, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3902, 3911, + + 3912, 3913, 3914, 2864, 2864, 3914, 3914, 3914, 3915, 3915, + 3916, 3917, 3918, 3919, 3917, 3920, 3921, 3922, 3923, 3924, + 3925, 3926, 3927, 3928, 3929, 3930, 3931, 3922, 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, - 3940, 3944, 3945, 3943, 3939, 3946, 3947, 3948, 3949, 3950, - 3951, 3952, 3953, 3954, 3955, 3956, 3947, 3957, 3958, 3959, - 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 3958, 3968, - 3969, 3970, 3971, 3972, 3973, 3974, 3975, 2829, 2829, 3975, - 3975, 3976, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3978, - 3983, 3984, 3985, 3978, 3986, 3987, 3988, 3989, 3990, 3991, - - 3992, 3984, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 4000, - 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008, 4009, 4010, - 4011, 4012, 4013, 4014, 4015, 4016, 4017, 4018, 4019, 4020, - 4021, 4022, 4023, 4024, 4025, 4026, 4027, 4028, 4029, 4030, - 4031, 4032, 4030, 4033, 4034, 4035, 4036, 4037, 4031, 4038, - 4039, 4040, 4033, 4041, 4042, 4043, 4044, 4045, 4046, 4047, - 4039, 4048, 4049, 4050, 4042, 4051, 4052, 4053, 4054, 4055, - 4056, 4057, 4049, 4058, 4059, 4060, 4061, 2829, 2829, 4061, - 4061, 4062, 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, - 4066, 4070, 4071, 4069, 4065, 4072, 4073, 4074, 4075, 4076, - - 4077, 4078, 4062, 4079, 4080, 4081, 4082, 4083, 4084, 4085, - 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, - 4096, 4097, 4098, 4073, 4099, 4100, 4101, 4102, 4103, 4104, - 4105, 4106, 4107, 4108, 4109, 4107, 4110, 4111, 4112, 4113, - 4114, 4115, 4116, 4117, 4118, 4119, 4120, 4121, 4112, 4122, - 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, - 4123, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 2829, - 2829, 4140, 4140, 4140, 4141, 4141, 4142, 4143, 4144, 4145, - 4146, 4144, 4147, 4148, 4149, 4150, 4151, 4145, 4152, 4153, - 4154, 4155, 4156, 4157, 4158, 4159, 4160, 4161, 4162, 4163, - - 4164, 4165, 4166, 4167, 4168, 4169, 4147, 4170, 4171, 4172, - 4173, 4174, 4175, 4176, 4153, 4177, 4178, 4179, 4180, 4181, - 4182, 4183, 4184, 4185, 4181, 4186, 4187, 4188, 4181, 4189, - 4190, 4191, 4192, 4193, 4194, 4195, 4187, 4196, 4197, 4198, - 4190, 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4197, 4206, - 4207, 4208, 4209, 4209, 4209, 4210, 4210, 4211, 4212, 4213, - 4214, 4212, 4215, 4216, 4217, 4218, 4219, 4220, 4221, 4222, - 4223, 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, 4232, - 4233, 4234, 4235, 4236, 4237, 4238, 4217, 4239, 4240, 4241, - 4242, 4243, 4244, 4245, 4246, 4247, 4248, 4249, 4250, 4251, - - 4252, 4249, 4253, 4254, 4252, 4248, 4255, 4256, 4257, 4258, - 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4256, 4266, 4267, - 4268, 4269, 4270, 4271, 4272, 4273, 4273, 4274, 4274, 4275, - 4276, 4277, 4278, 4279, 4280, 4276, 4281, 4282, 4283, 4284, - 4285, 4286, 4287, 4288, 4289, 4290, 4291, 4292, 4293, 4276, - 4294, 4295, 4296, 4297, 4298, 4299, 4300, 4282, 4301, 4302, - 4303, 4304, 4305, 4306, 4307, 4308, 4306, 4309, 4310, 4311, - 4312, 4313, 4307, 4314, 4315, 4316, 4309, 4317, 4318, 4319, - 4320, 4321, 4322, 4323, 4315, 4324, 4325, 4326, 4327, 4328, - 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, - - 4329, 4338, 4339, 4340, 4341, 4332, 4342, 4343, 4344, 4331, - 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, - 4355, 4353, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, - 4364, 4365, 4366, 4367, 4358, 4368, 4369, 4370, 4371, 4372, - 4373, 4374, 4375, 4376, 4376, 4377, 4378, 4379, 4380, 4381, - 4382, 4383, 4377, 4384, 4385, 4379, 4386, 4387, 4388, 4389, - 4390, 4391, 4380, 4392, 4393, 4394, 4395, 4396, 4397, 4398, - 4399, 4400, 4396, 4401, 4402, 4403, 4396, 4404, 4405, 4406, - 4407, 4408, 4409, 4410, 4402, 4411, 4412, 4413, 4414, 4415, - 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4417, 4422, 4423, - - 4424, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, - 4434, 4435, 4436, 4437, 4438, 4435, 4439, 4440, 4438, 4434, - 4441, 4442, 4443, 4444, 4445, 4446, 4447, 4448, 4449, 4449, - 4425, 4450, 4451, 4452, 4453, 4428, 4454, 4455, 4431, 4450, - 4456, 4457, 4458, 4436, 4434, 4459, 4460, 4461, 4459, 4462, - 4463, 4464, 4465, 4466, 4460, 4467, 4468, 4469, 4448, 4470, - 4470, 4454, 4471, 4472, 4454, 4456, 4473, 4474, 4475, 4476, - 4477, 4463, 4478, 4479, 4466, 4478, 4460, 4480, 4481, 4482, - 4483, 4484, 4485, 4486, 2659, 4487, 4487, 4488, 4489, 4475, - 4488, 4490, 4491, 4492, 4480, 4493, 4483, 4494, 4495, 4486, - - 4493, 4496, 4497, 4498, 2659, 4499, 4499, 4475, 4500, 2829, - 4501, 2829, 2829, 4502, 4494, 4496, 4503, 4504, 4505, 4506, - 2829, 2705, 4507, 4507, 4508, 4508, 2829, 2829, 4509, 4505, - 4503, 4510, 4511, 2705, 4512, 4512, 2829, 2829, 4513, 2829, - 2705, 4514, 4514, 4511, 2705, 4515, 4515, 2745, 4516, 4516, - 2745, 4517, 4517, 2745, 4518, 4518, 2745, 4519, 4519, 2757, - 4520, 4520, 2757, 4521, 4521, 2757, 4522, 4522, 2757, 4523, - 4523, 2769, 4524, 4524, 2769, 4525, 4525, 2769, 4526, 4526, - 2769, 4527, 4527, 2781, 4528, 4528, 2781, 4529, 4529, 2781, - 4530, 4530, 2781, 4531, 4531, 2793, 4532, 4532, 2793, 4533, - - 4533, 2793, 4534, 4534, 2793, 4535, 4535, 2805, 4536, 4536, - 2805, 4537, 4537, 2805, 4538, 4538, 2805, 4539, 4539, 2817, - 4540, 4540, 2817, 2829, 2829, 2817, 2829, 2829, 0, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829 + 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 3952, 3953, + 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, 3962, 3963, + 3964, 3965, 3966, 3967, 3968, 3969, 3970, 3971, 3972, 3973, + 3974, 3975, 3976, 3977, 3978, 3975, 3979, 3980, 3978, 3974, + 3981, 3982, 3983, 3984, 3985, 3986, 3987, 3988, 3989, 3990, + 3991, 3982, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, + + 4000, 4001, 4002, 3993, 4003, 4004, 4005, 4006, 4007, 4008, + 4009, 4010, 2864, 2864, 4010, 4010, 4011, 4011, 4012, 4013, + 4014, 4015, 4016, 4017, 4013, 4018, 4019, 4020, 4013, 4021, + 4022, 4023, 4024, 4025, 4026, 4027, 4019, 4028, 4029, 4030, + 4031, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, + 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, 4049, 4050, + 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, + 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4065, 4068, 4069, + 4070, 4071, 4072, 4066, 4073, 4074, 4075, 4068, 4076, 4077, + 4078, 4079, 4080, 4081, 4082, 4074, 4083, 4084, 4085, 4077, + + 4086, 4087, 4088, 4089, 4090, 4091, 4092, 4084, 4093, 4094, + 4095, 4096, 2864, 2864, 4096, 4096, 4097, 4097, 4098, 4099, + 4100, 4101, 4102, 4103, 4104, 4101, 4105, 4106, 4104, 4100, + 4107, 4108, 4109, 4110, 4111, 4112, 4113, 4097, 4114, 4115, + 4116, 4117, 4118, 4119, 4120, 4121, 4122, 4123, 4124, 4125, + 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4108, 4134, + 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4142, 4143, 4144, + 4142, 4145, 4146, 4147, 4148, 4149, 4150, 4151, 4152, 4153, + 4154, 4155, 4156, 4147, 4157, 4158, 4159, 4160, 4161, 4162, + 4163, 4164, 4165, 4166, 4167, 4158, 4168, 4169, 4170, 4171, + + 4172, 4173, 4174, 4175, 2864, 2864, 4175, 4175, 4175, 4176, + 4176, 4177, 4178, 4179, 4180, 4181, 4179, 4182, 4183, 4184, + 4185, 4186, 4180, 4187, 4188, 4189, 4190, 4191, 4192, 4193, + 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, 4202, 4203, + 4204, 4182, 4205, 4206, 4207, 4208, 4209, 4210, 4211, 4188, + 4212, 4213, 4214, 4215, 4216, 4217, 4218, 4219, 4220, 4216, + 4221, 4222, 4223, 4216, 4224, 4225, 4226, 4227, 4228, 4229, + 4230, 4222, 4231, 4232, 4233, 4225, 4234, 4235, 4236, 4237, + 4238, 4239, 4240, 4232, 4241, 4242, 4243, 4244, 4244, 4244, + 4245, 4245, 4246, 4247, 4248, 4249, 4247, 4250, 4251, 4252, + + 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, 4261, 4262, + 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, + 4273, 4252, 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, + 4282, 4283, 4284, 4285, 4286, 4287, 4284, 4288, 4289, 4287, + 4283, 4290, 4291, 4292, 4293, 4294, 4295, 4296, 4297, 4298, + 4299, 4300, 4291, 4301, 4302, 4303, 4304, 4305, 4306, 4307, + 4308, 4308, 4309, 4309, 4310, 4311, 4312, 4313, 4314, 4315, + 4311, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, + 4325, 4326, 4327, 4328, 4311, 4329, 4330, 4331, 4332, 4333, + 4334, 4335, 4317, 4336, 4337, 4338, 4339, 4340, 4341, 4342, + + 4343, 4341, 4344, 4345, 4346, 4347, 4348, 4342, 4349, 4350, + 4351, 4344, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4350, + 4359, 4360, 4361, 4362, 4363, 4363, 4364, 4365, 4366, 4367, + 4368, 4369, 4370, 4371, 4372, 4364, 4373, 4374, 4375, 4376, + 4367, 4377, 4378, 4379, 4366, 4380, 4381, 4382, 4383, 4384, + 4385, 4386, 4387, 4388, 4389, 4390, 4388, 4391, 4392, 4393, + 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4393, + 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4411, + 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4412, 4419, 4420, + 4414, 4421, 4422, 4423, 4424, 4425, 4426, 4415, 4427, 4428, + + 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4431, 4436, 4437, + 4438, 4431, 4439, 4440, 4441, 4442, 4443, 4444, 4445, 4437, + 4446, 4447, 4448, 4449, 4450, 4450, 4451, 4452, 4453, 4454, + 4455, 4456, 4452, 4457, 4458, 4459, 4460, 4461, 4462, 4463, + 4464, 4465, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, + 4470, 4474, 4475, 4473, 4469, 4476, 4477, 4478, 4479, 4480, + 4481, 4482, 4483, 4484, 4484, 4460, 4485, 4486, 4487, 4488, + 4463, 4489, 4490, 4466, 4485, 4491, 4492, 4493, 4471, 4469, + 4494, 4495, 4496, 4494, 4497, 4498, 4499, 4500, 4501, 4495, + 4502, 4503, 4504, 4483, 4505, 4505, 4489, 4506, 4507, 4489, + + 4491, 4508, 4509, 4510, 4511, 4512, 4498, 4513, 4514, 4501, + 4513, 4495, 4515, 4516, 4517, 4518, 4519, 4520, 4521, 2694, + 4522, 4522, 4523, 4524, 4510, 4523, 4525, 4526, 4527, 4515, + 4528, 4518, 4529, 4530, 4521, 4528, 4531, 4532, 4533, 2694, + 4534, 4534, 4510, 4535, 2864, 4536, 2864, 2864, 4537, 4529, + 4531, 4538, 4539, 4540, 4541, 2864, 2740, 4542, 4542, 4543, + 4543, 2864, 2864, 4544, 4540, 4538, 4545, 4546, 2740, 4547, + 4547, 2864, 2864, 4548, 2864, 2740, 4549, 4549, 4546, 2740, + 4550, 4550, 2780, 4551, 4551, 2780, 4552, 4552, 2780, 4553, + 4553, 2780, 4554, 4554, 2792, 4555, 4555, 2792, 4556, 4556, + + 2792, 4557, 4557, 2792, 4558, 4558, 2804, 4559, 4559, 2804, + 4560, 4560, 2804, 4561, 4561, 2804, 4562, 4562, 2816, 4563, + 4563, 2816, 4564, 4564, 2816, 4565, 4565, 2816, 4566, 4566, + 2828, 4567, 4567, 2828, 4568, 4568, 2828, 4569, 4569, 2828, + 4570, 4570, 2840, 4571, 4571, 2840, 4572, 4572, 2840, 4573, + 4573, 2840, 4574, 4574, 2852, 4575, 4575, 2852, 2864, 2864, + 2852, 2864, 2864, 0, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864 } ; -static yyconst flex_int16_t yy_nxt[10753] = +static yyconst flex_int16_t yy_nxt[10845] = { 0, - 4, 5, 6, 7, 5, 4, 8, 9, 4, 10, - 11, 11, 12, 12, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 23, 30, 31, 32, 33, 23, 23, 23, - 23, 4, 34, 35, 35, 35, 35, 36, 23, 23, - 23, 23, 23, 23, 37, 28, 38, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 39, 40, 2829, 1416, - 40, 43, 43, 43, 43, 43, 45, 2829, 46, 46, - 47, 47, 47, 48, 45, 1437, 47, 47, 47, 47, - 47, 48, 52, 52, 52, 52, 52, 48, 52, 52, - - 53, 52, 52, 52, 40, 351, 52, 40, 59, 54, - 63, 2829, 65, 2829, 64, 2829, 130, 172, 126, 2829, - 52, 673, 50, 60, 52, 52, 55, 56, 52, 52, - 61, 351, 361, 362, 54, 66, 62, 2829, 2829, 67, - 76, 2829, 2829, 172, 2829, 2829, 80, 351, 57, 52, - 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, - 52, 68, 2829, 2829, 2829, 172, 2829, 2829, 81, 74, - 2829, 102, 69, 103, 1445, 672, 82, 707, 77, 70, - 75, 58, 52, 52, 52, 52, 52, 71, 2829, 2829, - 2829, 54, 2829, 2829, 72, 78, 69, 2829, 88, 85, - - 2829, 79, 83, 73, 2829, 2829, 52, 84, 2829, 96, - 86, 677, 89, 2829, 93, 87, 54, 2829, 2829, 2829, - 110, 2829, 94, 113, 88, 2829, 111, 135, 90, 156, - 57, 97, 91, 114, 143, 96, 69, 89, 142, 144, - 93, 2829, 2829, 52, 98, 145, 99, 94, 92, 100, - 104, 2829, 1416, 135, 105, 101, 116, 2829, 88, 95, - 69, 163, 115, 2829, 106, 107, 112, 73, 2829, 108, - 2829, 679, 89, 2829, 109, 2829, 2829, 135, 96, 43, - 43, 43, 43, 43, 88, 122, 122, 123, 123, 123, - 2829, 134, 2829, 2829, 2829, 2829, 45, 89, 124, 124, - - 125, 125, 125, 126, 96, 2829, 2829, 45, 92, 125, - 125, 125, 125, 125, 126, 147, 2829, 134, 146, 2829, - 2829, 139, 2829, 141, 101, 117, 2829, 152, 151, 101, - 118, 154, 690, 2829, 150, 2829, 57, 1437, 119, 120, - 213, 135, 300, 2829, 73, 2829, 2829, 2829, 2829, 2829, - 149, 117, 2829, 152, 151, 101, 118, 2829, 148, 1445, - 2829, 57, 791, 119, 120, 2829, 2829, 2829, 73, 2829, - 2829, 2829, 152, 152, 2829, 121, 132, 132, 132, 132, - 132, 126, 132, 132, 132, 132, 132, 132, 155, 157, - 158, 160, 2829, 2829, 2829, 2829, 169, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 171, 2829, 172, 162, 132, 132, - 132, 132, 132, 132, 164, 159, 2829, 2829, 161, 2829, - 2829, 168, 166, 174, 179, 2829, 167, 2829, 2829, 2829, - 171, 176, 172, 178, 170, 165, 2829, 2829, 2829, 173, - 2829, 2829, 181, 2829, 2829, 2829, 2829, 174, 2829, 175, - 179, 2829, 172, 2829, 177, 180, 2829, 2829, 2829, 178, - 2829, 129, 949, 173, 2829, 193, 181, 2829, 2829, 179, - 174, 185, 2829, 182, 2829, 181, 186, 183, 179, 180, - 2829, 202, 184, 187, 188, 2829, 196, 2829, 181, 2829, - 189, 2829, 2829, 2829, 194, 190, 2829, 195, 2829, 191, - - 2829, 192, 2829, 199, 2829, 205, 174, 200, 2829, 2829, - 2829, 2829, 197, 203, 201, 2829, 204, 179, 2829, 2829, - 130, 670, 130, 2829, 206, 2829, 221, 198, 224, 210, - 174, 122, 122, 123, 123, 123, 2829, 174, 218, 219, - 219, 219, 219, 179, 2829, 2829, 207, 2829, 223, 2829, - 2829, 2829, 224, 2829, 210, 2829, 123, 123, 123, 123, - 123, 225, 179, 135, 229, 172, 225, 45, 208, 211, - 211, 212, 212, 212, 213, 2829, 2829, 130, 2829, 231, - 181, 45, 174, 212, 212, 212, 212, 212, 213, 135, - 225, 172, 2829, 2829, 208, 2829, 2829, 675, 2829, 225, - - 770, 2829, 234, 2829, 181, 236, 174, 2829, 237, 2829, - 2829, 1049, 2829, 209, 222, 222, 222, 222, 222, 213, - 222, 222, 222, 222, 222, 222, 2829, 2829, 2829, 2829, - 232, 242, 2829, 241, 2829, 240, 2829, 235, 2829, 2829, - 2829, 2829, 239, 2829, 2829, 2829, 222, 222, 222, 222, - 222, 222, 238, 2829, 2829, 242, 2829, 241, 2829, 242, - 2829, 242, 243, 2829, 2829, 246, 249, 250, 2829, 252, - 245, 2829, 244, 248, 2829, 2829, 254, 257, 2829, 2829, - 251, 247, 2829, 2829, 253, 2829, 2829, 2829, 258, 2829, - 2829, 2829, 2829, 264, 255, 260, 2829, 256, 2829, 263, - - 2829, 2829, 2829, 265, 2829, 130, 2829, 2829, 2829, 262, - 2829, 270, 2829, 130, 259, 2829, 263, 264, 2829, 2829, - 2829, 2829, 2829, 265, 263, 2829, 265, 265, 2829, 2829, - 261, 267, 2829, 2829, 262, 270, 265, 2829, 266, 263, - 269, 263, 271, 270, 2829, 276, 2829, 265, 277, 263, - 273, 2829, 2829, 2829, 275, 272, 268, 2829, 2829, 2829, - 274, 2829, 2829, 2829, 269, 2829, 2829, 2829, 285, 2829, - 278, 2829, 270, 279, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 280, 2829, 2829, 2829, 284, 2829, 290, 282, 281, - 2829, 2829, 2829, 130, 2829, 2829, 283, 2829, 2829, 308, - - 2829, 377, 130, 288, 2829, 2829, 242, 461, 388, 2829, - 287, 286, 545, 2829, 289, 291, 2829, 2829, 2829, 324, - 2829, 130, 292, 2829, 859, 2829, 2829, 2829, 2829, 2829, - 242, 263, 293, 2829, 242, 2829, 682, 2829, 294, 270, - 319, 2829, 2829, 242, 296, 296, 297, 297, 297, 2829, - 218, 219, 219, 219, 219, 2829, 263, 219, 219, 219, - 219, 219, 294, 270, 2829, 2829, 2829, 242, 680, 2829, - 45, 295, 298, 298, 299, 299, 299, 300, 45, 312, - 299, 299, 299, 299, 299, 300, 310, 310, 310, 310, - 310, 300, 310, 310, 310, 310, 310, 310, 2829, 311, - - 313, 2829, 316, 2829, 312, 2829, 317, 674, 2829, 2829, - 2829, 2829, 325, 2829, 2829, 2829, 2829, 313, 310, 310, - 310, 310, 310, 310, 2829, 313, 2829, 2829, 2829, 315, - 2829, 2829, 2829, 2829, 318, 130, 2829, 2829, 313, 343, - 320, 2829, 2829, 333, 2829, 2829, 2829, 2829, 130, 2829, - 334, 323, 2829, 326, 2829, 330, 2829, 322, 327, 2829, - 2829, 2829, 2829, 329, 2829, 2829, 2829, 335, 336, 2829, - 331, 332, 340, 2829, 337, 2829, 339, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 341, 338, 2829, 2829, 2829, - 347, 345, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 348, - - 342, 344, 2829, 2829, 348, 2829, 2829, 2829, 346, 2829, - 2829, 2829, 2829, 2829, 2829, 350, 347, 2829, 2829, 2829, - 2829, 634, 2829, 2829, 2829, 348, 352, 2829, 2829, 349, - 348, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 676, 2829, - 348, 350, 2829, 355, 357, 2829, 2829, 2829, 2829, 348, - 1492, 354, 353, 2829, 348, 2829, 2829, 351, 2829, 356, - 2829, 2829, 2829, 2829, 2829, 363, 358, 359, 364, 2829, - 2829, 416, 360, 365, 2829, 368, 369, 366, 2829, 2829, - 2829, 370, 371, 2829, 2829, 2829, 2829, 2829, 2829, 367, - 2829, 348, 348, 2829, 417, 130, 2829, 2829, 2829, 2829, - - 351, 391, 418, 313, 313, 374, 2829, 296, 296, 297, - 297, 297, 2829, 1155, 1493, 694, 397, 348, 348, 374, - 2829, 297, 297, 297, 297, 297, 351, 2829, 313, 313, - 45, 2829, 375, 375, 376, 376, 376, 377, 398, 2829, - 2829, 372, 373, 45, 2829, 376, 376, 376, 376, 376, - 377, 392, 392, 392, 392, 392, 377, 392, 392, 392, - 392, 392, 392, 2829, 394, 2829, 393, 2829, 2829, 2829, - 2829, 2829, 404, 2829, 395, 2829, 2829, 403, 2829, 396, - 2829, 406, 2829, 392, 392, 392, 392, 392, 392, 399, - 2829, 2829, 400, 2829, 2829, 2829, 2829, 408, 2829, 2829, - - 2829, 2829, 2829, 409, 419, 407, 2829, 2829, 401, 2829, - 405, 402, 2829, 434, 2829, 678, 2829, 412, 2829, 2829, - 2829, 2829, 411, 413, 2829, 2829, 2829, 420, 426, 2829, - 2829, 2829, 422, 414, 415, 421, 2829, 424, 423, 434, - 2829, 427, 428, 433, 2829, 2829, 429, 2829, 436, 2829, - 2829, 2829, 2829, 2829, 430, 431, 2829, 2829, 2829, 432, - 2829, 434, 437, 2829, 435, 2829, 2829, 2829, 2829, 433, - 2829, 2829, 436, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 437, 2829, 2829, 2829, 434, 440, 437, 2829, 441, 2829, - 2829, 434, 2829, 444, 437, 130, 442, 438, 439, 130, - - 445, 475, 130, 452, 446, 478, 450, 2829, 478, 130, - 434, 434, 2829, 443, 2829, 564, 453, 2829, 2829, 2829, - 449, 2829, 2829, 451, 2829, 2829, 2829, 437, 2829, 2829, - 2829, 455, 434, 2829, 2829, 2829, 2829, 434, 2829, 2829, - 2829, 2829, 457, 457, 458, 458, 458, 704, 2829, 129, - 45, 437, 459, 459, 460, 460, 460, 461, 45, 456, - 460, 460, 460, 460, 460, 461, 481, 481, 481, 481, - 481, 461, 481, 481, 481, 481, 481, 481, 2829, 483, - 2829, 2829, 2829, 2829, 488, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 481, 481, - - 481, 481, 481, 481, 494, 489, 2829, 2829, 482, 2829, - 2829, 2829, 2829, 484, 2829, 2829, 486, 2829, 716, 491, - 2829, 1503, 1503, 493, 487, 2829, 507, 490, 2829, 2829, - 508, 2829, 2829, 2829, 2829, 512, 2829, 2829, 495, 2829, - 492, 496, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 498, - 510, 514, 499, 2829, 513, 509, 500, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 516, 2829, 2829, 519, 2829, 2829, - 2829, 2829, 522, 518, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 524, 515, 2829, 2829, 2829, 517, 2829, 2829, 2829, - 521, 2829, 519, 531, 129, 2829, 522, 537, 518, 2829, - - 538, 2829, 2829, 522, 2829, 520, 523, 519, 532, 526, - 2829, 530, 528, 519, 521, 525, 527, 2829, 1503, 536, - 2829, 522, 2829, 519, 535, 2829, 2829, 529, 2829, 2829, - 2829, 2829, 522, 130, 2829, 2829, 2829, 130, 2829, 567, - 2829, 130, 2829, 567, 540, 130, 2829, 567, 519, 130, - 2829, 572, 2829, 2829, 711, 658, 522, 542, 457, 457, - 458, 458, 458, 541, 2829, 2829, 2829, 2829, 2829, 542, - 458, 458, 458, 458, 458, 45, 698, 543, 543, 544, - 544, 544, 545, 45, 2829, 544, 544, 544, 544, 544, - 545, 573, 573, 573, 573, 573, 545, 573, 573, 573, - - 573, 573, 573, 576, 574, 578, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 577, - 2829, 2829, 2829, 573, 573, 573, 573, 573, 573, 581, - 584, 2829, 2829, 2829, 2829, 2829, 582, 2829, 2829, 585, - 583, 579, 2829, 586, 603, 589, 2829, 2829, 588, 598, - 580, 2829, 602, 607, 611, 2829, 608, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 609, 1510, 604, 2829, - 2829, 2829, 2829, 2829, 596, 597, 2829, 605, 599, 2829, - 611, 606, 2829, 2829, 2829, 2829, 601, 2829, 2829, 2829, - 2829, 2829, 610, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 611, 2829, 2829, 2829, 613, 2829, 2829, 614, 2829, 611, - 616, 617, 612, 130, 615, 1503, 627, 618, 610, 564, - 2829, 2829, 130, 130, 2829, 624, 2829, 2829, 564, 564, - 2829, 130, 625, 800, 629, 611, 1395, 665, 611, 619, - 1514, 2829, 2829, 130, 620, 2829, 2829, 2829, 621, 564, - 2829, 130, 2829, 626, 2829, 611, 2829, 665, 2829, 2829, - 630, 630, 631, 631, 631, 45, 681, 632, 632, 633, - 633, 633, 634, 45, 2829, 633, 633, 633, 633, 633, - 634, 669, 669, 669, 669, 669, 634, 669, 669, 669, - 669, 669, 669, 2829, 2829, 2829, 2829, 2829, 689, 701, - - 2829, 2829, 2829, 2829, 2829, 691, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 669, 669, 669, 669, 669, 669, 695, - 692, 700, 2829, 2829, 701, 630, 630, 631, 631, 631, - 761, 2829, 702, 706, 2829, 1503, 701, 708, 130, 693, - 696, 699, 697, 705, 745, 130, 700, 703, 767, 130, - 709, 748, 763, 710, 713, 658, 1395, 851, 701, 631, - 631, 631, 631, 631, 45, 764, 714, 714, 715, 715, - 715, 716, 45, 766, 715, 715, 715, 715, 715, 716, - 130, 130, 130, 130, 130, 130, 658, 752, 658, 752, - 748, 752, 130, 2829, 2829, 2829, 2829, 2829, 759, 760, - - 760, 760, 760, 760, 716, 760, 760, 760, 760, 760, - 760, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 789, 765, 2829, 2829, 771, 2829, 2829, - 2829, 760, 760, 760, 760, 760, 760, 2829, 768, 769, - 772, 779, 788, 780, 781, 2829, 782, 796, 2829, 785, - 786, 787, 783, 1514, 789, 2829, 784, 130, 790, 792, - 794, 797, 869, 833, 130, 2829, 1167, 860, 793, 871, - 836, 795, 45, 789, 798, 798, 799, 799, 799, 800, - 45, 2829, 799, 799, 799, 799, 799, 800, 130, 130, - 130, 130, 130, 130, 836, 745, 745, 748, 836, 748, - - 130, 130, 130, 130, 2829, 854, 845, 836, 748, 845, - 850, 850, 850, 850, 850, 800, 850, 850, 850, 850, - 850, 850, 2829, 2829, 853, 2829, 852, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 850, 850, 850, 850, 850, 850, 2829, 2829, - 2829, 129, 2829, 130, 856, 2829, 857, 887, 858, 925, - 872, 870, 855, 873, 874, 1500, 2829, 1263, 1268, 868, - 879, 881, 861, 880, 875, 876, 1503, 130, 130, 882, - 884, 877, 878, 928, 928, 45, 883, 885, 885, 886, - 886, 886, 887, 45, 2829, 886, 886, 886, 886, 886, - - 887, 130, 130, 130, 130, 130, 130, 928, 933, 928, - 836, 937, 928, 130, 130, 130, 130, 130, 130, 836, - 937, 928, 933, 937, 945, 946, 946, 946, 946, 946, - 887, 946, 946, 946, 946, 946, 946, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 947, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 946, 946, 946, - 946, 946, 946, 2829, 2829, 2829, 2829, 2829, 2829, 1269, - 130, 2829, 955, 980, 963, 2829, 1022, 965, 1510, 968, - 952, 948, 956, 950, 953, 954, 964, 972, 951, 966, - 967, 1514, 970, 969, 975, 130, 971, 976, 130, 1046, - - 973, 925, 130, 1522, 925, 974, 977, 45, 925, 978, - 978, 979, 979, 979, 980, 45, 1050, 979, 979, 979, - 979, 979, 980, 130, 130, 130, 130, 130, 130, 1029, - 925, 1029, 925, 928, 933, 130, 130, 130, 130, 130, - 130, 925, 1029, 933, 1040, 1029, 933, 130, 2829, 2829, - 2829, 2829, 2829, 1040, 1045, 1045, 1045, 1045, 1045, 980, - 1045, 1045, 1045, 1045, 1045, 1045, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 1060, 2829, 2829, - 2829, 2829, 1062, 2829, 2829, 2829, 1045, 1045, 1045, 1045, - 1045, 1045, 1047, 1048, 1061, 130, 2829, 2829, 1069, 1395, - - 1072, 1122, 1063, 1075, 1177, 1051, 1052, 1053, 1067, 1054, - 1059, 1153, 1161, 1068, 1064, 1070, 1065, 1071, 45, 1066, - 1073, 1073, 1074, 1074, 1074, 1075, 45, 1152, 1074, 1074, - 1074, 1074, 1074, 1075, 130, 130, 130, 130, 130, 130, - 1125, 1022, 1022, 1129, 1022, 1129, 130, 130, 130, 130, - 130, 130, 1125, 1129, 1136, 1022, 1129, 1029, 130, 130, - 130, 130, 130, 130, 1140, 1129, 1029, 1140, 1129, 1136, - 130, 130, 2829, 2829, 2829, 2829, 1140, 1148, 1149, 1149, - 1149, 1149, 1149, 1075, 1149, 1149, 1149, 1149, 1149, 1149, - 2829, 2829, 2829, 1163, 2829, 2829, 2829, 1162, 2829, 2829, - - 1154, 2829, 2829, 1151, 2829, 2829, 2829, 2829, 1514, 2829, - 1149, 1149, 1149, 1149, 1149, 1149, 1281, 1166, 45, 1164, - 1175, 1175, 1176, 1176, 1176, 1177, 130, 1169, 1404, 1526, - 1150, 1156, 1228, 1514, 1168, 1173, 1171, 1271, 1165, 1170, - 1174, 45, 1267, 1176, 1176, 1176, 1176, 1176, 1177, 130, - 130, 130, 1172, 130, 130, 1231, 1231, 1122, 130, 1122, - 1125, 130, 130, 130, 1231, 130, 130, 1125, 1240, 1231, - 130, 1125, 1240, 130, 130, 130, 1125, 130, 130, 1129, - 1136, 1125, 130, 1240, 1136, 130, 130, 130, 1252, 2829, - 2829, 1240, 1136, 1252, 1257, 1257, 1257, 1257, 1257, 1177, - - 1257, 1257, 1257, 1257, 1257, 1257, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 45, 2829, - 1279, 1279, 1280, 1280, 1280, 1281, 1257, 1257, 1257, 1257, - 1257, 1257, 1272, 1259, 1258, 45, 1404, 1280, 1280, 1280, - 1280, 1280, 1281, 1260, 1261, 1270, 1276, 1526, 130, 1266, - 130, 1274, 1262, 1273, 1337, 130, 1340, 1491, 1277, 130, - 130, 1340, 130, 1275, 130, 1340, 1345, 1278, 1340, 130, - 1231, 130, 130, 130, 130, 1349, 130, 1340, 1231, 1349, - 1340, 130, 1345, 130, 130, 130, 130, 1349, 130, 1357, - 1231, 1349, 1240, 130, 1361, 130, 130, 130, 130, 1349, - - 130, 1240, 1361, 1349, 1357, 130, 1361, 2829, 2829, 2829, - 2829, 1369, 1370, 1370, 1370, 1370, 1370, 1281, 1370, 1370, - 1370, 1370, 1370, 1370, 2829, 2829, 2829, 1373, 1374, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 129, 2829, - 1371, 1514, 1522, 1375, 1370, 1370, 1370, 1370, 1370, 1370, - 1526, 1372, 1379, 45, 1534, 1389, 1389, 1390, 1390, 1390, - 1391, 1376, 2829, 1536, 129, 1385, 130, 1387, 1388, 1391, - 1384, 130, 1451, 1487, 130, 1381, 1382, 1337, 1386, 1380, - 1337, 45, 1383, 1390, 1390, 1390, 1390, 1390, 1391, 130, - 130, 130, 130, 130, 130, 1337, 1458, 1337, 1458, 1337, - - 1340, 130, 130, 130, 130, 130, 130, 1345, 1337, 1458, - 1345, 1469, 1458, 130, 130, 130, 130, 130, 130, 1345, - 1469, 1345, 1349, 1357, 1345, 130, 130, 130, 130, 130, - 130, 1469, 1357, 1481, 1469, 1357, 1481, 1486, 1486, 1486, - 1486, 1486, 1391, 1486, 1486, 1486, 1486, 1486, 1486, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 45, 2829, - 1501, 1501, 1502, 1502, 1502, 1503, 1503, 1536, 1540, 1486, - 1486, 1486, 1486, 1486, 1486, 1536, 1488, 1489, 1490, 1540, - 129, 1540, 1545, 1494, 1540, 1495, 1496, 1497, 1545, 45, - 1498, 1502, 1502, 1502, 1502, 1502, 1503, 129, 1545, 1550, - - 1499, 1545, 1550, 129, 1404, 1526, 1550, 1556, 1526, 1550, - 1556, 129, 1526, 1534, 1556, 1564, 130, 130, 130, 130, - 130, 130, 1566, 130, 1569, 1451, 1451, 1573, 130, 1451, - 130, 130, 130, 130, 1573, 130, 130, 1569, 1573, 1580, - 130, 1451, 1573, 130, 130, 130, 1458, 130, 130, 1584, - 1573, 1458, 130, 1584, 130, 130, 130, 130, 1573, 130, - 1580, 1584, 1592, 1458, 130, 1584, 130, 130, 130, 130, - 1469, 130, 1596, 1584, 1469, 1596, 130, 130, 130, 130, - 2829, 2829, 1584, 1592, 1596, 1604, 1605, 1605, 1605, 1605, - 1605, 1503, 1605, 1605, 1605, 1605, 1605, 1605, 2829, 2829, - - 2829, 1610, 1611, 2829, 2829, 2829, 2829, 2829, 129, 2829, - 1503, 2829, 2829, 1503, 1606, 1624, 1503, 1503, 1605, 1605, - 1605, 1605, 1605, 1605, 1614, 1624, 129, 1607, 1608, 1503, - 1503, 1510, 129, 1615, 1503, 1609, 1612, 1613, 45, 1617, - 1618, 1618, 1619, 1619, 1619, 1503, 45, 1624, 1619, 1619, - 1619, 1619, 1619, 1503, 1510, 1635, 1616, 1624, 1510, 1635, - 129, 1510, 1514, 1522, 129, 1510, 1635, 1522, 1647, 1635, - 1522, 1647, 129, 1653, 129, 1656, 1653, 1656, 129, 1656, - 1661, 1656, 1661, 129, 1661, 1666, 1661, 1666, 129, 1666, - 1671, 1522, 1666, 1671, 129, 1522, 1647, 1671, 1679, 1647, - - 1671, 1679, 129, 130, 130, 130, 130, 130, 130, 1685, - 130, 1688, 1688, 130, 1566, 130, 1566, 130, 130, 1569, - 130, 130, 130, 1688, 1569, 130, 1697, 1688, 1569, 130, - 130, 1697, 130, 130, 130, 130, 1569, 130, 1573, 1580, - 130, 1569, 130, 1697, 130, 130, 1580, 130, 1709, 130, - 1697, 1580, 130, 1709, 130, 130, 130, 130, 1580, 130, - 1584, 1592, 130, 1580, 130, 1709, 130, 130, 1592, 130, - 1721, 130, 1709, 1592, 2829, 1721, 1726, 1726, 1726, 1726, - 1726, 1503, 1726, 1726, 1726, 1726, 1726, 1726, 2829, 2829, - 2829, 1731, 1732, 2829, 2829, 2829, 2829, 2829, 1503, 2829, - - 2829, 1624, 129, 1624, 1503, 1727, 1624, 1747, 1726, 1726, - 1726, 1726, 1726, 1726, 45, 1624, 1739, 1739, 1740, 1740, - 1740, 1503, 1728, 1729, 1733, 1734, 1735, 1624, 1736, 2829, - 2829, 1751, 1624, 1624, 1730, 1737, 1503, 1503, 1751, 129, - 1624, 1747, 45, 1738, 1740, 1740, 1740, 1740, 1740, 1503, - 1751, 1759, 1624, 1751, 1635, 1763, 1751, 1635, 1763, 129, - 1751, 1759, 1763, 1771, 1772, 129, 1775, 1775, 129, 1775, - 1780, 1775, 1780, 129, 1780, 1785, 1780, 1785, 129, 1785, - 1790, 1785, 1790, 129, 1635, 1763, 1790, 1796, 1763, 1790, - 1796, 129, 1763, 1771, 1796, 1804, 130, 130, 130, 130, - - 130, 130, 1806, 130, 1806, 1806, 130, 1806, 130, 1812, - 130, 130, 1806, 130, 1688, 130, 1816, 1806, 130, 1688, - 130, 1816, 130, 130, 130, 130, 1806, 130, 1812, 1816, - 1824, 1688, 130, 1816, 130, 130, 130, 130, 1697, 130, - 1828, 1816, 1697, 1828, 130, 130, 130, 130, 130, 130, - 1816, 1824, 1828, 1836, 1697, 1828, 130, 130, 130, 130, - 130, 130, 1709, 1840, 1828, 1709, 1840, 130, 130, 130, - 130, 2829, 2829, 1828, 1836, 1840, 1848, 1849, 1849, 1849, - 1849, 1849, 1503, 1849, 1849, 1849, 1849, 1849, 1849, 2829, - 2829, 1853, 1854, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 1624, 1624, 1851, 1624, 1624, 1860, 1503, 1747, 129, 1849, - 1849, 1849, 1849, 1849, 1849, 1850, 1624, 1624, 1747, 129, - 1852, 1624, 1747, 1747, 1873, 45, 1859, 1861, 1861, 1862, - 1862, 1862, 1503, 1858, 1747, 1855, 1856, 1747, 1873, 129, - 1747, 1751, 45, 1857, 1862, 1862, 1862, 1862, 1862, 1503, - 1759, 129, 1747, 1873, 1759, 1885, 1873, 1759, 1885, 129, - 129, 1891, 1891, 129, 1891, 1896, 1891, 1896, 129, 1896, - 1901, 1896, 1901, 129, 1901, 1906, 1901, 1906, 129, 1906, - 1911, 1759, 1906, 1911, 129, 1759, 1885, 1911, 1919, 1885, - 1911, 1919, 129, 130, 130, 130, 130, 130, 130, 1806, - - 130, 1806, 1806, 1928, 1806, 130, 1928, 130, 130, 130, - 130, 130, 130, 1806, 1806, 1812, 130, 1806, 1928, 130, - 130, 130, 1812, 130, 130, 1939, 1928, 1812, 130, 1939, - 130, 130, 130, 130, 1812, 130, 1816, 1824, 130, 1812, - 130, 1939, 130, 130, 1824, 130, 1951, 130, 1939, 1824, - 130, 1951, 130, 130, 130, 130, 1824, 130, 1828, 1836, - 130, 1824, 130, 1951, 130, 130, 1836, 130, 1963, 130, - 1951, 1836, 2829, 1963, 1968, 1968, 1968, 1968, 1968, 1503, - 1968, 1968, 1968, 1968, 1968, 1968, 2829, 2829, 1969, 1970, - 2829, 2829, 2829, 2829, 2829, 2829, 1624, 1624, 45, 1971, - - 1974, 1974, 1975, 1975, 1975, 1624, 1968, 1968, 1968, 1968, - 1968, 1968, 45, 1747, 1975, 1975, 1975, 1975, 1975, 1624, - 1747, 1979, 1747, 1747, 1972, 1747, 1747, 1979, 129, 1747, - 1979, 1979, 1988, 1747, 1979, 1873, 1992, 1973, 1979, 1873, - 1992, 129, 1979, 1988, 1992, 2000, 1891, 129, 1891, 2004, - 1891, 2004, 129, 2004, 2009, 2004, 2009, 129, 2009, 2014, - 2009, 2014, 129, 2014, 2019, 2014, 2019, 129, 1873, 1992, - 2019, 2025, 1992, 2019, 2025, 129, 1992, 2000, 2025, 2033, - 130, 130, 130, 130, 130, 130, 1806, 1806, 1806, 1928, - 130, 1928, 130, 130, 130, 130, 1928, 130, 2040, 1806, - - 1928, 1928, 130, 2044, 130, 130, 130, 130, 1928, 130, - 1928, 2044, 130, 1928, 130, 2040, 130, 130, 2044, 130, - 2052, 130, 1928, 2044, 130, 1939, 130, 2056, 130, 130, - 2044, 130, 1939, 130, 2056, 130, 130, 2044, 130, 2052, - 130, 2056, 2064, 130, 1939, 130, 2056, 130, 130, 1951, - 130, 2068, 130, 2056, 1951, 130, 2068, 130, 130, 130, - 2078, 2056, 2079, 2064, 2068, 2076, 2077, 2077, 2077, 2077, - 2077, 1624, 2077, 2077, 2077, 2077, 2077, 2077, 2829, 2829, - 45, 2829, 2082, 2082, 2083, 2083, 2083, 1624, 45, 1747, - 2083, 2083, 2083, 2083, 2083, 1624, 1747, 1979, 2077, 2077, - - 2077, 2077, 2077, 2077, 129, 1747, 1747, 1979, 1979, 2089, - 1979, 1979, 2089, 129, 1979, 1979, 1988, 129, 1979, 2089, - 2080, 2081, 1988, 2101, 2089, 1988, 2101, 129, 1891, 1891, - 2004, 129, 2004, 2110, 2004, 2110, 129, 2110, 2115, 2110, - 2115, 129, 2115, 2120, 2115, 2120, 129, 2120, 2125, 1988, - 2120, 2125, 129, 1988, 2101, 2125, 2133, 2101, 2125, 2133, - 129, 130, 130, 130, 130, 130, 130, 1806, 1928, 1928, - 1928, 1928, 2040, 130, 130, 130, 130, 130, 130, 130, - 1928, 1928, 2040, 130, 1928, 2040, 130, 130, 130, 2040, - 130, 130, 2148, 2040, 2040, 130, 2148, 130, 130, 130, - - 130, 2040, 130, 2044, 2052, 130, 2040, 130, 2148, 130, - 130, 2052, 130, 2160, 130, 2148, 2052, 130, 2160, 130, - 130, 130, 130, 2052, 130, 2056, 2064, 130, 2052, 130, - 2160, 130, 130, 2064, 130, 2172, 130, 2160, 2064, 2178, - 2172, 2177, 2177, 2177, 2177, 2177, 1624, 2177, 2177, 2177, - 2177, 2177, 2177, 2179, 2829, 2829, 45, 1979, 2182, 2182, - 2183, 2183, 2183, 1624, 45, 1979, 2183, 2183, 2183, 2183, - 2183, 1624, 1979, 2177, 2177, 2177, 2177, 2177, 2177, 1979, - 2089, 129, 1979, 2089, 2089, 2190, 1979, 2089, 2089, 2194, - 2089, 2089, 2194, 129, 2180, 2089, 2190, 2194, 2202, 1891, - - 2004, 2004, 2181, 2110, 129, 2110, 2207, 2110, 2207, 129, - 2207, 2212, 2207, 2212, 129, 2212, 2217, 2212, 2217, 129, - 2089, 2194, 2217, 2223, 2194, 2217, 2223, 129, 2194, 2202, - 2223, 2231, 130, 130, 130, 130, 130, 130, 1928, 1928, - 2040, 2040, 2235, 2040, 130, 130, 130, 130, 130, 130, - 2040, 2040, 2040, 2235, 130, 2040, 130, 130, 130, 130, - 2235, 130, 2235, 2244, 2040, 2235, 130, 2148, 130, 130, - 130, 130, 2248, 130, 2235, 2148, 2248, 130, 130, 2235, - 130, 130, 130, 2244, 2248, 130, 2256, 2148, 2248, 130, - 130, 2160, 130, 130, 130, 2260, 2248, 130, 2160, 2260, - - 130, 130, 130, 2248, 2270, 2271, 2256, 2260, 2268, 2269, - 2269, 2269, 2269, 2269, 1624, 2269, 2269, 2269, 2269, 2269, - 2269, 2829, 2829, 45, 1979, 2275, 2275, 2276, 2276, 2276, - 1624, 45, 2089, 2276, 2276, 2276, 2276, 2276, 1624, 2089, - 2089, 2269, 2269, 2269, 2269, 2269, 2269, 2089, 2190, 129, - 2089, 2089, 2190, 129, 2089, 2190, 2190, 2287, 2190, 2190, - 2287, 2273, 129, 2829, 2110, 2110, 2274, 2207, 2272, 129, - 2004, 2207, 2296, 2207, 2296, 129, 2296, 2301, 2296, 2301, - 129, 2301, 2306, 2190, 2301, 2306, 129, 2190, 2287, 2306, - 2314, 2287, 2306, 2314, 129, 130, 130, 130, 130, 130, - - 130, 2040, 2040, 2235, 130, 2040, 2040, 130, 130, 130, - 2235, 130, 130, 2235, 2324, 2235, 130, 2235, 2324, 130, - 130, 130, 130, 130, 130, 2235, 2235, 2244, 130, 2235, - 2324, 130, 130, 130, 2244, 130, 130, 2336, 2324, 2244, - 130, 2336, 130, 130, 130, 130, 2244, 130, 2248, 2256, - 130, 2244, 130, 2336, 130, 130, 2256, 130, 2348, 130, - 2336, 2256, 2829, 2348, 2353, 2353, 2353, 2353, 2353, 1624, - 2353, 2353, 2353, 2353, 2353, 2353, 2829, 2829, 45, 2089, - 2356, 2356, 2357, 2357, 2357, 1747, 45, 2089, 2357, 2357, - 2357, 2357, 2357, 1747, 2190, 2190, 2353, 2353, 2353, 2353, - - 2353, 2353, 2361, 2190, 2190, 2190, 2354, 2190, 2361, 129, - 2190, 2355, 2361, 2361, 2370, 2110, 2207, 2207, 2296, 129, - 2296, 2375, 2296, 2375, 129, 2375, 2380, 2375, 2380, 129, - 2190, 2361, 2380, 2386, 2361, 2380, 2386, 129, 2361, 2370, - 2386, 2394, 130, 130, 130, 130, 130, 130, 2235, 2235, - 2235, 2235, 2324, 130, 130, 130, 130, 130, 130, 2235, - 2324, 2324, 2401, 2235, 2324, 130, 130, 130, 130, 130, - 130, 2324, 2405, 2324, 2324, 2405, 130, 130, 130, 130, - 130, 130, 2324, 2401, 2405, 2413, 2324, 2405, 130, 130, - 130, 130, 130, 130, 2336, 2417, 2405, 2336, 2417, 130, - - 130, 130, 130, 2829, 2829, 2405, 2413, 2417, 2425, 2426, - 2426, 2426, 2426, 2426, 1747, 2426, 2426, 2426, 2426, 2426, - 2426, 45, 2190, 2428, 2428, 2429, 2429, 2429, 1747, 45, - 2190, 2429, 2429, 2429, 2429, 2429, 1747, 2427, 2361, 129, - 2190, 2426, 2426, 2426, 2426, 2426, 2426, 2190, 2361, 2361, - 2435, 2361, 2361, 2435, 129, 2207, 2296, 2296, 2375, 129, - 2375, 2444, 2375, 2444, 129, 2444, 2449, 2361, 2444, 2449, - 129, 2361, 2435, 2449, 2457, 2435, 2449, 2457, 129, 130, - 130, 130, 130, 130, 130, 2235, 2324, 2324, 2324, 2324, - 2401, 130, 130, 130, 130, 130, 130, 130, 2324, 2324, - - 2401, 130, 2324, 2401, 130, 130, 130, 2401, 130, 130, - 2472, 2401, 2401, 130, 2472, 130, 130, 130, 130, 2401, - 130, 2405, 2413, 130, 2401, 130, 2472, 130, 130, 2413, - 130, 2484, 130, 2472, 2413, 2829, 2484, 2489, 2489, 2489, - 2489, 2489, 1747, 2489, 2489, 2489, 2489, 2489, 2489, 45, - 2361, 2490, 2490, 2491, 2491, 2491, 1747, 45, 2361, 2491, - 2491, 2491, 2491, 2491, 1747, 2361, 2361, 2435, 129, 2489, - 2489, 2489, 2489, 2489, 2489, 2361, 2435, 2435, 2498, 2296, - 2375, 2375, 2444, 129, 2444, 2503, 2444, 2503, 129, 2361, - 2435, 2503, 2509, 2435, 2503, 2509, 129, 2435, 2498, 2509, - - 2517, 130, 130, 130, 130, 130, 130, 2324, 2324, 2401, - 2401, 2521, 2401, 130, 130, 130, 130, 130, 130, 2401, - 2401, 2401, 2521, 130, 2401, 130, 130, 130, 130, 2521, - 130, 2521, 2530, 2401, 2521, 130, 2472, 130, 130, 130, - 130, 2534, 130, 2521, 2472, 2534, 130, 130, 2521, 130, - 2361, 2435, 2530, 2534, 2435, 2542, 2543, 2543, 2543, 2543, - 2543, 1747, 2543, 2543, 2543, 2543, 2543, 2543, 45, 2435, - 2544, 2544, 2545, 2545, 2545, 1747, 45, 2435, 2545, 2545, - 2545, 2545, 2545, 1747, 2498, 129, 2375, 2444, 2543, 2543, - 2543, 2543, 2543, 2543, 2444, 2503, 129, 2503, 2555, 2435, - - 2503, 2555, 129, 2435, 2498, 2555, 2562, 2498, 2555, 2562, - 129, 130, 130, 130, 130, 130, 130, 2401, 2401, 2521, - 130, 2401, 2401, 130, 130, 130, 2521, 130, 130, 2521, - 2572, 2521, 130, 2521, 2572, 130, 130, 130, 130, 130, - 130, 2521, 2521, 2530, 130, 2521, 2572, 130, 130, 130, - 2530, 130, 130, 2584, 2572, 2530, 2435, 2584, 2589, 2589, - 2589, 2589, 2589, 1747, 2589, 2589, 2589, 2589, 2589, 2589, - 45, 2435, 2590, 2590, 2591, 2591, 2591, 1979, 45, 2498, - 2591, 2591, 2591, 2591, 2591, 1979, 2498, 2595, 2444, 2503, - 2589, 2589, 2589, 2589, 2589, 2589, 2503, 2555, 129, 2498, - - 2555, 2600, 2498, 2555, 2600, 129, 2498, 2595, 2600, 2608, - 130, 130, 130, 130, 130, 130, 2521, 2521, 2521, 2521, - 2572, 130, 130, 130, 130, 130, 130, 2521, 2572, 2572, - 2615, 2521, 2572, 130, 130, 130, 130, 130, 130, 2572, - 2619, 2572, 2572, 2619, 130, 130, 130, 130, 2498, 2498, - 2572, 2615, 2619, 2627, 2628, 2628, 2628, 2628, 2628, 1979, - 2628, 2628, 2628, 2628, 2628, 2628, 45, 2595, 2629, 2629, - 2630, 2630, 2630, 1979, 45, 129, 2630, 2630, 2630, 2630, - 2630, 1979, 2503, 2555, 2555, 2600, 2628, 2628, 2628, 2628, - 2628, 2628, 129, 2498, 2595, 2600, 2639, 2595, 2600, 2639, - - 129, 130, 130, 130, 130, 130, 130, 2521, 2572, 2572, - 2572, 2572, 2615, 130, 130, 130, 130, 130, 130, 130, - 2572, 2572, 2615, 130, 2572, 2615, 130, 130, 130, 2615, - 130, 130, 2654, 2615, 2615, 2595, 2654, 2659, 2659, 2659, - 2659, 2659, 1979, 2659, 2659, 2659, 2659, 2659, 2659, 45, - 2595, 2660, 2660, 2661, 2661, 2661, 1979, 45, 2664, 2661, - 2661, 2661, 2661, 2661, 1979, 2555, 2600, 2595, 2600, 2659, - 2659, 2659, 2659, 2659, 2659, 2639, 129, 2595, 2664, 2639, - 2671, 130, 130, 130, 130, 130, 130, 2572, 2572, 2615, - 2615, 2675, 2615, 130, 130, 130, 130, 130, 130, 2615, - - 2615, 2615, 2675, 130, 2615, 130, 130, 2595, 2664, 2675, - 129, 2675, 2684, 2685, 2685, 2685, 2685, 2685, 1979, 2685, - 2685, 2685, 2685, 2685, 2685, 45, 2600, 2686, 2686, 2687, - 2687, 2687, 1979, 45, 2664, 2687, 2687, 2687, 2687, 2687, - 1979, 2639, 2664, 2639, 2671, 2685, 2685, 2685, 2685, 2685, - 2685, 129, 130, 130, 130, 130, 130, 130, 2615, 2615, - 2675, 130, 2615, 2615, 130, 130, 130, 2675, 130, 130, - 2675, 2700, 2675, 130, 2675, 2700, 2705, 2705, 2705, 2705, - 2705, 2664, 2705, 2705, 2705, 2705, 2705, 2705, 45, 2710, - 2706, 2706, 2707, 2707, 2707, 2089, 45, 2639, 2707, 2707, - - 2707, 2707, 2707, 2089, 2664, 2710, 2671, 2713, 2705, 2705, - 2705, 2705, 2705, 2705, 130, 130, 130, 130, 130, 130, - 2675, 2675, 2675, 2675, 2700, 130, 130, 130, 130, 2664, - 2710, 2675, 2700, 2700, 2721, 2722, 2722, 2722, 2722, 2722, - 2089, 2722, 2722, 2722, 2722, 2722, 2722, 45, 129, 2723, - 2723, 2724, 2724, 2724, 2089, 45, 2710, 2724, 2724, 2724, - 2724, 2724, 2089, 2671, 2713, 130, 2710, 2722, 2722, 2722, - 2722, 2722, 2722, 2727, 2728, 2728, 2728, 2728, 130, 130, - 130, 130, 130, 130, 2675, 2700, 2700, 2700, 2700, 2721, - 2734, 2734, 2734, 2734, 2734, 2710, 2734, 2734, 2734, 2734, - - 2734, 2734, 45, 2713, 2735, 2735, 2736, 2736, 2736, 2089, - 45, 2710, 2736, 2736, 2736, 2736, 2736, 2089, 2713, 1296, - 129, 1437, 2734, 2734, 2734, 2734, 2734, 2734, 2727, 2728, - 2728, 2728, 2728, 2728, 2728, 2728, 2728, 2728, 130, 130, - 130, 130, 1432, 1296, 2700, 2700, 2721, 2721, 2741, 2741, - 2741, 2741, 2741, 1437, 2741, 2741, 2741, 2741, 2741, 2741, - 45, 1432, 2742, 2742, 2743, 2743, 2743, 2089, 45, 129, - 2743, 2743, 2743, 2743, 2743, 2089, 1432, 1427, 1432, 1427, - 2741, 2741, 2741, 2741, 2741, 2741, 130, 130, 129, 1427, - 1422, 1427, 2721, 2721, 2745, 2745, 2745, 2745, 2745, 1422, - - 2745, 2745, 2745, 2745, 2745, 2745, 45, 129, 2746, 2746, - 2747, 2747, 2747, 2190, 45, 1422, 2747, 2747, 2747, 2747, - 2747, 2190, 1422, 129, 1416, 1296, 2745, 2745, 2745, 2745, - 2745, 2745, 130, 1404, 1416, 1296, 1404, 1285, 2721, 2748, - 2748, 2748, 2748, 2748, 2190, 2748, 2748, 2748, 2748, 2748, - 2748, 45, 129, 2749, 2749, 2750, 2750, 2750, 2190, 45, - 1296, 2750, 2750, 2750, 2750, 2750, 2190, 1289, 1285, 129, - 1404, 2748, 2748, 2748, 2748, 2748, 2748, 2751, 2751, 2751, - 2751, 2751, 1285, 2751, 2751, 2751, 2751, 2751, 2751, 45, - 1395, 2752, 2752, 2753, 2753, 2753, 2190, 45, 1404, 2753, - - 2753, 2753, 2753, 2753, 2190, 1285, 1395, 129, 1285, 2751, - 2751, 2751, 2751, 2751, 2751, 2754, 2754, 2754, 2754, 2754, - 1281, 2754, 2754, 2754, 2754, 2754, 2754, 45, 1281, 2755, - 2755, 2756, 2756, 2756, 2190, 45, 129, 2756, 2756, 2756, - 2756, 2756, 2190, 1395, 1395, 129, 2829, 2754, 2754, 2754, - 2754, 2754, 2754, 2757, 2757, 2757, 2757, 2757, 2829, 2757, - 2757, 2757, 2757, 2757, 2757, 45, 2829, 2758, 2758, 2759, - 2759, 2759, 2361, 45, 1378, 2759, 2759, 2759, 2759, 2759, - 2361, 1377, 130, 130, 130, 2757, 2757, 2757, 2757, 2757, - 2757, 2760, 2760, 2760, 2760, 2760, 2361, 2760, 2760, 2760, - - 2760, 2760, 2760, 45, 130, 2761, 2761, 2762, 2762, 2762, - 2361, 45, 1335, 2762, 2762, 2762, 2762, 2762, 2361, 1327, - 1308, 1300, 129, 2760, 2760, 2760, 2760, 2760, 2760, 2763, - 2763, 2763, 2763, 2763, 1327, 2763, 2763, 2763, 2763, 2763, - 2763, 45, 1321, 2764, 2764, 2765, 2765, 2765, 2361, 45, - 1300, 2765, 2765, 2765, 2765, 2765, 2361, 1327, 1321, 1300, - 1185, 2763, 2763, 2763, 2763, 2763, 2763, 2766, 2766, 2766, - 2766, 2766, 129, 2766, 2766, 2766, 2766, 2766, 2766, 45, - 1321, 2767, 2767, 2768, 2768, 2768, 2361, 45, 1316, 2768, - 2768, 2768, 2768, 2768, 2361, 1321, 1316, 129, 1316, 2766, - - 2766, 2766, 2766, 2766, 2766, 2769, 2769, 2769, 2769, 2769, - 1311, 2769, 2769, 2769, 2769, 2769, 2769, 45, 1316, 2770, - 2770, 2771, 2771, 2771, 2435, 45, 1311, 2771, 2771, 2771, - 2771, 2771, 2435, 129, 1311, 1311, 129, 2769, 2769, 2769, - 2769, 2769, 2769, 2772, 2772, 2772, 2772, 2772, 2435, 2772, - 2772, 2772, 2772, 2772, 2772, 45, 1308, 2773, 2773, 2774, - 2774, 2774, 2435, 45, 1300, 2774, 2774, 2774, 2774, 2774, - 2435, 1296, 1289, 129, 1300, 2772, 2772, 2772, 2772, 2772, - 2772, 2775, 2775, 2775, 2775, 2775, 1185, 2775, 2775, 2775, - 2775, 2775, 2775, 45, 1289, 2776, 2776, 2777, 2777, 2777, - - 2435, 45, 1300, 2777, 2777, 2777, 2777, 2777, 2435, 1185, - 1289, 1177, 1296, 2775, 2775, 2775, 2775, 2775, 2775, 2778, - 2778, 2778, 2778, 2778, 1289, 2778, 2778, 2778, 2778, 2778, - 2778, 45, 1285, 2779, 2779, 2780, 2780, 2780, 2435, 45, - 129, 2780, 2780, 2780, 2780, 2780, 2435, 1289, 1177, 1289, - 1177, 2778, 2778, 2778, 2778, 2778, 2778, 2781, 2781, 2781, - 2781, 2781, 1177, 2781, 2781, 2781, 2781, 2781, 2781, 45, - 1285, 2782, 2782, 2783, 2783, 2783, 2498, 45, 129, 2783, - 2783, 2783, 2783, 2783, 2498, 2829, 1265, 1264, 2829, 2781, - 2781, 2781, 2781, 2781, 2781, 2784, 2784, 2784, 2784, 2784, - - 2498, 2784, 2784, 2784, 2784, 2784, 2784, 45, 130, 2785, - 2785, 2786, 2786, 2786, 2498, 45, 130, 2786, 2786, 2786, - 2786, 2786, 2498, 130, 130, 130, 130, 2784, 2784, 2784, - 2784, 2784, 2784, 2787, 2787, 2787, 2787, 2787, 129, 2787, - 2787, 2787, 2787, 2787, 2787, 45, 1222, 2788, 2788, 2789, - 2789, 2789, 2498, 45, 1214, 2789, 2789, 2789, 2789, 2789, - 2498, 1196, 1222, 1214, 1196, 2787, 2787, 2787, 2787, 2787, - 2787, 2790, 2790, 2790, 2790, 2790, 1084, 2790, 2790, 2790, - 2790, 2790, 2790, 45, 129, 2791, 2791, 2792, 2792, 2792, - 2498, 45, 1214, 2792, 2792, 2792, 2792, 2792, 2498, 1209, - - 1084, 1214, 1209, 2790, 2790, 2790, 2790, 2790, 2790, 2793, - 2793, 2793, 2793, 2793, 129, 2793, 2793, 2793, 2793, 2793, - 2793, 45, 1209, 2794, 2794, 2795, 2795, 2795, 2595, 45, - 1204, 2795, 2795, 2795, 2795, 2795, 2595, 1209, 1204, 129, - 1204, 2793, 2793, 2793, 2793, 2793, 2793, 2796, 2796, 2796, - 2796, 2796, 2595, 2796, 2796, 2796, 2796, 2796, 2796, 45, - 1204, 2797, 2797, 2798, 2798, 2798, 2595, 45, 129, 2798, - 2798, 2798, 2798, 2798, 2595, 1201, 129, 1196, 1084, 2796, - 2796, 2796, 2796, 2796, 2796, 2799, 2799, 2799, 2799, 2799, - 1185, 2799, 2799, 2799, 2799, 2799, 2799, 45, 1196, 2800, - - 2800, 2801, 2801, 2801, 2595, 45, 1084, 2801, 2801, 2801, - 2801, 2801, 2595, 1185, 1075, 129, 1084, 2799, 2799, 2799, - 2799, 2799, 2799, 2802, 2802, 2802, 2802, 2802, 1079, 2802, - 2802, 2802, 2802, 2802, 2802, 45, 1075, 2803, 2803, 2804, - 2804, 2804, 2595, 45, 129, 2804, 2804, 2804, 2804, 2804, - 2595, 1185, 1075, 1185, 1075, 2802, 2802, 2802, 2802, 2802, - 2802, 2805, 2805, 2805, 2805, 2805, 129, 2805, 2805, 2805, - 2805, 2805, 2805, 45, 1075, 2806, 2806, 2807, 2807, 2807, - 2664, 45, 1075, 2807, 2807, 2807, 2807, 2807, 2664, 129, - 1160, 1159, 1158, 2805, 2805, 2805, 2805, 2805, 2805, 2808, - - 2808, 2808, 2808, 2808, 2664, 2808, 2808, 2808, 2808, 2808, - 2808, 45, 1157, 2809, 2809, 2810, 2810, 2810, 2664, 45, - 2829, 2810, 2810, 2810, 2810, 2810, 2664, 2829, 130, 130, - 130, 2808, 2808, 2808, 2808, 2808, 2808, 2811, 2811, 2811, - 2811, 2811, 1120, 2811, 2811, 2811, 2811, 2811, 2811, 45, - 1112, 2812, 2812, 2813, 2813, 2813, 2664, 45, 1096, 2813, - 2813, 2813, 2813, 2813, 2664, 1088, 129, 1112, 1106, 2811, - 2811, 2811, 2811, 2811, 2811, 2814, 2814, 2814, 2814, 2814, - 1088, 2814, 2814, 2814, 2814, 2814, 2814, 45, 1112, 2815, - 2815, 2816, 2816, 2816, 2664, 45, 1106, 2816, 2816, 2816, - - 2816, 2816, 2664, 1088, 984, 129, 1106, 2814, 2814, 2814, - 2814, 2814, 2814, 2817, 2817, 2817, 2817, 2817, 1101, 2817, - 2817, 2817, 2817, 2817, 2817, 45, 1106, 2818, 2818, 2819, - 2819, 2819, 2710, 45, 1101, 2819, 2819, 2819, 2819, 2819, - 2710, 129, 1101, 1098, 1101, 2817, 2817, 2817, 2817, 2817, - 2817, 2820, 2820, 2820, 2820, 2820, 2710, 2820, 2820, 2820, - 2820, 2820, 2820, 45, 129, 2821, 2821, 2822, 2822, 2822, - 2710, 45, 1098, 2822, 2822, 2822, 2822, 2822, 2710, 1096, - 1088, 1084, 1079, 2820, 2820, 2820, 2820, 2820, 2820, 2823, - 2823, 2823, 2823, 2823, 129, 2823, 2823, 2823, 2823, 2823, - - 2823, 45, 1088, 2824, 2824, 2825, 2825, 2825, 2710, 45, - 984, 2825, 2825, 2825, 2825, 2825, 2710, 1079, 1088, 984, - 1079, 2823, 2823, 2823, 2823, 2823, 2823, 2826, 2826, 2826, - 2826, 2826, 1084, 2826, 2826, 2826, 2826, 2826, 2826, 45, - 1079, 2827, 2827, 2828, 2828, 2828, 2710, 45, 129, 2828, - 2828, 2828, 2828, 2828, 2710, 1079, 1079, 129, 2829, 2826, - 2826, 2826, 2826, 2826, 2826, 51, 51, 51, 51, 51, - 1058, 51, 51, 51, 51, 51, 51, 45, 1057, 2827, - 2827, 2828, 2828, 2828, 45, 1056, 2828, 2828, 2828, 2828, - 2828, 1055, 2829, 130, 130, 130, 130, 51, 51, 51, - - 51, 51, 51, 41, 41, 41, 41, 41, 41, 41, - 41, 44, 130, 44, 44, 44, 44, 44, 44, 49, - 129, 49, 49, 51, 1016, 51, 51, 51, 51, 127, - 1008, 127, 127, 128, 128, 131, 131, 214, 993, 214, - 214, 215, 215, 216, 216, 220, 220, 220, 301, 1016, - 301, 301, 302, 302, 303, 303, 305, 305, 306, 306, - 307, 307, 307, 309, 309, 378, 1008, 378, 378, 379, - 379, 380, 380, 382, 382, 383, 383, 384, 384, 385, - 385, 387, 387, 387, 389, 389, 390, 390, 390, 462, - 993, 462, 462, 463, 463, 464, 464, 466, 466, 467, - - 467, 468, 468, 469, 469, 471, 471, 472, 472, 473, - 473, 474, 474, 474, 476, 476, 477, 477, 477, 479, - 479, 479, 480, 480, 546, 891, 546, 546, 547, 547, - 548, 548, 550, 550, 552, 552, 553, 553, 554, 554, - 556, 556, 557, 557, 558, 558, 559, 559, 560, 560, - 561, 561, 563, 563, 563, 565, 565, 566, 566, 566, - 568, 568, 568, 569, 569, 570, 570, 570, 571, 571, - 571, 635, 129, 635, 635, 636, 636, 637, 637, 639, - 639, 640, 640, 641, 641, 643, 643, 644, 644, 646, - 646, 647, 647, 648, 648, 649, 649, 650, 650, 651, - - 651, 653, 653, 654, 654, 655, 655, 656, 656, 657, - 657, 657, 659, 659, 660, 660, 660, 661, 661, 661, - 662, 662, 663, 663, 663, 664, 664, 664, 666, 666, - 666, 667, 667, 667, 668, 668, 51, 1008, 51, 51, - 51, 717, 1003, 717, 717, 718, 718, 719, 719, 721, - 721, 722, 722, 723, 723, 724, 724, 635, 635, 727, - 727, 728, 728, 730, 730, 731, 731, 732, 732, 733, - 733, 734, 734, 736, 736, 737, 737, 738, 738, 739, - 739, 740, 740, 741, 741, 742, 742, 744, 744, 744, - 746, 746, 747, 747, 747, 749, 749, 749, 750, 750, - - 750, 751, 751, 751, 753, 753, 753, 754, 754, 754, - 755, 755, 756, 756, 756, 757, 757, 757, 758, 758, - 758, 51, 891, 51, 51, 51, 801, 1008, 801, 801, - 802, 802, 803, 803, 804, 804, 805, 805, 806, 806, - 807, 807, 809, 809, 810, 810, 811, 811, 812, 812, - 813, 813, 815, 815, 816, 816, 817, 817, 818, 818, - 820, 820, 821, 821, 822, 822, 823, 823, 824, 824, - 825, 825, 826, 826, 828, 828, 829, 829, 830, 830, - 831, 831, 832, 832, 832, 834, 834, 835, 835, 835, - 837, 837, 837, 838, 838, 744, 744, 744, 839, 839, - - 839, 840, 840, 840, 841, 841, 842, 842, 842, 843, - 843, 843, 844, 844, 844, 846, 846, 846, 847, 847, - 847, 848, 848, 848, 849, 849, 51, 1003, 51, 51, - 51, 888, 129, 888, 888, 889, 889, 890, 890, 892, - 892, 893, 893, 894, 894, 896, 896, 897, 897, 898, - 898, 899, 899, 900, 900, 901, 901, 903, 903, 905, - 905, 906, 906, 907, 907, 908, 908, 809, 809, 910, - 910, 911, 911, 912, 912, 913, 913, 914, 914, 916, - 916, 917, 917, 918, 918, 919, 919, 920, 920, 921, - 921, 922, 922, 924, 924, 924, 926, 926, 927, 927, - - 927, 929, 929, 929, 930, 930, 931, 931, 931, 932, - 932, 932, 934, 934, 934, 935, 935, 935, 936, 936, - 936, 938, 938, 938, 939, 939, 939, 940, 940, 940, - 941, 941, 942, 942, 942, 943, 943, 943, 944, 944, - 944, 51, 1003, 51, 51, 51, 981, 999, 981, 981, - 982, 982, 983, 983, 985, 985, 986, 986, 888, 888, - 987, 987, 988, 988, 989, 989, 990, 990, 991, 991, - 992, 992, 994, 994, 995, 995, 996, 996, 997, 997, - 998, 998, 1000, 1000, 1001, 1001, 1002, 1002, 896, 896, - 1004, 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1009, 1009, - - 1010, 1010, 1011, 1011, 1012, 1012, 1013, 1013, 1014, 1014, - 1015, 1015, 1017, 1017, 1018, 1018, 1019, 1019, 1020, 1020, - 1021, 1021, 1021, 1023, 1023, 1024, 1024, 1024, 1025, 1025, - 1025, 1026, 1026, 1027, 1027, 1027, 1028, 1028, 1028, 1030, - 1030, 1030, 1031, 1031, 1031, 1032, 1032, 1033, 1033, 1033, - 1034, 1034, 1034, 1035, 1035, 1035, 1036, 1036, 1037, 1037, - 1037, 1038, 1038, 1038, 1039, 1039, 1039, 1041, 1041, 1041, - 1042, 1042, 1042, 1043, 1043, 1043, 1044, 1044, 51, 1003, - 51, 51, 51, 1076, 999, 1076, 1076, 1077, 1077, 1078, - 1078, 1080, 1080, 1081, 1081, 1082, 1082, 1083, 1083, 1085, - - 1085, 1086, 1086, 1087, 1087, 1089, 1089, 1090, 1090, 1091, - 1091, 1092, 1092, 1093, 1093, 1094, 1094, 1095, 1095, 1097, - 1097, 1099, 1099, 1100, 1100, 987, 987, 1102, 1102, 1103, - 1103, 1104, 1104, 1105, 1105, 995, 995, 1107, 1107, 1108, - 1108, 1109, 1109, 1110, 1110, 1111, 1111, 1113, 1113, 1114, - 1114, 1115, 1115, 1116, 1116, 1117, 1117, 1118, 1118, 1119, - 1119, 1121, 1121, 1121, 1123, 1123, 1124, 1124, 1124, 1126, - 1126, 1126, 1127, 1127, 1127, 1128, 1128, 1128, 1130, 1130, - 1130, 1131, 1131, 1131, 1132, 1132, 1133, 1133, 1133, 1134, - 1134, 1134, 1135, 1135, 1135, 1137, 1137, 1137, 1138, 1138, - - 1138, 1139, 1139, 1139, 1141, 1141, 1141, 1142, 1142, 1142, - 1143, 1143, 1143, 1144, 1144, 1145, 1145, 1145, 1146, 1146, - 1146, 1147, 1147, 1147, 51, 129, 51, 51, 51, 1178, - 999, 1178, 1178, 1179, 1179, 1180, 1180, 1181, 1181, 1182, - 1182, 1183, 1183, 1184, 1184, 1186, 1186, 1187, 1187, 1188, - 1188, 1189, 1189, 1190, 1190, 1191, 1191, 1192, 1192, 1193, - 1193, 1194, 1194, 1195, 1195, 1197, 1197, 1198, 1198, 1199, - 1199, 1200, 1200, 981, 981, 1202, 1202, 1203, 1203, 1205, - 1205, 1206, 1206, 1207, 1207, 1208, 1208, 1090, 1090, 1210, - 1210, 1211, 1211, 1212, 1212, 1213, 1213, 1215, 1215, 1216, - - 1216, 1217, 1217, 1218, 1218, 1219, 1219, 1220, 1220, 1221, - 1221, 1223, 1223, 1224, 1224, 1225, 1225, 1226, 1226, 1227, - 1227, 1227, 1229, 1229, 1230, 1230, 1230, 1232, 1232, 1232, - 1233, 1233, 1121, 1121, 1121, 1234, 1234, 1234, 1235, 1235, - 1235, 1236, 1236, 1237, 1237, 1237, 1238, 1238, 1238, 1239, - 1239, 1239, 1241, 1241, 1241, 1242, 1242, 1242, 1243, 1243, - 1243, 1244, 1244, 1245, 1245, 1245, 1246, 1246, 1246, 1247, - 1247, 1247, 1248, 1248, 1249, 1249, 1249, 1250, 1250, 1250, - 1251, 1251, 1251, 1253, 1253, 1253, 1254, 1254, 1254, 1255, - 1255, 1255, 1256, 1256, 51, 129, 51, 51, 51, 1282, - - 993, 1282, 1282, 1283, 1283, 1284, 1284, 1286, 1286, 1287, - 1287, 1288, 1288, 1290, 1290, 1291, 1291, 1292, 1292, 1293, - 1293, 1294, 1294, 1295, 1295, 1297, 1297, 1298, 1298, 1299, - 1299, 1301, 1301, 1302, 1302, 1303, 1303, 1304, 1304, 1305, - 1305, 1306, 1306, 1307, 1307, 1309, 1309, 1310, 1310, 1312, - 1312, 1313, 1313, 1314, 1314, 1315, 1315, 1190, 1190, 1317, - 1317, 1318, 1318, 1319, 1319, 1320, 1320, 1198, 1198, 1322, - 1322, 1323, 1323, 1324, 1324, 1325, 1325, 1326, 1326, 1328, - 1328, 1329, 1329, 1330, 1330, 1331, 1331, 1332, 1332, 1333, - 1333, 1334, 1334, 1336, 1336, 1336, 1338, 1338, 1339, 1339, - - 1339, 1341, 1341, 1341, 1342, 1342, 1343, 1343, 1343, 1344, - 1344, 1344, 1346, 1346, 1346, 1347, 1347, 1347, 1348, 1348, - 1348, 1350, 1350, 1350, 1351, 1351, 1351, 1352, 1352, 1352, - 1353, 1353, 1354, 1354, 1354, 1355, 1355, 1355, 1356, 1356, - 1356, 1358, 1358, 1358, 1359, 1359, 1359, 1360, 1360, 1360, - 1362, 1362, 1362, 1363, 1363, 1363, 1364, 1364, 1364, 1365, - 1365, 1366, 1366, 1366, 1367, 1367, 1367, 1368, 1368, 1368, - 51, 891, 51, 51, 51, 1392, 984, 1392, 1392, 1393, - 1393, 1394, 1394, 1396, 1396, 1397, 1397, 1282, 1282, 1398, - 1398, 1399, 1399, 1400, 1400, 1401, 1401, 1402, 1402, 1403, - - 1403, 1405, 1405, 1406, 1406, 1407, 1407, 1408, 1408, 1409, - 1409, 1410, 1410, 1411, 1411, 1412, 1412, 1413, 1413, 1414, - 1414, 1415, 1415, 1417, 1417, 1418, 1418, 1419, 1419, 1420, - 1420, 1421, 1421, 1423, 1423, 1424, 1424, 1425, 1425, 1426, - 1426, 1186, 1186, 1428, 1428, 1429, 1429, 1430, 1430, 1431, - 1431, 1302, 1302, 1433, 1433, 1434, 1434, 1435, 1435, 1436, - 1436, 1438, 1438, 1439, 1439, 1440, 1440, 1441, 1441, 1442, - 1442, 1443, 1443, 1444, 1444, 1446, 1446, 1447, 1447, 1448, - 1448, 1449, 1449, 1450, 1450, 1450, 1452, 1452, 1453, 1453, - 1453, 1454, 1454, 1454, 1455, 1455, 1456, 1456, 1456, 1457, - - 1457, 1457, 1459, 1459, 1459, 1460, 1460, 1460, 1461, 1461, - 1462, 1462, 1462, 1463, 1463, 1463, 1464, 1464, 1464, 1465, - 1465, 1466, 1466, 1466, 1467, 1467, 1467, 1468, 1468, 1468, - 1470, 1470, 1470, 1471, 1471, 1471, 1472, 1472, 1472, 1473, - 1473, 1474, 1474, 1474, 1475, 1475, 1475, 1476, 1476, 1476, - 1477, 1477, 1478, 1478, 1478, 1479, 1479, 1479, 1480, 1480, - 1480, 1482, 1482, 1482, 1483, 1483, 1483, 1484, 1484, 1484, - 1485, 1485, 51, 993, 51, 51, 51, 1504, 891, 1504, - 1504, 1393, 1393, 1505, 1505, 1506, 1506, 1507, 1507, 1508, - 1508, 1509, 1509, 1511, 1511, 1512, 1512, 1513, 1513, 1515, - - 1515, 1516, 1516, 1517, 1517, 1518, 1518, 1519, 1519, 1520, - 1520, 1521, 1521, 1523, 1523, 1524, 1524, 1525, 1525, 1527, - 1527, 1528, 1528, 1529, 1529, 1530, 1530, 1531, 1531, 1532, - 1532, 1533, 1533, 1535, 1535, 1537, 1537, 1538, 1538, 1539, - 1539, 1290, 1290, 1541, 1541, 1542, 1542, 1543, 1543, 1544, - 1544, 1410, 1410, 1546, 1546, 1547, 1547, 1548, 1548, 1549, - 1549, 1418, 1418, 1551, 1551, 1552, 1552, 1553, 1553, 1554, - 1554, 1555, 1555, 1557, 1557, 1558, 1558, 1559, 1559, 1560, - 1560, 1561, 1561, 1562, 1562, 1563, 1563, 1565, 1565, 1565, - 1567, 1567, 1568, 1568, 1568, 1570, 1570, 1570, 1571, 1571, - - 1571, 1572, 1572, 1572, 1574, 1574, 1574, 1575, 1575, 1575, - 1576, 1576, 1577, 1577, 1577, 1578, 1578, 1578, 1579, 1579, - 1579, 1581, 1581, 1581, 1582, 1582, 1582, 1583, 1583, 1583, - 1585, 1585, 1585, 1586, 1586, 1586, 1587, 1587, 1587, 1588, - 1588, 1589, 1589, 1589, 1590, 1590, 1590, 1591, 1591, 1591, - 1593, 1593, 1593, 1594, 1594, 1594, 1595, 1595, 1595, 1597, - 1597, 1597, 1598, 1598, 1598, 1599, 1599, 1599, 1600, 1600, - 1601, 1601, 1601, 1602, 1602, 1602, 1603, 1603, 1603, 51, - 984, 51, 51, 51, 1620, 129, 1620, 1620, 1507, 1507, - 1621, 1621, 1622, 1622, 1623, 1623, 1625, 1625, 1626, 1626, - - 1627, 1627, 1628, 1628, 1629, 1629, 1630, 1630, 1631, 1631, - 1632, 1632, 1633, 1633, 1634, 1634, 1636, 1636, 1637, 1637, - 1638, 1638, 1639, 1639, 1640, 1640, 1641, 1641, 1642, 1642, - 1643, 1643, 1644, 1644, 1645, 1645, 1646, 1646, 1648, 1648, - 1649, 1649, 1650, 1650, 1651, 1651, 1652, 1652, 1654, 1654, - 1655, 1655, 1398, 1398, 1657, 1657, 1658, 1658, 1659, 1659, - 1660, 1660, 1406, 1406, 1662, 1662, 1663, 1663, 1664, 1664, - 1665, 1665, 1528, 1528, 1667, 1667, 1668, 1668, 1669, 1669, - 1670, 1670, 1672, 1672, 1673, 1673, 1674, 1674, 1675, 1675, - 1676, 1676, 1677, 1677, 1678, 1678, 1680, 1680, 1681, 1681, - - 1682, 1682, 1683, 1683, 1684, 1684, 1684, 1686, 1686, 1687, - 1687, 1687, 1689, 1689, 1689, 1690, 1690, 1565, 1565, 1565, - 1691, 1691, 1691, 1692, 1692, 1692, 1693, 1693, 1694, 1694, - 1694, 1695, 1695, 1695, 1696, 1696, 1696, 1698, 1698, 1698, - 1699, 1699, 1699, 1700, 1700, 1700, 1701, 1701, 1702, 1702, - 1702, 1703, 1703, 1703, 1704, 1704, 1704, 1705, 1705, 1706, - 1706, 1706, 1707, 1707, 1707, 1708, 1708, 1708, 1710, 1710, - 1710, 1711, 1711, 1711, 1712, 1712, 1712, 1713, 1713, 1714, - 1714, 1714, 1715, 1715, 1715, 1716, 1716, 1716, 1717, 1717, - 1718, 1718, 1718, 1719, 1719, 1719, 1720, 1720, 1720, 1722, - - 1722, 1722, 1723, 1723, 1723, 1724, 1724, 1724, 1725, 1725, - 51, 891, 51, 51, 51, 1741, 887, 1741, 1741, 1742, - 1742, 1743, 1743, 1627, 1627, 1744, 1744, 1745, 1745, 1746, - 1746, 1748, 1748, 1749, 1749, 1750, 1750, 1752, 1752, 1753, - 1753, 1754, 1754, 1755, 1755, 1756, 1756, 1757, 1757, 1758, - 1758, 1760, 1760, 1761, 1761, 1762, 1762, 1764, 1764, 1765, - 1765, 1766, 1766, 1767, 1767, 1768, 1768, 1769, 1769, 1770, - 1770, 1392, 1392, 1773, 1773, 1774, 1774, 1776, 1776, 1777, - 1777, 1778, 1778, 1779, 1779, 1516, 1516, 1781, 1781, 1782, - 1782, 1783, 1783, 1784, 1784, 1641, 1641, 1786, 1786, 1787, - - 1787, 1788, 1788, 1789, 1789, 1649, 1649, 1791, 1791, 1792, - 1792, 1761, 1761, 1793, 1793, 1794, 1794, 1795, 1795, 1797, - 1797, 1798, 1798, 1799, 1799, 1800, 1800, 1769, 1769, 1801, - 1801, 1802, 1802, 1803, 1803, 1805, 1805, 1805, 1686, 1686, - 1807, 1807, 1807, 1808, 1808, 1808, 1809, 1809, 1810, 1810, - 1810, 1811, 1811, 1811, 1813, 1813, 1813, 1814, 1814, 1814, - 1815, 1815, 1815, 1817, 1817, 1817, 1818, 1818, 1818, 1819, - 1819, 1819, 1820, 1820, 1821, 1821, 1821, 1822, 1822, 1822, - 1823, 1823, 1823, 1825, 1825, 1825, 1826, 1826, 1826, 1827, - 1827, 1827, 1829, 1829, 1829, 1830, 1830, 1830, 1831, 1831, - - 1831, 1832, 1832, 1833, 1833, 1833, 1834, 1834, 1834, 1835, - 1835, 1835, 1837, 1837, 1837, 1838, 1838, 1838, 1839, 1839, - 1839, 1841, 1841, 1841, 1842, 1842, 1842, 1843, 1843, 1843, - 1844, 1844, 1845, 1845, 1845, 1846, 1846, 1846, 1847, 1847, - 1847, 51, 887, 51, 51, 51, 1742, 129, 1742, 1742, - 1744, 1744, 1863, 1863, 1864, 1864, 1865, 1865, 1866, 1866, - 1867, 1867, 1868, 1868, 1869, 1869, 1870, 1870, 1871, 1871, - 1872, 1872, 1874, 1874, 1875, 1875, 1876, 1876, 1877, 1877, - 1878, 1878, 1879, 1879, 1880, 1880, 1881, 1881, 1882, 1882, - 1883, 1883, 1884, 1884, 1886, 1886, 1887, 1887, 1888, 1888, - - 1889, 1889, 1773, 1773, 1890, 1890, 1892, 1892, 1893, 1893, - 1894, 1894, 1895, 1895, 1629, 1629, 1897, 1897, 1898, 1898, - 1899, 1899, 1900, 1900, 1637, 1637, 1902, 1902, 1903, 1903, - 1904, 1904, 1905, 1905, 1765, 1765, 1907, 1907, 1908, 1908, - 1909, 1909, 1910, 1910, 1912, 1912, 1913, 1913, 1914, 1914, - 1915, 1915, 1883, 1883, 1916, 1916, 1917, 1917, 1918, 1918, - 1920, 1920, 1921, 1921, 1922, 1922, 1923, 1923, 1924, 1924, - 1924, 1809, 1809, 1925, 1925, 1925, 1926, 1926, 1926, 1927, - 1927, 1927, 1929, 1929, 1929, 1930, 1930, 1930, 1931, 1931, - 1932, 1932, 1932, 1933, 1933, 1933, 1934, 1934, 1934, 1935, - - 1935, 1936, 1936, 1936, 1937, 1937, 1937, 1938, 1938, 1938, - 1940, 1940, 1940, 1941, 1941, 1941, 1942, 1942, 1942, 1943, - 1943, 1944, 1944, 1944, 1945, 1945, 1945, 1946, 1946, 1946, - 1947, 1947, 1948, 1948, 1948, 1949, 1949, 1949, 1950, 1950, - 1950, 1952, 1952, 1952, 1953, 1953, 1953, 1954, 1954, 1954, - 1955, 1955, 1956, 1956, 1956, 1957, 1957, 1957, 1958, 1958, - 1958, 1959, 1959, 1960, 1960, 1960, 1961, 1961, 1961, 1962, - 1962, 1962, 1964, 1964, 1964, 1965, 1965, 1965, 1966, 1966, - 1966, 1967, 1967, 51, 984, 51, 51, 51, 1744, 984, - 1744, 1744, 1865, 1865, 1863, 1863, 1976, 1976, 1977, 1977, - - 1978, 1978, 1980, 1980, 1981, 1981, 1982, 1982, 1983, 1983, - 1984, 1984, 1985, 1985, 1986, 1986, 1987, 1987, 1989, 1989, - 1990, 1990, 1991, 1991, 1993, 1993, 1994, 1994, 1995, 1995, - 1996, 1996, 1997, 1997, 1998, 1998, 1999, 1999, 2001, 2001, - 1893, 1893, 2002, 2002, 2003, 2003, 1625, 1625, 2005, 2005, - 2006, 2006, 2007, 2007, 2008, 2008, 1753, 1753, 2010, 2010, - 2011, 2011, 2012, 2012, 2013, 2013, 1879, 1879, 2015, 2015, - 2016, 2016, 2017, 2017, 2018, 2018, 1887, 1887, 2020, 2020, - 2021, 2021, 1990, 1990, 2022, 2022, 2023, 2023, 2024, 2024, - 2026, 2026, 2027, 2027, 2028, 2028, 2029, 2029, 1998, 1998, - - 2030, 2030, 2031, 2031, 2032, 2032, 2034, 2034, 2034, 2035, - 2035, 2035, 2036, 2036, 2036, 1931, 1931, 2037, 2037, 2037, - 2038, 2038, 2038, 2039, 2039, 2039, 2041, 2041, 2041, 2042, - 2042, 2042, 2043, 2043, 2043, 2045, 2045, 2045, 2046, 2046, - 2046, 2047, 2047, 2047, 2048, 2048, 2049, 2049, 2049, 2050, - 2050, 2050, 2051, 2051, 2051, 2053, 2053, 2053, 2054, 2054, - 2054, 2055, 2055, 2055, 2057, 2057, 2057, 2058, 2058, 2058, - 2059, 2059, 2059, 2060, 2060, 2061, 2061, 2061, 2062, 2062, - 2062, 2063, 2063, 2063, 2065, 2065, 2065, 2066, 2066, 2066, - 2067, 2067, 2067, 2069, 2069, 2069, 2070, 2070, 2070, 2071, - - 2071, 2071, 2072, 2072, 2073, 2073, 2073, 2074, 2074, 2074, - 2075, 2075, 2075, 51, 129, 51, 51, 51, 1864, 2829, - 1864, 1864, 1981, 1981, 2084, 2084, 2085, 2085, 1984, 1984, - 1977, 1977, 2086, 2086, 2087, 2087, 2088, 2088, 2090, 2090, - 2091, 2091, 2092, 2092, 2093, 2093, 2094, 2094, 2095, 2095, - 2096, 2096, 2097, 2097, 2098, 2098, 2099, 2099, 2100, 2100, - 2102, 2102, 2103, 2103, 2104, 2104, 2105, 2105, 2106, 2106, - 1742, 1742, 2107, 2107, 2006, 2006, 2108, 2108, 2109, 2109, - 1868, 1868, 2111, 2111, 2112, 2112, 2113, 2113, 2114, 2114, - 1875, 1875, 2116, 2116, 2117, 2117, 2118, 2118, 2119, 2119, - - 1994, 1994, 2121, 2121, 2122, 2122, 2123, 2123, 2124, 2124, - 2126, 2126, 2127, 2127, 2128, 2128, 2129, 2129, 2099, 2099, - 2130, 2130, 2131, 2131, 2132, 2132, 2134, 2134, 2135, 2135, - 2136, 2136, 2137, 2137, 2035, 2035, 2035, 2037, 2037, 2037, - 2138, 2138, 2138, 2139, 2139, 2139, 2140, 2140, 2140, 2141, - 2141, 2141, 2142, 2142, 2143, 2143, 2143, 2144, 2144, 2144, - 2145, 2145, 2145, 2146, 2146, 2146, 2147, 2147, 2147, 2149, - 2149, 2149, 2150, 2150, 2150, 2151, 2151, 2151, 2152, 2152, - 2153, 2153, 2153, 2154, 2154, 2154, 2155, 2155, 2155, 2156, - 2156, 2157, 2157, 2157, 2158, 2158, 2158, 2159, 2159, 2159, - - 2161, 2161, 2161, 2162, 2162, 2162, 2163, 2163, 2163, 2164, - 2164, 2165, 2165, 2165, 2166, 2166, 2166, 2167, 2167, 2167, - 2168, 2168, 2169, 2169, 2169, 2170, 2170, 2170, 2171, 2171, - 2171, 2173, 2173, 2173, 2174, 2174, 2174, 2175, 2175, 2175, - 2176, 2176, 51, 2829, 51, 51, 51, 1863, 962, 1863, - 1863, 2086, 2086, 2184, 2184, 2090, 2090, 2185, 2185, 2186, - 2186, 2093, 2093, 2187, 2187, 2188, 2188, 2189, 2189, 2191, - 2191, 2192, 2192, 2193, 2193, 2195, 2195, 2196, 2196, 2197, - 2197, 2198, 2198, 2199, 2199, 2200, 2200, 2201, 2201, 1742, - 1742, 2203, 2203, 1865, 1865, 2204, 2204, 2112, 2112, 2205, - - 2205, 2206, 2206, 1982, 1982, 2208, 2208, 2209, 2209, 2210, - 2210, 2211, 2211, 2095, 2095, 2213, 2213, 2214, 2214, 2215, - 2215, 2216, 2216, 2103, 2103, 2218, 2218, 2219, 2219, 2192, - 2192, 2220, 2220, 2221, 2221, 2222, 2222, 2224, 2224, 2225, - 2225, 2226, 2226, 2227, 2227, 2200, 2200, 2228, 2228, 2229, - 2229, 2230, 2230, 2140, 2140, 2140, 2138, 2138, 2138, 2232, - 2232, 2232, 2233, 2233, 2233, 2234, 2234, 2234, 2236, 2236, - 2236, 2237, 2237, 2237, 2238, 2238, 2238, 2239, 2239, 2239, - 2240, 2240, 2241, 2241, 2241, 2242, 2242, 2242, 2243, 2243, - 2243, 2245, 2245, 2245, 2246, 2246, 2246, 2247, 2247, 2247, - - 2249, 2249, 2249, 2250, 2250, 2250, 2251, 2251, 2251, 2252, - 2252, 2253, 2253, 2253, 2254, 2254, 2254, 2255, 2255, 2255, - 2257, 2257, 2257, 2258, 2258, 2258, 2259, 2259, 2259, 2261, - 2261, 2261, 2262, 2262, 2262, 2263, 2263, 2263, 2264, 2264, - 2265, 2265, 2265, 2266, 2266, 2266, 2267, 2267, 2267, 51, - 961, 51, 51, 51, 1865, 960, 1865, 1865, 2185, 2185, - 2187, 2187, 2277, 2277, 2278, 2278, 2279, 2279, 2280, 2280, - 2281, 2281, 2282, 2282, 2283, 2283, 2284, 2284, 2285, 2285, - 2286, 2286, 2288, 2288, 2289, 2289, 2290, 2290, 2291, 2291, - 2292, 2292, 2084, 2084, 2293, 2293, 2209, 2209, 2294, 2294, - - 2295, 2295, 2091, 2091, 2297, 2297, 2298, 2298, 2299, 2299, - 2300, 2300, 2196, 2196, 2302, 2302, 2303, 2303, 2304, 2304, - 2305, 2305, 2307, 2307, 2308, 2308, 2309, 2309, 2310, 2310, - 2311, 2311, 2312, 2312, 2313, 2313, 2315, 2315, 2316, 2316, - 2317, 2317, 2318, 2318, 2237, 2237, 2237, 2319, 2319, 2319, - 2320, 2320, 2320, 2240, 2240, 2233, 2233, 2233, 2321, 2321, - 2321, 2322, 2322, 2322, 2323, 2323, 2323, 2325, 2325, 2325, - 2326, 2326, 2326, 2327, 2327, 2327, 2328, 2328, 2329, 2329, - 2329, 2330, 2330, 2330, 2331, 2331, 2331, 2332, 2332, 2333, - 2333, 2333, 2334, 2334, 2334, 2335, 2335, 2335, 2337, 2337, - - 2337, 2338, 2338, 2338, 2339, 2339, 2339, 2340, 2340, 2341, - 2341, 2341, 2342, 2342, 2342, 2343, 2343, 2343, 2344, 2344, - 2345, 2345, 2345, 2346, 2346, 2346, 2347, 2347, 2347, 2349, - 2349, 2349, 2350, 2350, 2350, 2351, 2351, 2351, 2352, 2352, - 51, 959, 51, 51, 51, 1976, 958, 1976, 1976, 2279, - 2279, 2277, 2277, 2358, 2358, 2359, 2359, 2360, 2360, 2362, - 2362, 2363, 2363, 2364, 2364, 2365, 2365, 2366, 2366, 2367, - 2367, 2368, 2368, 2369, 2369, 2084, 2084, 2371, 2371, 2185, - 2185, 2372, 2372, 2298, 2298, 2373, 2373, 2374, 2374, 2282, - 2282, 2376, 2376, 2377, 2377, 2378, 2378, 2379, 2379, 2289, - - 2289, 2381, 2381, 2382, 2382, 2383, 2383, 2384, 2384, 2385, - 2385, 2387, 2387, 2388, 2388, 2389, 2389, 2390, 2390, 2391, - 2391, 2392, 2392, 2393, 2393, 2321, 2321, 2321, 2395, 2395, - 2395, 2325, 2325, 2325, 2396, 2396, 2396, 2397, 2397, 2397, - 2328, 2328, 2398, 2398, 2398, 2399, 2399, 2399, 2400, 2400, - 2400, 2402, 2402, 2402, 2403, 2403, 2403, 2404, 2404, 2404, - 2406, 2406, 2406, 2407, 2407, 2407, 2408, 2408, 2408, 2409, - 2409, 2410, 2410, 2410, 2411, 2411, 2411, 2412, 2412, 2412, - 2414, 2414, 2414, 2415, 2415, 2415, 2416, 2416, 2416, 2418, - 2418, 2418, 2419, 2419, 2419, 2420, 2420, 2420, 2421, 2421, - - 2422, 2422, 2422, 2423, 2423, 2423, 2424, 2424, 2424, 51, - 957, 51, 51, 51, 1981, 2829, 1981, 1981, 2363, 2363, - 2430, 2430, 2431, 2431, 2366, 2366, 2359, 2359, 2432, 2432, - 2433, 2433, 2434, 2434, 2436, 2436, 2437, 2437, 2438, 2438, - 2439, 2439, 2185, 2185, 2440, 2440, 2279, 2279, 2441, 2441, - 2377, 2377, 2442, 2442, 2443, 2443, 2364, 2364, 2445, 2445, - 2446, 2446, 2447, 2447, 2448, 2448, 2450, 2450, 2451, 2451, - 2452, 2452, 2453, 2453, 2454, 2454, 2455, 2455, 2456, 2456, - 2458, 2458, 2459, 2459, 2460, 2460, 2461, 2461, 2396, 2396, - 2396, 2398, 2398, 2398, 2462, 2462, 2462, 2463, 2463, 2463, - - 2464, 2464, 2464, 2465, 2465, 2465, 2466, 2466, 2467, 2467, - 2467, 2468, 2468, 2468, 2469, 2469, 2469, 2470, 2470, 2470, - 2471, 2471, 2471, 2473, 2473, 2473, 2474, 2474, 2474, 2475, - 2475, 2475, 2476, 2476, 2477, 2477, 2477, 2478, 2478, 2478, - 2479, 2479, 2479, 2480, 2480, 2481, 2481, 2481, 2482, 2482, - 2482, 2483, 2483, 2483, 2485, 2485, 2485, 2486, 2486, 2486, - 2487, 2487, 2487, 2488, 2488, 51, 130, 51, 51, 51, - 1977, 130, 1977, 1977, 2432, 2432, 2492, 2492, 2436, 2436, - 2493, 2493, 2494, 2494, 2439, 2439, 2495, 2495, 2496, 2496, - 2497, 2497, 2279, 2279, 2499, 2499, 2430, 2430, 2500, 2500, - - 2446, 2446, 2501, 2501, 2502, 2502, 2437, 2437, 2504, 2504, - 2505, 2505, 2506, 2506, 2507, 2507, 2508, 2508, 2510, 2510, - 2511, 2511, 2512, 2512, 2513, 2513, 2514, 2514, 2515, 2515, - 2516, 2516, 2464, 2464, 2464, 2462, 2462, 2462, 2518, 2518, - 2518, 2519, 2519, 2519, 2520, 2520, 2520, 2522, 2522, 2522, - 2523, 2523, 2523, 2524, 2524, 2524, 2525, 2525, 2525, 2526, - 2526, 2527, 2527, 2527, 2528, 2528, 2528, 2529, 2529, 2529, - 2531, 2531, 2531, 2532, 2532, 2532, 2533, 2533, 2533, 2535, - 2535, 2535, 2536, 2536, 2536, 2537, 2537, 2537, 2538, 2538, - 2539, 2539, 2539, 2540, 2540, 2540, 2541, 2541, 2541, 51, - - 130, 51, 51, 51, 2084, 923, 2084, 2084, 2493, 2493, - 2495, 2495, 2546, 2546, 2547, 2547, 2548, 2548, 2549, 2549, - 2550, 2550, 2430, 2430, 2551, 2551, 2552, 2552, 2505, 2505, - 2553, 2553, 2554, 2554, 2556, 2556, 2557, 2557, 2558, 2558, - 2559, 2559, 2560, 2560, 2561, 2561, 2563, 2563, 2564, 2564, - 2565, 2565, 2566, 2566, 2523, 2523, 2523, 2567, 2567, 2567, - 2568, 2568, 2568, 2526, 2526, 2519, 2519, 2519, 2569, 2569, - 2569, 2570, 2570, 2570, 2571, 2571, 2571, 2573, 2573, 2573, - 2574, 2574, 2574, 2575, 2575, 2575, 2576, 2576, 2577, 2577, - 2577, 2578, 2578, 2578, 2579, 2579, 2579, 2580, 2580, 2581, - - 2581, 2581, 2582, 2582, 2582, 2583, 2583, 2583, 2585, 2585, - 2585, 2586, 2586, 2586, 2587, 2587, 2587, 2588, 2588, 51, - 915, 51, 51, 51, 2086, 902, 2086, 2086, 2548, 2548, - 2546, 2546, 2592, 2592, 2593, 2593, 2594, 2594, 2493, 2493, - 2596, 2596, 2597, 2597, 2558, 2558, 2598, 2598, 2599, 2599, - 2601, 2601, 2602, 2602, 2603, 2603, 2604, 2604, 2605, 2605, - 2606, 2606, 2607, 2607, 2569, 2569, 2569, 2609, 2609, 2609, - 2573, 2573, 2573, 2610, 2610, 2610, 2611, 2611, 2611, 2576, - 2576, 2612, 2612, 2612, 2613, 2613, 2613, 2614, 2614, 2614, + 4, 5, 6, 7, 5, 4, 8, 9, 9, 4, + 10, 11, 11, 12, 12, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 23, 30, 31, 32, 33, 23, 23, + 23, 23, 4, 34, 35, 35, 35, 35, 36, 23, + 23, 23, 23, 23, 23, 37, 38, 39, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 40, 41, 2864, + 1329, 41, 44, 44, 44, 44, 44, 46, 2864, 47, + 47, 48, 48, 48, 49, 46, 1450, 48, 48, 48, + 48, 48, 49, 53, 53, 53, 53, 53, 49, 53, + + 53, 54, 53, 53, 53, 41, 361, 53, 41, 60, + 55, 64, 2864, 66, 2864, 65, 2864, 133, 176, 129, + 2864, 53, 692, 51, 61, 53, 53, 56, 57, 53, + 53, 62, 361, 371, 372, 55, 67, 63, 2864, 2864, + 68, 78, 69, 2864, 176, 2864, 2864, 82, 361, 58, + 53, 53, 53, 53, 53, 49, 53, 53, 53, 53, + 53, 53, 70, 2864, 2864, 2864, 176, 2864, 2864, 83, + 76, 2864, 105, 71, 106, 2864, 2864, 84, 813, 79, + 72, 77, 59, 53, 53, 53, 53, 53, 73, 2864, + 2864, 699, 689, 2864, 2864, 74, 80, 71, 2864, 90, + + 87, 1471, 81, 85, 75, 173, 2864, 2864, 86, 2864, + 718, 88, 2864, 91, 2864, 95, 89, 99, 2864, 2864, + 55, 113, 2864, 96, 2864, 90, 2864, 114, 695, 92, + 2864, 218, 107, 93, 116, 53, 108, 2864, 91, 100, + 2864, 95, 99, 99, 117, 55, 109, 110, 96, 94, + 97, 111, 101, 2864, 102, 71, 112, 103, 2864, 58, + 98, 138, 53, 104, 2864, 2864, 90, 115, 99, 2864, + 95, 144, 146, 118, 2864, 119, 2864, 147, 96, 71, + 91, 2864, 2864, 148, 133, 2864, 75, 138, 104, 142, + 226, 2864, 90, 2864, 137, 151, 95, 44, 44, 44, + + 44, 44, 150, 96, 2864, 91, 125, 125, 126, 126, + 126, 138, 2864, 2864, 145, 98, 94, 120, 133, 308, + 137, 104, 121, 133, 316, 2864, 248, 2864, 58, 399, + 122, 123, 732, 2864, 2864, 46, 75, 127, 127, 128, + 128, 128, 129, 120, 138, 2864, 2864, 104, 121, 1479, + 248, 693, 1197, 58, 248, 122, 123, 2864, 2864, 46, + 75, 128, 128, 128, 128, 128, 129, 124, 135, 135, + 135, 135, 135, 129, 135, 135, 135, 135, 135, 135, + 2864, 2864, 2864, 2864, 2864, 156, 2864, 153, 149, 152, + 155, 2864, 2864, 2864, 154, 2864, 2864, 2864, 2864, 166, + + 135, 135, 135, 135, 135, 135, 2864, 2864, 2864, 2864, + 167, 156, 2864, 2864, 2864, 175, 155, 168, 158, 2864, + 2864, 2864, 159, 161, 2864, 160, 2864, 2864, 698, 1450, + 156, 2864, 2864, 2864, 2864, 156, 162, 2864, 163, 165, + 172, 175, 2864, 2864, 2864, 164, 2864, 177, 170, 2864, + 169, 174, 171, 183, 2864, 180, 176, 2864, 2864, 2864, + 182, 2864, 2864, 176, 2864, 2864, 2864, 2864, 179, 186, + 2864, 177, 2864, 178, 2864, 2864, 2864, 2864, 178, 183, + 2864, 2864, 176, 2864, 185, 2864, 182, 2864, 388, 2864, + 2864, 2864, 2864, 186, 198, 1406, 190, 178, 183, 2864, + + 2864, 191, 186, 184, 181, 183, 187, 2864, 185, 192, + 2864, 188, 2864, 2864, 202, 194, 189, 186, 2864, 199, + 195, 200, 193, 206, 196, 2864, 197, 2864, 201, 203, + 208, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 204, + 2864, 2864, 2864, 205, 210, 207, 183, 2864, 2864, 209, + 2864, 2864, 2864, 2864, 178, 475, 2864, 215, 2864, 125, + 125, 126, 126, 126, 133, 2864, 1471, 818, 211, 1076, + 402, 215, 183, 126, 126, 126, 126, 126, 178, 710, + 712, 2864, 2864, 2864, 2864, 178, 2864, 2864, 2864, 212, + 46, 183, 216, 216, 217, 217, 217, 218, 2864, 138, + + 229, 176, 230, 46, 213, 217, 217, 217, 217, 217, + 218, 223, 224, 224, 224, 224, 186, 2864, 178, 2864, + 2864, 243, 2864, 242, 229, 138, 230, 176, 2864, 2864, + 213, 240, 2864, 230, 791, 230, 234, 2864, 2864, 2864, + 186, 2864, 178, 228, 2864, 2864, 2864, 1479, 236, 214, + 227, 227, 227, 227, 227, 218, 227, 227, 227, 227, + 227, 227, 2864, 2864, 239, 2864, 237, 246, 2864, 247, + 2864, 2864, 241, 2864, 2864, 245, 2864, 2864, 244, 2864, + 2864, 2864, 227, 227, 227, 227, 227, 227, 2864, 2864, + 2864, 2864, 2864, 247, 2864, 2864, 2864, 248, 249, 255, + + 256, 2864, 2864, 251, 2864, 252, 250, 2864, 2864, 260, + 264, 254, 258, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 257, 253, 261, 269, 2864, 2864, 1300, 2864, 2864, 268, + 259, 2864, 2864, 2864, 132, 133, 2864, 2864, 262, 2864, + 2864, 271, 2864, 263, 2864, 2864, 266, 2864, 269, 133, + 133, 265, 2864, 2864, 268, 2864, 272, 270, 2864, 2864, + 269, 267, 277, 269, 273, 271, 2864, 271, 2864, 269, + 2864, 275, 2864, 2864, 271, 2864, 2864, 281, 278, 2864, + 283, 270, 2864, 2864, 2864, 269, 277, 2864, 2864, 2864, + 271, 271, 276, 2864, 277, 2864, 2864, 2864, 2864, 2864, + + 274, 284, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 279, + 286, 2864, 291, 2864, 2864, 289, 276, 2864, 298, 280, + 282, 285, 2864, 2864, 277, 2864, 2864, 2864, 288, 297, + 2864, 2864, 292, 2864, 2864, 290, 287, 295, 294, 2864, + 2864, 300, 296, 428, 2864, 299, 293, 2864, 2864, 248, + 2864, 883, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 803, 697, 2864, 269, 2864, 2864, 429, 301, 2864, 2864, + 302, 277, 820, 248, 430, 248, 2864, 248, 304, 304, + 305, 305, 305, 223, 224, 224, 224, 224, 269, 224, + 224, 224, 224, 224, 302, 277, 2864, 2864, 2864, 248, + + 691, 133, 46, 303, 306, 306, 307, 307, 307, 308, + 46, 320, 307, 307, 307, 307, 307, 308, 318, 318, + 318, 318, 318, 308, 318, 318, 318, 318, 318, 318, + 2864, 319, 321, 2864, 324, 2864, 320, 2864, 325, 2864, + 2864, 2864, 2864, 2864, 333, 2864, 2864, 2864, 2864, 321, + 318, 318, 318, 318, 318, 318, 2864, 321, 2864, 2864, + 2864, 323, 2864, 2864, 2864, 2864, 326, 133, 133, 882, + 321, 332, 2864, 327, 328, 336, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 331, 2864, 2864, 2864, 334, 2864, 330, + 2864, 2864, 2864, 2864, 2864, 339, 2864, 2864, 344, 338, + + 335, 2864, 340, 345, 341, 2864, 349, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 348, 342, 346, 2864, + 347, 2864, 2864, 2864, 343, 352, 350, 2864, 2864, 2864, + 2864, 2864, 351, 2864, 2864, 356, 2864, 2864, 357, 2864, + 2864, 2864, 357, 353, 2864, 2864, 2864, 355, 2864, 2864, + 2864, 2864, 2864, 1294, 360, 2864, 2864, 133, 2864, 2864, + 2864, 356, 2864, 2864, 357, 2864, 354, 362, 357, 2864, + 2864, 2864, 2864, 2864, 358, 2864, 2864, 2864, 2864, 700, + 360, 365, 2864, 2864, 359, 357, 367, 2864, 357, 2864, + 2864, 2864, 357, 363, 727, 2864, 361, 2864, 364, 2864, + + 2864, 2864, 2864, 2864, 369, 366, 2864, 373, 368, 2864, + 370, 2864, 2864, 375, 2864, 374, 2864, 378, 376, 2864, + 2864, 431, 2864, 379, 380, 357, 2864, 2864, 2864, 2864, + 377, 2864, 2864, 2864, 2864, 357, 450, 321, 2864, 2864, + 2864, 2864, 133, 361, 432, 381, 562, 321, 489, 2864, + 133, 357, 433, 133, 2864, 1526, 492, 382, 133, 492, + 450, 357, 321, 2864, 581, 2864, 1527, 133, 450, 361, + 2864, 404, 321, 584, 385, 383, 304, 304, 305, 305, + 305, 2864, 2864, 2864, 385, 384, 305, 305, 305, 305, + 305, 46, 406, 386, 386, 387, 387, 387, 388, 46, + + 2864, 387, 387, 387, 387, 387, 388, 403, 403, 403, + 403, 403, 388, 403, 403, 403, 403, 403, 403, 2864, + 2864, 2864, 2864, 2864, 408, 405, 2864, 2864, 2864, 2864, + 415, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 403, + 403, 403, 403, 403, 403, 418, 409, 410, 419, 2864, + 411, 2864, 2864, 2864, 1301, 2864, 2864, 2864, 420, 407, + 414, 2864, 425, 2864, 412, 992, 413, 438, 416, 2864, + 2864, 2864, 2864, 2864, 2864, 417, 2864, 2864, 2864, 2864, + 421, 2864, 2864, 423, 2864, 2864, 2864, 2864, 2864, 2864, + 426, 427, 434, 424, 436, 435, 2864, 446, 444, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 445, 2864, 439, 440, 442, 443, 2864, + 2864, 2864, 2864, 446, 449, 2864, 2864, 2864, 2864, 2864, + 2864, 454, 2864, 441, 2864, 2864, 2864, 2864, 2864, 445, + 447, 2864, 448, 2864, 452, 446, 2864, 2864, 449, 457, + 2864, 2864, 2864, 451, 2864, 453, 450, 455, 725, 458, + 2864, 446, 2864, 463, 456, 459, 876, 446, 2864, 2864, + 462, 2864, 2864, 2864, 466, 653, 2864, 2864, 2864, 2864, + 2864, 2864, 464, 465, 469, 2864, 2864, 2864, 2864, 2864, + 467, 446, 2864, 446, 2864, 471, 471, 472, 472, 472, + + 896, 2864, 2864, 2864, 2864, 2864, 46, 450, 473, 473, + 474, 474, 474, 475, 2864, 446, 2864, 446, 2864, 46, + 2864, 474, 474, 474, 474, 474, 475, 2864, 2864, 2864, + 2864, 450, 2864, 496, 498, 2864, 2864, 2864, 2864, 470, + 495, 495, 495, 495, 495, 475, 495, 495, 495, 495, + 495, 495, 2864, 500, 2864, 2864, 503, 497, 501, 505, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 507, 2864, + 508, 504, 495, 495, 495, 495, 495, 495, 2864, 2864, + 502, 506, 510, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 511, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 133, 133, 513, 2864, 509, 538, 584, 584, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 522, 2864, 527, 524, + 523, 2864, 514, 2864, 532, 530, 529, 534, 525, 2864, + 538, 528, 533, 2864, 2864, 2864, 2864, 538, 531, 2864, + 535, 515, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 534, 536, 537, 2864, 2864, 533, 539, 2864, + 2864, 2864, 2864, 541, 2864, 2864, 547, 534, 2864, 2864, + 2864, 553, 534, 2864, 2864, 543, 2864, 540, 537, 2864, + 2864, 548, 2864, 554, 2864, 538, 133, 2864, 2864, 546, + 2864, 542, 589, 544, 559, 471, 471, 472, 472, 472, + + 2864, 552, 545, 555, 132, 551, 557, 2864, 133, 534, + 2864, 2864, 1538, 2864, 677, 2864, 2864, 133, 538, 2864, + 2864, 2864, 133, 581, 2864, 2864, 788, 2864, 581, 729, + 2864, 2864, 2864, 2864, 534, 559, 472, 472, 472, 472, + 472, 46, 538, 560, 560, 561, 561, 561, 562, 558, + 46, 2864, 561, 561, 561, 561, 561, 562, 590, 590, + 590, 590, 590, 562, 590, 590, 590, 590, 590, 590, + 593, 591, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 599, 2864, 2864, 1538, 600, 2864, + 590, 590, 590, 590, 590, 590, 2864, 598, 2864, 601, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 594, 621, 596, + 2864, 595, 602, 2864, 2864, 2864, 603, 132, 597, 2864, + 607, 133, 604, 2864, 2864, 2864, 2864, 581, 2864, 2864, + 2864, 2864, 2864, 606, 616, 620, 2864, 2864, 614, 2864, + 2864, 619, 615, 617, 623, 2864, 624, 2864, 629, 2864, + 628, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 622, + 625, 2864, 630, 626, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 627, 629, 2864, 628, 2864, 2864, 2864, + 2864, 2864, 2864, 133, 2864, 2864, 133, 2864, 631, 684, + 2864, 635, 581, 2864, 629, 645, 629, 133, 2864, 636, + + 634, 133, 2864, 684, 632, 133, 633, 766, 629, 2864, + 2864, 769, 642, 643, 648, 1534, 814, 714, 2864, 2864, + 2864, 637, 2864, 2864, 638, 639, 2864, 646, 2864, 644, + 2864, 2864, 2864, 2864, 629, 2864, 2864, 694, 2864, 649, + 649, 650, 650, 650, 46, 701, 651, 651, 652, 652, + 652, 653, 2864, 46, 629, 652, 652, 652, 652, 652, + 653, 688, 688, 688, 688, 688, 653, 688, 688, 688, + 688, 688, 688, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 721, 2864, 2864, 2864, 2864, 2864, 649, 649, + 650, 650, 650, 688, 688, 688, 688, 688, 688, 715, + + 696, 720, 2864, 2864, 2864, 2864, 711, 721, 2864, 1538, + 133, 737, 722, 2864, 709, 726, 677, 702, 1545, 721, + 724, 713, 716, 719, 717, 133, 720, 723, 133, 1538, + 730, 677, 782, 728, 773, 731, 734, 897, 721, 650, + 650, 650, 650, 650, 46, 2864, 735, 735, 736, 736, + 736, 737, 46, 2864, 736, 736, 736, 736, 736, 737, + 133, 133, 133, 133, 133, 2864, 677, 773, 769, 773, + 780, 781, 781, 781, 781, 781, 737, 781, 781, 781, + 781, 781, 781, 2864, 785, 784, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 786, 2864, 2864, 2864, + + 2864, 2864, 2864, 781, 781, 781, 781, 781, 781, 2864, + 2864, 811, 2864, 2864, 2864, 2864, 793, 2864, 810, 792, + 2864, 823, 133, 802, 1429, 787, 804, 912, 856, 807, + 789, 790, 794, 805, 801, 806, 2864, 874, 1549, 812, + 808, 809, 811, 815, 816, 819, 817, 893, 46, 811, + 821, 821, 822, 822, 822, 823, 46, 877, 822, 822, + 822, 822, 822, 823, 133, 133, 133, 133, 133, 133, + 859, 859, 766, 766, 769, 859, 133, 133, 133, 133, + 133, 875, 769, 868, 859, 769, 868, 873, 873, 873, + 873, 873, 823, 873, 873, 873, 873, 873, 873, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 873, + 873, 873, 873, 873, 873, 2864, 2864, 2864, 2864, 133, + 133, 879, 880, 881, 2864, 950, 953, 894, 1538, 878, + 895, 898, 1429, 885, 903, 892, 899, 884, 905, 904, + 974, 2864, 900, 1004, 1407, 133, 901, 902, 906, 908, + 907, 953, 973, 1549, 132, 980, 46, 909, 910, 910, + 911, 911, 911, 912, 46, 2864, 911, 911, 911, 911, + 911, 912, 133, 133, 133, 133, 133, 133, 953, 958, + 953, 859, 962, 953, 133, 133, 133, 133, 133, 133, + + 859, 962, 953, 958, 962, 970, 971, 971, 971, 971, + 971, 912, 971, 971, 971, 971, 971, 971, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 972, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 971, 971, + 971, 971, 971, 971, 2864, 982, 2864, 2864, 2864, 2864, + 2864, 133, 133, 989, 1001, 1007, 981, 1049, 950, 991, + 977, 1538, 990, 975, 978, 979, 993, 994, 976, 998, + 1545, 1549, 1557, 995, 996, 997, 1000, 999, 1002, 1095, + 1073, 1429, 1549, 2864, 1438, 46, 1003, 1005, 1005, 1006, + 1006, 1006, 1007, 46, 1075, 1006, 1006, 1006, 1006, 1006, + + 1007, 133, 133, 133, 133, 133, 133, 950, 950, 1056, + 950, 1056, 950, 133, 133, 133, 133, 133, 133, 953, + 958, 950, 1056, 958, 1067, 133, 133, 133, 1077, 2864, + 2864, 1056, 958, 1067, 1072, 1072, 1072, 1072, 1072, 1007, + 1072, 1072, 1072, 1072, 1072, 1072, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 1072, 1072, 1072, 1072, + 1072, 1072, 1074, 2864, 2864, 2864, 2864, 133, 1082, 1097, + 1088, 1104, 1100, 1151, 1090, 1078, 1079, 1080, 1091, 1081, + 1087, 1099, 1180, 1096, 1089, 1193, 1092, 1098, 1093, 1561, + + 1201, 1094, 1101, 46, 1179, 1102, 1102, 1103, 1103, 1103, + 1104, 46, 1191, 1103, 1103, 1103, 1103, 1103, 1104, 133, + 133, 133, 133, 133, 133, 1154, 1049, 1049, 1158, 1049, + 1158, 133, 133, 133, 133, 133, 133, 1154, 1158, 1165, + 1049, 1158, 1056, 133, 133, 133, 133, 133, 133, 1169, + 1158, 1056, 1169, 1158, 1165, 133, 133, 2864, 2864, 2864, + 2864, 1169, 1177, 1178, 1178, 1178, 1178, 1178, 1104, 1178, + 1178, 1178, 1178, 1178, 1178, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 1192, 2864, 1182, 1183, 2864, 2864, 2864, + 2864, 2864, 2864, 1184, 2864, 1178, 1178, 1178, 1178, 1178, + + 1178, 1181, 46, 1196, 1206, 1206, 1207, 1207, 1207, 1208, + 2864, 2864, 1199, 1549, 1185, 1186, 1438, 1208, 1314, 1198, + 1203, 1522, 1194, 1195, 1205, 1204, 1561, 1200, 1291, 1292, + 132, 46, 1202, 1207, 1207, 1207, 1207, 1207, 1208, 133, + 133, 133, 133, 133, 133, 1259, 1262, 1262, 1151, 1151, + 1154, 133, 133, 133, 133, 133, 133, 1262, 1154, 1271, + 1262, 1154, 1271, 133, 133, 133, 133, 133, 133, 1154, + 1158, 1165, 1154, 1271, 1165, 133, 133, 133, 133, 2864, + 2864, 1283, 1271, 1165, 1283, 1288, 1288, 1288, 1288, 1288, + 1208, 1288, 1288, 1288, 1288, 1288, 1288, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 133, 2864, 2864, 2864, 2864, 2864, 1370, 1288, 1288, 1288, + 1288, 1288, 1288, 1290, 1289, 1304, 133, 1295, 133, 1549, + 2864, 1557, 1373, 1303, 1373, 1299, 1302, 1308, 133, 1298, + 1561, 1293, 133, 1306, 1373, 1305, 1311, 133, 1378, 1408, + 1309, 133, 1525, 1373, 1412, 1307, 1405, 1262, 46, 1310, + 1312, 1312, 1313, 1313, 1313, 1314, 46, 1417, 1313, 1313, + 1313, 1313, 1313, 1314, 133, 133, 133, 133, 133, 133, + 1382, 1373, 1262, 1382, 1373, 1378, 133, 133, 133, 133, + 133, 133, 1382, 1390, 1262, 1382, 1271, 1394, 133, 133, + + 133, 133, 133, 133, 1382, 1271, 1394, 1382, 1390, 1394, + 133, 2864, 2864, 2864, 2864, 2864, 1402, 1403, 1403, 1403, + 1403, 1403, 1314, 1403, 1403, 1403, 1403, 1403, 1403, 2864, + 2864, 2864, 2864, 2864, 2864, 46, 2864, 1423, 1423, 1424, + 1424, 1424, 1425, 1425, 1404, 1569, 2864, 1409, 2864, 1403, + 1403, 1403, 1403, 1403, 1403, 1538, 133, 1571, 132, 1414, + 1415, 1418, 1485, 1413, 1420, 1421, 133, 133, 1571, 133, + 133, 1422, 1370, 1370, 1419, 1370, 1492, 1528, 46, 1416, + 1424, 1424, 1424, 1424, 1424, 1425, 133, 133, 133, 133, + 133, 133, 1370, 1492, 1370, 1373, 1378, 1370, 133, 133, + + 133, 133, 133, 133, 1492, 1378, 1503, 1492, 1378, 1503, + 133, 133, 133, 133, 133, 133, 1378, 1382, 1390, 1378, + 1503, 1390, 133, 133, 133, 133, 2864, 2864, 1515, 1503, + 1390, 1515, 1520, 1520, 1520, 1520, 1520, 1425, 1520, 1520, + 1520, 1520, 1520, 1520, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 1575, 1571, 1575, 1523, 132, 1575, 1580, 1575, 1580, + 1521, 132, 1580, 1585, 1520, 1520, 1520, 1520, 1520, 1520, + 1580, 1524, 1585, 132, 1438, 1561, 1585, 1529, 1530, 1531, + 1591, 1561, 1532, 1535, 46, 1585, 1536, 1536, 1537, 1537, + 1537, 1538, 1533, 46, 1591, 1537, 1537, 1537, 1537, 1537, + + 1538, 132, 1561, 1569, 1591, 1599, 133, 133, 133, 133, + 133, 133, 1601, 133, 1604, 1485, 1485, 1608, 133, 1485, + 133, 133, 133, 133, 1608, 133, 133, 1604, 1608, 1615, + 133, 1485, 1608, 133, 133, 133, 1492, 133, 133, 1619, + 1608, 1492, 133, 1619, 133, 133, 133, 133, 1608, 133, + 1615, 1619, 1627, 1492, 133, 1619, 133, 133, 133, 133, + 1503, 133, 1631, 1619, 1503, 1631, 133, 133, 133, 133, + 2864, 2864, 1619, 1627, 1631, 1639, 1640, 1640, 1640, 1640, + 1640, 1538, 1640, 1640, 1640, 1640, 1640, 1640, 2864, 2864, + 2864, 1645, 1646, 2864, 2864, 2864, 2864, 2864, 2864, 132, + + 2864, 2864, 2864, 1538, 1641, 1538, 1659, 1538, 1640, 1640, + 1640, 1640, 1640, 1640, 1649, 1538, 1659, 1642, 1643, 132, + 1538, 1538, 1545, 1650, 132, 1644, 1647, 1648, 46, 1652, + 1653, 1653, 1654, 1654, 1654, 1538, 46, 1538, 1654, 1654, + 1654, 1654, 1654, 1538, 1659, 1545, 1651, 1670, 1659, 1545, + 1670, 132, 1545, 1549, 1557, 132, 1545, 1670, 1557, 1682, + 1670, 1557, 1682, 132, 1688, 132, 1691, 1688, 1691, 132, + 1691, 1696, 1691, 1696, 132, 1696, 1701, 1696, 1701, 132, + 1701, 1706, 1557, 1701, 1706, 132, 1557, 1682, 1706, 1714, + 1682, 1706, 1714, 132, 133, 133, 133, 133, 133, 133, + + 1720, 133, 1723, 1723, 133, 1601, 133, 1601, 133, 133, + 1604, 133, 133, 133, 1723, 1604, 133, 1732, 1723, 1604, + 133, 133, 1732, 133, 133, 133, 133, 1604, 133, 1608, + 1615, 133, 1604, 133, 1732, 133, 133, 1615, 133, 1744, + 133, 1732, 1615, 133, 1744, 133, 133, 133, 133, 1615, + 133, 1619, 1627, 133, 1615, 133, 1744, 133, 133, 1627, + 133, 1756, 133, 1744, 1627, 2864, 1756, 1761, 1761, 1761, + 1761, 1761, 1538, 1761, 1761, 1761, 1761, 1761, 1761, 2864, + 2864, 2864, 1766, 1767, 2864, 2864, 2864, 2864, 2864, 1538, + 2864, 2864, 1659, 132, 1659, 1538, 1762, 1659, 1782, 1761, + + 1761, 1761, 1761, 1761, 1761, 46, 1659, 1774, 1774, 1775, + 1775, 1775, 1538, 1763, 1764, 1768, 1769, 1770, 1659, 1771, + 2864, 2864, 1786, 1659, 1659, 1765, 1772, 1538, 1538, 1786, + 132, 1659, 1782, 46, 1773, 1775, 1775, 1775, 1775, 1775, + 1538, 1786, 1794, 1659, 1786, 1670, 1798, 1786, 1670, 1798, + 132, 1786, 1794, 1798, 1806, 1807, 132, 1810, 1810, 132, + 1810, 1815, 1810, 1815, 132, 1815, 1820, 1815, 1820, 132, + 1820, 1825, 1820, 1825, 132, 1670, 1798, 1825, 1831, 1798, + 1825, 1831, 132, 1798, 1806, 1831, 1839, 133, 133, 133, + 133, 133, 133, 1841, 133, 1841, 1841, 133, 1841, 133, + + 1847, 133, 133, 1841, 133, 1723, 133, 1851, 1841, 133, + 1723, 133, 1851, 133, 133, 133, 133, 1841, 133, 1847, + 1851, 1859, 1723, 133, 1851, 133, 133, 133, 133, 1732, + 133, 1863, 1851, 1732, 1863, 133, 133, 133, 133, 133, + 133, 1851, 1859, 1863, 1871, 1732, 1863, 133, 133, 133, + 133, 133, 133, 1744, 1875, 1863, 1744, 1875, 133, 133, + 133, 133, 2864, 2864, 1863, 1871, 1875, 1883, 1884, 1884, + 1884, 1884, 1884, 1538, 1884, 1884, 1884, 1884, 1884, 1884, + 2864, 2864, 1888, 1889, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 1659, 1659, 1886, 1659, 1659, 1895, 1538, 1782, 132, + + 1884, 1884, 1884, 1884, 1884, 1884, 1885, 1659, 1659, 1782, + 132, 1887, 1659, 1782, 1782, 1908, 46, 1894, 1896, 1896, + 1897, 1897, 1897, 1538, 1893, 1782, 1890, 1891, 1782, 1908, + 132, 1782, 1786, 46, 1892, 1897, 1897, 1897, 1897, 1897, + 1538, 1794, 132, 1782, 1908, 1794, 1920, 1908, 1794, 1920, + 132, 132, 1926, 1926, 132, 1926, 1931, 1926, 1931, 132, + 1931, 1936, 1931, 1936, 132, 1936, 1941, 1936, 1941, 132, + 1941, 1946, 1794, 1941, 1946, 132, 1794, 1920, 1946, 1954, + 1920, 1946, 1954, 132, 133, 133, 133, 133, 133, 133, + 1841, 133, 1841, 1841, 1963, 1841, 133, 1963, 133, 133, + + 133, 133, 133, 133, 1841, 1841, 1847, 133, 1841, 1963, + 133, 133, 133, 1847, 133, 133, 1974, 1963, 1847, 133, + 1974, 133, 133, 133, 133, 1847, 133, 1851, 1859, 133, + 1847, 133, 1974, 133, 133, 1859, 133, 1986, 133, 1974, + 1859, 133, 1986, 133, 133, 133, 133, 1859, 133, 1863, + 1871, 133, 1859, 133, 1986, 133, 133, 1871, 133, 1998, + 133, 1986, 1871, 2864, 1998, 2003, 2003, 2003, 2003, 2003, + 1538, 2003, 2003, 2003, 2003, 2003, 2003, 2864, 2864, 2004, + 2005, 2864, 2864, 2864, 2864, 2864, 2864, 1659, 1659, 46, + 2006, 2009, 2009, 2010, 2010, 2010, 1659, 2003, 2003, 2003, + + 2003, 2003, 2003, 46, 1782, 2010, 2010, 2010, 2010, 2010, + 1659, 1782, 2014, 1782, 1782, 2007, 1782, 1782, 2014, 132, + 1782, 2014, 2014, 2023, 1782, 2014, 1908, 2027, 2008, 2014, + 1908, 2027, 132, 2014, 2023, 2027, 2035, 1926, 132, 1926, + 2039, 1926, 2039, 132, 2039, 2044, 2039, 2044, 132, 2044, + 2049, 2044, 2049, 132, 2049, 2054, 2049, 2054, 132, 1908, + 2027, 2054, 2060, 2027, 2054, 2060, 132, 2027, 2035, 2060, + 2068, 133, 133, 133, 133, 133, 133, 1841, 1841, 1841, + 1963, 133, 1963, 133, 133, 133, 133, 1963, 133, 2075, + 1841, 1963, 1963, 133, 2079, 133, 133, 133, 133, 1963, + + 133, 1963, 2079, 133, 1963, 133, 2075, 133, 133, 2079, + 133, 2087, 133, 1963, 2079, 133, 1974, 133, 2091, 133, + 133, 2079, 133, 1974, 133, 2091, 133, 133, 2079, 133, + 2087, 133, 2091, 2099, 133, 1974, 133, 2091, 133, 133, + 1986, 133, 2103, 133, 2091, 1986, 133, 2103, 133, 133, + 133, 2113, 2091, 2114, 2099, 2103, 2111, 2112, 2112, 2112, + 2112, 2112, 1659, 2112, 2112, 2112, 2112, 2112, 2112, 2864, + 2864, 46, 2864, 2117, 2117, 2118, 2118, 2118, 1659, 46, + 1782, 2118, 2118, 2118, 2118, 2118, 1659, 1782, 2014, 2112, + 2112, 2112, 2112, 2112, 2112, 132, 1782, 1782, 2014, 2014, + + 2124, 2014, 2014, 2124, 132, 2014, 2014, 2023, 132, 2014, + 2124, 2115, 2116, 2023, 2136, 2124, 2023, 2136, 132, 1926, + 1926, 2039, 132, 2039, 2145, 2039, 2145, 132, 2145, 2150, + 2145, 2150, 132, 2150, 2155, 2150, 2155, 132, 2155, 2160, + 2023, 2155, 2160, 132, 2023, 2136, 2160, 2168, 2136, 2160, + 2168, 132, 133, 133, 133, 133, 133, 133, 1841, 1963, + 1963, 1963, 1963, 2075, 133, 133, 133, 133, 133, 133, + 133, 1963, 1963, 2075, 133, 1963, 2075, 133, 133, 133, + 2075, 133, 133, 2183, 2075, 2075, 133, 2183, 133, 133, + 133, 133, 2075, 133, 2079, 2087, 133, 2075, 133, 2183, + + 133, 133, 2087, 133, 2195, 133, 2183, 2087, 133, 2195, + 133, 133, 133, 133, 2087, 133, 2091, 2099, 133, 2087, + 133, 2195, 133, 133, 2099, 133, 2207, 133, 2195, 2099, + 2213, 2207, 2212, 2212, 2212, 2212, 2212, 1659, 2212, 2212, + 2212, 2212, 2212, 2212, 2214, 2864, 2864, 46, 2014, 2217, + 2217, 2218, 2218, 2218, 1659, 46, 2014, 2218, 2218, 2218, + 2218, 2218, 1659, 2014, 2212, 2212, 2212, 2212, 2212, 2212, + 2014, 2124, 132, 2014, 2124, 2124, 2225, 2014, 2124, 2124, + 2229, 2124, 2124, 2229, 132, 2215, 2124, 2225, 2229, 2237, + 1926, 2039, 2039, 2216, 2145, 132, 2145, 2242, 2145, 2242, + + 132, 2242, 2247, 2242, 2247, 132, 2247, 2252, 2247, 2252, + 132, 2124, 2229, 2252, 2258, 2229, 2252, 2258, 132, 2229, + 2237, 2258, 2266, 133, 133, 133, 133, 133, 133, 1963, + 1963, 2075, 2075, 2270, 2075, 133, 133, 133, 133, 133, + 133, 2075, 2075, 2075, 2270, 133, 2075, 133, 133, 133, + 133, 2270, 133, 2270, 2279, 2075, 2270, 133, 2183, 133, + 133, 133, 133, 2283, 133, 2270, 2183, 2283, 133, 133, + 2270, 133, 133, 133, 2279, 2283, 133, 2291, 2183, 2283, + 133, 133, 2195, 133, 133, 133, 2295, 2283, 133, 2195, + 2295, 133, 133, 133, 2283, 2305, 2306, 2291, 2295, 2303, + + 2304, 2304, 2304, 2304, 2304, 1659, 2304, 2304, 2304, 2304, + 2304, 2304, 2864, 2864, 46, 2014, 2310, 2310, 2311, 2311, + 2311, 1659, 46, 2124, 2311, 2311, 2311, 2311, 2311, 1659, + 2124, 2124, 2304, 2304, 2304, 2304, 2304, 2304, 2124, 2225, + 132, 2124, 2124, 2225, 132, 2124, 2225, 2225, 2322, 2225, + 2225, 2322, 2308, 132, 2864, 2145, 2145, 2309, 2242, 2307, + 132, 2039, 2242, 2331, 2242, 2331, 132, 2331, 2336, 2331, + 2336, 132, 2336, 2341, 2225, 2336, 2341, 132, 2225, 2322, + 2341, 2349, 2322, 2341, 2349, 132, 133, 133, 133, 133, + 133, 133, 2075, 2075, 2270, 133, 2075, 2075, 133, 133, + + 133, 2270, 133, 133, 2270, 2359, 2270, 133, 2270, 2359, + 133, 133, 133, 133, 133, 133, 2270, 2270, 2279, 133, + 2270, 2359, 133, 133, 133, 2279, 133, 133, 2371, 2359, + 2279, 133, 2371, 133, 133, 133, 133, 2279, 133, 2283, + 2291, 133, 2279, 133, 2371, 133, 133, 2291, 133, 2383, + 133, 2371, 2291, 2864, 2383, 2388, 2388, 2388, 2388, 2388, + 1659, 2388, 2388, 2388, 2388, 2388, 2388, 2864, 2864, 46, + 2124, 2391, 2391, 2392, 2392, 2392, 1782, 46, 2124, 2392, + 2392, 2392, 2392, 2392, 1782, 2225, 2225, 2388, 2388, 2388, + 2388, 2388, 2388, 2396, 2225, 2225, 2225, 2389, 2225, 2396, + + 132, 2225, 2390, 2396, 2396, 2405, 2145, 2242, 2242, 2331, + 132, 2331, 2410, 2331, 2410, 132, 2410, 2415, 2410, 2415, + 132, 2225, 2396, 2415, 2421, 2396, 2415, 2421, 132, 2396, + 2405, 2421, 2429, 133, 133, 133, 133, 133, 133, 2270, + 2270, 2270, 2270, 2359, 133, 133, 133, 133, 133, 133, + 2270, 2359, 2359, 2436, 2270, 2359, 133, 133, 133, 133, + 133, 133, 2359, 2440, 2359, 2359, 2440, 133, 133, 133, + 133, 133, 133, 2359, 2436, 2440, 2448, 2359, 2440, 133, + 133, 133, 133, 133, 133, 2371, 2452, 2440, 2371, 2452, + 133, 133, 133, 133, 2864, 2864, 2440, 2448, 2452, 2460, + + 2461, 2461, 2461, 2461, 2461, 1782, 2461, 2461, 2461, 2461, + 2461, 2461, 46, 2225, 2463, 2463, 2464, 2464, 2464, 1782, + 46, 2225, 2464, 2464, 2464, 2464, 2464, 1782, 2462, 2396, + 132, 2225, 2461, 2461, 2461, 2461, 2461, 2461, 2225, 2396, + 2396, 2470, 2396, 2396, 2470, 132, 2242, 2331, 2331, 2410, + 132, 2410, 2479, 2410, 2479, 132, 2479, 2484, 2396, 2479, + 2484, 132, 2396, 2470, 2484, 2492, 2470, 2484, 2492, 132, + 133, 133, 133, 133, 133, 133, 2270, 2359, 2359, 2359, + 2359, 2436, 133, 133, 133, 133, 133, 133, 133, 2359, + 2359, 2436, 133, 2359, 2436, 133, 133, 133, 2436, 133, + + 133, 2507, 2436, 2436, 133, 2507, 133, 133, 133, 133, + 2436, 133, 2440, 2448, 133, 2436, 133, 2507, 133, 133, + 2448, 133, 2519, 133, 2507, 2448, 2864, 2519, 2524, 2524, + 2524, 2524, 2524, 1782, 2524, 2524, 2524, 2524, 2524, 2524, + 46, 2396, 2525, 2525, 2526, 2526, 2526, 1782, 46, 2396, + 2526, 2526, 2526, 2526, 2526, 1782, 2396, 2396, 2470, 132, + 2524, 2524, 2524, 2524, 2524, 2524, 2396, 2470, 2470, 2533, + 2331, 2410, 2410, 2479, 132, 2479, 2538, 2479, 2538, 132, + 2396, 2470, 2538, 2544, 2470, 2538, 2544, 132, 2470, 2533, + 2544, 2552, 133, 133, 133, 133, 133, 133, 2359, 2359, + + 2436, 2436, 2556, 2436, 133, 133, 133, 133, 133, 133, + 2436, 2436, 2436, 2556, 133, 2436, 133, 133, 133, 133, + 2556, 133, 2556, 2565, 2436, 2556, 133, 2507, 133, 133, + 133, 133, 2569, 133, 2556, 2507, 2569, 133, 133, 2556, + 133, 2396, 2470, 2565, 2569, 2470, 2577, 2578, 2578, 2578, + 2578, 2578, 1782, 2578, 2578, 2578, 2578, 2578, 2578, 46, + 2470, 2579, 2579, 2580, 2580, 2580, 1782, 46, 2470, 2580, + 2580, 2580, 2580, 2580, 1782, 2533, 132, 2410, 2479, 2578, + 2578, 2578, 2578, 2578, 2578, 2479, 2538, 132, 2538, 2590, + 2470, 2538, 2590, 132, 2470, 2533, 2590, 2597, 2533, 2590, + + 2597, 132, 133, 133, 133, 133, 133, 133, 2436, 2436, + 2556, 133, 2436, 2436, 133, 133, 133, 2556, 133, 133, + 2556, 2607, 2556, 133, 2556, 2607, 133, 133, 133, 133, + 133, 133, 2556, 2556, 2565, 133, 2556, 2607, 133, 133, + 133, 2565, 133, 133, 2619, 2607, 2565, 2470, 2619, 2624, + 2624, 2624, 2624, 2624, 1782, 2624, 2624, 2624, 2624, 2624, + 2624, 46, 2470, 2625, 2625, 2626, 2626, 2626, 2014, 46, + 2533, 2626, 2626, 2626, 2626, 2626, 2014, 2533, 2630, 2479, + 2538, 2624, 2624, 2624, 2624, 2624, 2624, 2538, 2590, 132, + 2533, 2590, 2635, 2533, 2590, 2635, 132, 2533, 2630, 2635, + + 2643, 133, 133, 133, 133, 133, 133, 2556, 2556, 2556, + 2556, 2607, 133, 133, 133, 133, 133, 133, 2556, 2607, + 2607, 2650, 2556, 2607, 133, 133, 133, 133, 133, 133, + 2607, 2654, 2607, 2607, 2654, 133, 133, 133, 133, 2533, + 2533, 2607, 2650, 2654, 2662, 2663, 2663, 2663, 2663, 2663, + 2014, 2663, 2663, 2663, 2663, 2663, 2663, 46, 2630, 2664, + 2664, 2665, 2665, 2665, 2014, 46, 132, 2665, 2665, 2665, + 2665, 2665, 2014, 2538, 2590, 2590, 2635, 2663, 2663, 2663, + 2663, 2663, 2663, 132, 2533, 2630, 2635, 2674, 2630, 2635, + 2674, 132, 133, 133, 133, 133, 133, 133, 2556, 2607, + + 2607, 2607, 2607, 2650, 133, 133, 133, 133, 133, 133, + 133, 2607, 2607, 2650, 133, 2607, 2650, 133, 133, 133, + 2650, 133, 133, 2689, 2650, 2650, 2630, 2689, 2694, 2694, + 2694, 2694, 2694, 2014, 2694, 2694, 2694, 2694, 2694, 2694, + 46, 2630, 2695, 2695, 2696, 2696, 2696, 2014, 46, 2699, + 2696, 2696, 2696, 2696, 2696, 2014, 2590, 2635, 2630, 2635, + 2694, 2694, 2694, 2694, 2694, 2694, 2674, 132, 2630, 2699, + 2674, 2706, 133, 133, 133, 133, 133, 133, 2607, 2607, + 2650, 2650, 2710, 2650, 133, 133, 133, 133, 133, 133, + 2650, 2650, 2650, 2710, 133, 2650, 133, 133, 2630, 2699, + + 2710, 132, 2710, 2719, 2720, 2720, 2720, 2720, 2720, 2014, + 2720, 2720, 2720, 2720, 2720, 2720, 46, 2635, 2721, 2721, + 2722, 2722, 2722, 2014, 46, 2699, 2722, 2722, 2722, 2722, + 2722, 2014, 2674, 2699, 2674, 2706, 2720, 2720, 2720, 2720, + 2720, 2720, 132, 133, 133, 133, 133, 133, 133, 2650, + 2650, 2710, 133, 2650, 2650, 133, 133, 133, 2710, 133, + 133, 2710, 2735, 2710, 133, 2710, 2735, 2740, 2740, 2740, + 2740, 2740, 2699, 2740, 2740, 2740, 2740, 2740, 2740, 46, + 2745, 2741, 2741, 2742, 2742, 2742, 2124, 46, 2674, 2742, + 2742, 2742, 2742, 2742, 2124, 2699, 2745, 2706, 2748, 2740, + + 2740, 2740, 2740, 2740, 2740, 133, 133, 133, 133, 133, + 133, 2710, 2710, 2710, 2710, 2735, 133, 133, 133, 133, + 2699, 2745, 2710, 2735, 2735, 2756, 2757, 2757, 2757, 2757, + 2757, 2124, 2757, 2757, 2757, 2757, 2757, 2757, 46, 132, + 2758, 2758, 2759, 2759, 2759, 2124, 46, 2745, 2759, 2759, + 2759, 2759, 2759, 2124, 2706, 2748, 133, 2745, 2757, 2757, + 2757, 2757, 2757, 2757, 2762, 2763, 2763, 2763, 2763, 133, + 133, 133, 133, 133, 133, 2710, 2735, 2735, 2735, 2735, + 2756, 2769, 2769, 2769, 2769, 2769, 2745, 2769, 2769, 2769, + 2769, 2769, 2769, 46, 2748, 2770, 2770, 2771, 2771, 2771, + + 2124, 46, 2745, 2771, 2771, 2771, 2771, 2771, 2124, 2748, + 132, 1471, 1466, 2769, 2769, 2769, 2769, 2769, 2769, 2762, + 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 2763, 133, + 133, 133, 133, 1329, 1471, 2735, 2735, 2756, 2756, 2776, + 2776, 2776, 2776, 2776, 1466, 2776, 2776, 2776, 2776, 2776, + 2776, 46, 132, 2777, 2777, 2778, 2778, 2778, 2124, 46, + 1466, 2778, 2778, 2778, 2778, 2778, 2124, 1461, 1466, 1461, + 132, 2776, 2776, 2776, 2776, 2776, 2776, 133, 133, 1461, + 1456, 1461, 1456, 2756, 2756, 2780, 2780, 2780, 2780, 2780, + 132, 2780, 2780, 2780, 2780, 2780, 2780, 46, 1456, 2781, + + 2781, 2782, 2782, 2782, 2225, 46, 1456, 2782, 2782, 2782, + 2782, 2782, 2225, 132, 1450, 1329, 1438, 2780, 2780, 2780, + 2780, 2780, 2780, 133, 1450, 1329, 1438, 1318, 132, 2756, + 2783, 2783, 2783, 2783, 2783, 2225, 2783, 2783, 2783, 2783, + 2783, 2783, 46, 1329, 2784, 2784, 2785, 2785, 2785, 2225, + 46, 1322, 2785, 2785, 2785, 2785, 2785, 2225, 1318, 132, + 1438, 1318, 2783, 2783, 2783, 2783, 2783, 2783, 2786, 2786, + 2786, 2786, 2786, 1429, 2786, 2786, 2786, 2786, 2786, 2786, + 46, 1438, 2787, 2787, 2788, 2788, 2788, 2225, 46, 1318, + 2788, 2788, 2788, 2788, 2788, 2225, 1429, 132, 1318, 1314, + + 2786, 2786, 2786, 2786, 2786, 2786, 2789, 2789, 2789, 2789, + 2789, 1314, 2789, 2789, 2789, 2789, 2789, 2789, 46, 132, + 2790, 2790, 2791, 2791, 2791, 2225, 46, 1429, 2791, 2791, + 2791, 2791, 2791, 2225, 1429, 132, 2864, 2864, 2789, 2789, + 2789, 2789, 2789, 2789, 2792, 2792, 2792, 2792, 2792, 2864, + 2792, 2792, 2792, 2792, 2792, 2792, 46, 1411, 2793, 2793, + 2794, 2794, 2794, 2396, 46, 1410, 2794, 2794, 2794, 2794, + 2794, 2396, 2864, 133, 133, 133, 2792, 2792, 2792, 2792, + 2792, 2792, 2795, 2795, 2795, 2795, 2795, 2396, 2795, 2795, + 2795, 2795, 2795, 2795, 46, 133, 2796, 2796, 2797, 2797, + + 2797, 2396, 46, 1368, 2797, 2797, 2797, 2797, 2797, 2396, + 1360, 1341, 1333, 132, 2795, 2795, 2795, 2795, 2795, 2795, + 2798, 2798, 2798, 2798, 2798, 1360, 2798, 2798, 2798, 2798, + 2798, 2798, 46, 1354, 2799, 2799, 2800, 2800, 2800, 2396, + 46, 1333, 2800, 2800, 2800, 2800, 2800, 2396, 1360, 1354, + 1333, 1216, 2798, 2798, 2798, 2798, 2798, 2798, 2801, 2801, + 2801, 2801, 2801, 132, 2801, 2801, 2801, 2801, 2801, 2801, + 46, 1354, 2802, 2802, 2803, 2803, 2803, 2396, 46, 1349, + 2803, 2803, 2803, 2803, 2803, 2396, 1354, 1349, 132, 1349, + 2801, 2801, 2801, 2801, 2801, 2801, 2804, 2804, 2804, 2804, + + 2804, 1344, 2804, 2804, 2804, 2804, 2804, 2804, 46, 1349, + 2805, 2805, 2806, 2806, 2806, 2470, 46, 1344, 2806, 2806, + 2806, 2806, 2806, 2470, 132, 1344, 1344, 132, 2804, 2804, + 2804, 2804, 2804, 2804, 2807, 2807, 2807, 2807, 2807, 2470, + 2807, 2807, 2807, 2807, 2807, 2807, 46, 1341, 2808, 2808, + 2809, 2809, 2809, 2470, 46, 1333, 2809, 2809, 2809, 2809, + 2809, 2470, 1329, 1322, 132, 1333, 2807, 2807, 2807, 2807, + 2807, 2807, 2810, 2810, 2810, 2810, 2810, 1216, 2810, 2810, + 2810, 2810, 2810, 2810, 46, 1322, 2811, 2811, 2812, 2812, + 2812, 2470, 46, 1333, 2812, 2812, 2812, 2812, 2812, 2470, + + 1216, 1322, 1208, 1329, 2810, 2810, 2810, 2810, 2810, 2810, + 2813, 2813, 2813, 2813, 2813, 1322, 2813, 2813, 2813, 2813, + 2813, 2813, 46, 1318, 2814, 2814, 2815, 2815, 2815, 2470, + 46, 132, 2815, 2815, 2815, 2815, 2815, 2470, 1322, 1208, + 1322, 1208, 2813, 2813, 2813, 2813, 2813, 2813, 2816, 2816, + 2816, 2816, 2816, 1208, 2816, 2816, 2816, 2816, 2816, 2816, + 46, 1318, 2817, 2817, 2818, 2818, 2818, 2533, 46, 132, + 2818, 2818, 2818, 2818, 2818, 2533, 2864, 1297, 1296, 2864, + 2816, 2816, 2816, 2816, 2816, 2816, 2819, 2819, 2819, 2819, + 2819, 2533, 2819, 2819, 2819, 2819, 2819, 2819, 46, 133, + + 2820, 2820, 2821, 2821, 2821, 2533, 46, 133, 2821, 2821, + 2821, 2821, 2821, 2533, 133, 133, 133, 133, 2819, 2819, + 2819, 2819, 2819, 2819, 2822, 2822, 2822, 2822, 2822, 132, + 2822, 2822, 2822, 2822, 2822, 2822, 46, 1253, 2823, 2823, + 2824, 2824, 2824, 2533, 46, 1245, 2824, 2824, 2824, 2824, + 2824, 2533, 1227, 1253, 1245, 1227, 2822, 2822, 2822, 2822, + 2822, 2822, 2825, 2825, 2825, 2825, 2825, 1113, 2825, 2825, + 2825, 2825, 2825, 2825, 46, 132, 2826, 2826, 2827, 2827, + 2827, 2533, 46, 1245, 2827, 2827, 2827, 2827, 2827, 2533, + 1240, 1113, 1245, 1240, 2825, 2825, 2825, 2825, 2825, 2825, + + 2828, 2828, 2828, 2828, 2828, 132, 2828, 2828, 2828, 2828, + 2828, 2828, 46, 1240, 2829, 2829, 2830, 2830, 2830, 2630, + 46, 1235, 2830, 2830, 2830, 2830, 2830, 2630, 1240, 1235, + 132, 1235, 2828, 2828, 2828, 2828, 2828, 2828, 2831, 2831, + 2831, 2831, 2831, 2630, 2831, 2831, 2831, 2831, 2831, 2831, + 46, 1235, 2832, 2832, 2833, 2833, 2833, 2630, 46, 132, + 2833, 2833, 2833, 2833, 2833, 2630, 1232, 132, 1227, 1113, + 2831, 2831, 2831, 2831, 2831, 2831, 2834, 2834, 2834, 2834, + 2834, 1216, 2834, 2834, 2834, 2834, 2834, 2834, 46, 1227, + 2835, 2835, 2836, 2836, 2836, 2630, 46, 1113, 2836, 2836, + + 2836, 2836, 2836, 2630, 1216, 1104, 132, 1113, 2834, 2834, + 2834, 2834, 2834, 2834, 2837, 2837, 2837, 2837, 2837, 1108, + 2837, 2837, 2837, 2837, 2837, 2837, 46, 1104, 2838, 2838, + 2839, 2839, 2839, 2630, 46, 132, 2839, 2839, 2839, 2839, + 2839, 2630, 1216, 1104, 1216, 1104, 2837, 2837, 2837, 2837, + 2837, 2837, 2840, 2840, 2840, 2840, 2840, 132, 2840, 2840, + 2840, 2840, 2840, 2840, 46, 1104, 2841, 2841, 2842, 2842, + 2842, 2699, 46, 1104, 2842, 2842, 2842, 2842, 2842, 2699, + 132, 1190, 1189, 1188, 2840, 2840, 2840, 2840, 2840, 2840, + 2843, 2843, 2843, 2843, 2843, 2699, 2843, 2843, 2843, 2843, + + 2843, 2843, 46, 1187, 2844, 2844, 2845, 2845, 2845, 2699, + 46, 2864, 2845, 2845, 2845, 2845, 2845, 2699, 2864, 133, + 133, 133, 2843, 2843, 2843, 2843, 2843, 2843, 2846, 2846, + 2846, 2846, 2846, 1149, 2846, 2846, 2846, 2846, 2846, 2846, + 46, 1141, 2847, 2847, 2848, 2848, 2848, 2699, 46, 1125, + 2848, 2848, 2848, 2848, 2848, 2699, 1117, 132, 1141, 1135, + 2846, 2846, 2846, 2846, 2846, 2846, 2849, 2849, 2849, 2849, + 2849, 1117, 2849, 2849, 2849, 2849, 2849, 2849, 46, 1141, + 2850, 2850, 2851, 2851, 2851, 2699, 46, 1135, 2851, 2851, + 2851, 2851, 2851, 2699, 1117, 1011, 132, 1135, 2849, 2849, + + 2849, 2849, 2849, 2849, 2852, 2852, 2852, 2852, 2852, 1130, + 2852, 2852, 2852, 2852, 2852, 2852, 46, 1135, 2853, 2853, + 2854, 2854, 2854, 2745, 46, 1130, 2854, 2854, 2854, 2854, + 2854, 2745, 132, 1130, 1127, 1130, 2852, 2852, 2852, 2852, + 2852, 2852, 2855, 2855, 2855, 2855, 2855, 2745, 2855, 2855, + 2855, 2855, 2855, 2855, 46, 132, 2856, 2856, 2857, 2857, + 2857, 2745, 46, 1127, 2857, 2857, 2857, 2857, 2857, 2745, + 1125, 1117, 1113, 1108, 2855, 2855, 2855, 2855, 2855, 2855, + 2858, 2858, 2858, 2858, 2858, 132, 2858, 2858, 2858, 2858, + 2858, 2858, 46, 1117, 2859, 2859, 2860, 2860, 2860, 2745, + + 46, 1011, 2860, 2860, 2860, 2860, 2860, 2745, 1108, 1117, + 1011, 1108, 2858, 2858, 2858, 2858, 2858, 2858, 2861, 2861, + 2861, 2861, 2861, 1113, 2861, 2861, 2861, 2861, 2861, 2861, + 46, 1108, 2862, 2862, 2863, 2863, 2863, 2745, 46, 132, + 2863, 2863, 2863, 2863, 2863, 2745, 1108, 1108, 132, 2864, + 2861, 2861, 2861, 2861, 2861, 2861, 52, 52, 52, 52, + 52, 1086, 52, 52, 52, 52, 52, 52, 46, 1085, + 2862, 2862, 2863, 2863, 2863, 46, 1084, 2863, 2863, 2863, + 2863, 2863, 1083, 2864, 133, 133, 133, 133, 52, 52, + 52, 52, 52, 52, 42, 42, 42, 42, 42, 42, + + 42, 42, 45, 133, 45, 45, 45, 45, 45, 45, + 50, 132, 50, 50, 52, 52, 1043, 52, 52, 52, + 130, 1035, 130, 130, 131, 131, 134, 134, 219, 1020, + 219, 219, 220, 220, 221, 221, 225, 225, 225, 309, + 1043, 309, 309, 310, 310, 311, 311, 313, 313, 314, + 314, 315, 315, 315, 317, 317, 389, 1035, 389, 389, + 390, 390, 391, 391, 393, 393, 394, 394, 395, 395, + 396, 396, 398, 398, 398, 400, 400, 401, 401, 401, + 476, 1020, 476, 476, 477, 477, 478, 478, 480, 480, + 481, 481, 482, 482, 483, 483, 485, 485, 486, 486, + + 487, 487, 488, 488, 488, 490, 490, 491, 491, 491, + 493, 493, 493, 494, 494, 563, 916, 563, 563, 564, + 564, 565, 565, 567, 567, 569, 569, 570, 570, 571, + 571, 573, 573, 574, 574, 575, 575, 576, 576, 577, + 577, 578, 578, 580, 580, 580, 582, 582, 583, 583, + 583, 585, 585, 585, 586, 586, 587, 587, 587, 588, + 588, 588, 654, 132, 654, 654, 655, 655, 656, 656, + 658, 658, 659, 659, 660, 660, 662, 662, 663, 663, + 665, 665, 666, 666, 667, 667, 668, 668, 669, 669, + 670, 670, 672, 672, 673, 673, 674, 674, 675, 675, + + 676, 676, 676, 678, 678, 679, 679, 679, 680, 680, + 680, 681, 681, 682, 682, 682, 683, 683, 683, 685, + 685, 685, 686, 686, 686, 687, 687, 52, 52, 1035, + 52, 52, 738, 1030, 738, 738, 739, 739, 740, 740, + 742, 742, 743, 743, 744, 744, 745, 745, 654, 654, + 748, 748, 749, 749, 751, 751, 752, 752, 753, 753, + 754, 754, 755, 755, 757, 757, 758, 758, 759, 759, + 760, 760, 761, 761, 762, 762, 763, 763, 765, 765, + 765, 767, 767, 768, 768, 768, 770, 770, 770, 771, + 771, 771, 772, 772, 772, 774, 774, 774, 775, 775, + + 775, 776, 776, 777, 777, 777, 778, 778, 778, 779, + 779, 779, 52, 52, 916, 52, 52, 824, 1035, 824, + 824, 825, 825, 826, 826, 827, 827, 828, 828, 829, + 829, 830, 830, 832, 832, 833, 833, 834, 834, 835, + 835, 836, 836, 838, 838, 839, 839, 840, 840, 841, + 841, 843, 843, 844, 844, 845, 845, 846, 846, 847, + 847, 848, 848, 849, 849, 851, 851, 852, 852, 853, + 853, 854, 854, 855, 855, 855, 857, 857, 858, 858, + 858, 860, 860, 860, 861, 861, 765, 765, 765, 862, + 862, 862, 863, 863, 863, 864, 864, 865, 865, 865, + + 866, 866, 866, 867, 867, 867, 869, 869, 869, 870, + 870, 870, 871, 871, 871, 872, 872, 52, 52, 1030, + 52, 52, 913, 132, 913, 913, 914, 914, 915, 915, + 917, 917, 918, 918, 919, 919, 921, 921, 922, 922, + 923, 923, 924, 924, 925, 925, 926, 926, 928, 928, + 930, 930, 931, 931, 932, 932, 933, 933, 832, 832, + 935, 935, 936, 936, 937, 937, 938, 938, 939, 939, + 941, 941, 942, 942, 943, 943, 944, 944, 945, 945, + 946, 946, 947, 947, 949, 949, 949, 951, 951, 952, + 952, 952, 954, 954, 954, 955, 955, 956, 956, 956, + + 957, 957, 957, 959, 959, 959, 960, 960, 960, 961, + 961, 961, 963, 963, 963, 964, 964, 964, 965, 965, + 965, 966, 966, 967, 967, 967, 968, 968, 968, 969, + 969, 969, 52, 52, 1030, 52, 52, 1008, 1026, 1008, + 1008, 1009, 1009, 1010, 1010, 1012, 1012, 1013, 1013, 913, + 913, 1014, 1014, 1015, 1015, 1016, 1016, 1017, 1017, 1018, + 1018, 1019, 1019, 1021, 1021, 1022, 1022, 1023, 1023, 1024, + 1024, 1025, 1025, 1027, 1027, 1028, 1028, 1029, 1029, 921, + 921, 1031, 1031, 1032, 1032, 1033, 1033, 1034, 1034, 1036, + 1036, 1037, 1037, 1038, 1038, 1039, 1039, 1040, 1040, 1041, + + 1041, 1042, 1042, 1044, 1044, 1045, 1045, 1046, 1046, 1047, + 1047, 1048, 1048, 1048, 1050, 1050, 1051, 1051, 1051, 1052, + 1052, 1052, 1053, 1053, 1054, 1054, 1054, 1055, 1055, 1055, + 1057, 1057, 1057, 1058, 1058, 1058, 1059, 1059, 1060, 1060, + 1060, 1061, 1061, 1061, 1062, 1062, 1062, 1063, 1063, 1064, + 1064, 1064, 1065, 1065, 1065, 1066, 1066, 1066, 1068, 1068, + 1068, 1069, 1069, 1069, 1070, 1070, 1070, 1071, 1071, 52, + 52, 1030, 52, 52, 1105, 1026, 1105, 1105, 1106, 1106, + 1107, 1107, 1109, 1109, 1110, 1110, 1111, 1111, 1112, 1112, + 1114, 1114, 1115, 1115, 1116, 1116, 1118, 1118, 1119, 1119, + + 1120, 1120, 1121, 1121, 1122, 1122, 1123, 1123, 1124, 1124, + 1126, 1126, 1128, 1128, 1129, 1129, 1014, 1014, 1131, 1131, + 1132, 1132, 1133, 1133, 1134, 1134, 1022, 1022, 1136, 1136, + 1137, 1137, 1138, 1138, 1139, 1139, 1140, 1140, 1142, 1142, + 1143, 1143, 1144, 1144, 1145, 1145, 1146, 1146, 1147, 1147, + 1148, 1148, 1150, 1150, 1150, 1152, 1152, 1153, 1153, 1153, + 1155, 1155, 1155, 1156, 1156, 1156, 1157, 1157, 1157, 1159, + 1159, 1159, 1160, 1160, 1160, 1161, 1161, 1162, 1162, 1162, + 1163, 1163, 1163, 1164, 1164, 1164, 1166, 1166, 1166, 1167, + 1167, 1167, 1168, 1168, 1168, 1170, 1170, 1170, 1171, 1171, + + 1171, 1172, 1172, 1172, 1173, 1173, 1174, 1174, 1174, 1175, + 1175, 1175, 1176, 1176, 1176, 52, 52, 132, 52, 52, + 1209, 1026, 1209, 1209, 1210, 1210, 1211, 1211, 1212, 1212, + 1213, 1213, 1214, 1214, 1215, 1215, 1217, 1217, 1218, 1218, + 1219, 1219, 1220, 1220, 1221, 1221, 1222, 1222, 1223, 1223, + 1224, 1224, 1225, 1225, 1226, 1226, 1228, 1228, 1229, 1229, + 1230, 1230, 1231, 1231, 1008, 1008, 1233, 1233, 1234, 1234, + 1236, 1236, 1237, 1237, 1238, 1238, 1239, 1239, 1119, 1119, + 1241, 1241, 1242, 1242, 1243, 1243, 1244, 1244, 1246, 1246, + 1247, 1247, 1248, 1248, 1249, 1249, 1250, 1250, 1251, 1251, + + 1252, 1252, 1254, 1254, 1255, 1255, 1256, 1256, 1257, 1257, + 1258, 1258, 1258, 1260, 1260, 1261, 1261, 1261, 1263, 1263, + 1263, 1264, 1264, 1150, 1150, 1150, 1265, 1265, 1265, 1266, + 1266, 1266, 1267, 1267, 1268, 1268, 1268, 1269, 1269, 1269, + 1270, 1270, 1270, 1272, 1272, 1272, 1273, 1273, 1273, 1274, + 1274, 1274, 1275, 1275, 1276, 1276, 1276, 1277, 1277, 1277, + 1278, 1278, 1278, 1279, 1279, 1280, 1280, 1280, 1281, 1281, + 1281, 1282, 1282, 1282, 1284, 1284, 1284, 1285, 1285, 1285, + 1286, 1286, 1286, 1287, 1287, 52, 52, 132, 52, 52, + 1315, 1020, 1315, 1315, 1316, 1316, 1317, 1317, 1319, 1319, + + 1320, 1320, 1321, 1321, 1323, 1323, 1324, 1324, 1325, 1325, + 1326, 1326, 1327, 1327, 1328, 1328, 1330, 1330, 1331, 1331, + 1332, 1332, 1334, 1334, 1335, 1335, 1336, 1336, 1337, 1337, + 1338, 1338, 1339, 1339, 1340, 1340, 1342, 1342, 1343, 1343, + 1345, 1345, 1346, 1346, 1347, 1347, 1348, 1348, 1221, 1221, + 1350, 1350, 1351, 1351, 1352, 1352, 1353, 1353, 1229, 1229, + 1355, 1355, 1356, 1356, 1357, 1357, 1358, 1358, 1359, 1359, + 1361, 1361, 1362, 1362, 1363, 1363, 1364, 1364, 1365, 1365, + 1366, 1366, 1367, 1367, 1369, 1369, 1369, 1371, 1371, 1372, + 1372, 1372, 1374, 1374, 1374, 1375, 1375, 1376, 1376, 1376, + + 1377, 1377, 1377, 1379, 1379, 1379, 1380, 1380, 1380, 1381, + 1381, 1381, 1383, 1383, 1383, 1384, 1384, 1384, 1385, 1385, + 1385, 1386, 1386, 1387, 1387, 1387, 1388, 1388, 1388, 1389, + 1389, 1389, 1391, 1391, 1391, 1392, 1392, 1392, 1393, 1393, + 1393, 1395, 1395, 1395, 1396, 1396, 1396, 1397, 1397, 1397, + 1398, 1398, 1399, 1399, 1399, 1400, 1400, 1400, 1401, 1401, + 1401, 52, 52, 916, 52, 52, 1426, 1011, 1426, 1426, + 1427, 1427, 1428, 1428, 1430, 1430, 1431, 1431, 1315, 1315, + 1432, 1432, 1433, 1433, 1434, 1434, 1435, 1435, 1436, 1436, + 1437, 1437, 1439, 1439, 1440, 1440, 1441, 1441, 1442, 1442, + + 1443, 1443, 1444, 1444, 1445, 1445, 1446, 1446, 1447, 1447, + 1448, 1448, 1449, 1449, 1451, 1451, 1452, 1452, 1453, 1453, + 1454, 1454, 1455, 1455, 1457, 1457, 1458, 1458, 1459, 1459, + 1460, 1460, 1217, 1217, 1462, 1462, 1463, 1463, 1464, 1464, + 1465, 1465, 1335, 1335, 1467, 1467, 1468, 1468, 1469, 1469, + 1470, 1470, 1472, 1472, 1473, 1473, 1474, 1474, 1475, 1475, + 1476, 1476, 1477, 1477, 1478, 1478, 1480, 1480, 1481, 1481, + 1482, 1482, 1483, 1483, 1484, 1484, 1484, 1486, 1486, 1487, + 1487, 1487, 1488, 1488, 1488, 1489, 1489, 1490, 1490, 1490, + 1491, 1491, 1491, 1493, 1493, 1493, 1494, 1494, 1494, 1495, + + 1495, 1496, 1496, 1496, 1497, 1497, 1497, 1498, 1498, 1498, + 1499, 1499, 1500, 1500, 1500, 1501, 1501, 1501, 1502, 1502, + 1502, 1504, 1504, 1504, 1505, 1505, 1505, 1506, 1506, 1506, + 1507, 1507, 1508, 1508, 1508, 1509, 1509, 1509, 1510, 1510, + 1510, 1511, 1511, 1512, 1512, 1512, 1513, 1513, 1513, 1514, + 1514, 1514, 1516, 1516, 1516, 1517, 1517, 1517, 1518, 1518, + 1518, 1519, 1519, 52, 52, 1020, 52, 52, 1539, 916, + 1539, 1539, 1427, 1427, 1540, 1540, 1541, 1541, 1542, 1542, + 1543, 1543, 1544, 1544, 1546, 1546, 1547, 1547, 1548, 1548, + 1550, 1550, 1551, 1551, 1552, 1552, 1553, 1553, 1554, 1554, + + 1555, 1555, 1556, 1556, 1558, 1558, 1559, 1559, 1560, 1560, + 1562, 1562, 1563, 1563, 1564, 1564, 1565, 1565, 1566, 1566, + 1567, 1567, 1568, 1568, 1570, 1570, 1572, 1572, 1573, 1573, + 1574, 1574, 1323, 1323, 1576, 1576, 1577, 1577, 1578, 1578, + 1579, 1579, 1444, 1444, 1581, 1581, 1582, 1582, 1583, 1583, + 1584, 1584, 1452, 1452, 1586, 1586, 1587, 1587, 1588, 1588, + 1589, 1589, 1590, 1590, 1592, 1592, 1593, 1593, 1594, 1594, + 1595, 1595, 1596, 1596, 1597, 1597, 1598, 1598, 1600, 1600, + 1600, 1602, 1602, 1603, 1603, 1603, 1605, 1605, 1605, 1606, + 1606, 1606, 1607, 1607, 1607, 1609, 1609, 1609, 1610, 1610, + + 1610, 1611, 1611, 1612, 1612, 1612, 1613, 1613, 1613, 1614, + 1614, 1614, 1616, 1616, 1616, 1617, 1617, 1617, 1618, 1618, + 1618, 1620, 1620, 1620, 1621, 1621, 1621, 1622, 1622, 1622, + 1623, 1623, 1624, 1624, 1624, 1625, 1625, 1625, 1626, 1626, + 1626, 1628, 1628, 1628, 1629, 1629, 1629, 1630, 1630, 1630, + 1632, 1632, 1632, 1633, 1633, 1633, 1634, 1634, 1634, 1635, + 1635, 1636, 1636, 1636, 1637, 1637, 1637, 1638, 1638, 1638, + 52, 52, 1011, 52, 52, 1655, 132, 1655, 1655, 1542, + 1542, 1656, 1656, 1657, 1657, 1658, 1658, 1660, 1660, 1661, + 1661, 1662, 1662, 1663, 1663, 1664, 1664, 1665, 1665, 1666, + + 1666, 1667, 1667, 1668, 1668, 1669, 1669, 1671, 1671, 1672, + 1672, 1673, 1673, 1674, 1674, 1675, 1675, 1676, 1676, 1677, + 1677, 1678, 1678, 1679, 1679, 1680, 1680, 1681, 1681, 1683, + 1683, 1684, 1684, 1685, 1685, 1686, 1686, 1687, 1687, 1689, + 1689, 1690, 1690, 1432, 1432, 1692, 1692, 1693, 1693, 1694, + 1694, 1695, 1695, 1440, 1440, 1697, 1697, 1698, 1698, 1699, + 1699, 1700, 1700, 1563, 1563, 1702, 1702, 1703, 1703, 1704, + 1704, 1705, 1705, 1707, 1707, 1708, 1708, 1709, 1709, 1710, + 1710, 1711, 1711, 1712, 1712, 1713, 1713, 1715, 1715, 1716, + 1716, 1717, 1717, 1718, 1718, 1719, 1719, 1719, 1721, 1721, + + 1722, 1722, 1722, 1724, 1724, 1724, 1725, 1725, 1600, 1600, + 1600, 1726, 1726, 1726, 1727, 1727, 1727, 1728, 1728, 1729, + 1729, 1729, 1730, 1730, 1730, 1731, 1731, 1731, 1733, 1733, + 1733, 1734, 1734, 1734, 1735, 1735, 1735, 1736, 1736, 1737, + 1737, 1737, 1738, 1738, 1738, 1739, 1739, 1739, 1740, 1740, + 1741, 1741, 1741, 1742, 1742, 1742, 1743, 1743, 1743, 1745, + 1745, 1745, 1746, 1746, 1746, 1747, 1747, 1747, 1748, 1748, + 1749, 1749, 1749, 1750, 1750, 1750, 1751, 1751, 1751, 1752, + 1752, 1753, 1753, 1753, 1754, 1754, 1754, 1755, 1755, 1755, + 1757, 1757, 1757, 1758, 1758, 1758, 1759, 1759, 1759, 1760, + + 1760, 52, 52, 916, 52, 52, 1776, 912, 1776, 1776, + 1777, 1777, 1778, 1778, 1662, 1662, 1779, 1779, 1780, 1780, + 1781, 1781, 1783, 1783, 1784, 1784, 1785, 1785, 1787, 1787, + 1788, 1788, 1789, 1789, 1790, 1790, 1791, 1791, 1792, 1792, + 1793, 1793, 1795, 1795, 1796, 1796, 1797, 1797, 1799, 1799, + 1800, 1800, 1801, 1801, 1802, 1802, 1803, 1803, 1804, 1804, + 1805, 1805, 1426, 1426, 1808, 1808, 1809, 1809, 1811, 1811, + 1812, 1812, 1813, 1813, 1814, 1814, 1551, 1551, 1816, 1816, + 1817, 1817, 1818, 1818, 1819, 1819, 1676, 1676, 1821, 1821, + 1822, 1822, 1823, 1823, 1824, 1824, 1684, 1684, 1826, 1826, + + 1827, 1827, 1796, 1796, 1828, 1828, 1829, 1829, 1830, 1830, + 1832, 1832, 1833, 1833, 1834, 1834, 1835, 1835, 1804, 1804, + 1836, 1836, 1837, 1837, 1838, 1838, 1840, 1840, 1840, 1721, + 1721, 1842, 1842, 1842, 1843, 1843, 1843, 1844, 1844, 1845, + 1845, 1845, 1846, 1846, 1846, 1848, 1848, 1848, 1849, 1849, + 1849, 1850, 1850, 1850, 1852, 1852, 1852, 1853, 1853, 1853, + 1854, 1854, 1854, 1855, 1855, 1856, 1856, 1856, 1857, 1857, + 1857, 1858, 1858, 1858, 1860, 1860, 1860, 1861, 1861, 1861, + 1862, 1862, 1862, 1864, 1864, 1864, 1865, 1865, 1865, 1866, + 1866, 1866, 1867, 1867, 1868, 1868, 1868, 1869, 1869, 1869, + + 1870, 1870, 1870, 1872, 1872, 1872, 1873, 1873, 1873, 1874, + 1874, 1874, 1876, 1876, 1876, 1877, 1877, 1877, 1878, 1878, + 1878, 1879, 1879, 1880, 1880, 1880, 1881, 1881, 1881, 1882, + 1882, 1882, 52, 52, 912, 52, 52, 1777, 132, 1777, + 1777, 1779, 1779, 1898, 1898, 1899, 1899, 1900, 1900, 1901, + 1901, 1902, 1902, 1903, 1903, 1904, 1904, 1905, 1905, 1906, + 1906, 1907, 1907, 1909, 1909, 1910, 1910, 1911, 1911, 1912, + 1912, 1913, 1913, 1914, 1914, 1915, 1915, 1916, 1916, 1917, + 1917, 1918, 1918, 1919, 1919, 1921, 1921, 1922, 1922, 1923, + 1923, 1924, 1924, 1808, 1808, 1925, 1925, 1927, 1927, 1928, + + 1928, 1929, 1929, 1930, 1930, 1664, 1664, 1932, 1932, 1933, + 1933, 1934, 1934, 1935, 1935, 1672, 1672, 1937, 1937, 1938, + 1938, 1939, 1939, 1940, 1940, 1800, 1800, 1942, 1942, 1943, + 1943, 1944, 1944, 1945, 1945, 1947, 1947, 1948, 1948, 1949, + 1949, 1950, 1950, 1918, 1918, 1951, 1951, 1952, 1952, 1953, + 1953, 1955, 1955, 1956, 1956, 1957, 1957, 1958, 1958, 1959, + 1959, 1959, 1844, 1844, 1960, 1960, 1960, 1961, 1961, 1961, + 1962, 1962, 1962, 1964, 1964, 1964, 1965, 1965, 1965, 1966, + 1966, 1967, 1967, 1967, 1968, 1968, 1968, 1969, 1969, 1969, + 1970, 1970, 1971, 1971, 1971, 1972, 1972, 1972, 1973, 1973, + + 1973, 1975, 1975, 1975, 1976, 1976, 1976, 1977, 1977, 1977, + 1978, 1978, 1979, 1979, 1979, 1980, 1980, 1980, 1981, 1981, + 1981, 1982, 1982, 1983, 1983, 1983, 1984, 1984, 1984, 1985, + 1985, 1985, 1987, 1987, 1987, 1988, 1988, 1988, 1989, 1989, + 1989, 1990, 1990, 1991, 1991, 1991, 1992, 1992, 1992, 1993, + 1993, 1993, 1994, 1994, 1995, 1995, 1995, 1996, 1996, 1996, + 1997, 1997, 1997, 1999, 1999, 1999, 2000, 2000, 2000, 2001, + 2001, 2001, 2002, 2002, 52, 52, 1011, 52, 52, 1779, + 1011, 1779, 1779, 1900, 1900, 1898, 1898, 2011, 2011, 2012, + 2012, 2013, 2013, 2015, 2015, 2016, 2016, 2017, 2017, 2018, + + 2018, 2019, 2019, 2020, 2020, 2021, 2021, 2022, 2022, 2024, + 2024, 2025, 2025, 2026, 2026, 2028, 2028, 2029, 2029, 2030, + 2030, 2031, 2031, 2032, 2032, 2033, 2033, 2034, 2034, 2036, + 2036, 1928, 1928, 2037, 2037, 2038, 2038, 1660, 1660, 2040, + 2040, 2041, 2041, 2042, 2042, 2043, 2043, 1788, 1788, 2045, + 2045, 2046, 2046, 2047, 2047, 2048, 2048, 1914, 1914, 2050, + 2050, 2051, 2051, 2052, 2052, 2053, 2053, 1922, 1922, 2055, + 2055, 2056, 2056, 2025, 2025, 2057, 2057, 2058, 2058, 2059, + 2059, 2061, 2061, 2062, 2062, 2063, 2063, 2064, 2064, 2033, + 2033, 2065, 2065, 2066, 2066, 2067, 2067, 2069, 2069, 2069, + + 2070, 2070, 2070, 2071, 2071, 2071, 1966, 1966, 2072, 2072, + 2072, 2073, 2073, 2073, 2074, 2074, 2074, 2076, 2076, 2076, + 2077, 2077, 2077, 2078, 2078, 2078, 2080, 2080, 2080, 2081, + 2081, 2081, 2082, 2082, 2082, 2083, 2083, 2084, 2084, 2084, + 2085, 2085, 2085, 2086, 2086, 2086, 2088, 2088, 2088, 2089, + 2089, 2089, 2090, 2090, 2090, 2092, 2092, 2092, 2093, 2093, + 2093, 2094, 2094, 2094, 2095, 2095, 2096, 2096, 2096, 2097, + 2097, 2097, 2098, 2098, 2098, 2100, 2100, 2100, 2101, 2101, + 2101, 2102, 2102, 2102, 2104, 2104, 2104, 2105, 2105, 2105, + 2106, 2106, 2106, 2107, 2107, 2108, 2108, 2108, 2109, 2109, + + 2109, 2110, 2110, 2110, 52, 52, 132, 52, 52, 1899, + 2864, 1899, 1899, 2016, 2016, 2119, 2119, 2120, 2120, 2019, + 2019, 2012, 2012, 2121, 2121, 2122, 2122, 2123, 2123, 2125, + 2125, 2126, 2126, 2127, 2127, 2128, 2128, 2129, 2129, 2130, + 2130, 2131, 2131, 2132, 2132, 2133, 2133, 2134, 2134, 2135, + 2135, 2137, 2137, 2138, 2138, 2139, 2139, 2140, 2140, 2141, + 2141, 1777, 1777, 2142, 2142, 2041, 2041, 2143, 2143, 2144, + 2144, 1903, 1903, 2146, 2146, 2147, 2147, 2148, 2148, 2149, + 2149, 1910, 1910, 2151, 2151, 2152, 2152, 2153, 2153, 2154, + 2154, 2029, 2029, 2156, 2156, 2157, 2157, 2158, 2158, 2159, + + 2159, 2161, 2161, 2162, 2162, 2163, 2163, 2164, 2164, 2134, + 2134, 2165, 2165, 2166, 2166, 2167, 2167, 2169, 2169, 2170, + 2170, 2171, 2171, 2172, 2172, 2070, 2070, 2070, 2072, 2072, + 2072, 2173, 2173, 2173, 2174, 2174, 2174, 2175, 2175, 2175, + 2176, 2176, 2176, 2177, 2177, 2178, 2178, 2178, 2179, 2179, + 2179, 2180, 2180, 2180, 2181, 2181, 2181, 2182, 2182, 2182, + 2184, 2184, 2184, 2185, 2185, 2185, 2186, 2186, 2186, 2187, + 2187, 2188, 2188, 2188, 2189, 2189, 2189, 2190, 2190, 2190, + 2191, 2191, 2192, 2192, 2192, 2193, 2193, 2193, 2194, 2194, + 2194, 2196, 2196, 2196, 2197, 2197, 2197, 2198, 2198, 2198, + + 2199, 2199, 2200, 2200, 2200, 2201, 2201, 2201, 2202, 2202, + 2202, 2203, 2203, 2204, 2204, 2204, 2205, 2205, 2205, 2206, + 2206, 2206, 2208, 2208, 2208, 2209, 2209, 2209, 2210, 2210, + 2210, 2211, 2211, 52, 52, 2864, 52, 52, 1898, 988, + 1898, 1898, 2121, 2121, 2219, 2219, 2125, 2125, 2220, 2220, + 2221, 2221, 2128, 2128, 2222, 2222, 2223, 2223, 2224, 2224, + 2226, 2226, 2227, 2227, 2228, 2228, 2230, 2230, 2231, 2231, + 2232, 2232, 2233, 2233, 2234, 2234, 2235, 2235, 2236, 2236, + 1777, 1777, 2238, 2238, 1900, 1900, 2239, 2239, 2147, 2147, + 2240, 2240, 2241, 2241, 2017, 2017, 2243, 2243, 2244, 2244, + + 2245, 2245, 2246, 2246, 2130, 2130, 2248, 2248, 2249, 2249, + 2250, 2250, 2251, 2251, 2138, 2138, 2253, 2253, 2254, 2254, + 2227, 2227, 2255, 2255, 2256, 2256, 2257, 2257, 2259, 2259, + 2260, 2260, 2261, 2261, 2262, 2262, 2235, 2235, 2263, 2263, + 2264, 2264, 2265, 2265, 2175, 2175, 2175, 2173, 2173, 2173, + 2267, 2267, 2267, 2268, 2268, 2268, 2269, 2269, 2269, 2271, + 2271, 2271, 2272, 2272, 2272, 2273, 2273, 2273, 2274, 2274, + 2274, 2275, 2275, 2276, 2276, 2276, 2277, 2277, 2277, 2278, + 2278, 2278, 2280, 2280, 2280, 2281, 2281, 2281, 2282, 2282, + 2282, 2284, 2284, 2284, 2285, 2285, 2285, 2286, 2286, 2286, + + 2287, 2287, 2288, 2288, 2288, 2289, 2289, 2289, 2290, 2290, + 2290, 2292, 2292, 2292, 2293, 2293, 2293, 2294, 2294, 2294, + 2296, 2296, 2296, 2297, 2297, 2297, 2298, 2298, 2298, 2299, + 2299, 2300, 2300, 2300, 2301, 2301, 2301, 2302, 2302, 2302, + 52, 52, 987, 52, 52, 1900, 986, 1900, 1900, 2220, + 2220, 2222, 2222, 2312, 2312, 2313, 2313, 2314, 2314, 2315, + 2315, 2316, 2316, 2317, 2317, 2318, 2318, 2319, 2319, 2320, + 2320, 2321, 2321, 2323, 2323, 2324, 2324, 2325, 2325, 2326, + 2326, 2327, 2327, 2119, 2119, 2328, 2328, 2244, 2244, 2329, + 2329, 2330, 2330, 2126, 2126, 2332, 2332, 2333, 2333, 2334, + + 2334, 2335, 2335, 2231, 2231, 2337, 2337, 2338, 2338, 2339, + 2339, 2340, 2340, 2342, 2342, 2343, 2343, 2344, 2344, 2345, + 2345, 2346, 2346, 2347, 2347, 2348, 2348, 2350, 2350, 2351, + 2351, 2352, 2352, 2353, 2353, 2272, 2272, 2272, 2354, 2354, + 2354, 2355, 2355, 2355, 2275, 2275, 2268, 2268, 2268, 2356, + 2356, 2356, 2357, 2357, 2357, 2358, 2358, 2358, 2360, 2360, + 2360, 2361, 2361, 2361, 2362, 2362, 2362, 2363, 2363, 2364, + 2364, 2364, 2365, 2365, 2365, 2366, 2366, 2366, 2367, 2367, + 2368, 2368, 2368, 2369, 2369, 2369, 2370, 2370, 2370, 2372, + 2372, 2372, 2373, 2373, 2373, 2374, 2374, 2374, 2375, 2375, + + 2376, 2376, 2376, 2377, 2377, 2377, 2378, 2378, 2378, 2379, + 2379, 2380, 2380, 2380, 2381, 2381, 2381, 2382, 2382, 2382, + 2384, 2384, 2384, 2385, 2385, 2385, 2386, 2386, 2386, 2387, + 2387, 52, 52, 985, 52, 52, 2011, 984, 2011, 2011, + 2314, 2314, 2312, 2312, 2393, 2393, 2394, 2394, 2395, 2395, + 2397, 2397, 2398, 2398, 2399, 2399, 2400, 2400, 2401, 2401, + 2402, 2402, 2403, 2403, 2404, 2404, 2119, 2119, 2406, 2406, + 2220, 2220, 2407, 2407, 2333, 2333, 2408, 2408, 2409, 2409, + 2317, 2317, 2411, 2411, 2412, 2412, 2413, 2413, 2414, 2414, + 2324, 2324, 2416, 2416, 2417, 2417, 2418, 2418, 2419, 2419, + + 2420, 2420, 2422, 2422, 2423, 2423, 2424, 2424, 2425, 2425, + 2426, 2426, 2427, 2427, 2428, 2428, 2356, 2356, 2356, 2430, + 2430, 2430, 2360, 2360, 2360, 2431, 2431, 2431, 2432, 2432, + 2432, 2363, 2363, 2433, 2433, 2433, 2434, 2434, 2434, 2435, + 2435, 2435, 2437, 2437, 2437, 2438, 2438, 2438, 2439, 2439, + 2439, 2441, 2441, 2441, 2442, 2442, 2442, 2443, 2443, 2443, + 2444, 2444, 2445, 2445, 2445, 2446, 2446, 2446, 2447, 2447, + 2447, 2449, 2449, 2449, 2450, 2450, 2450, 2451, 2451, 2451, + 2453, 2453, 2453, 2454, 2454, 2454, 2455, 2455, 2455, 2456, + 2456, 2457, 2457, 2457, 2458, 2458, 2458, 2459, 2459, 2459, + + 52, 52, 983, 52, 52, 2016, 2864, 2016, 2016, 2398, + 2398, 2465, 2465, 2466, 2466, 2401, 2401, 2394, 2394, 2467, + 2467, 2468, 2468, 2469, 2469, 2471, 2471, 2472, 2472, 2473, + 2473, 2474, 2474, 2220, 2220, 2475, 2475, 2314, 2314, 2476, + 2476, 2412, 2412, 2477, 2477, 2478, 2478, 2399, 2399, 2480, + 2480, 2481, 2481, 2482, 2482, 2483, 2483, 2485, 2485, 2486, + 2486, 2487, 2487, 2488, 2488, 2489, 2489, 2490, 2490, 2491, + 2491, 2493, 2493, 2494, 2494, 2495, 2495, 2496, 2496, 2431, + 2431, 2431, 2433, 2433, 2433, 2497, 2497, 2497, 2498, 2498, + 2498, 2499, 2499, 2499, 2500, 2500, 2500, 2501, 2501, 2502, + + 2502, 2502, 2503, 2503, 2503, 2504, 2504, 2504, 2505, 2505, + 2505, 2506, 2506, 2506, 2508, 2508, 2508, 2509, 2509, 2509, + 2510, 2510, 2510, 2511, 2511, 2512, 2512, 2512, 2513, 2513, + 2513, 2514, 2514, 2514, 2515, 2515, 2516, 2516, 2516, 2517, + 2517, 2517, 2518, 2518, 2518, 2520, 2520, 2520, 2521, 2521, + 2521, 2522, 2522, 2522, 2523, 2523, 52, 52, 133, 52, + 52, 2012, 133, 2012, 2012, 2467, 2467, 2527, 2527, 2471, + 2471, 2528, 2528, 2529, 2529, 2474, 2474, 2530, 2530, 2531, + 2531, 2532, 2532, 2314, 2314, 2534, 2534, 2465, 2465, 2535, + 2535, 2481, 2481, 2536, 2536, 2537, 2537, 2472, 2472, 2539, + + 2539, 2540, 2540, 2541, 2541, 2542, 2542, 2543, 2543, 2545, + 2545, 2546, 2546, 2547, 2547, 2548, 2548, 2549, 2549, 2550, + 2550, 2551, 2551, 2499, 2499, 2499, 2497, 2497, 2497, 2553, + 2553, 2553, 2554, 2554, 2554, 2555, 2555, 2555, 2557, 2557, + 2557, 2558, 2558, 2558, 2559, 2559, 2559, 2560, 2560, 2560, + 2561, 2561, 2562, 2562, 2562, 2563, 2563, 2563, 2564, 2564, + 2564, 2566, 2566, 2566, 2567, 2567, 2567, 2568, 2568, 2568, + 2570, 2570, 2570, 2571, 2571, 2571, 2572, 2572, 2572, 2573, + 2573, 2574, 2574, 2574, 2575, 2575, 2575, 2576, 2576, 2576, + 52, 52, 133, 52, 52, 2119, 948, 2119, 2119, 2528, + + 2528, 2530, 2530, 2581, 2581, 2582, 2582, 2583, 2583, 2584, + 2584, 2585, 2585, 2465, 2465, 2586, 2586, 2587, 2587, 2540, + 2540, 2588, 2588, 2589, 2589, 2591, 2591, 2592, 2592, 2593, + 2593, 2594, 2594, 2595, 2595, 2596, 2596, 2598, 2598, 2599, + 2599, 2600, 2600, 2601, 2601, 2558, 2558, 2558, 2602, 2602, + 2602, 2603, 2603, 2603, 2561, 2561, 2554, 2554, 2554, 2604, + 2604, 2604, 2605, 2605, 2605, 2606, 2606, 2606, 2608, 2608, + 2608, 2609, 2609, 2609, 2610, 2610, 2610, 2611, 2611, 2612, + 2612, 2612, 2613, 2613, 2613, 2614, 2614, 2614, 2615, 2615, 2616, 2616, 2616, 2617, 2617, 2617, 2618, 2618, 2618, 2620, 2620, 2620, 2621, 2621, 2621, 2622, 2622, 2622, 2623, 2623, - 2624, 2624, 2624, 2625, 2625, 2625, 2626, 2626, 2626, 51, - 895, 51, 51, 51, 2090, 129, 2090, 2090, 2601, 2601, - 2631, 2631, 2632, 2632, 2633, 2633, 2548, 2548, 2634, 2634, - 2635, 2635, 2604, 2604, 2593, 2593, 2636, 2636, 2637, 2637, - 2638, 2638, 2640, 2640, 2641, 2641, 2642, 2642, 2643, 2643, - 2610, 2610, 2610, 2612, 2612, 2612, 2644, 2644, 2644, 2645, - 2645, 2645, 2646, 2646, 2646, 2647, 2647, 2647, 2648, 2648, - 2649, 2649, 2649, 2650, 2650, 2650, 2651, 2651, 2651, 2652, - 2652, 2652, 2653, 2653, 2653, 2655, 2655, 2655, 2656, 2656, - - 2656, 2657, 2657, 2657, 2658, 2658, 51, 915, 51, 51, - 51, 2184, 909, 2184, 2184, 2662, 2662, 2663, 2663, 2631, - 2631, 2665, 2665, 2666, 2666, 2667, 2667, 2668, 2668, 2669, - 2669, 2670, 2670, 2672, 2672, 2672, 2673, 2673, 2673, 2674, - 2674, 2674, 2676, 2676, 2676, 2677, 2677, 2677, 2678, 2678, - 2678, 2679, 2679, 2679, 2680, 2680, 2681, 2681, 2681, 2682, - 2682, 2682, 2683, 2683, 2683, 2185, 895, 2185, 2185, 2688, - 2688, 2689, 2689, 2690, 2690, 2691, 2691, 2692, 2692, 2693, - 2693, 2694, 2694, 2695, 2695, 2695, 2696, 2696, 2696, 2697, - 2697, 2697, 2698, 2698, 2698, 2699, 2699, 2699, 2701, 2701, - - 2701, 2702, 2702, 2702, 2703, 2703, 2703, 2704, 2704, 2187, - 915, 2187, 2187, 2708, 2708, 2709, 2709, 2711, 2711, 2712, - 2712, 2714, 2714, 2715, 2715, 2715, 2716, 2716, 2716, 2717, - 2717, 2717, 2718, 2718, 2718, 2719, 2719, 2719, 2720, 2720, - 2720, 2278, 909, 2278, 2278, 2725, 2725, 2726, 2726, 2729, - 2729, 2730, 2730, 2730, 2731, 2731, 2731, 2732, 2732, 2732, - 2733, 2733, 2733, 2277, 895, 2277, 2277, 2737, 2737, 2738, - 2738, 2739, 2739, 2739, 2740, 2740, 2740, 2279, 800, 2279, - 2279, 2744, 2744, 2744, 2358, 129, 2358, 2358, 2363, 909, - 2363, 2363, 2359, 904, 2359, 2359, 2430, 909, 2430, 2430, - - 2432, 904, 2432, 2432, 2436, 129, 2436, 2436, 2492, 904, - 2492, 2492, 2493, 904, 2493, 2493, 2495, 902, 2495, 2495, - 2547, 895, 2547, 2547, 2546, 891, 2546, 2546, 2548, 129, - 2548, 2548, 2592, 895, 2592, 2592, 2601, 800, 2601, 2601, - 2593, 895, 2593, 2593, 2631, 800, 2631, 2631, 2636, 800, - 2636, 2636, 2640, 891, 2640, 2640, 2662, 129, 2662, 2662, - 2666, 2829, 2666, 2666, 2668, 867, 2668, 2668, 2691, 866, - 2691, 2691, 2708, 865, 2708, 2708, 2692, 864, 2692, 2692, - 2711, 863, 2711, 2711, 2726, 862, 2726, 2726, 2737, 130, - 2737, 2737, 130, 130, 130, 129, 827, 819, 808, 827, - - 819, 808, 716, 129, 819, 814, 716, 819, 814, 129, - 814, 814, 129, 129, 808, 716, 808, 716, 129, 716, - 716, 129, 2829, 2829, 2829, 2829, 2829, 778, 777, 776, - 775, 774, 773, 2829, 762, 130, 130, 743, 735, 725, - 720, 129, 735, 729, 720, 735, 729, 720, 129, 729, - 729, 129, 726, 725, 720, 129, 720, 720, 129, 712, - 2829, 2829, 2829, 2829, 2829, 2829, 688, 687, 686, 685, - 684, 683, 2829, 2829, 671, 130, 130, 130, 129, 652, - 645, 638, 652, 645, 638, 129, 645, 642, 645, 129, - 642, 129, 638, 638, 129, 628, 623, 622, 600, 595, - - 594, 593, 592, 591, 590, 587, 575, 130, 130, 562, - 555, 549, 129, 555, 551, 555, 551, 129, 551, 549, - 129, 539, 534, 533, 511, 506, 505, 504, 503, 502, - 501, 497, 485, 130, 130, 129, 470, 465, 470, 465, - 129, 465, 465, 129, 454, 448, 447, 425, 410, 130, - 386, 381, 129, 381, 381, 129, 328, 321, 314, 130, - 129, 304, 304, 129, 233, 230, 228, 227, 226, 217, - 129, 153, 140, 138, 137, 136, 133, 130, 129, 42, - 52, 50, 42, 2829, 3, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829 + 52, 52, 940, 52, 52, 2121, 927, 2121, 2121, 2583, + 2583, 2581, 2581, 2627, 2627, 2628, 2628, 2629, 2629, 2528, + 2528, 2631, 2631, 2632, 2632, 2593, 2593, 2633, 2633, 2634, + 2634, 2636, 2636, 2637, 2637, 2638, 2638, 2639, 2639, 2640, + 2640, 2641, 2641, 2642, 2642, 2604, 2604, 2604, 2644, 2644, + 2644, 2608, 2608, 2608, 2645, 2645, 2645, 2646, 2646, 2646, + 2611, 2611, 2647, 2647, 2647, 2648, 2648, 2648, 2649, 2649, + 2649, 2651, 2651, 2651, 2652, 2652, 2652, 2653, 2653, 2653, + 2655, 2655, 2655, 2656, 2656, 2656, 2657, 2657, 2657, 2658, + + 2658, 2659, 2659, 2659, 2660, 2660, 2660, 2661, 2661, 2661, + 52, 52, 920, 52, 52, 2125, 132, 2125, 2125, 2636, + 2636, 2666, 2666, 2667, 2667, 2668, 2668, 2583, 2583, 2669, + 2669, 2670, 2670, 2639, 2639, 2628, 2628, 2671, 2671, 2672, + 2672, 2673, 2673, 2675, 2675, 2676, 2676, 2677, 2677, 2678, + 2678, 2645, 2645, 2645, 2647, 2647, 2647, 2679, 2679, 2679, + 2680, 2680, 2680, 2681, 2681, 2681, 2682, 2682, 2682, 2683, + 2683, 2684, 2684, 2684, 2685, 2685, 2685, 2686, 2686, 2686, + 2687, 2687, 2687, 2688, 2688, 2688, 2690, 2690, 2690, 2691, + 2691, 2691, 2692, 2692, 2692, 2693, 2693, 52, 52, 940, + + 52, 52, 2219, 934, 2219, 2219, 2697, 2697, 2698, 2698, + 2666, 2666, 2700, 2700, 2701, 2701, 2702, 2702, 2703, 2703, + 2704, 2704, 2705, 2705, 2707, 2707, 2707, 2708, 2708, 2708, + 2709, 2709, 2709, 2711, 2711, 2711, 2712, 2712, 2712, 2713, + 2713, 2713, 2714, 2714, 2714, 2715, 2715, 2716, 2716, 2716, + 2717, 2717, 2717, 2718, 2718, 2718, 2220, 920, 2220, 2220, + 2723, 2723, 2724, 2724, 2725, 2725, 2726, 2726, 2727, 2727, + 2728, 2728, 2729, 2729, 2730, 2730, 2730, 2731, 2731, 2731, + 2732, 2732, 2732, 2733, 2733, 2733, 2734, 2734, 2734, 2736, + 2736, 2736, 2737, 2737, 2737, 2738, 2738, 2738, 2739, 2739, + + 2222, 940, 2222, 2222, 2743, 2743, 2744, 2744, 2746, 2746, + 2747, 2747, 2749, 2749, 2750, 2750, 2750, 2751, 2751, 2751, + 2752, 2752, 2752, 2753, 2753, 2753, 2754, 2754, 2754, 2755, + 2755, 2755, 2313, 934, 2313, 2313, 2760, 2760, 2761, 2761, + 2764, 2764, 2765, 2765, 2765, 2766, 2766, 2766, 2767, 2767, + 2767, 2768, 2768, 2768, 2312, 920, 2312, 2312, 2772, 2772, + 2773, 2773, 2774, 2774, 2774, 2775, 2775, 2775, 2314, 823, + 2314, 2314, 2779, 2779, 2779, 2393, 132, 2393, 2393, 2398, + 934, 2398, 2398, 2394, 929, 2394, 2394, 2465, 934, 2465, + 2465, 2467, 929, 2467, 2467, 2471, 132, 2471, 2471, 2527, + + 929, 2527, 2527, 2528, 929, 2528, 2528, 2530, 927, 2530, + 2530, 2582, 920, 2582, 2582, 2581, 916, 2581, 2581, 2583, + 132, 2583, 2583, 2627, 920, 2627, 2627, 2636, 823, 2636, + 2636, 2628, 920, 2628, 2628, 2666, 823, 2666, 2666, 2671, + 823, 2671, 2671, 2675, 916, 2675, 2675, 2697, 132, 2697, + 2697, 2701, 2864, 2701, 2701, 2703, 891, 2703, 2703, 2726, + 890, 2726, 2726, 2743, 889, 2743, 2743, 2727, 888, 2727, + 2727, 2746, 887, 2746, 2746, 2761, 886, 2761, 2761, 2772, + 133, 2772, 2772, 133, 133, 133, 132, 850, 842, 831, + 850, 842, 831, 737, 132, 842, 837, 737, 842, 837, + + 132, 837, 837, 132, 132, 831, 737, 831, 737, 132, + 737, 737, 132, 2864, 2864, 2864, 2864, 2864, 800, 799, + 798, 797, 796, 795, 2864, 783, 133, 133, 764, 756, + 746, 741, 132, 756, 750, 741, 756, 750, 741, 132, + 750, 750, 132, 747, 746, 741, 132, 741, 741, 132, + 733, 2864, 2864, 2864, 2864, 2864, 2864, 708, 707, 706, + 705, 704, 703, 2864, 2864, 690, 133, 133, 133, 132, + 671, 664, 657, 671, 664, 657, 132, 664, 661, 664, + 132, 661, 132, 657, 657, 132, 647, 641, 640, 618, + 613, 612, 611, 610, 609, 608, 605, 592, 133, 133, + + 579, 572, 566, 132, 572, 568, 572, 568, 132, 568, + 566, 132, 556, 550, 549, 526, 521, 520, 519, 518, + 517, 516, 512, 499, 133, 133, 132, 484, 479, 484, + 479, 132, 479, 479, 132, 468, 461, 460, 437, 422, + 133, 397, 392, 132, 392, 392, 132, 337, 329, 322, + 133, 132, 312, 312, 132, 238, 235, 233, 232, 231, + 222, 132, 157, 143, 141, 140, 139, 136, 133, 132, + 43, 53, 51, 43, 2864, 3, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864 } ; -static yyconst flex_int16_t yy_chk[10753] = +static yyconst flex_int16_t yy_chk[10845] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2949,1194 +2971,1204 @@ static yyconst flex_int16_t yy_chk[10753] = 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, 5, 23, 1329, - 5, 9, 9, 9, 9, 9, 11, 577, 11, 11, - 11, 11, 11, 11, 12, 1330, 12, 12, 12, 12, - 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, - - 14, 14, 14, 14, 40, 270, 17, 40, 16, 14, - 17, 49, 18, 21, 17, 24, 129, 117, 49, 23, - 18, 577, 129, 16, 14, 14, 14, 14, 14, 14, - 16, 270, 282, 282, 14, 18, 16, 51, 20, 18, - 21, 94, 30, 117, 576, 620, 24, 270, 14, 15, + 1, 1, 1, 1, 1, 1, 1, 1, 5, 23, + 1361, 5, 9, 9, 9, 9, 9, 11, 594, 11, + 11, 11, 11, 11, 11, 12, 1362, 12, 12, 12, + 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, + + 14, 14, 14, 14, 14, 41, 277, 17, 41, 16, + 14, 17, 50, 18, 21, 17, 24, 132, 120, 50, + 23, 18, 594, 132, 16, 14, 14, 14, 14, 14, + 14, 16, 277, 289, 289, 14, 18, 16, 52, 20, + 18, 21, 18, 30, 120, 591, 602, 24, 277, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 19, 22, 582, 21, 117, 24, 25, 25, 20, - 26, 30, 19, 30, 1331, 576, 25, 620, 22, 19, - 20, 15, 15, 15, 15, 15, 15, 19, 51, 20, - 74, 34, 94, 30, 19, 22, 19, 27, 27, 26, - - 62, 22, 25, 19, 29, 15, 34, 25, 28, 29, - 26, 582, 27, 22, 28, 26, 34, 32, 25, 33, - 32, 26, 28, 33, 27, 31, 32, 57, 27, 74, - 34, 29, 27, 33, 63, 29, 36, 27, 62, 63, - 28, 74, 81, 36, 29, 63, 29, 28, 27, 29, - 31, 62, 1332, 57, 31, 29, 36, 37, 37, 28, - 36, 81, 33, 584, 31, 31, 32, 36, 32, 31, - 33, 584, 37, 38, 31, 64, 31, 57, 38, 43, - 43, 43, 43, 43, 37, 45, 45, 45, 45, 45, - 54, 54, 61, 81, 71, 65, 46, 37, 46, 46, - - 46, 46, 46, 46, 38, 597, 59, 47, 37, 47, - 47, 47, 47, 47, 47, 65, 66, 54, 64, 67, - 68, 59, 69, 61, 38, 39, 64, 73, 69, 39, - 39, 71, 597, 127, 68, 214, 39, 1333, 39, 39, - 127, 54, 214, 61, 39, 71, 65, 76, 72, 75, - 67, 39, 78, 73, 69, 39, 39, 59, 66, 1334, - 703, 39, 703, 39, 39, 80, 86, 66, 39, 77, - 67, 68, 73, 69, 79, 39, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 72, 75, - 76, 78, 83, 84, 85, 82, 86, 87, 76, 72, - - 75, 88, 91, 78, 88, 90, 92, 80, 52, 52, - 52, 52, 52, 52, 82, 77, 80, 86, 79, 89, - 77, 85, 84, 92, 95, 79, 84, 93, 853, 97, - 88, 91, 92, 93, 87, 83, 99, 96, 102, 89, - 98, 100, 101, 83, 84, 85, 82, 92, 87, 90, - 95, 104, 88, 91, 92, 96, 90, 107, 103, 93, - 105, 1335, 853, 89, 109, 104, 101, 106, 111, 95, - 89, 99, 112, 97, 574, 101, 99, 98, 93, 96, - 97, 111, 98, 100, 102, 108, 107, 99, 96, 102, - 103, 98, 100, 115, 105, 103, 114, 106, 110, 103, - - 113, 103, 104, 109, 116, 114, 120, 109, 107, 103, - 134, 105, 108, 112, 110, 109, 113, 118, 106, 111, - 131, 574, 1337, 112, 115, 133, 131, 108, 134, 122, - 120, 122, 122, 122, 122, 122, 108, 120, 130, 130, - 130, 130, 130, 118, 115, 139, 116, 114, 133, 110, - 141, 113, 134, 580, 123, 116, 123, 123, 123, 123, - 123, 134, 118, 121, 139, 121, 135, 124, 121, 124, - 124, 124, 124, 124, 124, 144, 133, 1340, 146, 141, - 121, 125, 121, 125, 125, 125, 125, 125, 125, 121, - 135, 121, 142, 145, 121, 679, 139, 580, 951, 135, - - 679, 141, 144, 149, 121, 146, 121, 147, 147, 150, - 151, 951, 148, 121, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 144, 153, 154, 146, - 142, 152, 155, 151, 156, 150, 157, 145, 161, 158, - 160, 166, 149, 142, 145, 162, 132, 132, 132, 132, - 132, 132, 148, 165, 149, 152, 163, 151, 147, 152, - 150, 151, 153, 148, 169, 156, 159, 159, 159, 161, - 155, 168, 154, 158, 164, 173, 163, 166, 153, 154, - 160, 157, 167, 155, 162, 156, 170, 157, 167, 161, - 158, 160, 166, 173, 164, 169, 162, 165, 171, 172, - - 176, 175, 178, 174, 165, 1345, 184, 163, 182, 171, - 186, 181, 187, 1349, 168, 169, 177, 173, 183, 159, - 185, 180, 168, 177, 172, 164, 173, 174, 189, 188, - 170, 176, 196, 167, 171, 181, 174, 170, 175, 172, - 180, 177, 182, 181, 191, 187, 190, 177, 188, 171, - 184, 176, 175, 178, 186, 183, 177, 184, 192, 182, - 185, 186, 193, 187, 180, 194, 195, 197, 196, 183, - 189, 185, 180, 190, 199, 198, 201, 200, 204, 189, - 188, 191, 202, 196, 203, 195, 207, 202, 193, 192, - 206, 236, 588, 220, 301, 191, 194, 190, 205, 220, - - 378, 301, 307, 199, 231, 462, 208, 378, 307, 192, - 198, 197, 462, 193, 200, 203, 194, 195, 197, 236, - 770, 1357, 205, 585, 770, 199, 198, 201, 200, 204, - 208, 209, 206, 202, 208, 203, 588, 207, 209, 209, - 231, 206, 236, 209, 210, 210, 210, 210, 210, 205, - 218, 218, 218, 218, 218, 231, 209, 219, 219, 219, - 219, 219, 209, 209, 223, 228, 224, 209, 585, 579, - 211, 209, 211, 211, 211, 211, 211, 211, 212, 224, - 212, 212, 212, 212, 212, 212, 222, 222, 222, 222, - 222, 222, 222, 222, 222, 222, 222, 222, 227, 223, - - 225, 229, 228, 230, 224, 232, 229, 579, 234, 235, - 237, 238, 237, 241, 239, 223, 228, 224, 222, 222, - 222, 222, 222, 222, 244, 225, 243, 245, 246, 227, - 247, 248, 251, 257, 230, 1361, 260, 262, 225, 257, - 232, 249, 250, 248, 252, 253, 254, 259, 1369, 227, - 248, 235, 229, 238, 230, 244, 232, 234, 239, 234, - 235, 237, 238, 243, 241, 239, 258, 249, 250, 256, - 246, 247, 254, 261, 251, 244, 253, 243, 245, 246, - 255, 247, 248, 251, 257, 255, 252, 260, 262, 264, - 264, 259, 249, 250, 266, 252, 253, 254, 259, 265, - - 256, 258, 267, 581, 268, 271, 269, 272, 261, 273, - 274, 275, 276, 278, 546, 269, 264, 258, 279, 277, - 256, 546, 1375, 288, 261, 265, 272, 291, 284, 266, - 268, 255, 280, 281, 287, 283, 289, 292, 581, 293, - 264, 269, 285, 276, 278, 266, 286, 312, 332, 265, - 1377, 275, 274, 267, 268, 290, 271, 269, 272, 277, - 273, 274, 275, 276, 278, 283, 279, 280, 284, 279, - 277, 335, 281, 285, 288, 287, 289, 286, 291, 284, - 1053, 290, 293, 280, 281, 287, 283, 289, 292, 286, - 293, 294, 295, 285, 335, 309, 604, 286, 312, 332, - - 295, 309, 335, 294, 295, 296, 290, 296, 296, 296, - 296, 296, 317, 1053, 1378, 604, 317, 294, 295, 297, - 314, 297, 297, 297, 297, 297, 295, 311, 294, 295, - 298, 315, 298, 298, 298, 298, 298, 298, 317, 316, - 321, 294, 295, 299, 324, 299, 299, 299, 299, 299, - 299, 310, 310, 310, 310, 310, 310, 310, 310, 310, - 310, 310, 310, 317, 314, 319, 311, 320, 322, 318, - 323, 314, 322, 329, 315, 330, 583, 321, 311, 316, - 326, 324, 315, 310, 310, 310, 310, 310, 310, 318, - 316, 321, 318, 325, 327, 324, 331, 326, 333, 334, - - 339, 337, 342, 327, 336, 325, 338, 343, 319, 344, - 323, 320, 1379, 348, 341, 583, 319, 330, 320, 322, - 318, 323, 329, 331, 329, 349, 330, 336, 341, 350, - 346, 326, 337, 333, 334, 336, 345, 339, 338, 348, - 347, 342, 343, 347, 325, 327, 344, 331, 350, 333, - 334, 339, 337, 342, 345, 345, 354, 338, 343, 346, - 344, 348, 351, 353, 349, 341, 352, 356, 355, 347, - 357, 359, 350, 358, 360, 363, 349, 364, 366, 365, - 350, 346, 367, 369, 372, 354, 351, 345, 355, 368, - 371, 347, 1386, 358, 351, 387, 356, 352, 353, 389, - - 359, 387, 390, 368, 360, 389, 364, 354, 390, 474, - 372, 373, 617, 357, 353, 474, 369, 352, 356, 355, - 363, 357, 359, 365, 358, 360, 363, 373, 364, 366, - 365, 371, 372, 367, 369, 394, 395, 373, 397, 401, - 368, 371, 374, 374, 374, 374, 374, 617, 1387, 1391, - 375, 373, 375, 375, 375, 375, 375, 375, 376, 373, - 376, 376, 376, 376, 376, 376, 392, 392, 392, 392, - 392, 392, 392, 392, 392, 392, 392, 392, 393, 395, - 396, 399, 400, 403, 401, 402, 394, 395, 404, 397, - 401, 405, 406, 408, 411, 407, 412, 409, 392, 392, - - 392, 392, 392, 392, 407, 402, 415, 424, 393, 426, - 422, 635, 413, 396, 414, 427, 399, 428, 635, 404, - 429, 1393, 1394, 406, 400, 431, 422, 403, 423, 393, - 422, 396, 399, 400, 403, 427, 402, 439, 408, 404, - 405, 409, 405, 406, 408, 411, 407, 412, 409, 413, - 424, 429, 414, 430, 428, 423, 415, 415, 424, 432, - 426, 422, 433, 413, 431, 414, 427, 434, 428, 435, - 436, 429, 437, 433, 441, 440, 431, 438, 443, 423, - 442, 439, 430, 450, 445, 444, 432, 449, 439, 453, - 436, 446, 434, 446, 1395, 451, 437, 451, 433, 452, - - 452, 483, 484, 437, 430, 435, 438, 434, 446, 441, - 432, 445, 443, 433, 436, 440, 442, 455, 1396, 450, - 435, 436, 626, 456, 449, 441, 440, 444, 438, 443, - 608, 442, 456, 476, 450, 445, 444, 477, 449, 476, - 453, 479, 446, 477, 455, 480, 451, 479, 456, 563, - 452, 480, 483, 484, 626, 563, 456, 457, 457, 457, - 457, 457, 457, 456, 482, 486, 490, 488, 455, 458, - 458, 458, 458, 458, 458, 459, 608, 459, 459, 459, - 459, 459, 459, 460, 487, 460, 460, 460, 460, 460, - 460, 481, 481, 481, 481, 481, 481, 481, 481, 481, - - 481, 481, 481, 486, 482, 488, 489, 491, 495, 492, - 498, 494, 496, 499, 500, 482, 486, 490, 488, 487, - 509, 513, 515, 481, 481, 481, 481, 481, 481, 492, - 494, 493, 507, 508, 518, 487, 493, 510, 517, 495, - 493, 489, 514, 496, 514, 500, 512, 516, 499, 509, - 491, 520, 513, 520, 522, 524, 520, 489, 491, 495, - 492, 498, 494, 496, 499, 500, 520, 1397, 515, 523, - 525, 509, 513, 515, 507, 508, 526, 516, 510, 527, - 522, 517, 493, 507, 508, 518, 512, 521, 510, 517, - 529, 528, 521, 514, 535, 530, 538, 512, 516, 531, - - 522, 536, 520, 532, 524, 540, 524, 525, 537, 541, - 527, 528, 523, 565, 526, 1398, 538, 529, 521, 565, - 523, 525, 566, 568, 586, 535, 717, 526, 566, 568, - 527, 569, 536, 717, 540, 541, 1399, 569, 521, 530, - 1400, 529, 528, 570, 531, 535, 530, 538, 532, 570, - 531, 571, 536, 537, 532, 541, 540, 571, 596, 537, - 542, 542, 542, 542, 542, 543, 586, 543, 543, 543, - 543, 543, 543, 544, 598, 544, 544, 544, 544, 544, - 544, 573, 573, 573, 573, 573, 573, 573, 573, 573, - 573, 573, 573, 599, 603, 609, 606, 607, 596, 611, - - 605, 615, 619, 616, 618, 598, 621, 610, 624, 625, - 676, 670, 672, 573, 573, 573, 573, 573, 573, 605, - 599, 610, 761, 629, 611, 630, 630, 630, 630, 630, - 670, 675, 615, 619, 673, 1401, 611, 621, 657, 603, - 606, 609, 607, 618, 657, 659, 610, 616, 676, 660, - 624, 659, 672, 625, 629, 660, 1402, 761, 610, 631, - 631, 631, 631, 631, 632, 673, 632, 632, 632, 632, - 632, 632, 633, 675, 633, 633, 633, 633, 633, 633, - 661, 662, 663, 664, 666, 667, 661, 662, 663, 664, - 666, 667, 668, 674, 677, 678, 680, 689, 668, 669, - - 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 690, 694, 681, 693, 692, 695, 697, 702, 698, - 699, 704, 700, 701, 674, 705, 708, 680, 707, 711, - 780, 669, 669, 669, 669, 669, 669, 782, 677, 678, - 681, 689, 700, 690, 692, 710, 693, 710, 1065, 697, - 698, 699, 694, 1403, 701, 771, 695, 744, 702, 704, - 707, 711, 780, 744, 746, 765, 1065, 771, 705, 782, - 746, 708, 714, 700, 714, 714, 714, 714, 714, 714, - 715, 763, 715, 715, 715, 715, 715, 715, 747, 749, - 750, 751, 753, 754, 747, 749, 750, 751, 753, 754, - - 755, 756, 757, 758, 764, 765, 755, 756, 757, 758, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 766, 767, 764, 768, 763, 769, 772, 779, - 781, 783, 785, 787, 784, 786, 790, 791, 793, 792, - 794, 796, 760, 760, 760, 760, 760, 760, 795, 797, - 801, 1404, 1388, 832, 767, 1156, 768, 801, 769, 832, - 783, 781, 766, 784, 785, 1388, 1164, 1156, 1164, 779, - 792, 794, 772, 793, 786, 787, 1405, 834, 835, 795, - 797, 790, 791, 834, 835, 798, 796, 798, 798, 798, - 798, 798, 798, 799, 851, 799, 799, 799, 799, 799, - - 799, 837, 838, 839, 840, 841, 842, 837, 838, 839, - 840, 841, 842, 843, 844, 846, 847, 848, 849, 843, - 844, 846, 847, 848, 849, 850, 850, 850, 850, 850, - 850, 850, 850, 850, 850, 850, 850, 852, 854, 855, - 856, 860, 857, 858, 851, 868, 871, 861, 874, 875, - 876, 869, 877, 872, 873, 878, 880, 850, 850, 850, - 850, 850, 850, 881, 884, 883, 888, 1165, 947, 1165, - 924, 952, 860, 888, 868, 882, 924, 871, 1406, 874, - 856, 852, 861, 854, 857, 858, 869, 878, 855, 872, - 873, 1407, 876, 875, 882, 926, 877, 883, 927, 947, - - 880, 926, 929, 1408, 927, 881, 884, 885, 929, 885, - 885, 885, 885, 885, 885, 886, 952, 886, 886, 886, - 886, 886, 886, 930, 931, 932, 934, 935, 936, 930, - 931, 932, 934, 935, 936, 938, 939, 940, 941, 942, - 943, 938, 939, 940, 941, 942, 943, 944, 964, 950, - 949, 966, 965, 944, 946, 946, 946, 946, 946, 946, - 946, 946, 946, 946, 946, 946, 953, 954, 955, 956, - 963, 967, 968, 969, 970, 1059, 972, 964, 973, 974, - 975, 977, 966, 1050, 1051, 976, 946, 946, 946, 946, - 946, 946, 949, 950, 965, 1021, 981, 1076, 974, 1409, - - 977, 1021, 967, 981, 1076, 953, 954, 955, 972, 956, - 963, 1051, 1059, 973, 968, 975, 969, 976, 978, 970, - 978, 978, 978, 978, 978, 978, 979, 1050, 979, 979, - 979, 979, 979, 979, 1023, 1024, 1025, 1026, 1027, 1028, - 1023, 1024, 1025, 1026, 1027, 1028, 1030, 1031, 1032, 1033, - 1034, 1035, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, - 1038, 1039, 1041, 1042, 1036, 1037, 1038, 1039, 1041, 1042, - 1043, 1044, 1049, 1052, 1061, 1062, 1043, 1044, 1045, 1045, - 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, - 1047, 1060, 1054, 1061, 1063, 1066, 1067, 1060, 1064, 1068, - - 1052, 1069, 1070, 1049, 1071, 1072, 1167, 1163, 1410, 1178, - 1045, 1045, 1045, 1045, 1045, 1045, 1178, 1064, 1073, 1062, - 1073, 1073, 1073, 1073, 1073, 1073, 1121, 1067, 1411, 1412, - 1047, 1054, 1121, 1413, 1066, 1071, 1069, 1167, 1063, 1068, - 1072, 1074, 1163, 1074, 1074, 1074, 1074, 1074, 1074, 1123, - 1124, 1126, 1070, 1127, 1128, 1123, 1124, 1126, 1130, 1127, - 1128, 1131, 1132, 1133, 1130, 1134, 1135, 1131, 1132, 1133, - 1137, 1134, 1135, 1138, 1139, 1141, 1137, 1142, 1143, 1138, - 1139, 1141, 1144, 1142, 1143, 1145, 1146, 1147, 1144, 1150, - 1151, 1145, 1146, 1147, 1149, 1149, 1149, 1149, 1149, 1149, - - 1149, 1149, 1149, 1149, 1149, 1149, 1153, 1154, 1155, 1162, - 1166, 1169, 1170, 1171, 1168, 1172, 1173, 1174, 1175, 1376, - 1175, 1175, 1175, 1175, 1175, 1175, 1149, 1149, 1149, 1149, - 1149, 1149, 1168, 1151, 1150, 1176, 1414, 1176, 1176, 1176, - 1176, 1176, 1176, 1153, 1154, 1166, 1172, 1415, 1227, 1162, - 1229, 1170, 1155, 1169, 1227, 1230, 1229, 1376, 1173, 1232, - 1233, 1230, 1234, 1171, 1235, 1232, 1233, 1174, 1234, 1236, - 1235, 1237, 1238, 1239, 1241, 1236, 1242, 1237, 1238, 1239, - 1241, 1243, 1242, 1244, 1245, 1246, 1247, 1243, 1248, 1244, - 1245, 1246, 1247, 1249, 1248, 1250, 1251, 1253, 1254, 1249, - - 1255, 1250, 1251, 1253, 1254, 1256, 1255, 1258, 1259, 1262, - 1266, 1256, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, - 1257, 1257, 1257, 1257, 1260, 1261, 1263, 1260, 1261, 1267, - 1268, 1269, 1270, 1271, 1272, 1274, 1275, 1278, 1416, 1371, - 1258, 1417, 1418, 1262, 1257, 1257, 1257, 1257, 1257, 1257, - 1419, 1259, 1266, 1279, 1420, 1279, 1279, 1279, 1279, 1279, - 1279, 1263, 1282, 1421, 1422, 1272, 1336, 1275, 1278, 1282, - 1271, 1338, 1336, 1371, 1339, 1268, 1269, 1338, 1274, 1267, - 1339, 1280, 1270, 1280, 1280, 1280, 1280, 1280, 1280, 1341, - 1342, 1343, 1344, 1346, 1347, 1341, 1342, 1343, 1344, 1346, - - 1347, 1348, 1350, 1351, 1352, 1353, 1354, 1348, 1350, 1351, - 1352, 1353, 1354, 1355, 1356, 1358, 1359, 1360, 1362, 1355, - 1356, 1358, 1359, 1360, 1362, 1363, 1364, 1365, 1366, 1367, - 1368, 1363, 1364, 1365, 1366, 1367, 1368, 1370, 1370, 1370, - 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1372, - 1373, 1374, 1380, 1381, 1382, 1384, 1383, 1385, 1389, 1392, - 1389, 1389, 1389, 1389, 1389, 1389, 1392, 1423, 1424, 1370, - 1370, 1370, 1370, 1370, 1370, 1425, 1372, 1373, 1374, 1426, - 1427, 1428, 1429, 1380, 1430, 1381, 1382, 1383, 1431, 1390, - 1384, 1390, 1390, 1390, 1390, 1390, 1390, 1432, 1433, 1434, - - 1385, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, - 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, - 1454, 1455, 1450, 1456, 1452, 1453, 1454, 1455, 1457, 1456, - 1458, 1459, 1460, 1461, 1457, 1462, 1463, 1459, 1460, 1461, - 1464, 1462, 1463, 1465, 1466, 1467, 1464, 1468, 1469, 1465, - 1466, 1467, 1470, 1468, 1471, 1472, 1473, 1474, 1470, 1475, - 1471, 1472, 1473, 1474, 1476, 1475, 1477, 1478, 1479, 1480, - 1476, 1481, 1477, 1478, 1479, 1480, 1482, 1483, 1484, 1485, - 1487, 1488, 1482, 1483, 1484, 1485, 1486, 1486, 1486, 1486, - 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1489, 1490, - - 1491, 1492, 1493, 1494, 1495, 1496, 1498, 1499, 1503, 1504, - 1505, 1497, 1500, 1506, 1488, 1507, 1504, 1508, 1486, 1486, - 1486, 1486, 1486, 1486, 1497, 1509, 1510, 1489, 1490, 1511, - 1512, 1513, 1514, 1498, 1515, 1491, 1495, 1496, 1501, 1500, - 1501, 1501, 1501, 1501, 1501, 1501, 1502, 1516, 1502, 1502, - 1502, 1502, 1502, 1502, 1517, 1518, 1499, 1519, 1520, 1521, - 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, - 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, - 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, - 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, - - 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1565, - 1571, 1567, 1568, 1572, 1570, 1573, 1571, 1574, 1575, 1572, - 1576, 1577, 1578, 1574, 1575, 1579, 1576, 1577, 1578, 1580, - 1581, 1579, 1582, 1583, 1584, 1585, 1581, 1586, 1582, 1583, - 1587, 1585, 1588, 1586, 1589, 1590, 1587, 1591, 1588, 1592, - 1589, 1590, 1593, 1591, 1594, 1595, 1596, 1597, 1593, 1598, - 1594, 1595, 1599, 1597, 1600, 1598, 1601, 1602, 1599, 1603, - 1600, 1604, 1601, 1602, 1606, 1603, 1605, 1605, 1605, 1605, - 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1607, 1608, - 1609, 1610, 1611, 1612, 1613, 1617, 1616, 1620, 1622, 1614, - - 1615, 1623, 1624, 1625, 1620, 1606, 1626, 1627, 1605, 1605, - 1605, 1605, 1605, 1605, 1618, 1629, 1618, 1618, 1618, 1618, - 1618, 1618, 1607, 1608, 1612, 1613, 1614, 1630, 1615, 1621, - 1628, 1631, 1632, 1633, 1609, 1616, 1621, 1628, 1634, 1635, - 1636, 1637, 1619, 1617, 1619, 1619, 1619, 1619, 1619, 1619, - 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, - 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, - 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, - 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, - 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, - - 1688, 1689, 1684, 1690, 1686, 1687, 1691, 1689, 1692, 1690, - 1693, 1694, 1691, 1695, 1692, 1696, 1693, 1694, 1697, 1695, - 1698, 1696, 1699, 1700, 1701, 1702, 1698, 1703, 1699, 1700, - 1701, 1702, 1704, 1703, 1705, 1706, 1707, 1708, 1704, 1709, - 1705, 1706, 1707, 1708, 1710, 1711, 1712, 1713, 1714, 1715, - 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, - 1720, 1721, 1716, 1717, 1718, 1719, 1720, 1722, 1723, 1724, - 1725, 1728, 1727, 1722, 1723, 1724, 1725, 1726, 1726, 1726, - 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1729, - 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1741, - - 1742, 1743, 1728, 1744, 1745, 1738, 1741, 1746, 1747, 1726, - 1726, 1726, 1726, 1726, 1726, 1727, 1748, 1749, 1750, 1751, - 1729, 1752, 1753, 1754, 1755, 1739, 1737, 1739, 1739, 1739, - 1739, 1739, 1739, 1736, 1756, 1733, 1734, 1757, 1758, 1759, - 1760, 1761, 1740, 1735, 1740, 1740, 1740, 1740, 1740, 1740, - 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, - 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, - 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, - 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, - 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1805, - - 1811, 1807, 1808, 1809, 1810, 1812, 1811, 1813, 1814, 1815, - 1816, 1817, 1818, 1813, 1814, 1815, 1819, 1817, 1818, 1820, - 1821, 1822, 1819, 1823, 1824, 1820, 1821, 1822, 1825, 1823, - 1826, 1827, 1828, 1829, 1825, 1830, 1826, 1827, 1831, 1829, - 1832, 1830, 1833, 1834, 1831, 1835, 1832, 1836, 1833, 1834, - 1837, 1835, 1838, 1839, 1840, 1841, 1837, 1842, 1838, 1839, - 1843, 1841, 1844, 1842, 1845, 1846, 1843, 1847, 1844, 1848, - 1845, 1846, 1850, 1847, 1849, 1849, 1849, 1849, 1849, 1849, - 1849, 1849, 1849, 1849, 1849, 1849, 1851, 1852, 1853, 1854, - 1855, 1856, 1857, 1858, 1859, 1860, 1863, 1864, 1861, 1857, - - 1861, 1861, 1861, 1861, 1861, 1861, 1849, 1849, 1849, 1849, - 1849, 1849, 1862, 1865, 1862, 1862, 1862, 1862, 1862, 1862, - 1866, 1867, 1868, 1869, 1858, 1870, 1871, 1872, 1873, 1874, - 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1860, 1882, 1883, - 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, - 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, - 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, - 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, - 1924, 1925, 1926, 1927, 1928, 1929, 1924, 1925, 1926, 1927, - 1930, 1929, 1931, 1932, 1933, 1934, 1930, 1935, 1931, 1932, - - 1933, 1934, 1936, 1935, 1937, 1938, 1939, 1940, 1936, 1941, - 1937, 1938, 1942, 1940, 1943, 1941, 1944, 1945, 1942, 1946, - 1943, 1947, 1944, 1945, 1948, 1946, 1949, 1947, 1950, 1951, - 1948, 1952, 1949, 1953, 1950, 1954, 1955, 1952, 1956, 1953, - 1957, 1954, 1955, 1958, 1956, 1959, 1957, 1960, 1961, 1958, - 1962, 1959, 1963, 1960, 1961, 1964, 1962, 1965, 1966, 1967, - 1969, 1964, 1970, 1965, 1966, 1967, 1968, 1968, 1968, 1968, - 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1971, 1972, - 1974, 1973, 1974, 1974, 1974, 1974, 1974, 1974, 1975, 1976, - 1975, 1975, 1975, 1975, 1975, 1975, 1977, 1978, 1968, 1968, - - 1968, 1968, 1968, 1968, 1979, 1980, 1981, 1982, 1983, 1984, - 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, - 1971, 1973, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, - 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, - 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, - 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2034, 2035, 2036, + 15, 15, 19, 22, 626, 21, 120, 24, 25, 25, + 20, 26, 30, 19, 30, 88, 723, 25, 723, 22, + 19, 20, 15, 15, 15, 15, 15, 15, 19, 52, + 20, 602, 591, 598, 30, 19, 22, 19, 27, 27, + + 26, 1363, 22, 25, 19, 88, 15, 31, 25, 28, + 626, 26, 29, 27, 22, 28, 26, 29, 32, 25, + 34, 32, 26, 28, 130, 27, 88, 32, 598, 27, + 33, 130, 31, 27, 33, 34, 31, 39, 27, 29, + 62, 28, 39, 29, 33, 34, 31, 31, 28, 27, + 28, 31, 29, 67, 29, 36, 31, 29, 31, 34, + 28, 58, 36, 29, 38, 37, 37, 32, 39, 32, + 38, 62, 64, 33, 60, 36, 63, 64, 38, 36, + 37, 33, 66, 64, 134, 646, 36, 58, 39, 60, + 134, 62, 37, 55, 55, 67, 38, 44, 44, 44, + + 44, 44, 66, 38, 67, 37, 46, 46, 46, 46, + 46, 58, 219, 596, 63, 38, 37, 40, 225, 219, + 55, 40, 40, 315, 225, 60, 156, 63, 40, 315, + 40, 40, 646, 66, 1093, 47, 40, 47, 47, 47, + 47, 47, 47, 40, 55, 65, 69, 40, 40, 1364, + 156, 596, 1093, 40, 156, 40, 40, 82, 68, 48, + 40, 48, 48, 48, 48, 48, 48, 40, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 70, 73, 74, 77, 71, 75, 76, 69, 65, 68, + 71, 83, 79, 78, 70, 81, 65, 69, 84, 82, + + 53, 53, 53, 53, 53, 53, 80, 85, 82, 68, + 83, 75, 90, 87, 89, 90, 71, 84, 73, 86, + 601, 96, 74, 77, 92, 76, 93, 91, 601, 1365, + 75, 70, 73, 74, 77, 71, 78, 76, 79, 81, + 87, 90, 83, 79, 78, 80, 81, 91, 86, 84, + 85, 89, 86, 98, 95, 93, 94, 80, 85, 97, + 95, 102, 100, 90, 87, 89, 99, 103, 92, 104, + 86, 91, 96, 94, 101, 92, 105, 93, 91, 98, + 107, 309, 94, 106, 99, 108, 95, 111, 309, 115, + 182, 109, 1291, 104, 107, 1291, 102, 94, 98, 110, + + 112, 102, 104, 97, 94, 95, 100, 113, 99, 103, + 97, 101, 102, 100, 111, 106, 101, 99, 103, 108, + 106, 109, 105, 113, 106, 101, 106, 105, 110, 111, + 115, 107, 114, 116, 106, 117, 108, 118, 111, 112, + 115, 182, 109, 112, 117, 114, 121, 119, 389, 116, + 110, 112, 615, 617, 123, 389, 976, 125, 113, 125, + 125, 125, 125, 125, 317, 730, 1366, 730, 118, 976, + 317, 126, 121, 126, 126, 126, 126, 126, 123, 615, + 617, 151, 137, 114, 116, 123, 117, 148, 118, 119, + 127, 121, 127, 127, 127, 127, 127, 127, 119, 124, + + 137, 124, 138, 128, 124, 128, 128, 128, 128, 128, + 128, 133, 133, 133, 133, 133, 124, 142, 124, 144, + 136, 151, 150, 150, 137, 124, 138, 124, 145, 698, + 124, 148, 151, 137, 698, 138, 142, 147, 148, 152, + 124, 154, 124, 136, 153, 149, 155, 1367, 144, 124, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 158, 157, 147, 159, 145, 154, 142, 155, + 144, 136, 149, 150, 160, 153, 161, 162, 152, 145, + 164, 165, 135, 135, 135, 135, 135, 135, 147, 167, + 152, 166, 154, 155, 169, 153, 149, 155, 157, 163, + + 163, 163, 168, 159, 171, 160, 158, 170, 172, 167, + 171, 162, 165, 158, 157, 173, 159, 174, 175, 179, + 164, 161, 168, 176, 1194, 160, 1194, 161, 162, 175, + 166, 164, 165, 180, 1368, 1370, 184, 190, 169, 177, + 167, 178, 166, 170, 187, 169, 173, 192, 176, 1373, + 1378, 172, 163, 168, 175, 171, 179, 177, 170, 172, + 181, 174, 186, 176, 180, 178, 173, 181, 174, 175, + 179, 184, 188, 185, 178, 189, 191, 190, 187, 194, + 192, 177, 193, 195, 180, 181, 186, 184, 190, 198, + 177, 181, 185, 200, 186, 187, 201, 197, 192, 196, + + 181, 193, 202, 203, 199, 205, 206, 209, 204, 188, + 195, 212, 200, 207, 208, 198, 185, 210, 207, 189, + 191, 194, 600, 188, 185, 211, 189, 191, 197, 206, + 194, 712, 201, 193, 195, 199, 196, 204, 203, 792, + 198, 210, 205, 344, 200, 208, 202, 201, 197, 213, + 196, 792, 732, 202, 203, 199, 205, 206, 209, 204, + 712, 600, 212, 214, 207, 208, 344, 211, 210, 593, + 214, 214, 732, 213, 344, 214, 211, 213, 215, 215, + 215, 215, 215, 223, 223, 223, 223, 223, 214, 224, + 224, 224, 224, 224, 214, 214, 228, 233, 229, 214, + + 593, 1382, 216, 214, 216, 216, 216, 216, 216, 216, + 217, 229, 217, 217, 217, 217, 217, 217, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 232, 228, 230, 234, 233, 235, 229, 236, 234, 237, + 239, 240, 242, 241, 242, 243, 245, 228, 233, 229, + 227, 227, 227, 227, 227, 227, 244, 230, 247, 251, + 252, 232, 249, 253, 250, 791, 235, 1390, 1394, 791, + 230, 241, 255, 236, 237, 245, 257, 256, 258, 266, + 260, 232, 268, 240, 234, 259, 235, 243, 236, 239, + 237, 239, 240, 242, 241, 250, 243, 245, 255, 249, + + 244, 262, 252, 256, 253, 254, 260, 244, 264, 247, + 251, 252, 267, 249, 253, 250, 259, 254, 257, 263, + 258, 261, 265, 255, 254, 263, 261, 257, 256, 258, + 266, 260, 262, 268, 270, 270, 259, 603, 271, 272, + 273, 1185, 274, 264, 275, 276, 278, 267, 279, 280, + 283, 281, 262, 1185, 276, 285, 254, 1402, 282, 264, + 286, 270, 638, 267, 271, 284, 265, 279, 274, 287, + 263, 288, 261, 265, 272, 291, 294, 290, 295, 603, + 276, 283, 292, 296, 275, 270, 285, 293, 271, 297, + 272, 273, 274, 281, 638, 275, 276, 278, 282, 279, + + 280, 283, 281, 299, 287, 284, 285, 290, 286, 282, + 288, 286, 300, 292, 301, 291, 284, 294, 293, 298, + 287, 345, 288, 296, 297, 302, 291, 294, 290, 295, + 293, 320, 319, 292, 296, 303, 361, 302, 293, 476, + 297, 1408, 398, 303, 345, 298, 476, 303, 398, 323, + 400, 302, 345, 401, 299, 1410, 400, 301, 488, 401, + 361, 303, 302, 300, 488, 301, 1411, 490, 361, 303, + 298, 319, 303, 490, 304, 302, 304, 304, 304, 304, + 304, 322, 320, 319, 305, 303, 305, 305, 305, 305, + 305, 306, 323, 306, 306, 306, 306, 306, 306, 307, + + 323, 307, 307, 307, 307, 307, 307, 318, 318, 318, + 318, 318, 318, 318, 318, 318, 318, 318, 318, 324, + 325, 327, 328, 329, 325, 322, 330, 326, 331, 896, + 330, 334, 322, 333, 338, 340, 336, 341, 332, 318, + 318, 318, 318, 318, 318, 333, 325, 326, 334, 335, + 326, 339, 1195, 350, 1195, 342, 343, 348, 335, 324, + 329, 346, 340, 347, 327, 896, 328, 350, 331, 355, + 324, 325, 327, 328, 329, 332, 351, 330, 326, 331, + 336, 352, 334, 338, 333, 338, 340, 336, 341, 332, + 342, 343, 346, 339, 348, 347, 353, 357, 355, 354, + + 335, 358, 339, 359, 350, 360, 342, 343, 348, 363, + 356, 365, 346, 356, 347, 351, 352, 354, 354, 636, + 355, 367, 362, 357, 360, 373, 364, 351, 366, 368, + 369, 365, 352, 353, 374, 370, 376, 377, 375, 356, + 358, 379, 359, 382, 363, 357, 785, 353, 360, 368, + 354, 380, 358, 362, 359, 364, 360, 366, 636, 369, + 363, 356, 365, 374, 367, 370, 785, 383, 563, 378, + 373, 805, 367, 362, 379, 563, 373, 364, 405, 366, + 368, 369, 375, 378, 382, 374, 370, 376, 377, 375, + 380, 384, 379, 383, 382, 385, 385, 385, 385, 385, + + 805, 407, 380, 404, 408, 1412, 386, 384, 386, 386, + 386, 386, 386, 386, 406, 383, 411, 384, 410, 387, + 378, 387, 387, 387, 387, 387, 387, 414, 415, 405, + 1419, 384, 416, 404, 407, 412, 413, 417, 420, 384, + 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 407, 410, 404, 408, 413, 406, 411, 415, + 419, 418, 423, 421, 424, 406, 425, 411, 417, 410, + 418, 414, 403, 403, 403, 403, 403, 403, 414, 415, + 412, 416, 420, 416, 426, 436, 412, 413, 417, 420, + 421, 427, 435, 438, 440, 441, 442, 444, 439, 443, + + 434, 491, 493, 425, 447, 419, 450, 491, 493, 1420, + 448, 419, 418, 423, 421, 424, 434, 425, 439, 435, + 434, 445, 426, 453, 444, 442, 441, 446, 436, 451, + 450, 440, 445, 452, 449, 426, 436, 450, 443, 455, + 447, 427, 427, 435, 438, 440, 441, 442, 444, 439, + 443, 434, 446, 448, 449, 447, 454, 445, 451, 456, + 457, 448, 458, 453, 459, 463, 459, 446, 462, 464, + 466, 464, 445, 467, 453, 455, 497, 452, 449, 469, + 451, 459, 465, 465, 452, 449, 494, 642, 695, 458, + 455, 454, 494, 456, 471, 471, 471, 471, 471, 471, + + 498, 463, 457, 467, 1425, 462, 469, 454, 580, 470, + 456, 457, 1427, 458, 580, 459, 463, 582, 470, 462, + 464, 466, 583, 582, 467, 504, 695, 497, 583, 642, + 469, 496, 500, 465, 470, 472, 472, 472, 472, 472, + 472, 473, 470, 473, 473, 473, 473, 473, 473, 470, + 474, 498, 474, 474, 474, 474, 474, 474, 495, 495, + 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, + 500, 496, 501, 502, 503, 505, 504, 506, 511, 507, + 508, 509, 496, 500, 507, 510, 513, 1428, 507, 515, + 495, 495, 495, 495, 495, 495, 522, 506, 514, 508, + + 523, 527, 525, 532, 528, 524, 529, 501, 529, 503, + 533, 502, 509, 530, 531, 536, 510, 1429, 505, 539, + 515, 585, 511, 501, 502, 503, 505, 585, 506, 511, + 507, 508, 509, 514, 524, 528, 510, 513, 522, 540, + 515, 527, 523, 525, 531, 537, 532, 522, 538, 514, + 537, 523, 527, 525, 532, 528, 524, 529, 535, 530, + 535, 533, 539, 535, 530, 531, 536, 541, 542, 543, + 539, 544, 545, 535, 538, 554, 537, 546, 724, 547, + 548, 551, 552, 586, 553, 557, 587, 555, 540, 586, + 540, 544, 587, 597, 538, 554, 537, 588, 622, 545, + + 543, 676, 1421, 588, 541, 678, 542, 676, 558, 535, + 604, 678, 551, 552, 557, 1421, 724, 622, 541, 542, + 543, 546, 544, 545, 547, 548, 554, 555, 546, 553, + 547, 548, 551, 552, 558, 553, 557, 597, 555, 559, + 559, 559, 559, 559, 560, 604, 560, 560, 560, 560, + 560, 560, 599, 561, 558, 561, 561, 561, 561, 561, + 561, 590, 590, 590, 590, 590, 590, 590, 590, 590, + 590, 590, 590, 606, 614, 616, 621, 627, 624, 625, + 623, 633, 629, 634, 637, 635, 643, 628, 649, 649, + 649, 649, 649, 590, 590, 590, 590, 590, 590, 623, + + 599, 628, 639, 644, 654, 648, 616, 629, 806, 1430, + 679, 654, 633, 689, 614, 637, 679, 606, 1431, 629, + 635, 621, 624, 627, 625, 680, 628, 634, 681, 1432, + 643, 680, 689, 639, 681, 644, 648, 806, 628, 650, + 650, 650, 650, 650, 651, 691, 651, 651, 651, 651, + 651, 651, 652, 692, 652, 652, 652, 652, 652, 652, + 682, 683, 685, 686, 687, 693, 682, 683, 685, 686, + 687, 688, 688, 688, 688, 688, 688, 688, 688, 688, + 688, 688, 688, 694, 692, 691, 696, 697, 699, 700, + 709, 710, 701, 714, 713, 715, 693, 717, 720, 722, + + 725, 728, 782, 688, 688, 688, 688, 688, 688, 718, + 719, 721, 727, 731, 738, 802, 700, 786, 720, 699, + 824, 738, 765, 710, 1433, 694, 713, 824, 765, 717, + 696, 697, 701, 714, 709, 715, 784, 782, 1434, 722, + 718, 719, 721, 725, 727, 731, 728, 802, 735, 720, + 735, 735, 735, 735, 735, 735, 736, 786, 736, 736, + 736, 736, 736, 736, 767, 768, 770, 771, 772, 774, + 767, 768, 770, 771, 772, 774, 775, 776, 777, 778, + 779, 784, 775, 776, 777, 778, 779, 781, 781, 781, + 781, 781, 781, 781, 781, 781, 781, 781, 781, 787, + + 788, 789, 790, 793, 794, 801, 803, 808, 804, 807, + 809, 812, 813, 814, 815, 818, 876, 816, 875, 781, + 781, 781, 781, 781, 781, 820, 909, 817, 819, 855, + 857, 788, 789, 790, 883, 855, 857, 803, 1435, 787, + 804, 807, 1436, 794, 814, 801, 808, 793, 816, 815, + 876, 1292, 809, 909, 1292, 858, 812, 813, 817, 819, + 818, 858, 875, 1437, 1438, 883, 821, 820, 821, 821, + 821, 821, 821, 821, 822, 874, 822, 822, 822, 822, + 822, 822, 860, 861, 862, 863, 864, 865, 860, 861, + 862, 863, 864, 865, 866, 867, 869, 870, 871, 872, + + 866, 867, 869, 870, 871, 872, 873, 873, 873, 873, + 873, 873, 873, 873, 873, 873, 873, 873, 877, 878, + 879, 884, 880, 881, 892, 874, 885, 893, 895, 899, + 897, 901, 900, 904, 905, 906, 898, 902, 873, 873, + 873, 873, 873, 873, 908, 885, 907, 998, 913, 972, + 975, 949, 951, 892, 906, 913, 884, 949, 951, 895, + 879, 1439, 893, 877, 880, 881, 897, 898, 878, 902, + 1440, 1441, 1442, 899, 900, 901, 905, 904, 907, 998, + 972, 1443, 1444, 977, 1445, 910, 908, 910, 910, 910, + 910, 910, 910, 911, 975, 911, 911, 911, 911, 911, + + 911, 952, 954, 955, 956, 957, 959, 952, 954, 955, + 956, 957, 959, 960, 961, 963, 964, 965, 966, 960, + 961, 963, 964, 965, 966, 967, 968, 969, 977, 982, + 974, 967, 968, 969, 971, 971, 971, 971, 971, 971, + 971, 971, 971, 971, 971, 971, 978, 979, 980, 981, + 989, 990, 991, 992, 994, 995, 996, 993, 999, 1002, + 1000, 1076, 1001, 1003, 1074, 1097, 971, 971, 971, 971, + 971, 971, 974, 1004, 1008, 1087, 1089, 1048, 982, 1000, + 990, 1008, 1003, 1048, 992, 978, 979, 980, 993, 981, + 989, 1002, 1076, 999, 991, 1089, 994, 1001, 995, 1446, + + 1097, 996, 1004, 1005, 1074, 1005, 1005, 1005, 1005, 1005, + 1005, 1006, 1087, 1006, 1006, 1006, 1006, 1006, 1006, 1050, + 1051, 1052, 1053, 1054, 1055, 1050, 1051, 1052, 1053, 1054, + 1055, 1057, 1058, 1059, 1060, 1061, 1062, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1068, 1069, 1063, + 1064, 1065, 1066, 1068, 1069, 1070, 1071, 1077, 1078, 1079, + 1080, 1070, 1071, 1072, 1072, 1072, 1072, 1072, 1072, 1072, + 1072, 1072, 1072, 1072, 1072, 1081, 1082, 1088, 1090, 1091, + 1094, 1095, 1098, 1088, 1092, 1078, 1079, 1096, 1101, 1099, + 1100, 1182, 1183, 1080, 1405, 1072, 1072, 1072, 1072, 1072, + + 1072, 1077, 1102, 1092, 1102, 1102, 1102, 1102, 1102, 1102, + 1105, 1209, 1095, 1447, 1081, 1082, 1448, 1105, 1209, 1094, + 1099, 1405, 1090, 1091, 1101, 1100, 1449, 1096, 1182, 1183, + 1450, 1103, 1098, 1103, 1103, 1103, 1103, 1103, 1103, 1150, + 1152, 1153, 1155, 1156, 1157, 1150, 1152, 1153, 1155, 1156, + 1157, 1159, 1160, 1161, 1162, 1163, 1164, 1159, 1160, 1161, + 1162, 1163, 1164, 1166, 1167, 1168, 1170, 1171, 1172, 1166, + 1167, 1168, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1179, + 1180, 1173, 1174, 1175, 1176, 1178, 1178, 1178, 1178, 1178, + 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1184, 1186, 1192, + + 1193, 1196, 1197, 1199, 1200, 1201, 1202, 1198, 1203, 1204, + 1258, 1205, 1298, 1290, 1409, 1293, 1258, 1178, 1178, 1178, + 1178, 1178, 1178, 1180, 1179, 1198, 1260, 1186, 1261, 1451, + 1303, 1452, 1260, 1197, 1261, 1193, 1196, 1202, 1263, 1192, + 1453, 1184, 1264, 1200, 1263, 1199, 1205, 1265, 1264, 1293, + 1203, 1266, 1409, 1265, 1298, 1201, 1290, 1266, 1206, 1204, + 1206, 1206, 1206, 1206, 1206, 1206, 1207, 1303, 1207, 1207, + 1207, 1207, 1207, 1207, 1267, 1268, 1269, 1270, 1272, 1273, + 1267, 1268, 1269, 1270, 1272, 1273, 1274, 1275, 1276, 1277, + 1278, 1279, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, + + 1282, 1284, 1285, 1286, 1280, 1281, 1282, 1284, 1285, 1286, + 1287, 1289, 1294, 1299, 1300, 1301, 1287, 1288, 1288, 1288, + 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1302, + 1304, 1306, 1311, 1307, 1310, 1312, 1315, 1312, 1312, 1312, + 1312, 1312, 1312, 1315, 1289, 1454, 1413, 1294, 1426, 1288, + 1288, 1288, 1288, 1288, 1288, 1426, 1369, 1455, 1456, 1300, + 1301, 1304, 1369, 1299, 1307, 1310, 1371, 1372, 1457, 1374, + 1375, 1311, 1371, 1372, 1306, 1374, 1375, 1413, 1313, 1302, + 1313, 1313, 1313, 1313, 1313, 1313, 1376, 1377, 1379, 1380, + 1381, 1383, 1376, 1377, 1379, 1380, 1381, 1383, 1384, 1385, + + 1386, 1387, 1388, 1389, 1384, 1385, 1386, 1387, 1388, 1389, + 1391, 1392, 1393, 1395, 1396, 1397, 1391, 1392, 1393, 1395, + 1396, 1397, 1398, 1399, 1400, 1401, 1404, 1406, 1398, 1399, + 1400, 1401, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 1403, 1403, 1403, 1403, 1407, 1414, 1415, 1417, 1416, 1418, + 1422, 1458, 1459, 1460, 1406, 1461, 1462, 1463, 1464, 1465, + 1404, 1466, 1467, 1468, 1403, 1403, 1403, 1403, 1403, 1403, + 1469, 1407, 1470, 1471, 1472, 1473, 1474, 1414, 1415, 1416, + 1475, 1476, 1417, 1422, 1423, 1477, 1423, 1423, 1423, 1423, + 1423, 1423, 1418, 1424, 1478, 1424, 1424, 1424, 1424, 1424, + + 1424, 1479, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, + 1488, 1489, 1484, 1490, 1486, 1487, 1488, 1489, 1491, 1490, + 1492, 1493, 1494, 1495, 1491, 1496, 1497, 1493, 1494, 1495, + 1498, 1496, 1497, 1499, 1500, 1501, 1498, 1502, 1503, 1499, + 1500, 1501, 1504, 1502, 1505, 1506, 1507, 1508, 1504, 1509, + 1505, 1506, 1507, 1508, 1510, 1509, 1511, 1512, 1513, 1514, + 1510, 1515, 1511, 1512, 1513, 1514, 1516, 1517, 1518, 1519, + 1521, 1522, 1516, 1517, 1518, 1519, 1520, 1520, 1520, 1520, + 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1523, 1524, + 1525, 1526, 1527, 1528, 1529, 1530, 1532, 1533, 1535, 1538, + + 1539, 1531, 1534, 1540, 1522, 1541, 1542, 1539, 1520, 1520, + 1520, 1520, 1520, 1520, 1531, 1543, 1544, 1523, 1524, 1545, + 1546, 1547, 1548, 1532, 1549, 1525, 1529, 1530, 1536, 1534, + 1536, 1536, 1536, 1536, 1536, 1536, 1537, 1550, 1537, 1537, + 1537, 1537, 1537, 1537, 1551, 1552, 1533, 1553, 1554, 1555, + 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, + 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, + 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, + 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, + 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, + + 1600, 1606, 1602, 1603, 1607, 1605, 1608, 1606, 1609, 1610, + 1607, 1611, 1612, 1613, 1609, 1610, 1614, 1611, 1612, 1613, + 1615, 1616, 1614, 1617, 1618, 1619, 1620, 1616, 1621, 1617, + 1618, 1622, 1620, 1623, 1621, 1624, 1625, 1622, 1626, 1623, + 1627, 1624, 1625, 1628, 1626, 1629, 1630, 1631, 1632, 1628, + 1633, 1629, 1630, 1634, 1632, 1635, 1633, 1636, 1637, 1634, + 1638, 1635, 1639, 1636, 1637, 1641, 1638, 1640, 1640, 1640, + 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1642, + 1643, 1644, 1645, 1646, 1647, 1648, 1652, 1651, 1655, 1657, + 1649, 1650, 1658, 1659, 1660, 1655, 1641, 1661, 1662, 1640, + + 1640, 1640, 1640, 1640, 1640, 1653, 1664, 1653, 1653, 1653, + 1653, 1653, 1653, 1642, 1643, 1647, 1648, 1649, 1665, 1650, + 1656, 1663, 1666, 1667, 1668, 1644, 1651, 1656, 1663, 1669, + 1670, 1671, 1672, 1654, 1652, 1654, 1654, 1654, 1654, 1654, + 1654, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, + 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, + 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, + 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, + 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, + 1722, 1723, 1724, 1719, 1725, 1721, 1722, 1726, 1724, 1727, + + 1725, 1728, 1729, 1726, 1730, 1727, 1731, 1728, 1729, 1732, + 1730, 1733, 1731, 1734, 1735, 1736, 1737, 1733, 1738, 1734, + 1735, 1736, 1737, 1739, 1738, 1740, 1741, 1742, 1743, 1739, + 1744, 1740, 1741, 1742, 1743, 1745, 1746, 1747, 1748, 1749, + 1750, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, + 1754, 1755, 1756, 1751, 1752, 1753, 1754, 1755, 1757, 1758, + 1759, 1760, 1763, 1762, 1757, 1758, 1759, 1760, 1761, 1761, + 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, + 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, + 1776, 1777, 1778, 1763, 1779, 1780, 1773, 1776, 1781, 1782, + + 1761, 1761, 1761, 1761, 1761, 1761, 1762, 1783, 1784, 1785, + 1786, 1764, 1787, 1788, 1789, 1790, 1774, 1772, 1774, 1774, + 1774, 1774, 1774, 1774, 1771, 1791, 1768, 1769, 1792, 1793, + 1794, 1795, 1796, 1775, 1770, 1775, 1775, 1775, 1775, 1775, + 1775, 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, + 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, + 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, + 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, + 1840, 1846, 1842, 1843, 1844, 1845, 1847, 1846, 1848, 1849, + + 1850, 1851, 1852, 1853, 1848, 1849, 1850, 1854, 1852, 1853, + 1855, 1856, 1857, 1854, 1858, 1859, 1855, 1856, 1857, 1860, + 1858, 1861, 1862, 1863, 1864, 1860, 1865, 1861, 1862, 1866, + 1864, 1867, 1865, 1868, 1869, 1866, 1870, 1867, 1871, 1868, + 1869, 1872, 1870, 1873, 1874, 1875, 1876, 1872, 1877, 1873, + 1874, 1878, 1876, 1879, 1877, 1880, 1881, 1878, 1882, 1879, + 1883, 1880, 1881, 1885, 1882, 1884, 1884, 1884, 1884, 1884, + 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1886, 1887, 1888, + 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1898, 1899, 1896, + 1892, 1896, 1896, 1896, 1896, 1896, 1896, 1884, 1884, 1884, + + 1884, 1884, 1884, 1897, 1900, 1897, 1897, 1897, 1897, 1897, + 1897, 1901, 1902, 1903, 1904, 1893, 1905, 1906, 1907, 1908, + 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1895, 1917, + 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, + 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, + 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, + 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1959, 1960, 1961, + 1962, 1965, 1964, 1966, 1967, 1968, 1969, 1965, 1970, 1966, + 1967, 1968, 1969, 1971, 1970, 1972, 1973, 1974, 1975, 1971, + + 1976, 1972, 1973, 1977, 1975, 1978, 1976, 1979, 1980, 1977, + 1981, 1978, 1982, 1979, 1980, 1983, 1981, 1984, 1982, 1985, + 1986, 1983, 1987, 1984, 1988, 1985, 1989, 1990, 1987, 1991, + 1988, 1992, 1989, 1990, 1993, 1991, 1994, 1992, 1995, 1996, + 1993, 1997, 1994, 1998, 1995, 1996, 1999, 1997, 2000, 2001, + 2002, 2004, 1999, 2005, 2000, 2001, 2002, 2003, 2003, 2003, + 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2006, + 2007, 2009, 2008, 2009, 2009, 2009, 2009, 2009, 2009, 2010, + 2011, 2010, 2010, 2010, 2010, 2010, 2010, 2012, 2013, 2003, + 2003, 2003, 2003, 2003, 2003, 2014, 2015, 2016, 2017, 2018, + + 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, + 2029, 2006, 2008, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, - 2041, 2042, 2043, 2047, 2045, 2046, 2048, 2049, 2050, 2047, - 2051, 2052, 2048, 2049, 2050, 2053, 2051, 2054, 2055, 2056, - - 2057, 2053, 2058, 2054, 2055, 2059, 2057, 2060, 2058, 2061, - 2062, 2059, 2063, 2060, 2064, 2061, 2062, 2065, 2063, 2066, - 2067, 2068, 2069, 2065, 2070, 2066, 2067, 2071, 2069, 2072, - 2070, 2073, 2074, 2071, 2075, 2072, 2076, 2073, 2074, 2078, - 2075, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, - 2077, 2077, 2077, 2079, 2080, 2081, 2082, 2084, 2082, 2082, - 2082, 2082, 2082, 2082, 2083, 2085, 2083, 2083, 2083, 2083, - 2083, 2083, 2086, 2077, 2077, 2077, 2077, 2077, 2077, 2087, - 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, - 2098, 2099, 2100, 2101, 2080, 2102, 2103, 2104, 2105, 2106, - - 2107, 2108, 2081, 2109, 2110, 2111, 2112, 2113, 2114, 2115, - 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, - 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, - 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2138, 2139, - 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, - 2144, 2145, 2146, 2147, 2150, 2149, 2151, 2152, 2153, 2154, - 2150, 2155, 2151, 2152, 2153, 2154, 2156, 2155, 2157, 2158, - 2159, 2160, 2156, 2161, 2157, 2158, 2159, 2162, 2163, 2161, - 2164, 2165, 2166, 2162, 2163, 2167, 2164, 2165, 2166, 2168, - 2169, 2167, 2170, 2171, 2172, 2168, 2169, 2173, 2170, 2171, - - 2174, 2175, 2176, 2173, 2178, 2179, 2174, 2175, 2176, 2177, - 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, - 2177, 2180, 2181, 2182, 2184, 2182, 2182, 2182, 2182, 2182, - 2182, 2183, 2185, 2183, 2183, 2183, 2183, 2183, 2183, 2186, - 2187, 2177, 2177, 2177, 2177, 2177, 2177, 2188, 2189, 2190, - 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, - 2201, 2181, 2202, 2203, 2204, 2205, 2181, 2206, 2180, 2207, - 2203, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, - 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, - 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, - - 2237, 2232, 2233, 2234, 2238, 2236, 2237, 2239, 2240, 2241, - 2238, 2242, 2243, 2239, 2240, 2241, 2244, 2242, 2243, 2245, - 2246, 2247, 2248, 2249, 2250, 2245, 2246, 2247, 2251, 2249, - 2250, 2252, 2253, 2254, 2251, 2255, 2256, 2252, 2253, 2254, - 2257, 2255, 2258, 2259, 2260, 2261, 2257, 2262, 2258, 2259, - 2263, 2261, 2264, 2262, 2265, 2266, 2263, 2267, 2264, 2268, - 2265, 2266, 2272, 2267, 2269, 2269, 2269, 2269, 2269, 2269, - 2269, 2269, 2269, 2269, 2269, 2269, 2273, 2274, 2275, 2277, - 2275, 2275, 2275, 2275, 2275, 2275, 2276, 2278, 2276, 2276, - 2276, 2276, 2276, 2276, 2279, 2280, 2269, 2269, 2269, 2269, - - 2269, 2269, 2281, 2282, 2283, 2284, 2272, 2285, 2286, 2287, - 2288, 2274, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, - 2297, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, - 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, - 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2319, 2320, - 2321, 2322, 2323, 2325, 2326, 2327, 2328, 2329, 2330, 2325, - 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, - 2336, 2331, 2332, 2333, 2334, 2335, 2337, 2338, 2339, 2340, - 2341, 2342, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, - 2345, 2346, 2347, 2348, 2343, 2344, 2345, 2346, 2347, 2349, - - 2350, 2351, 2352, 2354, 2355, 2349, 2350, 2351, 2352, 2353, - 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, 2353, - 2353, 2356, 2358, 2356, 2356, 2356, 2356, 2356, 2356, 2357, - 2359, 2357, 2357, 2357, 2357, 2357, 2357, 2354, 2360, 2361, - 2362, 2353, 2353, 2353, 2353, 2353, 2353, 2363, 2364, 2365, - 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, - 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, - 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, - 2396, 2397, 2398, 2399, 2400, 2395, 2396, 2397, 2398, 2399, - 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2402, 2403, - - 2404, 2408, 2406, 2407, 2409, 2410, 2411, 2408, 2412, 2413, - 2409, 2410, 2411, 2414, 2412, 2415, 2416, 2417, 2418, 2414, - 2419, 2415, 2416, 2420, 2418, 2421, 2419, 2422, 2423, 2420, - 2424, 2421, 2425, 2422, 2423, 2427, 2424, 2426, 2426, 2426, - 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2428, - 2430, 2428, 2428, 2428, 2428, 2428, 2428, 2429, 2431, 2429, - 2429, 2429, 2429, 2429, 2429, 2432, 2433, 2434, 2435, 2426, - 2426, 2426, 2426, 2426, 2426, 2436, 2437, 2438, 2439, 2440, - 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, 2450, - 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, - - 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2462, 2463, 2464, - 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2468, - 2469, 2470, 2471, 2474, 2473, 2475, 2476, 2477, 2478, 2474, - 2479, 2475, 2476, 2477, 2478, 2480, 2479, 2481, 2482, 2483, - 2484, 2480, 2485, 2481, 2482, 2483, 2486, 2487, 2485, 2488, - 2492, 2493, 2486, 2487, 2494, 2488, 2489, 2489, 2489, 2489, - 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2490, 2495, - 2490, 2490, 2490, 2490, 2490, 2490, 2491, 2496, 2491, 2491, - 2491, 2491, 2491, 2491, 2497, 2498, 2499, 2500, 2489, 2489, - 2489, 2489, 2489, 2489, 2501, 2502, 2503, 2504, 2505, 2506, - - 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, - 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2518, 2519, 2520, - 2524, 2522, 2523, 2525, 2526, 2527, 2524, 2528, 2529, 2525, - 2526, 2527, 2530, 2528, 2529, 2531, 2532, 2533, 2534, 2535, - 2536, 2531, 2532, 2533, 2537, 2535, 2536, 2538, 2539, 2540, - 2537, 2541, 2542, 2538, 2539, 2540, 2546, 2541, 2543, 2543, - 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543, - 2544, 2547, 2544, 2544, 2544, 2544, 2544, 2544, 2545, 2548, - 2545, 2545, 2545, 2545, 2545, 2545, 2549, 2550, 2551, 2552, - 2543, 2543, 2543, 2543, 2543, 2543, 2553, 2554, 2555, 2556, - - 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, 2565, 2566, - 2567, 2568, 2569, 2570, 2571, 2572, 2567, 2568, 2569, 2570, - 2571, 2573, 2574, 2575, 2576, 2577, 2578, 2573, 2574, 2575, - 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2579, - 2580, 2581, 2582, 2583, 2585, 2586, 2587, 2588, 2592, 2593, - 2585, 2586, 2587, 2588, 2589, 2589, 2589, 2589, 2589, 2589, - 2589, 2589, 2589, 2589, 2589, 2589, 2590, 2594, 2590, 2590, - 2590, 2590, 2590, 2590, 2591, 2595, 2591, 2591, 2591, 2591, - 2591, 2591, 2596, 2597, 2598, 2599, 2589, 2589, 2589, 2589, - 2589, 2589, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, - - 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2609, 2610, 2611, - 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, - 2616, 2617, 2618, 2622, 2620, 2621, 2623, 2624, 2625, 2622, - 2626, 2627, 2623, 2624, 2625, 2631, 2626, 2628, 2628, 2628, - 2628, 2628, 2628, 2628, 2628, 2628, 2628, 2628, 2628, 2629, - 2632, 2629, 2629, 2629, 2629, 2629, 2629, 2630, 2633, 2630, - 2630, 2630, 2630, 2630, 2630, 2634, 2635, 2636, 2637, 2628, - 2628, 2628, 2628, 2628, 2628, 2638, 2639, 2640, 2641, 2642, - 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2644, 2645, 2646, - 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2650, - - 2651, 2652, 2653, 2656, 2655, 2657, 2658, 2662, 2663, 2656, - 2664, 2657, 2658, 2659, 2659, 2659, 2659, 2659, 2659, 2659, - 2659, 2659, 2659, 2659, 2659, 2660, 2665, 2660, 2660, 2660, - 2660, 2660, 2660, 2661, 2666, 2661, 2661, 2661, 2661, 2661, - 2661, 2667, 2668, 2669, 2670, 2659, 2659, 2659, 2659, 2659, - 2659, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2672, 2673, - 2674, 2678, 2676, 2677, 2679, 2680, 2681, 2678, 2682, 2683, - 2679, 2680, 2681, 2684, 2682, 2683, 2685, 2685, 2685, 2685, - 2685, 2688, 2685, 2685, 2685, 2685, 2685, 2685, 2686, 2689, - 2686, 2686, 2686, 2686, 2686, 2686, 2687, 2690, 2687, 2687, - - 2687, 2687, 2687, 2687, 2691, 2692, 2693, 2694, 2685, 2685, - 2685, 2685, 2685, 2685, 2695, 2696, 2697, 2698, 2699, 2700, - 2695, 2696, 2697, 2698, 2699, 2701, 2702, 2703, 2704, 2708, - 2709, 2701, 2702, 2703, 2704, 2705, 2705, 2705, 2705, 2705, - 2705, 2705, 2705, 2705, 2705, 2705, 2705, 2706, 2710, 2706, - 2706, 2706, 2706, 2706, 2706, 2707, 2711, 2707, 2707, 2707, - 2707, 2707, 2707, 2712, 2714, 2721, 2725, 2705, 2705, 2705, - 2705, 2705, 2705, 2713, 2713, 2713, 2713, 2713, 2715, 2716, - 2717, 2718, 2719, 2720, 2715, 2716, 2717, 2718, 2719, 2720, - 2722, 2722, 2722, 2722, 2722, 2726, 2722, 2722, 2722, 2722, - - 2722, 2722, 2723, 2729, 2723, 2723, 2723, 2723, 2723, 2723, - 2724, 2737, 2724, 2724, 2724, 2724, 2724, 2724, 2738, 1328, - 1327, 1326, 2722, 2722, 2722, 2722, 2722, 2722, 2727, 2727, - 2727, 2727, 2727, 2728, 2728, 2728, 2728, 2728, 2730, 2731, - 2732, 2733, 1325, 1324, 2730, 2731, 2732, 2733, 2734, 2734, - 2734, 2734, 2734, 1323, 2734, 2734, 2734, 2734, 2734, 2734, - 2735, 1322, 2735, 2735, 2735, 2735, 2735, 2735, 2736, 1321, - 2736, 2736, 2736, 2736, 2736, 2736, 1320, 1319, 1318, 1317, - 2734, 2734, 2734, 2734, 2734, 2734, 2739, 2740, 1316, 1315, - 1314, 1313, 2739, 2740, 2741, 2741, 2741, 2741, 2741, 1312, - - 2741, 2741, 2741, 2741, 2741, 2741, 2742, 1311, 2742, 2742, - 2742, 2742, 2742, 2742, 2743, 1310, 2743, 2743, 2743, 2743, - 2743, 2743, 1309, 1308, 1307, 1306, 2741, 2741, 2741, 2741, - 2741, 2741, 2744, 1305, 1304, 1303, 1302, 1301, 2744, 2745, - 2745, 2745, 2745, 2745, 2745, 2745, 2745, 2745, 2745, 2745, - 2745, 2746, 1300, 2746, 2746, 2746, 2746, 2746, 2746, 2747, - 1299, 2747, 2747, 2747, 2747, 2747, 2747, 1298, 1297, 1296, - 1295, 2745, 2745, 2745, 2745, 2745, 2745, 2748, 2748, 2748, - 2748, 2748, 1294, 2748, 2748, 2748, 2748, 2748, 2748, 2749, - 1293, 2749, 2749, 2749, 2749, 2749, 2749, 2750, 1292, 2750, - - 2750, 2750, 2750, 2750, 2750, 1291, 1290, 1289, 1288, 2748, - 2748, 2748, 2748, 2748, 2748, 2751, 2751, 2751, 2751, 2751, - 1287, 2751, 2751, 2751, 2751, 2751, 2751, 2752, 1286, 2752, - 2752, 2752, 2752, 2752, 2752, 2753, 1285, 2753, 2753, 2753, - 2753, 2753, 2753, 1284, 1283, 1281, 1277, 2751, 2751, 2751, - 2751, 2751, 2751, 2754, 2754, 2754, 2754, 2754, 1276, 2754, - 2754, 2754, 2754, 2754, 2754, 2755, 1273, 2755, 2755, 2755, - 2755, 2755, 2755, 2756, 1265, 2756, 2756, 2756, 2756, 2756, - 2756, 1264, 1252, 1240, 1231, 2754, 2754, 2754, 2754, 2754, - 2754, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, 2757, - - 2757, 2757, 2757, 2758, 1228, 2758, 2758, 2758, 2758, 2758, - 2758, 2759, 1226, 2759, 2759, 2759, 2759, 2759, 2759, 1225, - 1224, 1223, 1222, 2757, 2757, 2757, 2757, 2757, 2757, 2760, - 2760, 2760, 2760, 2760, 1221, 2760, 2760, 2760, 2760, 2760, - 2760, 2761, 1220, 2761, 2761, 2761, 2761, 2761, 2761, 2762, - 1219, 2762, 2762, 2762, 2762, 2762, 2762, 1218, 1217, 1216, - 1215, 2760, 2760, 2760, 2760, 2760, 2760, 2763, 2763, 2763, - 2763, 2763, 1214, 2763, 2763, 2763, 2763, 2763, 2763, 2764, - 1213, 2764, 2764, 2764, 2764, 2764, 2764, 2765, 1212, 2765, - 2765, 2765, 2765, 2765, 2765, 1211, 1210, 1209, 1208, 2763, - - 2763, 2763, 2763, 2763, 2763, 2766, 2766, 2766, 2766, 2766, - 1207, 2766, 2766, 2766, 2766, 2766, 2766, 2767, 1206, 2767, - 2767, 2767, 2767, 2767, 2767, 2768, 1205, 2768, 2768, 2768, - 2768, 2768, 2768, 1204, 1203, 1202, 1201, 2766, 2766, 2766, - 2766, 2766, 2766, 2769, 2769, 2769, 2769, 2769, 2769, 2769, - 2769, 2769, 2769, 2769, 2769, 2770, 1200, 2770, 2770, 2770, - 2770, 2770, 2770, 2771, 1199, 2771, 2771, 2771, 2771, 2771, - 2771, 1198, 1197, 1196, 1195, 2769, 2769, 2769, 2769, 2769, - 2769, 2772, 2772, 2772, 2772, 2772, 1194, 2772, 2772, 2772, - 2772, 2772, 2772, 2773, 1193, 2773, 2773, 2773, 2773, 2773, - - 2773, 2774, 1192, 2774, 2774, 2774, 2774, 2774, 2774, 1191, - 1190, 1189, 1188, 2772, 2772, 2772, 2772, 2772, 2772, 2775, - 2775, 2775, 2775, 2775, 1187, 2775, 2775, 2775, 2775, 2775, - 2775, 2776, 1186, 2776, 2776, 2776, 2776, 2776, 2776, 2777, - 1185, 2777, 2777, 2777, 2777, 2777, 2777, 1184, 1183, 1182, - 1181, 2775, 2775, 2775, 2775, 2775, 2775, 2778, 2778, 2778, - 2778, 2778, 1180, 2778, 2778, 2778, 2778, 2778, 2778, 2779, - 1179, 2779, 2779, 2779, 2779, 2779, 2779, 2780, 1177, 2780, - 2780, 2780, 2780, 2780, 2780, 1161, 1159, 1157, 1152, 2778, - 2778, 2778, 2778, 2778, 2778, 2781, 2781, 2781, 2781, 2781, - - 2781, 2781, 2781, 2781, 2781, 2781, 2781, 2782, 1148, 2782, - 2782, 2782, 2782, 2782, 2782, 2783, 1140, 2783, 2783, 2783, - 2783, 2783, 2783, 1136, 1129, 1125, 1122, 2781, 2781, 2781, - 2781, 2781, 2781, 2784, 2784, 2784, 2784, 2784, 1120, 2784, - 2784, 2784, 2784, 2784, 2784, 2785, 1119, 2785, 2785, 2785, - 2785, 2785, 2785, 2786, 1118, 2786, 2786, 2786, 2786, 2786, - 2786, 1117, 1116, 1115, 1114, 2784, 2784, 2784, 2784, 2784, - 2784, 2787, 2787, 2787, 2787, 2787, 1113, 2787, 2787, 2787, - 2787, 2787, 2787, 2788, 1112, 2788, 2788, 2788, 2788, 2788, - 2788, 2789, 1111, 2789, 2789, 2789, 2789, 2789, 2789, 1110, - - 1109, 1108, 1107, 2787, 2787, 2787, 2787, 2787, 2787, 2790, - 2790, 2790, 2790, 2790, 1106, 2790, 2790, 2790, 2790, 2790, - 2790, 2791, 1105, 2791, 2791, 2791, 2791, 2791, 2791, 2792, - 1104, 2792, 2792, 2792, 2792, 2792, 2792, 1103, 1102, 1101, - 1100, 2790, 2790, 2790, 2790, 2790, 2790, 2793, 2793, 2793, - 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2793, 2794, - 1099, 2794, 2794, 2794, 2794, 2794, 2794, 2795, 1098, 2795, - 2795, 2795, 2795, 2795, 2795, 1097, 1096, 1095, 1094, 2793, - 2793, 2793, 2793, 2793, 2793, 2796, 2796, 2796, 2796, 2796, - 1093, 2796, 2796, 2796, 2796, 2796, 2796, 2797, 1092, 2797, - - 2797, 2797, 2797, 2797, 2797, 2798, 1091, 2798, 2798, 2798, - 2798, 2798, 2798, 1090, 1089, 1088, 1087, 2796, 2796, 2796, - 2796, 2796, 2796, 2799, 2799, 2799, 2799, 2799, 1086, 2799, - 2799, 2799, 2799, 2799, 2799, 2800, 1085, 2800, 2800, 2800, - 2800, 2800, 2800, 2801, 1084, 2801, 2801, 2801, 2801, 2801, - 2801, 1083, 1082, 1081, 1080, 2799, 2799, 2799, 2799, 2799, - 2799, 2802, 2802, 2802, 2802, 2802, 1079, 2802, 2802, 2802, - 2802, 2802, 2802, 2803, 1078, 2803, 2803, 2803, 2803, 2803, - 2803, 2804, 1077, 2804, 2804, 2804, 2804, 2804, 2804, 1075, - 1058, 1057, 1056, 2802, 2802, 2802, 2802, 2802, 2802, 2805, - - 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, 2805, - 2805, 2806, 1055, 2806, 2806, 2806, 2806, 2806, 2806, 2807, - 1048, 2807, 2807, 2807, 2807, 2807, 2807, 1046, 1040, 1029, - 1022, 2805, 2805, 2805, 2805, 2805, 2805, 2808, 2808, 2808, - 2808, 2808, 1020, 2808, 2808, 2808, 2808, 2808, 2808, 2809, - 1019, 2809, 2809, 2809, 2809, 2809, 2809, 2810, 1018, 2810, - 2810, 2810, 2810, 2810, 2810, 1017, 1016, 1015, 1014, 2808, - 2808, 2808, 2808, 2808, 2808, 2811, 2811, 2811, 2811, 2811, - 1013, 2811, 2811, 2811, 2811, 2811, 2811, 2812, 1012, 2812, - 2812, 2812, 2812, 2812, 2812, 2813, 1011, 2813, 2813, 2813, - - 2813, 2813, 2813, 1010, 1009, 1008, 1007, 2811, 2811, 2811, - 2811, 2811, 2811, 2814, 2814, 2814, 2814, 2814, 1006, 2814, - 2814, 2814, 2814, 2814, 2814, 2815, 1005, 2815, 2815, 2815, - 2815, 2815, 2815, 2816, 1004, 2816, 2816, 2816, 2816, 2816, - 2816, 1003, 1002, 1001, 1000, 2814, 2814, 2814, 2814, 2814, - 2814, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, - 2817, 2817, 2817, 2818, 999, 2818, 2818, 2818, 2818, 2818, - 2818, 2819, 998, 2819, 2819, 2819, 2819, 2819, 2819, 997, - 996, 995, 994, 2817, 2817, 2817, 2817, 2817, 2817, 2820, - 2820, 2820, 2820, 2820, 993, 2820, 2820, 2820, 2820, 2820, - - 2820, 2821, 992, 2821, 2821, 2821, 2821, 2821, 2821, 2822, - 991, 2822, 2822, 2822, 2822, 2822, 2822, 990, 989, 988, - 987, 2820, 2820, 2820, 2820, 2820, 2820, 2823, 2823, 2823, - 2823, 2823, 986, 2823, 2823, 2823, 2823, 2823, 2823, 2824, - 985, 2824, 2824, 2824, 2824, 2824, 2824, 2825, 984, 2825, - 2825, 2825, 2825, 2825, 2825, 983, 982, 980, 971, 2823, - 2823, 2823, 2823, 2823, 2823, 2826, 2826, 2826, 2826, 2826, - 962, 2826, 2826, 2826, 2826, 2826, 2826, 2827, 960, 2827, - 2827, 2827, 2827, 2827, 2828, 959, 2828, 2828, 2828, 2828, - 2828, 957, 948, 945, 937, 933, 928, 2826, 2826, 2826, - - 2826, 2826, 2826, 2830, 2830, 2830, 2830, 2830, 2830, 2830, - 2830, 2831, 925, 2831, 2831, 2831, 2831, 2831, 2831, 2832, - 923, 2832, 2832, 2833, 922, 2833, 2833, 2833, 2833, 2834, - 921, 2834, 2834, 2835, 2835, 2836, 2836, 2837, 920, 2837, - 2837, 2838, 2838, 2839, 2839, 2840, 2840, 2840, 2841, 919, - 2841, 2841, 2842, 2842, 2843, 2843, 2844, 2844, 2845, 2845, - 2846, 2846, 2846, 2847, 2847, 2848, 918, 2848, 2848, 2849, - 2849, 2850, 2850, 2851, 2851, 2852, 2852, 2853, 2853, 2854, - 2854, 2855, 2855, 2855, 2856, 2856, 2857, 2857, 2857, 2858, - 917, 2858, 2858, 2859, 2859, 2860, 2860, 2861, 2861, 2862, - - 2862, 2863, 2863, 2864, 2864, 2865, 2865, 2866, 2866, 2867, - 2867, 2868, 2868, 2868, 2869, 2869, 2870, 2870, 2870, 2871, - 2871, 2871, 2872, 2872, 2873, 916, 2873, 2873, 2874, 2874, - 2875, 2875, 2876, 2876, 2877, 2877, 2878, 2878, 2879, 2879, - 2880, 2880, 2881, 2881, 2882, 2882, 2883, 2883, 2884, 2884, - 2885, 2885, 2886, 2886, 2886, 2887, 2887, 2888, 2888, 2888, - 2889, 2889, 2889, 2890, 2890, 2891, 2891, 2891, 2892, 2892, - 2892, 2893, 915, 2893, 2893, 2894, 2894, 2895, 2895, 2896, - 2896, 2897, 2897, 2898, 2898, 2899, 2899, 2900, 2900, 2901, - 2901, 2902, 2902, 2903, 2903, 2904, 2904, 2905, 2905, 2906, - - 2906, 2907, 2907, 2908, 2908, 2909, 2909, 2910, 2910, 2911, - 2911, 2911, 2912, 2912, 2913, 2913, 2913, 2914, 2914, 2914, - 2915, 2915, 2916, 2916, 2916, 2917, 2917, 2917, 2918, 2918, - 2918, 2919, 2919, 2919, 2920, 2920, 2921, 914, 2921, 2921, - 2921, 2922, 913, 2922, 2922, 2923, 2923, 2924, 2924, 2925, - 2925, 2926, 2926, 2927, 2927, 2928, 2928, 2929, 2929, 2930, - 2930, 2931, 2931, 2932, 2932, 2933, 2933, 2934, 2934, 2935, - 2935, 2936, 2936, 2937, 2937, 2938, 2938, 2939, 2939, 2940, - 2940, 2941, 2941, 2942, 2942, 2943, 2943, 2944, 2944, 2944, - 2945, 2945, 2946, 2946, 2946, 2947, 2947, 2947, 2948, 2948, - - 2948, 2949, 2949, 2949, 2950, 2950, 2950, 2951, 2951, 2951, - 2952, 2952, 2953, 2953, 2953, 2954, 2954, 2954, 2955, 2955, - 2955, 2956, 912, 2956, 2956, 2956, 2957, 911, 2957, 2957, - 2958, 2958, 2959, 2959, 2960, 2960, 2961, 2961, 2962, 2962, - 2963, 2963, 2964, 2964, 2965, 2965, 2966, 2966, 2967, 2967, - 2968, 2968, 2969, 2969, 2970, 2970, 2971, 2971, 2972, 2972, - 2973, 2973, 2974, 2974, 2975, 2975, 2976, 2976, 2977, 2977, - 2978, 2978, 2979, 2979, 2980, 2980, 2981, 2981, 2982, 2982, - 2983, 2983, 2984, 2984, 2984, 2985, 2985, 2986, 2986, 2986, - 2987, 2987, 2987, 2988, 2988, 2989, 2989, 2989, 2990, 2990, - - 2990, 2991, 2991, 2991, 2992, 2992, 2993, 2993, 2993, 2994, - 2994, 2994, 2995, 2995, 2995, 2996, 2996, 2996, 2997, 2997, - 2997, 2998, 2998, 2998, 2999, 2999, 3000, 910, 3000, 3000, - 3000, 3001, 909, 3001, 3001, 3002, 3002, 3003, 3003, 3004, - 3004, 3005, 3005, 3006, 3006, 3007, 3007, 3008, 3008, 3009, - 3009, 3010, 3010, 3011, 3011, 3012, 3012, 3013, 3013, 3014, - 3014, 3015, 3015, 3016, 3016, 3017, 3017, 3018, 3018, 3019, - 3019, 3020, 3020, 3021, 3021, 3022, 3022, 3023, 3023, 3024, - 3024, 3025, 3025, 3026, 3026, 3027, 3027, 3028, 3028, 3029, - 3029, 3030, 3030, 3031, 3031, 3031, 3032, 3032, 3033, 3033, - - 3033, 3034, 3034, 3034, 3035, 3035, 3036, 3036, 3036, 3037, - 3037, 3037, 3038, 3038, 3038, 3039, 3039, 3039, 3040, 3040, - 3040, 3041, 3041, 3041, 3042, 3042, 3042, 3043, 3043, 3043, - 3044, 3044, 3045, 3045, 3045, 3046, 3046, 3046, 3047, 3047, - 3047, 3048, 908, 3048, 3048, 3048, 3049, 907, 3049, 3049, - 3050, 3050, 3051, 3051, 3052, 3052, 3053, 3053, 3054, 3054, - 3055, 3055, 3056, 3056, 3057, 3057, 3058, 3058, 3059, 3059, - 3060, 3060, 3061, 3061, 3062, 3062, 3063, 3063, 3064, 3064, - 3065, 3065, 3066, 3066, 3067, 3067, 3068, 3068, 3069, 3069, - 3070, 3070, 3071, 3071, 3072, 3072, 3073, 3073, 3074, 3074, - - 3075, 3075, 3076, 3076, 3077, 3077, 3078, 3078, 3079, 3079, - 3080, 3080, 3081, 3081, 3082, 3082, 3083, 3083, 3084, 3084, - 3085, 3085, 3085, 3086, 3086, 3087, 3087, 3087, 3088, 3088, - 3088, 3089, 3089, 3090, 3090, 3090, 3091, 3091, 3091, 3092, - 3092, 3092, 3093, 3093, 3093, 3094, 3094, 3095, 3095, 3095, - 3096, 3096, 3096, 3097, 3097, 3097, 3098, 3098, 3099, 3099, - 3099, 3100, 3100, 3100, 3101, 3101, 3101, 3102, 3102, 3102, - 3103, 3103, 3103, 3104, 3104, 3104, 3105, 3105, 3106, 906, - 3106, 3106, 3106, 3107, 905, 3107, 3107, 3108, 3108, 3109, + 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, + 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, + 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2069, 2070, + 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, + 2081, 2076, 2077, 2078, 2082, 2080, 2081, 2083, 2084, 2085, + 2082, 2086, 2087, 2083, 2084, 2085, 2088, 2086, 2089, 2090, + 2091, 2092, 2088, 2093, 2089, 2090, 2094, 2092, 2095, 2093, + + 2096, 2097, 2094, 2098, 2095, 2099, 2096, 2097, 2100, 2098, + 2101, 2102, 2103, 2104, 2100, 2105, 2101, 2102, 2106, 2104, + 2107, 2105, 2108, 2109, 2106, 2110, 2107, 2111, 2108, 2109, + 2113, 2110, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, + 2112, 2112, 2112, 2112, 2114, 2115, 2116, 2117, 2119, 2117, + 2117, 2117, 2117, 2117, 2117, 2118, 2120, 2118, 2118, 2118, + 2118, 2118, 2118, 2121, 2112, 2112, 2112, 2112, 2112, 2112, + 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, + 2132, 2133, 2134, 2135, 2136, 2115, 2137, 2138, 2139, 2140, + 2141, 2142, 2143, 2116, 2144, 2145, 2146, 2147, 2148, 2149, + + 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, + 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, + 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2173, + 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, + 2184, 2179, 2180, 2181, 2182, 2185, 2184, 2186, 2187, 2188, + 2189, 2185, 2190, 2186, 2187, 2188, 2189, 2191, 2190, 2192, + 2193, 2194, 2195, 2191, 2196, 2192, 2193, 2194, 2197, 2198, + 2196, 2199, 2200, 2201, 2197, 2198, 2202, 2199, 2200, 2201, + 2203, 2204, 2202, 2205, 2206, 2207, 2203, 2204, 2208, 2205, + 2206, 2209, 2210, 2211, 2208, 2213, 2214, 2209, 2210, 2211, + + 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, + 2212, 2212, 2215, 2216, 2217, 2219, 2217, 2217, 2217, 2217, + 2217, 2217, 2218, 2220, 2218, 2218, 2218, 2218, 2218, 2218, + 2221, 2222, 2212, 2212, 2212, 2212, 2212, 2212, 2223, 2224, + 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, + 2235, 2236, 2216, 2237, 2238, 2239, 2240, 2216, 2241, 2215, + 2242, 2238, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, + 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, + 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, + 2271, 2272, 2267, 2268, 2269, 2273, 2271, 2272, 2274, 2275, + + 2276, 2273, 2277, 2278, 2274, 2275, 2276, 2279, 2277, 2278, + 2280, 2281, 2282, 2283, 2284, 2285, 2280, 2281, 2282, 2286, + 2284, 2285, 2287, 2288, 2289, 2286, 2290, 2291, 2287, 2288, + 2289, 2292, 2290, 2293, 2294, 2295, 2296, 2292, 2297, 2293, + 2294, 2298, 2296, 2299, 2297, 2300, 2301, 2298, 2302, 2299, + 2303, 2300, 2301, 2307, 2302, 2304, 2304, 2304, 2304, 2304, + 2304, 2304, 2304, 2304, 2304, 2304, 2304, 2308, 2309, 2310, + 2312, 2310, 2310, 2310, 2310, 2310, 2310, 2311, 2313, 2311, + 2311, 2311, 2311, 2311, 2311, 2314, 2315, 2304, 2304, 2304, + 2304, 2304, 2304, 2316, 2317, 2318, 2319, 2307, 2320, 2321, + + 2322, 2323, 2309, 2324, 2325, 2326, 2327, 2328, 2329, 2330, + 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, + 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, + 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 2354, + 2355, 2356, 2357, 2358, 2360, 2361, 2362, 2363, 2364, 2365, + 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, + 2370, 2371, 2366, 2367, 2368, 2369, 2370, 2372, 2373, 2374, + 2375, 2376, 2377, 2372, 2373, 2374, 2375, 2376, 2377, 2378, + 2379, 2380, 2381, 2382, 2383, 2378, 2379, 2380, 2381, 2382, + 2384, 2385, 2386, 2387, 2389, 2390, 2384, 2385, 2386, 2387, + + 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, 2388, + 2388, 2388, 2391, 2393, 2391, 2391, 2391, 2391, 2391, 2391, + 2392, 2394, 2392, 2392, 2392, 2392, 2392, 2392, 2389, 2395, + 2396, 2397, 2388, 2388, 2388, 2388, 2388, 2388, 2398, 2399, + 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, + 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, + 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, + 2430, 2431, 2432, 2433, 2434, 2435, 2430, 2431, 2432, 2433, + 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, 2437, + 2438, 2439, 2443, 2441, 2442, 2444, 2445, 2446, 2443, 2447, + + 2448, 2444, 2445, 2446, 2449, 2447, 2450, 2451, 2452, 2453, + 2449, 2454, 2450, 2451, 2455, 2453, 2456, 2454, 2457, 2458, + 2455, 2459, 2456, 2460, 2457, 2458, 2462, 2459, 2461, 2461, + 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, + 2463, 2465, 2463, 2463, 2463, 2463, 2463, 2463, 2464, 2466, + 2464, 2464, 2464, 2464, 2464, 2464, 2467, 2468, 2469, 2470, + 2461, 2461, 2461, 2461, 2461, 2461, 2471, 2472, 2473, 2474, + 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, + 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, + 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2497, 2498, + + 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, + 2503, 2504, 2505, 2506, 2509, 2508, 2510, 2511, 2512, 2513, + 2509, 2514, 2510, 2511, 2512, 2513, 2515, 2514, 2516, 2517, + 2518, 2519, 2515, 2520, 2516, 2517, 2518, 2521, 2522, 2520, + 2523, 2527, 2528, 2521, 2522, 2529, 2523, 2524, 2524, 2524, + 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2524, 2525, + 2530, 2525, 2525, 2525, 2525, 2525, 2525, 2526, 2531, 2526, + 2526, 2526, 2526, 2526, 2526, 2532, 2533, 2534, 2535, 2524, + 2524, 2524, 2524, 2524, 2524, 2536, 2537, 2538, 2539, 2540, + 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, + + 2551, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2553, 2554, + 2555, 2559, 2557, 2558, 2560, 2561, 2562, 2559, 2563, 2564, + 2560, 2561, 2562, 2565, 2563, 2564, 2566, 2567, 2568, 2569, + 2570, 2571, 2566, 2567, 2568, 2572, 2570, 2571, 2573, 2574, + 2575, 2572, 2576, 2577, 2573, 2574, 2575, 2581, 2576, 2578, + 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, + 2578, 2579, 2582, 2579, 2579, 2579, 2579, 2579, 2579, 2580, + 2583, 2580, 2580, 2580, 2580, 2580, 2580, 2584, 2585, 2586, + 2587, 2578, 2578, 2578, 2578, 2578, 2578, 2588, 2589, 2590, + 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, + + 2601, 2602, 2603, 2604, 2605, 2606, 2607, 2602, 2603, 2604, + 2605, 2606, 2608, 2609, 2610, 2611, 2612, 2613, 2608, 2609, + 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, 2618, 2619, + 2614, 2615, 2616, 2617, 2618, 2620, 2621, 2622, 2623, 2627, + 2628, 2620, 2621, 2622, 2623, 2624, 2624, 2624, 2624, 2624, + 2624, 2624, 2624, 2624, 2624, 2624, 2624, 2625, 2629, 2625, + 2625, 2625, 2625, 2625, 2625, 2626, 2630, 2626, 2626, 2626, + 2626, 2626, 2626, 2631, 2632, 2633, 2634, 2624, 2624, 2624, + 2624, 2624, 2624, 2635, 2636, 2637, 2638, 2639, 2640, 2641, + 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, 2644, 2645, + + 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, + 2656, 2651, 2652, 2653, 2657, 2655, 2656, 2658, 2659, 2660, + 2657, 2661, 2662, 2658, 2659, 2660, 2666, 2661, 2663, 2663, + 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, 2663, + 2664, 2667, 2664, 2664, 2664, 2664, 2664, 2664, 2665, 2668, + 2665, 2665, 2665, 2665, 2665, 2665, 2669, 2670, 2671, 2672, + 2663, 2663, 2663, 2663, 2663, 2663, 2673, 2674, 2675, 2676, + 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2679, 2680, + 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, + 2685, 2686, 2687, 2688, 2691, 2690, 2692, 2693, 2697, 2698, + + 2691, 2699, 2692, 2693, 2694, 2694, 2694, 2694, 2694, 2694, + 2694, 2694, 2694, 2694, 2694, 2694, 2695, 2700, 2695, 2695, + 2695, 2695, 2695, 2695, 2696, 2701, 2696, 2696, 2696, 2696, + 2696, 2696, 2702, 2703, 2704, 2705, 2694, 2694, 2694, 2694, + 2694, 2694, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2707, + 2708, 2709, 2713, 2711, 2712, 2714, 2715, 2716, 2713, 2717, + 2718, 2714, 2715, 2716, 2719, 2717, 2718, 2720, 2720, 2720, + 2720, 2720, 2723, 2720, 2720, 2720, 2720, 2720, 2720, 2721, + 2724, 2721, 2721, 2721, 2721, 2721, 2721, 2722, 2725, 2722, + 2722, 2722, 2722, 2722, 2722, 2726, 2727, 2728, 2729, 2720, + + 2720, 2720, 2720, 2720, 2720, 2730, 2731, 2732, 2733, 2734, + 2735, 2730, 2731, 2732, 2733, 2734, 2736, 2737, 2738, 2739, + 2743, 2744, 2736, 2737, 2738, 2739, 2740, 2740, 2740, 2740, + 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2740, 2741, 2745, + 2741, 2741, 2741, 2741, 2741, 2741, 2742, 2746, 2742, 2742, + 2742, 2742, 2742, 2742, 2747, 2749, 2756, 2760, 2740, 2740, + 2740, 2740, 2740, 2740, 2748, 2748, 2748, 2748, 2748, 2750, + 2751, 2752, 2753, 2754, 2755, 2750, 2751, 2752, 2753, 2754, + 2755, 2757, 2757, 2757, 2757, 2757, 2761, 2757, 2757, 2757, + 2757, 2757, 2757, 2758, 2764, 2758, 2758, 2758, 2758, 2758, + + 2758, 2759, 2772, 2759, 2759, 2759, 2759, 2759, 2759, 2773, + 1360, 1359, 1358, 2757, 2757, 2757, 2757, 2757, 2757, 2762, + 2762, 2762, 2762, 2762, 2763, 2763, 2763, 2763, 2763, 2765, + 2766, 2767, 2768, 1357, 1356, 2765, 2766, 2767, 2768, 2769, + 2769, 2769, 2769, 2769, 1355, 2769, 2769, 2769, 2769, 2769, + 2769, 2770, 1354, 2770, 2770, 2770, 2770, 2770, 2770, 2771, + 1353, 2771, 2771, 2771, 2771, 2771, 2771, 1352, 1351, 1350, + 1349, 2769, 2769, 2769, 2769, 2769, 2769, 2774, 2775, 1348, + 1347, 1346, 1345, 2774, 2775, 2776, 2776, 2776, 2776, 2776, + 1344, 2776, 2776, 2776, 2776, 2776, 2776, 2777, 1343, 2777, + + 2777, 2777, 2777, 2777, 2777, 2778, 1342, 2778, 2778, 2778, + 2778, 2778, 2778, 1341, 1340, 1339, 1338, 2776, 2776, 2776, + 2776, 2776, 2776, 2779, 1337, 1336, 1335, 1334, 1333, 2779, + 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, 2780, + 2780, 2780, 2781, 1332, 2781, 2781, 2781, 2781, 2781, 2781, + 2782, 1331, 2782, 2782, 2782, 2782, 2782, 2782, 1330, 1329, + 1328, 1327, 2780, 2780, 2780, 2780, 2780, 2780, 2783, 2783, + 2783, 2783, 2783, 1326, 2783, 2783, 2783, 2783, 2783, 2783, + 2784, 1325, 2784, 2784, 2784, 2784, 2784, 2784, 2785, 1324, + 2785, 2785, 2785, 2785, 2785, 2785, 1323, 1322, 1321, 1320, + + 2783, 2783, 2783, 2783, 2783, 2783, 2786, 2786, 2786, 2786, + 2786, 1319, 2786, 2786, 2786, 2786, 2786, 2786, 2787, 1318, + 2787, 2787, 2787, 2787, 2787, 2787, 2788, 1317, 2788, 2788, + 2788, 2788, 2788, 2788, 1316, 1314, 1309, 1308, 2786, 2786, + 2786, 2786, 2786, 2786, 2789, 2789, 2789, 2789, 2789, 1305, + 2789, 2789, 2789, 2789, 2789, 2789, 2790, 1297, 2790, 2790, + 2790, 2790, 2790, 2790, 2791, 1296, 2791, 2791, 2791, 2791, + 2791, 2791, 1295, 1283, 1271, 1262, 2789, 2789, 2789, 2789, + 2789, 2789, 2792, 2792, 2792, 2792, 2792, 2792, 2792, 2792, + 2792, 2792, 2792, 2792, 2793, 1259, 2793, 2793, 2793, 2793, + + 2793, 2793, 2794, 1257, 2794, 2794, 2794, 2794, 2794, 2794, + 1256, 1255, 1254, 1253, 2792, 2792, 2792, 2792, 2792, 2792, + 2795, 2795, 2795, 2795, 2795, 1252, 2795, 2795, 2795, 2795, + 2795, 2795, 2796, 1251, 2796, 2796, 2796, 2796, 2796, 2796, + 2797, 1250, 2797, 2797, 2797, 2797, 2797, 2797, 1249, 1248, + 1247, 1246, 2795, 2795, 2795, 2795, 2795, 2795, 2798, 2798, + 2798, 2798, 2798, 1245, 2798, 2798, 2798, 2798, 2798, 2798, + 2799, 1244, 2799, 2799, 2799, 2799, 2799, 2799, 2800, 1243, + 2800, 2800, 2800, 2800, 2800, 2800, 1242, 1241, 1240, 1239, + 2798, 2798, 2798, 2798, 2798, 2798, 2801, 2801, 2801, 2801, + + 2801, 1238, 2801, 2801, 2801, 2801, 2801, 2801, 2802, 1237, + 2802, 2802, 2802, 2802, 2802, 2802, 2803, 1236, 2803, 2803, + 2803, 2803, 2803, 2803, 1235, 1234, 1233, 1232, 2801, 2801, + 2801, 2801, 2801, 2801, 2804, 2804, 2804, 2804, 2804, 2804, + 2804, 2804, 2804, 2804, 2804, 2804, 2805, 1231, 2805, 2805, + 2805, 2805, 2805, 2805, 2806, 1230, 2806, 2806, 2806, 2806, + 2806, 2806, 1229, 1228, 1227, 1226, 2804, 2804, 2804, 2804, + 2804, 2804, 2807, 2807, 2807, 2807, 2807, 1225, 2807, 2807, + 2807, 2807, 2807, 2807, 2808, 1224, 2808, 2808, 2808, 2808, + 2808, 2808, 2809, 1223, 2809, 2809, 2809, 2809, 2809, 2809, + + 1222, 1221, 1220, 1219, 2807, 2807, 2807, 2807, 2807, 2807, + 2810, 2810, 2810, 2810, 2810, 1218, 2810, 2810, 2810, 2810, + 2810, 2810, 2811, 1217, 2811, 2811, 2811, 2811, 2811, 2811, + 2812, 1216, 2812, 2812, 2812, 2812, 2812, 2812, 1215, 1214, + 1213, 1212, 2810, 2810, 2810, 2810, 2810, 2810, 2813, 2813, + 2813, 2813, 2813, 1211, 2813, 2813, 2813, 2813, 2813, 2813, + 2814, 1210, 2814, 2814, 2814, 2814, 2814, 2814, 2815, 1208, + 2815, 2815, 2815, 2815, 2815, 2815, 1191, 1189, 1187, 1181, + 2813, 2813, 2813, 2813, 2813, 2813, 2816, 2816, 2816, 2816, + 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2817, 1177, + + 2817, 2817, 2817, 2817, 2817, 2817, 2818, 1169, 2818, 2818, + 2818, 2818, 2818, 2818, 1165, 1158, 1154, 1151, 2816, 2816, + 2816, 2816, 2816, 2816, 2819, 2819, 2819, 2819, 2819, 1149, + 2819, 2819, 2819, 2819, 2819, 2819, 2820, 1148, 2820, 2820, + 2820, 2820, 2820, 2820, 2821, 1147, 2821, 2821, 2821, 2821, + 2821, 2821, 1146, 1145, 1144, 1143, 2819, 2819, 2819, 2819, + 2819, 2819, 2822, 2822, 2822, 2822, 2822, 1142, 2822, 2822, + 2822, 2822, 2822, 2822, 2823, 1141, 2823, 2823, 2823, 2823, + 2823, 2823, 2824, 1140, 2824, 2824, 2824, 2824, 2824, 2824, + 1139, 1138, 1137, 1136, 2822, 2822, 2822, 2822, 2822, 2822, + + 2825, 2825, 2825, 2825, 2825, 1135, 2825, 2825, 2825, 2825, + 2825, 2825, 2826, 1134, 2826, 2826, 2826, 2826, 2826, 2826, + 2827, 1133, 2827, 2827, 2827, 2827, 2827, 2827, 1132, 1131, + 1130, 1129, 2825, 2825, 2825, 2825, 2825, 2825, 2828, 2828, + 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, + 2829, 1128, 2829, 2829, 2829, 2829, 2829, 2829, 2830, 1127, + 2830, 2830, 2830, 2830, 2830, 2830, 1126, 1125, 1124, 1123, + 2828, 2828, 2828, 2828, 2828, 2828, 2831, 2831, 2831, 2831, + 2831, 1122, 2831, 2831, 2831, 2831, 2831, 2831, 2832, 1121, + 2832, 2832, 2832, 2832, 2832, 2832, 2833, 1120, 2833, 2833, + + 2833, 2833, 2833, 2833, 1119, 1118, 1117, 1116, 2831, 2831, + 2831, 2831, 2831, 2831, 2834, 2834, 2834, 2834, 2834, 1115, + 2834, 2834, 2834, 2834, 2834, 2834, 2835, 1114, 2835, 2835, + 2835, 2835, 2835, 2835, 2836, 1113, 2836, 2836, 2836, 2836, + 2836, 2836, 1112, 1111, 1110, 1109, 2834, 2834, 2834, 2834, + 2834, 2834, 2837, 2837, 2837, 2837, 2837, 1108, 2837, 2837, + 2837, 2837, 2837, 2837, 2838, 1107, 2838, 2838, 2838, 2838, + 2838, 2838, 2839, 1106, 2839, 2839, 2839, 2839, 2839, 2839, + 1104, 1086, 1085, 1084, 2837, 2837, 2837, 2837, 2837, 2837, + 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840, 2840, + + 2840, 2840, 2841, 1083, 2841, 2841, 2841, 2841, 2841, 2841, + 2842, 1075, 2842, 2842, 2842, 2842, 2842, 2842, 1073, 1067, + 1056, 1049, 2840, 2840, 2840, 2840, 2840, 2840, 2843, 2843, + 2843, 2843, 2843, 1047, 2843, 2843, 2843, 2843, 2843, 2843, + 2844, 1046, 2844, 2844, 2844, 2844, 2844, 2844, 2845, 1045, + 2845, 2845, 2845, 2845, 2845, 2845, 1044, 1043, 1042, 1041, + 2843, 2843, 2843, 2843, 2843, 2843, 2846, 2846, 2846, 2846, + 2846, 1040, 2846, 2846, 2846, 2846, 2846, 2846, 2847, 1039, + 2847, 2847, 2847, 2847, 2847, 2847, 2848, 1038, 2848, 2848, + 2848, 2848, 2848, 2848, 1037, 1036, 1035, 1034, 2846, 2846, + + 2846, 2846, 2846, 2846, 2849, 2849, 2849, 2849, 2849, 1033, + 2849, 2849, 2849, 2849, 2849, 2849, 2850, 1032, 2850, 2850, + 2850, 2850, 2850, 2850, 2851, 1031, 2851, 2851, 2851, 2851, + 2851, 2851, 1030, 1029, 1028, 1027, 2849, 2849, 2849, 2849, + 2849, 2849, 2852, 2852, 2852, 2852, 2852, 2852, 2852, 2852, + 2852, 2852, 2852, 2852, 2853, 1026, 2853, 2853, 2853, 2853, + 2853, 2853, 2854, 1025, 2854, 2854, 2854, 2854, 2854, 2854, + 1024, 1023, 1022, 1021, 2852, 2852, 2852, 2852, 2852, 2852, + 2855, 2855, 2855, 2855, 2855, 1020, 2855, 2855, 2855, 2855, + 2855, 2855, 2856, 1019, 2856, 2856, 2856, 2856, 2856, 2856, + + 2857, 1018, 2857, 2857, 2857, 2857, 2857, 2857, 1017, 1016, + 1015, 1014, 2855, 2855, 2855, 2855, 2855, 2855, 2858, 2858, + 2858, 2858, 2858, 1013, 2858, 2858, 2858, 2858, 2858, 2858, + 2859, 1012, 2859, 2859, 2859, 2859, 2859, 2859, 2860, 1011, + 2860, 2860, 2860, 2860, 2860, 2860, 1010, 1009, 1007, 997, + 2858, 2858, 2858, 2858, 2858, 2858, 2861, 2861, 2861, 2861, + 2861, 988, 2861, 2861, 2861, 2861, 2861, 2861, 2862, 986, + 2862, 2862, 2862, 2862, 2862, 2863, 985, 2863, 2863, 2863, + 2863, 2863, 983, 973, 970, 962, 958, 953, 2861, 2861, + 2861, 2861, 2861, 2861, 2865, 2865, 2865, 2865, 2865, 2865, + + 2865, 2865, 2866, 950, 2866, 2866, 2866, 2866, 2866, 2866, + 2867, 948, 2867, 2867, 2868, 2868, 947, 2868, 2868, 2868, + 2869, 946, 2869, 2869, 2870, 2870, 2871, 2871, 2872, 945, + 2872, 2872, 2873, 2873, 2874, 2874, 2875, 2875, 2875, 2876, + 944, 2876, 2876, 2877, 2877, 2878, 2878, 2879, 2879, 2880, + 2880, 2881, 2881, 2881, 2882, 2882, 2883, 943, 2883, 2883, + 2884, 2884, 2885, 2885, 2886, 2886, 2887, 2887, 2888, 2888, + 2889, 2889, 2890, 2890, 2890, 2891, 2891, 2892, 2892, 2892, + 2893, 942, 2893, 2893, 2894, 2894, 2895, 2895, 2896, 2896, + 2897, 2897, 2898, 2898, 2899, 2899, 2900, 2900, 2901, 2901, + + 2902, 2902, 2903, 2903, 2903, 2904, 2904, 2905, 2905, 2905, + 2906, 2906, 2906, 2907, 2907, 2908, 941, 2908, 2908, 2909, + 2909, 2910, 2910, 2911, 2911, 2912, 2912, 2913, 2913, 2914, + 2914, 2915, 2915, 2916, 2916, 2917, 2917, 2918, 2918, 2919, + 2919, 2920, 2920, 2921, 2921, 2921, 2922, 2922, 2923, 2923, + 2923, 2924, 2924, 2924, 2925, 2925, 2926, 2926, 2926, 2927, + 2927, 2927, 2928, 940, 2928, 2928, 2929, 2929, 2930, 2930, + 2931, 2931, 2932, 2932, 2933, 2933, 2934, 2934, 2935, 2935, + 2936, 2936, 2937, 2937, 2938, 2938, 2939, 2939, 2940, 2940, + 2941, 2941, 2942, 2942, 2943, 2943, 2944, 2944, 2945, 2945, + + 2946, 2946, 2946, 2947, 2947, 2948, 2948, 2948, 2949, 2949, + 2949, 2950, 2950, 2951, 2951, 2951, 2952, 2952, 2952, 2953, + 2953, 2953, 2954, 2954, 2954, 2955, 2955, 2956, 2956, 939, + 2956, 2956, 2957, 938, 2957, 2957, 2958, 2958, 2959, 2959, + 2960, 2960, 2961, 2961, 2962, 2962, 2963, 2963, 2964, 2964, + 2965, 2965, 2966, 2966, 2967, 2967, 2968, 2968, 2969, 2969, + 2970, 2970, 2971, 2971, 2972, 2972, 2973, 2973, 2974, 2974, + 2975, 2975, 2976, 2976, 2977, 2977, 2978, 2978, 2979, 2979, + 2979, 2980, 2980, 2981, 2981, 2981, 2982, 2982, 2982, 2983, + 2983, 2983, 2984, 2984, 2984, 2985, 2985, 2985, 2986, 2986, + + 2986, 2987, 2987, 2988, 2988, 2988, 2989, 2989, 2989, 2990, + 2990, 2990, 2991, 2991, 937, 2991, 2991, 2992, 936, 2992, + 2992, 2993, 2993, 2994, 2994, 2995, 2995, 2996, 2996, 2997, + 2997, 2998, 2998, 2999, 2999, 3000, 3000, 3001, 3001, 3002, + 3002, 3003, 3003, 3004, 3004, 3005, 3005, 3006, 3006, 3007, + 3007, 3008, 3008, 3009, 3009, 3010, 3010, 3011, 3011, 3012, + 3012, 3013, 3013, 3014, 3014, 3015, 3015, 3016, 3016, 3017, + 3017, 3018, 3018, 3019, 3019, 3019, 3020, 3020, 3021, 3021, + 3021, 3022, 3022, 3022, 3023, 3023, 3024, 3024, 3024, 3025, + 3025, 3025, 3026, 3026, 3026, 3027, 3027, 3028, 3028, 3028, + + 3029, 3029, 3029, 3030, 3030, 3030, 3031, 3031, 3031, 3032, + 3032, 3032, 3033, 3033, 3033, 3034, 3034, 3035, 3035, 935, + 3035, 3035, 3036, 934, 3036, 3036, 3037, 3037, 3038, 3038, + 3039, 3039, 3040, 3040, 3041, 3041, 3042, 3042, 3043, 3043, + 3044, 3044, 3045, 3045, 3046, 3046, 3047, 3047, 3048, 3048, + 3049, 3049, 3050, 3050, 3051, 3051, 3052, 3052, 3053, 3053, + 3054, 3054, 3055, 3055, 3056, 3056, 3057, 3057, 3058, 3058, + 3059, 3059, 3060, 3060, 3061, 3061, 3062, 3062, 3063, 3063, + 3064, 3064, 3065, 3065, 3066, 3066, 3066, 3067, 3067, 3068, + 3068, 3068, 3069, 3069, 3069, 3070, 3070, 3071, 3071, 3071, + + 3072, 3072, 3072, 3073, 3073, 3073, 3074, 3074, 3074, 3075, + 3075, 3075, 3076, 3076, 3076, 3077, 3077, 3077, 3078, 3078, + 3078, 3079, 3079, 3080, 3080, 3080, 3081, 3081, 3081, 3082, + 3082, 3082, 3083, 3083, 933, 3083, 3083, 3084, 932, 3084, + 3084, 3085, 3085, 3086, 3086, 3087, 3087, 3088, 3088, 3089, + 3089, 3090, 3090, 3091, 3091, 3092, 3092, 3093, 3093, 3094, + 3094, 3095, 3095, 3096, 3096, 3097, 3097, 3098, 3098, 3099, + 3099, 3100, 3100, 3101, 3101, 3102, 3102, 3103, 3103, 3104, + 3104, 3105, 3105, 3106, 3106, 3107, 3107, 3108, 3108, 3109, 3109, 3110, 3110, 3111, 3111, 3112, 3112, 3113, 3113, 3114, 3114, 3115, 3115, 3116, 3116, 3117, 3117, 3118, 3118, 3119, - 3119, 3120, 3120, 3121, 3121, 3122, 3122, 3123, 3123, 3124, - 3124, 3125, 3125, 3126, 3126, 3127, 3127, 3128, 3128, 3129, - 3129, 3130, 3130, 3131, 3131, 3132, 3132, 3133, 3133, 3134, - 3134, 3135, 3135, 3136, 3136, 3137, 3137, 3138, 3138, 3139, - 3139, 3140, 3140, 3141, 3141, 3142, 3142, 3143, 3143, 3144, - 3144, 3145, 3145, 3145, 3146, 3146, 3147, 3147, 3147, 3148, - 3148, 3148, 3149, 3149, 3149, 3150, 3150, 3150, 3151, 3151, - 3151, 3152, 3152, 3152, 3153, 3153, 3154, 3154, 3154, 3155, - 3155, 3155, 3156, 3156, 3156, 3157, 3157, 3157, 3158, 3158, - - 3158, 3159, 3159, 3159, 3160, 3160, 3160, 3161, 3161, 3161, - 3162, 3162, 3162, 3163, 3163, 3164, 3164, 3164, 3165, 3165, - 3165, 3166, 3166, 3166, 3167, 904, 3167, 3167, 3167, 3168, - 903, 3168, 3168, 3169, 3169, 3170, 3170, 3171, 3171, 3172, - 3172, 3173, 3173, 3174, 3174, 3175, 3175, 3176, 3176, 3177, - 3177, 3178, 3178, 3179, 3179, 3180, 3180, 3181, 3181, 3182, - 3182, 3183, 3183, 3184, 3184, 3185, 3185, 3186, 3186, 3187, - 3187, 3188, 3188, 3189, 3189, 3190, 3190, 3191, 3191, 3192, - 3192, 3193, 3193, 3194, 3194, 3195, 3195, 3196, 3196, 3197, - 3197, 3198, 3198, 3199, 3199, 3200, 3200, 3201, 3201, 3202, - - 3202, 3203, 3203, 3204, 3204, 3205, 3205, 3206, 3206, 3207, - 3207, 3208, 3208, 3209, 3209, 3210, 3210, 3211, 3211, 3212, - 3212, 3212, 3213, 3213, 3214, 3214, 3214, 3215, 3215, 3215, - 3216, 3216, 3217, 3217, 3217, 3218, 3218, 3218, 3219, 3219, - 3219, 3220, 3220, 3221, 3221, 3221, 3222, 3222, 3222, 3223, - 3223, 3223, 3224, 3224, 3224, 3225, 3225, 3225, 3226, 3226, - 3226, 3227, 3227, 3228, 3228, 3228, 3229, 3229, 3229, 3230, - 3230, 3230, 3231, 3231, 3232, 3232, 3232, 3233, 3233, 3233, - 3234, 3234, 3234, 3235, 3235, 3235, 3236, 3236, 3236, 3237, - 3237, 3237, 3238, 3238, 3239, 902, 3239, 3239, 3239, 3240, - - 901, 3240, 3240, 3241, 3241, 3242, 3242, 3243, 3243, 3244, - 3244, 3245, 3245, 3246, 3246, 3247, 3247, 3248, 3248, 3249, - 3249, 3250, 3250, 3251, 3251, 3252, 3252, 3253, 3253, 3254, - 3254, 3255, 3255, 3256, 3256, 3257, 3257, 3258, 3258, 3259, - 3259, 3260, 3260, 3261, 3261, 3262, 3262, 3263, 3263, 3264, - 3264, 3265, 3265, 3266, 3266, 3267, 3267, 3268, 3268, 3269, - 3269, 3270, 3270, 3271, 3271, 3272, 3272, 3273, 3273, 3274, - 3274, 3275, 3275, 3276, 3276, 3277, 3277, 3278, 3278, 3279, - 3279, 3280, 3280, 3281, 3281, 3282, 3282, 3283, 3283, 3284, - 3284, 3285, 3285, 3286, 3286, 3286, 3287, 3287, 3288, 3288, - - 3288, 3289, 3289, 3289, 3290, 3290, 3291, 3291, 3291, 3292, - 3292, 3292, 3293, 3293, 3293, 3294, 3294, 3294, 3295, 3295, - 3295, 3296, 3296, 3296, 3297, 3297, 3297, 3298, 3298, 3298, - 3299, 3299, 3300, 3300, 3300, 3301, 3301, 3301, 3302, 3302, - 3302, 3303, 3303, 3303, 3304, 3304, 3304, 3305, 3305, 3305, - 3306, 3306, 3306, 3307, 3307, 3307, 3308, 3308, 3308, 3309, - 3309, 3310, 3310, 3310, 3311, 3311, 3311, 3312, 3312, 3312, - 3313, 900, 3313, 3313, 3313, 3314, 899, 3314, 3314, 3315, - 3315, 3316, 3316, 3317, 3317, 3318, 3318, 3319, 3319, 3320, - 3320, 3321, 3321, 3322, 3322, 3323, 3323, 3324, 3324, 3325, - - 3325, 3326, 3326, 3327, 3327, 3328, 3328, 3329, 3329, 3330, - 3330, 3331, 3331, 3332, 3332, 3333, 3333, 3334, 3334, 3335, - 3335, 3336, 3336, 3337, 3337, 3338, 3338, 3339, 3339, 3340, - 3340, 3341, 3341, 3342, 3342, 3343, 3343, 3344, 3344, 3345, - 3345, 3346, 3346, 3347, 3347, 3348, 3348, 3349, 3349, 3350, - 3350, 3351, 3351, 3352, 3352, 3353, 3353, 3354, 3354, 3355, - 3355, 3356, 3356, 3357, 3357, 3358, 3358, 3359, 3359, 3360, - 3360, 3361, 3361, 3362, 3362, 3363, 3363, 3364, 3364, 3365, - 3365, 3366, 3366, 3367, 3367, 3367, 3368, 3368, 3369, 3369, - 3369, 3370, 3370, 3370, 3371, 3371, 3372, 3372, 3372, 3373, - - 3373, 3373, 3374, 3374, 3374, 3375, 3375, 3375, 3376, 3376, - 3377, 3377, 3377, 3378, 3378, 3378, 3379, 3379, 3379, 3380, - 3380, 3381, 3381, 3381, 3382, 3382, 3382, 3383, 3383, 3383, - 3384, 3384, 3384, 3385, 3385, 3385, 3386, 3386, 3386, 3387, - 3387, 3388, 3388, 3388, 3389, 3389, 3389, 3390, 3390, 3390, - 3391, 3391, 3392, 3392, 3392, 3393, 3393, 3393, 3394, 3394, - 3394, 3395, 3395, 3395, 3396, 3396, 3396, 3397, 3397, 3397, - 3398, 3398, 3399, 898, 3399, 3399, 3399, 3400, 897, 3400, - 3400, 3401, 3401, 3402, 3402, 3403, 3403, 3404, 3404, 3405, - 3405, 3406, 3406, 3407, 3407, 3408, 3408, 3409, 3409, 3410, - - 3410, 3411, 3411, 3412, 3412, 3413, 3413, 3414, 3414, 3415, - 3415, 3416, 3416, 3417, 3417, 3418, 3418, 3419, 3419, 3420, - 3420, 3421, 3421, 3422, 3422, 3423, 3423, 3424, 3424, 3425, - 3425, 3426, 3426, 3427, 3427, 3428, 3428, 3429, 3429, 3430, - 3430, 3431, 3431, 3432, 3432, 3433, 3433, 3434, 3434, 3435, - 3435, 3436, 3436, 3437, 3437, 3438, 3438, 3439, 3439, 3440, - 3440, 3441, 3441, 3442, 3442, 3443, 3443, 3444, 3444, 3445, - 3445, 3446, 3446, 3447, 3447, 3448, 3448, 3449, 3449, 3450, - 3450, 3451, 3451, 3452, 3452, 3453, 3453, 3454, 3454, 3454, - 3455, 3455, 3456, 3456, 3456, 3457, 3457, 3457, 3458, 3458, - - 3458, 3459, 3459, 3459, 3460, 3460, 3460, 3461, 3461, 3461, - 3462, 3462, 3463, 3463, 3463, 3464, 3464, 3464, 3465, 3465, - 3465, 3466, 3466, 3466, 3467, 3467, 3467, 3468, 3468, 3468, - 3469, 3469, 3469, 3470, 3470, 3470, 3471, 3471, 3471, 3472, - 3472, 3473, 3473, 3473, 3474, 3474, 3474, 3475, 3475, 3475, - 3476, 3476, 3476, 3477, 3477, 3477, 3478, 3478, 3478, 3479, - 3479, 3479, 3480, 3480, 3480, 3481, 3481, 3481, 3482, 3482, - 3483, 3483, 3483, 3484, 3484, 3484, 3485, 3485, 3485, 3486, - 896, 3486, 3486, 3486, 3487, 895, 3487, 3487, 3488, 3488, - 3489, 3489, 3490, 3490, 3491, 3491, 3492, 3492, 3493, 3493, - - 3494, 3494, 3495, 3495, 3496, 3496, 3497, 3497, 3498, 3498, - 3499, 3499, 3500, 3500, 3501, 3501, 3502, 3502, 3503, 3503, - 3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507, 3508, 3508, - 3509, 3509, 3510, 3510, 3511, 3511, 3512, 3512, 3513, 3513, - 3514, 3514, 3515, 3515, 3516, 3516, 3517, 3517, 3518, 3518, - 3519, 3519, 3520, 3520, 3521, 3521, 3522, 3522, 3523, 3523, - 3524, 3524, 3525, 3525, 3526, 3526, 3527, 3527, 3528, 3528, - 3529, 3529, 3530, 3530, 3531, 3531, 3532, 3532, 3533, 3533, - 3534, 3534, 3535, 3535, 3536, 3536, 3537, 3537, 3538, 3538, - 3539, 3539, 3540, 3540, 3541, 3541, 3542, 3542, 3543, 3543, - - 3544, 3544, 3545, 3545, 3546, 3546, 3546, 3547, 3547, 3548, - 3548, 3548, 3549, 3549, 3549, 3550, 3550, 3551, 3551, 3551, - 3552, 3552, 3552, 3553, 3553, 3553, 3554, 3554, 3555, 3555, - 3555, 3556, 3556, 3556, 3557, 3557, 3557, 3558, 3558, 3558, - 3559, 3559, 3559, 3560, 3560, 3560, 3561, 3561, 3562, 3562, - 3562, 3563, 3563, 3563, 3564, 3564, 3564, 3565, 3565, 3566, - 3566, 3566, 3567, 3567, 3567, 3568, 3568, 3568, 3569, 3569, - 3569, 3570, 3570, 3570, 3571, 3571, 3571, 3572, 3572, 3573, - 3573, 3573, 3574, 3574, 3574, 3575, 3575, 3575, 3576, 3576, - 3577, 3577, 3577, 3578, 3578, 3578, 3579, 3579, 3579, 3580, - - 3580, 3580, 3581, 3581, 3581, 3582, 3582, 3582, 3583, 3583, - 3584, 894, 3584, 3584, 3584, 3585, 893, 3585, 3585, 3586, - 3586, 3587, 3587, 3588, 3588, 3589, 3589, 3590, 3590, 3591, - 3591, 3592, 3592, 3593, 3593, 3594, 3594, 3595, 3595, 3596, - 3596, 3597, 3597, 3598, 3598, 3599, 3599, 3600, 3600, 3601, - 3601, 3602, 3602, 3603, 3603, 3604, 3604, 3605, 3605, 3606, - 3606, 3607, 3607, 3608, 3608, 3609, 3609, 3610, 3610, 3611, - 3611, 3612, 3612, 3613, 3613, 3614, 3614, 3615, 3615, 3616, - 3616, 3617, 3617, 3618, 3618, 3619, 3619, 3620, 3620, 3621, - 3621, 3622, 3622, 3623, 3623, 3624, 3624, 3625, 3625, 3626, - - 3626, 3627, 3627, 3628, 3628, 3629, 3629, 3630, 3630, 3631, - 3631, 3632, 3632, 3633, 3633, 3634, 3634, 3635, 3635, 3636, - 3636, 3637, 3637, 3638, 3638, 3639, 3639, 3640, 3640, 3641, - 3641, 3642, 3642, 3643, 3643, 3644, 3644, 3644, 3645, 3645, - 3646, 3646, 3646, 3647, 3647, 3647, 3648, 3648, 3649, 3649, - 3649, 3650, 3650, 3650, 3651, 3651, 3651, 3652, 3652, 3652, - 3653, 3653, 3653, 3654, 3654, 3654, 3655, 3655, 3655, 3656, - 3656, 3656, 3657, 3657, 3658, 3658, 3658, 3659, 3659, 3659, - 3660, 3660, 3660, 3661, 3661, 3661, 3662, 3662, 3662, 3663, - 3663, 3663, 3664, 3664, 3664, 3665, 3665, 3665, 3666, 3666, - - 3666, 3667, 3667, 3668, 3668, 3668, 3669, 3669, 3669, 3670, - 3670, 3670, 3671, 3671, 3671, 3672, 3672, 3672, 3673, 3673, - 3673, 3674, 3674, 3674, 3675, 3675, 3675, 3676, 3676, 3676, - 3677, 3677, 3678, 3678, 3678, 3679, 3679, 3679, 3680, 3680, - 3680, 3681, 892, 3681, 3681, 3681, 3682, 891, 3682, 3682, - 3683, 3683, 3684, 3684, 3685, 3685, 3686, 3686, 3687, 3687, - 3688, 3688, 3689, 3689, 3690, 3690, 3691, 3691, 3692, 3692, - 3693, 3693, 3694, 3694, 3695, 3695, 3696, 3696, 3697, 3697, - 3698, 3698, 3699, 3699, 3700, 3700, 3701, 3701, 3702, 3702, - 3703, 3703, 3704, 3704, 3705, 3705, 3706, 3706, 3707, 3707, - - 3708, 3708, 3709, 3709, 3710, 3710, 3711, 3711, 3712, 3712, - 3713, 3713, 3714, 3714, 3715, 3715, 3716, 3716, 3717, 3717, - 3718, 3718, 3719, 3719, 3720, 3720, 3721, 3721, 3722, 3722, - 3723, 3723, 3724, 3724, 3725, 3725, 3726, 3726, 3727, 3727, - 3728, 3728, 3729, 3729, 3730, 3730, 3731, 3731, 3732, 3732, - 3733, 3733, 3734, 3734, 3735, 3735, 3736, 3736, 3737, 3737, - 3738, 3738, 3739, 3739, 3740, 3740, 3741, 3741, 3742, 3742, - 3742, 3743, 3743, 3744, 3744, 3744, 3745, 3745, 3745, 3746, - 3746, 3746, 3747, 3747, 3747, 3748, 3748, 3748, 3749, 3749, - 3750, 3750, 3750, 3751, 3751, 3751, 3752, 3752, 3752, 3753, - - 3753, 3754, 3754, 3754, 3755, 3755, 3755, 3756, 3756, 3756, - 3757, 3757, 3757, 3758, 3758, 3758, 3759, 3759, 3759, 3760, - 3760, 3761, 3761, 3761, 3762, 3762, 3762, 3763, 3763, 3763, - 3764, 3764, 3765, 3765, 3765, 3766, 3766, 3766, 3767, 3767, - 3767, 3768, 3768, 3768, 3769, 3769, 3769, 3770, 3770, 3770, - 3771, 3771, 3772, 3772, 3772, 3773, 3773, 3773, 3774, 3774, - 3774, 3775, 3775, 3776, 3776, 3776, 3777, 3777, 3777, 3778, - 3778, 3778, 3779, 3779, 3779, 3780, 3780, 3780, 3781, 3781, - 3781, 3782, 3782, 3783, 890, 3783, 3783, 3783, 3784, 889, - 3784, 3784, 3785, 3785, 3786, 3786, 3787, 3787, 3788, 3788, - - 3789, 3789, 3790, 3790, 3791, 3791, 3792, 3792, 3793, 3793, - 3794, 3794, 3795, 3795, 3796, 3796, 3797, 3797, 3798, 3798, - 3799, 3799, 3800, 3800, 3801, 3801, 3802, 3802, 3803, 3803, - 3804, 3804, 3805, 3805, 3806, 3806, 3807, 3807, 3808, 3808, - 3809, 3809, 3810, 3810, 3811, 3811, 3812, 3812, 3813, 3813, - 3814, 3814, 3815, 3815, 3816, 3816, 3817, 3817, 3818, 3818, - 3819, 3819, 3820, 3820, 3821, 3821, 3822, 3822, 3823, 3823, - 3824, 3824, 3825, 3825, 3826, 3826, 3827, 3827, 3828, 3828, - 3829, 3829, 3830, 3830, 3831, 3831, 3832, 3832, 3833, 3833, - 3834, 3834, 3835, 3835, 3836, 3836, 3837, 3837, 3838, 3838, - - 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3842, 3843, - 3843, 3843, 3844, 3844, 3844, 3845, 3845, 3846, 3846, 3846, - 3847, 3847, 3847, 3848, 3848, 3848, 3849, 3849, 3849, 3850, - 3850, 3850, 3851, 3851, 3851, 3852, 3852, 3852, 3853, 3853, - 3853, 3854, 3854, 3854, 3855, 3855, 3856, 3856, 3856, 3857, - 3857, 3857, 3858, 3858, 3858, 3859, 3859, 3859, 3860, 3860, - 3860, 3861, 3861, 3861, 3862, 3862, 3862, 3863, 3863, 3863, - 3864, 3864, 3864, 3865, 3865, 3866, 3866, 3866, 3867, 3867, - 3867, 3868, 3868, 3868, 3869, 3869, 3869, 3870, 3870, 3870, - 3871, 3871, 3871, 3872, 3872, 3872, 3873, 3873, 3873, 3874, - - 3874, 3874, 3875, 3875, 3876, 3876, 3876, 3877, 3877, 3877, - 3878, 3878, 3878, 3879, 887, 3879, 3879, 3879, 3880, 879, - 3880, 3880, 3881, 3881, 3882, 3882, 3883, 3883, 3884, 3884, - 3885, 3885, 3886, 3886, 3887, 3887, 3888, 3888, 3889, 3889, - 3890, 3890, 3891, 3891, 3892, 3892, 3893, 3893, 3894, 3894, - 3895, 3895, 3896, 3896, 3897, 3897, 3898, 3898, 3899, 3899, - 3900, 3900, 3901, 3901, 3902, 3902, 3903, 3903, 3904, 3904, - 3905, 3905, 3906, 3906, 3907, 3907, 3908, 3908, 3909, 3909, - 3910, 3910, 3911, 3911, 3912, 3912, 3913, 3913, 3914, 3914, - 3915, 3915, 3916, 3916, 3917, 3917, 3918, 3918, 3919, 3919, - - 3920, 3920, 3921, 3921, 3922, 3922, 3923, 3923, 3924, 3924, - 3925, 3925, 3926, 3926, 3927, 3927, 3928, 3928, 3929, 3929, - 3930, 3930, 3931, 3931, 3932, 3932, 3933, 3933, 3934, 3934, - 3935, 3935, 3936, 3936, 3937, 3937, 3937, 3938, 3938, 3938, - 3939, 3939, 3939, 3940, 3940, 3940, 3941, 3941, 3941, 3942, - 3942, 3942, 3943, 3943, 3944, 3944, 3944, 3945, 3945, 3945, - 3946, 3946, 3946, 3947, 3947, 3947, 3948, 3948, 3948, 3949, - 3949, 3949, 3950, 3950, 3950, 3951, 3951, 3951, 3952, 3952, - 3953, 3953, 3953, 3954, 3954, 3954, 3955, 3955, 3955, 3956, - 3956, 3957, 3957, 3957, 3958, 3958, 3958, 3959, 3959, 3959, - - 3960, 3960, 3960, 3961, 3961, 3961, 3962, 3962, 3962, 3963, - 3963, 3964, 3964, 3964, 3965, 3965, 3965, 3966, 3966, 3966, - 3967, 3967, 3968, 3968, 3968, 3969, 3969, 3969, 3970, 3970, - 3970, 3971, 3971, 3971, 3972, 3972, 3972, 3973, 3973, 3973, - 3974, 3974, 3975, 870, 3975, 3975, 3975, 3976, 867, 3976, - 3976, 3977, 3977, 3978, 3978, 3979, 3979, 3980, 3980, 3981, - 3981, 3982, 3982, 3983, 3983, 3984, 3984, 3985, 3985, 3986, - 3986, 3987, 3987, 3988, 3988, 3989, 3989, 3990, 3990, 3991, - 3991, 3992, 3992, 3993, 3993, 3994, 3994, 3995, 3995, 3996, - 3996, 3997, 3997, 3998, 3998, 3999, 3999, 4000, 4000, 4001, - - 4001, 4002, 4002, 4003, 4003, 4004, 4004, 4005, 4005, 4006, - 4006, 4007, 4007, 4008, 4008, 4009, 4009, 4010, 4010, 4011, - 4011, 4012, 4012, 4013, 4013, 4014, 4014, 4015, 4015, 4016, - 4016, 4017, 4017, 4018, 4018, 4019, 4019, 4020, 4020, 4021, - 4021, 4022, 4022, 4023, 4023, 4024, 4024, 4025, 4025, 4026, - 4026, 4027, 4027, 4028, 4028, 4028, 4029, 4029, 4029, 4030, - 4030, 4030, 4031, 4031, 4031, 4032, 4032, 4032, 4033, 4033, - 4033, 4034, 4034, 4034, 4035, 4035, 4035, 4036, 4036, 4036, - 4037, 4037, 4038, 4038, 4038, 4039, 4039, 4039, 4040, 4040, - 4040, 4041, 4041, 4041, 4042, 4042, 4042, 4043, 4043, 4043, - - 4044, 4044, 4044, 4045, 4045, 4045, 4046, 4046, 4046, 4047, - 4047, 4048, 4048, 4048, 4049, 4049, 4049, 4050, 4050, 4050, - 4051, 4051, 4051, 4052, 4052, 4052, 4053, 4053, 4053, 4054, - 4054, 4054, 4055, 4055, 4055, 4056, 4056, 4056, 4057, 4057, - 4058, 4058, 4058, 4059, 4059, 4059, 4060, 4060, 4060, 4061, - 866, 4061, 4061, 4061, 4062, 865, 4062, 4062, 4063, 4063, - 4064, 4064, 4065, 4065, 4066, 4066, 4067, 4067, 4068, 4068, - 4069, 4069, 4070, 4070, 4071, 4071, 4072, 4072, 4073, 4073, - 4074, 4074, 4075, 4075, 4076, 4076, 4077, 4077, 4078, 4078, - 4079, 4079, 4080, 4080, 4081, 4081, 4082, 4082, 4083, 4083, - - 4084, 4084, 4085, 4085, 4086, 4086, 4087, 4087, 4088, 4088, - 4089, 4089, 4090, 4090, 4091, 4091, 4092, 4092, 4093, 4093, - 4094, 4094, 4095, 4095, 4096, 4096, 4097, 4097, 4098, 4098, - 4099, 4099, 4100, 4100, 4101, 4101, 4102, 4102, 4103, 4103, - 4104, 4104, 4105, 4105, 4106, 4106, 4106, 4107, 4107, 4107, - 4108, 4108, 4108, 4109, 4109, 4110, 4110, 4110, 4111, 4111, - 4111, 4112, 4112, 4112, 4113, 4113, 4113, 4114, 4114, 4114, - 4115, 4115, 4115, 4116, 4116, 4116, 4117, 4117, 4118, 4118, - 4118, 4119, 4119, 4119, 4120, 4120, 4120, 4121, 4121, 4122, - 4122, 4122, 4123, 4123, 4123, 4124, 4124, 4124, 4125, 4125, - - 4125, 4126, 4126, 4126, 4127, 4127, 4127, 4128, 4128, 4129, - 4129, 4129, 4130, 4130, 4130, 4131, 4131, 4131, 4132, 4132, - 4133, 4133, 4133, 4134, 4134, 4134, 4135, 4135, 4135, 4136, - 4136, 4136, 4137, 4137, 4137, 4138, 4138, 4138, 4139, 4139, - 4140, 864, 4140, 4140, 4140, 4141, 863, 4141, 4141, 4142, - 4142, 4143, 4143, 4144, 4144, 4145, 4145, 4146, 4146, 4147, - 4147, 4148, 4148, 4149, 4149, 4150, 4150, 4151, 4151, 4152, - 4152, 4153, 4153, 4154, 4154, 4155, 4155, 4156, 4156, 4157, - 4157, 4158, 4158, 4159, 4159, 4160, 4160, 4161, 4161, 4162, - 4162, 4163, 4163, 4164, 4164, 4165, 4165, 4166, 4166, 4167, - - 4167, 4168, 4168, 4169, 4169, 4170, 4170, 4171, 4171, 4172, - 4172, 4173, 4173, 4174, 4174, 4175, 4175, 4176, 4176, 4177, - 4177, 4178, 4178, 4179, 4179, 4180, 4180, 4180, 4181, 4181, - 4181, 4182, 4182, 4182, 4183, 4183, 4183, 4184, 4184, 4184, - 4185, 4185, 4186, 4186, 4186, 4187, 4187, 4187, 4188, 4188, - 4188, 4189, 4189, 4189, 4190, 4190, 4190, 4191, 4191, 4191, - 4192, 4192, 4192, 4193, 4193, 4193, 4194, 4194, 4194, 4195, - 4195, 4196, 4196, 4196, 4197, 4197, 4197, 4198, 4198, 4198, - 4199, 4199, 4199, 4200, 4200, 4200, 4201, 4201, 4201, 4202, - 4202, 4202, 4203, 4203, 4203, 4204, 4204, 4204, 4205, 4205, - - 4206, 4206, 4206, 4207, 4207, 4207, 4208, 4208, 4208, 4209, - 862, 4209, 4209, 4209, 4210, 859, 4210, 4210, 4211, 4211, - 4212, 4212, 4213, 4213, 4214, 4214, 4215, 4215, 4216, 4216, - 4217, 4217, 4218, 4218, 4219, 4219, 4220, 4220, 4221, 4221, - 4222, 4222, 4223, 4223, 4224, 4224, 4225, 4225, 4226, 4226, - 4227, 4227, 4228, 4228, 4229, 4229, 4230, 4230, 4231, 4231, - 4232, 4232, 4233, 4233, 4234, 4234, 4235, 4235, 4236, 4236, - 4237, 4237, 4238, 4238, 4239, 4239, 4240, 4240, 4241, 4241, - 4242, 4242, 4243, 4243, 4244, 4244, 4245, 4245, 4246, 4246, - 4246, 4247, 4247, 4247, 4248, 4248, 4248, 4249, 4249, 4249, - - 4250, 4250, 4250, 4251, 4251, 4251, 4252, 4252, 4253, 4253, - 4253, 4254, 4254, 4254, 4255, 4255, 4255, 4256, 4256, 4256, - 4257, 4257, 4257, 4258, 4258, 4258, 4259, 4259, 4259, 4260, - 4260, 4260, 4261, 4261, 4262, 4262, 4262, 4263, 4263, 4263, - 4264, 4264, 4264, 4265, 4265, 4266, 4266, 4266, 4267, 4267, - 4267, 4268, 4268, 4268, 4269, 4269, 4269, 4270, 4270, 4270, - 4271, 4271, 4271, 4272, 4272, 4273, 845, 4273, 4273, 4273, - 4274, 836, 4274, 4274, 4275, 4275, 4276, 4276, 4277, 4277, - 4278, 4278, 4279, 4279, 4280, 4280, 4281, 4281, 4282, 4282, - 4283, 4283, 4284, 4284, 4285, 4285, 4286, 4286, 4287, 4287, - - 4288, 4288, 4289, 4289, 4290, 4290, 4291, 4291, 4292, 4292, - 4293, 4293, 4294, 4294, 4295, 4295, 4296, 4296, 4297, 4297, - 4298, 4298, 4299, 4299, 4300, 4300, 4301, 4301, 4302, 4302, - 4303, 4303, 4304, 4304, 4304, 4305, 4305, 4305, 4306, 4306, - 4306, 4307, 4307, 4307, 4308, 4308, 4308, 4309, 4309, 4309, - 4310, 4310, 4310, 4311, 4311, 4311, 4312, 4312, 4312, 4313, - 4313, 4314, 4314, 4314, 4315, 4315, 4315, 4316, 4316, 4316, - 4317, 4317, 4317, 4318, 4318, 4318, 4319, 4319, 4319, 4320, - 4320, 4320, 4321, 4321, 4321, 4322, 4322, 4322, 4323, 4323, - 4324, 4324, 4324, 4325, 4325, 4325, 4326, 4326, 4326, 4327, - - 833, 4327, 4327, 4327, 4328, 831, 4328, 4328, 4329, 4329, - 4330, 4330, 4331, 4331, 4332, 4332, 4333, 4333, 4334, 4334, - 4335, 4335, 4336, 4336, 4337, 4337, 4338, 4338, 4339, 4339, - 4340, 4340, 4341, 4341, 4342, 4342, 4343, 4343, 4344, 4344, - 4345, 4345, 4346, 4346, 4347, 4347, 4348, 4348, 4349, 4349, - 4350, 4350, 4351, 4351, 4352, 4352, 4352, 4353, 4353, 4353, - 4354, 4354, 4354, 4355, 4355, 4356, 4356, 4356, 4357, 4357, - 4357, 4358, 4358, 4358, 4359, 4359, 4359, 4360, 4360, 4360, - 4361, 4361, 4361, 4362, 4362, 4362, 4363, 4363, 4364, 4364, - 4364, 4365, 4365, 4365, 4366, 4366, 4366, 4367, 4367, 4368, - - 4368, 4368, 4369, 4369, 4369, 4370, 4370, 4370, 4371, 4371, - 4371, 4372, 4372, 4372, 4373, 4373, 4373, 4374, 4374, 4375, - 830, 4375, 4375, 4375, 4376, 829, 4376, 4376, 4377, 4377, - 4378, 4378, 4379, 4379, 4380, 4380, 4381, 4381, 4382, 4382, - 4383, 4383, 4384, 4384, 4385, 4385, 4386, 4386, 4387, 4387, - 4388, 4388, 4389, 4389, 4390, 4390, 4391, 4391, 4392, 4392, - 4393, 4393, 4394, 4394, 4395, 4395, 4395, 4396, 4396, 4396, - 4397, 4397, 4397, 4398, 4398, 4398, 4399, 4399, 4399, 4400, - 4400, 4401, 4401, 4401, 4402, 4402, 4402, 4403, 4403, 4403, - 4404, 4404, 4404, 4405, 4405, 4405, 4406, 4406, 4406, 4407, - - 4407, 4407, 4408, 4408, 4408, 4409, 4409, 4409, 4410, 4410, - 4411, 4411, 4411, 4412, 4412, 4412, 4413, 4413, 4413, 4414, - 828, 4414, 4414, 4414, 4415, 827, 4415, 4415, 4416, 4416, - 4417, 4417, 4418, 4418, 4419, 4419, 4420, 4420, 4421, 4421, - 4422, 4422, 4423, 4423, 4424, 4424, 4425, 4425, 4426, 4426, - 4427, 4427, 4428, 4428, 4429, 4429, 4430, 4430, 4431, 4431, - 4432, 4432, 4432, 4433, 4433, 4433, 4434, 4434, 4434, 4435, + 3119, 3120, 3120, 3120, 3121, 3121, 3122, 3122, 3122, 3123, + 3123, 3123, 3124, 3124, 3125, 3125, 3125, 3126, 3126, 3126, + 3127, 3127, 3127, 3128, 3128, 3128, 3129, 3129, 3130, 3130, + 3130, 3131, 3131, 3131, 3132, 3132, 3132, 3133, 3133, 3134, + 3134, 3134, 3135, 3135, 3135, 3136, 3136, 3136, 3137, 3137, + 3137, 3138, 3138, 3138, 3139, 3139, 3139, 3140, 3140, 3141, + 3141, 931, 3141, 3141, 3142, 930, 3142, 3142, 3143, 3143, + 3144, 3144, 3145, 3145, 3146, 3146, 3147, 3147, 3148, 3148, + 3149, 3149, 3150, 3150, 3151, 3151, 3152, 3152, 3153, 3153, + + 3154, 3154, 3155, 3155, 3156, 3156, 3157, 3157, 3158, 3158, + 3159, 3159, 3160, 3160, 3161, 3161, 3162, 3162, 3163, 3163, + 3164, 3164, 3165, 3165, 3166, 3166, 3167, 3167, 3168, 3168, + 3169, 3169, 3170, 3170, 3171, 3171, 3172, 3172, 3173, 3173, + 3174, 3174, 3175, 3175, 3176, 3176, 3177, 3177, 3178, 3178, + 3179, 3179, 3180, 3180, 3180, 3181, 3181, 3182, 3182, 3182, + 3183, 3183, 3183, 3184, 3184, 3184, 3185, 3185, 3185, 3186, + 3186, 3186, 3187, 3187, 3187, 3188, 3188, 3189, 3189, 3189, + 3190, 3190, 3190, 3191, 3191, 3191, 3192, 3192, 3192, 3193, + 3193, 3193, 3194, 3194, 3194, 3195, 3195, 3195, 3196, 3196, + + 3196, 3197, 3197, 3197, 3198, 3198, 3199, 3199, 3199, 3200, + 3200, 3200, 3201, 3201, 3201, 3202, 3202, 929, 3202, 3202, + 3203, 928, 3203, 3203, 3204, 3204, 3205, 3205, 3206, 3206, + 3207, 3207, 3208, 3208, 3209, 3209, 3210, 3210, 3211, 3211, + 3212, 3212, 3213, 3213, 3214, 3214, 3215, 3215, 3216, 3216, + 3217, 3217, 3218, 3218, 3219, 3219, 3220, 3220, 3221, 3221, + 3222, 3222, 3223, 3223, 3224, 3224, 3225, 3225, 3226, 3226, + 3227, 3227, 3228, 3228, 3229, 3229, 3230, 3230, 3231, 3231, + 3232, 3232, 3233, 3233, 3234, 3234, 3235, 3235, 3236, 3236, + 3237, 3237, 3238, 3238, 3239, 3239, 3240, 3240, 3241, 3241, + + 3242, 3242, 3243, 3243, 3244, 3244, 3245, 3245, 3246, 3246, + 3247, 3247, 3247, 3248, 3248, 3249, 3249, 3249, 3250, 3250, + 3250, 3251, 3251, 3252, 3252, 3252, 3253, 3253, 3253, 3254, + 3254, 3254, 3255, 3255, 3256, 3256, 3256, 3257, 3257, 3257, + 3258, 3258, 3258, 3259, 3259, 3259, 3260, 3260, 3260, 3261, + 3261, 3261, 3262, 3262, 3263, 3263, 3263, 3264, 3264, 3264, + 3265, 3265, 3265, 3266, 3266, 3267, 3267, 3267, 3268, 3268, + 3268, 3269, 3269, 3269, 3270, 3270, 3270, 3271, 3271, 3271, + 3272, 3272, 3272, 3273, 3273, 3274, 3274, 927, 3274, 3274, + 3275, 926, 3275, 3275, 3276, 3276, 3277, 3277, 3278, 3278, + + 3279, 3279, 3280, 3280, 3281, 3281, 3282, 3282, 3283, 3283, + 3284, 3284, 3285, 3285, 3286, 3286, 3287, 3287, 3288, 3288, + 3289, 3289, 3290, 3290, 3291, 3291, 3292, 3292, 3293, 3293, + 3294, 3294, 3295, 3295, 3296, 3296, 3297, 3297, 3298, 3298, + 3299, 3299, 3300, 3300, 3301, 3301, 3302, 3302, 3303, 3303, + 3304, 3304, 3305, 3305, 3306, 3306, 3307, 3307, 3308, 3308, + 3309, 3309, 3310, 3310, 3311, 3311, 3312, 3312, 3313, 3313, + 3314, 3314, 3315, 3315, 3316, 3316, 3317, 3317, 3318, 3318, + 3319, 3319, 3320, 3320, 3321, 3321, 3321, 3322, 3322, 3323, + 3323, 3323, 3324, 3324, 3324, 3325, 3325, 3326, 3326, 3326, + + 3327, 3327, 3327, 3328, 3328, 3328, 3329, 3329, 3329, 3330, + 3330, 3330, 3331, 3331, 3331, 3332, 3332, 3332, 3333, 3333, + 3333, 3334, 3334, 3335, 3335, 3335, 3336, 3336, 3336, 3337, + 3337, 3337, 3338, 3338, 3338, 3339, 3339, 3339, 3340, 3340, + 3340, 3341, 3341, 3341, 3342, 3342, 3342, 3343, 3343, 3343, + 3344, 3344, 3345, 3345, 3345, 3346, 3346, 3346, 3347, 3347, + 3347, 3348, 3348, 925, 3348, 3348, 3349, 924, 3349, 3349, + 3350, 3350, 3351, 3351, 3352, 3352, 3353, 3353, 3354, 3354, + 3355, 3355, 3356, 3356, 3357, 3357, 3358, 3358, 3359, 3359, + 3360, 3360, 3361, 3361, 3362, 3362, 3363, 3363, 3364, 3364, + + 3365, 3365, 3366, 3366, 3367, 3367, 3368, 3368, 3369, 3369, + 3370, 3370, 3371, 3371, 3372, 3372, 3373, 3373, 3374, 3374, + 3375, 3375, 3376, 3376, 3377, 3377, 3378, 3378, 3379, 3379, + 3380, 3380, 3381, 3381, 3382, 3382, 3383, 3383, 3384, 3384, + 3385, 3385, 3386, 3386, 3387, 3387, 3388, 3388, 3389, 3389, + 3390, 3390, 3391, 3391, 3392, 3392, 3393, 3393, 3394, 3394, + 3395, 3395, 3396, 3396, 3397, 3397, 3398, 3398, 3399, 3399, + 3400, 3400, 3401, 3401, 3402, 3402, 3402, 3403, 3403, 3404, + 3404, 3404, 3405, 3405, 3405, 3406, 3406, 3407, 3407, 3407, + 3408, 3408, 3408, 3409, 3409, 3409, 3410, 3410, 3410, 3411, + + 3411, 3412, 3412, 3412, 3413, 3413, 3413, 3414, 3414, 3414, + 3415, 3415, 3416, 3416, 3416, 3417, 3417, 3417, 3418, 3418, + 3418, 3419, 3419, 3419, 3420, 3420, 3420, 3421, 3421, 3421, + 3422, 3422, 3423, 3423, 3423, 3424, 3424, 3424, 3425, 3425, + 3425, 3426, 3426, 3427, 3427, 3427, 3428, 3428, 3428, 3429, + 3429, 3429, 3430, 3430, 3430, 3431, 3431, 3431, 3432, 3432, + 3432, 3433, 3433, 3434, 3434, 923, 3434, 3434, 3435, 922, + 3435, 3435, 3436, 3436, 3437, 3437, 3438, 3438, 3439, 3439, + 3440, 3440, 3441, 3441, 3442, 3442, 3443, 3443, 3444, 3444, + 3445, 3445, 3446, 3446, 3447, 3447, 3448, 3448, 3449, 3449, + + 3450, 3450, 3451, 3451, 3452, 3452, 3453, 3453, 3454, 3454, + 3455, 3455, 3456, 3456, 3457, 3457, 3458, 3458, 3459, 3459, + 3460, 3460, 3461, 3461, 3462, 3462, 3463, 3463, 3464, 3464, + 3465, 3465, 3466, 3466, 3467, 3467, 3468, 3468, 3469, 3469, + 3470, 3470, 3471, 3471, 3472, 3472, 3473, 3473, 3474, 3474, + 3475, 3475, 3476, 3476, 3477, 3477, 3478, 3478, 3479, 3479, + 3480, 3480, 3481, 3481, 3482, 3482, 3483, 3483, 3484, 3484, + 3485, 3485, 3486, 3486, 3487, 3487, 3488, 3488, 3489, 3489, + 3489, 3490, 3490, 3491, 3491, 3491, 3492, 3492, 3492, 3493, + 3493, 3493, 3494, 3494, 3494, 3495, 3495, 3495, 3496, 3496, + + 3496, 3497, 3497, 3498, 3498, 3498, 3499, 3499, 3499, 3500, + 3500, 3500, 3501, 3501, 3501, 3502, 3502, 3502, 3503, 3503, + 3503, 3504, 3504, 3504, 3505, 3505, 3505, 3506, 3506, 3506, + 3507, 3507, 3508, 3508, 3508, 3509, 3509, 3509, 3510, 3510, + 3510, 3511, 3511, 3511, 3512, 3512, 3512, 3513, 3513, 3513, + 3514, 3514, 3514, 3515, 3515, 3515, 3516, 3516, 3516, 3517, + 3517, 3518, 3518, 3518, 3519, 3519, 3519, 3520, 3520, 3520, + 3521, 3521, 921, 3521, 3521, 3522, 920, 3522, 3522, 3523, + 3523, 3524, 3524, 3525, 3525, 3526, 3526, 3527, 3527, 3528, + 3528, 3529, 3529, 3530, 3530, 3531, 3531, 3532, 3532, 3533, + + 3533, 3534, 3534, 3535, 3535, 3536, 3536, 3537, 3537, 3538, + 3538, 3539, 3539, 3540, 3540, 3541, 3541, 3542, 3542, 3543, + 3543, 3544, 3544, 3545, 3545, 3546, 3546, 3547, 3547, 3548, + 3548, 3549, 3549, 3550, 3550, 3551, 3551, 3552, 3552, 3553, + 3553, 3554, 3554, 3555, 3555, 3556, 3556, 3557, 3557, 3558, + 3558, 3559, 3559, 3560, 3560, 3561, 3561, 3562, 3562, 3563, + 3563, 3564, 3564, 3565, 3565, 3566, 3566, 3567, 3567, 3568, + 3568, 3569, 3569, 3570, 3570, 3571, 3571, 3572, 3572, 3573, + 3573, 3574, 3574, 3575, 3575, 3576, 3576, 3577, 3577, 3578, + 3578, 3579, 3579, 3580, 3580, 3581, 3581, 3581, 3582, 3582, + + 3583, 3583, 3583, 3584, 3584, 3584, 3585, 3585, 3586, 3586, + 3586, 3587, 3587, 3587, 3588, 3588, 3588, 3589, 3589, 3590, + 3590, 3590, 3591, 3591, 3591, 3592, 3592, 3592, 3593, 3593, + 3593, 3594, 3594, 3594, 3595, 3595, 3595, 3596, 3596, 3597, + 3597, 3597, 3598, 3598, 3598, 3599, 3599, 3599, 3600, 3600, + 3601, 3601, 3601, 3602, 3602, 3602, 3603, 3603, 3603, 3604, + 3604, 3604, 3605, 3605, 3605, 3606, 3606, 3606, 3607, 3607, + 3608, 3608, 3608, 3609, 3609, 3609, 3610, 3610, 3610, 3611, + 3611, 3612, 3612, 3612, 3613, 3613, 3613, 3614, 3614, 3614, + 3615, 3615, 3615, 3616, 3616, 3616, 3617, 3617, 3617, 3618, + + 3618, 3619, 3619, 919, 3619, 3619, 3620, 918, 3620, 3620, + 3621, 3621, 3622, 3622, 3623, 3623, 3624, 3624, 3625, 3625, + 3626, 3626, 3627, 3627, 3628, 3628, 3629, 3629, 3630, 3630, + 3631, 3631, 3632, 3632, 3633, 3633, 3634, 3634, 3635, 3635, + 3636, 3636, 3637, 3637, 3638, 3638, 3639, 3639, 3640, 3640, + 3641, 3641, 3642, 3642, 3643, 3643, 3644, 3644, 3645, 3645, + 3646, 3646, 3647, 3647, 3648, 3648, 3649, 3649, 3650, 3650, + 3651, 3651, 3652, 3652, 3653, 3653, 3654, 3654, 3655, 3655, + 3656, 3656, 3657, 3657, 3658, 3658, 3659, 3659, 3660, 3660, + 3661, 3661, 3662, 3662, 3663, 3663, 3664, 3664, 3665, 3665, + + 3666, 3666, 3667, 3667, 3668, 3668, 3669, 3669, 3670, 3670, + 3671, 3671, 3672, 3672, 3673, 3673, 3674, 3674, 3675, 3675, + 3676, 3676, 3677, 3677, 3678, 3678, 3679, 3679, 3679, 3680, + 3680, 3681, 3681, 3681, 3682, 3682, 3682, 3683, 3683, 3684, + 3684, 3684, 3685, 3685, 3685, 3686, 3686, 3686, 3687, 3687, + 3687, 3688, 3688, 3688, 3689, 3689, 3689, 3690, 3690, 3690, + 3691, 3691, 3691, 3692, 3692, 3693, 3693, 3693, 3694, 3694, + 3694, 3695, 3695, 3695, 3696, 3696, 3696, 3697, 3697, 3697, + 3698, 3698, 3698, 3699, 3699, 3699, 3700, 3700, 3700, 3701, + 3701, 3701, 3702, 3702, 3703, 3703, 3703, 3704, 3704, 3704, + + 3705, 3705, 3705, 3706, 3706, 3706, 3707, 3707, 3707, 3708, + 3708, 3708, 3709, 3709, 3709, 3710, 3710, 3710, 3711, 3711, + 3711, 3712, 3712, 3713, 3713, 3713, 3714, 3714, 3714, 3715, + 3715, 3715, 3716, 3716, 917, 3716, 3716, 3717, 916, 3717, + 3717, 3718, 3718, 3719, 3719, 3720, 3720, 3721, 3721, 3722, + 3722, 3723, 3723, 3724, 3724, 3725, 3725, 3726, 3726, 3727, + 3727, 3728, 3728, 3729, 3729, 3730, 3730, 3731, 3731, 3732, + 3732, 3733, 3733, 3734, 3734, 3735, 3735, 3736, 3736, 3737, + 3737, 3738, 3738, 3739, 3739, 3740, 3740, 3741, 3741, 3742, + 3742, 3743, 3743, 3744, 3744, 3745, 3745, 3746, 3746, 3747, + + 3747, 3748, 3748, 3749, 3749, 3750, 3750, 3751, 3751, 3752, + 3752, 3753, 3753, 3754, 3754, 3755, 3755, 3756, 3756, 3757, + 3757, 3758, 3758, 3759, 3759, 3760, 3760, 3761, 3761, 3762, + 3762, 3763, 3763, 3764, 3764, 3765, 3765, 3766, 3766, 3767, + 3767, 3768, 3768, 3769, 3769, 3770, 3770, 3771, 3771, 3772, + 3772, 3773, 3773, 3774, 3774, 3775, 3775, 3776, 3776, 3777, + 3777, 3777, 3778, 3778, 3779, 3779, 3779, 3780, 3780, 3780, + 3781, 3781, 3781, 3782, 3782, 3782, 3783, 3783, 3783, 3784, + 3784, 3785, 3785, 3785, 3786, 3786, 3786, 3787, 3787, 3787, + 3788, 3788, 3789, 3789, 3789, 3790, 3790, 3790, 3791, 3791, + + 3791, 3792, 3792, 3792, 3793, 3793, 3793, 3794, 3794, 3794, + 3795, 3795, 3796, 3796, 3796, 3797, 3797, 3797, 3798, 3798, + 3798, 3799, 3799, 3800, 3800, 3800, 3801, 3801, 3801, 3802, + 3802, 3802, 3803, 3803, 3803, 3804, 3804, 3804, 3805, 3805, + 3805, 3806, 3806, 3807, 3807, 3807, 3808, 3808, 3808, 3809, + 3809, 3809, 3810, 3810, 3811, 3811, 3811, 3812, 3812, 3812, + 3813, 3813, 3813, 3814, 3814, 3814, 3815, 3815, 3815, 3816, + 3816, 3816, 3817, 3817, 3818, 3818, 915, 3818, 3818, 3819, + 914, 3819, 3819, 3820, 3820, 3821, 3821, 3822, 3822, 3823, + 3823, 3824, 3824, 3825, 3825, 3826, 3826, 3827, 3827, 3828, + + 3828, 3829, 3829, 3830, 3830, 3831, 3831, 3832, 3832, 3833, + 3833, 3834, 3834, 3835, 3835, 3836, 3836, 3837, 3837, 3838, + 3838, 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3843, + 3843, 3844, 3844, 3845, 3845, 3846, 3846, 3847, 3847, 3848, + 3848, 3849, 3849, 3850, 3850, 3851, 3851, 3852, 3852, 3853, + 3853, 3854, 3854, 3855, 3855, 3856, 3856, 3857, 3857, 3858, + 3858, 3859, 3859, 3860, 3860, 3861, 3861, 3862, 3862, 3863, + 3863, 3864, 3864, 3865, 3865, 3866, 3866, 3867, 3867, 3868, + 3868, 3869, 3869, 3870, 3870, 3871, 3871, 3872, 3872, 3873, + 3873, 3874, 3874, 3875, 3875, 3876, 3876, 3877, 3877, 3877, + + 3878, 3878, 3878, 3879, 3879, 3879, 3880, 3880, 3881, 3881, + 3881, 3882, 3882, 3882, 3883, 3883, 3883, 3884, 3884, 3884, + 3885, 3885, 3885, 3886, 3886, 3886, 3887, 3887, 3887, 3888, + 3888, 3888, 3889, 3889, 3889, 3890, 3890, 3891, 3891, 3891, + 3892, 3892, 3892, 3893, 3893, 3893, 3894, 3894, 3894, 3895, + 3895, 3895, 3896, 3896, 3896, 3897, 3897, 3897, 3898, 3898, + 3898, 3899, 3899, 3899, 3900, 3900, 3901, 3901, 3901, 3902, + 3902, 3902, 3903, 3903, 3903, 3904, 3904, 3904, 3905, 3905, + 3905, 3906, 3906, 3906, 3907, 3907, 3907, 3908, 3908, 3908, + 3909, 3909, 3909, 3910, 3910, 3911, 3911, 3911, 3912, 3912, + + 3912, 3913, 3913, 3913, 3914, 3914, 912, 3914, 3914, 3915, + 903, 3915, 3915, 3916, 3916, 3917, 3917, 3918, 3918, 3919, + 3919, 3920, 3920, 3921, 3921, 3922, 3922, 3923, 3923, 3924, + 3924, 3925, 3925, 3926, 3926, 3927, 3927, 3928, 3928, 3929, + 3929, 3930, 3930, 3931, 3931, 3932, 3932, 3933, 3933, 3934, + 3934, 3935, 3935, 3936, 3936, 3937, 3937, 3938, 3938, 3939, + 3939, 3940, 3940, 3941, 3941, 3942, 3942, 3943, 3943, 3944, + 3944, 3945, 3945, 3946, 3946, 3947, 3947, 3948, 3948, 3949, + 3949, 3950, 3950, 3951, 3951, 3952, 3952, 3953, 3953, 3954, + 3954, 3955, 3955, 3956, 3956, 3957, 3957, 3958, 3958, 3959, + + 3959, 3960, 3960, 3961, 3961, 3962, 3962, 3963, 3963, 3964, + 3964, 3965, 3965, 3966, 3966, 3967, 3967, 3968, 3968, 3969, + 3969, 3970, 3970, 3971, 3971, 3972, 3972, 3972, 3973, 3973, + 3973, 3974, 3974, 3974, 3975, 3975, 3975, 3976, 3976, 3976, + 3977, 3977, 3977, 3978, 3978, 3979, 3979, 3979, 3980, 3980, + 3980, 3981, 3981, 3981, 3982, 3982, 3982, 3983, 3983, 3983, + 3984, 3984, 3984, 3985, 3985, 3985, 3986, 3986, 3986, 3987, + 3987, 3988, 3988, 3988, 3989, 3989, 3989, 3990, 3990, 3990, + 3991, 3991, 3992, 3992, 3992, 3993, 3993, 3993, 3994, 3994, + 3994, 3995, 3995, 3995, 3996, 3996, 3996, 3997, 3997, 3997, + + 3998, 3998, 3999, 3999, 3999, 4000, 4000, 4000, 4001, 4001, + 4001, 4002, 4002, 4003, 4003, 4003, 4004, 4004, 4004, 4005, + 4005, 4005, 4006, 4006, 4006, 4007, 4007, 4007, 4008, 4008, + 4008, 4009, 4009, 4010, 4010, 894, 4010, 4010, 4011, 891, + 4011, 4011, 4012, 4012, 4013, 4013, 4014, 4014, 4015, 4015, + 4016, 4016, 4017, 4017, 4018, 4018, 4019, 4019, 4020, 4020, + 4021, 4021, 4022, 4022, 4023, 4023, 4024, 4024, 4025, 4025, + 4026, 4026, 4027, 4027, 4028, 4028, 4029, 4029, 4030, 4030, + 4031, 4031, 4032, 4032, 4033, 4033, 4034, 4034, 4035, 4035, + 4036, 4036, 4037, 4037, 4038, 4038, 4039, 4039, 4040, 4040, + + 4041, 4041, 4042, 4042, 4043, 4043, 4044, 4044, 4045, 4045, + 4046, 4046, 4047, 4047, 4048, 4048, 4049, 4049, 4050, 4050, + 4051, 4051, 4052, 4052, 4053, 4053, 4054, 4054, 4055, 4055, + 4056, 4056, 4057, 4057, 4058, 4058, 4059, 4059, 4060, 4060, + 4061, 4061, 4062, 4062, 4063, 4063, 4063, 4064, 4064, 4064, + 4065, 4065, 4065, 4066, 4066, 4066, 4067, 4067, 4067, 4068, + 4068, 4068, 4069, 4069, 4069, 4070, 4070, 4070, 4071, 4071, + 4071, 4072, 4072, 4073, 4073, 4073, 4074, 4074, 4074, 4075, + 4075, 4075, 4076, 4076, 4076, 4077, 4077, 4077, 4078, 4078, + 4078, 4079, 4079, 4079, 4080, 4080, 4080, 4081, 4081, 4081, + + 4082, 4082, 4083, 4083, 4083, 4084, 4084, 4084, 4085, 4085, + 4085, 4086, 4086, 4086, 4087, 4087, 4087, 4088, 4088, 4088, + 4089, 4089, 4089, 4090, 4090, 4090, 4091, 4091, 4091, 4092, + 4092, 4093, 4093, 4093, 4094, 4094, 4094, 4095, 4095, 4095, + 4096, 4096, 890, 4096, 4096, 4097, 889, 4097, 4097, 4098, + 4098, 4099, 4099, 4100, 4100, 4101, 4101, 4102, 4102, 4103, + 4103, 4104, 4104, 4105, 4105, 4106, 4106, 4107, 4107, 4108, + 4108, 4109, 4109, 4110, 4110, 4111, 4111, 4112, 4112, 4113, + 4113, 4114, 4114, 4115, 4115, 4116, 4116, 4117, 4117, 4118, + 4118, 4119, 4119, 4120, 4120, 4121, 4121, 4122, 4122, 4123, + + 4123, 4124, 4124, 4125, 4125, 4126, 4126, 4127, 4127, 4128, + 4128, 4129, 4129, 4130, 4130, 4131, 4131, 4132, 4132, 4133, + 4133, 4134, 4134, 4135, 4135, 4136, 4136, 4137, 4137, 4138, + 4138, 4139, 4139, 4140, 4140, 4141, 4141, 4141, 4142, 4142, + 4142, 4143, 4143, 4143, 4144, 4144, 4145, 4145, 4145, 4146, + 4146, 4146, 4147, 4147, 4147, 4148, 4148, 4148, 4149, 4149, + 4149, 4150, 4150, 4150, 4151, 4151, 4151, 4152, 4152, 4153, + 4153, 4153, 4154, 4154, 4154, 4155, 4155, 4155, 4156, 4156, + 4157, 4157, 4157, 4158, 4158, 4158, 4159, 4159, 4159, 4160, + 4160, 4160, 4161, 4161, 4161, 4162, 4162, 4162, 4163, 4163, + + 4164, 4164, 4164, 4165, 4165, 4165, 4166, 4166, 4166, 4167, + 4167, 4168, 4168, 4168, 4169, 4169, 4169, 4170, 4170, 4170, + 4171, 4171, 4171, 4172, 4172, 4172, 4173, 4173, 4173, 4174, + 4174, 4175, 4175, 888, 4175, 4175, 4176, 887, 4176, 4176, + 4177, 4177, 4178, 4178, 4179, 4179, 4180, 4180, 4181, 4181, + 4182, 4182, 4183, 4183, 4184, 4184, 4185, 4185, 4186, 4186, + 4187, 4187, 4188, 4188, 4189, 4189, 4190, 4190, 4191, 4191, + 4192, 4192, 4193, 4193, 4194, 4194, 4195, 4195, 4196, 4196, + 4197, 4197, 4198, 4198, 4199, 4199, 4200, 4200, 4201, 4201, + 4202, 4202, 4203, 4203, 4204, 4204, 4205, 4205, 4206, 4206, + + 4207, 4207, 4208, 4208, 4209, 4209, 4210, 4210, 4211, 4211, + 4212, 4212, 4213, 4213, 4214, 4214, 4215, 4215, 4215, 4216, + 4216, 4216, 4217, 4217, 4217, 4218, 4218, 4218, 4219, 4219, + 4219, 4220, 4220, 4221, 4221, 4221, 4222, 4222, 4222, 4223, + 4223, 4223, 4224, 4224, 4224, 4225, 4225, 4225, 4226, 4226, + 4226, 4227, 4227, 4227, 4228, 4228, 4228, 4229, 4229, 4229, + 4230, 4230, 4231, 4231, 4231, 4232, 4232, 4232, 4233, 4233, + 4233, 4234, 4234, 4234, 4235, 4235, 4235, 4236, 4236, 4236, + 4237, 4237, 4237, 4238, 4238, 4238, 4239, 4239, 4239, 4240, + 4240, 4241, 4241, 4241, 4242, 4242, 4242, 4243, 4243, 4243, + + 4244, 4244, 886, 4244, 4244, 4245, 882, 4245, 4245, 4246, + 4246, 4247, 4247, 4248, 4248, 4249, 4249, 4250, 4250, 4251, + 4251, 4252, 4252, 4253, 4253, 4254, 4254, 4255, 4255, 4256, + 4256, 4257, 4257, 4258, 4258, 4259, 4259, 4260, 4260, 4261, + 4261, 4262, 4262, 4263, 4263, 4264, 4264, 4265, 4265, 4266, + 4266, 4267, 4267, 4268, 4268, 4269, 4269, 4270, 4270, 4271, + 4271, 4272, 4272, 4273, 4273, 4274, 4274, 4275, 4275, 4276, + 4276, 4277, 4277, 4278, 4278, 4279, 4279, 4280, 4280, 4281, + 4281, 4281, 4282, 4282, 4282, 4283, 4283, 4283, 4284, 4284, + 4284, 4285, 4285, 4285, 4286, 4286, 4286, 4287, 4287, 4288, + + 4288, 4288, 4289, 4289, 4289, 4290, 4290, 4290, 4291, 4291, + 4291, 4292, 4292, 4292, 4293, 4293, 4293, 4294, 4294, 4294, + 4295, 4295, 4295, 4296, 4296, 4297, 4297, 4297, 4298, 4298, + 4298, 4299, 4299, 4299, 4300, 4300, 4301, 4301, 4301, 4302, + 4302, 4302, 4303, 4303, 4303, 4304, 4304, 4304, 4305, 4305, + 4305, 4306, 4306, 4306, 4307, 4307, 4308, 4308, 868, 4308, + 4308, 4309, 859, 4309, 4309, 4310, 4310, 4311, 4311, 4312, + 4312, 4313, 4313, 4314, 4314, 4315, 4315, 4316, 4316, 4317, + 4317, 4318, 4318, 4319, 4319, 4320, 4320, 4321, 4321, 4322, + 4322, 4323, 4323, 4324, 4324, 4325, 4325, 4326, 4326, 4327, + + 4327, 4328, 4328, 4329, 4329, 4330, 4330, 4331, 4331, 4332, + 4332, 4333, 4333, 4334, 4334, 4335, 4335, 4336, 4336, 4337, + 4337, 4338, 4338, 4339, 4339, 4339, 4340, 4340, 4340, 4341, + 4341, 4341, 4342, 4342, 4342, 4343, 4343, 4343, 4344, 4344, + 4344, 4345, 4345, 4345, 4346, 4346, 4346, 4347, 4347, 4347, + 4348, 4348, 4349, 4349, 4349, 4350, 4350, 4350, 4351, 4351, + 4351, 4352, 4352, 4352, 4353, 4353, 4353, 4354, 4354, 4354, + 4355, 4355, 4355, 4356, 4356, 4356, 4357, 4357, 4357, 4358, + 4358, 4359, 4359, 4359, 4360, 4360, 4360, 4361, 4361, 4361, + 4362, 4362, 856, 4362, 4362, 4363, 854, 4363, 4363, 4364, + + 4364, 4365, 4365, 4366, 4366, 4367, 4367, 4368, 4368, 4369, + 4369, 4370, 4370, 4371, 4371, 4372, 4372, 4373, 4373, 4374, + 4374, 4375, 4375, 4376, 4376, 4377, 4377, 4378, 4378, 4379, + 4379, 4380, 4380, 4381, 4381, 4382, 4382, 4383, 4383, 4384, + 4384, 4385, 4385, 4386, 4386, 4387, 4387, 4387, 4388, 4388, + 4388, 4389, 4389, 4389, 4390, 4390, 4391, 4391, 4391, 4392, + 4392, 4392, 4393, 4393, 4393, 4394, 4394, 4394, 4395, 4395, + 4395, 4396, 4396, 4396, 4397, 4397, 4397, 4398, 4398, 4399, + 4399, 4399, 4400, 4400, 4400, 4401, 4401, 4401, 4402, 4402, + 4403, 4403, 4403, 4404, 4404, 4404, 4405, 4405, 4405, 4406, + + 4406, 4406, 4407, 4407, 4407, 4408, 4408, 4408, 4409, 4409, + 4410, 4410, 853, 4410, 4410, 4411, 852, 4411, 4411, 4412, + 4412, 4413, 4413, 4414, 4414, 4415, 4415, 4416, 4416, 4417, + 4417, 4418, 4418, 4419, 4419, 4420, 4420, 4421, 4421, 4422, + 4422, 4423, 4423, 4424, 4424, 4425, 4425, 4426, 4426, 4427, + 4427, 4428, 4428, 4429, 4429, 4430, 4430, 4430, 4431, 4431, + 4431, 4432, 4432, 4432, 4433, 4433, 4433, 4434, 4434, 4434, 4435, 4435, 4436, 4436, 4436, 4437, 4437, 4437, 4438, 4438, - 4439, 4439, 4439, 4440, 4440, 4440, 4441, 4441, 4441, 4442, - 4442, 4442, 4443, 4443, 4443, 4444, 4444, 4444, 4445, 4445, - - 4445, 4446, 4446, 4446, 4447, 4447, 4448, 826, 4448, 4448, - 4448, 4449, 825, 4449, 4449, 4450, 4450, 4451, 4451, 4452, - 4452, 4453, 4453, 4454, 4454, 4455, 4455, 4456, 4456, 4457, - 4457, 4458, 4458, 4459, 4459, 4459, 4460, 4460, 4460, 4461, - 4461, 4461, 4462, 4462, 4462, 4463, 4463, 4463, 4464, 4464, - 4464, 4465, 4465, 4465, 4466, 4466, 4467, 4467, 4467, 4468, - 4468, 4468, 4469, 4469, 4469, 4470, 824, 4470, 4470, 4471, - 4471, 4472, 4472, 4473, 4473, 4474, 4474, 4475, 4475, 4476, - 4476, 4477, 4477, 4478, 4478, 4478, 4479, 4479, 4479, 4480, - 4480, 4480, 4481, 4481, 4481, 4482, 4482, 4482, 4483, 4483, - - 4483, 4484, 4484, 4484, 4485, 4485, 4485, 4486, 4486, 4487, - 823, 4487, 4487, 4488, 4488, 4489, 4489, 4490, 4490, 4491, - 4491, 4492, 4492, 4493, 4493, 4493, 4494, 4494, 4494, 4495, - 4495, 4495, 4496, 4496, 4496, 4497, 4497, 4497, 4498, 4498, - 4498, 4499, 822, 4499, 4499, 4500, 4500, 4501, 4501, 4502, - 4502, 4503, 4503, 4503, 4504, 4504, 4504, 4505, 4505, 4505, - 4506, 4506, 4506, 4507, 821, 4507, 4507, 4508, 4508, 4509, - 4509, 4510, 4510, 4510, 4511, 4511, 4511, 4512, 820, 4512, - 4512, 4513, 4513, 4513, 4514, 819, 4514, 4514, 4515, 818, - 4515, 4515, 4516, 817, 4516, 4516, 4517, 816, 4517, 4517, - - 4518, 815, 4518, 4518, 4519, 814, 4519, 4519, 4520, 813, - 4520, 4520, 4521, 812, 4521, 4521, 4522, 811, 4522, 4522, - 4523, 810, 4523, 4523, 4524, 809, 4524, 4524, 4525, 808, - 4525, 4525, 4526, 807, 4526, 4526, 4527, 806, 4527, 4527, - 4528, 805, 4528, 4528, 4529, 804, 4529, 4529, 4530, 803, - 4530, 4530, 4531, 802, 4531, 4531, 4532, 800, 4532, 4532, - 4533, 788, 4533, 4533, 4534, 778, 4534, 4534, 4535, 777, - 4535, 4535, 4536, 776, 4536, 4536, 4537, 775, 4537, 4537, - 4538, 774, 4538, 4538, 4539, 773, 4539, 4539, 4540, 759, - 4540, 4540, 752, 748, 745, 743, 742, 741, 740, 739, - - 738, 737, 736, 735, 734, 733, 732, 731, 730, 729, - 728, 727, 726, 725, 724, 723, 722, 721, 720, 719, - 718, 716, 713, 709, 706, 696, 691, 688, 687, 686, - 685, 684, 683, 682, 671, 665, 658, 656, 655, 654, - 653, 652, 651, 650, 649, 648, 647, 646, 645, 644, - 643, 642, 641, 640, 639, 638, 637, 636, 634, 628, - 627, 614, 613, 612, 602, 601, 595, 594, 593, 592, - 591, 590, 589, 578, 575, 572, 567, 564, 562, 561, - 560, 559, 558, 557, 556, 555, 554, 553, 552, 551, - 550, 549, 548, 547, 545, 539, 534, 533, 511, 506, - - 505, 504, 503, 502, 501, 497, 485, 478, 475, 473, - 472, 471, 470, 469, 468, 467, 466, 465, 464, 463, - 461, 454, 448, 447, 425, 421, 420, 419, 418, 417, - 416, 410, 398, 391, 388, 386, 385, 384, 383, 382, - 381, 380, 379, 377, 370, 362, 361, 340, 328, 308, - 306, 305, 304, 303, 302, 300, 240, 233, 226, 221, - 217, 216, 215, 213, 143, 140, 138, 137, 136, 128, - 126, 70, 60, 58, 56, 55, 53, 50, 48, 41, - 35, 13, 8, 3, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, - 2829, 2829 + 4438, 4439, 4439, 4439, 4440, 4440, 4440, 4441, 4441, 4441, + 4442, 4442, 4442, 4443, 4443, 4443, 4444, 4444, 4444, 4445, + + 4445, 4446, 4446, 4446, 4447, 4447, 4447, 4448, 4448, 4448, + 4449, 4449, 851, 4449, 4449, 4450, 850, 4450, 4450, 4451, + 4451, 4452, 4452, 4453, 4453, 4454, 4454, 4455, 4455, 4456, + 4456, 4457, 4457, 4458, 4458, 4459, 4459, 4460, 4460, 4461, + 4461, 4462, 4462, 4463, 4463, 4464, 4464, 4465, 4465, 4466, + 4466, 4467, 4467, 4467, 4468, 4468, 4468, 4469, 4469, 4469, + 4470, 4470, 4470, 4471, 4471, 4471, 4472, 4472, 4472, 4473, + 4473, 4474, 4474, 4474, 4475, 4475, 4475, 4476, 4476, 4476, + 4477, 4477, 4477, 4478, 4478, 4478, 4479, 4479, 4479, 4480, + 4480, 4480, 4481, 4481, 4481, 4482, 4482, 4483, 4483, 849, + + 4483, 4483, 4484, 848, 4484, 4484, 4485, 4485, 4486, 4486, + 4487, 4487, 4488, 4488, 4489, 4489, 4490, 4490, 4491, 4491, + 4492, 4492, 4493, 4493, 4494, 4494, 4494, 4495, 4495, 4495, + 4496, 4496, 4496, 4497, 4497, 4497, 4498, 4498, 4498, 4499, + 4499, 4499, 4500, 4500, 4500, 4501, 4501, 4502, 4502, 4502, + 4503, 4503, 4503, 4504, 4504, 4504, 4505, 847, 4505, 4505, + 4506, 4506, 4507, 4507, 4508, 4508, 4509, 4509, 4510, 4510, + 4511, 4511, 4512, 4512, 4513, 4513, 4513, 4514, 4514, 4514, + 4515, 4515, 4515, 4516, 4516, 4516, 4517, 4517, 4517, 4518, + 4518, 4518, 4519, 4519, 4519, 4520, 4520, 4520, 4521, 4521, + + 4522, 846, 4522, 4522, 4523, 4523, 4524, 4524, 4525, 4525, + 4526, 4526, 4527, 4527, 4528, 4528, 4528, 4529, 4529, 4529, + 4530, 4530, 4530, 4531, 4531, 4531, 4532, 4532, 4532, 4533, + 4533, 4533, 4534, 845, 4534, 4534, 4535, 4535, 4536, 4536, + 4537, 4537, 4538, 4538, 4538, 4539, 4539, 4539, 4540, 4540, + 4540, 4541, 4541, 4541, 4542, 844, 4542, 4542, 4543, 4543, + 4544, 4544, 4545, 4545, 4545, 4546, 4546, 4546, 4547, 843, + 4547, 4547, 4548, 4548, 4548, 4549, 842, 4549, 4549, 4550, + 841, 4550, 4550, 4551, 840, 4551, 4551, 4552, 839, 4552, + 4552, 4553, 838, 4553, 4553, 4554, 837, 4554, 4554, 4555, + + 836, 4555, 4555, 4556, 835, 4556, 4556, 4557, 834, 4557, + 4557, 4558, 833, 4558, 4558, 4559, 832, 4559, 4559, 4560, + 831, 4560, 4560, 4561, 830, 4561, 4561, 4562, 829, 4562, + 4562, 4563, 828, 4563, 4563, 4564, 827, 4564, 4564, 4565, + 826, 4565, 4565, 4566, 825, 4566, 4566, 4567, 823, 4567, + 4567, 4568, 810, 4568, 4568, 4569, 800, 4569, 4569, 4570, + 799, 4570, 4570, 4571, 798, 4571, 4571, 4572, 797, 4572, + 4572, 4573, 796, 4573, 4573, 4574, 795, 4574, 4574, 4575, + 780, 4575, 4575, 773, 769, 766, 764, 763, 762, 761, + 760, 759, 758, 757, 756, 755, 754, 753, 752, 751, + + 750, 749, 748, 747, 746, 745, 744, 743, 742, 741, + 740, 739, 737, 734, 729, 726, 716, 711, 708, 707, + 706, 705, 704, 703, 702, 690, 684, 677, 675, 674, + 673, 672, 671, 670, 669, 668, 667, 666, 665, 664, + 663, 662, 661, 660, 659, 658, 657, 656, 655, 653, + 647, 645, 632, 631, 630, 620, 619, 613, 612, 611, + 610, 609, 608, 607, 595, 592, 589, 584, 581, 579, + 578, 577, 576, 575, 574, 573, 572, 571, 570, 569, + 568, 567, 566, 565, 564, 562, 556, 550, 549, 526, + 521, 520, 519, 518, 517, 516, 512, 499, 492, 489, + + 487, 486, 485, 484, 483, 482, 481, 480, 479, 478, + 477, 475, 468, 461, 460, 437, 433, 432, 431, 430, + 429, 428, 422, 409, 402, 399, 397, 396, 395, 394, + 393, 392, 391, 390, 388, 381, 372, 371, 349, 337, + 316, 314, 313, 312, 311, 310, 308, 246, 238, 231, + 226, 222, 221, 220, 218, 146, 143, 141, 140, 139, + 131, 129, 72, 61, 59, 57, 56, 54, 51, 49, + 42, 35, 13, 8, 3, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, 2864, + 2864, 2864, 2864, 2864 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[103] = +static yyconst flex_int32_t yy_rule_can_match_eol[106] = { 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, 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, 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, - 1, 0, 0, }; + 0, 0, 0, 1, 0, 0, }; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; @@ -4178,7 +4210,7 @@ char *yytext; #include "read_config_yy.h" #define YY_NO_INPUT 1 -#line 4182 "read_config_lex.c" +#line 4214 "read_config_lex.c" #define INITIAL 0 @@ -4365,7 +4397,7 @@ YY_DECL #line 57 "read_config_lex.l" -#line 4369 "read_config_lex.c" +#line 4401 "read_config_lex.c" if ( !(yy_init) ) { @@ -4418,13 +4450,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 >= 2830 ) + if ( yy_current_state >= 2865 ) 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] != 10685 ); + while ( yy_base[yy_current_state] != 10776 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -4876,113 +4908,128 @@ YY_RULE_SETUP case 84: YY_RULE_SETUP #line 141 "read_config_lex.l" -{ return T_ERROR_QUEUE_LENGTH; } +{ return T_OPTIONS; } YY_BREAK case 85: YY_RULE_SETUP -#line 143 "read_config_lex.l" -{ return T_ON; } +#line 142 "read_config_lex.l" +{ return T_TCP_WINDOW_TRACKING; } YY_BREAK case 86: YY_RULE_SETUP -#line 144 "read_config_lex.l" -{ return T_OFF; } +#line 143 "read_config_lex.l" +{ return T_EXPECT_SYNC; } YY_BREAK case 87: YY_RULE_SETUP -#line 145 "read_config_lex.l" -{ yylval.val = atoi(yytext); return T_NUMBER; } +#line 144 "read_config_lex.l" +{ return T_ERROR_QUEUE_LENGTH; } YY_BREAK case 88: YY_RULE_SETUP #line 146 "read_config_lex.l" -{ yylval.val = atoi(yytext); return T_SIGNED_NUMBER; } +{ return T_ON; } YY_BREAK case 89: YY_RULE_SETUP #line 147 "read_config_lex.l" -{ yylval.string = strdup(yytext); return T_IP; } +{ return T_OFF; } YY_BREAK case 90: YY_RULE_SETUP #line 148 "read_config_lex.l" -{ yylval.string = strdup(yytext); return T_IP; } +{ yylval.val = atoi(yytext); return T_NUMBER; } YY_BREAK case 91: YY_RULE_SETUP #line 149 "read_config_lex.l" -{ yylval.string = strdup(yytext); return T_PATH_VAL; } +{ yylval.val = atoi(yytext); return T_SIGNED_NUMBER; } YY_BREAK case 92: YY_RULE_SETUP #line 150 "read_config_lex.l" -{ return T_ALARM; } +{ yylval.string = strdup(yytext); return T_IP; } YY_BREAK case 93: YY_RULE_SETUP #line 151 "read_config_lex.l" +{ yylval.string = strdup(yytext); return T_IP; } + YY_BREAK +case 94: +YY_RULE_SETUP +#line 152 "read_config_lex.l" +{ yylval.string = strdup(yytext); return T_PATH_VAL; } + YY_BREAK +case 95: +YY_RULE_SETUP +#line 153 "read_config_lex.l" +{ return T_ALARM; } + YY_BREAK +case 96: +YY_RULE_SETUP +#line 154 "read_config_lex.l" { fprintf(stderr, "\nWARNING: Now `persistent' mode " "is called `alarm'. Please, update " "your conntrackd.conf file.\n"); return T_ALARM; } YY_BREAK -case 94: +case 97: YY_RULE_SETUP -#line 155 "read_config_lex.l" +#line 158 "read_config_lex.l" { return T_FTFW; } YY_BREAK -case 95: +case 98: YY_RULE_SETUP -#line 156 "read_config_lex.l" +#line 159 "read_config_lex.l" { fprintf(stderr, "\nWARNING: Now `nack' mode " "is called `ftfw'. Please, update " "your conntrackd.conf file.\n"); return T_FTFW; } YY_BREAK -case 96: +case 99: YY_RULE_SETUP -#line 160 "read_config_lex.l" +#line 163 "read_config_lex.l" { return T_NOTRACK; } YY_BREAK -case 97: +case 100: YY_RULE_SETUP -#line 161 "read_config_lex.l" +#line 164 "read_config_lex.l" { yylval.string = strdup(yytext); return T_STRING; } YY_BREAK -case 98: +case 101: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 163 "read_config_lex.l" +#line 166 "read_config_lex.l" ; YY_BREAK -case 99: +case 102: YY_RULE_SETUP -#line 164 "read_config_lex.l" +#line 167 "read_config_lex.l" ; YY_BREAK -case 100: -/* rule 100 can match eol */ +case 103: +/* rule 103 can match eol */ YY_RULE_SETUP -#line 165 "read_config_lex.l" +#line 168 "read_config_lex.l" ; YY_BREAK case YY_STATE_EOF(INITIAL): -#line 167 "read_config_lex.l" +#line 170 "read_config_lex.l" { yyterminate(); } YY_BREAK -case 101: +case 104: YY_RULE_SETUP -#line 169 "read_config_lex.l" +#line 172 "read_config_lex.l" { return yytext[0]; } YY_BREAK -case 102: +case 105: YY_RULE_SETUP -#line 171 "read_config_lex.l" +#line 174 "read_config_lex.l" ECHO; YY_BREAK -#line 4986 "read_config_lex.c" +#line 5033 "read_config_lex.c" case YY_END_OF_BUFFER: { @@ -5272,7 +5319,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 >= 2830 ) + if ( yy_current_state >= 2865 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -5300,11 +5347,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 >= 2830 ) + if ( yy_current_state >= 2865 ) 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 == 2829); + yy_is_jam = (yy_current_state == 2864); return yy_is_jam ? 0 : yy_current_state; } @@ -5949,7 +5996,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 171 "read_config_lex.l" +#line 174 "read_config_lex.l" diff --git a/src/read_config_lex.l b/src/read_config_lex.l index b2d4bdb..01fe4fc 100644 --- a/src/read_config_lex.l +++ b/src/read_config_lex.l @@ -47,7 +47,7 @@ ip6_part {hex_255}":"? ip6_form1 {ip6_part}{0,16}"::"{ip6_part}{0,16} ip6_form2 ({hex_255}":"){16}{hex_255} ip6 {ip6_form1}{ip6_cidr}?|{ip6_form2}{ip6_cidr}? -string [a-zA-Z][a-zA-Z0-9\.]* +string [a-zA-Z][a-zA-Z0-9\.\-]* persistent [P|p][E|e][R|r][S|s][I|i][S|s][T|t][E|e][N|n][T|T] nack [N|n][A|a][C|c][K|k] alarm [A|a][L|l][A|a][R|r][M|m] @@ -138,6 +138,9 @@ notrack [N|n][O|o][T|t][R|r][A|a][C|c][K|k] "NetlinkEventsReliable" { return T_NETLINK_EVENTS_RELIABLE; } "DisableInternalCache" { return T_DISABLE_INTERNAL_CACHE; } "DisableExternalCache" { return T_DISABLE_EXTERNAL_CACHE; } +"Options" { return T_OPTIONS; } +"TCPWindowTracking" { return T_TCP_WINDOW_TRACKING; } +"ExpectationSync" { return T_EXPECT_SYNC; } "ErrorQueueLength" { return T_ERROR_QUEUE_LENGTH; } {is_on} { return T_ON; } diff --git a/src/read_config_yy.c b/src/read_config_yy.c index bd3a785..fe9ecd7 100644 --- a/src/read_config_yy.c +++ b/src/read_config_yy.c @@ -237,11 +237,14 @@ static void __max_dedicated_links_reached(void); T_DISABLE_INTERNAL_CACHE = 343, T_DISABLE_EXTERNAL_CACHE = 344, T_ERROR_QUEUE_LENGTH = 345, - T_IP = 346, - T_PATH_VAL = 347, - T_NUMBER = 348, - T_SIGNED_NUMBER = 349, - T_STRING = 350 + T_OPTIONS = 346, + T_TCP_WINDOW_TRACKING = 347, + T_EXPECT_SYNC = 348, + T_IP = 349, + T_PATH_VAL = 350, + T_NUMBER = 351, + T_SIGNED_NUMBER = 352, + T_STRING = 353 }; #endif /* Tokens. */ @@ -333,11 +336,14 @@ static void __max_dedicated_links_reached(void); #define T_DISABLE_INTERNAL_CACHE 343 #define T_DISABLE_EXTERNAL_CACHE 344 #define T_ERROR_QUEUE_LENGTH 345 -#define T_IP 346 -#define T_PATH_VAL 347 -#define T_NUMBER 348 -#define T_SIGNED_NUMBER 349 -#define T_STRING 350 +#define T_OPTIONS 346 +#define T_TCP_WINDOW_TRACKING 347 +#define T_EXPECT_SYNC 348 +#define T_IP 349 +#define T_PATH_VAL 350 +#define T_NUMBER 351 +#define T_SIGNED_NUMBER 352 +#define T_STRING 353 @@ -355,7 +361,7 @@ typedef union YYSTYPE /* Line 214 of yacc.c */ -#line 359 "read_config_yy.c" +#line 365 "read_config_yy.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -367,7 +373,7 @@ typedef union YYSTYPE /* Line 264 of yacc.c */ -#line 371 "read_config_yy.c" +#line 377 "read_config_yy.c" #ifdef short # undef short @@ -582,20 +588,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 21 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 332 +#define YYLAST 349 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 98 +#define YYNTOKENS 101 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 94 +#define YYNNTS 99 /* YYNRULES -- Number of rules. */ -#define YYNRULES 234 +#define YYNRULES 248 /* YYNRULES -- Number of states. */ -#define YYNSTATES 367 +#define YYNSTATES 385 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 350 +#define YYMAXUTOK 353 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -615,7 +621,7 @@ static const yytype_uint8 yytranslate[] = 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, 96, 2, 97, 2, 2, 2, 2, + 2, 2, 2, 99, 2, 100, 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, @@ -638,7 +644,7 @@ static const yytype_uint8 yytranslate[] = 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95 + 95, 96, 97, 98 }; #if YYDEBUG @@ -656,119 +662,125 @@ static const yytype_uint16 yyprhs[] = 205, 208, 211, 214, 217, 220, 223, 226, 231, 232, 235, 238, 241, 246, 247, 250, 252, 254, 259, 260, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, - 283, 285, 287, 289, 291, 293, 295, 297, 303, 309, - 315, 316, 319, 321, 323, 325, 327, 329, 331, 332, - 335, 337, 339, 341, 343, 345, 347, 348, 351, 353, - 355, 357, 359, 362, 365, 368, 371, 374, 377, 380, - 383, 385, 387, 390, 395, 396, 399, 401, 403, 404, - 407, 409, 411, 413, 415, 417, 419, 421, 423, 425, - 428, 431, 436, 437, 440, 442, 444, 446, 448, 450, - 452, 454, 456, 458, 460, 462, 464, 466, 468, 470, - 472, 474, 476, 479, 482, 485, 488, 491, 494, 497, - 500, 505, 506, 509, 512, 515, 518, 521, 524, 529, - 536, 543, 544, 547, 553, 559, 560, 563, 565, 567, - 573, 579, 580, 583, 586, 589, 595, 601, 602, 605, - 609, 614, 615, 618, 620, 622, 624, 626, 628, 631, - 634, 637, 640, 643, 646 + 283, 285, 287, 289, 291, 293, 295, 297, 299, 304, + 305, 308, 311, 314, 317, 320, 325, 326, 329, 331, + 337, 343, 349, 350, 353, 355, 357, 359, 361, 363, + 365, 366, 369, 371, 373, 375, 377, 379, 381, 382, + 385, 387, 389, 391, 393, 396, 399, 402, 405, 408, + 411, 414, 417, 419, 421, 424, 429, 430, 433, 435, + 437, 438, 441, 443, 445, 447, 449, 451, 453, 455, + 457, 459, 462, 465, 470, 471, 474, 476, 478, 480, + 482, 484, 486, 488, 490, 492, 494, 496, 498, 500, + 502, 504, 506, 508, 510, 513, 516, 519, 522, 525, + 528, 531, 534, 539, 540, 543, 546, 549, 552, 555, + 558, 563, 570, 577, 578, 581, 587, 593, 594, 597, + 599, 601, 603, 605, 611, 617, 618, 621, 624, 627, + 633, 639, 640, 643, 647, 652, 653, 656, 658, 660, + 662, 664, 666, 669, 672, 675, 678, 681, 684 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 99, 0, -1, -1, 100, -1, 101, -1, 100, 101, - -1, 130, -1, 113, -1, 107, -1, 161, -1, 133, - -1, 184, -1, 19, 45, -1, 19, 46, -1, 19, - 92, -1, 61, 45, -1, 61, 46, -1, 61, 95, - -1, 26, 92, -1, 27, -1, 11, 93, -1, 29, - 93, -1, 30, 93, -1, 50, 93, -1, 43, 45, - -1, 43, 46, -1, 16, 96, 114, 97, -1, -1, - 114, 115, -1, 3, 91, -1, 12, 91, -1, 8, - 96, 117, 97, -1, 8, 79, 96, 117, 97, -1, - -1, 117, 118, -1, 3, 91, -1, 12, 91, -1, - 4, 91, -1, 13, 91, -1, 49, 95, -1, 17, - 93, -1, 18, 93, -1, 66, 93, -1, 65, 93, - -1, 43, 45, -1, 43, 46, -1, 20, 96, 120, - 97, -1, 20, 79, 96, 120, 97, -1, -1, 120, - 121, -1, 3, 91, -1, 12, 91, -1, 82, 91, - -1, 83, 91, -1, 49, 95, -1, 5, 93, -1, - 66, 93, -1, 65, 93, -1, 43, 45, -1, 43, - 46, -1, 24, 96, 123, 97, -1, 24, 79, 96, - 123, 97, -1, -1, 123, 124, -1, 3, 91, -1, - 12, 91, -1, 82, 91, -1, 83, 91, -1, 49, - 95, -1, 5, 93, -1, 66, 93, -1, 65, 93, - -1, 43, 45, -1, 43, 46, -1, 90, 93, -1, - 6, 93, -1, 7, 93, -1, 10, 96, 128, 97, - -1, -1, 128, 129, -1, 9, 92, -1, 17, 93, - -1, 25, 96, 131, 97, -1, -1, 131, 132, -1, - 93, -1, 95, -1, 32, 96, 134, 97, -1, -1, - 134, 135, -1, 108, -1, 109, -1, 110, -1, 111, - -1, 112, -1, 116, -1, 119, -1, 122, -1, 151, - -1, 152, -1, 136, -1, 137, -1, 138, -1, 153, - -1, 154, -1, 160, -1, 150, -1, 37, 41, 96, - 139, 97, -1, 37, 42, 96, 141, 97, -1, 37, - 67, 96, 143, 97, -1, -1, 139, 140, -1, 108, - -1, 109, -1, 110, -1, 111, -1, 151, -1, 152, - -1, -1, 141, 142, -1, 148, -1, 147, -1, 110, - -1, 111, -1, 149, -1, 146, -1, -1, 143, 144, - -1, 110, -1, 111, -1, 145, -1, 146, -1, 88, - 45, -1, 88, 46, -1, 89, 45, -1, 89, 46, - -1, 40, 93, -1, 51, 93, -1, 44, 93, -1, - 64, 93, -1, 34, -1, 36, -1, 38, 91, -1, - 47, 155, 48, 156, -1, -1, 155, 157, -1, 95, - -1, 159, -1, -1, 158, 159, -1, 53, -1, 54, - -1, 52, -1, 55, -1, 56, -1, 57, -1, 58, - -1, 59, -1, 60, -1, 62, 45, -1, 62, 46, - -1, 31, 96, 162, 97, -1, -1, 162, 163, -1, - 125, -1, 126, -1, 102, -1, 103, -1, 105, -1, - 104, -1, 106, -1, 127, -1, 164, -1, 165, -1, - 172, -1, 173, -1, 174, -1, 175, -1, 166, -1, - 167, -1, 168, -1, 169, -1, 35, 93, -1, 28, - 93, -1, 80, 45, -1, 80, 46, -1, 80, 93, - -1, 87, 45, -1, 87, 46, -1, 81, 94, -1, - 84, 96, 170, 97, -1, -1, 170, 171, -1, 85, - 95, -1, 86, 93, -1, 39, 95, -1, 78, 93, - -1, 68, 93, -1, 69, 96, 176, 97, -1, 69, - 75, 76, 96, 176, 97, -1, 69, 75, 77, 96, - 176, 97, -1, -1, 176, 177, -1, 71, 73, 96, - 178, 97, -1, 71, 74, 96, 178, 97, -1, -1, - 178, 179, -1, 95, -1, 24, -1, 70, 73, 96, - 180, 97, -1, 70, 74, 96, 180, 97, -1, -1, - 180, 181, -1, 3, 91, -1, 12, 91, -1, 72, - 73, 96, 182, 97, -1, 72, 74, 96, 182, 97, - -1, -1, 182, 183, -1, 158, 48, 24, -1, 33, - 96, 185, 97, -1, -1, 185, 186, -1, 187, -1, - 188, -1, 189, -1, 190, -1, 191, -1, 19, 45, - -1, 19, 46, -1, 19, 92, -1, 61, 45, -1, - 61, 46, -1, 61, 95, -1, 63, 93, -1 + 102, 0, -1, -1, 103, -1, 104, -1, 103, 104, + -1, 133, -1, 116, -1, 110, -1, 169, -1, 136, + -1, 192, -1, 19, 45, -1, 19, 46, -1, 19, + 95, -1, 61, 45, -1, 61, 46, -1, 61, 98, + -1, 26, 95, -1, 27, -1, 11, 96, -1, 29, + 96, -1, 30, 96, -1, 50, 96, -1, 43, 45, + -1, 43, 46, -1, 16, 99, 117, 100, -1, -1, + 117, 118, -1, 3, 94, -1, 12, 94, -1, 8, + 99, 120, 100, -1, 8, 79, 99, 120, 100, -1, + -1, 120, 121, -1, 3, 94, -1, 12, 94, -1, + 4, 94, -1, 13, 94, -1, 49, 98, -1, 17, + 96, -1, 18, 96, -1, 66, 96, -1, 65, 96, + -1, 43, 45, -1, 43, 46, -1, 20, 99, 123, + 100, -1, 20, 79, 99, 123, 100, -1, -1, 123, + 124, -1, 3, 94, -1, 12, 94, -1, 82, 94, + -1, 83, 94, -1, 49, 98, -1, 5, 96, -1, + 66, 96, -1, 65, 96, -1, 43, 45, -1, 43, + 46, -1, 24, 99, 126, 100, -1, 24, 79, 99, + 126, 100, -1, -1, 126, 127, -1, 3, 94, -1, + 12, 94, -1, 82, 94, -1, 83, 94, -1, 49, + 98, -1, 5, 96, -1, 66, 96, -1, 65, 96, + -1, 43, 45, -1, 43, 46, -1, 90, 96, -1, + 6, 96, -1, 7, 96, -1, 10, 99, 131, 100, + -1, -1, 131, 132, -1, 9, 95, -1, 17, 96, + -1, 25, 99, 134, 100, -1, -1, 134, 135, -1, + 96, -1, 98, -1, 32, 99, 137, 100, -1, -1, + 137, 138, -1, 111, -1, 112, -1, 113, -1, 114, + -1, 115, -1, 119, -1, 122, -1, 125, -1, 159, + -1, 160, -1, 144, -1, 145, -1, 146, -1, 161, + -1, 162, -1, 168, -1, 158, -1, 139, -1, 91, + 99, 140, 100, -1, -1, 140, 141, -1, 92, 45, + -1, 92, 46, -1, 93, 45, -1, 93, 46, -1, + 93, 99, 142, 100, -1, -1, 142, 143, -1, 98, + -1, 37, 41, 99, 147, 100, -1, 37, 42, 99, + 149, 100, -1, 37, 67, 99, 151, 100, -1, -1, + 147, 148, -1, 111, -1, 112, -1, 113, -1, 114, + -1, 159, -1, 160, -1, -1, 149, 150, -1, 156, + -1, 155, -1, 113, -1, 114, -1, 157, -1, 154, + -1, -1, 151, 152, -1, 113, -1, 114, -1, 153, + -1, 154, -1, 88, 45, -1, 88, 46, -1, 89, + 45, -1, 89, 46, -1, 40, 96, -1, 51, 96, + -1, 44, 96, -1, 64, 96, -1, 34, -1, 36, + -1, 38, 94, -1, 47, 163, 48, 164, -1, -1, + 163, 165, -1, 98, -1, 167, -1, -1, 166, 167, + -1, 53, -1, 54, -1, 52, -1, 55, -1, 56, + -1, 57, -1, 58, -1, 59, -1, 60, -1, 62, + 45, -1, 62, 46, -1, 31, 99, 170, 100, -1, + -1, 170, 171, -1, 128, -1, 129, -1, 105, -1, + 106, -1, 108, -1, 107, -1, 109, -1, 130, -1, + 172, -1, 173, -1, 180, -1, 181, -1, 182, -1, + 183, -1, 174, -1, 175, -1, 176, -1, 177, -1, + 35, 96, -1, 28, 96, -1, 80, 45, -1, 80, + 46, -1, 80, 96, -1, 87, 45, -1, 87, 46, + -1, 81, 97, -1, 84, 99, 178, 100, -1, -1, + 178, 179, -1, 85, 98, -1, 86, 96, -1, 39, + 98, -1, 78, 96, -1, 68, 96, -1, 69, 99, + 184, 100, -1, 69, 75, 76, 99, 184, 100, -1, + 69, 75, 77, 99, 184, 100, -1, -1, 184, 185, + -1, 71, 73, 99, 186, 100, -1, 71, 74, 99, + 186, 100, -1, -1, 186, 187, -1, 98, -1, 24, + -1, 20, -1, 20, -1, 70, 73, 99, 188, 100, + -1, 70, 74, 99, 188, 100, -1, -1, 188, 189, + -1, 3, 94, -1, 12, 94, -1, 72, 73, 99, + 190, 100, -1, 72, 74, 99, 190, 100, -1, -1, + 190, 191, -1, 166, 48, 24, -1, 33, 99, 193, + 100, -1, -1, 193, 194, -1, 195, -1, 196, -1, + 197, -1, 198, -1, 199, -1, 19, 45, -1, 19, + 46, -1, 19, 95, -1, 61, 45, -1, 61, 46, + -1, 61, 98, -1, 63, 96, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 84, 84, 85, 88, 89, 92, 93, 94, 95, - 96, 97, 100, 105, 109, 114, 119, 124, 156, 161, - 166, 171, 176, 181, 186, 197, 208, 218, 219, 221, - 243, 269, 283, 299, 300, 302, 321, 361, 380, 385, - 405, 412, 418, 424, 430, 436, 442, 456, 472, 473, - 475, 486, 503, 514, 531, 546, 552, 558, 564, 570, - 576, 592, 610, 611, 613, 624, 641, 652, 669, 684, - 690, 696, 702, 708, 714, 720, 725, 730, 732, 733, - 736, 741, 746, 756, 757, 760, 768, 781, 791, 792, - 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, - 804, 805, 806, 807, 808, 809, 810, 813, 818, 823, - 828, 829, 831, 832, 833, 834, 835, 836, 839, 840, - 842, 843, 844, 845, 846, 847, 850, 851, 853, 854, - 855, 856, 859, 864, 869, 874, 879, 885, 890, 895, - 900, 906, 912, 917, 927, 928, 930, 937, 939, 940, - 942, 950, 958, 966, 974, 982, 990, 998, 1006, 1015, - 1021, 1027, 1029, 1030, 1033, 1034, 1035, 1036, 1037, 1038, - 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1053, 1058, 1063, 1068, 1073, 1078, 1083, 1088, - 1093, 1095, 1096, 1099, 1111, 1120, 1128, 1133, 1143, 1148, - 1153, 1158, 1159, 1161, 1170, 1183, 1184, 1186, 1205, 1224, - 1233, 1255, 1256, 1258, 1317, 1377, 1386, 1400, 1401, 1403, - 1405, 1415, 1416, 1419, 1420, 1421, 1422, 1423, 1426, 1431, - 1435, 1440, 1445, 1450, 1482 + 0, 85, 85, 86, 89, 90, 93, 94, 95, 96, + 97, 98, 101, 106, 110, 115, 120, 125, 157, 162, + 167, 172, 177, 182, 187, 198, 209, 219, 220, 222, + 244, 270, 284, 300, 301, 303, 322, 362, 381, 386, + 406, 413, 419, 425, 431, 437, 443, 457, 473, 474, + 476, 487, 504, 515, 532, 547, 553, 559, 565, 571, + 577, 593, 611, 612, 614, 625, 642, 653, 670, 685, + 691, 697, 703, 709, 715, 721, 726, 731, 733, 734, + 737, 742, 747, 757, 758, 761, 769, 782, 792, 793, + 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, + 805, 806, 807, 808, 809, 810, 811, 812, 815, 817, + 818, 821, 826, 831, 843, 851, 863, 864, 866, 871, + 876, 881, 886, 887, 889, 890, 891, 892, 893, 894, + 897, 898, 900, 901, 902, 903, 904, 905, 908, 909, + 911, 912, 913, 914, 917, 922, 927, 932, 937, 943, + 948, 953, 958, 964, 970, 975, 985, 986, 988, 995, + 997, 998, 1000, 1008, 1016, 1024, 1032, 1040, 1048, 1056, + 1064, 1073, 1079, 1085, 1087, 1088, 1091, 1092, 1093, 1094, + 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, + 1105, 1106, 1107, 1108, 1111, 1116, 1121, 1126, 1131, 1136, + 1141, 1146, 1151, 1153, 1154, 1157, 1169, 1178, 1186, 1191, + 1201, 1206, 1211, 1216, 1217, 1219, 1228, 1241, 1242, 1244, + 1263, 1282, 1301, 1320, 1329, 1351, 1352, 1354, 1413, 1473, + 1482, 1496, 1497, 1499, 1501, 1511, 1512, 1515, 1516, 1517, + 1518, 1519, 1522, 1527, 1531, 1536, 1541, 1546, 1578 }; #endif @@ -797,7 +809,8 @@ static const char *const yytname[] = "T_NETLINK_OVERRUN_RESYNC", "T_NICE", "T_IPV4_DEST_ADDR", "T_IPV6_DEST_ADDR", "T_SCHEDULER", "T_TYPE", "T_PRIO", "T_NETLINK_EVENTS_RELIABLE", "T_DISABLE_INTERNAL_CACHE", - "T_DISABLE_EXTERNAL_CACHE", "T_ERROR_QUEUE_LENGTH", "T_IP", "T_PATH_VAL", + "T_DISABLE_EXTERNAL_CACHE", "T_ERROR_QUEUE_LENGTH", "T_OPTIONS", + "T_TCP_WINDOW_TRACKING", "T_EXPECT_SYNC", "T_IP", "T_PATH_VAL", "T_NUMBER", "T_SIGNED_NUMBER", "T_STRING", "'{'", "'}'", "$accept", "configfile", "lines", "line", "logfile_bool", "logfile_path", "syslog_bool", "syslog_facility", "lock", "strip_nat", "refreshtime", @@ -807,7 +820,8 @@ static const char *const yytname[] = "udp_option", "tcp_line", "tcp_options", "tcp_option", "hashsize", "hashlimit", "unix_line", "unix_options", "unix_option", "ignore_protocol", "ignore_proto_list", "ignore_proto", "sync", - "sync_list", "sync_line", "sync_mode_alarm", "sync_mode_ftfw", + "sync_list", "sync_line", "option_line", "options", "option", + "expect_list", "expect_item", "sync_mode_alarm", "sync_mode_ftfw", "sync_mode_notrack", "sync_mode_alarm_list", "sync_mode_alarm_line", "sync_mode_ftfw_list", "sync_mode_ftfw_line", "sync_mode_notrack_list", "sync_mode_notrack_line", "disable_internal_cache", @@ -841,37 +855,39 @@ static const yytype_uint16 yytoknum[] = 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 123, 125 + 345, 346, 347, 348, 349, 350, 351, 352, 353, 123, + 125 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 98, 99, 99, 100, 100, 101, 101, 101, 101, - 101, 101, 102, 102, 103, 104, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 112, 113, 114, 114, 115, - 115, 116, 116, 117, 117, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 119, 119, 120, 120, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 122, 122, 123, 123, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 125, 126, 127, 128, 128, - 129, 129, 130, 131, 131, 132, 132, 133, 134, 134, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 136, 137, 138, - 139, 139, 140, 140, 140, 140, 140, 140, 141, 141, - 142, 142, 142, 142, 142, 142, 143, 143, 144, 144, - 144, 144, 145, 145, 146, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 155, 156, 157, 158, 158, - 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, - 160, 161, 162, 162, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 164, 165, 166, 166, 166, 167, 167, 168, - 169, 170, 170, 171, 171, 172, 173, 174, 175, 175, - 175, 176, 176, 177, 177, 178, 178, 179, 179, 177, - 177, 180, 180, 181, 181, 177, 177, 182, 182, 183, - 184, 185, 185, 186, 186, 186, 186, 186, 187, 187, - 188, 189, 189, 190, 191 + 0, 101, 102, 102, 103, 103, 104, 104, 104, 104, + 104, 104, 105, 105, 106, 107, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 115, 116, 117, 117, 118, + 118, 119, 119, 120, 120, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 122, 122, 123, 123, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, + 125, 125, 126, 126, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 128, 129, 130, 131, 131, + 132, 132, 133, 134, 134, 135, 135, 136, 137, 137, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 139, 140, + 140, 141, 141, 141, 141, 141, 142, 142, 143, 144, + 145, 146, 147, 147, 148, 148, 148, 148, 148, 148, + 149, 149, 150, 150, 150, 150, 150, 150, 151, 151, + 152, 152, 152, 152, 153, 153, 154, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 163, 164, 165, + 166, 166, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 168, 168, 169, 170, 170, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 172, 173, 174, 174, 174, 175, + 175, 176, 177, 178, 178, 179, 179, 180, 181, 182, + 183, 183, 183, 184, 184, 185, 185, 186, 186, 187, + 187, 187, 187, 185, 185, 188, 188, 189, 189, 185, + 185, 190, 190, 191, 192, 193, 193, 194, 194, 194, + 194, 194, 195, 195, 196, 197, 197, 198, 199 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -887,20 +903,21 @@ static const yytype_uint8 yyr2[] = 2, 2, 2, 2, 2, 2, 2, 4, 0, 2, 2, 2, 4, 0, 2, 1, 1, 4, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, + 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, + 2, 2, 2, 2, 2, 4, 0, 2, 1, 5, + 5, 5, 0, 2, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 0, 2, - 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 2, 4, 0, 2, 1, 1, 0, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 2, 4, 0, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 1, 1, 2, 4, 0, 2, 1, 1, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 4, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 4, 0, 2, 2, 2, 2, 2, 2, 4, 6, - 6, 0, 2, 5, 5, 0, 2, 1, 1, 5, - 5, 0, 2, 2, 2, 5, 5, 0, 2, 3, - 4, 0, 2, 1, 1, 1, 1, 1, 2, 2, - 2, 2, 2, 2, 2 + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 4, 0, 2, 2, 2, 2, 2, 2, + 4, 6, 6, 0, 2, 5, 5, 0, 2, 1, + 1, 1, 1, 5, 5, 0, 2, 2, 2, 5, + 5, 0, 2, 3, 4, 0, 2, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -909,116 +926,120 @@ static const yytype_uint8 yyr2[] = static const yytype_uint8 yydefact[] = { 2, 0, 0, 19, 0, 0, 0, 0, 3, 4, - 8, 7, 6, 10, 9, 11, 27, 83, 162, 88, - 221, 1, 5, 0, 0, 0, 0, 0, 0, 0, + 8, 7, 6, 10, 9, 11, 27, 83, 174, 88, + 235, 1, 5, 0, 0, 0, 0, 0, 0, 0, 26, 28, 85, 86, 82, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 161, 166, 167, 169, 168, 170, 164, 165, - 171, 163, 172, 173, 178, 179, 180, 181, 174, 175, - 176, 177, 0, 0, 0, 0, 0, 0, 140, 141, - 0, 0, 0, 144, 0, 0, 0, 87, 90, 91, - 92, 93, 94, 95, 96, 97, 89, 100, 101, 102, - 106, 98, 99, 103, 104, 105, 0, 0, 0, 220, - 222, 223, 224, 225, 226, 227, 29, 30, 75, 76, - 78, 12, 13, 14, 18, 183, 182, 195, 15, 16, - 17, 197, 0, 201, 196, 184, 185, 186, 189, 191, - 187, 188, 0, 33, 20, 0, 48, 0, 62, 21, - 22, 0, 0, 0, 142, 24, 25, 0, 23, 159, - 160, 139, 228, 229, 230, 231, 232, 233, 234, 0, - 0, 0, 0, 0, 33, 0, 48, 0, 62, 0, - 110, 118, 126, 0, 152, 150, 151, 153, 154, 155, - 156, 157, 158, 145, 147, 0, 0, 77, 79, 201, - 201, 0, 0, 0, 198, 202, 0, 0, 190, 192, + 0, 0, 173, 178, 179, 181, 180, 182, 176, 177, + 183, 175, 184, 185, 190, 191, 192, 193, 186, 187, + 188, 189, 0, 0, 0, 0, 0, 0, 152, 153, + 0, 0, 0, 156, 0, 0, 0, 0, 87, 90, + 91, 92, 93, 94, 95, 96, 97, 89, 107, 100, + 101, 102, 106, 98, 99, 103, 104, 105, 0, 0, + 0, 234, 236, 237, 238, 239, 240, 241, 29, 30, + 75, 76, 78, 12, 13, 14, 18, 195, 194, 207, + 15, 16, 17, 209, 0, 213, 208, 196, 197, 198, + 201, 203, 199, 200, 0, 33, 20, 0, 48, 0, + 62, 21, 22, 0, 0, 0, 154, 24, 25, 0, + 23, 171, 172, 151, 109, 242, 243, 244, 245, 246, + 247, 248, 0, 0, 0, 0, 0, 33, 0, 48, + 0, 62, 0, 122, 130, 138, 0, 164, 162, 163, + 165, 166, 167, 168, 169, 170, 157, 159, 0, 0, + 0, 77, 79, 213, 213, 0, 0, 0, 210, 214, + 0, 0, 202, 204, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 46, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 31, 34, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 46, 49, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 63, 0, 0, - 0, 146, 143, 80, 81, 0, 0, 0, 0, 0, - 0, 0, 0, 193, 194, 32, 35, 37, 36, 38, - 40, 41, 44, 45, 39, 43, 42, 47, 50, 55, - 51, 58, 59, 54, 57, 56, 52, 53, 61, 64, - 69, 65, 72, 73, 68, 71, 70, 66, 67, 74, - 107, 112, 113, 114, 115, 111, 116, 117, 0, 0, - 0, 0, 108, 122, 123, 119, 125, 121, 120, 124, - 0, 109, 128, 129, 127, 130, 131, 199, 200, 211, - 211, 205, 205, 217, 217, 136, 138, 137, 134, 135, - 132, 133, 0, 0, 0, 0, 148, 148, 0, 0, - 209, 212, 210, 208, 207, 203, 206, 204, 215, 0, - 218, 216, 213, 214, 0, 149, 219 + 60, 63, 0, 0, 0, 158, 155, 0, 0, 108, + 110, 80, 81, 0, 0, 0, 0, 0, 0, 0, + 0, 205, 206, 32, 35, 37, 36, 38, 40, 41, + 44, 45, 39, 43, 42, 47, 50, 55, 51, 58, + 59, 54, 57, 56, 52, 53, 61, 64, 69, 65, + 72, 73, 68, 71, 70, 66, 67, 74, 119, 124, + 125, 126, 127, 123, 128, 129, 0, 0, 0, 0, + 120, 134, 135, 131, 137, 133, 132, 136, 0, 121, + 140, 141, 139, 142, 143, 111, 112, 113, 114, 116, + 211, 212, 225, 225, 217, 217, 231, 231, 148, 150, + 149, 146, 147, 144, 145, 0, 0, 0, 0, 0, + 160, 160, 118, 115, 117, 0, 0, 223, 226, 224, + 221, 220, 219, 215, 218, 216, 229, 0, 232, 230, + 227, 228, 0, 161, 233 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 7, 8, 9, 53, 54, 55, 56, 57, 10, - 88, 89, 90, 91, 92, 11, 23, 31, 93, 175, - 222, 94, 177, 234, 95, 179, 247, 58, 59, 60, - 169, 198, 12, 24, 35, 13, 26, 96, 97, 98, - 99, 248, 305, 249, 315, 250, 324, 325, 316, 317, - 318, 319, 100, 101, 102, 103, 104, 157, 252, 193, - 359, 194, 105, 14, 25, 61, 62, 63, 64, 65, - 66, 67, 173, 209, 68, 69, 70, 71, 172, 205, - 344, 356, 342, 351, 346, 360, 15, 27, 110, 111, - 112, 113, 114, 115 + 89, 90, 91, 92, 93, 11, 23, 31, 94, 178, + 226, 95, 180, 238, 96, 182, 251, 58, 59, 60, + 172, 202, 12, 24, 35, 13, 26, 97, 98, 198, + 260, 355, 364, 99, 100, 101, 252, 313, 253, 323, + 254, 332, 333, 324, 325, 326, 327, 102, 103, 104, + 105, 106, 159, 256, 196, 377, 197, 107, 14, 25, + 61, 62, 63, 64, 65, 66, 67, 176, 213, 68, + 69, 70, 71, 175, 209, 358, 374, 356, 368, 360, + 378, 15, 27, 112, 113, 114, 115, 116, 117 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -94 +#define YYPACT_NINF -77 static const yytype_int16 yypact[] = { - 193, -93, -90, -94, -84, -77, -70, 52, 193, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, 15, 115, 119, 155, 24, -24, -13, - -94, -94, -94, -94, -94, -94, 2, 20, 28, 60, - 38, 23, 42, 49, -7, 62, -52, 97, 53, 59, - 105, 26, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -47, 101, -38, -23, 111, 114, -94, -94, - 13, 76, 30, -94, 118, 65, 135, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, 104, 5, 137, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, 88, -94, -94, -94, -94, -94, -94, -94, - -94, -94, 171, -94, -94, 172, -94, 173, -94, -94, - -94, 174, 175, 176, -94, -94, -94, 179, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -4, - 177, 178, -36, 84, -94, -3, -94, 54, -94, -1, - -94, -94, -94, 180, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, 184, 185, -94, -94, -94, - -94, 100, 149, 170, -94, -94, 182, 186, -94, -94, - 4, 189, 190, 191, 192, 194, 195, 200, 196, 197, - 199, -94, -94, 74, 198, 203, 204, 202, 206, 207, - 209, 208, 212, -94, -94, 25, 213, 214, 215, 205, - 210, 216, 218, 221, 222, 223, -94, -94, 98, 132, - -5, -94, -94, -94, -94, 71, 89, 188, 224, 225, - 226, 227, 228, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, 232, 233, - 234, 217, -94, -94, -94, -94, -94, -94, -94, -94, - 219, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, 17, 21, 7, 36, 169, 211, 237, 238, - -94, -94, -94, -94, -94, -94, -94, -94, -94, 201, - -94, -94, -94, -94, 261, -94, -94 + 194, -76, -68, -77, -49, -39, -14, 98, 194, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, 0, -42, 124, 153, 10, 20, 28, + -77, -77, -77, -77, -77, -77, 36, 40, 50, 56, + 77, 79, 82, 86, 30, 90, -50, 92, 42, 104, + 117, 121, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -73, 122, -44, 34, 135, 145, -77, -77, + -23, 126, 149, -77, 147, 152, 181, 177, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, 73, 47, + 184, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -10, -77, -77, -77, -77, -77, + -77, -77, -77, -77, 182, -77, -77, 183, -77, 185, + -77, -77, -77, 186, 187, 188, -77, -77, -77, 180, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -4, 189, 190, 99, 62, -77, -3, -77, + 29, -77, -1, -77, -77, -77, 131, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, 130, 195, + 196, -77, -77, -77, -77, 81, 133, 175, -77, -77, + 193, 197, -77, -77, 4, 200, 201, 203, 204, 205, + 207, 206, 198, 208, 209, -77, -77, 74, 212, 211, + 214, 221, 213, 216, 217, 215, 220, -77, -77, 25, + 222, 219, 224, 223, 226, 230, 231, 228, 234, 233, + -77, -77, 9, 76, 53, -77, -77, 225, 6, -77, + -77, -77, -77, 109, 142, 218, 232, 235, 236, 237, + 238, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, 242, 243, 244, 227, + -77, -77, -77, -77, -77, -77, -77, -77, 229, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, 46, 21, 24, 37, 60, + 199, 210, -77, -77, -77, 239, 247, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, 202, -77, -77, + -77, -77, 259, -77, -77 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -94, -94, -94, 278, -94, -94, -94, -94, -94, -94, - 45, 46, -35, -8, -94, -94, -94, -94, -94, 123, - -94, -94, 122, -94, -94, 136, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, 67, -94, - -94, -94, -94, 70, 82, -94, -94, -94, -94, -94, - -94, -49, -94, -94, -94, -94, -94, -94, -94, -94, - -94, -94, -94, -94, -94, -94, -94, -94, -22, -94, - -17, -94, -11, -94, -2, -94, -94, -94, -94, -94, - -94, -94, -94, -94 + -77, -77, -77, 292, -77, -77, -77, -77, -77, -77, + 67, 68, -7, 11, -77, -77, -77, -77, -77, 125, + -77, -77, 144, -77, -77, 140, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, 71, -77, -77, -77, -77, 78, 80, + -77, -77, -77, -77, -77, -77, -35, -77, -77, -77, + -77, -77, -77, -77, -77, -77, -77, -77, -77, -77, + -77, -77, -77, 75, -77, -2, -77, 1, -77, 2, + -77, -77, -77, -77, -77, -77, -77, -77, -77 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -1028,121 +1049,125 @@ static const yytype_int16 yypgoto[] = #define YYTABLE_NINF -1 static const yytype_uint16 yytable[] = { - 211, 212, 236, 16, 237, 195, 17, 211, 212, 213, - 214, 238, 18, 196, 215, 216, 213, 214, 28, 19, - 348, 215, 216, 132, 348, 77, 20, 29, 236, 349, - 237, 353, 142, 349, 201, 202, 203, 238, 128, 129, - 217, 145, 239, 106, 133, 84, 218, 217, 240, 143, - 165, 166, 21, 218, 151, 152, 147, 224, 146, 225, - 353, 204, 219, 220, 241, 242, 226, 116, 239, 219, - 220, 140, 141, 148, 240, 155, 156, 224, 117, 225, - 153, 243, 244, 320, 311, 107, 226, 108, 130, 245, - 241, 242, 321, 197, 221, 118, 246, 227, 135, 136, - 167, 265, 354, 228, 355, 121, 122, 243, 244, 73, - 159, 160, 30, 119, 350, 245, 125, 227, 352, 229, - 230, 109, 288, 228, 120, 36, 37, 76, 77, 38, - 124, 354, 78, 357, 79, 126, 231, 232, 39, 229, - 230, 201, 202, 203, 127, 40, 137, 41, 84, 162, - 163, 233, 123, 138, 42, 131, 231, 232, 43, 201, - 202, 203, 77, 72, 170, 171, 73, 154, 327, 206, - 207, 277, 308, 257, 258, 74, 309, 255, 256, 75, - 44, 208, 84, 310, 76, 77, 328, 45, 46, 78, - 134, 79, 80, 81, 144, 300, 164, 47, 82, 48, - 49, 139, 83, 50, 149, 84, 51, 150, 32, 1, - 33, 158, 34, 303, 313, 322, 52, 85, 2, 86, - 3, 311, 259, 260, 4, 5, 6, 183, 161, 312, - 168, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 304, 314, 323, 261, 262, 272, 273, 281, 282, 364, - 292, 293, 87, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 338, 339, 340, 341, 358, 174, 176, 178, - 180, 181, 182, 199, 200, 251, 253, 263, 254, 264, - 266, 267, 268, 269, 329, 366, 22, 270, 271, 278, - 275, 274, 276, 301, 302, 280, 279, 210, 223, 286, - 284, 283, 285, 287, 289, 294, 291, 290, 361, 295, - 365, 296, 297, 298, 235, 345, 299, 326, 306, 343, - 330, 331, 332, 333, 334, 335, 336, 337, 362, 363, - 307, 0, 347 + 215, 216, 240, 28, 241, 199, 144, 215, 216, 217, + 218, 242, 29, 200, 219, 220, 217, 218, 153, 154, + 73, 219, 220, 16, 365, 134, 145, 365, 240, 108, + 241, 17, 228, 366, 229, 147, 366, 242, 76, 77, + 221, 230, 243, 78, 155, 79, 222, 221, 244, 135, + 18, 337, 338, 222, 32, 148, 33, 370, 34, 84, + 19, 371, 223, 224, 245, 246, 173, 174, 243, 223, + 224, 109, 231, 110, 244, 130, 131, 228, 232, 229, + 370, 247, 248, 77, 371, 20, 230, 137, 138, 249, + 245, 246, 168, 169, 233, 234, 201, 225, 21, 250, + 30, 123, 124, 84, 273, 339, 77, 247, 248, 308, + 111, 235, 236, 149, 118, 249, 316, 231, 165, 166, + 317, 367, 119, 232, 369, 296, 84, 318, 132, 237, + 36, 37, 120, 150, 38, 372, 121, 373, 139, 233, + 234, 328, 319, 39, 362, 170, 363, 210, 211, 122, + 40, 125, 41, 329, 265, 266, 235, 236, 372, 42, + 375, 72, 212, 43, 73, 319, 142, 143, 167, 205, + 206, 207, 126, 74, 285, 127, 320, 75, 128, 205, + 206, 207, 76, 77, 129, 44, 133, 78, 136, 79, + 80, 81, 45, 46, 157, 158, 82, 161, 162, 208, + 83, 140, 47, 84, 48, 49, 267, 268, 50, 340, + 1, 51, 205, 206, 207, 85, 141, 86, 146, 2, + 156, 3, 257, 258, 52, 4, 5, 6, 186, 255, + 259, 151, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 152, 341, 160, 87, 311, 321, 330, 269, 270, + 382, 280, 281, 88, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 312, 322, 331, 289, 290, 300, 301, + 335, 336, 351, 352, 353, 354, 164, 163, 263, 264, + 171, 177, 179, 384, 181, 183, 184, 185, 203, 204, + 261, 271, 262, 272, 274, 275, 282, 276, 277, 376, + 22, 278, 214, 279, 283, 284, 286, 287, 288, 294, + 379, 291, 292, 293, 295, 298, 297, 342, 299, 309, + 310, 239, 305, 227, 302, 334, 303, 304, 306, 307, + 314, 343, 315, 380, 344, 345, 346, 347, 348, 349, + 350, 381, 383, 359, 357, 0, 0, 0, 0, 361 }; static const yytype_int16 yycheck[] = { - 3, 4, 3, 96, 5, 9, 96, 3, 4, 12, - 13, 12, 96, 17, 17, 18, 12, 13, 3, 96, - 3, 17, 18, 75, 3, 30, 96, 12, 3, 12, - 5, 24, 79, 12, 70, 71, 72, 12, 45, 46, - 43, 79, 43, 19, 96, 50, 49, 43, 49, 96, - 45, 46, 0, 49, 41, 42, 79, 3, 96, 5, - 24, 97, 65, 66, 65, 66, 12, 91, 43, 65, - 66, 45, 46, 96, 49, 45, 46, 3, 91, 5, - 67, 82, 83, 88, 89, 61, 12, 63, 95, 90, - 65, 66, 97, 97, 97, 93, 97, 43, 45, 46, - 95, 97, 95, 49, 97, 45, 46, 82, 83, 11, - 45, 46, 97, 93, 97, 90, 93, 43, 97, 65, - 66, 97, 97, 49, 96, 6, 7, 29, 30, 10, - 92, 95, 34, 97, 36, 93, 82, 83, 19, 65, - 66, 70, 71, 72, 95, 26, 93, 28, 50, 45, - 46, 97, 92, 94, 35, 93, 82, 83, 39, 70, - 71, 72, 30, 8, 76, 77, 11, 91, 97, 85, - 86, 97, 40, 73, 74, 20, 44, 199, 200, 24, - 61, 97, 50, 51, 29, 30, 97, 68, 69, 34, - 93, 36, 37, 38, 93, 97, 92, 78, 43, 80, - 81, 96, 47, 84, 93, 50, 87, 93, 93, 16, - 95, 93, 97, 248, 249, 250, 97, 62, 25, 64, - 27, 89, 73, 74, 31, 32, 33, 48, 93, 97, - 93, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 248, 249, 250, 73, 74, 45, 46, 45, 46, 48, - 45, 46, 97, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 45, 46, 45, 46, 97, 96, 96, 96, - 96, 96, 96, 96, 96, 95, 92, 95, 93, 93, - 91, 91, 91, 91, 96, 24, 8, 93, 93, 91, - 93, 95, 93, 248, 248, 91, 93, 174, 176, 91, - 93, 95, 93, 91, 91, 95, 91, 93, 97, 93, - 359, 93, 91, 91, 178, 332, 93, 250, 248, 330, - 96, 96, 96, 96, 96, 93, 93, 93, 91, 91, - 248, -1, 334 + 3, 4, 3, 3, 5, 9, 79, 3, 4, 12, + 13, 12, 12, 17, 17, 18, 12, 13, 41, 42, + 11, 17, 18, 99, 3, 75, 99, 3, 3, 19, + 5, 99, 3, 12, 5, 79, 12, 12, 29, 30, + 43, 12, 43, 34, 67, 36, 49, 43, 49, 99, + 99, 45, 46, 49, 96, 99, 98, 20, 100, 50, + 99, 24, 65, 66, 65, 66, 76, 77, 43, 65, + 66, 61, 43, 63, 49, 45, 46, 3, 49, 5, + 20, 82, 83, 30, 24, 99, 12, 45, 46, 90, + 65, 66, 45, 46, 65, 66, 100, 100, 0, 100, + 100, 45, 46, 50, 100, 99, 30, 82, 83, 100, + 100, 82, 83, 79, 94, 90, 40, 43, 45, 46, + 44, 100, 94, 49, 100, 100, 50, 51, 98, 100, + 6, 7, 96, 99, 10, 98, 96, 100, 96, 65, + 66, 88, 89, 19, 98, 98, 100, 85, 86, 99, + 26, 95, 28, 100, 73, 74, 82, 83, 98, 35, + 100, 8, 100, 39, 11, 89, 45, 46, 95, 70, + 71, 72, 95, 20, 100, 96, 100, 24, 96, 70, + 71, 72, 29, 30, 98, 61, 96, 34, 96, 36, + 37, 38, 68, 69, 45, 46, 43, 45, 46, 100, + 47, 97, 78, 50, 80, 81, 73, 74, 84, 100, + 16, 87, 70, 71, 72, 62, 99, 64, 96, 25, + 94, 27, 92, 93, 100, 31, 32, 33, 48, 98, + 100, 96, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 96, 100, 96, 91, 252, 253, 254, 73, 74, + 48, 45, 46, 100, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 252, 253, 254, 45, 46, 45, 46, + 45, 46, 45, 46, 45, 46, 99, 96, 203, 204, + 96, 99, 99, 24, 99, 99, 99, 99, 99, 99, + 95, 98, 96, 96, 94, 94, 98, 94, 94, 100, + 8, 96, 177, 96, 96, 96, 94, 96, 94, 94, + 100, 98, 96, 96, 94, 96, 94, 99, 94, 252, + 252, 181, 94, 179, 98, 254, 96, 96, 94, 96, + 252, 99, 252, 94, 99, 99, 99, 99, 96, 96, + 96, 94, 377, 345, 343, -1, -1, -1, -1, 347 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 16, 25, 27, 31, 32, 33, 99, 100, 101, - 107, 113, 130, 133, 161, 184, 96, 96, 96, 96, - 96, 0, 101, 114, 131, 162, 134, 185, 3, 12, - 97, 115, 93, 95, 97, 132, 6, 7, 10, 19, + 0, 16, 25, 27, 31, 32, 33, 102, 103, 104, + 110, 116, 133, 136, 169, 192, 99, 99, 99, 99, + 99, 0, 104, 117, 134, 170, 137, 193, 3, 12, + 100, 118, 96, 98, 100, 135, 6, 7, 10, 19, 26, 28, 35, 39, 61, 68, 69, 78, 80, 81, - 84, 87, 97, 102, 103, 104, 105, 106, 125, 126, - 127, 163, 164, 165, 166, 167, 168, 169, 172, 173, - 174, 175, 8, 11, 20, 24, 29, 30, 34, 36, - 37, 38, 43, 47, 50, 62, 64, 97, 108, 109, - 110, 111, 112, 116, 119, 122, 135, 136, 137, 138, - 150, 151, 152, 153, 154, 160, 19, 61, 63, 97, - 186, 187, 188, 189, 190, 191, 91, 91, 93, 93, - 96, 45, 46, 92, 92, 93, 93, 95, 45, 46, - 95, 93, 75, 96, 93, 45, 46, 93, 94, 96, - 45, 46, 79, 96, 93, 79, 96, 79, 96, 93, - 93, 41, 42, 67, 91, 45, 46, 155, 93, 45, - 46, 93, 45, 46, 92, 45, 46, 95, 93, 128, - 76, 77, 176, 170, 96, 117, 96, 120, 96, 123, - 96, 96, 96, 48, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 157, 159, 9, 17, 97, 129, 96, - 96, 70, 71, 72, 97, 177, 85, 86, 97, 171, - 117, 3, 4, 12, 13, 17, 18, 43, 49, 65, - 66, 97, 118, 120, 3, 5, 12, 43, 49, 65, - 66, 82, 83, 97, 121, 123, 3, 5, 12, 43, - 49, 65, 66, 82, 83, 90, 97, 124, 139, 141, - 143, 95, 156, 92, 93, 176, 176, 73, 74, 73, - 74, 73, 74, 95, 93, 97, 91, 91, 91, 91, - 93, 93, 45, 46, 95, 93, 93, 97, 91, 93, - 91, 45, 46, 95, 93, 93, 91, 91, 97, 91, - 93, 91, 45, 46, 95, 93, 93, 91, 91, 93, - 97, 108, 109, 110, 111, 140, 151, 152, 40, 44, - 51, 89, 97, 110, 111, 142, 146, 147, 148, 149, - 88, 97, 110, 111, 144, 145, 146, 97, 97, 96, - 96, 96, 96, 96, 96, 93, 93, 93, 45, 46, - 45, 46, 180, 180, 178, 178, 182, 182, 3, 12, - 97, 181, 97, 24, 95, 97, 179, 97, 97, 158, - 183, 97, 91, 91, 48, 159, 24 + 84, 87, 100, 105, 106, 107, 108, 109, 128, 129, + 130, 171, 172, 173, 174, 175, 176, 177, 180, 181, + 182, 183, 8, 11, 20, 24, 29, 30, 34, 36, + 37, 38, 43, 47, 50, 62, 64, 91, 100, 111, + 112, 113, 114, 115, 119, 122, 125, 138, 139, 144, + 145, 146, 158, 159, 160, 161, 162, 168, 19, 61, + 63, 100, 194, 195, 196, 197, 198, 199, 94, 94, + 96, 96, 99, 45, 46, 95, 95, 96, 96, 98, + 45, 46, 98, 96, 75, 99, 96, 45, 46, 96, + 97, 99, 45, 46, 79, 99, 96, 79, 99, 79, + 99, 96, 96, 41, 42, 67, 94, 45, 46, 163, + 96, 45, 46, 96, 99, 45, 46, 95, 45, 46, + 98, 96, 131, 76, 77, 184, 178, 99, 120, 99, + 123, 99, 126, 99, 99, 99, 48, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 165, 167, 140, 9, + 17, 100, 132, 99, 99, 70, 71, 72, 100, 185, + 85, 86, 100, 179, 120, 3, 4, 12, 13, 17, + 18, 43, 49, 65, 66, 100, 121, 123, 3, 5, + 12, 43, 49, 65, 66, 82, 83, 100, 124, 126, + 3, 5, 12, 43, 49, 65, 66, 82, 83, 90, + 100, 127, 147, 149, 151, 98, 164, 92, 93, 100, + 141, 95, 96, 184, 184, 73, 74, 73, 74, 73, + 74, 98, 96, 100, 94, 94, 94, 94, 96, 96, + 45, 46, 98, 96, 96, 100, 94, 96, 94, 45, + 46, 98, 96, 96, 94, 94, 100, 94, 96, 94, + 45, 46, 98, 96, 96, 94, 94, 96, 100, 111, + 112, 113, 114, 148, 159, 160, 40, 44, 51, 89, + 100, 113, 114, 150, 154, 155, 156, 157, 88, 100, + 113, 114, 152, 153, 154, 45, 46, 45, 46, 99, + 100, 100, 99, 99, 99, 99, 99, 99, 96, 96, + 96, 45, 46, 45, 46, 142, 188, 188, 186, 186, + 190, 190, 98, 100, 143, 3, 12, 100, 189, 100, + 20, 24, 98, 100, 187, 100, 100, 166, 191, 100, + 94, 94, 48, 167, 24 }; #define yyerrok (yyerrstatus = 0) @@ -1956,7 +1981,7 @@ yyreduce: case 12: /* Line 1455 of yacc.c */ -#line 101 "read_config_yy.y" +#line 102 "read_config_yy.y" { strncpy(conf.logfile, DEFAULT_LOGFILE, FILENAME_MAXLEN); } @@ -1965,7 +1990,7 @@ yyreduce: case 13: /* Line 1455 of yacc.c */ -#line 106 "read_config_yy.y" +#line 107 "read_config_yy.y" { } break; @@ -1973,7 +1998,7 @@ yyreduce: case 14: /* Line 1455 of yacc.c */ -#line 110 "read_config_yy.y" +#line 111 "read_config_yy.y" { strncpy(conf.logfile, (yyvsp[(2) - (2)].string), FILENAME_MAXLEN); } @@ -1982,7 +2007,7 @@ yyreduce: case 15: /* Line 1455 of yacc.c */ -#line 115 "read_config_yy.y" +#line 116 "read_config_yy.y" { conf.syslog_facility = DEFAULT_SYSLOG_FACILITY; } @@ -1991,7 +2016,7 @@ yyreduce: case 16: /* Line 1455 of yacc.c */ -#line 120 "read_config_yy.y" +#line 121 "read_config_yy.y" { conf.syslog_facility = -1; } @@ -2000,7 +2025,7 @@ yyreduce: case 17: /* Line 1455 of yacc.c */ -#line 125 "read_config_yy.y" +#line 126 "read_config_yy.y" { if (!strcmp((yyvsp[(2) - (2)].string), "daemon")) conf.syslog_facility = LOG_DAEMON; @@ -2036,7 +2061,7 @@ yyreduce: case 18: /* Line 1455 of yacc.c */ -#line 157 "read_config_yy.y" +#line 158 "read_config_yy.y" { strncpy(conf.lockfile, (yyvsp[(2) - (2)].string), FILENAME_MAXLEN); } @@ -2045,7 +2070,7 @@ yyreduce: case 19: /* Line 1455 of yacc.c */ -#line 162 "read_config_yy.y" +#line 163 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`StripNAT' clause is obsolete, ignoring"); } @@ -2054,7 +2079,7 @@ yyreduce: case 20: /* Line 1455 of yacc.c */ -#line 167 "read_config_yy.y" +#line 168 "read_config_yy.y" { conf.refresh = (yyvsp[(2) - (2)].val); } @@ -2063,7 +2088,7 @@ yyreduce: case 21: /* Line 1455 of yacc.c */ -#line 172 "read_config_yy.y" +#line 173 "read_config_yy.y" { conf.cache_timeout = (yyvsp[(2) - (2)].val); } @@ -2072,7 +2097,7 @@ yyreduce: case 22: /* Line 1455 of yacc.c */ -#line 177 "read_config_yy.y" +#line 178 "read_config_yy.y" { conf.commit_timeout = (yyvsp[(2) - (2)].val); } @@ -2081,7 +2106,7 @@ yyreduce: case 23: /* Line 1455 of yacc.c */ -#line 182 "read_config_yy.y" +#line 183 "read_config_yy.y" { conf.purge_timeout = (yyvsp[(2) - (2)].val); } @@ -2090,7 +2115,7 @@ yyreduce: case 24: /* Line 1455 of yacc.c */ -#line 187 "read_config_yy.y" +#line 188 "read_config_yy.y" { print_err(CTD_CFG_WARN, "the use of `Checksum' outside the " "`Multicast' clause is ambiguous"); @@ -2105,7 +2130,7 @@ yyreduce: case 25: /* Line 1455 of yacc.c */ -#line 198 "read_config_yy.y" +#line 199 "read_config_yy.y" { print_err(CTD_CFG_WARN, "the use of `Checksum' outside the " "`Multicast' clause is ambiguous"); @@ -2120,7 +2145,7 @@ yyreduce: case 26: /* Line 1455 of yacc.c */ -#line 209 "read_config_yy.y" +#line 210 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_ADDRESS, @@ -2134,7 +2159,7 @@ yyreduce: case 29: /* Line 1455 of yacc.c */ -#line 222 "read_config_yy.y" +#line 223 "read_config_yy.y" { union inet_address ip; @@ -2160,7 +2185,7 @@ yyreduce: case 30: /* Line 1455 of yacc.c */ -#line 244 "read_config_yy.y" +#line 245 "read_config_yy.y" { union inet_address ip; @@ -2190,7 +2215,7 @@ yyreduce: case 31: /* Line 1455 of yacc.c */ -#line 270 "read_config_yy.y" +#line 271 "read_config_yy.y" { if (conf.channel_type_global != CHANNEL_NONE && conf.channel_type_global != CHANNEL_MCAST) { @@ -2208,7 +2233,7 @@ yyreduce: case 32: /* Line 1455 of yacc.c */ -#line 284 "read_config_yy.y" +#line 285 "read_config_yy.y" { if (conf.channel_type_global != CHANNEL_NONE && conf.channel_type_global != CHANNEL_MCAST) { @@ -2228,7 +2253,7 @@ yyreduce: case 35: /* Line 1455 of yacc.c */ -#line 303 "read_config_yy.y" +#line 304 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2251,7 +2276,7 @@ yyreduce: case 36: /* Line 1455 of yacc.c */ -#line 322 "read_config_yy.y" +#line 323 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2295,7 +2320,7 @@ yyreduce: case 37: /* Line 1455 of yacc.c */ -#line 362 "read_config_yy.y" +#line 363 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2318,7 +2343,7 @@ yyreduce: case 38: /* Line 1455 of yacc.c */ -#line 381 "read_config_yy.y" +#line 382 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`IPv6_interface' not required, ignoring"); } @@ -2327,7 +2352,7 @@ yyreduce: case 39: /* Line 1455 of yacc.c */ -#line 386 "read_config_yy.y" +#line 387 "read_config_yy.y" { unsigned int idx; @@ -2351,7 +2376,7 @@ yyreduce: case 40: /* Line 1455 of yacc.c */ -#line 406 "read_config_yy.y" +#line 407 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`Backlog' option inside Multicast clause is " "obsolete. Please, remove it from " @@ -2362,7 +2387,7 @@ yyreduce: case 41: /* Line 1455 of yacc.c */ -#line 413 "read_config_yy.y" +#line 414 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.mcast.port = (yyvsp[(2) - (2)].val); @@ -2372,7 +2397,7 @@ yyreduce: case 42: /* Line 1455 of yacc.c */ -#line 419 "read_config_yy.y" +#line 420 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.mcast.sndbuf = (yyvsp[(2) - (2)].val); @@ -2382,7 +2407,7 @@ yyreduce: case 43: /* Line 1455 of yacc.c */ -#line 425 "read_config_yy.y" +#line 426 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.mcast.rcvbuf = (yyvsp[(2) - (2)].val); @@ -2392,7 +2417,7 @@ yyreduce: case 44: /* Line 1455 of yacc.c */ -#line 431 "read_config_yy.y" +#line 432 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.mcast.checksum = 0; @@ -2402,7 +2427,7 @@ yyreduce: case 45: /* Line 1455 of yacc.c */ -#line 437 "read_config_yy.y" +#line 438 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.mcast.checksum = 1; @@ -2412,7 +2437,7 @@ yyreduce: case 46: /* Line 1455 of yacc.c */ -#line 443 "read_config_yy.y" +#line 444 "read_config_yy.y" { if (conf.channel_type_global != CHANNEL_NONE && conf.channel_type_global != CHANNEL_UDP) { @@ -2430,7 +2455,7 @@ yyreduce: case 47: /* Line 1455 of yacc.c */ -#line 457 "read_config_yy.y" +#line 458 "read_config_yy.y" { if (conf.channel_type_global != CHANNEL_NONE && conf.channel_type_global != CHANNEL_UDP) { @@ -2450,7 +2475,7 @@ yyreduce: case 50: /* Line 1455 of yacc.c */ -#line 476 "read_config_yy.y" +#line 477 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2465,7 +2490,7 @@ yyreduce: case 51: /* Line 1455 of yacc.c */ -#line 487 "read_config_yy.y" +#line 488 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2486,7 +2511,7 @@ yyreduce: case 52: /* Line 1455 of yacc.c */ -#line 504 "read_config_yy.y" +#line 505 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2501,7 +2526,7 @@ yyreduce: case 53: /* Line 1455 of yacc.c */ -#line 515 "read_config_yy.y" +#line 516 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2522,7 +2547,7 @@ yyreduce: case 54: /* Line 1455 of yacc.c */ -#line 532 "read_config_yy.y" +#line 533 "read_config_yy.y" { int idx; @@ -2541,7 +2566,7 @@ yyreduce: case 55: /* Line 1455 of yacc.c */ -#line 547 "read_config_yy.y" +#line 548 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.udp.port = (yyvsp[(2) - (2)].val); @@ -2551,7 +2576,7 @@ yyreduce: case 56: /* Line 1455 of yacc.c */ -#line 553 "read_config_yy.y" +#line 554 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.udp.sndbuf = (yyvsp[(2) - (2)].val); @@ -2561,7 +2586,7 @@ yyreduce: case 57: /* Line 1455 of yacc.c */ -#line 559 "read_config_yy.y" +#line 560 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.udp.rcvbuf = (yyvsp[(2) - (2)].val); @@ -2571,7 +2596,7 @@ yyreduce: case 58: /* Line 1455 of yacc.c */ -#line 565 "read_config_yy.y" +#line 566 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.udp.checksum = 0; @@ -2581,7 +2606,7 @@ yyreduce: case 59: /* Line 1455 of yacc.c */ -#line 571 "read_config_yy.y" +#line 572 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.udp.checksum = 1; @@ -2591,7 +2616,7 @@ yyreduce: case 60: /* Line 1455 of yacc.c */ -#line 577 "read_config_yy.y" +#line 578 "read_config_yy.y" { if (conf.channel_type_global != CHANNEL_NONE && conf.channel_type_global != CHANNEL_TCP) { @@ -2611,7 +2636,7 @@ yyreduce: case 61: /* Line 1455 of yacc.c */ -#line 593 "read_config_yy.y" +#line 594 "read_config_yy.y" { if (conf.channel_type_global != CHANNEL_NONE && conf.channel_type_global != CHANNEL_TCP) { @@ -2633,7 +2658,7 @@ yyreduce: case 64: /* Line 1455 of yacc.c */ -#line 614 "read_config_yy.y" +#line 615 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2648,7 +2673,7 @@ yyreduce: case 65: /* Line 1455 of yacc.c */ -#line 625 "read_config_yy.y" +#line 626 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2669,7 +2694,7 @@ yyreduce: case 66: /* Line 1455 of yacc.c */ -#line 642 "read_config_yy.y" +#line 643 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2684,7 +2709,7 @@ yyreduce: case 67: /* Line 1455 of yacc.c */ -#line 653 "read_config_yy.y" +#line 654 "read_config_yy.y" { __max_dedicated_links_reached(); @@ -2705,7 +2730,7 @@ yyreduce: case 68: /* Line 1455 of yacc.c */ -#line 670 "read_config_yy.y" +#line 671 "read_config_yy.y" { int idx; @@ -2724,7 +2749,7 @@ yyreduce: case 69: /* Line 1455 of yacc.c */ -#line 685 "read_config_yy.y" +#line 686 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.tcp.port = (yyvsp[(2) - (2)].val); @@ -2734,7 +2759,7 @@ yyreduce: case 70: /* Line 1455 of yacc.c */ -#line 691 "read_config_yy.y" +#line 692 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.tcp.sndbuf = (yyvsp[(2) - (2)].val); @@ -2744,7 +2769,7 @@ yyreduce: case 71: /* Line 1455 of yacc.c */ -#line 697 "read_config_yy.y" +#line 698 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.tcp.rcvbuf = (yyvsp[(2) - (2)].val); @@ -2754,7 +2779,7 @@ yyreduce: case 72: /* Line 1455 of yacc.c */ -#line 703 "read_config_yy.y" +#line 704 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.tcp.checksum = 0; @@ -2764,7 +2789,7 @@ yyreduce: case 73: /* Line 1455 of yacc.c */ -#line 709 "read_config_yy.y" +#line 710 "read_config_yy.y" { __max_dedicated_links_reached(); conf.channel[conf.channel_num].u.tcp.checksum = 1; @@ -2774,7 +2799,7 @@ yyreduce: case 74: /* Line 1455 of yacc.c */ -#line 715 "read_config_yy.y" +#line 716 "read_config_yy.y" { __max_dedicated_links_reached(); CONFIG(channelc).error_queue_length = (yyvsp[(2) - (2)].val); @@ -2784,7 +2809,7 @@ yyreduce: case 75: /* Line 1455 of yacc.c */ -#line 721 "read_config_yy.y" +#line 722 "read_config_yy.y" { conf.hashsize = (yyvsp[(2) - (2)].val); } @@ -2793,7 +2818,7 @@ yyreduce: case 76: /* Line 1455 of yacc.c */ -#line 726 "read_config_yy.y" +#line 727 "read_config_yy.y" { conf.limit = (yyvsp[(2) - (2)].val); } @@ -2802,7 +2827,7 @@ yyreduce: case 80: /* Line 1455 of yacc.c */ -#line 737 "read_config_yy.y" +#line 738 "read_config_yy.y" { strcpy(conf.local.path, (yyvsp[(2) - (2)].string)); } @@ -2811,7 +2836,7 @@ yyreduce: case 81: /* Line 1455 of yacc.c */ -#line 742 "read_config_yy.y" +#line 743 "read_config_yy.y" { conf.local.backlog = (yyvsp[(2) - (2)].val); } @@ -2820,7 +2845,7 @@ yyreduce: case 82: /* Line 1455 of yacc.c */ -#line 747 "read_config_yy.y" +#line 748 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_L4PROTO, @@ -2834,7 +2859,7 @@ yyreduce: case 85: /* Line 1455 of yacc.c */ -#line 761 "read_config_yy.y" +#line 762 "read_config_yy.y" { if ((yyvsp[(1) - (1)].val) < IPPROTO_MAX) ct_filter_add_proto(STATE(us_filter), (yyvsp[(1) - (1)].val)); @@ -2846,7 +2871,7 @@ yyreduce: case 86: /* Line 1455 of yacc.c */ -#line 769 "read_config_yy.y" +#line 770 "read_config_yy.y" { struct protoent *pent; @@ -2863,7 +2888,7 @@ yyreduce: case 87: /* Line 1455 of yacc.c */ -#line 782 "read_config_yy.y" +#line 783 "read_config_yy.y" { if (conf.flags & CTD_STATS_MODE) { print_err(CTD_CFG_ERROR, "cannot use both `Stats' and `Sync' " @@ -2874,139 +2899,210 @@ yyreduce: } break; - case 107: + case 111: /* Line 1455 of yacc.c */ -#line 814 "read_config_yy.y" +#line 822 "read_config_yy.y" + { + CONFIG(sync).tcp_window_tracking = 1; +} + break; + + case 112: + +/* Line 1455 of yacc.c */ +#line 827 "read_config_yy.y" + { + CONFIG(sync).tcp_window_tracking = 0; +} + break; + + case 113: + +/* Line 1455 of yacc.c */ +#line 832 "read_config_yy.y" + { + CONFIG(flags) |= CTD_EXPECT; + CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY | + NF_NETLINK_CONNTRACK_EXP_NEW | + NF_NETLINK_CONNTRACK_EXP_UPDATE | + NF_NETLINK_CONNTRACK_EXP_DESTROY; +} + break; + + case 114: + +/* Line 1455 of yacc.c */ +#line 844 "read_config_yy.y" + { + CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY; +} + break; + + case 115: + +/* Line 1455 of yacc.c */ +#line 852 "read_config_yy.y" + { + CONFIG(flags) |= CTD_EXPECT; + CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY | + NF_NETLINK_CONNTRACK_EXP_NEW | + NF_NETLINK_CONNTRACK_EXP_UPDATE | + NF_NETLINK_CONNTRACK_EXP_DESTROY; +} + break; + + case 118: + +/* Line 1455 of yacc.c */ +#line 867 "read_config_yy.y" + { + exp_filter_add(STATE(exp_filter), (yyvsp[(1) - (1)].string)); +} + break; + + case 119: + +/* Line 1455 of yacc.c */ +#line 872 "read_config_yy.y" { conf.flags |= CTD_SYNC_ALARM; } break; - case 108: + case 120: /* Line 1455 of yacc.c */ -#line 819 "read_config_yy.y" +#line 877 "read_config_yy.y" { conf.flags |= CTD_SYNC_FTFW; } break; - case 109: + case 121: /* Line 1455 of yacc.c */ -#line 824 "read_config_yy.y" +#line 882 "read_config_yy.y" { conf.flags |= CTD_SYNC_NOTRACK; } break; - case 132: + case 144: /* Line 1455 of yacc.c */ -#line 860 "read_config_yy.y" +#line 918 "read_config_yy.y" { conf.sync.internal_cache_disable = 1; } break; - case 133: + case 145: /* Line 1455 of yacc.c */ -#line 865 "read_config_yy.y" +#line 923 "read_config_yy.y" { conf.sync.internal_cache_disable = 0; } break; - case 134: + case 146: /* Line 1455 of yacc.c */ -#line 870 "read_config_yy.y" +#line 928 "read_config_yy.y" { conf.sync.external_cache_disable = 1; } break; - case 135: + case 147: /* Line 1455 of yacc.c */ -#line 875 "read_config_yy.y" +#line 933 "read_config_yy.y" { conf.sync.external_cache_disable = 0; } break; - case 136: + case 148: /* Line 1455 of yacc.c */ -#line 880 "read_config_yy.y" +#line 938 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`ResendBufferSize' is deprecated. " "Use `ResendQueueSize' instead"); } break; - case 137: + case 149: /* Line 1455 of yacc.c */ -#line 886 "read_config_yy.y" +#line 944 "read_config_yy.y" { conf.resend_queue_size = (yyvsp[(2) - (2)].val); } break; - case 138: + case 150: /* Line 1455 of yacc.c */ -#line 891 "read_config_yy.y" +#line 949 "read_config_yy.y" { conf.window_size = (yyvsp[(2) - (2)].val); } break; - case 139: + case 151: /* Line 1455 of yacc.c */ -#line 896 "read_config_yy.y" +#line 954 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`DestroyTimeout' is deprecated. Remove it"); } break; - case 140: + case 152: /* Line 1455 of yacc.c */ -#line 901 "read_config_yy.y" +#line 959 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`RelaxTransitions' clause is obsolete. " "Please, remove it from conntrackd.conf"); } break; - case 141: + case 153: /* Line 1455 of yacc.c */ -#line 907 "read_config_yy.y" +#line 965 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`DelayDestroyMessages' clause is obsolete. " "Please, remove it from conntrackd.conf"); } break; - case 142: + case 154: /* Line 1455 of yacc.c */ -#line 913 "read_config_yy.y" +#line 971 "read_config_yy.y" { print_err(CTD_CFG_WARN, "the clause `ListenTo' is obsolete, ignoring"); } break; - case 143: + case 155: /* Line 1455 of yacc.c */ -#line 918 "read_config_yy.y" +#line 976 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_STATE, @@ -3017,10 +3113,10 @@ yyreduce: } break; - case 146: + case 158: /* Line 1455 of yacc.c */ -#line 931 "read_config_yy.y" +#line 989 "read_config_yy.y" { if (strncmp((yyvsp[(1) - (1)].string), "TCP", strlen("TCP")) != 0) { print_err(CTD_CFG_WARN, "unsupported protocol `%s' in line %d", @@ -3029,10 +3125,10 @@ yyreduce: } break; - case 150: + case 162: /* Line 1455 of yacc.c */ -#line 943 "read_config_yy.y" +#line 1001 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3042,10 +3138,10 @@ yyreduce: } break; - case 151: + case 163: /* Line 1455 of yacc.c */ -#line 951 "read_config_yy.y" +#line 1009 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3055,10 +3151,10 @@ yyreduce: } break; - case 152: + case 164: /* Line 1455 of yacc.c */ -#line 959 "read_config_yy.y" +#line 1017 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3068,10 +3164,10 @@ yyreduce: } break; - case 153: + case 165: /* Line 1455 of yacc.c */ -#line 967 "read_config_yy.y" +#line 1025 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3081,10 +3177,10 @@ yyreduce: } break; - case 154: + case 166: /* Line 1455 of yacc.c */ -#line 975 "read_config_yy.y" +#line 1033 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3094,10 +3190,10 @@ yyreduce: } break; - case 155: + case 167: /* Line 1455 of yacc.c */ -#line 983 "read_config_yy.y" +#line 1041 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3107,10 +3203,10 @@ yyreduce: } break; - case 156: + case 168: /* Line 1455 of yacc.c */ -#line 991 "read_config_yy.y" +#line 1049 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3120,10 +3216,10 @@ yyreduce: } break; - case 157: + case 169: /* Line 1455 of yacc.c */ -#line 999 "read_config_yy.y" +#line 1057 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3133,10 +3229,10 @@ yyreduce: } break; - case 158: + case 170: /* Line 1455 of yacc.c */ -#line 1007 "read_config_yy.y" +#line 1065 "read_config_yy.y" { ct_filter_add_state(STATE(us_filter), IPPROTO_TCP, @@ -3146,102 +3242,102 @@ yyreduce: } break; - case 159: + case 171: /* Line 1455 of yacc.c */ -#line 1016 "read_config_yy.y" +#line 1074 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`CacheWriteThrough' clause is obsolete, " "ignoring"); } break; - case 160: + case 172: /* Line 1455 of yacc.c */ -#line 1022 "read_config_yy.y" +#line 1080 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`CacheWriteThrough' clause is obsolete, " "ignoring"); } break; - case 182: + case 194: /* Line 1455 of yacc.c */ -#line 1054 "read_config_yy.y" +#line 1112 "read_config_yy.y" { conf.netlink_buffer_size = (yyvsp[(2) - (2)].val); } break; - case 183: + case 195: /* Line 1455 of yacc.c */ -#line 1059 "read_config_yy.y" +#line 1117 "read_config_yy.y" { conf.netlink_buffer_size_max_grown = (yyvsp[(2) - (2)].val); } break; - case 184: + case 196: /* Line 1455 of yacc.c */ -#line 1064 "read_config_yy.y" +#line 1122 "read_config_yy.y" { conf.nl_overrun_resync = 30; } break; - case 185: + case 197: /* Line 1455 of yacc.c */ -#line 1069 "read_config_yy.y" +#line 1127 "read_config_yy.y" { conf.nl_overrun_resync = -1; } break; - case 186: + case 198: /* Line 1455 of yacc.c */ -#line 1074 "read_config_yy.y" +#line 1132 "read_config_yy.y" { conf.nl_overrun_resync = (yyvsp[(2) - (2)].val); } break; - case 187: + case 199: /* Line 1455 of yacc.c */ -#line 1079 "read_config_yy.y" +#line 1137 "read_config_yy.y" { conf.netlink.events_reliable = 1; } break; - case 188: + case 200: /* Line 1455 of yacc.c */ -#line 1084 "read_config_yy.y" +#line 1142 "read_config_yy.y" { conf.netlink.events_reliable = 0; } break; - case 189: + case 201: /* Line 1455 of yacc.c */ -#line 1089 "read_config_yy.y" +#line 1147 "read_config_yy.y" { conf.nice = (yyvsp[(2) - (2)].val); } break; - case 193: + case 205: /* Line 1455 of yacc.c */ -#line 1100 "read_config_yy.y" +#line 1158 "read_config_yy.y" { if (strcasecmp((yyvsp[(2) - (2)].string), "rr") == 0) { conf.sched.type = SCHED_RR; @@ -3254,10 +3350,10 @@ yyreduce: } break; - case 194: + case 206: /* Line 1455 of yacc.c */ -#line 1112 "read_config_yy.y" +#line 1170 "read_config_yy.y" { conf.sched.prio = (yyvsp[(2) - (2)].val); if (conf.sched.prio < 0 || conf.sched.prio > 99) { @@ -3267,10 +3363,10 @@ yyreduce: } break; - case 195: + case 207: /* Line 1455 of yacc.c */ -#line 1121 "read_config_yy.y" +#line 1179 "read_config_yy.y" { if (strncmp((yyvsp[(2) - (2)].string), "IPv6", strlen("IPv6")) == 0) conf.family = AF_INET6; @@ -3279,19 +3375,19 @@ yyreduce: } break; - case 196: + case 208: /* Line 1455 of yacc.c */ -#line 1129 "read_config_yy.y" +#line 1187 "read_config_yy.y" { CONFIG(event_iterations_limit) = (yyvsp[(2) - (2)].val); } break; - case 197: + case 209: /* Line 1455 of yacc.c */ -#line 1134 "read_config_yy.y" +#line 1192 "read_config_yy.y" { conf.flags |= CTD_POLL; conf.poll_kernel_secs = (yyvsp[(2) - (2)].val); @@ -3302,37 +3398,37 @@ yyreduce: } break; - case 198: + case 210: /* Line 1455 of yacc.c */ -#line 1144 "read_config_yy.y" +#line 1202 "read_config_yy.y" { CONFIG(filter_from_kernelspace) = 0; } break; - case 199: + case 211: /* Line 1455 of yacc.c */ -#line 1149 "read_config_yy.y" +#line 1207 "read_config_yy.y" { CONFIG(filter_from_kernelspace) = 0; } break; - case 200: + case 212: /* Line 1455 of yacc.c */ -#line 1154 "read_config_yy.y" +#line 1212 "read_config_yy.y" { CONFIG(filter_from_kernelspace) = 1; } break; - case 203: + case 215: /* Line 1455 of yacc.c */ -#line 1162 "read_config_yy.y" +#line 1220 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_L4PROTO, @@ -3342,10 +3438,10 @@ yyreduce: } break; - case 204: + case 216: /* Line 1455 of yacc.c */ -#line 1171 "read_config_yy.y" +#line 1229 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_L4PROTO, @@ -3359,10 +3455,10 @@ yyreduce: } break; - case 207: + case 219: /* Line 1455 of yacc.c */ -#line 1187 "read_config_yy.y" +#line 1245 "read_config_yy.y" { struct protoent *pent; @@ -3382,10 +3478,10 @@ yyreduce: } break; - case 208: + case 220: /* Line 1455 of yacc.c */ -#line 1206 "read_config_yy.y" +#line 1264 "read_config_yy.y" { struct protoent *pent; @@ -3405,10 +3501,56 @@ yyreduce: } break; - case 209: + case 221: + +/* Line 1455 of yacc.c */ +#line 1283 "read_config_yy.y" + { + struct protoent *pent; + + pent = getprotobyname("udp"); + if (pent == NULL) { + print_err(CTD_CFG_WARN, "getprotobyname() cannot find " + "protocol `udp' in /etc/protocols"); + break; + } + ct_filter_add_proto(STATE(us_filter), pent->p_proto); + + __kernel_filter_start(); + + nfct_filter_add_attr_u32(STATE(filter), + NFCT_FILTER_L4PROTO, + pent->p_proto); +} + break; + + case 222: /* Line 1455 of yacc.c */ -#line 1225 "read_config_yy.y" +#line 1302 "read_config_yy.y" + { + struct protoent *pent; + + pent = getprotobyname("udp"); + if (pent == NULL) { + print_err(CTD_CFG_WARN, "getprotobyname() cannot find " + "protocol `udp' in /etc/protocols"); + break; + } + ct_filter_add_proto(STATE(us_filter), pent->p_proto); + + __kernel_filter_start(); + + nfct_filter_add_attr_u32(STATE(filter), + NFCT_FILTER_L4PROTO, + pent->p_proto); +} + break; + + case 223: + +/* Line 1455 of yacc.c */ +#line 1321 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_ADDRESS, @@ -3418,10 +3560,10 @@ yyreduce: } break; - case 210: + case 224: /* Line 1455 of yacc.c */ -#line 1234 "read_config_yy.y" +#line 1330 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_ADDRESS, @@ -3444,10 +3586,10 @@ yyreduce: } break; - case 213: + case 227: /* Line 1455 of yacc.c */ -#line 1259 "read_config_yy.y" +#line 1355 "read_config_yy.y" { union inet_address ip; char *slash; @@ -3507,10 +3649,10 @@ yyreduce: } break; - case 214: + case 228: /* Line 1455 of yacc.c */ -#line 1318 "read_config_yy.y" +#line 1414 "read_config_yy.y" { union inet_address ip; char *slash; @@ -3571,10 +3713,10 @@ yyreduce: } break; - case 215: + case 229: /* Line 1455 of yacc.c */ -#line 1378 "read_config_yy.y" +#line 1474 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_STATE, @@ -3584,10 +3726,10 @@ yyreduce: } break; - case 216: + case 230: /* Line 1455 of yacc.c */ -#line 1387 "read_config_yy.y" +#line 1483 "read_config_yy.y" { ct_filter_set_logic(STATE(us_filter), CT_FILTER_STATE, @@ -3602,10 +3744,10 @@ yyreduce: } break; - case 220: + case 234: /* Line 1455 of yacc.c */ -#line 1406 "read_config_yy.y" +#line 1502 "read_config_yy.y" { if (conf.flags & CTD_SYNC_MODE) { print_err(CTD_CFG_ERROR, "cannot use both `Stats' and `Sync' " @@ -3616,54 +3758,54 @@ yyreduce: } break; - case 228: + case 242: /* Line 1455 of yacc.c */ -#line 1427 "read_config_yy.y" +#line 1523 "read_config_yy.y" { strncpy(conf.stats.logfile, DEFAULT_STATS_LOGFILE, FILENAME_MAXLEN); } break; - case 229: + case 243: /* Line 1455 of yacc.c */ -#line 1432 "read_config_yy.y" +#line 1528 "read_config_yy.y" { } break; - case 230: + case 244: /* Line 1455 of yacc.c */ -#line 1436 "read_config_yy.y" +#line 1532 "read_config_yy.y" { strncpy(conf.stats.logfile, (yyvsp[(2) - (2)].string), FILENAME_MAXLEN); } break; - case 231: + case 245: /* Line 1455 of yacc.c */ -#line 1441 "read_config_yy.y" +#line 1537 "read_config_yy.y" { conf.stats.syslog_facility = DEFAULT_SYSLOG_FACILITY; } break; - case 232: + case 246: /* Line 1455 of yacc.c */ -#line 1446 "read_config_yy.y" +#line 1542 "read_config_yy.y" { conf.stats.syslog_facility = -1; } break; - case 233: + case 247: /* Line 1455 of yacc.c */ -#line 1451 "read_config_yy.y" +#line 1547 "read_config_yy.y" { if (!strcmp((yyvsp[(2) - (2)].string), "daemon")) conf.stats.syslog_facility = LOG_DAEMON; @@ -3696,10 +3838,10 @@ yyreduce: } break; - case 234: + case 248: /* Line 1455 of yacc.c */ -#line 1483 "read_config_yy.y" +#line 1579 "read_config_yy.y" { print_err(CTD_CFG_WARN, "`LogFileBufferSize' is deprecated"); } @@ -3708,7 +3850,7 @@ yyreduce: /* Line 1455 of yacc.c */ -#line 3712 "read_config_yy.c" +#line 3854 "read_config_yy.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -3920,7 +4062,7 @@ yyreturn: /* Line 1675 of yacc.c */ -#line 1487 "read_config_yy.y" +#line 1583 "read_config_yy.y" int __attribute__((noreturn)) @@ -3998,6 +4140,7 @@ init_config(char *filename) /* Zero may be a valid facility */ CONFIG(syslog_facility) = -1; CONFIG(stats).syslog_facility = -1; + CONFIG(netlink).subsys_id = -1; yyrestart(fp); yyparse(); @@ -4036,7 +4179,7 @@ init_config(char *filename) /* default number of bucket of the hashtable that are committed in one run loop. XXX: no option available to tune this value yet. */ if (CONFIG(general).commit_steps == 0) - CONFIG(general).commit_steps = 64; + CONFIG(general).commit_steps = 8192; /* if overrun, automatically resync with kernel after 30 seconds */ if (CONFIG(nl_overrun_resync) == 0) @@ -4046,6 +4189,13 @@ init_config(char *filename) if (CONFIG(channelc).error_queue_length == 0) CONFIG(channelc).error_queue_length = 128; + if (CONFIG(netlink).subsys_id == -1) { + CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY; + } + return 0; } diff --git a/src/read_config_yy.h b/src/read_config_yy.h index c1c2a98..a941e7e 100644 --- a/src/read_config_yy.h +++ b/src/read_config_yy.h @@ -127,11 +127,14 @@ T_DISABLE_INTERNAL_CACHE = 343, T_DISABLE_EXTERNAL_CACHE = 344, T_ERROR_QUEUE_LENGTH = 345, - T_IP = 346, - T_PATH_VAL = 347, - T_NUMBER = 348, - T_SIGNED_NUMBER = 349, - T_STRING = 350 + T_OPTIONS = 346, + T_TCP_WINDOW_TRACKING = 347, + T_EXPECT_SYNC = 348, + T_IP = 349, + T_PATH_VAL = 350, + T_NUMBER = 351, + T_SIGNED_NUMBER = 352, + T_STRING = 353 }; #endif /* Tokens. */ @@ -223,11 +226,14 @@ #define T_DISABLE_INTERNAL_CACHE 343 #define T_DISABLE_EXTERNAL_CACHE 344 #define T_ERROR_QUEUE_LENGTH 345 -#define T_IP 346 -#define T_PATH_VAL 347 -#define T_NUMBER 348 -#define T_SIGNED_NUMBER 349 -#define T_STRING 350 +#define T_OPTIONS 346 +#define T_TCP_WINDOW_TRACKING 347 +#define T_EXPECT_SYNC 348 +#define T_IP 349 +#define T_PATH_VAL 350 +#define T_NUMBER 351 +#define T_SIGNED_NUMBER 352 +#define T_STRING 353 @@ -245,7 +251,7 @@ typedef union YYSTYPE /* Line 1676 of yacc.c */ -#line 249 "read_config_yy.h" +#line 255 "read_config_yy.h" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/src/read_config_yy.y b/src/read_config_yy.y index 6dfca98..d94bd85 100644 --- a/src/read_config_yy.y +++ b/src/read_config_yy.y @@ -73,6 +73,7 @@ static void __max_dedicated_links_reached(void); %token T_NETLINK_OVERRUN_RESYNC T_NICE T_IPV4_DEST_ADDR T_IPV6_DEST_ADDR %token T_SCHEDULER T_TYPE T_PRIO T_NETLINK_EVENTS_RELIABLE %token T_DISABLE_INTERNAL_CACHE T_DISABLE_EXTERNAL_CACHE T_ERROR_QUEUE_LENGTH +%token T_OPTIONS T_TCP_WINDOW_TRACKING T_EXPECT_SYNC %token <string> T_IP T_PATH_VAL %token <val> T_NUMBER @@ -808,8 +809,65 @@ sync_line: refreshtime | state_replication | cache_writethrough | destroy_timeout + | option_line ; +option_line: T_OPTIONS '{' options '}'; + +options: + | options option + ; + +option: T_TCP_WINDOW_TRACKING T_ON +{ + CONFIG(sync).tcp_window_tracking = 1; +}; + +option: T_TCP_WINDOW_TRACKING T_OFF +{ + CONFIG(sync).tcp_window_tracking = 0; +}; + +option: T_EXPECT_SYNC T_ON +{ + CONFIG(flags) |= CTD_EXPECT; + CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY | + NF_NETLINK_CONNTRACK_EXP_NEW | + NF_NETLINK_CONNTRACK_EXP_UPDATE | + NF_NETLINK_CONNTRACK_EXP_DESTROY; +}; + +option: T_EXPECT_SYNC T_OFF +{ + CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY; +}; + +option: T_EXPECT_SYNC '{' expect_list '}' +{ + CONFIG(flags) |= CTD_EXPECT; + CONFIG(netlink).subsys_id = NFNL_SUBSYS_NONE; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY | + NF_NETLINK_CONNTRACK_EXP_NEW | + NF_NETLINK_CONNTRACK_EXP_UPDATE | + NF_NETLINK_CONNTRACK_EXP_DESTROY; +}; + +expect_list: + | expect_list expect_item ; + +expect_item: T_STRING +{ + exp_filter_add(STATE(exp_filter), $1); +} + sync_mode_alarm: T_SYNC_MODE T_ALARM '{' sync_mode_alarm_list '}' { conf.flags |= CTD_SYNC_ALARM; @@ -1221,6 +1279,44 @@ filter_protocol_item : T_TCP pent->p_proto); }; +filter_protocol_item : T_UDP +{ + struct protoent *pent; + + pent = getprotobyname("udp"); + if (pent == NULL) { + print_err(CTD_CFG_WARN, "getprotobyname() cannot find " + "protocol `udp' in /etc/protocols"); + break; + } + ct_filter_add_proto(STATE(us_filter), pent->p_proto); + + __kernel_filter_start(); + + nfct_filter_add_attr_u32(STATE(filter), + NFCT_FILTER_L4PROTO, + pent->p_proto); +}; + +filter_protocol_item : T_UDP +{ + struct protoent *pent; + + pent = getprotobyname("udp"); + if (pent == NULL) { + print_err(CTD_CFG_WARN, "getprotobyname() cannot find " + "protocol `udp' in /etc/protocols"); + break; + } + ct_filter_add_proto(STATE(us_filter), pent->p_proto); + + __kernel_filter_start(); + + nfct_filter_add_attr_u32(STATE(filter), + NFCT_FILTER_L4PROTO, + pent->p_proto); +}; + filter_item : T_ADDRESS T_ACCEPT '{' filter_address_list '}' { ct_filter_set_logic(STATE(us_filter), @@ -1561,6 +1657,7 @@ init_config(char *filename) /* Zero may be a valid facility */ CONFIG(syslog_facility) = -1; CONFIG(stats).syslog_facility = -1; + CONFIG(netlink).subsys_id = -1; yyrestart(fp); yyparse(); @@ -1599,7 +1696,7 @@ init_config(char *filename) /* default number of bucket of the hashtable that are committed in one run loop. XXX: no option available to tune this value yet. */ if (CONFIG(general).commit_steps == 0) - CONFIG(general).commit_steps = 64; + CONFIG(general).commit_steps = 8192; /* if overrun, automatically resync with kernel after 30 seconds */ if (CONFIG(nl_overrun_resync) == 0) @@ -1609,5 +1706,12 @@ init_config(char *filename) if (CONFIG(channelc).error_queue_length == 0) CONFIG(channelc).error_queue_length = 128; + if (CONFIG(netlink).subsys_id == -1) { + CONFIG(netlink).subsys_id = NFNL_SUBSYS_CTNETLINK; + CONFIG(netlink).groups = NF_NETLINK_CONNTRACK_NEW | + NF_NETLINK_CONNTRACK_UPDATE | + NF_NETLINK_CONNTRACK_DESTROY; + } + return 0; } @@ -1,6 +1,7 @@ /* - * (C) 2006-2009 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -186,40 +187,91 @@ static void dump_stats_runtime(int fd) send(fd, buf, size, 0); } +static void local_flush_master(void) +{ + STATE(stats).nl_kernel_table_flush++; + dlog(LOG_NOTICE, "flushing kernel conntrack table"); + + /* fork a child process that performs the flush operation, + * meanwhile the parent process handles events. */ + if (fork_process_new(CTD_PROC_FLUSH, CTD_PROC_F_EXCL, + NULL, NULL) == 0) { + nl_flush_conntrack_table(STATE(flush)); + exit(EXIT_SUCCESS); + } +} + +static void local_resync_master(void) +{ + if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { + STATE(stats).nl_kernel_table_resync++; + dlog(LOG_NOTICE, "resync with master conntrack table"); + nl_dump_conntrack_table(STATE(dump)); + } else { + dlog(LOG_NOTICE, "resync is unsupported in this mode"); + } +} + +static void local_exp_flush_master(void) +{ + if (!(CONFIG(flags) & CTD_EXPECT)) + return; + + STATE(stats).nl_kernel_table_flush++; + dlog(LOG_NOTICE, "flushing kernel expect table"); + + /* fork a child process that performs the flush operation, + * meanwhile the parent process handles events. */ + if (fork_process_new(CTD_PROC_FLUSH, CTD_PROC_F_EXCL, + NULL, NULL) == 0) { + nl_flush_expect_table(STATE(flush)); + exit(EXIT_SUCCESS); + } +} + +static void local_exp_resync_master(void) +{ + if (!(CONFIG(flags) & CTD_EXPECT)) + return; + + if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { + STATE(stats).nl_kernel_table_resync++; + dlog(LOG_NOTICE, "resync with master expect table"); + nl_dump_expect_table(STATE(dump)); + } else { + dlog(LOG_NOTICE, "resync is unsupported in this mode"); + } +} + static int local_handler(int fd, void *data) { int ret = LOCAL_RET_OK; int type; - ret = read(fd, &type, sizeof(type)); - if (ret == -1) { + if (read(fd, &type, sizeof(type)) <= 0) { STATE(stats).local_read_failed++; return LOCAL_RET_OK; } - if (ret == 0) - return LOCAL_RET_OK; - switch(type) { - case FLUSH_MASTER: - STATE(stats).nl_kernel_table_flush++; - dlog(LOG_NOTICE, "flushing kernel conntrack table"); - - /* fork a child process that performs the flush operation, - * meanwhile the parent process handles events. */ - if (fork_process_new(CTD_PROC_FLUSH, CTD_PROC_F_EXCL, - NULL, NULL) == 0) { - nl_flush_conntrack_table(STATE(flush)); - exit(EXIT_SUCCESS); - } + case CT_FLUSH_MASTER: + local_flush_master(); break; - case RESYNC_MASTER: - if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { - STATE(stats).nl_kernel_table_resync++; - dlog(LOG_NOTICE, "resync with master table"); - nl_dump_conntrack_table(STATE(dump)); - } else { - dlog(LOG_NOTICE, "resync is unsupported in this mode"); - } + case CT_RESYNC_MASTER: + local_resync_master(); + break; + case EXP_FLUSH_MASTER: + local_exp_flush_master(); + break; + case EXP_RESYNC_MASTER: + local_exp_resync_master(); + break; + case ALL_FLUSH_MASTER: + local_flush_master(); + local_exp_flush_master(); + break; + case ALL_RESYNC_MASTER: + local_resync_master(); + local_exp_resync_master(); break; case STATS_RUNTIME: dump_stats_runtime(fd); @@ -245,10 +297,14 @@ static void do_overrun_resync_alarm(struct alarm_block *a, void *data) static void do_polling_alarm(struct alarm_block *a, void *data) { - if (STATE(mode)->internal->purge) - STATE(mode)->internal->purge(); + if (STATE(mode)->internal->ct.purge) + STATE(mode)->internal->ct.purge(); + + if (STATE(mode)->internal->exp.purge) + STATE(mode)->internal->exp.purge(); nl_send_resync(STATE(resync)); + nl_send_expect_resync(STATE(resync)); add_alarm(&STATE(polling_alarm), CONFIG(poll_kernel_secs), 0); } @@ -271,13 +327,13 @@ static int event_handler(const struct nlmsghdr *nlh, switch(type) { case NFCT_T_NEW: - STATE(mode)->internal->new(ct, origin_type); + STATE(mode)->internal->ct.new(ct, origin_type); break; case NFCT_T_UPDATE: - STATE(mode)->internal->update(ct, origin_type); + STATE(mode)->internal->ct.upd(ct, origin_type); break; case NFCT_T_DESTROY: - if (STATE(mode)->internal->destroy(ct, origin_type)) + if (STATE(mode)->internal->ct.del(ct, origin_type)) update_traffic_stats(ct); break; default: @@ -286,10 +342,52 @@ static int event_handler(const struct nlmsghdr *nlh, } out: - if (STATE(event_iterations_limit)-- <= 0) { - STATE(event_iterations_limit) = CONFIG(event_iterations_limit); + if (STATE(event_iterations_limit)-- <= 0) return NFCT_CB_STOP; - } else + else + return NFCT_CB_CONTINUE; +} + +static int exp_event_handler(const struct nlmsghdr *nlh, + enum nf_conntrack_msg_type type, + struct nf_expect *exp, + void *data) +{ + int origin_type; + const struct nf_conntrack *master = + nfexp_get_attr(exp, ATTR_EXP_MASTER); + + STATE(stats).nl_events_received++; + + if (!exp_filter_find(STATE(exp_filter), exp)) { + STATE(stats).nl_events_filtered++; + goto out; + } + if (ct_filter_conntrack(master, 1)) + return NFCT_CB_CONTINUE; + + origin_type = origin_find(nlh); + + switch(type) { + case NFCT_T_NEW: + STATE(mode)->internal->exp.new(exp, origin_type); + break; + case NFCT_T_UPDATE: + STATE(mode)->internal->exp.upd(exp, origin_type); + break; + case NFCT_T_DESTROY: + STATE(mode)->internal->exp.del(exp, origin_type); + break; + default: + STATE(stats).nl_events_unknown_type++; + break; + } + +out: + /* we reset the iteration limiter in the main select loop. */ + if (STATE(event_iterations_limit)-- <= 0) + return NFCT_CB_STOP; + else return NFCT_CB_CONTINUE; } @@ -302,7 +400,30 @@ static int dump_handler(enum nf_conntrack_msg_type type, switch(type) { case NFCT_T_UPDATE: - STATE(mode)->internal->populate(ct); + STATE(mode)->internal->ct.populate(ct); + break; + default: + STATE(stats).nl_dump_unknown_type++; + break; + } + return NFCT_CB_CONTINUE; +} + +static int exp_dump_handler(enum nf_conntrack_msg_type type, + struct nf_expect *exp, void *data) +{ + const struct nf_conntrack *master = + nfexp_get_attr(exp, ATTR_EXP_MASTER); + + if (!exp_filter_find(STATE(exp_filter), exp)) + return NFCT_CB_CONTINUE; + + if (ct_filter_conntrack(master, 1)) + return NFCT_CB_CONTINUE; + + switch(type) { + case NFCT_T_UPDATE: + STATE(mode)->internal->exp.populate(exp); break; default: STATE(stats).nl_dump_unknown_type++; @@ -322,9 +443,27 @@ static int get_handler(enum nf_conntrack_msg_type type, return NFCT_CB_CONTINUE; } +static int exp_get_handler(enum nf_conntrack_msg_type type, + struct nf_expect *exp, void *data) +{ + const struct nf_conntrack *master = + nfexp_get_attr(exp, ATTR_EXP_MASTER); + + if (!exp_filter_find(STATE(exp_filter), exp)) + return NFCT_CB_CONTINUE; + + if (ct_filter_conntrack(master, 1)) + return NFCT_CB_CONTINUE; + + STATE(get_retval) = 1; + return NFCT_CB_CONTINUE; +} + int init(void) { + do_gettimeofday(); + if (CONFIG(flags) & CTD_STATS_MODE) STATE(mode) = &stats_mode; else if (CONFIG(flags) & CTD_SYNC_MODE) @@ -355,21 +494,8 @@ init(void) } register_fd(STATE(local).fd, STATE(fds)); - if (!(CONFIG(flags) & CTD_POLL)) { - STATE(event) = nl_init_event_handler(); - if (STATE(event) == NULL) { - dlog(LOG_ERR, "can't open netlink handler: %s", - strerror(errno)); - dlog(LOG_ERR, "no ctnetlink kernel support?"); - return -1; - } - nfct_callback_register2(STATE(event), NFCT_T_ALL, - event_handler, NULL); - register_fd(nfct_fd(STATE(event)), STATE(fds)); - } - /* resynchronize (like 'dump' socket) but it also purges old entries */ - STATE(resync) = nfct_open(CONNTRACK, 0); + STATE(resync) = nfct_open(CONFIG(netlink).subsys_id, 0); if (STATE(resync)== NULL) { dlog(LOG_ERR, "can't open netlink handler: %s", strerror(errno)); @@ -378,13 +504,13 @@ init(void) } nfct_callback_register(STATE(resync), NFCT_T_ALL, - STATE(mode)->internal->resync, + STATE(mode)->internal->ct.resync, NULL); register_fd(nfct_fd(STATE(resync)), STATE(fds)); fcntl(nfct_fd(STATE(resync)), F_SETFL, O_NONBLOCK); if (STATE(mode)->internal->flags & INTERNAL_F_POPULATE) { - STATE(dump) = nfct_open(CONNTRACK, 0); + STATE(dump) = nfct_open(CONFIG(netlink).subsys_id, 0); if (STATE(dump) == NULL) { dlog(LOG_ERR, "can't open netlink handler: %s", strerror(errno)); @@ -394,13 +520,26 @@ init(void) nfct_callback_register(STATE(dump), NFCT_T_ALL, dump_handler, NULL); + if (CONFIG(flags) & CTD_EXPECT) { + nfexp_callback_register(STATE(dump), NFCT_T_ALL, + exp_dump_handler, NULL); + } + if (nl_dump_conntrack_table(STATE(dump)) == -1) { dlog(LOG_ERR, "can't get kernel conntrack table"); return -1; } + + if (CONFIG(flags) & CTD_EXPECT) { + if (nl_dump_expect_table(STATE(dump)) == -1) { + dlog(LOG_ERR, "can't get kernel " + "expect table"); + return -1; + } + } } - STATE(get) = nfct_open(CONNTRACK, 0); + STATE(get) = nfct_open(CONFIG(netlink).subsys_id, 0); if (STATE(get) == NULL) { dlog(LOG_ERR, "can't open netlink handler: %s", strerror(errno)); @@ -409,7 +548,12 @@ init(void) } nfct_callback_register(STATE(get), NFCT_T_ALL, get_handler, NULL); - STATE(flush) = nfct_open(CONNTRACK, 0); + if (CONFIG(flags) & CTD_EXPECT) { + nfexp_callback_register(STATE(get), NFCT_T_ALL, + exp_get_handler, NULL); + } + + STATE(flush) = nfct_open(CONFIG(netlink).subsys_id, 0); if (STATE(flush) == NULL) { dlog(LOG_ERR, "cannot open flusher handler"); return -1; @@ -423,6 +567,29 @@ init(void) dlog(LOG_NOTICE, "running in polling mode"); } else { init_alarm(&STATE(resync_alarm), NULL, do_overrun_resync_alarm); + /* + * The last nfct handler that we register is the event handler. + * The reason to do this is that we may receive events while + * populating the internal cache. Thus, we hit ENOBUFS + * prematurely. However, if we open the event handler before + * populating the internal cache, we may still lose events + * that have occured during the population. + */ + STATE(event) = nl_init_event_handler(); + if (STATE(event) == NULL) { + dlog(LOG_ERR, "can't open netlink handler: %s", + strerror(errno)); + dlog(LOG_ERR, "no ctnetlink kernel support?"); + return -1; + } + nfct_callback_register2(STATE(event), NFCT_T_ALL, + event_handler, NULL); + + if (CONFIG(flags) & CTD_EXPECT) { + nfexp_callback_register2(STATE(event), NFCT_T_ALL, + exp_event_handler, NULL); + } + register_fd(nfct_fd(STATE(event)), STATE(fds)); } /* Signals handling */ @@ -451,7 +618,7 @@ init(void) return 0; } -static void __run(struct timeval *next_alarm) +static void run_events(struct timeval *next_alarm) { int ret; fd_set readfds = STATE(fds)->readfds; @@ -473,77 +640,70 @@ static void __run(struct timeval *next_alarm) if (FD_ISSET(STATE(local).fd, &readfds)) do_local_server_step(&STATE(local), NULL, local_handler); - if (!(CONFIG(flags) & CTD_POLL)) { - /* conntrack event has happened */ - if (FD_ISSET(nfct_fd(STATE(event)), &readfds)) { - ret = nfct_catch(STATE(event)); - /* reset event iteration limit counter */ - STATE(event_iterations_limit) = - CONFIG(event_iterations_limit); - if (ret == -1) { - switch(errno) { - case ENOBUFS: - /* We have hit ENOBUFS, it's likely that we are - * losing events. Two possible situations may - * trigger this error: - * - * 1) The netlink receiver buffer is too small: - * increasing the netlink buffer size should - * be enough. However, some event messages - * got lost. We have to resync ourselves - * with the kernel table conntrack table to - * resolve the inconsistency. - * - * 2) The receiver is too slow to process the - * netlink messages so that the queue gets - * full quickly. This generally happens - * if the system is under heavy workload - * (busy CPU). In this case, increasing the - * size of the netlink receiver buffer - * would not help anymore since we would - * be delaying the overrun. Moreover, we - * should avoid resynchronizations. We - * should do our best here and keep - * replicating as much states as possible. - * If workload lowers at some point, - * we resync ourselves. - */ - nl_resize_socket_buffer(STATE(event)); - if (CONFIG(nl_overrun_resync) > 0 && - STATE(mode)->internal->flags & - INTERNAL_F_RESYNC) { - add_alarm(&STATE(resync_alarm), - CONFIG(nl_overrun_resync),0); - } - STATE(stats).nl_catch_event_failed++; - STATE(stats).nl_overrun++; - break; - case ENOENT: - /* - * We received a message from another - * netfilter subsystem that we are not - * interested in. Just ignore it. - */ - break; - case EAGAIN: - break; - default: - STATE(stats).nl_catch_event_failed++; - break; - } + /* we have receive an event from ctnetlink */ + if (FD_ISSET(nfct_fd(STATE(event)), &readfds)) { + ret = nfct_catch(STATE(event)); + /* reset event iteration limit counter */ + STATE(event_iterations_limit) = CONFIG(event_iterations_limit); + if (ret == -1) { + switch(errno) { + case ENOBUFS: + /* We have hit ENOBUFS, it's likely that we are + * losing events. Two possible situations may + * trigger this error: + * + * 1) The netlink receiver buffer is too small: + * increasing the netlink buffer size should + * be enough. However, some event messages + * got lost. We have to resync ourselves + * with the kernel table conntrack table to + * resolve the inconsistency. + * + * 2) The receiver is too slow to process the + * netlink messages so that the queue gets + * full quickly. This generally happens + * if the system is under heavy workload + * (busy CPU). In this case, increasing the + * size of the netlink receiver buffer + * would not help anymore since we would + * be delaying the overrun. Moreover, we + * should avoid resynchronizations. We + * should do our best here and keep + * replicating as much states as possible. + * If workload lowers at some point, + * we resync ourselves. + */ + nl_resize_socket_buffer(STATE(event)); + if (CONFIG(nl_overrun_resync) > 0 && + STATE(mode)->internal->flags & INTERNAL_F_RESYNC) { + add_alarm(&STATE(resync_alarm), + CONFIG(nl_overrun_resync),0); } + STATE(stats).nl_catch_event_failed++; + STATE(stats).nl_overrun++; + break; + case ENOENT: + /* + * We received a message from another + * netfilter subsystem that we are not + * interested in. Just ignore it. + */ + break; + case EAGAIN: + /* No more events to receive, try later. */ + break; + default: + STATE(stats).nl_catch_event_failed++; + break; } - if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) { - nfct_catch(STATE(resync)); - if (STATE(mode)->internal->purge) - STATE(mode)->internal->purge(); - } - } else { - /* using polling mode */ - if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) { - nfct_catch(STATE(resync)); } } + /* we previously requested a resync due to buffer overrun. */ + if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) { + nfct_catch(STATE(resync)); + if (STATE(mode)->internal->ct.purge) + STATE(mode)->internal->ct.purge(); + } if (STATE(mode)->run) STATE(mode)->run(&readfds); @@ -551,8 +711,40 @@ static void __run(struct timeval *next_alarm) sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); } -void __attribute__((noreturn)) -run(void) +static void run_polling(struct timeval *next_alarm) +{ + int ret; + fd_set readfds = STATE(fds)->readfds; + + ret = select(STATE(fds)->maxfd + 1, &readfds, NULL, NULL, next_alarm); + if (ret == -1) { + /* interrupted syscall, retry */ + if (errno == EINTR) + return; + + STATE(stats).select_failed++; + return; + } + + /* signals are racy */ + sigprocmask(SIG_BLOCK, &STATE(block), NULL); + + /* order received via UNIX socket */ + if (FD_ISSET(STATE(local).fd, &readfds)) + do_local_server_step(&STATE(local), NULL, local_handler); + + /* we requested a dump from the kernel via polling_alarm */ + if (FD_ISSET(nfct_fd(STATE(resync)), &readfds)) + nfct_catch(STATE(resync)); + + if (STATE(mode)->run) + STATE(mode)->run(&readfds); + + sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); +} + +static void __attribute__((noreturn)) +do_run(void (*run_step)(struct timeval *next_alarm)) { struct timeval next_alarm; struct timeval *next = NULL; @@ -567,6 +759,15 @@ run(void) next = get_next_alarm_run(&next_alarm); sigprocmask(SIG_UNBLOCK, &STATE(block), NULL); - __run(next); + run_step(next); + } +} + +void run(void) +{ + if (CONFIG(flags) & CTD_POLL) { + do_run(run_polling); + } else { + do_run(run_events); } } diff --git a/src/stats-mode.c b/src/stats-mode.c index 0403ce2..b768033 100644 --- a/src/stats-mode.c +++ b/src/stats-mode.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -37,7 +38,9 @@ static int init_stats(void) } memset(state.stats, 0, sizeof(struct ct_stats_state)); - STATE_STATS(cache) = cache_create("stats", NO_FEATURES, NULL); + STATE_STATS(cache) = cache_create("stats", CACHE_T_CT, + NO_FEATURES, NULL, + &cache_stats_ct_ops); if (!STATE_STATS(cache)) { dlog(LOG_ERR, "can't allocate memory for the " "external cache"); @@ -59,14 +62,14 @@ static int local_handler_stats(int fd, int type, void *data) int ret = LOCAL_RET_OK; switch(type) { - case DUMP_INTERNAL: + case CT_DUMP_INTERNAL: cache_dump(STATE_STATS(cache), fd, NFCT_O_PLAIN); break; - case DUMP_INT_XML: + case CT_DUMP_INT_XML: cache_dump(STATE_STATS(cache), fd, NFCT_O_XML); break; - case FLUSH_CACHE: - case FLUSH_INT_CACHE: + case CT_FLUSH_CACHE: + case CT_FLUSH_INT_CACHE: dlog(LOG_NOTICE, "flushing caches"); cache_flush(STATE_STATS(cache)); break; @@ -88,7 +91,7 @@ static int local_handler_stats(int fd, int type, void *data) return ret; } -static void populate_stats(struct nf_conntrack *ct) +static void stats_populate(struct nf_conntrack *ct) { nfct_attr_unset(ct, ATTR_ORIG_COUNTER_BYTES); nfct_attr_unset(ct, ATTR_ORIG_COUNTER_PACKETS); @@ -100,7 +103,7 @@ static void populate_stats(struct nf_conntrack *ct) cache_update_force(STATE_STATS(cache), ct); } -static int resync_stats(enum nf_conntrack_msg_type type, +static int stats_resync(enum nf_conntrack_msg_type type, struct nf_conntrack *ct, void *data) { @@ -125,23 +128,22 @@ static int purge_step(void *data1, void *data2) struct cache_object *obj = data2; STATE(get_retval) = 0; - nl_get_conntrack(STATE(get), obj->ct); /* modifies STATE(get_retval) */ + nl_get_conntrack(STATE(get), obj->ptr); /* modifies STATE(get_retval) */ if (!STATE(get_retval)) { cache_del(STATE_STATS(cache), obj); - dlog_ct(STATE(stats_log), obj->ct, NFCT_O_PLAIN); + dlog_ct(STATE(stats_log), obj->ptr, NFCT_O_PLAIN); cache_object_free(obj); } return 0; } -static void purge_stats(void) +static void stats_purge(void) { cache_iterate(STATE_STATS(cache), NULL, purge_step); } -static void -event_new_stats(struct nf_conntrack *ct, int origin) +static void stats_event_new(struct nf_conntrack *ct, int origin) { int id; struct cache_object *obj; @@ -162,15 +164,13 @@ event_new_stats(struct nf_conntrack *ct, int origin) return; } -static void -event_update_stats(struct nf_conntrack *ct, int origin) +static void stats_event_upd(struct nf_conntrack *ct, int origin) { nfct_attr_unset(ct, ATTR_TIMEOUT); cache_update_force(STATE_STATS(cache), ct); } -static int -event_destroy_stats(struct nf_conntrack *ct, int origin) +static int stats_event_del(struct nf_conntrack *ct, int origin) { int id; struct cache_object *obj; @@ -189,12 +189,14 @@ event_destroy_stats(struct nf_conntrack *ct, int origin) static struct internal_handler internal_cache_stats = { .flags = INTERNAL_F_POPULATE | INTERNAL_F_RESYNC, - .populate = populate_stats, - .resync = resync_stats, - .purge = purge_stats, - .new = event_new_stats, - .update = event_update_stats, - .destroy = event_destroy_stats + .ct = { + .populate = stats_populate, + .resync = stats_resync, + .purge = stats_purge, + .new = stats_event_new, + .upd = stats_event_upd, + .del = stats_event_del, + }, }; struct ct_mode stats_mode = { diff --git a/src/sync-alarm.c b/src/sync-alarm.c index 0fc7943..acaf5e6 100644 --- a/src/sync-alarm.c +++ b/src/sync-alarm.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -28,6 +29,7 @@ struct cache_alarm { struct queue_node qnode; + struct cache_object *obj; struct alarm_block alarm; }; @@ -41,7 +43,7 @@ static void refresher(struct alarm_block *a, void *data) random() % CONFIG(refresh) + 1, ((random() % 5 + 1) * 200000) - 1); - alarm_enqueue(obj, NET_T_STATE_UPD); + alarm_enqueue(obj, NET_T_STATE_CT_UPD); } static void cache_alarm_add(struct cache_object *obj, void *data) @@ -49,6 +51,7 @@ static void cache_alarm_add(struct cache_object *obj, void *data) struct cache_alarm *ca = data; queue_node_init(&ca->qnode, Q_ELEM_OBJ); + ca->obj = obj; init_alarm(&ca->alarm, obj, refresher); add_alarm(&ca->alarm, random() % CONFIG(refresh) + 1, @@ -109,9 +112,8 @@ static int alarm_recv(const struct nethdr *net) static void alarm_enqueue(struct cache_object *obj, int query) { - struct cache_alarm *ca = - cache_get_extra(STATE(mode)->internal->data, obj); - if (queue_add(STATE_SYNC(tx_queue), &ca->qnode)) + struct cache_alarm *ca = cache_get_extra(obj); + if (queue_add(STATE_SYNC(tx_queue), &ca->qnode) > 0) cache_object_get(obj); } @@ -131,15 +133,13 @@ static int tx_queue_xmit(struct queue_node *n, const void *data) break; case Q_ELEM_OBJ: { struct cache_alarm *ca; - struct cache_object *obj; int type; ca = (struct cache_alarm *)n; - obj = cache_data_get_object(STATE(mode)->internal->data, ca); - type = object_status_to_network_type(obj->status); - net = BUILD_NETMSG(obj->ct, type); + type = object_status_to_network_type(ca->obj); + net = ca->obj->cache->ops->build_msg(ca->obj, type); multichannel_send(STATE_SYNC(channel), net); - cache_object_put(obj); + cache_object_put(ca->obj); break; } } diff --git a/src/sync-ftfw.c b/src/sync-ftfw.c index 86edeab..1bc2d9f 100644 --- a/src/sync-ftfw.c +++ b/src/sync-ftfw.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2008 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -54,12 +55,14 @@ static int say_hello_back; struct cache_ftfw { struct queue_node qnode; + struct cache_object *obj; uint32_t seq; }; static void cache_ftfw_add(struct cache_object *obj, void *data) { struct cache_ftfw *cn = data; + cn->obj = obj; /* These nodes are not inserted in the list */ queue_node_init(&cn->qnode, Q_ELEM_OBJ); } @@ -107,7 +110,8 @@ static void tx_queue_add_ctlmsg(uint32_t flags, uint32_t from, uint32_t to) ack->from = from; ack->to = to; - queue_add(STATE_SYNC(tx_queue), &qobj->qnode); + if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) + queue_object_free(qobj); } static void tx_queue_add_ctlmsg2(uint32_t flags) @@ -123,7 +127,8 @@ static void tx_queue_add_ctlmsg2(uint32_t flags) ctl->type = NET_T_CTL; ctl->flags = flags; - queue_add(STATE_SYNC(tx_queue), &qobj->qnode); + if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) + queue_object_free(qobj); } /* this function is called from the alarm framework */ @@ -166,14 +171,13 @@ static void ftfw_kill(void) static int do_cache_to_tx(void *data1, void *data2) { struct cache_object *obj = data2; - struct cache_ftfw *cn = - cache_get_extra(STATE(mode)->internal->data, obj); + struct cache_ftfw *cn = cache_get_extra(obj); if (queue_in(rs_queue, &cn->qnode)) { queue_del(&cn->qnode); queue_add(STATE_SYNC(tx_queue), &cn->qnode); } else { - if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) + if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0) cache_object_get(obj); } return 0; @@ -225,7 +229,9 @@ static int ftfw_local(int fd, int type, void *data) break; case SEND_BULK: dlog(LOG_NOTICE, "sending bulk update"); - cache_iterate(STATE(mode)->internal->data, + cache_iterate(STATE(mode)->internal->ct.data, + NULL, do_cache_to_tx); + cache_iterate(STATE(mode)->internal->exp.data, NULL, do_cache_to_tx); break; case STATS_RSQUEUE: @@ -300,13 +306,11 @@ static int rs_queue_empty(struct queue_node *n, const void *data) } case Q_ELEM_OBJ: { struct cache_ftfw *cn; - struct cache_object *obj; cn = (struct cache_ftfw *) n; if (h == NULL) { queue_del(n); - obj = cache_data_get_object(STATE(mode)->internal->data, cn); - cache_object_put(obj); + cache_object_put(cn->obj); return 0; } if (before(cn->seq, h->from)) @@ -316,8 +320,7 @@ static int rs_queue_empty(struct queue_node *n, const void *data) dp("queue: deleting from queue (seq=%u)\n", cn->seq); queue_del(n); - obj = cache_data_get_object(STATE(mode)->internal->data, cn); - cache_object_put(obj); + cache_object_put(cn->obj); break; } } @@ -349,7 +352,10 @@ static int digest_msg(const struct nethdr *net) } else if (IS_RESYNC(net)) { dp("RESYNC ALL\n"); - cache_iterate(STATE(mode)->internal->data, NULL, do_cache_to_tx); + cache_iterate(STATE(mode)->internal->ct.data, NULL, + do_cache_to_tx); + cache_iterate(STATE(mode)->internal->exp.data, NULL, + do_cache_to_tx); return MSG_CTL; } else if (IS_ALIVE(net)) @@ -463,11 +469,9 @@ static void rs_queue_purge_full(void) } case Q_ELEM_OBJ: { struct cache_ftfw *cn; - struct cache_object *obj; cn = (struct cache_ftfw *)n; - obj = cache_data_get_object(STATE(mode)->internal->data, cn); - cache_object_put(obj); + cache_object_put(cn->obj); break; } } @@ -509,14 +513,12 @@ static int tx_queue_xmit(struct queue_node *n, const void *data) } case Q_ELEM_OBJ: { struct cache_ftfw *cn; - struct cache_object *obj; int type; struct nethdr *net; cn = (struct cache_ftfw *)n; - obj = cache_data_get_object(STATE(mode)->internal->data, cn); - type = object_status_to_network_type(obj->status); - net = BUILD_NETMSG(obj->ct, type); + type = object_status_to_network_type(cn->obj); + net = cn->obj->cache->ops->build_msg(cn->obj, type); nethdr_set_hello(net); dp("tx_list sq: %u fl:%u len:%u\n", @@ -548,13 +550,12 @@ static void ftfw_xmit(void) static void ftfw_enqueue(struct cache_object *obj, int type) { - struct cache_ftfw *cn = - cache_get_extra(STATE(mode)->internal->data, obj); + struct cache_ftfw *cn = cache_get_extra(obj); if (queue_in(rs_queue, &cn->qnode)) { queue_del(&cn->qnode); queue_add(STATE_SYNC(tx_queue), &cn->qnode); } else { - if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) + if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0) cache_object_get(obj); } } diff --git a/src/sync-mode.c b/src/sync-mode.c index ecc2f0d..2505631 100644 --- a/src/sync-mode.c +++ b/src/sync-mode.c @@ -1,6 +1,7 @@ /* - * (C) 2006-2007 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -40,11 +41,47 @@ #include <net/if.h> #include <fcntl.h> +static struct nf_conntrack *msg2ct_alloc(struct nethdr *net, size_t remain) +{ + struct nf_conntrack *ct; + + /* TODO: add stats on ENOMEM errors in the future. */ + ct = nfct_new(); + if (ct == NULL) + return NULL; + + if (msg2ct(ct, net, remain) == -1) { + STATE_SYNC(error).msg_rcv_malformed++; + STATE_SYNC(error).msg_rcv_bad_payload++; + nfct_destroy(ct); + return NULL; + } + return ct; +} + +static struct nf_expect *msg2exp_alloc(struct nethdr *net, size_t remain) +{ + struct nf_expect *exp; + + /* TODO: add stats on ENOMEM errors in the future. */ + exp = nfexp_new(); + if (exp == NULL) + return NULL; + + if (msg2exp(exp, net, remain) == -1) { + STATE_SYNC(error).msg_rcv_malformed++; + STATE_SYNC(error).msg_rcv_bad_payload++; + nfexp_destroy(exp); + return NULL; + } + return exp; +} + static void do_channel_handler_step(int i, struct nethdr *net, size_t remain) { - char __ct[nfct_maxsize()]; - struct nf_conntrack *ct = (struct nf_conntrack *)(void*) __ct; + struct nf_conntrack *ct = NULL; + struct nf_expect *exp = NULL; if (net->version != CONNTRACKD_PROTOCOL_VERSION) { STATE_SYNC(error).msg_rcv_malformed++; @@ -74,29 +111,53 @@ do_channel_handler_step(int i, struct nethdr *net, size_t remain) STATE_SYNC(error).msg_rcv_bad_type++; return; } - memset(ct, 0, sizeof(__ct)); - - if (parse_payload(ct, net, remain) == -1) { - STATE_SYNC(error).msg_rcv_malformed++; - STATE_SYNC(error).msg_rcv_bad_payload++; - return; - } switch(net->type) { - case NET_T_STATE_NEW: - STATE_SYNC(external)->new(ct); + case NET_T_STATE_CT_NEW: + ct = msg2ct_alloc(net, remain); + if (ct == NULL) + return; + STATE_SYNC(external)->ct.new(ct); + break; + case NET_T_STATE_CT_UPD: + ct = msg2ct_alloc(net, remain); + if (ct == NULL) + return; + STATE_SYNC(external)->ct.upd(ct); break; - case NET_T_STATE_UPD: - STATE_SYNC(external)->update(ct); + case NET_T_STATE_CT_DEL: + ct = msg2ct_alloc(net, remain); + if (ct == NULL) + return; + STATE_SYNC(external)->ct.del(ct); break; - case NET_T_STATE_DEL: - STATE_SYNC(external)->destroy(ct); + case NET_T_STATE_EXP_NEW: + exp = msg2exp_alloc(net, remain); + if (exp == NULL) + return; + STATE_SYNC(external)->exp.new(exp); + break; + case NET_T_STATE_EXP_UPD: + exp = msg2exp_alloc(net, remain); + if (exp == NULL) + return; + STATE_SYNC(external)->exp.upd(exp); + break; + case NET_T_STATE_EXP_DEL: + exp = msg2exp_alloc(net, remain); + if (exp == NULL) + return; + STATE_SYNC(external)->exp.del(exp); break; default: STATE_SYNC(error).msg_rcv_malformed++; STATE_SYNC(error).msg_rcv_bad_type++; break; } + if (ct != NULL) + nfct_destroy(ct); + if (exp != NULL) + nfexp_destroy(exp); } static char __net[65536]; /* XXX: maximum MTU for IPv4 */ @@ -247,7 +308,7 @@ static void do_reset_cache_alarm(struct alarm_block *a, void *data) exit(EXIT_SUCCESS); } /* this is not required if events don't get lost */ - STATE(mode)->internal->flush(); + STATE(mode)->internal->ct.flush(); } static int init_sync(void) @@ -330,7 +391,7 @@ static int init_sync(void) STATE(fds)) == -1) return -1; - STATE_SYNC(commit).h = nfct_open(CONNTRACK, 0); + STATE_SYNC(commit).h = nfct_open(CONFIG(netlink).subsys_id, 0); if (STATE_SYNC(commit).h == NULL) { dlog(LOG_ERR, "can't create handler to commit"); return -1; @@ -346,6 +407,7 @@ static int init_sync(void) STATE(fds)) == -1) { return -1; } + STATE_SYNC(commit).clientfd = -1; init_alarm(&STATE_SYNC(reset_cache_alarm), NULL, do_reset_cache_alarm); @@ -380,8 +442,30 @@ static void run_sync(fd_set *readfds) interface_handler(); if (FD_ISSET(get_read_evfd(STATE_SYNC(commit).evfd), readfds)) { + int ret; + read_evfd(STATE_SYNC(commit).evfd); - STATE_SYNC(external)->commit(STATE_SYNC(commit).h, 0); + + ret = STATE_SYNC(commit).rq[0].cb(STATE_SYNC(commit).h, 0); + if (ret == 0) { + /* we still have things in the callback queue. */ + if (STATE_SYNC(commit).rq[1].cb) { + int fd = STATE_SYNC(commit).clientfd; + + STATE_SYNC(commit).rq[0].cb = + STATE_SYNC(commit).rq[1].cb; + + STATE_SYNC(commit).rq[1].cb = NULL; + + STATE_SYNC(commit).clientfd = -1; + STATE_SYNC(commit).rq[0].cb( + STATE_SYNC(commit).h, fd); + } else { + /* Close the client socket now, we're done. */ + close(STATE_SYNC(commit).clientfd); + STATE_SYNC(commit).clientfd = -1; + } + } } /* flush pending messages */ @@ -414,9 +498,9 @@ static void dump_stats_sync(int fd) char buf[512]; int size; - size = sprintf(buf, "message sequence tracking:\n" - "%20llu Msgs mfrm " - "%20llu Msgs lost\n\n", + size = sprintf(buf, "message tracking:\n" + "%20llu Malformed msgs " + "%20llu Lost msgs\n\n", (unsigned long long)STATE_SYNC(error).msg_rcv_malformed, (unsigned long long)STATE_SYNC(error).msg_rcv_lost); @@ -458,48 +542,62 @@ static void dump_stats_sync_extended(int fd) send(fd, buf, size, 0); } +static int local_commit(int fd) +{ + int ret; + + /* delete the reset alarm if any before committing */ + del_alarm(&STATE_SYNC(reset_cache_alarm)); + + ret = STATE_SYNC(commit).rq[0].cb(STATE_SYNC(commit).h, fd); + if (ret == -1) { + dlog(LOG_NOTICE, "commit already in progress, skipping"); + ret = LOCAL_RET_OK; + } else if (ret == 0) { + /* we've finished the commit. */ + ret = LOCAL_RET_OK; + } else { + /* Keep open the client, we want synchronous commit. */ + ret = LOCAL_RET_STOLEN; + } + return ret; +} + /* handler for requests coming via UNIX socket */ static int local_handler_sync(int fd, int type, void *data) { int ret = LOCAL_RET_OK; switch(type) { - case DUMP_INTERNAL: - ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); - if (ret == 0) { - STATE(mode)->internal->dump(fd, NFCT_O_PLAIN); + case CT_DUMP_INTERNAL: + if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { + STATE(mode)->internal->ct.dump(fd, NFCT_O_PLAIN); exit(EXIT_SUCCESS); } break; - case DUMP_EXTERNAL: - ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); - if (ret == 0) { - STATE_SYNC(external)->dump(fd, NFCT_O_PLAIN); + case CT_DUMP_EXTERNAL: + if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { + STATE_SYNC(external)->ct.dump(fd, NFCT_O_PLAIN); exit(EXIT_SUCCESS); } break; - case DUMP_INT_XML: - ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); - if (ret == 0) { - STATE(mode)->internal->dump(fd, NFCT_O_XML); + case CT_DUMP_INT_XML: + if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { + STATE(mode)->internal->ct.dump(fd, NFCT_O_XML); exit(EXIT_SUCCESS); } break; - case DUMP_EXT_XML: - ret = fork_process_new(CTD_PROC_ANY, 0, NULL, NULL); - if (ret == 0) { - STATE_SYNC(external)->dump(fd, NFCT_O_XML); + case CT_DUMP_EXT_XML: + if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { + STATE_SYNC(external)->ct.dump(fd, NFCT_O_XML); exit(EXIT_SUCCESS); } break; - case COMMIT: - /* delete the reset alarm if any before committing */ - del_alarm(&STATE_SYNC(reset_cache_alarm)); - - dlog(LOG_NOTICE, "committing external cache"); - STATE_SYNC(external)->commit(STATE_SYNC(commit).h, fd); - /* Keep the client socket open, we want synchronous commits. */ - ret = LOCAL_RET_STOLEN; + case CT_COMMIT: + dlog(LOG_NOTICE, "committing conntrack cache"); + STATE_SYNC(commit).rq[0].cb = STATE_SYNC(external)->ct.commit; + STATE_SYNC(commit).rq[1].cb = NULL; + ret = local_commit(fd); break; case RESET_TIMERS: if (!alarm_pending(&STATE_SYNC(reset_cache_alarm))) { @@ -509,29 +607,29 @@ static int local_handler_sync(int fd, int type, void *data) CONFIG(purge_timeout), 0); } break; - case FLUSH_CACHE: + case CT_FLUSH_CACHE: /* inmediate flush, remove pending flush scheduled if any */ del_alarm(&STATE_SYNC(reset_cache_alarm)); dlog(LOG_NOTICE, "flushing caches"); - STATE(mode)->internal->flush(); - STATE_SYNC(external)->flush(); + STATE(mode)->internal->ct.flush(); + STATE_SYNC(external)->ct.flush(); break; - case FLUSH_INT_CACHE: + case CT_FLUSH_INT_CACHE: /* inmediate flush, remove pending flush scheduled if any */ del_alarm(&STATE_SYNC(reset_cache_alarm)); dlog(LOG_NOTICE, "flushing internal cache"); - STATE(mode)->internal->flush(); + STATE(mode)->internal->ct.flush(); break; - case FLUSH_EXT_CACHE: + case CT_FLUSH_EXT_CACHE: dlog(LOG_NOTICE, "flushing external cache"); - STATE_SYNC(external)->flush(); + STATE_SYNC(external)->ct.flush(); break; case KILL: killer(0); break; case STATS: - STATE(mode)->internal->stats(fd); - STATE_SYNC(external)->stats(fd); + STATE(mode)->internal->ct.stats(fd); + STATE_SYNC(external)->ct.stats(fd); dump_traffic_stats(fd); multichannel_stats(STATE_SYNC(channel), fd); dump_stats_sync(fd); @@ -541,8 +639,8 @@ static int local_handler_sync(int fd, int type, void *data) multichannel_stats(STATE_SYNC(channel), fd); break; case STATS_CACHE: - STATE(mode)->internal->stats_ext(fd); - STATE_SYNC(external)->stats_ext(fd); + STATE(mode)->internal->ct.stats_ext(fd); + STATE_SYNC(external)->ct.stats_ext(fd); break; case STATS_LINK: multichannel_stats_extended(STATE_SYNC(channel), @@ -551,6 +649,63 @@ static int local_handler_sync(int fd, int type, void *data) case STATS_QUEUE: queue_stats_show(fd); break; + case EXP_STATS: + if (!(CONFIG(flags) & CTD_EXPECT)) + break; + + STATE(mode)->internal->exp.stats(fd); + STATE_SYNC(external)->exp.stats(fd); + dump_traffic_stats(fd); + multichannel_stats(STATE_SYNC(channel), fd); + dump_stats_sync(fd); + break; + case EXP_DUMP_INTERNAL: + if (!(CONFIG(flags) & CTD_EXPECT)) + break; + + if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { + STATE(mode)->internal->exp.dump(fd, NFCT_O_PLAIN); + exit(EXIT_SUCCESS); + } + break; + case EXP_DUMP_EXTERNAL: + if (!(CONFIG(flags) & CTD_EXPECT)) + break; + + if (fork_process_new(CTD_PROC_ANY, 0, NULL, NULL) == 0) { + STATE_SYNC(external)->exp.dump(fd, NFCT_O_PLAIN); + exit(EXIT_SUCCESS); + } + break; + case EXP_COMMIT: + if (!(CONFIG(flags) & CTD_EXPECT)) + break; + + dlog(LOG_NOTICE, "committing expectation cache"); + STATE_SYNC(commit).rq[0].cb = STATE_SYNC(external)->exp.commit; + STATE_SYNC(commit).rq[1].cb = NULL; + local_commit(fd); + break; + case ALL_FLUSH_CACHE: + dlog(LOG_NOTICE, "flushing caches"); + STATE(mode)->internal->ct.flush(); + STATE_SYNC(external)->ct.flush(); + if (CONFIG(flags) & CTD_EXPECT) { + STATE(mode)->internal->exp.flush(); + STATE_SYNC(external)->exp.flush(); + } + break; + case ALL_COMMIT: + dlog(LOG_NOTICE, "committing all external caches"); + STATE_SYNC(commit).rq[0].cb = STATE_SYNC(external)->ct.commit; + if (CONFIG(flags) & CTD_EXPECT) { + STATE_SYNC(commit).rq[1].cb = + STATE_SYNC(external)->exp.commit; + } else { + STATE_SYNC(commit).rq[1].cb = NULL; + } + local_commit(fd); + break; default: if (STATE_SYNC(sync)->local) ret = STATE_SYNC(sync)->local(fd, type, data); diff --git a/src/sync-notrack.c b/src/sync-notrack.c index c4ad941..a7df4e7 100644 --- a/src/sync-notrack.c +++ b/src/sync-notrack.c @@ -1,6 +1,7 @@ /* - * (C) 2008 by Pablo Neira Ayuso <pablo@netfilter.org> - * + * (C) 2006-2011 by Pablo Neira Ayuso <pablo@netfilter.org> + * (C) 2011 by Vyatta Inc. <http://www.vyatta.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -33,12 +34,14 @@ static struct alarm_block alive_alarm; struct cache_notrack { struct queue_node qnode; + struct cache_object *obj; }; static void cache_notrack_add(struct cache_object *obj, void *data) { struct cache_notrack *cn = data; queue_node_init(&cn->qnode, Q_ELEM_OBJ); + cn->obj = obj; } static void cache_notrack_del(struct cache_object *obj, void *data) @@ -68,15 +71,15 @@ static void tx_queue_add_ctlmsg(uint32_t flags, uint32_t from, uint32_t to) ack->from = from; ack->to = to; - queue_add(STATE_SYNC(tx_queue), &qobj->qnode); + if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) + queue_object_free(qobj); } static int do_cache_to_tx(void *data1, void *data2) { struct cache_object *obj = data2; - struct cache_notrack *cn = - cache_get_extra(STATE(mode)->internal->data, obj); - if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) + struct cache_notrack *cn = cache_get_extra(obj); + if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0) cache_object_get(obj); return 0; } @@ -86,7 +89,7 @@ static int kernel_resync_cb(enum nf_conntrack_msg_type type, { struct nethdr *net; - net = BUILD_NETMSG(ct, NET_T_STATE_NEW); + net = BUILD_NETMSG_FROM_CT(ct, NET_T_STATE_CT_NEW); multichannel_send(STATE_SYNC(channel), net); return NFCT_CB_CONTINUE; @@ -99,7 +102,7 @@ static void kernel_resync(void) u_int32_t family = AF_UNSPEC; int ret; - h = nfct_open(CONNTRACK, 0); + h = nfct_open(CONFIG(netlink).subsys_id, 0); if (h == NULL) { dlog(LOG_ERR, "can't allocate memory for the internal cache"); return; @@ -126,7 +129,9 @@ static int notrack_local(int fd, int type, void *data) if (CONFIG(sync).internal_cache_disable) { kernel_resync(); } else { - cache_iterate(STATE(mode)->internal->data, + cache_iterate(STATE(mode)->internal->ct.data, + NULL, do_cache_to_tx); + cache_iterate(STATE(mode)->internal->exp.data, NULL, do_cache_to_tx); } break; @@ -147,7 +152,9 @@ static int digest_msg(const struct nethdr *net) if (CONFIG(sync).internal_cache_disable) { kernel_resync(); } else { - cache_iterate(STATE(mode)->internal->data, + cache_iterate(STATE(mode)->internal->ct.data, + NULL, do_cache_to_tx); + cache_iterate(STATE(mode)->internal->exp.data, NULL, do_cache_to_tx); } return MSG_CTL; @@ -190,19 +197,17 @@ static int tx_queue_xmit(struct queue_node *n, const void *data2) break; } case Q_ELEM_OBJ: { - struct cache_ftfw *cn; - struct cache_object *obj; + struct cache_notrack *cn; int type; struct nethdr *net; - cn = (struct cache_ftfw *)n; - obj = cache_data_get_object(STATE(mode)->internal->data, cn); - type = object_status_to_network_type(obj->status);; - net = BUILD_NETMSG(obj->ct, type); + cn = (struct cache_notrack *)n; + type = object_status_to_network_type(cn->obj); + net = cn->obj->cache->ops->build_msg(cn->obj, type); multichannel_send(STATE_SYNC(channel), net); queue_del(n); - cache_object_put(obj); + cache_object_put(cn->obj); break; } } @@ -217,9 +222,8 @@ static void notrack_xmit(void) static void notrack_enqueue(struct cache_object *obj, int query) { - struct cache_notrack *cn = - cache_get_extra(STATE(mode)->internal->data, obj); - if (queue_add(STATE_SYNC(tx_queue), &cn->qnode)) + struct cache_notrack *cn = cache_get_extra(obj); + if (queue_add(STATE_SYNC(tx_queue), &cn->qnode) > 0) cache_object_get(obj); } @@ -236,7 +240,8 @@ static void tx_queue_add_ctlmsg2(uint32_t flags) ctl->type = NET_T_CTL; ctl->flags = flags; - queue_add(STATE_SYNC(tx_queue), &qobj->qnode); + if (queue_add(STATE_SYNC(tx_queue), &qobj->qnode) < 0) + queue_object_free(qobj); } static void do_alive_alarm(struct alarm_block *a, void *data) |