aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in110
-rw-r--r--cachedb/cachedb.c1
-rwxr-xr-xconfigure316
-rw-r--r--configure.ac39
-rw-r--r--contrib/fastrpz.patch8
-rw-r--r--contrib/libunbound.pc.in3
-rw-r--r--contrib/unbound.service.in7
-rw-r--r--daemon/cachedump.c1
-rw-r--r--daemon/daemon.c41
-rw-r--r--daemon/daemon.h2
-rw-r--r--daemon/remote.c71
-rw-r--r--daemon/stats.c43
-rw-r--r--daemon/unbound.c7
-rw-r--r--daemon/worker.c166
-rw-r--r--dns64/dns64.c131
-rw-r--r--doc/Changelog249
-rw-r--r--doc/README4
-rw-r--r--doc/example.conf.in42
-rw-r--r--doc/libunbound.3.in4
-rw-r--r--doc/unbound-anchor.8.in7
-rw-r--r--doc/unbound-checkconf.8.in2
-rw-r--r--doc/unbound-control.8.in26
-rw-r--r--doc/unbound-host.1.in10
-rw-r--r--doc/unbound.8.in4
-rw-r--r--doc/unbound.conf.5.in103
-rw-r--r--edns-subnet/subnetmod.c12
-rw-r--r--edns-subnet/subnetmod.h4
-rw-r--r--ipsecmod/ipsecmod.c2
-rw-r--r--iterator/iter_delegpt.h2
-rw-r--r--iterator/iter_fwd.c7
-rw-r--r--iterator/iter_hints.c7
-rw-r--r--iterator/iter_utils.c26
-rw-r--r--iterator/iterator.c189
-rw-r--r--iterator/iterator.h3
-rw-r--r--libunbound/context.c34
-rw-r--r--libunbound/libworker.c58
-rw-r--r--libunbound/python/examples/dnssec_test.py1
-rw-r--r--libunbound/unbound-event.h2
-rw-r--r--libunbound/unbound.h13
-rw-r--r--libunbound/worker.h6
-rw-r--r--pythonmod/doc/examples/example6.rst61
-rw-r--r--pythonmod/examples/inplace_callbacks.py103
-rw-r--r--pythonmod/examples/resip.py20
-rw-r--r--pythonmod/interface.i17
-rw-r--r--pythonmod/pythonmod.h3
-rw-r--r--respip/respip.c5
-rw-r--r--services/authzone.c124
-rw-r--r--services/authzone.h20
-rw-r--r--services/cache/dns.c6
-rw-r--r--services/cache/dns.h12
-rw-r--r--services/cache/infra.c36
-rw-r--r--services/cache/rrset.c4
-rw-r--r--services/listen_dnsport.c15
-rw-r--r--services/listen_dnsport.h10
-rw-r--r--services/localzone.c128
-rw-r--r--services/mesh.c54
-rw-r--r--services/mesh.h10
-rw-r--r--services/outside_network.c66
-rw-r--r--sldns/rrdef.c7
-rw-r--r--sldns/rrdef.h4
-rw-r--r--smallapp/unbound-anchor.c66
-rw-r--r--smallapp/unbound-checkconf.c61
-rw-r--r--smallapp/unbound-control.c36
-rw-r--r--smallapp/unbound-host.c8
-rw-r--r--smallapp/worker_cb.c6
-rw-r--r--testcode/fake_event.c21
-rw-r--r--testcode/replay.h3
-rw-r--r--testcode/streamtcp.16
-rw-r--r--testcode/streamtcp.c26
-rw-r--r--testcode/unitauth.c16
-rw-r--r--testcode/unitldns.c20
-rw-r--r--testcode/unitmain.c3
-rw-r--r--testcode/unitmsgparse.c23
-rw-r--r--testcode/unitverify.c51
-rw-r--r--testdata/autotrust_init.rpl1
-rw-r--r--testdata/autotrust_init_ds.rpl1
-rw-r--r--testdata/autotrust_init_sigs.rpl1
-rw-r--r--testdata/autotrust_init_zsk.rpl1
-rw-r--r--testdata/black_data.rpl1
-rw-r--r--testdata/black_prime.rpl1
-rw-r--r--testdata/dlv_anchor.rpl1
-rw-r--r--testdata/dlv_ask_higher.rpl1
-rw-r--r--testdata/dlv_below_ta.rpl1
-rw-r--r--testdata/dlv_delegation.rpl1
-rw-r--r--testdata/dlv_insecure.rpl1
-rw-r--r--testdata/dlv_insecure_negcache.rpl1
-rw-r--r--testdata/dlv_remove_empty.rpl1
-rw-r--r--testdata/dlv_remove_nodel.rpl1
-rw-r--r--testdata/dlv_remove_pos.rpl1
-rw-r--r--testdata/dlv_unused.rpl1
-rw-r--r--testdata/dns64_lookup.rpl1
-rw-r--r--testdata/domain_insec_dlv.rpl1
-rw-r--r--testdata/edns_keepalive.rpl126
-rw-r--r--testdata/fetch_glue.rpl1
-rw-r--r--testdata/fetch_glue_cname.rpl1
-rw-r--r--testdata/fwd_cached.rpl2
-rw-r--r--testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf1
-rw-r--r--testdata/ipsecmod_enabled.crpl1
-rw-r--r--testdata/ipsecmod_ignore_bogus_ipseckey.crpl1
-rw-r--r--testdata/ipsecmod_max_ttl.crpl1
-rw-r--r--testdata/ipsecmod_strict.crpl1
-rw-r--r--testdata/ipsecmod_whitelist.crpl1
-rw-r--r--testdata/iter_class_any.rpl1
-rw-r--r--testdata/iter_cycle_noh.rpl1
-rw-r--r--testdata/iter_dname_insec.rpl1
-rw-r--r--testdata/iter_domain_sale.rpl1
-rw-r--r--testdata/iter_domain_sale_nschange.rpl1
-rw-r--r--testdata/iter_emptydp.rpl1
-rw-r--r--testdata/iter_emptydp_for_glue.rpl1
-rw-r--r--testdata/iter_fwdfirst.rpl1
-rw-r--r--testdata/iter_fwdfirstequal.rpl1
-rw-r--r--testdata/iter_fwdstub.rpl1
-rw-r--r--testdata/iter_fwdstubroot.rpl1
-rw-r--r--testdata/iter_got6only.rpl1
-rw-r--r--testdata/iter_hint_lame.rpl1
-rw-r--r--testdata/iter_lame_noaa.rpl1
-rw-r--r--testdata/iter_lame_nosoa.rpl1
-rw-r--r--testdata/iter_mod.rpl1
-rw-r--r--testdata/iter_ns_badip.rpl1
-rw-r--r--testdata/iter_ns_spoof.rpl1
-rw-r--r--testdata/iter_pc_a.rpl1
-rw-r--r--testdata/iter_pc_aaaa.rpl1
-rw-r--r--testdata/iter_pcdiff.rpl1
-rw-r--r--testdata/iter_pcdirect.rpl1
-rw-r--r--testdata/iter_pcname.rpl1
-rw-r--r--testdata/iter_pcnamech.rpl1
-rw-r--r--testdata/iter_pcnamechrec.rpl1
-rw-r--r--testdata/iter_pcnamerec.rpl1
-rw-r--r--testdata/iter_pcttl.rpl1
-rw-r--r--testdata/iter_prefetch.rpl1
-rw-r--r--testdata/iter_prefetch_change.rpl1
-rw-r--r--testdata/iter_prefetch_change2.rpl1
-rw-r--r--testdata/iter_prefetch_childns.rpl1
-rw-r--r--testdata/iter_prefetch_fail.rpl1
-rw-r--r--testdata/iter_prefetch_ns.rpl1
-rw-r--r--testdata/iter_primenoglue.rpl1
-rw-r--r--testdata/iter_privaddr.rpl1
-rw-r--r--testdata/iter_ranoaa_lame.rpl1
-rw-r--r--testdata/iter_reclame_one.rpl1
-rw-r--r--testdata/iter_reclame_two.rpl1
-rw-r--r--testdata/iter_recurse.rpl1
-rw-r--r--testdata/iter_resolve.rpl1
-rw-r--r--testdata/iter_resolve_minimised.rpl1
-rw-r--r--testdata/iter_resolve_minimised_nx.rpl1
-rw-r--r--testdata/iter_resolve_minimised_refused.rpl1
-rw-r--r--testdata/iter_resolve_minimised_timeout.rpl1
-rw-r--r--testdata/iter_scrub_cname_an.rpl1
-rw-r--r--testdata/iter_scrub_dname_insec.rpl1
-rw-r--r--testdata/iter_scrub_dname_rev.rpl1
-rw-r--r--testdata/iter_scrub_dname_sec.rpl1
-rw-r--r--testdata/iter_soamin.rpl1
-rw-r--r--testdata/iter_stub_leak.rpl1
-rw-r--r--testdata/iter_stub_noroot.rpl1
-rw-r--r--testdata/iter_stubfirst.rpl1
-rw-r--r--testdata/iter_timeout_ra_aaaa.rpl1
-rw-r--r--testdata/pylib.tdir/pylib.lookup.conf14
-rwxr-xr-xtestdata/pylib.tdir/pylib.lookup.py151
-rw-r--r--testdata/pylib.tdir/pylib.post4
-rw-r--r--testdata/pylib.tdir/pylib.pre13
-rw-r--r--testdata/pylib.tdir/pylib.py159
-rw-r--r--testdata/pylib.tdir/pylib.test48
-rw-r--r--testdata/rrset_rettl.rpl2
-rw-r--r--testdata/rrset_untrusted.rpl2
-rw-r--r--testdata/rrset_updated.rpl2
-rw-r--r--testdata/subnet_cached.crpl1
-rw-r--r--testdata/subnet_max_source.crpl1
-rw-r--r--testdata/subnet_val_positive.crpl1
-rw-r--r--testdata/subnet_val_positive_client.crpl1
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.conf (renamed from testdata/pylib.tdir/pylib.conf)11
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc16
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.post10
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre31
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.test42
-rw-r--r--testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns42
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf16
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc16
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post10
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre31
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test67
-rw-r--r--testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns42
-rw-r--r--testdata/trust_cname_chain.rpl1
-rw-r--r--testdata/ttl_max.rpl1
-rw-r--r--testdata/ttl_min.rpl1
-rw-r--r--testdata/val_adbit.rpl1
-rw-r--r--testdata/val_adcopy.rpl1
-rw-r--r--testdata/val_ds_afterprime.rpl1
-rw-r--r--testdata/val_faildnskey_ok.rpl1
-rw-r--r--testdata/val_keyprefetch_verify.rpl1
-rw-r--r--testdata/val_noadwhennodo.rpl1
-rw-r--r--testdata/val_nsec3_b3_optout.rpl1
-rw-r--r--testdata/val_nsec3_b3_optout_negcache.rpl1
-rw-r--r--testdata/val_positive.rpl1
-rw-r--r--testdata/val_qds_badanc.rpl1
-rw-r--r--testdata/val_qds_oneanc.rpl1
-rw-r--r--testdata/val_qds_twoanc.rpl1
-rw-r--r--testdata/val_referd.rpl1
-rw-r--r--testdata/val_referglue.rpl1
-rw-r--r--testdata/val_rrsig.rpl1
-rw-r--r--testdata/val_spurious_ns.rpl1
-rw-r--r--testdata/val_stub_noroot.rpl1
-rw-r--r--testdata/val_ta_algo_dnskey.rpl1
-rw-r--r--testdata/val_ta_algo_dnskey_dp.rpl1
-rw-r--r--testdata/val_ta_algo_missing_dp.rpl1
-rw-r--r--testdata/val_twocname.rpl1
-rw-r--r--testdata/val_unalgo_anchor.rpl1
-rw-r--r--testdata/val_unalgo_dlv.rpl1
-rw-r--r--testdata/val_wild_pos.rpl1
-rw-r--r--testdata/views.rpl1
-rw-r--r--util/config_file.c69
-rw-r--r--util/config_file.h33
-rw-r--r--util/configlexer.c5469
-rw-r--r--util/configlexer.lex11
-rw-r--r--util/configparser.c3481
-rw-r--r--util/configparser.h900
-rw-r--r--util/configparser.y135
-rw-r--r--util/data/msgparse.h2
-rw-r--r--util/data/msgreply.c41
-rw-r--r--util/data/msgreply.h23
-rw-r--r--util/edns.c83
-rw-r--r--util/edns.h62
-rw-r--r--util/iana_ports.inc2
-rw-r--r--util/module.c10
-rw-r--r--util/module.h42
-rw-r--r--util/net_help.c2
-rw-r--r--util/netevent.c59
-rw-r--r--util/netevent.h15
-rw-r--r--util/rtt.c3
-rw-r--r--util/storage/slabhash.c13
-rw-r--r--util/storage/slabhash.h9
-rw-r--r--util/tcp_conn_limit.c194
-rw-r--r--util/tcp_conn_limit.h130
-rw-r--r--validator/autotrust.c2
-rw-r--r--validator/autotrust.h2
-rw-r--r--validator/val_kcache.c2
-rw-r--r--validator/validator.c35
-rw-r--r--winrc/service.conf16
-rw-r--r--winrc/setup.nsi4
237 files changed, 8968 insertions, 5663 deletions
diff --git a/Makefile.in b/Makefile.in
index 4bdb7059dc0b..e8494484e2dd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -57,7 +57,7 @@ STRIP=@STRIP@
CC=@CC@
CPPFLAGS=-I. @CPPFLAGS@
PYTHON_CPPFLAGS=-I. @PYTHON_CPPFLAGS@
-CFLAGS=@CFLAGS@
+CFLAGS=-DSRCDIR=$(srcdir) @CFLAGS@
LDFLAGS=@LDFLAGS@
LIBS=@LIBS@
LIBOBJS=@LIBOBJS@
@@ -83,7 +83,7 @@ LINTFLAGS+=@NETBSD_LINTFLAGS@
# compat with OpenBSD
LINTFLAGS+="-Dsigset_t=long"
# FreeBSD
-LINTFLAGS+="-D__uint16_t=uint16_t" "-DEVP_PKEY_ASN1_METHOD=int" "-D_RuneLocale=int" "-D__va_list=va_list" "-D__uint32_t=uint32_t"
+LINTFLAGS+="-D__uint16_t=uint16_t" "-DEVP_PKEY_ASN1_METHOD=int" "-D_RuneLocale=int" "-D__va_list=va_list" "-D__uint32_t=uint32_t" "-D_Alignof(x)=x" "-D__aligned(x)=" "-D__requires_exclusive(x)=" "-D__requires_unlocked(x)=" "-D__locks_exclusive(x)=" "-D__trylocks_exclusive(x)=" "-D__unlocks(x)=" "-D__locks_shared(x)=" "-D__trylocks_shared(x)="
INSTALL=$(SHELL) $(srcdir)/install-sh
@@ -115,8 +115,9 @@ util/config_file.c util/configlexer.c util/configparser.c \
util/shm_side/shm_main.c services/authzone.c \
util/fptr_wlist.c util/locks.c util/log.c util/mini_event.c util/module.c \
util/netevent.c util/net_help.c util/random.c util/rbtree.c util/regional.c \
-util/rtt.c util/storage/dnstree.c util/storage/lookup3.c \
-util/storage/lruhash.c util/storage/slabhash.c util/timehist.c util/tube.c \
+util/rtt.c util/edns.c util/storage/dnstree.c util/storage/lookup3.c \
+util/storage/lruhash.c util/storage/slabhash.c util/tcp_conn_limit.c \
+util/timehist.c util/tube.c \
util/ub_event.c util/ub_event_pluggable.c util/winsock_event.c \
validator/autotrust.c validator/val_anchor.c validator/validator.c \
validator/val_kcache.c validator/val_kentry.c validator/val_neg.c \
@@ -131,9 +132,10 @@ as112.lo msgparse.lo msgreply.lo packed_rrset.lo iterator.lo iter_delegpt.lo \
iter_donotq.lo iter_fwd.lo iter_hints.lo iter_priv.lo iter_resptype.lo \
iter_scrub.lo iter_utils.lo localzone.lo mesh.lo modstack.lo view.lo \
outbound_list.lo alloc.lo config_file.lo configlexer.lo configparser.lo \
-fptr_wlist.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \
+fptr_wlist.lo edns.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \
random.lo rbtree.lo regional.lo rtt.lo dnstree.lo lookup3.lo lruhash.lo \
-slabhash.lo timehist.lo tube.lo winsock_event.lo autotrust.lo val_anchor.lo \
+slabhash.lo tcp_conn_limit.lo timehist.lo tube.lo winsock_event.lo \
+autotrust.lo val_anchor.lo \
validator.lo val_kcache.lo val_kentry.lo val_neg.lo val_nsec3.lo val_nsec.lo \
val_secalgo.lo val_sigcrypt.lo val_utils.lo dns64.lo cachedb.lo redis.lo authzone.lo \
$(SUBNET_OBJ) $(PYTHONMOD_OBJ) $(CHECKLOCK_OBJ) $(DNSTAP_OBJ) $(DNSCRYPT_OBJ) \
@@ -170,7 +172,8 @@ UNITTEST_OBJ_LINK=$(UNITTEST_OBJ) worker_cb.lo $(COMMON_OBJ) $(SLDNS_OBJ) \
$(COMPAT_OBJ)
DAEMON_SRC=daemon/acl_list.c daemon/cachedump.c daemon/daemon.c \
daemon/remote.c daemon/stats.c daemon/unbound.c daemon/worker.c @WIN_DAEMON_SRC@
-DAEMON_OBJ=acl_list.lo cachedump.lo daemon.lo shm_main.lo remote.lo stats.lo unbound.lo \
+DAEMON_OBJ=acl_list.lo cachedump.lo daemon.lo \
+shm_main.lo remote.lo stats.lo unbound.lo \
worker.lo @WIN_DAEMON_OBJ@
DAEMON_OBJ_LINK=$(DAEMON_OBJ) $(COMMON_OBJ_ALL_SYMBOLS) $(SLDNS_OBJ) \
$(COMPAT_OBJ) @WIN_DAEMON_OBJ_LINK@
@@ -190,7 +193,8 @@ UBANCHOR_OBJ=unbound-anchor.lo
UBANCHOR_OBJ_LINK=$(UBANCHOR_OBJ) parseutil.lo \
$(COMPAT_OBJ_WITHOUT_CTIME) @WIN_UBANCHOR_OBJ_LINK@
TESTBOUND_SRC=testcode/testbound.c testcode/testpkts.c \
-daemon/worker.c daemon/acl_list.c daemon/daemon.c daemon/stats.c \
+daemon/worker.c daemon/acl_list.c \
+daemon/daemon.c daemon/stats.c \
testcode/replay.c testcode/fake_event.c
TESTBOUND_OBJ=testbound.lo replay.lo fake_event.lo
TESTBOUND_OBJ_LINK=$(TESTBOUND_OBJ) testpkts.lo worker.lo acl_list.lo \
@@ -306,10 +310,11 @@ longcheck: longtest
test: unittest$(EXEEXT) testbound$(EXEEXT)
./unittest$(EXEEXT)
./testbound$(EXEEXT) -s
- for x in testdata/*.rpl; do echo -n "$$x "; if ./testbound$(EXEEXT) -p $$x >/dev/null 2>&1; then echo OK; else echo failed; exit 1; fi done
+ for x in $(srcdir)/testdata/*.rpl; do echo -n "$$x "; if ./testbound$(EXEEXT) -p $$x >/dev/null 2>&1; then echo OK; else echo failed; exit 1; fi done
@echo test OK
longtest: tests
+ if test ! $(srcdir)/testdata -ef ./testdata; then rm -rf testcode testdata; mkdir testcode testdata; cp -R $(srcdir)/testdata/*.sh $(srcdir)/testdata/*.tdir $(srcdir)/testdata/*.rpl $(srcdir)/testdata/*.crpl testdata; cp $(srcdir)/testcode/*.sh testcode; if test ! -d util; then mkdir util; fi; cp $(srcdir)/util/iana_ports.inc util; fi
if test -x "`which bash`"; then bash testcode/do-tests.sh; else sh testcode/do-tests.sh; fi
lib: libunbound.la unbound.h
@@ -587,7 +592,7 @@ iana_update:
DEPEND_TMP=depend1073.tmp
DEPEND_TMP2=depend1074.tmp
DEPEND_TARGET=Makefile
-DEPEND_TARGET2=Makefile.in
+DEPEND_TARGET2=$(srcdir)/Makefile.in
# actions: generate deplines from gcc,
# then, filter out home/xx, /usr/xx and /opt/xx lines (some cc already do this)
# then, remove empty " \" lines
@@ -595,7 +600,8 @@ DEPEND_TARGET2=Makefile.in
# then, remove srcdir from the (generated) parser and lexer.
# and mention the .lo
depend:
- (cd $(srcdir) ; $(CC) $(DEPFLAG) $(CPPFLAGS) $(CFLAGS) @PTHREAD_CFLAGS_ONLY@ $(ALL_SRC) $(COMPAT_SRC)) | \
+ (BUILDDIR=$$PWD; cd $(srcdir) ; $(CC) $(DEPFLAG) $(CPPFLAGS) $(CFLAGS) -I$$BUILDDIR @PTHREAD_CFLAGS_ONLY@ $(ALL_SRC) $(COMPAT_SRC)) | \
+ sed -e 's?'$$PWD'/config.h?config.h?g' | \
sed -e 's!'$$HOME'[^ ]* !!g' -e 's!'$$HOME'[^ ]*$$!!g' \
-e 's!/usr[^ ]* !!g' -e 's!/usr[^ ]*$$!!g' \
-e 's!/opt[^ ]* !!g' -e 's!/opt[^ ]*$$!!g' | \
@@ -763,7 +769,7 @@ mesh.lo mesh.o: $(srcdir)/services/mesh.c config.h $(srcdir)/services/mesh.h $(s
$(srcdir)/services/modstack.h $(srcdir)/services/outbound_list.h $(srcdir)/services/cache/dns.h \
$(srcdir)/util/net_help.h $(srcdir)/util/regional.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/timehist.h \
$(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/alloc.h $(srcdir)/util/config_file.h \
- $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/wire2str.h $(srcdir)/services/localzone.h \
+ $(srcdir)/util/edns.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/wire2str.h $(srcdir)/services/localzone.h \
$(srcdir)/util/storage/dnstree.h $(srcdir)/services/view.h $(srcdir)/util/data/dname.h $(srcdir)/respip/respip.h
modstack.lo modstack.o: $(srcdir)/services/modstack.c config.h $(srcdir)/services/modstack.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
@@ -793,10 +799,11 @@ outside_network.lo outside_network.o: $(srcdir)/services/outside_network.c confi
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h \
$(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rtt.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h \
- $(srcdir)/util/random.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/module.h $(srcdir)/util/tube.h \
- $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h $(srcdir)/sldns/sbuffer.h $(srcdir)/dnstap/dnstap.h \
+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
+ $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/random.h \
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/services/modstack.h \
+ $(srcdir)/sldns/sbuffer.h $(srcdir)/dnstap/dnstap.h \
alloc.lo alloc.o: $(srcdir)/util/alloc.c config.h $(srcdir)/util/alloc.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/testcode/checklocks.h $(srcdir)/util/regional.h $(srcdir)/util/data/packed_rrset.h \
@@ -880,10 +887,11 @@ module.lo module.o: $(srcdir)/util/module.c config.h $(srcdir)/util/module.h $(s
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/dnscrypt/cert.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
- $(srcdir)/testcode/checklocks.h $(srcdir)/util/ub_event.h $(srcdir)/util/net_help.h $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/testcode/checklocks.h $(srcdir)/util/ub_event.h $(srcdir)/util/net_help.h \
+ $(srcdir)/util/tcp_conn_limit.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/module.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h \
$(srcdir)/services/modstack.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/str2wire.h $(srcdir)/dnstap/dnstap.h \
\
@@ -902,7 +910,15 @@ rbtree.lo rbtree.o: $(srcdir)/util/rbtree.c config.h $(srcdir)/util/log.h $(srcd
$(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
$(srcdir)/services/modstack.h
regional.lo regional.o: $(srcdir)/util/regional.c config.h $(srcdir)/util/log.h $(srcdir)/util/regional.h
-rtt.lo rtt.o: $(srcdir)/util/rtt.c config.h $(srcdir)/util/rtt.h
+rtt.lo rtt.o: $(srcdir)/util/rtt.c config.h $(srcdir)/util/rtt.h $(srcdir)/iterator/iterator.h \
+ $(srcdir)/services/outbound_list.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h
+edns.lo edns.o: $(srcdir)/util/edns.c config.h $(srcdir)/util/config_file.h $(srcdir)/util/netevent.h \
+ $(srcdir)/dnscrypt/dnscrypt.h $(srcdir)/dnscrypt/cert.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h
dnstree.lo dnstree.o: $(srcdir)/util/storage/dnstree.c config.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/net_help.h
@@ -916,6 +932,12 @@ lruhash.lo lruhash.o: $(srcdir)/util/storage/lruhash.c config.h $(srcdir)/util/s
$(srcdir)/services/modstack.h
slabhash.lo slabhash.o: $(srcdir)/util/storage/slabhash.c config.h $(srcdir)/util/storage/slabhash.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h
+tcp_conn_limit.lo tcp_conn_limit.o: $(srcdir)/util/tcp_conn_limit.c config.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/log.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/util/tcp_conn_limit.h \
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/testcode/checklocks.h \
+ $(srcdir)/services/localzone.h $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/services/view.h $(srcdir)/sldns/str2wire.h
timehist.lo timehist.o: $(srcdir)/util/timehist.c config.h $(srcdir)/util/timehist.h $(srcdir)/util/log.h
tube.lo tube.o: $(srcdir)/util/tube.c config.h $(srcdir)/util/tube.h $(srcdir)/util/log.h $(srcdir)/util/net_help.h \
$(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
@@ -1030,7 +1052,8 @@ dns64.lo dns64.o: $(srcdir)/dns64/dns64.c config.h $(srcdir)/dns64/dns64.h $(src
$(srcdir)/util/storage/slabhash.h $(srcdir)/util/config_file.h $(srcdir)/util/fptr_wlist.h \
$(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/dnscrypt/cert.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
- $(srcdir)/services/modstack.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h
+ $(srcdir)/services/modstack.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/data/dname.h $(srcdir)/sldns/str2wire.h
edns-subnet.lo edns-subnet.o: $(srcdir)/edns-subnet/edns-subnet.c config.h \
$(srcdir)/edns-subnet/edns-subnet.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h
subnetmod.lo subnetmod.o: $(srcdir)/edns-subnet/subnetmod.c config.h $(srcdir)/edns-subnet/subnetmod.h \
@@ -1111,12 +1134,13 @@ unitmain.lo unitmain.o: $(srcdir)/testcode/unitmain.c config.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/keyraw.h \
$(srcdir)/util/log.h $(srcdir)/testcode/unitmain.h $(srcdir)/util/alloc.h $(srcdir)/util/locks.h \
$(srcdir)/testcode/checklocks.h $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/util/rtt.h \
- $(srcdir)/util/timehist.h $(srcdir)/libunbound/unbound.h $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/storage/lruhash.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/util/timehist.h $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/packed_rrset.h \
+ $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/libunbound/unbound.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
$(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
- $(srcdir)/dnscrypt/cert.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/random.h $(srcdir)/respip/respip.h $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h \
- $(srcdir)/sldns/pkthdr.h $(srcdir)/services/localzone.h $(srcdir)/services/view.h
+ $(srcdir)/dnscrypt/cert.h $(srcdir)/util/random.h $(srcdir)/respip/respip.h $(srcdir)/services/localzone.h \
+ $(srcdir)/services/view.h
unitmsgparse.lo unitmsgparse.o: $(srcdir)/testcode/unitmsgparse.c config.h $(srcdir)/util/log.h \
$(srcdir)/testcode/unitmain.h $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/locks.h $(srcdir)/testcode/checklocks.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
@@ -1194,10 +1218,10 @@ daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h \
$(srcdir)/daemon/remote.h \
$(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h \
$(srcdir)/util/config_file.h $(srcdir)/util/shm_side/shm_main.h $(srcdir)/util/storage/lookup3.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
- $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h \
- $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h $(srcdir)/util/tube.h \
- $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/util/tcp_conn_limit.h $(srcdir)/services/listen_dnsport.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
+ $(srcdir)/services/localzone.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h \
+ $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
remote.lo remote.o: $(srcdir)/daemon/remote.c config.h \
$(srcdir)/daemon/remote.h \
$(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
@@ -1256,10 +1280,10 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
$(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
$(srcdir)/util/rtt.h $(srcdir)/services/cache/dns.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h \
$(srcdir)/services/localzone.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
- $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h $(srcdir)/respip/respip.h \
- $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h $(srcdir)/libunbound/libworker.h \
- $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/edns.h $(srcdir)/iterator/iter_fwd.h \
+ $(srcdir)/iterator/iter_hints.h $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h \
+ $(srcdir)/respip/respip.h $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h \
+ $(srcdir)/libunbound/libworker.h $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
testbound.lo testbound.o: $(srcdir)/testcode/testbound.c config.h $(srcdir)/testcode/testpkts.h \
$(srcdir)/testcode/replay.h $(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/dnscrypt/cert.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
@@ -1290,10 +1314,10 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
$(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
$(srcdir)/util/rtt.h $(srcdir)/services/cache/dns.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h \
$(srcdir)/services/localzone.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
- $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h $(srcdir)/respip/respip.h \
- $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h $(srcdir)/libunbound/libworker.h \
- $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/edns.h $(srcdir)/iterator/iter_fwd.h \
+ $(srcdir)/iterator/iter_hints.h $(srcdir)/validator/autotrust.h $(srcdir)/validator/val_anchor.h \
+ $(srcdir)/respip/respip.h $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound-event.h \
+ $(srcdir)/libunbound/libworker.h $(srcdir)/sldns/wire2str.h $(srcdir)/util/shm_side/shm_main.h
acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/regional.h $(srcdir)/util/config_file.h \
@@ -1311,10 +1335,10 @@ daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h \
$(srcdir)/daemon/remote.h \
$(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h \
$(srcdir)/util/config_file.h $(srcdir)/util/shm_side/shm_main.h $(srcdir)/util/storage/lookup3.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
- $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h \
- $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h $(srcdir)/util/tube.h \
- $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/util/tcp_conn_limit.h $(srcdir)/services/listen_dnsport.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
+ $(srcdir)/services/localzone.h $(srcdir)/services/authzone.h $(srcdir)/services/mesh.h $(srcdir)/util/random.h \
+ $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h $(srcdir)/respip/respip.h
stats.lo stats.o: $(srcdir)/daemon/stats.c config.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h \
$(srcdir)/libunbound/unbound.h $(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c
index a6a609dcb68d..5a179a2bb419 100644
--- a/cachedb/cachedb.c
+++ b/cachedb/cachedb.c
@@ -446,6 +446,7 @@ adjust_msg_ttl(struct dns_msg* msg, time_t adjust)
msg->rep->ttl -= adjust;
else msg->rep->ttl = 0;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
for(i=0; i<msg->rep->rrset_count; i++) {
packed_rrset_ttl_subtract((struct packed_rrset_data*)msg->
diff --git a/configure b/configure
index 7163bb967733..d2bdbef84e7a 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for unbound 1.7.3.
+# Generated by GNU Autoconf 2.69 for unbound 1.8.0.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.7.3'
-PACKAGE_STRING='unbound 1.7.3'
+PACKAGE_VERSION='1.8.0'
+PACKAGE_STRING='unbound 1.8.0'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl'
PACKAGE_URL=''
@@ -670,9 +670,6 @@ SYSTEMD_DAEMON_LIBS
SYSTEMD_DAEMON_CFLAGS
SYSTEMD_LIBS
SYSTEMD_CFLAGS
-PKG_CONFIG_LIBDIR
-PKG_CONFIG_PATH
-PKG_CONFIG
staticexe
PC_LIBEVENT_DEPENDENCY
UNBOUND_EVENT_UNINSTALL
@@ -697,6 +694,9 @@ swig
SWIG_LIB
SWIG
PC_PY_DEPENDENCY
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
PY_MAJOR_VERSION
PYTHON_SITE_PKG
PYTHON_LDFLAGS
@@ -1440,7 +1440,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.7.3 to adapt to many kinds of systems.
+\`configure' configures unbound 1.8.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1505,7 +1505,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.7.3:";;
+ short | recursive ) echo "Configuration of unbound 1.8.0:";;
esac
cat <<\_ACEOF
@@ -1722,7 +1722,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.7.3
+unbound configure 1.8.0
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2431,7 +2431,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.7.3, which was
+It was created by unbound $as_me 1.8.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2781,14 +2781,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
UNBOUND_VERSION_MAJOR=1
-UNBOUND_VERSION_MINOR=7
+UNBOUND_VERSION_MINOR=8
-UNBOUND_VERSION_MICRO=3
+UNBOUND_VERSION_MICRO=0
-LIBUNBOUND_CURRENT=7
-LIBUNBOUND_REVISION=11
-LIBUNBOUND_AGE=5
+LIBUNBOUND_CURRENT=8
+LIBUNBOUND_REVISION=0
+LIBUNBOUND_AGE=0
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
# 1.0.2 had 0:14:0
@@ -2850,6 +2850,7 @@ LIBUNBOUND_AGE=5
# 1.7.1 had 7:9:5
# 1.7.2 had 7:10:5
# 1.7.3 had 7:11:5
+# 1.7.4 had 8:0:0 # changes the event callback function signature
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -6273,6 +6274,8 @@ fi
+
+
for ac_prog in flex lex
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -6432,6 +6435,7 @@ fi
rm -f conftest.l $LEX_OUTPUT_ROOT.c
fi
+if test "$LEX" != "" -a "$LEX" != ":"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yylex_destroy" >&5
$as_echo_n "checking for yylex_destroy... " >&6; }
@@ -6442,8 +6446,27 @@ $as_echo "#define LEX_HAS_YYLEX_DESTROY 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }; fi
+$as_echo "no" >&6; };
+ LEX=":"
+ fi
+
+fi
+if test "$LEX" != "" -a "$LEX" != ":"; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lex %option" >&5
+$as_echo_n "checking for lex %option... " >&6; }
+ if cat <<EOF | $LEX -t 2>&1 | grep yy_delete_buffer >/dev/null 2>&1; then
+%option nounput
+%%
+EOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; };
+ LEX=":"
+ fi
+fi
for ac_prog in 'bison -y' byacc
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -16929,7 +16952,136 @@ $as_echo "#define HAVE_PYTHON 1" >>confdefs.h
CPPFLAGS="$PYTHON_CPPFLAGS"
fi
ub_have_python=yes
- PC_PY_DEPENDENCY="python"
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}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 ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $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
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # 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 ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $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
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\"python\${PY_MAJOR_VERSION}\"\""; } >&5
+ ($PKG_CONFIG --exists --print-errors ""python${PY_MAJOR_VERSION}"") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ PC_PY_DEPENDENCY="python${PY_MAJOR_VERSION}"
+else
+ PC_PY_DEPENDENCY="python"
+fi
# Check for SWIG
@@ -18870,10 +19022,10 @@ else
withval="no"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libhiredis" >&5
-$as_echo_n "checking for libhiredis... " >&6; }
found_libhiredis="no"
if test x_$withval = x_yes -o x_$withval != x_no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libhiredis" >&5
+$as_echo_n "checking for libhiredis... " >&6; }
if test x_$withval = x_ -o x_$withval = x_yes; then
withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
fi
@@ -18959,126 +19111,6 @@ else
fi
have_systemd=no
-
-
-
-
-
-
-
-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}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 ${ac_cv_path_PKG_CONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $PKG_CONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
- ;;
- *)
- 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
- $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
-
- ;;
-esac
-fi
-PKG_CONFIG=$ac_cv_path_PKG_CONFIG
-if test -n "$PKG_CONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
-$as_echo "$PKG_CONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_path_PKG_CONFIG"; then
- ac_pt_PKG_CONFIG=$PKG_CONFIG
- # 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 ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $ac_pt_PKG_CONFIG in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
- ;;
- *)
- 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
- $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
-
- ;;
-esac
-fi
-ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
-if test -n "$ac_pt_PKG_CONFIG"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
-$as_echo "$ac_pt_PKG_CONFIG" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_pt_PKG_CONFIG" = x; then
- PKG_CONFIG=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- PKG_CONFIG=$ac_pt_PKG_CONFIG
- fi
-else
- PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
-fi
-
-fi
-if test -n "$PKG_CONFIG"; then
- _pkg_min_version=0.9.0
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
-$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
- if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- PKG_CONFIG=""
- fi
-fi
if test "x$enable_systemd" != xno; then :
@@ -21045,7 +21077,7 @@ _ACEOF
-version=1.7.3
+version=1.8.0
date=`date +'%b %e, %Y'`
@@ -21564,7 +21596,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.7.3, which was
+This file was extended by unbound $as_me 1.8.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -21630,7 +21662,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-unbound config.status 1.7.3
+unbound config.status 1.8.0
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 80fed29a7bc9..ca98b5459917 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,16 +10,16 @@ sinclude(dnscrypt/dnscrypt.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
-m4_define([VERSION_MINOR],[7])
-m4_define([VERSION_MICRO],[3])
+m4_define([VERSION_MINOR],[8])
+m4_define([VERSION_MICRO],[0])
AC_INIT(unbound, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), unbound-bugs@nlnetlabs.nl, unbound)
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
-LIBUNBOUND_CURRENT=7
-LIBUNBOUND_REVISION=11
-LIBUNBOUND_AGE=5
+LIBUNBOUND_CURRENT=8
+LIBUNBOUND_REVISION=0
+LIBUNBOUND_AGE=0
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
# 1.0.2 had 0:14:0
@@ -81,6 +81,7 @@ LIBUNBOUND_AGE=5
# 1.7.1 had 7:9:5
# 1.7.2 had 7:10:5
# 1.7.3 had 7:11:5
+# 1.7.4 had 8:0:0 # changes the event callback function signature
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -323,11 +324,30 @@ AC_DEFUN([ACX_YYLEX_DESTROY], [
if echo %% | $LEX -t 2>&1 | grep yylex_destroy >/dev/null 2>&1; then
AC_DEFINE(LEX_HAS_YYLEX_DESTROY, 1, [if lex has yylex_destroy])
AC_MSG_RESULT(yes)
- else AC_MSG_RESULT(no); fi
+ else AC_MSG_RESULT(no);
+ LEX=":"
+ fi
+])
+
+AC_DEFUN([ACX_YYLEX_OPTION], [
+ AC_MSG_CHECKING([for lex %option])
+ if cat <<EOF | $LEX -t 2>&1 | grep yy_delete_buffer >/dev/null 2>&1; then
+%option nounput
+%%
+EOF
+ AC_MSG_RESULT(yes)
+ else AC_MSG_RESULT(no);
+ LEX=":"
+ fi
])
AC_PROG_LEX
+if test "$LEX" != "" -a "$LEX" != ":"; then
ACX_YYLEX_DESTROY
+fi
+if test "$LEX" != "" -a "$LEX" != ":"; then
+ACX_YYLEX_OPTION
+fi
AC_PROG_YACC
AC_CHECK_PROG(doxygen, doxygen, doxygen)
AC_CHECK_TOOL(STRIP, strip)
@@ -585,7 +605,10 @@ if test x_$ub_test_python != x_no; then
CPPFLAGS="$PYTHON_CPPFLAGS"
fi
ub_have_python=yes
- PC_PY_DEPENDENCY="python"
+ PKG_PROG_PKG_CONFIG
+ PKG_CHECK_EXISTS(["python${PY_MAJOR_VERSION}"],
+ [PC_PY_DEPENDENCY="python${PY_MAJOR_VERSION}"],
+ [PC_PY_DEPENDENCY="python"])
AC_SUBST(PC_PY_DEPENDENCY)
# Check for SWIG
@@ -1177,9 +1200,9 @@ AC_CHECK_DECLS([XML_StopParser], [], [], [AC_INCLUDES_DEFAULT
AC_ARG_WITH(libhiredis, AC_HELP_STRING([--with-libhiredis=path],
[specify explicit path for libhiredis.]),
[ ],[ withval="no" ])
-AC_MSG_CHECKING(for libhiredis)
found_libhiredis="no"
if test x_$withval = x_yes -o x_$withval != x_no; then
+ AC_MSG_CHECKING(for libhiredis)
if test x_$withval = x_ -o x_$withval = x_yes; then
withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
fi
diff --git a/contrib/fastrpz.patch b/contrib/fastrpz.patch
index d5edc322405c..b80eeb2bb927 100644
--- a/contrib/fastrpz.patch
+++ b/contrib/fastrpz.patch
@@ -274,10 +274,10 @@ Index: unbound-1.7.0~rc1/doc/unbound.conf.5.in
===================================================================
--- unbound-1.7.0~rc1.orig/doc/unbound.conf.5.in
+++ unbound-1.7.0~rc1/doc/unbound.conf.5.in
-@@ -1581,6 +1581,81 @@ It must be /96 or shorter. The default
- .B dns64\-synthall: \fI<yes or no>\fR
- Debug option, default no. If enabled, synthesize all AAAA records
- despite the presence of actual AAAA records.
+@@ -1705,6 +1705,81 @@ It must be /96 or shorter. The default
+ used by dns64 processing instead. Can be entered multiple times, list a
+ new domain for which it applies, one per line. Applies also to names
+ underneath the name given.
+.SS "Response Policy Zone Rewriting"
+.LP
+Response policy zone rewriting is controlled with the
diff --git a/contrib/libunbound.pc.in b/contrib/libunbound.pc.in
index 0cb9f875a7f2..810c571343a4 100644
--- a/contrib/libunbound.pc.in
+++ b/contrib/libunbound.pc.in
@@ -7,7 +7,8 @@ Name: unbound
Description: Library with validating, recursive, and caching DNS resolver
URL: http://www.unbound.net
Version: @PACKAGE_VERSION@
-Requires: @PC_LIBEVENT_DEPENDENCY@ @PC_PY_DEPENDENCY@
+Requires: libcrypto libssl @PC_LIBEVENT_DEPENDENCY@
+Requires.private: @PC_PY_DEPENDENCY@
Libs: -L${libdir} -lunbound -lssl -lcrypto
Libs.private: @SSLLIB@ @LIBS@
Cflags: -I${includedir}
diff --git a/contrib/unbound.service.in b/contrib/unbound.service.in
index b3856690a4ca..95976dd9425a 100644
--- a/contrib/unbound.service.in
+++ b/contrib/unbound.service.in
@@ -1,6 +1,9 @@
[Unit]
Description=Validating, recursive, and caching DNS resolver
Documentation=man:unbound(8)
+After=network.target
+Before=network-online.target nss-lookup.target
+Wants=nss-lookup.target
[Install]
WantedBy=multi-user.target
@@ -10,7 +13,7 @@ ExecReload=/bin/kill -HUP $MAINPID
ExecStart=@UNBOUND_SBIN_DIR@/unbound
NotifyAccess=main
Type=notify
-CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_CHROOT
+CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_SYS_RESOURCE
MemoryDenyWriteExecute=true
NoNewPrivileges=true
PrivateDevices=true
@@ -21,7 +24,7 @@ ProtectKernelModules=true
ProtectKernelTunables=true
ProtectSystem=strict
ReadWritePaths=@UNBOUND_SYSCONF_DIR@ @UNBOUND_LOCALSTATE_DIR@ /run @UNBOUND_RUN_DIR@
-RestrictAddressFamilies=AF_INET AF_UNIX
+RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
RestrictRealtime=true
SystemCallArchitectures=native
SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module mount @obsolete @resources
diff --git a/daemon/cachedump.c b/daemon/cachedump.c
index 5a72e9d1106f..b1ce53b596b6 100644
--- a/daemon/cachedump.c
+++ b/daemon/cachedump.c
@@ -653,6 +653,7 @@ load_msg(RES* ssl, sldns_buffer* buf, struct worker* worker)
rep.qdcount = (uint16_t)qdcount;
rep.ttl = (time_t)ttl;
rep.prefetch_ttl = PREFETCH_TTL_CALC(rep.ttl);
+ rep.serve_expired_ttl = rep.ttl + SERVE_EXPIRED_TTL;
rep.security = (enum sec_status)security;
if(an > RR_COUNT_MAX || ns > RR_COUNT_MAX || ar > RR_COUNT_MAX) {
log_warn("error too many rrsets");
diff --git a/daemon/daemon.c b/daemon/daemon.c
index 6820e1181451..a6bfe390271e 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -76,6 +76,7 @@
#include "util/shm_side/shm_main.h"
#include "util/storage/lookup3.h"
#include "util/storage/slabhash.h"
+#include "util/tcp_conn_limit.h"
#include "services/listen_dnsport.h"
#include "services/cache/rrset.h"
#include "services/cache/infra.h"
@@ -104,10 +105,8 @@ static int sig_record_reload = 0;
/** cleaner ssl memory freeup */
static void* comp_meth = NULL;
#endif
-#ifdef LEX_HAS_YYLEX_DESTROY
/** remove buffers for parsing and init */
int ub_c_lex_destroy(void);
-#endif
/** used when no other sighandling happens, so we don't die
* when multiple signals in quick succession are sent to us.
@@ -182,15 +181,8 @@ static void
signal_handling_playback(struct worker* wrk)
{
#ifdef SIGHUP
- if(sig_record_reload) {
-# ifdef HAVE_SYSTEMD
- sd_notify(0, "RELOADING=1");
-# endif
+ if(sig_record_reload)
worker_sighandler(SIGHUP, wrk);
-# ifdef HAVE_SYSTEMD
- sd_notify(0, "READY=1");
-# endif
- }
#endif
if(sig_record_quit)
worker_sighandler(SIGTERM, wrk);
@@ -279,11 +271,20 @@ daemon_init(void)
free(daemon);
return NULL;
}
+ daemon->tcl = tcl_list_create();
+ if(!daemon->tcl) {
+ acl_list_delete(daemon->acl);
+ edns_known_options_delete(daemon->env);
+ free(daemon->env);
+ free(daemon);
+ return NULL;
+ }
if(gettimeofday(&daemon->time_boot, NULL) < 0)
log_err("gettimeofday: %s", strerror(errno));
daemon->time_last_stat = daemon->time_boot;
if((daemon->env->auth_zones = auth_zones_create()) == 0) {
acl_list_delete(daemon->acl);
+ tcl_list_delete(daemon->tcl);
edns_known_options_delete(daemon->env);
free(daemon->env);
free(daemon);
@@ -584,6 +585,8 @@ daemon_fork(struct daemon* daemon)
if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->views))
fatal_exit("Could not setup access control list");
+ if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg))
+ fatal_exit("Could not setup TCP connection limits");
if(daemon->cfg->dnscrypt) {
#ifdef USE_DNSCRYPT
daemon->dnscenv = dnsc_create();
@@ -657,12 +660,18 @@ daemon_fork(struct daemon* daemon)
/* Start resolver service on main thread. */
#ifdef HAVE_SYSTEMD
- sd_notify(0, "READY=1");
+ if(daemon->cfg->use_systemd)
+ sd_notify(0, "READY=1");
#endif
log_info("start of service (%s).", PACKAGE_STRING);
worker_work(daemon->workers[0]);
#ifdef HAVE_SYSTEMD
- sd_notify(0, "STOPPING=1");
+ if(daemon->cfg->use_systemd) {
+ if (daemon->workers[0]->need_to_exit)
+ sd_notify(0, "STOPPING=1");
+ else
+ sd_notify(0, "RELOADING=1");
+ }
#endif
log_info("service stopped (%s).", PACKAGE_STRING);
@@ -738,6 +747,7 @@ daemon_delete(struct daemon* daemon)
ub_randfree(daemon->rand);
alloc_clear(&daemon->superalloc);
acl_list_delete(daemon->acl);
+ tcl_list_delete(daemon->tcl);
free(daemon->chroot);
free(daemon->pidfile);
free(daemon->env);
@@ -746,10 +756,8 @@ daemon_delete(struct daemon* daemon)
SSL_CTX_free((SSL_CTX*)daemon->connect_sslctx);
#endif
free(daemon);
-#ifdef LEX_HAS_YYLEX_DESTROY
/* lex cleanup */
ub_c_lex_destroy();
-#endif
/* libcrypto cleanup */
#ifdef HAVE_SSL
# if defined(USE_GOST) && defined(HAVE_LDNS_KEY_EVP_UNLOAD_GOST)
@@ -800,9 +808,8 @@ void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg)
{
daemon->cfg = cfg;
config_apply(cfg);
- if(!daemon->env->msg_cache ||
- cfg->msg_cache_size != slabhash_get_size(daemon->env->msg_cache) ||
- cfg->msg_cache_slabs != daemon->env->msg_cache->size) {
+ if(!slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
+ cfg->msg_cache_slabs)) {
slabhash_delete(daemon->env->msg_cache);
daemon->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
HASH_DEFAULT_STARTARRAY, cfg->msg_cache_size,
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 031e05da3433..5749dbef8fbf 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -113,6 +113,8 @@ struct daemon {
struct module_stack mods;
/** access control, which client IPs are allowed to connect */
struct acl_list* acl;
+ /** TCP connection limit, limit connections from client IPs */
+ struct tcl_list* tcl;
/** local authority zones */
struct local_zones* local_zones;
/** last time of statistics printout */
diff --git a/daemon/remote.c b/daemon/remote.c
index 011c55e659f2..91e5609f50f8 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -966,6 +966,8 @@ print_ext(RES* ssl, struct ub_stats_info* s)
(unsigned long)s->svr.qtcp)) return 0;
if(!ssl_printf(ssl, "num.query.tcpout"SQ"%lu\n",
(unsigned long)s->svr.qtcp_outgoing)) return 0;
+ if(!ssl_printf(ssl, "num.query.tls"SQ"%lu\n",
+ (unsigned long)s->svr.qtls)) return 0;
if(!ssl_printf(ssl, "num.query.ipv6"SQ"%lu\n",
(unsigned long)s->svr.qipv6)) return 0;
/* flags */
@@ -1050,6 +1052,12 @@ print_ext(RES* ssl, struct ub_stats_info* s)
(unsigned long)s->svr.num_query_authzone_up)) return 0;
if(!ssl_printf(ssl, "num.query.authzone.down"SQ"%lu\n",
(unsigned long)s->svr.num_query_authzone_down)) return 0;
+#ifdef CLIENT_SUBNET
+ if(!ssl_printf(ssl, "num.query.subnet"SQ"%lu\n",
+ (unsigned long)s->svr.num_query_subnet)) return 0;
+ if(!ssl_printf(ssl, "num.query.subnet_cache"SQ"%lu\n",
+ (unsigned long)s->svr.num_query_subnet_cache)) return 0;
+#endif /* CLIENT_SUBNET */
return 1;
}
@@ -1625,6 +1633,7 @@ zone_del_msg(struct lruhash_entry* e, void* arg)
if(d->ttl > inf->expired) {
d->ttl = inf->expired;
d->prefetch_ttl = inf->expired;
+ d->serve_expired_ttl = inf->expired;
inf->num_msgs++;
}
}
@@ -1948,6 +1957,11 @@ parse_delegpt(RES* ssl, char* args, uint8_t* nm, int allow_names)
return NULL;
}
} else {
+#ifndef HAVE_SSL_SET1_HOST
+ if(auth_name)
+ log_err("no name verification functionality in "
+ "ssl library, ignored name for %s", todo);
+#endif
/* add address */
if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
auth_name)) {
@@ -2416,6 +2430,57 @@ do_log_reopen(RES* ssl, struct worker* worker)
log_init(cfg->logfile, cfg->use_syslog, cfg->chrootdir);
}
+/** do the auth_zone_reload command */
+static void
+do_auth_zone_reload(RES* ssl, struct worker* worker, char* arg)
+{
+ size_t nmlen;
+ int nmlabs;
+ uint8_t* nm = NULL;
+ struct auth_zones* az = worker->env.auth_zones;
+ struct auth_zone* z = NULL;
+ if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
+ return;
+ if(az) {
+ lock_rw_rdlock(&az->lock);
+ z = auth_zone_find(az, nm, nmlen, LDNS_RR_CLASS_IN);
+ if(z) {
+ lock_rw_wrlock(&z->lock);
+ }
+ lock_rw_unlock(&az->lock);
+ }
+ free(nm);
+ if(!z) {
+ (void)ssl_printf(ssl, "error no auth-zone %s\n", arg);
+ return;
+ }
+ if(!auth_zone_read_zonefile(z)) {
+ lock_rw_unlock(&z->lock);
+ (void)ssl_printf(ssl, "error failed to read %s\n", arg);
+ return;
+ }
+ lock_rw_unlock(&z->lock);
+ send_ok(ssl);
+}
+
+/** do the auth_zone_transfer command */
+static void
+do_auth_zone_transfer(RES* ssl, struct worker* worker, char* arg)
+{
+ size_t nmlen;
+ int nmlabs;
+ uint8_t* nm = NULL;
+ struct auth_zones* az = worker->env.auth_zones;
+ if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
+ return;
+ if(!az || !auth_zones_startprobesequence(az, &worker->env, nm, nmlen,
+ LDNS_RR_CLASS_IN)) {
+ (void)ssl_printf(ssl, "error zone xfr task not found %s\n", arg);
+ return;
+ }
+ send_ok(ssl);
+}
+
/** do the set_option command */
static void
do_set_option(RES* ssl, struct worker* worker, char* arg)
@@ -2806,6 +2871,12 @@ execute_cmd(struct daemon_remote* rc, RES* ssl, char* cmd,
} else if(cmdcmp(p, "list_auth_zones", 15)) {
do_list_auth_zones(ssl, worker->env.auth_zones);
return;
+ } else if(cmdcmp(p, "auth_zone_reload", 16)) {
+ do_auth_zone_reload(ssl, worker, skipwhite(p+16));
+ return;
+ } else if(cmdcmp(p, "auth_zone_transfer", 18)) {
+ do_auth_zone_transfer(ssl, worker, skipwhite(p+18));
+ return;
} else if(cmdcmp(p, "stub_add", 8)) {
/* must always distribute this cmd */
if(rc) distribute_cmd(rc, ssl, cmd);
diff --git a/daemon/stats.c b/daemon/stats.c
index 6f4feaaad9d0..cff01d90342f 100644
--- a/daemon/stats.c
+++ b/daemon/stats.c
@@ -63,6 +63,9 @@
#include "services/authzone.h"
#include "validator/val_kcache.h"
#include "validator/val_neg.h"
+#ifdef CLIENT_SUBNET
+#include "edns-subnet/subnetmod.h"
+#endif
/** add timers and the values do not overflow or become negative */
static void
@@ -124,6 +127,33 @@ void server_stats_log(struct ub_server_stats* stats, struct worker* worker,
(unsigned)worker->env.mesh->stats_jostled);
}
+
+#ifdef CLIENT_SUBNET
+/** Set the EDNS Subnet stats. */
+static void
+set_subnet_stats(struct worker* worker, struct ub_server_stats* svr,
+ int reset)
+{
+ int m = modstack_find(&worker->env.mesh->mods, "subnet");
+ struct subnet_env* sne;
+ if(m == -1)
+ return;
+ sne = (struct subnet_env*)worker->env.modinfo[m];
+ if(reset && !worker->env.cfg->stat_cumulative) {
+ lock_rw_wrlock(&sne->biglock);
+ } else {
+ lock_rw_rdlock(&sne->biglock);
+ }
+ svr->num_query_subnet = (long long)(sne->num_msg_nocache + sne->num_msg_cache);
+ svr->num_query_subnet_cache = (long long)sne->num_msg_cache;
+ if(reset && !worker->env.cfg->stat_cumulative) {
+ sne->num_msg_cache = 0;
+ sne->num_msg_nocache = 0;
+ }
+ lock_rw_unlock(&sne->biglock);
+}
+#endif /* CLIENT_SUBNET */
+
/** Set the neg cache stats. */
static void
set_neg_cache_stats(struct worker* worker, struct ub_server_stats* svr,
@@ -301,6 +331,13 @@ server_stats_compile(struct worker* worker, struct ub_stats_info* s, int reset)
/* Set neg cache usage numbers */
set_neg_cache_stats(worker, &s->svr, reset);
+#ifdef CLIENT_SUBNET
+ /* EDNS Subnet usage numbers */
+ set_subnet_stats(worker, &s->svr, reset);
+#else
+ s->svr.num_query_subnet = 0;
+ s->svr.num_query_subnet_cache = 0;
+#endif
/* get tcp accept usage */
s->svr.tcp_accept_usage = 0;
@@ -374,6 +411,7 @@ void server_stats_add(struct ub_stats_info* total, struct ub_stats_info* a)
total->svr.qclass_big += a->svr.qclass_big;
total->svr.qtcp += a->svr.qtcp;
total->svr.qtcp_outgoing += a->svr.qtcp_outgoing;
+ total->svr.qtls += a->svr.qtls;
total->svr.qipv6 += a->svr.qipv6;
total->svr.qbit_QR += a->svr.qbit_QR;
total->svr.qbit_AA += a->svr.qbit_AA;
@@ -428,8 +466,11 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c,
stats->qclass[qclass]++;
else stats->qclass_big++;
stats->qopcode[ LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) ]++;
- if(c->type != comm_udp)
+ if(c->type != comm_udp) {
stats->qtcp++;
+ if(c->ssl != NULL)
+ stats->qtls++;
+ }
if(repinfo && addr_is_ip6(&repinfo->addr, repinfo->addrlen))
stats->qipv6++;
if( (flags&BIT_QR) )
diff --git a/daemon/unbound.c b/daemon/unbound.c
index 138311013519..3f0f75a560c5 100644
--- a/daemon/unbound.c
+++ b/daemon/unbound.c
@@ -101,6 +101,7 @@ static void usage(void)
printf("-c file config file to read instead of %s\n", CONFIGFILE);
printf(" file format is described in unbound.conf(5).\n");
printf("-d do not fork into the background.\n");
+ printf("-p do not create a pidfile.\n");
printf("-v verbose (more times to increase verbosity)\n");
#ifdef UB_ON_WINDOWS
printf("-w opt windows option: \n");
@@ -626,8 +627,10 @@ run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode, const char*
fatal_exit("Could not alloc config defaults");
if(!config_read(cfg, cfgfile, daemon->chroot)) {
if(errno != ENOENT)
- fatal_exit("Could not read config file: %s",
- cfgfile);
+ fatal_exit("Could not read config file: %s."
+ " Maybe try unbound -dd, it stays on "
+ "the commandline to see more errors, "
+ "or unbound-checkconf", cfgfile);
log_warn("Continuing with default config settings");
}
apply_settings(daemon, cfg, cmdline_verbose, debug_mode, log_default_identity);
diff --git a/daemon/worker.c b/daemon/worker.c
index 44a989a4e945..9551c60f4a6a 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -66,6 +66,7 @@
#include "util/data/dname.h"
#include "util/fptr_wlist.h"
#include "util/tube.h"
+#include "util/edns.h"
#include "iterator/iter_fwd.h"
#include "iterator/iter_hints.h"
#include "validator/autotrust.h"
@@ -477,6 +478,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
* Then check if it needs validation, if so, this routine fails,
* so that iterator can prime and validator can verify rrsets.
*/
+ struct edns_data edns_bak;
uint16_t udpsize = edns->udp_size;
int secure = 0;
time_t timenow = *worker->env.now;
@@ -509,7 +511,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL,
- msg->rep, LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ msg->rep, LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
return 0;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
@@ -534,19 +536,22 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
}
}
/* return this delegation from the cache */
+ edns_bak = *edns;
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, msg->rep,
- (int)(flags&LDNS_RCODE_MASK), edns, worker->scratchpad))
+ (int)(flags&LDNS_RCODE_MASK), edns, repinfo, worker->scratchpad))
return 0;
msg->rep->flags |= BIT_QR|BIT_RA;
- if(!reply_info_answer_encode(&msg->qinfo, msg->rep, id, flags,
+ if(!apply_edns_options(edns, &edns_bak, worker->env.cfg,
+ repinfo->c, worker->scratchpad) ||
+ !reply_info_answer_encode(&msg->qinfo, msg->rep, id, flags,
repinfo->c->buffer, 0, 1, worker->scratchpad,
udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
- LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
edns->opt_list = NULL;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
@@ -614,6 +619,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
struct reply_info* rep, uint16_t id, uint16_t flags,
struct comm_reply* repinfo, struct edns_data* edns)
{
+ struct edns_data edns_bak;
time_t timenow = *worker->env.now;
uint16_t udpsize = edns->udp_size;
struct reply_info* encode_rep = rep;
@@ -623,7 +629,9 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
&& worker->env.need_to_validate;
*partial_repp = NULL; /* avoid accidental further pass */
if(worker->env.cfg->serve_expired) {
- /* always lock rrsets, rep->ttl is ignored */
+ if(worker->env.cfg->serve_expired_ttl &&
+ rep->serve_expired_ttl < timenow)
+ return 0;
if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
return 0;
/* below, rrsets with ttl before timenow become TTL 0 in
@@ -667,7 +675,7 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, rep,
- LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
goto bail_out;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, id, flags, edns);
@@ -695,12 +703,13 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
}
} else secure = 0;
+ edns_bak = *edns;
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, rep,
- (int)(flags&LDNS_RCODE_MASK), edns, worker->scratchpad))
+ (int)(flags&LDNS_RCODE_MASK), edns, repinfo, worker->scratchpad))
goto bail_out;
*alias_rrset = NULL; /* avoid confusion if caller set it to non-NULL */
if(worker->daemon->use_response_ip && !partial_rep &&
@@ -728,11 +737,13 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
if(!*partial_repp)
goto bail_out;
}
- } else if(!reply_info_answer_encode(qinfo, encode_rep, id, flags,
+ } else if(!apply_edns_options(edns, &edns_bak, worker->env.cfg,
+ repinfo->c, worker->scratchpad) ||
+ !reply_info_answer_encode(qinfo, encode_rep, id, flags,
repinfo->c->buffer, timenow, 1, worker->scratchpad,
udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
- LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ LDNS_RCODE_SERVFAIL, edns, repinfo, worker->scratchpad))
edns->opt_list = NULL;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, id, flags, edns);
@@ -779,10 +790,11 @@ reply_and_prefetch(struct worker* worker, struct query_info* qinfo,
* @param num: number of strings in array.
* @param edns: edns reply information.
* @param worker: worker with scratch region.
+ * @param repinfo: reply information for a communication point.
*/
static void
chaos_replystr(sldns_buffer* pkt, char** str, int num, struct edns_data* edns,
- struct worker* worker)
+ struct worker* worker, struct comm_reply* repinfo)
{
int i;
unsigned int rd = LDNS_RD_WIRE(sldns_buffer_begin(pkt));
@@ -815,7 +827,7 @@ chaos_replystr(sldns_buffer* pkt, char** str, int num, struct edns_data* edns,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(&worker->env, NULL, NULL, NULL,
- LDNS_RCODE_NOERROR, edns, worker->scratchpad))
+ LDNS_RCODE_NOERROR, edns, repinfo, worker->scratchpad))
edns->opt_list = NULL;
if(sldns_buffer_capacity(pkt) >=
sldns_buffer_limit(pkt)+calc_edns_field_size(edns))
@@ -825,9 +837,9 @@ chaos_replystr(sldns_buffer* pkt, char** str, int num, struct edns_data* edns,
/** Reply with one string */
static void
chaos_replyonestr(sldns_buffer* pkt, const char* str, struct edns_data* edns,
- struct worker* worker)
+ struct worker* worker, struct comm_reply* repinfo)
{
- chaos_replystr(pkt, (char**)&str, 1, edns, worker);
+ chaos_replystr(pkt, (char**)&str, 1, edns, worker, repinfo);
}
/**
@@ -835,9 +847,11 @@ chaos_replyonestr(sldns_buffer* pkt, const char* str, struct edns_data* edns,
* @param pkt: buffer
* @param edns: edns reply information.
* @param w: worker with scratch region.
+ * @param repinfo: reply information for a communication point.
*/
static void
-chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
+chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w,
+ struct comm_reply* repinfo)
{
#define TA_RESPONSE_MAX_TXT 16 /* max number of TXT records */
#define TA_RESPONSE_MAX_TAGS 32 /* max number of tags printed per zone */
@@ -848,7 +862,7 @@ chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
if(!w->env.need_to_validate) {
/* no validator module, reply no trustanchors */
- chaos_replystr(pkt, NULL, 0, edns, w);
+ chaos_replystr(pkt, NULL, 0, edns, w, repinfo);
return;
}
@@ -882,7 +896,7 @@ chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
}
lock_basic_unlock(&w->env.anchors->lock);
- chaos_replystr(pkt, str_array, num, edns, w);
+ chaos_replystr(pkt, str_array, num, edns, w, repinfo);
regional_free_all(w->scratchpad);
}
@@ -891,12 +905,13 @@ chaos_trustanchor(sldns_buffer* pkt, struct edns_data* edns, struct worker* w)
* @param w: worker
* @param qinfo: query info. Pointer into packet buffer.
* @param edns: edns info from query.
+ * @param repinfo: reply information for a communication point.
* @param pkt: packet buffer.
* @return: true if a reply is to be sent.
*/
static int
-answer_chaos(struct worker* w, struct query_info* qinfo,
- struct edns_data* edns, sldns_buffer* pkt)
+answer_chaos(struct worker* w, struct query_info* qinfo,
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* pkt)
{
struct config_file* cfg = w->env.cfg;
if(qinfo->qtype != LDNS_RR_TYPE_ANY && qinfo->qtype != LDNS_RR_TYPE_TXT)
@@ -912,13 +927,13 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
char buf[MAXHOSTNAMELEN+1];
if (gethostname(buf, MAXHOSTNAMELEN) == 0) {
buf[MAXHOSTNAMELEN] = 0;
- chaos_replyonestr(pkt, buf, edns, w);
+ chaos_replyonestr(pkt, buf, edns, w, repinfo);
} else {
log_err("gethostname: %s", strerror(errno));
- chaos_replyonestr(pkt, "no hostname", edns, w);
+ chaos_replyonestr(pkt, "no hostname", edns, w, repinfo);
}
}
- else chaos_replyonestr(pkt, cfg->identity, edns, w);
+ else chaos_replyonestr(pkt, cfg->identity, edns, w, repinfo);
return 1;
}
if(query_dname_compare(qinfo->qname,
@@ -929,8 +944,8 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
if(cfg->hide_version)
return 0;
if(cfg->version==NULL || cfg->version[0]==0)
- chaos_replyonestr(pkt, PACKAGE_STRING, edns, w);
- else chaos_replyonestr(pkt, cfg->version, edns, w);
+ chaos_replyonestr(pkt, PACKAGE_STRING, edns, w, repinfo);
+ else chaos_replyonestr(pkt, cfg->version, edns, w, repinfo);
return 1;
}
if(query_dname_compare(qinfo->qname,
@@ -938,7 +953,7 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
{
if(cfg->hide_trustanchor)
return 0;
- chaos_trustanchor(pkt, edns, w);
+ chaos_trustanchor(pkt, edns, w, repinfo);
return 1;
}
@@ -1246,29 +1261,52 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
server_stats_insrcode(&worker->stats, c->buffer);
goto send_reply;
}
- if(edns.edns_present && edns.edns_version != 0) {
- edns.ext_rcode = (uint8_t)(EDNS_RCODE_BADVERS>>4);
- edns.edns_version = EDNS_ADVERTISED_VERSION;
- edns.udp_size = EDNS_ADVERTISED_SIZE;
- edns.bits &= EDNS_DO;
- edns.opt_list = NULL;
- verbose(VERB_ALGO, "query with bad edns version.");
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
- error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo,
- *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
- sldns_buffer_read_u16_at(c->buffer, 2), NULL);
- if(sldns_buffer_capacity(c->buffer) >=
- sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns))
- attach_edns_record(c->buffer, &edns);
- regional_free_all(worker->scratchpad);
- goto send_reply;
- }
- if(edns.edns_present && edns.udp_size < NORMAL_UDP_SIZE &&
- worker->daemon->cfg->harden_short_bufsize) {
- verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored",
- (int)edns.udp_size);
- log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
- edns.udp_size = NORMAL_UDP_SIZE;
+ if(edns.edns_present) {
+ struct edns_option* edns_opt;
+ if(edns.edns_version != 0) {
+ edns.ext_rcode = (uint8_t)(EDNS_RCODE_BADVERS>>4);
+ edns.edns_version = EDNS_ADVERTISED_VERSION;
+ edns.udp_size = EDNS_ADVERTISED_SIZE;
+ edns.bits &= EDNS_DO;
+ edns.opt_list = NULL;
+ verbose(VERB_ALGO, "query with bad edns version.");
+ log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo,
+ *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
+ sldns_buffer_read_u16_at(c->buffer, 2), NULL);
+ if(sldns_buffer_capacity(c->buffer) >=
+ sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns))
+ attach_edns_record(c->buffer, &edns);
+ regional_free_all(worker->scratchpad);
+ goto send_reply;
+ }
+ if(edns.udp_size < NORMAL_UDP_SIZE &&
+ worker->daemon->cfg->harden_short_bufsize) {
+ verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored",
+ (int)edns.udp_size);
+ log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ edns.udp_size = NORMAL_UDP_SIZE;
+ }
+ if(c->type != comm_udp) {
+ edns_opt = edns_opt_list_find(edns.opt_list, LDNS_EDNS_KEEPALIVE);
+ if(edns_opt && edns_opt->opt_len > 0) {
+ edns.ext_rcode = 0;
+ edns.edns_version = EDNS_ADVERTISED_VERSION;
+ edns.udp_size = EDNS_ADVERTISED_SIZE;
+ edns.bits &= EDNS_DO;
+ edns.opt_list = NULL;
+ verbose(VERB_ALGO, "query with bad edns keepalive.");
+ log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen);
+ error_encode(c->buffer, LDNS_RCODE_FORMERR, &qinfo,
+ *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
+ sldns_buffer_read_u16_at(c->buffer, 2), NULL);
+ if(sldns_buffer_capacity(c->buffer) >=
+ sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns))
+ attach_edns_record(c->buffer, &edns);
+ regional_free_all(worker->scratchpad);
+ goto send_reply;
+ }
+ }
}
if(edns.udp_size > worker->daemon->cfg->max_udp_size &&
c->type == comm_udp) {
@@ -1298,7 +1336,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
if(c->type != comm_udp)
edns.udp_size = 65535; /* max size for TCP replies */
if(qinfo.qclass == LDNS_RR_CLASS_CH && answer_chaos(worker, &qinfo,
- &edns, c->buffer)) {
+ &edns, repinfo, c->buffer)) {
server_stats_insrcode(&worker->stats, c->buffer);
regional_free_all(worker->scratchpad);
goto send_reply;
@@ -1325,7 +1363,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
}
if(worker->env.auth_zones &&
auth_zones_answer(worker->env.auth_zones, &worker->env,
- &qinfo, &edns, c->buffer, worker->scratchpad)) {
+ &qinfo, &edns, repinfo, c->buffer, worker->scratchpad)) {
regional_free_all(worker->scratchpad);
if(sldns_buffer_limit(c->buffer) == 0) {
comm_point_drop_reply(repinfo);
@@ -1708,9 +1746,13 @@ worker_init(struct worker* worker, struct config_file *cfg,
worker->comsig = NULL;
}
worker->front = listen_create(worker->base, ports,
- cfg->msg_buffer_size, (int)cfg->incoming_num_tcp,
- worker->daemon->listen_sslctx, dtenv, worker_handle_request,
- worker);
+ cfg->msg_buffer_size, (int)cfg->incoming_num_tcp,
+ cfg->do_tcp_keepalive
+ ? cfg->tcp_keepalive_timeout
+ : cfg->tcp_idle_timeout,
+ worker->daemon->tcl,
+ worker->daemon->listen_sslctx,
+ dtenv, worker_handle_request, worker);
if(!worker->front) {
log_err("could not create listening sockets");
worker_delete(worker);
@@ -1972,22 +2014,22 @@ void libworker_handle_control_cmd(struct tube* ATTR_UNUSED(tube),
}
void libworker_fg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
- sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_bg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
- sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_event_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
- sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
@@ -2000,13 +2042,13 @@ int context_query_cmp(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
int order_lock_cmp(const void* ATTR_UNUSED(e1), const void* ATTR_UNUSED(e2))
{
- log_assert(0);
- return 0;
+ log_assert(0);
+ return 0;
}
int codeline_cmp(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
{
- log_assert(0);
- return 0;
+ log_assert(0);
+ return 0;
}
diff --git a/dns64/dns64.c b/dns64/dns64.c
index 7889d72e2299..eadfabb08c89 100644
--- a/dns64/dns64.c
+++ b/dns64/dns64.c
@@ -48,6 +48,9 @@
#include "util/fptr_wlist.h"
#include "util/net_help.h"
#include "util/regional.h"
+#include "util/storage/dnstree.h"
+#include "util/data/dname.h"
+#include "sldns/str2wire.h"
/******************************************************************************
* *
@@ -111,6 +114,11 @@ struct dns64_env {
* This is the CIDR length of the prefix. It needs to be between 0 and 96.
*/
int prefix_net;
+
+ /**
+ * Tree of names for which AAAA is ignored. always synthesize from A.
+ */
+ rbtree_type ignore_aaaa;
};
@@ -285,6 +293,40 @@ synthesize_aaaa(const uint8_t prefix_addr[16], int prefix_net,
******************************************************************************/
/**
+ * insert ignore_aaaa element into the tree
+ * @param dns64_env: module env.
+ * @param str: string with domain name.
+ * @return false on failure.
+ */
+static int
+dns64_insert_ignore_aaaa(struct dns64_env* dns64_env, char* str)
+{
+ /* parse and insert element */
+ struct name_tree_node* node;
+ node = (struct name_tree_node*)calloc(1, sizeof(*node));
+ if(!node) {
+ log_err("out of memory");
+ return 0;
+ }
+ node->name = sldns_str2wire_dname(str, &node->len);
+ if(!node->name) {
+ free(node);
+ log_err("cannot parse dns64-ignore-aaaa: %s", str);
+ return 0;
+ }
+ node->labs = dname_count_labels(node->name);
+ node->dclass = LDNS_RR_CLASS_IN;
+ if(!name_tree_insert(&dns64_env->ignore_aaaa, node,
+ node->name, node->len, node->labs, node->dclass)) {
+ /* ignore duplicate element */
+ free(node->name);
+ free(node);
+ return 1;
+ }
+ return 1;
+}
+
+/**
* This function applies the configuration found in the parsed configuration
* file \a cfg to this instance of the dns64 module. Currently only the DNS64
* prefix (a.k.a. Pref64) is configurable.
@@ -295,6 +337,7 @@ synthesize_aaaa(const uint8_t prefix_addr[16], int prefix_net,
static int
dns64_apply_cfg(struct dns64_env* dns64_env, struct config_file* cfg)
{
+ struct config_strlist* s;
verbose(VERB_ALGO, "dns64-prefix: %s", cfg->dns64_prefix);
if (!netblockstrtoaddr(cfg->dns64_prefix ? cfg->dns64_prefix :
DEFAULT_DNS64_PREFIX, 0, &dns64_env->prefix_addr,
@@ -311,6 +354,11 @@ dns64_apply_cfg(struct dns64_env* dns64_env, struct config_file* cfg)
cfg->dns64_prefix);
return 0;
}
+ for(s = cfg->dns64_ignore_aaaa; s; s = s->next) {
+ if(!dns64_insert_ignore_aaaa(dns64_env, s->str))
+ return 0;
+ }
+ name_tree_init_parents(&dns64_env->ignore_aaaa);
return 1;
}
@@ -329,7 +377,8 @@ dns64_init(struct module_env* env, int id)
log_err("malloc failure");
return 0;
}
- env->modinfo[id] = (void*)dns64_env;
+ env->modinfo[id] = (void*)dns64_env;
+ name_tree_init(&dns64_env->ignore_aaaa);
if (!dns64_apply_cfg(dns64_env, env->cfg)) {
log_err("dns64: could not apply configuration settings.");
return 0;
@@ -337,6 +386,16 @@ dns64_init(struct module_env* env, int id)
return 1;
}
+/** free ignore AAAA elements */
+static void
+free_ignore_aaaa_node(rbnode_type* node, void* ATTR_UNUSED(arg))
+{
+ struct name_tree_node* n = (struct name_tree_node*)node;
+ if(!n) return;
+ free(n->name);
+ free(n);
+}
+
/**
* Deinitializes this instance of the dns64 module.
*
@@ -346,8 +405,14 @@ dns64_init(struct module_env* env, int id)
void
dns64_deinit(struct module_env* env, int id)
{
+ struct dns64_env* dns64_env;
if (!env)
return;
+ dns64_env = (struct dns64_env*)env->modinfo[id];
+ if(dns64_env) {
+ traverse_postorder(&dns64_env->ignore_aaaa, free_ignore_aaaa_node,
+ NULL);
+ }
free(env->modinfo[id]);
env->modinfo[id] = NULL;
}
@@ -441,6 +506,25 @@ generate_type_A_query(struct module_qstate* qstate, int id)
}
/**
+ * See if query name is in the always synth config.
+ * The ignore-aaaa list has names for which the AAAA for the domain is
+ * ignored and the A is always used to create the answer.
+ * @param qstate: query state.
+ * @param id: module id.
+ * @return true if the name is covered by ignore-aaaa.
+ */
+static int
+dns64_always_synth_for_qname(struct module_qstate* qstate, int id)
+{
+ struct dns64_env* dns64_env = (struct dns64_env*)qstate->env->modinfo[id];
+ int labs = dname_count_labels(qstate->qinfo.qname);
+ struct name_tree_node* node = name_tree_lookup(&dns64_env->ignore_aaaa,
+ qstate->qinfo.qname, qstate->qinfo.qname_len, labs,
+ qstate->qinfo.qclass);
+ return (node != NULL);
+}
+
+/**
* Handles the "pass" event for a query. This event is received when a new query
* is received by this module. The query may have been generated internally by
* another module, in which case we don't want to do any special processing
@@ -468,6 +552,14 @@ handle_event_pass(struct module_qstate* qstate, int id)
&& qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA)
return generate_type_A_query(qstate, id);
+ if(dns64_always_synth_for_qname(qstate, id) &&
+ (uintptr_t)qstate->minfo[id] == DNS64_NEW_QUERY
+ && !(qstate->query_flags & BIT_CD)
+ && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA) {
+ verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
+ return generate_type_A_query(qstate, id);
+ }
+
/* We are finished when our sub-query is finished. */
if ((uintptr_t)qstate->minfo[id] == DNS64_SUBQUERY_FINISHED)
return module_finished;
@@ -501,17 +593,29 @@ handle_event_moddone(struct module_qstate* qstate, int id)
* synthesize in (sec 5.1.2 of RFC6147).
* - A successful AAAA query with an answer.
*/
- if ( (enum dns64_qstate)qstate->minfo[id] == DNS64_INTERNAL_QUERY
- || qstate->qinfo.qtype != LDNS_RR_TYPE_AAAA
- || (qstate->query_flags & BIT_CD)
- || (qstate->return_msg &&
+ if((enum dns64_qstate)qstate->minfo[id] != DNS64_INTERNAL_QUERY
+ && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA
+ && !(qstate->query_flags & BIT_CD)
+ && !(qstate->return_msg &&
qstate->return_msg->rep &&
reply_find_answer_rrset(&qstate->qinfo,
qstate->return_msg->rep)))
- return module_finished;
+ /* not internal, type AAAA, not CD, and no answer RRset,
+ * So, this is a AAAA noerror/nodata answer */
+ return generate_type_A_query(qstate, id);
+
+ if((enum dns64_qstate)qstate->minfo[id] != DNS64_INTERNAL_QUERY
+ && qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA
+ && !(qstate->query_flags & BIT_CD)
+ && dns64_always_synth_for_qname(qstate, id)) {
+ /* if it is not internal, AAAA, not CD and listed domain,
+ * generate from A record and ignore AAAA */
+ verbose(VERB_ALGO, "dns64: ignore-aaaa and synthesize anyway");
+ return generate_type_A_query(qstate, id);
+ }
- /* So, this is a AAAA noerror/nodata answer */
- return generate_type_A_query(qstate, id);
+ /* do nothing */
+ return module_finished;
}
/**
@@ -677,8 +781,9 @@ dns64_adjust_a(int id, struct module_qstate* super, struct module_qstate* qstate
* Build the actual reply.
*/
cp = construct_reply_info_base(super->region, rep->flags, rep->qdcount,
- rep->ttl, rep->prefetch_ttl, rep->an_numrrsets, rep->ns_numrrsets,
- rep->ar_numrrsets, rep->rrset_count, rep->security);
+ rep->ttl, rep->prefetch_ttl, rep->serve_expired_ttl,
+ rep->an_numrrsets, rep->ns_numrrsets, rep->ar_numrrsets,
+ rep->rrset_count, rep->security);
if(!cp)
return;
@@ -705,6 +810,12 @@ dns64_adjust_a(int id, struct module_qstate* super, struct module_qstate* qstate
rrset_cache_remove(super->env->rrset_cache, dk->rk.dname,
dk->rk.dname_len, LDNS_RR_TYPE_AAAA,
LDNS_RR_CLASS_IN, 0);
+ /* Delete negative AAAA in msg cache for CNAMEs,
+ * stored by the iterator module */
+ if(i != 0) /* if not the first RR */
+ msg_cache_remove(super->env, dk->rk.dname,
+ dk->rk.dname_len, LDNS_RR_TYPE_AAAA,
+ LDNS_RR_CLASS_IN, 0);
} else {
dk->entry.hash = fk->entry.hash;
dk->rk.dname = (uint8_t*)regional_alloc_init(super->region,
diff --git a/doc/Changelog b/doc/Changelog
index 3d05ae53a1a5..7e81304f930f 100644
--- a/doc/Changelog
+++ b/doc/Changelog
@@ -1,14 +1,263 @@
+4 September 2018: Wouter
+ - Tag for 1.8.0rc1 release.
+
+31 August 2018: Wouter
+ - Disable minimal-responses in subnet unit tests.
+
+30 August 2018: Wouter
+ - Fix that a local-zone with a local-zone-type that is transparent
+ in a view with view-first, makes queries check for answers from the
+ local-zones defined outside of views.
+
+28 August 2018: Ralph
+ - Disable minimal-responses in ipsecmod unit tests.
+ - Added serve-expired-ttl and serve-expired-ttl-reset options.
+
+27 August 2018: Wouter
+ - Set defaults to yes for a number of options to increase speed and
+ resilience of the server. The so-reuseport, harden-below-nxdomain,
+ and minimal-responses options are enabled by default. They used
+ to be disabled by default, waiting to make sure they worked. They
+ are enabled by default now, and can be disabled explicitly by
+ setting them to "no" in the unbound.conf config file. The reuseport
+ and minimal options increases speed of the server, and should be
+ otherwise harmless. The harden-below-nxdomain option works well
+ together with the recently default enabled qname minimisation, this
+ causes more fetches to use information from the cache.
+ - next release is called 1.8.0.
+ - Fix lintflags for lint on FreeBSD.
+
+22 August 2018: George
+ - #4140: Expose repinfo (comm_reply) to the inplace_callbacks. This
+ gives access to reply information for the client's communication
+ point when the callback is called before the mesh state (modules).
+ Changes to C and Python's inplace_callback signatures were also
+ necessary.
+
+21 August 2018: Wouter
+ - log-local-actions: yes option for unbound.conf that logs all the
+ local zone actions, a patch from Saksham Manchanda (Secure64).
+ - #4146: num.query.subnet and num.query.subnet_cache counters.
+ - Fix only misc failure from log-servfail when val-log-level is not
+ enabled.
+
+17 August 2018: Ralph
+ - Fix classification for QTYPE=CNAME queries when QNAME minimisation is
+ enabled.
+
+17 August 2018: Wouter
+ - Set libunbound to increase current, because the libunbound change
+ to the event callback function signature. That needs programs,
+ that use it, to recompile against the new header definition.
+ - print servfail info to log as error.
+ - added more servfail printout statements, to the iterator.
+ - log-servfail: yes prints log lines that say why queries are
+ returning SERVFAIL to clients.
+
+16 August 2018: Wouter
+ - Fix warning on compile without threads.
+ - Fix contrib/fastrpz.patch.
+
+15 August 2018: Wouter
+ - Fix segfault in auth-zone read and reorder of RRSIGs.
+
+14 August 2018: Wouter
+ - Fix that printout of error for cycle targets is a verbosity 4
+ printout and does not wrongly print it is a memory error.
+ - Upgraded crosscompile script to include libunbound DLL in the
+ zipfile.
+
+10 August 2018: Wouter
+ - Fix #4144: dns64 module caches wrong (negative) information.
+
+9 August 2018: Wouter
+ - unbound-checkconf checks if modules exist and prints if they are
+ not compiled in the name of the wrong module.
+ - document --enable-subnet in doc/README.
+ - Patch for stub-no-cache and forward-no-cache options that disable
+ caching for the contents of that stub or forward, for when you
+ want immediate changes visible, from Bjoern A. Zeeb.
+
+7 August 2018: Ralph
+ - Make capsforid fallback QNAME minimisation aware.
+
+7 August 2018: Wouter
+ - Fix #4142: unbound.service.in: improvements and fixes.
+ Add unit dependency ordering (based on systemd-resolved).
+ Add 'CAP_SYS_RESOURCE' to 'CapabilityBoundingSet' (fixes warnings
+ about missing privileges during startup). Add 'AF_INET6' to
+ 'RestrictAddressFamilies' (without it IPV6 can't work). From
+ Guido Shanahan.
+ - Patch to implement tcp-connection-limit from Jim Hague (Sinodun).
+ This limits the number of simultaneous TCP client connections
+ from a nominated netblock.
+ - make depend, yacc, lex, doc, headers. And log the limit exceeded
+ message only on high verbosity, so as to not spam the logs when
+ it is busy.
+
+6 August 2018: Wouter
+ - Fix for #4136: Fix to unconditionally call destroy in daemon.c.
+
+3 August 2018: George
+ - Expose if a query (or a subquery) was ratelimited (not src IP
+ ratelimiting) to libunbound under 'ub_result.was_ratelimited'.
+ This also introduces a change to 'ub_event_callback_type' in
+ libunbound/unbound-event.h.
+ - Tidy pylib tests.
+
+3 August 2018: Wouter
+ - Revert previous change for #4136: because it introduces build
+ problems.
+ - New fix for #4136: This one ignores lex without without
+ yylex_destroy.
+
+1 August 2018: Wouter
+ - Fix to remove systemd sockaddr function check, that is not
+ always present. Make socket activation more lenient. But not
+ different when socket activation is not used.
+ - iana port list update.
+
+31 July 2018: Wouter
+ - Patches from Jim Hague (Sinodun) for EDNS KeepAlive.
+ - Sort out test runs when the build directory isn't the project
+ root directory.
+ - Add config tcp-idle-timeout (default 30s). This applies to
+ client connections only; the timeout on TCP connections upstream
+ is unaffected.
+ - Error if EDNS Keepalive received over UDP.
+ - Add edns-tcp-keepalive and edns-tcp-keepalive timeout options
+ and implement option in client responses.
+ - Correct and expand manual page entries for keepalive and idle timeout.
+ - Implement progressive backoff of TCP idle/keepalive timeout.
+ - Fix 'make depend' to work when build dir is not project root.
+ - Add delay parameter to streamtcp, -d secs.
+ To be used when testing idle timeout.
+ - From Wouter: make depend, the dependencies in the patches did not
+ apply cleanly. Also remade yacc and lex.
+ - Fix mesh.c incompatible pointer pass.
+ - Please doxygen so it passes.
+ - Fix #4139: Fix unbound-host leaks memory on ANY.
+
+30 July 2018: Wouter
+ - Fix #4136: insufficiency from mismatch of FLEX capability between
+ released tarball and build host.
+
+27 July 2018: Wouter
+ - Fix man page, say that chroot is enabled by default.
+
+26 July 2018: Wouter
+ - Fix #4135: 64-bit Windows Installer Creates Entries Under The
+ Wrong Registry Key, reported by Brian White.
+
+23 July 2018: Wouter
+ - Fix use-systemd readiness signalling, only when use-systemd is yes
+ and not in signal handler.
+
+20 July 2018: Wouter
+ - Fix #4130: print text describing -dd and unbound-checkconf on
+ config file read error at startup, the errors may have been moved
+ away by the startup process.
+ - Fix #4131: for solaris, error YY_CURRENT_BUFFER undeclared.
+
+19 July 2018: Wouter
+ - Fix #4129 unbound-control error message with wrong cert permissions
+ is too cryptic.
+
+17 July 2018: Wouter
+ - Fix #4127 unbound -h does not list -p help.
+ - Print error if SSL name verification configured but not available
+ in the ssl library.
+ - Fix that ratelimit and ip-ratelimit are applied after reload of
+ changed config file.
+ - Resize ratelimit and ip-ratelimit caches if changed on reload.
+
+16 July 2018: Wouter
+ - Fix qname minimisation NXDOMAIN validation lookup failures causing
+ error_supers assertion fails.
+ - Squelch can't bind socket errors with Permission denied unless
+ verbosity is 4 or higher, for UDP outgoing sockets.
+
+12 July 2018: Wouter
+ - Fix to improve systemd socket activation code file descriptor
+ assignment.
+ - Fix for 4126 that the #define for UNKNOWN_SERVER_NICENESS can be more
+ easily changed to adjust default rtt assumptions.
+
+10 July 2018: Wouter
+ - Note in documentation that the cert name match code needs
+ OpenSSL 1.1.0 or later to be enabled.
+
+6 July 2018: Wouter
+ - Fix documentation ambiguity for tls-win-cert in tls-upstream and
+ forward-tls-upstream docs.
+ - iana port update.
+ - Note RFC8162 support. SMIMEA record type can be read in by the
+ zone record parser.
+ - Fix round robin for failed addresses with prefer-ip6: yes
+
+4 July 2018: Wouter
+ - Fix #4112: Fix that unbound-anchor -f /etc/resolv.conf will not pass
+ if DNSSEC is not enabled. New option -R allows fallback from
+ resolv.conf to direct queries.
+
+3 July 2018: Wouter
+ - Better documentation for unblock-lan-zones and insecure-lan-zones
+ config statements.
+ - Fix permission denied printed for auth zone probe random port nrs.
+
+2 July 2018: Wouter
+ - Fix checking for libhiredis printout in configure output.
+ - Fix typo on man page in ip-address description.
+ - Update libunbound/python/examples/dnssec_test.py example code to
+ also set the 20326 trust anchor for the root in the example code.
+
+29 June 2018: Wouter
+ - dns64-ignore-aaaa: config option to list domain names for which the
+ existing AAAA is ignored and dns64 processing is used on the A
+ record.
+
+28 June 2018: Wouter
+ - num.queries.tls counter for queries over TLS.
+ - log port number with err_addr logs.
+
+27 June 2018: Wouter
+ - #4109: Fix that package config depends on python unconditionally.
+ - Patch, do not export python from pkg-config, from Petr Menšík.
+
+26 June 2018: Wouter
+ - Partial fix for permission denied on IPv6 address on FreeBSD.
+ - Fix that auth-zone master reply with current SOA serial does not
+ stop scan of masters for an updated zone.
+ - Fix that auth-zone does not start the wait timer without checking
+ if the wait timer has already been started.
+
+21 June 2018: Wouter
+ - #4108: systemd reload hang fix.
+ - Fix usage printout for unbound-host, hostname has to be last
+ argument on BSDs and Windows.
+
19 June 2018: Wouter
- Fix for unbound-control on Windows and set TCP socket parameters
more closely.
+ This fix is part of 1.7.3.
+ - Windows example service.conf edited with more windows specific
+ configuration.
- Fix windows unbound-control no cert bad file descriptor error.
+ This fix is part of 1.7.3.
18 June 2018: Wouter
- Fix that control-use-cert: no works for 127.0.0.1 to disable certs.
+ This fix is part of 1.7.3rc2.
- Fix unbound-checkconf for control-use-cert.
+ This fix is part of 1.7.3.
15 June 2018: Wouter
- tag for 1.7.3rc1.
+ - trunk has 1.7.4.
+ - unbound-control auth_zone_reload _zone_ option rereads the zonefile.
+ - unbound-control auth_zone_transfer _zone_ option starts the probe
+ sequence for a master to transfer the zone from and transfers when
+ a new zone version is available.
14 June 2018: Wouter
- #4103: Fix that auth-zone does not insist on SOA record first in
diff --git a/doc/README b/doc/README
index 5bd23fac67be..ae90773412ff 100644
--- a/doc/README
+++ b/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.7.3
+README for Unbound 1.8.0
Copyright 2007 NLnet Labs
http://unbound.net
@@ -76,6 +76,8 @@ The DNSTAP code has BSD license in dnstap/dnstap.c.
Disable support for RSASHA256 and RSASHA512 crypto.
* --disable-gost
Disable support for GOST crypto, RFC 5933.
+ * --enable-subnet
+ Enable EDNS client subnet processing.
* 'make test' runs a series of self checks.
diff --git a/doc/example.conf.in b/doc/example.conf.in
index be83bdacc21c..fadfd9c6827b 100644
--- a/doc/example.conf.in
+++ b/doc/example.conf.in
@@ -1,7 +1,7 @@
#
# Example configuration file.
#
-# See unbound.conf(5) man page, version 1.7.3.
+# See unbound.conf(5) man page, version 1.8.0.
#
# this is a comment.
@@ -103,7 +103,7 @@ server:
# so-sndbuf: 0
# use SO_REUSEPORT to distribute queries over threads.
- # so-reuseport: no
+ # so-reuseport: yes
# use IP_TRANSPARENT so the interface: addresses can be non-local
# and you can config non-existing IPs that are going to work later on
@@ -212,6 +212,15 @@ server:
# Default is 0, system default MSS.
# outgoing-tcp-mss: 0
+ # Idle TCP timeout, connection closed in milliseconds
+ # tcp-idle-timeout: 30000
+
+ # Enable EDNS TCP keepalive option.
+ # edns-tcp-keepalive: no
+
+ # Timeout for EDNS TCP keepalive, in msec.
+ # edns-tcp-keepalive-timeout: 120000
+
# Use systemd socket activation for UDP, TCP, and control sockets.
# use-systemd: no
@@ -309,6 +318,13 @@ server:
# timetoresolve, fromcache and responsesize.
# log-replies: no
+ # log the local-zone actions, like local-zone type inform is enabled
+ # also for the other local zone types.
+ # log-local-actions: no
+
+ # print log lines that say why queries return SERVFAIL to clients.
+ # log-servfail: no
+
# the pid file. Can be an absolute path outside of chroot/work dir.
# pidfile: "@UNBOUND_PIDFILE@"
@@ -357,7 +373,7 @@ server:
# harden-dnssec-stripped: yes
# Harden against queries that fall under dnssec-signed nxdomain names.
- # harden-below-nxdomain: no
+ # harden-below-nxdomain: yes
# Harden the referral path by performing additional queries for
# infrastructure data. Validates the replies (if possible).
@@ -438,7 +454,7 @@ server:
# if yes, Unbound doesn't insert authority/additional sections
# into response messages when those sections are not required.
- # minimal-responses: no
+ # minimal-responses: yes
# true to disable DNSSEC lameness check in iterator.
# disable-dnssec-lame-check: no
@@ -527,6 +543,16 @@ server:
# Serve expired responses from cache, with TTL 0 in the response,
# and then attempt to fetch the data afresh.
# serve-expired: no
+ #
+ # Limit serving of expired responses to configured seconds after
+ # expiration. 0 disables the limit.
+ # serve-expired-ttl: 0
+ #
+ # Set the TTL of expired records to the serve-expired-ttl value after a
+ # failed attempt to retrieve the record from upstream. This makes sure
+ # that the expired records will be served as long as there are queries
+ # for it.
+ # serve-expired-ttl-reset: no
# Have the validator log failed validations for your diagnosis.
# 0: off. 1: A line per failed user query. 2: With reason and bad IP.
@@ -692,6 +718,9 @@ server:
# Enable dns64 in module-config. Used to synthesize IPv6 from IPv4.
# dns64-prefix: 64:ff9b::0/96
+ # DNS64 ignore AAAA records for these domains and use A instead.
+ # dns64-ignore-aaaa: "example.com"
+
# ratelimit for uncached, new queries, this limits recursion effort.
# ratelimiting is experimental, and may help against randomqueryflood.
# if 0(default) it is disabled, otherwise state qps allowed per zone.
@@ -725,6 +754,9 @@ server:
# 0 blocks when ip is ratelimited, otherwise let 1/xth traffic through
# ip-ratelimit-factor: 10
+ # Limit the number of connections simultaneous from a netblock
+ # tcp-connection-limit: 192.0.2.0/24 12
+
# what is considered a low rtt (ping time for upstream server), in msec
# low-rtt: 45
# select low rtt this many times out of 1000. 0 means the fast server
@@ -814,6 +846,7 @@ remote-control:
# stub-prime: no
# stub-first: no
# stub-tls-upstream: no
+# stub-no-cache: no
# stub-zone:
# name: "example.org"
# stub-host: ns.example.com.
@@ -830,6 +863,7 @@ remote-control:
# forward-addr: 192.0.2.73@5355 # forward to port 5355.
# forward-first: no
# forward-tls-upstream: no
+# forward-no-cache: no
# forward-zone:
# name: "example.org"
# forward-host: fwd.example.com
diff --git a/doc/libunbound.3.in b/doc/libunbound.3.in
index d4b0efd69a9d..9a2fff835601 100644
--- a/doc/libunbound.3.in
+++ b/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "libunbound" "3" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -43,7 +43,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.7.3 functions.
+\- Unbound DNS validating resolver 1.8.0 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/doc/unbound-anchor.8.in b/doc/unbound-anchor.8.in
index ca7cafa060ab..ece844deff37 100644
--- a/doc/unbound-anchor.8.in
+++ b/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound-anchor" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
@@ -109,6 +109,11 @@ It does so, because the tool when used for bootstrapping the recursive
resolver, cannot use that recursive resolver itself because it is bootstrapping
that server.
.TP
+.B \-R
+Allow fallback from \-f resolv.conf file to direct root servers query.
+It allows you to prefer local resolvers, but fallback automatically
+to direct root query if they do not respond or do not support DNSSEC.
+.TP
.B \-v
More verbose. Once prints informational messages, multiple times may enable
large debug amounts (such as full certificates or byte\-dumps of downloaded
diff --git a/doc/unbound-checkconf.8.in b/doc/unbound-checkconf.8.in
index 9d35e64dbe08..1fa91d35d3c5 100644
--- a/doc/unbound-checkconf.8.in
+++ b/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound-checkconf" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in
index f3d9669f8160..596138470e53 100644
--- a/doc/unbound-control.8.in
+++ b/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound-control" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
@@ -293,6 +293,18 @@ ips are dropped before checking the cache.
List the auth zones that are configured. Printed one per line with a
status, indicating if the zone is expired and current serial number.
.TP
+.B auth_zone_reload \fIzone\fR
+Reload the auth zone from zonefile. The zonefile is read in overwriting
+the current contents of the zone in memory. This changes the auth zone
+contents itself, not the cache contents. Such cache contents exists if
+you set unbound to validate with for-upstream yes and that can be cleared
+with \fBflush_zone\fR \fIzone\fR.
+.TP
+.B auth_zone_transfer \fIzone\fR
+Tranfer the auth zone from master. The auth zone probe sequence is started,
+where the masters are probed to see if they have an updated zone (with the SOA
+serial check). And then the zone is transferred for a newer zone version.
+.TP
.B view_list_local_zones \fIview\fR
\fIlist_local_zones\fR for given view.
.TP
@@ -515,6 +527,10 @@ Number of queries that were made using TCP towards the unbound server.
Number of queries that the unbound server made using TCP outgoing towards
other servers.
.TP
+.I num.query.tls
+Number of queries that were made using TLS towards the unbound server.
+These are also counted in num.query.tcp, because TLS uses TCP.
+.TP
.I num.query.ipv6
Number of queries that were made using IPv6 towards the unbound server.
.TP
@@ -625,6 +641,14 @@ answered using cached data.
The number of queries answered using cached NSEC records with NXDOMAIN RCODE.
These queries would otherwise have been sent to the internet, but are now
answered using cached data.
+.TP
+.I num.query.subnet
+Number of queries that got an answer that contained EDNS client subnet data.
+.TP
+.I num.query.subnet_cache
+Number of queries answered from the edns client subnet cache. These are
+counted as cachemiss by the main counters, but hit the client subnet
+specific cache, after getting processed by the edns client subnet module.
.SH "FILES"
.TP
.I @ub_conf_file@
diff --git a/doc/unbound-host.1.in b/doc/unbound-host.1.in
index ea95bd77e071..dacee3d13429 100644
--- a/doc/unbound-host.1.in
+++ b/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound\-host" "1" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
@@ -12,20 +12,20 @@
\- unbound DNS lookup utility
.SH "SYNOPSIS"
.B unbound\-host
+.RB [ \-C
+.IR configfile ]
.RB [ \-vdhr46D ]
.RB [ \-c
.IR class ]
.RB [ \-t
.IR type ]
-.I hostname
.RB [ \-y
.IR key ]
.RB [ \-f
.IR keyfile ]
.RB [ \-F
.IR namedkeyfile ]
-.RB [ \-C
-.IR configfile ]
+.I hostname
.SH "DESCRIPTION"
.B Unbound\-host
uses the unbound validating resolver to query for the hostname and display
@@ -86,6 +86,8 @@ are read.
.B \-C \fIconfigfile
Uses the specified unbound.conf to prime
.IR libunbound (3).
+Pass it as first argument if you want to override some options from the
+config file with further arguments on the commandline.
.TP
.B \-r
Read /etc/resolv.conf, and use the forward DNS servers from there (those could
diff --git a/doc/unbound.8.in b/doc/unbound.8.in
index 5613ce30b20d..7062fb07eacb 100644
--- a/doc/unbound.8.in
+++ b/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound" "8" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.7.3.
+\- Unbound DNS validating resolver 1.8.0.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in
index 9167a5a10def..a3536a14a249 100644
--- a/doc/unbound.conf.5.in
+++ b/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Jun 21, 2018" "NLnet Labs" "unbound 1.7.3"
+.TH "unbound.conf" "5" "Sep 10, 2018" "NLnet Labs" "unbound 1.8.0"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -121,7 +121,7 @@ interface and port number), if not specified the default port (from
\fBport\fR) is used.
.TP
.B ip\-address: \fI<ip address[@port]>
-Same as interface: (for easy of compatibility with nsd.conf).
+Same as interface: (for ease of compatibility with nsd.conf).
.TP
.B interface\-automatic: \fI<yes or no>
Detect source interface on UDP queries and copy them to replies. This
@@ -278,9 +278,9 @@ to so\-rcvbuf.
.B so\-reuseport: \fI<yes or no>
If yes, then open dedicated listening sockets for incoming queries for each
thread and try to set the SO_REUSEPORT socket option on each socket. May
-distribute incoming queries to threads more evenly. Default is no. On Linux
-it is supported in kernels >= 3.9. On other systems, FreeBSD, OSX it may
-also work. You can enable it (on any platform and kernel),
+distribute incoming queries to threads more evenly. Default is yes.
+On Linux it is supported in kernels >= 3.9. On other systems, FreeBSD, OSX
+it may also work. You can enable it (on any platform and kernel),
it then attempts to open the port and passes the option if it was available
at compile time, if that works it is used, if it fails, it continues
silently (unless verbosity 3) without the option.
@@ -389,6 +389,37 @@ Note that not all platform supports socket option to set MSS (TCP_MAXSEG).
Default is system default MSS determined by interface MTU and
negotiation between Unbound and other servers.
.TP
+.B tcp-idle-timeout: \fI<msec>\fR
+The period Unbound will wait for a query on a TCP connection.
+If this timeout expires Unbound closes the connection.
+This option defaults to 30000 milliseconds.
+When the number of free incoming TCP buffers falls below 50% of the
+total number configured, the option value used is progressively
+reduced, first to 1% of the configured value, then to 0.2% of the
+configured value if the number of free buffers falls below 35% of the
+total number configured, and finally to 0 if the number of free buffers
+falls below 20% of the total number configured. A minimum timeout of
+200 milliseconds is observed regardless of the option value used.
+.TP
+.B edns-tcp-keepalive: \fI<yes or no>\fR
+Enable or disable EDNS TCP Keepalive. Default is no.
+.TP
+.B edns-tcp-keepalive-timeout: \fI<msec>\fR
+The period Unbound will wait for a query on a TCP connection when
+EDNS TCP Keepalive is active. If this timeout expires Unbound closes
+the connection. If the client supports the EDNS TCP Keepalive option,
+Unbound sends the timeout value to the client to encourage it to
+close the connection before the server times out.
+This option defaults to 120000 milliseconds.
+When the number of free incoming TCP buffers falls below 50% of
+the total number configured, the advertised timeout is progressively
+reduced to 1% of the configured value, then to 0.2% of the configured
+value if the number of free buffers falls below 35% of the total number
+configured, and finally to 0 if the number of free buffers falls below
+20% of the total number configured.
+A minimum actual timeout of 200 milliseconds is observed regardless of the
+advertised timeout.
+.TP
.B tcp\-upstream: \fI<yes or no>
Enable or disable whether the upstream queries use TCP only for transport.
Default is no. Useful in tunneling scenarios.
@@ -403,7 +434,7 @@ Enabled or disable whether the upstream queries use TLS only for transport.
Default is no. Useful in tunneling scenarios. The TLS contains plain DNS in
TCP wireformat. The other server must support this (see
\fBtls\-service\-key\fR).
-If you enable this, also configure a tls\-cert\-bundle or use tls\-win\cert to
+If you enable this, also configure a tls\-cert\-bundle or use tls\-win\-cert to
load CA certs, otherwise the connections cannot be authenticated.
.TP
.B ssl\-upstream: \fI<yes or no>
@@ -466,6 +497,11 @@ Enable or disable whether the unbound server forks into the background as
a daemon. Set the value to \fIno\fR when unbound runs as systemd service.
Default is yes.
.TP
+.B tcp\-connection\-limit: \fI<IP netblock> <limit>
+Allow up to \fIlimit\R simultaneous TCP connections from the given netblock.
+When at the limit, further connections are accepted but closed immediately.
+This option is experimental at this time.
+.TP
.B access\-control: \fI<IP netblock> <action>
The netblock is given as an IP4 or IP6 address with /size appended for a
classless network block. The action can be \fIdeny\fR, \fIrefuse\fR,
@@ -557,8 +593,9 @@ to chroot and dropping permissions. This allows the pidfile to be
Additionally, unbound may need to access /dev/random (for entropy)
from inside the chroot.
.IP
-If given a chroot is done to the given directory. The default is
-"@UNBOUND_CHROOT_DIR@". If you give "" no chroot is performed.
+If given a chroot is done to the given directory. By default chroot is
+enabled and the default is "@UNBOUND_CHROOT_DIR@". If you give "" no
+chroot is performed.
.TP
.B username: \fI<name>
If given, after binding the port the user privileges are dropped. Default is
@@ -618,6 +655,16 @@ Default is no. Note that it takes time to print these
lines which makes the server (significantly) slower. Odd (nonprintable)
characters in names are printed as '?'.
.TP
+.B log\-local\-actions: \fI<yes or no>
+Print log lines to inform about local zone actions. These lines are like the
+local\-zone type inform prints out, but they are also printed for the other
+types of local zones.
+.TP
+.B log\-servfail: \fI<yes or no>
+Print log lines that say why queries return SERVFAIL to clients.
+This is separate from the verbosity debug logs, much smaller, and printed
+at the error level, not the info level of debug info from verbosity.
+.TP
.B pidfile: \fI<filename>
The process id is written to the file. Default is "@UNBOUND_PIDFILE@".
So,
@@ -700,7 +747,7 @@ noerror for empty nonterminals, hence this is possible. Very old software
might return nxdomain for empty nonterminals (that usually happen for reverse
IP address lookups), and thus may be incompatible with this. To try to avoid
this only DNSSEC-secure nxdomains are used, because the old software does not
-have DNSSEC. Default is off.
+have DNSSEC. Default is on.
The nxdomain must be secure, this means nsec3 with optout is insufficient.
.TP
.B harden\-referral\-path: \fI<yes or no>
@@ -814,9 +861,11 @@ from the query ID, for speed and thread safety). Default is no.
If yes, Unbound doesn't insert authority/additional sections into response
messages when those sections are not required. This reduces response
size significantly, and may avoid TCP fallback for some responses.
-This may cause a slight speedup. The default is no, because the DNS
+This may cause a slight speedup. The default is yes, even though the DNS
protocol RFCs mandate these sections, and the additional content could
-be of use and save roundtrips for clients.
+be of use and save roundtrips for clients. Because they are not used,
+and the saved roundtrips are easier saved with prefetch, whilst this is
+faster.
.TP
.B disable-dnssec-lame-check: \fI<yes or no>
If true, disables the DNSSEC lameness check in the iterator. This check
@@ -964,6 +1013,17 @@ If enabled, unbound attempts to serve old responses from cache with a
TTL of 0 in the response without waiting for the actual resolution to finish.
The actual resolution answer ends up in the cache later on. Default is "no".
.TP
+.B serve\-expired\-ttl: \fI<seconds>
+Limit serving of expired responses to configured seconds after expiration. 0
+disables the limit. This option only applies when \fBserve\-expired\fR is
+enabled. The default is 0.
+.TP
+.B serve\-expired\-ttl\-reset: \fI<yes or no>
+Set the TTL of expired records to the \fBserve\-expired\-ttl\fR value after a
+failed attempt to retrieve the record from upstream. This makes sure that the
+expired records will be served as long as there are queries for it. Default is
+"no".
+.TP
.B val\-nsec3\-keysize\-iterations: \fI<"list of values">
List of keysize and iteration count values, separated by spaces, surrounded
by quotes. Default is "1024 150 2048 500 4096 2500". This determines the
@@ -1012,7 +1072,7 @@ Number of bytes size of the aggressive negative cache. Default is 1 megabyte.
A plain number is in bytes, append 'k', 'm' or 'g' for kilobytes, megabytes
or gigabytes (1024*1024 bytes in a megabyte).
.TP
-.B unblock\-lan\-zones: \fI<yesno>
+.B unblock\-lan\-zones: \fI<yes or no>
Default is disabled. If enabled, then for private address space,
the reverse lookups are no longer filtered. This allows unbound when
running as dns service on a host where it provides service for that host,
@@ -1023,7 +1083,7 @@ as a (DHCP-) DNS network resolver for a group of machines, where such
lookups should be filtered (RFC compliance), this also stops potential
data leakage about the local network to the upstream DNS servers.
.TP
-.B insecure\-lan\-zones: \fI<yesno>
+.B insecure\-lan\-zones: \fI<yes or no>
Default is disabled. If enabled, then reverse lookups in private
address space are not validated. This is usually required whenever
\fIunblock\-lan\-zones\fR is used.
@@ -1470,6 +1530,10 @@ Default is no.
.TP
.B stub\-ssl\-upstream: \fI<yes or no>
Alternate syntax for \fBstub\-tls\-upstream\fR.
+.TP
+.B stub\-no\-cache: \fI<yes or no>
+Default is no. If enabled, data inside the stub is not cached. This is
+useful when you want immediate changes to be visible.
.SS "Forward Zone Options"
.LP
There may be multiple
@@ -1504,6 +1568,7 @@ the '@' and '#', the '@' comes first.
At high verbosity it logs the TLS certificate, with TLS enabled.
If you leave out the '#' and auth name from the forward\-addr, any
name is accepted. The cert must also match a CA from the tls\-cert\-bundle.
+The cert name match code needs OpenSSL 1.1.0 or later to be enabled.
.TP
.B forward\-first: \fI<yes or no>
If enabled, a query is attempted without the forward clause if it fails.
@@ -1514,11 +1579,15 @@ The default is no.
.B forward\-tls\-upstream: \fI<yes or no>
Enabled or disable whether the queries to this forwarder use TLS for transport.
Default is no.
-If you enable this, also configure a tls\-cert\-bundle or use tls\-win\cert to
+If you enable this, also configure a tls\-cert\-bundle or use tls\-win\-cert to
load CA certs, otherwise the connections cannot be authenticated.
.TP
.B forward\-ssl\-upstream: \fI<yes or no>
Alternate syntax for \fBforward\-tls\-upstream\fR.
+.TP
+.B forward\-no\-cache: \fI<yes or no>
+Default is no. If enabled, data inside the forward is not cached. This is
+useful when you want immediate changes to be visible.
.SS "Authority Zone Options"
.LP
Authority zones are configured with \fBauth\-zone:\fR, and each one must
@@ -1653,6 +1722,12 @@ It must be /96 or shorter. The default prefix is 64:ff9b::/96.
.B dns64\-synthall: \fI<yes or no>\fR
Debug option, default no. If enabled, synthesize all AAAA records
despite the presence of actual AAAA records.
+.TP
+.B dns64\-ignore\-aaaa: \fI<name>\fR
+List domain for which the AAAA records are ignored and the A record is
+used by dns64 processing instead. Can be entered multiple times, list a
+new domain for which it applies, one per line. Applies also to names
+underneath the name given.
.SS "DNSCrypt Options"
.LP
The
diff --git a/edns-subnet/subnetmod.c b/edns-subnet/subnetmod.c
index ae2523b86c23..1a5044e427cc 100644
--- a/edns-subnet/subnetmod.c
+++ b/edns-subnet/subnetmod.c
@@ -464,7 +464,12 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
memset(c_out, 0, sizeof(*c_out));
- if (!qstate->return_msg) return module_error;
+ if (!qstate->return_msg) {
+ /* already an answer and its not a message, but retain
+ * the actual rcode, instead of module_error, so send
+ * module_finished */
+ return module_finished;
+ }
/* We have not asked for subnet data */
if (!sq->subnet_sent) {
@@ -511,6 +516,7 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
lock_rw_wrlock(&sne->biglock);
update_cache(qstate, id);
+ sne->num_msg_nocache++;
lock_rw_unlock(&sne->biglock);
if (sq->subnet_downstream) {
@@ -693,6 +699,7 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
lock_rw_wrlock(&sne->biglock);
if (lookup_and_reply(qstate, id, sq)) {
+ sne->num_msg_cache++;
lock_rw_unlock(&sne->biglock);
verbose(VERB_QUERY, "subnet: answered from cache");
qstate->ext_state[id] = module_finished;
@@ -741,7 +748,8 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
/* Query handed back by next module, we have a 'final' answer */
if(sq && event == module_event_moddone) {
qstate->ext_state[id] = eval_response(qstate, id, sq);
- if(qstate->ext_state[id] == module_finished) {
+ if(qstate->ext_state[id] == module_finished &&
+ qstate->return_msg) {
ecs_opt_list_append(&sq->ecs_client_out,
&qstate->edns_opts_front_out, qstate);
}
diff --git a/edns-subnet/subnetmod.h b/edns-subnet/subnetmod.h
index c7f56327f9d2..f417a64a45b0 100644
--- a/edns-subnet/subnetmod.h
+++ b/edns-subnet/subnetmod.h
@@ -61,6 +61,10 @@ struct subnet_env {
/** allocation service */
struct alloc_cache alloc;
lock_rw_type biglock;
+ /** number of messages from cache */
+ size_t num_msg_cache;
+ /** number of messages not from cache */
+ size_t num_msg_nocache;
};
struct subnet_msg_cache_data {
diff --git a/ipsecmod/ipsecmod.c b/ipsecmod/ipsecmod.c
index 3e4ee6a53508..c8400c6333ee 100644
--- a/ipsecmod/ipsecmod.c
+++ b/ipsecmod/ipsecmod.c
@@ -341,6 +341,8 @@ ipsecmod_handle_query(struct module_qstate* qstate,
qstate->env->cfg->ipsecmod_max_ttl;
qstate->return_msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(
qstate->return_msg->rep->ttl);
+ qstate->return_msg->rep->serve_expired_ttl = qstate->return_msg->rep->ttl +
+ qstate->env->cfg->serve_expired_ttl;
}
}
}
diff --git a/iterator/iter_delegpt.h b/iterator/iter_delegpt.h
index 354bd6177380..6c088264588f 100644
--- a/iterator/iter_delegpt.h
+++ b/iterator/iter_delegpt.h
@@ -85,6 +85,8 @@ struct delegpt {
uint8_t ssl_upstream;
/** delegpt from authoritative zone that is locally hosted */
uint8_t auth_dp;
+ /*** no cache */
+ int no_cache;
};
/**
diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c
index a44f54386dc4..4eb0eb718607 100644
--- a/iterator/iter_fwd.c
+++ b/iterator/iter_fwd.c
@@ -239,6 +239,11 @@ read_fwds_addr(struct config_stub* s, struct delegpt* dp)
s->name, p->str);
return 0;
}
+#ifndef HAVE_SSL_SET1_HOST
+ if(tls_auth_name)
+ log_err("no name verification functionality in "
+ "ssl library, ignored name for %s", p->str);
+#endif
if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
tls_auth_name)) {
log_err("out of memory");
@@ -267,6 +272,8 @@ read_forwards(struct iter_forwards* fwd, struct config_file* cfg)
* last resort will ask for parent-side NS record and thus
* fallback to the internet name servers on a failure */
dp->has_parent_side_NS = (uint8_t)!s->isfirst;
+ /* Do not cache if set. */
+ dp->no_cache = s->no_cache;
/* use SSL for queries to this forwarder */
dp->ssl_upstream = (uint8_t)s->ssl_upstream;
verbose(VERB_QUERY, "Forward zone server list:");
diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c
index e8d09338e974..0b35a9d9e24f 100644
--- a/iterator/iter_hints.c
+++ b/iterator/iter_hints.c
@@ -252,6 +252,11 @@ read_stubs_addr(struct config_stub* s, struct delegpt* dp)
s->name, p->str);
return 0;
}
+#ifndef HAVE_SSL_SET1_HOST
+ if(auth_name)
+ log_err("no name verification functionality in "
+ "ssl library, ignored name for %s", p->str);
+#endif
if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
auth_name)) {
log_err("out of memory");
@@ -278,6 +283,8 @@ read_stubs(struct iter_hints* hints, struct config_file* cfg)
* last resort will ask for parent-side NS record and thus
* fallback to the internet name servers on a failure */
dp->has_parent_side_NS = (uint8_t)!s->isfirst;
+ /* Do not cache if set. */
+ dp->no_cache = s->no_cache;
/* ssl_upstream */
dp->ssl_upstream = (uint8_t)s->ssl_upstream;
delegpt_log(VERB_QUERY, dp);
diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c
index 0a8f7700fcf0..90c8cf114e33 100644
--- a/iterator/iter_utils.c
+++ b/iterator/iter_utils.c
@@ -375,11 +375,34 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
int got_num6 = 0;
int low_rtt6 = 0;
int i;
+ int attempt = -1; /* filter to make sure addresses have
+ less attempts on them than the first, to force round
+ robin when all the IPv6 addresses fail */
+ int num4ok = 0; /* number ip4 at low attempt count */
+ int num4_lowrtt = 0;
prev = NULL;
a = dp->result_list;
for(i = 0; i < got_num; i++) {
swap_to_front = 0;
+ if(a->addr.ss_family != AF_INET6 && attempt == -1) {
+ /* if we only have ip4 at low attempt count,
+ * then ip6 is failing, and we need to
+ * select one of the remaining IPv4 addrs */
+ attempt = a->attempts;
+ num4ok++;
+ num4_lowrtt = a->sel_rtt;
+ } else if(a->addr.ss_family != AF_INET6 && attempt == a->attempts) {
+ num4ok++;
+ if(num4_lowrtt == 0 || a->sel_rtt < num4_lowrtt) {
+ num4_lowrtt = a->sel_rtt;
+ }
+ }
if(a->addr.ss_family == AF_INET6) {
+ if(attempt == -1) {
+ attempt = a->attempts;
+ } else if(a->attempts > attempt) {
+ break;
+ }
got_num6++;
swap_to_front = 1;
if(low_rtt6 == 0 || a->sel_rtt < low_rtt6) {
@@ -401,6 +424,9 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
if(got_num6 > 0) {
got_num = got_num6;
*selected_rtt = low_rtt6;
+ } else if(num4ok > 0) {
+ got_num = num4ok;
+ *selected_rtt = num4_lowrtt;
}
}
return got_num;
diff --git a/iterator/iterator.c b/iterator/iterator.c
index 58a9bff6634c..e99a559fae4d 100644
--- a/iterator/iterator.c
+++ b/iterator/iterator.c
@@ -230,11 +230,12 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super)
qstate->qinfo.qname, qstate->qinfo.qname_len);
if(!dpns) {
/* not interested */
+ /* this can happen, for eg. qname minimisation asked
+ * for an NXDOMAIN to be validated, and used qtype
+ * A for that, and the error of that, the name, is
+ * not listed in super_iq->dp */
verbose(VERB_ALGO, "subq error, but not interested");
log_query_info(VERB_ALGO, "superq", &super->qinfo);
- if(super_iq->dp)
- delegpt_log(VERB_ALGO, super_iq->dp);
- log_assert(0);
return;
} else {
/* see if the failure did get (parent-lame) info */
@@ -303,8 +304,20 @@ error_response_cache(struct module_qstate* qstate, int id, int rcode)
if((msg=msg_cache_lookup(qstate->env,
qstate->qinfo.qname, qstate->qinfo.qname_len,
qstate->qinfo.qtype, qstate->qinfo.qclass,
- qstate->query_flags, 0, 0))
+ qstate->query_flags, 0,
+ qstate->env->cfg->serve_expired_ttl_reset))
!= NULL) {
+ if(qstate->env->cfg->serve_expired_ttl_reset) {
+ struct reply_info* rep =
+ (struct reply_info*)msg->entry.data;
+ if(rep && *qstate->env->now +
+ qstate->env->cfg->serve_expired_ttl >
+ rep->serve_expired_ttl) {
+ rep->serve_expired_ttl =
+ *qstate->env->now +
+ qstate->env->cfg->serve_expired_ttl;
+ }
+ }
lock_rw_unlock(&msg->entry.lock);
return error_response(qstate, id, rcode);
}
@@ -318,6 +331,7 @@ error_response_cache(struct module_qstate* qstate, int id, int rcode)
err.qdcount = 1;
err.ttl = NORR_TTL;
err.prefetch_ttl = PREFETCH_TTL_CALC(err.ttl);
+ err.serve_expired_ttl = NORR_TTL;
/* do not waste time trying to validate this servfail */
err.security = sec_status_indeterminate;
verbose(VERB_ALGO, "store error response in message cache");
@@ -789,6 +803,7 @@ prime_stub(struct module_qstate* qstate, struct iter_qstate* iq, int id,
iq->dp = delegpt_copy(stub_dp, qstate->region);
if(!iq->dp) {
log_err("out of memory priming stub");
+ errinf(qstate, "malloc failure, priming stub");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return 1; /* return 1 to make module stop, with error */
}
@@ -807,6 +822,7 @@ prime_stub(struct module_qstate* qstate, struct iter_qstate* iq, int id,
LDNS_RR_TYPE_NS, qclass, qstate, id, iq,
QUERYTARGETS_STATE, PRIME_RESP_STATE, &subq, 0)) {
verbose(VERB_ALGO, "could not prime stub");
+ errinf(qstate, "could not generate lookup for stub prime");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return 1; /* return 1 to make module stop, with error */
}
@@ -822,6 +838,7 @@ prime_stub(struct module_qstate* qstate, struct iter_qstate* iq, int id,
fptr_ok(fptr_whitelist_modenv_kill_sub(
qstate->env->kill_sub));
(*qstate->env->kill_sub)(subq);
+ errinf(qstate, "malloc failure, in stub prime");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return 1; /* return 1 to make module stop, with error */
}
@@ -905,6 +922,7 @@ auth_zone_delegpt(struct module_qstate* qstate, struct iter_qstate* iq,
return 1; /* just fallback */
}
lock_rw_unlock(&z->lock);
+ errinf(qstate, "malloc failure");
return 0;
}
dp->name = regional_alloc_init(qstate->region,
@@ -916,6 +934,7 @@ auth_zone_delegpt(struct module_qstate* qstate, struct iter_qstate* iq,
return 1; /* just fallback */
}
lock_rw_unlock(&z->lock);
+ errinf(qstate, "malloc failure");
return 0;
}
dp->namelen = z->namelen;
@@ -1125,6 +1144,53 @@ forward_request(struct module_qstate* qstate, struct iter_qstate* iq)
return 1;
}
+static int
+iter_stub_fwd_no_cache(struct module_qstate *qstate, struct iter_qstate *iq)
+{
+ struct iter_hints_stub *stub;
+ struct delegpt *dp;
+
+ /* Check for stub. */
+ stub = hints_lookup_stub(qstate->env->hints, iq->qchase.qname,
+ iq->qchase.qclass, iq->dp);
+ dp = forwards_lookup(qstate->env->fwds, iq->qchase.qname, iq->qchase.qclass);
+
+ /* see if forward or stub is more pertinent */
+ if(stub && stub->dp && dp) {
+ if(dname_strict_subdomain(dp->name, dp->namelabs,
+ stub->dp->name, stub->dp->namelabs)) {
+ stub = NULL; /* ignore stub, forward is lower */
+ } else {
+ dp = NULL; /* ignore forward, stub is lower */
+ }
+ }
+
+ /* check stub */
+ if (stub != NULL && stub->dp != NULL) {
+ if(stub->dp->no_cache) {
+ char qname[255+1];
+ char dpname[255+1];
+ dname_str(iq->qchase.qname, qname);
+ dname_str(stub->dp->name, dpname);
+ verbose(VERB_ALGO, "stub for %s %s has no_cache", qname, dpname);
+ }
+ return (stub->dp->no_cache);
+ }
+
+ /* Check for forward. */
+ if (dp) {
+ if(dp->no_cache) {
+ char qname[255+1];
+ char dpname[255+1];
+ dname_str(iq->qchase.qname, qname);
+ dname_str(dp->name, dpname);
+ verbose(VERB_ALGO, "forward for %s %s has no_cache", qname, dpname);
+ }
+ return (dp->no_cache);
+ }
+ return 0;
+}
+
/**
* Process the initial part of the request handling. This state roughly
* corresponds to resolver algorithms steps 1 (find answer in cache) and 2
@@ -1159,6 +1225,10 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->query_restart_count > MAX_RESTART_COUNT) {
verbose(VERB_QUERY, "request has exceeded the maximum number"
" of query restarts with %d", iq->query_restart_count);
+ errinf(qstate, "request has exceeded the maximum number "
+ "restarts (eg. indirections)");
+ if(iq->qchase.qname)
+ errinf_dname(qstate, "stop at", iq->qchase.qname);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1170,6 +1240,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->depth > ie->max_dependency_depth) {
verbose(VERB_QUERY, "request has exceeded the maximum "
"dependency depth with depth of %d", iq->depth);
+ errinf(qstate, "request has exceeded the maximum dependency "
+ "depth (eg. nameserver lookup recursion)");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1196,7 +1268,13 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
/* This either results in a query restart (CNAME cache response), a
* terminating response (ANSWER), or a cache miss (null). */
- if(qstate->blacklist) {
+ if (iter_stub_fwd_no_cache(qstate, iq)) {
+ /* Asked to not query cache. */
+ verbose(VERB_ALGO, "no-cache set, going to the network");
+ qstate->no_cache_lookup = 1;
+ qstate->no_cache_store = 1;
+ msg = NULL;
+ } else if(qstate->blacklist) {
/* if cache, or anything else, was blacklisted then
* getting older results from cache is a bad idea, no cache */
verbose(VERB_ALGO, "cache blacklisted, going to the network");
@@ -1240,9 +1318,12 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
verbose(VERB_ALGO, "returning CNAME response from "
"cache");
if(!handle_cname_response(qstate, iq, msg,
- &sname, &slen))
+ &sname, &slen)) {
+ errinf(qstate, "failed to prepend CNAME "
+ "components, malloc failure");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
+ }
iq->qchase.qname = sname;
iq->qchase.qname_len = slen;
/* This *is* a query restart, even if it is a cheap
@@ -1260,6 +1341,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
/* if from cache, NULL, else insert 'cache IP' len=0 */
if(qstate->reply_origin)
sock_list_insert(&qstate->reply_origin, NULL, 0, qstate->region);
+ if(FLAGS_GET_RCODE(msg->rep->flags) == LDNS_RCODE_SERVFAIL)
+ errinf(qstate, "SERVFAIL in cache");
/* it is an answer, response, to final state */
verbose(VERB_ALGO, "returning answer from cache.");
iq->response = msg;
@@ -1271,6 +1354,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
{
if(!iq->dp) {
log_err("alloc failure for forward dp");
+ errinf(qstate, "malloc failure for forward zone");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
iq->refetch_glue = 0;
@@ -1290,6 +1374,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->refetch_glue) {
if(!iq->dp) {
log_err("internal or malloc fail: no dp for refetch");
+ errinf(qstate, "malloc failure, for delegation info");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
delname = iq->dp->name;
@@ -1349,12 +1434,14 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qchase.qclass);
if(!iq->dp) {
log_err("internal error: no hints dp");
+ errinf(qstate, "no hints for this class");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
iq->dp = delegpt_copy(iq->dp, qstate->region);
if(!iq->dp) {
log_err("out of memory in safety belt");
+ errinf(qstate, "malloc failure, in safety belt");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -1398,6 +1485,9 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
log_nametypeclass(VERB_ALGO, "ratelimit exceeded with "
"delegation point", iq->dp->name,
LDNS_RR_TYPE_NS, LDNS_RR_CLASS_IN);
+ qstate->was_ratelimited = 1;
+ errinf(qstate, "query was ratelimited");
+ errinf_dname(qstate, "for zone", iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
}
@@ -1427,6 +1517,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
if(!iq->dp) {
log_err("out of memory in "
"stub/fwd fallback");
+ errinf(qstate, "malloc failure, for fallback to config");
return error_response(qstate,
id, LDNS_RCODE_SERVFAIL);
}
@@ -1435,6 +1526,9 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
verbose(VERB_ALGO, "useless dp "
"but cannot go up, servfail");
delegpt_log(VERB_ALGO, iq->dp);
+ errinf(qstate, "no useful nameservers, "
+ "and cannot go up");
+ errinf_dname(qstate, "for zone", iq->dp->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -1454,6 +1548,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dp = delegpt_copy(iq->dp, qstate->region);
if(!iq->dp) {
log_err("out of memory in safety belt");
+ errinf(qstate, "malloc failure, in safety belt, for root");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -1508,6 +1603,7 @@ processInitRequest2(struct module_qstate* qstate, struct iter_qstate* iq,
struct iter_hints_stub* stub;
if(!iq->dp) {
log_err("internal or malloc fail: no dp for refetch");
+ errinf(qstate, "malloc failure, no delegation info");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
/* Do not send queries above stub, do not set delname to dp if
@@ -1798,6 +1894,8 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qchase.qclass, NULL)) {
/* fail -- no more targets, no more hope of targets, no hope
* of a response. */
+ errinf(qstate, "all the configured stub or forward servers failed,");
+ errinf_dname(qstate, "at zone", iq->dp->name);
verbose(VERB_QUERY, "configured stub or forward servers failed -- returning SERVFAIL");
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1857,6 +1955,8 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
int qs = 0;
verbose(VERB_ALGO, "try parent-side target name");
if(!query_for_targets(qstate, iq, ie, id, 1, &qs)) {
+ errinf(qstate, "could not fetch nameserver");
+ errinf_dname(qstate, "at zone", iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
iq->num_target_queries += qs;
@@ -1868,6 +1968,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
}
if(iq->depth == ie->max_dependency_depth) {
verbose(VERB_QUERY, "maxdepth and need more nameservers, fail");
+ errinf(qstate, "cannot fetch more nameservers because at max dependency depth");
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(iq->depth > 0 && iq->target_count &&
@@ -1876,6 +1977,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
dname_str(qstate->qinfo.qname, s);
verbose(VERB_QUERY, "request %s has exceeded the maximum "
"number of glue fetches %d", s, iq->target_count[1]);
+ errinf(qstate, "exceeded the maximum number of glue fetches");
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
/* mark cycle targets for parent-side lookups */
@@ -1901,9 +2003,11 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
/* Send the AAAA request. */
if(!generate_parentside_target_query(qstate, iq, id,
ns->name, ns->namelen,
- LDNS_RR_TYPE_AAAA, iq->qchase.qclass))
+ LDNS_RR_TYPE_AAAA, iq->qchase.qclass)) {
+ errinf_dname(qstate, "could not generate nameserver AAAA lookup for", ns->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
+ }
ns->done_pside6 = 1;
query_count++;
}
@@ -1911,9 +2015,11 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
/* Send the A request. */
if(!generate_parentside_target_query(qstate, iq, id,
ns->name, ns->namelen,
- LDNS_RR_TYPE_A, iq->qchase.qclass))
+ LDNS_RR_TYPE_A, iq->qchase.qclass)) {
+ errinf_dname(qstate, "could not generate nameserver A lookup for", ns->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
+ }
ns->done_pside4 = 1;
query_count++;
}
@@ -1934,6 +2040,8 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
iq->deleg_msg?iq->deleg_msg->rep:
(iq->response?iq->response->rep:NULL));
+ errinf(qstate, "all servers for this domain failed,");
+ errinf_dname(qstate, "at zone", iq->dp->name);
verbose(VERB_QUERY, "out of query targets -- returning SERVFAIL");
/* fail -- no more targets, no more hope of targets, no hope
* of a response. */
@@ -1967,6 +2075,7 @@ processDSNSFind(struct module_qstate* qstate, struct iter_qstate* iq, int id)
}
/* robustcheck for internal error: we are not underneath the dp */
if(!dname_subdomain_c(iq->dsns_point, iq->dp->name)) {
+ errinf_dname(qstate, "for DS query parent-child nameserver search the query is not under the zone", iq->dp->name);
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -1987,6 +2096,7 @@ processDSNSFind(struct module_qstate* qstate, struct iter_qstate* iq, int id)
if(!generate_sub_request(iq->dsns_point, iq->dsns_point_len,
LDNS_RR_TYPE_NS, iq->qchase.qclass, qstate, id, iq,
INIT_REQUEST_STATE, FINISHED_STATE, &subq, 0)) {
+ errinf_dname(qstate, "for DS query parent-child nameserver search, could not generate NS lookup for", iq->dsns_point);
return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -2032,11 +2142,13 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
if(iq->referral_count > MAX_REFERRAL_COUNT) {
verbose(VERB_QUERY, "request has exceeded the maximum "
"number of referrrals with %d", iq->referral_count);
+ errinf(qstate, "exceeded the maximum of referrals");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(iq->sent_count > MAX_SENT_COUNT) {
verbose(VERB_QUERY, "request has exceeded the maximum "
"number of sends with %d", iq->sent_count);
+ errinf(qstate, "exceeded the maximum number of sends");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -2044,6 +2156,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
* or another failure occurred */
if(!iq->dp) {
verbose(VERB_QUERY, "Failed to get a delegation, giving up");
+ errinf(qstate, "failed to get a delegation (eg. prime failure)");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(!ie->supports_ipv6)
@@ -2203,6 +2316,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
* no internet fallback */
verbose(VERB_ALGO, "auth zone lookup failed, no fallback,"
" servfail");
+ errinf(qstate, "auth zone lookup failed, fallback is off");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
if(iq->dp && iq->dp->auth_dp) {
@@ -2228,6 +2342,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
int extra = 0;
size_t naddr, nres, navail;
if(!query_for_targets(qstate, iq, ie, id, -1, &extra)) {
+ errinf(qstate, "could not fetch nameservers for 0x20 fallback");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
iq->num_target_queries += extra;
@@ -2308,6 +2423,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
"missing target");
if(!query_for_targets(qstate, iq, ie, id,
1, &qs)) {
+ errinf(qstate, "could not fetch nameserver");
+ errinf_dname(qstate, "at zone", iq->dp->name);
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -2378,6 +2495,9 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
ie->num_queries_ratelimited++;
lock_basic_unlock(&ie->queries_ratelimit_lock);
verbose(VERB_ALGO, "query exceeded ratelimits");
+ qstate->was_ratelimited = 1;
+ errinf_dname(qstate, "exceeded ratelimit for zone",
+ iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
}
@@ -2542,6 +2662,15 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
/* DNAME to a subdomain loop; do not recurse */
type = RESPONSE_TYPE_ANSWER;
}
+ } else if(type == RESPONSE_TYPE_CNAME &&
+ iq->qchase.qtype == LDNS_RR_TYPE_CNAME &&
+ iq->minimisation_state == MINIMISE_STATE &&
+ query_dname_compare(iq->qchase.qname, iq->qinfo_out.qname) == 0) {
+ /* The minimised query for full QTYPE and hidden QTYPE can be
+ * classified as CNAME response type, even when the original
+ * QTYPE=CNAME. This should be treated as answer response type.
+ */
+ type = RESPONSE_TYPE_ANSWER;
}
/* handle each of the type cases */
@@ -2690,11 +2819,15 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dp = delegpt_from_message(iq->response, qstate->region);
if (qstate->env->cfg->qname_minimisation)
iq->minimisation_state = INIT_MINIMISE_STATE;
- if(!iq->dp)
+ if(!iq->dp) {
+ errinf(qstate, "malloc failure, for delegation point");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ }
if(!cache_fill_missing(qstate->env, iq->qchase.qclass,
- qstate->region, iq->dp))
+ qstate->region, iq->dp)) {
+ errinf(qstate, "malloc failure, copy extra info into delegation point");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ }
if(iq->store_parent_NS && query_dname_compare(iq->dp->name,
iq->store_parent_NS->name) == 0)
iter_merge_retry_counts(iq->dp, iq->store_parent_NS);
@@ -2756,8 +2889,10 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
}
/* Process the CNAME response. */
if(!handle_cname_response(qstate, iq, iq->response,
- &sname, &snamelen))
+ &sname, &snamelen)) {
+ errinf(qstate, "malloc failure, CNAME info");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
+ }
/* cache the CNAME response under the current query */
/* NOTE : set referral=1, so that rrsets get stored but not
* the partial query answer (CNAME only). */
@@ -2858,6 +2993,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dp->name, iq->dp->namelen, qstate->qinfo.qclass)) {
verbose(VERB_ALGO, "auth zone response bad, and no"
" fallback possible, servfail");
+ errinf_dname(qstate, "reponse is bad, no fallback, "
+ "for auth zone", iq->dp->name);
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
verbose(VERB_ALGO, "auth zone response was bad, "
@@ -2948,6 +3085,8 @@ processPrimeResponse(struct module_qstate* qstate, int id)
qstate->return_rcode = LDNS_RCODE_NOERROR;
qstate->return_msg = iq->response;
} else {
+ errinf(qstate, "prime response did not get an answer");
+ errinf_dname(qstate, "for", qstate->qinfo.qname);
qstate->return_rcode = LDNS_RCODE_SERVFAIL;
qstate->return_msg = NULL;
}
@@ -3091,6 +3230,7 @@ processDSNSResponse(struct module_qstate* qstate, int id,
foriq->dp = delegpt_from_message(qstate->return_msg, forq->region);
if(!foriq->dp) {
log_err("out of memory in dsns dp alloc");
+ errinf(qstate, "malloc failure, in DS search");
return; /* dp==NULL in QUERYTARGETS makes SERVFAIL */
}
/* success, go query the querytargets in the new dp (and go down) */
@@ -3191,6 +3331,8 @@ processClassResponse(struct module_qstate* qstate, int id,
to->rep->ttl = from->rep->ttl;
if(from->rep->prefetch_ttl < to->rep->prefetch_ttl)
to->rep->prefetch_ttl = from->rep->prefetch_ttl;
+ if(from->rep->serve_expired_ttl < to->rep->serve_expired_ttl)
+ to->rep->serve_expired_ttl = from->rep->serve_expired_ttl;
}
/* are we done? */
foriq->num_current_queries --;
@@ -3229,6 +3371,8 @@ processCollectClass(struct module_qstate* qstate, int id)
c, qstate, id, iq, INIT_REQUEST_STATE,
FINISHED_STATE, &subq,
(int)!(qstate->query_flags&BIT_CD))) {
+ errinf(qstate, "could not generate class ANY"
+ " lookup query");
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
}
@@ -3275,6 +3419,7 @@ processFinished(struct module_qstate* qstate, struct iter_qstate* iq,
(iq->response?iq->response->rep:NULL));
if(!iq->response) {
verbose(VERB_ALGO, "No response is set, servfail");
+ errinf(qstate, "(no response found at query finish)");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
@@ -3445,6 +3590,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
iq->caps_server = 0;
iq->caps_reply = NULL;
iq->caps_response = NULL;
+ iq->caps_minimisation_state = DONOT_MINIMISE_STATE;
iq->state = QUERYTARGETS_STATE;
iq->num_current_queries--;
/* need fresh attempts for the 0x20 fallback, if
@@ -3459,6 +3605,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
|| !qstate->reply) {
log_err("Bad event combined with response");
outbound_list_remove(&iq->outlist, outbound);
+ errinf(qstate, "module iterator received wrong internal event with a response message");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return;
}
@@ -3511,6 +3658,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
iq->caps_server = 0;
iq->caps_reply = NULL;
iq->caps_response = NULL;
+ iq->caps_minimisation_state = DONOT_MINIMISE_STATE;
iq->state = QUERYTARGETS_STATE;
iq->num_current_queries--;
verbose(VERB_DETAIL, "Capsforid: scrub failed, starting fallback with no response");
@@ -3530,15 +3678,30 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
iq->response->rep);
if(event == module_event_capsfail || iq->caps_fallback) {
+ if(qstate->env->cfg->qname_minimisation &&
+ iq->minimisation_state != DONOT_MINIMISE_STATE) {
+ /* Skip QNAME minimisation for next query, since that
+ * one has to match the current query. */
+ iq->minimisation_state = SKIP_MINIMISE_STATE;
+ }
/* for fallback we care about main answer, not additionals */
/* removing that makes comparison more likely to succeed */
caps_strip_reply(iq->response->rep);
+
+ if(iq->caps_fallback &&
+ iq->caps_minimisation_state != iq->minimisation_state) {
+ /* QNAME minimisation state has changed, restart caps
+ * fallback. */
+ iq->caps_fallback = 0;
+ }
+
if(!iq->caps_fallback) {
/* start fallback */
iq->caps_fallback = 1;
iq->caps_server = 0;
iq->caps_reply = iq->response->rep;
iq->caps_response = iq->response;
+ iq->caps_minimisation_state = iq->minimisation_state;
iq->state = QUERYTARGETS_STATE;
iq->num_current_queries--;
verbose(VERB_DETAIL, "Capsforid: starting fallback");
@@ -3570,6 +3733,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
verbose(VERB_DETAIL, "Capsforid fallback: "
"getting different replies, failed");
outbound_list_remove(&iq->outlist, outbound);
+ errinf(qstate, "0x20 failed, then got different replies in fallback");
(void)error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
return;
@@ -3608,6 +3772,7 @@ iter_operate(struct module_qstate* qstate, enum module_ev event, int id,
if((event == module_event_new || event == module_event_pass) &&
iq == NULL) {
if(!iter_new(qstate, id)) {
+ errinf(qstate, "malloc failure, new iterator module allocation");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return;
}
@@ -3625,11 +3790,13 @@ iter_operate(struct module_qstate* qstate, enum module_ev event, int id,
}
if(event == module_event_error) {
verbose(VERB_ALGO, "got called with event error, giving up");
+ errinf(qstate, "iterator module got the error event");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return;
}
log_err("bad event for iterator");
+ errinf(qstate, "iterator module received wrong event");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
}
diff --git a/iterator/iterator.h b/iterator/iterator.h
index 67ffeb147631..57cb7c4c474e 100644
--- a/iterator/iterator.h
+++ b/iterator/iterator.h
@@ -371,6 +371,9 @@ struct iter_qstate {
/** QNAME minimisation state, RFC7816 */
enum minimisation_state minimisation_state;
+ /** State for capsfail: QNAME minimisation state for comparisons. */
+ enum minimisation_state caps_minimisation_state;
+
/**
* The query info that is sent upstream. Will be a subset of qchase
* when qname minimisation is enabled.
diff --git a/libunbound/context.c b/libunbound/context.c
index 6ac8086bf672..9a35ce56f30f 100644
--- a/libunbound/context.c
+++ b/libunbound/context.c
@@ -71,9 +71,8 @@ context_finalize(struct ub_ctx* ctx)
return UB_INITFAIL;
if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1))
return UB_INITFAIL;
- if(!ctx->env->msg_cache ||
- cfg->msg_cache_size != slabhash_get_size(ctx->env->msg_cache) ||
- cfg->msg_cache_slabs != ctx->env->msg_cache->size) {
+ if(!slabhash_is_size(ctx->env->msg_cache, cfg->msg_cache_size,
+ cfg->msg_cache_slabs)) {
slabhash_delete(ctx->env->msg_cache);
ctx->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
HASH_DEFAULT_STARTARRAY, cfg->msg_cache_size,
@@ -294,26 +293,29 @@ context_serialize_answer(struct ctx_query* q, int err, sldns_buffer* pkt,
* o uint32 id
* o uint32 error_code
* o uint32 msg_security
+ * o uint32 was_ratelimited
* o uint32 length of why_bogus string (+1 for eos); 0 absent.
* o why_bogus_string
* o the remainder is the answer msg from resolver lookup.
* remainder can be length 0.
*/
+ size_t size_of_uint32s = 6 * sizeof(uint32_t);
size_t pkt_len = pkt?sldns_buffer_remaining(pkt):0;
size_t wlen = (pkt&&q->res->why_bogus)?strlen(q->res->why_bogus)+1:0;
uint8_t* p;
- *len = sizeof(uint32_t)*5 + pkt_len + wlen;
+ *len = size_of_uint32s + pkt_len + wlen;
p = (uint8_t*)malloc(*len);
if(!p) return NULL;
sldns_write_uint32(p, UB_LIBCMD_ANSWER);
sldns_write_uint32(p+sizeof(uint32_t), (uint32_t)q->querynum);
sldns_write_uint32(p+2*sizeof(uint32_t), (uint32_t)err);
sldns_write_uint32(p+3*sizeof(uint32_t), (uint32_t)q->msg_security);
- sldns_write_uint32(p+4*sizeof(uint32_t), (uint32_t)wlen);
+ sldns_write_uint32(p+4*sizeof(uint32_t), (uint32_t)q->res->was_ratelimited);
+ sldns_write_uint32(p+5*sizeof(uint32_t), (uint32_t)wlen);
if(wlen > 0)
- memmove(p+5*sizeof(uint32_t), q->res->why_bogus, wlen);
+ memmove(p+size_of_uint32s, q->res->why_bogus, wlen);
if(pkt_len > 0)
- memmove(p+5*sizeof(uint32_t)+wlen,
+ memmove(p+size_of_uint32s+wlen,
sldns_buffer_begin(pkt), pkt_len);
return p;
}
@@ -322,21 +324,23 @@ struct ctx_query*
context_deserialize_answer(struct ub_ctx* ctx,
uint8_t* p, uint32_t len, int* err)
{
+ size_t size_of_uint32s = 6 * sizeof(uint32_t);
struct ctx_query* q = NULL ;
int id;
size_t wlen;
- if(len < 5*sizeof(uint32_t)) return NULL;
+ if(len < size_of_uint32s) return NULL;
log_assert( sldns_read_uint32(p) == UB_LIBCMD_ANSWER);
id = (int)sldns_read_uint32(p+sizeof(uint32_t));
q = (struct ctx_query*)rbtree_search(&ctx->queries, &id);
if(!q) return NULL;
*err = (int)sldns_read_uint32(p+2*sizeof(uint32_t));
q->msg_security = sldns_read_uint32(p+3*sizeof(uint32_t));
- wlen = (size_t)sldns_read_uint32(p+4*sizeof(uint32_t));
- if(len > 5*sizeof(uint32_t) && wlen > 0) {
- if(len >= 5*sizeof(uint32_t)+wlen)
+ q->res->was_ratelimited = (int)sldns_read_uint32(p+4*sizeof(uint32_t));
+ wlen = (size_t)sldns_read_uint32(p+5*sizeof(uint32_t));
+ if(len > size_of_uint32s && wlen > 0) {
+ if(len >= size_of_uint32s+wlen)
q->res->why_bogus = (char*)memdup(
- p+5*sizeof(uint32_t), wlen);
+ p+size_of_uint32s, wlen);
if(!q->res->why_bogus) {
/* pass malloc failure to the user callback */
q->msg_len = 0;
@@ -345,9 +349,9 @@ context_deserialize_answer(struct ub_ctx* ctx,
}
q->res->why_bogus[wlen-1] = 0; /* zero terminated for sure */
}
- if(len > 5*sizeof(uint32_t)+wlen) {
- q->msg_len = len - 5*sizeof(uint32_t) - wlen;
- q->msg = (uint8_t*)memdup(p+5*sizeof(uint32_t)+wlen,
+ if(len > size_of_uint32s+wlen) {
+ q->msg_len = len - size_of_uint32s - wlen;
+ q->msg = (uint8_t*)memdup(p+size_of_uint32s+wlen,
q->msg_len);
if(!q->msg) {
/* pass malloc failure to the user callback */
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
index 3dcaa7818f7d..05006a0ec44c 100644
--- a/libunbound/libworker.c
+++ b/libunbound/libworker.c
@@ -521,8 +521,9 @@ libworker_enter_result(struct ub_result* res, sldns_buffer* buf,
/** fillup fg results */
static void
libworker_fillup_fg(struct ctx_query* q, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus)
+ enum sec_status s, char* why_bogus, int was_ratelimited)
{
+ q->res->was_ratelimited = was_ratelimited;
if(why_bogus)
q->res->why_bogus = strdup(why_bogus);
if(rcode != 0) {
@@ -546,13 +547,13 @@ libworker_fillup_fg(struct ctx_query* q, int rcode, sldns_buffer* buf,
void
libworker_fg_done_cb(void* arg, int rcode, sldns_buffer* buf, enum sec_status s,
- char* why_bogus)
+ char* why_bogus, int was_ratelimited)
{
struct ctx_query* q = (struct ctx_query*)arg;
/* fg query is done; exit comm base */
comm_base_exit(q->w->base);
- libworker_fillup_fg(q, rcode, buf, s, why_bogus);
+ libworker_fillup_fg(q, rcode, buf, s, why_bogus, was_ratelimited);
}
/** setup qinfo and edns */
@@ -603,16 +604,16 @@ int libworker_fg(struct ub_ctx* ctx, struct ctx_query* q)
NULL, 0, NULL, 0, NULL)) {
regional_free_all(w->env->scratch);
libworker_fillup_fg(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
libworker_delete(w);
free(qinfo.qname);
return UB_NOERROR;
}
if(ctx->env->auth_zones && auth_zones_answer(ctx->env->auth_zones,
- w->env, &qinfo, &edns, w->back->udp_buff, w->env->scratch)) {
+ w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
regional_free_all(w->env->scratch);
libworker_fillup_fg(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
libworker_delete(w);
free(qinfo.qname);
return UB_NOERROR;
@@ -634,7 +635,7 @@ int libworker_fg(struct ub_ctx* ctx, struct ctx_query* q)
void
libworker_event_done_cb(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus)
+ enum sec_status s, char* why_bogus, int was_ratelimited)
{
struct ctx_query* q = (struct ctx_query*)arg;
ub_event_callback_type cb = q->cb_event;
@@ -657,7 +658,7 @@ libworker_event_done_cb(void* arg, int rcode, sldns_buffer* buf,
else if(s == sec_status_secure)
sec = 2;
(*cb)(cb_arg, rcode, (void*)sldns_buffer_begin(buf),
- (int)sldns_buffer_limit(buf), sec, why_bogus);
+ (int)sldns_buffer_limit(buf), sec, why_bogus, was_ratelimited);
}
}
@@ -684,15 +685,15 @@ int libworker_attach_mesh(struct ub_ctx* ctx, struct ctx_query* q,
regional_free_all(w->env->scratch);
free(qinfo.qname);
libworker_event_done_cb(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
return UB_NOERROR;
}
if(ctx->env->auth_zones && auth_zones_answer(ctx->env->auth_zones,
- w->env, &qinfo, &edns, w->back->udp_buff, w->env->scratch)) {
+ w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
regional_free_all(w->env->scratch);
free(qinfo.qname);
libworker_event_done_cb(q, LDNS_RCODE_NOERROR,
- w->back->udp_buff, sec_status_insecure, NULL);
+ w->back->udp_buff, sec_status_insecure, NULL, 0);
return UB_NOERROR;
}
/* process new query */
@@ -710,7 +711,7 @@ int libworker_attach_mesh(struct ub_ctx* ctx, struct ctx_query* q,
/** add result to the bg worker result queue */
static void
add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
- int err, char* reason)
+ int err, char* reason, int was_ratelimited)
{
uint8_t* msg = NULL;
uint32_t len = 0;
@@ -724,19 +725,23 @@ add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
lock_basic_lock(&w->ctx->cfglock);
if(reason)
q->res->why_bogus = strdup(reason);
+ q->res->was_ratelimited = was_ratelimited;
if(pkt) {
q->msg_len = sldns_buffer_remaining(pkt);
q->msg = memdup(sldns_buffer_begin(pkt), q->msg_len);
- if(!q->msg)
- msg = context_serialize_answer(q, UB_NOMEM,
- NULL, &len);
- else msg = context_serialize_answer(q, err,
- NULL, &len);
- } else msg = context_serialize_answer(q, err, NULL, &len);
+ if(!q->msg) {
+ msg = context_serialize_answer(q, UB_NOMEM, NULL, &len);
+ } else {
+ msg = context_serialize_answer(q, err, NULL, &len);
+ }
+ } else {
+ msg = context_serialize_answer(q, err, NULL, &len);
+ }
lock_basic_unlock(&w->ctx->cfglock);
} else {
if(reason)
q->res->why_bogus = strdup(reason);
+ q->res->was_ratelimited = was_ratelimited;
msg = context_serialize_answer(q, err, pkt, &len);
(void)rbtree_delete(&w->ctx->queries, q->node.key);
w->ctx->num_async--;
@@ -755,7 +760,7 @@ add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
void
libworker_bg_done_cb(void* arg, int rcode, sldns_buffer* buf, enum sec_status s,
- char* why_bogus)
+ char* why_bogus, int was_ratelimited)
{
struct ctx_query* q = (struct ctx_query*)arg;
@@ -773,12 +778,13 @@ libworker_bg_done_cb(void* arg, int rcode, sldns_buffer* buf, enum sec_status s,
return;
}
q->msg_security = s;
- if(!buf)
+ if(!buf) {
buf = q->w->env->scratch_buffer;
+ }
if(rcode != 0) {
error_encode(buf, rcode, NULL, 0, BIT_RD, NULL);
}
- add_bg_result(q->w, q, buf, UB_NOERROR, why_bogus);
+ add_bg_result(q->w, q, buf, UB_NOERROR, why_bogus, was_ratelimited);
}
@@ -803,7 +809,7 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
return;
}
if(!setup_qinfo_edns(w, q, &qinfo, &edns)) {
- add_bg_result(w, q, NULL, UB_SYNTAX, NULL);
+ add_bg_result(w, q, NULL, UB_SYNTAX, NULL, 0);
return;
}
qid = 0;
@@ -816,15 +822,15 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
NULL, 0, NULL, 0, NULL)) {
regional_free_all(w->env->scratch);
q->msg_security = sec_status_insecure;
- add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL);
+ add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL, 0);
free(qinfo.qname);
return;
}
if(w->ctx->env->auth_zones && auth_zones_answer(w->ctx->env->auth_zones,
- w->env, &qinfo, &edns, w->back->udp_buff, w->env->scratch)) {
+ w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
regional_free_all(w->env->scratch);
q->msg_security = sec_status_insecure;
- add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL);
+ add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL, 0);
free(qinfo.qname);
return;
}
@@ -832,7 +838,7 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
/* process new query */
if(!mesh_new_callback(w->env->mesh, &qinfo, qflags, &edns,
w->back->udp_buff, qid, libworker_bg_done_cb, q)) {
- add_bg_result(w, q, NULL, UB_NOMEM, NULL);
+ add_bg_result(w, q, NULL, UB_NOMEM, NULL, 0);
}
free(qinfo.qname);
}
diff --git a/libunbound/python/examples/dnssec_test.py b/libunbound/python/examples/dnssec_test.py
index 430e51a8068a..b76c0437e3f6 100644
--- a/libunbound/python/examples/dnssec_test.py
+++ b/libunbound/python/examples/dnssec_test.py
@@ -29,6 +29,7 @@ def dnssecParse(domain, rrType=RR_TYPE_A):
resolver = ub_ctx()
resolver.add_ta(". IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5")
+resolver.add_ta(". IN DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D")
dnssecParse("nic.cz")
dnssecParse("nonexistent-domain-blablabla.cz")
diff --git a/libunbound/unbound-event.h b/libunbound/unbound-event.h
index d5f0b1a36fe7..4d694b8b4c5d 100644
--- a/libunbound/unbound-event.h
+++ b/libunbound/unbound-event.h
@@ -170,7 +170,7 @@ struct ub_event {
struct ub_event_vmt* vmt;
};
-typedef void (*ub_event_callback_type)(void*, int, void*, int, int, char*);
+typedef void (*ub_event_callback_type)(void*, int, void*, int, int, char*, int);
/**
* Create a resolving and validation context.
diff --git a/libunbound/unbound.h b/libunbound/unbound.h
index fbd69cab0e71..90766b062363 100644
--- a/libunbound/unbound.h
+++ b/libunbound/unbound.h
@@ -204,6 +204,12 @@ struct ub_result {
char* why_bogus;
/**
+ * If the query or one of its subqueries was ratelimited. Useful if
+ * ratelimiting is enabled and answer is SERVFAIL.
+ */
+ int was_ratelimited;
+
+ /**
* TTL for the result, in seconds. If the security is bogus, then
* you also cannot trust this value.
*/
@@ -674,6 +680,8 @@ struct ub_server_stats {
long long qtcp;
/** number of outgoing queries over TCP */
long long qtcp_outgoing;
+ /** number of queries over (DNS over) TLS */
+ long long qtls;
/** number of queries over IPv6 */
long long qipv6;
/** number of queries with QR bit */
@@ -757,6 +765,11 @@ struct ub_server_stats {
/** number of times neg cache records were used to generate NXDOMAIN
* responses. */
long long num_neg_cache_nxdomain;
+ /** number of queries answered from edns-subnet specific data */
+ long long num_query_subnet;
+ /** number of queries answered from edns-subnet specific data, and
+ * the answer was from the edns-subnet cache. */
+ long long num_query_subnet_cache;
};
/**
diff --git a/libunbound/worker.h b/libunbound/worker.h
index 7d2ede04ed09..fe1d51878a89 100644
--- a/libunbound/worker.h
+++ b/libunbound/worker.h
@@ -89,15 +89,15 @@ void libworker_handle_control_cmd(struct tube* tube, uint8_t* msg, size_t len,
/** mesh callback with fg results */
void libworker_fg_done_cb(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus);
+ enum sec_status s, char* why_bogus, int was_ratelimited);
/** mesh callback with bg results */
void libworker_bg_done_cb(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status s, char* why_bogus);
+ enum sec_status s, char* why_bogus, int was_ratelimited);
/** mesh callback with event results */
void libworker_event_done_cb(void* arg, int rcode, struct sldns_buffer* buf,
- enum sec_status s, char* why_bogus);
+ enum sec_status s, char* why_bogus, int was_ratelimited);
/**
* Worker signal handler function. User argument is the worker itself.
diff --git a/pythonmod/doc/examples/example6.rst b/pythonmod/doc/examples/example6.rst
index eb3254022946..d294fb8be618 100644
--- a/pythonmod/doc/examples/example6.rst
+++ b/pythonmod/doc/examples/example6.rst
@@ -40,9 +40,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with a resolved query.
+
:param qinfo: query_info struct;
:param qstate: module qstate. It contains the available opt_lists; It
SHOULD NOT be altered;
@@ -54,7 +57,13 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh states.
+
:return: True on success, False on failure.
+
"""
.. note:: The function's name is irrelevant.
@@ -76,9 +85,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from the cache.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -90,7 +102,17 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
+ For demonstration purposes we want to see if EDNS option 65002 is present
+ and reply with a new value.
+
"""
.. note:: The function's name is irrelevant.
@@ -112,9 +134,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from local data.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -126,7 +151,14 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
"""
.. note:: The function's name is irrelevant.
@@ -148,9 +180,12 @@ The callback function's prototype is the following:
.. code-block:: python
- def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
- """Function that will be registered as an inplace callback function.
+ def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with SERVFAIL.
+
:param qinfo: query_info struct;
:param qstate: module qstate. If not None the relevant opt_lists are
available here;
@@ -163,7 +198,17 @@ The callback function's prototype is the following:
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
+ For demonstration purposes we want to reply with an empty EDNS code '65003'
+ and log the IP address(es) of the client(s).
+
"""
.. note:: The function's name is irrelevant.
diff --git a/pythonmod/examples/inplace_callbacks.py b/pythonmod/examples/inplace_callbacks.py
index 02ee56e36e21..e47fc8292be2 100644
--- a/pythonmod/examples/inplace_callbacks.py
+++ b/pythonmod/examples/inplace_callbacks.py
@@ -6,18 +6,18 @@
Copyright (c) 2016, NLnet Labs.
This software is open source.
-
+
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
-
+
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
-
+
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
-
+
* Neither the name of the organization nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
@@ -43,6 +43,8 @@
# This query returns SERVFAIL as the txt record of bogus.nlnetlabs.nl is
# intentionally bogus. The reply will contain an empty EDNS option
# with option code 65003.
+# Unbound will also log the source address(es) of the client(s) that made
+# the request.
# (unbound needs to be validating for this example to work)
# Useful functions:
@@ -70,9 +72,11 @@
def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with a resolved query.
+
:param qinfo: query_info struct;
:param qstate: module qstate. It contains the available opt_lists; It
SHOULD NOT be altered;
@@ -84,16 +88,25 @@ def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
"""
log_info("python: called back while replying.")
return True
def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from the cache.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -105,10 +118,17 @@ def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
For demonstration purposes we want to see if EDNS option 65002 is present
and reply with a new value.
+
"""
log_info("python: called back while answering from cache.")
# Inspect the incoming EDNS options.
@@ -134,9 +154,11 @@ def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering from local data.
+
:param qinfo: query_info struct;
:param qstate: module qstate. None;
:param rep: reply_info struct;
@@ -148,7 +170,14 @@ def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
+
"""
log_info("python: called back while replying with local data or chaos"
" reply.")
@@ -156,9 +185,11 @@ def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
- region):
- """Function that will be registered as an inplace callback function.
+ region, **kwargs):
+ """
+ Function that will be registered as an inplace callback function.
It will be called when answering with SERVFAIL.
+
:param qinfo: query_info struct;
:param qstate: module qstate. If not None the relevant opt_lists are
available here;
@@ -171,23 +202,62 @@ def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
reply. It can be populated with EDNS options;
:param region: region to allocate temporary data. Needs to be used when we
want to append a new option to opt_list_out.
+ :param **kwargs: Dictionary that may contain parameters added in a future
+ release. Current parameters:
+ ``repinfo``: Reply information for a communication point (comm_reply).
+ It is None when the callback happens in the mesh
+ states(modules).
+
:return: True on success, False on failure.
- For demonstration purposes we want to reply with an empty EDNS code '65003'.
+ For demonstration purposes we want to reply with an empty EDNS code '65003'
+ and log the IP address(es) of the client(s).
+
"""
log_info("python: called back while servfail.")
+ # Append the example ENDS option
b = bytearray.fromhex("")
edns_opt_list_append(opt_list_out, 65003, b, region)
+
+ # Log the client(s) IP address(es)
+ comm_reply = kwargs['repinfo']
+ if comm_reply:
+ # If it is not None this callback was called before the query reached
+ # the mesh states(modules). There is only one client associated with
+ # this query.
+ addr = comm_reply.addr
+ port = comm_reply.port
+ addr_family = comm_reply.family
+ log_info("python: Client IP: {}({}), port: {}"
+ "".format(addr, addr_family, port))
+ else:
+ # If it is not None this callback was called while the query is in the
+ # mesh states(modules). In this case they may be multiple clients
+ # waiting for this query.
+ # The following code is the same as with the resip.py example.
+ rl = qstate.mesh_info.reply_list
+ while (rl):
+ if rl.query_reply:
+ q = rl.query_reply
+ log_info("python: Client IP: {}({}), port: {}"
+ "".format(q.addr, q.family, q.port))
+ rl = rl.next
+
+
return True
def init_standard(id, env):
- """New version of the init function.
+ """
+ New version of the init function.
+
The function's signature is the same as the C counterpart and allows for
extra functionality during init.
+
..note:: This function is preferred by unbound over the old init function.
..note:: The previously accessible configuration options can now be found in
env.cgf.
+
"""
log_info("python: inited script {}".format(env.cfg.python_script))
@@ -215,11 +285,14 @@ def init_standard(id, env):
def init(id, cfg):
- """Previous version init function.
+ """
+ Previous version of the init function.
+
..note:: This function is still supported for backwards compatibility when
the init_standard function is missing. When init_standard is
present this function SHOULD be omitted to avoid confusion to the
reader.
+
"""
return True
diff --git a/pythonmod/examples/resip.py b/pythonmod/examples/resip.py
index 6bcac7252cd2..4a9f24fc6448 100644
--- a/pythonmod/examples/resip.py
+++ b/pythonmod/examples/resip.py
@@ -47,7 +47,7 @@ def deinit(id): return True
def inform_super(id, qstate, superqstate, qdata): return True
def operate(id, event, qstate, qdata):
- print "Operate", event,"state:",qstate
+ print("Operate {} state: {}".format(event, qstate))
# Please note that if this module blocks, by moving to the validator
# to validate or iterator to lookup or spawn a subquery to look up,
@@ -61,14 +61,14 @@ def operate(id, event, qstate, qdata):
msg = DNSMessage(qstate.qinfo.qname_str, RR_TYPE_TXT, RR_CLASS_IN, PKT_QR | PKT_RA | PKT_AA)
#append RR
if (qstate.qinfo.qtype == RR_TYPE_TXT) or (qstate.qinfo.qtype == RR_TYPE_ANY):
- rl = qstate.mesh_info.reply_list
- while (rl):
- if rl.query_reply:
- q = rl.query_reply
- # The TTL of 0 is mandatory, otherwise it ends up in
- # the cache, and is returned to other IP addresses.
- msg.answer.append("%s 0 IN TXT \"%s %d (%s)\"" % (qstate.qinfo.qname_str, q.addr,q.port,q.family))
- rl = rl.next
+ rl = qstate.mesh_info.reply_list
+ while (rl):
+ if rl.query_reply:
+ q = rl.query_reply
+ # The TTL of 0 is mandatory, otherwise it ends up in
+ # the cache, and is returned to other IP addresses.
+ msg.answer.append("%s 0 IN TXT \"%s %d (%s)\"" % (qstate.qinfo.qname_str, q.addr,q.port,q.family))
+ rl = rl.next
#set qstate.return_msg
if not msg.set_return_msg(qstate):
@@ -90,7 +90,7 @@ def operate(id, event, qstate, qdata):
log_info("pythonmod: iterator module done")
qstate.ext_state[id] = MODULE_FINISHED
return True
-
+
log_err("pythonmod: bad event")
qstate.ext_state[id] = MODULE_ERROR
return True
diff --git a/pythonmod/interface.i b/pythonmod/interface.i
index df06d1064b04..96accb69cca6 100644
--- a/pythonmod/interface.i
+++ b/pythonmod/interface.i
@@ -1365,11 +1365,12 @@ int edns_opt_list_append(struct edns_option** list, uint16_t code, size_t len,
int python_inplace_cb_reply_generic(struct query_info* qinfo,
struct module_qstate* qstate, struct reply_info* rep, int rcode,
struct edns_data* edns, struct edns_option** opt_list_out,
- struct regional* region, int id, void* python_callback)
+ struct comm_reply* repinfo, struct regional* region, int id,
+ void* python_callback)
{
PyObject *func, *py_edns, *py_qstate, *py_opt_list_out, *py_qinfo;
- PyObject *py_rep, *py_region;
- PyObject *result;
+ PyObject *py_rep, *py_repinfo, *py_region;
+ PyObject *py_args, *py_kwargs, *result;
int res = 0;
PyGILState_STATE gstate = PyGILState_Ensure();
@@ -1381,15 +1382,21 @@ int edns_opt_list_append(struct edns_option** list, uint16_t code, size_t len,
SWIGTYPE_p_p_edns_option, 0);
py_qinfo = SWIG_NewPointerObj((void*) qinfo, SWIGTYPE_p_query_info, 0);
py_rep = SWIG_NewPointerObj((void*) rep, SWIGTYPE_p_reply_info, 0);
+ py_repinfo = SWIG_NewPointerObj((void*) repinfo, SWIGTYPE_p_comm_reply, 0);
py_region = SWIG_NewPointerObj((void*) region, SWIGTYPE_p_regional, 0);
- result = PyObject_CallFunction(func, "OOOiOOO", py_qinfo, py_qstate,
- py_rep, rcode, py_edns, py_opt_list_out, py_region);
+ py_args = Py_BuildValue("(OOOiOOO)", py_qinfo, py_qstate, py_rep,
+ rcode, py_edns, py_opt_list_out, py_region);
+ py_kwargs = Py_BuildValue("{s:O}", "repinfo", py_repinfo);
+ result = PyObject_Call(func, py_args, py_kwargs);
Py_XDECREF(py_edns);
Py_XDECREF(py_qstate);
Py_XDECREF(py_opt_list_out);
Py_XDECREF(py_qinfo);
Py_XDECREF(py_rep);
+ Py_XDECREF(py_repinfo);
Py_XDECREF(py_region);
+ Py_XDECREF(py_args);
+ Py_XDECREF(py_kwargs);
if (result) {
res = PyInt_AsLong(result);
}
diff --git a/pythonmod/pythonmod.h b/pythonmod/pythonmod.h
index 7c7c0e751c30..991ae51a20a7 100644
--- a/pythonmod/pythonmod.h
+++ b/pythonmod/pythonmod.h
@@ -72,5 +72,6 @@ size_t pythonmod_get_mem(struct module_env* env, int id);
int python_inplace_cb_reply_generic(struct query_info* qinfo,
struct module_qstate* qstate, struct reply_info* rep, int rcode,
struct edns_data* edns, struct edns_option** opt_list_out,
- struct regional* region, int id, void* python_callback);
+ struct comm_reply* repinfo, struct regional* region, int id,
+ void* python_callback);
#endif /* PYTHONMOD_H */
diff --git a/respip/respip.c b/respip/respip.c
index 2e9313f271bb..135c45fe53c6 100644
--- a/respip/respip.c
+++ b/respip/respip.c
@@ -611,8 +611,9 @@ make_new_reply_info(const struct reply_info* rep, struct regional* region,
* EDNS0 OPT RR in the additional section appended on sending it out),
* so the total number of RRsets is an_numrrsets. */
new_rep = construct_reply_info_base(region, rep->flags,
- rep->qdcount, rep->ttl, rep->prefetch_ttl, an_numrrsets,
- 0, 0, an_numrrsets, sec_status_insecure);
+ rep->qdcount, rep->ttl, rep->prefetch_ttl,
+ rep->serve_expired_ttl, an_numrrsets, 0, 0, an_numrrsets,
+ sec_status_insecure);
if(!new_rep)
return NULL;
if(!reply_info_alloc_rrset_keys(new_rep, NULL, region))
diff --git a/services/authzone.c b/services/authzone.c
index f1ca2a2b0552..fe56c9f81b65 100644
--- a/services/authzone.c
+++ b/services/authzone.c
@@ -185,11 +185,13 @@ msg_ttl(struct dns_msg* msg)
if(msg->rep->rrset_count == 1) {
msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
} else if(get_rrset_ttl(msg->rep->rrsets[msg->rep->rrset_count-1]) <
msg->rep->ttl) {
msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[
msg->rep->rrset_count-1]);
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
}
}
@@ -1014,7 +1016,8 @@ rrset_moveover_rrsigs(struct auth_data* node, uint16_t rr_type,
}
/* copy base values */
memcpy(sigd, sigold, sizeof(struct packed_rrset_data));
- sigd->rrsig_count -= sigs;
+ /* in sigd the RRSIGs are stored in the base of the RR, in count */
+ sigd->count -= sigs;
/* setup rr_len */
sigd->rr_len = (size_t*)((uint8_t*)sigd +
sizeof(struct packed_rrset_data));
@@ -2284,6 +2287,7 @@ az_add_negative_soa(struct auth_zone* z, struct regional* region,
d->rr_ttl[0] = (time_t)minimum;
msg->rep->ttl = get_rrset_ttl(msg->rep->rrsets[0]);
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
return 1;
}
@@ -3168,8 +3172,8 @@ int auth_zones_lookup(struct auth_zones* az, struct query_info* qinfo,
/** encode auth answer */
static void
auth_answer_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- struct dns_msg* msg)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, struct dns_msg* msg)
{
uint16_t udpsize;
udpsize = edns->udp_size;
@@ -3179,7 +3183,7 @@ auth_answer_encode(struct query_info* qinfo, struct module_env* env,
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(env, qinfo, NULL, msg->rep,
- (int)FLAGS_GET_RCODE(msg->rep->flags), edns, temp)
+ (int)FLAGS_GET_RCODE(msg->rep->flags), edns, repinfo, temp)
|| !reply_info_answer_encode(qinfo, msg->rep,
*(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2),
@@ -3194,8 +3198,8 @@ auth_answer_encode(struct query_info* qinfo, struct module_env* env,
/** encode auth error answer */
static void
auth_error_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- int rcode)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, int rcode)
{
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
@@ -3203,7 +3207,7 @@ auth_error_encode(struct query_info* qinfo, struct module_env* env,
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(env, qinfo, NULL, NULL,
- rcode, edns, temp))
+ rcode, edns, repinfo, temp))
edns->opt_list = NULL;
error_encode(buf, rcode|BIT_AA, qinfo,
*(uint16_t*)sldns_buffer_begin(buf),
@@ -3211,8 +3215,8 @@ auth_error_encode(struct query_info* qinfo, struct module_env* env,
}
int auth_zones_answer(struct auth_zones* az, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, struct sldns_buffer* buf,
- struct regional* temp)
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, struct sldns_buffer* buf, struct regional* temp)
{
struct dns_msg* msg = NULL;
struct auth_zone* z;
@@ -3260,9 +3264,9 @@ int auth_zones_answer(struct auth_zones* az, struct module_env* env,
/* encode answer */
if(!r)
- auth_error_encode(qinfo, env, edns, buf, temp,
+ auth_error_encode(qinfo, env, edns, repinfo, buf, temp,
LDNS_RCODE_SERVFAIL);
- else auth_answer_encode(qinfo, env, edns, buf, temp, msg);
+ else auth_answer_encode(qinfo, env, edns, repinfo, buf, temp, msg);
return 1;
}
@@ -3470,6 +3474,23 @@ int auth_zones_notify(struct auth_zones* az, struct module_env* env,
return 1;
}
+int auth_zones_startprobesequence(struct auth_zones* az,
+ struct module_env* env, uint8_t* nm, size_t nmlen, uint16_t dclass)
+{
+ struct auth_xfer* xfr;
+ lock_rw_rdlock(&az->lock);
+ xfr = auth_xfer_find(az, nm, nmlen, dclass);
+ if(!xfr) {
+ lock_rw_unlock(&az->lock);
+ return 0;
+ }
+ lock_basic_lock(&xfr->lock);
+ lock_rw_unlock(&az->lock);
+
+ xfr_process_notify(xfr, env, 0, 0, NULL);
+ return 1;
+}
+
/** set a zone expired */
static void
auth_xfer_set_expired(struct auth_xfer* xfr, struct module_env* env,
@@ -5073,7 +5094,8 @@ xfr_transfer_nexttarget_or_end(struct auth_xfer* xfr, struct module_env* env)
xfr_transfer_disown(xfr);
/* pick up the nextprobe task and wait */
- xfr_set_timeout(xfr, env, 1, 0);
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 1, 0);
lock_basic_unlock(&xfr->lock);
}
@@ -5132,7 +5154,8 @@ xfr_master_add_addrs(struct auth_master* m, struct ub_packed_rrset_key* rrset,
/** callback for task_transfer lookup of host name, of A or AAAA */
void auth_xfer_transfer_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus))
+ enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus),
+ int ATTR_UNUSED(was_ratelimited))
{
struct auth_xfer* xfr = (struct auth_xfer*)arg;
struct module_env* env;
@@ -5530,7 +5553,8 @@ process_list_end_transfer(struct auth_xfer* xfr, struct module_env* env)
return;
} else {
/* pick up the nextprobe task and wait (normail wait time) */
- xfr_set_timeout(xfr, env, 0, 0);
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 0, 0);
}
lock_basic_unlock(&xfr->lock);
return;
@@ -5871,29 +5895,35 @@ auth_xfer_probe_udp_callback(struct comm_point* c, void* arg, int err,
return 0;
}
+ /* other tasks are running, we don't do this anymore */
+ xfr_probe_disown(xfr);
+ lock_basic_unlock(&xfr->lock);
+ /* return, we don't sent a reply to this udp packet,
+ * and we setup the tasks to do next */
+ return 0;
} else {
- /* if zone not updated, start the wait timer again */
- verbose(VERB_ALGO, "auth_zone unchanged, new lease, wait");
- if(xfr->have_zone)
- xfr->lease_time = *env->now;
- if(xfr->task_nextprobe->worker == NULL)
- xfr_set_timeout(xfr, env, 0, 0);
+ verbose(VERB_ALGO, "auth_zone master reports unchanged soa serial");
+ /* we if cannot find updates amongst the
+ * masters, this means we then have a new lease
+ * on the zone */
+ xfr->task_probe->have_new_lease = 1;
+ }
+ } else {
+ if(verbosity >= VERB_ALGO) {
+ char buf[256];
+ dname_str(xfr->name, buf);
+ verbose(VERB_ALGO, "auth zone %s: bad reply to soa probe", buf);
}
- /* other tasks are running, we don't do this anymore */
- xfr_probe_disown(xfr);
- lock_basic_unlock(&xfr->lock);
- /* return, we don't sent a reply to this udp packet,
- * and we setup the tasks to do next */
- return 0;
}
- }
- if(verbosity >= VERB_ALGO) {
- char buf[256];
- dname_str(xfr->name, buf);
- verbose(VERB_ALGO, "auth zone %s: soa probe failed", buf);
+ } else {
+ if(verbosity >= VERB_ALGO) {
+ char buf[256];
+ dname_str(xfr->name, buf);
+ verbose(VERB_ALGO, "auth zone %s: soa probe failed", buf);
+ }
}
- /* failed lookup */
+ /* failed lookup or not an update */
/* delete commpoint so a new one is created, with a fresh port nr */
comm_point_delete(xfr->task_probe->cp);
xfr->task_probe->cp = NULL;
@@ -5996,7 +6026,8 @@ xfr_probe_send_or_end(struct auth_xfer* xfr, struct module_env* env)
/* only wanted lookups for copy, stop probe and start wait */
xfr->task_probe->only_lookup = 0;
xfr_probe_disown(xfr);
- xfr_set_timeout(xfr, env, 0, 0);
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 0, 0);
lock_basic_unlock(&xfr->lock);
return;
}
@@ -6012,18 +6043,31 @@ xfr_probe_send_or_end(struct auth_xfer* xfr, struct module_env* env)
xfr_probe_nextmaster(xfr);
}
- /* we failed to send this as well, move to the wait task,
- * use the shorter retry timeout */
- xfr_probe_disown(xfr);
+ /* done with probe sequence, wait */
+ if(xfr->task_probe->have_new_lease) {
+ /* if zone not updated, start the wait timer again */
+ verbose(VERB_ALGO, "auth_zone unchanged, new lease, wait");
+ xfr_probe_disown(xfr);
+ if(xfr->have_zone)
+ xfr->lease_time = *env->now;
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 0, 0);
+ } else {
+ /* we failed to send this as well, move to the wait task,
+ * use the shorter retry timeout */
+ xfr_probe_disown(xfr);
+ /* pick up the nextprobe task and wait */
+ if(xfr->task_nextprobe->worker == NULL)
+ xfr_set_timeout(xfr, env, 1, 0);
+ }
- /* pick up the nextprobe task and wait */
- xfr_set_timeout(xfr, env, 1, 0);
lock_basic_unlock(&xfr->lock);
}
/** callback for task_probe lookup of host name, of A or AAAA */
void auth_xfer_probe_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
- enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus))
+ enum sec_status ATTR_UNUSED(sec), char* ATTR_UNUSED(why_bogus),
+ int ATTR_UNUSED(was_ratelimited))
{
struct auth_xfer* xfr = (struct auth_xfer*)arg;
struct module_env* env;
@@ -6151,6 +6195,8 @@ xfr_start_probe(struct auth_xfer* xfr, struct module_env* env,
xfr->task_probe->cp = NULL;
/* start the task */
+ /* have not seen a new lease yet, this scan */
+ xfr->task_probe->have_new_lease = 0;
/* if this was a timeout, no specific first master to scan */
/* otherwise, spec is nonNULL the notified master, scan
* first and also transfer first from it */
diff --git a/services/authzone.h b/services/authzone.h
index 4e06c0654d99..8c636eaa446c 100644
--- a/services/authzone.h
+++ b/services/authzone.h
@@ -309,6 +309,9 @@ struct auth_probe {
/** we only want to do lookups for making config work (for notify),
* don't proceed with UDP SOA probe queries */
int only_lookup;
+ /** we have seen a new lease this scan, because one of the masters
+ * replied with the current SOA serial version */
+ int have_new_lease;
/** once notified, or the timeout has been reached. a scan starts. */
/** the scan specific target (notify source), or NULL if none */
@@ -509,12 +512,13 @@ int auth_zones_lookup(struct auth_zones* az, struct query_info* qinfo,
* @param qinfo: query info (parsed).
* @param edns: edns info (parsed).
* @param buf: buffer with query ID and flags, also for reply.
+ * @param repinfo: reply information for a communication point.
* @param temp: temporary storage region.
* @return false if not answered
*/
int auth_zones_answer(struct auth_zones* az, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, struct sldns_buffer* buf,
- struct regional* temp);
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, struct sldns_buffer* buf, struct regional* temp);
/**
* Find the auth zone that is above the given qname.
@@ -588,6 +592,12 @@ int auth_zones_notify(struct auth_zones* az, struct module_env* env,
* returns 0 if no soa record in the notify */
int auth_zone_parse_notify_serial(struct sldns_buffer* pkt, uint32_t *serial);
+/** for the zone and if not already going, starts the probe sequence.
+ * false if zone cannot be found. This is like a notify arrived and was
+ * accepted for that zone. */
+int auth_zones_startprobesequence(struct auth_zones* az,
+ struct module_env* env, uint8_t* nm, size_t nmlen, uint16_t dclass);
+
/** read auth zone from zonefile. caller must lock zone. false on failure */
int auth_zone_read_zonefile(struct auth_zone* z);
@@ -637,10 +647,12 @@ int auth_xfer_transfer_http_callback(struct comm_point* c, void* arg, int err,
void auth_xfer_probe_timer_callback(void* arg);
/** mesh callback for task_probe on lookup of host names */
void auth_xfer_probe_lookup_callback(void* arg, int rcode,
- struct sldns_buffer* buf, enum sec_status sec, char* why_bogus);
+ struct sldns_buffer* buf, enum sec_status sec, char* why_bogus,
+ int was_ratelimited);
/** mesh callback for task_transfer on lookup of host names */
void auth_xfer_transfer_lookup_callback(void* arg, int rcode,
- struct sldns_buffer* buf, enum sec_status sec, char* why_bogus);
+ struct sldns_buffer* buf, enum sec_status sec, char* why_bogus,
+ int was_ratelimited);
/*
* Compares two 32-bit serial numbers as defined in RFC1982. Returns
diff --git a/services/cache/dns.c b/services/cache/dns.c
index 35adc35b57ee..01c9a8c5c10a 100644
--- a/services/cache/dns.c
+++ b/services/cache/dns.c
@@ -109,7 +109,7 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
}
/** delete message from message cache */
-static void
+void
msg_cache_remove(struct module_env* env, uint8_t* qname, size_t qnamelen,
uint16_t qtype, uint16_t qclass, uint16_t flags)
{
@@ -547,6 +547,7 @@ tomsg(struct module_env* env, struct query_info* q, struct reply_info* r,
if(r->prefetch_ttl > now)
msg->rep->prefetch_ttl = r->prefetch_ttl - now;
else msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
msg->rep->security = r->security;
msg->rep->an_numrrsets = r->an_numrrsets;
msg->rep->ns_numrrsets = r->ns_numrrsets;
@@ -601,6 +602,7 @@ rrset_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
msg->rep->qdcount = 1;
msg->rep->ttl = d->ttl - now;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0;
@@ -638,6 +640,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
msg->rep->qdcount = 1;
msg->rep->ttl = d->ttl - now;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(msg->rep->ttl);
+ msg->rep->serve_expired_ttl = msg->rep->ttl + SERVE_EXPIRED_TTL;
msg->rep->security = sec_status_unchecked;
msg->rep->an_numrrsets = 1;
msg->rep->ns_numrrsets = 0;
@@ -696,6 +699,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
newd->rr_ttl[0] = newd->ttl;
msg->rep->ttl = newd->ttl;
msg->rep->prefetch_ttl = PREFETCH_TTL_CALC(newd->ttl);
+ msg->rep->serve_expired_ttl = newd->ttl + SERVE_EXPIRED_TTL;
sldns_write_uint16(newd->rr_data[0], newlen);
memmove(newd->rr_data[0] + sizeof(uint16_t), newname, newlen);
msg->rep->an_numrrsets ++;
diff --git a/services/cache/dns.h b/services/cache/dns.h
index 78f81e799522..19d0d9f992d1 100644
--- a/services/cache/dns.h
+++ b/services/cache/dns.h
@@ -238,4 +238,16 @@ struct msgreply_entry* msg_cache_lookup(struct module_env* env,
uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
uint16_t flags, time_t now, int wr);
+/**
+ * Remove entry from the message cache. For unwanted entries.
+ * @param env: with message cache.
+ * @param qname: query name, in wireformat
+ * @param qnamelen: length of qname, including terminating 0.
+ * @param qtype: query type, host order.
+ * @param qclass: query class, host order.
+ * @param flags: flags
+ */
+void msg_cache_remove(struct module_env* env, uint8_t* qname, size_t qnamelen,
+ uint16_t qtype, uint16_t qclass, uint16_t flags);
+
#endif /* SERVICES_CACHE_DNS_H */
diff --git a/services/cache/infra.c b/services/cache/infra.c
index f4320306daa2..6f8fea6ad826 100644
--- a/services/cache/infra.c
+++ b/services/cache/infra.c
@@ -215,6 +215,18 @@ static int infra_ratelimit_cfg_insert(struct infra_cache* infra,
return 1;
}
+/** setup domain limits tree (0 on failure) */
+static int
+setup_domain_limits(struct infra_cache* infra, struct config_file* cfg)
+{
+ name_tree_init(&infra->domain_limits);
+ if(!infra_ratelimit_cfg_insert(infra, cfg)) {
+ return 0;
+ }
+ name_tree_init_parents(&infra->domain_limits);
+ return 1;
+}
+
struct infra_cache*
infra_create(struct config_file* cfg)
{
@@ -230,7 +242,6 @@ infra_create(struct config_file* cfg)
return NULL;
}
infra->host_ttl = cfg->host_ttl;
- name_tree_init(&infra->domain_limits);
infra_dp_ratelimit = cfg->ratelimit;
infra->domain_rates = slabhash_create(cfg->ratelimit_slabs,
INFRA_HOST_STARTSIZE, cfg->ratelimit_size,
@@ -241,11 +252,10 @@ infra_create(struct config_file* cfg)
return NULL;
}
/* insert config data into ratelimits */
- if(!infra_ratelimit_cfg_insert(infra, cfg)) {
+ if(!setup_domain_limits(infra, cfg)) {
infra_delete(infra);
return NULL;
}
- name_tree_init_parents(&infra->domain_limits);
infra_ip_ratelimit = cfg->ip_ratelimit;
infra->client_ip_rates = slabhash_create(cfg->ip_ratelimit_slabs,
INFRA_HOST_STARTSIZE, cfg->ip_ratelimit_size, &ip_rate_sizefunc,
@@ -285,12 +295,28 @@ infra_adjust(struct infra_cache* infra, struct config_file* cfg)
if(!infra)
return infra_create(cfg);
infra->host_ttl = cfg->host_ttl;
+ infra_dp_ratelimit = cfg->ratelimit;
+ infra_ip_ratelimit = cfg->ip_ratelimit;
maxmem = cfg->infra_cache_numhosts * (sizeof(struct infra_key)+
sizeof(struct infra_data)+INFRA_BYTES_NAME);
- if(maxmem != slabhash_get_size(infra->hosts) ||
- cfg->infra_cache_slabs != infra->hosts->size) {
+ /* divide cachesize by slabs and multiply by slabs, because if the
+ * cachesize is not an even multiple of slabs, that is the resulting
+ * size of the slabhash */
+ if(!slabhash_is_size(infra->hosts, maxmem, cfg->infra_cache_slabs) ||
+ !slabhash_is_size(infra->domain_rates, cfg->ratelimit_size,
+ cfg->ratelimit_slabs) ||
+ !slabhash_is_size(infra->client_ip_rates, cfg->ip_ratelimit_size,
+ cfg->ip_ratelimit_slabs)) {
infra_delete(infra);
infra = infra_create(cfg);
+ } else {
+ /* reapply domain limits */
+ traverse_postorder(&infra->domain_limits, domain_limit_free,
+ NULL);
+ if(!setup_domain_limits(infra, cfg)) {
+ infra_delete(infra);
+ return NULL;
+ }
}
return infra;
}
diff --git a/services/cache/rrset.c b/services/cache/rrset.c
index 26c1aeb91c62..8c0251bcb939 100644
--- a/services/cache/rrset.c
+++ b/services/cache/rrset.c
@@ -81,8 +81,8 @@ void rrset_cache_delete(struct rrset_cache* r)
struct rrset_cache* rrset_cache_adjust(struct rrset_cache *r,
struct config_file* cfg, struct alloc_cache* alloc)
{
- if(!r || !cfg || cfg->rrset_cache_slabs != r->table.size ||
- cfg->rrset_cache_size != slabhash_get_size(&r->table))
+ if(!r || !cfg || !slabhash_is_size(&r->table, cfg->rrset_cache_size,
+ cfg->rrset_cache_slabs))
{
rrset_cache_delete(r);
r = rrset_cache_create(cfg, alloc);
diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c
index 248cad3665b0..458bf6f513f2 100644
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -564,7 +564,8 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
/* detect freebsd jail with no ipv6 permission */
if(family==AF_INET6 && errno==EINVAL)
*noproto = 1;
- else if(errno != EADDRINUSE) {
+ else if(errno != EADDRINUSE &&
+ !(errno == EACCES && verbosity < 4 && !listen)) {
log_err_addr("can't bind socket", strerror(errno),
(struct sockaddr_storage*)addr, addrlen);
}
@@ -572,7 +573,8 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
close(s);
#else /* USE_WINSOCK */
if(WSAGetLastError() != WSAEADDRINUSE &&
- WSAGetLastError() != WSAEADDRNOTAVAIL) {
+ WSAGetLastError() != WSAEADDRNOTAVAIL &&
+ !(WSAGetLastError() == WSAEACCES && verbosity < 4 && !listen)) {
log_err_addr("can't bind socket",
wsa_strerror(WSAGetLastError()),
(struct sockaddr_storage*)addr, addrlen);
@@ -1216,7 +1218,8 @@ listen_cp_insert(struct comm_point* c, struct listen_dnsport* front)
struct listen_dnsport*
listen_create(struct comm_base* base, struct listen_port* ports,
- size_t bufsize, int tcp_accept_count, void* sslctx,
+ size_t bufsize, int tcp_accept_count, int tcp_idle_timeout,
+ struct tcl_list* tcp_conn_limit, void* sslctx,
struct dt_env* dtenv, comm_point_callback_type* cb, void *cb_arg)
{
struct listen_dnsport* front = (struct listen_dnsport*)
@@ -1243,10 +1246,12 @@ listen_create(struct comm_base* base, struct listen_port* ports,
else if(ports->ftype == listen_type_tcp ||
ports->ftype == listen_type_tcp_dnscrypt)
cp = comm_point_create_tcp(base, ports->fd,
- tcp_accept_count, bufsize, cb, cb_arg);
+ tcp_accept_count, tcp_idle_timeout,
+ tcp_conn_limit, bufsize, cb, cb_arg);
else if(ports->ftype == listen_type_ssl) {
cp = comm_point_create_tcp(base, ports->fd,
- tcp_accept_count, bufsize, cb, cb_arg);
+ tcp_accept_count, tcp_idle_timeout,
+ tcp_conn_limit, bufsize, cb, cb_arg);
cp->ssl = sslctx;
} else if(ports->ftype == listen_type_udpancil ||
ports->ftype == listen_type_udpancil_dnscrypt)
diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h
index fac0f7970924..46b432d4b934 100644
--- a/services/listen_dnsport.h
+++ b/services/listen_dnsport.h
@@ -47,6 +47,7 @@ struct listen_list;
struct config_file;
struct addrinfo;
struct sldns_buffer;
+struct tcl_list;
/**
* Listening for queries structure.
@@ -137,6 +138,8 @@ void listening_ports_free(struct listen_port* list);
* @param bufsize: size of datagram buffer.
* @param tcp_accept_count: max number of simultaneous TCP connections
* from clients.
+ * @param tcp_idle_timeout: idle timeout for TCP connections in msec.
+ * @param tcp_conn_limit: TCP connection limit info.
* @param sslctx: nonNULL if ssl context.
* @param dtenv: nonNULL if dnstap enabled.
* @param cb: callback function when a request arrives. It is passed
@@ -145,9 +148,10 @@ void listening_ports_free(struct listen_port* list);
* @return: the malloced listening structure, ready for use. NULL on error.
*/
struct listen_dnsport* listen_create(struct comm_base* base,
- struct listen_port* ports, size_t bufsize, int tcp_accept_count,
- void* sslctx, struct dt_env *dtenv, comm_point_callback_type* cb,
- void* cb_arg);
+ struct listen_port* ports, size_t bufsize,
+ int tcp_accept_count, int tcp_idle_timeout,
+ struct tcl_list* tcp_conn_limit, void* sslctx,
+ struct dt_env *dtenv, comm_point_callback_type* cb, void* cb_arg);
/**
* delete the listening structure
diff --git a/services/localzone.c b/services/localzone.c
index 0f608170c850..902a29f21d48 100644
--- a/services/localzone.c
+++ b/services/localzone.c
@@ -1146,8 +1146,9 @@ void local_zones_print(struct local_zones* zones)
/** encode answer consisting of 1 rrset */
static int
local_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- struct ub_packed_rrset_key* rrset, int ansec, int rcode)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, struct ub_packed_rrset_key* rrset, int ansec,
+ int rcode)
{
struct reply_info rep;
uint16_t udpsize;
@@ -1165,23 +1166,22 @@ local_encode(struct query_info* qinfo, struct module_env* env,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!inplace_cb_reply_local_call(env, qinfo, NULL, &rep, rcode, edns, temp)
- || !reply_info_answer_encode(qinfo, &rep,
- *(uint16_t*)sldns_buffer_begin(buf),
- sldns_buffer_read_u16_at(buf, 2),
- buf, 0, 0, temp, udpsize, edns,
- (int)(edns->bits&EDNS_DO), 0))
+ if(!inplace_cb_reply_local_call(env, qinfo, NULL, &rep, rcode, edns,
+ repinfo, temp) || !reply_info_answer_encode(qinfo, &rep,
+ *(uint16_t*)sldns_buffer_begin(buf), sldns_buffer_read_u16_at(buf, 2),
+ buf, 0, 0, temp, udpsize, edns, (int)(edns->bits&EDNS_DO), 0)) {
error_encode(buf, (LDNS_RCODE_SERVFAIL|BIT_AA), qinfo,
*(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2), edns);
+ }
return 1;
}
/** encode local error answer */
static void
local_error_encode(struct query_info* qinfo, struct module_env* env,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- int rcode, int r)
+ struct edns_data* edns, struct comm_reply* repinfo, sldns_buffer* buf,
+ struct regional* temp, int rcode, int r)
{
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
@@ -1189,7 +1189,7 @@ local_error_encode(struct query_info* qinfo, struct module_env* env,
edns->bits &= EDNS_DO;
if(!inplace_cb_reply_local_call(env, qinfo, NULL, NULL,
- rcode, edns, temp))
+ rcode, edns, repinfo, temp))
edns->opt_list = NULL;
error_encode(buf, r, qinfo, *(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2), edns);
@@ -1310,7 +1310,8 @@ find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
/** answer local data match */
static int
local_data_answer(struct local_zone* z, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, sldns_buffer* buf,
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, sldns_buffer* buf,
struct regional* temp, int labs, struct local_data** ldp,
enum localzone_type lz_type, int tag, struct config_strlist** tag_datas,
size_t tag_datas_size, char** tagname, int num_tags)
@@ -1339,7 +1340,7 @@ local_data_answer(struct local_zone* z, struct module_env* env,
* chain. */
if(qinfo->local_alias)
return 1;
- return local_encode(qinfo, env, edns, buf, temp,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp,
&r, 1, LDNS_RCODE_NOERROR);
}
}
@@ -1374,29 +1375,60 @@ local_data_answer(struct local_zone* z, struct module_env* env,
struct ub_packed_rrset_key r = *lr->rrset;
r.rk.dname = qinfo->qname;
r.rk.dname_len = qinfo->qname_len;
- return local_encode(qinfo, env, edns, buf, temp, &r, 1,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp, &r, 1,
LDNS_RCODE_NOERROR);
}
- return local_encode(qinfo, env, edns, buf, temp, lr->rrset, 1,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp, lr->rrset, 1,
LDNS_RCODE_NOERROR);
}
+/**
+ * See if the local zone does not cover the name, eg. the name is not
+ * in the zone and the zone is transparent */
+static int
+local_zone_does_not_cover(struct local_zone* z, struct query_info* qinfo,
+ int labs)
+{
+ struct local_data key;
+ struct local_data* ld = NULL;
+ struct local_rrset* lr = NULL;
+ if(z->type == local_zone_always_transparent)
+ return 1;
+ if(z->type != local_zone_transparent
+ && z->type != local_zone_typetransparent
+ && z->type != local_zone_inform)
+ return 0;
+ key.node.key = &key;
+ key.name = qinfo->qname;
+ key.namelen = qinfo->qname_len;
+ key.namelabs = labs;
+ ld = (struct local_data*)rbtree_search(&z->data, &key.node);
+ if(z->type == local_zone_transparent || z->type == local_zone_inform)
+ return (ld == NULL);
+ if(ld)
+ lr = local_data_find_type(ld, qinfo->qtype, 1);
+ /* local_zone_typetransparent */
+ return (lr == NULL);
+}
+
/**
- * answer in case where no exact match is found
- * @param z: zone for query
- * @param env: module environment
- * @param qinfo: query
- * @param edns: edns from query
+ * Answer in case where no exact match is found.
+ * @param z: zone for query.
+ * @param env: module environment.
+ * @param qinfo: query.
+ * @param edns: edns from query.
+ * @param repinfo: source address for checks. may be NULL.
* @param buf: buffer for answer.
- * @param temp: temp region for encoding
+ * @param temp: temp region for encoding.
* @param ld: local data, if NULL, no such name exists in localdata.
- * @param lz_type: type of the local zone
+ * @param lz_type: type of the local zone.
* @return 1 if a reply is to be sent, 0 if not.
*/
static int
lz_zone_answer(struct local_zone* z, struct module_env* env,
- struct query_info* qinfo, struct edns_data* edns, sldns_buffer* buf,
- struct regional* temp, struct local_data* ld, enum localzone_type lz_type)
+ struct query_info* qinfo, struct edns_data* edns,
+ struct comm_reply* repinfo, sldns_buffer* buf, struct regional* temp,
+ struct local_data* ld, enum localzone_type lz_type)
{
if(lz_type == local_zone_deny || lz_type == local_zone_inform_deny) {
/** no reply at all, signal caller by clearing buffer. */
@@ -1405,7 +1437,7 @@ lz_zone_answer(struct local_zone* z, struct module_env* env,
return 1;
} else if(lz_type == local_zone_refuse
|| lz_type == local_zone_always_refuse) {
- local_error_encode(qinfo, env, edns, buf, temp,
+ local_error_encode(qinfo, env, edns, repinfo, buf, temp,
LDNS_RCODE_REFUSED, (LDNS_RCODE_REFUSED|BIT_AA));
return 1;
} else if(lz_type == local_zone_static ||
@@ -1421,9 +1453,9 @@ lz_zone_answer(struct local_zone* z, struct module_env* env,
int rcode = (ld || lz_type == local_zone_redirect)?
LDNS_RCODE_NOERROR:LDNS_RCODE_NXDOMAIN;
if(z->soa)
- return local_encode(qinfo, env, edns, buf, temp,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp,
z->soa, 0, rcode);
- local_error_encode(qinfo, env, edns, buf, temp, rcode,
+ local_error_encode(qinfo, env, edns, repinfo, buf, temp, rcode,
(rcode|BIT_AA));
return 1;
} else if(lz_type == local_zone_typetransparent
@@ -1438,9 +1470,9 @@ lz_zone_answer(struct local_zone* z, struct module_env* env,
if(ld && ld->rrsets) {
int rcode = LDNS_RCODE_NOERROR;
if(z->soa)
- return local_encode(qinfo, env, edns, buf, temp,
+ return local_encode(qinfo, env, edns, repinfo, buf, temp,
z->soa, 0, rcode);
- local_error_encode(qinfo, env, edns, buf, temp, rcode,
+ local_error_encode(qinfo, env, edns, repinfo, buf, temp, rcode,
(rcode|BIT_AA));
return 1;
}
@@ -1459,7 +1491,7 @@ lz_inform_print(struct local_zone* z, struct query_info* qinfo,
uint16_t port = ntohs(((struct sockaddr_in*)&repinfo->addr)->sin_port);
dname_str(z->name, zname);
addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip));
- snprintf(txt, sizeof(txt), "%s inform %s@%u", zname, ip,
+ snprintf(txt, sizeof(txt), "%s %s %s@%u", zname, local_zone_type2str(z->type), ip,
(unsigned)port);
log_nametypeclass(0, txt, qinfo->qname, qinfo->qtype, qinfo->qclass);
}
@@ -1543,10 +1575,6 @@ local_zones_answer(struct local_zones* zones, struct module_env* env,
(z = local_zones_lookup(view->local_zones,
qinfo->qname, qinfo->qname_len, labs,
qinfo->qclass, qinfo->qtype))) {
- if(z->type != local_zone_noview)
- verbose(VERB_ALGO,
- "using localzone from view: %s",
- view->name);
lock_rw_rdlock(&z->lock);
lzt = z->type;
}
@@ -1554,10 +1582,24 @@ local_zones_answer(struct local_zones* zones, struct module_env* env,
lock_rw_unlock(&z->lock);
z = NULL;
}
+ if(z && (lzt == local_zone_transparent ||
+ lzt == local_zone_typetransparent ||
+ lzt == local_zone_inform ||
+ lzt == local_zone_always_transparent) &&
+ local_zone_does_not_cover(z, qinfo, labs)) {
+ lock_rw_unlock(&z->lock);
+ z = NULL;
+ }
if(view->local_zones && !z && !view->isfirst){
lock_rw_unlock(&view->lock);
return 0;
}
+ if(z && verbosity >= VERB_ALGO) {
+ char zname[255+1];
+ dname_str(z->name, zname);
+ verbose(VERB_ALGO, "using localzone %s %s from view %s",
+ zname, local_zone_type2str(lzt), view->name);
+ }
lock_rw_unlock(&view->lock);
}
if(!z) {
@@ -1570,27 +1612,33 @@ local_zones_answer(struct local_zones* zones, struct module_env* env,
return 0;
}
lock_rw_rdlock(&z->lock);
-
lzt = lz_type(taglist, taglen, z->taglist, z->taglen,
tagactions, tagactionssize, z->type, repinfo,
z->override_tree, &tag, tagname, num_tags);
lock_rw_unlock(&zones->lock);
+ if(z && verbosity >= VERB_ALGO) {
+ char zname[255+1];
+ dname_str(z->name, zname);
+ verbose(VERB_ALGO, "using localzone %s %s", zname,
+ local_zone_type2str(lzt));
+ }
}
- if((lzt == local_zone_inform || lzt == local_zone_inform_deny)
- && repinfo)
+ if((env->cfg->log_local_actions ||
+ lzt == local_zone_inform || lzt == local_zone_inform_deny)
+ && repinfo)
lz_inform_print(z, qinfo, repinfo);
if(lzt != local_zone_always_refuse
&& lzt != local_zone_always_transparent
&& lzt != local_zone_always_nxdomain
- && local_data_answer(z, env, qinfo, edns, buf, temp, labs, &ld, lzt,
- tag, tag_datas, tag_datas_size, tagname, num_tags)) {
+ && local_data_answer(z, env, qinfo, edns, repinfo, buf, temp, labs,
+ &ld, lzt, tag, tag_datas, tag_datas_size, tagname, num_tags)) {
lock_rw_unlock(&z->lock);
/* We should tell the caller that encode is deferred if we found
* a local alias. */
return !qinfo->local_alias;
}
- r = lz_zone_answer(z, env, qinfo, edns, buf, temp, ld, lzt);
+ r = lz_zone_answer(z, env, qinfo, edns, repinfo, buf, temp, ld, lzt);
lock_rw_unlock(&z->lock);
return r && !qinfo->local_alias; /* see above */
}
diff --git a/services/mesh.c b/services/mesh.c
index 41aba74ab260..c6bb9ef2bc63 100644
--- a/services/mesh.c
+++ b/services/mesh.c
@@ -55,6 +55,7 @@
#include "util/fptr_wlist.h"
#include "util/alloc.h"
#include "util/config_file.h"
+#include "util/edns.h"
#include "sldns/sbuffer.h"
#include "sldns/wire2str.h"
#include "services/localzone.h"
@@ -385,7 +386,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
if(!s) {
log_err("mesh_state_create: out of memory; SERVFAIL");
if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, NULL, NULL,
- LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
@@ -401,7 +402,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
if(!s->s.edns_opts_front_in) {
log_err("mesh_state_create: out of memory; SERVFAIL");
if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, NULL,
- NULL, LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ NULL, LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
@@ -429,7 +430,7 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
if(!mesh_state_add_reply(s, edns, rep, qid, qflags, qinfo)) {
log_err("mesh_new_client: out of memory; SERVFAIL");
if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, &s->s,
- NULL, LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ NULL, LDNS_RCODE_SERVFAIL, edns, rep, mesh->env->scratch))
edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
@@ -631,8 +632,8 @@ void mesh_report_reply(struct mesh_area* mesh, struct outbound_entry* e,
mesh_run(mesh, e->qstate->mesh_info, event, e);
}
-struct mesh_state*
-mesh_state_create(struct module_env* env, struct query_info* qinfo,
+struct mesh_state*
+mesh_state_create(struct module_env* env, struct query_info* qinfo,
struct respip_client_info* cinfo, uint16_t qflags, int prime,
int valrec)
{
@@ -693,6 +694,7 @@ mesh_state_create(struct module_env* env, struct query_info* qinfo,
mstate->s.no_cache_lookup = 0;
mstate->s.no_cache_store = 0;
mstate->s.need_refetch = 0;
+ mstate->s.was_ratelimited = 0;
/* init modules */
for(i=0; i<env->mesh->mods.num; i++) {
@@ -740,7 +742,7 @@ mesh_state_cleanup(struct mesh_state* mstate)
mstate->cb_list = cb->next;
fptr_ok(fptr_whitelist_mesh_cb(cb->cb));
(*cb->cb)(cb->cb_arg, LDNS_RCODE_SERVFAIL, NULL,
- sec_status_unchecked, NULL);
+ sec_status_unchecked, NULL, 0);
mesh->num_reply_addrs--;
}
}
@@ -968,7 +970,8 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
{
int secure;
char* reason = NULL;
- /* bogus messages are not made into servfail, sec_status passed
+ int was_ratelimited = m->s.was_ratelimited;
+ /* bogus messages are not made into servfail, sec_status passed
* to the callback function */
if(rep && rep->security == sec_status_secure)
secure = 1;
@@ -977,22 +980,23 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
rcode = LDNS_RCODE_SERVFAIL;
if(!rcode && (rep->security == sec_status_bogus ||
rep->security == sec_status_secure_sentinel_fail)) {
- if(!(reason = errinf_to_str(&m->s)))
+ if(!(reason = errinf_to_str_bogus(&m->s)))
rcode = LDNS_RCODE_SERVFAIL;
}
/* send the reply */
if(rcode) {
if(rcode == LDNS_RCODE_SERVFAIL) {
if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
- rep, rcode, &r->edns, m->s.region))
+ rep, rcode, &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
} else {
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep, rcode,
- &r->edns, m->s.region))
+ &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
}
fptr_ok(fptr_whitelist_mesh_cb(r->cb));
- (*r->cb)(r->cb_arg, rcode, r->buf, sec_status_unchecked, NULL);
+ (*r->cb)(r->cb_arg, rcode, r->buf, sec_status_unchecked, NULL,
+ was_ratelimited);
} else {
size_t udp_size = r->edns.udp_size;
sldns_buffer_clear(r->buf);
@@ -1002,7 +1006,7 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
r->edns.bits &= EDNS_DO;
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep,
- LDNS_RCODE_NOERROR, &r->edns, m->s.region) ||
+ LDNS_RCODE_NOERROR, &r->edns, NULL, m->s.region) ||
!reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->buf, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
@@ -1010,11 +1014,11 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
{
fptr_ok(fptr_whitelist_mesh_cb(r->cb));
(*r->cb)(r->cb_arg, LDNS_RCODE_SERVFAIL, r->buf,
- sec_status_unchecked, NULL);
+ sec_status_unchecked, NULL, 0);
} else {
fptr_ok(fptr_whitelist_mesh_cb(r->cb));
(*r->cb)(r->cb_arg, LDNS_RCODE_NOERROR, r->buf,
- rep->security, reason);
+ rep->security, reason, was_ratelimited);
}
}
free(reason);
@@ -1080,11 +1084,11 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
m->s.qinfo.local_alias = r->local_alias;
if(rcode == LDNS_RCODE_SERVFAIL) {
if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
- rep, rcode, &r->edns, m->s.region))
+ rep, rcode, &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
} else {
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep, rcode,
- &r->edns, m->s.region))
+ &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
}
error_encode(r->query_reply.c->buffer, rcode, &m->s.qinfo,
@@ -1099,14 +1103,17 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
m->s.qinfo.qname = r->qname;
m->s.qinfo.local_alias = r->local_alias;
if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep,
- LDNS_RCODE_NOERROR, &r->edns, m->s.region) ||
+ LDNS_RCODE_NOERROR, &r->edns, NULL, m->s.region) ||
+ !apply_edns_options(&r->edns, &edns_bak,
+ m->s.env->cfg, r->query_reply.c,
+ m->s.region) ||
!reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->query_reply.c->buffer, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
(int)(r->edns.bits & EDNS_DO), secure))
{
if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
- rep, LDNS_RCODE_SERVFAIL, &r->edns, m->s.region))
+ rep, LDNS_RCODE_SERVFAIL, &r->edns, NULL, m->s.region))
r->edns.opt_list = NULL;
error_encode(r->query_reply.c->buffer,
LDNS_RCODE_SERVFAIL, &m->s.qinfo, r->qid,
@@ -1148,6 +1155,15 @@ void mesh_query_done(struct mesh_state* mstate)
struct mesh_cb* c;
struct reply_info* rep = (mstate->s.return_msg?
mstate->s.return_msg->rep:NULL);
+ if((mstate->s.return_rcode == LDNS_RCODE_SERVFAIL ||
+ (rep && FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_SERVFAIL))
+ && mstate->s.env->cfg->log_servfail
+ && !mstate->s.env->cfg->val_log_squelch) {
+ char* err = errinf_to_str_servfail(&mstate->s);
+ if(err)
+ log_err("%s", err);
+ free(err);
+ }
for(r = mstate->reply_list; r; r = r->next) {
/* if a response-ip address block has been stored the
* information should be logged for each client. */
@@ -1197,6 +1213,8 @@ void mesh_walk_supers(struct mesh_area* mesh, struct mesh_state* mstate)
mesh->mods.mod[ref->s->s.curmod]->inform_super));
(*mesh->mods.mod[ref->s->s.curmod]->inform_super)(&mstate->s,
ref->s->s.curmod, &ref->s->s);
+ /* copy state that is always relevant to super */
+ copy_state_to_super(&mstate->s, ref->s->s.curmod, &ref->s->s);
}
}
diff --git a/services/mesh.h b/services/mesh.h
index 67749accb35a..b4ce03e7e2a0 100644
--- a/services/mesh.h
+++ b/services/mesh.h
@@ -223,10 +223,11 @@ struct mesh_reply {
/**
* Mesh result callback func.
- * called as func(cb_arg, rcode, buffer_with_reply, security, why_bogus);
+ * called as func(cb_arg, rcode, buffer_with_reply, security, why_bogus,
+ * was_ratelimited);
*/
-typedef void (*mesh_cb_func_type)(void*, int, struct sldns_buffer*, enum sec_status,
- char*);
+typedef void (*mesh_cb_func_type)(void* cb_arg, int rcode, struct sldns_buffer*,
+ enum sec_status, char* why_bogus, int was_ratelimited);
/**
* Callback to result routine
@@ -242,9 +243,8 @@ struct mesh_cb {
uint16_t qflags;
/** buffer for reply */
struct sldns_buffer* buf;
-
/** callback routine for results. if rcode != 0 buf has message.
- * called as cb(cb_arg, rcode, buf, sec_state);
+ * called as cb(cb_arg, rcode, buf, sec_state, why_bogus, was_ratelimited);
*/
mesh_cb_func_type cb;
/** user arg for callback */
diff --git a/services/outside_network.c b/services/outside_network.c
index 5700ef8a95e5..87c88349b3f8 100644
--- a/services/outside_network.c
+++ b/services/outside_network.c
@@ -48,6 +48,7 @@
#include "services/outside_network.h"
#include "services/listen_dnsport.h"
#include "services/cache/infra.h"
+#include "iterator/iterator.h"
#include "util/data/msgparse.h"
#include "util/data/msgreply.h"
#include "util/data/msgencode.h"
@@ -1036,6 +1037,8 @@ udp_sockport(struct sockaddr_storage* addr, socklen_t addrlen, int pfxlen,
int freebind = 0;
struct sockaddr_in6 sa = *(struct sockaddr_in6*)addr;
sa.sin6_port = (in_port_t)htons((uint16_t)port);
+ sa.sin6_flowinfo = 0;
+ sa.sin6_scope_id = 0;
if(pfxlen != 0) {
freebind = 1;
sai6_putrandom(&sa, pfxlen, rnd);
@@ -1882,7 +1885,7 @@ serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff)
sq->last_sent_time = *sq->outnet->now_tv;
if(sq->tcp_upstream || sq->ssl_upstream) {
timeout = rtt;
- if(rtt >= 376 && rtt < TCP_AUTH_QUERY_TIMEOUT)
+ if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < TCP_AUTH_QUERY_TIMEOUT)
timeout = TCP_AUTH_QUERY_TIMEOUT;
} else {
timeout = TCP_AUTH_QUERY_TIMEOUT;
@@ -2190,39 +2193,48 @@ fd_for_dest(struct outside_network* outnet, struct sockaddr_storage* to_addr,
{
struct sockaddr_storage* addr;
socklen_t addrlen;
- int i;
- int try;
-
- /* select interface */
- if(addr_is_ip6(to_addr, to_addrlen)) {
- if(outnet->num_ip6 == 0) {
- char to[64];
- addr_to_str(to_addr, to_addrlen, to, sizeof(to));
- verbose(VERB_QUERY, "need ipv6 to send, but no ipv6 outgoing interfaces, for %s", to);
- return -1;
- }
- i = ub_random_max(outnet->rnd, outnet->num_ip6);
- addr = &outnet->ip6_ifs[i].addr;
- addrlen = outnet->ip6_ifs[i].addrlen;
- } else {
- if(outnet->num_ip4 == 0) {
- char to[64];
- addr_to_str(to_addr, to_addrlen, to, sizeof(to));
- verbose(VERB_QUERY, "need ipv4 to send, but no ipv4 outgoing interfaces, for %s", to);
- return -1;
- }
- i = ub_random_max(outnet->rnd, outnet->num_ip4);
- addr = &outnet->ip4_ifs[i].addr;
- addrlen = outnet->ip4_ifs[i].addrlen;
- }
+ int i, try, pnum;
+ struct port_if* pif;
/* create fd */
for(try = 0; try<1000; try++) {
+ int port = 0;
int freebind = 0;
int noproto = 0;
int inuse = 0;
- int port = ub_random(outnet->rnd)&0xffff;
int fd = -1;
+
+ /* select interface */
+ if(addr_is_ip6(to_addr, to_addrlen)) {
+ if(outnet->num_ip6 == 0) {
+ char to[64];
+ addr_to_str(to_addr, to_addrlen, to, sizeof(to));
+ verbose(VERB_QUERY, "need ipv6 to send, but no ipv6 outgoing interfaces, for %s", to);
+ return -1;
+ }
+ i = ub_random_max(outnet->rnd, outnet->num_ip6);
+ pif = &outnet->ip6_ifs[i];
+ } else {
+ if(outnet->num_ip4 == 0) {
+ char to[64];
+ addr_to_str(to_addr, to_addrlen, to, sizeof(to));
+ verbose(VERB_QUERY, "need ipv4 to send, but no ipv4 outgoing interfaces, for %s", to);
+ return -1;
+ }
+ i = ub_random_max(outnet->rnd, outnet->num_ip4);
+ pif = &outnet->ip4_ifs[i];
+ }
+ addr = &pif->addr;
+ addrlen = pif->addrlen;
+ pnum = ub_random_max(outnet->rnd, pif->avail_total);
+ if(pnum < pif->inuse) {
+ /* port already open */
+ port = pif->out[pnum]->number;
+ } else {
+ /* unused ports in start part of array */
+ port = pif->avail_ports[pnum - pif->inuse];
+ }
+
if(addr_is_ip6(to_addr, to_addrlen)) {
struct sockaddr_in6 sa = *(struct sockaddr_in6*)addr;
sa.sin6_port = (in_port_t)htons((uint16_t)port);
diff --git a/sldns/rrdef.c b/sldns/rrdef.c
index 644762f59f4a..b365a4a8ec3a 100644
--- a/sldns/rrdef.c
+++ b/sldns/rrdef.c
@@ -341,12 +341,9 @@ static sldns_rr_descriptor rdata_field_descriptors[] = {
{LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
/* 52 */
{LDNS_RR_TYPE_TLSA, "TLSA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
- /*53 */
-#ifdef DRAFT_RRTYPES
+ /* 53 */
{LDNS_RR_TYPE_SMIMEA, "SMIMEA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-#else
-{LDNS_RR_TYPE_NULL, "TYPE53", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-#endif
+ /* 54 */
{LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
/* 55
* Hip ends with 0 or more Rendezvous Servers represented as dname's.
diff --git a/sldns/rrdef.h b/sldns/rrdef.h
index 0446687bd339..4e7fef5745f2 100644
--- a/sldns/rrdef.h
+++ b/sldns/rrdef.h
@@ -182,9 +182,7 @@ enum sldns_enum_rr_type
LDNS_RR_TYPE_NSEC3PARAM = 51, /* RFC 5155 */
LDNS_RR_TYPE_NSEC3PARAMS = 51,
LDNS_RR_TYPE_TLSA = 52, /* RFC 6698 */
- LDNS_RR_TYPE_SMIMEA = 53, /* draft-ietf-dane-smime, TLSA-like but may
- be extended */
-
+ LDNS_RR_TYPE_SMIMEA = 53, /* RFC 8162 */
LDNS_RR_TYPE_HIP = 55, /* RFC 5205 */
/** draft-reid-dnsext-zs */
diff --git a/smallapp/unbound-anchor.c b/smallapp/unbound-anchor.c
index b30091088008..f398509018d9 100644
--- a/smallapp/unbound-anchor.c
+++ b/smallapp/unbound-anchor.c
@@ -192,9 +192,10 @@ usage(void)
printf("-n name signer's subject emailAddress, default %s\n", P7SIGNER);
printf("-4 work using IPv4 only\n");
printf("-6 work using IPv6 only\n");
- printf("-f resolv.conf use given resolv.conf to resolve -u name\n");
- printf("-r root.hints use given root.hints to resolve -u name\n"
+ printf("-f resolv.conf use given resolv.conf\n");
+ printf("-r root.hints use given root.hints\n"
" builtin root hints are used by default\n");
+ printf("-R fallback from -f to root query on error\n");
printf("-v more verbose\n");
printf("-C conf debug, read config\n");
printf("-P port use port for https connect, default 443\n");
@@ -1920,8 +1921,7 @@ static int
do_certupdate(const char* root_anchor_file, const char* root_cert_file,
const char* urlname, const char* xmlname, const char* p7sname,
const char* p7signer, const char* res_conf, const char* root_hints,
- const char* debugconf, int ip4only, int ip6only, int port,
- struct ub_result* dnskey)
+ const char* debugconf, int ip4only, int ip6only, int port)
{
STACK_OF(X509)* cert;
BIO *xml, *p7s;
@@ -1961,7 +1961,6 @@ do_certupdate(const char* root_anchor_file, const char* root_cert_file,
#ifndef S_SPLINT_S
sk_X509_pop_free(cert, X509_free);
#endif
- ub_resolve_free(dnskey);
ip_list_free(ip_list);
return 1;
}
@@ -2199,16 +2198,33 @@ probe_date_allows_certupdate(const char* root_anchor_file)
return 0;
}
+static struct ub_result *
+fetch_root_key(const char* root_anchor_file, const char* res_conf,
+ const char* root_hints, const char* debugconf,
+ int ip4only, int ip6only)
+{
+ struct ub_ctx* ctx;
+ struct ub_result* dnskey;
+
+ ctx = create_unbound_context(res_conf, root_hints, debugconf,
+ ip4only, ip6only);
+ add_5011_probe_root(ctx, root_anchor_file);
+ dnskey = prime_root_key(ctx);
+ ub_ctx_delete(ctx);
+ return dnskey;
+}
+
/** perform the unbound-anchor work */
static int
do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
const char* urlname, const char* xmlname, const char* p7sname,
const char* p7signer, const char* res_conf, const char* root_hints,
- const char* debugconf, int ip4only, int ip6only, int force, int port)
+ const char* debugconf, int ip4only, int ip6only, int force,
+ int res_conf_fallback, int port)
{
- struct ub_ctx* ctx;
struct ub_result* dnskey;
int used_builtin = 0;
+ int rcode;
/* see if builtin rootanchor needs to be provided, or if
* rootanchor is 'revoked-trust-point' */
@@ -2217,12 +2233,22 @@ do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
/* make unbound context with 5011-probe for root anchor,
* and probe . DNSKEY */
- ctx = create_unbound_context(res_conf, root_hints, debugconf,
- ip4only, ip6only);
- add_5011_probe_root(ctx, root_anchor_file);
- dnskey = prime_root_key(ctx);
- ub_ctx_delete(ctx);
-
+ dnskey = fetch_root_key(root_anchor_file, res_conf,
+ root_hints, debugconf, ip4only, ip6only);
+ rcode = dnskey->rcode;
+
+ if (res_conf_fallback && res_conf && !dnskey->secure) {
+ if (verb) printf("%s failed, retrying direct\n", res_conf);
+ ub_resolve_free(dnskey);
+ /* try direct query without res_conf */
+ dnskey = fetch_root_key(root_anchor_file, NULL,
+ root_hints, debugconf, ip4only, ip6only);
+ if (rcode != 0 && dnskey->rcode == 0) {
+ res_conf = NULL;
+ rcode = 0;
+ }
+ }
+
/* if secure: exit */
if(dnskey->secure && !force) {
if(verb) printf("success: the anchor is ok\n");
@@ -2230,18 +2256,18 @@ do_root_update_work(const char* root_anchor_file, const char* root_cert_file,
return used_builtin;
}
if(force && verb) printf("debug cert update forced\n");
+ ub_resolve_free(dnskey);
/* if not (and NOERROR): check date and do certupdate */
- if((dnskey->rcode == 0 &&
+ if((rcode == 0 &&
probe_date_allows_certupdate(root_anchor_file)) || force) {
if(do_certupdate(root_anchor_file, root_cert_file, urlname,
xmlname, p7sname, p7signer, res_conf, root_hints,
- debugconf, ip4only, ip6only, port, dnskey))
+ debugconf, ip4only, ip6only, port))
return 1;
return used_builtin;
}
if(verb) printf("fail: the anchor is NOT ok and could not be fixed\n");
- ub_resolve_free(dnskey);
return used_builtin;
}
@@ -2264,8 +2290,9 @@ int main(int argc, char* argv[])
const char* root_hints = NULL;
const char* debugconf = NULL;
int dolist=0, ip4only=0, ip6only=0, force=0, port = HTTPS_PORT;
+ int res_conf_fallback = 0;
/* parse the options */
- while( (c=getopt(argc, argv, "46C:FP:a:c:f:hln:r:s:u:vx:")) != -1) {
+ while( (c=getopt(argc, argv, "46C:FRP:a:c:f:hln:r:s:u:vx:")) != -1) {
switch(c) {
case 'l':
dolist = 1;
@@ -2300,6 +2327,9 @@ int main(int argc, char* argv[])
case 'r':
root_hints = optarg;
break;
+ case 'R':
+ res_conf_fallback = 1;
+ break;
case 'C':
debugconf = optarg;
break;
@@ -2346,5 +2376,5 @@ int main(int argc, char* argv[])
return do_root_update_work(root_anchor_file, root_cert_file, urlname,
xmlname, p7sname, p7signer, res_conf, root_hints, debugconf,
- ip4only, ip6only, force, port);
+ ip4only, ip6only, force, res_conf_fallback, port);
}
diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c
index 37ba9eab31a1..ea46479172c0 100644
--- a/smallapp/unbound-checkconf.c
+++ b/smallapp/unbound-checkconf.c
@@ -43,6 +43,7 @@
*/
#include "config.h"
+#include <ctype.h>
#include "util/log.h"
#include "util/config_file.h"
#include "util/module.h"
@@ -252,6 +253,23 @@ aclchecks(struct config_file* cfg)
}
}
+/** check tcp connection limit ips */
+static void
+tcpconnlimitchecks(struct config_file* cfg)
+{
+ int d;
+ struct sockaddr_storage a;
+ socklen_t alen;
+ struct config_str2list* tcl;
+ for(tcl=cfg->tcp_connection_limits; tcl; tcl = tcl->next) {
+ if(!netblockstrtoaddr(tcl->str, UNBOUND_DNS_PORT, &a, &alen,
+ &d)) {
+ fatal_exit("cannot parse tcp connection limit address %s %s",
+ tcl->str, tcl->str2);
+ }
+ }
+}
+
/** true if fname is a file */
static int
is_file(const char* fname)
@@ -373,6 +391,44 @@ ecs_conf_checks(struct config_file* cfg)
}
#endif /* CLIENT_SUBNET */
+/** check that the modules exist, are compiled in */
+static void
+check_modules_exist(const char* module_conf)
+{
+ const char** names = module_list_avail();
+ const char* s = module_conf;
+ while(*s) {
+ int i = 0;
+ int is_ok = 0;
+ while(*s && isspace((unsigned char)*s))
+ s++;
+ if(!*s) break;
+ while(names[i]) {
+ if(strncmp(names[i], s, strlen(names[i])) == 0) {
+ is_ok = 1;
+ break;
+ }
+ i++;
+ }
+ if(is_ok == 0) {
+ char n[64];
+ size_t j;
+ n[0]=0;
+ n[sizeof(n)-1]=0;
+ for(j=0; j<sizeof(n)-1; j++) {
+ if(!s[j] || isspace((unsigned char)s[j])) {
+ n[j] = 0;
+ break;
+ }
+ n[j] = s[j];
+ }
+ fatal_exit("module_conf lists module '%s' but that "
+ "module is not available.", n);
+ }
+ s += strlen(names[i]);
+ }
+}
+
/** check configuration for errors */
static void
morechecks(struct config_file* cfg, const char* fname)
@@ -381,6 +437,7 @@ morechecks(struct config_file* cfg, const char* fname)
warn_hosts("forward-host", cfg->forwards);
interfacechecks(cfg);
aclchecks(cfg);
+ tcpconnlimitchecks(cfg);
if(cfg->verbosity < 0)
fatal_exit("verbosity value < 0");
@@ -465,6 +522,9 @@ morechecks(struct config_file* cfg, const char* fname)
free(cfg->chrootdir);
cfg->chrootdir = NULL;
+ /* check that the modules listed in module_conf exist */
+ check_modules_exist(cfg->module_conf);
+
/* There should be no reason for 'respip' module not to work with
* dns64, but it's not explicitly confirmed, so the combination is
* excluded below. It's simply unknown yet for the combination of
@@ -511,7 +571,6 @@ morechecks(struct config_file* cfg, const char* fname)
#if defined(WITH_PYTHONMODULE) && defined(CLIENT_SUBNET)
&& strcmp(cfg->module_conf, "python subnetcache iterator") != 0
&& strcmp(cfg->module_conf, "subnetcache python iterator") != 0
- && strcmp(cfg->module_conf, "subnetcache validator iterator") != 0
&& strcmp(cfg->module_conf, "python subnetcache validator iterator") != 0
&& strcmp(cfg->module_conf, "subnetcache python validator iterator") != 0
&& strcmp(cfg->module_conf, "subnetcache validator python iterator") != 0
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
index d16541779190..9e4c006f3b5d 100644
--- a/smallapp/unbound-control.c
+++ b/smallapp/unbound-control.c
@@ -143,6 +143,8 @@ usage(void)
printf(" ip_ratelimit_list [+a] list ratelimited ip addresses\n");
printf(" +a list all, also not ratelimited\n");
printf(" list_auth_zones list auth zones\n");
+ printf(" auth_zone_reload zone reload auth zone from zonefile\n");
+ printf(" auth_zone_transfer zone transfer auth zone from master\n");
printf(" view_list_local_zones view list local-zones in view\n");
printf(" view_list_local_data view list local-data RRs in view\n");
printf(" view_local_zone view name type add local-zone in view\n");
@@ -319,6 +321,7 @@ static void print_extended(struct ub_stats_info* s)
/* transport */
PR_UL("num.query.tcp", s->svr.qtcp);
PR_UL("num.query.tcpout", s->svr.qtcp_outgoing);
+ PR_UL("num.query.tls", s->svr.qtls);
PR_UL("num.query.ipv6", s->svr.qipv6);
/* flags */
@@ -371,6 +374,10 @@ static void print_extended(struct ub_stats_info* s)
#endif /* USE_DNSCRYPT */
PR_UL("num.query.authzone.up", s->svr.num_query_authzone_up);
PR_UL("num.query.authzone.down", s->svr.num_query_authzone_down);
+#ifdef CLIENT_SUBNET
+ PR_UL("num.query.subnet", s->svr.num_query_subnet);
+ PR_UL("num.query.subnet_cache", s->svr.num_query_subnet_cache);
+#endif
}
/** print statistics out of memory structures */
@@ -444,6 +451,22 @@ static void ssl_err(const char* s)
exit(1);
}
+/** exit with ssl error related to a file path */
+static void ssl_path_err(const char* s, const char *path)
+{
+ unsigned long err;
+ err = ERR_peek_error();
+ if (ERR_GET_LIB(err) == ERR_LIB_SYS &&
+ (ERR_GET_FUNC(err) == SYS_F_FOPEN ||
+ ERR_GET_FUNC(err) == SYS_F_FREAD) ) {
+ fprintf(stderr, "error: %s\n%s: %s\n",
+ s, path, ERR_reason_error_string(err));
+ exit(1);
+ } else {
+ ssl_err(s);
+ }
+}
+
/** setup SSL context */
static SSL_CTX*
setup_ctx(struct config_file* cfg)
@@ -467,12 +490,15 @@ setup_ctx(struct config_file* cfg)
if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
!= SSL_OP_NO_SSLv3)
ssl_err("could not set SSL_OP_NO_SSLv3");
- if(!SSL_CTX_use_certificate_chain_file(ctx,c_cert) ||
- !SSL_CTX_use_PrivateKey_file(ctx,c_key,SSL_FILETYPE_PEM)
- || !SSL_CTX_check_private_key(ctx))
- ssl_err("Error setting up SSL_CTX client key and cert");
+ if(!SSL_CTX_use_certificate_chain_file(ctx,c_cert))
+ ssl_path_err("Error setting up SSL_CTX client cert", c_cert);
+ if (!SSL_CTX_use_PrivateKey_file(ctx,c_key,SSL_FILETYPE_PEM))
+ ssl_path_err("Error setting up SSL_CTX client key", c_key);
+ if (!SSL_CTX_check_private_key(ctx))
+ ssl_err("Error setting up SSL_CTX client key");
if (SSL_CTX_load_verify_locations(ctx, s_cert, NULL) != 1)
- ssl_err("Error setting up SSL_CTX verify, server cert");
+ ssl_path_err("Error setting up SSL_CTX verify, server cert",
+ s_cert);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
free(s_cert);
diff --git a/smallapp/unbound-host.c b/smallapp/unbound-host.c
index cd1ffe3351d2..f02511fe5613 100644
--- a/smallapp/unbound-host.c
+++ b/smallapp/unbound-host.c
@@ -82,9 +82,8 @@ static int verb = 0;
static void
usage(void)
{
- printf("Usage: unbound-host [-vdhr46] [-c class] [-t type] hostname\n");
- printf(" [-y key] [-f keyfile] [-F namedkeyfile]\n");
- printf(" [-C configfile]\n");
+ printf("Usage: unbound-host [-C configfile] [-vdhr46] [-c class] [-t type]\n");
+ printf(" [-y key] [-f keyfile] [-F namedkeyfile] hostname\n");
printf(" Queries the DNS for information.\n");
printf(" The hostname is looked up for IP4, IP6 and mail.\n");
printf(" If an ip-address is given a reverse lookup is done.\n");
@@ -98,6 +97,8 @@ usage(void)
printf(" -f keyfile read trust anchors from file, with lines as -y.\n");
printf(" -F keyfile read named.conf-style trust anchors.\n");
printf(" -C config use the specified unbound.conf (none read by default)\n");
+ printf(" pass as first argument if you want to override some\n");
+ printf(" options with further arguments\n");
printf(" -r read forwarder information from /etc/resolv.conf\n");
printf(" breaks validation if the forwarder does not do DNSSEC.\n");
printf(" -v be more verbose, shows nodata and security.\n");
@@ -339,6 +340,7 @@ pretty_output(char* q, int t, int c, struct ub_result* result, int docname)
exit(1);
}
printf("%s\n", s);
+ free(s);
} else printf(" has no %s record", tstr);
printf(" %s\n", secstatus);
}
diff --git a/smallapp/worker_cb.c b/smallapp/worker_cb.c
index dda94cc670cf..6c3bd0049082 100644
--- a/smallapp/worker_cb.c
+++ b/smallapp/worker_cb.c
@@ -168,21 +168,21 @@ void libworker_handle_control_cmd(struct tube* ATTR_UNUSED(tube),
void libworker_fg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_bg_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
void libworker_event_done_cb(void* ATTR_UNUSED(arg), int ATTR_UNUSED(rcode),
struct sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s),
- char* ATTR_UNUSED(why_bogus))
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
log_assert(0);
}
diff --git a/testcode/fake_event.c b/testcode/fake_event.c
index 80e3685c09ef..777ed7355ed7 100644
--- a/testcode/fake_event.c
+++ b/testcode/fake_event.c
@@ -374,8 +374,11 @@ answer_callback_from_entry(struct replay_runtime* runtime,
c.fd = -1;
c.buffer = sldns_buffer_new(runtime->bufsize);
c.type = comm_udp;
- if(pend->transport == transport_tcp)
+ if(pend->transport == transport_tcp) {
c.type = comm_tcp;
+ c.tcp_timeout_msec = 30000;
+ c.tcp_keepalive = runtime->tcp_seen_keepalive;
+ }
fill_buffer_with_reply(c.buffer, entry, pend->pkt, pend->pkt_len,
pend->tcp_pkt_counter);
repinfo.c = &c;
@@ -423,6 +426,8 @@ answer_check_it(struct replay_runtime* runtime)
else runtime->answer_list = ans->next;
if(!ans->next)
runtime->answer_last = prev;
+ if(ans->repinfo.c->tcp_keepalive)
+ runtime->tcp_seen_keepalive = 1;
delete_replay_answer(ans);
return;
} else {
@@ -452,9 +457,12 @@ fake_front_query(struct replay_runtime* runtime, struct replay_moment *todo)
repinfo.c->fd = -1;
repinfo.c->ev = (struct internal_event*)runtime;
repinfo.c->buffer = sldns_buffer_new(runtime->bufsize);
- if(todo->match->match_transport == transport_tcp)
+ if(todo->match->match_transport == transport_tcp) {
repinfo.c->type = comm_tcp;
- else repinfo.c->type = comm_udp;
+ repinfo.c->tcp_timeout_msec = 30000;
+ repinfo.c->tcp_keepalive = runtime->tcp_seen_keepalive;
+ } else
+ repinfo.c->type = comm_udp;
fill_buffer_with_reply(repinfo.c->buffer, todo->match, NULL, 0, 0);
log_info("testbound: incoming QUERY");
log_pkt("query pkt", todo->match->reply_list->reply_pkt,
@@ -488,8 +496,11 @@ fake_pending_callback(struct replay_runtime* runtime,
cb = p->callback;
c.buffer = sldns_buffer_new(runtime->bufsize);
c.type = comm_udp;
- if(p->transport == transport_tcp)
+ if(p->transport == transport_tcp) {
c.type = comm_tcp;
+ c.tcp_timeout_msec = 30000;
+ c.tcp_keepalive = runtime->tcp_seen_keepalive;
+ }
if(todo->evt_type == repevt_back_reply && todo->match) {
fill_buffer_with_reply(c.buffer, todo->match, p->pkt,
p->pkt_len, p->tcp_pkt_counter);
@@ -856,6 +867,8 @@ run_scenario(struct replay_runtime* runtime)
struct listen_dnsport*
listen_create(struct comm_base* base, struct listen_port* ATTR_UNUSED(ports),
size_t bufsize, int ATTR_UNUSED(tcp_accept_count),
+ int ATTR_UNUSED(tcp_idle_timeout),
+ struct tcl_list* ATTR_UNUSED(tcp_conn_limit),
void* ATTR_UNUSED(sslctx), struct dt_env* ATTR_UNUSED(dtenv),
comm_point_callback_type* cb, void* cb_arg)
{
diff --git a/testcode/replay.h b/testcode/replay.h
index 81f0a2c275b2..0cce0b490105 100644
--- a/testcode/replay.h
+++ b/testcode/replay.h
@@ -303,6 +303,9 @@ struct replay_runtime {
/** the current time in microseconds */
struct timeval now_tv;
+ /** has TCP connection seen a keepalive? */
+ int tcp_seen_keepalive;
+
/** signal handler callback */
void (*sig_cb)(int, void*);
/** signal handler user arg */
diff --git a/testcode/streamtcp.1 b/testcode/streamtcp.1
index 7c738d9d278c..526c8e1699d4 100644
--- a/testcode/streamtcp.1
+++ b/testcode/streamtcp.1
@@ -12,6 +12,8 @@
.RB [ \-unsh ]
.RB [ \-f
.IR ipaddr[@port] ]
+.RB [ \-d
+.IR secs ]
.I name
.I type
.I class
@@ -50,6 +52,10 @@ Print program usage.
.TP
.B \-f \fIipaddr[@port]
Specify the server to send the queries to. If not specified localhost (127.0.0.1) is used.
+.TP
+.B \-d \fIsecs
+Delay after the connection before sending query. This tests the timeout
+on the other side, eg. if shorter the connection is closed.
.SH "EXAMPLES"
.LP
Some examples of use.
diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c
index 0a636395fd35..497e3d2888fe 100644
--- a/testcode/streamtcp.c
+++ b/testcode/streamtcp.c
@@ -44,6 +44,8 @@
#include <getopt.h>
#endif
#include <signal.h>
+#include <stdlib.h>
+#include <unistd.h>
#include "util/locks.h"
#include "util/log.h"
#include "util/net_help.h"
@@ -71,6 +73,7 @@ static void usage(char* argv[])
printf("-f server what ipaddr@portnr to send the queries to\n");
printf("-u use UDP. No retries are attempted.\n");
printf("-n do not wait for an answer.\n");
+ printf("-d secs delay after connection before sending query\n");
printf("-s use ssl\n");
printf("-h this help text\n");
exit(1);
@@ -275,7 +278,8 @@ static int get_random(void)
/** send the TCP queries and print answers */
static void
-send_em(const char* svr, int udp, int usessl, int noanswer, int num, char** qs)
+send_em(const char* svr, int udp, int usessl, int noanswer, int delay,
+ int num, char** qs)
{
sldns_buffer* buf = sldns_buffer_new(65553);
int fd = open_svr(svr, udp);
@@ -310,6 +314,13 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int num, char** qs)
}
}
for(i=0; i<num; i+=3) {
+ if (delay != 0) {
+#ifdef HAVE_SLEEP
+ sleep((unsigned)delay);
+#else
+ Sleep(delay*1000);
+#endif
+ }
printf("\nNext query is %s %s %s\n", qs[i], qs[i+1], qs[i+2]);
write_q(fd, udp, ssl, buf, (uint16_t)get_random(), qs[i],
qs[i+1], qs[i+2]);
@@ -358,6 +369,7 @@ int main(int argc, char** argv)
int udp = 0;
int noanswer = 0;
int usessl = 0;
+ int delay = 0;
#ifdef USE_WINSOCK
WSADATA wsa_data;
@@ -382,7 +394,7 @@ int main(int argc, char** argv)
if(argc == 1) {
usage(argv);
}
- while( (c=getopt(argc, argv, "f:hnsu")) != -1) {
+ while( (c=getopt(argc, argv, "f:hnsud:")) != -1) {
switch(c) {
case 'f':
svr = optarg;
@@ -396,6 +408,14 @@ int main(int argc, char** argv)
case 's':
usessl = 1;
break;
+ case 'd':
+ if(atoi(optarg)==0 && strcmp(optarg,"0")!=0) {
+ printf("error parsing delay, "
+ "number expected: %s\n", optarg);
+ return 1;
+ }
+ delay = atoi(optarg);
+ break;
case 'h':
case '?':
default:
@@ -426,7 +446,7 @@ int main(int argc, char** argv)
(void)OPENSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS, NULL);
#endif
}
- send_em(svr, udp, usessl, noanswer, argc, argv);
+ send_em(svr, udp, usessl, noanswer, delay, argc, argv);
checklock_stop();
#ifdef USE_WINSOCK
WSACleanup();
diff --git a/testcode/unitauth.c b/testcode/unitauth.c
index 4b538ef62687..c162e7ef9648 100644
--- a/testcode/unitauth.c
+++ b/testcode/unitauth.c
@@ -111,8 +111,9 @@ static const char* zone_example_com =
/* just an RRSIG rrset with nothing else, 2 rrsigs */
"z5.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
"z5.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 12345 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
-#if 0 /* comparison of file does not work on this part because duplicates */
+#if 1 /* comparison of file does not work on this part because duplicates */
/* are removed and the rrsets are reordered */
+"end_of_check.z6.example.com. 3600 IN A 10.0.0.10\n"
/* first rrsig, then A record */
"z6.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
"z6.example.com. 3600 IN A 10.0.0.10\n"
@@ -131,6 +132,12 @@ static const char* zone_example_com =
"z9.example.com. 3600 IN A 10.0.0.10\n"
"z9.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
"z9.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+/* different covered types, first RRSIGs then, RRs, then another RRSIG */
+"zz10.example.com. 3600 IN RRSIG AAAA 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+"zz10.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+"zz10.example.com. 3600 IN A 10.0.0.10\n"
+"zz10.example.com. 3600 IN RRSIG CNAME 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=\n"
+"zz10.example.com. 3600 IN AAAA ::11\n"
#endif /* if0 for duplicates and reordering */
;
@@ -550,11 +557,16 @@ checkfile(char* f1, char *f2)
cp2 = fgets(buf2, (int)sizeof(buf2), i2);
if((!cp1 && !feof(i1)) || (!cp2 && !feof(i2)))
fatal_exit("fgets failed: %s", strerror(errno));
+ if(strncmp(buf1, "end_of_check", 12) == 0) {
+ fclose(i1);
+ fclose(i2);
+ return;
+ }
if(strcmp(buf1, buf2) != 0) {
log_info("in files %s and %s:%d", f1, f2, line);
log_info("'%s'", buf1);
log_info("'%s'", buf2);
- fatal_exit("files are not eqaul");
+ fatal_exit("files are not equal");
}
}
unit_assert(feof(i1) && feof(i2));
diff --git a/testcode/unitldns.c b/testcode/unitldns.c
index e27e46eaa926..66f75617037d 100644
--- a/testcode/unitldns.c
+++ b/testcode/unitldns.c
@@ -199,15 +199,25 @@ rr_test_file(const char* input, const char* check)
free(back);
}
+#define xstr(s) str(s)
+#define str(s) #s
+
+#define SRCDIRSTR xstr(SRCDIR)
+
/** read rrs to and from string, to and from wireformat */
static void
rr_tests(void)
{
- rr_test_file("testdata/test_ldnsrr.1", "testdata/test_ldnsrr.c1");
- rr_test_file("testdata/test_ldnsrr.2", "testdata/test_ldnsrr.c2");
- rr_test_file("testdata/test_ldnsrr.3", "testdata/test_ldnsrr.c3");
- rr_test_file("testdata/test_ldnsrr.4", "testdata/test_ldnsrr.c4");
- rr_test_file("testdata/test_ldnsrr.5", "testdata/test_ldnsrr.c5");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.1",
+ SRCDIRSTR "/testdata/test_ldnsrr.c1");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.2",
+ SRCDIRSTR "/testdata/test_ldnsrr.c2");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.3",
+ SRCDIRSTR "/testdata/test_ldnsrr.c3");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.4",
+ SRCDIRSTR "/testdata/test_ldnsrr.c4");
+ rr_test_file(SRCDIRSTR "/testdata/test_ldnsrr.5",
+ SRCDIRSTR "/testdata/test_ldnsrr.c5");
}
void
diff --git a/testcode/unitmain.c b/testcode/unitmain.c
index fecde80cc3d1..e28be8c833af 100644
--- a/testcode/unitmain.c
+++ b/testcode/unitmain.c
@@ -404,12 +404,13 @@ config_tag_test(void)
#include "util/rtt.h"
#include "util/timehist.h"
+#include "iterator/iterator.h"
#include "libunbound/unbound.h"
/** test RTT code */
static void
rtt_test(void)
{
- int init = 376;
+ int init = UNKNOWN_SERVER_NICENESS;
int i;
struct rtt_info r;
unit_show_func("util/rtt.c", "rtt_timeout");
diff --git a/testcode/unitmsgparse.c b/testcode/unitmsgparse.c
index 627d10b78ec3..c0b38bac76e4 100644
--- a/testcode/unitmsgparse.c
+++ b/testcode/unitmsgparse.c
@@ -495,6 +495,11 @@ testfromdrillfile(sldns_buffer* pkt, struct alloc_cache* alloc,
fclose(in);
}
+#define xstr(s) str(s)
+#define str(s) #s
+
+#define SRCDIRSTR xstr(SRCDIR)
+
void msgparse_test(void)
{
time_t origttl = MAX_NEG_TTL;
@@ -509,27 +514,27 @@ void msgparse_test(void)
unit_show_feature("message parse");
simpletest(pkt, &alloc, out);
/* plain hex dumps, like pcat */
- testfromfile(pkt, &alloc, out, "testdata/test_packets.1");
- testfromfile(pkt, &alloc, out, "testdata/test_packets.2");
- testfromfile(pkt, &alloc, out, "testdata/test_packets.3");
+ testfromfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.1");
+ testfromfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.2");
+ testfromfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.3");
/* like from drill -w - */
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.4");
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.5");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.4");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.5");
matches_nolocation = 1; /* RR order not important for the next test */
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.6");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.6");
check_rrsigs = 1;
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.7");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.7");
check_rrsigs = 0;
matches_nolocation = 0;
check_formerr_gone = 1;
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.8");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.8");
check_formerr_gone = 0;
check_rrsigs = 1;
check_nosameness = 1;
- testfromdrillfile(pkt, &alloc, out, "testdata/test_packets.9");
+ testfromdrillfile(pkt, &alloc, out, SRCDIRSTR "/testdata/test_packets.9");
check_nosameness = 0;
check_rrsigs = 0;
diff --git a/testcode/unitverify.c b/testcode/unitverify.c
index 95676e104905..9e101324960e 100644
--- a/testcode/unitverify.c
+++ b/testcode/unitverify.c
@@ -497,65 +497,70 @@ nsec3_hash_test(const char* fname)
sldns_buffer_free(buf);
}
+#define xstr(s) str(s)
+#define str(s) #s
+
+#define SRCDIRSTR xstr(SRCDIR)
+
void
verify_test(void)
{
unit_show_feature("signature verify");
#ifdef USE_SHA1
- verifytest_file("testdata/test_signatures.1", "20070818005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.1", "20070818005004");
#endif
#if defined(USE_DSA) && defined(USE_SHA1)
- verifytest_file("testdata/test_signatures.2", "20080414005004");
- verifytest_file("testdata/test_signatures.3", "20080416005004");
- verifytest_file("testdata/test_signatures.4", "20080416005004");
- verifytest_file("testdata/test_signatures.5", "20080416005004");
- verifytest_file("testdata/test_signatures.6", "20080416005004");
- verifytest_file("testdata/test_signatures.7", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.2", "20080414005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.3", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.4", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.5", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.6", "20080416005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.7", "20070829144150");
#endif /* USE_DSA */
#ifdef USE_SHA1
- verifytest_file("testdata/test_signatures.8", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.8", "20070829144150");
#endif
#if (defined(HAVE_EVP_SHA256) || defined(HAVE_NSS) || defined(HAVE_NETTLE)) && defined(USE_SHA2)
- verifytest_file("testdata/test_sigs.rsasha256", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.rsasha256", "20070829144150");
# ifdef USE_SHA1
- verifytest_file("testdata/test_sigs.sha1_and_256", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.sha1_and_256", "20070829144150");
# endif
- verifytest_file("testdata/test_sigs.rsasha256_draft", "20090101000000");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.rsasha256_draft", "20090101000000");
#endif
#if (defined(HAVE_EVP_SHA512) || defined(HAVE_NSS) || defined(HAVE_NETTLE)) && defined(USE_SHA2)
- verifytest_file("testdata/test_sigs.rsasha512_draft", "20070829144150");
- verifytest_file("testdata/test_signatures.9", "20171215000000");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.rsasha512_draft", "20070829144150");
+ verifytest_file(SRCDIRSTR "/testdata/test_signatures.9", "20171215000000");
#endif
#ifdef USE_SHA1
- verifytest_file("testdata/test_sigs.hinfo", "20090107100022");
- verifytest_file("testdata/test_sigs.revoked", "20080414005004");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.hinfo", "20090107100022");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.revoked", "20080414005004");
#endif
#ifdef USE_GOST
if(sldns_key_EVP_load_gost_id())
- verifytest_file("testdata/test_sigs.gost", "20090807060504");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.gost", "20090807060504");
else printf("Warning: skipped GOST, openssl does not provide gost.\n");
#endif
#ifdef USE_ECDSA
/* test for support in case we use libNSS and ECC is removed */
if(dnskey_algo_id_is_supported(LDNS_ECDSAP256SHA256)) {
- verifytest_file("testdata/test_sigs.ecdsa_p256", "20100908100439");
- verifytest_file("testdata/test_sigs.ecdsa_p384", "20100908100439");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ecdsa_p256", "20100908100439");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ecdsa_p384", "20100908100439");
}
- dstest_file("testdata/test_ds.sha384");
+ dstest_file(SRCDIRSTR "/testdata/test_ds.sha384");
#endif
#ifdef USE_ED25519
if(dnskey_algo_id_is_supported(LDNS_ED25519)) {
- verifytest_file("testdata/test_sigs.ed25519", "20170530140439");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ed25519", "20170530140439");
}
#endif
#ifdef USE_ED448
if(dnskey_algo_id_is_supported(LDNS_ED448)) {
- verifytest_file("testdata/test_sigs.ed448", "20180408143630");
+ verifytest_file(SRCDIRSTR "/testdata/test_sigs.ed448", "20180408143630");
}
#endif
#ifdef USE_SHA1
- dstest_file("testdata/test_ds.sha1");
+ dstest_file(SRCDIRSTR "/testdata/test_ds.sha1");
#endif
nsectest();
- nsec3_hash_test("testdata/test_nsec3_hash.1");
+ nsec3_hash_test(SRCDIRSTR "/testdata/test_nsec3_hash.1");
}
diff --git a/testdata/autotrust_init.rpl b/testdata/autotrust_init.rpl
index c6bde72ac48b..d722273e0a99 100644
--- a/testdata/autotrust_init.rpl
+++ b/testdata/autotrust_init.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/autotrust_init_ds.rpl b/testdata/autotrust_init_ds.rpl
index 37a168a1a0ab..ad4019ebec6e 100644
--- a/testdata/autotrust_init_ds.rpl
+++ b/testdata/autotrust_init_ds.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/autotrust_init_sigs.rpl b/testdata/autotrust_init_sigs.rpl
index fe5eeb0d6509..d5d52f473869 100644
--- a/testdata/autotrust_init_sigs.rpl
+++ b/testdata/autotrust_init_sigs.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/autotrust_init_zsk.rpl b/testdata/autotrust_init_zsk.rpl
index b807f8ebe046..56a5bc0b3feb 100644
--- a/testdata/autotrust_init_zsk.rpl
+++ b/testdata/autotrust_init_zsk.rpl
@@ -4,6 +4,7 @@ server:
log-time-ascii: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/black_data.rpl b/testdata/black_data.rpl
index 04304d352cf8..de6f57ec1158 100644
--- a/testdata/black_data.rpl
+++ b/testdata/black_data.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/black_prime.rpl b/testdata/black_prime.rpl
index 2cbcc160658a..7e73f32f39ab 100644
--- a/testdata/black_prime.rpl
+++ b/testdata/black_prime.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_anchor.rpl b/testdata/dlv_anchor.rpl
index 445da0a84ea7..81547454eff6 100644
--- a/testdata/dlv_anchor.rpl
+++ b/testdata/dlv_anchor.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_ask_higher.rpl b/testdata/dlv_ask_higher.rpl
index 9f9331080e27..51ac3d24aaee 100644
--- a/testdata/dlv_ask_higher.rpl
+++ b/testdata/dlv_ask_higher.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_below_ta.rpl b/testdata/dlv_below_ta.rpl
index 6f72f261c390..f5d630dfb2d7 100644
--- a/testdata/dlv_below_ta.rpl
+++ b/testdata/dlv_below_ta.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_delegation.rpl b/testdata/dlv_delegation.rpl
index 1eada40649f7..53074c8e257f 100644
--- a/testdata/dlv_delegation.rpl
+++ b/testdata/dlv_delegation.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_insecure.rpl b/testdata/dlv_insecure.rpl
index 94ba865d8703..e6515a9fb6ec 100644
--- a/testdata/dlv_insecure.rpl
+++ b/testdata/dlv_insecure.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_insecure_negcache.rpl b/testdata/dlv_insecure_negcache.rpl
index b91105160ad2..8408870b9969 100644
--- a/testdata/dlv_insecure_negcache.rpl
+++ b/testdata/dlv_insecure_negcache.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_remove_empty.rpl b/testdata/dlv_remove_empty.rpl
index 2e9b4bcf6638..11b825bc2621 100644
--- a/testdata/dlv_remove_empty.rpl
+++ b/testdata/dlv_remove_empty.rpl
@@ -5,6 +5,7 @@ server:
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_remove_nodel.rpl b/testdata/dlv_remove_nodel.rpl
index 1f2d94721abd..1abe5a32f37a 100644
--- a/testdata/dlv_remove_nodel.rpl
+++ b/testdata/dlv_remove_nodel.rpl
@@ -6,6 +6,7 @@ server:
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_remove_pos.rpl b/testdata/dlv_remove_pos.rpl
index fe2d7fee79d1..892ffa3c0c47 100644
--- a/testdata/dlv_remove_pos.rpl
+++ b/testdata/dlv_remove_pos.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dlv_unused.rpl b/testdata/dlv_unused.rpl
index 386755835128..aa7d04c1eab4 100644
--- a/testdata/dlv_unused.rpl
+++ b/testdata/dlv_unused.rpl
@@ -7,6 +7,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/dns64_lookup.rpl b/testdata/dns64_lookup.rpl
index e24622c0d4b5..898d0d01ad16 100644
--- a/testdata/dns64_lookup.rpl
+++ b/testdata/dns64_lookup.rpl
@@ -4,6 +4,7 @@ server:
qname-minimisation: "no"
module-config: "dns64 validator iterator"
dns64-prefix: 64:ff9b::0/96
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/domain_insec_dlv.rpl b/testdata/domain_insec_dlv.rpl
index 8c89a70d33ba..c8bd98344d30 100644
--- a/testdata/domain_insec_dlv.rpl
+++ b/testdata/domain_insec_dlv.rpl
@@ -5,6 +5,7 @@ server:
domain-insecure: "example.net"
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/edns_keepalive.rpl b/testdata/edns_keepalive.rpl
new file mode 100644
index 000000000000..9d00b6cf762a
--- /dev/null
+++ b/testdata/edns_keepalive.rpl
@@ -0,0 +1,126 @@
+server:
+ verbosity: 3
+ edns-tcp-keepalive: yes
+ edns-tcp-keepalive-timeout: 30000 # Hardwired to this in fake_event.c
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN TCP Keepalive
+
+RANGE_BEGIN 0 100
+
+ ADDRESS 193.0.14.129
+
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+RANGE_END
+
+;; ----------------------------------------
+
+STEP 1 QUERY
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 02 ; Length 2
+ 00 ff ; Timeout
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 10 CHECK_ANSWER
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD FORMERR
+ SECTION QUESTION
+ www.example.com. IN A
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ ; Empty
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 20 QUERY
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD
+ SECTION QUESTION
+ . IN NS
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 00 ; Length 0
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 30 CHECK_ANSWER
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY QR RD RA NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 02 ; Length 2
+ 01 2c ; 30s = 300 10th secs
+ HEX_EDNSDATA_END
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+; Check that a subsequent query on the connection without keepalive will
+; generate a keepalive reply because we've already seen one.
+
+STEP 40 QUERY
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY RD
+ SECTION QUESTION
+ . IN NS
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ ; Empty
+ HEX_EDNSDATA_END
+ ENTRY_END
+
+STEP 50 CHECK_ANSWER
+
+ ENTRY_BEGIN
+ MATCH TCP ednsdata
+ REPLY QR RD RA NOERROR
+ SECTION QUESTION
+ . IN NS
+ SECTION ANSWER
+ . IN NS K.ROOT-SERVERS.NET.
+ SECTION ADDITIONAL
+ HEX_EDNSDATA_BEGIN
+ 00 0b ; Opcode 11
+ 00 02 ; Length 2
+ 01 2c ; 30s = 300 10th secs
+ HEX_EDNSDATA_END
+ K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/fetch_glue.rpl b/testdata/fetch_glue.rpl
index 3ecc28abf71c..3e9f64f8d1b0 100644
--- a/testdata/fetch_glue.rpl
+++ b/testdata/fetch_glue.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/fetch_glue_cname.rpl b/testdata/fetch_glue_cname.rpl
index e8158f9f07b2..4a86afa50f65 100644
--- a/testdata/fetch_glue_cname.rpl
+++ b/testdata/fetch_glue_cname.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/fwd_cached.rpl b/testdata/fwd_cached.rpl
index 23b4a08a2282..2d6b0c2b8cbe 100644
--- a/testdata/fwd_cached.rpl
+++ b/testdata/fwd_cached.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf b/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf
index 39bd9f5cb23d..08e9d643274c 100644
--- a/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf
+++ b/testdata/fwd_compress_c00c.tdir/fwd_compress_c00c.conf
@@ -9,6 +9,7 @@ server:
chroot: ""
username: ""
do-not-query-localhost: no
+ minimal-responses: no
forward-zone:
name: "."
forward-addr: "127.0.0.1@@TOPORT@"
diff --git a/testdata/ipsecmod_enabled.crpl b/testdata/ipsecmod_enabled.crpl
index 501f18be4857..449842961de1 100644
--- a/testdata/ipsecmod_enabled.crpl
+++ b/testdata/ipsecmod_enabled.crpl
@@ -10,6 +10,7 @@ server:
ipsecmod-max-ttl: 200
ipsecmod-enabled: no
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_ignore_bogus_ipseckey.crpl b/testdata/ipsecmod_ignore_bogus_ipseckey.crpl
index d62dfafd2d1c..a605c344581b 100644
--- a/testdata/ipsecmod_ignore_bogus_ipseckey.crpl
+++ b/testdata/ipsecmod_ignore_bogus_ipseckey.crpl
@@ -17,6 +17,7 @@ server:
ipsecmod-max-ttl: 200
ipsecmod-ignore-bogus: yes
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_max_ttl.crpl b/testdata/ipsecmod_max_ttl.crpl
index 50d4adf64e89..592bae046360 100644
--- a/testdata/ipsecmod_max_ttl.crpl
+++ b/testdata/ipsecmod_max_ttl.crpl
@@ -9,6 +9,7 @@ server:
ipsecmod-strict: no
ipsecmod-max-ttl: 200
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_strict.crpl b/testdata/ipsecmod_strict.crpl
index 13d8e0e4bd5d..f74e308bde44 100644
--- a/testdata/ipsecmod_strict.crpl
+++ b/testdata/ipsecmod_strict.crpl
@@ -9,6 +9,7 @@ server:
ipsecmod-strict: yes
ipsecmod-max-ttl: 200
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ipsecmod_whitelist.crpl b/testdata/ipsecmod_whitelist.crpl
index d916b0050e4d..34108f3b1161 100644
--- a/testdata/ipsecmod_whitelist.crpl
+++ b/testdata/ipsecmod_whitelist.crpl
@@ -10,6 +10,7 @@ server:
ipsecmod-max-ttl: 200
ipsecmod-whitelist: white.example.com
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_class_any.rpl b/testdata/iter_class_any.rpl
index a4ea822fdba0..6fb296e99d00 100644
--- a/testdata/iter_class_any.rpl
+++ b/testdata/iter_class_any.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_cycle_noh.rpl b/testdata/iter_cycle_noh.rpl
index 6c2982adc94e..eee26ca70d15 100644
--- a/testdata/iter_cycle_noh.rpl
+++ b/testdata/iter_cycle_noh.rpl
@@ -3,6 +3,7 @@ server:
harden-glue: "no"
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_dname_insec.rpl b/testdata/iter_dname_insec.rpl
index 791e3848572a..ce593ba5c20a 100644
--- a/testdata/iter_dname_insec.rpl
+++ b/testdata/iter_dname_insec.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_domain_sale.rpl b/testdata/iter_domain_sale.rpl
index ff612780a8c8..be05e2f4363d 100644
--- a/testdata/iter_domain_sale.rpl
+++ b/testdata/iter_domain_sale.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_domain_sale_nschange.rpl b/testdata/iter_domain_sale_nschange.rpl
index bc396f67c6f3..5af54efb9855 100644
--- a/testdata/iter_domain_sale_nschange.rpl
+++ b/testdata/iter_domain_sale_nschange.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_emptydp.rpl b/testdata/iter_emptydp.rpl
index f61b3064dddb..82ddccfade66 100644
--- a/testdata/iter_emptydp.rpl
+++ b/testdata/iter_emptydp.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_emptydp_for_glue.rpl b/testdata/iter_emptydp_for_glue.rpl
index 33951e790a70..2e7db65e1402 100644
--- a/testdata/iter_emptydp_for_glue.rpl
+++ b/testdata/iter_emptydp_for_glue.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdfirst.rpl b/testdata/iter_fwdfirst.rpl
index 5154babb348b..0f8a85f5ae03 100644
--- a/testdata/iter_fwdfirst.rpl
+++ b/testdata/iter_fwdfirst.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdfirstequal.rpl b/testdata/iter_fwdfirstequal.rpl
index d8da470cf542..dc648143ce66 100644
--- a/testdata/iter_fwdfirstequal.rpl
+++ b/testdata/iter_fwdfirstequal.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdstub.rpl b/testdata/iter_fwdstub.rpl
index 06a8789b721b..ad5b57cb7690 100644
--- a/testdata/iter_fwdstub.rpl
+++ b/testdata/iter_fwdstub.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_fwdstubroot.rpl b/testdata/iter_fwdstubroot.rpl
index e43584cbef17..fa930430d7f5 100644
--- a/testdata/iter_fwdstubroot.rpl
+++ b/testdata/iter_fwdstubroot.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_got6only.rpl b/testdata/iter_got6only.rpl
index 7363a48b7d52..15522843903b 100644
--- a/testdata/iter_got6only.rpl
+++ b/testdata/iter_got6only.rpl
@@ -3,6 +3,7 @@ server:
do-ip6: no
target-fetch-policy: "0 0 0 0 0 "
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/iter_hint_lame.rpl b/testdata/iter_hint_lame.rpl
index e9ffbce64c7b..2fb6dde72d91 100644
--- a/testdata/iter_hint_lame.rpl
+++ b/testdata/iter_hint_lame.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_lame_noaa.rpl b/testdata/iter_lame_noaa.rpl
index 18d326b77967..7a6eb1b30536 100644
--- a/testdata/iter_lame_noaa.rpl
+++ b/testdata/iter_lame_noaa.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_lame_nosoa.rpl b/testdata/iter_lame_nosoa.rpl
index 903bb29bc99f..4914f7461f5f 100644
--- a/testdata/iter_lame_nosoa.rpl
+++ b/testdata/iter_lame_nosoa.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_mod.rpl b/testdata/iter_mod.rpl
index c57e2328ab78..35b3a5af6a5c 100644
--- a/testdata/iter_mod.rpl
+++ b/testdata/iter_mod.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
module-config: "iterator"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_ns_badip.rpl b/testdata/iter_ns_badip.rpl
index 6ce2b14d47b5..ad266c64d117 100644
--- a/testdata/iter_ns_badip.rpl
+++ b/testdata/iter_ns_badip.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "3 2 1 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_ns_spoof.rpl b/testdata/iter_ns_spoof.rpl
index 1679ce724c7a..f6745763532f 100644
--- a/testdata/iter_ns_spoof.rpl
+++ b/testdata/iter_ns_spoof.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: yes
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/iter_pc_a.rpl b/testdata/iter_pc_a.rpl
index 985345c15360..d9add0056fea 100644
--- a/testdata/iter_pc_a.rpl
+++ b/testdata/iter_pc_a.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pc_aaaa.rpl b/testdata/iter_pc_aaaa.rpl
index 20e1a787f402..a28354306aca 100644
--- a/testdata/iter_pc_aaaa.rpl
+++ b/testdata/iter_pc_aaaa.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcdiff.rpl b/testdata/iter_pcdiff.rpl
index 18b984c16797..57fb109afa5e 100644
--- a/testdata/iter_pcdiff.rpl
+++ b/testdata/iter_pcdiff.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcdirect.rpl b/testdata/iter_pcdirect.rpl
index 0a4487fd86c7..0bd5dfe78355 100644
--- a/testdata/iter_pcdirect.rpl
+++ b/testdata/iter_pcdirect.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcname.rpl b/testdata/iter_pcname.rpl
index 037b6426f4d2..e17c9102c86a 100644
--- a/testdata/iter_pcname.rpl
+++ b/testdata/iter_pcname.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcnamech.rpl b/testdata/iter_pcnamech.rpl
index a979101d9547..1aba95b07aa7 100644
--- a/testdata/iter_pcnamech.rpl
+++ b/testdata/iter_pcnamech.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcnamechrec.rpl b/testdata/iter_pcnamechrec.rpl
index f4c0197ba908..90745fcf3eb2 100644
--- a/testdata/iter_pcnamechrec.rpl
+++ b/testdata/iter_pcnamechrec.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcnamerec.rpl b/testdata/iter_pcnamerec.rpl
index ecc03d353501..faee6d029acd 100644
--- a/testdata/iter_pcnamerec.rpl
+++ b/testdata/iter_pcnamerec.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_pcttl.rpl b/testdata/iter_pcttl.rpl
index 41d94bc4234d..413f8cb88b09 100644
--- a/testdata/iter_pcttl.rpl
+++ b/testdata/iter_pcttl.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
do-ip6: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch.rpl b/testdata/iter_prefetch.rpl
index feb6b81e8673..bad92dc575dd 100644
--- a/testdata/iter_prefetch.rpl
+++ b/testdata/iter_prefetch.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_change.rpl b/testdata/iter_prefetch_change.rpl
index 2ed70cdadf8f..007025ad010c 100644
--- a/testdata/iter_prefetch_change.rpl
+++ b/testdata/iter_prefetch_change.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_change2.rpl b/testdata/iter_prefetch_change2.rpl
index 93196d555f72..7a8370ff61bb 100644
--- a/testdata/iter_prefetch_change2.rpl
+++ b/testdata/iter_prefetch_change2.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_childns.rpl b/testdata/iter_prefetch_childns.rpl
index 869aaa40c95c..00a91fcde1a5 100644
--- a/testdata/iter_prefetch_childns.rpl
+++ b/testdata/iter_prefetch_childns.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_fail.rpl b/testdata/iter_prefetch_fail.rpl
index 2f7f9942510d..1d92a4c1c462 100644
--- a/testdata/iter_prefetch_fail.rpl
+++ b/testdata/iter_prefetch_fail.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_prefetch_ns.rpl b/testdata/iter_prefetch_ns.rpl
index f99fb80dcf5a..93af216387ae 100644
--- a/testdata/iter_prefetch_ns.rpl
+++ b/testdata/iter_prefetch_ns.rpl
@@ -3,6 +3,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
prefetch: "yes"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_primenoglue.rpl b/testdata/iter_primenoglue.rpl
index 0d6adefc591e..a75ed82ddce2 100644
--- a/testdata/iter_primenoglue.rpl
+++ b/testdata/iter_primenoglue.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_privaddr.rpl b/testdata/iter_privaddr.rpl
index 2361af6536c8..93a2a147d1eb 100644
--- a/testdata/iter_privaddr.rpl
+++ b/testdata/iter_privaddr.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
private-address: 10.0.0.0/8
private-address: 172.16.0.0/12
diff --git a/testdata/iter_ranoaa_lame.rpl b/testdata/iter_ranoaa_lame.rpl
index d2db84a8e097..efb38a5907ec 100644
--- a/testdata/iter_ranoaa_lame.rpl
+++ b/testdata/iter_ranoaa_lame.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_reclame_one.rpl b/testdata/iter_reclame_one.rpl
index fe15b256ce39..4df9b6594fe4 100644
--- a/testdata/iter_reclame_one.rpl
+++ b/testdata/iter_reclame_one.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_reclame_two.rpl b/testdata/iter_reclame_two.rpl
index 3b7dfd65cbe0..f30edd941472 100644
--- a/testdata/iter_reclame_two.rpl
+++ b/testdata/iter_reclame_two.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_recurse.rpl b/testdata/iter_recurse.rpl
index ab62e1ae5d5f..181af11079f5 100644
--- a/testdata/iter_recurse.rpl
+++ b/testdata/iter_recurse.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve.rpl b/testdata/iter_resolve.rpl
index cab3887f77b9..ed051ff24eff 100644
--- a/testdata/iter_resolve.rpl
+++ b/testdata/iter_resolve.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised.rpl b/testdata/iter_resolve_minimised.rpl
index ab3c6e9e7121..2c6f9ccf5f93 100644
--- a/testdata/iter_resolve_minimised.rpl
+++ b/testdata/iter_resolve_minimised.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised_nx.rpl b/testdata/iter_resolve_minimised_nx.rpl
index cb877bc250b4..74e612ccb951 100644
--- a/testdata/iter_resolve_minimised_nx.rpl
+++ b/testdata/iter_resolve_minimised_nx.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised_refused.rpl b/testdata/iter_resolve_minimised_refused.rpl
index 82852a4380cd..66e8e631e200 100644
--- a/testdata/iter_resolve_minimised_refused.rpl
+++ b/testdata/iter_resolve_minimised_refused.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_resolve_minimised_timeout.rpl b/testdata/iter_resolve_minimised_timeout.rpl
index 2a166aff0e71..86b93216075b 100644
--- a/testdata/iter_resolve_minimised_timeout.rpl
+++ b/testdata/iter_resolve_minimised_timeout.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_cname_an.rpl b/testdata/iter_scrub_cname_an.rpl
index 54a98c63bf34..9c5060af7913 100644
--- a/testdata/iter_scrub_cname_an.rpl
+++ b/testdata/iter_scrub_cname_an.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_dname_insec.rpl b/testdata/iter_scrub_dname_insec.rpl
index a2972202c626..921abe628f7f 100644
--- a/testdata/iter_scrub_dname_insec.rpl
+++ b/testdata/iter_scrub_dname_insec.rpl
@@ -3,6 +3,7 @@ server:
harden-referral-path: no
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_dname_rev.rpl b/testdata/iter_scrub_dname_rev.rpl
index b7e3ee2d0fb1..3e649f936186 100644
--- a/testdata/iter_scrub_dname_rev.rpl
+++ b/testdata/iter_scrub_dname_rev.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_scrub_dname_sec.rpl b/testdata/iter_scrub_dname_sec.rpl
index 1b9153ba74a5..4597cdf982cd 100644
--- a/testdata/iter_scrub_dname_sec.rpl
+++ b/testdata/iter_scrub_dname_sec.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_soamin.rpl b/testdata/iter_soamin.rpl
index 42eb80827d61..7e902601b006 100644
--- a/testdata/iter_soamin.rpl
+++ b/testdata/iter_soamin.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_stub_leak.rpl b/testdata/iter_stub_leak.rpl
index e5c6200060a0..388344ce5ef0 100644
--- a/testdata/iter_stub_leak.rpl
+++ b/testdata/iter_stub_leak.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_stub_noroot.rpl b/testdata/iter_stub_noroot.rpl
index 0bc1ff5d2031..ef306bd428c4 100644
--- a/testdata/iter_stub_noroot.rpl
+++ b/testdata/iter_stub_noroot.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_stubfirst.rpl b/testdata/iter_stubfirst.rpl
index 6245a4f09a1e..1a7112de4517 100644
--- a/testdata/iter_stubfirst.rpl
+++ b/testdata/iter_stubfirst.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/iter_timeout_ra_aaaa.rpl b/testdata/iter_timeout_ra_aaaa.rpl
index 9b06aea90992..126867ba4a4a 100644
--- a/testdata/iter_timeout_ra_aaaa.rpl
+++ b/testdata/iter_timeout_ra_aaaa.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/pylib.tdir/pylib.lookup.conf b/testdata/pylib.tdir/pylib.lookup.conf
new file mode 100644
index 000000000000..3f4a8d26dfb1
--- /dev/null
+++ b/testdata/pylib.tdir/pylib.lookup.conf
@@ -0,0 +1,14 @@
+server:
+ verbosity: 2
+ use-syslog: no
+ directory: ""
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ module-config: "validator iterator"
+
+stub-zone:
+ name: "example.com."
+ stub-addr: "127.0.0.1@@TOPORT@"
+
diff --git a/testdata/pylib.tdir/pylib.lookup.py b/testdata/pylib.tdir/pylib.lookup.py
index 1c829bc7054d..5f69c58abd18 100755
--- a/testdata/pylib.tdir/pylib.lookup.py
+++ b/testdata/pylib.tdir/pylib.lookup.py
@@ -1,24 +1,141 @@
#!/usr/bin/env python
-'''
-Test for unbound lookup.
-BSD licensed.
-'''
+#
+# Test for pyunbound lookup.
+# BSD licensed.
+#
+import sys
+import time
+
import unbound
-ctx = unbound.ub_ctx()
-status = ctx.config("ub.conf")
-if status != 0:
- print "read config failed ", status
- exit(1)
+qname = "www.example.com"
+qtype = unbound.RR_TYPE_A
+qclass = unbound.RR_CLASS_IN
+
+def create_context(config_file="ub.lookup.conf", async=False):
+ """
+ Create an unbound context to use for testing.
+
+ """
+ ctx = unbound.ub_ctx()
+ status = ctx.config(config_file)
+ if status != 0:
+ print("read config failed with status: {}".format(status))
+ sys.exit(1)
+ ctx.set_async(async)
+ return ctx
+
+
+def callback(data, status, result):
+ """
+ Callback for background workers.
+
+ """
+ if status == 0:
+ data['rcode'] = result.rcode
+ data['secure'] = result.secure
+ if result.havedata:
+ data['data'] = result.data
+ data['was_ratelimited'] = result.was_ratelimited
+ data['done'] = True
+
+
+def test_resolve(ctx):
+ """
+ Test resolving a domain with a foreground worker.
+
+ """
+ status, result = ctx.resolve(qname, qtype, qclass)
+ if status == 0 and result.havedata:
+ print("Resolve: {}".format(result.data.address_list))
+ else:
+ print("Failed resolve with: {}".format(status))
+
+
+def test_async_resolve(ctx):
+ """
+ Test resolving a domain with a background worker.
+
+ """
+ cb_data = dict(done=False)
+ retval, async_id = ctx.resolve_async(qname, cb_data, callback, qtype, qclass)
+ while retval == 0 and not cb_data['done']:
+ time.sleep(0.1)
+ retval = ctx.process()
+
+ if cb_data.get('data'):
+ print("Async resolve: {}".format(cb_data['data'].address_list))
+ else:
+ print("Failed async resolve with: {}".format(retval))
+
+
+def test_ratelimit_fg_on(ctx):
+ """
+ Test resolving a ratelimited domain with a foreground worker.
+
+ """
+ ctx.set_option("ratelimit:", "1")
+ ctx.set_option("ratelimit-factor:", "0")
+ status, result = ctx.resolve(qname, qtype, qclass)
+ if status == 0 and result.was_ratelimited:
+ print("Ratelimit-fg-on: pass")
+ else:
+ print("Failed ratelimit-fg-on with: {}".format(status))
+
+
+def test_ratelimit_fg_off(ctx):
+ """
+ Test resolving a non-ratelimited domain with a foreground worker.
+
+ """
+ status, result = ctx.resolve(qname, qtype, qclass)
+ if status == 0 and result.havedata:
+ print("Ratelimit-fg-off: {}".format(result.data.address_list))
+ else:
+ print("Failed ratelimit-fg-off with: {}".format(status))
+
+
+def test_ratelimit_bg_on(ctx):
+ """
+ Test resolving a ratelimited domain with a background worker.
+
+ """
+ ctx.set_option("ratelimit:", "1")
+ ctx.set_option("ratelimit-factor:", "0")
+ cb_data = dict(done=False)
+ retval, async_id = ctx.resolve_async(qname, cb_data, callback, qtype, qclass)
+ while retval == 0 and not cb_data['done']:
+ time.sleep(0.1)
+ retval = ctx.process()
+
+ if cb_data.get('was_ratelimited'):
+ print("Ratelimit-bg-on: pass")
+ else:
+ print("Failed ratelimit-bg-on with: {}".format(status))
+
+
+def test_ratelimit_bg_off(ctx):
+ """
+ Test resolving a non-ratelimited domain with a background worker.
+
+ """
+ cb_data = dict(done=False)
+ retval, async_id = ctx.resolve_async(qname, cb_data, callback, qtype, qclass)
+ while retval == 0 and not cb_data['done']:
+ time.sleep(0.1)
+ retval = ctx.process()
-print "config created"
+ if cb_data.get('data'):
+ print("Ratelimit-bg-off: {}".format(cb_data['data'].address_list))
+ else:
+ print("Failed ratelimit-bg-off with: {}".format(status))
-status, result = ctx.resolve("www.example.com", unbound.RR_TYPE_A, unbound.RR_CLASS_IN);
-if status == 0 and result.havedata:
- print "Result: ", result.data.address_list
-else:
- print "Failed ", status, " and data ", result
-ctx = None
+test_resolve(create_context())
+test_async_resolve(create_context(async=True))
+test_ratelimit_fg_on(create_context())
+test_ratelimit_fg_off(create_context())
+test_ratelimit_bg_on(create_context(async=True))
+test_ratelimit_bg_off(create_context(async=True))
-exit(0)
+sys.exit(0)
diff --git a/testdata/pylib.tdir/pylib.post b/testdata/pylib.tdir/pylib.post
index 26db7e80eee9..875e06d0ae34 100644
--- a/testdata/pylib.tdir/pylib.post
+++ b/testdata/pylib.tdir/pylib.post
@@ -10,9 +10,9 @@ PRE="../.."
. ../common.sh
# if no python; exit
if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have python module"
+ echo "have pyunbound"
else
- echo "no python module"
+ echo "no pyunbound"
exit 0
fi
diff --git a/testdata/pylib.tdir/pylib.pre b/testdata/pylib.tdir/pylib.pre
index 01ca2b896280..30e0059064ab 100644
--- a/testdata/pylib.tdir/pylib.pre
+++ b/testdata/pylib.tdir/pylib.pre
@@ -8,13 +8,16 @@ PRE="../.."
. ../common.sh
# if no python; exit
if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have python module"
+ echo "have pyunbound"
else
- echo "no python module"
+ echo "no pyunbound"
exit 0
fi
-# get module python local
-cp $PRE/pythonmod/unboundmodule.py .
+
+# Copy the required libraries
+cp $PRE/libunbound/python/unbound.py .
+cp $PRE/.libs/_unbound* .
+cp $PRE/.libs/libunbound* .
get_random_port 2
UNBOUND_PORT=$RND_PORT
@@ -29,7 +32,7 @@ FWD_PID=$!
echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
# modify config file
-sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < pylib.conf > ub.conf
+sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < pylib.lookup.conf > ub.lookup.conf
cat .tpkg.var.test
wait_ldns_testns_up fwd.log
diff --git a/testdata/pylib.tdir/pylib.py b/testdata/pylib.tdir/pylib.py
deleted file mode 100644
index 3f6fed1c696b..000000000000
--- a/testdata/pylib.tdir/pylib.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# -*- coding: utf-8 -*-
-'''
- ubmodule-msg.py: simple response packet logger
-
- Authors: Zdenek Vasicek (vasicek AT fit.vutbr.cz)
- Marek Vavrusa (xvavru00 AT stud.fit.vutbr.cz)
-
- Copyright (c) 2008. All rights reserved.
-
- This software is open source.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- Modified for unit test by Wouter Wijngaards, NLnet Labs, 2009.
-'''
-import os
-
-def init(id, cfg):
- log_info("pythonmod: init called, module id is %d port: %d script: %s" % (id, cfg.port, cfg.python_script))
- return True
-
-def deinit(id):
- log_info("pythonmod: deinit called, module id is %d" % id)
- return True
-
-def inform_super(id, qstate, superqstate, qdata):
- return True
-
-def setTTL(qstate, ttl):
- """Sets return_msg TTL and all the RRs TTL"""
- if qstate.return_msg:
- qstate.return_msg.rep.ttl = ttl
- if (qstate.return_msg.rep):
- for i in range(0,qstate.return_msg.rep.rrset_count):
- d = qstate.return_msg.rep.rrsets[i].entry.data
- for j in range(0,d.count+d.rrsig_count):
- d.rr_ttl[j] = ttl
-
-def dataHex(data, prefix=""):
- res = ""
- for i in range(0, (len(data)+15)/16):
- res += "%s0x%02X | " % (prefix, i*16)
- d = map(lambda x:ord(x), data[i*16:i*16+17])
- for ch in d:
- res += "%02X " % ch
- for i in range(0,17-len(d)):
- res += " "
- res += "| "
- for ch in d:
- if (ch < 32) or (ch > 127):
- res += ". "
- else:
- res += "%c " % ch
- res += "\n"
- return res
-
-def printReturnMsg(qstate):
- print "Return MSG rep :: flags: %04X, QDcount: %d, Security:%d, TTL=%d" % (qstate.return_msg.rep.flags, qstate.return_msg.rep.qdcount,qstate.return_msg.rep.security, qstate.return_msg.rep.ttl)
- print " qinfo :: qname:",qstate.return_msg.qinfo.qname_list, qstate.return_msg.qinfo.qname_str, "type:",qstate.return_msg.qinfo.qtype_str, "class:",qstate.return_msg.qinfo.qclass_str
- if (qstate.return_msg.rep):
- print "RRSets:",qstate.return_msg.rep.rrset_count
- prevkey = None
- for i in range(0,qstate.return_msg.rep.rrset_count):
- r = qstate.return_msg.rep.rrsets[i]
- rk = r.rk
- print i,":",rk.dname_list, rk.dname_str, "flags: %04X" % rk.flags,
- print "type:",rk.type_str,"(%d)" % ntohs(rk.type), "class:",rk.rrset_class_str,"(%d)" % ntohs(rk.rrset_class)
-
- d = r.entry.data
- print " RRDatas:",d.count+d.rrsig_count
- for j in range(0,d.count+d.rrsig_count):
- print " ",j,":","TTL=",d.rr_ttl[j],"RR data:"
- print dataHex(d.rr_data[j]," ")
-
-
-def operate(id, event, qstate, qdata):
- log_info("pythonmod: operate called, id: %d, event:%s" % (id, strmodulevent(event)))
- #print "pythonmod: per query data", qdata
-
- print "Query:", ''.join(map(lambda x:chr(max(32,ord(x))),qstate.qinfo.qname)), qstate.qinfo.qname_list, qstate.qinfo.qname_str,
- print "Type:",qstate.qinfo.qtype_str,"(%d)" % qstate.qinfo.qtype,
- print "Class:",qstate.qinfo.qclass_str,"(%d)" % qstate.qinfo.qclass
- print
-
- if (event == MODULE_EVENT_NEW or event == MODULE_EVENT_PASS) and (qstate.qinfo.qname_str.endswith("www2.example.com.")):
- print qstate.qinfo.qname_str
-
- qstate.ext_state[id] = MODULE_FINISHED
-
- msg = DNSMessage(qstate.qinfo.qname_str, RR_TYPE_A, RR_CLASS_IN, PKT_QR | PKT_RA | PKT_AA) #, 300)
- #msg.authority.append("xxx.seznam.cz. 10 IN A 192.168.1.1")
- #msg.additional.append("yyy.seznam.cz. 10 IN A 1.1.1.2.")
-
- # answer can be returned to the client without further checking.
-
- if qstate.qinfo.qtype == RR_TYPE_A:
- msg.answer.append("%s 10 IN A 192.168.1.1" % qstate.qinfo.qname_str)
- if (qstate.qinfo.qtype == RR_TYPE_SRV) or (qstate.qinfo.qtype == RR_TYPE_ANY):
- msg.answer.append("%s 10 IN SRV 0 0 80 neinfo.example.com." % qstate.qinfo.qname_str)
- if (qstate.qinfo.qtype == RR_TYPE_TXT) or (qstate.qinfo.qtype == RR_TYPE_ANY):
- msg.answer.append("%s 10 IN TXT path=/" % qstate.qinfo.qname_str)
-
- if not msg.set_return_msg(qstate):
- qstate.ext_state[id] = MODULE_ERROR
- return True
-
- #qstate.return_msg.rep.security = 2 #pokud nebude nasledovat validator, je zapotrebi nastavit security, aby nebyl paket zahozen v mesh_send_reply
- printReturnMsg(qstate)
-
- #Authoritative result can't be stored in cache
- #if (not storeQueryInCache(qstate, qstate.return_msg.qinfo, qstate.return_msg.rep, 0)):
- # print "Can't store in cache"
- # qstate.ext_state[id] = MODULE_ERROR
- # return False
- #print "Store OK"
-
- qstate.return_rcode = RCODE_NOERROR
- return True
-
- if event == MODULE_EVENT_NEW:
- qstate.ext_state[id] = MODULE_WAIT_MODULE
- return True
-
- if event == MODULE_EVENT_MODDONE:
- log_info("pythonmod: previous module done")
- qstate.ext_state[id] = MODULE_FINISHED
- return True
-
- if event == MODULE_EVENT_PASS:
- log_info("pythonmod: event_pass")
- qstate.ext_state[id] = MODULE_WAIT_MODULE
- return True
-
- log_err("pythonmod: BAD event")
- qstate.ext_state[id] = MODULE_ERROR
- return True
-
-log_info("pythonmod: script loaded.")
diff --git a/testdata/pylib.tdir/pylib.test b/testdata/pylib.tdir/pylib.test
index 96a846403c15..9456691aa6e1 100644
--- a/testdata/pylib.tdir/pylib.test
+++ b/testdata/pylib.tdir/pylib.test
@@ -6,9 +6,9 @@
PRE="../.."
if grep "define WITH_PYUNBOUND 1" $PRE/config.h; then
- echo "have python module"
+ echo "have pyunbound"
else
- echo "no python module"
+ echo "no pyunbound"
exit 0
fi
@@ -19,22 +19,50 @@ fi
#echo export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:../../.libs:."
#export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:../../.libs:."
-cp $PRE/libunbound/python/unbound.py .
-cp $PRE/.libs/_unbound* .
-cp $PRE/.libs/libunbound* .
-
# do the test
echo "> pylib.lookup.py www.example.com."
./pylib.lookup.py www.example.com. | tee outfile
echo "> cat logfiles"
-cat fwd.log
+cat fwd.log
echo "> check answer"
-if grep "10.20.30.40" outfile; then
- echo "OK"
+if grep "Resolve: \[.\?10.20.30.40.\?\]" outfile; then
+ :
else
- echo "Not OK"
+ echo "Not OK (resolve)"
exit 1
fi
+if grep "Async resolve: \[.\?10.20.30.40.\?\]" outfile; then
+ :
+else
+ echo "Not OK (async resolve)"
+ exit 1
+fi
+if grep "Ratelimit-fg-on: pass" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-fg-on)"
+ exit 1
+fi
+if grep "Ratelimit-fg-off: \[.\?10.20.30.40.\?\]" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-fg-off)"
+ exit 1
+fi
+if grep "Ratelimit-bg-on: pass" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-bg-on)"
+ exit 1
+fi
+if grep "Ratelimit-bg-off: \[.\?10.20.30.40.\?\]" outfile; then
+ :
+else
+ echo "Not OK (ratelimit-bg-off)"
+ exit 1
+fi
+
+echo "OK"
exit 0
diff --git a/testdata/rrset_rettl.rpl b/testdata/rrset_rettl.rpl
index 2ae64e9476bb..55dd62386e28 100644
--- a/testdata/rrset_rettl.rpl
+++ b/testdata/rrset_rettl.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/rrset_untrusted.rpl b/testdata/rrset_untrusted.rpl
index 232554872b4a..6370ebf49bf9 100644
--- a/testdata/rrset_untrusted.rpl
+++ b/testdata/rrset_untrusted.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/rrset_updated.rpl b/testdata/rrset_updated.rpl
index 4e877df11472..d36ab8cc88a7 100644
--- a/testdata/rrset_updated.rpl
+++ b/testdata/rrset_updated.rpl
@@ -1,5 +1,7 @@
; This is a comment.
; config options go here.
+server:
+ minimal-responses: no
forward-zone: name: "." forward-addr: 216.0.0.1
CONFIG_END
diff --git a/testdata/subnet_cached.crpl b/testdata/subnet_cached.crpl
index 3d4fd9a961b8..a0d89af51c1e 100644
--- a/testdata/subnet_cached.crpl
+++ b/testdata/subnet_cached.crpl
@@ -12,6 +12,7 @@ server:
verbosity: 3
access-control: 127.0.0.1 allow_snoop
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/subnet_max_source.crpl b/testdata/subnet_max_source.crpl
index aae1f1af2e5d..e1c6cf5f99f7 100644
--- a/testdata/subnet_max_source.crpl
+++ b/testdata/subnet_max_source.crpl
@@ -10,6 +10,7 @@ server:
module-config: "subnetcache validator iterator"
verbosity: 3
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/subnet_val_positive.crpl b/testdata/subnet_val_positive.crpl
index ef33531d2a32..afec59933d91 100644
--- a/testdata/subnet_val_positive.crpl
+++ b/testdata/subnet_val_positive.crpl
@@ -10,6 +10,7 @@ server:
module-config: "subnetcache validator iterator"
verbosity: 3
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/subnet_val_positive_client.crpl b/testdata/subnet_val_positive_client.crpl
index dcd3a87199b2..e631a64e6a29 100644
--- a/testdata/subnet_val_positive_client.crpl
+++ b/testdata/subnet_val_positive_client.crpl
@@ -11,6 +11,7 @@ server:
module-config: "subnetcache validator iterator"
verbosity: 3
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/pylib.tdir/pylib.conf b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.conf
index 82fa27a68196..4d4f71dc5297 100644
--- a/testdata/pylib.tdir/pylib.conf
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.conf
@@ -1,19 +1,16 @@
server:
verbosity: 2
# num-threads: 1
- #port: @PORT@
+ interface: 127.0.0.1
+ port: @PORT@
use-syslog: no
- directory: ""
+ directory: .
pidfile: "unbound.pid"
chroot: ""
username: ""
do-not-query-localhost: no
- module-config: "validator iterator"
-
-#python:
- #python-script: "pylib.py"
+ tcp-connection-limit: 0.0.0.0/0 0
forward-zone:
name: "."
forward-addr: "127.0.0.1@@TOPORT@"
-
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc
new file mode 100644
index 000000000000..2bc5196db2d8
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.dsc
@@ -0,0 +1,16 @@
+BaseName: tcp_conn_limit
+Version: 1.0
+Description: Test tcp-connection-limit setting.
+CreationDate: Fri Aug 3 17:18:00 BST 2018
+Maintainer: dr. J. Hague
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: tcp_conn_limit.pre
+Post: tcp_conn_limit.post
+Test: tcp_conn_limit.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.post b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.post
new file mode 100644
index 000000000000..1cd215e2df00
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.post
@@ -0,0 +1,10 @@
+# #-- tcp_conn_limit.post --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# source the test var file when it's there
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+#
+# do your teardown here
+. ../common.sh
+kill_pid $FWD_PID
+kill_pid $UNBOUND_PID
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre
new file mode 100644
index 000000000000..f4382f000e3b
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.pre
@@ -0,0 +1,31 @@
+# #-- tcp_conn_limit.pre--#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+. ../common.sh
+get_random_port 2
+UNBOUND_PORT=$RND_PORT
+FWD_PORT=$(($RND_PORT + 1))
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test
+
+# start forwarder
+get_ldns_testns
+$LDNS_TESTNS -p $FWD_PORT tcp_conn_limit.testns >fwd.log 2>&1 &
+FWD_PID=$!
+echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
+
+# make config file
+sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < tcp_conn_limit.conf > ub.conf
+# start unbound in the background
+PRE="../.."
+$PRE/unbound -d -c ub.conf >unbound.log 2>&1 &
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+cat .tpkg.var.test
+wait_ldns_testns_up fwd.log
+wait_unbound_up unbound.log
+
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.test b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.test
new file mode 100644
index 000000000000..a2e1dac889e3
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.test
@@ -0,0 +1,42 @@
+# #-- tcp_conn_limit.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+
+# Set unbound to limit all IPv4 addresses to 0 connections.
+# Make sure TCP connection fails.
+
+
+if uname | grep MINGW >/dev/null; then
+ echo "no job control in shell on windows. end test"
+ exit 0
+fi
+
+PRE="../.."
+. ../common.sh
+get_make
+(cd $PRE; $MAKE streamtcp)
+
+# test query should fail.
+echo "> query www.example.com."
+$PRE/streamtcp -f 127.0.0.1@$UNBOUND_PORT www.example.com. A IN >outfile 2>&1
+if test "$?" -eq 0; then
+ echo "exit status OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+else
+ echo "exit status not OK"
+fi
+echo "> cat logfiles"
+cat outfile
+cat fwd.log
+cat unbound.log
+echo "OK"
+
+exit 0
diff --git a/testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns
new file mode 100644
index 000000000000..14647723fca5
--- /dev/null
+++ b/testdata/tcp_conn_limit.tdir/tcp_conn_limit.testns
@@ -0,0 +1,42 @@
+; nameserver test file
+$ORIGIN example.com.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH UDP opcode qtype qname
+REPLY QR AA NOERROR TC
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH TCP opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id sleep=2
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www2 IN A
+SECTION ANSWER
+www2 IN A 10.20.30.42
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www3 IN A
+SECTION ANSWER
+www3 IN A 10.20.30.43
+ENTRY_END
+
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf
new file mode 100644
index 000000000000..df769aa1d857
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.conf
@@ -0,0 +1,16 @@
+server:
+ verbosity: 2
+ # num-threads: 1
+ interface: 127.0.0.1
+ port: @PORT@
+ use-syslog: no
+ directory: .
+ pidfile: "unbound.pid"
+ chroot: ""
+ username: ""
+ do-not-query-localhost: no
+ tcp-idle-timeout: 2000
+
+forward-zone:
+ name: "."
+ forward-addr: "127.0.0.1@@TOPORT@"
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc
new file mode 100644
index 000000000000..44edd5245d18
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.dsc
@@ -0,0 +1,16 @@
+BaseName: tcp_idle_timeout
+Version: 1.0
+Description: Test tcp-idle-timeout setting.
+CreationDate: Thu Jul 12 13:55:00 BST 2018
+Maintainer: dr. J. Hague
+Category:
+Component:
+CmdDepends:
+Depends:
+Help:
+Pre: tcp_idle_timeout.pre
+Post: tcp_idle_timeout.post
+Test: tcp_idle_timeout.test
+AuxFiles:
+Passed:
+Failure:
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post
new file mode 100644
index 000000000000..e8513460c537
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.post
@@ -0,0 +1,10 @@
+# #-- tcp_idle_timeout.post --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# source the test var file when it's there
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+#
+# do your teardown here
+. ../common.sh
+kill_pid $FWD_PID
+kill_pid $UNBOUND_PID
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre
new file mode 100644
index 000000000000..d36319de58ee
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.pre
@@ -0,0 +1,31 @@
+# #-- tcp_idle_timeout.pre--#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+. ../common.sh
+get_random_port 2
+UNBOUND_PORT=$RND_PORT
+FWD_PORT=$(($RND_PORT + 1))
+echo "UNBOUND_PORT=$UNBOUND_PORT" >> .tpkg.var.test
+echo "FWD_PORT=$FWD_PORT" >> .tpkg.var.test
+
+# start forwarder
+get_ldns_testns
+$LDNS_TESTNS -p $FWD_PORT tcp_idle_timeout.testns >fwd.log 2>&1 &
+FWD_PID=$!
+echo "FWD_PID=$FWD_PID" >> .tpkg.var.test
+
+# make config file
+sed -e 's/@PORT\@/'$UNBOUND_PORT'/' -e 's/@TOPORT\@/'$FWD_PORT'/' < tcp_idle_timeout.conf > ub.conf
+# start unbound in the background
+PRE="../.."
+$PRE/unbound -d -c ub.conf >unbound.log 2>&1 &
+UNBOUND_PID=$!
+echo "UNBOUND_PID=$UNBOUND_PID" >> .tpkg.var.test
+
+cat .tpkg.var.test
+wait_ldns_testns_up fwd.log
+wait_unbound_up unbound.log
+
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test
new file mode 100644
index 000000000000..2ae8c4fa8d2e
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.test
@@ -0,0 +1,67 @@
+# #-- tcp_idle_timeout.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+# use .tpkg.var.test for in test variable passing
+[ -f .tpkg.var.test ] && source .tpkg.var.test
+
+
+# Run up unbound with a 2s idle timeout. Try a normal TCP query, check it works, and then check that a connection with a 4s send delay fails.
+
+
+if uname | grep MINGW >/dev/null; then
+ echo "no job control in shell on windows. end test"
+ exit 0
+fi
+
+PRE="../.."
+. ../common.sh
+get_make
+(cd $PRE; $MAKE streamtcp)
+
+# first test a single TCP query with no delay.
+echo "> query www.example.com."
+$PRE/streamtcp -f 127.0.0.1@$UNBOUND_PORT www.example.com. A IN >outfile 2>&1
+if test "$?" -ne 0; then
+ echo "exit status not OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+else
+ echo "exit status OK"
+fi
+echo "> cat logfiles"
+cat outfile
+cat fwd.log
+cat unbound.log
+echo "> check answer"
+if grep "10.20.30.40" outfile; then
+ echo "OK"
+else
+ echo "Not OK"
+ exit 1
+fi
+
+# now test query with delay should fail.
+echo "> query www.example.com."
+$PRE/streamtcp -d 4 -f 127.0.0.1@$UNBOUND_PORT www.example.com. A IN >outfile 2>&1
+if test "$?" -eq 0; then
+ echo "exit status OK"
+ echo "> cat logfiles"
+ cat outfile
+ cat fwd.log
+ cat unbound.log
+ echo "Not OK"
+ exit 1
+else
+ echo "exit status not OK"
+fi
+echo "> cat logfiles"
+cat outfile
+cat fwd.log
+cat unbound.log
+echo "OK"
+
+exit 0
diff --git a/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns
new file mode 100644
index 000000000000..14647723fca5
--- /dev/null
+++ b/testdata/tcp_idle_timeout.tdir/tcp_idle_timeout.testns
@@ -0,0 +1,42 @@
+; nameserver test file
+$ORIGIN example.com.
+$TTL 3600
+
+ENTRY_BEGIN
+MATCH UDP opcode qtype qname
+REPLY QR AA NOERROR TC
+ADJUST copy_id
+SECTION QUESTION
+www IN A
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH TCP opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id sleep=2
+SECTION QUESTION
+www IN A
+SECTION ANSWER
+www IN A 10.20.30.40
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www2 IN A
+SECTION ANSWER
+www2 IN A 10.20.30.42
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+REPLY QR AA NOERROR
+ADJUST copy_id
+SECTION QUESTION
+www3 IN A
+SECTION ANSWER
+www3 IN A 10.20.30.43
+ENTRY_END
+
diff --git a/testdata/trust_cname_chain.rpl b/testdata/trust_cname_chain.rpl
index e4d2d2a99b7b..f8415ba23ce6 100644
--- a/testdata/trust_cname_chain.rpl
+++ b/testdata/trust_cname_chain.rpl
@@ -1,6 +1,7 @@
; config options
server:
target-fetch-policy: "0 0 0 0 0"
+ minimal-responses: no
stub-zone:
name: "."
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
diff --git a/testdata/ttl_max.rpl b/testdata/ttl_max.rpl
index 1faa05453d36..17eaca26c548 100644
--- a/testdata/ttl_max.rpl
+++ b/testdata/ttl_max.rpl
@@ -3,6 +3,7 @@ server:
access-control: 127.0.0.1 allow_snoop
cache-max-ttl: 10
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/ttl_min.rpl b/testdata/ttl_min.rpl
index b965fdbeab64..3c79ff5ed666 100644
--- a/testdata/ttl_min.rpl
+++ b/testdata/ttl_min.rpl
@@ -3,6 +3,7 @@ server:
access-control: 127.0.0.1 allow_snoop
cache-min-ttl: 10
qname-minimisation: "no"
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_adbit.rpl b/testdata/val_adbit.rpl
index f8f44fcff679..7ce62de77e31 100644
--- a/testdata/val_adbit.rpl
+++ b/testdata/val_adbit.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_adcopy.rpl b/testdata/val_adcopy.rpl
index beb952356fb7..604fd57f2043 100644
--- a/testdata/val_adcopy.rpl
+++ b/testdata/val_adcopy.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ds_afterprime.rpl b/testdata/val_ds_afterprime.rpl
index 50c28aae6f0b..3b1c0d614ba3 100644
--- a/testdata/val_ds_afterprime.rpl
+++ b/testdata/val_ds_afterprime.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_faildnskey_ok.rpl b/testdata/val_faildnskey_ok.rpl
index c191859b2079..d3ac00c47d15 100644
--- a/testdata/val_faildnskey_ok.rpl
+++ b/testdata/val_faildnskey_ok.rpl
@@ -7,6 +7,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_keyprefetch_verify.rpl b/testdata/val_keyprefetch_verify.rpl
index f55bd7945fe5..f2050fb7fe13 100644
--- a/testdata/val_keyprefetch_verify.rpl
+++ b/testdata/val_keyprefetch_verify.rpl
@@ -9,6 +9,7 @@ server:
prefetch: yes
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_noadwhennodo.rpl b/testdata/val_noadwhennodo.rpl
index c4b9afd75053..46e1bad5a60d 100644
--- a/testdata/val_noadwhennodo.rpl
+++ b/testdata/val_noadwhennodo.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_nsec3_b3_optout.rpl b/testdata/val_nsec3_b3_optout.rpl
index 41e2e38933f7..0b0569201e5f 100644
--- a/testdata/val_nsec3_b3_optout.rpl
+++ b/testdata/val_nsec3_b3_optout.rpl
@@ -6,6 +6,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_nsec3_b3_optout_negcache.rpl b/testdata/val_nsec3_b3_optout_negcache.rpl
index e2897e53ffa4..f8ef6f87df90 100644
--- a/testdata/val_nsec3_b3_optout_negcache.rpl
+++ b/testdata/val_nsec3_b3_optout_negcache.rpl
@@ -6,6 +6,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_positive.rpl b/testdata/val_positive.rpl
index bef91f6df650..daaf36089c09 100644
--- a/testdata/val_positive.rpl
+++ b/testdata/val_positive.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_qds_badanc.rpl b/testdata/val_qds_badanc.rpl
index 5c9f75660d7b..dc686153f406 100644
--- a/testdata/val_qds_badanc.rpl
+++ b/testdata/val_qds_badanc.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_qds_oneanc.rpl b/testdata/val_qds_oneanc.rpl
index c742cfad3d8b..f21ab422b47a 100644
--- a/testdata/val_qds_oneanc.rpl
+++ b/testdata/val_qds_oneanc.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_qds_twoanc.rpl b/testdata/val_qds_twoanc.rpl
index dc66388f82d6..4e4f2e732b64 100644
--- a/testdata/val_qds_twoanc.rpl
+++ b/testdata/val_qds_twoanc.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_referd.rpl b/testdata/val_referd.rpl
index dfc82e1cfd22..d475f835eb20 100644
--- a/testdata/val_referd.rpl
+++ b/testdata/val_referd.rpl
@@ -9,6 +9,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_referglue.rpl b/testdata/val_referglue.rpl
index a9714d1c8040..dd7e7de91b25 100644
--- a/testdata/val_referglue.rpl
+++ b/testdata/val_referglue.rpl
@@ -9,6 +9,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_rrsig.rpl b/testdata/val_rrsig.rpl
index d9684e497e45..0b672e0f2cba 100644
--- a/testdata/val_rrsig.rpl
+++ b/testdata/val_rrsig.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_spurious_ns.rpl b/testdata/val_spurious_ns.rpl
index 0f9d8431007a..cb0a6e529987 100644
--- a/testdata/val_spurious_ns.rpl
+++ b/testdata/val_spurious_ns.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_stub_noroot.rpl b/testdata/val_stub_noroot.rpl
index 07fb0e376e05..4235bcc5213b 100644
--- a/testdata/val_stub_noroot.rpl
+++ b/testdata/val_stub_noroot.rpl
@@ -7,6 +7,7 @@ server:
dlv-anchor: "dlv.isc.org. IN DNSKEY 257 3 5 AQPQ41chR9DEHt/aIzIFAqanbDlRflJoRs5yz1jFsoRIT7dWf0r+PeDuewdxkszNH6wnU4QL8pfKFRh5PIYVBLK3"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ta_algo_dnskey.rpl b/testdata/val_ta_algo_dnskey.rpl
index a1f1ed5d0a22..03bac83aaa43 100644
--- a/testdata/val_ta_algo_dnskey.rpl
+++ b/testdata/val_ta_algo_dnskey.rpl
@@ -8,6 +8,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ta_algo_dnskey_dp.rpl b/testdata/val_ta_algo_dnskey_dp.rpl
index 1dd48bfb27e0..2b3609be8e19 100644
--- a/testdata/val_ta_algo_dnskey_dp.rpl
+++ b/testdata/val_ta_algo_dnskey_dp.rpl
@@ -9,6 +9,7 @@ server:
harden-algo-downgrade: no
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_ta_algo_missing_dp.rpl b/testdata/val_ta_algo_missing_dp.rpl
index 4709407ed050..dc55a09da44a 100644
--- a/testdata/val_ta_algo_missing_dp.rpl
+++ b/testdata/val_ta_algo_missing_dp.rpl
@@ -10,6 +10,7 @@ server:
harden-algo-downgrade: no
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_twocname.rpl b/testdata/val_twocname.rpl
index 6756787b9bfc..d8e8cf3165da 100644
--- a/testdata/val_twocname.rpl
+++ b/testdata/val_twocname.rpl
@@ -4,6 +4,7 @@ server:
val-override-date: "20091116100204"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
forward-zone:
name: "."
diff --git a/testdata/val_unalgo_anchor.rpl b/testdata/val_unalgo_anchor.rpl
index 24dcbaf92a75..fbbf288a5ff1 100644
--- a/testdata/val_unalgo_anchor.rpl
+++ b/testdata/val_unalgo_anchor.rpl
@@ -6,6 +6,7 @@ server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
fake-sha1: yes
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_unalgo_dlv.rpl b/testdata/val_unalgo_dlv.rpl
index e78226fc8094..142beae8d10b 100644
--- a/testdata/val_unalgo_dlv.rpl
+++ b/testdata/val_unalgo_dlv.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/val_wild_pos.rpl b/testdata/val_wild_pos.rpl
index 2fc3847e8065..624d8e07bf92 100644
--- a/testdata/val_wild_pos.rpl
+++ b/testdata/val_wild_pos.rpl
@@ -7,6 +7,7 @@ server:
qname-minimisation: "no"
fake-sha1: yes
trust-anchor-signaling: no
+ minimal-responses: no
stub-zone:
name: "."
diff --git a/testdata/views.rpl b/testdata/views.rpl
index 5573cd83cfaf..6a9052fbe2cd 100644
--- a/testdata/views.rpl
+++ b/testdata/views.rpl
@@ -2,6 +2,7 @@
server:
target-fetch-policy: "0 0 0 0 0"
qname-minimisation: "no"
+ minimal-responses: no
access-control: 10.10.10.0/24 allow
access-control-view: 10.10.10.10/32 "view1"
diff --git a/util/config_file.c b/util/config_file.c
index b06176053c60..5dffa37ebb5a 100644
--- a/util/config_file.c
+++ b/util/config_file.c
@@ -104,6 +104,9 @@ config_create(void)
cfg->udp_upstream_without_downstream = 0;
cfg->tcp_mss = 0;
cfg->outgoing_tcp_mss = 0;
+ cfg->tcp_idle_timeout = 30 * 1000; /* 30s in millisecs */
+ cfg->do_tcp_keepalive = 0;
+ cfg->tcp_keepalive_timeout = 120 * 1000; /* 120s in millisecs */
cfg->ssl_service_key = NULL;
cfg->ssl_service_pem = NULL;
cfg->ssl_port = UNBOUND_DNS_OVER_TLS_PORT;
@@ -115,6 +118,8 @@ config_create(void)
cfg->log_time_ascii = 0;
cfg->log_queries = 0;
cfg->log_replies = 0;
+ cfg->log_local_actions = 0;
+ cfg->log_servfail = 0;
#ifndef USE_WINSOCK
# ifdef USE_MINI_EVENT
/* select max 1024 sockets */
@@ -172,7 +177,7 @@ config_create(void)
cfg->if_automatic = 0;
cfg->so_rcvbuf = 0;
cfg->so_sndbuf = 0;
- cfg->so_reuseport = 0;
+ cfg->so_reuseport = 1;
cfg->ip_transparent = 0;
cfg->ip_freebind = 0;
cfg->num_ifs = 0;
@@ -192,11 +197,12 @@ config_create(void)
#endif
cfg->views = NULL;
cfg->acls = NULL;
+ cfg->tcp_connection_limits = NULL;
cfg->harden_short_bufsize = 0;
cfg->harden_large_queries = 0;
cfg->harden_glue = 1;
cfg->harden_dnssec_stripped = 1;
- cfg->harden_below_nxdomain = 0;
+ cfg->harden_below_nxdomain = 1;
cfg->harden_referral_path = 0;
cfg->harden_algo_downgrade = 0;
cfg->use_caps_bits_for_id = 0;
@@ -228,6 +234,8 @@ config_create(void)
cfg->aggressive_nsec = 0;
cfg->ignore_cd = 0;
cfg->serve_expired = 0;
+ cfg->serve_expired_ttl = 0;
+ cfg->serve_expired_ttl_reset = 0;
cfg->add_holddown = 30*24*3600;
cfg->del_holddown = 30*24*3600;
cfg->keep_missing = 366*24*3600; /* one year plus a little leeway */
@@ -248,7 +256,7 @@ config_create(void)
cfg->control_ifs.last = NULL;
cfg->control_port = UNBOUND_CONTROL_PORT;
cfg->control_use_cert = 1;
- cfg->minimal_responses = 0;
+ cfg->minimal_responses = 1;
cfg->rrset_roundrobin = 0;
cfg->max_udp_size = 4096;
if(!(cfg->server_key_file = strdup(RUN_DIR"/unbound_server.key")))
@@ -338,6 +346,7 @@ struct config_file* config_create_forlib(void)
forward nameserver running on localhost */
cfg->val_log_level = 2; /* to fill why_bogus with */
cfg->val_log_squelch = 1;
+ cfg->minimal_responses = 0;
return cfg;
}
@@ -455,6 +464,9 @@ int config_set_option(struct config_file* cfg, const char* opt,
udp_upstream_without_downstream)
else S_NUMBER_NONZERO("tcp-mss:", tcp_mss)
else S_NUMBER_NONZERO("outgoing-tcp-mss:", outgoing_tcp_mss)
+ else S_NUMBER_NONZERO("tcp-idle-timeout:", tcp_idle_timeout)
+ else S_YNO("edns-tcp-keepalive:", do_tcp_keepalive)
+ else S_NUMBER_NONZERO("edns-tcp-keepalive-timeout:", tcp_keepalive_timeout)
else S_YNO("ssl-upstream:", ssl_upstream)
else S_STR("ssl-service-key:", ssl_service_key)
else S_STR("ssl-service-pem:", ssl_service_pem)
@@ -540,10 +552,15 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_YNO("val-log-squelch:", val_log_squelch)
else S_YNO("log-queries:", log_queries)
else S_YNO("log-replies:", log_replies)
+ else S_YNO("log-local-actions:", log_local_actions)
+ else S_YNO("log-servfail:", log_servfail)
else S_YNO("val-permissive-mode:", val_permissive_mode)
else S_YNO("aggressive-nsec:", aggressive_nsec)
else S_YNO("ignore-cd-flag:", ignore_cd)
else S_YNO("serve-expired:", serve_expired)
+ else if(strcmp(opt, "serve_expired_ttl:") == 0)
+ { IS_NUMBER_OR_ZERO; cfg->serve_expired_ttl = atoi(val); SERVE_EXPIRED_TTL=(time_t)cfg->serve_expired_ttl;}
+ else S_YNO("serve-expired-ttl-reset:", serve_expired_ttl_reset)
else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations)
else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown)
else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown)
@@ -878,6 +895,9 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "udp-upstream-without-downstream", udp_upstream_without_downstream)
else O_DEC(opt, "tcp-mss", tcp_mss)
else O_DEC(opt, "outgoing-tcp-mss", outgoing_tcp_mss)
+ else O_DEC(opt, "tcp-idle-timeout", tcp_idle_timeout)
+ else O_YNO(opt, "edns-tcp-keepalive", do_tcp_keepalive)
+ else O_DEC(opt, "edns-tcp-keepalive-timeout", tcp_keepalive_timeout)
else O_YNO(opt, "ssl-upstream", ssl_upstream)
else O_STR(opt, "ssl-service-key", ssl_service_key)
else O_STR(opt, "ssl-service-pem", ssl_service_pem)
@@ -893,6 +913,8 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_STR(opt, "logfile", logfile)
else O_YNO(opt, "log-queries", log_queries)
else O_YNO(opt, "log-replies", log_replies)
+ else O_YNO(opt, "log-local-actions", log_local_actions)
+ else O_YNO(opt, "log-servfail", log_servfail)
else O_STR(opt, "pidfile", pidfile)
else O_YNO(opt, "hide-identity", hide_identity)
else O_YNO(opt, "hide-version", hide_version)
@@ -920,6 +942,8 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "aggressive-nsec", aggressive_nsec)
else O_YNO(opt, "ignore-cd-flag", ignore_cd)
else O_YNO(opt, "serve-expired", serve_expired)
+ else O_DEC(opt, "serve-expired-ttl", serve_expired_ttl)
+ else O_YNO(opt, "serve-expired-ttl-reset", serve_expired_ttl_reset)
else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations)
else O_UNS(opt, "add-holddown", add_holddown)
else O_UNS(opt, "del-holddown", del_holddown)
@@ -936,6 +960,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_STR(opt, "control-cert-file", control_cert_file)
else O_LST(opt, "root-hints", root_hints)
else O_LS2(opt, "access-control", acls)
+ else O_LS2(opt, "tcp-connection-limit", tcp_connection_limits)
else O_LST(opt, "do-not-query-address", donotqueryaddrs)
else O_LST(opt, "private-address", private_address)
else O_LST(opt, "private-domain", private_domain)
@@ -1338,6 +1363,7 @@ config_delete(struct config_file* cfg)
free(cfg->dlv_anchor_file);
config_delstrlist(cfg->dlv_anchor_list);
config_deldblstrlist(cfg->acls);
+ config_deldblstrlist(cfg->tcp_connection_limits);
free(cfg->val_nsec3_key_iterations);
config_deldblstrlist(cfg->local_zones);
config_delstrlist(cfg->local_zones_nodefault);
@@ -1355,6 +1381,7 @@ config_delete(struct config_file* cfg)
free(cfg->control_key_file);
free(cfg->control_cert_file);
free(cfg->dns64_prefix);
+ config_delstrlist(cfg->dns64_ignore_aaaa);
free(cfg->dnstap_socket_path);
free(cfg->dnstap_identity);
free(cfg->dnstap_version);
@@ -1840,6 +1867,7 @@ config_apply(struct config_file* config)
{
MAX_TTL = (time_t)config->max_ttl;
MIN_TTL = (time_t)config->min_ttl;
+ SERVE_EXPIRED_TTL = (time_t)config->serve_expired_ttl;
MAX_NEG_TTL = (time_t)config->max_negative_ttl;
RTT_MIN_TIMEOUT = config->infra_cache_min_rtt;
EDNS_ADVERTISED_SIZE = (uint16_t)config->edns_buffer_size;
@@ -2178,7 +2206,7 @@ void w_config_adjust_directory(struct config_file* cfg)
void errinf(struct module_qstate* qstate, const char* str)
{
struct config_strlist* p;
- if(qstate->env->cfg->val_log_level < 2 || !str)
+ if((qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) || !str)
return;
p = (struct config_strlist*)regional_alloc(qstate->region, sizeof(*p));
if(!p) {
@@ -2203,7 +2231,7 @@ void errinf(struct module_qstate* qstate, const char* str)
void errinf_origin(struct module_qstate* qstate, struct sock_list *origin)
{
struct sock_list* p;
- if(qstate->env->cfg->val_log_level < 2)
+ if(qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail)
return;
for(p=origin; p; p=p->next) {
char buf[256];
@@ -2220,7 +2248,7 @@ void errinf_origin(struct module_qstate* qstate, struct sock_list *origin)
}
}
-char* errinf_to_str(struct module_qstate* qstate)
+char* errinf_to_str_bogus(struct module_qstate* qstate)
{
char buf[20480];
char* p = buf;
@@ -2245,12 +2273,37 @@ char* errinf_to_str(struct module_qstate* qstate)
return p;
}
+char* errinf_to_str_servfail(struct module_qstate* qstate)
+{
+ char buf[20480];
+ char* p = buf;
+ size_t left = sizeof(buf);
+ struct config_strlist* s;
+ char dname[LDNS_MAX_DOMAINLEN+1];
+ char t[16], c[16];
+ sldns_wire2str_type_buf(qstate->qinfo.qtype, t, sizeof(t));
+ sldns_wire2str_class_buf(qstate->qinfo.qclass, c, sizeof(c));
+ dname_str(qstate->qinfo.qname, dname);
+ snprintf(p, left, "SERVFAIL <%s %s %s>:", dname, t, c);
+ left -= strlen(p); p += strlen(p);
+ if(!qstate->errinf)
+ snprintf(p, left, " misc failure");
+ else for(s=qstate->errinf; s; s=s->next) {
+ snprintf(p, left, " %s", s->str);
+ left -= strlen(p); p += strlen(p);
+ }
+ p = strdup(buf);
+ if(!p)
+ log_err("malloc failure in errinf_to_str");
+ return p;
+}
+
void errinf_rrset(struct module_qstate* qstate, struct ub_packed_rrset_key *rr)
{
char buf[1024];
char dname[LDNS_MAX_DOMAINLEN+1];
char t[16], c[16];
- if(qstate->env->cfg->val_log_level < 2 || !rr)
+ if((qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) || !rr)
return;
sldns_wire2str_type_buf(ntohs(rr->rk.type), t, sizeof(t));
sldns_wire2str_class_buf(ntohs(rr->rk.rrset_class), c, sizeof(c));
@@ -2263,7 +2316,7 @@ void errinf_dname(struct module_qstate* qstate, const char* str, uint8_t* dname)
{
char b[1024];
char buf[LDNS_MAX_DOMAINLEN+1];
- if(qstate->env->cfg->val_log_level < 2 || !str || !dname)
+ if((qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail) || !str || !dname)
return;
dname_str(dname, buf);
snprintf(b, sizeof(b), "%s %s", str, buf);
diff --git a/util/config_file.h b/util/config_file.h
index 4206eb9a2a51..d1bce1b69be4 100644
--- a/util/config_file.h
+++ b/util/config_file.h
@@ -99,6 +99,12 @@ struct config_file {
int tcp_mss;
/** maximum segment size of tcp socket for outgoing queries */
int outgoing_tcp_mss;
+ /** tcp idle timeout, in msec */
+ int tcp_idle_timeout;
+ /** do edns tcp keepalive */
+ int do_tcp_keepalive;
+ /** tcp keepalive timeout, in msec */
+ int tcp_keepalive_timeout;
/** private key file for dnstcp-ssl service (enabled if not NULL) */
char* ssl_service_key;
@@ -214,6 +220,9 @@ struct config_file {
/** use default localhost donotqueryaddr entries */
int donotquery_localhost;
+ /** list of tcp connection limitss, linked list */
+ struct config_str2list* tcp_connection_limits;
+
/** harden against very small edns buffer sizes */
int harden_short_bufsize;
/** harden against very large query sizes */
@@ -268,6 +277,10 @@ struct config_file {
int log_queries;
/** log replies with one line per reply */
int log_replies;
+ /** log every local-zone hit **/
+ int log_local_actions;
+ /** log servfails with a reason */
+ int log_servfail;
/** log identity to report */
char* log_identity;
@@ -326,6 +339,10 @@ struct config_file {
int ignore_cd;
/** serve expired entries and prefetch them */
int serve_expired;
+ /** serve expired entries until TTL after expiration */
+ int serve_expired_ttl;
+ /** reset serve expired TTL after failed update attempt */
+ int serve_expired_ttl_reset;
/** nsec3 maximum iterations per key size, string */
char* val_nsec3_key_iterations;
/** autotrust add holddown time, in seconds */
@@ -419,6 +436,8 @@ struct config_file {
/* Synthetize all AAAA record despite the presence of an authoritative one */
int dns64_synthall;
+ /** ignore AAAAs for these domain names and use A record anyway */
+ struct config_strlist* dns64_ignore_aaaa;
/** true to enable dnstap support */
int dnstap;
@@ -561,6 +580,8 @@ struct config_stub {
int isfirst;
/** use SSL for queries to this stub */
int ssl_upstream;
+ /*** no cache */
+ int no_cache;
};
/**
@@ -1065,12 +1086,20 @@ void errinf_dname(struct module_qstate* qstate, const char* str,
uint8_t* dname);
/**
- * Create error info in string
+ * Create error info in string. For validation failures.
+ * @param qstate: query state.
+ * @return string or NULL on malloc failure (already logged).
+ * This string is malloced and has to be freed by caller.
+ */
+char* errinf_to_str_bogus(struct module_qstate* qstate);
+
+/**
+ * Create error info in string. For other servfails.
* @param qstate: query state.
* @return string or NULL on malloc failure (already logged).
* This string is malloced and has to be freed by caller.
*/
-char* errinf_to_str(struct module_qstate* qstate);
+char* errinf_to_str_servfail(struct module_qstate* qstate);
/**
* Used during options parsing
diff --git a/util/configlexer.c b/util/configlexer.c
index f6a453899977..7f388eaec38e 100644
--- a/util/configlexer.c
+++ b/util/configlexer.c
@@ -363,8 +363,8 @@ static void yynoreturn yy_fatal_error (yyconst char* msg );
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 267
-#define YY_END_OF_BUFFER 268
+#define YY_NUM_RULES 278
+#define YY_END_OF_BUFFER 279
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -372,298 +372,310 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[2632] =
+static yyconst flex_int16_t yy_accept[2750] =
{ 0,
- 1, 1, 249, 249, 253, 253, 257, 257, 261, 261,
- 1, 1, 268, 265, 1, 247, 247, 266, 2, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 266, 249, 250, 250, 251, 266, 253, 254, 254,
- 255, 266, 260, 257, 258, 258, 259, 266, 261, 262,
- 262, 263, 266, 264, 248, 2, 252, 264, 266, 265,
- 0, 1, 2, 2, 2, 2, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 249,
- 0, 253, 0, 260, 0, 257, 261, 0, 264, 0,
- 2, 2, 264, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 264, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 104, 265, 265, 265, 265, 265, 265, 265, 264, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 88, 265, 265, 265, 265,
- 265, 265, 8, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 109, 265, 264, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 264, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 48, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 193,
- 265, 14, 15, 265, 18, 17, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 103, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 179, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 3, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 264, 265, 265, 265, 265, 265, 265, 265,
- 241, 265, 265, 240, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 256, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 51, 265, 217, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 52,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 168, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 20, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 124, 265, 265, 256, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 223, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 143, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 123, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 86, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 28, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 29, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 49, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 102, 265, 265, 265, 265, 265, 101, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 50, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 144, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 39, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 208, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 43,
- 265, 44, 265, 265, 265, 265, 89, 265, 90, 265,
-
- 265, 265, 87, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 7, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 186, 265, 265, 265, 265, 126,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 40, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 160,
- 265, 159, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 16, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 53, 265, 265, 265,
- 265, 265, 265, 265, 265, 167, 265, 265, 265, 265,
- 265, 92, 91, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 154, 265,
- 265, 265, 265, 265, 265, 265, 265, 110, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 71, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 75, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 47, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 157, 158, 265, 218, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 6, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 221,
- 265, 265, 265, 242, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 37,
- 265, 265, 265, 265, 265, 265, 265, 265, 150, 265,
- 265, 265, 105, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 172, 265, 151, 265, 265, 184, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 38, 265, 265, 265, 265,
- 265, 265, 107, 96, 265, 97, 265, 265, 95, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 121, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 207,
- 265, 265, 265, 265, 265, 265, 265, 265, 152, 265,
- 265, 265, 265, 265, 155, 265, 265, 265, 183, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 85, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 45, 265, 265, 265, 22, 265,
- 265, 265, 265, 265, 19, 265, 265, 265, 265, 23,
- 32, 265, 131, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 60, 62, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 225, 265, 265, 265, 194,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 98, 265, 265, 265, 265,
- 265, 265, 265, 265, 120, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 236, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 125, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 178,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 245, 265,
- 265, 265, 265, 265, 265, 265, 265, 142, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 137,
- 265, 145, 265, 265, 265, 265, 265, 113, 265, 265,
- 265, 265, 265, 81, 265, 265, 265, 265, 170, 265,
- 265, 265, 265, 265, 185, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 199, 265, 265,
- 265, 265, 265, 265, 106, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 141, 265, 265, 265, 265, 265,
-
- 63, 64, 265, 265, 265, 265, 265, 46, 265, 265,
- 265, 265, 265, 70, 146, 265, 161, 265, 187, 156,
- 219, 265, 265, 265, 56, 265, 148, 265, 265, 265,
- 265, 265, 9, 265, 265, 265, 84, 265, 265, 265,
- 265, 212, 265, 265, 265, 169, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 140, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 127, 224, 265, 265, 265,
-
- 265, 198, 265, 265, 265, 265, 265, 265, 265, 265,
- 180, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 239, 265, 147, 265,
- 265, 265, 55, 57, 265, 265, 265, 265, 265, 265,
- 265, 83, 265, 265, 265, 265, 210, 265, 265, 265,
- 220, 265, 265, 265, 265, 265, 265, 174, 30, 24,
- 26, 265, 265, 265, 265, 265, 265, 31, 25, 27,
- 265, 265, 265, 265, 265, 265, 80, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 176, 173, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 54,
- 265, 108, 265, 265, 265, 265, 265, 265, 265, 265,
- 122, 13, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 234, 265, 237, 265, 265, 265, 265, 265, 265,
- 12, 265, 265, 21, 265, 265, 265, 216, 265, 265,
- 265, 222, 265, 58, 265, 182, 265, 175, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 136, 135, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 177, 171, 265, 265, 265,
-
- 226, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 65, 265, 265, 265, 211, 265, 265,
- 265, 265, 265, 181, 265, 265, 265, 265, 265, 265,
- 265, 265, 243, 244, 133, 59, 265, 265, 265, 93,
- 94, 265, 265, 128, 265, 130, 265, 162, 265, 265,
- 265, 134, 265, 265, 188, 265, 265, 265, 265, 265,
- 265, 265, 115, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 195, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 163,
-
- 265, 265, 209, 265, 238, 265, 265, 265, 41, 265,
- 265, 265, 265, 4, 265, 265, 114, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 191,
- 33, 34, 265, 265, 265, 265, 265, 265, 265, 227,
- 265, 265, 265, 265, 265, 265, 197, 265, 265, 166,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 68,
- 265, 42, 215, 265, 192, 265, 265, 11, 265, 265,
- 265, 265, 265, 265, 164, 72, 36, 265, 265, 265,
- 265, 265, 265, 139, 265, 265, 265, 265, 265, 117,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 196,
-
- 111, 265, 99, 100, 265, 265, 265, 74, 78, 73,
- 265, 66, 265, 265, 265, 10, 265, 265, 265, 213,
- 265, 35, 265, 265, 265, 138, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 79, 77, 265, 67, 235, 265, 265,
- 265, 153, 265, 265, 165, 265, 265, 265, 265, 265,
- 265, 129, 61, 265, 265, 265, 265, 265, 228, 265,
- 265, 265, 265, 265, 265, 265, 112, 76, 118, 119,
- 69, 265, 214, 132, 265, 265, 265, 265, 190, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
-
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 82, 265, 189, 265, 206, 232, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 5, 265, 265, 265, 233,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 116, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 149, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 229, 265, 265, 265, 265, 265, 265, 265, 265,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 246,
-
- 265, 265, 202, 265, 265, 265, 265, 265, 230, 265,
- 265, 265, 265, 265, 265, 231, 265, 265, 265, 200,
- 265, 203, 204, 265, 265, 265, 265, 265, 201, 205,
- 0
+ 1, 1, 260, 260, 264, 264, 268, 268, 272, 272,
+ 1, 1, 279, 276, 1, 258, 258, 277, 2, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 277, 260, 261, 261, 262, 277, 264, 265, 265,
+ 266, 277, 271, 268, 269, 269, 270, 277, 272, 273,
+ 273, 274, 277, 275, 259, 2, 263, 275, 277, 276,
+ 0, 1, 2, 2, 2, 2, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 260,
+ 0, 264, 0, 271, 0, 268, 272, 0, 275, 0,
+ 2, 2, 275, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 275, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 109, 276, 276, 276, 276, 276, 276, 276, 275, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 91, 276, 276,
+ 276, 276, 276, 276, 8, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 114, 276, 275,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 275, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 51, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 203, 276, 14, 15, 276, 18, 17, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 108, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 188, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 3, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 275,
+ 276, 276, 276, 276, 276, 276, 276, 251, 276, 276,
+ 250, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 267, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 54, 276, 227, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 55, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 177, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 20, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 129, 276, 276, 267,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 233, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 150, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 128, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 89, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 31, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 32, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 52, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 107, 276, 276, 276, 276, 276,
+
+ 106, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 53, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 151, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 42, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 218, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 46, 276, 47, 276,
+ 276, 276, 276, 92, 276, 93, 276, 276, 276, 276,
+ 90, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 7, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 196, 276, 276, 276, 276, 131,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 43, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 169, 276, 168, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 16, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 56, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 176, 276, 276, 276, 276, 276, 95, 276, 94, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 161, 276, 276, 276,
+ 276, 276, 276, 276, 276, 115, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 74, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 78, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 50, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 164, 165, 276, 276,
+ 228, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 6, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 231, 276, 276, 276, 252, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 40, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 157, 276, 276, 276, 110, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 181,
+ 276, 158, 276, 276, 276, 193, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 41, 276, 276, 276, 276, 276, 276, 276,
+ 112, 100, 276, 101, 276, 276, 276, 99, 276, 276,
+ 276, 276, 276, 276, 276, 276, 126, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 217, 276,
+ 276, 276, 276, 276, 276, 276, 276, 159, 276, 276,
+ 276, 276, 276, 162, 276, 167, 276, 276, 276, 192,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 88, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 48, 276, 276, 276, 25,
+ 276, 276, 276, 276, 276, 276, 276, 276, 19, 276,
+ 276, 276, 276, 26, 35, 276, 136, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 63, 65, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 235, 276, 276, 276, 204, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 102, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 125, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 246, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 130, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 187, 276, 276,
+ 276, 276, 276, 276, 276, 276, 255, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 147, 276, 276, 276,
+ 276, 276, 276, 276, 96, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 142, 276, 152, 276, 276, 276, 276, 276, 118,
+ 276, 276, 276, 276, 276, 84, 276, 276, 276, 276,
+ 179, 276, 276, 276, 276, 276, 276, 194, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 209, 276, 276, 276, 276, 276, 276, 276, 111, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 146,
+ 276, 276, 276, 276, 276, 66, 67, 276, 276, 276,
+ 276, 276, 49, 276, 276, 276, 276, 276, 73, 153,
+ 276, 170, 276, 197, 276, 163, 229, 276, 276, 276,
+
+ 59, 276, 155, 276, 276, 276, 276, 276, 9, 276,
+ 276, 276, 87, 276, 276, 276, 276, 222, 276, 276,
+ 276, 178, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 145, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 132, 276, 234, 276, 276, 276,
+ 276, 208, 276, 276, 276, 276, 276, 276, 276, 276,
+ 189, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 249, 276,
+ 154, 276, 276, 276, 276, 58, 60, 276, 276, 276,
+ 276, 276, 276, 276, 86, 276, 276, 276, 276, 220,
+ 276, 276, 276, 230, 276, 276, 276, 276, 276, 276,
+ 276, 183, 33, 27, 29, 276, 276, 276, 276, 276,
+ 276, 276, 276, 34, 28, 30, 276, 276, 276, 276,
+ 276, 276, 83, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 185, 182, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 57, 276, 276, 113,
+ 103, 276, 276, 276, 276, 276, 276, 276, 276, 127,
+ 13, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 244, 276, 247, 276, 276, 276, 276, 276, 276, 276,
+ 12, 276, 276, 21, 276, 276, 276, 226, 276, 276,
+ 276, 232, 276, 61, 276, 191, 276, 276, 184, 276,
+ 276, 276, 276, 276, 276, 22, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 141, 140, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 186, 180,
+ 276, 195, 276, 276, 236, 276, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 68, 276,
+ 276, 276, 221, 276, 276, 276, 276, 166, 276, 190,
+ 276, 276, 276, 276, 276, 276, 276, 276, 253, 254,
+ 138, 62, 276, 276, 148, 276, 276, 97, 98, 276,
+ 276, 276, 133, 276, 135, 276, 171, 276, 276, 276,
+ 139, 276, 276, 198, 276, 276, 276, 276, 276, 276,
+ 276, 120, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 205, 276, 276, 276, 23, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+
+ 172, 276, 276, 219, 276, 248, 276, 276, 276, 44,
+ 276, 276, 276, 276, 4, 276, 276, 119, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 201, 36, 37, 276, 276, 276, 276, 276,
+ 276, 276, 237, 276, 276, 276, 276, 276, 276, 207,
+ 276, 276, 276, 175, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 71, 276, 45, 225, 276, 202, 276,
+ 276, 11, 276, 276, 276, 276, 276, 276, 276, 173,
+ 75, 276, 39, 276, 276, 276, 276, 276, 276, 144,
+ 276, 276, 276, 276, 276, 122, 276, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 206, 116, 276, 276, 104,
+ 105, 276, 276, 276, 77, 81, 76, 276, 69, 276,
+ 276, 276, 10, 276, 276, 276, 223, 276, 276, 257,
+ 38, 276, 276, 276, 143, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 82, 80, 276, 70, 245, 276, 276,
+ 276, 160, 276, 276, 276, 174, 276, 276, 276, 276,
+ 276, 276, 134, 64, 276, 276, 276, 276, 276, 238,
+ 276, 276, 276, 276, 276, 276, 276, 117, 276, 79,
+ 123, 124, 72, 276, 224, 276, 137, 276, 276, 276,
+
+ 276, 200, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 149, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 85, 276, 199, 276,
+ 216, 242, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 5, 276, 276, 276, 243, 276, 276, 276,
+ 276, 276, 276, 276, 276, 24, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 121,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 156,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 239,
+
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 276, 276, 276, 256, 276, 276,
+ 212, 276, 276, 276, 276, 276, 240, 276, 276, 276,
+ 276, 276, 276, 241, 276, 276, 276, 210, 276, 213,
+ 214, 276, 276, 276, 276, 276, 211, 215, 0
} ;
static yyconst YY_CHAR yy_ec[256] =
@@ -709,15 +721,15 @@ static yyconst YY_CHAR yy_meta[67] =
1, 1, 1, 1, 1, 1
} ;
-static yyconst flex_uint16_t yy_base[2646] =
+static yyconst flex_uint16_t yy_base[2764] =
{ 0,
0, 0, 64, 67, 70, 72, 78, 84, 89, 92,
- 131, 137, 352, 307, 96, 7504, 7504, 7504, 109, 171,
+ 131, 137, 352, 307, 96, 7896, 7896, 7896, 109, 171,
85, 142, 215, 83, 117, 152, 207, 50, 110, 75,
167, 231, 112, 275, 121, 259, 323, 243, 291, 320,
- 170, 368, 289, 7504, 7504, 7504, 104, 288, 7504, 7504,
- 7504, 147, 286, 289, 7504, 7504, 7504, 305, 239, 7504,
- 7504, 7504, 160, 210, 7504, 372, 7504, 177, 382, 201,
+ 170, 368, 289, 7896, 7896, 7896, 104, 288, 7896, 7896,
+ 7896, 147, 286, 289, 7896, 7896, 7896, 305, 239, 7896,
+ 7896, 7896, 160, 210, 7896, 372, 7896, 177, 382, 201,
386, 115, 0, 390, 0, 0, 160, 162, 199, 204,
188, 169, 303, 222, 256, 248, 377, 369, 254, 226,
313, 271, 365, 382, 296, 327, 391, 392, 384, 420,
@@ -741,565 +753,591 @@ static yyconst flex_uint16_t yy_base[2646] =
873, 893, 892, 899, 903, 909, 173, 900, 920, 922,
895, 916, 930, 935, 915, 898, 926, 946, 932, 948,
953, 950, 951, 936, 947, 943, 958, 967, 973, 966,
- 982, 970, 989, 981, 998, 975, 977, 1002, 994, 1018,
- 1003, 992, 1015, 1019, 1021, 1029, 1048, 712, 1028, 1049,
-
- 1037, 1044, 1061, 1057, 1054, 1071, 1058, 1055, 1062, 1064,
- 1075, 1077, 1099, 1085, 1098, 1111, 1102, 1104, 1113, 1094,
- 1125, 1124, 1122, 1132, 1126, 1174, 1134, 1135, 1142, 1151,
- 7504, 1169, 1153, 1223, 1143, 1173, 1191, 1181, 1184, 1194,
- 1192, 1218, 1209, 1203, 1097, 1196, 1162, 1252, 1183, 1221,
- 1224, 1231, 1254, 1234, 1236, 1240, 1245, 1261, 1279, 1253,
- 1266, 1265, 1291, 1274, 1269, 1283, 1281, 1296, 1273, 1309,
- 1302, 1292, 1300, 1293, 1310, 1322, 1305, 1330, 1329, 1336,
- 1320, 1325, 1347, 1350, 1334, 1348, 1358, 1351, 1360, 1357,
- 1366, 1355, 1372, 1362, 1374, 1381, 1384, 1378, 1382, 1392,
-
- 1403, 1387, 1397, 1391, 1415, 7504, 1419, 1401, 1405, 1417,
- 1418, 1409, 7504, 1432, 1431, 1427, 1440, 1428, 1461, 1455,
- 1443, 1458, 1467, 1453, 1468, 1479, 1449, 1476, 1464, 1462,
- 1488, 1494, 1487, 1496, 1489, 1485, 1532, 1498, 1490, 1514,
- 1516, 1517, 1512, 1529, 1519, 1528, 1568, 1526, 1547, 1556,
- 1565, 1545, 1579, 1567, 1559, 1569, 1562, 1577, 1583, 1578,
- 1593, 1575, 1595, 7504, 1604, 1614, 1480, 1607, 1606, 1597,
- 1609, 1610, 1611, 1626, 1622, 1640, 1624, 1627, 1649, 1643,
- 1652, 1646, 1657, 1648, 1656, 1662, 1675, 1650, 1686, 1682,
- 1671, 1672, 1669, 1674, 1678, 1673, 1676, 1699, 1687, 1700,
-
- 1707, 1688, 1693, 1713, 1721, 1715, 1705, 1720, 1709, 1733,
- 1736, 1716, 1746, 1735, 1744, 1737, 1756, 1760, 1752, 1759,
- 1764, 1742, 1767, 1773, 1779, 1785, 1780, 1762, 1793, 1783,
- 1680, 1786, 1789, 1797, 1813, 1808, 1812, 1816, 1822, 1810,
- 1804, 1826, 1824, 1838, 1831, 1839, 1852, 1835, 1837, 1840,
- 1843, 1849, 1854, 1864, 1870, 1862, 1866, 1867, 1885, 1881,
- 1876, 1890, 1879, 1900, 1886, 1889, 1893, 1891, 1894, 1918,
- 1915, 1908, 1912, 1913, 1921, 1928, 1931, 1917, 1927, 1948,
- 1929, 1935, 1949, 1942, 1950, 1965, 1968, 1959, 1960, 1976,
- 1969, 1963, 1970, 1977, 1995, 1994, 1997, 2008, 1988, 2007,
-
- 1980, 2003, 2009, 2011, 2015, 2016, 2021, 2012, 2022, 2036,
- 2040, 2034, 2032, 2056, 2037, 2053, 7504, 2041, 2061, 2046,
- 2067, 2058, 2059, 2074, 2064, 2078, 2075, 2083, 2126, 7504,
- 2080, 7504, 7504, 2089, 7504, 7504, 2081, 2107, 2105, 2114,
- 2119, 2101, 2110, 2123, 2084, 2175, 2139, 2133, 2141, 2136,
- 2122, 2129, 2157, 2168, 2158, 2188, 2178, 2171, 2185, 2195,
- 2180, 2199, 2204, 2203, 2206, 2205, 2210, 2212, 2214, 2216,
- 2217, 2231, 2242, 2251, 7504, 2243, 2172, 2252, 2246, 2247,
- 2254, 2256, 2239, 2255, 2258, 2240, 2268, 2263, 2269, 2276,
- 2274, 7504, 2279, 2285, 2292, 2289, 2299, 2295, 2291, 2282,
-
- 2309, 2296, 2312, 2308, 2306, 2337, 7504, 2326, 2314, 2322,
- 2341, 2324, 2327, 2332, 2334, 2342, 2351, 2359, 2353, 2357,
- 2368, 2354, 2369, 2378, 2379, 2382, 2374, 2390, 2380, 2391,
- 2375, 2393, 2396, 2402, 2415, 2405, 2419, 2404, 2403, 2421,
- 2423, 2418, 2435, 2442, 2431, 2426, 2438, 2452, 2437, 2454,
- 2449, 2465, 2456, 2458, 2455, 2471, 2453, 2468, 2469, 2484,
- 7504, 2463, 2477, 7504, 2485, 2486, 2532, 2492, 2502, 2494,
- 2497, 2513, 2512, 2518, 2511, 2531, 2528, 2547, 2545, 2552,
- 2556, 2549, 2544, 2559, 2483, 2571, 2577, 1152, 2586, 2566,
- 2564, 2613, 2583, 2584, 2588, 2591, 2596, 2615, 2599, 2611,
-
- 2608, 2609, 2617, 2641, 7504, 2604, 2634, 2624, 2636, 2655,
- 2648, 2638, 2647, 2658, 2646, 2663, 2660, 2652, 2672, 2661,
- 2664, 2666, 2683, 2688, 2700, 7504, 2685, 7504, 2689, 2687,
- 2684, 2694, 2712, 2713, 2715, 2698, 2721, 2705, 2710, 7504,
- 2719, 2731, 2737, 2740, 2739, 2732, 2733, 2742, 2746, 2759,
- 2736, 2762, 2768, 2754, 2767, 2769, 2760, 2779, 2780, 2765,
- 7504, 2787, 2781, 2794, 2795, 2791, 2796, 2792, 2806, 2798,
- 2807, 2808, 2802, 2818, 2822, 2825, 2833, 7504, 2813, 2819,
- 2846, 2844, 2841, 2829, 2845, 2851, 2852, 2843, 2855, 2856,
- 2864, 2865, 2857, 2869, 2866, 2872, 2875, 1093, 2877, 2888,
-
- 2879, 2876, 7504, 2881, 2905, 61, 2896, 2894, 2899, 2912,
- 2907, 2918, 2913, 2924, 2925, 2926, 2927, 2930, 2928, 2932,
- 2936, 2934, 2945, 2940, 2950, 2951, 2948, 2952, 2953, 2975,
- 2962, 2980, 7504, 2983, 2990, 2979, 2973, 2998, 2997, 3007,
- 3000, 3010, 3013, 3011, 7504, 3004, 3014, 3024, 3028, 3031,
- 3027, 3032, 3034, 3037, 3050, 3041, 3040, 3051, 3045, 3055,
- 3063, 3068, 3061, 3064, 3076, 7504, 2993, 3072, 3079, 3074,
- 3093, 3077, 3107, 3090, 3091, 3102, 3118, 3142, 3113, 3121,
- 3127, 3132, 3136, 3122, 3139, 3157, 3163, 3167, 3153, 3166,
- 3171, 3169, 3168, 3129, 3140, 3174, 3177, 3205, 3184, 1434,
-
- 3204, 7504, 3203, 3201, 3191, 3208, 3227, 3202, 3228, 3212,
- 3211, 3218, 3230, 3232, 3242, 3253, 3247, 3254, 3244, 3241,
- 3260, 3270, 3257, 3273, 3275, 7504, 3276, 3281, 3282, 3278,
- 3271, 3294, 3290, 3289, 3293, 3296, 3292, 3302, 3306, 3309,
- 7504, 3321, 3320, 3322, 3318, 3330, 3338, 3331, 3328, 3334,
- 3337, 3347, 7504, 3336, 3355, 3351, 3371, 3359, 3350, 3361,
- 3375, 3364, 7504, 3365, 3353, 3386, 3394, 3373, 7504, 3395,
- 3387, 3377, 3381, 3391, 3392, 3408, 3396, 3390, 3411, 3420,
- 3426, 3404, 3428, 7504, 3421, 3444, 3432, 3422, 3431, 3435,
- 3446, 3458, 3449, 3455, 3470, 3471, 3468, 3462, 3457, 3474,
-
- 3482, 3476, 3480, 7504, 3472, 3493, 3503, 3501, 3497, 3498,
- 3506, 3507, 3502, 3508, 3521, 3520, 3532, 3533, 3541, 3531,
- 3542, 3553, 3547, 3550, 3534, 3552, 3485, 3570, 3571, 3574,
- 7504, 3585, 3582, 3578, 3573, 3576, 3577, 3581, 3593, 3596,
- 3598, 3602, 3597, 3603, 3631, 3632, 3608, 3617, 3618, 3620,
- 3621, 3624, 3645, 3626, 3627, 3644, 3661, 3638, 3643, 3648,
- 3655, 3664, 3659, 3666, 3675, 3682, 3671, 3660, 3687, 3686,
- 3684, 3691, 3693, 3719, 7504, 3699, 3701, 3695, 3707, 3729,
- 3727, 3730, 3733, 3736, 3724, 3731, 3741, 3746, 3739, 7504,
- 3751, 7504, 3726, 3750, 3771, 3775, 7504, 3779, 7504, 3780,
-
- 3765, 3767, 7504, 3782, 3786, 3774, 3763, 3788, 3790, 3777,
- 3804, 3778, 3796, 3807, 3820, 3811, 3800, 3824, 3809, 3831,
- 3813, 3822, 3837, 3823, 3834, 7504, 3843, 3827, 3830, 3854,
- 3849, 3840, 3876, 3870, 3858, 3859, 3871, 3882, 3864, 3881,
- 3888, 3894, 3892, 3899, 7504, 3902, 3895, 3898, 3907, 7504,
- 3872, 3923, 3926, 3904, 3910, 3915, 3929, 3934, 3921, 3938,
- 3946, 3941, 3942, 3954, 3961, 3945, 3968, 3951, 3974, 3976,
- 3962, 3969, 3965, 3980, 3985, 3989, 3991, 3995, 3992, 3988,
- 4001, 4008, 4009, 4002, 3997, 4003, 4007, 4025, 4019, 4024,
- 4018, 4022, 4033, 4029, 4034, 7504, 4040, 4045, 4049, 4056,
-
- 4044, 4048, 4050, 4060, 4064, 4070, 4061, 4081, 4080, 7504,
- 4079, 7504, 4077, 4098, 4103, 4106, 4110, 4100, 4092, 4117,
- 4108, 4105, 4112, 4133, 4107, 4120, 4128, 4126, 4135, 4132,
- 4138, 4140, 4149, 7504, 4139, 4136, 4167, 4155, 4165, 4173,
- 4169, 4177, 4172, 4166, 4185, 4207, 7504, 4192, 4213, 4191,
- 4210, 4220, 4216, 4225, 4217, 7504, 4202, 4212, 4229, 4214,
- 4242, 7504, 7504, 4219, 4236, 4249, 4246, 4244, 4247, 4233,
- 4253, 4215, 4250, 4248, 4270, 4237, 4263, 4269, 7504, 4281,
- 4271, 4285, 4294, 4295, 4296, 4293, 4280, 7504, 4277, 4305,
- 4290, 4312, 4306, 4311, 4317, 4308, 4322, 4328, 4318, 4321,
-
- 4348, 4335, 4332, 4351, 4346, 4353, 4354, 7504, 4355, 4361,
- 4363, 4359, 4364, 4362, 4349, 4372, 4377, 4382, 4374, 4376,
- 4390, 4392, 4403, 4396, 4393, 4399, 4410, 4416, 4404, 4409,
- 4419, 4422, 4432, 4415, 4438, 4427, 4444, 4429, 4436, 4448,
- 4449, 4463, 4458, 7504, 4467, 4446, 4472, 4443, 4466, 4478,
- 4480, 4477, 4497, 4459, 4492, 4487, 4493, 7504, 4502, 4501,
- 4496, 4506, 4503, 4494, 4522, 4507, 4505, 4535, 4520, 4540,
- 4528, 4529, 4549, 4552, 7504, 7504, 4554, 7504, 4555, 4538,
- 4557, 4545, 4562, 4561, 4566, 4573, 4568, 4582, 7504, 4575,
- 4576, 4579, 4578, 4588, 4609, 4608, 4605, 4602, 4593, 4595,
-
- 4604, 4615, 4606, 4601, 4622, 4635, 4619, 4629, 4643, 7504,
- 4628, 4633, 4638, 7504, 4640, 4630, 4658, 4660, 4668, 4672,
- 4662, 4677, 4661, 4667, 4686, 4687, 4688, 4684, 4691, 4689,
- 4701, 4697, 4698, 4726, 4715, 4727, 4703, 4711, 4732, 7504,
- 4719, 4733, 4724, 4716, 4740, 4725, 4745, 4743, 7504, 4749,
- 4738, 4764, 7504, 4759, 4765, 4748, 4771, 4753, 4750, 4772,
- 4774, 4775, 4776, 7504, 4782, 7504, 4780, 4792, 7504, 4799,
- 4801, 4789, 4790, 4788, 4815, 4817, 4818, 4803, 4816, 4809,
- 4810, 4828, 4830, 4838, 4834, 7504, 4852, 4833, 4849, 4854,
- 4855, 4856, 7504, 7504, 4839, 7504, 4857, 4861, 7504, 4859,
-
- 4875, 4876, 4870, 4871, 4866, 4892, 4897, 7504, 4899, 4888,
- 4909, 4898, 4890, 4900, 4901, 4917, 4894, 4903, 4935, 7504,
- 4922, 4919, 4923, 4925, 4928, 4950, 4946, 4937, 7504, 4955,
- 4959, 4945, 4962, 4958, 7504, 4970, 4964, 4969, 7504, 4981,
- 4966, 4973, 4978, 5000, 4996, 5004, 4989, 4991, 5017, 5008,
- 5006, 5012, 7504, 5005, 5016, 5014, 5036, 5027, 5025, 5022,
- 5043, 5051, 5050, 5055, 5044, 5059, 5061, 5064, 5067, 5063,
- 5047, 5081, 5075, 5085, 7504, 5086, 5091, 5094, 7504, 5088,
- 5087, 5092, 5102, 5089, 7504, 5115, 5118, 5104, 5112, 7504,
- 7504, 5116, 7504, 5132, 5123, 5125, 5126, 5139, 5133, 5147,
-
- 5141, 5136, 5154, 5159, 5157, 5176, 5166, 5174, 5169, 5171,
- 5160, 7504, 7504, 5177, 5187, 5181, 5189, 5191, 5182, 5193,
- 5200, 5205, 5212, 5217, 5228, 7504, 5220, 5206, 5221, 7504,
- 5209, 5230, 5218, 5216, 5237, 5232, 5238, 5246, 5252, 5245,
- 5258, 5240, 5251, 5269, 5271, 7504, 5257, 5261, 5259, 5265,
- 5272, 5273, 5283, 5281, 7504, 5290, 5304, 5303, 5298, 5299,
- 5301, 5318, 5312, 5315, 5308, 5307, 5326, 5339, 5336, 5332,
- 7504, 5338, 5329, 5335, 5340, 5344, 5357, 5341, 5358, 5354,
- 5361, 5369, 5373, 5363, 5364, 7504, 5375, 5374, 5367, 5389,
- 5379, 5387, 5392, 5402, 5398, 5390, 5396, 5407, 5405, 7504,
-
- 5388, 5404, 5406, 5424, 5412, 5422, 5425, 5429, 7504, 5437,
- 5423, 5435, 5432, 5431, 5459, 5438, 5461, 7504, 5454, 5467,
- 5470, 5451, 5464, 5458, 5478, 5484, 5487, 5480, 5485, 5491,
- 5473, 5488, 5499, 5500, 5504, 5511, 5503, 5526, 5525, 7504,
- 5512, 7504, 5515, 5533, 5538, 5536, 5521, 7504, 5530, 5539,
- 5549, 5535, 5558, 7504, 5542, 5559, 5556, 5562, 7504, 5576,
- 5573, 5560, 5572, 5588, 7504, 5590, 5589, 5586, 5598, 5600,
- 5596, 5583, 5603, 5602, 5594, 5593, 5621, 7504, 5605, 5623,
- 5628, 5629, 5613, 5638, 7504, 5617, 5625, 5632, 5639, 5627,
- 5652, 5656, 5661, 5644, 7504, 5659, 5653, 5668, 5669, 5674,
-
- 7504, 7504, 5664, 5680, 5679, 5666, 5686, 7504, 5693, 5673,
- 5698, 5690, 5702, 7504, 7504, 5699, 7504, 5694, 7504, 7504,
- 7504, 5713, 5717, 5715, 7504, 5716, 7504, 5703, 5726, 5707,
- 5706, 5730, 7504, 5729, 5719, 5732, 7504, 5738, 5741, 5733,
- 5737, 7504, 5761, 5744, 5749, 7504, 5765, 5769, 5768, 5772,
- 5778, 5756, 5771, 5776, 5782, 5784, 5786, 5787, 5779, 5783,
- 5788, 5816, 5807, 5804, 5802, 5821, 5822, 5811, 5818, 5812,
- 5806, 5827, 5810, 5835, 5831, 5815, 5836, 5842, 5837, 5846,
- 5864, 5857, 5859, 5862, 7504, 5852, 5849, 5858, 5869, 5876,
- 5873, 5875, 5894, 5895, 5905, 7504, 7504, 5908, 5892, 5900,
-
- 5893, 7504, 5896, 5897, 5891, 5914, 5917, 5925, 5928, 5929,
- 7504, 5931, 5938, 5948, 5932, 5933, 5942, 5939, 5944, 5952,
- 5964, 5963, 5967, 5968, 5969, 5965, 5971, 5966, 5979, 5981,
- 5994, 5995, 5997, 5988, 6002, 6003, 7504, 5998, 7504, 5996,
- 6013, 6015, 7504, 7504, 6016, 6032, 6018, 6022, 6020, 6019,
- 6044, 7504, 6024, 6046, 6052, 6040, 7504, 6049, 6054, 6055,
- 7504, 6045, 6056, 6051, 6058, 6063, 6086, 7504, 7504, 7504,
- 7504, 6087, 6067, 6078, 6079, 6084, 6083, 7504, 7504, 7504,
- 6094, 6090, 6095, 6101, 6105, 6115, 7504, 6114, 6103, 6107,
- 6118, 6137, 6138, 6136, 6135, 6126, 6128, 6152, 6149, 6147,
-
- 6142, 6153, 6159, 6161, 7504, 7504, 6155, 6163, 6177, 6173,
- 6182, 6188, 6185, 6186, 6183, 6179, 6190, 6196, 6195, 7504,
- 6199, 7504, 6203, 6206, 6209, 6218, 6215, 6223, 6219, 6228,
- 7504, 7504, 6221, 6229, 6225, 6239, 6234, 6248, 6245, 6241,
- 6243, 7504, 6250, 7504, 6254, 6259, 6278, 6269, 6271, 6277,
- 7504, 6276, 6270, 7504, 6284, 6280, 6287, 7504, 6290, 6293,
- 6295, 7504, 6299, 7504, 6300, 7504, 6296, 7504, 6304, 6307,
- 6313, 6319, 6322, 6310, 6330, 6331, 6333, 6321, 6338, 6323,
- 6339, 6344, 6342, 6343, 7504, 7504, 6361, 6349, 6355, 6357,
- 6356, 6359, 6354, 6360, 6367, 7504, 7504, 6368, 6370, 6382,
-
- 7504, 6365, 6393, 6397, 6398, 6383, 6391, 6394, 6407, 6400,
- 6405, 6410, 6421, 6425, 6430, 6432, 6420, 6434, 6423, 6418,
- 6442, 6435, 6445, 7504, 6454, 6461, 6449, 7504, 6468, 6466,
- 6474, 6470, 6471, 7504, 6459, 6479, 6481, 6478, 6469, 6515,
- 6476, 6490, 7504, 7504, 7504, 7504, 6509, 6504, 6506, 7504,
- 7504, 6494, 6500, 7504, 6510, 7504, 6502, 7504, 6525, 6527,
- 6526, 7504, 6529, 6537, 7504, 6524, 6532, 6539, 6549, 6540,
- 6544, 6543, 7504, 6574, 6567, 6568, 6577, 6561, 6557, 6575,
- 6564, 6586, 6571, 6583, 7504, 6570, 6588, 6592, 6595, 6598,
- 6610, 6609, 6601, 6593, 6613, 6619, 6600, 6629, 6615, 7504,
-
- 6631, 6632, 7504, 6622, 7504, 6633, 6636, 6642, 7504, 6650,
- 6635, 6641, 6638, 7504, 6653, 6658, 7504, 6644, 6667, 6673,
- 6676, 6669, 6663, 6670, 6674, 6682, 6687, 6685, 6691, 7504,
- 7504, 7504, 6694, 6684, 6680, 6698, 6705, 6722, 6709, 7504,
- 6715, 6718, 6707, 6729, 6721, 6728, 7504, 6730, 6724, 7504,
- 6737, 6740, 6736, 6732, 6747, 6744, 6758, 6760, 6756, 7504,
- 6762, 7504, 7504, 6750, 7504, 6753, 6771, 7504, 6776, 6764,
- 6766, 6773, 6781, 6779, 7504, 7504, 7504, 6790, 6780, 6797,
- 6787, 6801, 6799, 7504, 6792, 6796, 6805, 6803, 6814, 7504,
- 6817, 6808, 6809, 6813, 6828, 6818, 6831, 6830, 6845, 7504,
-
- 7504, 6839, 7504, 7504, 6838, 6853, 6858, 7504, 7504, 7504,
- 6863, 7504, 6864, 6869, 6866, 7504, 6871, 6856, 6865, 7504,
- 6881, 7504, 6875, 6880, 6872, 7504, 6876, 6886, 6899, 6888,
- 6904, 6890, 6907, 6911, 6924, 6915, 6891, 6910, 6908, 6928,
- 6931, 6921, 6930, 7504, 7504, 6941, 7504, 7504, 6944, 6945,
- 6946, 7504, 6950, 6949, 7504, 6953, 6939, 6952, 6960, 6947,
- 6965, 7504, 7504, 6951, 6967, 6956, 6974, 6966, 7504, 6987,
- 7000, 6971, 6994, 6986, 6988, 6991, 7504, 7504, 7504, 7504,
- 7504, 7001, 7504, 7504, 6993, 7015, 6983, 7008, 7504, 7002,
- 7012, 7031, 7035, 7026, 7039, 7011, 7028, 7027, 7032, 7044,
-
- 7046, 7050, 7051, 7056, 7067, 7057, 7059, 7079, 7080, 7062,
- 7071, 7082, 7088, 7090, 7074, 7087, 7105, 7096, 7104, 7092,
- 7504, 7098, 7504, 7103, 7504, 7504, 7116, 7123, 7119, 7109,
- 7138, 7139, 7130, 7122, 7126, 7504, 7132, 7133, 7137, 7504,
- 7136, 7153, 7142, 7154, 7157, 7159, 7168, 7171, 7164, 7174,
- 7175, 7172, 7192, 7188, 7185, 7191, 7201, 7194, 7197, 7202,
- 7208, 7504, 7210, 7203, 7204, 7217, 7220, 7215, 7224, 7219,
- 7225, 7504, 7227, 7246, 7240, 7229, 7238, 7237, 7259, 7256,
- 7249, 7504, 7242, 7270, 7272, 7273, 7277, 7275, 7283, 7284,
- 7279, 7287, 7294, 7281, 7286, 7302, 7297, 7307, 7306, 7504,
-
- 7315, 7308, 7504, 7317, 7321, 7313, 7318, 7330, 7504, 7328,
- 7319, 7341, 7346, 7350, 7344, 7504, 7356, 7361, 7355, 7504,
- 7358, 7504, 7504, 7364, 7348, 7353, 7366, 7370, 7504, 7504,
- 7504, 7412, 7419, 7426, 7433, 7440, 83, 7447, 7454, 7461,
- 7468, 7475, 7482, 7489, 7496
+ 982, 970, 989, 981, 998, 975, 977, 1002, 994, 1025,
+ 1003, 1004, 1014, 1032, 1011, 1028, 1054, 712, 1020, 1046,
+
+ 1033, 1049, 1059, 1027, 1060, 1073, 1062, 1083, 1067, 1072,
+ 1076, 1082, 1087, 1078, 1102, 1113, 1106, 1115, 1114, 1108,
+ 1129, 1103, 1133, 1131, 1152, 1200, 1137, 1141, 1139, 1153,
+ 7896, 1166, 1156, 1249, 1163, 1177, 1207, 1110, 1187, 1172,
+ 1183, 1197, 1190, 1220, 1205, 1202, 1212, 1250, 1217, 1235,
+ 1239, 1242, 1266, 1245, 1243, 1253, 1262, 1269, 1280, 1272,
+ 1278, 1298, 1310, 1284, 1286, 1290, 1300, 1316, 1308, 1315,
+ 1321, 1305, 1324, 1326, 1338, 1346, 1345, 1351, 1353, 1349,
+ 1333, 1343, 1363, 1370, 1372, 1367, 1361, 1373, 1393, 1379,
+ 1401, 1380, 1399, 1390, 1388, 1406, 1407, 1413, 1311, 1396,
+
+ 1400, 1419, 1417, 1423, 1430, 1420, 1436, 7896, 1451, 1432,
+ 1434, 1445, 1440, 1443, 7896, 1456, 1446, 1457, 1461, 1468,
+ 1470, 1480, 1472, 1481, 1495, 1482, 1488, 1499, 1496, 1500,
+ 1484, 1493, 1520, 1516, 1513, 1525, 1515, 1519, 1565, 1529,
+ 1535, 1532, 1526, 1551, 1556, 1563, 1555, 1569, 1559, 1580,
+ 1604, 1587, 1602, 1590, 1612, 1594, 1614, 1607, 1608, 1611,
+ 1542, 1601, 1628, 1616, 1629, 1630, 1638, 7896, 1642, 1650,
+ 1632, 1646, 1647, 1649, 1652, 1655, 1665, 1657, 1667, 1684,
+ 1679, 1663, 1669, 1688, 1672, 1689, 1695, 1676, 1697, 1705,
+ 1714, 1693, 1717, 1713, 1704, 1719, 1710, 1721, 1734, 1743,
+
+ 1718, 1744, 1737, 1732, 1741, 1752, 1731, 1746, 1758, 1748,
+ 1759, 1766, 1767, 1760, 1761, 1778, 1777, 1794, 1782, 1795,
+ 1785, 1793, 1808, 1787, 1804, 1820, 1807, 1814, 1822, 1827,
+ 1833, 1834, 1829, 1824, 1825, 1850, 1837, 1858, 1853, 1851,
+ 1856, 1875, 1865, 1870, 1876, 1869, 1863, 1872, 1892, 1883,
+ 1896, 1890, 1899, 1912, 1898, 1901, 1902, 1910, 1897, 1900,
+ 1913, 1929, 1935, 1930, 1928, 1951, 1943, 1925, 1952, 1934,
+ 1956, 1945, 1946, 1948, 1949, 1962, 1961, 1975, 1971, 1972,
+ 1976, 1977, 1985, 1990, 1940, 1992, 1988, 1989, 1991, 2003,
+ 2002, 2004, 2018, 2019, 2012, 2024, 2037, 2021, 2017, 2045,
+
+ 2027, 2039, 2029, 2052, 2055, 2054, 2057, 2066, 2056, 2068,
+ 2064, 2076, 2069, 2080, 2089, 2096, 2093, 2095, 2101, 2091,
+ 2098, 2087, 2104, 2129, 2113, 2118, 7896, 2115, 2116, 2121,
+ 2128, 2135, 2126, 2151, 2142, 2145, 2131, 2139, 2140, 2187,
+ 7896, 2148, 7896, 7896, 2153, 7896, 7896, 2174, 2167, 2168,
+ 2177, 2185, 2188, 2191, 2193, 2178, 2190, 2236, 2217, 2203,
+ 2214, 2220, 2239, 2231, 2246, 2234, 2241, 2249, 2247, 2257,
+ 2266, 2276, 2273, 2267, 2284, 2269, 2272, 2282, 2294, 2277,
+ 2283, 2300, 2296, 2308, 2280, 2321, 2306, 2330, 7896, 2327,
+ 2313, 2336, 2331, 2333, 2329, 2335, 2324, 2340, 2348, 2319,
+
+ 2344, 2341, 2365, 2354, 2357, 7896, 2369, 2370, 2375, 2374,
+ 2382, 2381, 2377, 2362, 2389, 2384, 2396, 2410, 2371, 2417,
+ 7896, 2422, 2394, 2404, 2427, 2408, 2413, 2414, 2416, 2430,
+ 2436, 2435, 2440, 2449, 2453, 2455, 2457, 2451, 2459, 2465,
+ 2460, 2476, 2475, 2463, 2479, 2484, 2485, 2467, 2487, 2498,
+ 2495, 2518, 2497, 2523, 2515, 2501, 2521, 2494, 2508, 2526,
+ 2528, 2534, 2512, 2525, 2545, 2531, 2543, 2544, 2554, 2549,
+ 2548, 2565, 2566, 2552, 2553, 2572, 2564, 7896, 2558, 2570,
+ 7896, 2568, 2581, 2627, 2586, 2594, 2591, 2592, 2608, 2607,
+ 2610, 2615, 2614, 2631, 2626, 2619, 2637, 2651, 2655, 2647,
+
+ 2641, 2657, 2663, 2650, 2677, 2673, 993, 2681, 2667, 2674,
+ 2719, 2668, 2694, 2683, 2679, 2684, 2704, 2695, 2688, 2713,
+ 2715, 2714, 2724, 7896, 2710, 2740, 2729, 2722, 2749, 2752,
+ 2731, 2744, 2754, 2758, 2769, 2759, 2764, 2773, 2762, 2779,
+ 2767, 2776, 2789, 2790, 2786, 2802, 7896, 2791, 7896, 2794,
+ 2785, 2805, 2809, 2806, 2817, 2825, 2818, 2836, 2833, 2826,
+ 7896, 2831, 2846, 2855, 2840, 2828, 2841, 2844, 2852, 2857,
+ 2853, 2858, 2880, 2873, 2860, 2885, 2886, 2877, 2889, 2892,
+ 2883, 7896, 2896, 2882, 2900, 2901, 2911, 2905, 2908, 2912,
+ 2913, 2917, 2910, 2940, 2921, 2950, 2951, 2942, 2944, 2954,
+
+ 2955, 7896, 2938, 2946, 2957, 2960, 2953, 2961, 2965, 2969,
+ 2964, 2967, 2978, 3002, 3003, 2986, 2995, 3004, 2988, 2994,
+ 2997, 1124, 2992, 3005, 2999, 2998, 7896, 3019, 3016, 61,
+ 3006, 3024, 3028, 3037, 3035, 3048, 3029, 3057, 3058, 3054,
+ 3061, 3055, 3056, 3064, 3067, 3053, 3073, 3082, 3081, 3074,
+ 3077, 3084, 3085, 3087, 3100, 3090, 3126, 7896, 3120, 3117,
+ 3125, 3114, 3133, 3116, 3129, 3119, 3135, 3152, 3139, 3149,
+ 7896, 3164, 3165, 3151, 3169, 3176, 3166, 3158, 3167, 3185,
+ 3178, 3172, 3179, 3196, 3191, 3194, 3193, 3213, 3201, 3202,
+ 3205, 3217, 7896, 3112, 3220, 3228, 3221, 3240, 3212, 3259,
+
+ 3231, 3242, 3244, 3261, 3285, 3247, 3255, 3238, 3269, 3268,
+ 3283, 3280, 3274, 3297, 3310, 3312, 3300, 3289, 3306, 3317,
+ 3314, 3316, 3319, 3323, 3321, 3341, 3364, 3358, 1768, 3336,
+ 7896, 3348, 3339, 3338, 3360, 3362, 3349, 3365, 3363, 3379,
+ 3374, 3375, 3387, 3385, 3398, 3396, 3404, 3390, 3391, 3414,
+ 3424, 3412, 3428, 3430, 7896, 3426, 3431, 3415, 3433, 3418,
+ 3444, 3446, 3443, 3441, 3445, 3449, 3457, 3461, 3458, 3474,
+ 3460, 3465, 7896, 3480, 3476, 3485, 3487, 3492, 3493, 3499,
+ 3484, 3503, 3506, 3505, 7896, 3455, 3504, 3510, 3521, 3514,
+ 3516, 3517, 3534, 3519, 7896, 3527, 3526, 3543, 3556, 3546,
+
+ 7896, 3561, 3544, 3540, 3545, 3551, 3541, 3562, 3555, 3568,
+ 3576, 3572, 3569, 3574, 3595, 7896, 3579, 3610, 3589, 3599,
+ 3601, 3603, 3596, 3614, 3634, 3616, 3619, 3585, 3627, 3636,
+ 3621, 3623, 3635, 3646, 3637, 3652, 3645, 7896, 3654, 3659,
+ 3669, 3667, 3672, 3656, 3586, 3673, 3674, 3689, 3691, 3692,
+ 3686, 3682, 3681, 3716, 3704, 3701, 3723, 3696, 3719, 3708,
+ 3731, 3732, 3744, 3739, 3741, 7896, 3726, 3743, 3745, 3737,
+ 3746, 3750, 3768, 3756, 3758, 3753, 3771, 3772, 3770, 3796,
+ 3806, 3773, 3803, 3788, 3790, 3785, 3791, 3799, 3811, 3784,
+ 3798, 3795, 3821, 3813, 3816, 3820, 3823, 3825, 3818, 3828,
+
+ 3838, 3856, 3855, 3848, 3861, 3859, 3863, 3865, 3868, 3866,
+ 3894, 7896, 3876, 3874, 3882, 3883, 3870, 3893, 3906, 3903,
+ 3908, 3895, 3901, 3897, 3923, 3914, 7896, 3918, 7896, 3910,
+ 3927, 3942, 3952, 7896, 3948, 7896, 3946, 3951, 3937, 3939,
+ 7896, 3954, 3940, 3947, 3961, 3950, 3964, 3963, 3970, 3975,
+ 3979, 3974, 3995, 3986, 3998, 3989, 4005, 4006, 3987, 4008,
+ 3997, 4017, 4011, 4020, 4013, 7896, 4029, 4023, 4034, 4032,
+ 4035, 4033, 4042, 4059, 4045, 4047, 4044, 4068, 4057, 4061,
+ 4076, 4062, 4078, 4087, 7896, 4069, 4093, 4080, 4091, 7896,
+ 4096, 4082, 4110, 4112, 4088, 4103, 4104, 4114, 4115, 4120,
+
+ 4107, 4146, 4140, 4131, 4141, 4148, 4130, 4142, 4156, 4157,
+ 4159, 4165, 4169, 4158, 4143, 4175, 4170, 4178, 4183, 4200,
+ 4198, 4204, 4184, 4201, 4209, 4208, 4196, 4192, 4195, 4202,
+ 4210, 4220, 4225, 4223, 4226, 4228, 4230, 4233, 7896, 4245,
+ 4229, 4253, 4260, 4247, 4250, 4239, 4251, 4259, 4252, 4275,
+ 4288, 4276, 7896, 4278, 7896, 4274, 4280, 4284, 4304, 4294,
+ 4305, 4312, 4301, 4303, 4311, 4302, 4325, 4317, 4328, 4333,
+ 4351, 4323, 4327, 4335, 4338, 4339, 4341, 4346, 7896, 4345,
+ 4359, 4375, 4355, 4372, 4374, 4390, 4380, 4369, 4367, 4382,
+ 4395, 7896, 4396, 4398, 4393, 4412, 4418, 4416, 4429, 4420,
+
+ 7896, 4408, 4417, 4434, 4423, 4437, 7896, 4422, 7896, 4414,
+ 4432, 4444, 4445, 4449, 4453, 4455, 4456, 4447, 4464, 4448,
+ 4467, 4465, 4473, 4492, 4472, 4480, 7896, 4490, 4481, 4499,
+ 4497, 4500, 4504, 4507, 4483, 7896, 4508, 4514, 4518, 4526,
+ 4520, 4521, 4528, 4533, 4532, 4534, 4530, 4531, 4525, 4550,
+ 4536, 4564, 4556, 4565, 4572, 7896, 4569, 4566, 4584, 4580,
+ 4573, 4586, 4579, 4567, 4576, 4590, 4592, 4599, 4596, 4606,
+ 4601, 4615, 4612, 4602, 4609, 4627, 4635, 4617, 4631, 4625,
+ 4626, 4653, 4639, 4656, 4657, 4643, 4659, 4668, 4651, 4654,
+ 4660, 4667, 4679, 4661, 7896, 4681, 4674, 4684, 4678, 4682,
+
+ 4689, 4696, 4698, 4701, 4680, 4690, 4709, 4702, 7896, 4726,
+ 4704, 4730, 4723, 4724, 4738, 4735, 4728, 4725, 4743, 4737,
+ 4753, 4740, 4747, 4755, 4758, 4752, 7896, 7896, 4768, 4767,
+ 7896, 4775, 4765, 4777, 4773, 4771, 4780, 4782, 4790, 4793,
+ 4785, 7896, 4805, 4798, 4794, 4799, 4802, 4827, 4823, 4825,
+ 4815, 4811, 4817, 4822, 4837, 4821, 4829, 4842, 4832, 4833,
+ 4847, 4861, 7896, 4848, 4852, 4857, 7896, 4858, 4869, 4870,
+ 4874, 4878, 4882, 4891, 4887, 4885, 4897, 4888, 4896, 4899,
+ 4895, 4910, 4912, 4894, 4926, 4924, 4920, 4930, 4932, 4940,
+ 4946, 4947, 4922, 4933, 4955, 7896, 4944, 4957, 4950, 4939,
+
+ 4970, 4954, 4973, 4966, 7896, 4967, 4968, 4975, 7896, 4982,
+ 4989, 4969, 4986, 4972, 5003, 4995, 4999, 5002, 5006, 7896,
+ 5005, 7896, 5017, 5009, 5022, 7896, 5012, 5013, 5029, 5011,
+ 5018, 5036, 5038, 5046, 5033, 5048, 5037, 5039, 5063, 5054,
+ 5074, 5062, 7896, 5071, 5060, 5068, 5087, 5070, 5080, 5089,
+ 7896, 7896, 5091, 7896, 5090, 5084, 5096, 7896, 5094, 5099,
+ 5101, 5105, 5107, 5123, 5124, 5129, 7896, 5126, 5111, 5140,
+ 5121, 5134, 5132, 5135, 5142, 5119, 5148, 5159, 7896, 5146,
+ 5158, 5176, 5161, 5157, 5180, 5182, 5169, 7896, 5186, 5192,
+ 5181, 5190, 5193, 7896, 5202, 7896, 5203, 5213, 5221, 7896,
+
+ 5201, 5224, 5205, 5228, 5232, 5230, 5236, 5219, 5227, 5248,
+ 5239, 5240, 5257, 7896, 5250, 5256, 5245, 5272, 5261, 5258,
+ 5254, 5274, 5280, 5286, 5287, 5277, 5290, 5292, 5299, 5303,
+ 5296, 5301, 5332, 5324, 5319, 7896, 5325, 5329, 5335, 7896,
+ 5323, 5318, 5341, 5326, 5330, 5327, 5352, 5354, 7896, 5360,
+ 5361, 5350, 5371, 7896, 7896, 5378, 7896, 5368, 5362, 5365,
+ 5377, 5381, 5383, 5382, 5386, 5387, 5411, 5389, 5407, 5427,
+ 5424, 5428, 5422, 5418, 5410, 7896, 7896, 5431, 5435, 5432,
+ 5439, 5442, 5444, 5446, 5433, 5460, 5447, 5440, 5467, 5449,
+ 7896, 5474, 5459, 5476, 7896, 5457, 5484, 5458, 5475, 5488,
+
+ 5477, 5494, 5496, 5508, 5498, 5492, 5500, 5502, 5509, 5525,
+ 5518, 7896, 5523, 5515, 5519, 5520, 5524, 5535, 5539, 5532,
+ 5542, 7896, 5541, 5549, 5561, 5559, 5553, 5565, 5573, 5577,
+ 5579, 5569, 5576, 5581, 5586, 5585, 5588, 7896, 5592, 5587,
+ 5590, 5606, 5602, 5621, 5604, 5626, 5609, 5628, 5615, 5632,
+ 5635, 5624, 5620, 7896, 5636, 5640, 5625, 5643, 5631, 5650,
+ 5657, 5645, 5664, 5655, 5654, 5659, 5675, 7896, 5665, 5666,
+ 5679, 5676, 5690, 5681, 5682, 5683, 7896, 5695, 5684, 5692,
+ 5701, 5687, 5717, 5711, 5721, 5709, 7896, 5722, 5725, 5727,
+ 5708, 5724, 5741, 5738, 7896, 5748, 5750, 5731, 5505, 5742,
+
+ 5744, 5761, 5747, 5754, 5769, 5770, 5774, 5775, 5771, 5781,
+ 5782, 7896, 5780, 7896, 5794, 5790, 5792, 5813, 5804, 7896,
+ 5807, 5809, 5815, 5801, 5811, 7896, 5817, 5819, 5818, 5827,
+ 7896, 5834, 5843, 5838, 5845, 5832, 5854, 7896, 5863, 5864,
+ 5866, 5873, 5874, 5876, 5865, 5877, 5868, 5869, 5870, 5885,
+ 7896, 5884, 5896, 5887, 5897, 5900, 5898, 5904, 7896, 5912,
+ 5901, 5910, 5905, 5916, 5913, 5929, 5927, 5932, 5923, 7896,
+ 5926, 5944, 5956, 5947, 5950, 7896, 7896, 5948, 5957, 5960,
+ 5940, 5969, 7896, 5968, 5978, 5974, 5964, 5971, 7896, 7896,
+ 5981, 7896, 5976, 7896, 5988, 7896, 7896, 5987, 5995, 6004,
+
+ 7896, 6006, 7896, 5983, 6008, 5996, 5989, 6013, 7896, 5998,
+ 6014, 6020, 7896, 6015, 6033, 6016, 6022, 7896, 6030, 6027,
+ 6032, 7896, 6047, 6052, 6051, 6053, 6060, 6041, 6049, 6045,
+ 6061, 6067, 6069, 6070, 6071, 6072, 6068, 6080, 6090, 6088,
+ 6089, 6082, 6087, 6104, 6105, 6106, 6098, 6112, 6108, 6114,
+ 6116, 6118, 6122, 6115, 6126, 6130, 6127, 6131, 6142, 6135,
+ 6151, 6144, 6149, 7896, 6148, 6146, 6147, 6169, 6167, 6175,
+ 6179, 6185, 6188, 6189, 7896, 6191, 7896, 6197, 6182, 6193,
+ 6186, 7896, 6183, 6196, 6199, 6202, 6219, 6213, 6216, 6235,
+ 7896, 6237, 6217, 6229, 6242, 6245, 6232, 6240, 6244, 6253,
+
+ 6252, 6255, 6259, 6257, 6247, 6254, 6117, 6265, 6272, 6269,
+ 6284, 6271, 6274, 6285, 6302, 6293, 6303, 6306, 7896, 6300,
+ 7896, 6298, 6309, 6315, 6318, 7896, 7896, 6320, 6321, 6322,
+ 6311, 6323, 6339, 6348, 7896, 6329, 6350, 6343, 6345, 7896,
+ 6349, 6353, 6357, 7896, 6347, 6360, 6363, 6361, 6378, 6377,
+ 6365, 7896, 7896, 7896, 7896, 6390, 6371, 6381, 6384, 6386,
+ 6392, 6399, 6387, 7896, 7896, 7896, 6398, 6409, 6407, 6419,
+ 6413, 6425, 7896, 6416, 6410, 6430, 6426, 6438, 6444, 6440,
+ 6443, 6437, 6445, 6450, 6446, 6460, 6454, 6471, 6456, 6466,
+ 7896, 7896, 6467, 6479, 6481, 6491, 6487, 6490, 6494, 6493,
+
+ 6496, 6500, 6489, 6502, 6507, 6503, 7896, 6508, 6522, 7896,
+ 7896, 6521, 6527, 6520, 6528, 6524, 6534, 6544, 6537, 7896,
+ 7896, 6531, 6536, 6547, 6557, 6548, 6553, 6554, 6576, 6559,
+ 7896, 6564, 7896, 6565, 6583, 6582, 6593, 6590, 6589, 6594,
+ 7896, 6586, 6588, 7896, 6596, 6584, 6592, 7896, 6603, 6602,
+ 6608, 7896, 6618, 7896, 6632, 7896, 6613, 6641, 7896, 6617,
+ 6638, 6642, 6643, 6644, 6635, 7896, 6628, 6649, 6650, 6652,
+ 6657, 6653, 6636, 6668, 6661, 6658, 6663, 7896, 7896, 6691,
+ 6660, 6669, 6673, 6686, 6702, 6676, 6694, 6704, 7896, 7896,
+ 6700, 7896, 6699, 6703, 7896, 6687, 6708, 6719, 6717, 6697,
+
+ 6720, 6727, 6723, 6724, 6744, 6753, 6738, 6754, 6758, 6760,
+ 6765, 6729, 6764, 6756, 6747, 6768, 6770, 6774, 7896, 6762,
+ 6772, 6780, 7896, 6778, 6799, 6808, 6804, 7896, 6801, 7896,
+ 6793, 6812, 6814, 6807, 6800, 6819, 6817, 6813, 7896, 7896,
+ 7896, 7896, 6823, 6829, 7896, 6839, 6840, 7896, 7896, 6826,
+ 6845, 6835, 7896, 6846, 7896, 6838, 7896, 6856, 6862, 6860,
+ 7896, 6865, 6867, 7896, 6864, 6876, 6877, 6875, 6873, 6880,
+ 6896, 7896, 6885, 6900, 6903, 6906, 6891, 6889, 6912, 6895,
+ 6919, 6904, 6915, 7896, 6922, 6923, 6925, 7896, 6921, 6930,
+ 6934, 6949, 6942, 6939, 6935, 6950, 6959, 6957, 6960, 6944,
+
+ 7896, 6967, 6973, 7896, 6968, 7896, 6975, 6972, 6974, 7896,
+ 6992, 6976, 6970, 6985, 7896, 6997, 6991, 7896, 7002, 6986,
+ 7009, 7011, 6994, 7026, 7013, 7010, 7020, 7015, 7023, 7017,
+ 7025, 7032, 7896, 7896, 7896, 7034, 7031, 7053, 7056, 7059,
+ 7068, 7047, 7896, 7064, 7066, 7048, 7073, 7070, 7076, 7896,
+ 7077, 7063, 7072, 7896, 7079, 7084, 7080, 7091, 7096, 7102,
+ 7110, 7113, 7111, 7896, 7117, 7896, 7896, 7100, 7896, 7098,
+ 7121, 7896, 7124, 7112, 7114, 7127, 7130, 7123, 7128, 7896,
+ 7896, 7131, 7896, 7135, 7138, 7150, 7148, 7159, 7161, 7896,
+ 7144, 7147, 7163, 7158, 7172, 7896, 7165, 7157, 7160, 7162,
+
+ 7183, 7186, 7194, 7177, 7191, 7896, 7896, 7188, 7193, 7896,
+ 7896, 7214, 7216, 7213, 7896, 7896, 7896, 7219, 7896, 7222,
+ 7228, 7220, 7896, 7230, 7218, 7223, 7896, 7226, 7232, 7896,
+ 7896, 7227, 7238, 7233, 7896, 7244, 7243, 7255, 7266, 7267,
+ 7253, 7269, 7264, 7277, 7283, 7259, 7270, 7260, 7287, 7293,
+ 7280, 7288, 7297, 7896, 7896, 7290, 7896, 7896, 7305, 7306,
+ 7309, 7896, 7304, 7316, 7301, 7896, 7318, 7307, 7311, 7326,
+ 7315, 7335, 7896, 7896, 7319, 7336, 7325, 7340, 7329, 7896,
+ 7352, 7349, 7344, 7354, 7342, 7357, 7356, 7896, 7350, 7896,
+ 7896, 7896, 7896, 7367, 7896, 7360, 7896, 7366, 7369, 7371,
+
+ 7376, 7896, 7378, 7384, 7399, 7405, 7393, 7409, 7400, 7387,
+ 7394, 7403, 7398, 7414, 7417, 7422, 7896, 7431, 7424, 7434,
+ 7447, 7451, 7448, 7453, 7435, 7437, 7456, 7450, 7458, 7441,
+ 7461, 7465, 7473, 7469, 7467, 7472, 7896, 7480, 7896, 7479,
+ 7896, 7896, 7471, 7500, 7494, 7485, 7478, 7513, 7496, 7498,
+ 7490, 7515, 7896, 7499, 7506, 7526, 7896, 7512, 7529, 7516,
+ 7528, 7531, 7533, 7540, 7543, 7896, 7536, 7546, 7549, 7559,
+ 7555, 7550, 7561, 7569, 7575, 7568, 7588, 7579, 7585, 7896,
+ 7586, 7570, 7591, 7581, 7601, 7599, 7602, 7592, 7603, 7896,
+ 7609, 7625, 7617, 7614, 7616, 7611, 7638, 7618, 7627, 7896,
+
+ 7629, 7641, 7644, 7645, 7652, 7654, 7650, 7651, 7658, 7669,
+ 7673, 7676, 7680, 7681, 7664, 7684, 7679, 7896, 7692, 7685,
+ 7896, 7690, 7694, 7686, 7701, 7708, 7896, 7718, 7710, 7711,
+ 7722, 7724, 7726, 7896, 7727, 7734, 7732, 7896, 7735, 7896,
+ 7896, 7736, 7725, 7745, 7742, 7743, 7896, 7896, 7896, 7804,
+ 7811, 7818, 7825, 7832, 83, 7839, 7846, 7853, 7860, 7867,
+ 7874, 7881, 7888
} ;
-static yyconst flex_int16_t yy_def[2646] =
+static yyconst flex_int16_t yy_def[2764] =
{ 0,
- 2631, 1, 2632, 2632, 2633, 2633, 2634, 2634, 2635, 2635,
- 2636, 2636, 2631, 2637, 2631, 2631, 2631, 2631, 2638, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2639, 2631, 2631, 2631, 2639, 2640, 2631, 2631,
- 2631, 2640, 2641, 2631, 2631, 2631, 2631, 2641, 2642, 2631,
- 2631, 2631, 2642, 2643, 2631, 2644, 2631, 2643, 2643, 2637,
- 2637, 2631, 2645, 2638, 2645, 2638, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2639,
- 2639, 2640, 2640, 2641, 2641, 2631, 2642, 2642, 2643, 2643,
- 2644, 2644, 2643, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2643, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2643, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2643, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2643, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2643, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2631, 2637, 2637, 2643, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2631, 2637, 2631, 2637,
-
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2631, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2631, 2637, 2631, 2637, 2637, 2631, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2631,
- 2631, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
-
- 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2631, 2631, 2637, 2631, 2637, 2631, 2631,
- 2631, 2637, 2637, 2637, 2631, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637,
-
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2631, 2637,
- 2637, 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2631,
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2631, 2637, 2631, 2637, 2631, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2637, 2637, 2637,
-
- 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2631, 2631, 2631, 2637, 2637, 2637, 2631,
- 2631, 2637, 2637, 2631, 2637, 2631, 2637, 2631, 2637, 2637,
- 2637, 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2637, 2637, 2631, 2637, 2631, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2631, 2631, 2637, 2631, 2637, 2637, 2631, 2637, 2637,
- 2637, 2637, 2637, 2637, 2631, 2631, 2631, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2631, 2631, 2631,
- 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2631, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2631, 2631, 2637, 2631, 2631, 2637, 2637,
- 2637, 2631, 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2631, 2631, 2631, 2631,
- 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
-
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2631, 2637, 2631, 2637, 2631, 2631, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2631,
-
- 2637, 2637, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2637,
- 2637, 2637, 2637, 2637, 2637, 2631, 2637, 2637, 2637, 2631,
- 2637, 2631, 2631, 2637, 2637, 2637, 2637, 2637, 2631, 2631,
- 0, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631
+ 2749, 1, 2750, 2750, 2751, 2751, 2752, 2752, 2753, 2753,
+ 2754, 2754, 2749, 2755, 2749, 2749, 2749, 2749, 2756, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2757, 2749, 2749, 2749, 2757, 2758, 2749, 2749,
+ 2749, 2758, 2759, 2749, 2749, 2749, 2749, 2759, 2760, 2749,
+ 2749, 2749, 2760, 2761, 2749, 2762, 2749, 2761, 2761, 2755,
+ 2755, 2749, 2763, 2756, 2763, 2756, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2757,
+ 2757, 2758, 2758, 2759, 2759, 2749, 2760, 2760, 2761, 2761,
+ 2762, 2762, 2761, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2761, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2761, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2761,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2761, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2749, 2749, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2761,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2761,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2749, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2749,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2749, 2749, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2749,
+ 2755, 2749, 2755, 2749, 2755, 2749, 2749, 2755, 2755, 2755,
+
+ 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2749, 2749, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2749, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2749, 2755, 2749, 2755, 2749, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749,
+ 2755, 2749, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2749, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2749,
+ 2749, 2749, 2755, 2755, 2749, 2755, 2755, 2749, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2749, 2755, 2749, 2755, 2755, 2755,
+ 2749, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+
+ 2749, 2755, 2755, 2749, 2755, 2749, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2749, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2749, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2749, 2749, 2755, 2749, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2749, 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+
+ 2755, 2755, 2755, 2755, 2755, 2749, 2749, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2749, 2749, 2749, 2755, 2749, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2749, 2755, 2749, 2749, 2755, 2755,
+ 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2749, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749,
+ 2749, 2749, 2749, 2755, 2749, 2755, 2749, 2755, 2755, 2755,
+
+ 2755, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2749, 2755,
+ 2749, 2749, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749,
+
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2755, 2755, 2755,
+ 2755, 2755, 2755, 2749, 2755, 2755, 2755, 2749, 2755, 2749,
+ 2749, 2755, 2755, 2755, 2755, 2755, 2749, 2749, 0, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749
} ;
-static yyconst flex_uint16_t yy_nxt[7571] =
+static yyconst flex_uint16_t yy_nxt[7963] =
{ 0,
14, 15, 16, 17, 18, 19, 18, 14, 14, 14,
14, 14, 18, 20, 21, 22, 23, 24, 25, 14,
@@ -1339,52 +1377,52 @@ static yyconst flex_uint16_t yy_nxt[7571] =
171, 134, 135, 114, 173, 145, 177, 143, 141, 115,
71, 161, 116, 136, 132, 71, 198, 137, 172, 117,
123, 138, 71, 124, 133, 160, 71, 256, 134, 135,
- 125, 2631, 71, 177, 126, 127, 71, 178, 161, 71,
- 136, 2631, 71, 198, 137, 172, 71, 123, 138, 70,
+ 125, 2749, 71, 177, 126, 127, 71, 178, 161, 71,
+ 136, 2749, 71, 198, 137, 172, 71, 123, 138, 70,
124, 70, 70, 75, 70, 75, 75, 125, 75, 71,
70, 126, 127, 149, 178, 149, 149, 70, 149, 70,
70, 75, 70, 75, 75, 165, 75, 174, 70, 167,
- 168, 166, 75, 2631, 71, 175, 176, 179, 71, 180,
- 181, 152, 2631, 2631, 2631, 186, 71, 188, 2631, 197,
- 2631, 71, 165, 71, 174, 71, 167, 168, 166, 76,
+ 168, 166, 75, 2749, 71, 175, 176, 179, 71, 180,
+ 181, 152, 2749, 2749, 2749, 186, 71, 188, 2749, 197,
+ 2749, 71, 165, 71, 174, 71, 167, 168, 166, 76,
71, 71, 175, 176, 179, 182, 180, 181, 183, 187,
194, 189, 71, 196, 188, 195, 197, 71, 71, 191,
- 199, 184, 185, 192, 200, 2631, 71, 201, 2631, 71,
- 2631, 190, 182, 71, 71, 183, 187, 194, 189, 193,
+ 199, 184, 185, 192, 200, 2749, 71, 201, 2749, 71,
+ 2749, 190, 182, 71, 71, 183, 187, 194, 189, 193,
196, 71, 195, 71, 71, 202, 191, 199, 184, 185,
192, 200, 71, 203, 201, 204, 205, 206, 190, 209,
- 208, 207, 71, 210, 214, 71, 193, 71, 2631, 215,
+ 208, 207, 71, 210, 214, 71, 193, 71, 2749, 215,
- 71, 2631, 202, 222, 331, 2631, 71, 71, 71, 71,
+ 71, 2749, 202, 222, 331, 2749, 71, 71, 71, 71,
203, 219, 204, 205, 206, 71, 209, 208, 207, 211,
210, 214, 221, 223, 216, 71, 215, 224, 212, 71,
222, 71, 225, 226, 213, 217, 71, 71, 219, 218,
- 2631, 71, 71, 71, 229, 228, 211, 227, 71, 221,
+ 2749, 71, 71, 71, 229, 228, 211, 227, 71, 221,
223, 216, 231, 71, 224, 212, 71, 236, 232, 225,
226, 213, 217, 233, 234, 230, 218, 71, 239, 71,
- 71, 229, 228, 71, 227, 235, 2631, 2631, 71, 231,
- 71, 2631, 240, 2631, 236, 232, 2631, 237, 2631, 2631,
+ 71, 229, 228, 71, 227, 235, 2749, 2749, 71, 231,
+ 71, 2749, 240, 2749, 236, 232, 2749, 237, 2749, 2749,
233, 234, 230, 144, 238, 144, 144, 71, 144, 245,
71, 149, 235, 149, 149, 75, 149, 75, 75, 240,
75, 150, 242, 241, 237, 71, 71, 246, 243, 247,
- 248, 238, 71, 2631, 71, 244, 245, 71, 249, 252,
+ 248, 238, 71, 2749, 71, 244, 245, 71, 249, 252,
251, 250, 71, 255, 288, 253, 71, 71, 71, 242,
241, 254, 292, 152, 246, 243, 247, 248, 71, 257,
71, 267, 244, 258, 268, 249, 265, 251, 250, 71,
255, 71, 253, 71, 266, 272, 71, 270, 254, 269,
- 259, 2631, 71, 71, 71, 2631, 71, 71, 267, 273,
- 258, 268, 71, 265, 71, 278, 316, 2631, 71, 274,
- 2631, 266, 272, 275, 71, 271, 269, 259, 260, 71,
+ 259, 2749, 71, 71, 71, 2749, 71, 71, 267, 273,
+ 258, 268, 71, 265, 71, 278, 316, 2749, 71, 274,
+ 2749, 266, 272, 275, 71, 271, 269, 259, 260, 71,
289, 71, 71, 261, 276, 71, 273, 277, 262, 71,
279, 280, 278, 316, 263, 264, 274, 290, 285, 71,
- 275, 71, 271, 2631, 406, 260, 71, 289, 291, 294,
+ 275, 71, 271, 2749, 408, 260, 71, 289, 291, 294,
261, 276, 71, 71, 277, 262, 286, 279, 280, 281,
71, 263, 264, 71, 282, 285, 287, 293, 298, 71,
295, 71, 297, 296, 71, 291, 283, 71, 284, 71,
- 299, 71, 300, 286, 302, 71, 281, 2631, 71, 301,
+ 299, 71, 300, 286, 302, 71, 281, 2749, 71, 301,
71, 282, 303, 287, 293, 298, 305, 295, 71, 304,
296, 307, 306, 283, 71, 284, 71, 71, 308, 71,
309, 302, 71, 71, 71, 310, 301, 71, 311, 303,
@@ -1400,742 +1438,786 @@ static yyconst flex_uint16_t yy_nxt[7571] =
340, 343, 71, 71, 71, 71, 71, 335, 71, 337,
333, 341, 344, 347, 348, 349, 71, 350, 351, 353,
- 2631, 352, 2631, 71, 336, 368, 342, 340, 343, 71,
- 71, 71, 71, 354, 356, 71, 71, 357, 2631, 344,
+ 2749, 352, 2749, 71, 336, 368, 342, 340, 343, 71,
+ 71, 71, 71, 354, 356, 71, 71, 357, 2749, 344,
347, 348, 358, 363, 350, 351, 353, 71, 352, 355,
360, 71, 71, 361, 71, 362, 367, 71, 71, 71,
- 354, 356, 71, 364, 357, 365, 371, 2631, 71, 358,
+ 354, 356, 71, 364, 357, 365, 371, 2749, 71, 358,
363, 366, 369, 370, 71, 71, 355, 360, 376, 71,
361, 71, 362, 367, 372, 71, 374, 375, 377, 71,
364, 71, 365, 371, 71, 71, 379, 378, 366, 369,
381, 373, 71, 380, 390, 71, 71, 71, 382, 71,
71, 372, 71, 374, 375, 377, 383, 71, 384, 389,
- 385, 2631, 386, 379, 378, 71, 71, 381, 373, 71,
- 380, 387, 71, 388, 71, 382, 71, 391, 392, 2631,
- 71, 71, 398, 383, 397, 384, 389, 385, 71, 386,
- 2631, 71, 399, 71, 400, 2631, 2631, 71, 387, 393,
- 388, 71, 71, 407, 391, 392, 402, 394, 395, 398,
- 396, 397, 401, 403, 71, 2631, 2631, 71, 71, 399,
- 71, 400, 404, 405, 410, 411, 393, 71, 71, 413,
- 407, 414, 417, 402, 394, 395, 71, 396, 408, 401,
- 403, 409, 412, 71, 415, 416, 418, 71, 71, 404,
- 405, 410, 411, 71, 71, 419, 71, 71, 414, 417,
-
- 71, 71, 1057, 71, 421, 408, 422, 420, 409, 412,
- 71, 415, 416, 418, 71, 424, 71, 423, 425, 426,
- 431, 427, 419, 2631, 71, 2631, 2631, 428, 429, 437,
- 430, 421, 71, 71, 420, 472, 71, 71, 71, 2631,
- 432, 71, 424, 71, 423, 436, 426, 431, 427, 438,
- 71, 439, 71, 433, 428, 429, 434, 430, 435, 440,
- 946, 71, 472, 71, 71, 71, 447, 432, 448, 449,
- 461, 71, 436, 71, 71, 2631, 438, 450, 439, 453,
- 433, 71, 71, 434, 451, 435, 440, 441, 474, 442,
- 71, 71, 71, 447, 462, 448, 449, 461, 463, 465,
-
- 452, 71, 443, 464, 450, 444, 453, 445, 71, 446,
- 471, 451, 71, 71, 441, 474, 442, 466, 477, 468,
- 71, 462, 71, 150, 2631, 467, 465, 452, 473, 443,
- 71, 71, 444, 71, 445, 71, 446, 454, 455, 469,
- 470, 2631, 71, 483, 466, 477, 468, 456, 71, 457,
- 458, 459, 467, 478, 460, 473, 479, 71, 480, 475,
- 71, 482, 71, 71, 454, 455, 469, 470, 476, 485,
- 71, 481, 484, 71, 456, 71, 457, 458, 459, 71,
- 478, 460, 490, 479, 71, 480, 487, 486, 482, 498,
- 488, 71, 71, 71, 489, 476, 485, 494, 481, 484,
-
- 71, 491, 492, 2631, 71, 71, 493, 496, 71, 490,
- 497, 495, 71, 71, 486, 501, 498, 488, 71, 502,
- 71, 489, 71, 504, 494, 499, 509, 513, 503, 2631,
- 71, 71, 71, 493, 496, 71, 505, 497, 495, 71,
- 500, 71, 501, 506, 71, 511, 502, 510, 71, 71,
- 504, 517, 499, 509, 507, 503, 508, 512, 514, 71,
- 2631, 71, 524, 505, 71, 515, 516, 500, 71, 71,
- 506, 519, 511, 71, 510, 71, 520, 521, 517, 523,
- 518, 507, 522, 508, 512, 514, 71, 71, 525, 71,
- 71, 527, 515, 516, 71, 526, 71, 71, 519, 71,
-
- 534, 71, 528, 520, 521, 71, 523, 518, 529, 522,
- 530, 71, 531, 71, 535, 525, 532, 71, 527, 533,
- 71, 71, 526, 71, 536, 540, 71, 534, 537, 528,
- 71, 71, 538, 543, 539, 529, 71, 530, 541, 531,
- 71, 535, 71, 532, 71, 1168, 533, 548, 71, 549,
- 542, 536, 540, 547, 71, 537, 71, 71, 71, 538,
- 543, 539, 544, 546, 545, 541, 71, 71, 550, 552,
- 71, 71, 551, 71, 555, 560, 549, 542, 553, 71,
- 547, 554, 71, 557, 2631, 556, 558, 606, 71, 544,
- 546, 545, 71, 561, 71, 563, 552, 71, 562, 551,
-
- 71, 71, 560, 71, 564, 553, 71, 71, 554, 559,
- 557, 565, 556, 567, 566, 71, 569, 568, 71, 71,
- 561, 578, 563, 2631, 71, 562, 71, 71, 71, 71,
- 577, 564, 580, 71, 581, 71, 559, 71, 565, 582,
- 567, 566, 579, 569, 568, 570, 583, 584, 578, 585,
- 571, 71, 572, 71, 588, 71, 71, 577, 71, 580,
- 573, 581, 589, 574, 575, 71, 582, 71, 71, 579,
- 576, 71, 570, 583, 584, 586, 585, 571, 591, 572,
- 2631, 588, 592, 595, 71, 587, 71, 573, 590, 589,
- 574, 575, 593, 597, 594, 71, 596, 576, 71, 600,
-
- 599, 71, 602, 2631, 71, 591, 71, 71, 71, 592,
- 595, 598, 587, 603, 71, 590, 71, 71, 71, 593,
- 597, 594, 71, 596, 601, 604, 600, 599, 609, 602,
- 605, 607, 71, 608, 71, 610, 71, 611, 598, 617,
- 603, 612, 613, 71, 616, 71, 71, 614, 71, 71,
- 71, 601, 604, 150, 615, 609, 618, 605, 607, 620,
- 608, 71, 610, 71, 611, 71, 71, 619, 612, 613,
- 621, 616, 622, 624, 614, 623, 634, 625, 628, 71,
- 637, 615, 71, 632, 633, 71, 635, 71, 71, 71,
- 636, 71, 675, 629, 619, 71, 71, 621, 630, 622,
-
- 624, 71, 623, 626, 625, 628, 627, 631, 71, 638,
- 71, 71, 71, 71, 71, 71, 639, 71, 640, 71,
- 641, 71, 642, 643, 644, 71, 71, 71, 646, 645,
- 626, 647, 71, 627, 631, 648, 638, 649, 71, 71,
- 651, 650, 653, 639, 71, 640, 71, 641, 71, 642,
- 643, 644, 71, 652, 71, 71, 645, 658, 647, 71,
- 71, 654, 648, 665, 649, 657, 655, 659, 650, 653,
- 656, 664, 71, 660, 71, 71, 71, 661, 662, 2631,
- 652, 71, 666, 71, 658, 71, 663, 672, 654, 667,
- 665, 71, 657, 655, 659, 71, 669, 656, 71, 71,
-
- 660, 71, 670, 71, 661, 662, 71, 676, 671, 666,
- 673, 668, 71, 663, 672, 674, 667, 677, 71, 71,
- 679, 678, 71, 669, 71, 71, 680, 681, 71, 670,
- 685, 682, 71, 686, 676, 671, 71, 673, 668, 683,
- 684, 687, 674, 71, 677, 688, 689, 71, 678, 71,
- 697, 71, 71, 680, 681, 71, 690, 685, 682, 691,
- 693, 71, 694, 71, 692, 71, 683, 684, 687, 703,
- 71, 695, 696, 689, 71, 699, 71, 71, 71, 71,
- 698, 700, 71, 690, 705, 701, 2631, 693, 71, 694,
- 704, 71, 706, 71, 708, 2631, 2631, 707, 695, 696,
-
- 702, 71, 699, 71, 710, 71, 71, 698, 700, 71,
- 711, 705, 701, 709, 712, 71, 713, 704, 71, 714,
- 71, 708, 716, 715, 71, 71, 717, 702, 71, 71,
- 71, 710, 71, 71, 718, 720, 719, 711, 725, 71,
- 709, 712, 721, 713, 722, 723, 714, 71, 726, 716,
- 715, 71, 71, 717, 71, 724, 71, 71, 727, 729,
- 71, 718, 720, 719, 728, 730, 71, 71, 71, 721,
- 71, 722, 723, 732, 71, 726, 733, 2631, 734, 731,
- 2631, 71, 724, 737, 735, 727, 729, 71, 71, 71,
- 736, 728, 730, 738, 740, 741, 742, 739, 71, 71,
-
- 732, 749, 71, 733, 71, 734, 731, 71, 71, 71,
- 737, 735, 743, 744, 745, 71, 71, 736, 747, 71,
- 738, 740, 741, 742, 739, 746, 748, 71, 749, 750,
- 751, 754, 753, 71, 71, 752, 71, 755, 756, 743,
- 744, 745, 71, 757, 761, 747, 71, 71, 71, 764,
- 71, 71, 746, 748, 150, 71, 750, 751, 754, 753,
- 71, 71, 752, 758, 755, 756, 759, 760, 767, 762,
- 757, 71, 766, 71, 765, 71, 71, 763, 768, 71,
- 71, 772, 770, 769, 773, 71, 2631, 2631, 2631, 771,
- 758, 792, 71, 759, 760, 71, 762, 71, 71, 766,
-
- 71, 765, 784, 71, 763, 768, 71, 782, 774, 770,
- 769, 773, 775, 71, 71, 776, 771, 71, 783, 71,
- 71, 786, 71, 71, 789, 785, 2631, 787, 71, 784,
- 2631, 2631, 788, 2631, 782, 774, 790, 804, 2631, 775,
- 71, 805, 776, 777, 71, 783, 71, 778, 786, 71,
- 779, 789, 785, 71, 787, 791, 800, 780, 71, 788,
- 781, 71, 71, 790, 804, 71, 801, 2631, 71, 2631,
- 777, 802, 71, 803, 778, 71, 806, 779, 71, 830,
- 71, 807, 791, 800, 780, 808, 811, 781, 793, 794,
- 2631, 795, 2631, 801, 796, 810, 71, 71, 802, 797,
-
- 803, 809, 812, 806, 814, 798, 799, 71, 807, 813,
- 71, 71, 808, 811, 71, 793, 794, 71, 795, 71,
- 816, 796, 810, 820, 71, 819, 797, 71, 809, 812,
- 815, 814, 798, 799, 71, 817, 813, 818, 71, 821,
- 822, 824, 71, 71, 71, 71, 823, 816, 825, 71,
- 820, 71, 819, 71, 826, 71, 71, 815, 827, 831,
- 829, 832, 817, 828, 818, 833, 821, 822, 824, 836,
- 71, 839, 837, 823, 834, 825, 835, 838, 71, 71,
- 840, 71, 71, 843, 841, 71, 71, 829, 832, 842,
- 71, 71, 833, 71, 71, 71, 836, 71, 839, 837,
-
- 845, 834, 71, 835, 838, 844, 846, 71, 71, 847,
- 848, 841, 850, 71, 849, 71, 842, 851, 71, 852,
- 2631, 71, 853, 854, 71, 2631, 861, 845, 71, 856,
- 71, 71, 844, 846, 71, 71, 847, 848, 71, 850,
- 860, 849, 857, 855, 851, 71, 852, 71, 71, 853,
- 854, 71, 858, 71, 2631, 862, 856, 864, 863, 865,
- 859, 71, 2631, 71, 866, 71, 71, 860, 867, 857,
- 855, 71, 869, 71, 868, 870, 71, 2631, 874, 858,
- 71, 71, 862, 871, 864, 863, 865, 859, 872, 873,
- 71, 866, 71, 71, 878, 867, 71, 877, 71, 869,
-
- 875, 868, 870, 885, 876, 874, 879, 71, 71, 883,
- 871, 880, 881, 71, 71, 872, 873, 71, 71, 71,
- 890, 71, 887, 882, 877, 884, 889, 875, 886, 71,
- 71, 876, 71, 879, 891, 71, 883, 888, 880, 881,
- 894, 71, 71, 71, 71, 892, 898, 890, 896, 897,
- 882, 895, 884, 893, 71, 886, 899, 71, 71, 901,
- 71, 891, 71, 900, 888, 71, 903, 894, 906, 902,
- 71, 908, 892, 898, 71, 896, 71, 71, 895, 904,
- 893, 71, 905, 899, 909, 907, 912, 910, 71, 2631,
- 900, 71, 71, 71, 71, 150, 902, 71, 908, 914,
-
- 911, 943, 71, 915, 71, 924, 904, 71, 71, 905,
- 71, 909, 907, 912, 910, 913, 71, 916, 925, 917,
- 2631, 926, 71, 71, 71, 71, 914, 911, 943, 928,
- 915, 71, 924, 71, 927, 930, 71, 931, 932, 929,
- 2631, 71, 913, 933, 916, 925, 917, 918, 926, 919,
- 71, 71, 71, 920, 934, 921, 928, 71, 2631, 2631,
- 922, 927, 930, 935, 931, 923, 929, 71, 2631, 937,
- 71, 71, 936, 939, 918, 940, 919, 941, 944, 938,
- 920, 934, 921, 71, 71, 942, 71, 922, 71, 945,
- 935, 71, 923, 947, 949, 71, 937, 948, 71, 936,
-
- 939, 957, 940, 71, 941, 71, 938, 956, 2631, 960,
- 71, 968, 942, 2631, 958, 959, 71, 2631, 2631, 962,
- 2631, 949, 71, 71, 948, 71, 950, 71, 957, 966,
- 71, 951, 961, 952, 956, 71, 960, 963, 71, 964,
- 965, 958, 959, 71, 953, 954, 962, 71, 71, 969,
- 71, 955, 71, 950, 71, 970, 71, 967, 951, 961,
- 952, 971, 972, 71, 963, 973, 964, 965, 975, 974,
- 978, 953, 954, 71, 977, 71, 969, 71, 955, 976,
- 71, 979, 970, 980, 967, 71, 71, 71, 971, 981,
- 983, 71, 973, 982, 71, 975, 974, 71, 984, 71,
-
- 71, 977, 71, 71, 985, 71, 976, 987, 979, 986,
- 980, 71, 998, 988, 991, 989, 981, 983, 990, 996,
- 982, 992, 71, 71, 71, 984, 71, 71, 71, 993,
- 994, 985, 995, 71, 997, 999, 986, 71, 1001, 71,
- 988, 991, 989, 1002, 71, 990, 996, 1000, 992, 71,
- 1003, 71, 71, 1004, 71, 1005, 993, 994, 71, 995,
- 71, 997, 999, 1008, 1007, 1006, 1011, 1009, 1012, 1013,
- 71, 71, 71, 1010, 1000, 71, 71, 1003, 71, 71,
- 1004, 71, 1005, 1014, 1016, 71, 1017, 1015, 1018, 1021,
- 1008, 1007, 1006, 71, 1009, 1012, 1019, 1020, 71, 71,
-
- 1010, 71, 1025, 1026, 71, 1022, 71, 71, 71, 1023,
- 1014, 1016, 1024, 1017, 1015, 1018, 1021, 1027, 71, 71,
- 71, 1029, 1028, 1019, 1020, 1034, 71, 1033, 1030, 1035,
- 71, 71, 1022, 71, 71, 71, 1023, 71, 1031, 1024,
- 1032, 71, 1036, 1038, 1027, 71, 71, 71, 1029, 1028,
- 1037, 1039, 71, 1040, 1033, 1030, 1041, 71, 71, 1043,
- 1044, 71, 1042, 1049, 71, 1031, 1045, 1032, 71, 1036,
- 1038, 1050, 71, 1047, 1052, 1046, 2631, 1037, 1039, 1048,
- 71, 1053, 71, 71, 71, 71, 1043, 1044, 2631, 1042,
- 71, 71, 1051, 1045, 71, 71, 71, 1054, 1055, 1056,
-
- 1047, 1052, 1046, 71, 71, 71, 1048, 1058, 71, 1059,
- 1060, 71, 1062, 1061, 71, 71, 71, 1063, 71, 1051,
- 71, 1065, 1064, 1066, 1054, 1055, 1056, 71, 1068, 1067,
- 1069, 1071, 1072, 71, 1058, 71, 1059, 1060, 71, 1062,
- 1061, 1074, 2631, 1073, 71, 1070, 71, 1075, 1065, 1064,
- 1066, 71, 71, 1078, 1076, 1068, 1067, 71, 1077, 1081,
- 1084, 1079, 2631, 71, 71, 71, 71, 71, 1074, 71,
- 1073, 71, 1070, 71, 1075, 71, 1080, 1082, 1085, 71,
- 1078, 1076, 1083, 1086, 71, 1077, 1081, 71, 1079, 71,
- 71, 71, 71, 1087, 1088, 2631, 1093, 1089, 1095, 1096,
-
- 1124, 71, 2631, 1080, 1082, 1085, 1090, 1094, 1091, 1083,
- 1086, 1092, 71, 1097, 71, 2631, 1104, 1100, 71, 71,
- 1087, 1088, 71, 1093, 1089, 1095, 1096, 1098, 1099, 71,
- 1102, 1105, 71, 1090, 1094, 1091, 71, 71, 1092, 71,
- 1097, 1101, 1103, 71, 1100, 1107, 71, 1108, 1109, 71,
- 71, 2631, 71, 71, 1098, 1099, 1106, 1102, 1105, 1110,
- 1114, 1112, 2631, 71, 1115, 1111, 71, 71, 1101, 1103,
- 71, 71, 1107, 71, 1108, 1109, 71, 1113, 1117, 71,
- 71, 1119, 1116, 1106, 71, 1118, 1110, 1114, 1112, 71,
- 71, 1115, 1111, 1121, 71, 1120, 1122, 1123, 1125, 1126,
-
- 71, 1129, 71, 71, 1113, 1117, 1127, 71, 1119, 1116,
- 1128, 71, 1118, 71, 1130, 71, 71, 1133, 71, 1131,
- 1121, 1132, 1120, 1122, 1123, 1125, 1126, 1134, 1129, 71,
- 71, 1135, 71, 1127, 1144, 2631, 1158, 1128, 1142, 2631,
- 2631, 71, 1143, 1147, 1133, 1145, 71, 1159, 1132, 2631,
- 2631, 2631, 71, 1146, 1134, 2631, 1148, 71, 1135, 1136,
- 71, 71, 1137, 1138, 2631, 1142, 71, 1139, 71, 1143,
- 1147, 71, 1145, 1140, 1149, 71, 1150, 1141, 71, 71,
- 1146, 71, 1151, 1148, 1152, 1153, 1136, 1154, 1155, 1137,
- 1138, 1160, 71, 1161, 1139, 1156, 71, 1167, 1157, 2631,
-
- 1140, 1149, 71, 1150, 1141, 71, 71, 71, 71, 1151,
- 71, 1152, 1153, 71, 1154, 1155, 71, 2631, 1160, 1170,
- 1161, 1172, 1156, 71, 1167, 1157, 1162, 1169, 1171, 1173,
- 71, 1163, 1179, 1164, 1174, 1165, 1176, 1166, 1178, 1175,
- 71, 71, 71, 71, 71, 1177, 1170, 71, 1172, 1180,
- 71, 71, 1182, 1162, 1169, 1171, 1173, 71, 1163, 1179,
- 1164, 1181, 1165, 1176, 1166, 1178, 71, 71, 1183, 71,
- 1184, 71, 1177, 1185, 1187, 1186, 1180, 1189, 1188, 1182,
- 71, 71, 1190, 71, 1191, 1192, 71, 2631, 1181, 1193,
- 1197, 1194, 71, 71, 2631, 1183, 71, 1184, 1195, 71,
-
- 1185, 1187, 1186, 1198, 1189, 1188, 1199, 1200, 1203, 71,
- 71, 1191, 71, 1196, 71, 71, 1193, 71, 1194, 1205,
- 71, 71, 1201, 1207, 1204, 1195, 1202, 1206, 71, 71,
- 1198, 71, 71, 71, 1200, 71, 1208, 1209, 1211, 1210,
- 1196, 71, 2631, 1219, 1214, 71, 1205, 1212, 71, 1201,
- 1207, 1204, 1216, 1202, 1206, 1213, 1217, 71, 1215, 71,
- 71, 71, 1220, 1208, 1209, 1211, 1210, 71, 1221, 71,
- 71, 1214, 1218, 71, 1212, 71, 71, 71, 1222, 1216,
- 1223, 1224, 1213, 1217, 1225, 1215, 71, 1226, 1229, 71,
- 71, 1232, 71, 1230, 71, 1221, 1227, 1228, 71, 1218,
-
- 71, 1231, 1233, 71, 71, 1237, 2631, 1223, 1224, 1236,
- 71, 1225, 71, 1234, 71, 1229, 71, 1238, 1232, 1235,
- 71, 1240, 1239, 1227, 1228, 71, 71, 1242, 1241, 71,
- 71, 71, 1237, 71, 71, 71, 1236, 1244, 1245, 1246,
- 1234, 1243, 1252, 71, 1238, 1247, 1235, 71, 1240, 1239,
- 71, 1249, 1248, 1251, 1242, 1241, 1250, 1253, 2631, 71,
- 71, 71, 1254, 1259, 1244, 71, 1246, 71, 1243, 1252,
- 71, 71, 1247, 1255, 71, 1257, 1256, 1261, 1258, 1248,
- 1251, 1260, 2631, 71, 1253, 71, 2631, 1262, 71, 1254,
- 1259, 1263, 1292, 1264, 71, 1265, 71, 71, 1270, 1267,
-
- 1255, 71, 1257, 1256, 1266, 1258, 1268, 71, 1260, 71,
- 71, 71, 1269, 71, 1262, 71, 1272, 1273, 1263, 71,
- 1264, 71, 1265, 1271, 71, 1270, 1267, 1274, 1278, 1275,
- 1276, 1266, 71, 1268, 2631, 1279, 71, 71, 1277, 1269,
- 71, 71, 71, 1272, 1273, 71, 71, 71, 1280, 1282,
- 1271, 1281, 1283, 2631, 1274, 1278, 1275, 1276, 1284, 71,
- 71, 1285, 1279, 1286, 2631, 1277, 1287, 1290, 1289, 1291,
- 71, 71, 71, 71, 1288, 1280, 1282, 1293, 1281, 1283,
- 71, 71, 2631, 2631, 1294, 1284, 71, 1295, 1285, 71,
- 1286, 71, 71, 1287, 1290, 1289, 1291, 1296, 1297, 1298,
-
- 1302, 1288, 1300, 1299, 1301, 2631, 1303, 2631, 2631, 71,
- 71, 1294, 71, 71, 1295, 71, 71, 71, 1305, 1306,
- 71, 71, 2631, 1307, 71, 1297, 1298, 1302, 1304, 1300,
- 1299, 1301, 71, 1303, 1308, 71, 71, 71, 1309, 1311,
- 1313, 71, 71, 1310, 1312, 1305, 1306, 71, 1314, 1315,
- 1307, 1316, 1319, 1317, 1318, 1304, 71, 71, 1321, 71,
- 71, 1308, 1322, 71, 1320, 71, 71, 1313, 1323, 1324,
- 71, 71, 1334, 2631, 1325, 1314, 1315, 71, 1316, 1326,
- 1317, 1318, 71, 71, 71, 1321, 1327, 71, 1331, 1322,
- 1328, 1320, 1329, 1330, 71, 1333, 1324, 1332, 71, 71,
-
- 71, 1325, 1336, 71, 1335, 71, 1326, 2631, 2631, 1337,
- 71, 2631, 1338, 1327, 71, 1331, 1343, 1328, 1339, 1329,
- 1330, 71, 1333, 71, 1332, 71, 71, 1345, 1344, 1336,
- 71, 1335, 71, 1340, 71, 1346, 1337, 1341, 71, 1338,
- 71, 1347, 2631, 1343, 1348, 1339, 71, 1349, 2631, 1350,
- 1342, 1356, 1351, 1355, 1345, 1344, 1352, 2631, 71, 1358,
- 1340, 1353, 1346, 71, 1341, 71, 71, 1359, 71, 71,
- 71, 1348, 71, 1354, 1349, 71, 1350, 1342, 71, 1351,
- 71, 1357, 1361, 1352, 1360, 71, 1358, 2631, 1353, 71,
- 71, 1362, 1363, 1364, 1359, 1365, 1369, 1366, 2631, 1367,
-
- 1354, 1368, 71, 1371, 71, 1370, 71, 1372, 1357, 1375,
- 71, 1360, 1379, 71, 71, 1374, 71, 71, 71, 71,
- 1364, 71, 1365, 1369, 1366, 71, 1367, 71, 1368, 71,
- 1371, 1373, 1370, 1376, 1372, 71, 1375, 1377, 1378, 71,
- 1380, 1381, 1374, 71, 1382, 1384, 71, 1383, 71, 2631,
- 71, 1387, 71, 1385, 1386, 1388, 1390, 1389, 1373, 71,
- 1376, 71, 71, 71, 1377, 1378, 71, 1380, 1381, 71,
- 71, 1382, 1384, 71, 1383, 1393, 71, 1394, 1387, 71,
- 1385, 1386, 71, 1390, 1389, 1391, 1392, 1396, 71, 1395,
- 1397, 1398, 1399, 71, 2631, 1402, 1401, 71, 71, 1400,
-
- 2631, 1404, 1393, 71, 1394, 1403, 1406, 1408, 1411, 71,
- 71, 71, 1391, 1392, 1396, 71, 1395, 1397, 1398, 1399,
- 71, 71, 1402, 1401, 1405, 1410, 1400, 71, 1407, 1409,
- 1414, 71, 1403, 71, 71, 1411, 1412, 71, 71, 1413,
- 1415, 71, 1416, 71, 1417, 1419, 71, 1418, 1424, 71,
- 2631, 1405, 1410, 2631, 71, 1407, 1409, 1414, 1430, 1425,
- 71, 1421, 71, 1412, 1422, 71, 1413, 1415, 71, 1416,
- 1420, 1417, 1419, 71, 1418, 1426, 1423, 71, 1427, 1433,
- 71, 71, 1428, 1429, 71, 71, 1425, 1431, 1421, 1432,
- 71, 1422, 2631, 71, 1434, 1435, 1438, 1420, 1439, 1441,
-
- 71, 71, 1426, 1423, 71, 1427, 1433, 71, 71, 1428,
- 1429, 1436, 1440, 71, 1431, 71, 1432, 1437, 1443, 71,
- 1444, 1434, 1435, 1442, 71, 1453, 1445, 71, 71, 1447,
- 71, 71, 1446, 1449, 71, 1448, 71, 2631, 1436, 1440,
- 71, 71, 71, 1451, 1437, 1443, 71, 71, 71, 1452,
- 1442, 1450, 1458, 1445, 1454, 1456, 1447, 71, 71, 1446,
- 1449, 71, 1448, 71, 71, 1455, 1460, 1457, 71, 1461,
- 1451, 1462, 71, 71, 1463, 2631, 1452, 1459, 1450, 71,
- 1468, 1454, 1456, 71, 71, 1466, 1464, 71, 71, 71,
- 1465, 2631, 1455, 1460, 1457, 71, 1461, 1467, 1462, 71,
-
- 71, 1463, 1469, 71, 1459, 1470, 1472, 1468, 1471, 71,
- 1475, 1473, 1466, 1464, 1474, 1476, 71, 1465, 71, 71,
- 71, 1477, 1478, 1480, 1467, 1479, 1483, 1488, 1487, 1469,
- 2631, 71, 1470, 1472, 1481, 1471, 1482, 71, 1473, 71,
- 1489, 1474, 71, 1484, 71, 71, 71, 71, 1477, 71,
- 1480, 71, 1479, 1483, 1485, 1487, 71, 1486, 1490, 71,
- 1491, 1481, 1492, 1482, 1493, 71, 1497, 71, 1494, 2631,
- 1484, 71, 71, 1495, 71, 71, 1496, 71, 71, 71,
- 1498, 1485, 1502, 1499, 1486, 1490, 1500, 1491, 71, 1492,
- 1501, 1493, 2631, 1497, 71, 1494, 1503, 2631, 1504, 1507,
-
- 1495, 1505, 1506, 1496, 71, 71, 71, 1498, 71, 1502,
- 1499, 71, 71, 1500, 1509, 1508, 71, 1501, 1511, 1510,
- 1512, 1513, 1514, 1503, 71, 1504, 1507, 1515, 1505, 1506,
- 71, 71, 1517, 1516, 1519, 1518, 1521, 2631, 1520, 1522,
- 1531, 71, 1508, 2631, 1537, 1511, 71, 1533, 1513, 71,
- 1525, 71, 71, 71, 71, 71, 71, 1523, 71, 71,
- 1516, 1519, 1518, 1524, 71, 1520, 1522, 1526, 71, 1527,
- 1529, 1528, 71, 1530, 1533, 71, 71, 1525, 1532, 1535,
- 1534, 71, 2631, 71, 1523, 71, 71, 71, 71, 71,
- 1524, 1538, 71, 1540, 1526, 1536, 1527, 1529, 1528, 1539,
-
- 1530, 1542, 71, 1541, 1548, 1532, 1535, 1534, 71, 71,
- 71, 1543, 1544, 1545, 1546, 1547, 71, 1549, 1538, 71,
- 71, 1550, 1536, 1553, 71, 2631, 1539, 1555, 1542, 71,
- 1541, 1548, 71, 71, 71, 71, 1551, 1552, 1543, 1544,
- 1545, 1546, 1547, 1554, 71, 71, 1556, 71, 1550, 1558,
- 71, 71, 1557, 1559, 1555, 1560, 71, 71, 1564, 1561,
- 71, 71, 1562, 1551, 1552, 2631, 1566, 71, 1565, 1563,
- 1554, 71, 1567, 1556, 71, 1569, 1558, 1572, 1571, 1557,
- 1559, 1573, 1568, 1570, 2631, 71, 1561, 71, 71, 1562,
- 71, 1577, 71, 71, 71, 1565, 1563, 1578, 71, 1567,
-
- 71, 71, 71, 71, 1572, 1571, 1574, 1575, 1573, 1568,
- 1570, 71, 1576, 71, 1579, 71, 71, 1582, 1577, 1580,
- 1581, 71, 1586, 1587, 1578, 1584, 1585, 1593, 2631, 71,
- 1583, 71, 71, 1574, 1575, 71, 1591, 1588, 71, 1576,
- 1589, 1579, 71, 71, 1582, 1592, 1580, 1581, 71, 71,
- 1594, 1590, 1584, 1585, 71, 71, 1596, 1583, 71, 1595,
- 1599, 71, 1597, 1591, 1588, 1600, 71, 1589, 71, 1598,
- 1601, 71, 1592, 1602, 1603, 71, 1604, 71, 1590, 1605,
- 1606, 1607, 71, 71, 1610, 71, 1595, 71, 71, 1597,
- 1608, 1615, 1600, 1609, 1617, 2631, 1598, 71, 71, 2631,
-
- 1602, 1625, 71, 1604, 2631, 71, 71, 1606, 1607, 1619,
- 1622, 71, 2631, 2631, 1620, 2631, 71, 71, 1615, 71,
- 1609, 1611, 1612, 1613, 1616, 1618, 71, 1621, 1614, 1623,
- 1624, 71, 71, 71, 2631, 71, 71, 1622, 1628, 1627,
- 71, 71, 71, 1626, 71, 71, 71, 1629, 1611, 1612,
- 1613, 1616, 1618, 1631, 1621, 1614, 1623, 1624, 1630, 71,
- 1632, 71, 1634, 1633, 1635, 1628, 1627, 71, 71, 1639,
- 1626, 1638, 1640, 2631, 71, 1636, 1637, 71, 2631, 71,
- 1631, 1641, 1642, 1648, 71, 1630, 1644, 1632, 71, 1634,
- 1633, 71, 1647, 71, 71, 1651, 71, 1650, 1638, 1640,
-
- 71, 71, 1636, 1637, 1643, 71, 1645, 71, 1641, 1642,
- 1646, 1649, 71, 1644, 71, 71, 1652, 71, 71, 1647,
- 1653, 71, 1654, 1655, 1650, 1656, 1657, 71, 1658, 2631,
- 1659, 1643, 71, 1645, 71, 1662, 1660, 1646, 1649, 1661,
- 71, 71, 1663, 71, 71, 71, 1672, 71, 71, 1654,
- 1655, 1664, 1656, 1657, 71, 1658, 1665, 1659, 71, 1666,
- 1668, 71, 1662, 1660, 1669, 1670, 1661, 71, 71, 71,
- 2631, 1671, 71, 1672, 71, 1667, 1673, 71, 1664, 71,
- 1675, 1674, 71, 1665, 2631, 1677, 1666, 1668, 1676, 1679,
- 1678, 1669, 1670, 1681, 1680, 1684, 1685, 71, 1671, 71,
-
- 71, 71, 1667, 1673, 1686, 1687, 71, 71, 1674, 1690,
- 1691, 71, 1677, 2631, 2631, 1676, 71, 1678, 1682, 1683,
- 1681, 1680, 1694, 71, 1688, 71, 71, 71, 71, 1689,
- 71, 1686, 1687, 1692, 1695, 1697, 71, 71, 1693, 1698,
- 71, 1696, 71, 1699, 2631, 1682, 1683, 1703, 1701, 1700,
- 71, 1688, 1705, 1702, 71, 71, 1689, 1715, 71, 1704,
- 1712, 2631, 1697, 71, 71, 71, 71, 1706, 1696, 1708,
- 1699, 71, 71, 1707, 1710, 1701, 1700, 71, 1711, 71,
- 1702, 1709, 71, 1713, 71, 1714, 1704, 71, 71, 71,
- 1716, 1717, 71, 1718, 1706, 1721, 1708, 1719, 71, 1720,
-
- 1707, 1710, 1726, 71, 71, 1711, 1725, 2631, 1709, 1727,
- 71, 71, 1714, 71, 71, 71, 1722, 1716, 1717, 71,
- 1718, 71, 1721, 1723, 1719, 1724, 1720, 71, 71, 71,
- 1730, 71, 1728, 1725, 1729, 1731, 1727, 1732, 71, 1733,
- 71, 1734, 71, 1722, 1735, 1737, 2631, 1736, 71, 71,
- 1723, 1746, 1724, 2631, 71, 71, 71, 71, 2631, 1728,
- 1738, 1729, 1731, 1741, 1732, 1739, 1733, 71, 1734, 71,
- 1742, 1735, 71, 71, 1736, 1743, 1740, 71, 71, 1744,
- 1754, 1745, 2631, 1751, 1753, 1747, 1749, 1738, 71, 1748,
- 1741, 71, 1739, 71, 71, 71, 71, 1742, 71, 1752,
-
- 71, 1750, 1743, 1740, 1755, 71, 1744, 1754, 1745, 71,
- 71, 1753, 1747, 1749, 71, 71, 1748, 1756, 1757, 1760,
- 1758, 2631, 1759, 1761, 1762, 1763, 1752, 71, 1750, 71,
- 1766, 71, 1765, 71, 2631, 1771, 71, 71, 71, 71,
- 71, 1764, 71, 1770, 1756, 1757, 1760, 1758, 71, 1759,
- 1761, 1762, 1763, 1767, 1769, 1772, 71, 1766, 71, 1765,
- 1773, 71, 71, 1775, 71, 1774, 1768, 71, 1764, 1776,
- 1770, 2631, 1777, 1778, 71, 1779, 71, 1781, 1786, 1780,
- 1767, 1769, 1772, 1784, 71, 71, 2631, 1773, 1783, 71,
- 1775, 1782, 1774, 1768, 71, 1788, 1776, 71, 71, 1777,
-
- 1778, 71, 1779, 71, 1781, 71, 1780, 1785, 71, 71,
- 1784, 1787, 71, 1790, 1789, 1783, 2631, 71, 1782, 1792,
- 71, 1791, 1788, 1793, 1794, 1795, 1800, 2631, 71, 1804,
- 71, 1796, 1797, 2631, 1785, 71, 1798, 2631, 1787, 71,
- 1790, 1789, 1799, 71, 71, 71, 1792, 71, 1791, 1801,
- 1793, 71, 1795, 71, 1802, 71, 71, 1803, 1796, 1797,
- 1805, 71, 2631, 1798, 71, 1806, 71, 1809, 1810, 1799,
- 1807, 2631, 1811, 2631, 1812, 71, 1801, 1816, 1808, 2631,
- 1817, 1802, 71, 71, 1803, 1813, 71, 1805, 1814, 71,
- 71, 1815, 1806, 1818, 71, 1810, 1819, 1807, 71, 1811,
-
- 71, 1812, 71, 71, 1816, 1808, 71, 1817, 1822, 1820,
- 1821, 1823, 1813, 1824, 71, 1814, 2631, 1828, 1815, 1825,
- 71, 1831, 1826, 1819, 71, 71, 71, 71, 71, 1832,
- 71, 71, 1827, 71, 1833, 1822, 1820, 1821, 1823, 1829,
- 1824, 71, 1830, 71, 1828, 1840, 1825, 1834, 1831, 1826,
- 1835, 71, 1837, 1842, 71, 71, 1832, 71, 1836, 1827,
- 1839, 1833, 71, 1838, 71, 71, 1829, 1843, 1841, 1830,
- 1844, 71, 71, 1849, 1834, 71, 1845, 1835, 71, 1837,
- 71, 1850, 1846, 1847, 1851, 1836, 71, 1839, 1848, 1854,
- 1838, 1852, 1853, 71, 1843, 1841, 71, 1844, 71, 71,
-
- 1855, 1859, 1858, 1845, 1860, 71, 1861, 1863, 71, 1846,
- 71, 1851, 2631, 71, 1856, 71, 71, 2631, 1852, 1853,
- 71, 71, 1864, 1862, 1865, 1857, 71, 1855, 71, 1858,
- 71, 1860, 71, 1861, 1866, 1867, 1868, 1870, 1869, 71,
- 2631, 1856, 2631, 1874, 71, 71, 1871, 1872, 71, 1864,
- 1862, 71, 1857, 1873, 1875, 71, 71, 71, 1878, 71,
- 71, 1866, 1876, 1868, 1870, 1869, 1877, 71, 1879, 71,
- 1874, 71, 1880, 1871, 1872, 1881, 71, 71, 1882, 71,
- 1873, 1875, 1883, 1885, 71, 71, 1884, 2631, 1886, 1876,
- 71, 71, 1887, 1877, 1888, 1879, 71, 71, 71, 1880,
-
- 71, 1889, 1881, 1890, 71, 1882, 1891, 1892, 71, 1883,
- 71, 71, 71, 1884, 1893, 1886, 1895, 1894, 1896, 1887,
- 71, 1888, 71, 1897, 1901, 1898, 1899, 1902, 1889, 71,
- 1890, 1900, 1904, 1891, 1892, 1903, 2631, 71, 71, 1905,
- 71, 1893, 71, 71, 1894, 1896, 71, 71, 1908, 1909,
- 1897, 71, 1898, 1899, 71, 1910, 1914, 71, 1900, 1904,
- 1906, 1911, 1903, 1907, 1913, 71, 1905, 1912, 71, 1915,
- 1917, 71, 1916, 1919, 71, 71, 1909, 71, 71, 71,
- 71, 1920, 1910, 71, 1918, 1921, 1925, 1906, 1911, 1922,
- 1907, 1913, 1924, 71, 1912, 1923, 71, 71, 1926, 1916,
-
- 71, 1927, 71, 71, 2631, 1929, 71, 1930, 71, 1928,
- 1933, 1918, 71, 71, 71, 1931, 1922, 1937, 71, 1924,
- 1938, 1934, 1923, 1935, 1942, 1926, 71, 71, 71, 71,
- 1932, 71, 1929, 1940, 1930, 71, 1928, 71, 1936, 1939,
- 1941, 71, 1931, 71, 71, 71, 71, 1938, 1934, 1946,
- 1935, 71, 1944, 1943, 1948, 1947, 1945, 1932, 1949, 1952,
- 1940, 71, 71, 71, 71, 1936, 1939, 1941, 71, 1950,
- 71, 71, 1951, 2631, 71, 1953, 71, 71, 1954, 1944,
- 1943, 1948, 1947, 1945, 1955, 1949, 1952, 1956, 1957, 1958,
- 71, 1959, 1964, 71, 2631, 1960, 1950, 71, 71, 1951,
-
- 71, 1961, 1953, 71, 1962, 1954, 71, 1963, 1965, 71,
- 1966, 1955, 71, 1967, 1956, 1957, 1958, 71, 1959, 71,
- 1968, 1969, 1960, 71, 71, 1970, 71, 71, 1961, 1972,
- 71, 1962, 1971, 1973, 1963, 1965, 1976, 1966, 71, 71,
- 1967, 1974, 71, 71, 1975, 1978, 1977, 1968, 1969, 1979,
- 71, 71, 1970, 1981, 71, 1982, 1972, 1980, 1983, 1971,
- 71, 1985, 1986, 1976, 71, 71, 1988, 1984, 1974, 71,
- 2631, 1975, 71, 1977, 71, 71, 1979, 71, 71, 1987,
- 1981, 71, 1982, 1990, 1980, 1983, 1991, 1989, 71, 1986,
- 1993, 1992, 1994, 1988, 1984, 71, 1995, 71, 71, 71,
-
- 1996, 71, 1997, 1999, 1998, 2000, 1987, 2001, 2002, 2003,
- 1990, 71, 71, 1991, 1989, 71, 2004, 1993, 1992, 1994,
- 2006, 2009, 71, 1995, 2007, 71, 2005, 71, 71, 71,
- 1999, 1998, 71, 71, 2008, 71, 2003, 71, 2010, 71,
- 2011, 71, 71, 2004, 71, 2013, 2012, 2006, 2009, 2015,
- 2631, 2007, 71, 2005, 2014, 2018, 71, 2016, 2017, 2019,
- 71, 2008, 71, 2021, 71, 2010, 71, 71, 71, 2020,
- 2025, 71, 2013, 2012, 2023, 2026, 2015, 71, 71, 2022,
- 2035, 2014, 2018, 71, 2016, 2017, 2019, 2024, 2028, 2027,
- 2029, 71, 71, 2030, 2031, 71, 2020, 2025, 71, 2033,
-
- 71, 2023, 2037, 71, 2032, 71, 2022, 71, 71, 2034,
- 2045, 2039, 71, 71, 2024, 2028, 2027, 2029, 71, 71,
- 2030, 2031, 2036, 2038, 2040, 71, 2033, 2043, 2044, 71,
- 2041, 2032, 71, 71, 2042, 2047, 2034, 71, 71, 2046,
- 2048, 71, 71, 2051, 2052, 71, 71, 2049, 2054, 2036,
- 2038, 2040, 71, 2631, 71, 71, 71, 2041, 71, 2053,
- 2050, 2042, 2047, 2055, 2056, 71, 2046, 2048, 71, 71,
- 2051, 71, 71, 2057, 2049, 2058, 71, 71, 2060, 2059,
- 71, 2061, 2065, 71, 2631, 2062, 2053, 2050, 71, 2063,
- 2055, 2056, 2064, 2067, 2068, 71, 2069, 2066, 2070, 2071,
-
- 71, 2074, 2058, 2072, 71, 2060, 2059, 71, 71, 2065,
- 71, 71, 2062, 2073, 2078, 71, 2063, 71, 71, 2064,
- 2067, 71, 71, 71, 2066, 71, 71, 71, 2074, 2075,
- 2072, 2076, 2077, 2079, 2080, 2081, 2083, 2082, 2084, 2631,
- 2073, 71, 2086, 71, 2085, 71, 71, 2087, 2631, 71,
- 71, 71, 2088, 2089, 71, 71, 2075, 71, 2076, 2077,
- 71, 71, 2081, 2083, 2082, 2084, 71, 2091, 2090, 2086,
- 71, 2085, 2093, 2092, 71, 71, 71, 2094, 2095, 2088,
- 2089, 71, 2098, 2099, 2101, 71, 2096, 2631, 71, 2097,
- 2103, 71, 2104, 2100, 2091, 2090, 71, 71, 71, 2093,
-
- 2092, 71, 2102, 71, 2094, 2095, 2105, 2106, 71, 2098,
- 2099, 2101, 71, 2096, 71, 71, 2097, 2103, 2107, 2104,
- 2100, 2108, 2109, 2110, 2111, 2114, 2631, 2113, 2112, 2102,
- 71, 71, 71, 71, 71, 71, 71, 2631, 2116, 71,
- 2631, 2631, 2119, 2120, 71, 2107, 2115, 71, 2108, 2109,
- 2110, 2111, 2114, 71, 2113, 2112, 71, 2117, 2118, 2121,
- 2122, 2125, 2123, 2124, 71, 2116, 2126, 71, 71, 2119,
- 71, 71, 71, 2115, 2127, 2631, 2133, 71, 71, 2131,
- 2132, 71, 2128, 71, 2117, 2118, 2121, 71, 2125, 2123,
- 2124, 71, 2129, 2126, 2130, 2134, 2137, 2136, 2135, 2631,
-
- 2142, 2127, 71, 71, 71, 71, 71, 71, 71, 2128,
- 71, 2141, 2140, 2138, 2631, 2144, 2143, 2146, 71, 2129,
- 71, 2130, 2134, 2137, 2136, 2135, 2139, 71, 2631, 2145,
- 2151, 2154, 2631, 71, 71, 71, 71, 71, 2141, 2140,
- 2138, 71, 71, 2143, 2146, 2147, 2148, 2150, 2149, 2152,
- 2153, 2156, 71, 2139, 71, 71, 2145, 71, 71, 71,
- 2155, 71, 2157, 71, 2158, 2159, 2631, 2162, 2164, 2163,
- 2166, 71, 2147, 2148, 2150, 2149, 2152, 2153, 2156, 71,
- 2167, 2160, 2165, 71, 71, 71, 2161, 2155, 71, 2157,
- 71, 71, 2159, 71, 71, 71, 2163, 71, 2168, 2631,
-
- 2169, 2170, 71, 2171, 2172, 2173, 71, 2167, 2160, 2165,
- 2174, 2175, 2177, 2161, 2631, 2631, 2176, 71, 71, 2631,
- 2182, 2178, 71, 71, 2183, 71, 71, 2169, 2170, 71,
- 2171, 2172, 2173, 71, 71, 2180, 2179, 2174, 2175, 2177,
- 71, 2181, 71, 2176, 71, 2184, 71, 2182, 2178, 2185,
- 2186, 2183, 2188, 71, 71, 2187, 2189, 71, 2190, 2191,
- 2193, 2631, 2180, 2179, 2631, 71, 2192, 71, 2181, 2194,
- 2195, 2196, 2184, 2197, 71, 71, 71, 71, 2199, 2188,
- 2198, 71, 2187, 2189, 2200, 2190, 71, 2193, 71, 2201,
- 2202, 71, 71, 2192, 71, 2204, 2194, 2195, 71, 2203,
-
- 71, 2205, 71, 2206, 2207, 2199, 2208, 2198, 2631, 2631,
- 2209, 2631, 71, 2210, 2212, 2631, 71, 2202, 71, 2211,
- 2213, 71, 71, 2214, 71, 71, 2203, 71, 2205, 71,
- 2206, 2207, 2219, 2208, 71, 71, 2217, 2209, 71, 2215,
- 2210, 2212, 71, 2216, 2218, 71, 2211, 2213, 71, 2220,
- 2214, 2224, 2221, 2228, 71, 2631, 2223, 71, 71, 2219,
- 71, 2222, 71, 2217, 71, 2225, 2215, 71, 71, 2226,
- 2216, 2218, 2227, 71, 2229, 2232, 2220, 2230, 71, 2221,
- 71, 2234, 71, 2223, 71, 2233, 2231, 71, 2222, 71,
- 2631, 2235, 2225, 71, 2236, 2238, 2226, 2237, 71, 2227,
-
- 2239, 2229, 2232, 2242, 2230, 2243, 2240, 2244, 71, 71,
- 71, 2245, 2246, 2231, 2241, 71, 71, 71, 2235, 71,
- 2249, 2236, 2238, 71, 2237, 2250, 71, 2239, 2247, 71,
- 2242, 2251, 71, 2240, 71, 71, 2248, 2252, 71, 71,
- 2253, 2241, 2254, 71, 2255, 2256, 71, 2249, 2257, 71,
- 2258, 2261, 71, 2259, 2262, 2247, 2631, 2631, 71, 2263,
- 71, 71, 71, 2248, 2252, 2260, 2270, 2253, 2264, 71,
- 71, 2255, 71, 2265, 2269, 2257, 2272, 71, 71, 2273,
- 2259, 71, 71, 71, 2266, 2274, 2263, 2267, 71, 2268,
- 2275, 2271, 2260, 71, 71, 71, 71, 2276, 71, 71,
-
- 71, 2269, 2277, 2272, 71, 2631, 71, 71, 2278, 71,
- 2631, 2266, 2274, 2282, 2267, 2281, 2268, 2275, 2271, 2285,
- 2284, 71, 71, 2283, 2276, 2287, 2279, 2280, 2631, 2277,
- 71, 2286, 71, 71, 2289, 2278, 71, 71, 2290, 71,
- 2282, 2288, 2281, 2291, 71, 2292, 71, 2284, 2293, 71,
- 2283, 2294, 2287, 2279, 2280, 2295, 2296, 71, 2286, 71,
- 71, 2289, 71, 2297, 71, 2290, 2300, 2298, 2288, 71,
- 2291, 71, 2292, 71, 71, 2293, 2301, 2299, 2294, 2302,
- 2303, 71, 2295, 2296, 71, 2304, 2305, 2306, 71, 2308,
- 2297, 2309, 2307, 71, 2298, 2631, 2312, 2310, 71, 2311,
-
- 71, 2315, 2631, 2301, 2299, 71, 2302, 71, 71, 71,
- 71, 2316, 2304, 71, 2306, 71, 2308, 71, 71, 2307,
- 71, 2317, 2313, 2312, 2310, 2318, 2311, 2314, 2315, 71,
- 2319, 2320, 2321, 71, 2322, 2323, 2330, 2631, 2316, 71,
- 2325, 71, 2324, 71, 2331, 71, 2327, 2326, 71, 71,
- 2328, 2332, 2318, 2329, 71, 2631, 2631, 2319, 2320, 2321,
- 2336, 2322, 2323, 71, 71, 71, 71, 2325, 71, 2324,
- 2333, 71, 2334, 2327, 2326, 2335, 71, 2328, 71, 71,
- 2329, 2337, 71, 71, 2338, 2339, 2631, 2336, 71, 2340,
- 2342, 2341, 2343, 2345, 2344, 2347, 71, 2333, 2631, 2334,
-
- 71, 2348, 2335, 71, 2350, 2631, 71, 71, 2346, 71,
- 71, 2338, 2339, 71, 71, 2349, 71, 2342, 2341, 2343,
- 2351, 2344, 71, 2352, 2356, 71, 2353, 71, 2348, 2355,
- 2354, 71, 71, 2357, 71, 2346, 2358, 71, 2359, 71,
- 71, 2360, 2349, 2362, 2363, 2365, 2361, 2351, 71, 71,
- 2352, 2356, 71, 2353, 71, 2364, 2355, 2354, 71, 2367,
- 2357, 71, 2368, 2358, 2366, 2359, 2372, 2369, 71, 2371,
- 71, 71, 71, 2361, 71, 71, 2370, 71, 2374, 2375,
- 71, 71, 2364, 71, 2373, 2376, 2367, 2389, 2377, 71,
- 2379, 2366, 71, 2372, 2369, 2380, 2371, 71, 2382, 2384,
-
- 2385, 2381, 71, 2370, 2386, 2374, 71, 2378, 71, 71,
- 2390, 2373, 71, 71, 2383, 71, 2388, 2379, 2387, 71,
- 2391, 71, 2380, 71, 71, 2382, 71, 2385, 2381, 2392,
- 71, 2386, 2394, 71, 2378, 2395, 2397, 71, 2396, 2393,
- 2400, 2383, 2401, 2388, 71, 2387, 71, 2391, 71, 2403,
- 2398, 2399, 2404, 2405, 71, 2402, 2408, 71, 2406, 2394,
- 71, 71, 2395, 71, 2407, 2396, 2393, 71, 71, 71,
- 2409, 71, 2410, 2411, 2412, 71, 71, 2398, 2399, 71,
- 2405, 2413, 2402, 71, 2415, 2406, 71, 2414, 2416, 71,
- 2417, 2407, 71, 2420, 2419, 71, 2421, 71, 2418, 71,
-
- 2411, 71, 2422, 71, 2424, 71, 2423, 2425, 2413, 2631,
- 71, 2415, 71, 2426, 2414, 71, 2427, 2417, 71, 71,
- 71, 2419, 2430, 2421, 2428, 2418, 71, 2431, 2429, 71,
- 2631, 71, 2432, 2423, 2425, 71, 71, 2433, 71, 2434,
- 71, 2435, 71, 2427, 71, 2436, 2438, 71, 71, 2430,
- 2444, 2428, 71, 71, 2431, 2429, 71, 71, 2437, 2432,
- 2439, 2440, 2442, 2441, 2433, 2445, 2434, 71, 2435, 71,
- 71, 2443, 2436, 2438, 2446, 2447, 2448, 71, 71, 2449,
- 2450, 2631, 2451, 2452, 71, 2437, 2453, 2439, 2440, 2442,
- 2441, 2454, 71, 2455, 2456, 71, 2457, 71, 2443, 2458,
-
- 2462, 2446, 71, 71, 71, 71, 2459, 2460, 71, 2451,
- 71, 71, 2461, 2453, 71, 71, 2463, 2464, 2454, 71,
- 71, 2456, 2470, 2457, 2465, 71, 2458, 71, 2471, 71,
- 71, 2468, 2466, 2459, 2460, 2467, 2469, 2472, 71, 2461,
- 2631, 2473, 2477, 71, 2464, 2474, 71, 71, 2475, 71,
- 71, 2465, 2476, 2478, 71, 2471, 2479, 2480, 2481, 2466,
- 71, 2483, 2467, 71, 2472, 2484, 2485, 71, 2473, 71,
- 71, 2482, 2474, 2487, 2488, 2475, 2486, 2489, 71, 2476,
- 71, 2490, 2491, 71, 71, 71, 71, 2493, 71, 71,
- 71, 71, 71, 2485, 2492, 71, 2494, 2497, 2482, 71,
-
- 2487, 2488, 2495, 2486, 71, 71, 71, 2496, 2490, 2491,
- 71, 2498, 2631, 71, 2493, 2505, 2502, 2499, 2500, 2501,
- 2631, 2492, 71, 2494, 2497, 71, 71, 71, 2503, 2495,
- 71, 2504, 71, 71, 2506, 2508, 2513, 2507, 2498, 71,
- 71, 71, 2505, 2502, 2499, 2500, 2501, 71, 2509, 2510,
- 71, 71, 2512, 2511, 71, 2503, 2631, 2515, 2504, 2514,
- 2516, 2506, 2508, 2513, 2507, 71, 71, 71, 2521, 2523,
- 71, 71, 2524, 2518, 71, 2509, 2510, 2520, 71, 2512,
- 2511, 2517, 2519, 71, 2515, 71, 2514, 2516, 2522, 71,
- 71, 2525, 2526, 2527, 2631, 71, 71, 2529, 71, 2524,
-
- 2518, 71, 2631, 2528, 2520, 2530, 71, 2531, 2517, 2519,
- 71, 2532, 2534, 71, 2533, 2522, 2536, 2631, 71, 71,
- 2527, 71, 2535, 2537, 2529, 2538, 71, 71, 2540, 71,
- 2528, 71, 2530, 2539, 2531, 71, 2541, 71, 2532, 2542,
- 2543, 2533, 71, 71, 71, 2544, 2545, 2547, 71, 2535,
- 2537, 2631, 2538, 2551, 2631, 71, 2546, 2548, 71, 2550,
- 2539, 71, 71, 2541, 2549, 71, 2542, 2543, 2552, 71,
- 2553, 71, 71, 2554, 2547, 71, 71, 71, 71, 2555,
- 2551, 71, 2556, 2546, 2548, 2558, 2550, 2562, 2559, 2563,
- 2557, 2549, 71, 71, 2560, 2552, 71, 2553, 71, 2564,
-
- 2554, 2565, 2566, 71, 2570, 2561, 2555, 71, 2567, 2556,
- 71, 71, 2558, 71, 71, 2559, 2563, 2557, 2568, 2571,
- 2572, 2560, 2578, 2575, 71, 2569, 2573, 71, 2565, 2566,
- 71, 71, 2561, 71, 2574, 2567, 71, 2631, 2581, 2582,
- 71, 71, 71, 71, 2580, 2568, 2571, 71, 2576, 71,
- 2575, 2577, 2569, 2573, 71, 2579, 71, 2585, 71, 71,
- 2586, 2574, 2588, 71, 71, 2581, 71, 2583, 71, 2587,
- 2584, 2580, 2589, 2590, 2591, 2576, 71, 71, 2577, 71,
- 2592, 71, 2579, 2593, 2585, 71, 2595, 2586, 71, 2588,
- 2596, 2600, 2597, 2603, 2583, 71, 2587, 2584, 71, 2589,
-
- 2590, 2591, 2598, 2594, 2601, 2604, 2631, 2592, 2602, 71,
- 2593, 71, 71, 2595, 71, 2599, 71, 2596, 71, 2597,
- 71, 2605, 71, 71, 2607, 71, 71, 2609, 2606, 2598,
- 2594, 2601, 2604, 71, 2611, 2602, 71, 2608, 2612, 2610,
- 2616, 71, 2599, 2615, 2613, 71, 71, 71, 2605, 2614,
- 2617, 2607, 71, 2631, 71, 2606, 71, 71, 71, 2619,
- 71, 2611, 2620, 2621, 2608, 2612, 2610, 71, 2622, 71,
- 2615, 2613, 2618, 2623, 2624, 2625, 2614, 2617, 2629, 2627,
- 71, 2626, 2630, 71, 2628, 71, 2619, 71, 2631, 71,
- 2621, 2631, 71, 2631, 71, 71, 2631, 71, 2631, 2618,
-
- 71, 2624, 2625, 71, 2631, 71, 2627, 2631, 2626, 71,
- 2631, 2628, 43, 43, 43, 43, 43, 43, 43, 48,
- 48, 48, 48, 48, 48, 48, 53, 53, 53, 53,
- 53, 53, 53, 59, 59, 59, 59, 59, 59, 59,
- 64, 64, 64, 64, 64, 64, 64, 74, 74, 2631,
- 74, 74, 74, 74, 140, 140, 2631, 2631, 2631, 140,
- 140, 142, 142, 2631, 2631, 142, 2631, 142, 144, 2631,
- 2631, 2631, 2631, 2631, 144, 147, 147, 2631, 2631, 2631,
- 147, 147, 149, 2631, 2631, 2631, 2631, 2631, 149, 151,
- 151, 2631, 151, 151, 151, 151, 75, 75, 2631, 75,
-
- 75, 75, 75, 13, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631
+ 385, 972, 386, 379, 378, 71, 71, 381, 373, 71,
+ 380, 387, 71, 388, 71, 382, 71, 391, 392, 2749,
+ 71, 71, 2749, 383, 399, 384, 389, 385, 71, 386,
+ 2749, 401, 71, 71, 400, 409, 404, 71, 387, 415,
+ 388, 71, 71, 71, 391, 392, 393, 402, 2749, 394,
+ 71, 399, 405, 71, 395, 396, 397, 398, 401, 71,
+ 412, 400, 409, 404, 71, 403, 71, 71, 406, 407,
+ 413, 71, 71, 393, 402, 410, 394, 416, 411, 405,
+ 414, 395, 396, 397, 398, 71, 417, 412, 71, 418,
+ 2749, 420, 403, 71, 424, 406, 407, 413, 71, 71,
+
+ 419, 71, 410, 421, 416, 411, 71, 414, 422, 423,
+ 425, 71, 71, 417, 2749, 71, 418, 71, 420, 426,
+ 427, 71, 71, 428, 438, 2749, 71, 419, 469, 431,
+ 421, 432, 429, 1089, 433, 422, 423, 425, 430, 2749,
+ 439, 71, 71, 2749, 434, 71, 426, 71, 440, 71,
+ 428, 438, 71, 71, 71, 469, 431, 435, 432, 429,
+ 436, 433, 437, 71, 2749, 430, 453, 441, 71, 451,
+ 71, 434, 71, 442, 452, 440, 71, 443, 71, 454,
+ 71, 455, 457, 2749, 435, 444, 2749, 436, 2749, 437,
+ 465, 71, 71, 453, 441, 71, 451, 456, 466, 2749,
+
+ 442, 452, 71, 471, 443, 71, 454, 2749, 455, 457,
+ 472, 71, 444, 445, 467, 446, 71, 465, 473, 468,
+ 470, 474, 71, 2749, 456, 466, 150, 475, 447, 71,
+ 471, 448, 2749, 449, 477, 450, 71, 472, 478, 71,
+ 445, 71, 446, 476, 71, 473, 71, 470, 474, 2749,
+ 487, 71, 481, 2749, 2749, 447, 71, 479, 448, 71,
+ 449, 477, 450, 458, 459, 478, 480, 482, 2749, 484,
+ 476, 483, 486, 460, 71, 461, 462, 463, 71, 481,
+ 464, 71, 71, 485, 71, 488, 489, 491, 71, 71,
+ 458, 459, 71, 480, 482, 490, 484, 2749, 483, 486,
+
+ 460, 71, 461, 462, 463, 71, 493, 464, 71, 492,
+ 485, 71, 488, 489, 498, 494, 497, 71, 499, 71,
+ 495, 496, 490, 71, 503, 71, 500, 2749, 2749, 71,
+ 501, 504, 507, 493, 506, 536, 492, 71, 2749, 71,
+ 518, 498, 494, 497, 71, 499, 505, 71, 502, 71,
+ 71, 503, 508, 500, 71, 71, 509, 501, 504, 507,
+ 71, 506, 536, 71, 510, 71, 514, 511, 515, 516,
+ 517, 2749, 71, 505, 524, 502, 519, 71, 512, 508,
+ 513, 520, 71, 509, 71, 71, 521, 529, 71, 522,
+ 71, 510, 71, 514, 511, 515, 516, 517, 525, 523,
+
+ 71, 524, 71, 519, 527, 512, 71, 513, 520, 71,
+ 526, 71, 71, 521, 528, 530, 522, 531, 71, 71,
+ 2749, 532, 2749, 533, 534, 525, 523, 71, 537, 71,
+ 538, 527, 71, 540, 535, 71, 541, 526, 71, 71,
+ 71, 528, 530, 539, 531, 71, 71, 542, 532, 544,
+ 533, 534, 71, 543, 547, 537, 71, 538, 71, 71,
+ 540, 535, 71, 541, 545, 546, 548, 550, 555, 71,
+ 539, 71, 549, 71, 542, 71, 544, 557, 553, 71,
+ 543, 547, 71, 554, 71, 71, 551, 2749, 552, 556,
+ 71, 545, 546, 548, 550, 71, 71, 558, 559, 549,
+
+ 71, 560, 562, 564, 561, 553, 565, 71, 2749, 71,
+ 554, 71, 2749, 551, 563, 552, 556, 568, 569, 71,
+ 71, 71, 567, 71, 558, 559, 570, 71, 560, 566,
+ 564, 561, 71, 572, 71, 71, 571, 2749, 71, 71,
+ 573, 563, 574, 575, 568, 569, 2749, 2749, 587, 567,
+ 576, 2749, 71, 570, 71, 71, 566, 588, 71, 71,
+ 572, 585, 586, 571, 71, 71, 2749, 573, 71, 574,
+ 575, 71, 590, 607, 71, 587, 2749, 576, 577, 589,
+ 591, 71, 592, 578, 588, 579, 593, 594, 585, 586,
+ 71, 580, 2749, 581, 71, 71, 582, 583, 71, 590,
+
+ 607, 595, 71, 584, 71, 577, 589, 591, 71, 592,
+ 578, 596, 579, 593, 594, 598, 2749, 599, 580, 71,
+ 581, 597, 600, 582, 583, 601, 71, 603, 595, 71,
+ 584, 602, 605, 71, 604, 608, 2749, 610, 606, 616,
+ 71, 71, 598, 71, 599, 609, 71, 71, 597, 600,
+ 71, 71, 601, 71, 603, 71, 613, 612, 602, 605,
+ 611, 604, 608, 614, 610, 606, 615, 71, 71, 71,
+ 617, 71, 609, 623, 618, 627, 628, 71, 620, 630,
+ 619, 71, 621, 613, 612, 71, 71, 611, 71, 150,
+ 614, 71, 624, 615, 71, 622, 71, 617, 625, 626,
+
+ 623, 618, 71, 633, 71, 620, 71, 619, 71, 621,
+ 632, 71, 629, 631, 634, 71, 643, 645, 71, 624,
+ 635, 639, 622, 71, 640, 625, 626, 71, 71, 641,
+ 633, 644, 71, 646, 71, 636, 71, 632, 642, 629,
+ 631, 634, 637, 71, 71, 638, 647, 635, 639, 71,
+ 648, 649, 71, 71, 651, 658, 71, 71, 71, 650,
+ 71, 653, 636, 652, 2749, 642, 655, 654, 663, 637,
+ 71, 71, 638, 71, 657, 659, 71, 656, 649, 1205,
+ 71, 651, 71, 71, 661, 71, 650, 71, 653, 2749,
+ 652, 71, 662, 655, 654, 664, 660, 71, 71, 71,
+
+ 71, 657, 659, 665, 656, 71, 71, 71, 670, 666,
+ 672, 661, 669, 674, 667, 671, 71, 71, 668, 662,
+ 2749, 71, 664, 660, 71, 673, 71, 676, 677, 678,
+ 665, 675, 71, 71, 71, 670, 666, 672, 679, 669,
+ 674, 667, 671, 71, 681, 668, 71, 71, 682, 2749,
+ 686, 683, 673, 71, 685, 677, 678, 684, 675, 71,
+ 680, 71, 2749, 71, 71, 679, 71, 687, 71, 688,
+ 689, 681, 71, 71, 690, 682, 71, 686, 683, 691,
+ 692, 685, 693, 694, 684, 695, 697, 680, 2749, 71,
+ 71, 696, 71, 698, 687, 71, 688, 71, 699, 700,
+
+ 701, 690, 71, 702, 71, 703, 691, 692, 71, 71,
+ 694, 71, 695, 697, 71, 71, 704, 711, 696, 705,
+ 698, 713, 71, 707, 706, 699, 708, 701, 712, 71,
+ 714, 71, 703, 709, 710, 71, 71, 71, 71, 71,
+ 71, 71, 717, 704, 715, 719, 2749, 740, 713, 71,
+ 707, 71, 71, 708, 718, 712, 722, 714, 720, 716,
+ 709, 710, 723, 721, 71, 725, 724, 71, 71, 71,
+ 726, 715, 719, 71, 71, 727, 728, 732, 729, 71,
+ 730, 718, 71, 722, 71, 71, 716, 71, 71, 723,
+ 71, 71, 725, 724, 731, 71, 733, 726, 734, 735,
+
+ 71, 71, 727, 728, 732, 729, 736, 730, 737, 738,
+ 71, 71, 742, 2749, 71, 71, 71, 739, 741, 745,
+ 743, 731, 744, 733, 71, 734, 735, 71, 71, 71,
+ 71, 71, 746, 736, 747, 737, 738, 751, 750, 742,
+ 754, 71, 71, 71, 739, 741, 745, 743, 748, 744,
+ 749, 71, 753, 752, 758, 756, 71, 71, 71, 746,
+ 71, 747, 755, 71, 751, 750, 71, 754, 71, 2749,
+ 757, 759, 760, 761, 762, 748, 71, 749, 71, 753,
+ 752, 758, 756, 763, 71, 766, 764, 765, 2749, 755,
+ 768, 71, 2749, 71, 71, 71, 71, 757, 759, 760,
+
+ 761, 762, 767, 71, 769, 71, 770, 71, 71, 772,
+ 763, 771, 766, 764, 765, 71, 778, 768, 775, 71,
+ 777, 773, 774, 784, 776, 781, 71, 2749, 150, 767,
+ 71, 769, 71, 770, 71, 71, 772, 71, 771, 782,
+ 71, 2749, 779, 71, 786, 775, 783, 777, 773, 774,
+ 780, 776, 71, 785, 71, 71, 788, 71, 789, 787,
+ 71, 792, 790, 2749, 791, 71, 782, 71, 71, 779,
+ 71, 786, 794, 783, 71, 800, 793, 780, 71, 71,
+ 785, 71, 801, 788, 71, 803, 787, 71, 792, 790,
+ 71, 791, 71, 805, 2749, 802, 804, 811, 806, 794,
+
+ 2749, 807, 800, 793, 795, 2749, 71, 71, 796, 801,
+ 810, 797, 803, 71, 808, 2749, 71, 71, 798, 809,
+ 805, 799, 802, 804, 71, 806, 71, 71, 807, 71,
+ 71, 795, 71, 2749, 819, 796, 820, 810, 797, 2749,
+ 2749, 808, 71, 824, 821, 798, 809, 826, 799, 812,
+ 813, 2749, 814, 71, 823, 815, 71, 822, 2749, 71,
+ 816, 819, 828, 820, 829, 825, 817, 818, 827, 2749,
+ 71, 821, 830, 71, 826, 71, 812, 813, 71, 814,
+ 71, 823, 815, 831, 822, 71, 71, 816, 71, 828,
+ 832, 829, 825, 817, 818, 827, 71, 833, 834, 830,
+
+ 835, 836, 838, 837, 840, 71, 71, 839, 71, 841,
+ 831, 71, 71, 842, 845, 71, 71, 832, 847, 71,
+ 851, 71, 71, 71, 833, 834, 843, 835, 836, 838,
+ 837, 840, 844, 71, 839, 71, 841, 848, 846, 71,
+ 842, 845, 849, 852, 850, 71, 853, 71, 2749, 855,
+ 860, 854, 71, 843, 857, 856, 861, 858, 71, 844,
+ 71, 864, 862, 71, 2749, 846, 71, 859, 71, 71,
+ 71, 850, 71, 853, 71, 71, 855, 860, 854, 71,
+ 71, 857, 856, 71, 858, 863, 2749, 71, 865, 862,
+ 866, 867, 868, 71, 859, 869, 71, 870, 871, 873,
+
+ 2749, 71, 874, 872, 71, 2749, 882, 878, 71, 71,
+ 71, 875, 863, 71, 71, 865, 71, 866, 867, 868,
+ 71, 71, 869, 71, 870, 871, 873, 876, 71, 874,
+ 872, 877, 879, 71, 878, 71, 881, 883, 875, 2749,
+ 880, 885, 2749, 71, 884, 886, 887, 71, 2749, 71,
+ 888, 891, 71, 71, 876, 71, 71, 890, 877, 879,
+ 894, 71, 889, 881, 883, 2749, 71, 880, 885, 71,
+ 892, 884, 886, 887, 71, 71, 895, 888, 891, 71,
+ 893, 896, 897, 899, 890, 898, 900, 902, 71, 889,
+ 71, 2749, 71, 901, 71, 903, 71, 892, 71, 71,
+
+ 904, 907, 71, 895, 71, 909, 71, 893, 896, 897,
+ 899, 918, 898, 900, 71, 71, 905, 906, 71, 908,
+ 901, 910, 903, 71, 71, 911, 71, 904, 907, 912,
+ 913, 914, 915, 71, 71, 921, 71, 71, 918, 920,
+ 71, 919, 923, 905, 906, 916, 908, 71, 910, 922,
+ 924, 71, 925, 917, 71, 927, 912, 71, 914, 915,
+ 71, 930, 71, 926, 71, 71, 920, 71, 919, 923,
+ 71, 929, 916, 71, 928, 931, 922, 924, 2749, 933,
+ 917, 932, 71, 71, 71, 935, 934, 71, 150, 936,
+ 926, 71, 71, 71, 938, 937, 939, 71, 929, 948,
+
+ 940, 928, 931, 71, 71, 71, 933, 71, 932, 71,
+ 949, 71, 935, 934, 941, 2749, 936, 2749, 950, 2749,
+ 71, 938, 937, 939, 952, 71, 948, 940, 2749, 951,
+ 71, 71, 955, 71, 953, 960, 954, 949, 957, 2749,
+ 956, 941, 942, 958, 943, 950, 71, 71, 944, 71,
+ 945, 952, 959, 71, 71, 946, 951, 969, 71, 955,
+ 947, 953, 960, 954, 961, 71, 71, 956, 962, 942,
+ 71, 943, 964, 965, 966, 944, 71, 945, 963, 959,
+ 71, 968, 946, 967, 970, 971, 71, 947, 973, 71,
+ 71, 961, 983, 2749, 71, 962, 71, 987, 974, 964,
+
+ 965, 966, 71, 986, 975, 963, 71, 71, 968, 985,
+ 967, 984, 71, 71, 990, 989, 71, 995, 71, 983,
+ 71, 988, 71, 71, 987, 974, 993, 71, 2749, 2749,
+ 986, 975, 976, 71, 71, 2749, 985, 977, 984, 978,
+ 994, 990, 989, 71, 991, 979, 992, 998, 988, 71,
+ 980, 981, 71, 71, 71, 996, 999, 982, 71, 976,
+ 997, 71, 1001, 71, 977, 1002, 978, 994, 71, 1000,
+ 71, 991, 979, 992, 998, 1003, 1005, 980, 981, 71,
+ 1006, 2749, 996, 71, 982, 2749, 1004, 997, 71, 1001,
+ 1008, 71, 1002, 71, 1009, 1007, 1000, 71, 71, 1011,
+
+ 1012, 71, 1003, 71, 1015, 1010, 71, 1006, 71, 1016,
+ 1013, 1014, 71, 1004, 2749, 71, 1019, 1008, 71, 1017,
+ 1018, 1009, 1007, 1022, 71, 71, 1011, 1012, 71, 71,
+ 71, 1015, 1010, 71, 1023, 1020, 1021, 1013, 1014, 1025,
+ 1027, 71, 1024, 1019, 71, 71, 1017, 1018, 71, 1026,
+ 1022, 1028, 2749, 1030, 1035, 1034, 71, 71, 1031, 1029,
+ 1040, 1023, 1020, 1021, 71, 71, 1025, 71, 1032, 1024,
+ 71, 1033, 71, 1036, 1037, 71, 1026, 1038, 1028, 71,
+ 71, 1035, 1034, 71, 1039, 71, 1029, 1042, 1043, 2749,
+ 1041, 71, 71, 1044, 71, 1032, 71, 71, 1033, 71,
+
+ 1036, 1037, 1045, 1046, 1038, 1047, 1048, 1050, 1054, 1049,
+ 1052, 1039, 71, 2749, 1051, 1043, 71, 1041, 1053, 71,
+ 1044, 71, 71, 1055, 71, 71, 1056, 1058, 71, 1045,
+ 1046, 71, 1047, 1048, 1050, 71, 1049, 1052, 1057, 71,
+ 71, 1051, 1061, 1059, 71, 1053, 1063, 71, 1060, 71,
+ 71, 71, 71, 1056, 1058, 1062, 71, 1064, 1065, 1066,
+ 71, 1067, 1069, 2749, 1072, 1057, 2749, 2749, 1070, 1061,
+ 1059, 1068, 1073, 1063, 1074, 1060, 2749, 71, 1071, 71,
+ 1076, 71, 1062, 71, 1077, 71, 1066, 1078, 1067, 71,
+ 71, 1075, 71, 71, 71, 1070, 71, 1079, 1068, 71,
+
+ 71, 1074, 1080, 71, 71, 1071, 71, 1076, 71, 1081,
+ 1082, 1077, 1084, 1083, 1078, 2749, 1085, 71, 1075, 1086,
+ 1087, 1088, 1090, 2749, 1079, 71, 1091, 71, 1095, 1080,
+ 1092, 71, 1096, 71, 71, 1093, 71, 71, 71, 1084,
+ 1083, 71, 71, 71, 71, 71, 1086, 1087, 1088, 1090,
+ 1094, 1097, 1098, 1091, 1099, 71, 1100, 1092, 71, 1096,
+ 1101, 1102, 1093, 71, 1103, 1104, 2749, 71, 71, 2749,
+ 2749, 1105, 1107, 2749, 71, 1106, 71, 1094, 1097, 1098,
+ 1111, 1099, 1108, 1100, 1110, 2749, 2749, 71, 1102, 1116,
+ 1109, 2749, 71, 71, 71, 71, 71, 71, 1105, 1107,
+
+ 71, 1113, 1106, 71, 1112, 1115, 71, 1111, 1114, 1108,
+ 1117, 1110, 71, 71, 1119, 1118, 71, 1109, 1120, 1159,
+ 71, 71, 1121, 71, 71, 2749, 71, 2749, 1113, 71,
+ 2749, 1112, 1115, 1126, 1127, 1114, 1133, 1117, 2749, 71,
+ 1129, 1119, 1118, 1122, 1128, 1120, 1131, 2749, 1130, 1121,
+ 1132, 71, 1123, 71, 1124, 71, 71, 1125, 71, 71,
+ 1126, 1127, 1136, 1133, 71, 71, 1134, 1129, 71, 1135,
+ 1122, 1128, 71, 1131, 71, 1130, 1138, 1132, 71, 1123,
+ 1137, 1124, 1139, 1140, 1125, 1144, 1141, 1143, 71, 1136,
+ 71, 71, 1142, 1134, 1145, 2749, 1135, 71, 1149, 1148,
+
+ 2749, 2749, 1147, 71, 71, 71, 71, 1137, 71, 1139,
+ 1140, 71, 1144, 1141, 1143, 71, 1146, 71, 71, 1142,
+ 1150, 1145, 1151, 1153, 71, 1149, 1148, 1152, 1155, 1147,
+ 71, 1154, 71, 71, 1156, 71, 1164, 1157, 1158, 2749,
+ 71, 71, 2749, 1146, 71, 1179, 1160, 1150, 1161, 1151,
+ 1153, 71, 71, 1162, 1152, 1155, 71, 1163, 1154, 71,
+ 71, 1156, 1167, 1164, 1157, 1158, 1165, 71, 1168, 1169,
+ 71, 1166, 1177, 1160, 1170, 1161, 1178, 71, 2749, 71,
+ 1162, 71, 1180, 71, 1163, 1181, 71, 1183, 2749, 1167,
+ 2749, 1184, 2749, 2749, 71, 1168, 1169, 2749, 71, 1177,
+
+ 71, 1170, 1171, 1178, 1182, 1172, 1173, 71, 71, 1180,
+ 1174, 2749, 1181, 71, 1185, 1188, 1175, 1189, 1184, 71,
+ 1176, 1190, 71, 1186, 71, 1187, 1195, 1191, 71, 1171,
+ 1196, 1182, 1172, 1173, 1192, 2749, 71, 1174, 1197, 71,
+ 1193, 1185, 1188, 1175, 1189, 71, 1194, 1176, 1190, 71,
+ 1186, 71, 1187, 71, 1191, 71, 71, 1198, 71, 1206,
+ 71, 1192, 71, 2749, 1207, 1197, 1208, 1193, 1209, 1211,
+ 2749, 1204, 2749, 1194, 1212, 71, 2749, 71, 71, 2749,
+ 71, 1210, 1214, 1213, 1198, 1199, 1206, 71, 71, 1215,
+ 1200, 1207, 1201, 1208, 1202, 1209, 1203, 71, 1204, 71,
+
+ 1216, 71, 71, 71, 71, 1217, 1218, 1219, 1210, 1214,
+ 1213, 1220, 1199, 71, 71, 1221, 1215, 1200, 71, 1201,
+ 1224, 1202, 1222, 1203, 71, 1223, 71, 1216, 1225, 71,
+ 71, 1226, 1217, 1218, 1219, 71, 1227, 71, 1220, 1228,
+ 1229, 1231, 1221, 71, 1230, 1234, 1233, 1224, 1232, 1222,
+ 1235, 71, 1223, 71, 71, 1225, 1236, 71, 1226, 1237,
+ 1238, 1241, 1259, 71, 2749, 71, 1228, 71, 1231, 71,
+ 71, 1230, 71, 1233, 1239, 1232, 1243, 1235, 1240, 1247,
+ 71, 1246, 71, 71, 71, 71, 1237, 1238, 71, 1242,
+ 1244, 1245, 2749, 1249, 71, 1248, 71, 71, 2749, 71,
+
+ 71, 1239, 1250, 1243, 71, 1240, 1247, 1251, 1246, 1252,
+ 1253, 1260, 1254, 71, 1255, 71, 1242, 1244, 1245, 71,
+ 1249, 1256, 1248, 71, 71, 1257, 71, 1261, 1262, 1250,
+ 1258, 71, 71, 2749, 1251, 1263, 1252, 1253, 71, 1254,
+ 1265, 1255, 71, 71, 71, 71, 1266, 1264, 1256, 71,
+ 1270, 1267, 1257, 71, 1261, 71, 71, 1258, 71, 1268,
+ 71, 1269, 1263, 1271, 1272, 71, 71, 1265, 1273, 1277,
+ 1274, 1279, 1276, 71, 1264, 1280, 1275, 1278, 1267, 71,
+ 71, 1285, 71, 71, 71, 71, 1268, 1281, 1269, 1284,
+ 71, 1272, 1302, 1318, 71, 71, 1277, 1274, 1279, 1276,
+
+ 71, 71, 1280, 1275, 1278, 1282, 1283, 71, 71, 1286,
+ 1288, 71, 1287, 71, 1281, 71, 1284, 1289, 71, 1291,
+ 1292, 1293, 1290, 1295, 71, 71, 2749, 2749, 71, 1294,
+ 1300, 2749, 1282, 1283, 71, 71, 1286, 1288, 71, 1287,
+ 71, 1296, 71, 1303, 1297, 1301, 1291, 1292, 1293, 71,
+ 1295, 1298, 1305, 71, 1299, 71, 1294, 1300, 71, 1304,
+ 71, 1306, 71, 1308, 2749, 1307, 71, 1309, 1296, 1310,
+ 1303, 1297, 1301, 71, 71, 71, 71, 1311, 1298, 1305,
+ 1312, 1299, 1314, 1315, 71, 71, 1304, 1317, 1306, 1313,
+ 1308, 71, 1307, 71, 1309, 71, 1310, 1319, 71, 1325,
+
+ 1326, 2749, 1316, 2749, 1311, 1320, 71, 1312, 71, 1314,
+ 1315, 71, 71, 71, 1317, 1321, 1313, 1324, 1322, 1323,
+ 71, 71, 1329, 1331, 1319, 71, 1325, 1326, 71, 1316,
+ 71, 71, 1320, 1327, 1328, 71, 1330, 1332, 1339, 1335,
+ 71, 1333, 1321, 71, 1324, 1322, 1323, 71, 1334, 1329,
+ 1331, 1336, 1337, 2749, 1338, 71, 2749, 2749, 71, 1340,
+ 1327, 1328, 71, 1330, 1332, 71, 1341, 1342, 1333, 1346,
+ 71, 71, 1343, 1348, 2749, 1334, 71, 1344, 71, 1337,
+ 71, 1338, 71, 71, 71, 71, 1340, 1345, 1349, 71,
+ 1347, 1364, 71, 1341, 1342, 71, 1346, 71, 1350, 1343,
+
+ 1348, 1351, 2749, 1352, 1344, 1356, 1360, 71, 1353, 71,
+ 71, 71, 71, 1354, 1345, 1349, 1357, 1347, 1355, 1358,
+ 1368, 1359, 1361, 71, 71, 1350, 1366, 71, 1351, 71,
+ 71, 1362, 1356, 1360, 71, 71, 1365, 71, 71, 1367,
+ 2749, 1363, 71, 1357, 1373, 71, 1358, 1369, 1359, 1361,
+ 71, 1370, 71, 1366, 1371, 71, 1372, 71, 1362, 71,
+ 71, 1374, 71, 1365, 71, 1375, 1367, 71, 1363, 1376,
+ 1377, 1373, 1378, 1379, 1369, 2749, 1380, 71, 1370, 1381,
+ 2749, 1371, 1392, 1372, 2749, 2749, 2749, 71, 1374, 1383,
+ 1382, 1384, 1375, 1388, 71, 71, 1376, 1377, 71, 1378,
+
+ 71, 1389, 71, 1380, 71, 71, 1381, 71, 1385, 71,
+ 1393, 1391, 1386, 71, 1390, 71, 1383, 1382, 1384, 1395,
+ 1388, 71, 71, 1394, 1396, 1387, 1401, 1397, 1389, 1399,
+ 1400, 1398, 71, 71, 71, 1385, 71, 1393, 1391, 1386,
+ 71, 1390, 71, 1403, 1404, 71, 1395, 71, 1402, 71,
+ 1394, 1396, 1387, 71, 1397, 1405, 1399, 71, 1398, 1406,
+ 1407, 1408, 71, 1409, 2749, 1410, 71, 1411, 1414, 1412,
+ 1403, 1404, 1413, 2749, 1415, 1402, 71, 1416, 71, 71,
+ 1418, 71, 1405, 1419, 2749, 71, 71, 71, 1408, 71,
+ 71, 71, 1410, 71, 1411, 1414, 1412, 1417, 2749, 1413,
+
+ 71, 1415, 71, 71, 1416, 1420, 1421, 1418, 1423, 71,
+ 1419, 1422, 1424, 71, 71, 1425, 1426, 1427, 71, 1429,
+ 2749, 1430, 1428, 2749, 1417, 71, 71, 1433, 71, 2749,
+ 1435, 1431, 1420, 1421, 71, 1423, 71, 71, 1422, 1424,
+ 1432, 1436, 1425, 1426, 71, 71, 1429, 71, 1430, 1428,
+ 71, 1434, 71, 1437, 1433, 1443, 71, 1435, 1431, 71,
+ 1438, 1441, 71, 1439, 1440, 1447, 2749, 1432, 71, 1452,
+ 1442, 71, 71, 71, 71, 1450, 1444, 1445, 1434, 1446,
+ 1437, 71, 1443, 71, 71, 1448, 71, 1438, 1441, 1449,
+ 1439, 1440, 1447, 1451, 1454, 1455, 71, 1442, 71, 2749,
+
+ 71, 71, 1450, 1444, 1445, 1456, 1446, 71, 71, 1458,
+ 1453, 1457, 1448, 1459, 1463, 71, 1449, 71, 1460, 71,
+ 1451, 71, 1455, 1461, 2749, 1462, 71, 71, 1467, 1466,
+ 71, 1465, 71, 1464, 2749, 71, 1458, 1453, 1457, 1469,
+ 1459, 1463, 71, 71, 1468, 1460, 71, 1473, 1474, 71,
+ 1461, 71, 1462, 71, 71, 1467, 1466, 1478, 1465, 71,
+ 1464, 1470, 1475, 1479, 1471, 1476, 1469, 1477, 2749, 71,
+ 71, 1468, 1481, 1485, 1480, 1474, 1472, 2749, 1482, 71,
+ 71, 71, 71, 1484, 1478, 71, 1483, 71, 1470, 1475,
+ 1489, 1471, 1476, 1488, 1477, 71, 71, 71, 71, 1481,
+
+ 1485, 1480, 1487, 1472, 71, 1482, 1486, 1490, 71, 71,
+ 1484, 1492, 2749, 1483, 71, 1491, 2749, 71, 1494, 1493,
+ 1488, 1495, 71, 71, 1498, 1496, 1497, 1499, 1500, 1487,
+ 1504, 71, 2749, 1486, 71, 71, 1501, 71, 2749, 71,
+ 71, 71, 1491, 71, 1502, 1494, 1493, 71, 71, 71,
+ 1503, 1498, 1496, 1497, 1499, 1500, 1507, 1509, 1505, 71,
+ 1506, 1510, 71, 1501, 71, 71, 1508, 71, 71, 71,
+ 1511, 1502, 71, 1512, 1513, 1515, 1514, 1503, 71, 1518,
+ 1517, 1516, 2749, 1507, 71, 1505, 71, 1506, 1510, 71,
+ 71, 71, 71, 1508, 1519, 1526, 1527, 1511, 71, 71,
+
+ 1512, 1513, 1515, 1514, 1522, 1523, 1518, 1517, 1516, 1520,
+ 1524, 1525, 1521, 71, 71, 71, 1528, 71, 1529, 71,
+ 1530, 1519, 1526, 71, 1531, 2749, 1532, 71, 1534, 2749,
+ 1535, 1522, 1523, 71, 1533, 1542, 1520, 1524, 1525, 1521,
+ 71, 71, 71, 71, 71, 1529, 1536, 1530, 1537, 1538,
+ 71, 71, 1539, 1532, 1540, 1534, 71, 1535, 1541, 1543,
+ 1544, 1533, 71, 2749, 71, 1546, 71, 71, 1545, 1547,
+ 1548, 2749, 71, 1536, 71, 1537, 1538, 71, 71, 1539,
+ 71, 1540, 1549, 1552, 71, 71, 1543, 1544, 1551, 1550,
+ 71, 1554, 1546, 1553, 71, 1545, 1547, 1548, 71, 1559,
+
+ 1560, 1557, 1562, 1555, 1558, 1565, 71, 1563, 71, 1549,
+ 1552, 71, 1561, 71, 71, 1551, 1550, 1556, 1554, 71,
+ 1553, 71, 1564, 1566, 1567, 1568, 1559, 1560, 1557, 71,
+ 1555, 1558, 71, 1569, 71, 71, 1570, 71, 1571, 1561,
+ 1572, 1574, 1578, 1573, 1556, 1579, 2749, 71, 1575, 1564,
+ 1566, 71, 1576, 71, 1587, 71, 71, 71, 1577, 71,
+ 1569, 71, 71, 1580, 1581, 1571, 1582, 1572, 71, 1578,
+ 1573, 71, 1579, 71, 1583, 1575, 71, 2749, 1584, 1576,
+ 1589, 1585, 1586, 71, 71, 1577, 71, 71, 71, 1588,
+ 1580, 1581, 71, 1582, 71, 71, 1591, 1590, 1592, 1593,
+
+ 1594, 1583, 1596, 71, 71, 1584, 71, 1589, 1585, 1586,
+ 1595, 71, 71, 1597, 1599, 1598, 1588, 1600, 1603, 71,
+ 71, 1601, 71, 1591, 1590, 1592, 1605, 1594, 1602, 71,
+ 2749, 71, 1616, 1609, 2749, 1604, 71, 1595, 71, 71,
+ 1597, 1599, 1598, 71, 1600, 1603, 71, 71, 1601, 1606,
+ 1607, 1608, 1611, 71, 1610, 1602, 1612, 71, 1613, 71,
+ 71, 1614, 1604, 1615, 71, 71, 1618, 71, 1620, 71,
+ 71, 71, 71, 71, 1617, 71, 1606, 1607, 1608, 1611,
+ 1621, 1610, 1619, 1612, 1622, 1613, 1623, 1624, 1614, 71,
+ 1615, 1625, 1626, 1618, 1629, 71, 2749, 1627, 2749, 1630,
+
+ 1628, 1617, 2749, 71, 71, 71, 71, 1621, 71, 1619,
+ 1631, 71, 71, 1623, 1624, 71, 1634, 1635, 71, 71,
+ 1632, 1629, 1633, 71, 1627, 71, 1630, 1628, 1637, 71,
+ 1636, 71, 1638, 1639, 1641, 71, 1642, 1631, 71, 1643,
+ 71, 71, 1644, 1634, 1635, 71, 1640, 1632, 71, 1633,
+ 1645, 71, 1650, 1647, 71, 1637, 71, 1636, 1648, 1638,
+ 1639, 1641, 1646, 1642, 71, 71, 71, 1649, 1651, 1652,
+ 71, 1654, 1658, 1640, 71, 1653, 1661, 1645, 71, 1650,
+ 1647, 1655, 71, 1659, 1656, 1648, 1660, 1657, 1662, 1646,
+ 71, 1664, 71, 71, 1649, 71, 71, 1666, 71, 71,
+
+ 71, 1667, 1653, 1661, 1663, 1669, 71, 71, 1655, 1668,
+ 1659, 1656, 1674, 71, 1657, 1665, 1676, 71, 71, 71,
+ 71, 71, 1675, 71, 1666, 1670, 1671, 1672, 71, 71,
+ 1680, 1663, 1673, 1678, 1677, 71, 1668, 71, 1679, 1674,
+ 71, 71, 1665, 71, 1681, 1684, 1682, 2749, 71, 1675,
+ 2749, 1683, 1670, 1671, 1672, 1688, 1685, 1680, 1687, 1673,
+ 1686, 1677, 71, 71, 71, 71, 1690, 71, 1693, 71,
+ 1694, 1681, 1691, 1682, 71, 1689, 71, 71, 1683, 71,
+ 1696, 1692, 71, 1685, 1695, 1687, 71, 1686, 1697, 1700,
+ 1702, 71, 71, 1690, 71, 1693, 1698, 71, 1699, 1691,
+
+ 1701, 1703, 1689, 1705, 71, 1709, 71, 71, 1692, 1712,
+ 71, 1695, 71, 1707, 71, 1697, 71, 1702, 1711, 71,
+ 1704, 71, 1708, 1698, 71, 1699, 1710, 1701, 1703, 71,
+ 1705, 1706, 71, 71, 1713, 1714, 1716, 71, 71, 1724,
+ 1707, 71, 1715, 1717, 71, 1711, 1719, 1704, 1718, 1708,
+ 71, 1721, 1720, 1710, 71, 1723, 71, 2749, 1706, 2749,
+ 71, 71, 71, 1716, 71, 1725, 71, 1722, 71, 1715,
+ 1717, 71, 71, 1719, 1726, 1718, 71, 1727, 1721, 1720,
+ 1729, 71, 1723, 1730, 1731, 1733, 71, 71, 1734, 1732,
+ 1736, 71, 1725, 1728, 1722, 1735, 71, 71, 1737, 1740,
+
+ 71, 1726, 1746, 2749, 1727, 1743, 1749, 1729, 71, 71,
+ 1730, 1731, 1733, 71, 1738, 1734, 1732, 71, 1741, 1739,
+ 1728, 71, 1735, 1742, 71, 1737, 71, 71, 1744, 1748,
+ 71, 1745, 1743, 71, 71, 71, 71, 1747, 71, 1750,
+ 1751, 1738, 1754, 1752, 1755, 1741, 1739, 1756, 1753, 71,
+ 1742, 71, 1757, 1758, 1759, 1744, 1748, 1761, 1745, 71,
+ 1760, 71, 1762, 71, 1747, 71, 1750, 1751, 1763, 71,
+ 1752, 71, 71, 1764, 1765, 1753, 1766, 1767, 71, 71,
+ 1769, 1776, 2749, 71, 1761, 71, 71, 1760, 1768, 71,
+ 1770, 1771, 1773, 71, 71, 1763, 71, 1774, 1777, 1772,
+
+ 1764, 1765, 1775, 1766, 1778, 71, 71, 71, 71, 71,
+ 1779, 71, 71, 1780, 71, 1768, 1781, 1770, 1771, 1773,
+ 1782, 71, 1784, 1791, 1774, 71, 1772, 1783, 71, 1775,
+ 2749, 1778, 1785, 1786, 71, 1787, 1788, 1789, 71, 1792,
+ 1780, 71, 71, 1781, 71, 71, 1790, 1782, 71, 1784,
+ 71, 71, 71, 1793, 1783, 1794, 71, 71, 1795, 1785,
+ 1786, 71, 1787, 1788, 1789, 1796, 1792, 1798, 71, 1797,
+ 1799, 1801, 71, 1790, 2749, 71, 71, 71, 71, 1800,
+ 1793, 1802, 1794, 2749, 1804, 71, 2749, 71, 1803, 1807,
+ 1806, 1809, 1796, 71, 1798, 1805, 1797, 1799, 1801, 71,
+
+ 1808, 71, 71, 1812, 1810, 1813, 1800, 71, 1818, 71,
+ 71, 1804, 1814, 71, 1811, 1803, 1807, 1806, 1809, 71,
+ 1820, 1816, 1805, 71, 1815, 1817, 71, 1808, 71, 71,
+ 71, 1810, 1813, 71, 1819, 71, 1822, 1821, 71, 1814,
+ 71, 1811, 1827, 1825, 71, 1824, 71, 1820, 1816, 1823,
+ 71, 1815, 1817, 1826, 2749, 2749, 1829, 1832, 71, 1830,
+ 71, 1819, 71, 71, 1821, 71, 1831, 1828, 71, 1827,
+ 1825, 71, 1824, 71, 71, 1833, 1823, 1834, 1836, 71,
+ 1826, 71, 1837, 1829, 1832, 71, 1830, 71, 1838, 1840,
+ 1835, 1839, 2749, 1831, 1828, 1841, 71, 71, 71, 1842,
+
+ 71, 1843, 1833, 1844, 1834, 1836, 1845, 1847, 71, 1837,
+ 2749, 1846, 1848, 2749, 2749, 71, 1840, 1835, 1839, 71,
+ 71, 71, 1841, 1849, 1850, 71, 1842, 1853, 1843, 71,
+ 1844, 71, 71, 1845, 1847, 1852, 1854, 1851, 1846, 1848,
+ 71, 71, 71, 1855, 71, 1856, 1857, 1858, 2749, 1860,
+ 1849, 1850, 71, 1859, 1853, 1862, 1863, 1868, 71, 1861,
+ 71, 1872, 1852, 71, 1851, 1864, 71, 71, 2749, 71,
+ 1855, 71, 1856, 1857, 1858, 71, 1860, 1865, 71, 71,
+ 1859, 1866, 1867, 1863, 71, 1869, 1861, 71, 1870, 71,
+ 1871, 1873, 1864, 71, 1874, 71, 71, 71, 2749, 1877,
+
+ 71, 1878, 2749, 1879, 1865, 1880, 1875, 2749, 1866, 1867,
+ 1884, 71, 1869, 71, 1876, 1870, 71, 1871, 1873, 71,
+ 1881, 1874, 2749, 2749, 1882, 71, 71, 1883, 1878, 71,
+ 1879, 71, 1880, 1875, 1885, 71, 2749, 1884, 71, 1886,
+ 71, 1876, 71, 1889, 1887, 1888, 1891, 1881, 1893, 1890,
+ 1894, 1882, 1892, 1895, 1883, 1898, 1896, 71, 71, 2749,
+ 1897, 1885, 71, 71, 71, 71, 71, 1903, 71, 71,
+ 1889, 71, 1888, 1891, 71, 1893, 1890, 1894, 1899, 1892,
+ 71, 1900, 1898, 1896, 1901, 1902, 1907, 1897, 1904, 71,
+ 2749, 71, 1909, 71, 1903, 1912, 1905, 1908, 1914, 71,
+
+ 71, 71, 1911, 1913, 71, 1899, 1917, 71, 1900, 1906,
+ 71, 1901, 1902, 1907, 1910, 1904, 71, 71, 1915, 1909,
+ 71, 71, 71, 1905, 1908, 71, 71, 1916, 71, 1911,
+ 1913, 1921, 1918, 1917, 1919, 1922, 1906, 1923, 1924, 1920,
+ 1935, 1910, 1925, 1926, 2749, 1915, 71, 2749, 1927, 71,
+ 71, 1931, 1938, 1930, 1916, 1932, 1940, 71, 2749, 1918,
+ 1937, 71, 1928, 71, 1923, 1924, 71, 71, 1933, 1925,
+ 71, 71, 71, 1929, 71, 1927, 1934, 1936, 71, 71,
+ 1930, 71, 1932, 71, 1939, 71, 71, 1937, 71, 1928,
+ 1941, 1942, 1943, 1946, 1944, 1933, 71, 71, 71, 71,
+
+ 1929, 1945, 1947, 1934, 1936, 1948, 71, 1949, 1951, 1954,
+ 2749, 1939, 2041, 71, 71, 71, 71, 1941, 1942, 1943,
+ 1946, 1944, 1950, 71, 1952, 1953, 1956, 71, 1945, 1947,
+ 1959, 71, 1948, 71, 1949, 71, 1954, 71, 1955, 71,
+ 1957, 71, 1958, 1960, 71, 2749, 1961, 71, 71, 1950,
+ 1962, 1952, 1953, 1956, 71, 1963, 1967, 71, 71, 71,
+ 1964, 1970, 71, 71, 71, 1955, 1965, 1957, 1969, 1958,
+ 1960, 71, 1966, 1961, 71, 1968, 1971, 1962, 71, 1973,
+ 71, 71, 1963, 1967, 1972, 2749, 1975, 1964, 71, 1976,
+ 1974, 1977, 71, 1965, 1980, 1969, 1978, 1983, 71, 1966,
+
+ 71, 1979, 1968, 1971, 71, 1984, 1973, 1981, 71, 1985,
+ 1982, 1972, 71, 1975, 1989, 71, 71, 1974, 71, 1986,
+ 71, 1980, 1987, 1978, 71, 71, 71, 71, 1979, 71,
+ 1988, 71, 1984, 1990, 1981, 1991, 1985, 1982, 1992, 1993,
+ 1994, 71, 1995, 71, 1996, 71, 1986, 1997, 71, 1987,
+ 1998, 1999, 2001, 2000, 71, 2003, 2002, 1988, 2007, 71,
+ 71, 2004, 1991, 71, 71, 71, 1993, 71, 2005, 1995,
+ 71, 71, 2006, 2008, 71, 71, 2009, 1998, 1999, 71,
+ 2000, 2011, 71, 2002, 71, 2007, 2010, 2013, 2004, 71,
+ 2012, 2749, 2017, 71, 71, 2005, 71, 2014, 71, 2006,
+
+ 2008, 2015, 2018, 71, 71, 71, 2016, 2022, 2011, 2020,
+ 2021, 2024, 2019, 2010, 71, 71, 2023, 2012, 71, 2017,
+ 71, 71, 71, 71, 2014, 2026, 71, 2025, 2015, 71,
+ 2027, 71, 2028, 2016, 71, 2029, 2020, 2021, 2024, 2019,
+ 71, 2030, 2032, 2023, 2033, 2034, 2031, 71, 71, 2035,
+ 71, 2043, 2026, 2749, 2025, 2037, 71, 2027, 2040, 2028,
+ 71, 71, 2029, 71, 71, 2038, 71, 2039, 2030, 2032,
+ 71, 2033, 2034, 2031, 2036, 2042, 2035, 71, 2044, 2046,
+ 71, 71, 2037, 71, 2045, 2040, 71, 71, 2052, 71,
+ 2047, 2048, 2038, 71, 2039, 2049, 2050, 2051, 2053, 2057,
+
+ 71, 2036, 2042, 2056, 2749, 2044, 2046, 2749, 71, 71,
+ 71, 2045, 2054, 71, 71, 2055, 2749, 2047, 2048, 71,
+ 71, 71, 2049, 2050, 2051, 2053, 2058, 2064, 2065, 71,
+ 2056, 71, 2066, 71, 2059, 2062, 2060, 2063, 2061, 2054,
+ 71, 2067, 2055, 71, 2075, 2069, 71, 2068, 71, 2071,
+ 71, 2070, 71, 2058, 71, 2065, 71, 71, 71, 2066,
+ 2072, 2059, 2062, 2060, 2063, 2061, 71, 2076, 2067, 2074,
+ 2073, 71, 2069, 71, 2068, 2077, 2071, 71, 2070, 2078,
+ 2080, 2081, 71, 2079, 71, 2749, 2749, 2072, 2082, 2749,
+ 2084, 2083, 2085, 71, 2076, 2086, 2074, 2073, 2088, 2091,
+
+ 2089, 2087, 71, 71, 71, 71, 2078, 71, 71, 71,
+ 2079, 2090, 71, 71, 2092, 71, 71, 2084, 2083, 2085,
+ 2095, 2093, 2086, 71, 71, 2088, 71, 2089, 2087, 2096,
+ 2094, 2099, 2100, 2097, 2103, 71, 71, 71, 2090, 71,
+ 71, 2092, 2098, 71, 71, 2101, 2102, 2095, 2093, 71,
+ 2104, 71, 71, 2105, 2106, 71, 2096, 2094, 2099, 2100,
+ 2097, 2107, 71, 2108, 2110, 71, 71, 2109, 71, 2098,
+ 2112, 71, 2101, 2102, 2111, 2113, 2119, 2104, 2114, 71,
+ 2105, 2106, 2115, 71, 2116, 2117, 71, 71, 2107, 71,
+ 2128, 2110, 2120, 2121, 2109, 71, 71, 2112, 2118, 71,
+
+ 2749, 2111, 2113, 71, 2124, 2114, 2122, 71, 71, 2115,
+ 71, 2116, 2125, 71, 2123, 71, 2126, 71, 2127, 2120,
+ 71, 2129, 71, 2131, 2130, 2118, 71, 71, 71, 2133,
+ 2132, 2124, 2135, 2122, 71, 71, 2136, 71, 2134, 2125,
+ 2137, 2123, 2140, 71, 2749, 71, 2138, 71, 2129, 2139,
+ 2131, 2130, 71, 71, 71, 71, 2133, 2132, 2141, 71,
+ 2143, 71, 2142, 2136, 2144, 2134, 71, 2148, 2145, 71,
+ 2146, 71, 71, 2138, 2147, 2149, 2139, 2150, 2151, 2152,
+ 71, 2153, 2154, 2155, 71, 2141, 71, 2143, 71, 2142,
+ 71, 71, 71, 2158, 2148, 2145, 2156, 2146, 2157, 71,
+
+ 71, 2147, 2149, 2159, 2150, 2151, 71, 71, 71, 71,
+ 71, 71, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 71,
+ 2158, 71, 2167, 2156, 2222, 2157, 71, 71, 71, 71,
+ 2159, 2168, 2169, 2171, 2173, 2749, 2174, 71, 2749, 2160,
+ 2161, 2162, 2163, 71, 71, 71, 2170, 71, 2180, 2167,
+ 2172, 71, 2177, 71, 71, 71, 71, 71, 2168, 2169,
+ 2171, 71, 2176, 2174, 2175, 71, 71, 2178, 2179, 71,
+ 71, 2182, 2181, 2170, 71, 2180, 2183, 2172, 2184, 2177,
+ 2185, 71, 2186, 71, 2187, 71, 71, 71, 71, 2176,
+ 71, 2175, 2189, 2188, 2178, 2179, 2190, 2191, 2182, 2181,
+
+ 2192, 2749, 2193, 2183, 2194, 2184, 71, 2185, 71, 2186,
+ 2195, 2187, 2196, 2749, 71, 2199, 2197, 2198, 71, 2189,
+ 2188, 71, 71, 2190, 71, 71, 2200, 71, 71, 2193,
+ 71, 2194, 71, 2201, 2202, 71, 71, 2195, 71, 2196,
+ 2203, 71, 2199, 2197, 2198, 2204, 2205, 2749, 2206, 2207,
+ 2209, 2208, 71, 2200, 2210, 71, 71, 2211, 71, 2220,
+ 2201, 2202, 2212, 2214, 2749, 2749, 2221, 2203, 71, 2749,
+ 2213, 71, 2204, 2205, 71, 2206, 71, 2209, 2208, 71,
+ 2215, 71, 2216, 71, 71, 2217, 71, 2218, 2219, 2212,
+ 2214, 71, 71, 71, 71, 2223, 71, 2213, 71, 2224,
+
+ 2225, 2226, 2229, 2227, 71, 2231, 2228, 2215, 71, 2216,
+ 71, 71, 2217, 71, 2218, 2219, 2230, 2232, 2233, 2235,
+ 2749, 2749, 2223, 71, 71, 2749, 2224, 2225, 2226, 2229,
+ 2227, 2234, 71, 2228, 2241, 2749, 2240, 71, 2242, 71,
+ 2236, 71, 71, 2230, 2232, 71, 2235, 2237, 71, 2238,
+ 71, 2244, 2239, 2243, 71, 2248, 2246, 71, 2234, 71,
+ 71, 71, 71, 2240, 2245, 2242, 2247, 2236, 71, 2252,
+ 2249, 2253, 2254, 2256, 2237, 2749, 2238, 2259, 71, 2239,
+ 2243, 2250, 71, 2246, 71, 2251, 71, 71, 71, 71,
+ 2749, 2245, 71, 2247, 2255, 2257, 71, 2249, 2253, 71,
+
+ 71, 2258, 71, 2260, 71, 2261, 2262, 2264, 2250, 2263,
+ 71, 2266, 2251, 2265, 2267, 2268, 71, 71, 2749, 2749,
+ 71, 2255, 2257, 71, 2270, 71, 71, 2275, 2258, 71,
+ 2260, 71, 2261, 2262, 2264, 2269, 2263, 71, 71, 2271,
+ 2265, 2267, 2268, 2274, 2272, 2273, 71, 2276, 71, 71,
+ 2278, 2270, 71, 2277, 2275, 71, 2279, 2284, 71, 2280,
+ 2281, 2749, 2269, 2285, 71, 71, 2271, 2282, 2289, 71,
+ 2274, 2272, 2273, 2286, 2276, 2283, 71, 71, 2290, 71,
+ 2277, 2287, 71, 71, 71, 71, 2280, 2281, 2288, 71,
+ 2285, 2292, 2291, 71, 2282, 71, 2293, 2749, 2294, 71,
+
+ 2286, 2298, 2283, 2295, 2296, 71, 71, 2297, 2287, 2299,
+ 71, 2749, 2749, 2300, 2749, 2288, 2302, 2749, 71, 2291,
+ 71, 2301, 2303, 2293, 2304, 2306, 71, 2305, 71, 71,
+ 71, 2296, 71, 71, 2297, 71, 2299, 2307, 2308, 71,
+ 2300, 71, 71, 2302, 2309, 2312, 71, 71, 2301, 2303,
+ 2310, 2304, 2306, 2311, 2305, 2313, 2749, 2314, 2315, 71,
+ 71, 71, 2316, 71, 2307, 2308, 71, 71, 2317, 2319,
+ 71, 2309, 2312, 71, 2321, 71, 71, 2310, 2318, 2320,
+ 2311, 2322, 2313, 71, 2314, 2315, 71, 71, 2323, 2316,
+ 2324, 2325, 71, 71, 2328, 2317, 71, 2326, 71, 2327,
+
+ 2329, 2321, 2330, 71, 71, 2318, 2320, 2333, 2322, 2331,
+ 2336, 2332, 2335, 2334, 2339, 71, 2338, 2324, 2325, 2337,
+ 2340, 71, 71, 71, 2326, 71, 2327, 71, 71, 71,
+ 2341, 71, 71, 71, 2333, 71, 2331, 2336, 2332, 2335,
+ 2334, 71, 71, 2338, 2342, 2343, 2337, 71, 2344, 2346,
+ 2749, 2347, 71, 2345, 2348, 2349, 71, 71, 2352, 2350,
+ 2351, 2353, 2749, 2354, 2355, 2357, 2358, 71, 2360, 2749,
+ 2361, 71, 2343, 2749, 71, 71, 2346, 71, 2347, 2362,
+ 71, 71, 71, 71, 2356, 2352, 2350, 2351, 71, 71,
+ 2354, 71, 71, 2358, 2359, 2365, 71, 71, 2363, 71,
+
+ 71, 2366, 71, 2364, 2368, 2367, 2362, 71, 71, 2369,
+ 2371, 2356, 71, 2370, 2749, 71, 2372, 2373, 2375, 2374,
+ 2749, 2359, 2365, 2377, 2376, 71, 71, 2381, 2366, 2749,
+ 71, 2368, 2367, 71, 2380, 2384, 71, 2371, 71, 71,
+ 2370, 71, 71, 71, 2373, 2375, 2374, 71, 2378, 2379,
+ 2377, 2376, 2382, 2383, 2381, 2385, 71, 2394, 71, 71,
+ 2387, 2380, 71, 71, 2386, 2388, 71, 2390, 71, 2389,
+ 2749, 2391, 2749, 2392, 2401, 2378, 2379, 71, 2393, 2382,
+ 2383, 2395, 2385, 71, 2394, 2397, 71, 2402, 2396, 2398,
+ 2404, 2386, 71, 71, 2390, 71, 2389, 71, 2391, 71,
+
+ 2392, 71, 2399, 71, 71, 2393, 2400, 71, 2395, 71,
+ 2403, 71, 2397, 71, 2402, 2396, 2398, 71, 2405, 71,
+ 2406, 2407, 2408, 2409, 2410, 2749, 2414, 2413, 2412, 2399,
+ 2411, 2415, 71, 2400, 2417, 2418, 2749, 2403, 71, 71,
+ 71, 2749, 2416, 71, 2749, 2405, 71, 71, 2407, 2408,
+ 2409, 71, 71, 71, 2413, 2412, 71, 2411, 71, 2419,
+ 2420, 2417, 71, 2422, 2421, 71, 2423, 2424, 71, 2416,
+ 2425, 2426, 2749, 2427, 71, 2428, 2433, 71, 71, 71,
+ 2431, 2429, 2430, 2432, 71, 71, 2419, 2420, 2434, 2435,
+ 2422, 2421, 2440, 2423, 2424, 71, 2436, 2425, 2426, 71,
+
+ 2427, 71, 2428, 71, 71, 2437, 71, 2431, 2429, 2430,
+ 2432, 2438, 71, 2439, 71, 71, 71, 2441, 2443, 71,
+ 2442, 2444, 2445, 2436, 71, 2447, 2448, 2450, 71, 2446,
+ 71, 2749, 2437, 2454, 71, 71, 2749, 2749, 2438, 71,
+ 2439, 2449, 71, 71, 2441, 71, 2749, 2442, 2444, 2445,
+ 2452, 71, 2447, 2451, 71, 2455, 2446, 2453, 71, 2456,
+ 71, 71, 71, 2458, 71, 2457, 2460, 2459, 2449, 71,
+ 2461, 2749, 2464, 71, 71, 2465, 2462, 2452, 71, 2466,
+ 2451, 71, 2455, 71, 2453, 2467, 2456, 2469, 71, 71,
+ 2458, 2471, 2457, 2460, 2459, 2463, 71, 2461, 71, 71,
+
+ 2470, 2468, 2465, 2462, 2472, 2474, 71, 71, 2473, 71,
+ 2476, 71, 71, 71, 71, 71, 2475, 2477, 2471, 2478,
+ 2479, 2480, 2463, 2481, 71, 71, 2482, 2470, 2468, 2490,
+ 71, 71, 2474, 71, 2485, 2473, 71, 2476, 2483, 2488,
+ 2491, 71, 2486, 2475, 2477, 2492, 2478, 2479, 71, 71,
+ 71, 2487, 71, 2482, 71, 2489, 71, 2484, 2493, 71,
+ 2495, 2485, 71, 2494, 71, 71, 2488, 2491, 2496, 2486,
+ 71, 71, 2492, 71, 2497, 2498, 2749, 2499, 2487, 2502,
+ 2503, 2500, 2489, 2501, 2484, 2493, 71, 71, 2506, 2507,
+ 2494, 2510, 71, 2509, 2508, 71, 2511, 2512, 71, 2504,
+
+ 2505, 2497, 71, 71, 2499, 71, 2502, 71, 2500, 71,
+ 2501, 71, 71, 2514, 2515, 71, 71, 2513, 71, 71,
+ 2509, 2508, 2516, 71, 2512, 2517, 2504, 2505, 2518, 2519,
+ 71, 2520, 2521, 2749, 2522, 71, 2523, 71, 2524, 71,
+ 2514, 71, 2527, 2530, 2513, 2529, 2525, 2531, 2526, 71,
+ 71, 71, 71, 71, 2528, 2518, 71, 2533, 2520, 2521,
+ 71, 2522, 71, 71, 2532, 2524, 71, 71, 2534, 71,
+ 71, 2535, 2529, 2525, 71, 2526, 2537, 71, 2536, 2538,
+ 2539, 2528, 2540, 71, 2749, 2542, 71, 71, 2543, 71,
+ 2541, 2532, 2544, 2749, 2545, 2534, 71, 71, 71, 71,
+
+ 71, 71, 71, 2537, 71, 2536, 2538, 2539, 2551, 2540,
+ 2550, 71, 2542, 2546, 2547, 2543, 71, 2541, 2553, 2544,
+ 2552, 2545, 71, 2548, 2549, 71, 2554, 71, 2555, 2556,
+ 71, 2557, 71, 71, 2558, 2551, 2561, 2550, 2559, 2560,
+ 2546, 2547, 2562, 2565, 2566, 2553, 2567, 2552, 2563, 2564,
+ 2548, 2549, 71, 71, 2568, 71, 2556, 71, 71, 71,
+ 2569, 71, 71, 2561, 2571, 71, 71, 71, 2572, 71,
+ 2565, 71, 71, 2567, 2570, 2563, 2564, 71, 2573, 2574,
+ 2575, 2568, 71, 71, 2579, 2577, 2576, 2569, 2578, 2580,
+ 2581, 2571, 71, 2584, 71, 2572, 2582, 2583, 71, 71,
+
+ 2588, 2570, 2590, 71, 2585, 71, 71, 2575, 71, 71,
+ 2586, 2587, 2577, 2576, 2589, 2578, 71, 2591, 2592, 71,
+ 2584, 2593, 71, 2582, 2583, 2594, 71, 71, 2595, 71,
+ 2597, 2585, 71, 2596, 2598, 2599, 71, 2586, 2587, 2600,
+ 71, 2589, 2601, 71, 71, 71, 71, 2602, 71, 2603,
+ 71, 2604, 2594, 2606, 71, 71, 2609, 71, 71, 2607,
+ 2596, 2598, 2599, 2605, 71, 71, 2600, 2608, 71, 2601,
+ 2610, 2611, 2617, 2612, 71, 71, 2603, 2615, 2604, 71,
+ 2606, 71, 2616, 71, 2614, 2619, 2607, 2613, 71, 71,
+ 2605, 71, 2749, 71, 2608, 71, 71, 2610, 2611, 71,
+
+ 2612, 2618, 2621, 2620, 2615, 71, 71, 2623, 71, 2616,
+ 71, 2614, 2619, 2622, 2613, 71, 2624, 71, 2629, 2625,
+ 2626, 2749, 2627, 71, 2630, 2628, 71, 2749, 2618, 2621,
+ 2620, 2631, 71, 71, 2623, 2632, 2637, 71, 71, 71,
+ 2622, 2633, 71, 2624, 71, 2629, 2625, 2626, 71, 2627,
+ 2634, 2630, 2628, 71, 2635, 2638, 71, 2636, 2631, 2639,
+ 2641, 71, 2632, 71, 2640, 2642, 2643, 2646, 2633, 2644,
+ 71, 2645, 2650, 71, 71, 2647, 71, 2634, 2648, 2653,
+ 71, 2635, 2638, 2657, 2636, 2661, 71, 71, 2649, 71,
+ 71, 2640, 71, 2643, 2646, 71, 2644, 71, 2645, 2651,
+
+ 71, 2652, 2647, 2654, 71, 2648, 71, 2655, 71, 2656,
+ 71, 71, 71, 2658, 2659, 2649, 2660, 71, 71, 71,
+ 2662, 2665, 2663, 2664, 71, 2749, 2651, 2666, 2652, 71,
+ 2654, 2667, 2668, 71, 2655, 71, 2656, 71, 71, 71,
+ 2658, 2659, 2669, 2660, 2670, 71, 2671, 2672, 2665, 2663,
+ 2664, 71, 71, 2673, 71, 71, 2674, 2676, 2667, 2668,
+ 2677, 2680, 2682, 2683, 2675, 71, 2678, 71, 71, 2669,
+ 71, 2670, 71, 2671, 2672, 71, 2681, 2679, 2684, 71,
+ 2673, 2749, 71, 2674, 2676, 71, 2685, 2677, 71, 71,
+ 2683, 2675, 2686, 2678, 71, 2688, 2689, 2690, 71, 2687,
+
+ 71, 2692, 2691, 2681, 2679, 2684, 2696, 71, 71, 71,
+ 2693, 2749, 2694, 2685, 71, 2749, 2699, 2698, 71, 2686,
+ 71, 2700, 2749, 2689, 71, 71, 2687, 71, 2692, 2691,
+ 71, 71, 2695, 2697, 2703, 2708, 2706, 2693, 71, 2694,
+ 71, 71, 71, 2699, 2698, 2704, 2701, 2705, 71, 2702,
+ 71, 2707, 2709, 71, 2711, 71, 71, 71, 2713, 2695,
+ 2697, 2703, 2708, 2706, 71, 2714, 71, 2710, 71, 2716,
+ 2718, 2715, 2704, 2701, 2705, 2712, 2702, 71, 2707, 2709,
+ 71, 2711, 2717, 71, 71, 2713, 2719, 2720, 2721, 71,
+ 71, 71, 2714, 71, 2710, 2724, 2716, 71, 2715, 2722,
+
+ 2723, 2725, 2712, 71, 2727, 2749, 2749, 2729, 71, 2717,
+ 2726, 2730, 71, 2719, 2720, 71, 2728, 2731, 71, 71,
+ 71, 2733, 2724, 71, 71, 71, 2722, 2723, 2725, 71,
+ 2734, 71, 2732, 71, 2729, 2737, 2738, 2726, 2730, 2740,
+ 71, 2735, 2736, 2728, 2731, 2739, 2741, 71, 2733, 71,
+ 71, 2742, 2743, 2744, 2747, 2748, 2745, 71, 2749, 2732,
+ 2749, 71, 2737, 71, 71, 71, 71, 2749, 2735, 2736,
+ 2749, 71, 2739, 71, 71, 71, 2746, 2749, 2742, 2743,
+ 2744, 71, 71, 2745, 71, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+
+ 2749, 2749, 2749, 2746, 43, 43, 43, 43, 43, 43,
+ 43, 48, 48, 48, 48, 48, 48, 48, 53, 53,
+ 53, 53, 53, 53, 53, 59, 59, 59, 59, 59,
+ 59, 59, 64, 64, 64, 64, 64, 64, 64, 74,
+ 74, 2749, 74, 74, 74, 74, 140, 140, 2749, 2749,
+ 2749, 140, 140, 142, 142, 2749, 2749, 142, 2749, 142,
+ 144, 2749, 2749, 2749, 2749, 2749, 144, 147, 147, 2749,
+ 2749, 2749, 147, 147, 149, 2749, 2749, 2749, 2749, 2749,
+ 149, 151, 151, 2749, 151, 151, 151, 151, 75, 75,
+ 2749, 75, 75, 75, 75, 13, 2749, 2749, 2749, 2749,
+
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749
} ;
-static yyconst flex_int16_t yy_chk[7571] =
+static yyconst flex_int16_t yy_chk[7963] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -2145,10 +2227,10 @@ static yyconst flex_int16_t yy_chk[7571] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 3, 3, 3, 4,
4, 4, 5, 5, 6, 6, 5, 28, 6, 7,
- 7, 7, 7, 2637, 7, 8, 8, 8, 8, 28,
+ 7, 7, 7, 2755, 7, 8, 8, 8, 8, 28,
8, 9, 9, 9, 10, 10, 10, 15, 21, 24,
- 906, 15, 30, 3, 28, 149, 4, 47, 47, 5,
+ 930, 15, 30, 3, 28, 149, 4, 47, 47, 5,
19, 6, 19, 19, 30, 19, 72, 7, 147, 24,
72, 19, 24, 8, 21, 21, 24, 29, 9, 30,
25, 10, 11, 11, 11, 11, 11, 11, 12, 12,
@@ -2247,728 +2329,772 @@ static yyconst flex_int16_t yy_chk[7571] =
278, 270, 276, 277, 287, 268, 275, 270, 279, 272,
273, 270, 271, 271, 272, 274, 280, 277, 281, 286,
- 282, 0, 283, 276, 275, 280, 278, 278, 270, 282,
+ 282, 807, 283, 276, 275, 280, 278, 278, 270, 282,
277, 284, 279, 285, 286, 279, 287, 288, 289, 0,
- 284, 281, 292, 280, 291, 281, 286, 282, 283, 283,
- 0, 292, 293, 289, 294, 0, 0, 285, 284, 290,
- 285, 288, 291, 299, 288, 289, 295, 290, 290, 292,
- 290, 291, 294, 296, 293, 0, 0, 290, 294, 293,
- 295, 294, 297, 297, 301, 302, 290, 299, 296, 304,
- 299, 305, 308, 295, 290, 290, 301, 290, 300, 294,
- 296, 300, 303, 302, 306, 307, 309, 297, 300, 297,
- 297, 301, 302, 305, 308, 310, 304, 307, 305, 308,
-
- 303, 309, 898, 310, 312, 300, 313, 311, 300, 303,
- 306, 306, 307, 309, 311, 315, 312, 314, 316, 317,
- 320, 318, 310, 0, 314, 0, 0, 318, 319, 323,
- 319, 312, 898, 320, 311, 345, 345, 315, 313, 0,
- 321, 317, 315, 318, 314, 322, 317, 320, 318, 324,
- 316, 325, 319, 321, 318, 319, 321, 319, 321, 325,
- 788, 323, 345, 322, 321, 325, 327, 321, 328, 329,
- 335, 324, 322, 327, 328, 0, 324, 330, 325, 333,
- 321, 329, 335, 321, 332, 321, 325, 326, 347, 326,
- 330, 788, 333, 327, 336, 328, 329, 335, 337, 338,
-
- 332, 347, 326, 337, 330, 326, 333, 326, 332, 326,
- 344, 332, 336, 326, 326, 347, 326, 339, 349, 341,
- 338, 336, 349, 339, 0, 340, 338, 332, 346, 326,
- 337, 341, 326, 340, 326, 346, 326, 334, 334, 342,
- 343, 0, 344, 355, 339, 349, 341, 334, 343, 334,
- 334, 334, 340, 350, 334, 346, 351, 342, 352, 348,
- 350, 354, 334, 351, 334, 334, 342, 343, 348, 357,
- 352, 353, 356, 354, 334, 355, 334, 334, 334, 356,
- 350, 334, 362, 351, 357, 352, 359, 358, 354, 369,
- 360, 348, 360, 353, 361, 348, 357, 365, 353, 356,
-
- 358, 363, 363, 0, 362, 361, 364, 367, 365, 362,
- 368, 366, 369, 364, 358, 371, 369, 360, 359, 372,
- 367, 361, 366, 374, 365, 370, 377, 381, 373, 0,
- 363, 372, 374, 364, 367, 368, 375, 368, 366, 373,
- 370, 371, 371, 376, 377, 379, 372, 378, 370, 375,
- 374, 385, 370, 377, 376, 373, 376, 380, 382, 381,
- 0, 376, 392, 375, 382, 383, 384, 370, 379, 378,
- 376, 387, 379, 385, 378, 380, 388, 389, 385, 391,
- 386, 376, 390, 376, 380, 382, 383, 386, 393, 384,
- 388, 395, 383, 384, 392, 394, 390, 387, 387, 389,
-
- 402, 394, 396, 388, 389, 391, 391, 386, 397, 390,
- 398, 393, 399, 395, 403, 393, 400, 398, 395, 401,
- 396, 399, 394, 397, 404, 409, 402, 402, 405, 396,
- 404, 400, 407, 412, 408, 397, 403, 398, 410, 399,
- 408, 403, 401, 400, 409, 1000, 401, 417, 412, 418,
- 411, 404, 409, 416, 405, 405, 410, 411, 407, 407,
- 412, 408, 414, 415, 414, 410, 416, 418, 419, 421,
- 415, 414, 420, 1000, 423, 427, 418, 411, 422, 417,
- 416, 422, 421, 425, 0, 424, 426, 467, 427, 414,
- 415, 414, 424, 428, 420, 430, 421, 422, 429, 420,
-
- 419, 430, 427, 429, 431, 422, 423, 425, 422, 426,
- 425, 432, 424, 434, 433, 428, 436, 435, 426, 467,
- 428, 439, 430, 0, 436, 429, 433, 431, 435, 439,
- 438, 431, 441, 432, 442, 434, 426, 438, 432, 443,
- 434, 433, 440, 436, 435, 437, 444, 445, 439, 446,
- 437, 443, 437, 440, 448, 441, 442, 438, 445, 441,
- 437, 442, 449, 437, 437, 448, 443, 446, 444, 440,
- 437, 437, 437, 444, 445, 447, 446, 437, 451, 437,
- 0, 448, 452, 455, 452, 447, 449, 437, 450, 449,
- 437, 437, 453, 457, 454, 450, 456, 437, 455, 460,
-
- 459, 457, 462, 0, 451, 451, 454, 447, 456, 452,
- 455, 458, 447, 463, 462, 450, 458, 460, 453, 453,
- 457, 454, 459, 456, 461, 465, 460, 459, 470, 462,
- 466, 468, 461, 469, 463, 471, 470, 472, 458, 478,
- 463, 473, 474, 465, 477, 469, 468, 475, 471, 472,
- 473, 461, 465, 466, 476, 470, 479, 466, 468, 481,
- 469, 475, 471, 477, 472, 474, 478, 480, 473, 474,
- 482, 477, 483, 485, 475, 484, 493, 486, 488, 476,
- 496, 476, 480, 491, 492, 482, 494, 484, 479, 488,
- 495, 481, 531, 489, 480, 485, 483, 482, 489, 483,
-
- 485, 486, 484, 487, 486, 488, 487, 490, 493, 497,
- 491, 492, 496, 494, 487, 497, 498, 495, 499, 531,
- 500, 490, 501, 502, 503, 489, 499, 502, 505, 504,
- 487, 506, 503, 487, 490, 507, 497, 508, 498, 500,
- 510, 509, 512, 498, 507, 499, 501, 500, 509, 501,
- 502, 503, 504, 511, 506, 512, 504, 515, 506, 508,
- 505, 513, 507, 522, 508, 514, 513, 516, 509, 512,
- 513, 521, 510, 517, 514, 511, 516, 518, 519, 0,
- 511, 522, 523, 515, 515, 513, 520, 528, 513, 524,
- 522, 519, 514, 513, 516, 517, 525, 513, 520, 518,
-
- 517, 528, 526, 521, 518, 519, 523, 532, 527, 523,
- 529, 524, 524, 520, 528, 530, 524, 533, 525, 527,
- 535, 534, 530, 525, 526, 532, 536, 537, 533, 526,
- 541, 538, 529, 542, 532, 527, 534, 529, 524, 539,
- 540, 543, 530, 541, 533, 544, 545, 536, 534, 540,
- 551, 537, 535, 536, 537, 538, 546, 541, 538, 547,
- 548, 539, 549, 543, 547, 542, 539, 540, 543, 556,
- 545, 550, 550, 545, 548, 553, 549, 544, 546, 550,
- 552, 554, 551, 546, 558, 555, 0, 548, 552, 549,
- 557, 547, 559, 553, 560, 0, 0, 559, 550, 550,
-
- 555, 556, 553, 554, 562, 557, 558, 552, 554, 555,
- 563, 558, 555, 561, 564, 561, 565, 557, 563, 566,
- 560, 560, 568, 567, 559, 565, 569, 555, 566, 562,
- 568, 562, 567, 569, 570, 572, 571, 563, 577, 564,
- 561, 564, 573, 565, 574, 575, 566, 572, 578, 568,
- 567, 573, 574, 569, 571, 576, 578, 570, 579, 581,
- 575, 570, 572, 571, 580, 582, 579, 576, 581, 573,
- 577, 574, 575, 584, 582, 578, 585, 0, 586, 583,
- 0, 584, 576, 589, 587, 579, 581, 580, 583, 585,
- 588, 580, 582, 590, 592, 593, 594, 591, 588, 589,
-
- 584, 601, 592, 585, 586, 586, 583, 587, 591, 593,
- 589, 587, 595, 596, 597, 590, 594, 588, 599, 601,
- 590, 592, 593, 594, 591, 598, 600, 599, 601, 602,
- 603, 606, 605, 596, 595, 604, 597, 607, 608, 595,
- 596, 597, 602, 609, 613, 599, 600, 598, 603, 615,
- 604, 608, 598, 600, 605, 606, 602, 603, 606, 605,
- 607, 609, 604, 610, 607, 608, 611, 612, 619, 614,
- 609, 613, 618, 612, 616, 610, 615, 614, 620, 611,
- 618, 624, 622, 621, 625, 620, 0, 0, 0, 623,
- 610, 645, 616, 611, 612, 614, 614, 622, 623, 618,
-
- 619, 616, 637, 625, 614, 620, 621, 631, 626, 622,
- 621, 625, 627, 624, 627, 628, 623, 626, 634, 631,
- 637, 639, 628, 645, 642, 638, 0, 640, 634, 637,
- 0, 0, 641, 0, 631, 626, 643, 651, 0, 627,
- 642, 652, 628, 629, 639, 634, 638, 629, 639, 643,
- 629, 642, 638, 640, 640, 644, 647, 629, 641, 641,
- 629, 651, 644, 643, 651, 629, 648, 0, 652, 0,
- 629, 649, 648, 650, 629, 650, 653, 629, 647, 677,
- 649, 654, 644, 647, 629, 655, 658, 629, 646, 646,
- 0, 646, 0, 648, 646, 657, 653, 655, 649, 646,
-
- 650, 656, 659, 653, 661, 646, 646, 654, 654, 660,
- 658, 677, 655, 658, 646, 646, 646, 657, 646, 661,
- 663, 646, 657, 667, 659, 666, 646, 656, 656, 659,
- 662, 661, 646, 646, 660, 664, 660, 665, 662, 668,
- 669, 671, 664, 663, 666, 665, 670, 663, 672, 667,
- 667, 668, 666, 669, 673, 670, 671, 662, 674, 678,
- 676, 679, 664, 674, 665, 680, 668, 669, 671, 683,
- 672, 686, 684, 670, 681, 672, 682, 685, 683, 686,
- 687, 673, 676, 690, 688, 679, 680, 676, 679, 689,
- 674, 678, 680, 681, 684, 682, 683, 685, 686, 684,
-
- 693, 681, 688, 682, 685, 691, 694, 687, 689, 695,
- 696, 688, 698, 691, 697, 690, 689, 699, 693, 700,
- 0, 700, 701, 702, 694, 0, 709, 693, 696, 704,
- 699, 695, 691, 694, 698, 702, 695, 696, 697, 698,
- 708, 697, 705, 703, 699, 705, 700, 704, 701, 701,
- 702, 703, 706, 709, 0, 710, 704, 712, 711, 713,
- 706, 710, 0, 712, 714, 708, 713, 708, 715, 705,
- 703, 714, 717, 715, 716, 718, 706, 0, 722, 706,
- 711, 716, 710, 719, 712, 711, 713, 706, 720, 721,
- 717, 714, 719, 722, 726, 715, 720, 725, 718, 717,
-
- 723, 716, 718, 733, 724, 722, 727, 721, 723, 731,
- 719, 728, 729, 727, 731, 720, 721, 724, 725, 729,
- 738, 726, 735, 730, 725, 732, 737, 723, 734, 728,
- 730, 724, 732, 727, 739, 733, 731, 736, 728, 729,
- 741, 734, 739, 738, 736, 740, 745, 738, 743, 744,
- 730, 742, 732, 740, 735, 734, 746, 742, 737, 748,
- 740, 739, 741, 747, 736, 746, 750, 741, 753, 749,
- 745, 755, 740, 745, 743, 743, 749, 747, 742, 751,
- 740, 744, 752, 746, 756, 754, 759, 757, 751, 0,
- 747, 748, 757, 750, 755, 753, 749, 754, 755, 762,
-
- 758, 785, 762, 763, 752, 768, 751, 758, 759, 752,
- 756, 756, 754, 759, 757, 760, 763, 765, 769, 766,
- 0, 770, 785, 760, 765, 766, 762, 758, 785, 772,
- 763, 768, 768, 770, 771, 774, 771, 775, 776, 773,
- 0, 769, 760, 776, 765, 769, 766, 767, 770, 767,
- 775, 773, 772, 767, 777, 767, 772, 774, 0, 0,
- 767, 771, 774, 778, 775, 767, 773, 777, 0, 780,
- 776, 767, 779, 781, 767, 782, 767, 783, 786, 780,
- 767, 777, 767, 783, 779, 784, 778, 767, 782, 787,
- 778, 780, 767, 789, 791, 781, 780, 790, 784, 779,
-
- 781, 794, 782, 791, 783, 790, 780, 793, 0, 797,
- 786, 806, 784, 0, 795, 796, 787, 0, 0, 799,
- 0, 791, 793, 794, 790, 789, 792, 795, 794, 803,
- 796, 792, 798, 792, 793, 797, 797, 800, 799, 801,
- 802, 795, 796, 806, 792, 792, 799, 801, 802, 807,
- 800, 792, 792, 792, 798, 808, 803, 804, 792, 798,
- 792, 809, 810, 808, 800, 811, 801, 802, 813, 812,
- 816, 792, 792, 807, 815, 809, 807, 812, 792, 814,
- 804, 817, 808, 818, 804, 815, 813, 811, 809, 819,
- 821, 818, 811, 820, 810, 813, 812, 814, 822, 817,
-
- 820, 815, 816, 821, 823, 822, 814, 825, 817, 824,
- 818, 819, 838, 827, 831, 829, 819, 821, 830, 836,
- 820, 832, 823, 831, 827, 822, 830, 824, 829, 833,
- 834, 823, 835, 832, 837, 839, 824, 836, 842, 825,
- 827, 831, 829, 842, 838, 830, 836, 841, 832, 839,
- 843, 833, 834, 843, 835, 844, 833, 834, 841, 835,
- 837, 837, 839, 847, 846, 845, 850, 848, 851, 852,
- 842, 846, 847, 849, 841, 851, 843, 843, 845, 844,
- 843, 848, 844, 853, 855, 849, 856, 854, 857, 860,
- 847, 846, 845, 854, 848, 851, 858, 859, 850, 857,
-
- 849, 852, 865, 866, 860, 862, 855, 853, 856, 863,
- 853, 855, 864, 856, 854, 857, 860, 867, 858, 859,
- 863, 869, 868, 858, 859, 874, 862, 873, 870, 875,
- 866, 868, 862, 864, 865, 867, 863, 870, 871, 864,
- 872, 873, 876, 879, 867, 869, 871, 872, 869, 868,
- 877, 880, 879, 881, 873, 870, 882, 874, 880, 884,
- 885, 875, 883, 890, 876, 871, 886, 872, 884, 876,
- 879, 891, 877, 888, 893, 887, 0, 877, 880, 889,
- 883, 894, 888, 882, 885, 881, 884, 885, 0, 883,
- 886, 887, 892, 886, 889, 890, 893, 895, 896, 897,
-
- 888, 893, 887, 891, 892, 895, 889, 899, 894, 900,
- 901, 896, 904, 902, 897, 902, 899, 905, 901, 892,
- 904, 908, 907, 909, 895, 896, 897, 900, 911, 910,
- 912, 914, 915, 908, 899, 907, 900, 901, 909, 904,
- 902, 917, 0, 916, 905, 913, 911, 918, 908, 907,
- 909, 910, 913, 921, 919, 911, 910, 912, 920, 924,
- 927, 922, 0, 914, 915, 916, 917, 919, 917, 918,
- 916, 920, 913, 922, 918, 921, 923, 925, 928, 924,
- 921, 919, 926, 929, 923, 920, 924, 927, 922, 925,
- 926, 928, 929, 930, 931, 0, 934, 932, 936, 937,
-
- 967, 931, 0, 923, 925, 928, 932, 935, 932, 926,
- 929, 932, 937, 938, 930, 0, 946, 941, 936, 932,
- 930, 931, 934, 934, 932, 936, 937, 939, 940, 935,
- 943, 947, 967, 932, 935, 932, 939, 938, 932, 941,
- 938, 942, 944, 946, 941, 949, 940, 950, 951, 942,
- 944, 0, 943, 947, 939, 940, 948, 943, 947, 952,
- 956, 954, 0, 948, 957, 953, 951, 949, 942, 944,
- 950, 952, 949, 953, 950, 951, 954, 955, 959, 957,
- 956, 961, 958, 948, 959, 960, 952, 956, 954, 955,
- 958, 957, 953, 963, 960, 962, 964, 965, 968, 969,
-
- 963, 972, 961, 964, 955, 959, 970, 962, 961, 958,
- 971, 968, 960, 970, 973, 965, 972, 975, 969, 973,
- 963, 974, 962, 964, 965, 968, 969, 976, 972, 974,
- 975, 977, 971, 970, 981, 0, 994, 971, 979, 0,
- 0, 976, 980, 984, 975, 982, 973, 995, 974, 0,
- 0, 0, 979, 983, 976, 0, 985, 977, 977, 978,
- 980, 984, 978, 978, 0, 979, 981, 978, 994, 980,
- 984, 982, 982, 978, 986, 983, 987, 978, 985, 995,
- 983, 978, 988, 985, 988, 989, 978, 990, 991, 978,
- 978, 996, 989, 997, 978, 992, 986, 999, 993, 0,
-
- 978, 986, 987, 987, 978, 990, 988, 993, 992, 988,
- 991, 988, 989, 996, 990, 991, 997, 0, 996, 1003,
- 997, 1005, 992, 999, 999, 993, 998, 1001, 1004, 1006,
- 1005, 998, 1011, 998, 1007, 998, 1008, 998, 1010, 1007,
- 1004, 1008, 1003, 1001, 998, 1009, 1003, 1006, 1005, 1012,
- 1011, 1010, 1014, 998, 1001, 1004, 1006, 1012, 998, 1011,
- 998, 1013, 998, 1008, 998, 1010, 1007, 1009, 1015, 1013,
- 1016, 1014, 1009, 1017, 1019, 1018, 1012, 1021, 1020, 1014,
- 1020, 1015, 1022, 1019, 1023, 1024, 1017, 0, 1013, 1025,
- 1030, 1027, 1016, 1018, 0, 1015, 1023, 1016, 1028, 1021,
-
- 1017, 1019, 1018, 1031, 1021, 1020, 1032, 1033, 1036, 1022,
- 1031, 1023, 1024, 1029, 1025, 1027, 1025, 1030, 1027, 1038,
- 1028, 1029, 1034, 1040, 1037, 1028, 1035, 1039, 1034, 1033,
- 1031, 1037, 1035, 1032, 1033, 1036, 1042, 1043, 1045, 1044,
- 1029, 1038, 0, 1054, 1048, 1039, 1038, 1046, 1040, 1034,
- 1040, 1037, 1050, 1035, 1039, 1047, 1051, 1045, 1049, 1043,
- 1042, 1044, 1055, 1042, 1043, 1045, 1044, 1049, 1056, 1046,
- 1048, 1048, 1052, 1050, 1046, 1054, 1051, 1047, 1057, 1050,
- 1058, 1059, 1047, 1051, 1060, 1049, 1052, 1061, 1065, 1059,
- 1056, 1068, 1065, 1066, 1055, 1056, 1062, 1064, 1058, 1052,
-
- 1060, 1067, 1070, 1062, 1064, 1073, 0, 1058, 1059, 1072,
- 1057, 1060, 1068, 1071, 1061, 1065, 1072, 1074, 1068, 1071,
- 1073, 1076, 1075, 1062, 1064, 1066, 1071, 1078, 1077, 1078,
- 1074, 1075, 1073, 1067, 1070, 1077, 1072, 1080, 1081, 1082,
- 1071, 1079, 1088, 1082, 1074, 1083, 1071, 1076, 1076, 1075,
- 1079, 1086, 1085, 1087, 1078, 1077, 1086, 1089, 0, 1080,
- 1085, 1088, 1090, 1093, 1080, 1081, 1082, 1083, 1079, 1088,
- 1089, 1087, 1083, 1091, 1090, 1092, 1091, 1095, 1092, 1085,
- 1087, 1094, 0, 1086, 1089, 1091, 0, 1096, 1093, 1090,
- 1093, 1097, 1127, 1098, 1094, 1099, 1099, 1092, 1105, 1101,
-
- 1091, 1098, 1092, 1091, 1100, 1092, 1102, 1097, 1094, 1095,
- 1096, 1105, 1103, 1100, 1096, 1102, 1107, 1108, 1097, 1103,
- 1098, 1101, 1099, 1106, 1127, 1105, 1101, 1109, 1113, 1110,
- 1111, 1100, 1106, 1102, 0, 1114, 1109, 1110, 1112, 1103,
- 1108, 1113, 1107, 1107, 1108, 1111, 1112, 1114, 1115, 1117,
- 1106, 1116, 1118, 0, 1109, 1113, 1110, 1111, 1119, 1116,
- 1115, 1120, 1114, 1121, 0, 1112, 1122, 1125, 1124, 1126,
- 1120, 1117, 1118, 1125, 1123, 1115, 1117, 1128, 1116, 1118,
- 1119, 1121, 0, 0, 1129, 1119, 1123, 1130, 1120, 1124,
- 1121, 1126, 1122, 1122, 1125, 1124, 1126, 1132, 1133, 1134,
-
- 1138, 1123, 1136, 1135, 1137, 0, 1139, 0, 0, 1128,
- 1129, 1129, 1135, 1130, 1130, 1136, 1137, 1134, 1141, 1142,
- 1138, 1133, 0, 1143, 1132, 1133, 1134, 1138, 1140, 1136,
- 1135, 1137, 1139, 1139, 1144, 1140, 1143, 1141, 1145, 1146,
- 1147, 1142, 1144, 1145, 1146, 1141, 1142, 1147, 1148, 1149,
- 1143, 1150, 1153, 1151, 1152, 1140, 1148, 1149, 1155, 1150,
- 1151, 1144, 1156, 1152, 1154, 1154, 1155, 1147, 1157, 1158,
- 1145, 1146, 1168, 0, 1159, 1148, 1149, 1158, 1150, 1160,
- 1151, 1152, 1159, 1156, 1153, 1155, 1161, 1160, 1165, 1156,
- 1162, 1154, 1163, 1164, 1161, 1167, 1158, 1166, 1163, 1168,
-
- 1157, 1159, 1170, 1162, 1169, 1164, 1160, 0, 0, 1171,
- 1167, 0, 1172, 1161, 1165, 1165, 1176, 1162, 1173, 1163,
- 1164, 1166, 1167, 1171, 1166, 1170, 1169, 1178, 1177, 1170,
- 1172, 1169, 1173, 1174, 1178, 1179, 1171, 1174, 1176, 1172,
- 1177, 1180, 0, 1176, 1181, 1173, 1179, 1182, 0, 1183,
- 1174, 1189, 1184, 1188, 1178, 1177, 1185, 0, 1174, 1193,
- 1174, 1186, 1179, 1185, 1174, 1193, 1181, 1194, 1180, 1182,
- 1186, 1181, 1183, 1187, 1182, 1184, 1183, 1174, 1189, 1184,
- 1187, 1191, 1196, 1185, 1195, 1188, 1193, 0, 1186, 1194,
- 1191, 1198, 1200, 1201, 1194, 1202, 1207, 1204, 0, 1205,
-
- 1187, 1206, 1207, 1209, 1201, 1208, 1202, 1210, 1191, 1213,
- 1195, 1195, 1217, 1206, 1196, 1212, 1210, 1212, 1198, 1200,
- 1201, 1204, 1202, 1207, 1204, 1205, 1205, 1208, 1206, 1209,
- 1209, 1211, 1208, 1214, 1210, 1213, 1213, 1215, 1216, 1217,
- 1218, 1219, 1212, 1211, 1220, 1222, 1214, 1221, 1219, 0,
- 1216, 1225, 1221, 1223, 1224, 1227, 1229, 1228, 1211, 1215,
- 1214, 1222, 1224, 1218, 1215, 1216, 1228, 1218, 1219, 1229,
- 1220, 1220, 1222, 1225, 1221, 1231, 1223, 1232, 1225, 1232,
- 1223, 1224, 1227, 1229, 1228, 1230, 1230, 1234, 1231, 1233,
- 1235, 1236, 1237, 1230, 0, 1240, 1239, 1235, 1236, 1238,
-
- 0, 1242, 1231, 1239, 1232, 1241, 1244, 1247, 1251, 1234,
- 1237, 1251, 1230, 1230, 1234, 1233, 1233, 1235, 1236, 1237,
- 1240, 1238, 1240, 1239, 1243, 1249, 1238, 1241, 1246, 1248,
- 1254, 1243, 1241, 1242, 1247, 1251, 1252, 1248, 1244, 1253,
- 1255, 1246, 1256, 1254, 1257, 1259, 1249, 1258, 1262, 1255,
- 0, 1243, 1249, 0, 1256, 1246, 1248, 1254, 1268, 1263,
- 1259, 1261, 1252, 1252, 1261, 1253, 1253, 1255, 1257, 1256,
- 1260, 1257, 1259, 1258, 1258, 1264, 1261, 1260, 1265, 1271,
- 1262, 1263, 1266, 1267, 1266, 1261, 1263, 1269, 1261, 1270,
- 1268, 1261, 0, 1264, 1272, 1273, 1276, 1260, 1277, 1279,
-
- 1265, 1271, 1264, 1261, 1273, 1265, 1271, 1267, 1272, 1266,
- 1267, 1274, 1278, 1269, 1269, 1270, 1270, 1275, 1281, 1274,
- 1282, 1272, 1273, 1280, 1275, 1291, 1283, 1280, 1276, 1285,
- 1277, 1279, 1284, 1287, 1278, 1286, 1285, 0, 1274, 1278,
- 1281, 1284, 1286, 1289, 1275, 1281, 1287, 1282, 1283, 1290,
- 1280, 1288, 1297, 1283, 1292, 1294, 1285, 1291, 1289, 1284,
- 1287, 1292, 1286, 1290, 1288, 1293, 1299, 1295, 1294, 1300,
- 1289, 1301, 1293, 1295, 1302, 0, 1290, 1298, 1288, 1297,
- 1307, 1292, 1294, 1301, 1298, 1305, 1303, 1302, 1299, 1303,
- 1304, 0, 1293, 1299, 1295, 1300, 1300, 1306, 1301, 1304,
-
- 1307, 1302, 1308, 1305, 1298, 1308, 1311, 1307, 1309, 1306,
- 1314, 1311, 1305, 1303, 1313, 1315, 1313, 1304, 1311, 1309,
- 1308, 1316, 1317, 1319, 1306, 1318, 1322, 1326, 1325, 1308,
- 0, 1319, 1308, 1311, 1320, 1309, 1321, 1314, 1311, 1318,
- 1327, 1313, 1315, 1323, 1322, 1316, 1325, 1321, 1316, 1317,
- 1319, 1323, 1318, 1322, 1324, 1325, 1320, 1324, 1328, 1326,
- 1329, 1320, 1330, 1321, 1331, 1328, 1336, 1327, 1332, 0,
- 1323, 1330, 1324, 1333, 1329, 1336, 1335, 1331, 1335, 1332,
- 1337, 1324, 1341, 1338, 1324, 1328, 1339, 1329, 1333, 1330,
- 1340, 1331, 0, 1336, 1338, 1332, 1341, 0, 1342, 1344,
-
- 1333, 1342, 1343, 1335, 1339, 1344, 1337, 1337, 1341, 1341,
- 1338, 1343, 1340, 1339, 1346, 1345, 1342, 1340, 1348, 1346,
- 1349, 1350, 1351, 1341, 1345, 1342, 1344, 1352, 1342, 1343,
- 1350, 1348, 1354, 1353, 1357, 1355, 1359, 0, 1358, 1360,
- 1370, 1357, 1345, 0, 1376, 1348, 1346, 1372, 1350, 1351,
- 1364, 1358, 1349, 1360, 1372, 1353, 1355, 1361, 1364, 1352,
- 1353, 1357, 1355, 1361, 1354, 1358, 1360, 1365, 1359, 1366,
- 1368, 1367, 1370, 1369, 1372, 1365, 1376, 1364, 1371, 1374,
- 1373, 1361, 0, 1368, 1361, 1367, 1369, 1374, 1366, 1373,
- 1361, 1377, 1371, 1380, 1365, 1375, 1366, 1368, 1367, 1378,
-
- 1369, 1382, 1377, 1381, 1389, 1371, 1374, 1373, 1378, 1375,
- 1381, 1383, 1384, 1385, 1386, 1387, 1389, 1390, 1377, 1387,
- 1380, 1391, 1375, 1394, 1382, 0, 1378, 1396, 1382, 1391,
- 1381, 1389, 1386, 1383, 1384, 1385, 1392, 1393, 1383, 1384,
- 1385, 1386, 1387, 1395, 1390, 1393, 1397, 1396, 1391, 1399,
- 1394, 1392, 1398, 1400, 1396, 1401, 1395, 1399, 1405, 1402,
- 1400, 1397, 1403, 1392, 1393, 0, 1407, 1398, 1406, 1404,
- 1395, 1403, 1409, 1397, 1402, 1411, 1399, 1414, 1413, 1398,
- 1400, 1415, 1410, 1412, 0, 1405, 1402, 1401, 1415, 1403,
- 1404, 1419, 1406, 1407, 1409, 1406, 1404, 1420, 1412, 1409,
-
- 1410, 1414, 1411, 1413, 1414, 1413, 1416, 1417, 1415, 1410,
- 1412, 1416, 1418, 1419, 1421, 1420, 1417, 1424, 1419, 1422,
- 1423, 1418, 1427, 1428, 1420, 1425, 1426, 1434, 0, 1421,
- 1424, 1422, 1425, 1416, 1417, 1424, 1432, 1429, 1426, 1418,
- 1430, 1421, 1423, 1429, 1424, 1433, 1422, 1423, 1430, 1427,
- 1435, 1431, 1425, 1426, 1434, 1428, 1437, 1424, 1431, 1436,
- 1440, 1432, 1438, 1432, 1429, 1441, 1436, 1430, 1438, 1439,
- 1442, 1433, 1433, 1443, 1445, 1439, 1446, 1435, 1431, 1447,
- 1448, 1449, 1448, 1437, 1452, 1446, 1436, 1440, 1441, 1438,
- 1450, 1454, 1441, 1451, 1456, 0, 1439, 1443, 1454, 0,
-
- 1443, 1464, 1442, 1446, 0, 1449, 1445, 1448, 1449, 1459,
- 1461, 1447, 0, 0, 1459, 0, 1452, 1450, 1454, 1451,
- 1451, 1453, 1453, 1453, 1455, 1457, 1456, 1460, 1453, 1462,
- 1463, 1455, 1457, 1464, 0, 1461, 1453, 1461, 1467, 1466,
- 1460, 1459, 1463, 1465, 1467, 1462, 1466, 1468, 1453, 1453,
- 1453, 1455, 1457, 1470, 1460, 1453, 1462, 1463, 1469, 1469,
- 1471, 1465, 1473, 1472, 1474, 1467, 1466, 1471, 1472, 1481,
- 1465, 1480, 1482, 0, 1468, 1477, 1479, 1480, 0, 1470,
- 1470, 1483, 1484, 1491, 1482, 1469, 1486, 1471, 1473, 1473,
- 1472, 1474, 1490, 1477, 1479, 1494, 1481, 1493, 1480, 1482,
-
- 1484, 1483, 1477, 1479, 1485, 1485, 1487, 1487, 1483, 1484,
- 1488, 1492, 1486, 1486, 1490, 1491, 1495, 1493, 1492, 1490,
- 1496, 1488, 1497, 1498, 1493, 1499, 1500, 1494, 1501, 0,
- 1502, 1485, 1499, 1487, 1500, 1505, 1503, 1488, 1492, 1504,
- 1504, 1498, 1506, 1501, 1497, 1503, 1516, 1496, 1495, 1497,
- 1498, 1507, 1499, 1500, 1502, 1501, 1508, 1502, 1507, 1509,
- 1511, 1505, 1505, 1503, 1512, 1513, 1504, 1511, 1508, 1516,
- 0, 1515, 1512, 1516, 1506, 1509, 1517, 1513, 1507, 1515,
- 1519, 1518, 1509, 1508, 0, 1521, 1509, 1511, 1520, 1522,
- 1521, 1512, 1513, 1524, 1523, 1527, 1528, 1517, 1515, 1518,
-
- 1523, 1521, 1509, 1517, 1529, 1530, 1524, 1519, 1518, 1532,
- 1533, 1520, 1521, 0, 0, 1520, 1522, 1521, 1525, 1526,
- 1524, 1523, 1535, 1528, 1531, 1525, 1526, 1527, 1530, 1531,
- 1529, 1529, 1530, 1534, 1536, 1538, 1532, 1533, 1534, 1539,
- 1531, 1537, 1537, 1541, 0, 1525, 1526, 1545, 1543, 1542,
- 1538, 1531, 1547, 1544, 1535, 1544, 1531, 1559, 1541, 1546,
- 1556, 0, 1538, 1543, 1546, 1534, 1536, 1548, 1537, 1551,
- 1541, 1539, 1542, 1550, 1554, 1543, 1542, 1551, 1555, 1545,
- 1544, 1552, 1548, 1557, 1547, 1558, 1546, 1556, 1550, 1559,
- 1560, 1561, 1558, 1562, 1548, 1567, 1551, 1563, 1554, 1565,
-
- 1550, 1554, 1573, 1552, 1555, 1555, 1572, 0, 1552, 1574,
- 1557, 1560, 1558, 1561, 1562, 1563, 1568, 1560, 1561, 1567,
- 1562, 1565, 1567, 1570, 1563, 1571, 1565, 1574, 1572, 1573,
- 1577, 1568, 1575, 1572, 1576, 1578, 1574, 1579, 1570, 1580,
- 1571, 1581, 1578, 1568, 1582, 1584, 0, 1583, 1580, 1581,
- 1570, 1595, 1571, 0, 1575, 1579, 1576, 1577, 0, 1575,
- 1585, 1576, 1578, 1588, 1579, 1587, 1580, 1582, 1581, 1583,
- 1589, 1582, 1588, 1585, 1583, 1590, 1587, 1584, 1595, 1591,
- 1605, 1592, 0, 1602, 1604, 1597, 1600, 1585, 1589, 1598,
- 1588, 1587, 1587, 1590, 1591, 1592, 1597, 1589, 1600, 1603,
-
- 1598, 1601, 1590, 1587, 1606, 1605, 1591, 1605, 1592, 1603,
- 1604, 1604, 1597, 1600, 1601, 1602, 1598, 1607, 1609, 1612,
- 1610, 0, 1611, 1613, 1614, 1615, 1603, 1610, 1601, 1613,
- 1618, 1606, 1617, 1617, 0, 1623, 1607, 1612, 1609, 1614,
- 1615, 1616, 1618, 1622, 1607, 1609, 1612, 1610, 1611, 1611,
- 1613, 1614, 1615, 1619, 1621, 1624, 1616, 1618, 1622, 1617,
- 1625, 1621, 1623, 1627, 1624, 1626, 1619, 1625, 1616, 1628,
- 1622, 0, 1630, 1631, 1619, 1632, 1628, 1634, 1641, 1633,
- 1619, 1621, 1624, 1638, 1632, 1627, 0, 1625, 1637, 1626,
- 1627, 1636, 1626, 1619, 1630, 1643, 1628, 1634, 1631, 1630,
-
- 1631, 1633, 1632, 1637, 1634, 1641, 1633, 1640, 1638, 1636,
- 1638, 1642, 1642, 1645, 1644, 1637, 0, 1643, 1636, 1647,
- 1640, 1646, 1643, 1648, 1649, 1650, 1656, 0, 1647, 1660,
- 1648, 1651, 1652, 0, 1640, 1645, 1654, 0, 1642, 1644,
- 1645, 1644, 1655, 1646, 1654, 1651, 1647, 1650, 1646, 1657,
- 1648, 1652, 1650, 1656, 1658, 1655, 1649, 1659, 1651, 1652,
- 1661, 1660, 0, 1654, 1659, 1662, 1658, 1664, 1665, 1655,
- 1663, 0, 1666, 0, 1667, 1657, 1657, 1670, 1663, 0,
- 1671, 1658, 1661, 1665, 1659, 1668, 1671, 1661, 1669, 1663,
- 1662, 1669, 1662, 1672, 1664, 1665, 1673, 1663, 1666, 1666,
-
- 1667, 1667, 1670, 1668, 1670, 1663, 1669, 1671, 1677, 1674,
- 1676, 1678, 1668, 1680, 1673, 1669, 0, 1684, 1669, 1681,
- 1672, 1688, 1682, 1673, 1674, 1676, 1681, 1680, 1684, 1689,
- 1677, 1682, 1683, 1678, 1692, 1677, 1674, 1676, 1678, 1686,
- 1680, 1683, 1687, 1688, 1684, 1699, 1681, 1692, 1688, 1682,
- 1694, 1689, 1696, 1701, 1686, 1692, 1689, 1687, 1695, 1683,
- 1698, 1692, 1695, 1697, 1696, 1697, 1686, 1702, 1700, 1687,
- 1703, 1694, 1699, 1707, 1692, 1702, 1704, 1694, 1698, 1696,
- 1701, 1708, 1705, 1706, 1709, 1695, 1700, 1698, 1706, 1714,
- 1697, 1710, 1711, 1703, 1702, 1700, 1705, 1703, 1704, 1711,
-
- 1715, 1717, 1716, 1704, 1718, 1707, 1719, 1721, 1709, 1705,
- 1710, 1709, 0, 1708, 1715, 1706, 1714, 0, 1710, 1711,
- 1716, 1719, 1722, 1720, 1723, 1715, 1715, 1715, 1717, 1716,
- 1718, 1718, 1720, 1719, 1724, 1725, 1727, 1729, 1728, 1721,
- 0, 1715, 0, 1734, 1722, 1728, 1731, 1732, 1731, 1722,
- 1720, 1723, 1715, 1733, 1735, 1734, 1724, 1733, 1738, 1727,
- 1729, 1724, 1736, 1727, 1729, 1728, 1737, 1725, 1739, 1732,
- 1734, 1736, 1740, 1731, 1732, 1741, 1735, 1737, 1742, 1742,
- 1733, 1735, 1743, 1745, 1740, 1738, 1744, 0, 1747, 1736,
- 1743, 1739, 1748, 1737, 1749, 1739, 1747, 1741, 1749, 1740,
-
- 1748, 1750, 1741, 1751, 1750, 1742, 1752, 1753, 1744, 1743,
- 1745, 1751, 1752, 1744, 1754, 1747, 1757, 1756, 1758, 1748,
- 1754, 1749, 1753, 1759, 1763, 1760, 1761, 1764, 1750, 1756,
- 1751, 1762, 1766, 1752, 1753, 1765, 0, 1759, 1760, 1767,
- 1761, 1754, 1758, 1757, 1756, 1758, 1766, 1765, 1769, 1770,
- 1759, 1763, 1760, 1761, 1764, 1772, 1776, 1762, 1762, 1766,
- 1768, 1773, 1765, 1768, 1775, 1767, 1767, 1774, 1773, 1777,
- 1779, 1770, 1778, 1781, 1774, 1769, 1770, 1772, 1768, 1775,
- 1778, 1782, 1772, 1776, 1780, 1783, 1788, 1768, 1773, 1784,
- 1768, 1775, 1787, 1780, 1774, 1785, 1777, 1779, 1789, 1778,
-
- 1781, 1790, 1784, 1785, 0, 1792, 1789, 1793, 1782, 1791,
- 1795, 1780, 1783, 1788, 1787, 1794, 1784, 1799, 1791, 1787,
- 1801, 1796, 1785, 1797, 1805, 1789, 1792, 1801, 1790, 1796,
- 1794, 1793, 1792, 1803, 1793, 1797, 1791, 1795, 1798, 1802,
- 1804, 1794, 1794, 1802, 1799, 1803, 1798, 1801, 1796, 1810,
- 1797, 1805, 1807, 1806, 1812, 1811, 1808, 1794, 1813, 1816,
- 1803, 1806, 1811, 1804, 1807, 1798, 1802, 1804, 1808, 1814,
- 1814, 1813, 1815, 0, 1812, 1817, 1810, 1816, 1819, 1807,
- 1806, 1812, 1811, 1808, 1820, 1813, 1816, 1821, 1822, 1823,
- 1822, 1824, 1829, 1819, 0, 1825, 1814, 1824, 1815, 1815,
-
- 1817, 1826, 1817, 1823, 1827, 1819, 1820, 1828, 1830, 1821,
- 1831, 1820, 1831, 1832, 1821, 1822, 1823, 1825, 1824, 1828,
- 1833, 1834, 1825, 1826, 1829, 1835, 1827, 1832, 1826, 1837,
- 1830, 1827, 1836, 1838, 1828, 1830, 1843, 1831, 1833, 1834,
- 1832, 1839, 1837, 1835, 1841, 1845, 1844, 1833, 1834, 1846,
- 1836, 1841, 1835, 1847, 1843, 1847, 1837, 1846, 1849, 1836,
- 1847, 1851, 1852, 1843, 1839, 1838, 1855, 1850, 1839, 1849,
- 0, 1841, 1844, 1844, 1852, 1846, 1846, 1845, 1850, 1853,
- 1847, 1855, 1847, 1857, 1846, 1849, 1858, 1856, 1851, 1852,
- 1861, 1860, 1862, 1855, 1850, 1857, 1863, 1853, 1856, 1862,
-
- 1864, 1858, 1866, 1868, 1867, 1869, 1853, 1870, 1871, 1872,
- 1857, 1863, 1861, 1858, 1856, 1860, 1873, 1861, 1860, 1862,
- 1875, 1879, 1872, 1863, 1876, 1868, 1874, 1864, 1867, 1866,
- 1868, 1867, 1876, 1875, 1877, 1871, 1872, 1869, 1880, 1870,
- 1881, 1874, 1873, 1873, 1879, 1883, 1882, 1875, 1879, 1886,
- 0, 1876, 1883, 1874, 1884, 1889, 1886, 1887, 1888, 1890,
- 1877, 1877, 1880, 1892, 1887, 1880, 1890, 1881, 1882, 1891,
- 1897, 1888, 1883, 1882, 1894, 1898, 1886, 1884, 1889, 1893,
- 1910, 1884, 1889, 1894, 1887, 1888, 1890, 1896, 1900, 1899,
- 1903, 1891, 1897, 1904, 1905, 1892, 1891, 1897, 1896, 1907,
-
- 1893, 1894, 1912, 1903, 1906, 1906, 1893, 1898, 1899, 1909,
- 1928, 1916, 1910, 1900, 1896, 1900, 1899, 1903, 1905, 1904,
- 1904, 1905, 1911, 1913, 1918, 1907, 1907, 1924, 1926, 1912,
- 1922, 1906, 1909, 1918, 1923, 1930, 1909, 1911, 1916, 1929,
- 1931, 1913, 1928, 1935, 1936, 1931, 1930, 1932, 1939, 1911,
- 1913, 1918, 1922, 0, 1924, 1926, 1923, 1922, 1935, 1938,
- 1934, 1923, 1930, 1940, 1941, 1929, 1929, 1931, 1934, 1932,
- 1935, 1936, 1940, 1943, 1932, 1944, 1941, 1938, 1947, 1945,
- 1939, 1948, 1952, 1944, 0, 1949, 1938, 1934, 1945, 1950,
- 1940, 1941, 1951, 1954, 1955, 1952, 1956, 1953, 1957, 1958,
-
- 1943, 1961, 1944, 1959, 1947, 1947, 1945, 1949, 1948, 1952,
- 1953, 1950, 1949, 1960, 1965, 1954, 1950, 1951, 1959, 1951,
- 1954, 1955, 1960, 1956, 1953, 1957, 1958, 1961, 1961, 1962,
- 1959, 1963, 1964, 1966, 1967, 1968, 1970, 1969, 1971, 0,
- 1960, 1965, 1973, 1964, 1972, 1971, 1963, 1974, 0, 1973,
- 1968, 1970, 1975, 1976, 1976, 1962, 1962, 1969, 1963, 1964,
- 1966, 1967, 1968, 1970, 1969, 1971, 1972, 1978, 1977, 1973,
- 1975, 1972, 1980, 1979, 1974, 1977, 1979, 1981, 1982, 1975,
- 1976, 1978, 1986, 1987, 1989, 1980, 1983, 0, 1987, 1984,
- 1991, 1986, 1992, 1988, 1978, 1977, 1982, 1988, 1983, 1980,
-
- 1979, 1984, 1990, 1981, 1981, 1982, 1993, 1994, 1989, 1986,
- 1987, 1989, 1991, 1983, 1992, 1990, 1984, 1991, 1995, 1992,
- 1988, 1998, 1999, 2000, 2001, 2005, 0, 2004, 2003, 1990,
- 2005, 1999, 2001, 1993, 1994, 2003, 2004, 0, 2007, 2000,
- 0, 0, 2010, 2012, 1995, 1995, 2006, 1998, 1998, 1999,
- 2000, 2001, 2005, 2006, 2004, 2003, 2007, 2008, 2009, 2013,
- 2014, 2017, 2015, 2016, 2008, 2007, 2018, 2009, 2010, 2010,
- 2012, 2015, 2016, 2006, 2019, 0, 2025, 2013, 2018, 2023,
- 2024, 2017, 2020, 2019, 2008, 2009, 2013, 2014, 2017, 2015,
- 2016, 2020, 2021, 2018, 2022, 2026, 2029, 2028, 2027, 0,
-
- 2034, 2019, 2022, 2021, 2026, 2028, 2023, 2024, 2025, 2020,
- 2027, 2033, 2032, 2030, 0, 2036, 2035, 2040, 2029, 2021,
- 2030, 2022, 2026, 2029, 2028, 2027, 2031, 2034, 0, 2038,
- 2047, 2050, 0, 2031, 2032, 2040, 2033, 2038, 2033, 2032,
- 2030, 2035, 2036, 2035, 2040, 2041, 2042, 2046, 2045, 2048,
- 2049, 2053, 2041, 2031, 2042, 2045, 2038, 2047, 2050, 2049,
- 2051, 2048, 2054, 2053, 2055, 2056, 0, 2060, 2063, 2062,
- 2065, 2046, 2041, 2042, 2046, 2045, 2048, 2049, 2053, 2056,
- 2066, 2058, 2064, 2051, 2062, 2054, 2059, 2051, 2058, 2054,
- 2064, 2055, 2056, 2059, 2060, 2063, 2062, 2065, 2067, 0,
-
- 2072, 2073, 2066, 2074, 2075, 2076, 2073, 2066, 2058, 2064,
- 2077, 2081, 2083, 2059, 0, 0, 2082, 2074, 2075, 0,
- 2089, 2084, 2077, 2076, 2090, 2067, 2072, 2072, 2073, 2082,
- 2074, 2075, 2076, 2081, 2083, 2086, 2085, 2077, 2081, 2083,
- 2084, 2088, 2089, 2082, 2085, 2091, 2090, 2089, 2084, 2092,
- 2093, 2090, 2095, 2088, 2086, 2094, 2096, 2091, 2097, 2098,
- 2100, 0, 2086, 2085, 0, 2096, 2099, 2097, 2088, 2101,
- 2102, 2103, 2091, 2104, 2095, 2094, 2092, 2093, 2108, 2095,
- 2107, 2101, 2094, 2096, 2109, 2097, 2100, 2100, 2099, 2109,
- 2110, 2098, 2102, 2099, 2107, 2112, 2101, 2102, 2103, 2111,
-
- 2104, 2113, 2108, 2114, 2115, 2108, 2116, 2107, 0, 0,
- 2117, 0, 2110, 2118, 2121, 0, 2109, 2110, 2116, 2119,
- 2123, 2111, 2115, 2124, 2113, 2114, 2111, 2112, 2113, 2117,
- 2114, 2115, 2129, 2116, 2119, 2118, 2127, 2117, 2121, 2125,
- 2118, 2121, 2123, 2126, 2128, 2124, 2119, 2123, 2125, 2130,
- 2124, 2136, 2133, 2140, 2127, 0, 2135, 2126, 2129, 2129,
- 2133, 2134, 2128, 2127, 2135, 2137, 2125, 2130, 2134, 2138,
- 2126, 2128, 2139, 2137, 2141, 2146, 2130, 2143, 2136, 2133,
- 2140, 2148, 2141, 2135, 2139, 2147, 2145, 2138, 2134, 2143,
- 0, 2149, 2137, 2145, 2150, 2153, 2138, 2152, 2146, 2139,
-
- 2155, 2141, 2146, 2159, 2143, 2160, 2156, 2161, 2148, 2153,
- 2149, 2163, 2165, 2145, 2157, 2152, 2150, 2147, 2149, 2156,
- 2170, 2150, 2153, 2155, 2152, 2171, 2157, 2155, 2167, 2159,
- 2159, 2172, 2160, 2156, 2161, 2167, 2169, 2173, 2163, 2165,
- 2174, 2157, 2175, 2169, 2176, 2177, 2170, 2170, 2178, 2174,
- 2179, 2182, 2171, 2180, 2183, 2167, 0, 0, 2172, 2184,
- 2178, 2173, 2180, 2169, 2173, 2181, 2192, 2174, 2187, 2175,
- 2176, 2176, 2177, 2187, 2191, 2178, 2194, 2179, 2181, 2195,
- 2180, 2183, 2184, 2182, 2188, 2198, 2184, 2189, 2188, 2190,
- 2199, 2193, 2181, 2193, 2189, 2191, 2190, 2200, 2192, 2194,
-
- 2187, 2191, 2202, 2194, 2202, 0, 2195, 2198, 2203, 2199,
- 0, 2188, 2198, 2206, 2189, 2205, 2190, 2199, 2193, 2209,
- 2208, 2200, 2206, 2207, 2200, 2211, 2204, 2204, 0, 2202,
- 2207, 2210, 2203, 2208, 2213, 2203, 2204, 2205, 2214, 2210,
- 2206, 2212, 2205, 2215, 2211, 2216, 2209, 2208, 2217, 2212,
- 2207, 2218, 2211, 2204, 2204, 2219, 2220, 2220, 2210, 2217,
- 2213, 2213, 2219, 2221, 2214, 2214, 2225, 2222, 2212, 2215,
- 2215, 2216, 2216, 2218, 2222, 2217, 2226, 2223, 2218, 2227,
- 2229, 2221, 2219, 2220, 2223, 2230, 2231, 2232, 2227, 2235,
- 2221, 2236, 2233, 2225, 2222, 0, 2239, 2237, 2235, 2238,
-
- 2226, 2241, 0, 2226, 2223, 2230, 2227, 2229, 2239, 2232,
- 2233, 2242, 2230, 2231, 2232, 2241, 2235, 2238, 2236, 2233,
- 2237, 2247, 2240, 2239, 2237, 2248, 2238, 2240, 2241, 2242,
- 2249, 2252, 2253, 2252, 2255, 2257, 2266, 0, 2242, 2253,
- 2260, 2257, 2259, 2248, 2267, 2249, 2263, 2261, 2247, 2255,
- 2264, 2268, 2248, 2264, 2240, 0, 0, 2249, 2252, 2253,
- 2272, 2255, 2257, 2266, 2259, 2261, 2260, 2260, 2263, 2259,
- 2269, 2267, 2270, 2263, 2261, 2271, 2264, 2264, 2268, 2270,
- 2264, 2274, 2272, 2271, 2275, 2276, 0, 2272, 2269, 2277,
- 2279, 2278, 2280, 2282, 2281, 2284, 2279, 2269, 0, 2270,
-
- 2278, 2286, 2271, 2281, 2288, 0, 2275, 2276, 2283, 2286,
- 2283, 2275, 2276, 2274, 2280, 2287, 2277, 2279, 2278, 2280,
- 2289, 2281, 2284, 2290, 2294, 2282, 2291, 2287, 2286, 2293,
- 2292, 2288, 2294, 2295, 2289, 2283, 2296, 2290, 2297, 2297,
- 2293, 2298, 2287, 2301, 2302, 2306, 2299, 2289, 2292, 2291,
- 2290, 2294, 2295, 2291, 2299, 2304, 2293, 2292, 2296, 2308,
- 2295, 2304, 2310, 2296, 2307, 2297, 2315, 2311, 2298, 2313,
- 2301, 2302, 2306, 2299, 2311, 2307, 2312, 2313, 2318, 2319,
- 2312, 2308, 2304, 2318, 2316, 2320, 2308, 2335, 2321, 2310,
- 2322, 2307, 2315, 2315, 2311, 2323, 2313, 2316, 2325, 2327,
-
- 2328, 2324, 2323, 2312, 2329, 2318, 2319, 2321, 2322, 2324,
- 2336, 2316, 2320, 2325, 2326, 2321, 2334, 2322, 2333, 2335,
- 2337, 2326, 2323, 2334, 2328, 2325, 2327, 2328, 2324, 2338,
- 2329, 2329, 2341, 2333, 2321, 2342, 2344, 2336, 2343, 2339,
- 2346, 2326, 2348, 2334, 2337, 2333, 2343, 2337, 2339, 2351,
- 2345, 2345, 2352, 2353, 2341, 2349, 2356, 2342, 2354, 2341,
- 2345, 2338, 2342, 2349, 2355, 2343, 2339, 2346, 2344, 2348,
- 2357, 2354, 2358, 2359, 2361, 2353, 2351, 2345, 2345, 2352,
- 2353, 2364, 2349, 2356, 2367, 2354, 2355, 2366, 2369, 2364,
- 2370, 2355, 2366, 2373, 2372, 2359, 2374, 2357, 2371, 2358,
-
- 2359, 2361, 2378, 2370, 2380, 2371, 2379, 2381, 2364, 0,
- 2367, 2367, 2372, 2382, 2366, 2369, 2383, 2370, 2374, 2379,
- 2373, 2372, 2387, 2374, 2385, 2371, 2381, 2388, 2386, 2378,
- 0, 2385, 2389, 2379, 2381, 2386, 2380, 2391, 2383, 2392,
- 2382, 2393, 2388, 2383, 2387, 2394, 2396, 2392, 2393, 2387,
- 2405, 2385, 2394, 2389, 2388, 2386, 2391, 2396, 2395, 2389,
- 2397, 2397, 2399, 2398, 2391, 2406, 2392, 2395, 2393, 2398,
- 2397, 2402, 2394, 2396, 2407, 2411, 2413, 2405, 2402, 2414,
- 2414, 0, 2415, 2417, 2399, 2395, 2418, 2397, 2397, 2399,
- 2398, 2419, 2406, 2421, 2423, 2418, 2424, 2407, 2402, 2425,
-
- 2430, 2407, 2411, 2413, 2419, 2415, 2427, 2428, 2414, 2415,
- 2417, 2425, 2429, 2418, 2423, 2427, 2431, 2432, 2419, 2424,
- 2421, 2423, 2436, 2424, 2433, 2428, 2425, 2430, 2437, 2432,
- 2437, 2435, 2434, 2427, 2428, 2434, 2435, 2438, 2429, 2429,
- 0, 2439, 2443, 2431, 2432, 2440, 2433, 2439, 2441, 2438,
- 2434, 2433, 2442, 2446, 2436, 2437, 2449, 2450, 2451, 2434,
- 2442, 2454, 2434, 2435, 2438, 2456, 2457, 2440, 2439, 2443,
- 2441, 2453, 2440, 2459, 2460, 2441, 2458, 2461, 2457, 2442,
- 2446, 2464, 2465, 2449, 2450, 2451, 2460, 2467, 2454, 2453,
- 2464, 2458, 2456, 2457, 2466, 2466, 2468, 2472, 2453, 2459,
-
- 2459, 2460, 2470, 2458, 2461, 2468, 2465, 2471, 2464, 2465,
- 2472, 2473, 0, 2467, 2467, 2487, 2482, 2474, 2475, 2476,
- 0, 2466, 2487, 2468, 2472, 2474, 2470, 2475, 2485, 2470,
- 2476, 2486, 2485, 2473, 2488, 2491, 2496, 2490, 2473, 2471,
- 2482, 2490, 2487, 2482, 2474, 2475, 2476, 2488, 2492, 2493,
- 2496, 2491, 2495, 2494, 2486, 2485, 0, 2498, 2486, 2497,
- 2499, 2488, 2491, 2496, 2490, 2494, 2498, 2497, 2504, 2506,
- 2492, 2499, 2507, 2501, 2493, 2492, 2493, 2503, 2495, 2495,
- 2494, 2500, 2502, 2500, 2498, 2501, 2497, 2499, 2505, 2502,
- 2503, 2508, 2509, 2510, 0, 2504, 2506, 2512, 2507, 2507,
-
- 2501, 2510, 0, 2511, 2503, 2513, 2505, 2514, 2500, 2502,
- 2511, 2515, 2517, 2515, 2516, 2505, 2519, 0, 2508, 2509,
- 2510, 2512, 2518, 2520, 2512, 2522, 2516, 2513, 2527, 2514,
- 2511, 2520, 2513, 2524, 2514, 2518, 2528, 2522, 2515, 2529,
- 2530, 2516, 2524, 2519, 2517, 2531, 2532, 2534, 2530, 2518,
- 2520, 0, 2522, 2539, 0, 2527, 2533, 2535, 2529, 2538,
- 2524, 2534, 2528, 2528, 2537, 2535, 2529, 2530, 2541, 2533,
- 2542, 2537, 2538, 2543, 2534, 2541, 2539, 2531, 2532, 2544,
- 2539, 2543, 2545, 2533, 2535, 2547, 2538, 2551, 2548, 2552,
- 2546, 2537, 2542, 2544, 2549, 2541, 2545, 2542, 2546, 2553,
-
- 2543, 2554, 2555, 2549, 2559, 2550, 2544, 2547, 2556, 2545,
- 2548, 2552, 2547, 2550, 2551, 2548, 2552, 2546, 2557, 2560,
- 2561, 2549, 2568, 2565, 2555, 2558, 2563, 2554, 2554, 2555,
- 2556, 2553, 2550, 2558, 2564, 2556, 2559, 0, 2571, 2573,
- 2557, 2560, 2564, 2565, 2570, 2557, 2560, 2561, 2566, 2563,
- 2565, 2567, 2558, 2563, 2568, 2569, 2566, 2575, 2570, 2567,
- 2576, 2564, 2578, 2569, 2571, 2571, 2573, 2574, 2576, 2577,
- 2574, 2570, 2579, 2580, 2581, 2566, 2578, 2577, 2567, 2575,
- 2583, 2583, 2569, 2584, 2575, 2574, 2586, 2576, 2581, 2578,
- 2587, 2591, 2588, 2594, 2574, 2580, 2577, 2574, 2579, 2579,
-
- 2580, 2581, 2589, 2585, 2592, 2595, 0, 2583, 2593, 2584,
- 2584, 2585, 2586, 2586, 2588, 2590, 2587, 2587, 2591, 2588,
- 2594, 2596, 2589, 2590, 2598, 2595, 2592, 2601, 2597, 2589,
- 2585, 2592, 2595, 2593, 2604, 2593, 2597, 2599, 2605, 2602,
- 2610, 2596, 2590, 2608, 2606, 2599, 2598, 2602, 2596, 2607,
- 2611, 2598, 2606, 0, 2601, 2597, 2604, 2607, 2611, 2613,
- 2605, 2604, 2614, 2615, 2599, 2605, 2602, 2610, 2617, 2608,
- 2608, 2606, 2612, 2618, 2619, 2621, 2607, 2611, 2627, 2625,
- 2612, 2624, 2628, 2615, 2626, 2613, 2613, 2625, 0, 2614,
- 2615, 0, 2626, 0, 2619, 2617, 0, 2621, 0, 2612,
-
- 2618, 2619, 2621, 2624, 0, 2627, 2625, 0, 2624, 2628,
- 0, 2626, 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2633,
- 2633, 2633, 2633, 2633, 2633, 2633, 2634, 2634, 2634, 2634,
- 2634, 2634, 2634, 2635, 2635, 2635, 2635, 2635, 2635, 2635,
- 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2638, 2638, 0,
- 2638, 2638, 2638, 2638, 2639, 2639, 0, 0, 0, 2639,
- 2639, 2640, 2640, 0, 0, 2640, 0, 2640, 2641, 0,
- 0, 0, 0, 0, 2641, 2642, 2642, 0, 0, 0,
- 2642, 2642, 2643, 0, 0, 0, 0, 0, 2643, 2644,
- 2644, 0, 2644, 2644, 2644, 2644, 2645, 2645, 0, 2645,
-
- 2645, 2645, 2645, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631,
- 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631, 2631
+ 284, 281, 0, 280, 291, 281, 286, 282, 283, 283,
+ 0, 293, 807, 289, 292, 299, 295, 285, 284, 304,
+ 285, 288, 291, 292, 288, 289, 290, 294, 0, 290,
+ 295, 291, 296, 293, 290, 290, 290, 290, 293, 299,
+ 301, 292, 299, 295, 290, 294, 304, 296, 297, 297,
+ 302, 294, 301, 290, 294, 300, 290, 305, 300, 296,
+ 303, 290, 290, 290, 290, 300, 306, 301, 302, 307,
+ 0, 309, 294, 297, 313, 297, 297, 302, 303, 305,
+
+ 308, 307, 300, 310, 305, 300, 309, 303, 311, 312,
+ 314, 310, 306, 306, 0, 311, 307, 314, 309, 315,
+ 316, 312, 308, 317, 322, 0, 313, 308, 338, 319,
+ 310, 319, 318, 922, 320, 311, 312, 314, 318, 0,
+ 323, 315, 322, 0, 321, 317, 315, 320, 324, 338,
+ 317, 322, 316, 319, 318, 338, 319, 321, 319, 318,
+ 321, 320, 321, 922, 0, 318, 329, 325, 321, 327,
+ 324, 321, 323, 325, 328, 324, 327, 325, 329, 330,
+ 328, 332, 333, 0, 321, 325, 0, 321, 0, 321,
+ 335, 325, 330, 329, 325, 333, 327, 332, 336, 0,
+
+ 325, 328, 335, 340, 325, 332, 330, 0, 332, 333,
+ 341, 340, 325, 326, 337, 326, 336, 335, 342, 337,
+ 339, 343, 341, 0, 332, 336, 339, 344, 326, 343,
+ 340, 326, 0, 326, 346, 326, 342, 341, 347, 326,
+ 326, 346, 326, 345, 345, 342, 337, 339, 343, 0,
+ 355, 347, 349, 0, 0, 326, 349, 348, 326, 344,
+ 326, 346, 326, 334, 334, 347, 348, 350, 0, 352,
+ 345, 351, 354, 334, 350, 334, 334, 334, 351, 349,
+ 334, 352, 355, 353, 354, 356, 357, 359, 334, 348,
+ 334, 334, 356, 348, 350, 358, 352, 0, 351, 354,
+
+ 334, 357, 334, 334, 334, 353, 361, 334, 358, 360,
+ 353, 360, 356, 357, 365, 362, 364, 361, 366, 359,
+ 363, 363, 358, 364, 369, 365, 367, 0, 0, 366,
+ 368, 370, 372, 361, 371, 399, 360, 362, 0, 367,
+ 381, 365, 362, 364, 372, 366, 370, 369, 368, 363,
+ 399, 369, 373, 367, 370, 368, 374, 368, 370, 372,
+ 371, 371, 399, 373, 375, 374, 377, 376, 378, 379,
+ 380, 0, 381, 370, 387, 368, 382, 375, 376, 373,
+ 376, 383, 382, 374, 377, 376, 384, 392, 380, 385,
+ 378, 375, 379, 377, 376, 378, 379, 380, 388, 386,
+
+ 387, 387, 383, 382, 390, 376, 386, 376, 383, 384,
+ 389, 385, 388, 384, 391, 393, 385, 394, 390, 392,
+ 0, 395, 0, 396, 397, 388, 386, 395, 400, 394,
+ 401, 390, 389, 403, 398, 400, 404, 389, 393, 401,
+ 391, 391, 393, 402, 394, 396, 397, 405, 395, 407,
+ 396, 397, 398, 406, 411, 400, 403, 401, 402, 406,
+ 403, 398, 404, 404, 409, 410, 412, 414, 419, 405,
+ 402, 410, 413, 411, 405, 407, 407, 421, 417, 413,
+ 406, 411, 414, 418, 412, 417, 416, 0, 416, 420,
+ 409, 409, 410, 412, 414, 416, 418, 422, 423, 413,
+
+ 419, 424, 425, 427, 424, 417, 428, 420, 0, 421,
+ 418, 423, 0, 416, 426, 416, 420, 430, 431, 422,
+ 424, 426, 429, 431, 422, 423, 432, 427, 424, 428,
+ 427, 424, 432, 434, 425, 429, 433, 0, 428, 430,
+ 435, 426, 436, 437, 430, 431, 0, 0, 442, 429,
+ 438, 0, 435, 432, 437, 434, 428, 443, 438, 433,
+ 434, 440, 441, 433, 436, 443, 0, 435, 440, 436,
+ 437, 442, 445, 461, 441, 442, 0, 438, 439, 444,
+ 446, 461, 447, 439, 443, 439, 448, 449, 440, 441,
+ 444, 439, 0, 439, 447, 445, 439, 439, 449, 445,
+
+ 461, 450, 446, 439, 439, 439, 444, 446, 448, 447,
+ 439, 451, 439, 448, 449, 452, 0, 453, 439, 450,
+ 439, 451, 454, 439, 439, 455, 452, 457, 450, 454,
+ 439, 456, 459, 456, 458, 462, 0, 464, 460, 471,
+ 462, 453, 452, 451, 453, 463, 458, 459, 451, 454,
+ 460, 455, 455, 457, 457, 464, 467, 466, 456, 459,
+ 465, 458, 462, 469, 464, 460, 470, 463, 465, 466,
+ 472, 471, 463, 478, 473, 482, 483, 467, 475, 485,
+ 474, 469, 476, 467, 466, 472, 473, 465, 474, 470,
+ 469, 475, 479, 470, 476, 477, 478, 472, 480, 481,
+
+ 478, 473, 482, 488, 477, 475, 479, 474, 483, 476,
+ 487, 485, 484, 486, 489, 488, 495, 497, 481, 479,
+ 490, 492, 477, 480, 493, 480, 481, 484, 486, 493,
+ 488, 496, 492, 498, 487, 491, 489, 487, 494, 484,
+ 486, 489, 491, 495, 490, 491, 499, 490, 492, 497,
+ 500, 501, 494, 491, 503, 510, 493, 501, 496, 502,
+ 498, 505, 491, 504, 0, 494, 507, 506, 515, 491,
+ 507, 504, 491, 499, 509, 511, 503, 508, 501, 1029,
+ 505, 503, 500, 502, 513, 508, 502, 510, 505, 0,
+ 504, 506, 514, 507, 506, 516, 512, 509, 511, 514,
+
+ 515, 509, 511, 517, 508, 512, 513, 1029, 520, 518,
+ 522, 513, 519, 524, 518, 521, 517, 516, 518, 514,
+ 0, 519, 516, 512, 521, 523, 524, 526, 527, 528,
+ 517, 525, 522, 518, 520, 520, 518, 522, 529, 519,
+ 524, 518, 521, 525, 530, 518, 527, 523, 531, 0,
+ 535, 532, 523, 528, 534, 527, 528, 533, 525, 526,
+ 529, 529, 0, 534, 535, 529, 530, 536, 533, 537,
+ 538, 530, 531, 532, 539, 531, 537, 535, 532, 540,
+ 541, 534, 542, 543, 533, 544, 546, 529, 0, 536,
+ 540, 545, 539, 547, 536, 541, 537, 538, 548, 549,
+
+ 550, 539, 547, 551, 543, 552, 540, 541, 546, 544,
+ 543, 548, 544, 546, 542, 545, 553, 558, 545, 554,
+ 547, 560, 550, 555, 554, 548, 556, 550, 559, 552,
+ 561, 549, 552, 557, 557, 551, 559, 555, 553, 560,
+ 556, 557, 563, 553, 562, 565, 0, 585, 560, 558,
+ 555, 554, 561, 556, 564, 559, 567, 561, 566, 562,
+ 557, 557, 568, 566, 568, 570, 569, 565, 562, 564,
+ 571, 562, 565, 570, 563, 572, 573, 577, 574, 585,
+ 575, 564, 567, 567, 572, 573, 562, 574, 575, 568,
+ 566, 569, 570, 569, 576, 571, 578, 571, 579, 580,
+
+ 577, 576, 572, 573, 577, 574, 581, 575, 582, 583,
+ 579, 580, 587, 0, 578, 581, 582, 584, 586, 590,
+ 588, 576, 589, 578, 583, 579, 580, 587, 588, 584,
+ 589, 586, 591, 581, 592, 582, 583, 596, 595, 587,
+ 599, 591, 590, 592, 584, 586, 590, 588, 593, 589,
+ 594, 595, 598, 597, 603, 601, 599, 593, 594, 591,
+ 598, 592, 600, 596, 596, 595, 601, 599, 603, 0,
+ 602, 604, 605, 606, 607, 593, 597, 594, 602, 598,
+ 597, 603, 601, 608, 600, 611, 609, 610, 0, 600,
+ 613, 604, 0, 606, 605, 609, 607, 602, 604, 605,
+
+ 606, 607, 612, 611, 614, 608, 615, 610, 613, 617,
+ 608, 616, 611, 609, 610, 612, 623, 613, 620, 614,
+ 622, 618, 619, 629, 621, 625, 622, 0, 615, 612,
+ 620, 614, 617, 615, 618, 616, 617, 621, 616, 626,
+ 619, 0, 624, 623, 631, 620, 628, 622, 618, 619,
+ 624, 621, 625, 630, 628, 629, 633, 626, 634, 632,
+ 630, 637, 635, 0, 636, 633, 626, 631, 624, 624,
+ 637, 631, 639, 628, 632, 642, 638, 624, 638, 639,
+ 630, 635, 645, 633, 636, 649, 632, 642, 637, 635,
+ 634, 636, 645, 651, 0, 648, 650, 657, 652, 639,
+
+ 0, 653, 642, 638, 640, 0, 649, 650, 640, 645,
+ 656, 640, 649, 648, 654, 0, 651, 656, 640, 655,
+ 651, 640, 648, 650, 652, 652, 640, 653, 653, 657,
+ 654, 640, 655, 0, 659, 640, 660, 656, 640, 0,
+ 0, 654, 660, 664, 661, 640, 655, 666, 640, 658,
+ 658, 0, 658, 661, 663, 658, 659, 662, 0, 662,
+ 658, 659, 668, 660, 669, 665, 658, 658, 667, 0,
+ 664, 661, 670, 666, 666, 658, 658, 658, 663, 658,
+ 667, 663, 658, 671, 662, 665, 669, 658, 668, 668,
+ 672, 669, 665, 658, 658, 667, 670, 673, 674, 670,
+
+ 675, 676, 678, 677, 680, 671, 674, 679, 676, 681,
+ 671, 677, 673, 682, 685, 672, 680, 672, 687, 685,
+ 691, 678, 681, 675, 673, 674, 683, 675, 676, 678,
+ 677, 680, 684, 679, 679, 683, 681, 688, 686, 682,
+ 682, 685, 688, 692, 690, 687, 693, 684, 0, 695,
+ 700, 694, 691, 683, 697, 696, 701, 698, 700, 684,
+ 686, 704, 702, 697, 0, 686, 690, 699, 695, 688,
+ 693, 690, 694, 693, 696, 692, 695, 700, 694, 698,
+ 702, 697, 696, 701, 698, 703, 0, 699, 705, 702,
+ 707, 708, 709, 704, 699, 710, 705, 711, 712, 714,
+
+ 0, 714, 715, 713, 703, 0, 723, 719, 707, 708,
+ 719, 716, 703, 710, 709, 705, 713, 707, 708, 709,
+ 712, 711, 710, 716, 711, 712, 714, 717, 715, 715,
+ 713, 718, 720, 723, 719, 717, 722, 724, 716, 0,
+ 720, 726, 0, 724, 725, 727, 728, 726, 0, 718,
+ 729, 732, 727, 728, 717, 729, 720, 731, 718, 720,
+ 735, 722, 730, 722, 724, 0, 725, 720, 726, 730,
+ 733, 725, 727, 728, 732, 731, 736, 729, 732, 733,
+ 734, 737, 738, 740, 731, 739, 741, 743, 734, 730,
+ 738, 0, 735, 742, 736, 744, 737, 733, 739, 741,
+
+ 745, 748, 744, 736, 740, 750, 748, 734, 737, 738,
+ 740, 758, 739, 741, 743, 742, 746, 747, 745, 749,
+ 742, 751, 744, 746, 747, 752, 749, 745, 748, 753,
+ 754, 755, 756, 758, 751, 761, 753, 750, 758, 760,
+ 756, 759, 763, 746, 747, 757, 749, 759, 751, 762,
+ 764, 763, 765, 757, 755, 767, 753, 752, 755, 756,
+ 757, 770, 754, 766, 764, 760, 760, 761, 759, 763,
+ 766, 769, 757, 762, 768, 771, 762, 764, 0, 773,
+ 757, 772, 767, 768, 765, 775, 774, 771, 770, 776,
+ 766, 774, 775, 769, 779, 777, 780, 779, 769, 785,
+
+ 782, 768, 771, 777, 772, 773, 773, 782, 772, 780,
+ 786, 776, 775, 774, 783, 0, 776, 0, 787, 0,
+ 783, 779, 777, 780, 789, 785, 785, 782, 0, 788,
+ 787, 788, 792, 786, 790, 796, 791, 786, 794, 0,
+ 793, 783, 784, 794, 784, 787, 790, 789, 784, 791,
+ 784, 789, 795, 793, 792, 784, 788, 804, 796, 792,
+ 784, 790, 796, 791, 797, 795, 784, 793, 798, 784,
+ 794, 784, 799, 800, 801, 784, 797, 784, 798, 795,
+ 801, 803, 784, 802, 805, 806, 800, 784, 808, 804,
+ 798, 797, 812, 0, 799, 798, 802, 816, 809, 799,
+
+ 800, 801, 803, 815, 810, 798, 809, 812, 803, 814,
+ 802, 813, 806, 810, 819, 818, 805, 825, 815, 812,
+ 808, 817, 814, 816, 816, 809, 822, 819, 0, 0,
+ 815, 810, 811, 813, 818, 0, 814, 811, 813, 811,
+ 823, 819, 818, 817, 820, 811, 821, 828, 817, 825,
+ 811, 811, 820, 822, 821, 826, 829, 811, 811, 811,
+ 827, 828, 831, 823, 811, 832, 811, 823, 827, 830,
+ 831, 820, 811, 821, 828, 833, 835, 811, 811, 826,
+ 836, 0, 826, 832, 811, 0, 834, 827, 829, 831,
+ 838, 830, 832, 833, 839, 837, 830, 834, 836, 841,
+
+ 842, 839, 833, 837, 845, 840, 841, 836, 835, 846,
+ 843, 844, 838, 834, 0, 842, 851, 838, 840, 848,
+ 850, 839, 837, 854, 851, 845, 841, 842, 843, 844,
+ 848, 845, 840, 850, 855, 852, 853, 843, 844, 857,
+ 859, 846, 856, 851, 852, 854, 848, 850, 853, 858,
+ 854, 860, 0, 863, 866, 865, 855, 857, 863, 862,
+ 871, 855, 852, 853, 856, 860, 857, 866, 864, 856,
+ 862, 864, 859, 867, 868, 858, 858, 869, 860, 865,
+ 867, 866, 865, 868, 870, 863, 862, 873, 874, 0,
+ 872, 869, 871, 875, 864, 864, 870, 872, 864, 875,
+
+ 867, 868, 876, 877, 869, 878, 879, 881, 886, 880,
+ 884, 870, 874, 0, 883, 874, 878, 872, 885, 873,
+ 875, 884, 881, 887, 876, 877, 888, 890, 879, 876,
+ 877, 880, 878, 879, 881, 883, 880, 884, 889, 885,
+ 886, 883, 893, 891, 888, 885, 895, 889, 892, 893,
+ 887, 890, 891, 888, 890, 894, 892, 896, 897, 898,
+ 895, 899, 901, 0, 905, 889, 0, 0, 903, 893,
+ 891, 900, 906, 895, 907, 892, 0, 903, 904, 894,
+ 909, 898, 894, 899, 910, 904, 898, 911, 899, 896,
+ 897, 908, 907, 900, 901, 903, 905, 912, 900, 906,
+
+ 908, 907, 913, 911, 909, 904, 912, 909, 910, 914,
+ 915, 910, 917, 916, 911, 0, 918, 913, 908, 919,
+ 920, 921, 923, 0, 912, 916, 924, 919, 929, 913,
+ 925, 923, 931, 920, 917, 926, 921, 926, 925, 917,
+ 916, 914, 915, 918, 924, 931, 919, 920, 921, 923,
+ 928, 932, 933, 924, 934, 929, 935, 925, 928, 931,
+ 936, 937, 926, 932, 938, 939, 0, 933, 937, 0,
+ 0, 940, 942, 0, 935, 941, 934, 928, 932, 933,
+ 946, 934, 943, 935, 945, 0, 0, 936, 937, 951,
+ 944, 0, 946, 940, 942, 943, 938, 939, 940, 942,
+
+ 941, 948, 941, 944, 947, 950, 945, 946, 949, 943,
+ 952, 945, 947, 950, 954, 953, 951, 944, 955, 994,
+ 949, 948, 956, 952, 953, 0, 954, 0, 948, 956,
+ 0, 947, 950, 959, 960, 949, 966, 952, 0, 955,
+ 962, 954, 953, 957, 961, 955, 964, 0, 963, 956,
+ 965, 994, 957, 962, 957, 964, 960, 957, 966, 959,
+ 959, 960, 969, 966, 961, 957, 967, 962, 965, 968,
+ 957, 961, 963, 964, 967, 963, 972, 965, 969, 957,
+ 970, 957, 973, 974, 957, 978, 975, 977, 970, 969,
+ 974, 968, 976, 967, 979, 0, 968, 978, 983, 982,
+
+ 0, 0, 981, 972, 973, 977, 979, 970, 975, 973,
+ 974, 982, 978, 975, 977, 976, 980, 981, 983, 976,
+ 984, 979, 985, 987, 980, 983, 982, 986, 989, 981,
+ 985, 988, 987, 986, 990, 984, 999, 991, 992, 0,
+ 989, 990, 0, 980, 991, 1008, 995, 984, 996, 985,
+ 987, 999, 988, 997, 986, 989, 992, 998, 988, 995,
+ 997, 990, 1001, 999, 991, 992, 1000, 996, 1002, 1003,
+ 1001, 1000, 1006, 995, 1004, 996, 1007, 1008, 0, 998,
+ 997, 1002, 1009, 1003, 998, 1010, 1006, 1012, 0, 1001,
+ 0, 1013, 0, 0, 1007, 1002, 1003, 0, 1000, 1006,
+
+ 1004, 1004, 1005, 1007, 1011, 1005, 1005, 1010, 1009, 1009,
+ 1005, 0, 1010, 1013, 1014, 1017, 1005, 1017, 1013, 1012,
+ 1005, 1018, 1011, 1015, 1005, 1016, 1023, 1019, 1018, 1005,
+ 1024, 1011, 1005, 1005, 1020, 0, 1014, 1005, 1025, 1017,
+ 1021, 1014, 1017, 1005, 1017, 1019, 1022, 1005, 1018, 1015,
+ 1015, 1016, 1016, 1021, 1019, 1022, 1020, 1026, 1023, 1030,
+ 1025, 1020, 1024, 0, 1032, 1025, 1033, 1021, 1034, 1036,
+ 0, 1028, 0, 1022, 1036, 1030, 0, 1034, 1033, 0,
+ 1026, 1035, 1038, 1037, 1026, 1027, 1030, 1032, 1037, 1039,
+ 1027, 1032, 1027, 1033, 1027, 1034, 1027, 1028, 1028, 1035,
+
+ 1040, 1036, 1039, 1027, 1038, 1041, 1042, 1043, 1035, 1038,
+ 1037, 1044, 1027, 1041, 1042, 1045, 1039, 1027, 1040, 1027,
+ 1048, 1027, 1046, 1027, 1044, 1047, 1043, 1040, 1049, 1048,
+ 1049, 1050, 1041, 1042, 1043, 1046, 1051, 1045, 1044, 1052,
+ 1053, 1056, 1045, 1047, 1054, 1059, 1058, 1048, 1057, 1046,
+ 1060, 1052, 1047, 1050, 1058, 1049, 1061, 1060, 1050, 1062,
+ 1063, 1066, 1086, 1051, 0, 1056, 1052, 1053, 1056, 1054,
+ 1057, 1054, 1059, 1058, 1064, 1057, 1068, 1060, 1065, 1072,
+ 1064, 1071, 1063, 1061, 1065, 1062, 1062, 1063, 1066, 1067,
+ 1069, 1070, 0, 1075, 1086, 1074, 1067, 1069, 0, 1071,
+
+ 1068, 1064, 1076, 1068, 1072, 1065, 1072, 1077, 1071, 1078,
+ 1079, 1087, 1080, 1070, 1081, 1075, 1067, 1069, 1070, 1074,
+ 1075, 1082, 1074, 1081, 1076, 1083, 1077, 1088, 1089, 1076,
+ 1084, 1078, 1079, 0, 1077, 1090, 1078, 1079, 1080, 1080,
+ 1092, 1081, 1082, 1087, 1084, 1083, 1093, 1091, 1082, 1088,
+ 1098, 1094, 1083, 1090, 1088, 1091, 1092, 1084, 1094, 1096,
+ 1089, 1097, 1090, 1099, 1100, 1097, 1096, 1092, 1102, 1105,
+ 1103, 1107, 1104, 1093, 1091, 1108, 1103, 1106, 1094, 1104,
+ 1107, 1113, 1098, 1103, 1105, 1100, 1096, 1109, 1097, 1112,
+ 1106, 1100, 1128, 1145, 1109, 1099, 1105, 1103, 1107, 1104,
+
+ 1102, 1108, 1108, 1103, 1106, 1110, 1111, 1110, 1113, 1114,
+ 1117, 1112, 1115, 1114, 1109, 1111, 1112, 1118, 1117, 1119,
+ 1120, 1121, 1118, 1123, 1128, 1145, 0, 0, 1119, 1122,
+ 1126, 0, 1110, 1111, 1115, 1123, 1114, 1117, 1120, 1115,
+ 1121, 1124, 1122, 1129, 1124, 1127, 1119, 1120, 1121, 1118,
+ 1123, 1125, 1131, 1124, 1125, 1126, 1122, 1126, 1127, 1130,
+ 1131, 1132, 1132, 1134, 0, 1133, 1129, 1135, 1124, 1136,
+ 1129, 1124, 1127, 1125, 1133, 1130, 1135, 1137, 1125, 1131,
+ 1139, 1125, 1141, 1142, 1137, 1134, 1130, 1144, 1132, 1140,
+ 1134, 1136, 1133, 1139, 1135, 1144, 1136, 1146, 1140, 1152,
+
+ 1153, 0, 1143, 0, 1137, 1147, 1142, 1139, 1141, 1141,
+ 1142, 1143, 1146, 1147, 1144, 1148, 1140, 1151, 1149, 1150,
+ 1153, 1152, 1156, 1158, 1146, 1151, 1152, 1153, 1148, 1143,
+ 1149, 1150, 1147, 1154, 1155, 1158, 1157, 1159, 1167, 1162,
+ 1156, 1160, 1148, 1155, 1151, 1149, 1150, 1160, 1161, 1156,
+ 1158, 1163, 1164, 0, 1165, 1154, 0, 0, 1159, 1168,
+ 1154, 1155, 1157, 1157, 1159, 1167, 1169, 1170, 1160, 1174,
+ 1161, 1162, 1171, 1176, 0, 1161, 1170, 1172, 1164, 1164,
+ 1165, 1165, 1168, 1163, 1169, 1171, 1168, 1173, 1177, 1172,
+ 1175, 1190, 1176, 1169, 1170, 1174, 1174, 1175, 1178, 1171,
+
+ 1176, 1179, 0, 1180, 1172, 1182, 1186, 1173, 1180, 1179,
+ 1177, 1178, 1182, 1181, 1173, 1177, 1183, 1175, 1181, 1184,
+ 1194, 1185, 1187, 1190, 1186, 1178, 1192, 1184, 1179, 1185,
+ 1187, 1188, 1182, 1186, 1192, 1180, 1191, 1191, 1188, 1193,
+ 0, 1189, 1183, 1183, 1199, 1181, 1184, 1195, 1185, 1187,
+ 1189, 1196, 1194, 1192, 1197, 1195, 1198, 1199, 1188, 1196,
+ 1193, 1200, 1197, 1191, 1198, 1201, 1193, 1200, 1189, 1202,
+ 1203, 1199, 1204, 1205, 1195, 0, 1206, 1201, 1196, 1207,
+ 0, 1197, 1217, 1198, 0, 0, 0, 1204, 1200, 1209,
+ 1208, 1210, 1201, 1213, 1203, 1202, 1202, 1203, 1206, 1204,
+
+ 1205, 1214, 1207, 1206, 1208, 1210, 1207, 1209, 1211, 1217,
+ 1218, 1216, 1211, 1214, 1215, 1213, 1209, 1208, 1210, 1220,
+ 1213, 1215, 1216, 1219, 1221, 1211, 1226, 1222, 1214, 1224,
+ 1225, 1223, 1218, 1211, 1222, 1211, 1224, 1218, 1216, 1211,
+ 1223, 1215, 1220, 1230, 1231, 1219, 1220, 1221, 1228, 1230,
+ 1219, 1221, 1211, 1226, 1222, 1232, 1224, 1228, 1223, 1233,
+ 1235, 1237, 1225, 1238, 0, 1239, 1231, 1240, 1244, 1242,
+ 1230, 1231, 1243, 0, 1245, 1228, 1239, 1246, 1240, 1243,
+ 1248, 1232, 1232, 1249, 0, 1237, 1244, 1235, 1237, 1246,
+ 1238, 1233, 1239, 1242, 1240, 1244, 1242, 1247, 0, 1243,
+
+ 1245, 1245, 1248, 1247, 1246, 1250, 1251, 1248, 1253, 1249,
+ 1249, 1252, 1254, 1252, 1250, 1255, 1256, 1257, 1251, 1259,
+ 0, 1260, 1258, 0, 1247, 1254, 1259, 1263, 1256, 0,
+ 1265, 1261, 1250, 1251, 1253, 1253, 1261, 1255, 1252, 1254,
+ 1262, 1267, 1255, 1256, 1257, 1258, 1259, 1260, 1260, 1258,
+ 1263, 1264, 1265, 1268, 1263, 1273, 1262, 1265, 1261, 1264,
+ 1269, 1271, 1268, 1270, 1270, 1277, 0, 1262, 1267, 1282,
+ 1272, 1270, 1272, 1269, 1271, 1280, 1274, 1275, 1264, 1276,
+ 1268, 1273, 1273, 1277, 1275, 1278, 1276, 1269, 1271, 1279,
+ 1270, 1270, 1277, 1281, 1284, 1286, 1279, 1272, 1274, 0,
+
+ 1280, 1282, 1280, 1274, 1275, 1287, 1276, 1278, 1286, 1289,
+ 1283, 1288, 1278, 1291, 1295, 1281, 1279, 1283, 1292, 1288,
+ 1281, 1292, 1286, 1293, 0, 1294, 1284, 1295, 1299, 1298,
+ 1289, 1297, 1287, 1296, 0, 1291, 1289, 1283, 1288, 1301,
+ 1291, 1295, 1296, 1297, 1300, 1292, 1301, 1303, 1304, 1293,
+ 1293, 1294, 1294, 1298, 1299, 1299, 1298, 1308, 1297, 1300,
+ 1296, 1302, 1305, 1309, 1302, 1306, 1301, 1307, 0, 1307,
+ 1304, 1300, 1311, 1315, 1310, 1304, 1302, 0, 1312, 1303,
+ 1305, 1308, 1315, 1314, 1308, 1302, 1313, 1306, 1302, 1305,
+ 1319, 1302, 1306, 1318, 1307, 1309, 1310, 1314, 1311, 1311,
+
+ 1315, 1310, 1317, 1302, 1312, 1312, 1316, 1320, 1313, 1317,
+ 1314, 1322, 0, 1313, 1316, 1321, 0, 1318, 1324, 1323,
+ 1318, 1325, 1319, 1323, 1328, 1326, 1327, 1329, 1330, 1317,
+ 1334, 1328, 0, 1316, 1329, 1327, 1331, 1321, 0, 1320,
+ 1324, 1330, 1321, 1322, 1332, 1324, 1323, 1326, 1325, 1331,
+ 1333, 1328, 1326, 1327, 1329, 1330, 1337, 1340, 1335, 1332,
+ 1336, 1341, 1334, 1331, 1333, 1335, 1338, 1336, 1341, 1337,
+ 1342, 1332, 1338, 1343, 1344, 1346, 1345, 1333, 1346, 1349,
+ 1348, 1347, 0, 1337, 1340, 1335, 1344, 1336, 1341, 1345,
+ 1347, 1349, 1342, 1338, 1350, 1357, 1358, 1342, 1348, 1343,
+
+ 1343, 1344, 1346, 1345, 1352, 1354, 1349, 1348, 1347, 1351,
+ 1354, 1356, 1351, 1356, 1350, 1352, 1359, 1354, 1360, 1357,
+ 1361, 1350, 1357, 1358, 1362, 0, 1363, 1351, 1365, 0,
+ 1366, 1352, 1354, 1360, 1364, 1372, 1351, 1354, 1356, 1351,
+ 1363, 1366, 1364, 1359, 1361, 1360, 1367, 1361, 1368, 1369,
+ 1365, 1362, 1369, 1363, 1370, 1365, 1368, 1366, 1371, 1373,
+ 1374, 1364, 1372, 0, 1367, 1376, 1373, 1369, 1375, 1377,
+ 1378, 0, 1370, 1367, 1374, 1368, 1369, 1375, 1376, 1369,
+ 1377, 1370, 1380, 1383, 1380, 1378, 1373, 1374, 1382, 1381,
+ 1371, 1385, 1376, 1384, 1383, 1375, 1377, 1378, 1381, 1388,
+
+ 1389, 1387, 1391, 1386, 1387, 1394, 1389, 1391, 1388, 1380,
+ 1383, 1384, 1390, 1385, 1382, 1382, 1381, 1386, 1385, 1387,
+ 1384, 1390, 1393, 1395, 1396, 1397, 1388, 1389, 1387, 1386,
+ 1386, 1387, 1395, 1398, 1391, 1393, 1399, 1394, 1400, 1390,
+ 1402, 1404, 1408, 1403, 1386, 1410, 0, 1402, 1405, 1393,
+ 1395, 1396, 1406, 1410, 1418, 1398, 1403, 1397, 1406, 1400,
+ 1398, 1408, 1405, 1411, 1412, 1400, 1413, 1402, 1399, 1408,
+ 1403, 1411, 1410, 1404, 1414, 1405, 1406, 0, 1415, 1406,
+ 1420, 1416, 1417, 1412, 1413, 1406, 1418, 1420, 1414, 1419,
+ 1411, 1412, 1415, 1413, 1416, 1417, 1422, 1421, 1423, 1424,
+
+ 1425, 1414, 1428, 1419, 1422, 1415, 1421, 1420, 1416, 1417,
+ 1426, 1425, 1423, 1429, 1431, 1430, 1419, 1432, 1435, 1426,
+ 1429, 1433, 1435, 1422, 1421, 1423, 1438, 1425, 1434, 1428,
+ 0, 1424, 1449, 1442, 0, 1437, 1431, 1426, 1430, 1432,
+ 1429, 1431, 1430, 1433, 1432, 1435, 1434, 1437, 1433, 1439,
+ 1440, 1441, 1444, 1438, 1443, 1434, 1445, 1439, 1446, 1441,
+ 1442, 1447, 1437, 1448, 1449, 1440, 1451, 1443, 1453, 1447,
+ 1448, 1445, 1444, 1446, 1450, 1451, 1439, 1440, 1441, 1444,
+ 1454, 1443, 1452, 1445, 1455, 1446, 1457, 1458, 1447, 1450,
+ 1448, 1459, 1460, 1451, 1463, 1453, 0, 1461, 0, 1464,
+
+ 1462, 1450, 0, 1452, 1454, 1458, 1464, 1454, 1457, 1452,
+ 1465, 1455, 1461, 1457, 1458, 1465, 1468, 1469, 1463, 1460,
+ 1466, 1463, 1467, 1459, 1461, 1462, 1464, 1462, 1471, 1466,
+ 1470, 1467, 1472, 1473, 1474, 1469, 1475, 1465, 1468, 1476,
+ 1471, 1474, 1477, 1468, 1469, 1470, 1473, 1466, 1475, 1467,
+ 1478, 1473, 1483, 1480, 1472, 1471, 1478, 1470, 1481, 1472,
+ 1473, 1474, 1479, 1475, 1480, 1481, 1476, 1482, 1484, 1485,
+ 1479, 1487, 1491, 1473, 1477, 1486, 1494, 1478, 1483, 1483,
+ 1480, 1488, 1486, 1492, 1489, 1481, 1493, 1490, 1496, 1479,
+ 1489, 1498, 1482, 1490, 1482, 1484, 1485, 1500, 1487, 1491,
+
+ 1494, 1501, 1486, 1494, 1497, 1503, 1492, 1488, 1488, 1502,
+ 1492, 1489, 1505, 1497, 1490, 1499, 1507, 1499, 1493, 1505,
+ 1496, 1500, 1506, 1498, 1500, 1504, 1504, 1504, 1501, 1506,
+ 1511, 1497, 1504, 1510, 1508, 1502, 1502, 1503, 1510, 1505,
+ 1504, 1508, 1499, 1511, 1512, 1515, 1513, 0, 1507, 1506,
+ 0, 1514, 1504, 1504, 1504, 1519, 1516, 1511, 1518, 1504,
+ 1517, 1508, 1513, 1514, 1518, 1510, 1521, 1517, 1524, 1512,
+ 1525, 1512, 1522, 1513, 1516, 1520, 1520, 1515, 1514, 1522,
+ 1529, 1523, 1519, 1516, 1526, 1518, 1523, 1517, 1530, 1534,
+ 1536, 1526, 1521, 1521, 1524, 1524, 1532, 1525, 1533, 1522,
+
+ 1535, 1537, 1520, 1539, 1533, 1544, 1530, 1529, 1523, 1547,
+ 1536, 1526, 1535, 1541, 1532, 1530, 1534, 1536, 1546, 1537,
+ 1538, 1538, 1543, 1532, 1541, 1533, 1545, 1535, 1537, 1539,
+ 1539, 1540, 1540, 1545, 1548, 1549, 1551, 1544, 1546, 1559,
+ 1541, 1547, 1550, 1552, 1543, 1546, 1554, 1538, 1553, 1543,
+ 1552, 1556, 1555, 1545, 1551, 1558, 1553, 0, 1540, 0,
+ 1556, 1554, 1549, 1551, 1550, 1560, 1548, 1557, 1557, 1550,
+ 1552, 1559, 1560, 1554, 1561, 1553, 1555, 1562, 1556, 1555,
+ 1564, 1558, 1558, 1565, 1566, 1569, 1561, 1564, 1570, 1568,
+ 1572, 1565, 1560, 1562, 1557, 1571, 1566, 1568, 1573, 1575,
+
+ 1562, 1561, 1581, 0, 1562, 1578, 1584, 1564, 1569, 1570,
+ 1565, 1566, 1569, 1571, 1574, 1570, 1568, 1572, 1576, 1574,
+ 1562, 1573, 1571, 1577, 1576, 1573, 1575, 1578, 1579, 1583,
+ 1574, 1580, 1578, 1584, 1581, 1579, 1577, 1582, 1580, 1585,
+ 1586, 1574, 1588, 1587, 1589, 1576, 1574, 1590, 1587, 1582,
+ 1577, 1583, 1590, 1591, 1592, 1579, 1583, 1594, 1580, 1587,
+ 1593, 1593, 1595, 1586, 1582, 1585, 1585, 1586, 1597, 1588,
+ 1587, 1589, 1594, 1598, 1599, 1587, 1600, 1601, 1600, 1590,
+ 1603, 1612, 0, 1597, 1594, 1591, 1592, 1593, 1602, 1599,
+ 1604, 1606, 1608, 1602, 1595, 1597, 1598, 1610, 1613, 1607,
+
+ 1598, 1599, 1611, 1600, 1614, 1604, 1606, 1607, 1612, 1601,
+ 1615, 1614, 1603, 1616, 1608, 1602, 1617, 1604, 1606, 1608,
+ 1618, 1610, 1621, 1630, 1610, 1613, 1607, 1619, 1611, 1611,
+ 0, 1614, 1623, 1624, 1616, 1625, 1627, 1628, 1617, 1631,
+ 1616, 1618, 1615, 1617, 1621, 1619, 1629, 1618, 1624, 1621,
+ 1630, 1627, 1628, 1632, 1619, 1633, 1623, 1631, 1634, 1623,
+ 1624, 1625, 1625, 1627, 1628, 1635, 1631, 1637, 1629, 1636,
+ 1638, 1640, 1635, 1629, 0, 1632, 1637, 1633, 1638, 1639,
+ 1632, 1641, 1633, 0, 1644, 1634, 0, 1636, 1642, 1646,
+ 1645, 1648, 1635, 1640, 1637, 1644, 1636, 1638, 1640, 1645,
+
+ 1647, 1642, 1639, 1653, 1649, 1655, 1639, 1646, 1661, 1648,
+ 1644, 1644, 1656, 1641, 1650, 1642, 1646, 1645, 1648, 1649,
+ 1663, 1659, 1644, 1656, 1657, 1660, 1647, 1647, 1650, 1655,
+ 1653, 1649, 1655, 1659, 1662, 1657, 1665, 1664, 1660, 1656,
+ 1661, 1650, 1671, 1669, 1662, 1668, 1663, 1663, 1659, 1666,
+ 1669, 1657, 1660, 1670, 0, 0, 1673, 1676, 1676, 1674,
+ 1671, 1662, 1664, 1665, 1664, 1668, 1675, 1672, 1666, 1671,
+ 1669, 1673, 1668, 1672, 1674, 1677, 1666, 1678, 1680, 1670,
+ 1670, 1675, 1681, 1673, 1676, 1680, 1674, 1677, 1682, 1684,
+ 1678, 1683, 0, 1675, 1672, 1685, 1684, 1681, 1678, 1686,
+
+ 1683, 1687, 1677, 1689, 1678, 1680, 1690, 1692, 1687, 1681,
+ 0, 1691, 1693, 0, 0, 1682, 1684, 1678, 1683, 1685,
+ 1691, 1686, 1685, 1695, 1697, 1689, 1686, 1701, 1687, 1692,
+ 1689, 1690, 1693, 1690, 1692, 1699, 1702, 1698, 1691, 1693,
+ 1701, 1695, 1697, 1703, 1703, 1704, 1705, 1706, 0, 1708,
+ 1695, 1697, 1698, 1707, 1701, 1710, 1711, 1717, 1708, 1709,
+ 1699, 1721, 1699, 1702, 1698, 1712, 1709, 1704, 0, 1706,
+ 1703, 1705, 1704, 1705, 1706, 1707, 1708, 1713, 1711, 1712,
+ 1707, 1715, 1716, 1711, 1717, 1718, 1709, 1710, 1719, 1715,
+ 1720, 1722, 1712, 1721, 1723, 1716, 1713, 1720, 0, 1725,
+
+ 1719, 1726, 0, 1727, 1713, 1728, 1724, 0, 1715, 1716,
+ 1731, 1718, 1718, 1722, 1724, 1719, 1726, 1720, 1722, 1723,
+ 1729, 1723, 0, 0, 1730, 1724, 1725, 1730, 1726, 1727,
+ 1727, 1728, 1728, 1724, 1732, 1731, 0, 1731, 1729, 1733,
+ 1732, 1724, 1730, 1735, 1733, 1734, 1738, 1729, 1741, 1737,
+ 1742, 1730, 1739, 1743, 1730, 1746, 1744, 1742, 1735, 0,
+ 1745, 1732, 1741, 1734, 1737, 1744, 1746, 1752, 1738, 1745,
+ 1735, 1733, 1734, 1738, 1739, 1741, 1737, 1742, 1747, 1739,
+ 1743, 1748, 1746, 1744, 1750, 1751, 1758, 1745, 1753, 1752,
+ 0, 1747, 1760, 1748, 1752, 1763, 1756, 1759, 1765, 1750,
+
+ 1751, 1759, 1762, 1764, 1760, 1747, 1768, 1758, 1748, 1756,
+ 1753, 1750, 1751, 1758, 1761, 1753, 1761, 1756, 1766, 1760,
+ 1762, 1764, 1763, 1756, 1759, 1765, 1766, 1767, 1768, 1762,
+ 1764, 1771, 1769, 1768, 1770, 1772, 1756, 1773, 1774, 1770,
+ 1785, 1761, 1775, 1778, 0, 1766, 1769, 0, 1779, 1775,
+ 1767, 1781, 1788, 1780, 1767, 1782, 1790, 1774, 0, 1769,
+ 1787, 1773, 1779, 1771, 1773, 1774, 1770, 1772, 1783, 1775,
+ 1778, 1780, 1785, 1779, 1779, 1779, 1784, 1786, 1781, 1788,
+ 1780, 1782, 1782, 1783, 1789, 1784, 1787, 1787, 1790, 1779,
+ 1792, 1793, 1794, 1798, 1796, 1783, 1796, 1798, 1793, 1786,
+
+ 1779, 1797, 1799, 1784, 1786, 1800, 1789, 1801, 1803, 1806,
+ 0, 1789, 1899, 1792, 1799, 1794, 1801, 1792, 1793, 1794,
+ 1798, 1796, 1802, 1797, 1804, 1805, 1808, 1800, 1797, 1799,
+ 1811, 1806, 1800, 1802, 1801, 1803, 1806, 1805, 1807, 1807,
+ 1809, 1808, 1810, 1813, 1899, 0, 1814, 1804, 1809, 1802,
+ 1815, 1804, 1805, 1808, 1814, 1816, 1820, 1811, 1815, 1816,
+ 1817, 1824, 1813, 1817, 1810, 1807, 1818, 1809, 1823, 1810,
+ 1813, 1820, 1819, 1814, 1818, 1821, 1825, 1815, 1819, 1827,
+ 1823, 1821, 1816, 1820, 1826, 0, 1829, 1817, 1824, 1830,
+ 1828, 1831, 1827, 1818, 1834, 1823, 1832, 1836, 1826, 1819,
+
+ 1825, 1833, 1821, 1825, 1828, 1837, 1827, 1835, 1832, 1839,
+ 1835, 1826, 1829, 1829, 1843, 1833, 1830, 1828, 1831, 1840,
+ 1834, 1834, 1841, 1832, 1836, 1835, 1840, 1837, 1833, 1841,
+ 1842, 1839, 1837, 1844, 1835, 1845, 1839, 1835, 1846, 1847,
+ 1848, 1843, 1849, 1845, 1850, 1842, 1840, 1851, 1847, 1841,
+ 1852, 1853, 1856, 1855, 1849, 1858, 1857, 1842, 1862, 1853,
+ 1844, 1859, 1845, 1852, 1857, 1846, 1847, 1848, 1860, 1849,
+ 1859, 1850, 1861, 1862, 1851, 1855, 1863, 1852, 1853, 1856,
+ 1855, 1865, 1858, 1857, 1862, 1862, 1864, 1867, 1859, 1860,
+ 1866, 0, 1872, 1865, 1864, 1860, 1861, 1869, 1866, 1861,
+
+ 1862, 1870, 1873, 1863, 1869, 1870, 1871, 1878, 1865, 1875,
+ 1876, 1880, 1874, 1864, 1867, 1872, 1879, 1866, 1871, 1872,
+ 1874, 1875, 1876, 1879, 1869, 1882, 1882, 1881, 1870, 1873,
+ 1883, 1880, 1884, 1871, 1878, 1885, 1875, 1876, 1880, 1874,
+ 1881, 1886, 1889, 1879, 1890, 1891, 1888, 1891, 1886, 1892,
+ 1884, 1901, 1882, 0, 1881, 1894, 1883, 1883, 1898, 1884,
+ 1885, 1888, 1885, 1892, 1889, 1896, 1890, 1897, 1886, 1889,
+ 1898, 1890, 1891, 1888, 1893, 1900, 1892, 1894, 1902, 1904,
+ 1893, 1900, 1894, 1901, 1903, 1898, 1903, 1896, 1910, 1897,
+ 1905, 1906, 1896, 1904, 1897, 1907, 1908, 1909, 1911, 1917,
+
+ 1902, 1893, 1900, 1916, 0, 1902, 1904, 0, 1905, 1906,
+ 1909, 1903, 1913, 1907, 1908, 1915, 0, 1905, 1906, 1913,
+ 1910, 1911, 1907, 1908, 1909, 1911, 1918, 1923, 1924, 1916,
+ 1916, 1917, 1925, 1915, 1918, 1921, 1919, 1922, 1919, 1913,
+ 1924, 1927, 1915, 1919, 1936, 1929, 1921, 1928, 1922, 1932,
+ 1925, 1930, 1918, 1918, 1923, 1924, 1927, 1929, 1928, 1925,
+ 1933, 1918, 1921, 1919, 1922, 1919, 1930, 1937, 1927, 1935,
+ 1934, 1936, 1929, 1932, 1928, 1939, 1932, 1934, 1930, 1940,
+ 1942, 1943, 1933, 1941, 1935, 0, 0, 1933, 1944, 0,
+ 1946, 1945, 1947, 1937, 1937, 1948, 1935, 1934, 1950, 1954,
+
+ 1952, 1949, 1939, 1940, 1945, 1941, 1940, 1947, 1948, 1949,
+ 1941, 1953, 1942, 1943, 1955, 1944, 1946, 1946, 1945, 1947,
+ 1958, 1956, 1948, 1952, 1950, 1950, 1954, 1952, 1949, 1960,
+ 1957, 1963, 1964, 1961, 1967, 1953, 1955, 1957, 1953, 1956,
+ 1961, 1955, 1962, 1958, 1963, 1965, 1966, 1958, 1956, 1962,
+ 1968, 1960, 1965, 1969, 1971, 1964, 1960, 1957, 1963, 1964,
+ 1961, 1972, 1969, 1973, 1975, 1971, 1967, 1974, 1966, 1962,
+ 1979, 1968, 1965, 1966, 1978, 1980, 1987, 1968, 1981, 1981,
+ 1969, 1971, 1982, 1972, 1984, 1985, 1974, 1978, 1972, 1975,
+ 2004, 1975, 1988, 1991, 1974, 1973, 1979, 1979, 1986, 1980,
+
+ 0, 1978, 1980, 1987, 1998, 1981, 1993, 1984, 1982, 1982,
+ 1988, 1984, 1999, 1986, 1995, 1993, 2000, 1985, 2002, 1988,
+ 1991, 2005, 2004, 2007, 2006, 1986, 1998, 1995, 2007, 2010,
+ 2008, 1998, 2012, 1993, 1999, 2006, 2014, 2010, 2011, 1999,
+ 2015, 1995, 2019, 2000, 0, 2002, 2016, 2005, 2005, 2017,
+ 2007, 2006, 2008, 2011, 2014, 2016, 2010, 2008, 2020, 2012,
+ 2023, 2017, 2021, 2014, 2024, 2011, 2020, 2028, 2025, 2019,
+ 2026, 2021, 2015, 2016, 2027, 2029, 2017, 2030, 2031, 2032,
+ 2028, 2033, 2034, 2035, 2030, 2020, 2023, 2023, 2029, 2021,
+ 2025, 2024, 2026, 2038, 2028, 2025, 2036, 2026, 2037, 2027,
+
+ 2031, 2027, 2029, 2039, 2030, 2031, 2032, 2037, 2033, 2034,
+ 2035, 2036, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2038,
+ 2038, 2042, 2047, 2036, 2107, 2037, 2043, 2040, 2041, 2039,
+ 2039, 2048, 2049, 2051, 2053, 0, 2054, 2047, 0, 2040,
+ 2041, 2042, 2043, 2044, 2045, 2046, 2050, 2049, 2060, 2047,
+ 2052, 2048, 2057, 2050, 2054, 2051, 2107, 2052, 2048, 2049,
+ 2051, 2053, 2056, 2054, 2055, 2055, 2057, 2058, 2059, 2056,
+ 2058, 2062, 2061, 2050, 2060, 2060, 2063, 2052, 2065, 2057,
+ 2066, 2059, 2067, 2062, 2068, 2066, 2067, 2065, 2063, 2056,
+ 2061, 2055, 2070, 2069, 2058, 2059, 2071, 2072, 2062, 2061,
+
+ 2073, 0, 2074, 2063, 2076, 2065, 2069, 2066, 2068, 2067,
+ 2078, 2068, 2079, 0, 2070, 2083, 2080, 2081, 2071, 2070,
+ 2069, 2079, 2083, 2071, 2072, 2081, 2084, 2073, 2074, 2074,
+ 2076, 2076, 2080, 2085, 2086, 2084, 2078, 2078, 2085, 2079,
+ 2087, 2086, 2083, 2080, 2081, 2088, 2089, 0, 2090, 2092,
+ 2094, 2093, 2088, 2084, 2095, 2089, 2093, 2096, 2087, 2105,
+ 2085, 2086, 2097, 2099, 0, 0, 2106, 2087, 2094, 0,
+ 2098, 2097, 2088, 2089, 2090, 2090, 2092, 2094, 2093, 2098,
+ 2100, 2095, 2101, 2099, 2096, 2102, 2105, 2103, 2104, 2097,
+ 2099, 2101, 2100, 2106, 2102, 2108, 2104, 2098, 2103, 2109,
+
+ 2110, 2111, 2114, 2112, 2108, 2116, 2113, 2100, 2110, 2101,
+ 2112, 2109, 2102, 2113, 2103, 2104, 2115, 2117, 2118, 2122,
+ 0, 0, 2108, 2111, 2114, 0, 2109, 2110, 2111, 2114,
+ 2112, 2120, 2116, 2113, 2130, 0, 2129, 2122, 2131, 2120,
+ 2123, 2115, 2117, 2115, 2117, 2118, 2122, 2124, 2123, 2125,
+ 2131, 2133, 2128, 2132, 2124, 2138, 2136, 2125, 2120, 2128,
+ 2129, 2130, 2132, 2129, 2134, 2131, 2137, 2123, 2136, 2143,
+ 2139, 2145, 2146, 2148, 2124, 0, 2125, 2151, 2133, 2128,
+ 2132, 2141, 2138, 2136, 2139, 2142, 2145, 2134, 2141, 2137,
+ 0, 2134, 2142, 2137, 2147, 2149, 2143, 2139, 2145, 2146,
+
+ 2148, 2150, 2147, 2156, 2151, 2157, 2158, 2160, 2141, 2159,
+ 2157, 2162, 2142, 2161, 2163, 2167, 2150, 2149, 0, 0,
+ 2158, 2147, 2149, 2159, 2169, 2160, 2163, 2175, 2150, 2156,
+ 2156, 2161, 2157, 2158, 2160, 2168, 2159, 2167, 2162, 2170,
+ 2161, 2163, 2167, 2174, 2171, 2172, 2169, 2176, 2168, 2175,
+ 2178, 2169, 2171, 2177, 2175, 2174, 2179, 2184, 2170, 2180,
+ 2181, 0, 2168, 2185, 2172, 2177, 2170, 2182, 2189, 2176,
+ 2174, 2171, 2172, 2186, 2176, 2183, 2182, 2178, 2190, 2180,
+ 2177, 2187, 2181, 2179, 2183, 2185, 2180, 2181, 2188, 2184,
+ 2185, 2194, 2193, 2187, 2182, 2189, 2195, 0, 2196, 2186,
+
+ 2186, 2199, 2183, 2196, 2197, 2190, 2193, 2198, 2187, 2200,
+ 2188, 0, 0, 2201, 0, 2188, 2203, 0, 2194, 2193,
+ 2195, 2202, 2204, 2195, 2205, 2208, 2197, 2206, 2203, 2198,
+ 2196, 2197, 2200, 2199, 2198, 2201, 2200, 2209, 2212, 2202,
+ 2201, 2204, 2206, 2203, 2213, 2216, 2205, 2208, 2202, 2204,
+ 2214, 2205, 2208, 2215, 2206, 2217, 0, 2218, 2219, 2214,
+ 2212, 2209, 2222, 2216, 2209, 2212, 2213, 2215, 2223, 2225,
+ 2222, 2213, 2216, 2217, 2227, 2223, 2219, 2214, 2224, 2226,
+ 2215, 2228, 2217, 2218, 2218, 2219, 2224, 2226, 2229, 2222,
+ 2230, 2232, 2227, 2228, 2236, 2223, 2225, 2234, 2230, 2235,
+
+ 2237, 2227, 2238, 2232, 2234, 2224, 2226, 2242, 2228, 2239,
+ 2246, 2240, 2245, 2243, 2250, 2229, 2249, 2230, 2232, 2247,
+ 2251, 2236, 2235, 2246, 2234, 2242, 2235, 2243, 2239, 2238,
+ 2253, 2247, 2237, 2240, 2242, 2245, 2239, 2246, 2240, 2245,
+ 2243, 2250, 2249, 2249, 2255, 2257, 2247, 2251, 2258, 2260,
+ 0, 2261, 2257, 2258, 2262, 2263, 2260, 2253, 2267, 2264,
+ 2265, 2268, 0, 2269, 2270, 2272, 2273, 2267, 2275, 0,
+ 2276, 2255, 2257, 0, 2265, 2273, 2260, 2261, 2261, 2277,
+ 2258, 2262, 2263, 2264, 2271, 2267, 2264, 2265, 2268, 2269,
+ 2269, 2270, 2272, 2273, 2274, 2281, 2271, 2276, 2280, 2281,
+
+ 2275, 2282, 2277, 2280, 2284, 2283, 2277, 2274, 2282, 2285,
+ 2287, 2271, 2283, 2286, 0, 2286, 2288, 2291, 2294, 2293,
+ 0, 2274, 2281, 2297, 2296, 2284, 2296, 2300, 2282, 0,
+ 2280, 2284, 2283, 2287, 2299, 2303, 2300, 2287, 2293, 2291,
+ 2286, 2285, 2294, 2288, 2291, 2294, 2293, 2297, 2298, 2298,
+ 2297, 2296, 2301, 2302, 2300, 2304, 2299, 2312, 2298, 2301,
+ 2306, 2299, 2303, 2304, 2305, 2306, 2302, 2308, 2312, 2307,
+ 0, 2309, 0, 2310, 2320, 2298, 2298, 2307, 2311, 2301,
+ 2302, 2313, 2304, 2305, 2312, 2315, 2315, 2321, 2314, 2316,
+ 2324, 2305, 2306, 2308, 2308, 2314, 2307, 2309, 2309, 2310,
+
+ 2310, 2320, 2317, 2313, 2311, 2311, 2318, 2316, 2313, 2317,
+ 2322, 2321, 2315, 2318, 2321, 2314, 2316, 2324, 2325, 2322,
+ 2326, 2327, 2329, 2331, 2332, 0, 2336, 2335, 2334, 2317,
+ 2333, 2336, 2331, 2318, 2338, 2343, 0, 2322, 2325, 2335,
+ 2329, 0, 2337, 2327, 0, 2325, 2334, 2326, 2327, 2329,
+ 2331, 2332, 2338, 2333, 2335, 2334, 2337, 2333, 2336, 2344,
+ 2346, 2338, 2343, 2350, 2347, 2350, 2351, 2352, 2344, 2337,
+ 2354, 2356, 0, 2358, 2352, 2359, 2365, 2356, 2346, 2347,
+ 2363, 2360, 2362, 2363, 2351, 2354, 2344, 2346, 2366, 2367,
+ 2350, 2347, 2373, 2351, 2352, 2358, 2368, 2354, 2356, 2360,
+
+ 2358, 2359, 2359, 2365, 2362, 2369, 2363, 2363, 2360, 2362,
+ 2363, 2370, 2369, 2371, 2368, 2366, 2367, 2374, 2376, 2370,
+ 2375, 2377, 2378, 2368, 2373, 2380, 2381, 2383, 2378, 2379,
+ 2377, 0, 2369, 2389, 2380, 2371, 0, 0, 2370, 2374,
+ 2371, 2382, 2375, 2382, 2374, 2376, 0, 2375, 2377, 2378,
+ 2386, 2379, 2380, 2385, 2383, 2390, 2379, 2387, 2381, 2391,
+ 2389, 2385, 2386, 2393, 2387, 2392, 2395, 2394, 2382, 2390,
+ 2396, 0, 2399, 2391, 2395, 2400, 2397, 2386, 2394, 2402,
+ 2385, 2393, 2390, 2400, 2387, 2403, 2391, 2407, 2392, 2396,
+ 2393, 2409, 2392, 2395, 2394, 2398, 2398, 2396, 2397, 2399,
+
+ 2408, 2405, 2400, 2397, 2411, 2413, 2402, 2405, 2412, 2413,
+ 2416, 2408, 2403, 2409, 2407, 2412, 2414, 2417, 2409, 2419,
+ 2420, 2421, 2398, 2422, 2414, 2420, 2423, 2408, 2405, 2430,
+ 2417, 2411, 2413, 2423, 2425, 2412, 2416, 2416, 2424, 2428,
+ 2431, 2419, 2426, 2414, 2417, 2432, 2419, 2420, 2421, 2426,
+ 2422, 2427, 2425, 2423, 2428, 2429, 2430, 2424, 2436, 2427,
+ 2438, 2425, 2429, 2437, 2431, 2424, 2428, 2431, 2439, 2426,
+ 2437, 2432, 2432, 2436, 2440, 2441, 0, 2442, 2427, 2446,
+ 2447, 2444, 2429, 2445, 2424, 2436, 2442, 2446, 2449, 2451,
+ 2437, 2455, 2438, 2453, 2452, 2439, 2456, 2457, 2440, 2448,
+
+ 2448, 2440, 2452, 2444, 2442, 2445, 2446, 2441, 2444, 2448,
+ 2445, 2453, 2447, 2459, 2460, 2449, 2451, 2458, 2455, 2457,
+ 2453, 2452, 2461, 2456, 2457, 2462, 2448, 2448, 2463, 2465,
+ 2458, 2468, 2470, 0, 2471, 2459, 2473, 2470, 2474, 2468,
+ 2459, 2460, 2477, 2482, 2458, 2479, 2475, 2484, 2476, 2461,
+ 2463, 2474, 2462, 2475, 2478, 2463, 2465, 2486, 2468, 2470,
+ 2471, 2471, 2478, 2473, 2485, 2474, 2476, 2479, 2487, 2477,
+ 2482, 2488, 2479, 2475, 2484, 2476, 2491, 2485, 2489, 2492,
+ 2493, 2478, 2494, 2491, 0, 2497, 2492, 2487, 2498, 2486,
+ 2495, 2485, 2499, 0, 2500, 2487, 2498, 2494, 2488, 2499,
+
+ 2489, 2500, 2493, 2491, 2497, 2489, 2492, 2493, 2505, 2494,
+ 2504, 2495, 2497, 2501, 2502, 2498, 2504, 2495, 2509, 2499,
+ 2508, 2500, 2501, 2503, 2503, 2502, 2512, 2508, 2513, 2514,
+ 2505, 2518, 2509, 2503, 2520, 2505, 2522, 2504, 2521, 2521,
+ 2501, 2502, 2524, 2528, 2529, 2509, 2532, 2508, 2525, 2526,
+ 2503, 2503, 2514, 2512, 2533, 2513, 2514, 2525, 2518, 2522,
+ 2534, 2520, 2526, 2522, 2537, 2528, 2532, 2521, 2538, 2524,
+ 2528, 2529, 2534, 2532, 2536, 2525, 2526, 2533, 2539, 2540,
+ 2541, 2533, 2537, 2536, 2544, 2543, 2542, 2534, 2543, 2544,
+ 2545, 2537, 2541, 2548, 2538, 2538, 2546, 2547, 2546, 2548,
+
+ 2552, 2536, 2556, 2543, 2549, 2539, 2540, 2541, 2542, 2547,
+ 2550, 2551, 2543, 2542, 2553, 2543, 2544, 2559, 2560, 2551,
+ 2548, 2561, 2545, 2546, 2547, 2563, 2549, 2552, 2564, 2556,
+ 2567, 2549, 2550, 2565, 2568, 2569, 2553, 2550, 2551, 2570,
+ 2565, 2553, 2571, 2563, 2559, 2560, 2568, 2572, 2561, 2575,
+ 2569, 2576, 2563, 2578, 2571, 2564, 2582, 2567, 2575, 2579,
+ 2565, 2568, 2569, 2577, 2577, 2570, 2570, 2581, 2579, 2571,
+ 2583, 2584, 2596, 2585, 2572, 2576, 2575, 2589, 2576, 2578,
+ 2578, 2585, 2594, 2583, 2587, 2599, 2579, 2586, 2582, 2589,
+ 2577, 2581, 0, 2584, 2581, 2587, 2586, 2583, 2584, 2596,
+
+ 2585, 2598, 2601, 2600, 2589, 2598, 2594, 2604, 2599, 2594,
+ 2600, 2587, 2599, 2603, 2586, 2601, 2605, 2603, 2610, 2606,
+ 2607, 0, 2608, 2604, 2611, 2609, 2610, 0, 2598, 2601,
+ 2600, 2612, 2607, 2611, 2604, 2613, 2619, 2613, 2605, 2609,
+ 2603, 2614, 2612, 2605, 2606, 2610, 2606, 2607, 2608, 2608,
+ 2615, 2611, 2609, 2614, 2616, 2620, 2615, 2618, 2612, 2621,
+ 2623, 2616, 2613, 2619, 2622, 2624, 2625, 2628, 2614, 2626,
+ 2618, 2627, 2632, 2620, 2625, 2629, 2626, 2615, 2630, 2635,
+ 2630, 2616, 2620, 2643, 2618, 2647, 2621, 2623, 2631, 2628,
+ 2622, 2622, 2624, 2625, 2628, 2627, 2626, 2629, 2627, 2633,
+
+ 2631, 2634, 2629, 2636, 2632, 2630, 2635, 2638, 2634, 2640,
+ 2643, 2636, 2633, 2644, 2645, 2631, 2646, 2647, 2640, 2638,
+ 2648, 2651, 2649, 2650, 2646, 0, 2633, 2652, 2634, 2651,
+ 2636, 2654, 2655, 2645, 2638, 2649, 2640, 2650, 2654, 2644,
+ 2644, 2645, 2656, 2646, 2658, 2655, 2659, 2660, 2651, 2649,
+ 2650, 2658, 2648, 2661, 2652, 2660, 2662, 2664, 2654, 2655,
+ 2665, 2669, 2671, 2672, 2663, 2656, 2667, 2661, 2659, 2656,
+ 2662, 2658, 2663, 2659, 2660, 2667, 2670, 2668, 2673, 2664,
+ 2661, 0, 2665, 2662, 2664, 2668, 2674, 2665, 2669, 2672,
+ 2672, 2663, 2675, 2667, 2671, 2677, 2678, 2679, 2670, 2676,
+
+ 2673, 2682, 2681, 2670, 2668, 2673, 2686, 2676, 2674, 2682,
+ 2683, 0, 2684, 2674, 2675, 0, 2689, 2688, 2678, 2675,
+ 2684, 2691, 0, 2678, 2679, 2681, 2676, 2677, 2682, 2681,
+ 2683, 2688, 2685, 2687, 2693, 2698, 2696, 2683, 2686, 2684,
+ 2685, 2687, 2689, 2689, 2688, 2694, 2692, 2695, 2691, 2692,
+ 2696, 2697, 2699, 2694, 2702, 2695, 2693, 2698, 2704, 2685,
+ 2687, 2693, 2698, 2696, 2692, 2705, 2699, 2701, 2701, 2707,
+ 2709, 2706, 2694, 2692, 2695, 2703, 2692, 2697, 2697, 2699,
+ 2702, 2702, 2708, 2703, 2704, 2704, 2710, 2711, 2712, 2707,
+ 2708, 2705, 2705, 2706, 2701, 2715, 2707, 2709, 2706, 2713,
+
+ 2714, 2716, 2703, 2715, 2719, 0, 0, 2722, 2710, 2708,
+ 2717, 2723, 2711, 2710, 2711, 2712, 2720, 2724, 2717, 2713,
+ 2714, 2726, 2715, 2716, 2720, 2724, 2713, 2714, 2716, 2722,
+ 2728, 2719, 2725, 2723, 2722, 2731, 2732, 2717, 2723, 2735,
+ 2725, 2729, 2730, 2720, 2724, 2733, 2736, 2726, 2726, 2729,
+ 2730, 2737, 2739, 2742, 2745, 2746, 2743, 2728, 0, 2725,
+ 0, 2731, 2731, 2732, 2743, 2733, 2735, 0, 2729, 2730,
+ 0, 2737, 2733, 2736, 2739, 2742, 2744, 0, 2737, 2739,
+ 2742, 2745, 2746, 2743, 2744, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 2744, 2750, 2750, 2750, 2750, 2750, 2750,
+ 2750, 2751, 2751, 2751, 2751, 2751, 2751, 2751, 2752, 2752,
+ 2752, 2752, 2752, 2752, 2752, 2753, 2753, 2753, 2753, 2753,
+ 2753, 2753, 2754, 2754, 2754, 2754, 2754, 2754, 2754, 2756,
+ 2756, 0, 2756, 2756, 2756, 2756, 2757, 2757, 0, 0,
+ 0, 2757, 2757, 2758, 2758, 0, 0, 2758, 0, 2758,
+ 2759, 0, 0, 0, 0, 0, 2759, 2760, 2760, 0,
+ 0, 0, 2760, 2760, 2761, 0, 0, 0, 0, 0,
+ 2761, 2762, 2762, 0, 2762, 2762, 2762, 2762, 2763, 2763,
+ 0, 2763, 2763, 2763, 2763, 2749, 2749, 2749, 2749, 2749,
+
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749, 2749,
+ 2749, 2749
} ;
static yy_state_type yy_last_accepting_state;
@@ -3178,7 +3304,7 @@ static void config_end_include(void)
#define YY_NO_INPUT 1
#endif
-#line 3180 "<stdout>"
+#line 3306 "<stdout>"
#define INITIAL 0
#define quotedstring 1
@@ -3401,7 +3527,7 @@ YY_DECL
{
#line 206 "util/configlexer.lex"
-#line 3403 "<stdout>"
+#line 3529 "<stdout>"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -3434,13 +3560,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 >= 2632 )
+ if ( yy_current_state >= 2750 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 7504 );
+ while ( yy_base[yy_current_state] != 7896 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -3575,72 +3701,72 @@ YY_RULE_SETUP
case 22:
YY_RULE_SETUP
#line 231 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_TCP_IDLE_TIMEOUT) }
YY_BREAK
case 23:
YY_RULE_SETUP
#line 232 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) }
YY_BREAK
case 24:
YY_RULE_SETUP
#line 233 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
+{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) }
YY_BREAK
case 25:
YY_RULE_SETUP
#line 234 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
+{ YDVAR(1, VAR_SSL_UPSTREAM) }
YY_BREAK
case 26:
YY_RULE_SETUP
#line 235 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
+{ YDVAR(1, VAR_SSL_UPSTREAM) }
YY_BREAK
case 27:
YY_RULE_SETUP
#line 236 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
+{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
YY_BREAK
case 28:
YY_RULE_SETUP
#line 237 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_PORT) }
+{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
YY_BREAK
case 29:
YY_RULE_SETUP
#line 238 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_PORT) }
+{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
YY_BREAK
case 30:
YY_RULE_SETUP
#line 239 "util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
+{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
YY_BREAK
case 31:
YY_RULE_SETUP
#line 240 "util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
+{ YDVAR(1, VAR_SSL_PORT) }
YY_BREAK
case 32:
YY_RULE_SETUP
#line 241 "util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_WIN_CERT) }
+{ YDVAR(1, VAR_SSL_PORT) }
YY_BREAK
case 33:
YY_RULE_SETUP
#line 242 "util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
+{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
YY_BREAK
case 34:
YY_RULE_SETUP
#line 243 "util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
+{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
YY_BREAK
case 35:
YY_RULE_SETUP
#line 244 "util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
+{ YDVAR(1, VAR_TLS_WIN_CERT) }
YY_BREAK
case 36:
YY_RULE_SETUP
@@ -3650,1097 +3776,1152 @@ YY_RULE_SETUP
case 37:
YY_RULE_SETUP
#line 246 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSTEMD) }
+{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
YY_BREAK
case 38:
YY_RULE_SETUP
#line 247 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_DAEMONIZE) }
+{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
YY_BREAK
case 39:
YY_RULE_SETUP
#line 248 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
YY_BREAK
case 40:
YY_RULE_SETUP
#line 249 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_USE_SYSTEMD) }
YY_BREAK
case 41:
YY_RULE_SETUP
#line 250 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
+{ YDVAR(1, VAR_DO_DAEMONIZE) }
YY_BREAK
case 42:
YY_RULE_SETUP
#line 251 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
+{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 43:
YY_RULE_SETUP
#line 252 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_RCVBUF) }
+{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 44:
YY_RULE_SETUP
#line 253 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_SNDBUF) }
+{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
YY_BREAK
case 45:
YY_RULE_SETUP
#line 254 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_REUSEPORT) }
+{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
YY_BREAK
case 46:
YY_RULE_SETUP
#line 255 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_TRANSPARENT) }
+{ YDVAR(1, VAR_SO_RCVBUF) }
YY_BREAK
case 47:
YY_RULE_SETUP
#line 256 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_FREEBIND) }
+{ YDVAR(1, VAR_SO_SNDBUF) }
YY_BREAK
case 48:
YY_RULE_SETUP
#line 257 "util/configlexer.lex"
-{ YDVAR(1, VAR_CHROOT) }
+{ YDVAR(1, VAR_SO_REUSEPORT) }
YY_BREAK
case 49:
YY_RULE_SETUP
#line 258 "util/configlexer.lex"
-{ YDVAR(1, VAR_USERNAME) }
+{ YDVAR(1, VAR_IP_TRANSPARENT) }
YY_BREAK
case 50:
YY_RULE_SETUP
#line 259 "util/configlexer.lex"
-{ YDVAR(1, VAR_DIRECTORY) }
+{ YDVAR(1, VAR_IP_FREEBIND) }
YY_BREAK
case 51:
YY_RULE_SETUP
#line 260 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOGFILE) }
+{ YDVAR(1, VAR_CHROOT) }
YY_BREAK
case 52:
YY_RULE_SETUP
#line 261 "util/configlexer.lex"
-{ YDVAR(1, VAR_PIDFILE) }
+{ YDVAR(1, VAR_USERNAME) }
YY_BREAK
case 53:
YY_RULE_SETUP
#line 262 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_HINTS) }
+{ YDVAR(1, VAR_DIRECTORY) }
YY_BREAK
case 54:
YY_RULE_SETUP
#line 263 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
+{ YDVAR(1, VAR_LOGFILE) }
YY_BREAK
case 55:
YY_RULE_SETUP
#line 264 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
+{ YDVAR(1, VAR_PIDFILE) }
YY_BREAK
case 56:
YY_RULE_SETUP
#line 265 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
+{ YDVAR(1, VAR_ROOT_HINTS) }
YY_BREAK
case 57:
YY_RULE_SETUP
#line 266 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
+{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
YY_BREAK
case 58:
YY_RULE_SETUP
#line 267 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
+{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
YY_BREAK
case 59:
YY_RULE_SETUP
#line 268 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
+{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
YY_BREAK
case 60:
YY_RULE_SETUP
#line 269 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_TTL) }
+{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
YY_BREAK
case 61:
YY_RULE_SETUP
#line 270 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
YY_BREAK
case 62:
YY_RULE_SETUP
#line 271 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
YY_BREAK
case 63:
YY_RULE_SETUP
#line 272 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_HOST_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_TTL) }
YY_BREAK
case 64:
YY_RULE_SETUP
#line 273 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_LAME_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
YY_BREAK
case 65:
YY_RULE_SETUP
#line 274 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
+{ YDVAR(1, VAR_CACHE_MIN_TTL) }
YY_BREAK
case 66:
YY_RULE_SETUP
#line 275 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
+{ YDVAR(1, VAR_INFRA_HOST_TTL) }
YY_BREAK
case 67:
YY_RULE_SETUP
#line 276 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
+{ YDVAR(1, VAR_INFRA_LAME_TTL) }
YY_BREAK
case 68:
YY_RULE_SETUP
#line 277 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
+{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
YY_BREAK
case 69:
YY_RULE_SETUP
#line 278 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
+{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
YY_BREAK
case 70:
YY_RULE_SETUP
#line 279 "util/configlexer.lex"
-{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
+{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
YY_BREAK
case 71:
YY_RULE_SETUP
#line 280 "util/configlexer.lex"
-{ YDVAR(1, VAR_DELAY_CLOSE) }
+{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
YY_BREAK
case 72:
YY_RULE_SETUP
#line 281 "util/configlexer.lex"
-{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
+{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
YY_BREAK
case 73:
YY_RULE_SETUP
#line 282 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
+{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
YY_BREAK
case 74:
YY_RULE_SETUP
#line 283 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
+{ YDVAR(1, VAR_DELAY_CLOSE) }
YY_BREAK
case 75:
YY_RULE_SETUP
#line 284 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_GLUE) }
+{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
YY_BREAK
case 76:
YY_RULE_SETUP
#line 285 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
+{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
YY_BREAK
case 77:
YY_RULE_SETUP
#line 286 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
+{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
YY_BREAK
case 78:
YY_RULE_SETUP
#line 287 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
+{ YDVAR(1, VAR_HARDEN_GLUE) }
YY_BREAK
case 79:
YY_RULE_SETUP
#line 288 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
+{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
YY_BREAK
case 80:
YY_RULE_SETUP
#line 289 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
+{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
YY_BREAK
case 81:
YY_RULE_SETUP
#line 290 "util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
YY_BREAK
case 82:
YY_RULE_SETUP
#line 291 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
+{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
YY_BREAK
case 83:
YY_RULE_SETUP
#line 292 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
+{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
YY_BREAK
case 84:
YY_RULE_SETUP
#line 293 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
YY_BREAK
case 85:
YY_RULE_SETUP
#line 294 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH_KEY) }
+{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
YY_BREAK
case 86:
YY_RULE_SETUP
#line 295 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH) }
+{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
YY_BREAK
case 87:
YY_RULE_SETUP
#line 296 "util/configlexer.lex"
-{ YDVAR(0, VAR_STUB_ZONE) }
+{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
YY_BREAK
case 88:
YY_RULE_SETUP
#line 297 "util/configlexer.lex"
-{ YDVAR(1, VAR_NAME) }
+{ YDVAR(1, VAR_PREFETCH_KEY) }
YY_BREAK
case 89:
YY_RULE_SETUP
#line 298 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_ADDR) }
+{ YDVAR(1, VAR_PREFETCH) }
YY_BREAK
case 90:
YY_RULE_SETUP
#line 299 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_HOST) }
+{ YDVAR(0, VAR_STUB_ZONE) }
YY_BREAK
case 91:
YY_RULE_SETUP
#line 300 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_PRIME) }
+{ YDVAR(1, VAR_NAME) }
YY_BREAK
case 92:
YY_RULE_SETUP
#line 301 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_FIRST) }
+{ YDVAR(1, VAR_STUB_ADDR) }
YY_BREAK
case 93:
YY_RULE_SETUP
#line 302 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_HOST) }
YY_BREAK
case 94:
YY_RULE_SETUP
#line 303 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_PRIME) }
YY_BREAK
case 95:
YY_RULE_SETUP
#line 304 "util/configlexer.lex"
-{ YDVAR(0, VAR_FORWARD_ZONE) }
+{ YDVAR(1, VAR_STUB_FIRST) }
YY_BREAK
case 96:
YY_RULE_SETUP
#line 305 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_ADDR) }
+{ YDVAR(1, VAR_STUB_NO_CACHE) }
YY_BREAK
case 97:
YY_RULE_SETUP
#line 306 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_HOST) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
YY_BREAK
case 98:
YY_RULE_SETUP
#line 307 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_FIRST) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
YY_BREAK
case 99:
YY_RULE_SETUP
#line 308 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(0, VAR_FORWARD_ZONE) }
YY_BREAK
case 100:
YY_RULE_SETUP
#line 309 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_ADDR) }
YY_BREAK
case 101:
YY_RULE_SETUP
#line 310 "util/configlexer.lex"
-{ YDVAR(0, VAR_AUTH_ZONE) }
+{ YDVAR(1, VAR_FORWARD_HOST) }
YY_BREAK
case 102:
YY_RULE_SETUP
#line 311 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEFILE) }
+{ YDVAR(1, VAR_FORWARD_FIRST) }
YY_BREAK
case 103:
YY_RULE_SETUP
#line 312 "util/configlexer.lex"
-{ YDVAR(1, VAR_MASTER) }
+{ YDVAR(1, VAR_FORWARD_NO_CACHE) }
YY_BREAK
case 104:
YY_RULE_SETUP
#line 313 "util/configlexer.lex"
-{ YDVAR(1, VAR_URL) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
YY_BREAK
case 105:
YY_RULE_SETUP
#line 314 "util/configlexer.lex"
-{ YDVAR(1, VAR_ALLOW_NOTIFY) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
YY_BREAK
case 106:
YY_RULE_SETUP
#line 315 "util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
+{ YDVAR(0, VAR_AUTH_ZONE) }
YY_BREAK
case 107:
YY_RULE_SETUP
#line 316 "util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_UPSTREAM) }
+{ YDVAR(1, VAR_ZONEFILE) }
YY_BREAK
case 108:
YY_RULE_SETUP
#line 317 "util/configlexer.lex"
-{ YDVAR(1, VAR_FALLBACK_ENABLED) }
+{ YDVAR(1, VAR_MASTER) }
YY_BREAK
case 109:
YY_RULE_SETUP
#line 318 "util/configlexer.lex"
-{ YDVAR(0, VAR_VIEW) }
+{ YDVAR(1, VAR_URL) }
YY_BREAK
case 110:
YY_RULE_SETUP
#line 319 "util/configlexer.lex"
-{ YDVAR(1, VAR_VIEW_FIRST) }
+{ YDVAR(1, VAR_ALLOW_NOTIFY) }
YY_BREAK
case 111:
YY_RULE_SETUP
#line 320 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
+{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
YY_BREAK
case 112:
YY_RULE_SETUP
#line 321 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
+{ YDVAR(1, VAR_FOR_UPSTREAM) }
YY_BREAK
case 113:
YY_RULE_SETUP
#line 322 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL) }
+{ YDVAR(1, VAR_FALLBACK_ENABLED) }
YY_BREAK
case 114:
YY_RULE_SETUP
#line 323 "util/configlexer.lex"
-{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
+{ YDVAR(0, VAR_VIEW) }
YY_BREAK
case 115:
YY_RULE_SETUP
#line 324 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
+{ YDVAR(1, VAR_VIEW_FIRST) }
YY_BREAK
case 116:
YY_RULE_SETUP
#line 325 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
YY_BREAK
case 117:
YY_RULE_SETUP
#line 326 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
YY_BREAK
case 118:
YY_RULE_SETUP
#line 327 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
+{ YDVAR(2, VAR_ACCESS_CONTROL) }
YY_BREAK
case 119:
YY_RULE_SETUP
#line 328 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
YY_BREAK
case 120:
YY_RULE_SETUP
#line 329 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
YY_BREAK
case 121:
YY_RULE_SETUP
#line 330 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
YY_BREAK
case 122:
YY_RULE_SETUP
#line 331 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
YY_BREAK
case 123:
YY_RULE_SETUP
#line 332 "util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
YY_BREAK
case 124:
YY_RULE_SETUP
#line 333 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
YY_BREAK
case 125:
YY_RULE_SETUP
#line 334 "util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
+{ YDVAR(1, VAR_HIDE_IDENTITY) }
YY_BREAK
case 126:
YY_RULE_SETUP
#line 335 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
+{ YDVAR(1, VAR_HIDE_VERSION) }
YY_BREAK
case 127:
YY_RULE_SETUP
#line 336 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
+{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
YY_BREAK
case 128:
YY_RULE_SETUP
#line 337 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_IDENTITY) }
YY_BREAK
case 129:
YY_RULE_SETUP
#line 338 "util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_VERSION) }
YY_BREAK
case 130:
YY_RULE_SETUP
#line 339 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
+{ YDVAR(1, VAR_MODULE_CONF) }
YY_BREAK
case 131:
YY_RULE_SETUP
#line 340 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
+{ YDVAR(1, VAR_DLV_ANCHOR) }
YY_BREAK
case 132:
YY_RULE_SETUP
#line 341 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
+{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
YY_BREAK
case 133:
YY_RULE_SETUP
#line 342 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
YY_BREAK
case 134:
YY_RULE_SETUP
#line 343 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
+{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
YY_BREAK
case 135:
YY_RULE_SETUP
#line 344 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
+{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
YY_BREAK
case 136:
YY_RULE_SETUP
#line 345 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+{ YDVAR(1, VAR_TRUST_ANCHOR) }
YY_BREAK
case 137:
YY_RULE_SETUP
#line 346 "util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
YY_BREAK
case 138:
YY_RULE_SETUP
#line 347 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
+{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
YY_BREAK
case 139:
YY_RULE_SETUP
#line 348 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
+{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
YY_BREAK
case 140:
YY_RULE_SETUP
#line 349 "util/configlexer.lex"
-{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
YY_BREAK
case 141:
YY_RULE_SETUP
#line 350 "util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
YY_BREAK
case 142:
YY_RULE_SETUP
#line 351 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_BOGUS_TTL) }
YY_BREAK
case 143:
YY_RULE_SETUP
#line 352 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_DSA) }
+{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
YY_BREAK
case 144:
YY_RULE_SETUP
#line 353 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_SHA1) }
+{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
YY_BREAK
case 145:
YY_RULE_SETUP
#line 354 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
YY_BREAK
case 146:
YY_RULE_SETUP
#line 355 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
YY_BREAK
case 147:
YY_RULE_SETUP
#line 356 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+{ YDVAR(1, VAR_SERVE_EXPIRED) }
YY_BREAK
case 148:
YY_RULE_SETUP
#line 357 "util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
YY_BREAK
case 149:
YY_RULE_SETUP
#line 358 "util/configlexer.lex"
-{
- YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
YY_BREAK
case 150:
YY_RULE_SETUP
-#line 360 "util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
+#line 359 "util/configlexer.lex"
+{ YDVAR(1, VAR_FAKE_DSA) }
YY_BREAK
case 151:
YY_RULE_SETUP
-#line 361 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
+#line 360 "util/configlexer.lex"
+{ YDVAR(1, VAR_FAKE_SHA1) }
YY_BREAK
case 152:
YY_RULE_SETUP
-#line 362 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
+#line 361 "util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
YY_BREAK
case 153:
YY_RULE_SETUP
-#line 363 "util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
+#line 362 "util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
YY_BREAK
case 154:
YY_RULE_SETUP
-#line 364 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+#line 363 "util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
YY_BREAK
case 155:
YY_RULE_SETUP
-#line 365 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_IDENTITY) }
+#line 364 "util/configlexer.lex"
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
YY_BREAK
case 156:
YY_RULE_SETUP
-#line 366 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+#line 365 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
YY_BREAK
case 157:
YY_RULE_SETUP
#line 367 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_ADD_HOLDDOWN) }
YY_BREAK
case 158:
YY_RULE_SETUP
#line 368 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_REPLIES) }
+{ YDVAR(1, VAR_DEL_HOLDDOWN) }
YY_BREAK
case 159:
YY_RULE_SETUP
#line 369 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_KEEP_MISSING) }
YY_BREAK
case 160:
YY_RULE_SETUP
#line 370 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
YY_BREAK
case 161:
YY_RULE_SETUP
#line 371 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
YY_BREAK
case 162:
YY_RULE_SETUP
#line 372 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOG_IDENTITY) }
YY_BREAK
case 163:
YY_RULE_SETUP
#line 373 "util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
YY_BREAK
case 164:
YY_RULE_SETUP
#line 374 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
YY_BREAK
case 165:
YY_RULE_SETUP
#line 375 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_LOG_REPLIES) }
YY_BREAK
case 166:
YY_RULE_SETUP
#line 376 "util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
YY_BREAK
case 167:
YY_RULE_SETUP
#line 377 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_ENABLE) }
+{ YDVAR(1, VAR_LOG_SERVFAIL) }
YY_BREAK
case 168:
YY_RULE_SETUP
#line 378 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_KEY) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
YY_BREAK
case 169:
YY_RULE_SETUP
#line 379 "util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
YY_BREAK
case 170:
YY_RULE_SETUP
#line 380 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
YY_BREAK
case 171:
YY_RULE_SETUP
#line 381 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
YY_BREAK
case 172:
YY_RULE_SETUP
#line 382 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
YY_BREAK
case 173:
YY_RULE_SETUP
#line 383 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
YY_BREAK
case 174:
YY_RULE_SETUP
#line 384 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
YY_BREAK
case 175:
YY_RULE_SETUP
#line 385 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
YY_BREAK
case 176:
YY_RULE_SETUP
#line 386 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_SHM_ENABLE) }
YY_BREAK
case 177:
YY_RULE_SETUP
#line 387 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_SHM_KEY) }
YY_BREAK
case 178:
YY_RULE_SETUP
#line 388 "util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
YY_BREAK
case 179:
YY_RULE_SETUP
#line 389 "util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
YY_BREAK
case 180:
YY_RULE_SETUP
#line 390 "util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
YY_BREAK
case 181:
YY_RULE_SETUP
#line 391 "util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
YY_BREAK
case 182:
YY_RULE_SETUP
#line 392 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
YY_BREAK
case 183:
YY_RULE_SETUP
#line 393 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
YY_BREAK
case 184:
YY_RULE_SETUP
#line 394 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
YY_BREAK
case 185:
YY_RULE_SETUP
#line 395 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
YY_BREAK
case 186:
YY_RULE_SETUP
#line 396 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEFINE_TAG) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
YY_BREAK
case 187:
YY_RULE_SETUP
#line 397 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
YY_BREAK
case 188:
YY_RULE_SETUP
#line 398 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
+{ YDVAR(0, VAR_PYTHON) }
YY_BREAK
case 189:
YY_RULE_SETUP
#line 399 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
YY_BREAK
case 190:
YY_RULE_SETUP
#line 400 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
YY_BREAK
case 191:
YY_RULE_SETUP
#line 401 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
YY_BREAK
case 192:
YY_RULE_SETUP
#line 402 "util/configlexer.lex"
-{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
YY_BREAK
case 193:
YY_RULE_SETUP
#line 403 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
YY_BREAK
case 194:
YY_RULE_SETUP
#line 404 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
YY_BREAK
case 195:
YY_RULE_SETUP
#line 405 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
YY_BREAK
case 196:
YY_RULE_SETUP
#line 406 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+{ YDVAR(1, VAR_DEFINE_TAG) }
YY_BREAK
case 197:
YY_RULE_SETUP
#line 407 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
YY_BREAK
case 198:
YY_RULE_SETUP
#line 408 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
YY_BREAK
case 199:
YY_RULE_SETUP
#line 409 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
YY_BREAK
case 200:
YY_RULE_SETUP
#line 410 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
YY_BREAK
case 201:
YY_RULE_SETUP
-#line 412 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+#line 411 "util/configlexer.lex"
+{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
YY_BREAK
case 202:
YY_RULE_SETUP
-#line 414 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+#line 412 "util/configlexer.lex"
+{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
YY_BREAK
case 203:
YY_RULE_SETUP
-#line 416 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+#line 413 "util/configlexer.lex"
+{ YDVAR(0, VAR_DNSTAP) }
YY_BREAK
case 204:
YY_RULE_SETUP
-#line 418 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+#line 414 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
YY_BREAK
case 205:
YY_RULE_SETUP
-#line 420 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+#line 415 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
YY_BREAK
case 206:
YY_RULE_SETUP
-#line 422 "util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
+#line 416 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
YY_BREAK
case 207:
YY_RULE_SETUP
-#line 423 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
+#line 417 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
YY_BREAK
case 208:
YY_RULE_SETUP
-#line 424 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+#line 418 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
YY_BREAK
case 209:
YY_RULE_SETUP
-#line 425 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
+#line 419 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
YY_BREAK
case 210:
YY_RULE_SETUP
-#line 426 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+#line 420 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
YY_BREAK
case 211:
YY_RULE_SETUP
-#line 427 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
+#line 422 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
YY_BREAK
case 212:
YY_RULE_SETUP
-#line 428 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+#line 424 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
YY_BREAK
case 213:
YY_RULE_SETUP
-#line 429 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+#line 426 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
YY_BREAK
case 214:
YY_RULE_SETUP
-#line 430 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+#line 428 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
YY_BREAK
case 215:
YY_RULE_SETUP
-#line 431 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
+#line 430 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
YY_BREAK
case 216:
YY_RULE_SETUP
#line 432 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
YY_BREAK
case 217:
YY_RULE_SETUP
#line 433 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT) }
+{ YDVAR(1, VAR_IP_RATELIMIT) }
YY_BREAK
case 218:
YY_RULE_SETUP
#line 434 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT_PERMIL) }
+{ YDVAR(1, VAR_RATELIMIT) }
YY_BREAK
case 219:
YY_RULE_SETUP
#line 435 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT_PERMIL) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
YY_BREAK
case 220:
YY_RULE_SETUP
#line 436 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
YY_BREAK
case 221:
YY_RULE_SETUP
#line 437 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
YY_BREAK
case 222:
YY_RULE_SETUP
#line 438 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
YY_BREAK
case 223:
YY_RULE_SETUP
#line 439 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
YY_BREAK
case 224:
YY_RULE_SETUP
#line 440 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
YY_BREAK
case 225:
YY_RULE_SETUP
#line 441 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
+{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
YY_BREAK
case 226:
YY_RULE_SETUP
#line 442 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
YY_BREAK
case 227:
YY_RULE_SETUP
#line 443 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
+{ YDVAR(1, VAR_LOW_RTT) }
YY_BREAK
case 228:
YY_RULE_SETUP
#line 444 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
+{ YDVAR(1, VAR_LOW_RTT_PERMIL) }
YY_BREAK
case 229:
YY_RULE_SETUP
#line 445 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
+{ YDVAR(1, VAR_LOW_RTT_PERMIL) }
YY_BREAK
case 230:
YY_RULE_SETUP
#line 446 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
+{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
YY_BREAK
case 231:
YY_RULE_SETUP
-#line 448 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
+#line 447 "util/configlexer.lex"
+{ YDVAR(2, VAR_RESPONSE_IP) }
YY_BREAK
case 232:
YY_RULE_SETUP
-#line 450 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
+#line 448 "util/configlexer.lex"
+{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
YY_BREAK
case 233:
YY_RULE_SETUP
-#line 451 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
+#line 449 "util/configlexer.lex"
+{ YDVAR(0, VAR_DNSCRYPT) }
YY_BREAK
case 234:
YY_RULE_SETUP
-#line 452 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
+#line 450 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
YY_BREAK
case 235:
YY_RULE_SETUP
-#line 453 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
+#line 451 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PORT) }
YY_BREAK
case 236:
YY_RULE_SETUP
-#line 454 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_HOOK) }
+#line 452 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
YY_BREAK
case 237:
YY_RULE_SETUP
-#line 455 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
+#line 453 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
YY_BREAK
case 238:
YY_RULE_SETUP
-#line 456 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+#line 454 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
YY_BREAK
case 239:
YY_RULE_SETUP
-#line 457 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+#line 455 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
YY_BREAK
case 240:
YY_RULE_SETUP
-#line 458 "util/configlexer.lex"
-{ YDVAR(0, VAR_CACHEDB) }
+#line 456 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
YY_BREAK
case 241:
YY_RULE_SETUP
-#line 459 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+#line 458 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
YY_BREAK
case 242:
YY_RULE_SETUP
#line 460 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
YY_BREAK
case 243:
YY_RULE_SETUP
#line 461 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
YY_BREAK
case 244:
YY_RULE_SETUP
#line 462 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
YY_BREAK
case 245:
YY_RULE_SETUP
#line 463 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
YY_BREAK
case 246:
YY_RULE_SETUP
#line 464 "util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+{ YDVAR(1, VAR_IPSECMOD_HOOK) }
YY_BREAK
case 247:
-/* rule 247 can match eol */
YY_RULE_SETUP
#line 465 "util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++; }
+{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
YY_BREAK
-/* Quoted strings. Strip leading and ending quotes */
case 248:
YY_RULE_SETUP
+#line 466 "util/configlexer.lex"
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+ YY_BREAK
+case 249:
+YY_RULE_SETUP
+#line 467 "util/configlexer.lex"
+{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+ YY_BREAK
+case 250:
+YY_RULE_SETUP
#line 468 "util/configlexer.lex"
+{ YDVAR(0, VAR_CACHEDB) }
+ YY_BREAK
+case 251:
+YY_RULE_SETUP
+#line 469 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+ YY_BREAK
+case 252:
+YY_RULE_SETUP
+#line 470 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+ YY_BREAK
+case 253:
+YY_RULE_SETUP
+#line 471 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+ YY_BREAK
+case 254:
+YY_RULE_SETUP
+#line 472 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+ YY_BREAK
+case 255:
+YY_RULE_SETUP
+#line 473 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+ YY_BREAK
+case 256:
+YY_RULE_SETUP
+#line 474 "util/configlexer.lex"
+{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+ YY_BREAK
+case 257:
+YY_RULE_SETUP
+#line 475 "util/configlexer.lex"
+{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+ YY_BREAK
+case 258:
+/* rule 258 can match eol */
+YY_RULE_SETUP
+#line 476 "util/configlexer.lex"
+{ LEXOUT(("NL\n")); cfg_parser->line++; }
+ YY_BREAK
+/* Quoted strings. Strip leading and ending quotes */
+case 259:
+YY_RULE_SETUP
+#line 479 "util/configlexer.lex"
{ BEGIN(quotedstring); LEXOUT(("QS ")); }
YY_BREAK
case YY_STATE_EOF(quotedstring):
-#line 469 "util/configlexer.lex"
+#line 480 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 249:
+case 260:
YY_RULE_SETUP
-#line 474 "util/configlexer.lex"
+#line 485 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 250:
-/* rule 250 can match eol */
+case 261:
+/* rule 261 can match eol */
YY_RULE_SETUP
-#line 475 "util/configlexer.lex"
+#line 486 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end \"");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 251:
+case 262:
YY_RULE_SETUP
-#line 477 "util/configlexer.lex"
+#line 488 "util/configlexer.lex"
{
LEXOUT(("QE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -4753,34 +4934,34 @@ YY_RULE_SETUP
}
YY_BREAK
/* Single Quoted strings. Strip leading and ending quotes */
-case 252:
+case 263:
YY_RULE_SETUP
-#line 489 "util/configlexer.lex"
+#line 500 "util/configlexer.lex"
{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
YY_BREAK
case YY_STATE_EOF(singlequotedstr):
-#line 490 "util/configlexer.lex"
+#line 501 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 253:
+case 264:
YY_RULE_SETUP
-#line 495 "util/configlexer.lex"
+#line 506 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 254:
-/* rule 254 can match eol */
+case 265:
+/* rule 265 can match eol */
YY_RULE_SETUP
-#line 496 "util/configlexer.lex"
+#line 507 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end '");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 255:
+case 266:
YY_RULE_SETUP
-#line 498 "util/configlexer.lex"
+#line 509 "util/configlexer.lex"
{
LEXOUT(("SQE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -4793,38 +4974,38 @@ YY_RULE_SETUP
}
YY_BREAK
/* include: directive */
-case 256:
+case 267:
YY_RULE_SETUP
-#line 510 "util/configlexer.lex"
+#line 521 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
YY_BREAK
case YY_STATE_EOF(include):
-#line 512 "util/configlexer.lex"
+#line 523 "util/configlexer.lex"
{
yyerror("EOF inside include directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 257:
+case 268:
YY_RULE_SETUP
-#line 516 "util/configlexer.lex"
+#line 527 "util/configlexer.lex"
{ LEXOUT(("ISP ")); /* ignore */ }
YY_BREAK
-case 258:
-/* rule 258 can match eol */
+case 269:
+/* rule 269 can match eol */
YY_RULE_SETUP
-#line 517 "util/configlexer.lex"
+#line 528 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++;}
YY_BREAK
-case 259:
+case 270:
YY_RULE_SETUP
-#line 518 "util/configlexer.lex"
+#line 529 "util/configlexer.lex"
{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
YY_BREAK
-case 260:
+case 271:
YY_RULE_SETUP
-#line 519 "util/configlexer.lex"
+#line 530 "util/configlexer.lex"
{
LEXOUT(("Iunquotedstr(%s) ", yytext));
config_start_include_glob(yytext);
@@ -4832,27 +5013,27 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_quoted):
-#line 524 "util/configlexer.lex"
+#line 535 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 261:
+case 272:
YY_RULE_SETUP
-#line 528 "util/configlexer.lex"
+#line 539 "util/configlexer.lex"
{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 262:
-/* rule 262 can match eol */
+case 273:
+/* rule 273 can match eol */
YY_RULE_SETUP
-#line 529 "util/configlexer.lex"
+#line 540 "util/configlexer.lex"
{ yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev); }
YY_BREAK
-case 263:
+case 274:
YY_RULE_SETUP
-#line 531 "util/configlexer.lex"
+#line 542 "util/configlexer.lex"
{
LEXOUT(("IQE "));
yytext[yyleng - 1] = '\0';
@@ -4862,7 +5043,7 @@ YY_RULE_SETUP
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(val):
-#line 537 "util/configlexer.lex"
+#line 548 "util/configlexer.lex"
{
LEXOUT(("LEXEOF "));
yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
@@ -4874,33 +5055,33 @@ case YY_STATE_EOF(val):
}
}
YY_BREAK
-case 264:
+case 275:
YY_RULE_SETUP
-#line 548 "util/configlexer.lex"
+#line 559 "util/configlexer.lex"
{ LEXOUT(("unquotedstr(%s) ", yytext));
if(--num_args == 0) { BEGIN(INITIAL); }
yylval.str = strdup(yytext); return STRING_ARG; }
YY_BREAK
-case 265:
+case 276:
YY_RULE_SETUP
-#line 552 "util/configlexer.lex"
+#line 563 "util/configlexer.lex"
{
ub_c_error_msg("unknown keyword '%s'", yytext);
}
YY_BREAK
-case 266:
+case 277:
YY_RULE_SETUP
-#line 556 "util/configlexer.lex"
+#line 567 "util/configlexer.lex"
{
ub_c_error_msg("stray '%s'", yytext);
}
YY_BREAK
-case 267:
+case 278:
YY_RULE_SETUP
-#line 560 "util/configlexer.lex"
+#line 571 "util/configlexer.lex"
ECHO;
YY_BREAK
-#line 4902 "<stdout>"
+#line 5083 "<stdout>"
case YY_END_OF_BUFFER:
{
@@ -5191,7 +5372,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 >= 2632 )
+ if ( yy_current_state >= 2750 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
@@ -5219,11 +5400,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 >= 2632 )
+ if ( yy_current_state >= 2750 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
- yy_is_jam = (yy_current_state == 2631);
+ yy_is_jam = (yy_current_state == 2749);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -5862,7 +6043,7 @@ void yyfree (void * ptr )
#define YYTABLES_NAME "yytables"
-#line 560 "util/configlexer.lex"
+#line 571 "util/configlexer.lex"
diff --git a/util/configlexer.lex b/util/configlexer.lex
index 6124e32bd240..75796048491a 100644
--- a/util/configlexer.lex
+++ b/util/configlexer.lex
@@ -228,6 +228,9 @@ do-tcp{COLON} { YDVAR(1, VAR_DO_TCP) }
tcp-upstream{COLON} { YDVAR(1, VAR_TCP_UPSTREAM) }
tcp-mss{COLON} { YDVAR(1, VAR_TCP_MSS) }
outgoing-tcp-mss{COLON} { YDVAR(1, VAR_OUTGOING_TCP_MSS) }
+tcp-idle-timeout{COLON} { YDVAR(1, VAR_TCP_IDLE_TIMEOUT) }
+edns-tcp-keepalive{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) }
+edns-tcp-keepalive-timeout{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) }
ssl-upstream{COLON} { YDVAR(1, VAR_SSL_UPSTREAM) }
tls-upstream{COLON} { YDVAR(1, VAR_SSL_UPSTREAM) }
ssl-service-key{COLON} { YDVAR(1, VAR_SSL_SERVICE_KEY) }
@@ -299,12 +302,14 @@ stub-addr{COLON} { YDVAR(1, VAR_STUB_ADDR) }
stub-host{COLON} { YDVAR(1, VAR_STUB_HOST) }
stub-prime{COLON} { YDVAR(1, VAR_STUB_PRIME) }
stub-first{COLON} { YDVAR(1, VAR_STUB_FIRST) }
+stub-no-cache{COLON} { YDVAR(1, VAR_STUB_NO_CACHE) }
stub-ssl-upstream{COLON} { YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
stub-tls-upstream{COLON} { YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
forward-zone{COLON} { YDVAR(0, VAR_FORWARD_ZONE) }
forward-addr{COLON} { YDVAR(1, VAR_FORWARD_ADDR) }
forward-host{COLON} { YDVAR(1, VAR_FORWARD_HOST) }
forward-first{COLON} { YDVAR(1, VAR_FORWARD_FIRST) }
+forward-no-cache{COLON} { YDVAR(1, VAR_FORWARD_NO_CACHE) }
forward-ssl-upstream{COLON} { YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
forward-tls-upstream{COLON} { YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
auth-zone{COLON} { YDVAR(0, VAR_AUTH_ZONE) }
@@ -349,6 +354,8 @@ val-permissive-mode{COLON} { YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
aggressive-nsec{COLON} { YDVAR(1, VAR_AGGRESSIVE_NSEC) }
ignore-cd-flag{COLON} { YDVAR(1, VAR_IGNORE_CD_FLAG) }
serve-expired{COLON} { YDVAR(1, VAR_SERVE_EXPIRED) }
+serve-expired-ttl{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
+serve-expired-ttl-reset{COLON} { YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
fake-dsa{COLON} { YDVAR(1, VAR_FAKE_DSA) }
fake-sha1{COLON} { YDVAR(1, VAR_FAKE_SHA1) }
val-log-level{COLON} { YDVAR(1, VAR_VAL_LOG_LEVEL) }
@@ -366,6 +373,8 @@ log-identity{COLON} { YDVAR(1, VAR_LOG_IDENTITY) }
log-time-ascii{COLON} { YDVAR(1, VAR_LOG_TIME_ASCII) }
log-queries{COLON} { YDVAR(1, VAR_LOG_QUERIES) }
log-replies{COLON} { YDVAR(1, VAR_LOG_REPLIES) }
+log-local-actions{COLON} { YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
+log-servfail{COLON} { YDVAR(1, VAR_LOG_SERVFAIL) }
local-zone{COLON} { YDVAR(2, VAR_LOCAL_ZONE) }
local-data{COLON} { YDVAR(1, VAR_LOCAL_DATA) }
local-data-ptr{COLON} { YDVAR(1, VAR_LOCAL_DATA_PTR) }
@@ -393,6 +402,7 @@ rrset-roundrobin{COLON} { YDVAR(1, VAR_RRSET_ROUNDROBIN) }
max-udp-size{COLON} { YDVAR(1, VAR_MAX_UDP_SIZE) }
dns64-prefix{COLON} { YDVAR(1, VAR_DNS64_PREFIX) }
dns64-synthall{COLON} { YDVAR(1, VAR_DNS64_SYNTHALL) }
+dns64-ignore-aaaa{COLON} { YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
define-tag{COLON} { YDVAR(1, VAR_DEFINE_TAG) }
local-zone-tag{COLON} { YDVAR(2, VAR_LOCAL_ZONE_TAG) }
access-control-tag{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
@@ -462,6 +472,7 @@ redis-server-host{COLON} { YDVAR(1, VAR_CACHEDB_REDISHOST) }
redis-server-port{COLON} { YDVAR(1, VAR_CACHEDB_REDISPORT) }
redis-timeout{COLON} { YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
udp-upstream-without-downstream{COLON} { YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+tcp-connection-limit{COLON} { YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
/* Quoted strings. Strip leading and ending quotes */
diff --git a/util/configparser.c b/util/configparser.c
index 820a6fd9560e..ce0ef7d587a8 100644
--- a/util/configparser.c
+++ b/util/configparser.c
@@ -147,225 +147,236 @@ extern int yydebug;
VAR_DO_TCP = 276,
VAR_TCP_MSS = 277,
VAR_OUTGOING_TCP_MSS = 278,
- VAR_CHROOT = 279,
- VAR_USERNAME = 280,
- VAR_DIRECTORY = 281,
- VAR_LOGFILE = 282,
- VAR_PIDFILE = 283,
- VAR_MSG_CACHE_SIZE = 284,
- VAR_MSG_CACHE_SLABS = 285,
- VAR_NUM_QUERIES_PER_THREAD = 286,
- VAR_RRSET_CACHE_SIZE = 287,
- VAR_RRSET_CACHE_SLABS = 288,
- VAR_OUTGOING_NUM_TCP = 289,
- VAR_INFRA_HOST_TTL = 290,
- VAR_INFRA_LAME_TTL = 291,
- VAR_INFRA_CACHE_SLABS = 292,
- VAR_INFRA_CACHE_NUMHOSTS = 293,
- VAR_INFRA_CACHE_LAME_SIZE = 294,
- VAR_NAME = 295,
- VAR_STUB_ZONE = 296,
- VAR_STUB_HOST = 297,
- VAR_STUB_ADDR = 298,
- VAR_TARGET_FETCH_POLICY = 299,
- VAR_HARDEN_SHORT_BUFSIZE = 300,
- VAR_HARDEN_LARGE_QUERIES = 301,
- VAR_FORWARD_ZONE = 302,
- VAR_FORWARD_HOST = 303,
- VAR_FORWARD_ADDR = 304,
- VAR_DO_NOT_QUERY_ADDRESS = 305,
- VAR_HIDE_IDENTITY = 306,
- VAR_HIDE_VERSION = 307,
- VAR_IDENTITY = 308,
- VAR_VERSION = 309,
- VAR_HARDEN_GLUE = 310,
- VAR_MODULE_CONF = 311,
- VAR_TRUST_ANCHOR_FILE = 312,
- VAR_TRUST_ANCHOR = 313,
- VAR_VAL_OVERRIDE_DATE = 314,
- VAR_BOGUS_TTL = 315,
- VAR_VAL_CLEAN_ADDITIONAL = 316,
- VAR_VAL_PERMISSIVE_MODE = 317,
- VAR_INCOMING_NUM_TCP = 318,
- VAR_MSG_BUFFER_SIZE = 319,
- VAR_KEY_CACHE_SIZE = 320,
- VAR_KEY_CACHE_SLABS = 321,
- VAR_TRUSTED_KEYS_FILE = 322,
- VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 323,
- VAR_USE_SYSLOG = 324,
- VAR_OUTGOING_INTERFACE = 325,
- VAR_ROOT_HINTS = 326,
- VAR_DO_NOT_QUERY_LOCALHOST = 327,
- VAR_CACHE_MAX_TTL = 328,
- VAR_HARDEN_DNSSEC_STRIPPED = 329,
- VAR_ACCESS_CONTROL = 330,
- VAR_LOCAL_ZONE = 331,
- VAR_LOCAL_DATA = 332,
- VAR_INTERFACE_AUTOMATIC = 333,
- VAR_STATISTICS_INTERVAL = 334,
- VAR_DO_DAEMONIZE = 335,
- VAR_USE_CAPS_FOR_ID = 336,
- VAR_STATISTICS_CUMULATIVE = 337,
- VAR_OUTGOING_PORT_PERMIT = 338,
- VAR_OUTGOING_PORT_AVOID = 339,
- VAR_DLV_ANCHOR_FILE = 340,
- VAR_DLV_ANCHOR = 341,
- VAR_NEG_CACHE_SIZE = 342,
- VAR_HARDEN_REFERRAL_PATH = 343,
- VAR_PRIVATE_ADDRESS = 344,
- VAR_PRIVATE_DOMAIN = 345,
- VAR_REMOTE_CONTROL = 346,
- VAR_CONTROL_ENABLE = 347,
- VAR_CONTROL_INTERFACE = 348,
- VAR_CONTROL_PORT = 349,
- VAR_SERVER_KEY_FILE = 350,
- VAR_SERVER_CERT_FILE = 351,
- VAR_CONTROL_KEY_FILE = 352,
- VAR_CONTROL_CERT_FILE = 353,
- VAR_CONTROL_USE_CERT = 354,
- VAR_EXTENDED_STATISTICS = 355,
- VAR_LOCAL_DATA_PTR = 356,
- VAR_JOSTLE_TIMEOUT = 357,
- VAR_STUB_PRIME = 358,
- VAR_UNWANTED_REPLY_THRESHOLD = 359,
- VAR_LOG_TIME_ASCII = 360,
- VAR_DOMAIN_INSECURE = 361,
- VAR_PYTHON = 362,
- VAR_PYTHON_SCRIPT = 363,
- VAR_VAL_SIG_SKEW_MIN = 364,
- VAR_VAL_SIG_SKEW_MAX = 365,
- VAR_CACHE_MIN_TTL = 366,
- VAR_VAL_LOG_LEVEL = 367,
- VAR_AUTO_TRUST_ANCHOR_FILE = 368,
- VAR_KEEP_MISSING = 369,
- VAR_ADD_HOLDDOWN = 370,
- VAR_DEL_HOLDDOWN = 371,
- VAR_SO_RCVBUF = 372,
- VAR_EDNS_BUFFER_SIZE = 373,
- VAR_PREFETCH = 374,
- VAR_PREFETCH_KEY = 375,
- VAR_SO_SNDBUF = 376,
- VAR_SO_REUSEPORT = 377,
- VAR_HARDEN_BELOW_NXDOMAIN = 378,
- VAR_IGNORE_CD_FLAG = 379,
- VAR_LOG_QUERIES = 380,
- VAR_LOG_REPLIES = 381,
- VAR_TCP_UPSTREAM = 382,
- VAR_SSL_UPSTREAM = 383,
- VAR_SSL_SERVICE_KEY = 384,
- VAR_SSL_SERVICE_PEM = 385,
- VAR_SSL_PORT = 386,
- VAR_FORWARD_FIRST = 387,
- VAR_STUB_SSL_UPSTREAM = 388,
- VAR_FORWARD_SSL_UPSTREAM = 389,
- VAR_TLS_CERT_BUNDLE = 390,
- VAR_STUB_FIRST = 391,
- VAR_MINIMAL_RESPONSES = 392,
- VAR_RRSET_ROUNDROBIN = 393,
- VAR_MAX_UDP_SIZE = 394,
- VAR_DELAY_CLOSE = 395,
- VAR_UNBLOCK_LAN_ZONES = 396,
- VAR_INSECURE_LAN_ZONES = 397,
- VAR_INFRA_CACHE_MIN_RTT = 398,
- VAR_DNS64_PREFIX = 399,
- VAR_DNS64_SYNTHALL = 400,
- VAR_DNSTAP = 401,
- VAR_DNSTAP_ENABLE = 402,
- VAR_DNSTAP_SOCKET_PATH = 403,
- VAR_DNSTAP_SEND_IDENTITY = 404,
- VAR_DNSTAP_SEND_VERSION = 405,
- VAR_DNSTAP_IDENTITY = 406,
- VAR_DNSTAP_VERSION = 407,
- VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 408,
- VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 409,
- VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 410,
- VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 411,
- VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 412,
- VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 413,
- VAR_RESPONSE_IP_TAG = 414,
- VAR_RESPONSE_IP = 415,
- VAR_RESPONSE_IP_DATA = 416,
- VAR_HARDEN_ALGO_DOWNGRADE = 417,
- VAR_IP_TRANSPARENT = 418,
- VAR_DISABLE_DNSSEC_LAME_CHECK = 419,
- VAR_IP_RATELIMIT = 420,
- VAR_IP_RATELIMIT_SLABS = 421,
- VAR_IP_RATELIMIT_SIZE = 422,
- VAR_RATELIMIT = 423,
- VAR_RATELIMIT_SLABS = 424,
- VAR_RATELIMIT_SIZE = 425,
- VAR_RATELIMIT_FOR_DOMAIN = 426,
- VAR_RATELIMIT_BELOW_DOMAIN = 427,
- VAR_IP_RATELIMIT_FACTOR = 428,
- VAR_RATELIMIT_FACTOR = 429,
- VAR_SEND_CLIENT_SUBNET = 430,
- VAR_CLIENT_SUBNET_ZONE = 431,
- VAR_CLIENT_SUBNET_ALWAYS_FORWARD = 432,
- VAR_CLIENT_SUBNET_OPCODE = 433,
- VAR_MAX_CLIENT_SUBNET_IPV4 = 434,
- VAR_MAX_CLIENT_SUBNET_IPV6 = 435,
- VAR_CAPS_WHITELIST = 436,
- VAR_CACHE_MAX_NEGATIVE_TTL = 437,
- VAR_PERMIT_SMALL_HOLDDOWN = 438,
- VAR_QNAME_MINIMISATION = 439,
- VAR_QNAME_MINIMISATION_STRICT = 440,
- VAR_IP_FREEBIND = 441,
- VAR_DEFINE_TAG = 442,
- VAR_LOCAL_ZONE_TAG = 443,
- VAR_ACCESS_CONTROL_TAG = 444,
- VAR_LOCAL_ZONE_OVERRIDE = 445,
- VAR_ACCESS_CONTROL_TAG_ACTION = 446,
- VAR_ACCESS_CONTROL_TAG_DATA = 447,
- VAR_VIEW = 448,
- VAR_ACCESS_CONTROL_VIEW = 449,
- VAR_VIEW_FIRST = 450,
- VAR_SERVE_EXPIRED = 451,
- VAR_FAKE_DSA = 452,
- VAR_FAKE_SHA1 = 453,
- VAR_LOG_IDENTITY = 454,
- VAR_HIDE_TRUSTANCHOR = 455,
- VAR_TRUST_ANCHOR_SIGNALING = 456,
- VAR_AGGRESSIVE_NSEC = 457,
- VAR_USE_SYSTEMD = 458,
- VAR_SHM_ENABLE = 459,
- VAR_SHM_KEY = 460,
- VAR_ROOT_KEY_SENTINEL = 461,
- VAR_DNSCRYPT = 462,
- VAR_DNSCRYPT_ENABLE = 463,
- VAR_DNSCRYPT_PORT = 464,
- VAR_DNSCRYPT_PROVIDER = 465,
- VAR_DNSCRYPT_SECRET_KEY = 466,
- VAR_DNSCRYPT_PROVIDER_CERT = 467,
- VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 468,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 469,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 470,
- VAR_DNSCRYPT_NONCE_CACHE_SIZE = 471,
- VAR_DNSCRYPT_NONCE_CACHE_SLABS = 472,
- VAR_IPSECMOD_ENABLED = 473,
- VAR_IPSECMOD_HOOK = 474,
- VAR_IPSECMOD_IGNORE_BOGUS = 475,
- VAR_IPSECMOD_MAX_TTL = 476,
- VAR_IPSECMOD_WHITELIST = 477,
- VAR_IPSECMOD_STRICT = 478,
- VAR_CACHEDB = 479,
- VAR_CACHEDB_BACKEND = 480,
- VAR_CACHEDB_SECRETSEED = 481,
- VAR_CACHEDB_REDISHOST = 482,
- VAR_CACHEDB_REDISPORT = 483,
- VAR_CACHEDB_REDISTIMEOUT = 484,
- VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 485,
- VAR_FOR_UPSTREAM = 486,
- VAR_AUTH_ZONE = 487,
- VAR_ZONEFILE = 488,
- VAR_MASTER = 489,
- VAR_URL = 490,
- VAR_FOR_DOWNSTREAM = 491,
- VAR_FALLBACK_ENABLED = 492,
- VAR_TLS_ADDITIONAL_PORT = 493,
- VAR_LOW_RTT = 494,
- VAR_LOW_RTT_PERMIL = 495,
- VAR_ALLOW_NOTIFY = 496,
- VAR_TLS_WIN_CERT = 497
+ VAR_TCP_IDLE_TIMEOUT = 279,
+ VAR_EDNS_TCP_KEEPALIVE = 280,
+ VAR_EDNS_TCP_KEEPALIVE_TIMEOUT = 281,
+ VAR_CHROOT = 282,
+ VAR_USERNAME = 283,
+ VAR_DIRECTORY = 284,
+ VAR_LOGFILE = 285,
+ VAR_PIDFILE = 286,
+ VAR_MSG_CACHE_SIZE = 287,
+ VAR_MSG_CACHE_SLABS = 288,
+ VAR_NUM_QUERIES_PER_THREAD = 289,
+ VAR_RRSET_CACHE_SIZE = 290,
+ VAR_RRSET_CACHE_SLABS = 291,
+ VAR_OUTGOING_NUM_TCP = 292,
+ VAR_INFRA_HOST_TTL = 293,
+ VAR_INFRA_LAME_TTL = 294,
+ VAR_INFRA_CACHE_SLABS = 295,
+ VAR_INFRA_CACHE_NUMHOSTS = 296,
+ VAR_INFRA_CACHE_LAME_SIZE = 297,
+ VAR_NAME = 298,
+ VAR_STUB_ZONE = 299,
+ VAR_STUB_HOST = 300,
+ VAR_STUB_ADDR = 301,
+ VAR_TARGET_FETCH_POLICY = 302,
+ VAR_HARDEN_SHORT_BUFSIZE = 303,
+ VAR_HARDEN_LARGE_QUERIES = 304,
+ VAR_FORWARD_ZONE = 305,
+ VAR_FORWARD_HOST = 306,
+ VAR_FORWARD_ADDR = 307,
+ VAR_DO_NOT_QUERY_ADDRESS = 308,
+ VAR_HIDE_IDENTITY = 309,
+ VAR_HIDE_VERSION = 310,
+ VAR_IDENTITY = 311,
+ VAR_VERSION = 312,
+ VAR_HARDEN_GLUE = 313,
+ VAR_MODULE_CONF = 314,
+ VAR_TRUST_ANCHOR_FILE = 315,
+ VAR_TRUST_ANCHOR = 316,
+ VAR_VAL_OVERRIDE_DATE = 317,
+ VAR_BOGUS_TTL = 318,
+ VAR_VAL_CLEAN_ADDITIONAL = 319,
+ VAR_VAL_PERMISSIVE_MODE = 320,
+ VAR_INCOMING_NUM_TCP = 321,
+ VAR_MSG_BUFFER_SIZE = 322,
+ VAR_KEY_CACHE_SIZE = 323,
+ VAR_KEY_CACHE_SLABS = 324,
+ VAR_TRUSTED_KEYS_FILE = 325,
+ VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 326,
+ VAR_USE_SYSLOG = 327,
+ VAR_OUTGOING_INTERFACE = 328,
+ VAR_ROOT_HINTS = 329,
+ VAR_DO_NOT_QUERY_LOCALHOST = 330,
+ VAR_CACHE_MAX_TTL = 331,
+ VAR_HARDEN_DNSSEC_STRIPPED = 332,
+ VAR_ACCESS_CONTROL = 333,
+ VAR_LOCAL_ZONE = 334,
+ VAR_LOCAL_DATA = 335,
+ VAR_INTERFACE_AUTOMATIC = 336,
+ VAR_STATISTICS_INTERVAL = 337,
+ VAR_DO_DAEMONIZE = 338,
+ VAR_USE_CAPS_FOR_ID = 339,
+ VAR_STATISTICS_CUMULATIVE = 340,
+ VAR_OUTGOING_PORT_PERMIT = 341,
+ VAR_OUTGOING_PORT_AVOID = 342,
+ VAR_DLV_ANCHOR_FILE = 343,
+ VAR_DLV_ANCHOR = 344,
+ VAR_NEG_CACHE_SIZE = 345,
+ VAR_HARDEN_REFERRAL_PATH = 346,
+ VAR_PRIVATE_ADDRESS = 347,
+ VAR_PRIVATE_DOMAIN = 348,
+ VAR_REMOTE_CONTROL = 349,
+ VAR_CONTROL_ENABLE = 350,
+ VAR_CONTROL_INTERFACE = 351,
+ VAR_CONTROL_PORT = 352,
+ VAR_SERVER_KEY_FILE = 353,
+ VAR_SERVER_CERT_FILE = 354,
+ VAR_CONTROL_KEY_FILE = 355,
+ VAR_CONTROL_CERT_FILE = 356,
+ VAR_CONTROL_USE_CERT = 357,
+ VAR_EXTENDED_STATISTICS = 358,
+ VAR_LOCAL_DATA_PTR = 359,
+ VAR_JOSTLE_TIMEOUT = 360,
+ VAR_STUB_PRIME = 361,
+ VAR_UNWANTED_REPLY_THRESHOLD = 362,
+ VAR_LOG_TIME_ASCII = 363,
+ VAR_DOMAIN_INSECURE = 364,
+ VAR_PYTHON = 365,
+ VAR_PYTHON_SCRIPT = 366,
+ VAR_VAL_SIG_SKEW_MIN = 367,
+ VAR_VAL_SIG_SKEW_MAX = 368,
+ VAR_CACHE_MIN_TTL = 369,
+ VAR_VAL_LOG_LEVEL = 370,
+ VAR_AUTO_TRUST_ANCHOR_FILE = 371,
+ VAR_KEEP_MISSING = 372,
+ VAR_ADD_HOLDDOWN = 373,
+ VAR_DEL_HOLDDOWN = 374,
+ VAR_SO_RCVBUF = 375,
+ VAR_EDNS_BUFFER_SIZE = 376,
+ VAR_PREFETCH = 377,
+ VAR_PREFETCH_KEY = 378,
+ VAR_SO_SNDBUF = 379,
+ VAR_SO_REUSEPORT = 380,
+ VAR_HARDEN_BELOW_NXDOMAIN = 381,
+ VAR_IGNORE_CD_FLAG = 382,
+ VAR_LOG_QUERIES = 383,
+ VAR_LOG_REPLIES = 384,
+ VAR_LOG_LOCAL_ACTIONS = 385,
+ VAR_TCP_UPSTREAM = 386,
+ VAR_SSL_UPSTREAM = 387,
+ VAR_SSL_SERVICE_KEY = 388,
+ VAR_SSL_SERVICE_PEM = 389,
+ VAR_SSL_PORT = 390,
+ VAR_FORWARD_FIRST = 391,
+ VAR_STUB_SSL_UPSTREAM = 392,
+ VAR_FORWARD_SSL_UPSTREAM = 393,
+ VAR_TLS_CERT_BUNDLE = 394,
+ VAR_STUB_FIRST = 395,
+ VAR_MINIMAL_RESPONSES = 396,
+ VAR_RRSET_ROUNDROBIN = 397,
+ VAR_MAX_UDP_SIZE = 398,
+ VAR_DELAY_CLOSE = 399,
+ VAR_UNBLOCK_LAN_ZONES = 400,
+ VAR_INSECURE_LAN_ZONES = 401,
+ VAR_INFRA_CACHE_MIN_RTT = 402,
+ VAR_DNS64_PREFIX = 403,
+ VAR_DNS64_SYNTHALL = 404,
+ VAR_DNS64_IGNORE_AAAA = 405,
+ VAR_DNSTAP = 406,
+ VAR_DNSTAP_ENABLE = 407,
+ VAR_DNSTAP_SOCKET_PATH = 408,
+ VAR_DNSTAP_SEND_IDENTITY = 409,
+ VAR_DNSTAP_SEND_VERSION = 410,
+ VAR_DNSTAP_IDENTITY = 411,
+ VAR_DNSTAP_VERSION = 412,
+ VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 413,
+ VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 414,
+ VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 415,
+ VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 416,
+ VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 417,
+ VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 418,
+ VAR_RESPONSE_IP_TAG = 419,
+ VAR_RESPONSE_IP = 420,
+ VAR_RESPONSE_IP_DATA = 421,
+ VAR_HARDEN_ALGO_DOWNGRADE = 422,
+ VAR_IP_TRANSPARENT = 423,
+ VAR_DISABLE_DNSSEC_LAME_CHECK = 424,
+ VAR_IP_RATELIMIT = 425,
+ VAR_IP_RATELIMIT_SLABS = 426,
+ VAR_IP_RATELIMIT_SIZE = 427,
+ VAR_RATELIMIT = 428,
+ VAR_RATELIMIT_SLABS = 429,
+ VAR_RATELIMIT_SIZE = 430,
+ VAR_RATELIMIT_FOR_DOMAIN = 431,
+ VAR_RATELIMIT_BELOW_DOMAIN = 432,
+ VAR_IP_RATELIMIT_FACTOR = 433,
+ VAR_RATELIMIT_FACTOR = 434,
+ VAR_SEND_CLIENT_SUBNET = 435,
+ VAR_CLIENT_SUBNET_ZONE = 436,
+ VAR_CLIENT_SUBNET_ALWAYS_FORWARD = 437,
+ VAR_CLIENT_SUBNET_OPCODE = 438,
+ VAR_MAX_CLIENT_SUBNET_IPV4 = 439,
+ VAR_MAX_CLIENT_SUBNET_IPV6 = 440,
+ VAR_CAPS_WHITELIST = 441,
+ VAR_CACHE_MAX_NEGATIVE_TTL = 442,
+ VAR_PERMIT_SMALL_HOLDDOWN = 443,
+ VAR_QNAME_MINIMISATION = 444,
+ VAR_QNAME_MINIMISATION_STRICT = 445,
+ VAR_IP_FREEBIND = 446,
+ VAR_DEFINE_TAG = 447,
+ VAR_LOCAL_ZONE_TAG = 448,
+ VAR_ACCESS_CONTROL_TAG = 449,
+ VAR_LOCAL_ZONE_OVERRIDE = 450,
+ VAR_ACCESS_CONTROL_TAG_ACTION = 451,
+ VAR_ACCESS_CONTROL_TAG_DATA = 452,
+ VAR_VIEW = 453,
+ VAR_ACCESS_CONTROL_VIEW = 454,
+ VAR_VIEW_FIRST = 455,
+ VAR_SERVE_EXPIRED = 456,
+ VAR_SERVE_EXPIRED_TTL = 457,
+ VAR_SERVE_EXPIRED_TTL_RESET = 458,
+ VAR_FAKE_DSA = 459,
+ VAR_FAKE_SHA1 = 460,
+ VAR_LOG_IDENTITY = 461,
+ VAR_HIDE_TRUSTANCHOR = 462,
+ VAR_TRUST_ANCHOR_SIGNALING = 463,
+ VAR_AGGRESSIVE_NSEC = 464,
+ VAR_USE_SYSTEMD = 465,
+ VAR_SHM_ENABLE = 466,
+ VAR_SHM_KEY = 467,
+ VAR_ROOT_KEY_SENTINEL = 468,
+ VAR_DNSCRYPT = 469,
+ VAR_DNSCRYPT_ENABLE = 470,
+ VAR_DNSCRYPT_PORT = 471,
+ VAR_DNSCRYPT_PROVIDER = 472,
+ VAR_DNSCRYPT_SECRET_KEY = 473,
+ VAR_DNSCRYPT_PROVIDER_CERT = 474,
+ VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 475,
+ VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 476,
+ VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 477,
+ VAR_DNSCRYPT_NONCE_CACHE_SIZE = 478,
+ VAR_DNSCRYPT_NONCE_CACHE_SLABS = 479,
+ VAR_IPSECMOD_ENABLED = 480,
+ VAR_IPSECMOD_HOOK = 481,
+ VAR_IPSECMOD_IGNORE_BOGUS = 482,
+ VAR_IPSECMOD_MAX_TTL = 483,
+ VAR_IPSECMOD_WHITELIST = 484,
+ VAR_IPSECMOD_STRICT = 485,
+ VAR_CACHEDB = 486,
+ VAR_CACHEDB_BACKEND = 487,
+ VAR_CACHEDB_SECRETSEED = 488,
+ VAR_CACHEDB_REDISHOST = 489,
+ VAR_CACHEDB_REDISPORT = 490,
+ VAR_CACHEDB_REDISTIMEOUT = 491,
+ VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 492,
+ VAR_FOR_UPSTREAM = 493,
+ VAR_AUTH_ZONE = 494,
+ VAR_ZONEFILE = 495,
+ VAR_MASTER = 496,
+ VAR_URL = 497,
+ VAR_FOR_DOWNSTREAM = 498,
+ VAR_FALLBACK_ENABLED = 499,
+ VAR_TLS_ADDITIONAL_PORT = 500,
+ VAR_LOW_RTT = 501,
+ VAR_LOW_RTT_PERMIL = 502,
+ VAR_ALLOW_NOTIFY = 503,
+ VAR_TLS_WIN_CERT = 504,
+ VAR_TCP_CONNECTION_LIMIT = 505,
+ VAR_FORWARD_NO_CACHE = 506,
+ VAR_STUB_NO_CACHE = 507,
+ VAR_LOG_SERVFAIL = 508
};
#endif
/* Tokens. */
@@ -390,225 +401,236 @@ extern int yydebug;
#define VAR_DO_TCP 276
#define VAR_TCP_MSS 277
#define VAR_OUTGOING_TCP_MSS 278
-#define VAR_CHROOT 279
-#define VAR_USERNAME 280
-#define VAR_DIRECTORY 281
-#define VAR_LOGFILE 282
-#define VAR_PIDFILE 283
-#define VAR_MSG_CACHE_SIZE 284
-#define VAR_MSG_CACHE_SLABS 285
-#define VAR_NUM_QUERIES_PER_THREAD 286
-#define VAR_RRSET_CACHE_SIZE 287
-#define VAR_RRSET_CACHE_SLABS 288
-#define VAR_OUTGOING_NUM_TCP 289
-#define VAR_INFRA_HOST_TTL 290
-#define VAR_INFRA_LAME_TTL 291
-#define VAR_INFRA_CACHE_SLABS 292
-#define VAR_INFRA_CACHE_NUMHOSTS 293
-#define VAR_INFRA_CACHE_LAME_SIZE 294
-#define VAR_NAME 295
-#define VAR_STUB_ZONE 296
-#define VAR_STUB_HOST 297
-#define VAR_STUB_ADDR 298
-#define VAR_TARGET_FETCH_POLICY 299
-#define VAR_HARDEN_SHORT_BUFSIZE 300
-#define VAR_HARDEN_LARGE_QUERIES 301
-#define VAR_FORWARD_ZONE 302
-#define VAR_FORWARD_HOST 303
-#define VAR_FORWARD_ADDR 304
-#define VAR_DO_NOT_QUERY_ADDRESS 305
-#define VAR_HIDE_IDENTITY 306
-#define VAR_HIDE_VERSION 307
-#define VAR_IDENTITY 308
-#define VAR_VERSION 309
-#define VAR_HARDEN_GLUE 310
-#define VAR_MODULE_CONF 311
-#define VAR_TRUST_ANCHOR_FILE 312
-#define VAR_TRUST_ANCHOR 313
-#define VAR_VAL_OVERRIDE_DATE 314
-#define VAR_BOGUS_TTL 315
-#define VAR_VAL_CLEAN_ADDITIONAL 316
-#define VAR_VAL_PERMISSIVE_MODE 317
-#define VAR_INCOMING_NUM_TCP 318
-#define VAR_MSG_BUFFER_SIZE 319
-#define VAR_KEY_CACHE_SIZE 320
-#define VAR_KEY_CACHE_SLABS 321
-#define VAR_TRUSTED_KEYS_FILE 322
-#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 323
-#define VAR_USE_SYSLOG 324
-#define VAR_OUTGOING_INTERFACE 325
-#define VAR_ROOT_HINTS 326
-#define VAR_DO_NOT_QUERY_LOCALHOST 327
-#define VAR_CACHE_MAX_TTL 328
-#define VAR_HARDEN_DNSSEC_STRIPPED 329
-#define VAR_ACCESS_CONTROL 330
-#define VAR_LOCAL_ZONE 331
-#define VAR_LOCAL_DATA 332
-#define VAR_INTERFACE_AUTOMATIC 333
-#define VAR_STATISTICS_INTERVAL 334
-#define VAR_DO_DAEMONIZE 335
-#define VAR_USE_CAPS_FOR_ID 336
-#define VAR_STATISTICS_CUMULATIVE 337
-#define VAR_OUTGOING_PORT_PERMIT 338
-#define VAR_OUTGOING_PORT_AVOID 339
-#define VAR_DLV_ANCHOR_FILE 340
-#define VAR_DLV_ANCHOR 341
-#define VAR_NEG_CACHE_SIZE 342
-#define VAR_HARDEN_REFERRAL_PATH 343
-#define VAR_PRIVATE_ADDRESS 344
-#define VAR_PRIVATE_DOMAIN 345
-#define VAR_REMOTE_CONTROL 346
-#define VAR_CONTROL_ENABLE 347
-#define VAR_CONTROL_INTERFACE 348
-#define VAR_CONTROL_PORT 349
-#define VAR_SERVER_KEY_FILE 350
-#define VAR_SERVER_CERT_FILE 351
-#define VAR_CONTROL_KEY_FILE 352
-#define VAR_CONTROL_CERT_FILE 353
-#define VAR_CONTROL_USE_CERT 354
-#define VAR_EXTENDED_STATISTICS 355
-#define VAR_LOCAL_DATA_PTR 356
-#define VAR_JOSTLE_TIMEOUT 357
-#define VAR_STUB_PRIME 358
-#define VAR_UNWANTED_REPLY_THRESHOLD 359
-#define VAR_LOG_TIME_ASCII 360
-#define VAR_DOMAIN_INSECURE 361
-#define VAR_PYTHON 362
-#define VAR_PYTHON_SCRIPT 363
-#define VAR_VAL_SIG_SKEW_MIN 364
-#define VAR_VAL_SIG_SKEW_MAX 365
-#define VAR_CACHE_MIN_TTL 366
-#define VAR_VAL_LOG_LEVEL 367
-#define VAR_AUTO_TRUST_ANCHOR_FILE 368
-#define VAR_KEEP_MISSING 369
-#define VAR_ADD_HOLDDOWN 370
-#define VAR_DEL_HOLDDOWN 371
-#define VAR_SO_RCVBUF 372
-#define VAR_EDNS_BUFFER_SIZE 373
-#define VAR_PREFETCH 374
-#define VAR_PREFETCH_KEY 375
-#define VAR_SO_SNDBUF 376
-#define VAR_SO_REUSEPORT 377
-#define VAR_HARDEN_BELOW_NXDOMAIN 378
-#define VAR_IGNORE_CD_FLAG 379
-#define VAR_LOG_QUERIES 380
-#define VAR_LOG_REPLIES 381
-#define VAR_TCP_UPSTREAM 382
-#define VAR_SSL_UPSTREAM 383
-#define VAR_SSL_SERVICE_KEY 384
-#define VAR_SSL_SERVICE_PEM 385
-#define VAR_SSL_PORT 386
-#define VAR_FORWARD_FIRST 387
-#define VAR_STUB_SSL_UPSTREAM 388
-#define VAR_FORWARD_SSL_UPSTREAM 389
-#define VAR_TLS_CERT_BUNDLE 390
-#define VAR_STUB_FIRST 391
-#define VAR_MINIMAL_RESPONSES 392
-#define VAR_RRSET_ROUNDROBIN 393
-#define VAR_MAX_UDP_SIZE 394
-#define VAR_DELAY_CLOSE 395
-#define VAR_UNBLOCK_LAN_ZONES 396
-#define VAR_INSECURE_LAN_ZONES 397
-#define VAR_INFRA_CACHE_MIN_RTT 398
-#define VAR_DNS64_PREFIX 399
-#define VAR_DNS64_SYNTHALL 400
-#define VAR_DNSTAP 401
-#define VAR_DNSTAP_ENABLE 402
-#define VAR_DNSTAP_SOCKET_PATH 403
-#define VAR_DNSTAP_SEND_IDENTITY 404
-#define VAR_DNSTAP_SEND_VERSION 405
-#define VAR_DNSTAP_IDENTITY 406
-#define VAR_DNSTAP_VERSION 407
-#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 408
-#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 409
-#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 410
-#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 411
-#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 412
-#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 413
-#define VAR_RESPONSE_IP_TAG 414
-#define VAR_RESPONSE_IP 415
-#define VAR_RESPONSE_IP_DATA 416
-#define VAR_HARDEN_ALGO_DOWNGRADE 417
-#define VAR_IP_TRANSPARENT 418
-#define VAR_DISABLE_DNSSEC_LAME_CHECK 419
-#define VAR_IP_RATELIMIT 420
-#define VAR_IP_RATELIMIT_SLABS 421
-#define VAR_IP_RATELIMIT_SIZE 422
-#define VAR_RATELIMIT 423
-#define VAR_RATELIMIT_SLABS 424
-#define VAR_RATELIMIT_SIZE 425
-#define VAR_RATELIMIT_FOR_DOMAIN 426
-#define VAR_RATELIMIT_BELOW_DOMAIN 427
-#define VAR_IP_RATELIMIT_FACTOR 428
-#define VAR_RATELIMIT_FACTOR 429
-#define VAR_SEND_CLIENT_SUBNET 430
-#define VAR_CLIENT_SUBNET_ZONE 431
-#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 432
-#define VAR_CLIENT_SUBNET_OPCODE 433
-#define VAR_MAX_CLIENT_SUBNET_IPV4 434
-#define VAR_MAX_CLIENT_SUBNET_IPV6 435
-#define VAR_CAPS_WHITELIST 436
-#define VAR_CACHE_MAX_NEGATIVE_TTL 437
-#define VAR_PERMIT_SMALL_HOLDDOWN 438
-#define VAR_QNAME_MINIMISATION 439
-#define VAR_QNAME_MINIMISATION_STRICT 440
-#define VAR_IP_FREEBIND 441
-#define VAR_DEFINE_TAG 442
-#define VAR_LOCAL_ZONE_TAG 443
-#define VAR_ACCESS_CONTROL_TAG 444
-#define VAR_LOCAL_ZONE_OVERRIDE 445
-#define VAR_ACCESS_CONTROL_TAG_ACTION 446
-#define VAR_ACCESS_CONTROL_TAG_DATA 447
-#define VAR_VIEW 448
-#define VAR_ACCESS_CONTROL_VIEW 449
-#define VAR_VIEW_FIRST 450
-#define VAR_SERVE_EXPIRED 451
-#define VAR_FAKE_DSA 452
-#define VAR_FAKE_SHA1 453
-#define VAR_LOG_IDENTITY 454
-#define VAR_HIDE_TRUSTANCHOR 455
-#define VAR_TRUST_ANCHOR_SIGNALING 456
-#define VAR_AGGRESSIVE_NSEC 457
-#define VAR_USE_SYSTEMD 458
-#define VAR_SHM_ENABLE 459
-#define VAR_SHM_KEY 460
-#define VAR_ROOT_KEY_SENTINEL 461
-#define VAR_DNSCRYPT 462
-#define VAR_DNSCRYPT_ENABLE 463
-#define VAR_DNSCRYPT_PORT 464
-#define VAR_DNSCRYPT_PROVIDER 465
-#define VAR_DNSCRYPT_SECRET_KEY 466
-#define VAR_DNSCRYPT_PROVIDER_CERT 467
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 468
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 469
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 470
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 471
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 472
-#define VAR_IPSECMOD_ENABLED 473
-#define VAR_IPSECMOD_HOOK 474
-#define VAR_IPSECMOD_IGNORE_BOGUS 475
-#define VAR_IPSECMOD_MAX_TTL 476
-#define VAR_IPSECMOD_WHITELIST 477
-#define VAR_IPSECMOD_STRICT 478
-#define VAR_CACHEDB 479
-#define VAR_CACHEDB_BACKEND 480
-#define VAR_CACHEDB_SECRETSEED 481
-#define VAR_CACHEDB_REDISHOST 482
-#define VAR_CACHEDB_REDISPORT 483
-#define VAR_CACHEDB_REDISTIMEOUT 484
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 485
-#define VAR_FOR_UPSTREAM 486
-#define VAR_AUTH_ZONE 487
-#define VAR_ZONEFILE 488
-#define VAR_MASTER 489
-#define VAR_URL 490
-#define VAR_FOR_DOWNSTREAM 491
-#define VAR_FALLBACK_ENABLED 492
-#define VAR_TLS_ADDITIONAL_PORT 493
-#define VAR_LOW_RTT 494
-#define VAR_LOW_RTT_PERMIL 495
-#define VAR_ALLOW_NOTIFY 496
-#define VAR_TLS_WIN_CERT 497
+#define VAR_TCP_IDLE_TIMEOUT 279
+#define VAR_EDNS_TCP_KEEPALIVE 280
+#define VAR_EDNS_TCP_KEEPALIVE_TIMEOUT 281
+#define VAR_CHROOT 282
+#define VAR_USERNAME 283
+#define VAR_DIRECTORY 284
+#define VAR_LOGFILE 285
+#define VAR_PIDFILE 286
+#define VAR_MSG_CACHE_SIZE 287
+#define VAR_MSG_CACHE_SLABS 288
+#define VAR_NUM_QUERIES_PER_THREAD 289
+#define VAR_RRSET_CACHE_SIZE 290
+#define VAR_RRSET_CACHE_SLABS 291
+#define VAR_OUTGOING_NUM_TCP 292
+#define VAR_INFRA_HOST_TTL 293
+#define VAR_INFRA_LAME_TTL 294
+#define VAR_INFRA_CACHE_SLABS 295
+#define VAR_INFRA_CACHE_NUMHOSTS 296
+#define VAR_INFRA_CACHE_LAME_SIZE 297
+#define VAR_NAME 298
+#define VAR_STUB_ZONE 299
+#define VAR_STUB_HOST 300
+#define VAR_STUB_ADDR 301
+#define VAR_TARGET_FETCH_POLICY 302
+#define VAR_HARDEN_SHORT_BUFSIZE 303
+#define VAR_HARDEN_LARGE_QUERIES 304
+#define VAR_FORWARD_ZONE 305
+#define VAR_FORWARD_HOST 306
+#define VAR_FORWARD_ADDR 307
+#define VAR_DO_NOT_QUERY_ADDRESS 308
+#define VAR_HIDE_IDENTITY 309
+#define VAR_HIDE_VERSION 310
+#define VAR_IDENTITY 311
+#define VAR_VERSION 312
+#define VAR_HARDEN_GLUE 313
+#define VAR_MODULE_CONF 314
+#define VAR_TRUST_ANCHOR_FILE 315
+#define VAR_TRUST_ANCHOR 316
+#define VAR_VAL_OVERRIDE_DATE 317
+#define VAR_BOGUS_TTL 318
+#define VAR_VAL_CLEAN_ADDITIONAL 319
+#define VAR_VAL_PERMISSIVE_MODE 320
+#define VAR_INCOMING_NUM_TCP 321
+#define VAR_MSG_BUFFER_SIZE 322
+#define VAR_KEY_CACHE_SIZE 323
+#define VAR_KEY_CACHE_SLABS 324
+#define VAR_TRUSTED_KEYS_FILE 325
+#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 326
+#define VAR_USE_SYSLOG 327
+#define VAR_OUTGOING_INTERFACE 328
+#define VAR_ROOT_HINTS 329
+#define VAR_DO_NOT_QUERY_LOCALHOST 330
+#define VAR_CACHE_MAX_TTL 331
+#define VAR_HARDEN_DNSSEC_STRIPPED 332
+#define VAR_ACCESS_CONTROL 333
+#define VAR_LOCAL_ZONE 334
+#define VAR_LOCAL_DATA 335
+#define VAR_INTERFACE_AUTOMATIC 336
+#define VAR_STATISTICS_INTERVAL 337
+#define VAR_DO_DAEMONIZE 338
+#define VAR_USE_CAPS_FOR_ID 339
+#define VAR_STATISTICS_CUMULATIVE 340
+#define VAR_OUTGOING_PORT_PERMIT 341
+#define VAR_OUTGOING_PORT_AVOID 342
+#define VAR_DLV_ANCHOR_FILE 343
+#define VAR_DLV_ANCHOR 344
+#define VAR_NEG_CACHE_SIZE 345
+#define VAR_HARDEN_REFERRAL_PATH 346
+#define VAR_PRIVATE_ADDRESS 347
+#define VAR_PRIVATE_DOMAIN 348
+#define VAR_REMOTE_CONTROL 349
+#define VAR_CONTROL_ENABLE 350
+#define VAR_CONTROL_INTERFACE 351
+#define VAR_CONTROL_PORT 352
+#define VAR_SERVER_KEY_FILE 353
+#define VAR_SERVER_CERT_FILE 354
+#define VAR_CONTROL_KEY_FILE 355
+#define VAR_CONTROL_CERT_FILE 356
+#define VAR_CONTROL_USE_CERT 357
+#define VAR_EXTENDED_STATISTICS 358
+#define VAR_LOCAL_DATA_PTR 359
+#define VAR_JOSTLE_TIMEOUT 360
+#define VAR_STUB_PRIME 361
+#define VAR_UNWANTED_REPLY_THRESHOLD 362
+#define VAR_LOG_TIME_ASCII 363
+#define VAR_DOMAIN_INSECURE 364
+#define VAR_PYTHON 365
+#define VAR_PYTHON_SCRIPT 366
+#define VAR_VAL_SIG_SKEW_MIN 367
+#define VAR_VAL_SIG_SKEW_MAX 368
+#define VAR_CACHE_MIN_TTL 369
+#define VAR_VAL_LOG_LEVEL 370
+#define VAR_AUTO_TRUST_ANCHOR_FILE 371
+#define VAR_KEEP_MISSING 372
+#define VAR_ADD_HOLDDOWN 373
+#define VAR_DEL_HOLDDOWN 374
+#define VAR_SO_RCVBUF 375
+#define VAR_EDNS_BUFFER_SIZE 376
+#define VAR_PREFETCH 377
+#define VAR_PREFETCH_KEY 378
+#define VAR_SO_SNDBUF 379
+#define VAR_SO_REUSEPORT 380
+#define VAR_HARDEN_BELOW_NXDOMAIN 381
+#define VAR_IGNORE_CD_FLAG 382
+#define VAR_LOG_QUERIES 383
+#define VAR_LOG_REPLIES 384
+#define VAR_LOG_LOCAL_ACTIONS 385
+#define VAR_TCP_UPSTREAM 386
+#define VAR_SSL_UPSTREAM 387
+#define VAR_SSL_SERVICE_KEY 388
+#define VAR_SSL_SERVICE_PEM 389
+#define VAR_SSL_PORT 390
+#define VAR_FORWARD_FIRST 391
+#define VAR_STUB_SSL_UPSTREAM 392
+#define VAR_FORWARD_SSL_UPSTREAM 393
+#define VAR_TLS_CERT_BUNDLE 394
+#define VAR_STUB_FIRST 395
+#define VAR_MINIMAL_RESPONSES 396
+#define VAR_RRSET_ROUNDROBIN 397
+#define VAR_MAX_UDP_SIZE 398
+#define VAR_DELAY_CLOSE 399
+#define VAR_UNBLOCK_LAN_ZONES 400
+#define VAR_INSECURE_LAN_ZONES 401
+#define VAR_INFRA_CACHE_MIN_RTT 402
+#define VAR_DNS64_PREFIX 403
+#define VAR_DNS64_SYNTHALL 404
+#define VAR_DNS64_IGNORE_AAAA 405
+#define VAR_DNSTAP 406
+#define VAR_DNSTAP_ENABLE 407
+#define VAR_DNSTAP_SOCKET_PATH 408
+#define VAR_DNSTAP_SEND_IDENTITY 409
+#define VAR_DNSTAP_SEND_VERSION 410
+#define VAR_DNSTAP_IDENTITY 411
+#define VAR_DNSTAP_VERSION 412
+#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 413
+#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 414
+#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 415
+#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 416
+#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 417
+#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 418
+#define VAR_RESPONSE_IP_TAG 419
+#define VAR_RESPONSE_IP 420
+#define VAR_RESPONSE_IP_DATA 421
+#define VAR_HARDEN_ALGO_DOWNGRADE 422
+#define VAR_IP_TRANSPARENT 423
+#define VAR_DISABLE_DNSSEC_LAME_CHECK 424
+#define VAR_IP_RATELIMIT 425
+#define VAR_IP_RATELIMIT_SLABS 426
+#define VAR_IP_RATELIMIT_SIZE 427
+#define VAR_RATELIMIT 428
+#define VAR_RATELIMIT_SLABS 429
+#define VAR_RATELIMIT_SIZE 430
+#define VAR_RATELIMIT_FOR_DOMAIN 431
+#define VAR_RATELIMIT_BELOW_DOMAIN 432
+#define VAR_IP_RATELIMIT_FACTOR 433
+#define VAR_RATELIMIT_FACTOR 434
+#define VAR_SEND_CLIENT_SUBNET 435
+#define VAR_CLIENT_SUBNET_ZONE 436
+#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 437
+#define VAR_CLIENT_SUBNET_OPCODE 438
+#define VAR_MAX_CLIENT_SUBNET_IPV4 439
+#define VAR_MAX_CLIENT_SUBNET_IPV6 440
+#define VAR_CAPS_WHITELIST 441
+#define VAR_CACHE_MAX_NEGATIVE_TTL 442
+#define VAR_PERMIT_SMALL_HOLDDOWN 443
+#define VAR_QNAME_MINIMISATION 444
+#define VAR_QNAME_MINIMISATION_STRICT 445
+#define VAR_IP_FREEBIND 446
+#define VAR_DEFINE_TAG 447
+#define VAR_LOCAL_ZONE_TAG 448
+#define VAR_ACCESS_CONTROL_TAG 449
+#define VAR_LOCAL_ZONE_OVERRIDE 450
+#define VAR_ACCESS_CONTROL_TAG_ACTION 451
+#define VAR_ACCESS_CONTROL_TAG_DATA 452
+#define VAR_VIEW 453
+#define VAR_ACCESS_CONTROL_VIEW 454
+#define VAR_VIEW_FIRST 455
+#define VAR_SERVE_EXPIRED 456
+#define VAR_SERVE_EXPIRED_TTL 457
+#define VAR_SERVE_EXPIRED_TTL_RESET 458
+#define VAR_FAKE_DSA 459
+#define VAR_FAKE_SHA1 460
+#define VAR_LOG_IDENTITY 461
+#define VAR_HIDE_TRUSTANCHOR 462
+#define VAR_TRUST_ANCHOR_SIGNALING 463
+#define VAR_AGGRESSIVE_NSEC 464
+#define VAR_USE_SYSTEMD 465
+#define VAR_SHM_ENABLE 466
+#define VAR_SHM_KEY 467
+#define VAR_ROOT_KEY_SENTINEL 468
+#define VAR_DNSCRYPT 469
+#define VAR_DNSCRYPT_ENABLE 470
+#define VAR_DNSCRYPT_PORT 471
+#define VAR_DNSCRYPT_PROVIDER 472
+#define VAR_DNSCRYPT_SECRET_KEY 473
+#define VAR_DNSCRYPT_PROVIDER_CERT 474
+#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 475
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 476
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 477
+#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 478
+#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 479
+#define VAR_IPSECMOD_ENABLED 480
+#define VAR_IPSECMOD_HOOK 481
+#define VAR_IPSECMOD_IGNORE_BOGUS 482
+#define VAR_IPSECMOD_MAX_TTL 483
+#define VAR_IPSECMOD_WHITELIST 484
+#define VAR_IPSECMOD_STRICT 485
+#define VAR_CACHEDB 486
+#define VAR_CACHEDB_BACKEND 487
+#define VAR_CACHEDB_SECRETSEED 488
+#define VAR_CACHEDB_REDISHOST 489
+#define VAR_CACHEDB_REDISPORT 490
+#define VAR_CACHEDB_REDISTIMEOUT 491
+#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 492
+#define VAR_FOR_UPSTREAM 493
+#define VAR_AUTH_ZONE 494
+#define VAR_ZONEFILE 495
+#define VAR_MASTER 496
+#define VAR_URL 497
+#define VAR_FOR_DOWNSTREAM 498
+#define VAR_FALLBACK_ENABLED 499
+#define VAR_TLS_ADDITIONAL_PORT 500
+#define VAR_LOW_RTT 501
+#define VAR_LOW_RTT_PERMIL 502
+#define VAR_ALLOW_NOTIFY 503
+#define VAR_TLS_WIN_CERT 504
+#define VAR_TCP_CONNECTION_LIMIT 505
+#define VAR_FORWARD_NO_CACHE 506
+#define VAR_STUB_NO_CACHE 507
+#define VAR_LOG_SERVFAIL 508
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -619,7 +641,7 @@ union YYSTYPE
char* str;
-#line 623 "util/configparser.c" /* yacc.c:355 */
+#line 645 "util/configparser.c" /* yacc.c:355 */
};
typedef union YYSTYPE YYSTYPE;
@@ -636,7 +658,7 @@ int yyparse (void);
/* Copy the second part of user declarations. */
-#line 640 "util/configparser.c" /* yacc.c:358 */
+#line 662 "util/configparser.c" /* yacc.c:358 */
#ifdef short
# undef short
@@ -878,21 +900,21 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 2
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 491
+#define YYLAST 512
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 243
+#define YYNTOKENS 254
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 263
+#define YYNNTS 274
/* YYNRULES -- Number of rules. */
-#define YYNRULES 503
+#define YYNRULES 525
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 753
+#define YYNSTATES 787
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK 2
-#define YYMAXUTOK 497
+#define YYMAXUTOK 508
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -950,64 +972,67 @@ static const yytype_uint8 yytranslate[] =
205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
- 235, 236, 237, 238, 239, 240, 241, 242
+ 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
+ 245, 246, 247, 248, 249, 250, 251, 252, 253
};
#if YYDEBUG
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 163, 163, 163, 164, 164, 165, 165, 166, 166,
- 166, 167, 167, 168, 172, 177, 178, 179, 179, 179,
- 180, 180, 181, 181, 182, 182, 183, 183, 184, 184,
- 184, 185, 185, 185, 186, 186, 187, 187, 188, 188,
- 189, 189, 190, 190, 191, 191, 192, 192, 193, 193,
- 194, 194, 194, 195, 195, 195, 196, 196, 196, 197,
- 197, 198, 198, 199, 199, 200, 200, 201, 201, 201,
- 202, 202, 203, 203, 204, 204, 204, 205, 205, 206,
- 206, 207, 207, 208, 208, 208, 209, 209, 210, 210,
- 211, 211, 212, 212, 213, 213, 214, 214, 214, 215,
- 215, 216, 216, 216, 217, 217, 217, 218, 218, 218,
- 219, 219, 219, 219, 220, 220, 220, 221, 221, 221,
- 222, 222, 223, 223, 224, 224, 225, 225, 226, 226,
- 226, 227, 227, 228, 228, 229, 230, 230, 231, 231,
- 232, 232, 233, 234, 234, 235, 235, 236, 236, 237,
- 237, 237, 238, 238, 239, 239, 240, 240, 241, 241,
- 242, 242, 242, 243, 243, 243, 244, 244, 244, 245,
- 245, 246, 247, 247, 248, 248, 249, 249, 250, 250,
- 251, 251, 251, 252, 252, 254, 266, 267, 268, 268,
- 268, 268, 268, 269, 271, 283, 284, 285, 285, 285,
- 285, 286, 288, 302, 303, 304, 304, 304, 304, 305,
- 305, 305, 307, 323, 324, 325, 325, 325, 325, 326,
- 326, 326, 327, 329, 338, 347, 358, 367, 376, 385,
- 396, 405, 416, 429, 444, 455, 472, 489, 502, 517,
- 526, 535, 544, 553, 562, 571, 580, 589, 598, 607,
- 616, 625, 634, 643, 652, 661, 668, 675, 684, 691,
- 700, 708, 717, 726, 740, 749, 758, 767, 774, 781,
- 807, 815, 822, 829, 836, 843, 851, 859, 867, 874,
- 885, 896, 903, 912, 921, 930, 937, 944, 952, 960,
- 970, 980, 990, 1003, 1014, 1022, 1035, 1044, 1053, 1062,
- 1072, 1082, 1090, 1103, 1112, 1120, 1129, 1137, 1150, 1159,
- 1166, 1176, 1186, 1196, 1206, 1216, 1226, 1236, 1246, 1253,
- 1260, 1267, 1276, 1285, 1294, 1301, 1311, 1329, 1336, 1354,
- 1367, 1380, 1389, 1398, 1407, 1416, 1426, 1436, 1447, 1456,
- 1465, 1478, 1491, 1500, 1507, 1516, 1525, 1534, 1543, 1551,
- 1564, 1572, 1601, 1608, 1623, 1633, 1643, 1650, 1657, 1666,
- 1680, 1699, 1718, 1730, 1742, 1754, 1765, 1784, 1794, 1803,
- 1811, 1819, 1832, 1845, 1858, 1871, 1880, 1889, 1898, 1907,
- 1917, 1927, 1940, 1953, 1964, 1977, 1988, 2001, 2011, 2018,
- 2025, 2034, 2044, 2054, 2064, 2071, 2078, 2087, 2097, 2107,
- 2114, 2121, 2128, 2136, 2146, 2156, 2166, 2176, 2206, 2216,
- 2224, 2233, 2248, 2257, 2262, 2263, 2264, 2264, 2264, 2265,
- 2265, 2265, 2266, 2266, 2268, 2278, 2287, 2294, 2301, 2308,
- 2315, 2322, 2329, 2334, 2335, 2336, 2336, 2337, 2337, 2338,
- 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2346, 2354, 2361,
- 2369, 2377, 2384, 2391, 2400, 2409, 2418, 2427, 2436, 2445,
- 2450, 2451, 2452, 2454, 2460, 2470, 2477, 2486, 2494, 2500,
- 2501, 2503, 2503, 2503, 2504, 2504, 2505, 2506, 2507, 2508,
- 2509, 2511, 2521, 2531, 2538, 2547, 2554, 2563, 2571, 2584,
- 2592, 2605, 2610, 2611, 2612, 2612, 2613, 2613, 2613, 2615,
- 2629, 2644, 2656, 2671
+ 0, 166, 166, 166, 167, 167, 168, 168, 169, 169,
+ 169, 170, 170, 171, 175, 180, 181, 182, 182, 182,
+ 183, 183, 184, 184, 185, 185, 186, 186, 186, 187,
+ 187, 188, 188, 188, 189, 189, 189, 190, 190, 191,
+ 191, 192, 192, 193, 193, 194, 194, 195, 195, 196,
+ 196, 197, 197, 198, 198, 198, 199, 199, 199, 200,
+ 200, 200, 201, 201, 202, 202, 203, 203, 204, 204,
+ 205, 205, 205, 206, 206, 207, 207, 208, 208, 208,
+ 209, 209, 210, 210, 211, 211, 212, 212, 212, 213,
+ 213, 214, 214, 215, 215, 216, 216, 217, 217, 218,
+ 218, 218, 219, 219, 220, 220, 220, 221, 221, 221,
+ 222, 222, 222, 223, 223, 223, 223, 224, 225, 225,
+ 225, 226, 226, 226, 227, 227, 228, 228, 229, 229,
+ 229, 230, 230, 231, 231, 231, 232, 232, 233, 233,
+ 234, 235, 235, 236, 236, 237, 237, 238, 239, 239,
+ 240, 240, 241, 241, 242, 242, 242, 243, 243, 244,
+ 244, 245, 245, 246, 246, 247, 247, 248, 248, 248,
+ 249, 249, 249, 250, 250, 250, 251, 251, 252, 253,
+ 253, 254, 254, 255, 255, 256, 256, 257, 257, 257,
+ 258, 258, 259, 259, 261, 273, 274, 275, 275, 275,
+ 275, 275, 276, 276, 278, 290, 291, 292, 292, 292,
+ 292, 293, 293, 295, 309, 310, 311, 311, 311, 311,
+ 312, 312, 312, 314, 330, 331, 332, 332, 332, 332,
+ 333, 333, 333, 334, 336, 345, 354, 365, 374, 383,
+ 392, 403, 412, 423, 436, 451, 462, 479, 496, 509,
+ 524, 533, 542, 551, 560, 569, 578, 587, 596, 605,
+ 614, 623, 632, 641, 654, 663, 676, 685, 694, 703,
+ 710, 717, 726, 733, 742, 750, 759, 768, 782, 791,
+ 800, 809, 818, 827, 834, 841, 867, 875, 882, 889,
+ 896, 903, 911, 919, 927, 934, 945, 956, 963, 972,
+ 981, 990, 997, 1004, 1012, 1020, 1030, 1040, 1050, 1063,
+ 1074, 1082, 1095, 1104, 1113, 1122, 1132, 1142, 1150, 1163,
+ 1172, 1180, 1189, 1197, 1210, 1219, 1226, 1236, 1246, 1256,
+ 1266, 1276, 1286, 1296, 1306, 1313, 1320, 1327, 1336, 1345,
+ 1354, 1361, 1371, 1389, 1396, 1414, 1427, 1440, 1449, 1458,
+ 1467, 1476, 1486, 1496, 1507, 1516, 1525, 1534, 1543, 1556,
+ 1569, 1578, 1585, 1594, 1603, 1612, 1621, 1629, 1642, 1650,
+ 1679, 1686, 1701, 1711, 1721, 1728, 1735, 1744, 1752, 1766,
+ 1785, 1804, 1816, 1828, 1840, 1851, 1870, 1880, 1889, 1897,
+ 1905, 1918, 1931, 1944, 1957, 1966, 1975, 1984, 1993, 2003,
+ 2013, 2026, 2039, 2050, 2063, 2074, 2087, 2097, 2104, 2111,
+ 2120, 2129, 2139, 2149, 2159, 2166, 2173, 2182, 2191, 2201,
+ 2211, 2218, 2225, 2232, 2240, 2250, 2260, 2270, 2280, 2310,
+ 2320, 2328, 2337, 2352, 2361, 2366, 2367, 2368, 2368, 2368,
+ 2369, 2369, 2369, 2370, 2370, 2372, 2382, 2391, 2398, 2405,
+ 2412, 2419, 2426, 2433, 2438, 2439, 2440, 2440, 2441, 2441,
+ 2442, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2450, 2458,
+ 2465, 2473, 2481, 2488, 2495, 2504, 2513, 2522, 2531, 2540,
+ 2549, 2554, 2555, 2556, 2558, 2564, 2574, 2581, 2590, 2598,
+ 2604, 2605, 2607, 2607, 2607, 2608, 2608, 2609, 2610, 2611,
+ 2612, 2613, 2615, 2625, 2635, 2642, 2651, 2658, 2667, 2675,
+ 2688, 2696, 2709, 2714, 2715, 2716, 2716, 2717, 2717, 2717,
+ 2719, 2733, 2748, 2760, 2775, 2788
};
#endif
@@ -1020,11 +1045,13 @@ static const char *const yytname[] =
"COLON", "ANY", "ZONESTR", "STRING_ARG", "VAR_SERVER", "VAR_VERBOSITY",
"VAR_NUM_THREADS", "VAR_PORT", "VAR_OUTGOING_RANGE", "VAR_INTERFACE",
"VAR_DO_IP4", "VAR_DO_IP6", "VAR_PREFER_IP6", "VAR_DO_UDP", "VAR_DO_TCP",
- "VAR_TCP_MSS", "VAR_OUTGOING_TCP_MSS", "VAR_CHROOT", "VAR_USERNAME",
- "VAR_DIRECTORY", "VAR_LOGFILE", "VAR_PIDFILE", "VAR_MSG_CACHE_SIZE",
- "VAR_MSG_CACHE_SLABS", "VAR_NUM_QUERIES_PER_THREAD",
- "VAR_RRSET_CACHE_SIZE", "VAR_RRSET_CACHE_SLABS", "VAR_OUTGOING_NUM_TCP",
- "VAR_INFRA_HOST_TTL", "VAR_INFRA_LAME_TTL", "VAR_INFRA_CACHE_SLABS",
+ "VAR_TCP_MSS", "VAR_OUTGOING_TCP_MSS", "VAR_TCP_IDLE_TIMEOUT",
+ "VAR_EDNS_TCP_KEEPALIVE", "VAR_EDNS_TCP_KEEPALIVE_TIMEOUT", "VAR_CHROOT",
+ "VAR_USERNAME", "VAR_DIRECTORY", "VAR_LOGFILE", "VAR_PIDFILE",
+ "VAR_MSG_CACHE_SIZE", "VAR_MSG_CACHE_SLABS",
+ "VAR_NUM_QUERIES_PER_THREAD", "VAR_RRSET_CACHE_SIZE",
+ "VAR_RRSET_CACHE_SLABS", "VAR_OUTGOING_NUM_TCP", "VAR_INFRA_HOST_TTL",
+ "VAR_INFRA_LAME_TTL", "VAR_INFRA_CACHE_SLABS",
"VAR_INFRA_CACHE_NUMHOSTS", "VAR_INFRA_CACHE_LAME_SIZE", "VAR_NAME",
"VAR_STUB_ZONE", "VAR_STUB_HOST", "VAR_STUB_ADDR",
"VAR_TARGET_FETCH_POLICY", "VAR_HARDEN_SHORT_BUFSIZE",
@@ -1055,16 +1082,16 @@ static const char *const yytname[] =
"VAR_SO_RCVBUF", "VAR_EDNS_BUFFER_SIZE", "VAR_PREFETCH",
"VAR_PREFETCH_KEY", "VAR_SO_SNDBUF", "VAR_SO_REUSEPORT",
"VAR_HARDEN_BELOW_NXDOMAIN", "VAR_IGNORE_CD_FLAG", "VAR_LOG_QUERIES",
- "VAR_LOG_REPLIES", "VAR_TCP_UPSTREAM", "VAR_SSL_UPSTREAM",
- "VAR_SSL_SERVICE_KEY", "VAR_SSL_SERVICE_PEM", "VAR_SSL_PORT",
- "VAR_FORWARD_FIRST", "VAR_STUB_SSL_UPSTREAM", "VAR_FORWARD_SSL_UPSTREAM",
- "VAR_TLS_CERT_BUNDLE", "VAR_STUB_FIRST", "VAR_MINIMAL_RESPONSES",
- "VAR_RRSET_ROUNDROBIN", "VAR_MAX_UDP_SIZE", "VAR_DELAY_CLOSE",
- "VAR_UNBLOCK_LAN_ZONES", "VAR_INSECURE_LAN_ZONES",
+ "VAR_LOG_REPLIES", "VAR_LOG_LOCAL_ACTIONS", "VAR_TCP_UPSTREAM",
+ "VAR_SSL_UPSTREAM", "VAR_SSL_SERVICE_KEY", "VAR_SSL_SERVICE_PEM",
+ "VAR_SSL_PORT", "VAR_FORWARD_FIRST", "VAR_STUB_SSL_UPSTREAM",
+ "VAR_FORWARD_SSL_UPSTREAM", "VAR_TLS_CERT_BUNDLE", "VAR_STUB_FIRST",
+ "VAR_MINIMAL_RESPONSES", "VAR_RRSET_ROUNDROBIN", "VAR_MAX_UDP_SIZE",
+ "VAR_DELAY_CLOSE", "VAR_UNBLOCK_LAN_ZONES", "VAR_INSECURE_LAN_ZONES",
"VAR_INFRA_CACHE_MIN_RTT", "VAR_DNS64_PREFIX", "VAR_DNS64_SYNTHALL",
- "VAR_DNSTAP", "VAR_DNSTAP_ENABLE", "VAR_DNSTAP_SOCKET_PATH",
- "VAR_DNSTAP_SEND_IDENTITY", "VAR_DNSTAP_SEND_VERSION",
- "VAR_DNSTAP_IDENTITY", "VAR_DNSTAP_VERSION",
+ "VAR_DNS64_IGNORE_AAAA", "VAR_DNSTAP", "VAR_DNSTAP_ENABLE",
+ "VAR_DNSTAP_SOCKET_PATH", "VAR_DNSTAP_SEND_IDENTITY",
+ "VAR_DNSTAP_SEND_VERSION", "VAR_DNSTAP_IDENTITY", "VAR_DNSTAP_VERSION",
"VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES",
"VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES",
"VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES",
@@ -1086,7 +1113,8 @@ static const char *const yytname[] =
"VAR_LOCAL_ZONE_TAG", "VAR_ACCESS_CONTROL_TAG",
"VAR_LOCAL_ZONE_OVERRIDE", "VAR_ACCESS_CONTROL_TAG_ACTION",
"VAR_ACCESS_CONTROL_TAG_DATA", "VAR_VIEW", "VAR_ACCESS_CONTROL_VIEW",
- "VAR_VIEW_FIRST", "VAR_SERVE_EXPIRED", "VAR_FAKE_DSA", "VAR_FAKE_SHA1",
+ "VAR_VIEW_FIRST", "VAR_SERVE_EXPIRED", "VAR_SERVE_EXPIRED_TTL",
+ "VAR_SERVE_EXPIRED_TTL_RESET", "VAR_FAKE_DSA", "VAR_FAKE_SHA1",
"VAR_LOG_IDENTITY", "VAR_HIDE_TRUSTANCHOR", "VAR_TRUST_ANCHOR_SIGNALING",
"VAR_AGGRESSIVE_NSEC", "VAR_USE_SYSTEMD", "VAR_SHM_ENABLE",
"VAR_SHM_KEY", "VAR_ROOT_KEY_SENTINEL", "VAR_DNSCRYPT",
@@ -1104,12 +1132,14 @@ static const char *const yytname[] =
"VAR_FOR_UPSTREAM", "VAR_AUTH_ZONE", "VAR_ZONEFILE", "VAR_MASTER",
"VAR_URL", "VAR_FOR_DOWNSTREAM", "VAR_FALLBACK_ENABLED",
"VAR_TLS_ADDITIONAL_PORT", "VAR_LOW_RTT", "VAR_LOW_RTT_PERMIL",
- "VAR_ALLOW_NOTIFY", "VAR_TLS_WIN_CERT", "$accept", "toplevelvars",
- "toplevelvar", "serverstart", "contents_server", "content_server",
- "stubstart", "contents_stub", "content_stub", "forwardstart",
- "contents_forward", "content_forward", "viewstart", "contents_view",
- "content_view", "authstart", "contents_auth", "content_auth",
- "server_num_threads", "server_verbosity", "server_statistics_interval",
+ "VAR_ALLOW_NOTIFY", "VAR_TLS_WIN_CERT", "VAR_TCP_CONNECTION_LIMIT",
+ "VAR_FORWARD_NO_CACHE", "VAR_STUB_NO_CACHE", "VAR_LOG_SERVFAIL",
+ "$accept", "toplevelvars", "toplevelvar", "serverstart",
+ "contents_server", "content_server", "stubstart", "contents_stub",
+ "content_stub", "forwardstart", "contents_forward", "content_forward",
+ "viewstart", "contents_view", "content_view", "authstart",
+ "contents_auth", "content_auth", "server_num_threads",
+ "server_verbosity", "server_statistics_interval",
"server_statistics_cumulative", "server_extended_statistics",
"server_shm_enable", "server_shm_key", "server_port",
"server_send_client_subnet", "server_client_subnet_zone",
@@ -1120,13 +1150,15 @@ static const char *const yytname[] =
"server_outgoing_num_tcp", "server_incoming_num_tcp",
"server_interface_automatic", "server_do_ip4", "server_do_ip6",
"server_do_udp", "server_do_tcp", "server_prefer_ip6", "server_tcp_mss",
- "server_outgoing_tcp_mss", "server_tcp_upstream",
- "server_udp_upstream_without_downstream", "server_ssl_upstream",
- "server_ssl_service_key", "server_ssl_service_pem", "server_ssl_port",
- "server_tls_cert_bundle", "server_tls_win_cert",
- "server_tls_additional_port", "server_use_systemd",
- "server_do_daemonize", "server_use_syslog", "server_log_time_ascii",
- "server_log_queries", "server_log_replies", "server_chroot",
+ "server_outgoing_tcp_mss", "server_tcp_idle_timeout",
+ "server_tcp_keepalive", "server_tcp_keepalive_timeout",
+ "server_tcp_upstream", "server_udp_upstream_without_downstream",
+ "server_ssl_upstream", "server_ssl_service_key",
+ "server_ssl_service_pem", "server_ssl_port", "server_tls_cert_bundle",
+ "server_tls_win_cert", "server_tls_additional_port",
+ "server_use_systemd", "server_do_daemonize", "server_use_syslog",
+ "server_log_time_ascii", "server_log_queries", "server_log_replies",
+ "server_log_servfail", "server_log_local_actions", "server_chroot",
"server_username", "server_directory", "server_logfile",
"server_pidfile", "server_root_hints", "server_dlv_anchor_file",
"server_dlv_anchor", "server_auto_trust_anchor_file",
@@ -1159,30 +1191,32 @@ static const char *const yytname[] =
"server_cache_max_negative_ttl", "server_cache_min_ttl",
"server_bogus_ttl", "server_val_clean_additional",
"server_val_permissive_mode", "server_aggressive_nsec",
- "server_ignore_cd_flag", "server_serve_expired", "server_fake_dsa",
- "server_fake_sha1", "server_val_log_level",
+ "server_ignore_cd_flag", "server_serve_expired",
+ "server_serve_expired_ttl", "server_serve_expired_ttl_reset",
+ "server_fake_dsa", "server_fake_sha1", "server_val_log_level",
"server_val_nsec3_keysize_iterations", "server_add_holddown",
"server_del_holddown", "server_keep_missing",
"server_permit_small_holddown", "server_key_cache_size",
"server_key_cache_slabs", "server_neg_cache_size", "server_local_zone",
"server_local_data", "server_local_data_ptr", "server_minimal_responses",
"server_rrset_roundrobin", "server_max_udp_size", "server_dns64_prefix",
- "server_dns64_synthall", "server_define_tag", "server_local_zone_tag",
- "server_access_control_tag", "server_access_control_tag_action",
- "server_access_control_tag_data", "server_local_zone_override",
- "server_access_control_view", "server_response_ip_tag",
- "server_ip_ratelimit", "server_ratelimit", "server_ip_ratelimit_size",
- "server_ratelimit_size", "server_ip_ratelimit_slabs",
- "server_ratelimit_slabs", "server_ratelimit_for_domain",
- "server_ratelimit_below_domain", "server_ip_ratelimit_factor",
- "server_ratelimit_factor", "server_low_rtt", "server_low_rtt_permil",
- "server_qname_minimisation", "server_qname_minimisation_strict",
- "server_ipsecmod_enabled", "server_ipsecmod_ignore_bogus",
- "server_ipsecmod_hook", "server_ipsecmod_max_ttl",
- "server_ipsecmod_whitelist", "server_ipsecmod_strict", "stub_name",
- "stub_host", "stub_addr", "stub_first", "stub_ssl_upstream",
- "stub_prime", "forward_name", "forward_host", "forward_addr",
- "forward_first", "forward_ssl_upstream", "auth_name", "auth_zonefile",
+ "server_dns64_synthall", "server_dns64_ignore_aaaa", "server_define_tag",
+ "server_local_zone_tag", "server_access_control_tag",
+ "server_access_control_tag_action", "server_access_control_tag_data",
+ "server_local_zone_override", "server_access_control_view",
+ "server_response_ip_tag", "server_ip_ratelimit", "server_ratelimit",
+ "server_ip_ratelimit_size", "server_ratelimit_size",
+ "server_ip_ratelimit_slabs", "server_ratelimit_slabs",
+ "server_ratelimit_for_domain", "server_ratelimit_below_domain",
+ "server_ip_ratelimit_factor", "server_ratelimit_factor",
+ "server_low_rtt", "server_low_rtt_permil", "server_qname_minimisation",
+ "server_qname_minimisation_strict", "server_ipsecmod_enabled",
+ "server_ipsecmod_ignore_bogus", "server_ipsecmod_hook",
+ "server_ipsecmod_max_ttl", "server_ipsecmod_whitelist",
+ "server_ipsecmod_strict", "stub_name", "stub_host", "stub_addr",
+ "stub_first", "stub_no_cache", "stub_ssl_upstream", "stub_prime",
+ "forward_name", "forward_host", "forward_addr", "forward_first",
+ "forward_no_cache", "forward_ssl_upstream", "auth_name", "auth_zonefile",
"auth_master", "auth_url", "auth_allow_notify", "auth_for_downstream",
"auth_for_upstream", "auth_fallback_enabled", "view_name",
"view_local_zone", "view_response_ip", "view_response_ip_data",
@@ -1210,7 +1244,7 @@ static const char *const yytname[] =
"dnsc_dnscrypt_nonce_cache_size", "dnsc_dnscrypt_nonce_cache_slabs",
"cachedbstart", "contents_cachedb", "content_cachedb",
"cachedb_backend_name", "cachedb_secret_seed", "redis_server_host",
- "redis_server_port", "redis_timeout", YY_NULLPTR
+ "redis_server_port", "redis_timeout", "server_tcp_connection_limit", YY_NULLPTR
};
#endif
@@ -1243,14 +1277,15 @@ static const yytype_uint16 yytoknum[] =
465, 466, 467, 468, 469, 470, 471, 472, 473, 474,
475, 476, 477, 478, 479, 480, 481, 482, 483, 484,
485, 486, 487, 488, 489, 490, 491, 492, 493, 494,
- 495, 496, 497
+ 495, 496, 497, 498, 499, 500, 501, 502, 503, 504,
+ 505, 506, 507, 508
};
# endif
-#define YYPACT_NINF -184
+#define YYPACT_NINF -150
#define yypact_value_is_default(Yystate) \
- (!!((Yystate) == (-184)))
+ (!!((Yystate) == (-150)))
#define YYTABLE_NINF -1
@@ -1261,82 +1296,85 @@ static const yytype_uint16 yytoknum[] =
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- -184, 0, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, 221, -37, -32, -38, -39, -62,
- -129, -104, -160, -183, -3, -1, 2, 3, 4, 5,
- 30, 48, 49, 50, 51, 52, 54, 55, 57, 58,
- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
- 79, 80, 82, 83, 84, 85, 87, 88, 91, 93,
- 94, 95, 96, 98, 99, 100, 101, 102, 103, 104,
- 105, 106, 107, 108, 109, 110, 111, 114, 115, 116,
- 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
- 127, 128, 129, 130, 131, 132, 133, 134, 135, 137,
- 138, 139, 140, 141, 142, 143, 144, 145, 146, 148,
- 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
- 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
- 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,
- 179, 180, 181, 189, 190, 191, 193, 194, 195, 196,
- 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
- 208, 209, 210, 211, 212, 213, 215, 216, 217, 218,
- 219, 220, 251, 252, 253, 254, 258, 259, 260, 302,
- 303, 304, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, 305, 306, 307, 308, 309, 310, -184, -184, -184,
- -184, -184, -184, -184, 314, 318, 319, 343, 344, -184,
- -184, -184, -184, -184, -184, 345, 347, 357, 358, 359,
- 360, 361, -184, -184, -184, -184, -184, -184, -184, -184,
- 362, 363, 364, 365, 366, 367, 368, 369, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, 404, 406, 418,
- 419, 420, 421, 422, 423, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, 424, 425, 426, 427, 428, 435,
- 436, 437, 438, 439, 440, 442, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, 443,
- -184, -184, 444, 445, 446, 447, 448, 452, 454, 455,
- 456, 457, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, 458, 459, 460, 461, 462, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- 463, 464, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, 465, 466, 467, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, 468, 469, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, 470, 471, 472, 473, 474, 475,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, 476, -184, -184, 477, 478, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, 479, 480, 481, -184, -184, -184, -184,
- -184, -184, -184
+ -150, 208, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -12, 99, 159, 143, 39, 215,
+ 107, -80, 104, -149, 22, 23, 24, 28, 29, 30,
+ 78, 79, 80, 84, 88, 89, 114, 115, 116, 118,
+ 129, 130, 131, 133, 136, 137, 138, 139, 140, 141,
+ 178, 193, 194, 196, 197, 199, 202, 210, 211, 214,
+ 216, 217, 218, 219, 220, 221, 222, 230, 232, 233,
+ 234, 235, 236, 238, 239, 240, 241, 243, 244, 245,
+ 246, 247, 261, 262, 263, 264, 265, 266, 268, 274,
+ 275, 276, 278, 279, 280, 281, 282, 283, 284, 286,
+ 288, 289, 290, 291, 293, 294, 295, 296, 297, 319,
+ 320, 321, 322, 323, 324, 325, 326, 327, 328, 329,
+ 330, 331, 332, 334, 335, 336, 337, 338, 339, 340,
+ 342, 343, 344, 345, 346, 347, 348, 350, 351, 352,
+ 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378, 379, 380, 381, 382,
+ 383, 384, 385, 386, 387, 388, 389, 390, 391, 392,
+ 393, 394, 395, 397, 398, 399, 401, 402, 403, 404,
+ 405, 406, 407, 408, 409, 410, 411, 413, 414, 415,
+ 416, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, 417,
+ 418, 419, 420, 421, 422, 423, -150, -150, -150, -150,
+ -150, -150, -150, -150, 424, 425, 426, 427, 428, 430,
+ -150, -150, -150, -150, -150, -150, -150, 431, 432, 433,
+ 434, 435, 436, 438, -150, -150, -150, -150, -150, -150,
+ -150, -150, 439, 440, 441, 442, 443, 444, 445, 446,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, 447,
+ 448, 449, 450, 451, 452, 453, 454, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, 455, 456, 457, 458,
+ 459, 460, 461, 462, 463, 464, 465, 466, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, 467, -150, -150, 468, 469, 470, 471, 472, 473,
+ 474, 475, 476, 477, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, 478, 479, 480, 481, 482,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, 483, 484, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, 485, 486, 487, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, 488, 489, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, 490, 491, 492, 493, 494, 495, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, 496, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, 497, -150, -150,
+ 498, 499, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, 500, 501, 502, -150,
+ -150, -150, -150, -150, -150, -150, -150
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1344,9 +1382,9 @@ static const yytype_int16 yypact[] =
means the default is an error. */
static const yytype_uint16 yydefact[] =
{
- 2, 0, 1, 14, 185, 194, 413, 459, 432, 202,
- 468, 491, 212, 3, 16, 187, 196, 204, 214, 415,
- 434, 461, 470, 493, 4, 5, 6, 10, 13, 8,
+ 2, 0, 1, 14, 194, 204, 434, 480, 453, 213,
+ 489, 512, 223, 3, 16, 196, 206, 215, 225, 436,
+ 455, 482, 491, 514, 4, 5, 6, 10, 13, 8,
9, 7, 11, 12, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1364,126 +1402,131 @@ static const yytype_uint16 yydefact[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 15, 17, 18, 77, 80, 89, 166, 167,
- 19, 139, 140, 141, 142, 143, 144, 28, 68, 20,
- 81, 82, 39, 61, 76, 21, 22, 24, 25, 23,
- 26, 27, 112, 178, 113, 114, 115, 116, 180, 184,
- 181, 162, 78, 67, 93, 110, 111, 29, 30, 31,
- 32, 33, 69, 83, 84, 99, 55, 65, 56, 170,
- 171, 94, 49, 50, 169, 51, 52, 103, 107, 120,
- 128, 149, 104, 62, 34, 35, 36, 91, 121, 122,
- 123, 37, 38, 40, 41, 43, 44, 42, 126, 45,
- 46, 47, 53, 72, 108, 86, 127, 79, 145, 87,
- 88, 105, 106, 92, 48, 70, 73, 54, 57, 95,
- 96, 71, 146, 97, 58, 59, 60, 179, 109, 159,
- 160, 168, 98, 66, 100, 101, 102, 147, 63, 64,
- 85, 74, 75, 90, 117, 118, 119, 124, 125, 150,
- 151, 153, 155, 156, 154, 157, 163, 129, 130, 133,
- 134, 131, 132, 135, 136, 138, 137, 182, 183, 148,
- 158, 172, 174, 173, 175, 176, 177, 152, 161, 164,
- 165, 0, 0, 0, 0, 0, 0, 186, 188, 189,
- 190, 192, 193, 191, 0, 0, 0, 0, 0, 195,
- 197, 198, 199, 200, 201, 0, 0, 0, 0, 0,
- 0, 0, 203, 205, 206, 209, 210, 207, 211, 208,
- 0, 0, 0, 0, 0, 0, 0, 0, 213, 215,
- 216, 217, 218, 222, 219, 220, 221, 0, 0, 0,
- 0, 0, 0, 0, 0, 414, 416, 418, 417, 423,
- 419, 420, 421, 422, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 433, 435, 436, 437,
- 438, 439, 440, 441, 442, 443, 444, 445, 446, 0,
- 460, 462, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 469, 471, 472, 473, 475, 476, 474, 477,
- 478, 479, 480, 0, 0, 0, 0, 0, 492, 494,
- 495, 496, 497, 498, 224, 223, 230, 239, 237, 245,
- 246, 249, 247, 248, 250, 251, 267, 268, 269, 270,
- 271, 294, 295, 296, 301, 302, 242, 303, 304, 307,
- 305, 306, 309, 310, 311, 324, 282, 283, 285, 286,
- 312, 327, 276, 278, 328, 334, 335, 336, 243, 293,
- 348, 349, 277, 343, 263, 238, 272, 325, 331, 313,
- 0, 0, 352, 244, 225, 262, 317, 226, 240, 241,
- 273, 274, 350, 315, 319, 320, 227, 353, 297, 323,
- 264, 281, 329, 330, 333, 342, 275, 346, 344, 345,
- 287, 292, 321, 322, 288, 289, 314, 338, 265, 266,
- 252, 254, 255, 256, 257, 258, 354, 355, 356, 298,
- 299, 300, 308, 357, 358, 0, 0, 0, 316, 290,
- 464, 367, 371, 369, 368, 372, 370, 0, 0, 375,
- 376, 231, 232, 233, 234, 235, 236, 318, 332, 347,
- 379, 380, 291, 359, 0, 0, 0, 0, 0, 0,
- 339, 340, 341, 465, 284, 279, 337, 261, 228, 229,
- 280, 381, 383, 382, 384, 385, 386, 253, 260, 377,
- 378, 259, 387, 388, 389, 392, 391, 390, 393, 394,
- 395, 396, 397, 406, 0, 410, 411, 0, 0, 412,
- 398, 404, 399, 400, 401, 403, 405, 402, 424, 426,
- 425, 428, 429, 430, 431, 427, 447, 448, 449, 450,
- 451, 452, 453, 454, 455, 456, 457, 458, 463, 481,
- 482, 483, 486, 484, 485, 487, 488, 489, 490, 499,
- 500, 501, 502, 503, 326, 351, 366, 466, 467, 373,
- 374, 360, 361, 0, 0, 0, 365, 407, 408, 409,
- 364, 362, 363
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 15, 17, 18, 80, 83, 92, 173, 174, 19,
+ 144, 145, 146, 147, 148, 149, 31, 71, 20, 84,
+ 85, 42, 64, 79, 21, 22, 24, 25, 23, 26,
+ 27, 28, 29, 30, 115, 185, 116, 118, 119, 120,
+ 187, 191, 188, 169, 81, 70, 96, 113, 114, 193,
+ 117, 32, 33, 34, 35, 36, 72, 86, 87, 102,
+ 58, 68, 59, 177, 178, 97, 52, 53, 176, 54,
+ 55, 106, 110, 124, 133, 154, 107, 65, 37, 38,
+ 39, 94, 125, 126, 127, 40, 41, 43, 44, 46,
+ 47, 45, 131, 48, 49, 50, 56, 75, 111, 89,
+ 132, 82, 150, 90, 91, 108, 109, 95, 51, 73,
+ 76, 57, 60, 98, 99, 74, 151, 100, 61, 62,
+ 63, 186, 112, 164, 165, 166, 167, 175, 101, 69,
+ 103, 104, 105, 152, 66, 67, 88, 77, 78, 93,
+ 121, 122, 123, 128, 129, 130, 155, 156, 158, 160,
+ 161, 159, 162, 170, 134, 135, 138, 139, 136, 137,
+ 140, 141, 143, 142, 189, 190, 153, 163, 179, 181,
+ 180, 182, 183, 184, 157, 168, 171, 172, 192, 0,
+ 0, 0, 0, 0, 0, 0, 195, 197, 198, 199,
+ 201, 202, 203, 200, 0, 0, 0, 0, 0, 0,
+ 205, 207, 208, 209, 210, 211, 212, 0, 0, 0,
+ 0, 0, 0, 0, 214, 216, 217, 220, 221, 218,
+ 222, 219, 0, 0, 0, 0, 0, 0, 0, 0,
+ 224, 226, 227, 228, 229, 233, 230, 231, 232, 0,
+ 0, 0, 0, 0, 0, 0, 0, 435, 437, 439,
+ 438, 444, 440, 441, 442, 443, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 454, 456,
+ 457, 458, 459, 460, 461, 462, 463, 464, 465, 466,
+ 467, 0, 481, 483, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 490, 492, 493, 494, 496, 497,
+ 495, 498, 499, 500, 501, 0, 0, 0, 0, 0,
+ 513, 515, 516, 517, 518, 519, 235, 234, 241, 250,
+ 248, 256, 257, 260, 258, 259, 261, 262, 263, 264,
+ 265, 283, 284, 285, 286, 287, 310, 311, 312, 317,
+ 318, 253, 319, 320, 323, 321, 322, 325, 326, 327,
+ 340, 298, 299, 301, 302, 328, 343, 292, 294, 344,
+ 350, 351, 352, 254, 309, 366, 367, 293, 361, 277,
+ 249, 288, 341, 347, 329, 0, 0, 370, 255, 236,
+ 276, 333, 237, 251, 252, 289, 290, 368, 331, 335,
+ 336, 238, 371, 313, 339, 278, 297, 345, 346, 349,
+ 360, 291, 364, 362, 363, 303, 308, 337, 338, 304,
+ 305, 330, 354, 279, 280, 282, 266, 268, 269, 270,
+ 271, 272, 372, 373, 374, 314, 315, 316, 324, 375,
+ 376, 377, 0, 0, 0, 332, 306, 485, 386, 390,
+ 388, 387, 391, 389, 0, 0, 394, 395, 242, 243,
+ 244, 245, 246, 247, 334, 348, 365, 398, 399, 307,
+ 378, 0, 0, 0, 0, 0, 0, 355, 356, 357,
+ 358, 359, 486, 300, 295, 353, 275, 239, 240, 296,
+ 400, 402, 401, 403, 404, 405, 267, 274, 396, 397,
+ 273, 0, 281, 406, 407, 408, 412, 411, 409, 410,
+ 413, 414, 415, 416, 418, 417, 427, 0, 431, 432,
+ 0, 0, 433, 419, 425, 420, 421, 422, 424, 426,
+ 423, 445, 447, 446, 449, 450, 451, 452, 448, 468,
+ 469, 470, 471, 472, 473, 474, 475, 476, 477, 478,
+ 479, 484, 502, 503, 504, 507, 505, 506, 508, 509,
+ 510, 511, 520, 521, 522, 523, 524, 342, 369, 385,
+ 487, 488, 392, 393, 379, 380, 0, 0, 0, 384,
+ 525, 428, 429, 430, 383, 381, 382
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
- -184, -184, -184
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+ -150, -150, -150, -150
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 13, 14, 24, 202, 15, 25, 377, 16,
- 26, 389, 17, 27, 402, 18, 28, 418, 203, 204,
- 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
- 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
- 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
- 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
- 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
- 255, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
- 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
- 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
- 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
- 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
- 325, 326, 327, 328, 329, 330, 331, 332, 333, 334,
- 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,
- 345, 346, 347, 348, 349, 350, 351, 352, 353, 354,
- 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
- 365, 366, 378, 379, 380, 381, 382, 383, 390, 391,
- 392, 393, 394, 419, 420, 421, 422, 423, 424, 425,
- 426, 403, 404, 405, 406, 407, 408, 409, 19, 29,
- 435, 436, 437, 438, 439, 440, 441, 442, 443, 20,
- 30, 456, 457, 458, 459, 460, 461, 462, 463, 464,
- 465, 466, 467, 468, 21, 31, 470, 471, 367, 368,
- 369, 370, 22, 32, 482, 483, 484, 485, 486, 487,
- 488, 489, 490, 491, 492, 23, 33, 498, 499, 500,
- 501, 502, 503
+ -1, 1, 13, 14, 24, 211, 15, 25, 396, 16,
+ 26, 410, 17, 27, 424, 18, 28, 440, 212, 213,
+ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
+ 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,
+ 244, 245, 246, 247, 248, 249, 250, 251, 252, 253,
+ 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
+ 264, 265, 266, 267, 268, 269, 270, 271, 272, 273,
+ 274, 275, 276, 277, 278, 279, 280, 281, 282, 283,
+ 284, 285, 286, 287, 288, 289, 290, 291, 292, 293,
+ 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
+ 304, 305, 306, 307, 308, 309, 310, 311, 312, 313,
+ 314, 315, 316, 317, 318, 319, 320, 321, 322, 323,
+ 324, 325, 326, 327, 328, 329, 330, 331, 332, 333,
+ 334, 335, 336, 337, 338, 339, 340, 341, 342, 343,
+ 344, 345, 346, 347, 348, 349, 350, 351, 352, 353,
+ 354, 355, 356, 357, 358, 359, 360, 361, 362, 363,
+ 364, 365, 366, 367, 368, 369, 370, 371, 372, 373,
+ 374, 375, 376, 377, 378, 379, 380, 381, 382, 383,
+ 397, 398, 399, 400, 401, 402, 403, 411, 412, 413,
+ 414, 415, 416, 441, 442, 443, 444, 445, 446, 447,
+ 448, 425, 426, 427, 428, 429, 430, 431, 19, 29,
+ 457, 458, 459, 460, 461, 462, 463, 464, 465, 20,
+ 30, 478, 479, 480, 481, 482, 483, 484, 485, 486,
+ 487, 488, 489, 490, 21, 31, 492, 493, 384, 385,
+ 386, 387, 22, 32, 504, 505, 506, 507, 508, 509,
+ 510, 511, 512, 513, 514, 23, 33, 520, 521, 522,
+ 523, 524, 525, 388
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -1491,167 +1534,173 @@ static const yytype_int16 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_uint16 yytable[] =
{
- 2, 410, 395, 371, 469, 372, 373, 504, 384, 505,
- 0, 3, 506, 507, 508, 509, 385, 386, 444, 445,
- 446, 447, 448, 449, 450, 451, 452, 453, 454, 455,
- 427, 428, 429, 430, 431, 432, 433, 434, 396, 397,
- 510, 4, 493, 494, 495, 496, 497, 5, 472, 473,
- 474, 475, 476, 477, 478, 479, 480, 481, 511, 512,
- 513, 514, 515, 398, 516, 517, 374, 518, 519, 520,
- 521, 522, 523, 524, 525, 526, 527, 528, 529, 530,
- 531, 532, 533, 534, 535, 536, 537, 538, 539, 540,
- 541, 6, 542, 543, 544, 545, 375, 546, 547, 376,
- 387, 548, 388, 549, 550, 551, 552, 7, 553, 554,
- 555, 556, 557, 558, 559, 560, 561, 562, 563, 564,
- 565, 566, 399, 400, 567, 568, 569, 570, 571, 572,
- 573, 574, 575, 576, 577, 578, 579, 580, 581, 582,
- 583, 584, 585, 586, 587, 588, 8, 589, 590, 591,
- 592, 593, 594, 595, 596, 597, 598, 401, 599, 600,
- 601, 602, 603, 604, 605, 606, 607, 608, 609, 610,
- 611, 612, 613, 614, 615, 616, 617, 618, 619, 620,
- 621, 622, 623, 624, 625, 626, 627, 628, 629, 630,
- 631, 632, 411, 9, 412, 413, 414, 415, 416, 633,
- 634, 635, 417, 636, 637, 638, 639, 10, 640, 641,
- 642, 643, 644, 645, 646, 647, 648, 649, 650, 651,
- 652, 653, 654, 655, 11, 656, 657, 658, 659, 660,
- 661, 0, 12, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
- 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
- 61, 662, 663, 664, 665, 62, 63, 64, 666, 667,
- 668, 65, 66, 67, 68, 69, 70, 71, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
- 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
- 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
- 104, 105, 669, 670, 671, 672, 673, 674, 675, 676,
- 677, 106, 107, 108, 678, 109, 110, 111, 679, 680,
- 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
- 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
- 132, 133, 134, 681, 682, 683, 135, 684, 136, 137,
- 138, 139, 140, 141, 142, 143, 144, 685, 686, 687,
- 688, 689, 690, 691, 692, 693, 694, 695, 696, 697,
- 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
- 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
- 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
- 175, 176, 177, 178, 698, 179, 699, 180, 181, 182,
- 183, 184, 185, 186, 187, 188, 189, 190, 700, 701,
- 702, 703, 704, 705, 706, 707, 708, 709, 710, 191,
- 192, 193, 194, 195, 196, 711, 712, 713, 714, 715,
- 716, 197, 717, 718, 719, 720, 721, 722, 723, 198,
- 199, 200, 724, 201, 725, 726, 727, 728, 729, 730,
- 731, 732, 733, 734, 735, 736, 737, 738, 739, 740,
- 741, 742, 743, 744, 745, 746, 747, 748, 749, 750,
- 751, 752
+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 491, 526, 527, 528, 65, 66, 67, 529, 530,
+ 531, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
+ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
+ 107, 108, 432, 515, 516, 517, 518, 519, 532, 533,
+ 534, 109, 110, 111, 535, 112, 113, 114, 536, 537,
+ 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
+ 135, 136, 137, 138, 538, 539, 540, 139, 541, 140,
+ 141, 142, 143, 144, 145, 146, 147, 148, 149, 542,
+ 543, 544, 389, 545, 390, 391, 546, 547, 548, 549,
+ 550, 551, 150, 151, 152, 153, 154, 155, 156, 157,
+ 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
+ 178, 179, 180, 181, 182, 183, 417, 184, 552, 185,
+ 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
+ 196, 197, 404, 553, 554, 392, 555, 556, 2, 557,
+ 405, 406, 558, 198, 199, 200, 201, 202, 203, 3,
+ 559, 560, 418, 419, 561, 204, 562, 563, 564, 565,
+ 566, 567, 568, 205, 206, 207, 393, 208, 209, 394,
+ 569, 210, 570, 571, 572, 573, 574, 420, 575, 576,
+ 577, 578, 4, 579, 580, 581, 582, 583, 5, 466,
+ 467, 468, 469, 470, 471, 472, 473, 474, 475, 476,
+ 477, 584, 585, 586, 587, 588, 589, 433, 590, 434,
+ 435, 436, 437, 438, 591, 592, 593, 439, 594, 595,
+ 596, 597, 598, 599, 600, 407, 601, 408, 602, 603,
+ 604, 605, 6, 606, 607, 608, 609, 610, 421, 422,
+ 449, 450, 451, 452, 453, 454, 455, 456, 7, 494,
+ 495, 496, 497, 498, 499, 500, 501, 502, 503, 611,
+ 612, 613, 614, 615, 616, 617, 618, 619, 620, 621,
+ 622, 623, 624, 423, 625, 626, 627, 628, 629, 630,
+ 631, 395, 632, 633, 634, 635, 636, 637, 638, 8,
+ 639, 640, 641, 642, 643, 644, 645, 646, 647, 648,
+ 649, 650, 651, 652, 653, 654, 655, 656, 657, 658,
+ 659, 660, 661, 662, 663, 664, 665, 666, 667, 668,
+ 669, 670, 671, 672, 673, 674, 675, 676, 677, 678,
+ 679, 680, 681, 682, 683, 684, 9, 685, 686, 687,
+ 409, 688, 689, 690, 691, 692, 693, 694, 695, 696,
+ 697, 698, 10, 699, 700, 701, 702, 703, 704, 705,
+ 706, 707, 708, 709, 710, 711, 712, 713, 714, 11,
+ 715, 716, 717, 718, 719, 720, 721, 12, 722, 723,
+ 724, 725, 726, 727, 728, 729, 730, 731, 732, 733,
+ 734, 735, 736, 737, 738, 739, 740, 741, 742, 743,
+ 744, 745, 746, 747, 748, 749, 750, 751, 752, 753,
+ 754, 755, 756, 757, 758, 759, 760, 761, 762, 763,
+ 764, 765, 766, 767, 768, 769, 770, 771, 772, 773,
+ 774, 775, 776, 777, 778, 779, 780, 781, 782, 783,
+ 784, 785, 786
};
-static const yytype_int16 yycheck[] =
+static const yytype_uint8 yycheck[] =
{
- 0, 40, 40, 40, 108, 42, 43, 10, 40, 10,
- -1, 11, 10, 10, 10, 10, 48, 49, 147, 148,
- 149, 150, 151, 152, 153, 154, 155, 156, 157, 158,
- 92, 93, 94, 95, 96, 97, 98, 99, 76, 77,
- 10, 41, 225, 226, 227, 228, 229, 47, 208, 209,
- 210, 211, 212, 213, 214, 215, 216, 217, 10, 10,
- 10, 10, 10, 101, 10, 10, 103, 10, 10, 10,
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
+ 42, 111, 10, 10, 10, 47, 48, 49, 10, 10,
+ 10, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
+ 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 43, 232, 233, 234, 235, 236, 10, 10,
+ 10, 103, 104, 105, 10, 107, 108, 109, 10, 10,
+ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ 132, 133, 134, 135, 10, 10, 10, 139, 10, 141,
+ 142, 143, 144, 145, 146, 147, 148, 149, 150, 10,
+ 10, 10, 43, 10, 45, 46, 10, 10, 10, 10,
+ 10, 10, 164, 165, 166, 167, 168, 169, 170, 171,
+ 172, 173, 174, 175, 176, 177, 178, 179, 180, 181,
+ 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 43, 199, 10, 201,
+ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 213, 43, 10, 10, 106, 10, 10, 0, 10,
+ 51, 52, 10, 225, 226, 227, 228, 229, 230, 11,
+ 10, 10, 79, 80, 10, 237, 10, 10, 10, 10,
+ 10, 10, 10, 245, 246, 247, 137, 249, 250, 140,
+ 10, 253, 10, 10, 10, 10, 10, 104, 10, 10,
+ 10, 10, 44, 10, 10, 10, 10, 10, 50, 152,
+ 153, 154, 155, 156, 157, 158, 159, 160, 161, 162,
+ 163, 10, 10, 10, 10, 10, 10, 238, 10, 240,
+ 241, 242, 243, 244, 10, 10, 10, 248, 10, 10,
+ 10, 10, 10, 10, 10, 136, 10, 138, 10, 10,
+ 10, 10, 94, 10, 10, 10, 10, 10, 165, 166,
+ 95, 96, 97, 98, 99, 100, 101, 102, 110, 215,
+ 216, 217, 218, 219, 220, 221, 222, 223, 224, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 200, 10, 10, 10, 10, 10, 10,
+ 10, 252, 10, 10, 10, 10, 10, 10, 10, 151,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 91, 10, 10, 10, 10, 133, 10, 10, 136,
- 132, 10, 134, 10, 10, 10, 10, 107, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 160, 161, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 146, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 195, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 198, 10, 10, 10,
+ 251, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 214, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 231,
+ 10, 10, 10, 10, 10, 10, 10, 239, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 231, 193, 233, 234, 235, 236, 237, 10,
- 10, 10, 241, 10, 10, 10, 10, 207, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 224, 10, 10, 10, 10, 10,
- 10, -1, 232, 12, 13, 14, 15, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
- 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
- 39, 10, 10, 10, 10, 44, 45, 46, 10, 10,
- 10, 50, 51, 52, 53, 54, 55, 56, 57, 58,
- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
- 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
- 89, 90, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 100, 101, 102, 10, 104, 105, 106, 10, 10,
- 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
- 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 10, 10, 10, 135, 10, 137, 138,
- 139, 140, 141, 142, 143, 144, 145, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
- 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,
- 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
- 189, 190, 191, 192, 10, 194, 10, 196, 197, 198,
- 199, 200, 201, 202, 203, 204, 205, 206, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 218,
- 219, 220, 221, 222, 223, 10, 10, 10, 10, 10,
- 10, 230, 10, 10, 10, 10, 10, 10, 10, 238,
- 239, 240, 10, 242, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10
+ 10, 10, 10
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const yytype_uint16 yystos[] =
{
- 0, 244, 0, 11, 41, 47, 91, 107, 146, 193,
- 207, 224, 232, 245, 246, 249, 252, 255, 258, 451,
- 462, 477, 485, 498, 247, 250, 253, 256, 259, 452,
- 463, 478, 486, 499, 12, 13, 14, 15, 16, 17,
+ 0, 255, 0, 11, 44, 50, 94, 110, 151, 198,
+ 214, 231, 239, 256, 257, 260, 263, 266, 269, 472,
+ 483, 498, 506, 519, 258, 261, 264, 267, 270, 473,
+ 484, 499, 507, 520, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
- 38, 39, 44, 45, 46, 50, 51, 52, 53, 54,
+ 38, 39, 40, 41, 42, 47, 48, 49, 53, 54,
55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
- 85, 86, 87, 88, 89, 90, 100, 101, 102, 104,
- 105, 106, 109, 110, 111, 112, 113, 114, 115, 116,
+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 103,
+ 104, 105, 107, 108, 109, 112, 113, 114, 115, 116,
117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
- 127, 128, 129, 130, 131, 135, 137, 138, 139, 140,
- 141, 142, 143, 144, 145, 159, 160, 161, 162, 163,
+ 127, 128, 129, 130, 131, 132, 133, 134, 135, 139,
+ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
164, 165, 166, 167, 168, 169, 170, 171, 172, 173,
174, 175, 176, 177, 178, 179, 180, 181, 182, 183,
- 184, 185, 186, 187, 188, 189, 190, 191, 192, 194,
- 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
- 206, 218, 219, 220, 221, 222, 223, 230, 238, 239,
- 240, 242, 248, 261, 262, 263, 264, 265, 266, 267,
- 268, 269, 270, 271, 272, 273, 274, 275, 276, 277,
- 278, 279, 280, 281, 282, 283, 284, 285, 286, 287,
- 288, 289, 290, 291, 292, 293, 294, 295, 296, 297,
- 298, 299, 300, 301, 302, 303, 304, 305, 306, 307,
- 308, 309, 310, 311, 312, 313, 314, 315, 316, 317,
- 318, 319, 320, 321, 322, 323, 324, 325, 326, 327,
- 328, 329, 330, 331, 332, 333, 334, 335, 336, 337,
- 338, 339, 340, 341, 342, 343, 344, 345, 346, 347,
- 348, 349, 350, 351, 352, 353, 354, 355, 356, 357,
- 358, 359, 360, 361, 362, 363, 364, 365, 366, 367,
- 368, 369, 370, 371, 372, 373, 374, 375, 376, 377,
- 378, 379, 380, 381, 382, 383, 384, 385, 386, 387,
- 388, 389, 390, 391, 392, 393, 394, 395, 396, 397,
- 398, 399, 400, 401, 402, 403, 404, 405, 406, 407,
- 408, 409, 410, 411, 412, 413, 414, 415, 416, 417,
- 418, 419, 420, 421, 422, 423, 424, 481, 482, 483,
- 484, 40, 42, 43, 103, 133, 136, 251, 425, 426,
- 427, 428, 429, 430, 40, 48, 49, 132, 134, 254,
- 431, 432, 433, 434, 435, 40, 76, 77, 101, 160,
- 161, 195, 257, 444, 445, 446, 447, 448, 449, 450,
- 40, 231, 233, 234, 235, 236, 237, 241, 260, 436,
- 437, 438, 439, 440, 441, 442, 443, 92, 93, 94,
- 95, 96, 97, 98, 99, 453, 454, 455, 456, 457,
- 458, 459, 460, 461, 147, 148, 149, 150, 151, 152,
- 153, 154, 155, 156, 157, 158, 464, 465, 466, 467,
- 468, 469, 470, 471, 472, 473, 474, 475, 476, 108,
- 479, 480, 208, 209, 210, 211, 212, 213, 214, 215,
- 216, 217, 487, 488, 489, 490, 491, 492, 493, 494,
- 495, 496, 497, 225, 226, 227, 228, 229, 500, 501,
- 502, 503, 504, 505, 10, 10, 10, 10, 10, 10,
+ 184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
+ 194, 195, 196, 197, 199, 201, 202, 203, 204, 205,
+ 206, 207, 208, 209, 210, 211, 212, 213, 225, 226,
+ 227, 228, 229, 230, 237, 245, 246, 247, 249, 250,
+ 253, 259, 272, 273, 274, 275, 276, 277, 278, 279,
+ 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
+ 290, 291, 292, 293, 294, 295, 296, 297, 298, 299,
+ 300, 301, 302, 303, 304, 305, 306, 307, 308, 309,
+ 310, 311, 312, 313, 314, 315, 316, 317, 318, 319,
+ 320, 321, 322, 323, 324, 325, 326, 327, 328, 329,
+ 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346, 347, 348, 349,
+ 350, 351, 352, 353, 354, 355, 356, 357, 358, 359,
+ 360, 361, 362, 363, 364, 365, 366, 367, 368, 369,
+ 370, 371, 372, 373, 374, 375, 376, 377, 378, 379,
+ 380, 381, 382, 383, 384, 385, 386, 387, 388, 389,
+ 390, 391, 392, 393, 394, 395, 396, 397, 398, 399,
+ 400, 401, 402, 403, 404, 405, 406, 407, 408, 409,
+ 410, 411, 412, 413, 414, 415, 416, 417, 418, 419,
+ 420, 421, 422, 423, 424, 425, 426, 427, 428, 429,
+ 430, 431, 432, 433, 434, 435, 436, 437, 438, 439,
+ 440, 441, 442, 443, 502, 503, 504, 505, 527, 43,
+ 45, 46, 106, 137, 140, 252, 262, 444, 445, 446,
+ 447, 448, 449, 450, 43, 51, 52, 136, 138, 251,
+ 265, 451, 452, 453, 454, 455, 456, 43, 79, 80,
+ 104, 165, 166, 200, 268, 465, 466, 467, 468, 469,
+ 470, 471, 43, 238, 240, 241, 242, 243, 244, 248,
+ 271, 457, 458, 459, 460, 461, 462, 463, 464, 95,
+ 96, 97, 98, 99, 100, 101, 102, 474, 475, 476,
+ 477, 478, 479, 480, 481, 482, 152, 153, 154, 155,
+ 156, 157, 158, 159, 160, 161, 162, 163, 485, 486,
+ 487, 488, 489, 490, 491, 492, 493, 494, 495, 496,
+ 497, 111, 500, 501, 215, 216, 217, 218, 219, 220,
+ 221, 222, 223, 224, 508, 509, 510, 511, 512, 513,
+ 514, 515, 516, 517, 518, 232, 233, 234, 235, 236,
+ 521, 522, 523, 524, 525, 526, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
@@ -1676,36 +1725,37 @@ static const yytype_uint16 yystos[] =
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_uint16 yyr1[] =
{
- 0, 243, 244, 244, 245, 245, 245, 245, 245, 245,
- 245, 245, 245, 245, 246, 247, 247, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
- 248, 248, 248, 248, 248, 249, 250, 250, 251, 251,
- 251, 251, 251, 251, 252, 253, 253, 254, 254, 254,
- 254, 254, 255, 256, 256, 257, 257, 257, 257, 257,
- 257, 257, 258, 259, 259, 260, 260, 260, 260, 260,
- 260, 260, 260, 261, 262, 263, 264, 265, 266, 267,
- 268, 269, 270, 271, 272, 273, 274, 275, 276, 277,
+ 0, 254, 255, 255, 256, 256, 256, 256, 256, 256,
+ 256, 256, 256, 256, 257, 258, 258, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 260, 261, 261, 262, 262, 262,
+ 262, 262, 262, 262, 263, 264, 264, 265, 265, 265,
+ 265, 265, 265, 266, 267, 267, 268, 268, 268, 268,
+ 268, 268, 268, 269, 270, 270, 271, 271, 271, 271,
+ 271, 271, 271, 271, 272, 273, 274, 275, 276, 277,
278, 279, 280, 281, 282, 283, 284, 285, 286, 287,
288, 289, 290, 291, 292, 293, 294, 295, 296, 297,
298, 299, 300, 301, 302, 303, 304, 305, 306, 307,
@@ -1723,16 +1773,18 @@ static const yytype_uint16 yyr1[] =
418, 419, 420, 421, 422, 423, 424, 425, 426, 427,
428, 429, 430, 431, 432, 433, 434, 435, 436, 437,
438, 439, 440, 441, 442, 443, 444, 445, 446, 447,
- 448, 449, 450, 451, 452, 452, 453, 453, 453, 453,
- 453, 453, 453, 453, 454, 455, 456, 457, 458, 459,
- 460, 461, 462, 463, 463, 464, 464, 464, 464, 464,
- 464, 464, 464, 464, 464, 464, 464, 465, 466, 467,
- 468, 469, 470, 471, 472, 473, 474, 475, 476, 477,
- 478, 478, 479, 480, 481, 482, 483, 484, 485, 486,
- 486, 487, 487, 487, 487, 487, 487, 487, 487, 487,
- 487, 488, 489, 490, 491, 492, 493, 494, 495, 496,
- 497, 498, 499, 499, 500, 500, 500, 500, 500, 501,
- 502, 503, 504, 505
+ 448, 449, 450, 451, 452, 453, 454, 455, 456, 457,
+ 458, 459, 460, 461, 462, 463, 464, 465, 466, 467,
+ 468, 469, 470, 471, 472, 473, 473, 474, 474, 474,
+ 474, 474, 474, 474, 474, 475, 476, 477, 478, 479,
+ 480, 481, 482, 483, 484, 484, 485, 485, 485, 485,
+ 485, 485, 485, 485, 485, 485, 485, 485, 486, 487,
+ 488, 489, 490, 491, 492, 493, 494, 495, 496, 497,
+ 498, 499, 499, 500, 501, 502, 503, 504, 505, 506,
+ 507, 507, 508, 508, 508, 508, 508, 508, 508, 508,
+ 508, 508, 509, 510, 511, 512, 513, 514, 515, 516,
+ 517, 518, 519, 520, 520, 521, 521, 521, 521, 521,
+ 522, 523, 524, 525, 526, 527
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -1756,11 +1808,12 @@ static const yytype_uint8 yyr2[] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 2, 0, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 0, 1, 1, 1,
1, 1, 1, 1, 1, 2, 0, 1, 1, 1,
- 1, 1, 1, 2, 0, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 0, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 2, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -1770,25 +1823,26 @@ static const yytype_uint8 yyr2[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 3, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 3, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 3, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 3, 4, 4, 4, 3, 3, 2, 2, 2,
- 2, 2, 2, 3, 3, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
+ 3, 4, 4, 4, 3, 3, 2, 2, 2, 2,
+ 2, 2, 3, 3, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3,
+ 3, 2, 2, 2, 1, 2, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
2, 2, 2, 1, 2, 0, 1, 1, 1, 1,
- 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 2, 0, 1, 2, 2, 2, 3, 3, 1,
+ 2, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 1, 2, 0, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 1,
- 2, 0, 1, 2, 2, 2, 3, 3, 1, 2,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 1, 2, 0, 1, 1, 1, 1, 1, 2,
- 2, 2, 2, 2
+ 2, 2, 2, 2, 2, 3
};
@@ -2465,15 +2519,15 @@ yyreduce:
switch (yyn)
{
case 14:
-#line 173 "util/configparser.y" /* yacc.c:1646 */
+#line 176 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(server:)\n"));
}
-#line 2473 "util/configparser.c" /* yacc.c:1646 */
+#line 2527 "util/configparser.c" /* yacc.c:1646 */
break;
- case 185:
-#line 255 "util/configparser.y" /* yacc.c:1646 */
+ case 194:
+#line 262 "util/configparser.y" /* yacc.c:1646 */
{
struct config_stub* s;
OUTYY(("\nP(stub_zone:)\n"));
@@ -2484,11 +2538,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2488 "util/configparser.c" /* yacc.c:1646 */
+#line 2542 "util/configparser.c" /* yacc.c:1646 */
break;
- case 194:
-#line 272 "util/configparser.y" /* yacc.c:1646 */
+ case 204:
+#line 279 "util/configparser.y" /* yacc.c:1646 */
{
struct config_stub* s;
OUTYY(("\nP(forward_zone:)\n"));
@@ -2499,11 +2553,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2503 "util/configparser.c" /* yacc.c:1646 */
+#line 2557 "util/configparser.c" /* yacc.c:1646 */
break;
- case 202:
-#line 289 "util/configparser.y" /* yacc.c:1646 */
+ case 213:
+#line 296 "util/configparser.y" /* yacc.c:1646 */
{
struct config_view* s;
OUTYY(("\nP(view:)\n"));
@@ -2516,11 +2570,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2520 "util/configparser.c" /* yacc.c:1646 */
+#line 2574 "util/configparser.c" /* yacc.c:1646 */
break;
- case 212:
-#line 308 "util/configparser.y" /* yacc.c:1646 */
+ case 223:
+#line 315 "util/configparser.y" /* yacc.c:1646 */
{
struct config_auth* s;
OUTYY(("\nP(auth_zone:)\n"));
@@ -2535,11 +2589,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2539 "util/configparser.c" /* yacc.c:1646 */
+#line 2593 "util/configparser.c" /* yacc.c:1646 */
break;
- case 223:
-#line 330 "util/configparser.y" /* yacc.c:1646 */
+ case 234:
+#line 337 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_num_threads:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2547,11 +2601,11 @@ yyreduce:
else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2551 "util/configparser.c" /* yacc.c:1646 */
+#line 2605 "util/configparser.c" /* yacc.c:1646 */
break;
- case 224:
-#line 339 "util/configparser.y" /* yacc.c:1646 */
+ case 235:
+#line 346 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_verbosity:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2559,11 +2613,11 @@ yyreduce:
else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2563 "util/configparser.c" /* yacc.c:1646 */
+#line 2617 "util/configparser.c" /* yacc.c:1646 */
break;
- case 225:
-#line 348 "util/configparser.y" /* yacc.c:1646 */
+ case 236:
+#line 355 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_statistics_interval:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -2573,11 +2627,11 @@ yyreduce:
else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2577 "util/configparser.c" /* yacc.c:1646 */
+#line 2631 "util/configparser.c" /* yacc.c:1646 */
break;
- case 226:
-#line 359 "util/configparser.y" /* yacc.c:1646 */
+ case 237:
+#line 366 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_statistics_cumulative:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2585,11 +2639,11 @@ yyreduce:
else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2589 "util/configparser.c" /* yacc.c:1646 */
+#line 2643 "util/configparser.c" /* yacc.c:1646 */
break;
- case 227:
-#line 368 "util/configparser.y" /* yacc.c:1646 */
+ case 238:
+#line 375 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_extended_statistics:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2597,11 +2651,11 @@ yyreduce:
else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2601 "util/configparser.c" /* yacc.c:1646 */
+#line 2655 "util/configparser.c" /* yacc.c:1646 */
break;
- case 228:
-#line 377 "util/configparser.y" /* yacc.c:1646 */
+ case 239:
+#line 384 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_shm_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2609,11 +2663,11 @@ yyreduce:
else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2613 "util/configparser.c" /* yacc.c:1646 */
+#line 2667 "util/configparser.c" /* yacc.c:1646 */
break;
- case 229:
-#line 386 "util/configparser.y" /* yacc.c:1646 */
+ case 240:
+#line 393 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_shm_key:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "") == 0 || strcmp((yyvsp[0].str), "0") == 0)
@@ -2623,11 +2677,11 @@ yyreduce:
else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2627 "util/configparser.c" /* yacc.c:1646 */
+#line 2681 "util/configparser.c" /* yacc.c:1646 */
break;
- case 230:
-#line 397 "util/configparser.y" /* yacc.c:1646 */
+ case 241:
+#line 404 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2635,11 +2689,11 @@ yyreduce:
else cfg_parser->cfg->port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2639 "util/configparser.c" /* yacc.c:1646 */
+#line 2693 "util/configparser.c" /* yacc.c:1646 */
break;
- case 231:
-#line 406 "util/configparser.y" /* yacc.c:1646 */
+ case 242:
+#line 413 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str)));
@@ -2649,11 +2703,11 @@ yyreduce:
OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
#endif
}
-#line 2653 "util/configparser.c" /* yacc.c:1646 */
+#line 2707 "util/configparser.c" /* yacc.c:1646 */
break;
- case 232:
-#line 417 "util/configparser.y" /* yacc.c:1646 */
+ case 243:
+#line 424 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str)));
@@ -2664,11 +2718,11 @@ yyreduce:
OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
#endif
}
-#line 2668 "util/configparser.c" /* yacc.c:1646 */
+#line 2722 "util/configparser.c" /* yacc.c:1646 */
break;
- case 233:
-#line 430 "util/configparser.y" /* yacc.c:1646 */
+ case 244:
+#line 437 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str)));
@@ -2682,11 +2736,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2686 "util/configparser.c" /* yacc.c:1646 */
+#line 2740 "util/configparser.c" /* yacc.c:1646 */
break;
- case 234:
-#line 445 "util/configparser.y" /* yacc.c:1646 */
+ case 245:
+#line 452 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str)));
@@ -2696,11 +2750,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2700 "util/configparser.c" /* yacc.c:1646 */
+#line 2754 "util/configparser.c" /* yacc.c:1646 */
break;
- case 235:
-#line 456 "util/configparser.y" /* yacc.c:1646 */
+ case 246:
+#line 463 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -2716,11 +2770,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2720 "util/configparser.c" /* yacc.c:1646 */
+#line 2774 "util/configparser.c" /* yacc.c:1646 */
break;
- case 236:
-#line 473 "util/configparser.y" /* yacc.c:1646 */
+ case 247:
+#line 480 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -2736,11 +2790,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2740 "util/configparser.c" /* yacc.c:1646 */
+#line 2794 "util/configparser.c" /* yacc.c:1646 */
break;
- case 237:
-#line 490 "util/configparser.y" /* yacc.c:1646 */
+ case 248:
+#line 497 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_ifs == 0)
@@ -2752,11 +2806,11 @@ yyreduce:
else
cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
}
-#line 2756 "util/configparser.c" /* yacc.c:1646 */
+#line 2810 "util/configparser.c" /* yacc.c:1646 */
break;
- case 238:
-#line 503 "util/configparser.y" /* yacc.c:1646 */
+ case 249:
+#line 510 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_out_ifs == 0)
@@ -2770,11 +2824,11 @@ yyreduce:
cfg_parser->cfg->out_ifs[
cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
}
-#line 2774 "util/configparser.c" /* yacc.c:1646 */
+#line 2828 "util/configparser.c" /* yacc.c:1646 */
break;
- case 239:
-#line 518 "util/configparser.y" /* yacc.c:1646 */
+ case 250:
+#line 525 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2782,11 +2836,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2786 "util/configparser.c" /* yacc.c:1646 */
+#line 2840 "util/configparser.c" /* yacc.c:1646 */
break;
- case 240:
-#line 527 "util/configparser.y" /* yacc.c:1646 */
+ case 251:
+#line 534 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_port_permit:%s)\n", (yyvsp[0].str)));
if(!cfg_mark_ports((yyvsp[0].str), 1,
@@ -2794,11 +2848,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 2798 "util/configparser.c" /* yacc.c:1646 */
+#line 2852 "util/configparser.c" /* yacc.c:1646 */
break;
- case 241:
-#line 536 "util/configparser.y" /* yacc.c:1646 */
+ case 252:
+#line 543 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_port_avoid:%s)\n", (yyvsp[0].str)));
if(!cfg_mark_ports((yyvsp[0].str), 0,
@@ -2806,11 +2860,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 2810 "util/configparser.c" /* yacc.c:1646 */
+#line 2864 "util/configparser.c" /* yacc.c:1646 */
break;
- case 242:
-#line 545 "util/configparser.y" /* yacc.c:1646 */
+ case 253:
+#line 552 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_num_tcp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2818,11 +2872,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2822 "util/configparser.c" /* yacc.c:1646 */
+#line 2876 "util/configparser.c" /* yacc.c:1646 */
break;
- case 243:
-#line 554 "util/configparser.y" /* yacc.c:1646 */
+ case 254:
+#line 561 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_incoming_num_tcp:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2830,11 +2884,11 @@ yyreduce:
else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2834 "util/configparser.c" /* yacc.c:1646 */
+#line 2888 "util/configparser.c" /* yacc.c:1646 */
break;
- case 244:
-#line 563 "util/configparser.y" /* yacc.c:1646 */
+ case 255:
+#line 570 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_interface_automatic:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2842,11 +2896,11 @@ yyreduce:
else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2846 "util/configparser.c" /* yacc.c:1646 */
+#line 2900 "util/configparser.c" /* yacc.c:1646 */
break;
- case 245:
-#line 572 "util/configparser.y" /* yacc.c:1646 */
+ case 256:
+#line 579 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_do_ip4:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2854,11 +2908,11 @@ yyreduce:
else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2858 "util/configparser.c" /* yacc.c:1646 */
+#line 2912 "util/configparser.c" /* yacc.c:1646 */
break;
- case 246:
-#line 581 "util/configparser.y" /* yacc.c:1646 */
+ case 257:
+#line 588 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_do_ip6:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2866,11 +2920,11 @@ yyreduce:
else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2870 "util/configparser.c" /* yacc.c:1646 */
+#line 2924 "util/configparser.c" /* yacc.c:1646 */
break;
- case 247:
-#line 590 "util/configparser.y" /* yacc.c:1646 */
+ case 258:
+#line 597 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_do_udp:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2878,11 +2932,11 @@ yyreduce:
else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2882 "util/configparser.c" /* yacc.c:1646 */
+#line 2936 "util/configparser.c" /* yacc.c:1646 */
break;
- case 248:
-#line 599 "util/configparser.y" /* yacc.c:1646 */
+ case 259:
+#line 606 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_do_tcp:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2890,11 +2944,11 @@ yyreduce:
else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2894 "util/configparser.c" /* yacc.c:1646 */
+#line 2948 "util/configparser.c" /* yacc.c:1646 */
break;
- case 249:
-#line 608 "util/configparser.y" /* yacc.c:1646 */
+ case 260:
+#line 615 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_prefer_ip6:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2902,11 +2956,11 @@ yyreduce:
else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2906 "util/configparser.c" /* yacc.c:1646 */
+#line 2960 "util/configparser.c" /* yacc.c:1646 */
break;
- case 250:
-#line 617 "util/configparser.y" /* yacc.c:1646 */
+ case 261:
+#line 624 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_tcp_mss:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2914,11 +2968,11 @@ yyreduce:
else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2918 "util/configparser.c" /* yacc.c:1646 */
+#line 2972 "util/configparser.c" /* yacc.c:1646 */
break;
- case 251:
-#line 626 "util/configparser.y" /* yacc.c:1646 */
+ case 262:
+#line 633 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_tcp_mss:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -2926,11 +2980,55 @@ yyreduce:
else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2930 "util/configparser.c" /* yacc.c:1646 */
+#line 2984 "util/configparser.c" /* yacc.c:1646 */
break;
- case 252:
-#line 635 "util/configparser.y" /* yacc.c:1646 */
+ case 263:
+#line 642 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_tcp_idle_timeout:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("number expected");
+ else if (atoi((yyvsp[0].str)) > 120000)
+ cfg_parser->cfg->tcp_idle_timeout = 120000;
+ else if (atoi((yyvsp[0].str)) < 1)
+ cfg_parser->cfg->tcp_idle_timeout = 1;
+ else cfg_parser->cfg->tcp_idle_timeout = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 3000 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 264:
+#line 655 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_tcp_keepalive:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->do_tcp_keepalive = (strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 3012 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 265:
+#line 664 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("number expected");
+ else if (atoi((yyvsp[0].str)) > 6553500)
+ cfg_parser->cfg->tcp_keepalive_timeout = 6553500;
+ else if (atoi((yyvsp[0].str)) < 1)
+ cfg_parser->cfg->tcp_keepalive_timeout = 0;
+ else cfg_parser->cfg->tcp_keepalive_timeout = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 3028 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 266:
+#line 677 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_tcp_upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2938,11 +3036,11 @@ yyreduce:
else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2942 "util/configparser.c" /* yacc.c:1646 */
+#line 3040 "util/configparser.c" /* yacc.c:1646 */
break;
- case 253:
-#line 644 "util/configparser.y" /* yacc.c:1646 */
+ case 267:
+#line 686 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_udp_upstream_without_downstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2950,11 +3048,11 @@ yyreduce:
else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2954 "util/configparser.c" /* yacc.c:1646 */
+#line 3052 "util/configparser.c" /* yacc.c:1646 */
break;
- case 254:
-#line 653 "util/configparser.y" /* yacc.c:1646 */
+ case 268:
+#line 695 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ssl_upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -2962,31 +3060,31 @@ yyreduce:
else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2966 "util/configparser.c" /* yacc.c:1646 */
+#line 3064 "util/configparser.c" /* yacc.c:1646 */
break;
- case 255:
-#line 662 "util/configparser.y" /* yacc.c:1646 */
+ case 269:
+#line 704 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ssl_service_key:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->ssl_service_key);
cfg_parser->cfg->ssl_service_key = (yyvsp[0].str);
}
-#line 2976 "util/configparser.c" /* yacc.c:1646 */
+#line 3074 "util/configparser.c" /* yacc.c:1646 */
break;
- case 256:
-#line 669 "util/configparser.y" /* yacc.c:1646 */
+ case 270:
+#line 711 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ssl_service_pem:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->ssl_service_pem);
cfg_parser->cfg->ssl_service_pem = (yyvsp[0].str);
}
-#line 2986 "util/configparser.c" /* yacc.c:1646 */
+#line 3084 "util/configparser.c" /* yacc.c:1646 */
break;
- case 257:
-#line 676 "util/configparser.y" /* yacc.c:1646 */
+ case 271:
+#line 718 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2994,21 +3092,21 @@ yyreduce:
else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2998 "util/configparser.c" /* yacc.c:1646 */
+#line 3096 "util/configparser.c" /* yacc.c:1646 */
break;
- case 258:
-#line 685 "util/configparser.y" /* yacc.c:1646 */
+ case 272:
+#line 727 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_tls_cert_bundle:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->tls_cert_bundle);
cfg_parser->cfg->tls_cert_bundle = (yyvsp[0].str);
}
-#line 3008 "util/configparser.c" /* yacc.c:1646 */
+#line 3106 "util/configparser.c" /* yacc.c:1646 */
break;
- case 259:
-#line 692 "util/configparser.y" /* yacc.c:1646 */
+ case 273:
+#line 734 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_tls_win_cert:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3016,22 +3114,22 @@ yyreduce:
else cfg_parser->cfg->tls_win_cert = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3020 "util/configparser.c" /* yacc.c:1646 */
+#line 3118 "util/configparser.c" /* yacc.c:1646 */
break;
- case 260:
-#line 701 "util/configparser.y" /* yacc.c:1646 */
+ case 274:
+#line 743 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_tls_additional_port:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->tls_additional_port,
(yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3031 "util/configparser.c" /* yacc.c:1646 */
+#line 3129 "util/configparser.c" /* yacc.c:1646 */
break;
- case 261:
-#line 709 "util/configparser.y" /* yacc.c:1646 */
+ case 275:
+#line 751 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_use_systemd:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3039,11 +3137,11 @@ yyreduce:
else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3043 "util/configparser.c" /* yacc.c:1646 */
+#line 3141 "util/configparser.c" /* yacc.c:1646 */
break;
- case 262:
-#line 718 "util/configparser.y" /* yacc.c:1646 */
+ case 276:
+#line 760 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_do_daemonize:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3051,11 +3149,11 @@ yyreduce:
else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3055 "util/configparser.c" /* yacc.c:1646 */
+#line 3153 "util/configparser.c" /* yacc.c:1646 */
break;
- case 263:
-#line 727 "util/configparser.y" /* yacc.c:1646 */
+ case 277:
+#line 769 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_use_syslog:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3068,11 +3166,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3072 "util/configparser.c" /* yacc.c:1646 */
+#line 3170 "util/configparser.c" /* yacc.c:1646 */
break;
- case 264:
-#line 741 "util/configparser.y" /* yacc.c:1646 */
+ case 278:
+#line 783 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_log_time_ascii:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3080,11 +3178,11 @@ yyreduce:
else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3084 "util/configparser.c" /* yacc.c:1646 */
+#line 3182 "util/configparser.c" /* yacc.c:1646 */
break;
- case 265:
-#line 750 "util/configparser.y" /* yacc.c:1646 */
+ case 279:
+#line 792 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_log_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3092,11 +3190,11 @@ yyreduce:
else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3096 "util/configparser.c" /* yacc.c:1646 */
+#line 3194 "util/configparser.c" /* yacc.c:1646 */
break;
- case 266:
-#line 759 "util/configparser.y" /* yacc.c:1646 */
+ case 280:
+#line 801 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_log_replies:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3104,31 +3202,55 @@ yyreduce:
else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3108 "util/configparser.c" /* yacc.c:1646 */
+#line 3206 "util/configparser.c" /* yacc.c:1646 */
break;
- case 267:
-#line 768 "util/configparser.y" /* yacc.c:1646 */
+ case 281:
+#line 810 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_log_servfail:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->log_servfail = (strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 3218 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 282:
+#line 819 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_log_local_actions:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->log_local_actions = (strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 3230 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 283:
+#line 828 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_chroot:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->chrootdir);
cfg_parser->cfg->chrootdir = (yyvsp[0].str);
}
-#line 3118 "util/configparser.c" /* yacc.c:1646 */
+#line 3240 "util/configparser.c" /* yacc.c:1646 */
break;
- case 268:
-#line 775 "util/configparser.y" /* yacc.c:1646 */
+ case 284:
+#line 835 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_username:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->username);
cfg_parser->cfg->username = (yyvsp[0].str);
}
-#line 3128 "util/configparser.c" /* yacc.c:1646 */
+#line 3250 "util/configparser.c" /* yacc.c:1646 */
break;
- case 269:
-#line 782 "util/configparser.y" /* yacc.c:1646 */
+ case 285:
+#line 842 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->directory);
@@ -3153,105 +3275,105 @@ yyreduce:
}
}
}
-#line 3157 "util/configparser.c" /* yacc.c:1646 */
+#line 3279 "util/configparser.c" /* yacc.c:1646 */
break;
- case 270:
-#line 808 "util/configparser.y" /* yacc.c:1646 */
+ case 286:
+#line 868 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_logfile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->logfile);
cfg_parser->cfg->logfile = (yyvsp[0].str);
cfg_parser->cfg->use_syslog = 0;
}
-#line 3168 "util/configparser.c" /* yacc.c:1646 */
+#line 3290 "util/configparser.c" /* yacc.c:1646 */
break;
- case 271:
-#line 816 "util/configparser.y" /* yacc.c:1646 */
+ case 287:
+#line 876 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_pidfile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->pidfile);
cfg_parser->cfg->pidfile = (yyvsp[0].str);
}
-#line 3178 "util/configparser.c" /* yacc.c:1646 */
+#line 3300 "util/configparser.c" /* yacc.c:1646 */
break;
- case 272:
-#line 823 "util/configparser.y" /* yacc.c:1646 */
+ case 288:
+#line 883 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_root_hints:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->root_hints, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3188 "util/configparser.c" /* yacc.c:1646 */
+#line 3310 "util/configparser.c" /* yacc.c:1646 */
break;
- case 273:
-#line 830 "util/configparser.y" /* yacc.c:1646 */
+ case 289:
+#line 890 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_dlv_anchor_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dlv_anchor_file);
cfg_parser->cfg->dlv_anchor_file = (yyvsp[0].str);
}
-#line 3198 "util/configparser.c" /* yacc.c:1646 */
+#line 3320 "util/configparser.c" /* yacc.c:1646 */
break;
- case 274:
-#line 837 "util/configparser.y" /* yacc.c:1646 */
+ case 290:
+#line 897 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_dlv_anchor:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->dlv_anchor_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3208 "util/configparser.c" /* yacc.c:1646 */
+#line 3330 "util/configparser.c" /* yacc.c:1646 */
break;
- case 275:
-#line 844 "util/configparser.y" /* yacc.c:1646 */
+ case 291:
+#line 904 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_auto_trust_anchor_file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
auto_trust_anchor_file_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3219 "util/configparser.c" /* yacc.c:1646 */
+#line 3341 "util/configparser.c" /* yacc.c:1646 */
break;
- case 276:
-#line 852 "util/configparser.y" /* yacc.c:1646 */
+ case 292:
+#line 912 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_trust_anchor_file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
trust_anchor_file_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3230 "util/configparser.c" /* yacc.c:1646 */
+#line 3352 "util/configparser.c" /* yacc.c:1646 */
break;
- case 277:
-#line 860 "util/configparser.y" /* yacc.c:1646 */
+ case 293:
+#line 920 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_trusted_keys_file:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->
trusted_keys_file_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3241 "util/configparser.c" /* yacc.c:1646 */
+#line 3363 "util/configparser.c" /* yacc.c:1646 */
break;
- case 278:
-#line 868 "util/configparser.y" /* yacc.c:1646 */
+ case 294:
+#line 928 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_trust_anchor:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->trust_anchor_list, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3251 "util/configparser.c" /* yacc.c:1646 */
+#line 3373 "util/configparser.c" /* yacc.c:1646 */
break;
- case 279:
-#line 875 "util/configparser.y" /* yacc.c:1646 */
+ case 295:
+#line 935 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_trust_anchor_signaling:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3261,11 +3383,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3265 "util/configparser.c" /* yacc.c:1646 */
+#line 3387 "util/configparser.c" /* yacc.c:1646 */
break;
- case 280:
-#line 886 "util/configparser.y" /* yacc.c:1646 */
+ case 296:
+#line 946 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_root_key_sentinel:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3275,21 +3397,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3279 "util/configparser.c" /* yacc.c:1646 */
+#line 3401 "util/configparser.c" /* yacc.c:1646 */
break;
- case 281:
-#line 897 "util/configparser.y" /* yacc.c:1646 */
+ case 297:
+#line 957 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_domain_insecure:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->domain_insecure, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3289 "util/configparser.c" /* yacc.c:1646 */
+#line 3411 "util/configparser.c" /* yacc.c:1646 */
break;
- case 282:
-#line 904 "util/configparser.y" /* yacc.c:1646 */
+ case 298:
+#line 964 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_hide_identity:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3297,11 +3419,11 @@ yyreduce:
else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3301 "util/configparser.c" /* yacc.c:1646 */
+#line 3423 "util/configparser.c" /* yacc.c:1646 */
break;
- case 283:
-#line 913 "util/configparser.y" /* yacc.c:1646 */
+ case 299:
+#line 973 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_hide_version:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3309,11 +3431,11 @@ yyreduce:
else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3313 "util/configparser.c" /* yacc.c:1646 */
+#line 3435 "util/configparser.c" /* yacc.c:1646 */
break;
- case 284:
-#line 922 "util/configparser.y" /* yacc.c:1646 */
+ case 300:
+#line 982 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_hide_trustanchor:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3321,53 +3443,53 @@ yyreduce:
else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3325 "util/configparser.c" /* yacc.c:1646 */
+#line 3447 "util/configparser.c" /* yacc.c:1646 */
break;
- case 285:
-#line 931 "util/configparser.y" /* yacc.c:1646 */
+ case 301:
+#line 991 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_identity:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->identity);
cfg_parser->cfg->identity = (yyvsp[0].str);
}
-#line 3335 "util/configparser.c" /* yacc.c:1646 */
+#line 3457 "util/configparser.c" /* yacc.c:1646 */
break;
- case 286:
-#line 938 "util/configparser.y" /* yacc.c:1646 */
+ case 302:
+#line 998 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_version:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->version);
cfg_parser->cfg->version = (yyvsp[0].str);
}
-#line 3345 "util/configparser.c" /* yacc.c:1646 */
+#line 3467 "util/configparser.c" /* yacc.c:1646 */
break;
- case 287:
-#line 945 "util/configparser.y" /* yacc.c:1646 */
+ case 303:
+#line 1005 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_so_rcvbuf:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_rcvbuf))
yyerror("buffer size expected");
free((yyvsp[0].str));
}
-#line 3356 "util/configparser.c" /* yacc.c:1646 */
+#line 3478 "util/configparser.c" /* yacc.c:1646 */
break;
- case 288:
-#line 953 "util/configparser.y" /* yacc.c:1646 */
+ case 304:
+#line 1013 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_so_sndbuf:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->so_sndbuf))
yyerror("buffer size expected");
free((yyvsp[0].str));
}
-#line 3367 "util/configparser.c" /* yacc.c:1646 */
+#line 3489 "util/configparser.c" /* yacc.c:1646 */
break;
- case 289:
-#line 961 "util/configparser.y" /* yacc.c:1646 */
+ case 305:
+#line 1021 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_so_reuseport:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3376,11 +3498,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3380 "util/configparser.c" /* yacc.c:1646 */
+#line 3502 "util/configparser.c" /* yacc.c:1646 */
break;
- case 290:
-#line 971 "util/configparser.y" /* yacc.c:1646 */
+ case 306:
+#line 1031 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ip_transparent:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3389,11 +3511,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3393 "util/configparser.c" /* yacc.c:1646 */
+#line 3515 "util/configparser.c" /* yacc.c:1646 */
break;
- case 291:
-#line 981 "util/configparser.y" /* yacc.c:1646 */
+ case 307:
+#line 1041 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ip_freebind:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3402,11 +3524,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3406 "util/configparser.c" /* yacc.c:1646 */
+#line 3528 "util/configparser.c" /* yacc.c:1646 */
break;
- case 292:
-#line 991 "util/configparser.y" /* yacc.c:1646 */
+ case 308:
+#line 1051 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3418,11 +3540,11 @@ yyreduce:
else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3422 "util/configparser.c" /* yacc.c:1646 */
+#line 3544 "util/configparser.c" /* yacc.c:1646 */
break;
- case 293:
-#line 1004 "util/configparser.y" /* yacc.c:1646 */
+ case 309:
+#line 1064 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3432,22 +3554,22 @@ yyreduce:
else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3436 "util/configparser.c" /* yacc.c:1646 */
+#line 3558 "util/configparser.c" /* yacc.c:1646 */
break;
- case 294:
-#line 1015 "util/configparser.y" /* yacc.c:1646 */
+ case 310:
+#line 1075 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_msg_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->msg_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 3447 "util/configparser.c" /* yacc.c:1646 */
+#line 3569 "util/configparser.c" /* yacc.c:1646 */
break;
- case 295:
-#line 1023 "util/configparser.y" /* yacc.c:1646 */
+ case 311:
+#line 1083 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3459,11 +3581,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3463 "util/configparser.c" /* yacc.c:1646 */
+#line 3585 "util/configparser.c" /* yacc.c:1646 */
break;
- case 296:
-#line 1036 "util/configparser.y" /* yacc.c:1646 */
+ case 312:
+#line 1096 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3471,11 +3593,11 @@ yyreduce:
else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3475 "util/configparser.c" /* yacc.c:1646 */
+#line 3597 "util/configparser.c" /* yacc.c:1646 */
break;
- case 297:
-#line 1045 "util/configparser.y" /* yacc.c:1646 */
+ case 313:
+#line 1105 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_jostle_timeout:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3483,11 +3605,11 @@ yyreduce:
else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3487 "util/configparser.c" /* yacc.c:1646 */
+#line 3609 "util/configparser.c" /* yacc.c:1646 */
break;
- case 298:
-#line 1054 "util/configparser.y" /* yacc.c:1646 */
+ case 314:
+#line 1114 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_delay_close:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3495,11 +3617,11 @@ yyreduce:
else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3499 "util/configparser.c" /* yacc.c:1646 */
+#line 3621 "util/configparser.c" /* yacc.c:1646 */
break;
- case 299:
-#line 1063 "util/configparser.y" /* yacc.c:1646 */
+ case 315:
+#line 1123 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_unblock_lan_zones:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3508,11 +3630,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3512 "util/configparser.c" /* yacc.c:1646 */
+#line 3634 "util/configparser.c" /* yacc.c:1646 */
break;
- case 300:
-#line 1073 "util/configparser.y" /* yacc.c:1646 */
+ case 316:
+#line 1133 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_insecure_lan_zones:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3521,22 +3643,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3525 "util/configparser.c" /* yacc.c:1646 */
+#line 3647 "util/configparser.c" /* yacc.c:1646 */
break;
- case 301:
-#line 1083 "util/configparser.y" /* yacc.c:1646 */
+ case 317:
+#line 1143 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_rrset_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->rrset_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 3536 "util/configparser.c" /* yacc.c:1646 */
+#line 3658 "util/configparser.c" /* yacc.c:1646 */
break;
- case 302:
-#line 1091 "util/configparser.y" /* yacc.c:1646 */
+ case 318:
+#line 1151 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3548,11 +3670,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3552 "util/configparser.c" /* yacc.c:1646 */
+#line 3674 "util/configparser.c" /* yacc.c:1646 */
break;
- case 303:
-#line 1104 "util/configparser.y" /* yacc.c:1646 */
+ case 319:
+#line 1164 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_host_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3560,22 +3682,22 @@ yyreduce:
else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3564 "util/configparser.c" /* yacc.c:1646 */
+#line 3686 "util/configparser.c" /* yacc.c:1646 */
break;
- case 304:
-#line 1113 "util/configparser.y" /* yacc.c:1646 */
+ case 320:
+#line 1173 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_lame_ttl:%s)\n", (yyvsp[0].str)));
verbose(VERB_DETAIL, "ignored infra-lame-ttl: %s (option "
"removed, use infra-host-ttl)", (yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3575 "util/configparser.c" /* yacc.c:1646 */
+#line 3697 "util/configparser.c" /* yacc.c:1646 */
break;
- case 305:
-#line 1121 "util/configparser.y" /* yacc.c:1646 */
+ case 321:
+#line 1181 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3583,22 +3705,22 @@ yyreduce:
else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3587 "util/configparser.c" /* yacc.c:1646 */
+#line 3709 "util/configparser.c" /* yacc.c:1646 */
break;
- case 306:
-#line 1130 "util/configparser.y" /* yacc.c:1646 */
+ case 322:
+#line 1190 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_lame_size:%s)\n", (yyvsp[0].str)));
verbose(VERB_DETAIL, "ignored infra-cache-lame-size: %s "
"(option removed, use infra-cache-numhosts)", (yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3598 "util/configparser.c" /* yacc.c:1646 */
+#line 3720 "util/configparser.c" /* yacc.c:1646 */
break;
- case 307:
-#line 1138 "util/configparser.y" /* yacc.c:1646 */
+ case 323:
+#line 1198 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3610,11 +3732,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3614 "util/configparser.c" /* yacc.c:1646 */
+#line 3736 "util/configparser.c" /* yacc.c:1646 */
break;
- case 308:
-#line 1151 "util/configparser.y" /* yacc.c:1646 */
+ case 324:
+#line 1211 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_min_rtt:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3622,21 +3744,21 @@ yyreduce:
else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3626 "util/configparser.c" /* yacc.c:1646 */
+#line 3748 "util/configparser.c" /* yacc.c:1646 */
break;
- case 309:
-#line 1160 "util/configparser.y" /* yacc.c:1646 */
+ case 325:
+#line 1220 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_target_fetch_policy:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->target_fetch_policy);
cfg_parser->cfg->target_fetch_policy = (yyvsp[0].str);
}
-#line 3636 "util/configparser.c" /* yacc.c:1646 */
+#line 3758 "util/configparser.c" /* yacc.c:1646 */
break;
- case 310:
-#line 1167 "util/configparser.y" /* yacc.c:1646 */
+ case 326:
+#line 1227 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_harden_short_bufsize:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3645,11 +3767,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3649 "util/configparser.c" /* yacc.c:1646 */
+#line 3771 "util/configparser.c" /* yacc.c:1646 */
break;
- case 311:
-#line 1177 "util/configparser.y" /* yacc.c:1646 */
+ case 327:
+#line 1237 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_harden_large_queries:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3658,11 +3780,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3662 "util/configparser.c" /* yacc.c:1646 */
+#line 3784 "util/configparser.c" /* yacc.c:1646 */
break;
- case 312:
-#line 1187 "util/configparser.y" /* yacc.c:1646 */
+ case 328:
+#line 1247 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_harden_glue:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3671,11 +3793,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3675 "util/configparser.c" /* yacc.c:1646 */
+#line 3797 "util/configparser.c" /* yacc.c:1646 */
break;
- case 313:
-#line 1197 "util/configparser.y" /* yacc.c:1646 */
+ case 329:
+#line 1257 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_harden_dnssec_stripped:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3684,11 +3806,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3688 "util/configparser.c" /* yacc.c:1646 */
+#line 3810 "util/configparser.c" /* yacc.c:1646 */
break;
- case 314:
-#line 1207 "util/configparser.y" /* yacc.c:1646 */
+ case 330:
+#line 1267 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_harden_below_nxdomain:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3697,11 +3819,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3701 "util/configparser.c" /* yacc.c:1646 */
+#line 3823 "util/configparser.c" /* yacc.c:1646 */
break;
- case 315:
-#line 1217 "util/configparser.y" /* yacc.c:1646 */
+ case 331:
+#line 1277 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_harden_referral_path:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3710,11 +3832,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3714 "util/configparser.c" /* yacc.c:1646 */
+#line 3836 "util/configparser.c" /* yacc.c:1646 */
break;
- case 316:
-#line 1227 "util/configparser.y" /* yacc.c:1646 */
+ case 332:
+#line 1287 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_harden_algo_downgrade:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3723,11 +3845,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3727 "util/configparser.c" /* yacc.c:1646 */
+#line 3849 "util/configparser.c" /* yacc.c:1646 */
break;
- case 317:
-#line 1237 "util/configparser.y" /* yacc.c:1646 */
+ case 333:
+#line 1297 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_use_caps_for_id:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3736,41 +3858,41 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3740 "util/configparser.c" /* yacc.c:1646 */
+#line 3862 "util/configparser.c" /* yacc.c:1646 */
break;
- case 318:
-#line 1247 "util/configparser.y" /* yacc.c:1646 */
+ case 334:
+#line 1307 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_caps_whitelist:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->caps_whitelist, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3750 "util/configparser.c" /* yacc.c:1646 */
+#line 3872 "util/configparser.c" /* yacc.c:1646 */
break;
- case 319:
-#line 1254 "util/configparser.y" /* yacc.c:1646 */
+ case 335:
+#line 1314 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_private_address:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->private_address, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3760 "util/configparser.c" /* yacc.c:1646 */
+#line 3882 "util/configparser.c" /* yacc.c:1646 */
break;
- case 320:
-#line 1261 "util/configparser.y" /* yacc.c:1646 */
+ case 336:
+#line 1321 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_private_domain:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->private_domain, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3770 "util/configparser.c" /* yacc.c:1646 */
+#line 3892 "util/configparser.c" /* yacc.c:1646 */
break;
- case 321:
-#line 1268 "util/configparser.y" /* yacc.c:1646 */
+ case 337:
+#line 1328 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_prefetch:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3778,11 +3900,11 @@ yyreduce:
else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3782 "util/configparser.c" /* yacc.c:1646 */
+#line 3904 "util/configparser.c" /* yacc.c:1646 */
break;
- case 322:
-#line 1277 "util/configparser.y" /* yacc.c:1646 */
+ case 338:
+#line 1337 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_prefetch_key:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3790,11 +3912,11 @@ yyreduce:
else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3794 "util/configparser.c" /* yacc.c:1646 */
+#line 3916 "util/configparser.c" /* yacc.c:1646 */
break;
- case 323:
-#line 1286 "util/configparser.y" /* yacc.c:1646 */
+ case 339:
+#line 1346 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_unwanted_reply_threshold:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3802,21 +3924,21 @@ yyreduce:
else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3806 "util/configparser.c" /* yacc.c:1646 */
+#line 3928 "util/configparser.c" /* yacc.c:1646 */
break;
- case 324:
-#line 1295 "util/configparser.y" /* yacc.c:1646 */
+ case 340:
+#line 1355 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_do_not_query_address:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->donotqueryaddrs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 3816 "util/configparser.c" /* yacc.c:1646 */
+#line 3938 "util/configparser.c" /* yacc.c:1646 */
break;
- case 325:
-#line 1302 "util/configparser.y" /* yacc.c:1646 */
+ case 341:
+#line 1362 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_do_not_query_localhost:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3825,11 +3947,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3829 "util/configparser.c" /* yacc.c:1646 */
+#line 3951 "util/configparser.c" /* yacc.c:1646 */
break;
- case 326:
-#line 1312 "util/configparser.y" /* yacc.c:1646 */
+ case 342:
+#line 1372 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "deny")!=0 && strcmp((yyvsp[0].str), "refuse")!=0 &&
@@ -3846,21 +3968,21 @@ yyreduce:
fatal_exit("out of memory adding acl");
}
}
-#line 3850 "util/configparser.c" /* yacc.c:1646 */
+#line 3972 "util/configparser.c" /* yacc.c:1646 */
break;
- case 327:
-#line 1330 "util/configparser.y" /* yacc.c:1646 */
+ case 343:
+#line 1390 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->module_conf);
cfg_parser->cfg->module_conf = (yyvsp[0].str);
}
-#line 3860 "util/configparser.c" /* yacc.c:1646 */
+#line 3982 "util/configparser.c" /* yacc.c:1646 */
break;
- case 328:
-#line 1337 "util/configparser.y" /* yacc.c:1646 */
+ case 344:
+#line 1397 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -3877,11 +3999,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3881 "util/configparser.c" /* yacc.c:1646 */
+#line 4003 "util/configparser.c" /* yacc.c:1646 */
break;
- case 329:
-#line 1355 "util/configparser.y" /* yacc.c:1646 */
+ case 345:
+#line 1415 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -3893,11 +4015,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3897 "util/configparser.c" /* yacc.c:1646 */
+#line 4019 "util/configparser.c" /* yacc.c:1646 */
break;
- case 330:
-#line 1368 "util/configparser.y" /* yacc.c:1646 */
+ case 346:
+#line 1428 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str)));
if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -3909,11 +4031,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3913 "util/configparser.c" /* yacc.c:1646 */
+#line 4035 "util/configparser.c" /* yacc.c:1646 */
break;
- case 331:
-#line 1381 "util/configparser.y" /* yacc.c:1646 */
+ case 347:
+#line 1441 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3921,11 +4043,11 @@ yyreduce:
else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3925 "util/configparser.c" /* yacc.c:1646 */
+#line 4047 "util/configparser.c" /* yacc.c:1646 */
break;
- case 332:
-#line 1390 "util/configparser.y" /* yacc.c:1646 */
+ case 348:
+#line 1450 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3933,11 +4055,11 @@ yyreduce:
else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3937 "util/configparser.c" /* yacc.c:1646 */
+#line 4059 "util/configparser.c" /* yacc.c:1646 */
break;
- case 333:
-#line 1399 "util/configparser.y" /* yacc.c:1646 */
+ case 349:
+#line 1459 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3945,11 +4067,11 @@ yyreduce:
else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3949 "util/configparser.c" /* yacc.c:1646 */
+#line 4071 "util/configparser.c" /* yacc.c:1646 */
break;
- case 334:
-#line 1408 "util/configparser.y" /* yacc.c:1646 */
+ case 350:
+#line 1468 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -3957,11 +4079,11 @@ yyreduce:
else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3961 "util/configparser.c" /* yacc.c:1646 */
+#line 4083 "util/configparser.c" /* yacc.c:1646 */
break;
- case 335:
-#line 1417 "util/configparser.y" /* yacc.c:1646 */
+ case 351:
+#line 1477 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3970,11 +4092,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3974 "util/configparser.c" /* yacc.c:1646 */
+#line 4096 "util/configparser.c" /* yacc.c:1646 */
break;
- case 336:
-#line 1427 "util/configparser.y" /* yacc.c:1646 */
+ case 352:
+#line 1487 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3983,11 +4105,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3987 "util/configparser.c" /* yacc.c:1646 */
+#line 4109 "util/configparser.c" /* yacc.c:1646 */
break;
- case 337:
-#line 1437 "util/configparser.y" /* yacc.c:1646 */
+ case 353:
+#line 1497 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -3997,11 +4119,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4001 "util/configparser.c" /* yacc.c:1646 */
+#line 4123 "util/configparser.c" /* yacc.c:1646 */
break;
- case 338:
-#line 1448 "util/configparser.y" /* yacc.c:1646 */
+ case 354:
+#line 1508 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4009,11 +4131,11 @@ yyreduce:
else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4013 "util/configparser.c" /* yacc.c:1646 */
+#line 4135 "util/configparser.c" /* yacc.c:1646 */
break;
- case 339:
-#line 1457 "util/configparser.y" /* yacc.c:1646 */
+ case 355:
+#line 1517 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4021,11 +4143,35 @@ yyreduce:
else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4025 "util/configparser.c" /* yacc.c:1646 */
+#line 4147 "util/configparser.c" /* yacc.c:1646 */
break;
- case 340:
-#line 1466 "util/configparser.y" /* yacc.c:1646 */
+ case 356:
+#line 1526 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 4159 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 357:
+#line 1535 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 4171 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 358:
+#line 1544 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4037,11 +4183,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 4041 "util/configparser.c" /* yacc.c:1646 */
+#line 4187 "util/configparser.c" /* yacc.c:1646 */
break;
- case 341:
-#line 1479 "util/configparser.y" /* yacc.c:1646 */
+ case 359:
+#line 1557 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4053,11 +4199,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 4057 "util/configparser.c" /* yacc.c:1646 */
+#line 4203 "util/configparser.c" /* yacc.c:1646 */
break;
- case 342:
-#line 1492 "util/configparser.y" /* yacc.c:1646 */
+ case 360:
+#line 1570 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4065,21 +4211,21 @@ yyreduce:
else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4069 "util/configparser.c" /* yacc.c:1646 */
+#line 4215 "util/configparser.c" /* yacc.c:1646 */
break;
- case 343:
-#line 1501 "util/configparser.y" /* yacc.c:1646 */
+ case 361:
+#line 1579 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->val_nsec3_key_iterations);
cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str);
}
-#line 4079 "util/configparser.c" /* yacc.c:1646 */
+#line 4225 "util/configparser.c" /* yacc.c:1646 */
break;
- case 344:
-#line 1508 "util/configparser.y" /* yacc.c:1646 */
+ case 362:
+#line 1586 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4087,11 +4233,11 @@ yyreduce:
else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4091 "util/configparser.c" /* yacc.c:1646 */
+#line 4237 "util/configparser.c" /* yacc.c:1646 */
break;
- case 345:
-#line 1517 "util/configparser.y" /* yacc.c:1646 */
+ case 363:
+#line 1595 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4099,11 +4245,11 @@ yyreduce:
else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4103 "util/configparser.c" /* yacc.c:1646 */
+#line 4249 "util/configparser.c" /* yacc.c:1646 */
break;
- case 346:
-#line 1526 "util/configparser.y" /* yacc.c:1646 */
+ case 364:
+#line 1604 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4111,11 +4257,11 @@ yyreduce:
else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4115 "util/configparser.c" /* yacc.c:1646 */
+#line 4261 "util/configparser.c" /* yacc.c:1646 */
break;
- case 347:
-#line 1535 "util/configparser.y" /* yacc.c:1646 */
+ case 365:
+#line 1613 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4124,22 +4270,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4128 "util/configparser.c" /* yacc.c:1646 */
+#line 4274 "util/configparser.c" /* yacc.c:1646 */
break;
- case 348:
-#line 1544 "util/configparser.y" /* yacc.c:1646 */
+ case 366:
+#line 1622 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 4139 "util/configparser.c" /* yacc.c:1646 */
+#line 4285 "util/configparser.c" /* yacc.c:1646 */
break;
- case 349:
-#line 1552 "util/configparser.y" /* yacc.c:1646 */
+ case 367:
+#line 1630 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4151,22 +4297,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4155 "util/configparser.c" /* yacc.c:1646 */
+#line 4301 "util/configparser.c" /* yacc.c:1646 */
break;
- case 350:
-#line 1565 "util/configparser.y" /* yacc.c:1646 */
+ case 368:
+#line 1643 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 4166 "util/configparser.c" /* yacc.c:1646 */
+#line 4312 "util/configparser.c" /* yacc.c:1646 */
break;
- case 351:
-#line 1573 "util/configparser.y" /* yacc.c:1646 */
+ case 369:
+#line 1651 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -4194,21 +4340,21 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 4198 "util/configparser.c" /* yacc.c:1646 */
+#line 4344 "util/configparser.c" /* yacc.c:1646 */
break;
- case 352:
-#line 1602 "util/configparser.y" /* yacc.c:1646 */
+ case 370:
+#line 1680 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str)))
fatal_exit("out of memory adding local-data");
}
-#line 4208 "util/configparser.c" /* yacc.c:1646 */
+#line 4354 "util/configparser.c" /* yacc.c:1646 */
break;
- case 353:
-#line 1609 "util/configparser.y" /* yacc.c:1646 */
+ case 371:
+#line 1687 "util/configparser.y" /* yacc.c:1646 */
{
char* ptr;
OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -4222,11 +4368,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 4226 "util/configparser.c" /* yacc.c:1646 */
+#line 4372 "util/configparser.c" /* yacc.c:1646 */
break;
- case 354:
-#line 1624 "util/configparser.y" /* yacc.c:1646 */
+ case 372:
+#line 1702 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4235,11 +4381,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4239 "util/configparser.c" /* yacc.c:1646 */
+#line 4385 "util/configparser.c" /* yacc.c:1646 */
break;
- case 355:
-#line 1634 "util/configparser.y" /* yacc.c:1646 */
+ case 373:
+#line 1712 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4248,31 +4394,31 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4252 "util/configparser.c" /* yacc.c:1646 */
+#line 4398 "util/configparser.c" /* yacc.c:1646 */
break;
- case 356:
-#line 1644 "util/configparser.y" /* yacc.c:1646 */
+ case 374:
+#line 1722 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4262 "util/configparser.c" /* yacc.c:1646 */
+#line 4408 "util/configparser.c" /* yacc.c:1646 */
break;
- case 357:
-#line 1651 "util/configparser.y" /* yacc.c:1646 */
+ case 375:
+#line 1729 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dns64_prefix);
cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
}
-#line 4272 "util/configparser.c" /* yacc.c:1646 */
+#line 4418 "util/configparser.c" /* yacc.c:1646 */
break;
- case 358:
-#line 1658 "util/configparser.y" /* yacc.c:1646 */
+ case 376:
+#line 1736 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4280,11 +4426,22 @@ yyreduce:
else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4284 "util/configparser.c" /* yacc.c:1646 */
+#line 4430 "util/configparser.c" /* yacc.c:1646 */
break;
- case 359:
-#line 1667 "util/configparser.y" /* yacc.c:1646 */
+ case 377:
+#line 1745 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str)));
+ if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
+ (yyvsp[0].str)))
+ fatal_exit("out of memory adding dns64-ignore-aaaa");
+ }
+#line 4441 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 378:
+#line 1753 "util/configparser.y" /* yacc.c:1646 */
{
char* p, *s = (yyvsp[0].str);
OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -4297,11 +4454,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4301 "util/configparser.c" /* yacc.c:1646 */
+#line 4458 "util/configparser.c" /* yacc.c:1646 */
break;
- case 360:
-#line 1681 "util/configparser.y" /* yacc.c:1646 */
+ case 379:
+#line 1767 "util/configparser.y" /* yacc.c:1646 */
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4319,11 +4476,11 @@ yyreduce:
}
}
}
-#line 4323 "util/configparser.c" /* yacc.c:1646 */
+#line 4480 "util/configparser.c" /* yacc.c:1646 */
break;
- case 361:
-#line 1700 "util/configparser.y" /* yacc.c:1646 */
+ case 380:
+#line 1786 "util/configparser.y" /* yacc.c:1646 */
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4341,11 +4498,11 @@ yyreduce:
}
}
}
-#line 4345 "util/configparser.c" /* yacc.c:1646 */
+#line 4502 "util/configparser.c" /* yacc.c:1646 */
break;
- case 362:
-#line 1719 "util/configparser.y" /* yacc.c:1646 */
+ case 381:
+#line 1805 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
@@ -4356,11 +4513,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4360 "util/configparser.c" /* yacc.c:1646 */
+#line 4517 "util/configparser.c" /* yacc.c:1646 */
break;
- case 363:
-#line 1731 "util/configparser.y" /* yacc.c:1646 */
+ case 382:
+#line 1817 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
@@ -4371,11 +4528,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4375 "util/configparser.c" /* yacc.c:1646 */
+#line 4532 "util/configparser.c" /* yacc.c:1646 */
break;
- case 364:
-#line 1743 "util/configparser.y" /* yacc.c:1646 */
+ case 383:
+#line 1829 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
@@ -4386,11 +4543,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4390 "util/configparser.c" /* yacc.c:1646 */
+#line 4547 "util/configparser.c" /* yacc.c:1646 */
break;
- case 365:
-#line 1755 "util/configparser.y" /* yacc.c:1646 */
+ case 384:
+#line 1841 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
@@ -4400,11 +4557,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4404 "util/configparser.c" /* yacc.c:1646 */
+#line 4561 "util/configparser.c" /* yacc.c:1646 */
break;
- case 366:
-#line 1766 "util/configparser.y" /* yacc.c:1646 */
+ case 385:
+#line 1852 "util/configparser.y" /* yacc.c:1646 */
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4422,11 +4579,11 @@ yyreduce:
}
}
}
-#line 4426 "util/configparser.c" /* yacc.c:1646 */
+#line 4583 "util/configparser.c" /* yacc.c:1646 */
break;
- case 367:
-#line 1785 "util/configparser.y" /* yacc.c:1646 */
+ case 386:
+#line 1871 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4434,11 +4591,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4438 "util/configparser.c" /* yacc.c:1646 */
+#line 4595 "util/configparser.c" /* yacc.c:1646 */
break;
- case 368:
-#line 1795 "util/configparser.y" /* yacc.c:1646 */
+ case 387:
+#line 1881 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4446,33 +4603,33 @@ yyreduce:
else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4450 "util/configparser.c" /* yacc.c:1646 */
+#line 4607 "util/configparser.c" /* yacc.c:1646 */
break;
- case 369:
-#line 1804 "util/configparser.y" /* yacc.c:1646 */
+ case 388:
+#line 1890 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 4461 "util/configparser.c" /* yacc.c:1646 */
+#line 4618 "util/configparser.c" /* yacc.c:1646 */
break;
- case 370:
-#line 1812 "util/configparser.y" /* yacc.c:1646 */
+ case 389:
+#line 1898 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 4472 "util/configparser.c" /* yacc.c:1646 */
+#line 4629 "util/configparser.c" /* yacc.c:1646 */
break;
- case 371:
-#line 1820 "util/configparser.y" /* yacc.c:1646 */
+ case 390:
+#line 1906 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4484,11 +4641,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4488 "util/configparser.c" /* yacc.c:1646 */
+#line 4645 "util/configparser.c" /* yacc.c:1646 */
break;
- case 372:
-#line 1833 "util/configparser.y" /* yacc.c:1646 */
+ case 391:
+#line 1919 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4500,11 +4657,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4504 "util/configparser.c" /* yacc.c:1646 */
+#line 4661 "util/configparser.c" /* yacc.c:1646 */
break;
- case 373:
-#line 1846 "util/configparser.y" /* yacc.c:1646 */
+ case 392:
+#line 1932 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -4516,11 +4673,11 @@ yyreduce:
"ratelimit-for-domain");
}
}
-#line 4520 "util/configparser.c" /* yacc.c:1646 */
+#line 4677 "util/configparser.c" /* yacc.c:1646 */
break;
- case 374:
-#line 1859 "util/configparser.y" /* yacc.c:1646 */
+ case 393:
+#line 1945 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
@@ -4532,11 +4689,11 @@ yyreduce:
"ratelimit-below-domain");
}
}
-#line 4536 "util/configparser.c" /* yacc.c:1646 */
+#line 4693 "util/configparser.c" /* yacc.c:1646 */
break;
- case 375:
-#line 1872 "util/configparser.y" /* yacc.c:1646 */
+ case 394:
+#line 1958 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4544,11 +4701,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4548 "util/configparser.c" /* yacc.c:1646 */
+#line 4705 "util/configparser.c" /* yacc.c:1646 */
break;
- case 376:
-#line 1881 "util/configparser.y" /* yacc.c:1646 */
+ case 395:
+#line 1967 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4556,11 +4713,11 @@ yyreduce:
else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4560 "util/configparser.c" /* yacc.c:1646 */
+#line 4717 "util/configparser.c" /* yacc.c:1646 */
break;
- case 377:
-#line 1890 "util/configparser.y" /* yacc.c:1646 */
+ case 396:
+#line 1976 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_low_rtt:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4568,11 +4725,11 @@ yyreduce:
else cfg_parser->cfg->low_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4572 "util/configparser.c" /* yacc.c:1646 */
+#line 4729 "util/configparser.c" /* yacc.c:1646 */
break;
- case 378:
-#line 1899 "util/configparser.y" /* yacc.c:1646 */
+ case 397:
+#line 1985 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_low_rtt_permil:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4580,11 +4737,11 @@ yyreduce:
else cfg_parser->cfg->low_rtt_permil = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4584 "util/configparser.c" /* yacc.c:1646 */
+#line 4741 "util/configparser.c" /* yacc.c:1646 */
break;
- case 379:
-#line 1908 "util/configparser.y" /* yacc.c:1646 */
+ case 398:
+#line 1994 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4593,11 +4750,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4597 "util/configparser.c" /* yacc.c:1646 */
+#line 4754 "util/configparser.c" /* yacc.c:1646 */
break;
- case 380:
-#line 1918 "util/configparser.y" /* yacc.c:1646 */
+ case 399:
+#line 2004 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4606,11 +4763,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4610 "util/configparser.c" /* yacc.c:1646 */
+#line 4767 "util/configparser.c" /* yacc.c:1646 */
break;
- case 381:
-#line 1928 "util/configparser.y" /* yacc.c:1646 */
+ case 400:
+#line 2014 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
@@ -4622,11 +4779,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4626 "util/configparser.c" /* yacc.c:1646 */
+#line 4783 "util/configparser.c" /* yacc.c:1646 */
break;
- case 382:
-#line 1941 "util/configparser.y" /* yacc.c:1646 */
+ case 401:
+#line 2027 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
@@ -4638,11 +4795,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4642 "util/configparser.c" /* yacc.c:1646 */
+#line 4799 "util/configparser.c" /* yacc.c:1646 */
break;
- case 383:
-#line 1954 "util/configparser.y" /* yacc.c:1646 */
+ case 402:
+#line 2040 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -4652,11 +4809,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4656 "util/configparser.c" /* yacc.c:1646 */
+#line 4813 "util/configparser.c" /* yacc.c:1646 */
break;
- case 384:
-#line 1965 "util/configparser.y" /* yacc.c:1646 */
+ case 403:
+#line 2051 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -4668,11 +4825,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4672 "util/configparser.c" /* yacc.c:1646 */
+#line 4829 "util/configparser.c" /* yacc.c:1646 */
break;
- case 385:
-#line 1978 "util/configparser.y" /* yacc.c:1646 */
+ case 404:
+#line 2064 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -4682,11 +4839,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4686 "util/configparser.c" /* yacc.c:1646 */
+#line 4843 "util/configparser.c" /* yacc.c:1646 */
break;
- case 386:
-#line 1989 "util/configparser.y" /* yacc.c:1646 */
+ case 405:
+#line 2075 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -4698,11 +4855,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4702 "util/configparser.c" /* yacc.c:1646 */
+#line 4859 "util/configparser.c" /* yacc.c:1646 */
break;
- case 387:
-#line 2002 "util/configparser.y" /* yacc.c:1646 */
+ case 406:
+#line 2088 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->stubs->name)
@@ -4711,31 +4868,31 @@ yyreduce:
free(cfg_parser->cfg->stubs->name);
cfg_parser->cfg->stubs->name = (yyvsp[0].str);
}
-#line 4715 "util/configparser.c" /* yacc.c:1646 */
+#line 4872 "util/configparser.c" /* yacc.c:1646 */
break;
- case 388:
-#line 2012 "util/configparser.y" /* yacc.c:1646 */
+ case 407:
+#line 2098 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4725 "util/configparser.c" /* yacc.c:1646 */
+#line 4882 "util/configparser.c" /* yacc.c:1646 */
break;
- case 389:
-#line 2019 "util/configparser.y" /* yacc.c:1646 */
+ case 408:
+#line 2105 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4735 "util/configparser.c" /* yacc.c:1646 */
+#line 4892 "util/configparser.c" /* yacc.c:1646 */
break;
- case 390:
-#line 2026 "util/configparser.y" /* yacc.c:1646 */
+ case 409:
+#line 2112 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4743,11 +4900,23 @@ yyreduce:
else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4747 "util/configparser.c" /* yacc.c:1646 */
+#line 4904 "util/configparser.c" /* yacc.c:1646 */
break;
- case 391:
-#line 2035 "util/configparser.y" /* yacc.c:1646 */
+ case 410:
+#line 2121 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 4916 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 411:
+#line 2130 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4756,11 +4925,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4760 "util/configparser.c" /* yacc.c:1646 */
+#line 4929 "util/configparser.c" /* yacc.c:1646 */
break;
- case 392:
-#line 2045 "util/configparser.y" /* yacc.c:1646 */
+ case 412:
+#line 2140 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4769,11 +4938,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4773 "util/configparser.c" /* yacc.c:1646 */
+#line 4942 "util/configparser.c" /* yacc.c:1646 */
break;
- case 393:
-#line 2055 "util/configparser.y" /* yacc.c:1646 */
+ case 413:
+#line 2150 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->forwards->name)
@@ -4782,31 +4951,31 @@ yyreduce:
free(cfg_parser->cfg->forwards->name);
cfg_parser->cfg->forwards->name = (yyvsp[0].str);
}
-#line 4786 "util/configparser.c" /* yacc.c:1646 */
+#line 4955 "util/configparser.c" /* yacc.c:1646 */
break;
- case 394:
-#line 2065 "util/configparser.y" /* yacc.c:1646 */
+ case 414:
+#line 2160 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4796 "util/configparser.c" /* yacc.c:1646 */
+#line 4965 "util/configparser.c" /* yacc.c:1646 */
break;
- case 395:
-#line 2072 "util/configparser.y" /* yacc.c:1646 */
+ case 415:
+#line 2167 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4806 "util/configparser.c" /* yacc.c:1646 */
+#line 4975 "util/configparser.c" /* yacc.c:1646 */
break;
- case 396:
-#line 2079 "util/configparser.y" /* yacc.c:1646 */
+ case 416:
+#line 2174 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4814,11 +4983,23 @@ yyreduce:
else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4818 "util/configparser.c" /* yacc.c:1646 */
+#line 4987 "util/configparser.c" /* yacc.c:1646 */
break;
- case 397:
-#line 2088 "util/configparser.y" /* yacc.c:1646 */
+ case 417:
+#line 2183 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str)));
+ if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 4999 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 418:
+#line 2192 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4827,11 +5008,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4831 "util/configparser.c" /* yacc.c:1646 */
+#line 5012 "util/configparser.c" /* yacc.c:1646 */
break;
- case 398:
-#line 2098 "util/configparser.y" /* yacc.c:1646 */
+ case 419:
+#line 2202 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->auths->name)
@@ -4840,52 +5021,52 @@ yyreduce:
free(cfg_parser->cfg->auths->name);
cfg_parser->cfg->auths->name = (yyvsp[0].str);
}
-#line 4844 "util/configparser.c" /* yacc.c:1646 */
+#line 5025 "util/configparser.c" /* yacc.c:1646 */
break;
- case 399:
-#line 2108 "util/configparser.y" /* yacc.c:1646 */
+ case 420:
+#line 2212 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->auths->zonefile);
cfg_parser->cfg->auths->zonefile = (yyvsp[0].str);
}
-#line 4854 "util/configparser.c" /* yacc.c:1646 */
+#line 5035 "util/configparser.c" /* yacc.c:1646 */
break;
- case 400:
-#line 2115 "util/configparser.y" /* yacc.c:1646 */
+ case 421:
+#line 2219 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(master:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4864 "util/configparser.c" /* yacc.c:1646 */
+#line 5045 "util/configparser.c" /* yacc.c:1646 */
break;
- case 401:
-#line 2122 "util/configparser.y" /* yacc.c:1646 */
+ case 422:
+#line 2226 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(url:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4874 "util/configparser.c" /* yacc.c:1646 */
+#line 5055 "util/configparser.c" /* yacc.c:1646 */
break;
- case 402:
-#line 2129 "util/configparser.y" /* yacc.c:1646 */
+ case 423:
+#line 2233 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
(yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4885 "util/configparser.c" /* yacc.c:1646 */
+#line 5066 "util/configparser.c" /* yacc.c:1646 */
break;
- case 403:
-#line 2137 "util/configparser.y" /* yacc.c:1646 */
+ case 424:
+#line 2241 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4894,11 +5075,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4898 "util/configparser.c" /* yacc.c:1646 */
+#line 5079 "util/configparser.c" /* yacc.c:1646 */
break;
- case 404:
-#line 2147 "util/configparser.y" /* yacc.c:1646 */
+ case 425:
+#line 2251 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4907,11 +5088,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4911 "util/configparser.c" /* yacc.c:1646 */
+#line 5092 "util/configparser.c" /* yacc.c:1646 */
break;
- case 405:
-#line 2157 "util/configparser.y" /* yacc.c:1646 */
+ case 426:
+#line 2261 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4920,11 +5101,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4924 "util/configparser.c" /* yacc.c:1646 */
+#line 5105 "util/configparser.c" /* yacc.c:1646 */
break;
- case 406:
-#line 2167 "util/configparser.y" /* yacc.c:1646 */
+ case 427:
+#line 2271 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->views->name)
@@ -4933,11 +5114,11 @@ yyreduce:
free(cfg_parser->cfg->views->name);
cfg_parser->cfg->views->name = (yyvsp[0].str);
}
-#line 4937 "util/configparser.c" /* yacc.c:1646 */
+#line 5118 "util/configparser.c" /* yacc.c:1646 */
break;
- case 407:
-#line 2177 "util/configparser.y" /* yacc.c:1646 */
+ case 428:
+#line 2281 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -4966,11 +5147,11 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 4970 "util/configparser.c" /* yacc.c:1646 */
+#line 5151 "util/configparser.c" /* yacc.c:1646 */
break;
- case 408:
-#line 2207 "util/configparser.y" /* yacc.c:1646 */
+ case 429:
+#line 2311 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_respip_action((yyvsp[0].str));
@@ -4979,22 +5160,22 @@ yyreduce:
fatal_exit("out of memory adding per-view "
"response-ip action");
}
-#line 4983 "util/configparser.c" /* yacc.c:1646 */
+#line 5164 "util/configparser.c" /* yacc.c:1646 */
break;
- case 409:
-#line 2217 "util/configparser.y" /* yacc.c:1646 */
+ case 430:
+#line 2321 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str)));
if(!cfg_str2list_insert(
&cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip-data");
}
-#line 4994 "util/configparser.c" /* yacc.c:1646 */
+#line 5175 "util/configparser.c" /* yacc.c:1646 */
break;
- case 410:
-#line 2225 "util/configparser.y" /* yacc.c:1646 */
+ case 431:
+#line 2329 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) {
@@ -5002,11 +5183,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 5006 "util/configparser.c" /* yacc.c:1646 */
+#line 5187 "util/configparser.c" /* yacc.c:1646 */
break;
- case 411:
-#line 2234 "util/configparser.y" /* yacc.c:1646 */
+ case 432:
+#line 2338 "util/configparser.y" /* yacc.c:1646 */
{
char* ptr;
OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5020,11 +5201,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 5024 "util/configparser.c" /* yacc.c:1646 */
+#line 5205 "util/configparser.c" /* yacc.c:1646 */
break;
- case 412:
-#line 2249 "util/configparser.y" /* yacc.c:1646 */
+ case 433:
+#line 2353 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5032,19 +5213,19 @@ yyreduce:
else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5036 "util/configparser.c" /* yacc.c:1646 */
+#line 5217 "util/configparser.c" /* yacc.c:1646 */
break;
- case 413:
-#line 2258 "util/configparser.y" /* yacc.c:1646 */
+ case 434:
+#line 2362 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(remote-control:)\n"));
}
-#line 5044 "util/configparser.c" /* yacc.c:1646 */
+#line 5225 "util/configparser.c" /* yacc.c:1646 */
break;
- case 424:
-#line 2269 "util/configparser.y" /* yacc.c:1646 */
+ case 445:
+#line 2373 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5053,11 +5234,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5057 "util/configparser.c" /* yacc.c:1646 */
+#line 5238 "util/configparser.c" /* yacc.c:1646 */
break;
- case 425:
-#line 2279 "util/configparser.y" /* yacc.c:1646 */
+ case 446:
+#line 2383 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -5065,142 +5246,142 @@ yyreduce:
else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5069 "util/configparser.c" /* yacc.c:1646 */
+#line 5250 "util/configparser.c" /* yacc.c:1646 */
break;
- case 426:
-#line 2288 "util/configparser.y" /* yacc.c:1646 */
+ case 447:
+#line 2392 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 5079 "util/configparser.c" /* yacc.c:1646 */
+#line 5260 "util/configparser.c" /* yacc.c:1646 */
break;
- case 427:
-#line 2295 "util/configparser.y" /* yacc.c:1646 */
+ case 448:
+#line 2399 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5089 "util/configparser.c" /* yacc.c:1646 */
+#line 5270 "util/configparser.c" /* yacc.c:1646 */
break;
- case 428:
-#line 2302 "util/configparser.y" /* yacc.c:1646 */
+ case 449:
+#line 2406 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->server_key_file);
cfg_parser->cfg->server_key_file = (yyvsp[0].str);
}
-#line 5099 "util/configparser.c" /* yacc.c:1646 */
+#line 5280 "util/configparser.c" /* yacc.c:1646 */
break;
- case 429:
-#line 2309 "util/configparser.y" /* yacc.c:1646 */
+ case 450:
+#line 2413 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->server_cert_file);
cfg_parser->cfg->server_cert_file = (yyvsp[0].str);
}
-#line 5109 "util/configparser.c" /* yacc.c:1646 */
+#line 5290 "util/configparser.c" /* yacc.c:1646 */
break;
- case 430:
-#line 2316 "util/configparser.y" /* yacc.c:1646 */
+ case 451:
+#line 2420 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->control_key_file);
cfg_parser->cfg->control_key_file = (yyvsp[0].str);
}
-#line 5119 "util/configparser.c" /* yacc.c:1646 */
+#line 5300 "util/configparser.c" /* yacc.c:1646 */
break;
- case 431:
-#line 2323 "util/configparser.y" /* yacc.c:1646 */
+ case 452:
+#line 2427 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->control_cert_file);
cfg_parser->cfg->control_cert_file = (yyvsp[0].str);
}
-#line 5129 "util/configparser.c" /* yacc.c:1646 */
+#line 5310 "util/configparser.c" /* yacc.c:1646 */
break;
- case 432:
-#line 2330 "util/configparser.y" /* yacc.c:1646 */
+ case 453:
+#line 2434 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(dnstap:)\n"));
}
-#line 5137 "util/configparser.c" /* yacc.c:1646 */
+#line 5318 "util/configparser.c" /* yacc.c:1646 */
break;
- case 447:
-#line 2347 "util/configparser.y" /* yacc.c:1646 */
+ case 468:
+#line 2451 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
yyerror("expected yes or no.");
else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5148 "util/configparser.c" /* yacc.c:1646 */
+#line 5329 "util/configparser.c" /* yacc.c:1646 */
break;
- case 448:
-#line 2355 "util/configparser.y" /* yacc.c:1646 */
+ case 469:
+#line 2459 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_socket_path);
cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str);
}
-#line 5158 "util/configparser.c" /* yacc.c:1646 */
+#line 5339 "util/configparser.c" /* yacc.c:1646 */
break;
- case 449:
-#line 2362 "util/configparser.y" /* yacc.c:1646 */
+ case 470:
+#line 2466 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
yyerror("expected yes or no.");
else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5169 "util/configparser.c" /* yacc.c:1646 */
+#line 5350 "util/configparser.c" /* yacc.c:1646 */
break;
- case 450:
-#line 2370 "util/configparser.y" /* yacc.c:1646 */
+ case 471:
+#line 2474 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
yyerror("expected yes or no.");
else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5180 "util/configparser.c" /* yacc.c:1646 */
+#line 5361 "util/configparser.c" /* yacc.c:1646 */
break;
- case 451:
-#line 2378 "util/configparser.y" /* yacc.c:1646 */
+ case 472:
+#line 2482 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_identity);
cfg_parser->cfg->dnstap_identity = (yyvsp[0].str);
}
-#line 5190 "util/configparser.c" /* yacc.c:1646 */
+#line 5371 "util/configparser.c" /* yacc.c:1646 */
break;
- case 452:
-#line 2385 "util/configparser.y" /* yacc.c:1646 */
+ case 473:
+#line 2489 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnstap_version);
cfg_parser->cfg->dnstap_version = (yyvsp[0].str);
}
-#line 5200 "util/configparser.c" /* yacc.c:1646 */
+#line 5381 "util/configparser.c" /* yacc.c:1646 */
break;
- case 453:
-#line 2392 "util/configparser.y" /* yacc.c:1646 */
+ case 474:
+#line 2496 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5208,11 +5389,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_resolver_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5212 "util/configparser.c" /* yacc.c:1646 */
+#line 5393 "util/configparser.c" /* yacc.c:1646 */
break;
- case 454:
-#line 2401 "util/configparser.y" /* yacc.c:1646 */
+ case 475:
+#line 2505 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5220,11 +5401,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_resolver_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5224 "util/configparser.c" /* yacc.c:1646 */
+#line 5405 "util/configparser.c" /* yacc.c:1646 */
break;
- case 455:
-#line 2410 "util/configparser.y" /* yacc.c:1646 */
+ case 476:
+#line 2514 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5232,11 +5413,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_client_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5236 "util/configparser.c" /* yacc.c:1646 */
+#line 5417 "util/configparser.c" /* yacc.c:1646 */
break;
- case 456:
-#line 2419 "util/configparser.y" /* yacc.c:1646 */
+ case 477:
+#line 2523 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5244,11 +5425,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_client_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5248 "util/configparser.c" /* yacc.c:1646 */
+#line 5429 "util/configparser.c" /* yacc.c:1646 */
break;
- case 457:
-#line 2428 "util/configparser.y" /* yacc.c:1646 */
+ case 478:
+#line 2532 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5256,11 +5437,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5260 "util/configparser.c" /* yacc.c:1646 */
+#line 5441 "util/configparser.c" /* yacc.c:1646 */
break;
- case 458:
-#line 2437 "util/configparser.y" /* yacc.c:1646 */
+ case 479:
+#line 2541 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5268,29 +5449,29 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5272 "util/configparser.c" /* yacc.c:1646 */
+#line 5453 "util/configparser.c" /* yacc.c:1646 */
break;
- case 459:
-#line 2446 "util/configparser.y" /* yacc.c:1646 */
+ case 480:
+#line 2550 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(python:)\n"));
}
-#line 5280 "util/configparser.c" /* yacc.c:1646 */
+#line 5461 "util/configparser.c" /* yacc.c:1646 */
break;
- case 463:
-#line 2455 "util/configparser.y" /* yacc.c:1646 */
+ case 484:
+#line 2559 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->python_script);
cfg_parser->cfg->python_script = (yyvsp[0].str);
}
-#line 5290 "util/configparser.c" /* yacc.c:1646 */
+#line 5471 "util/configparser.c" /* yacc.c:1646 */
break;
- case 464:
-#line 2461 "util/configparser.y" /* yacc.c:1646 */
+ case 485:
+#line 2565 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5299,21 +5480,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5303 "util/configparser.c" /* yacc.c:1646 */
+#line 5484 "util/configparser.c" /* yacc.c:1646 */
break;
- case 465:
-#line 2471 "util/configparser.y" /* yacc.c:1646 */
+ case 486:
+#line 2575 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->log_identity);
cfg_parser->cfg->log_identity = (yyvsp[0].str);
}
-#line 5313 "util/configparser.c" /* yacc.c:1646 */
+#line 5494 "util/configparser.c" /* yacc.c:1646 */
break;
- case 466:
-#line 2478 "util/configparser.y" /* yacc.c:1646 */
+ case 487:
+#line 2582 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
validate_respip_action((yyvsp[0].str));
@@ -5321,31 +5502,31 @@ yyreduce:
(yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip");
}
-#line 5325 "util/configparser.c" /* yacc.c:1646 */
+#line 5506 "util/configparser.c" /* yacc.c:1646 */
break;
- case 467:
-#line 2487 "util/configparser.y" /* yacc.c:1646 */
+ case 488:
+#line 2591 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str)));
if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
(yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip-data");
}
-#line 5336 "util/configparser.c" /* yacc.c:1646 */
+#line 5517 "util/configparser.c" /* yacc.c:1646 */
break;
- case 468:
-#line 2495 "util/configparser.y" /* yacc.c:1646 */
+ case 489:
+#line 2599 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(dnscrypt:)\n"));
OUTYY(("\nP(dnscrypt:)\n"));
}
-#line 5345 "util/configparser.c" /* yacc.c:1646 */
+#line 5526 "util/configparser.c" /* yacc.c:1646 */
break;
- case 481:
-#line 2512 "util/configparser.y" /* yacc.c:1646 */
+ case 502:
+#line 2616 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5353,11 +5534,11 @@ yyreduce:
else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5357 "util/configparser.c" /* yacc.c:1646 */
+#line 5538 "util/configparser.c" /* yacc.c:1646 */
break;
- case 482:
-#line 2522 "util/configparser.y" /* yacc.c:1646 */
+ case 503:
+#line 2626 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
@@ -5366,21 +5547,21 @@ yyreduce:
else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5370 "util/configparser.c" /* yacc.c:1646 */
+#line 5551 "util/configparser.c" /* yacc.c:1646 */
break;
- case 483:
-#line 2532 "util/configparser.y" /* yacc.c:1646 */
+ case 504:
+#line 2636 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->dnscrypt_provider);
cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str);
}
-#line 5380 "util/configparser.c" /* yacc.c:1646 */
+#line 5561 "util/configparser.c" /* yacc.c:1646 */
break;
- case 484:
-#line 2539 "util/configparser.y" /* yacc.c:1646 */
+ case 505:
+#line 2643 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str)));
if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
@@ -5388,21 +5569,21 @@ yyreduce:
if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
fatal_exit("out of memory adding dnscrypt-provider-cert");
}
-#line 5392 "util/configparser.c" /* yacc.c:1646 */
+#line 5573 "util/configparser.c" /* yacc.c:1646 */
break;
- case 485:
-#line 2548 "util/configparser.y" /* yacc.c:1646 */
+ case 506:
+#line 2652 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str)))
fatal_exit("out of memory adding dnscrypt-provider-cert-rotated");
}
-#line 5402 "util/configparser.c" /* yacc.c:1646 */
+#line 5583 "util/configparser.c" /* yacc.c:1646 */
break;
- case 486:
-#line 2555 "util/configparser.y" /* yacc.c:1646 */
+ case 507:
+#line 2659 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str)));
if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
@@ -5410,22 +5591,22 @@ yyreduce:
if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
fatal_exit("out of memory adding dnscrypt-secret-key");
}
-#line 5414 "util/configparser.c" /* yacc.c:1646 */
+#line 5595 "util/configparser.c" /* yacc.c:1646 */
break;
- case 487:
-#line 2564 "util/configparser.y" /* yacc.c:1646 */
+ case 508:
+#line 2668 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 5425 "util/configparser.c" /* yacc.c:1646 */
+#line 5606 "util/configparser.c" /* yacc.c:1646 */
break;
- case 488:
-#line 2572 "util/configparser.y" /* yacc.c:1646 */
+ case 509:
+#line 2676 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -5437,22 +5618,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5441 "util/configparser.c" /* yacc.c:1646 */
+#line 5622 "util/configparser.c" /* yacc.c:1646 */
break;
- case 489:
-#line 2585 "util/configparser.y" /* yacc.c:1646 */
+ case 510:
+#line 2689 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str)));
if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size))
yyerror("memory size expected");
free((yyvsp[0].str));
}
-#line 5452 "util/configparser.c" /* yacc.c:1646 */
+#line 5633 "util/configparser.c" /* yacc.c:1646 */
break;
- case 490:
-#line 2593 "util/configparser.y" /* yacc.c:1646 */
+ case 511:
+#line 2697 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -5464,19 +5645,19 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5468 "util/configparser.c" /* yacc.c:1646 */
+#line 5649 "util/configparser.c" /* yacc.c:1646 */
break;
- case 491:
-#line 2606 "util/configparser.y" /* yacc.c:1646 */
+ case 512:
+#line 2710 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(cachedb:)\n"));
}
-#line 5476 "util/configparser.c" /* yacc.c:1646 */
+#line 5657 "util/configparser.c" /* yacc.c:1646 */
break;
- case 499:
-#line 2616 "util/configparser.y" /* yacc.c:1646 */
+ case 520:
+#line 2720 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_CACHEDB
OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
@@ -5489,11 +5670,11 @@ yyreduce:
OUTYY(("P(Compiled without cachedb, ignoring)\n"));
#endif
}
-#line 5493 "util/configparser.c" /* yacc.c:1646 */
+#line 5674 "util/configparser.c" /* yacc.c:1646 */
break;
- case 500:
-#line 2630 "util/configparser.y" /* yacc.c:1646 */
+ case 521:
+#line 2734 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_CACHEDB
OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
@@ -5507,11 +5688,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 5511 "util/configparser.c" /* yacc.c:1646 */
+#line 5692 "util/configparser.c" /* yacc.c:1646 */
break;
- case 501:
-#line 2645 "util/configparser.y" /* yacc.c:1646 */
+ case 522:
+#line 2749 "util/configparser.y" /* yacc.c:1646 */
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
@@ -5522,11 +5703,11 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 5526 "util/configparser.c" /* yacc.c:1646 */
+#line 5707 "util/configparser.c" /* yacc.c:1646 */
break;
- case 502:
-#line 2657 "util/configparser.y" /* yacc.c:1646 */
+ case 523:
+#line 2761 "util/configparser.y" /* yacc.c:1646 */
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
int port;
@@ -5540,11 +5721,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5544 "util/configparser.c" /* yacc.c:1646 */
+#line 5725 "util/configparser.c" /* yacc.c:1646 */
break;
- case 503:
-#line 2672 "util/configparser.y" /* yacc.c:1646 */
+ case 524:
+#line 2776 "util/configparser.y" /* yacc.c:1646 */
{
#if defined(USE_CACHEDB) && defined(USE_REDIS)
OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
@@ -5556,11 +5737,25 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 5560 "util/configparser.c" /* yacc.c:1646 */
+#line 5741 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 525:
+#line 2789 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
+ if (atoi((yyvsp[0].str)) < 0)
+ yyerror("positive number expected");
+ else {
+ if(!cfg_str2list_insert(&cfg_parser->cfg->tcp_connection_limits, (yyvsp[-1].str), (yyvsp[0].str)))
+ fatal_exit("out of memory adding tcp connection limit");
+ }
+ }
+#line 5755 "util/configparser.c" /* yacc.c:1646 */
break;
-#line 5564 "util/configparser.c" /* yacc.c:1646 */
+#line 5759 "util/configparser.c" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -5788,7 +5983,7 @@ yyreturn:
#endif
return yyresult;
}
-#line 2684 "util/configparser.y" /* yacc.c:1906 */
+#line 2799 "util/configparser.y" /* yacc.c:1906 */
/* parse helper routines could be here */
diff --git a/util/configparser.h b/util/configparser.h
index f635b8aa5eac..59f9d9b2b275 100644
--- a/util/configparser.h
+++ b/util/configparser.h
@@ -66,225 +66,236 @@ extern int yydebug;
VAR_DO_TCP = 276,
VAR_TCP_MSS = 277,
VAR_OUTGOING_TCP_MSS = 278,
- VAR_CHROOT = 279,
- VAR_USERNAME = 280,
- VAR_DIRECTORY = 281,
- VAR_LOGFILE = 282,
- VAR_PIDFILE = 283,
- VAR_MSG_CACHE_SIZE = 284,
- VAR_MSG_CACHE_SLABS = 285,
- VAR_NUM_QUERIES_PER_THREAD = 286,
- VAR_RRSET_CACHE_SIZE = 287,
- VAR_RRSET_CACHE_SLABS = 288,
- VAR_OUTGOING_NUM_TCP = 289,
- VAR_INFRA_HOST_TTL = 290,
- VAR_INFRA_LAME_TTL = 291,
- VAR_INFRA_CACHE_SLABS = 292,
- VAR_INFRA_CACHE_NUMHOSTS = 293,
- VAR_INFRA_CACHE_LAME_SIZE = 294,
- VAR_NAME = 295,
- VAR_STUB_ZONE = 296,
- VAR_STUB_HOST = 297,
- VAR_STUB_ADDR = 298,
- VAR_TARGET_FETCH_POLICY = 299,
- VAR_HARDEN_SHORT_BUFSIZE = 300,
- VAR_HARDEN_LARGE_QUERIES = 301,
- VAR_FORWARD_ZONE = 302,
- VAR_FORWARD_HOST = 303,
- VAR_FORWARD_ADDR = 304,
- VAR_DO_NOT_QUERY_ADDRESS = 305,
- VAR_HIDE_IDENTITY = 306,
- VAR_HIDE_VERSION = 307,
- VAR_IDENTITY = 308,
- VAR_VERSION = 309,
- VAR_HARDEN_GLUE = 310,
- VAR_MODULE_CONF = 311,
- VAR_TRUST_ANCHOR_FILE = 312,
- VAR_TRUST_ANCHOR = 313,
- VAR_VAL_OVERRIDE_DATE = 314,
- VAR_BOGUS_TTL = 315,
- VAR_VAL_CLEAN_ADDITIONAL = 316,
- VAR_VAL_PERMISSIVE_MODE = 317,
- VAR_INCOMING_NUM_TCP = 318,
- VAR_MSG_BUFFER_SIZE = 319,
- VAR_KEY_CACHE_SIZE = 320,
- VAR_KEY_CACHE_SLABS = 321,
- VAR_TRUSTED_KEYS_FILE = 322,
- VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 323,
- VAR_USE_SYSLOG = 324,
- VAR_OUTGOING_INTERFACE = 325,
- VAR_ROOT_HINTS = 326,
- VAR_DO_NOT_QUERY_LOCALHOST = 327,
- VAR_CACHE_MAX_TTL = 328,
- VAR_HARDEN_DNSSEC_STRIPPED = 329,
- VAR_ACCESS_CONTROL = 330,
- VAR_LOCAL_ZONE = 331,
- VAR_LOCAL_DATA = 332,
- VAR_INTERFACE_AUTOMATIC = 333,
- VAR_STATISTICS_INTERVAL = 334,
- VAR_DO_DAEMONIZE = 335,
- VAR_USE_CAPS_FOR_ID = 336,
- VAR_STATISTICS_CUMULATIVE = 337,
- VAR_OUTGOING_PORT_PERMIT = 338,
- VAR_OUTGOING_PORT_AVOID = 339,
- VAR_DLV_ANCHOR_FILE = 340,
- VAR_DLV_ANCHOR = 341,
- VAR_NEG_CACHE_SIZE = 342,
- VAR_HARDEN_REFERRAL_PATH = 343,
- VAR_PRIVATE_ADDRESS = 344,
- VAR_PRIVATE_DOMAIN = 345,
- VAR_REMOTE_CONTROL = 346,
- VAR_CONTROL_ENABLE = 347,
- VAR_CONTROL_INTERFACE = 348,
- VAR_CONTROL_PORT = 349,
- VAR_SERVER_KEY_FILE = 350,
- VAR_SERVER_CERT_FILE = 351,
- VAR_CONTROL_KEY_FILE = 352,
- VAR_CONTROL_CERT_FILE = 353,
- VAR_CONTROL_USE_CERT = 354,
- VAR_EXTENDED_STATISTICS = 355,
- VAR_LOCAL_DATA_PTR = 356,
- VAR_JOSTLE_TIMEOUT = 357,
- VAR_STUB_PRIME = 358,
- VAR_UNWANTED_REPLY_THRESHOLD = 359,
- VAR_LOG_TIME_ASCII = 360,
- VAR_DOMAIN_INSECURE = 361,
- VAR_PYTHON = 362,
- VAR_PYTHON_SCRIPT = 363,
- VAR_VAL_SIG_SKEW_MIN = 364,
- VAR_VAL_SIG_SKEW_MAX = 365,
- VAR_CACHE_MIN_TTL = 366,
- VAR_VAL_LOG_LEVEL = 367,
- VAR_AUTO_TRUST_ANCHOR_FILE = 368,
- VAR_KEEP_MISSING = 369,
- VAR_ADD_HOLDDOWN = 370,
- VAR_DEL_HOLDDOWN = 371,
- VAR_SO_RCVBUF = 372,
- VAR_EDNS_BUFFER_SIZE = 373,
- VAR_PREFETCH = 374,
- VAR_PREFETCH_KEY = 375,
- VAR_SO_SNDBUF = 376,
- VAR_SO_REUSEPORT = 377,
- VAR_HARDEN_BELOW_NXDOMAIN = 378,
- VAR_IGNORE_CD_FLAG = 379,
- VAR_LOG_QUERIES = 380,
- VAR_LOG_REPLIES = 381,
- VAR_TCP_UPSTREAM = 382,
- VAR_SSL_UPSTREAM = 383,
- VAR_SSL_SERVICE_KEY = 384,
- VAR_SSL_SERVICE_PEM = 385,
- VAR_SSL_PORT = 386,
- VAR_FORWARD_FIRST = 387,
- VAR_STUB_SSL_UPSTREAM = 388,
- VAR_FORWARD_SSL_UPSTREAM = 389,
- VAR_TLS_CERT_BUNDLE = 390,
- VAR_STUB_FIRST = 391,
- VAR_MINIMAL_RESPONSES = 392,
- VAR_RRSET_ROUNDROBIN = 393,
- VAR_MAX_UDP_SIZE = 394,
- VAR_DELAY_CLOSE = 395,
- VAR_UNBLOCK_LAN_ZONES = 396,
- VAR_INSECURE_LAN_ZONES = 397,
- VAR_INFRA_CACHE_MIN_RTT = 398,
- VAR_DNS64_PREFIX = 399,
- VAR_DNS64_SYNTHALL = 400,
- VAR_DNSTAP = 401,
- VAR_DNSTAP_ENABLE = 402,
- VAR_DNSTAP_SOCKET_PATH = 403,
- VAR_DNSTAP_SEND_IDENTITY = 404,
- VAR_DNSTAP_SEND_VERSION = 405,
- VAR_DNSTAP_IDENTITY = 406,
- VAR_DNSTAP_VERSION = 407,
- VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 408,
- VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 409,
- VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 410,
- VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 411,
- VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 412,
- VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 413,
- VAR_RESPONSE_IP_TAG = 414,
- VAR_RESPONSE_IP = 415,
- VAR_RESPONSE_IP_DATA = 416,
- VAR_HARDEN_ALGO_DOWNGRADE = 417,
- VAR_IP_TRANSPARENT = 418,
- VAR_DISABLE_DNSSEC_LAME_CHECK = 419,
- VAR_IP_RATELIMIT = 420,
- VAR_IP_RATELIMIT_SLABS = 421,
- VAR_IP_RATELIMIT_SIZE = 422,
- VAR_RATELIMIT = 423,
- VAR_RATELIMIT_SLABS = 424,
- VAR_RATELIMIT_SIZE = 425,
- VAR_RATELIMIT_FOR_DOMAIN = 426,
- VAR_RATELIMIT_BELOW_DOMAIN = 427,
- VAR_IP_RATELIMIT_FACTOR = 428,
- VAR_RATELIMIT_FACTOR = 429,
- VAR_SEND_CLIENT_SUBNET = 430,
- VAR_CLIENT_SUBNET_ZONE = 431,
- VAR_CLIENT_SUBNET_ALWAYS_FORWARD = 432,
- VAR_CLIENT_SUBNET_OPCODE = 433,
- VAR_MAX_CLIENT_SUBNET_IPV4 = 434,
- VAR_MAX_CLIENT_SUBNET_IPV6 = 435,
- VAR_CAPS_WHITELIST = 436,
- VAR_CACHE_MAX_NEGATIVE_TTL = 437,
- VAR_PERMIT_SMALL_HOLDDOWN = 438,
- VAR_QNAME_MINIMISATION = 439,
- VAR_QNAME_MINIMISATION_STRICT = 440,
- VAR_IP_FREEBIND = 441,
- VAR_DEFINE_TAG = 442,
- VAR_LOCAL_ZONE_TAG = 443,
- VAR_ACCESS_CONTROL_TAG = 444,
- VAR_LOCAL_ZONE_OVERRIDE = 445,
- VAR_ACCESS_CONTROL_TAG_ACTION = 446,
- VAR_ACCESS_CONTROL_TAG_DATA = 447,
- VAR_VIEW = 448,
- VAR_ACCESS_CONTROL_VIEW = 449,
- VAR_VIEW_FIRST = 450,
- VAR_SERVE_EXPIRED = 451,
- VAR_FAKE_DSA = 452,
- VAR_FAKE_SHA1 = 453,
- VAR_LOG_IDENTITY = 454,
- VAR_HIDE_TRUSTANCHOR = 455,
- VAR_TRUST_ANCHOR_SIGNALING = 456,
- VAR_AGGRESSIVE_NSEC = 457,
- VAR_USE_SYSTEMD = 458,
- VAR_SHM_ENABLE = 459,
- VAR_SHM_KEY = 460,
- VAR_ROOT_KEY_SENTINEL = 461,
- VAR_DNSCRYPT = 462,
- VAR_DNSCRYPT_ENABLE = 463,
- VAR_DNSCRYPT_PORT = 464,
- VAR_DNSCRYPT_PROVIDER = 465,
- VAR_DNSCRYPT_SECRET_KEY = 466,
- VAR_DNSCRYPT_PROVIDER_CERT = 467,
- VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 468,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 469,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 470,
- VAR_DNSCRYPT_NONCE_CACHE_SIZE = 471,
- VAR_DNSCRYPT_NONCE_CACHE_SLABS = 472,
- VAR_IPSECMOD_ENABLED = 473,
- VAR_IPSECMOD_HOOK = 474,
- VAR_IPSECMOD_IGNORE_BOGUS = 475,
- VAR_IPSECMOD_MAX_TTL = 476,
- VAR_IPSECMOD_WHITELIST = 477,
- VAR_IPSECMOD_STRICT = 478,
- VAR_CACHEDB = 479,
- VAR_CACHEDB_BACKEND = 480,
- VAR_CACHEDB_SECRETSEED = 481,
- VAR_CACHEDB_REDISHOST = 482,
- VAR_CACHEDB_REDISPORT = 483,
- VAR_CACHEDB_REDISTIMEOUT = 484,
- VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 485,
- VAR_FOR_UPSTREAM = 486,
- VAR_AUTH_ZONE = 487,
- VAR_ZONEFILE = 488,
- VAR_MASTER = 489,
- VAR_URL = 490,
- VAR_FOR_DOWNSTREAM = 491,
- VAR_FALLBACK_ENABLED = 492,
- VAR_TLS_ADDITIONAL_PORT = 493,
- VAR_LOW_RTT = 494,
- VAR_LOW_RTT_PERMIL = 495,
- VAR_ALLOW_NOTIFY = 496,
- VAR_TLS_WIN_CERT = 497
+ VAR_TCP_IDLE_TIMEOUT = 279,
+ VAR_EDNS_TCP_KEEPALIVE = 280,
+ VAR_EDNS_TCP_KEEPALIVE_TIMEOUT = 281,
+ VAR_CHROOT = 282,
+ VAR_USERNAME = 283,
+ VAR_DIRECTORY = 284,
+ VAR_LOGFILE = 285,
+ VAR_PIDFILE = 286,
+ VAR_MSG_CACHE_SIZE = 287,
+ VAR_MSG_CACHE_SLABS = 288,
+ VAR_NUM_QUERIES_PER_THREAD = 289,
+ VAR_RRSET_CACHE_SIZE = 290,
+ VAR_RRSET_CACHE_SLABS = 291,
+ VAR_OUTGOING_NUM_TCP = 292,
+ VAR_INFRA_HOST_TTL = 293,
+ VAR_INFRA_LAME_TTL = 294,
+ VAR_INFRA_CACHE_SLABS = 295,
+ VAR_INFRA_CACHE_NUMHOSTS = 296,
+ VAR_INFRA_CACHE_LAME_SIZE = 297,
+ VAR_NAME = 298,
+ VAR_STUB_ZONE = 299,
+ VAR_STUB_HOST = 300,
+ VAR_STUB_ADDR = 301,
+ VAR_TARGET_FETCH_POLICY = 302,
+ VAR_HARDEN_SHORT_BUFSIZE = 303,
+ VAR_HARDEN_LARGE_QUERIES = 304,
+ VAR_FORWARD_ZONE = 305,
+ VAR_FORWARD_HOST = 306,
+ VAR_FORWARD_ADDR = 307,
+ VAR_DO_NOT_QUERY_ADDRESS = 308,
+ VAR_HIDE_IDENTITY = 309,
+ VAR_HIDE_VERSION = 310,
+ VAR_IDENTITY = 311,
+ VAR_VERSION = 312,
+ VAR_HARDEN_GLUE = 313,
+ VAR_MODULE_CONF = 314,
+ VAR_TRUST_ANCHOR_FILE = 315,
+ VAR_TRUST_ANCHOR = 316,
+ VAR_VAL_OVERRIDE_DATE = 317,
+ VAR_BOGUS_TTL = 318,
+ VAR_VAL_CLEAN_ADDITIONAL = 319,
+ VAR_VAL_PERMISSIVE_MODE = 320,
+ VAR_INCOMING_NUM_TCP = 321,
+ VAR_MSG_BUFFER_SIZE = 322,
+ VAR_KEY_CACHE_SIZE = 323,
+ VAR_KEY_CACHE_SLABS = 324,
+ VAR_TRUSTED_KEYS_FILE = 325,
+ VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 326,
+ VAR_USE_SYSLOG = 327,
+ VAR_OUTGOING_INTERFACE = 328,
+ VAR_ROOT_HINTS = 329,
+ VAR_DO_NOT_QUERY_LOCALHOST = 330,
+ VAR_CACHE_MAX_TTL = 331,
+ VAR_HARDEN_DNSSEC_STRIPPED = 332,
+ VAR_ACCESS_CONTROL = 333,
+ VAR_LOCAL_ZONE = 334,
+ VAR_LOCAL_DATA = 335,
+ VAR_INTERFACE_AUTOMATIC = 336,
+ VAR_STATISTICS_INTERVAL = 337,
+ VAR_DO_DAEMONIZE = 338,
+ VAR_USE_CAPS_FOR_ID = 339,
+ VAR_STATISTICS_CUMULATIVE = 340,
+ VAR_OUTGOING_PORT_PERMIT = 341,
+ VAR_OUTGOING_PORT_AVOID = 342,
+ VAR_DLV_ANCHOR_FILE = 343,
+ VAR_DLV_ANCHOR = 344,
+ VAR_NEG_CACHE_SIZE = 345,
+ VAR_HARDEN_REFERRAL_PATH = 346,
+ VAR_PRIVATE_ADDRESS = 347,
+ VAR_PRIVATE_DOMAIN = 348,
+ VAR_REMOTE_CONTROL = 349,
+ VAR_CONTROL_ENABLE = 350,
+ VAR_CONTROL_INTERFACE = 351,
+ VAR_CONTROL_PORT = 352,
+ VAR_SERVER_KEY_FILE = 353,
+ VAR_SERVER_CERT_FILE = 354,
+ VAR_CONTROL_KEY_FILE = 355,
+ VAR_CONTROL_CERT_FILE = 356,
+ VAR_CONTROL_USE_CERT = 357,
+ VAR_EXTENDED_STATISTICS = 358,
+ VAR_LOCAL_DATA_PTR = 359,
+ VAR_JOSTLE_TIMEOUT = 360,
+ VAR_STUB_PRIME = 361,
+ VAR_UNWANTED_REPLY_THRESHOLD = 362,
+ VAR_LOG_TIME_ASCII = 363,
+ VAR_DOMAIN_INSECURE = 364,
+ VAR_PYTHON = 365,
+ VAR_PYTHON_SCRIPT = 366,
+ VAR_VAL_SIG_SKEW_MIN = 367,
+ VAR_VAL_SIG_SKEW_MAX = 368,
+ VAR_CACHE_MIN_TTL = 369,
+ VAR_VAL_LOG_LEVEL = 370,
+ VAR_AUTO_TRUST_ANCHOR_FILE = 371,
+ VAR_KEEP_MISSING = 372,
+ VAR_ADD_HOLDDOWN = 373,
+ VAR_DEL_HOLDDOWN = 374,
+ VAR_SO_RCVBUF = 375,
+ VAR_EDNS_BUFFER_SIZE = 376,
+ VAR_PREFETCH = 377,
+ VAR_PREFETCH_KEY = 378,
+ VAR_SO_SNDBUF = 379,
+ VAR_SO_REUSEPORT = 380,
+ VAR_HARDEN_BELOW_NXDOMAIN = 381,
+ VAR_IGNORE_CD_FLAG = 382,
+ VAR_LOG_QUERIES = 383,
+ VAR_LOG_REPLIES = 384,
+ VAR_LOG_LOCAL_ACTIONS = 385,
+ VAR_TCP_UPSTREAM = 386,
+ VAR_SSL_UPSTREAM = 387,
+ VAR_SSL_SERVICE_KEY = 388,
+ VAR_SSL_SERVICE_PEM = 389,
+ VAR_SSL_PORT = 390,
+ VAR_FORWARD_FIRST = 391,
+ VAR_STUB_SSL_UPSTREAM = 392,
+ VAR_FORWARD_SSL_UPSTREAM = 393,
+ VAR_TLS_CERT_BUNDLE = 394,
+ VAR_STUB_FIRST = 395,
+ VAR_MINIMAL_RESPONSES = 396,
+ VAR_RRSET_ROUNDROBIN = 397,
+ VAR_MAX_UDP_SIZE = 398,
+ VAR_DELAY_CLOSE = 399,
+ VAR_UNBLOCK_LAN_ZONES = 400,
+ VAR_INSECURE_LAN_ZONES = 401,
+ VAR_INFRA_CACHE_MIN_RTT = 402,
+ VAR_DNS64_PREFIX = 403,
+ VAR_DNS64_SYNTHALL = 404,
+ VAR_DNS64_IGNORE_AAAA = 405,
+ VAR_DNSTAP = 406,
+ VAR_DNSTAP_ENABLE = 407,
+ VAR_DNSTAP_SOCKET_PATH = 408,
+ VAR_DNSTAP_SEND_IDENTITY = 409,
+ VAR_DNSTAP_SEND_VERSION = 410,
+ VAR_DNSTAP_IDENTITY = 411,
+ VAR_DNSTAP_VERSION = 412,
+ VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 413,
+ VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 414,
+ VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 415,
+ VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 416,
+ VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 417,
+ VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 418,
+ VAR_RESPONSE_IP_TAG = 419,
+ VAR_RESPONSE_IP = 420,
+ VAR_RESPONSE_IP_DATA = 421,
+ VAR_HARDEN_ALGO_DOWNGRADE = 422,
+ VAR_IP_TRANSPARENT = 423,
+ VAR_DISABLE_DNSSEC_LAME_CHECK = 424,
+ VAR_IP_RATELIMIT = 425,
+ VAR_IP_RATELIMIT_SLABS = 426,
+ VAR_IP_RATELIMIT_SIZE = 427,
+ VAR_RATELIMIT = 428,
+ VAR_RATELIMIT_SLABS = 429,
+ VAR_RATELIMIT_SIZE = 430,
+ VAR_RATELIMIT_FOR_DOMAIN = 431,
+ VAR_RATELIMIT_BELOW_DOMAIN = 432,
+ VAR_IP_RATELIMIT_FACTOR = 433,
+ VAR_RATELIMIT_FACTOR = 434,
+ VAR_SEND_CLIENT_SUBNET = 435,
+ VAR_CLIENT_SUBNET_ZONE = 436,
+ VAR_CLIENT_SUBNET_ALWAYS_FORWARD = 437,
+ VAR_CLIENT_SUBNET_OPCODE = 438,
+ VAR_MAX_CLIENT_SUBNET_IPV4 = 439,
+ VAR_MAX_CLIENT_SUBNET_IPV6 = 440,
+ VAR_CAPS_WHITELIST = 441,
+ VAR_CACHE_MAX_NEGATIVE_TTL = 442,
+ VAR_PERMIT_SMALL_HOLDDOWN = 443,
+ VAR_QNAME_MINIMISATION = 444,
+ VAR_QNAME_MINIMISATION_STRICT = 445,
+ VAR_IP_FREEBIND = 446,
+ VAR_DEFINE_TAG = 447,
+ VAR_LOCAL_ZONE_TAG = 448,
+ VAR_ACCESS_CONTROL_TAG = 449,
+ VAR_LOCAL_ZONE_OVERRIDE = 450,
+ VAR_ACCESS_CONTROL_TAG_ACTION = 451,
+ VAR_ACCESS_CONTROL_TAG_DATA = 452,
+ VAR_VIEW = 453,
+ VAR_ACCESS_CONTROL_VIEW = 454,
+ VAR_VIEW_FIRST = 455,
+ VAR_SERVE_EXPIRED = 456,
+ VAR_SERVE_EXPIRED_TTL = 457,
+ VAR_SERVE_EXPIRED_TTL_RESET = 458,
+ VAR_FAKE_DSA = 459,
+ VAR_FAKE_SHA1 = 460,
+ VAR_LOG_IDENTITY = 461,
+ VAR_HIDE_TRUSTANCHOR = 462,
+ VAR_TRUST_ANCHOR_SIGNALING = 463,
+ VAR_AGGRESSIVE_NSEC = 464,
+ VAR_USE_SYSTEMD = 465,
+ VAR_SHM_ENABLE = 466,
+ VAR_SHM_KEY = 467,
+ VAR_ROOT_KEY_SENTINEL = 468,
+ VAR_DNSCRYPT = 469,
+ VAR_DNSCRYPT_ENABLE = 470,
+ VAR_DNSCRYPT_PORT = 471,
+ VAR_DNSCRYPT_PROVIDER = 472,
+ VAR_DNSCRYPT_SECRET_KEY = 473,
+ VAR_DNSCRYPT_PROVIDER_CERT = 474,
+ VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 475,
+ VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 476,
+ VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 477,
+ VAR_DNSCRYPT_NONCE_CACHE_SIZE = 478,
+ VAR_DNSCRYPT_NONCE_CACHE_SLABS = 479,
+ VAR_IPSECMOD_ENABLED = 480,
+ VAR_IPSECMOD_HOOK = 481,
+ VAR_IPSECMOD_IGNORE_BOGUS = 482,
+ VAR_IPSECMOD_MAX_TTL = 483,
+ VAR_IPSECMOD_WHITELIST = 484,
+ VAR_IPSECMOD_STRICT = 485,
+ VAR_CACHEDB = 486,
+ VAR_CACHEDB_BACKEND = 487,
+ VAR_CACHEDB_SECRETSEED = 488,
+ VAR_CACHEDB_REDISHOST = 489,
+ VAR_CACHEDB_REDISPORT = 490,
+ VAR_CACHEDB_REDISTIMEOUT = 491,
+ VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 492,
+ VAR_FOR_UPSTREAM = 493,
+ VAR_AUTH_ZONE = 494,
+ VAR_ZONEFILE = 495,
+ VAR_MASTER = 496,
+ VAR_URL = 497,
+ VAR_FOR_DOWNSTREAM = 498,
+ VAR_FALLBACK_ENABLED = 499,
+ VAR_TLS_ADDITIONAL_PORT = 500,
+ VAR_LOW_RTT = 501,
+ VAR_LOW_RTT_PERMIL = 502,
+ VAR_ALLOW_NOTIFY = 503,
+ VAR_TLS_WIN_CERT = 504,
+ VAR_TCP_CONNECTION_LIMIT = 505,
+ VAR_FORWARD_NO_CACHE = 506,
+ VAR_STUB_NO_CACHE = 507,
+ VAR_LOG_SERVFAIL = 508
};
#endif
/* Tokens. */
@@ -309,225 +320,236 @@ extern int yydebug;
#define VAR_DO_TCP 276
#define VAR_TCP_MSS 277
#define VAR_OUTGOING_TCP_MSS 278
-#define VAR_CHROOT 279
-#define VAR_USERNAME 280
-#define VAR_DIRECTORY 281
-#define VAR_LOGFILE 282
-#define VAR_PIDFILE 283
-#define VAR_MSG_CACHE_SIZE 284
-#define VAR_MSG_CACHE_SLABS 285
-#define VAR_NUM_QUERIES_PER_THREAD 286
-#define VAR_RRSET_CACHE_SIZE 287
-#define VAR_RRSET_CACHE_SLABS 288
-#define VAR_OUTGOING_NUM_TCP 289
-#define VAR_INFRA_HOST_TTL 290
-#define VAR_INFRA_LAME_TTL 291
-#define VAR_INFRA_CACHE_SLABS 292
-#define VAR_INFRA_CACHE_NUMHOSTS 293
-#define VAR_INFRA_CACHE_LAME_SIZE 294
-#define VAR_NAME 295
-#define VAR_STUB_ZONE 296
-#define VAR_STUB_HOST 297
-#define VAR_STUB_ADDR 298
-#define VAR_TARGET_FETCH_POLICY 299
-#define VAR_HARDEN_SHORT_BUFSIZE 300
-#define VAR_HARDEN_LARGE_QUERIES 301
-#define VAR_FORWARD_ZONE 302
-#define VAR_FORWARD_HOST 303
-#define VAR_FORWARD_ADDR 304
-#define VAR_DO_NOT_QUERY_ADDRESS 305
-#define VAR_HIDE_IDENTITY 306
-#define VAR_HIDE_VERSION 307
-#define VAR_IDENTITY 308
-#define VAR_VERSION 309
-#define VAR_HARDEN_GLUE 310
-#define VAR_MODULE_CONF 311
-#define VAR_TRUST_ANCHOR_FILE 312
-#define VAR_TRUST_ANCHOR 313
-#define VAR_VAL_OVERRIDE_DATE 314
-#define VAR_BOGUS_TTL 315
-#define VAR_VAL_CLEAN_ADDITIONAL 316
-#define VAR_VAL_PERMISSIVE_MODE 317
-#define VAR_INCOMING_NUM_TCP 318
-#define VAR_MSG_BUFFER_SIZE 319
-#define VAR_KEY_CACHE_SIZE 320
-#define VAR_KEY_CACHE_SLABS 321
-#define VAR_TRUSTED_KEYS_FILE 322
-#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 323
-#define VAR_USE_SYSLOG 324
-#define VAR_OUTGOING_INTERFACE 325
-#define VAR_ROOT_HINTS 326
-#define VAR_DO_NOT_QUERY_LOCALHOST 327
-#define VAR_CACHE_MAX_TTL 328
-#define VAR_HARDEN_DNSSEC_STRIPPED 329
-#define VAR_ACCESS_CONTROL 330
-#define VAR_LOCAL_ZONE 331
-#define VAR_LOCAL_DATA 332
-#define VAR_INTERFACE_AUTOMATIC 333
-#define VAR_STATISTICS_INTERVAL 334
-#define VAR_DO_DAEMONIZE 335
-#define VAR_USE_CAPS_FOR_ID 336
-#define VAR_STATISTICS_CUMULATIVE 337
-#define VAR_OUTGOING_PORT_PERMIT 338
-#define VAR_OUTGOING_PORT_AVOID 339
-#define VAR_DLV_ANCHOR_FILE 340
-#define VAR_DLV_ANCHOR 341
-#define VAR_NEG_CACHE_SIZE 342
-#define VAR_HARDEN_REFERRAL_PATH 343
-#define VAR_PRIVATE_ADDRESS 344
-#define VAR_PRIVATE_DOMAIN 345
-#define VAR_REMOTE_CONTROL 346
-#define VAR_CONTROL_ENABLE 347
-#define VAR_CONTROL_INTERFACE 348
-#define VAR_CONTROL_PORT 349
-#define VAR_SERVER_KEY_FILE 350
-#define VAR_SERVER_CERT_FILE 351
-#define VAR_CONTROL_KEY_FILE 352
-#define VAR_CONTROL_CERT_FILE 353
-#define VAR_CONTROL_USE_CERT 354
-#define VAR_EXTENDED_STATISTICS 355
-#define VAR_LOCAL_DATA_PTR 356
-#define VAR_JOSTLE_TIMEOUT 357
-#define VAR_STUB_PRIME 358
-#define VAR_UNWANTED_REPLY_THRESHOLD 359
-#define VAR_LOG_TIME_ASCII 360
-#define VAR_DOMAIN_INSECURE 361
-#define VAR_PYTHON 362
-#define VAR_PYTHON_SCRIPT 363
-#define VAR_VAL_SIG_SKEW_MIN 364
-#define VAR_VAL_SIG_SKEW_MAX 365
-#define VAR_CACHE_MIN_TTL 366
-#define VAR_VAL_LOG_LEVEL 367
-#define VAR_AUTO_TRUST_ANCHOR_FILE 368
-#define VAR_KEEP_MISSING 369
-#define VAR_ADD_HOLDDOWN 370
-#define VAR_DEL_HOLDDOWN 371
-#define VAR_SO_RCVBUF 372
-#define VAR_EDNS_BUFFER_SIZE 373
-#define VAR_PREFETCH 374
-#define VAR_PREFETCH_KEY 375
-#define VAR_SO_SNDBUF 376
-#define VAR_SO_REUSEPORT 377
-#define VAR_HARDEN_BELOW_NXDOMAIN 378
-#define VAR_IGNORE_CD_FLAG 379
-#define VAR_LOG_QUERIES 380
-#define VAR_LOG_REPLIES 381
-#define VAR_TCP_UPSTREAM 382
-#define VAR_SSL_UPSTREAM 383
-#define VAR_SSL_SERVICE_KEY 384
-#define VAR_SSL_SERVICE_PEM 385
-#define VAR_SSL_PORT 386
-#define VAR_FORWARD_FIRST 387
-#define VAR_STUB_SSL_UPSTREAM 388
-#define VAR_FORWARD_SSL_UPSTREAM 389
-#define VAR_TLS_CERT_BUNDLE 390
-#define VAR_STUB_FIRST 391
-#define VAR_MINIMAL_RESPONSES 392
-#define VAR_RRSET_ROUNDROBIN 393
-#define VAR_MAX_UDP_SIZE 394
-#define VAR_DELAY_CLOSE 395
-#define VAR_UNBLOCK_LAN_ZONES 396
-#define VAR_INSECURE_LAN_ZONES 397
-#define VAR_INFRA_CACHE_MIN_RTT 398
-#define VAR_DNS64_PREFIX 399
-#define VAR_DNS64_SYNTHALL 400
-#define VAR_DNSTAP 401
-#define VAR_DNSTAP_ENABLE 402
-#define VAR_DNSTAP_SOCKET_PATH 403
-#define VAR_DNSTAP_SEND_IDENTITY 404
-#define VAR_DNSTAP_SEND_VERSION 405
-#define VAR_DNSTAP_IDENTITY 406
-#define VAR_DNSTAP_VERSION 407
-#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 408
-#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 409
-#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 410
-#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 411
-#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 412
-#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 413
-#define VAR_RESPONSE_IP_TAG 414
-#define VAR_RESPONSE_IP 415
-#define VAR_RESPONSE_IP_DATA 416
-#define VAR_HARDEN_ALGO_DOWNGRADE 417
-#define VAR_IP_TRANSPARENT 418
-#define VAR_DISABLE_DNSSEC_LAME_CHECK 419
-#define VAR_IP_RATELIMIT 420
-#define VAR_IP_RATELIMIT_SLABS 421
-#define VAR_IP_RATELIMIT_SIZE 422
-#define VAR_RATELIMIT 423
-#define VAR_RATELIMIT_SLABS 424
-#define VAR_RATELIMIT_SIZE 425
-#define VAR_RATELIMIT_FOR_DOMAIN 426
-#define VAR_RATELIMIT_BELOW_DOMAIN 427
-#define VAR_IP_RATELIMIT_FACTOR 428
-#define VAR_RATELIMIT_FACTOR 429
-#define VAR_SEND_CLIENT_SUBNET 430
-#define VAR_CLIENT_SUBNET_ZONE 431
-#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 432
-#define VAR_CLIENT_SUBNET_OPCODE 433
-#define VAR_MAX_CLIENT_SUBNET_IPV4 434
-#define VAR_MAX_CLIENT_SUBNET_IPV6 435
-#define VAR_CAPS_WHITELIST 436
-#define VAR_CACHE_MAX_NEGATIVE_TTL 437
-#define VAR_PERMIT_SMALL_HOLDDOWN 438
-#define VAR_QNAME_MINIMISATION 439
-#define VAR_QNAME_MINIMISATION_STRICT 440
-#define VAR_IP_FREEBIND 441
-#define VAR_DEFINE_TAG 442
-#define VAR_LOCAL_ZONE_TAG 443
-#define VAR_ACCESS_CONTROL_TAG 444
-#define VAR_LOCAL_ZONE_OVERRIDE 445
-#define VAR_ACCESS_CONTROL_TAG_ACTION 446
-#define VAR_ACCESS_CONTROL_TAG_DATA 447
-#define VAR_VIEW 448
-#define VAR_ACCESS_CONTROL_VIEW 449
-#define VAR_VIEW_FIRST 450
-#define VAR_SERVE_EXPIRED 451
-#define VAR_FAKE_DSA 452
-#define VAR_FAKE_SHA1 453
-#define VAR_LOG_IDENTITY 454
-#define VAR_HIDE_TRUSTANCHOR 455
-#define VAR_TRUST_ANCHOR_SIGNALING 456
-#define VAR_AGGRESSIVE_NSEC 457
-#define VAR_USE_SYSTEMD 458
-#define VAR_SHM_ENABLE 459
-#define VAR_SHM_KEY 460
-#define VAR_ROOT_KEY_SENTINEL 461
-#define VAR_DNSCRYPT 462
-#define VAR_DNSCRYPT_ENABLE 463
-#define VAR_DNSCRYPT_PORT 464
-#define VAR_DNSCRYPT_PROVIDER 465
-#define VAR_DNSCRYPT_SECRET_KEY 466
-#define VAR_DNSCRYPT_PROVIDER_CERT 467
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 468
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 469
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 470
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 471
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 472
-#define VAR_IPSECMOD_ENABLED 473
-#define VAR_IPSECMOD_HOOK 474
-#define VAR_IPSECMOD_IGNORE_BOGUS 475
-#define VAR_IPSECMOD_MAX_TTL 476
-#define VAR_IPSECMOD_WHITELIST 477
-#define VAR_IPSECMOD_STRICT 478
-#define VAR_CACHEDB 479
-#define VAR_CACHEDB_BACKEND 480
-#define VAR_CACHEDB_SECRETSEED 481
-#define VAR_CACHEDB_REDISHOST 482
-#define VAR_CACHEDB_REDISPORT 483
-#define VAR_CACHEDB_REDISTIMEOUT 484
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 485
-#define VAR_FOR_UPSTREAM 486
-#define VAR_AUTH_ZONE 487
-#define VAR_ZONEFILE 488
-#define VAR_MASTER 489
-#define VAR_URL 490
-#define VAR_FOR_DOWNSTREAM 491
-#define VAR_FALLBACK_ENABLED 492
-#define VAR_TLS_ADDITIONAL_PORT 493
-#define VAR_LOW_RTT 494
-#define VAR_LOW_RTT_PERMIL 495
-#define VAR_ALLOW_NOTIFY 496
-#define VAR_TLS_WIN_CERT 497
+#define VAR_TCP_IDLE_TIMEOUT 279
+#define VAR_EDNS_TCP_KEEPALIVE 280
+#define VAR_EDNS_TCP_KEEPALIVE_TIMEOUT 281
+#define VAR_CHROOT 282
+#define VAR_USERNAME 283
+#define VAR_DIRECTORY 284
+#define VAR_LOGFILE 285
+#define VAR_PIDFILE 286
+#define VAR_MSG_CACHE_SIZE 287
+#define VAR_MSG_CACHE_SLABS 288
+#define VAR_NUM_QUERIES_PER_THREAD 289
+#define VAR_RRSET_CACHE_SIZE 290
+#define VAR_RRSET_CACHE_SLABS 291
+#define VAR_OUTGOING_NUM_TCP 292
+#define VAR_INFRA_HOST_TTL 293
+#define VAR_INFRA_LAME_TTL 294
+#define VAR_INFRA_CACHE_SLABS 295
+#define VAR_INFRA_CACHE_NUMHOSTS 296
+#define VAR_INFRA_CACHE_LAME_SIZE 297
+#define VAR_NAME 298
+#define VAR_STUB_ZONE 299
+#define VAR_STUB_HOST 300
+#define VAR_STUB_ADDR 301
+#define VAR_TARGET_FETCH_POLICY 302
+#define VAR_HARDEN_SHORT_BUFSIZE 303
+#define VAR_HARDEN_LARGE_QUERIES 304
+#define VAR_FORWARD_ZONE 305
+#define VAR_FORWARD_HOST 306
+#define VAR_FORWARD_ADDR 307
+#define VAR_DO_NOT_QUERY_ADDRESS 308
+#define VAR_HIDE_IDENTITY 309
+#define VAR_HIDE_VERSION 310
+#define VAR_IDENTITY 311
+#define VAR_VERSION 312
+#define VAR_HARDEN_GLUE 313
+#define VAR_MODULE_CONF 314
+#define VAR_TRUST_ANCHOR_FILE 315
+#define VAR_TRUST_ANCHOR 316
+#define VAR_VAL_OVERRIDE_DATE 317
+#define VAR_BOGUS_TTL 318
+#define VAR_VAL_CLEAN_ADDITIONAL 319
+#define VAR_VAL_PERMISSIVE_MODE 320
+#define VAR_INCOMING_NUM_TCP 321
+#define VAR_MSG_BUFFER_SIZE 322
+#define VAR_KEY_CACHE_SIZE 323
+#define VAR_KEY_CACHE_SLABS 324
+#define VAR_TRUSTED_KEYS_FILE 325
+#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 326
+#define VAR_USE_SYSLOG 327
+#define VAR_OUTGOING_INTERFACE 328
+#define VAR_ROOT_HINTS 329
+#define VAR_DO_NOT_QUERY_LOCALHOST 330
+#define VAR_CACHE_MAX_TTL 331
+#define VAR_HARDEN_DNSSEC_STRIPPED 332
+#define VAR_ACCESS_CONTROL 333
+#define VAR_LOCAL_ZONE 334
+#define VAR_LOCAL_DATA 335
+#define VAR_INTERFACE_AUTOMATIC 336
+#define VAR_STATISTICS_INTERVAL 337
+#define VAR_DO_DAEMONIZE 338
+#define VAR_USE_CAPS_FOR_ID 339
+#define VAR_STATISTICS_CUMULATIVE 340
+#define VAR_OUTGOING_PORT_PERMIT 341
+#define VAR_OUTGOING_PORT_AVOID 342
+#define VAR_DLV_ANCHOR_FILE 343
+#define VAR_DLV_ANCHOR 344
+#define VAR_NEG_CACHE_SIZE 345
+#define VAR_HARDEN_REFERRAL_PATH 346
+#define VAR_PRIVATE_ADDRESS 347
+#define VAR_PRIVATE_DOMAIN 348
+#define VAR_REMOTE_CONTROL 349
+#define VAR_CONTROL_ENABLE 350
+#define VAR_CONTROL_INTERFACE 351
+#define VAR_CONTROL_PORT 352
+#define VAR_SERVER_KEY_FILE 353
+#define VAR_SERVER_CERT_FILE 354
+#define VAR_CONTROL_KEY_FILE 355
+#define VAR_CONTROL_CERT_FILE 356
+#define VAR_CONTROL_USE_CERT 357
+#define VAR_EXTENDED_STATISTICS 358
+#define VAR_LOCAL_DATA_PTR 359
+#define VAR_JOSTLE_TIMEOUT 360
+#define VAR_STUB_PRIME 361
+#define VAR_UNWANTED_REPLY_THRESHOLD 362
+#define VAR_LOG_TIME_ASCII 363
+#define VAR_DOMAIN_INSECURE 364
+#define VAR_PYTHON 365
+#define VAR_PYTHON_SCRIPT 366
+#define VAR_VAL_SIG_SKEW_MIN 367
+#define VAR_VAL_SIG_SKEW_MAX 368
+#define VAR_CACHE_MIN_TTL 369
+#define VAR_VAL_LOG_LEVEL 370
+#define VAR_AUTO_TRUST_ANCHOR_FILE 371
+#define VAR_KEEP_MISSING 372
+#define VAR_ADD_HOLDDOWN 373
+#define VAR_DEL_HOLDDOWN 374
+#define VAR_SO_RCVBUF 375
+#define VAR_EDNS_BUFFER_SIZE 376
+#define VAR_PREFETCH 377
+#define VAR_PREFETCH_KEY 378
+#define VAR_SO_SNDBUF 379
+#define VAR_SO_REUSEPORT 380
+#define VAR_HARDEN_BELOW_NXDOMAIN 381
+#define VAR_IGNORE_CD_FLAG 382
+#define VAR_LOG_QUERIES 383
+#define VAR_LOG_REPLIES 384
+#define VAR_LOG_LOCAL_ACTIONS 385
+#define VAR_TCP_UPSTREAM 386
+#define VAR_SSL_UPSTREAM 387
+#define VAR_SSL_SERVICE_KEY 388
+#define VAR_SSL_SERVICE_PEM 389
+#define VAR_SSL_PORT 390
+#define VAR_FORWARD_FIRST 391
+#define VAR_STUB_SSL_UPSTREAM 392
+#define VAR_FORWARD_SSL_UPSTREAM 393
+#define VAR_TLS_CERT_BUNDLE 394
+#define VAR_STUB_FIRST 395
+#define VAR_MINIMAL_RESPONSES 396
+#define VAR_RRSET_ROUNDROBIN 397
+#define VAR_MAX_UDP_SIZE 398
+#define VAR_DELAY_CLOSE 399
+#define VAR_UNBLOCK_LAN_ZONES 400
+#define VAR_INSECURE_LAN_ZONES 401
+#define VAR_INFRA_CACHE_MIN_RTT 402
+#define VAR_DNS64_PREFIX 403
+#define VAR_DNS64_SYNTHALL 404
+#define VAR_DNS64_IGNORE_AAAA 405
+#define VAR_DNSTAP 406
+#define VAR_DNSTAP_ENABLE 407
+#define VAR_DNSTAP_SOCKET_PATH 408
+#define VAR_DNSTAP_SEND_IDENTITY 409
+#define VAR_DNSTAP_SEND_VERSION 410
+#define VAR_DNSTAP_IDENTITY 411
+#define VAR_DNSTAP_VERSION 412
+#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 413
+#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 414
+#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 415
+#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 416
+#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 417
+#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 418
+#define VAR_RESPONSE_IP_TAG 419
+#define VAR_RESPONSE_IP 420
+#define VAR_RESPONSE_IP_DATA 421
+#define VAR_HARDEN_ALGO_DOWNGRADE 422
+#define VAR_IP_TRANSPARENT 423
+#define VAR_DISABLE_DNSSEC_LAME_CHECK 424
+#define VAR_IP_RATELIMIT 425
+#define VAR_IP_RATELIMIT_SLABS 426
+#define VAR_IP_RATELIMIT_SIZE 427
+#define VAR_RATELIMIT 428
+#define VAR_RATELIMIT_SLABS 429
+#define VAR_RATELIMIT_SIZE 430
+#define VAR_RATELIMIT_FOR_DOMAIN 431
+#define VAR_RATELIMIT_BELOW_DOMAIN 432
+#define VAR_IP_RATELIMIT_FACTOR 433
+#define VAR_RATELIMIT_FACTOR 434
+#define VAR_SEND_CLIENT_SUBNET 435
+#define VAR_CLIENT_SUBNET_ZONE 436
+#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 437
+#define VAR_CLIENT_SUBNET_OPCODE 438
+#define VAR_MAX_CLIENT_SUBNET_IPV4 439
+#define VAR_MAX_CLIENT_SUBNET_IPV6 440
+#define VAR_CAPS_WHITELIST 441
+#define VAR_CACHE_MAX_NEGATIVE_TTL 442
+#define VAR_PERMIT_SMALL_HOLDDOWN 443
+#define VAR_QNAME_MINIMISATION 444
+#define VAR_QNAME_MINIMISATION_STRICT 445
+#define VAR_IP_FREEBIND 446
+#define VAR_DEFINE_TAG 447
+#define VAR_LOCAL_ZONE_TAG 448
+#define VAR_ACCESS_CONTROL_TAG 449
+#define VAR_LOCAL_ZONE_OVERRIDE 450
+#define VAR_ACCESS_CONTROL_TAG_ACTION 451
+#define VAR_ACCESS_CONTROL_TAG_DATA 452
+#define VAR_VIEW 453
+#define VAR_ACCESS_CONTROL_VIEW 454
+#define VAR_VIEW_FIRST 455
+#define VAR_SERVE_EXPIRED 456
+#define VAR_SERVE_EXPIRED_TTL 457
+#define VAR_SERVE_EXPIRED_TTL_RESET 458
+#define VAR_FAKE_DSA 459
+#define VAR_FAKE_SHA1 460
+#define VAR_LOG_IDENTITY 461
+#define VAR_HIDE_TRUSTANCHOR 462
+#define VAR_TRUST_ANCHOR_SIGNALING 463
+#define VAR_AGGRESSIVE_NSEC 464
+#define VAR_USE_SYSTEMD 465
+#define VAR_SHM_ENABLE 466
+#define VAR_SHM_KEY 467
+#define VAR_ROOT_KEY_SENTINEL 468
+#define VAR_DNSCRYPT 469
+#define VAR_DNSCRYPT_ENABLE 470
+#define VAR_DNSCRYPT_PORT 471
+#define VAR_DNSCRYPT_PROVIDER 472
+#define VAR_DNSCRYPT_SECRET_KEY 473
+#define VAR_DNSCRYPT_PROVIDER_CERT 474
+#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 475
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 476
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 477
+#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 478
+#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 479
+#define VAR_IPSECMOD_ENABLED 480
+#define VAR_IPSECMOD_HOOK 481
+#define VAR_IPSECMOD_IGNORE_BOGUS 482
+#define VAR_IPSECMOD_MAX_TTL 483
+#define VAR_IPSECMOD_WHITELIST 484
+#define VAR_IPSECMOD_STRICT 485
+#define VAR_CACHEDB 486
+#define VAR_CACHEDB_BACKEND 487
+#define VAR_CACHEDB_SECRETSEED 488
+#define VAR_CACHEDB_REDISHOST 489
+#define VAR_CACHEDB_REDISPORT 490
+#define VAR_CACHEDB_REDISTIMEOUT 491
+#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 492
+#define VAR_FOR_UPSTREAM 493
+#define VAR_AUTH_ZONE 494
+#define VAR_ZONEFILE 495
+#define VAR_MASTER 496
+#define VAR_URL 497
+#define VAR_FOR_DOWNSTREAM 498
+#define VAR_FALLBACK_ENABLED 499
+#define VAR_TLS_ADDITIONAL_PORT 500
+#define VAR_LOW_RTT 501
+#define VAR_LOW_RTT_PERMIL 502
+#define VAR_ALLOW_NOTIFY 503
+#define VAR_TLS_WIN_CERT 504
+#define VAR_TCP_CONNECTION_LIMIT 505
+#define VAR_FORWARD_NO_CACHE 506
+#define VAR_STUB_NO_CACHE 507
+#define VAR_LOG_SERVFAIL 508
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -538,7 +560,7 @@ union YYSTYPE
char* str;
-#line 542 "util/configparser.h" /* yacc.c:1909 */
+#line 564 "util/configparser.h" /* yacc.c:1909 */
};
typedef union YYSTYPE YYSTYPE;
diff --git a/util/configparser.y b/util/configparser.y
index e34665aded0c..24c5b2d1e95d 100644
--- a/util/configparser.y
+++ b/util/configparser.y
@@ -72,7 +72,8 @@ extern struct config_parser_state* cfg_parser;
%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
%token VAR_OUTGOING_RANGE VAR_INTERFACE
%token VAR_DO_IP4 VAR_DO_IP6 VAR_PREFER_IP6 VAR_DO_UDP VAR_DO_TCP
-%token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS
+%token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS VAR_TCP_IDLE_TIMEOUT
+%token VAR_EDNS_TCP_KEEPALIVE VAR_EDNS_TCP_KEEPALIVE_TIMEOUT
%token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
%token VAR_RRSET_CACHE_SIZE VAR_RRSET_CACHE_SLABS VAR_OUTGOING_NUM_TCP
@@ -106,7 +107,7 @@ extern struct config_parser_state* cfg_parser;
%token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN
%token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
%token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
-%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_LOG_REPLIES
+%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS
%token VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
%token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
%token VAR_STUB_SSL_UPSTREAM VAR_FORWARD_SSL_UPSTREAM VAR_TLS_CERT_BUNDLE
@@ -114,7 +115,7 @@ extern struct config_parser_state* cfg_parser;
%token VAR_MAX_UDP_SIZE VAR_DELAY_CLOSE
%token VAR_UNBLOCK_LAN_ZONES VAR_INSECURE_LAN_ZONES
%token VAR_INFRA_CACHE_MIN_RTT
-%token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL
+%token VAR_DNS64_PREFIX VAR_DNS64_SYNTHALL VAR_DNS64_IGNORE_AAAA
%token VAR_DNSTAP VAR_DNSTAP_ENABLE VAR_DNSTAP_SOCKET_PATH
%token VAR_DNSTAP_SEND_IDENTITY VAR_DNSTAP_SEND_VERSION
%token VAR_DNSTAP_IDENTITY VAR_DNSTAP_VERSION
@@ -139,7 +140,8 @@ extern struct config_parser_state* cfg_parser;
%token VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG VAR_ACCESS_CONTROL_TAG
%token VAR_LOCAL_ZONE_OVERRIDE VAR_ACCESS_CONTROL_TAG_ACTION
%token VAR_ACCESS_CONTROL_TAG_DATA VAR_VIEW VAR_ACCESS_CONTROL_VIEW
-%token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_FAKE_DSA VAR_FAKE_SHA1
+%token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_SERVE_EXPIRED_TTL
+%token VAR_SERVE_EXPIRED_TTL_RESET VAR_FAKE_DSA VAR_FAKE_SHA1
%token VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR VAR_TRUST_ANCHOR_SIGNALING
%token VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD VAR_SHM_ENABLE VAR_SHM_KEY
%token VAR_ROOT_KEY_SENTINEL
@@ -157,7 +159,8 @@ extern struct config_parser_state* cfg_parser;
%token VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM VAR_FOR_UPSTREAM
%token VAR_AUTH_ZONE VAR_ZONEFILE VAR_MASTER VAR_URL VAR_FOR_DOWNSTREAM
%token VAR_FALLBACK_ENABLED VAR_TLS_ADDITIONAL_PORT VAR_LOW_RTT VAR_LOW_RTT_PERMIL
-%token VAR_ALLOW_NOTIFY VAR_TLS_WIN_CERT
+%token VAR_ALLOW_NOTIFY VAR_TLS_WIN_CERT VAR_TCP_CONNECTION_LIMIT
+%token VAR_FORWARD_NO_CACHE VAR_STUB_NO_CACHE VAR_LOG_SERVFAIL
%%
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -180,7 +183,8 @@ content_server: server_num_threads | server_verbosity | server_port |
server_outgoing_range | server_do_ip4 |
server_do_ip6 | server_prefer_ip6 |
server_do_udp | server_do_tcp |
- server_tcp_mss | server_outgoing_tcp_mss |
+ server_tcp_mss | server_outgoing_tcp_mss | server_tcp_idle_timeout |
+ server_tcp_keepalive | server_tcp_keepalive_timeout |
server_interface | server_chroot | server_username |
server_directory | server_logfile | server_pidfile |
server_msg_cache_size | server_msg_cache_slabs |
@@ -217,11 +221,12 @@ content_server: server_num_threads | server_verbosity | server_port |
server_edns_buffer_size | server_prefetch | server_prefetch_key |
server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
server_log_queries | server_log_replies | server_tcp_upstream | server_ssl_upstream |
+ server_log_local_actions |
server_ssl_service_key | server_ssl_service_pem | server_ssl_port |
server_minimal_responses | server_rrset_roundrobin | server_max_udp_size |
server_so_reuseport | server_delay_close |
server_unblock_lan_zones | server_insecure_lan_zones |
- server_dns64_prefix | server_dns64_synthall |
+ server_dns64_prefix | server_dns64_synthall | server_dns64_ignore_aaaa |
server_infra_cache_min_rtt | server_harden_algo_downgrade |
server_ip_transparent | server_ip_ratelimit | server_ratelimit |
server_ip_ratelimit_slabs | server_ratelimit_slabs |
@@ -239,6 +244,7 @@ content_server: server_num_threads | server_verbosity | server_port |
server_local_zone_override | server_access_control_tag_action |
server_access_control_tag_data | server_access_control_view |
server_qname_minimisation_strict | server_serve_expired |
+ server_serve_expired_ttl | server_serve_expired_ttl_reset |
server_fake_dsa | server_log_identity | server_use_systemd |
server_response_ip_tag | server_response_ip | server_response_ip_data |
server_shm_enable | server_shm_key | server_fake_sha1 |
@@ -249,7 +255,8 @@ content_server: server_num_threads | server_verbosity | server_port |
server_ipsecmod_whitelist | server_ipsecmod_strict |
server_udp_upstream_without_downstream | server_aggressive_nsec |
server_tls_cert_bundle | server_tls_additional_port | server_low_rtt |
- server_low_rtt_permil | server_tls_win_cert
+ server_low_rtt_permil | server_tls_win_cert |
+ server_tcp_connection_limit | server_log_servfail
;
stubstart: VAR_STUB_ZONE
{
@@ -266,7 +273,7 @@ stubstart: VAR_STUB_ZONE
contents_stub: contents_stub content_stub
| ;
content_stub: stub_name | stub_host | stub_addr | stub_prime | stub_first |
- stub_ssl_upstream
+ stub_no_cache | stub_ssl_upstream
;
forwardstart: VAR_FORWARD_ZONE
{
@@ -283,7 +290,7 @@ forwardstart: VAR_FORWARD_ZONE
contents_forward: contents_forward content_forward
| ;
content_forward: forward_name | forward_host | forward_addr | forward_first |
- forward_ssl_upstream
+ forward_no_cache | forward_ssl_upstream
;
viewstart: VAR_VIEW
{
@@ -631,6 +638,41 @@ server_outgoing_tcp_mss: VAR_OUTGOING_TCP_MSS STRING_ARG
free($2);
}
;
+server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG
+ {
+ OUTYY(("P(server_tcp_idle_timeout:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else if (atoi($2) > 120000)
+ cfg_parser->cfg->tcp_idle_timeout = 120000;
+ else if (atoi($2) < 1)
+ cfg_parser->cfg->tcp_idle_timeout = 1;
+ else cfg_parser->cfg->tcp_idle_timeout = atoi($2);
+ free($2);
+ }
+ ;
+server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG
+ {
+ OUTYY(("P(server_tcp_keepalive:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->do_tcp_keepalive = (strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
+server_tcp_keepalive_timeout: VAR_EDNS_TCP_KEEPALIVE_TIMEOUT STRING_ARG
+ {
+ OUTYY(("P(server_tcp_keepalive_timeout:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else if (atoi($2) > 6553500)
+ cfg_parser->cfg->tcp_keepalive_timeout = 6553500;
+ else if (atoi($2) < 1)
+ cfg_parser->cfg->tcp_keepalive_timeout = 0;
+ else cfg_parser->cfg->tcp_keepalive_timeout = atoi($2);
+ free($2);
+ }
+ ;
server_tcp_upstream: VAR_TCP_UPSTREAM STRING_ARG
{
OUTYY(("P(server_tcp_upstream:%s)\n", $2));
@@ -764,6 +806,24 @@ server_log_replies: VAR_LOG_REPLIES STRING_ARG
free($2);
}
;
+server_log_servfail: VAR_LOG_SERVFAIL STRING_ARG
+ {
+ OUTYY(("P(server_log_servfail:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->log_servfail = (strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
+server_log_local_actions: VAR_LOG_LOCAL_ACTIONS STRING_ARG
+ {
+ OUTYY(("P(server_log_local_actions:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->log_local_actions = (strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
server_chroot: VAR_CHROOT STRING_ARG
{
OUTYY(("P(server_chroot:%s)\n", $2));
@@ -1462,6 +1522,24 @@ server_serve_expired: VAR_SERVE_EXPIRED STRING_ARG
free($2);
}
;
+server_serve_expired_ttl: VAR_SERVE_EXPIRED_TTL STRING_ARG
+ {
+ OUTYY(("P(server_serve_expired_ttl:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->serve_expired_ttl = atoi($2);
+ free($2);
+ }
+ ;
+server_serve_expired_ttl_reset: VAR_SERVE_EXPIRED_TTL_RESET STRING_ARG
+ {
+ OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
server_fake_dsa: VAR_FAKE_DSA STRING_ARG
{
OUTYY(("P(server_fake_dsa:%s)\n", $2));
@@ -1663,6 +1741,14 @@ server_dns64_synthall: VAR_DNS64_SYNTHALL STRING_ARG
free($2);
}
;
+server_dns64_ignore_aaaa: VAR_DNS64_IGNORE_AAAA STRING_ARG
+ {
+ OUTYY(("P(dns64_ignore_aaaa:%s)\n", $2));
+ if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
+ $2))
+ fatal_exit("out of memory adding dns64-ignore-aaaa");
+ }
+ ;
server_define_tag: VAR_DEFINE_TAG STRING_ARG
{
char* p, *s = $2;
@@ -2031,6 +2117,15 @@ stub_first: VAR_STUB_FIRST STRING_ARG
free($2);
}
;
+stub_no_cache: VAR_STUB_NO_CACHE STRING_ARG
+ {
+ OUTYY(("P(stub-no-cache:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->stubs->no_cache=(strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
stub_ssl_upstream: VAR_STUB_SSL_UPSTREAM STRING_ARG
{
OUTYY(("P(stub-ssl-upstream:%s)\n", $2));
@@ -2084,6 +2179,15 @@ forward_first: VAR_FORWARD_FIRST STRING_ARG
free($2);
}
;
+forward_no_cache: VAR_FORWARD_NO_CACHE STRING_ARG
+ {
+ OUTYY(("P(forward-no-cache:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else cfg_parser->cfg->forwards->no_cache=(strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
forward_ssl_upstream: VAR_FORWARD_SSL_UPSTREAM STRING_ARG
{
OUTYY(("P(forward-ssl-upstream:%s)\n", $2));
@@ -2681,6 +2785,17 @@ redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG
free($2);
}
;
+server_tcp_connection_limit: VAR_TCP_CONNECTION_LIMIT STRING_ARG STRING_ARG
+ {
+ OUTYY(("P(server_tcp_connection_limit:%s %s)\n", $2, $3));
+ if (atoi($3) < 0)
+ yyerror("positive number expected");
+ else {
+ if(!cfg_str2list_insert(&cfg_parser->cfg->tcp_connection_limits, $2, $3))
+ fatal_exit("out of memory adding tcp connection limit");
+ }
+ }
+ ;
%%
/* parse helper routines could be here */
diff --git a/util/data/msgparse.h b/util/data/msgparse.h
index e21f8504ea7d..c0c6ff5fd09f 100644
--- a/util/data/msgparse.h
+++ b/util/data/msgparse.h
@@ -79,6 +79,8 @@ extern time_t MAX_TTL;
extern time_t MIN_TTL;
/** Maximum Negative TTL that is allowed */
extern time_t MAX_NEG_TTL;
+/** Time to serve records after expiration */
+extern time_t SERVE_EXPIRED_TTL;
/** Negative cache time (for entries without any RRs.) */
#define NORR_TTL 5 /* seconds */
diff --git a/util/data/msgreply.c b/util/data/msgreply.c
index 772f5d1f1029..540d7d4b3dec 100644
--- a/util/data/msgreply.c
+++ b/util/data/msgreply.c
@@ -61,6 +61,8 @@ time_t MAX_TTL = 3600 * 24 * 10; /* ten days */
time_t MIN_TTL = 0;
/** MAX Negative TTL, for SOA records in authority section */
time_t MAX_NEG_TTL = 3600; /* one hour */
+/** Time to serve records after expiration */
+time_t SERVE_EXPIRED_TTL = 0;
/** allocate qinfo, return 0 on error */
static int
@@ -85,8 +87,8 @@ parse_create_qinfo(sldns_buffer* pkt, struct msg_parse* msg,
/** constructor for replyinfo */
struct reply_info*
construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
- time_t ttl, time_t prettl, size_t an, size_t ns, size_t ar,
- size_t total, enum sec_status sec)
+ time_t ttl, time_t prettl, time_t expttl, size_t an, size_t ns,
+ size_t ar, size_t total, enum sec_status sec)
{
struct reply_info* rep;
/* rrset_count-1 because the first ref is part of the struct. */
@@ -103,6 +105,7 @@ construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
rep->qdcount = qd;
rep->ttl = ttl;
rep->prefetch_ttl = prettl;
+ rep->serve_expired_ttl = expttl;
rep->an_numrrsets = an;
rep->ns_numrrsets = ns;
rep->ar_numrrsets = ar;
@@ -126,7 +129,7 @@ parse_create_repinfo(struct msg_parse* msg, struct reply_info** rep,
struct regional* region)
{
*rep = construct_reply_info_base(region, msg->flags, msg->qdcount, 0,
- 0, msg->an_rrsets, msg->ns_rrsets, msg->ar_rrsets,
+ 0, 0, msg->an_rrsets, msg->ns_rrsets, msg->ar_rrsets,
msg->rrset_count, sec_status_unchecked);
if(!*rep)
return 0;
@@ -424,6 +427,7 @@ parse_copy_decompress(sldns_buffer* pkt, struct msg_parse* msg,
pset = pset->rrset_all_next;
}
rep->prefetch_ttl = PREFETCH_TTL_CALC(rep->ttl);
+ rep->serve_expired_ttl = rep->ttl + SERVE_EXPIRED_TTL;
return 1;
}
@@ -502,6 +506,7 @@ reply_info_set_ttls(struct reply_info* rep, time_t timenow)
size_t i, j;
rep->ttl += timenow;
rep->prefetch_ttl += timenow;
+ rep->serve_expired_ttl += timenow;
for(i=0; i<rep->rrset_count; i++) {
struct packed_rrset_data* data = (struct packed_rrset_data*)
rep->ref[i].key->entry.data;
@@ -687,9 +692,9 @@ reply_info_copy(struct reply_info* rep, struct alloc_cache* alloc,
{
struct reply_info* cp;
cp = construct_reply_info_base(region, rep->flags, rep->qdcount,
- rep->ttl, rep->prefetch_ttl, rep->an_numrrsets,
- rep->ns_numrrsets, rep->ar_numrrsets, rep->rrset_count,
- rep->security);
+ rep->ttl, rep->prefetch_ttl, rep->serve_expired_ttl,
+ rep->an_numrrsets, rep->ns_numrrsets, rep->ar_numrrsets,
+ rep->rrset_count, rep->security);
if(!cp)
return NULL;
/* allocate ub_key structures special or not */
@@ -913,8 +918,9 @@ parse_reply_in_temp_region(sldns_buffer* pkt, struct regional* region,
}
memset(msg, 0, sizeof(*msg));
sldns_buffer_set_position(pkt, 0);
- if(parse_packet(pkt, msg, region) != 0)
+ if(parse_packet(pkt, msg, region) != 0){
return 0;
+ }
if(!parse_create_msg(pkt, msg, NULL, qi, &rep, region)) {
return 0;
}
@@ -1013,7 +1019,7 @@ static int inplace_cb_reply_call_generic(
struct inplace_cb* callback_list, enum inplace_cb_list_type type,
struct query_info* qinfo, struct module_qstate* qstate,
struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
+ struct comm_reply* repinfo, struct regional* region)
{
struct inplace_cb* cb;
struct edns_option* opt_list_out = NULL;
@@ -1026,7 +1032,7 @@ static int inplace_cb_reply_call_generic(
fptr_ok(fptr_whitelist_inplace_cb_reply_generic(
(inplace_cb_reply_func_type*)cb->cb, type));
(void)(*(inplace_cb_reply_func_type*)cb->cb)(qinfo, qstate, rep,
- rcode, edns, &opt_list_out, region, cb->id, cb->cb_arg);
+ rcode, edns, &opt_list_out, repinfo, region, cb->id, cb->cb_arg);
}
edns->opt_list = opt_list_out;
return 1;
@@ -1034,44 +1040,45 @@ static int inplace_cb_reply_call_generic(
int inplace_cb_reply_call(struct module_env* env, struct query_info* qinfo,
struct module_qstate* qstate, struct reply_info* rep, int rcode,
- struct edns_data* edns, struct regional* region)
+ struct edns_data* edns, struct comm_reply* repinfo, struct regional* region)
{
return inplace_cb_reply_call_generic(
env->inplace_cb_lists[inplace_cb_reply], inplace_cb_reply, qinfo,
- qstate, rep, rcode, edns, region);
+ qstate, rep, rcode, edns, repinfo, region);
}
int inplace_cb_reply_cache_call(struct module_env* env,
struct query_info* qinfo, struct module_qstate* qstate,
struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
+ struct comm_reply* repinfo, struct regional* region)
{
return inplace_cb_reply_call_generic(
env->inplace_cb_lists[inplace_cb_reply_cache], inplace_cb_reply_cache,
- qinfo, qstate, rep, rcode, edns, region);
+ qinfo, qstate, rep, rcode, edns, repinfo, region);
}
int inplace_cb_reply_local_call(struct module_env* env,
struct query_info* qinfo, struct module_qstate* qstate,
struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
+ struct comm_reply* repinfo, struct regional* region)
{
return inplace_cb_reply_call_generic(
env->inplace_cb_lists[inplace_cb_reply_local], inplace_cb_reply_local,
- qinfo, qstate, rep, rcode, edns, region);
+ qinfo, qstate, rep, rcode, edns, repinfo, region);
}
int inplace_cb_reply_servfail_call(struct module_env* env,
struct query_info* qinfo, struct module_qstate* qstate,
struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region)
+ struct comm_reply* repinfo, struct regional* region)
{
/* We are going to servfail. Remove any potential edns options. */
if(qstate)
qstate->edns_opts_front_out = NULL;
return inplace_cb_reply_call_generic(
env->inplace_cb_lists[inplace_cb_reply_servfail],
- inplace_cb_reply_servfail, qinfo, qstate, rep, rcode, edns, region);
+ inplace_cb_reply_servfail, qinfo, qstate, rep, rcode, edns, repinfo,
+ region);
}
int inplace_cb_query_call(struct module_env* env, struct query_info* qinfo,
diff --git a/util/data/msgreply.h b/util/data/msgreply.h
index 60e6438a84ab..a455c4d2b374 100644
--- a/util/data/msgreply.h
+++ b/util/data/msgreply.h
@@ -156,6 +156,12 @@ struct reply_info {
*/
time_t prefetch_ttl;
+ /**
+ * Reply TTL extended with serve exipred TTL, to limit time to serve
+ * expired message.
+ */
+ time_t serve_expired_ttl;
+
/**
* The security status from DNSSEC validation of this message.
*/
@@ -222,6 +228,7 @@ struct msgreply_entry {
* @param qd: qd count
* @param ttl: TTL of replyinfo
* @param prettl: prefetch ttl
+ * @param expttl: serve expired ttl
* @param an: an count
* @param ns: ns count
* @param ar: ar count
@@ -232,8 +239,8 @@ struct msgreply_entry {
*/
struct reply_info*
construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd,
- time_t ttl, time_t prettl, size_t an, size_t ns, size_t ar,
- size_t total, enum sec_status sec);
+ time_t ttl, time_t prettl, time_t expttl, size_t an, size_t ns,
+ size_t ar, size_t total, enum sec_status sec);
/**
* Parse wire query into a queryinfo structure, return 0 on parse error.
@@ -545,12 +552,13 @@ struct edns_option* edns_opt_list_find(struct edns_option* list, uint16_t code);
* @param rep: Reply info. Could be NULL.
* @param rcode: return code.
* @param edns: edns data of the reply.
+ * @param repinfo: comm_reply. NULL.
* @param region: region to store data.
* @return false on failure (a callback function returned an error).
*/
int inplace_cb_reply_call(struct module_env* env, struct query_info* qinfo,
struct module_qstate* qstate, struct reply_info* rep, int rcode,
- struct edns_data* edns, struct regional* region);
+ struct edns_data* edns, struct comm_reply* repinfo, struct regional* region);
/**
* Call the registered functions in the inplace_cb_reply_cache linked list.
@@ -561,13 +569,14 @@ int inplace_cb_reply_call(struct module_env* env, struct query_info* qinfo,
* @param rep: Reply info.
* @param rcode: return code.
* @param edns: edns data of the reply. Edns input can be found here.
+ * @param repinfo: comm_reply. Reply information for a communication point.
* @param region: region to store data.
* @return false on failure (a callback function returned an error).
*/
int inplace_cb_reply_cache_call(struct module_env* env,
struct query_info* qinfo, struct module_qstate* qstate,
struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region);
+ struct comm_reply* repinfo, struct regional* region);
/**
* Call the registered functions in the inplace_cb_reply_local linked list.
@@ -578,13 +587,14 @@ int inplace_cb_reply_cache_call(struct module_env* env,
* @param rep: Reply info.
* @param rcode: return code.
* @param edns: edns data of the reply. Edns input can be found here.
+ * @param repinfo: comm_reply. Reply information for a communication point.
* @param region: region to store data.
* @return false on failure (a callback function returned an error).
*/
int inplace_cb_reply_local_call(struct module_env* env,
struct query_info* qinfo, struct module_qstate* qstate,
struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region);
+ struct comm_reply* repinfo, struct regional* region);
/**
* Call the registered functions in the inplace_cb_reply linked list.
@@ -596,13 +606,14 @@ int inplace_cb_reply_local_call(struct module_env* env,
* @param rcode: return code. LDNS_RCODE_SERVFAIL.
* @param edns: edns data of the reply. Edns input can be found here if qstate
* is NULL.
+ * @param repinfo: comm_reply. Reply information for a communication point.
* @param region: region to store data.
* @return false on failure (a callback function returned an error).
*/
int inplace_cb_reply_servfail_call(struct module_env* env,
struct query_info* qinfo, struct module_qstate* qstate,
struct reply_info* rep, int rcode, struct edns_data* edns,
- struct regional* region);
+ struct comm_reply* repinfo, struct regional* region);
/**
* Call the registered functions in the inplace_cb_query linked list.
diff --git a/util/edns.c b/util/edns.c
new file mode 100644
index 000000000000..2c4e4a1fd275
--- /dev/null
+++ b/util/edns.c
@@ -0,0 +1,83 @@
+/*
+ * util/edns.c - handle base EDNS options.
+ *
+ * Copyright (c) 2018, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains functions for base EDNS options.
+ */
+
+#include "config.h"
+
+#include "util/config_file.h"
+#include "util/netevent.h"
+#include "util/regional.h"
+#include "util/data/msgparse.h"
+#include "util/data/msgreply.h"
+
+static int edns_keepalive(struct edns_data* edns_out, struct edns_data* edns_in,
+ struct comm_point* c, struct regional* region)
+{
+ if(c->type == comm_udp)
+ return 1;
+
+ /* To respond with a Keepalive option, the client connection
+ * must have received one message with a TCP Keepalive EDNS option,
+ * and that option must have 0 length data. Subsequent messages
+ * sent on that connection will have a TCP Keepalive option.
+ */
+ if(c->tcp_keepalive ||
+ edns_opt_list_find(edns_in->opt_list, LDNS_EDNS_KEEPALIVE)) {
+ int keepalive = c->tcp_timeout_msec / 100;
+ uint8_t data[2];
+ data[0] = (uint8_t)((keepalive >> 8) & 0xff);
+ data[1] = (uint8_t)(keepalive & 0xff);
+ if(!edns_opt_list_append(&edns_out->opt_list, LDNS_EDNS_KEEPALIVE,
+ sizeof(data), data, region))
+ return 0;
+ c->tcp_keepalive = 1;
+ }
+ return 1;
+}
+
+int apply_edns_options(struct edns_data* edns_out, struct edns_data* edns_in,
+ struct config_file* cfg, struct comm_point* c, struct regional* region)
+{
+ if(cfg->do_tcp_keepalive &&
+ !edns_keepalive(edns_out, edns_in, c, region))
+ return 0;
+
+ return 1;
+}
diff --git a/util/edns.h b/util/edns.h
new file mode 100644
index 000000000000..a4ee7def634c
--- /dev/null
+++ b/util/edns.h
@@ -0,0 +1,62 @@
+/*
+ * util/edns.h - handle base EDNS options.
+ *
+ * Copyright (c) 2018, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains functions for base EDNS options.
+ */
+
+#ifndef UTIL_EDNS_H
+#define UTIL_EDNS_H
+
+struct edns_data;
+struct config_file;
+struct comm_point;
+struct regional;
+
+/**
+ * Apply common EDNS options.
+ *
+ * @param edns_out: initialised edns information with outbound edns.
+ * @param edns_in: initialised edns information with received edns.
+ * @param cfg: configuration.
+ * @param c: comm channel.
+ * @param region: the region to allocate the edns options in.
+ */
+int apply_edns_options(struct edns_data* edns_out, struct edns_data* edns_in,
+ struct config_file* cfg, struct comm_point* c, struct regional* region);
+
+#endif
diff --git a/util/iana_ports.inc b/util/iana_ports.inc
index b35cf7d29b0c..55d041e4084a 100644
--- a/util/iana_ports.inc
+++ b/util/iana_ports.inc
@@ -4741,6 +4741,7 @@
8020,
8021,
8022,
+8023,
8025,
8026,
8032,
@@ -4917,6 +4918,7 @@
9104,
9105,
9106,
+9111,
9119,
9131,
9160,
diff --git a/util/module.c b/util/module.c
index f4b715d141b1..f16583183bfe 100644
--- a/util/module.c
+++ b/util/module.c
@@ -236,3 +236,13 @@ log_edns_known_options(enum verbosity_value level, struct module_env* env)
}
}
}
+
+void
+copy_state_to_super(struct module_qstate* qstate, int ATTR_UNUSED(id),
+ struct module_qstate* super)
+{
+ /* Overwrite super's was_ratelimited only when it was not set */
+ if(!super->was_ratelimited) {
+ super->was_ratelimited = qstate->was_ratelimited;
+ }
+}
diff --git a/util/module.h b/util/module.h
index c6e5164de6d6..1b9aed216c7b 100644
--- a/util/module.h
+++ b/util/module.h
@@ -236,8 +236,8 @@ struct inplace_cb {
/**
* Inplace callback function called before replying.
- * Called as func(edns, qstate, opt_list_out, qinfo, reply_info, rcode,
- * region, python_callback)
+ * Called as func(qinfo, qstate, rep, rcode, edns, opt_list_out, repinfo,
+ * region, id, python_callback)
* Where:
* qinfo: the query info.
* qstate: the module state. NULL when calling before the query reaches the
@@ -247,18 +247,23 @@ struct inplace_cb {
* edns: the edns_data of the reply. When qstate is NULL, it is also used as
* the edns input.
* opt_list_out: the edns options list for the reply.
+ * repinfo: reply information for a communication point. NULL when calling
+ * during the mesh states; the same could be found from
+ * qstate->mesh_info->reply_list.
* region: region to store data.
+ * id: module id.
* python_callback: only used for registering a python callback function.
*/
typedef int inplace_cb_reply_func_type(struct query_info* qinfo,
struct module_qstate* qstate, struct reply_info* rep, int rcode,
- struct edns_data* edns, struct edns_option** opt_list_out,
- struct regional* region, int id, void* callback);
+ struct edns_data* edns, struct edns_option** opt_list_out,
+ struct comm_reply* repinfo, struct regional* region, int id,
+ void* callback);
/**
* Inplace callback function called before sending the query to a nameserver.
* Called as func(qinfo, flags, qstate, addr, addrlen, zone, zonelen, region,
- * python_callback)
+ * id, python_callback)
* Where:
* qinfo: query info.
* flags: flags of the query.
@@ -270,6 +275,7 @@ typedef int inplace_cb_reply_func_type(struct query_info* qinfo,
* authoritative.
* zonelen: length of zone.
* region: region to store data.
+ * id: module id.
* python_callback: only used for registering a python callback function.
*/
typedef int inplace_cb_query_func_type(struct query_info* qinfo, uint16_t flags,
@@ -279,10 +285,10 @@ typedef int inplace_cb_query_func_type(struct query_info* qinfo, uint16_t flags,
/**
* Inplace callback function called after parsing edns on query reply.
- * Called as func(qstate, cb_args)
+ * Called as func(qstate, id, cb_args)
* Where:
- * qstate: the query state
- * id: module id
+ * qstate: the query state.
+ * id: module id.
* cb_args: argument passed when registering callback.
*/
typedef int inplace_cb_edns_back_parsed_func_type(struct module_qstate* qstate,
@@ -290,11 +296,11 @@ typedef int inplace_cb_edns_back_parsed_func_type(struct module_qstate* qstate,
/**
* Inplace callback function called after parsing query response.
- * Called as func(qstate, id, cb_args)
+ * Called as func(qstate, response, id, cb_args)
* Where:
- * qstate: the query state
- * response: query response
- * id: module id
+ * qstate: the query state.
+ * response: query response.
+ * id: module id.
* cb_args: argument passed when registering callback.
*/
typedef int inplace_cb_query_response_func_type(struct module_qstate* qstate,
@@ -621,6 +627,8 @@ struct module_qstate {
int no_cache_store;
/** whether to refetch a fresh answer on finishing this state*/
int need_refetch;
+ /** whether the query (or a subquery) was ratelimited */
+ int was_ratelimited;
/**
* Attributes of clients that share the qstate that may affect IP-based
@@ -819,4 +827,14 @@ int unique_mesh_state(struct edns_option* list, struct module_env* env);
void log_edns_known_options(enum verbosity_value level,
struct module_env* env);
+/**
+ * Copy state that may have happened in the subquery and is always relevant to
+ * the super.
+ * @param qstate: query state that finished.
+ * @param id: module id.
+ * @param super: the qstate to inform.
+ */
+void copy_state_to_super(struct module_qstate* qstate, int id,
+ struct module_qstate* super);
+
#endif /* UTIL_MODULE_H */
diff --git a/util/net_help.c b/util/net_help.c
index a5059b0addc1..91368c847597 100644
--- a/util/net_help.c
+++ b/util/net_help.c
@@ -410,7 +410,7 @@ void log_err_addr(const char* str, const char* err,
if(verbosity >= 4)
log_err("%s: %s for %s port %d (len %d)", str, err, dest,
(int)port, (int)addrlen);
- else log_err("%s: %s for %s", str, err, dest);
+ else log_err("%s: %s for %s port %d", str, err, dest, (int)port);
}
int
diff --git a/util/netevent.c b/util/netevent.c
index 5cc8606fad3e..373538041420 100644
--- a/util/netevent.c
+++ b/util/netevent.c
@@ -43,6 +43,7 @@
#include "util/ub_event.h"
#include "util/log.h"
#include "util/net_help.h"
+#include "util/tcp_conn_limit.h"
#include "util/fptr_wlist.h"
#include "sldns/pkthdr.h"
#include "sldns/sbuffer.h"
@@ -82,10 +83,11 @@
# endif
#endif
-/** The TCP reading or writing query timeout in milliseconds */
+/** The TCP writing query timeout in milliseconds */
#define TCP_QUERY_TIMEOUT 120000
-/** The TCP timeout in msec for fast queries, above half are used */
-#define TCP_QUERY_TIMEOUT_FAST 200
+/** The minimum actual TCP timeout to use, regardless of what we advertise,
+ * in msec */
+#define TCP_QUERY_TIMEOUT_MINIMUM 200
#ifndef NONBLOCKING_IS_BROKEN
/** number of UDP reads to perform per read indication from select */
@@ -728,6 +730,7 @@ comm_point_udp_callback(int fd, short event, void* arg)
static void
setup_tcp_handler(struct comm_point* c, int fd, int cur, int max)
{
+ int handler_usage;
log_assert(c->type == comm_tcp);
log_assert(c->fd == -1);
sldns_buffer_clear(c->buffer);
@@ -737,13 +740,29 @@ setup_tcp_handler(struct comm_point* c, int fd, int cur, int max)
#endif
c->tcp_is_reading = 1;
c->tcp_byte_count = 0;
- c->tcp_timeout_msec = TCP_QUERY_TIMEOUT;
/* if more than half the tcp handlers are in use, use a shorter
* timeout for this TCP connection, we need to make space for
* other connections to be able to get attention */
- if(cur > max/2)
- c->tcp_timeout_msec = TCP_QUERY_TIMEOUT_FAST;
- comm_point_start_listening(c, fd, c->tcp_timeout_msec);
+ /* If > 50% TCP handler structures in use, set timeout to 1/100th
+ * configured value.
+ * If > 65%TCP handler structures in use, set to 1/500th configured
+ * value.
+ * If > 80% TCP handler structures in use, set to 0.
+ *
+ * If the timeout to use falls below 200 milliseconds, an actual
+ * timeout of 200ms is used.
+ */
+ handler_usage = (cur * 100) / max;
+ if(handler_usage > 50 && handler_usage <= 65)
+ c->tcp_timeout_msec /= 100;
+ else if (handler_usage > 65 && handler_usage <= 80)
+ c->tcp_timeout_msec /= 500;
+ else if (handler_usage > 80)
+ c->tcp_timeout_msec = 0;
+ comm_point_start_listening(c, fd,
+ c->tcp_timeout_msec < TCP_QUERY_TIMEOUT_MINIMUM
+ ? TCP_QUERY_TIMEOUT_MINIMUM
+ : c->tcp_timeout_msec);
}
void comm_base_handle_slow_accept(int ATTR_UNUSED(fd),
@@ -832,6 +851,16 @@ int comm_point_perform_accept(struct comm_point* c,
#endif
return -1;
}
+ if(c->tcp_conn_limit && c->type == comm_tcp_accept) {
+ c->tcl_addr = tcl_addr_lookup(c->tcp_conn_limit, addr, *addrlen);
+ if(!tcl_new_connection(c->tcl_addr)) {
+ if(verbosity >= 3)
+ log_err_addr("accept rejected",
+ "connection limit exceeded", addr, *addrlen);
+ close(new_fd);
+ return -1;
+ }
+ }
#ifndef HAVE_ACCEPT4
fd_set_nonblock(new_fd);
#endif
@@ -2525,6 +2554,10 @@ comm_point_create_tcp_handler(struct comm_base *base,
c->tcp_is_reading = 0;
c->tcp_byte_count = 0;
c->tcp_parent = parent;
+ c->tcp_timeout_msec = parent->tcp_timeout_msec;
+ c->tcp_conn_limit = parent->tcp_conn_limit;
+ c->tcl_addr = NULL;
+ c->tcp_keepalive = 0;
c->max_tcp_count = 0;
c->cur_tcp_count = 0;
c->tcp_handlers = NULL;
@@ -2565,7 +2598,8 @@ comm_point_create_tcp_handler(struct comm_base *base,
}
struct comm_point*
-comm_point_create_tcp(struct comm_base *base, int fd, int num, size_t bufsize,
+comm_point_create_tcp(struct comm_base *base, int fd, int num,
+ int idle_timeout, struct tcl_list* tcp_conn_limit, size_t bufsize,
comm_point_callback_type* callback, void* callback_arg)
{
struct comm_point* c = (struct comm_point*)calloc(1,
@@ -2587,6 +2621,10 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, size_t bufsize,
c->timeout = NULL;
c->tcp_is_reading = 0;
c->tcp_byte_count = 0;
+ c->tcp_timeout_msec = idle_timeout;
+ c->tcp_conn_limit = tcp_conn_limit;
+ c->tcl_addr = NULL;
+ c->tcp_keepalive = 0;
c->tcp_parent = NULL;
c->max_tcp_count = num;
c->cur_tcp_count = 0;
@@ -2665,6 +2703,10 @@ comm_point_create_tcp_out(struct comm_base *base, size_t bufsize,
c->timeout = NULL;
c->tcp_is_reading = 0;
c->tcp_byte_count = 0;
+ c->tcp_timeout_msec = TCP_QUERY_TIMEOUT;
+ c->tcp_conn_limit = NULL;
+ c->tcl_addr = NULL;
+ c->tcp_keepalive = 0;
c->tcp_parent = NULL;
c->max_tcp_count = 0;
c->cur_tcp_count = 0;
@@ -2906,6 +2948,7 @@ comm_point_close(struct comm_point* c)
log_err("could not event_del on close");
}
}
+ tcl_close_connection(c->tcl_addr);
/* close fd after removing from event lists, or epoll.. is messed up */
if(c->fd != -1 && !c->do_not_close) {
if(c->type == comm_tcp || c->type == comm_http) {
diff --git a/util/netevent.h b/util/netevent.h
index 6819f57f8d9e..f6b6af688b94 100644
--- a/util/netevent.h
+++ b/util/netevent.h
@@ -65,6 +65,7 @@
struct sldns_buffer;
struct comm_point;
struct comm_reply;
+struct tcl_list;
struct ub_event_base;
/* internal event notification data storage structure. */
@@ -256,9 +257,17 @@ struct comm_point {
/** timeout in msec for TCP wait times for this connection */
int tcp_timeout_msec;
+ /** if set, tcp keepalive is enabled on this connection */
+ int tcp_keepalive;
+
/** if set, checks for pending error from nonblocking connect() call.*/
int tcp_check_nb_connect;
+ /** if set, check for connection limit on tcp accept. */
+ struct tcl_list* tcp_conn_limit;
+ /** the entry for the connection. */
+ struct tcl_addr* tcl_addr;
+
#ifdef USE_MSG_FASTOPEN
/** used to track if the sendto() call should be done when using TFO. */
int tcp_do_fastopen;
@@ -443,6 +452,8 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
* @param fd: file descriptor of open TCP socket set to listen nonblocking.
* @param num: becomes max_tcp_count, the routine allocates that
* many tcp handler commpoints.
+ * @param idle_timeout: TCP idle timeout in ms.
+ * @param tcp_conn_limit: TCP connection limit info.
* @param bufsize: size of buffer to create for handlers.
* @param callback: callback function pointer for TCP handlers.
* @param callback_arg: will be passed to your callback function.
@@ -452,8 +463,8 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
* Inits timeout to NULL. All handlers are on the free list.
*/
struct comm_point* comm_point_create_tcp(struct comm_base* base,
- int fd, int num, size_t bufsize,
- comm_point_callback_type* callback, void* callback_arg);
+ int fd, int num, int idle_timeout, struct tcl_list* tcp_conn_limit,
+ size_t bufsize, comm_point_callback_type* callback, void* callback_arg);
/**
* Create an outgoing TCP commpoint. No file descriptor is opened, left at -1.
diff --git a/util/rtt.c b/util/rtt.c
index 5d86f13378e5..f51576fb57fa 100644
--- a/util/rtt.c
+++ b/util/rtt.c
@@ -41,6 +41,7 @@
*/
#include "config.h"
#include "util/rtt.h"
+#include "iterator/iterator.h"
/* overwritten by config: infra_cache_min_rtt: */
int RTT_MIN_TIMEOUT = 50;
@@ -61,7 +62,7 @@ void
rtt_init(struct rtt_info* rtt)
{
rtt->srtt = 0;
- rtt->rttvar = 94;
+ rtt->rttvar = UNKNOWN_SERVER_NICENESS/4;
rtt->rto = calc_rto(rtt);
/* default value from the book is 0 + 4*0.75 = 3 seconds */
/* first RTO is 0 + 4*0.094 = 0.376 seconds */
diff --git a/util/storage/slabhash.c b/util/storage/slabhash.c
index ae63b97727ee..a6c3d0fa6490 100644
--- a/util/storage/slabhash.c
+++ b/util/storage/slabhash.c
@@ -153,6 +153,19 @@ size_t slabhash_get_size(struct slabhash* sl)
return total;
}
+int slabhash_is_size(struct slabhash* sl, size_t size, size_t slabs)
+{
+ /* divide by slabs and then multiply by the number of slabs,
+ * because if the size is not an even multiple of slabs, the
+ * uneven amount needs to be removed for comparison */
+ if(!sl) return 0;
+ if(sl->size != slabs) return 0;
+ if(slabs == 0) return 0;
+ if( (size/slabs)*slabs == slabhash_get_size(sl))
+ return 1;
+ return 0;
+}
+
size_t slabhash_get_mem(struct slabhash* sl)
{
size_t i, total = sizeof(*sl);
diff --git a/util/storage/slabhash.h b/util/storage/slabhash.h
index 2ecf6fe719a7..4ecb60421678 100644
--- a/util/storage/slabhash.h
+++ b/util/storage/slabhash.h
@@ -153,6 +153,15 @@ void slabhash_status(struct slabhash* table, const char* id, int extended);
size_t slabhash_get_size(struct slabhash* table);
/**
+ * See if slabhash is of given (size, slabs) configuration.
+ * @param table: hash table
+ * @param size: max size to test for
+ * @param slabs: slab count to test for.
+ * @return true if equal
+ */
+int slabhash_is_size(struct slabhash* table, size_t size, size_t slabs);
+
+/**
* Retrieve slab hash current memory use.
* @param table: hash table.
* @return memory in use.
diff --git a/util/tcp_conn_limit.c b/util/tcp_conn_limit.c
new file mode 100644
index 000000000000..d7d86a5407b5
--- /dev/null
+++ b/util/tcp_conn_limit.c
@@ -0,0 +1,194 @@
+/*
+ * daemon/tcp_conn_limit.c - client TCP connection limit storage for the server.
+ *
+ * Copyright (c) 2018, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file helps the server discard excess TCP connections.
+ */
+#include "config.h"
+#include "util/regional.h"
+#include "util/log.h"
+#include "util/config_file.h"
+#include "util/net_help.h"
+#include "util/tcp_conn_limit.h"
+#include "services/localzone.h"
+#include "sldns/str2wire.h"
+
+struct tcl_list*
+tcl_list_create(void)
+{
+ struct tcl_list* tcl = (struct tcl_list*)calloc(1,
+ sizeof(struct tcl_list));
+ if(!tcl)
+ return NULL;
+ tcl->region = regional_create();
+ if(!tcl->region) {
+ tcl_list_delete(tcl);
+ return NULL;
+ }
+ return tcl;
+}
+
+static void
+tcl_list_free_node(rbnode_type* node, void* ATTR_UNUSED(arg))
+{
+ struct tcl_addr* n = (struct tcl_addr*) node;
+ lock_quick_destroy(&n->lock);
+#ifdef THREADS_DISABLED
+ (void)n;
+#endif
+}
+
+void
+tcl_list_delete(struct tcl_list* tcl)
+{
+ if(!tcl)
+ return;
+ traverse_postorder(&tcl->tree, tcl_list_free_node, NULL);
+ regional_destroy(tcl->region);
+ free(tcl);
+}
+
+/** insert new address into tcl_list structure */
+static struct tcl_addr*
+tcl_list_insert(struct tcl_list* tcl, struct sockaddr_storage* addr,
+ socklen_t addrlen, int net, uint32_t limit,
+ int complain_duplicates)
+{
+ struct tcl_addr* node = regional_alloc_zero(tcl->region,
+ sizeof(struct tcl_addr));
+ if(!node)
+ return NULL;
+ lock_quick_init(&node->lock);
+ node->limit = limit;
+ if(!addr_tree_insert(&tcl->tree, &node->node, addr, addrlen, net)) {
+ if(complain_duplicates)
+ verbose(VERB_QUERY, "duplicate tcl address ignored.");
+ }
+ return node;
+}
+
+/** apply tcl_list string */
+static int
+tcl_list_str_cfg(struct tcl_list* tcl, const char* str, const char* s2,
+ int complain_duplicates)
+{
+ struct sockaddr_storage addr;
+ int net;
+ socklen_t addrlen;
+ uint32_t limit;
+ if(atoi(s2) < 0) {
+ log_err("bad connection limit %s", s2);
+ return 0;
+ }
+ limit = (uint32_t)atoi(s2);
+ if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) {
+ log_err("cannot parse connection limit netblock: %s", str);
+ return 0;
+ }
+ if(!tcl_list_insert(tcl, &addr, addrlen, net, limit,
+ complain_duplicates)) {
+ log_err("out of memory");
+ return 0;
+ }
+ return 1;
+}
+
+/** read tcl_list config */
+static int
+read_tcl_list(struct tcl_list* tcl, struct config_file* cfg)
+{
+ struct config_str2list* p;
+ for(p = cfg->tcp_connection_limits; p; p = p->next) {
+ log_assert(p->str && p->str2);
+ if(!tcl_list_str_cfg(tcl, p->str, p->str2, 1))
+ return 0;
+ }
+ return 1;
+}
+
+int
+tcl_list_apply_cfg(struct tcl_list* tcl, struct config_file* cfg)
+{
+ regional_free_all(tcl->region);
+ addr_tree_init(&tcl->tree);
+ if(!read_tcl_list(tcl, cfg))
+ return 0;
+ addr_tree_init_parents(&tcl->tree);
+ return 1;
+}
+
+int
+tcl_new_connection(struct tcl_addr* tcl)
+{
+ if(tcl) {
+ int res = 1;
+ lock_quick_lock(&tcl->lock);
+ if(tcl->count >= tcl->limit)
+ res = 0;
+ else
+ tcl->count++;
+ lock_quick_unlock(&tcl->lock);
+ return res;
+ }
+ return 1;
+}
+
+void
+tcl_close_connection(struct tcl_addr* tcl)
+{
+ if(tcl) {
+ lock_quick_lock(&tcl->lock);
+ log_assert(tcl->count > 0);
+ tcl->count--;
+ lock_quick_unlock(&tcl->lock);
+ }
+}
+
+struct tcl_addr*
+tcl_addr_lookup(struct tcl_list* tcl, struct sockaddr_storage* addr,
+ socklen_t addrlen)
+{
+ return (struct tcl_addr*)addr_tree_lookup(&tcl->tree,
+ addr, addrlen);
+}
+
+size_t
+tcl_list_get_mem(struct tcl_list* tcl)
+{
+ if(!tcl) return 0;
+ return sizeof(*tcl) + regional_get_mem(tcl->region);
+}
diff --git a/util/tcp_conn_limit.h b/util/tcp_conn_limit.h
new file mode 100644
index 000000000000..4fb71a328036
--- /dev/null
+++ b/util/tcp_conn_limit.h
@@ -0,0 +1,130 @@
+/*
+ * daemon/tcp_conn_limit.h - client TCP connection limit storage for the server.
+ *
+ * Copyright (c) 2018, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file keeps track of the limit on the number of TCP connections
+ * each client makes the server.
+ */
+
+#ifndef DAEMON_TCP_CONN_LIMIT_H
+#define DAEMON_TCP_CONN_LIMIT_H
+#include "util/storage/dnstree.h"
+#include "util/locks.h"
+struct config_file;
+struct regional;
+
+/**
+ * TCP connection limit storage structure
+ */
+struct tcl_list {
+ /** regional for allocation */
+ struct regional* region;
+ /**
+ * Tree of the addresses that are TCP connection limited.
+ * contents of type tcl_addr.
+ */
+ rbtree_type tree;
+};
+
+/**
+ *
+ * An address span with connection limit information
+ */
+struct tcl_addr {
+ /** node in address tree */
+ struct addr_tree_node node;
+ /** lock on structure data */
+ lock_quick_type lock;
+ /** connection limit on this netblock */
+ uint32_t limit;
+ /** current connection count on this netblock */
+ uint32_t count;
+};
+
+/**
+ * Create TCP connection limit structure
+ * @return new structure or NULL on error.
+ */
+struct tcl_list* tcl_list_create(void);
+
+/**
+ * Delete TCP connection limit structure.
+ * @param tcl: to delete.
+ */
+void tcl_list_delete(struct tcl_list* tcl);
+
+/**
+ * Process TCP connection limit config.
+ * @param tcl: where to store.
+ * @param cfg: config options.
+ * @return 0 on error.
+ */
+int tcl_list_apply_cfg(struct tcl_list* tcl, struct config_file* cfg);
+
+/**
+ * Increment TCP connection count if found, provided the
+ * count was below the limit.
+ * @param tcl: structure for tcl storage, or NULL.
+ * @return: 0 if limit reached, 1 if tcl was NULL or limit not reached.
+ */
+int tcl_new_connection(struct tcl_addr* tcl);
+
+/**
+ * Decrement TCP connection count if found.
+ * @param tcl: structure for tcl storage, or NULL.
+ */
+void tcl_close_connection(struct tcl_addr* tcl);
+
+/**
+ * Lookup address to see its TCP connection limit structure
+ * @param tcl: structure for address storage.
+ * @param addr: address to check
+ * @param addrlen: length of addr.
+ * @return: tcl structure from this address.
+ */
+struct tcl_addr*
+tcl_addr_lookup(struct tcl_list* tcl, struct sockaddr_storage* addr,
+ socklen_t addrlen);
+
+/**
+ * Get memory used by TCP connection limit structure.
+ * @param tcl: structure for address storage.
+ * @return bytes in use.
+ */
+size_t tcl_list_get_mem(struct tcl_list* tcl);
+
+#endif /* DAEMON_TCP_CONN_LIMIT_H */
diff --git a/validator/autotrust.c b/validator/autotrust.c
index 7bc5577f4f65..a34a7c96c814 100644
--- a/validator/autotrust.c
+++ b/validator/autotrust.c
@@ -2306,7 +2306,7 @@ autr_debug_print(struct val_anchors* anchors)
void probe_answer_cb(void* arg, int ATTR_UNUSED(rcode),
sldns_buffer* ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(sec),
- char* ATTR_UNUSED(why_bogus))
+ char* ATTR_UNUSED(why_bogus), int ATTR_UNUSED(was_ratelimited))
{
/* retry was set before the query was done,
* re-querytime is set when query succeeded, but that may not
diff --git a/validator/autotrust.h b/validator/autotrust.h
index c549798f0e3c..057f2b68aed7 100644
--- a/validator/autotrust.h
+++ b/validator/autotrust.h
@@ -206,6 +206,6 @@ void autr_debug_print(struct val_anchors* anchors);
/** callback for query answer to 5011 probe */
void probe_answer_cb(void* arg, int rcode, struct sldns_buffer* buf,
- enum sec_status sec, char* errinf);
+ enum sec_status sec, char* errinf, int was_ratelimited);
#endif /* VALIDATOR_AUTOTRUST_H */
diff --git a/validator/val_kcache.c b/validator/val_kcache.c
index 22070cc6a90e..e0b88b6df81d 100644
--- a/validator/val_kcache.c
+++ b/validator/val_kcache.c
@@ -89,7 +89,7 @@ key_cache_insert(struct key_cache* kcache, struct key_entry_key* kkey,
if(key_entry_isbad(k) && qstate->errinf &&
qstate->env->cfg->val_log_level >= 2) {
/* on malloc failure there is simply no reason string */
- key_entry_set_reason(k, errinf_to_str(qstate));
+ key_entry_set_reason(k, errinf_to_str_bogus(qstate));
}
key_entry_hash(k);
slabhash_insert(kcache->slab, k->entry.hash, &k->entry,
diff --git a/validator/validator.c b/validator/validator.c
index 5777b2932cb4..fa8d5419a80a 100644
--- a/validator/validator.c
+++ b/validator/validator.c
@@ -388,6 +388,14 @@ generate_request(struct module_qstate* qstate, int id, uint8_t* name,
if(qtype == LDNS_RR_TYPE_DLV)
valrec = 0;
else valrec = 1;
+
+ fptr_ok(fptr_whitelist_modenv_detect_cycle(qstate->env->detect_cycle));
+ if((*qstate->env->detect_cycle)(qstate, &ask,
+ (uint16_t)(BIT_RD|flags), 0, valrec)) {
+ verbose(VERB_ALGO, "Could not generate request: cycle detected");
+ return 0;
+ }
+
if(detached) {
struct mesh_state* sub = NULL;
fptr_ok(fptr_whitelist_modenv_add_sub(
@@ -467,7 +475,7 @@ generate_keytag_query(struct module_qstate* qstate, int id,
LDNS_RR_TYPE_NULL, ta->dclass);
if(!generate_request(qstate, id, keytagdname, dnamebuf_len,
LDNS_RR_TYPE_NULL, ta->dclass, 0, &newq, 1)) {
- log_err("failed to generate key tag signaling request");
+ verbose(VERB_ALGO, "failed to generate key tag signaling request");
return 0;
}
@@ -524,12 +532,12 @@ prime_trust_anchor(struct module_qstate* qstate, struct val_qstate* vq,
if(newq && qstate->env->cfg->trust_anchor_signaling &&
!generate_keytag_query(qstate, id, toprime)) {
- log_err("keytag signaling query failed");
+ verbose(VERB_ALGO, "keytag signaling query failed");
return 0;
}
if(!ret) {
- log_err("Could not prime trust anchor: out of memory");
+ verbose(VERB_ALGO, "Could not prime trust anchor");
return 0;
}
/* ignore newq; validator does not need state created for that
@@ -1673,7 +1681,7 @@ processFindKey(struct module_qstate* qstate, struct val_qstate* vq, int id)
if(!generate_request(qstate, id, vq->ds_rrset->rk.dname,
vq->ds_rrset->rk.dname_len, LDNS_RR_TYPE_DNSKEY,
vq->qchase.qclass, BIT_CD, &newq, 0)) {
- log_err("mem error generating DNSKEY request");
+ verbose(VERB_ALGO, "error generating DNSKEY request");
return val_error(qstate, id);
}
return 0;
@@ -1745,7 +1753,7 @@ processFindKey(struct module_qstate* qstate, struct val_qstate* vq, int id)
if(!generate_request(qstate, id, vq->ds_rrset->rk.dname,
vq->ds_rrset->rk.dname_len, LDNS_RR_TYPE_DNSKEY,
vq->qchase.qclass, BIT_CD, &newq, 0)) {
- log_err("mem error generating DNSKEY request");
+ verbose(VERB_ALGO, "error generating DNSKEY request");
return val_error(qstate, id);
}
return 0;
@@ -1774,7 +1782,7 @@ processFindKey(struct module_qstate* qstate, struct val_qstate* vq, int id)
if(!generate_request(qstate, id, target_key_name,
target_key_len, LDNS_RR_TYPE_DS, vq->qchase.qclass,
BIT_CD, &newq, 0)) {
- log_err("mem error generating DS request");
+ verbose(VERB_ALGO, "error generating DS request");
return val_error(qstate, id);
}
return 0;
@@ -1784,7 +1792,7 @@ processFindKey(struct module_qstate* qstate, struct val_qstate* vq, int id)
if(!generate_request(qstate, id, vq->ds_rrset->rk.dname,
vq->ds_rrset->rk.dname_len, LDNS_RR_TYPE_DNSKEY,
vq->qchase.qclass, BIT_CD, &newq, 0)) {
- log_err("mem error generating DNSKEY request");
+ verbose(VERB_ALGO, "error generating DNSKEY request");
return val_error(qstate, id);
}
@@ -2227,13 +2235,17 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
vq->orig_msg->rep->ttl = ve->bogus_ttl;
vq->orig_msg->rep->prefetch_ttl =
PREFETCH_TTL_CALC(vq->orig_msg->rep->ttl);
- if(qstate->env->cfg->val_log_level >= 1 &&
+ vq->orig_msg->rep->serve_expired_ttl =
+ vq->orig_msg->rep->ttl + qstate->env->cfg->serve_expired_ttl;
+ if((qstate->env->cfg->val_log_level >= 1 ||
+ qstate->env->cfg->log_servfail) &&
!qstate->env->cfg->val_log_squelch) {
- if(qstate->env->cfg->val_log_level < 2)
+ if(qstate->env->cfg->val_log_level < 2 &&
+ !qstate->env->cfg->log_servfail)
log_query_info(0, "validation failure",
&qstate->qinfo);
else {
- char* err = errinf_to_str(qstate);
+ char* err = errinf_to_str_bogus(qstate);
if(err) log_info("%s", err);
free(err);
}
@@ -2332,6 +2344,7 @@ processDLVLookup(struct module_qstate* qstate, struct val_qstate* vq,
if(vq->dlv_status == dlv_error) {
verbose(VERB_QUERY, "failed DLV lookup");
+ errinf(qstate, "failed DLV lookup");
return val_error(qstate, id);
} else if(vq->dlv_status == dlv_success) {
uint8_t* nm;
@@ -2367,7 +2380,7 @@ processDLVLookup(struct module_qstate* qstate, struct val_qstate* vq,
if(!generate_request(qstate, id, vq->ds_rrset->rk.dname,
vq->ds_rrset->rk.dname_len, LDNS_RR_TYPE_DNSKEY,
vq->qchase.qclass, BIT_CD, &newq, 0)) {
- log_err("mem error generating DNSKEY request");
+ verbose(VERB_ALGO, "error generating DNSKEY request");
return val_error(qstate, id);
}
return 0;
diff --git a/winrc/service.conf b/winrc/service.conf
index e0118a63a91e..39ccc8cac2b4 100644
--- a/winrc/service.conf
+++ b/winrc/service.conf
@@ -4,10 +4,26 @@ server:
# verbosity level 0-4 of logging
verbosity: 0
+ # On windows you may want to make all the paths relative to the
+ # directory that has the executable in it (unbound.exe). Use this.
+ #directory: "%EXECUTABLE%"
+
# if you want to log to a file use
#logfile: "C:\unbound.log"
+ # or use "unbound.log" and the directory clause above to put it in
+ # the directory where the executable is.
# on Windows, this setting makes reports go into the Application log
# found in ControlPanels - System tasks - Logs
#use-syslog: yes
+ # on Windows, this setting adds the certificates from the Windows
+ # Cert Store. For when you want to use forwarders with TLS.
+ #tls-win-cert: yes
+
+remote-control:
+ # If you want to use unbound-control.exe from the command line, use
+ #control-enable: yes
+ #control-interface: 127.0.0.1
+ #control-use-cert: no
+
diff --git a/winrc/setup.nsi b/winrc/setup.nsi
index 8f085228004c..886d83a99929 100644
--- a/winrc/setup.nsi
+++ b/winrc/setup.nsi
@@ -14,7 +14,7 @@ outFile "unbound_setup_${VERSION}.exe"
Name "Unbound"
# default install directory
-installDir "$PROGRAMFILES\Unbound"
+installDir "$PROGRAMFILES64\Unbound"
installDirRegKey HKLM "Software\Unbound" "InstallLocation"
RequestExecutionLevel admin
#give credits to Nullsoft: BrandingText ""
@@ -79,6 +79,7 @@ sectionEnd
section "-hidden.postinstall"
# copy files
+ SetRegView 64
setOutPath $INSTDIR
File "..\LICENSE"
File "README.txt"
@@ -172,6 +173,7 @@ LangString DESC_rootkey ${LANG_ENGLISH} "Set up to use the DNSSEC root trust anc
# uninstaller section
section "un.Unbound"
+ SetRegView 64
# stop unbound service
nsExec::ExecToLog '"$INSTDIR\unbound-service-remove.exe" stop'
Pop $0 # return value/error/timeout