summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in54
-rw-r--r--cachedb/cachedb.c23
-rw-r--r--cachedb/cachedb.h2
-rw-r--r--cachedb/redis.c283
-rw-r--r--cachedb/redis.h45
-rw-r--r--config.h.in25
-rwxr-xr-xconfigure139
-rw-r--r--configure.ac62
-rw-r--r--contrib/README3
-rw-r--r--contrib/fastrpz.patch2
-rw-r--r--contrib/unbound-querycachedb.py77
-rw-r--r--daemon/daemon.c2
-rw-r--r--daemon/remote.c56
-rw-r--r--daemon/stats.c45
-rw-r--r--daemon/worker.c84
-rw-r--r--doc/Changelog139
-rw-r--r--doc/README2
-rw-r--r--doc/example.conf.in38
-rw-r--r--doc/libunbound.3.in4
-rw-r--r--doc/unbound-anchor.8.in2
-rw-r--r--doc/unbound-checkconf.8.in2
-rw-r--r--doc/unbound-control.8.in29
-rw-r--r--doc/unbound-host.1.in2
-rw-r--r--doc/unbound.8.in4
-rw-r--r--doc/unbound.conf.5.in119
-rw-r--r--iterator/iter_delegpt.c34
-rw-r--r--iterator/iter_delegpt.h8
-rw-r--r--iterator/iter_fwd.c6
-rw-r--r--iterator/iter_hints.c6
-rw-r--r--iterator/iter_utils.c25
-rw-r--r--iterator/iter_utils.h14
-rw-r--r--iterator/iterator.c44
-rw-r--r--libunbound/libworker.c18
-rw-r--r--libunbound/libworker.h2
-rw-r--r--libunbound/unbound.h10
-rw-r--r--libunbound/worker.h10
-rw-r--r--pythonmod/interface.i2
-rw-r--r--services/authzone.c653
-rw-r--r--services/authzone.h50
-rw-r--r--services/cache/dns.c48
-rw-r--r--services/cache/rrset.c2
-rw-r--r--services/listen_dnsport.c48
-rw-r--r--services/mesh.c17
-rw-r--r--services/outside_network.c39
-rw-r--r--services/outside_network.h9
-rw-r--r--sldns/keyraw.c29
-rw-r--r--sldns/keyraw.h9
-rw-r--r--sldns/str2wire.c13
-rw-r--r--smallapp/unbound-control.c12
-rw-r--r--smallapp/worker_cb.c4
-rw-r--r--testcode/fake_event.c9
-rw-r--r--testcode/unitverify.c5
-rw-r--r--testdata/auth_xfr_ixfr.rpl9
-rw-r--r--testdata/auth_xfr_ixfrisaxfr.rpl1
-rw-r--r--testdata/auth_xfr_ixfrmismatch.rpl1
-rw-r--r--testdata/auth_xfr_ixfrnotimpl.rpl1
-rw-r--r--testdata/auth_xfr_notify.rpl262
-rw-r--r--testdata/ctrl_pipe.tdir/._bad_control.keybin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._bad_control.pembin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._bad_server.keybin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._bad_server.pembin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._ctrl_pipe.confbin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._ctrl_pipe.dscbin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._ctrl_pipe.postbin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._ctrl_pipe.prebin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._ctrl_pipe.testbin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._ctrl_pipe.testnsbin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._unbound_control.keybin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._unbound_control.pembin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._unbound_server.keybin246 -> 0 bytes
-rw-r--r--testdata/ctrl_pipe.tdir/._unbound_server.pembin246 -> 0 bytes
-rw-r--r--testdata/fwd_0ttlservfail.rpl85
-rwxr-xr-xtestdata/root_key_sentinel.rpl185
-rw-r--r--testdata/stream_ssl.tdir/stream_ssl.clie.conf3
-rw-r--r--testdata/test_sigs.ed44821
-rw-r--r--testdata/val_negcache_nta.rpl120
-rw-r--r--util/config_file.c32
-rw-r--r--util/config_file.h18
-rw-r--r--util/configlexer.c5537
-rw-r--r--util/configlexer.lex9
-rw-r--r--util/configparser.c2569
-rw-r--r--util/configparser.h130
-rw-r--r--util/configparser.y100
-rw-r--r--util/data/dname.c23
-rw-r--r--util/data/dname.h11
-rw-r--r--util/data/msgparse.c34
-rw-r--r--util/data/msgreply.c5
-rw-r--r--util/data/packed_rrset.c1
-rw-r--r--util/data/packed_rrset.h4
-rw-r--r--util/fptr_wlist.c3
-rw-r--r--util/fptr_wlist.h3
-rw-r--r--util/iana_ports.inc1
-rw-r--r--util/module.h4
-rw-r--r--util/net_help.c58
-rw-r--r--util/net_help.h16
-rw-r--r--util/netevent.c22
-rw-r--r--util/tube.c10
-rw-r--r--util/ub_event.c8
-rw-r--r--validator/val_anchor.c41
-rw-r--r--validator/val_anchor.h15
-rw-r--r--validator/val_neg.c14
-rw-r--r--validator/val_neg.h6
-rw-r--r--validator/val_secalgo.c16
-rw-r--r--validator/validator.c54
-rw-r--r--validator/validator.h7
105 files changed, 7592 insertions, 4216 deletions
diff --git a/Makefile.in b/Makefile.in
index 923bb4fd7372..362d6a716612 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -112,7 +112,7 @@ iterator/iter_scrub.c iterator/iter_utils.c services/listen_dnsport.c \
services/localzone.c services/mesh.c services/modstack.c services/view.c \
services/outbound_list.c services/outside_network.c util/alloc.c \
util/config_file.c util/configlexer.c util/configparser.c \
-util/shm_side/shm_main.c services/authzone.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 \
@@ -124,7 +124,7 @@ validator/val_nsec3.c validator/val_nsec.c validator/val_secalgo.c \
validator/val_sigcrypt.c validator/val_utils.c dns64/dns64.c \
edns-subnet/edns-subnet.c edns-subnet/subnetmod.c \
edns-subnet/addrtree.c edns-subnet/subnet-whitelist.c \
-cachedb/cachedb.c respip/respip.c $(CHECKLOCK_SRC) \
+cachedb/cachedb.c cachedb/redis.c respip/respip.c $(CHECKLOCK_SRC) \
$(DNSTAP_SRC) $(DNSCRYPT_SRC) $(IPSECMOD_SRC)
COMMON_OBJ_WITHOUT_NETCALL=dns.lo infra.lo rrset.lo dname.lo msgencode.lo \
as112.lo msgparse.lo msgreply.lo packed_rrset.lo iterator.lo iter_delegpt.lo \
@@ -135,7 +135,7 @@ fptr_wlist.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 \
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 authzone.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) \
$(IPSECMOD_OBJ) respip.lo
COMMON_OBJ_WITHOUT_UB_EVENT=$(COMMON_OBJ_WITHOUT_NETCALL) netevent.lo listen_dnsport.lo \
@@ -645,7 +645,8 @@ infra.lo infra.o: $(srcdir)/services/cache/infra.c config.h $(srcdir)/sldns/rrde
rrset.lo rrset.o: $(srcdir)/services/cache/rrset.c config.h $(srcdir)/services/cache/rrset.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/sldns/rrdef.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/regional.h $(srcdir)/util/alloc.h
+ $(srcdir)/util/config_file.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/regional.h $(srcdir)/util/alloc.h \
+ $(srcdir)/util/net_help.h
as112.lo as112.o: $(srcdir)/util/as112.c $(srcdir)/util/as112.h
dname.lo dname.o: $(srcdir)/util/data/dname.c config.h $(srcdir)/util/data/dname.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h \
@@ -882,7 +883,7 @@ netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/neteve
$(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)/services/modstack.h $(srcdir)/sldns/sbuffer.h $(srcdir)/dnstap/dnstap.h \
+ $(srcdir)/services/modstack.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/str2wire.h $(srcdir)/dnstap/dnstap.h \
\
net_help.lo net_help.o: $(srcdir)/util/net_help.c config.h $(srcdir)/util/net_help.h $(srcdir)/util/log.h \
@@ -960,11 +961,11 @@ validator.lo validator.o: $(srcdir)/validator/validator.c config.h $(srcdir)/val
$(srcdir)/validator/val_anchor.h $(srcdir)/util/rbtree.h $(srcdir)/validator/val_kcache.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/validator/val_kentry.h $(srcdir)/validator/val_nsec.h \
$(srcdir)/validator/val_nsec3.h $(srcdir)/validator/val_neg.h $(srcdir)/validator/val_sigcrypt.h \
- $(srcdir)/validator/autotrust.h $(srcdir)/services/cache/dns.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/net_help.h $(srcdir)/util/regional.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)/services/modstack.h \
- $(srcdir)/sldns/wire2str.h $(srcdir)/sldns/str2wire.h
+ $(srcdir)/validator/autotrust.h $(srcdir)/services/cache/dns.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.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)/services/modstack.h $(srcdir)/sldns/wire2str.h $(srcdir)/sldns/str2wire.h
val_kcache.lo val_kcache.o: $(srcdir)/validator/val_kcache.c config.h $(srcdir)/validator/val_kcache.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/testcode/checklocks.h $(srcdir)/validator/val_kentry.h $(srcdir)/util/config_file.h \
@@ -1054,11 +1055,16 @@ subnet-whitelist.lo subnet-whitelist.o: $(srcdir)/edns-subnet/subnet-whitelist.c
cachedb.lo cachedb.o: $(srcdir)/cachedb/cachedb.c config.h $(srcdir)/cachedb/cachedb.h $(srcdir)/util/module.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.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/regional.h $(srcdir)/util/net_help.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/data/msgencode.h $(srcdir)/services/cache/dns.h \
- $(srcdir)/validator/val_neg.h $(srcdir)/util/rbtree.h $(srcdir)/validator/val_secalgo.h \
- $(srcdir)/iterator/iter_utils.h $(srcdir)/iterator/iter_resptype.h $(srcdir)/sldns/parseutil.h \
- $(srcdir)/sldns/wire2str.h $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/cachedb/redis.h $(srcdir)/util/regional.h \
+ $(srcdir)/util/net_help.h $(srcdir)/util/config_file.h $(srcdir)/util/data/msgencode.h \
+ $(srcdir)/services/cache/dns.h $(srcdir)/validator/val_neg.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/validator/val_secalgo.h $(srcdir)/iterator/iter_utils.h $(srcdir)/iterator/iter_resptype.h \
+ $(srcdir)/sldns/parseutil.h $(srcdir)/sldns/wire2str.h $(srcdir)/sldns/sbuffer.h
+redis.lo redis.o: $(srcdir)/cachedb/redis.c config.h $(srcdir)/cachedb/redis.h $(srcdir)/cachedb/cachedb.h \
+ $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
+ $(srcdir)/testcode/checklocks.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/alloc.h \
+ $(srcdir)/util/config_file.h $(srcdir)/sldns/sbuffer.h
respip.lo respip.o: $(srcdir)/respip/respip.c config.h $(srcdir)/services/localzone.h $(srcdir)/util/rbtree.h \
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h \
@@ -1204,12 +1210,12 @@ remote.lo remote.o: $(srcdir)/daemon/remote.c config.h \
$(srcdir)/util/net_help.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/rtt.h $(srcdir)/services/mesh.h $(srcdir)/services/localzone.h \
- $(srcdir)/services/view.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/data/dname.h \
- $(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_kcache.h \
- $(srcdir)/validator/val_kentry.h $(srcdir)/validator/val_anchor.h $(srcdir)/iterator/iterator.h \
- $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
- $(srcdir)/iterator/iter_delegpt.h $(srcdir)/services/outside_network.h $(srcdir)/sldns/str2wire.h \
- $(srcdir)/sldns/parseutil.h $(srcdir)/sldns/wire2str.h
+ $(srcdir)/services/view.h $(srcdir)/services/authzone.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h \
+ $(srcdir)/validator/val_kcache.h $(srcdir)/validator/val_kentry.h $(srcdir)/validator/val_anchor.h \
+ $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h \
+ $(srcdir)/iterator/iter_hints.h $(srcdir)/iterator/iter_delegpt.h $(srcdir)/services/outside_network.h \
+ $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/parseutil.h $(srcdir)/sldns/wire2str.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 \
@@ -1222,7 +1228,8 @@ stats.lo stats.o: $(srcdir)/daemon/stats.c config.h $(srcdir)/daemon/stats.h $(s
$(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h \
$(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \
- $(srcdir)/util/rtt.h $(srcdir)/validator/val_kcache.h
+ $(srcdir)/util/rtt.h $(srcdir)/services/authzone.h $(srcdir)/validator/val_kcache.h \
+ $(srcdir)/validator/val_neg.h
unbound.lo unbound.o: $(srcdir)/daemon/unbound.c config.h $(srcdir)/util/log.h $(srcdir)/daemon/daemon.h \
$(srcdir)/util/locks.h $(srcdir)/testcode/checklocks.h $(srcdir)/util/alloc.h $(srcdir)/services/modstack.h \
$(srcdir)/daemon/remote.h \
@@ -1319,7 +1326,8 @@ stats.lo stats.o: $(srcdir)/daemon/stats.c config.h $(srcdir)/daemon/stats.h $(s
$(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h \
$(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/services/cache/rrset.h \
$(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \
- $(srcdir)/util/rtt.h $(srcdir)/validator/val_kcache.h
+ $(srcdir)/util/rtt.h $(srcdir)/services/authzone.h $(srcdir)/validator/val_kcache.h \
+ $(srcdir)/validator/val_neg.h
replay.lo replay.o: $(srcdir)/testcode/replay.c config.h $(srcdir)/util/log.h $(srcdir)/util/net_help.h \
$(srcdir)/util/config_file.h $(srcdir)/testcode/replay.h $(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h \
$(srcdir)/dnscrypt/cert.h $(srcdir)/util/locks.h \
diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c
index 80bdc380f3f6..a6a609dcb68d 100644
--- a/cachedb/cachedb.c
+++ b/cachedb/cachedb.c
@@ -43,6 +43,7 @@
#include "config.h"
#ifdef USE_CACHEDB
#include "cachedb/cachedb.h"
+#include "cachedb/redis.h"
#include "util/regional.h"
#include "util/net_help.h"
#include "util/config_file.h"
@@ -56,7 +57,20 @@
#include "sldns/wire2str.h"
#include "sldns/sbuffer.h"
-#define CACHEDB_HASHSIZE 256 /* bit hash */
+/* header file for htobe64 */
+#ifdef HAVE_ENDIAN_H
+# include <endian.h>
+#endif
+#ifdef HAVE_SYS_ENDIAN_H
+# include <sys/endian.h>
+#endif
+#ifdef HAVE_LIBKERN_OSBYTEORDER_H
+/* In practice this is specific to MacOS X. We assume it doesn't have
+* htobe64/be64toh but has alternatives with a different name. */
+# include <libkern/OSByteOrder.h>
+# define htobe64(x) OSSwapHostToBigInt64(x)
+# define be64toh(x) OSSwapBigToHostInt64(x)
+#endif
/** the unit test testframe for cachedb, its module state contains
* a cache for a couple queries (in memory). */
@@ -176,6 +190,10 @@ static struct cachedb_backend testframe_backend = { "testframe",
static struct cachedb_backend*
cachedb_find_backend(const char* str)
{
+#ifdef USE_REDIS
+ if(strcmp(str, redis_backend.name) == 0)
+ return &redis_backend;
+#endif
if(strcmp(str, testframe_backend.name) == 0)
return &testframe_backend;
/* TODO add more backends here */
@@ -571,7 +589,8 @@ cachedb_intcache_lookup(struct module_qstate* qstate)
qstate->region, qstate->env->scratch,
1 /* no partial messages with only a CNAME */
);
- if(!msg && qstate->env->neg_cache) {
+ if(!msg && qstate->env->neg_cache &&
+ iter_qname_indicates_dnssec(qstate->env, &qstate->qinfo)) {
/* lookup in negative cache; may result in
* NOERROR/NODATA or NXDOMAIN answers that need validation */
msg = val_neg_getmsg(qstate->env->neg_cache, &qstate->qinfo,
diff --git a/cachedb/cachedb.h b/cachedb/cachedb.h
index d477e90a7dee..27187dc56dc6 100644
--- a/cachedb/cachedb.h
+++ b/cachedb/cachedb.h
@@ -87,6 +87,8 @@ struct cachedb_backend {
uint8_t*, size_t);
};
+#define CACHEDB_HASHSIZE 256 /* bit hash */
+
/** Init the cachedb module */
int cachedb_init(struct module_env* env, int id);
/** Deinit the cachedb module */
diff --git a/cachedb/redis.c b/cachedb/redis.c
new file mode 100644
index 000000000000..3dfbf8f7a25c
--- /dev/null
+++ b/cachedb/redis.c
@@ -0,0 +1,283 @@
+/*
+ * cachedb/redis.c - cachedb redis module
+ *
+ * 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 a module that uses the redis database to cache
+ * dns responses.
+ */
+
+#include "config.h"
+#ifdef USE_CACHEDB
+#include "cachedb/redis.h"
+#include "cachedb/cachedb.h"
+#include "util/alloc.h"
+#include "util/config_file.h"
+#include "sldns/sbuffer.h"
+
+#ifdef USE_REDIS
+#include "hiredis/hiredis.h"
+
+struct redis_moddata {
+ redisContext** ctxs; /* thread-specific redis contexts */
+ int numctxs; /* number of ctx entries */
+ const char* server_host; /* server's IP address or host name */
+ int server_port; /* server's TCP port */
+ struct timeval timeout; /* timeout for connection setup and commands */
+};
+
+static redisContext*
+redis_connect(const struct redis_moddata* moddata)
+{
+ redisContext* ctx;
+
+ ctx = redisConnectWithTimeout(moddata->server_host,
+ moddata->server_port, moddata->timeout);
+ if(!ctx || ctx->err) {
+ const char *errstr = "out of memory";
+ if(ctx)
+ errstr = ctx->errstr;
+ log_err("failed to connect to redis server: %s", errstr);
+ goto fail;
+ }
+ if(redisSetTimeout(ctx, moddata->timeout) != REDIS_OK) {
+ log_err("failed to set redis timeout");
+ goto fail;
+ }
+ return ctx;
+
+ fail:
+ if(ctx)
+ redisFree(ctx);
+ return NULL;
+}
+
+static int
+redis_init(struct module_env* env, struct cachedb_env* cachedb_env)
+{
+ int i;
+ struct redis_moddata* moddata = NULL;
+
+ verbose(VERB_ALGO, "redis_init");
+
+ moddata = calloc(1, sizeof(struct redis_moddata));
+ if(!moddata) {
+ log_err("out of memory");
+ return 0;
+ }
+ moddata->numctxs = env->cfg->num_threads;
+ moddata->ctxs = calloc(env->cfg->num_threads, sizeof(redisContext*));
+ if(!moddata->ctxs) {
+ log_err("out of memory");
+ free(moddata);
+ return 0;
+ }
+ /* note: server_host is a shallow reference to configured string.
+ * we don't have to free it in this module. */
+ moddata->server_host = env->cfg->redis_server_host;
+ moddata->server_port = env->cfg->redis_server_port;
+ moddata->timeout.tv_sec = env->cfg->redis_timeout / 1000;
+ moddata->timeout.tv_usec = (env->cfg->redis_timeout % 1000) * 1000;
+ for(i = 0; i < moddata->numctxs; i++)
+ moddata->ctxs[i] = redis_connect(moddata);
+ cachedb_env->backend_data = moddata;
+ return 1;
+}
+
+static void
+redis_deinit(struct module_env* env, struct cachedb_env* cachedb_env)
+{
+ struct redis_moddata* moddata = (struct redis_moddata*)
+ cachedb_env->backend_data;
+ (void)env;
+
+ verbose(VERB_ALGO, "redis_deinit");
+
+ if(!moddata)
+ return;
+ if(moddata->ctxs) {
+ int i;
+ for(i = 0; i < moddata->numctxs; i++) {
+ if(moddata->ctxs[i])
+ redisFree(moddata->ctxs[i]);
+ }
+ free(moddata->ctxs);
+ }
+ free(moddata);
+}
+
+/*
+ * Send a redis command and get a reply. Unified so that it can be used for
+ * both SET and GET. If 'data' is non-NULL the command is supposed to be
+ * SET and GET otherwise, but the implementation of this function is agnostic
+ * about the semantics (except for logging): 'command', 'data', and 'data_len'
+ * are opaquely passed to redisCommand().
+ * This function first checks whether a connection with a redis server has
+ * been established; if not it tries to set up a new one.
+ * It returns redisReply returned from redisCommand() or NULL if some low
+ * level error happens. The caller is responsible to check the return value,
+ * if it's non-NULL, it has to free it with freeReplyObject().
+ */
+static redisReply*
+redis_command(struct module_env* env, struct cachedb_env* cachedb_env,
+ const char* command, const uint8_t* data, size_t data_len)
+{
+ redisContext* ctx;
+ redisReply* rep;
+ struct redis_moddata* d = (struct redis_moddata*)
+ cachedb_env->backend_data;
+
+ /* We assume env->alloc->thread_num is a unique ID for each thread
+ * in [0, num-of-threads). We could treat it as an error condition
+ * if the assumption didn't hold, but it seems to be a fundamental
+ * assumption throughout the unbound architecture, so we simply assert
+ * it. */
+ log_assert(env->alloc->thread_num < d->numctxs);
+ ctx = d->ctxs[env->alloc->thread_num];
+
+ /* If we've not established a connection to the server or we've closed
+ * it on a failure, try to re-establish a new one. Failures will be
+ * logged in redis_connect(). */
+ if(!ctx) {
+ ctx = redis_connect(d);
+ d->ctxs[env->alloc->thread_num] = ctx;
+ }
+ if(!ctx)
+ return NULL;
+
+ /* Send the command and get a reply, synchronously. */
+ rep = (redisReply*)redisCommand(ctx, command, data, data_len);
+ if(!rep) {
+ /* Once an error as a NULL-reply is returned the context cannot
+ * be reused and we'll need to set up a new connection. */
+ log_err("redis_command: failed to receive a reply, "
+ "closing connection: %s", ctx->errstr);
+ redisFree(ctx);
+ d->ctxs[env->alloc->thread_num] = NULL;
+ return NULL;
+ }
+
+ /* Check error in reply to unify logging in that case.
+ * The caller may perform context-dependent checks and logging. */
+ if(rep->type == REDIS_REPLY_ERROR)
+ log_err("redis: %s resulted in an error: %s",
+ data ? "set" : "get", rep->str);
+
+ return rep;
+}
+
+static int
+redis_lookup(struct module_env* env, struct cachedb_env* cachedb_env,
+ char* key, struct sldns_buffer* result_buffer)
+{
+ redisReply* rep;
+ char cmdbuf[4+(CACHEDB_HASHSIZE/8)*2+1]; /* "GET " + key */
+ int n;
+ int ret = 0;
+
+ verbose(VERB_ALGO, "redis_lookup of %s", key);
+
+ n = snprintf(cmdbuf, sizeof(cmdbuf), "GET %s", key);
+ if(n < 0 || n >= (int)sizeof(cmdbuf)) {
+ log_err("redis_lookup: unexpected failure to build command");
+ return 0;
+ }
+
+ rep = redis_command(env, cachedb_env, cmdbuf, NULL, 0);
+ if(!rep)
+ return 0;
+ switch (rep->type) {
+ case REDIS_REPLY_NIL:
+ verbose(VERB_ALGO, "redis_lookup: no data cached");
+ break;
+ case REDIS_REPLY_STRING:
+ verbose(VERB_ALGO, "redis_lookup found %d bytes",
+ (int)rep->len);
+ if((size_t)rep->len > sldns_buffer_capacity(result_buffer)) {
+ log_err("redis_lookup: replied data too long: %lu",
+ (size_t)rep->len);
+ break;
+ }
+ sldns_buffer_clear(result_buffer);
+ sldns_buffer_write(result_buffer, rep->str, rep->len);
+ sldns_buffer_flip(result_buffer);
+ ret = 1;
+ break;
+ case REDIS_REPLY_ERROR:
+ break; /* already logged */
+ default:
+ log_err("redis_lookup: unexpected type of reply for (%d)",
+ rep->type);
+ break;
+ }
+ freeReplyObject(rep);
+ return ret;
+}
+
+static void
+redis_store(struct module_env* env, struct cachedb_env* cachedb_env,
+ char* key, uint8_t* data, size_t data_len)
+{
+ redisReply* rep;
+ char cmdbuf[4+(CACHEDB_HASHSIZE/8)*2+3+1]; /* "SET " + key + " %b" */
+ int n;
+
+ verbose(VERB_ALGO, "redis_store %s (%d bytes)", key, (int)data_len);
+
+ /* build command to set to a binary safe string */
+ n = snprintf(cmdbuf, sizeof(cmdbuf), "SET %s %%b", key);
+ if(n < 0 || n >= (int)sizeof(cmdbuf)) {
+ log_err("redis_store: unexpected failure to build command");
+ return;
+ }
+
+ rep = redis_command(env, cachedb_env, cmdbuf, data, data_len);
+ if(rep) {
+ verbose(VERB_ALGO, "redis_store set completed");
+ if(rep->type != REDIS_REPLY_STATUS &&
+ rep->type != REDIS_REPLY_ERROR) {
+ log_err("redis_store: unexpected type of reply (%d)",
+ rep->type);
+ }
+ freeReplyObject(rep);
+ }
+}
+
+struct cachedb_backend redis_backend = { "redis",
+ redis_init, redis_deinit, redis_lookup, redis_store
+};
+#endif /* USE_REDIS */
+#endif /* USE_CACHEDB */
diff --git a/cachedb/redis.h b/cachedb/redis.h
new file mode 100644
index 000000000000..2da2a64f2db9
--- /dev/null
+++ b/cachedb/redis.h
@@ -0,0 +1,45 @@
+/*
+ * cachedb/redis.h - cachedb redis module
+ *
+ * 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 a module that uses the redis database to cache
+ * dns responses.
+ */
+
+/** the redis backend definition, contains callable functions
+ * and name string */
+extern struct cachedb_backend redis_backend;
diff --git a/config.h.in b/config.h.in
index e7405603ddad..922389428776 100644
--- a/config.h.in
+++ b/config.h.in
@@ -83,6 +83,10 @@
don't. */
#undef HAVE_DECL_NID_ED25519
+/* Define to 1 if you have the declaration of `NID_ED448', and to 0 if you
+ don't. */
+#undef HAVE_DECL_NID_ED448
+
/* Define to 1 if you have the declaration of `NID_secp384r1', and to 0 if you
don't. */
#undef HAVE_DECL_NID_SECP384R1
@@ -95,6 +99,10 @@
don't. */
#undef HAVE_DECL_REALLOCARRAY
+/* Define to 1 if you have the declaration of `redisConnect', and to 0 if you
+ don't. */
+#undef HAVE_DECL_REDISCONNECT
+
/* Define to 1 if you have the declaration of `sk_SSL_COMP_pop_free', and to 0
if you don't. */
#undef HAVE_DECL_SK_SSL_COMP_POP_FREE
@@ -233,6 +241,9 @@
/* Define to 1 if you have the <grp.h> header file. */
#undef HAVE_GRP_H
+/* Define to 1 if you have the <hiredis/hiredis.h> header file. */
+#undef HAVE_HIREDIS_HIREDIS_H
+
/* If you have HMAC_Update */
#undef HAVE_HMAC_UPDATE
@@ -263,6 +274,9 @@
/* Define to 1 if you have the `kill' function. */
#undef HAVE_KILL
+/* Define to 1 if you have the <libkern/OSByteOrder.h> header file. */
+#undef HAVE_LIBKERN_OSBYTEORDER_H
+
/* Define if we have LibreSSL */
#undef HAVE_LIBRESSL
@@ -479,6 +493,9 @@
/* Define to 1 if systemd should be used */
#undef HAVE_SYSTEMD
+/* Define to 1 if you have the <sys/endian.h> header file. */
+#undef HAVE_SYS_ENDIAN_H
+
/* Define to 1 if you have the <sys/ipc.h> header file. */
#undef HAVE_SYS_IPC_H
@@ -703,6 +720,9 @@
/* Define this to enable ED25519 support. */
#undef USE_ED25519
+/* Define this to enable ED448 support. */
+#undef USE_ED448
+
/* Define this to enable GOST support. */
#undef USE_GOST
@@ -718,6 +738,9 @@
/* Define this to enable client TCP Fast Open. */
#undef USE_OSX_MSG_FASTOPEN
+/* Define this to use hiredis client. */
+#undef USE_REDIS
+
/* Define this to enable SHA1 support. */
#undef USE_SHA1
@@ -1222,6 +1245,8 @@ void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
/** default port for DNS traffic. */
#define UNBOUND_DNS_PORT 53
+/** default port for DNS over TLS traffic. */
+#define UNBOUND_DNS_OVER_TLS_PORT 853
/** default port for unbound control traffic, registered port with IANA,
ub-dns-control 8953/tcp unbound dns nameserver control */
#define UNBOUND_CONTROL_PORT 8953
diff --git a/configure b/configure
index 8f830dc15ceb..6535a5a969c2 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.0.
+# Generated by GNU Autoconf 2.69 for unbound 1.7.1.
#
# 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.0'
-PACKAGE_STRING='unbound 1.7.0'
+PACKAGE_VERSION='1.7.1'
+PACKAGE_STRING='unbound 1.7.1'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl'
PACKAGE_URL=''
@@ -859,11 +859,13 @@ enable_gost
enable_ecdsa
enable_dsa
enable_ed25519
+enable_ed448
enable_event_api
enable_tfo_client
enable_tfo_server
with_libevent
with_libexpat
+with_libhiredis
enable_static_exe
enable_systemd
enable_lock_checks
@@ -1438,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.0 to adapt to many kinds of systems.
+\`configure' configures unbound 1.7.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1503,7 +1505,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.7.0:";;
+ short | recursive ) echo "Configuration of unbound 1.7.1:";;
esac
cat <<\_ACEOF
@@ -1544,6 +1546,7 @@ Optional Features:
--disable-ecdsa Disable ECDSA support
--disable-dsa Disable DSA support
--disable-ed25519 Disable ED25519 support
+ --disable-ed448 Disable ED448 support
--enable-event-api Enable (experimental) pluggable event base
libunbound API installed to unbound-event.h
--enable-tfo-client Enable TCP Fast Open for client mode
@@ -1610,6 +1613,7 @@ Optional Packages:
an explicit path). Slower, but allows use of large
outgoing port ranges.
--with-libexpat=path specify explicit path for libexpat.
+ --with-libhiredis=path specify explicit path for libhiredis.
--with-dnstap-socket-path=pathname
set default dnstap socket path
--with-protobuf-c=path Path where protobuf-c is installed, for dnstap
@@ -1718,7 +1722,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.7.0
+unbound configure 1.7.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2427,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.0, which was
+It was created by unbound $as_me 1.7.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2779,11 +2783,11 @@ UNBOUND_VERSION_MAJOR=1
UNBOUND_VERSION_MINOR=7
-UNBOUND_VERSION_MICRO=0
+UNBOUND_VERSION_MICRO=1
LIBUNBOUND_CURRENT=7
-LIBUNBOUND_REVISION=8
+LIBUNBOUND_REVISION=9
LIBUNBOUND_AGE=5
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -2843,6 +2847,7 @@ LIBUNBOUND_AGE=5
# 1.6.7 had 7:6:5
# 1.6.8 had 7:7:5
# 1.7.0 had 7:8:5
+# 1.7.1 had 7:9:5
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -14477,7 +14482,7 @@ CC=$lt_save_CC
# Checks for header files.
-for ac_header in stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/ipc.h sys/shm.h
+for ac_header in stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
@@ -18314,6 +18319,50 @@ _ACEOF
;;
esac
+# Check whether --enable-ed448 was given.
+if test "${enable_ed448+set}" = set; then :
+ enableval=$enable_ed448;
+fi
+
+use_ed448="no"
+case "$enable_ed448" in
+ no)
+ ;;
+ *)
+ if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
+ ac_fn_c_check_decl "$LINENO" "NID_ED448" "ac_cv_have_decl_NID_ED448" "$ac_includes_default
+#include <openssl/evp.h>
+
+"
+if test "x$ac_cv_have_decl_NID_ED448" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_NID_ED448 $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+
+ use_ed448="yes"
+
+else
+ if test "x$enable_ed448" = "xyes"; then as_fn_error $? "OpenSSL does not support ED448 and you used --enable-ed448." "$LINENO" 5
+ fi
+fi
+
+ fi
+ if test $use_ed448 = "yes"; then
+
+cat >>confdefs.h <<_ACEOF
+#define USE_ED448 1
+_ACEOF
+
+ fi
+ ;;
+esac
+
# Check whether --enable-event-api was given.
if test "${enable_event_api+set}" = set; then :
enableval=$enable_event_api;
@@ -18810,6 +18859,70 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
+# hiredis (redis C client for cachedb)
+
+# Check whether --with-libhiredis was given.
+if test "${with_libhiredis+set}" = set; then :
+ withval=$with_libhiredis;
+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
+ if test x_$withval = x_ -o x_$withval = x_yes; then
+ withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
+ fi
+ for dir in $withval ; do
+ if test -f "$dir/include/hiredis/hiredis.h"; then
+ found_libhiredis="yes"
+ if test "$dir" != "/usr"; then
+ CPPFLAGS="$CPPFLAGS -I$dir/include"
+ LDFLAGS="$LDFLAGS -L$dir/lib"
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $dir" >&5
+$as_echo "found in $dir" >&6; }
+
+$as_echo "#define USE_REDIS 1" >>confdefs.h
+
+ LIBS="$LIBS -lhiredis"
+ break;
+ fi
+ done
+ if test x_$found_libhiredis != x_yes; then
+ as_fn_error $? "Could not find libhiredis, hiredis.h" "$LINENO" 5
+ fi
+ for ac_header in hiredis/hiredis.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "hiredis/hiredis.h" "ac_cv_header_hiredis_hiredis_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_hiredis_hiredis_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_HIREDIS_HIREDIS_H 1
+_ACEOF
+
+fi
+
+done
+
+ ac_fn_c_check_decl "$LINENO" "redisConnect" "ac_cv_have_decl_redisConnect" "$ac_includes_default
+ #include <hiredis/hiredis.h>
+
+"
+if test "x$ac_cv_have_decl_redisConnect" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_REDISCONNECT $ac_have_decl
+_ACEOF
+
+fi
+
# set static linking if requested
staticexe=""
@@ -20928,7 +21041,7 @@ _ACEOF
-version=1.7.0
+version=1.7.1
date=`date +'%b %e, %Y'`
@@ -21447,7 +21560,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.0, which was
+This file was extended by unbound $as_me 1.7.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -21513,7 +21626,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.0
+unbound config.status 1.7.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 5417160fb66d..435147eebdec 100644
--- a/configure.ac
+++ b/configure.ac
@@ -11,14 +11,14 @@ 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],[0])
+m4_define([VERSION_MICRO],[1])
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=8
+LIBUNBOUND_REVISION=9
LIBUNBOUND_AGE=5
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -78,6 +78,7 @@ LIBUNBOUND_AGE=5
# 1.6.7 had 7:6:5
# 1.6.8 had 7:7:5
# 1.7.0 had 7:8:5
+# 1.7.1 had 7:9:5
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -331,7 +332,7 @@ AC_CHECK_TOOL(STRIP, strip)
ACX_LIBTOOL_C_ONLY
# Checks for header files.
-AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/ipc.h sys/shm.h],,, [AC_INCLUDES_DEFAULT])
+AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h],,, [AC_INCLUDES_DEFAULT])
# check for types.
# Using own tests for int64* because autoconf builtin only give 32bit.
@@ -992,6 +993,26 @@ case "$enable_ed25519" in
;;
esac
+AC_ARG_ENABLE(ed448, AC_HELP_STRING([--disable-ed448], [Disable ED448 support]))
+use_ed448="no"
+case "$enable_ed448" in
+ no)
+ ;;
+ *)
+ if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
+ AC_CHECK_DECLS([NID_ED448], [
+ use_ed448="yes"
+ ], [ if test "x$enable_ed448" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support ED448 and you used --enable-ed448.])
+ fi ], [AC_INCLUDES_DEFAULT
+#include <openssl/evp.h>
+ ])
+ fi
+ if test $use_ed448 = "yes"; then
+ AC_DEFINE_UNQUOTED([USE_ED448], [1], [Define this to enable ED448 support.])
+ fi
+ ;;
+esac
+
AC_ARG_ENABLE(event-api, AC_HELP_STRING([--enable-event-api], [Enable (experimental) pluggable event base libunbound API installed to unbound-event.h]))
case "$enable_event_api" in
yes)
@@ -1150,6 +1171,39 @@ AC_CHECK_DECLS([XML_StopParser], [], [], [AC_INCLUDES_DEFAULT
#include <expat.h>
])
+# hiredis (redis C client for cachedb)
+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
+ if test x_$withval = x_ -o x_$withval = x_yes; then
+ withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
+ fi
+ for dir in $withval ; do
+ if test -f "$dir/include/hiredis/hiredis.h"; then
+ found_libhiredis="yes"
+ dnl assume /usr is in default path.
+ if test "$dir" != "/usr"; then
+ CPPFLAGS="$CPPFLAGS -I$dir/include"
+ LDFLAGS="$LDFLAGS -L$dir/lib"
+ fi
+ AC_MSG_RESULT(found in $dir)
+ AC_DEFINE([USE_REDIS], [1], [Define this to use hiredis client.])
+ LIBS="$LIBS -lhiredis"
+ break;
+ fi
+ done
+ if test x_$found_libhiredis != x_yes; then
+ AC_ERROR([Could not find libhiredis, hiredis.h])
+ fi
+ AC_CHECK_HEADERS([hiredis/hiredis.h],,, [AC_INCLUDES_DEFAULT])
+ AC_CHECK_DECLS([redisConnect], [], [], [AC_INCLUDES_DEFAULT
+ #include <hiredis/hiredis.h>
+ ])
+fi
+
# set static linking if requested
AC_SUBST(staticexe)
staticexe=""
@@ -1752,6 +1806,8 @@ void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
/** default port for DNS traffic. */
#define UNBOUND_DNS_PORT 53
+/** default port for DNS over TLS traffic. */
+#define UNBOUND_DNS_OVER_TLS_PORT 853
/** default port for unbound control traffic, registered port with IANA,
ub-dns-control 8953/tcp unbound dns nameserver control */
#define UNBOUND_CONTROL_PORT 8953
diff --git a/contrib/README b/contrib/README
index 2a59e0330f0d..2b5e754247ac 100644
--- a/contrib/README
+++ b/contrib/README
@@ -35,3 +35,6 @@ distribution but may be helpful.
instead of SERVFAIL. Contributed by SIDN.
* fastrpz.patch: fastrpz support from Farsight Security.
* libunbound.so.conf: ltrace.conf file, see ltrace.conf(5), for libunbound.
+* unbound-querycachedb.py: utility to show data stored in cachedb backend
+ for a particular query name and type. It requires dnspython and (for
+ redis backend) redis Python modules.
diff --git a/contrib/fastrpz.patch b/contrib/fastrpz.patch
index 6e78bf1b7cf3..d5edc322405c 100644
--- a/contrib/fastrpz.patch
+++ b/contrib/fastrpz.patch
@@ -21,7 +21,7 @@ Index: unbound-1.7.0~rc1/Makefile.in
@@ -125,7 +127,7 @@ validator/val_sigcrypt.c validator/val_u
edns-subnet/edns-subnet.c edns-subnet/subnetmod.c \
edns-subnet/addrtree.c edns-subnet/subnet-whitelist.c \
- cachedb/cachedb.c respip/respip.c $(CHECKLOCK_SRC) \
+ cachedb/cachedb.c cachedb/redis.c respip/respip.c $(CHECKLOCK_SRC) \
-$(DNSTAP_SRC) $(DNSCRYPT_SRC) $(IPSECMOD_SRC)
+$(DNSTAP_SRC) $(FASTRPZ_SRC) $(DNSCRYPT_SRC) $(IPSECMOD_SRC)
COMMON_OBJ_WITHOUT_NETCALL=dns.lo infra.lo rrset.lo dname.lo msgencode.lo \
diff --git a/contrib/unbound-querycachedb.py b/contrib/unbound-querycachedb.py
new file mode 100644
index 000000000000..5b4485ba87ad
--- /dev/null
+++ b/contrib/unbound-querycachedb.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+
+import hashlib
+import sys
+import struct
+import socket
+import time
+from optparse import OptionParser
+
+import dns.message
+import dns.name
+import dns.rdataclass
+import dns.rdatatype
+
+def _calc_hashkey(qname, secret, qtype):
+ qclass = 'IN' # CLASS is fixed for simplicity
+ hobj = hashlib.sha256()
+ hobj.update(dns.name.from_text(qname).to_wire())
+ hobj.update(struct.pack('HH',
+ socket.htons(dns.rdatatype.from_text(qtype)),
+ socket.htons(dns.rdataclass.from_text(qclass))))
+ hobj.update(secret)
+ return hobj.hexdigest().upper()
+
+def _redis_get(options, key):
+ import redis
+ return redis.Redis(options.address, int(options.port)).get(key)
+
+def _dump_value(options, qname, key, value):
+ print(';; query=%s/IN/%s' % (qname, options.qtype))
+ print(';; key=%s' % key)
+ if value is None:
+ print(';; no value')
+ return
+ if len(value) < 16:
+ print(';; broken value, short length: %d' % len(value))
+ return
+ now = int(time.time())
+ timestamp = struct.unpack('!Q', value[-16:-8])[0]
+ expire = struct.unpack('!Q', value[-8:])[0]
+ print(';; Now=%d, TimeStamp=%d, Expire=%d, TTL=%d' %
+ (now, timestamp, expire, max(expire - now, 0)))
+ print(dns.message.from_wire(value[:-16]))
+
+def main():
+ parser = OptionParser(usage='usage: %prog [options] query_name')
+ parser.add_option("-a", "--address", dest="address", action="store",
+ default='127.0.0.1', help="backend-server address",
+ metavar='ADDRESS')
+ parser.add_option("-b", "--backend", dest="backend", action="store",
+ default='redis', help="backend name",
+ metavar='BACKEND')
+ parser.add_option("-p", "--port", dest="port", action="store",
+ default='6379', help="backend-server port",
+ metavar='PORT')
+ parser.add_option("-s", "--secret", dest="secret", action="store",
+ default='default', help="secret seed", metavar='SECRET')
+ parser.add_option("-t", "--qtype", dest="qtype", action="store",
+ default='A', help="query RR type", metavar='QTYPE')
+
+ (options, args) = parser.parse_args()
+ if len(args) < 1:
+ parser.error('qname is missing')
+ if options.backend == 'redis':
+ get_func = _redis_get
+ else:
+ raise Exception('unknown backend name: %s\n' % options.backend)
+ key = _calc_hashkey(args[0], options.secret, options.qtype)
+ value = get_func(options, key)
+ _dump_value(options, args[0], key, value)
+
+if __name__ == '__main__':
+ try:
+ main()
+ except Exception as e:
+ sys.stderr.write('%s\n' % e)
+ exit(1)
diff --git a/daemon/daemon.c b/daemon/daemon.c
index f68bd981b01b..85ae1e0a15ac 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -706,9 +706,11 @@ daemon_cleanup(struct daemon* daemon)
daemon->num = 0;
#ifdef USE_DNSTAP
dt_delete(daemon->dtenv);
+ daemon->dtenv = NULL;
#endif
#ifdef USE_DNSCRYPT
dnsc_delete(daemon->dnscenv);
+ daemon->dnscenv = NULL;
#endif
daemon->cfg = NULL;
}
diff --git a/daemon/remote.c b/daemon/remote.c
index 3477340ff578..cfc91eb98b3a 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -68,6 +68,7 @@
#include "services/cache/infra.h"
#include "services/mesh.h"
#include "services/localzone.h"
+#include "services/authzone.h"
#include "util/storage/slabhash.h"
#include "util/fptr_wlist.h"
#include "util/data/dname.h"
@@ -236,10 +237,15 @@ daemon_remote_create(struct config_file* cfg)
if (cfg->remote_control_use_cert == 0) {
/* No certificates are requested */
+#if defined(SSL_OP_NO_TLSv1_3)
+ /* in openssl 1.1.1, negotiation code for tls 1.3 does
+ * not allow the unauthenticated aNULL and eNULL ciphers */
+ SSL_CTX_set_options(rc->ctx, SSL_OP_NO_TLSv1_3);
+#endif
#ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
SSL_CTX_set_security_level(rc->ctx, 0);
#endif
- if(!SSL_CTX_set_cipher_list(rc->ctx, "aNULL, eNULL")) {
+ if(!SSL_CTX_set_cipher_list(rc->ctx, "aNULL:eNULL")) {
log_crypto_err("Failed to set aNULL cipher list");
daemon_remote_delete(rc);
return NULL;
@@ -1046,6 +1052,10 @@ print_ext(SSL* ssl, struct ub_stats_info* s)
(unsigned long)s->svr.ans_bogus)) return 0;
if(!ssl_printf(ssl, "num.rrset.bogus"SQ"%lu\n",
(unsigned long)s->svr.rrset_bogus)) return 0;
+ if(!ssl_printf(ssl, "num.query.aggressive.NOERROR"SQ"%lu\n",
+ (unsigned long)s->svr.num_neg_cache_noerror)) return 0;
+ if(!ssl_printf(ssl, "num.query.aggressive.NXDOMAIN"SQ"%lu\n",
+ (unsigned long)s->svr.num_neg_cache_nxdomain)) return 0;
/* threat detection */
if(!ssl_printf(ssl, "unwanted.queries"SQ"%lu\n",
(unsigned long)s->svr.unwanted_queries)) return 0;
@@ -1070,6 +1080,10 @@ print_ext(SSL* ssl, struct ub_stats_info* s)
if(!ssl_printf(ssl, "num.query.dnscrypt.replay"SQ"%lu\n",
(unsigned long)s->svr.num_query_dnscrypt_replay)) return 0;
#endif /* USE_DNSCRYPT */
+ if(!ssl_printf(ssl, "num.query.authzone.up"SQ"%lu\n",
+ (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;
return 1;
}
@@ -1644,6 +1658,7 @@ zone_del_msg(struct lruhash_entry* e, void* arg)
struct reply_info* d = (struct reply_info*)e->data;
if(d->ttl > inf->expired) {
d->ttl = inf->expired;
+ d->prefetch_ttl = inf->expired;
inf->num_msgs++;
}
}
@@ -1927,6 +1942,7 @@ parse_delegpt(SSL* ssl, char* args, uint8_t* nm, int allow_names)
struct delegpt* dp = delegpt_create_mlc(nm);
struct sockaddr_storage addr;
socklen_t addrlen;
+ char* auth_name;
if(!dp) {
(void)ssl_printf(ssl, "error out of memory\n");
return NULL;
@@ -1939,7 +1955,7 @@ parse_delegpt(SSL* ssl, char* args, uint8_t* nm, int allow_names)
p = skipwhite(p); /* position at next spot */
}
/* parse address */
- if(!extstrtoaddr(todo, &addr, &addrlen)) {
+ if(!authextstrtoaddr(todo, &addr, &addrlen, &auth_name)) {
if(allow_names) {
uint8_t* n = NULL;
size_t ln;
@@ -1967,7 +1983,8 @@ parse_delegpt(SSL* ssl, char* args, uint8_t* nm, int allow_names)
}
} else {
/* add address */
- if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0)) {
+ if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
+ auth_name)) {
(void)ssl_printf(ssl, "error out of memory\n");
delegpt_free_mlc(dp);
return NULL;
@@ -2527,6 +2544,36 @@ do_list_stubs(SSL* ssl, struct worker* worker)
}
}
+/** do the list_auth_zones command */
+static void
+do_list_auth_zones(SSL* ssl, struct auth_zones* az)
+{
+ struct auth_zone* z;
+ char buf[257], buf2[256];
+ lock_rw_rdlock(&az->lock);
+ RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
+ lock_rw_rdlock(&z->lock);
+ dname_str(z->name, buf);
+ if(z->zone_expired)
+ snprintf(buf2, sizeof(buf2), "expired");
+ else {
+ uint32_t serial = 0;
+ if(auth_zone_get_serial(z, &serial))
+ snprintf(buf2, sizeof(buf2), "serial %u",
+ (unsigned)serial);
+ else snprintf(buf2, sizeof(buf2), "no serial");
+ }
+ if(!ssl_printf(ssl, "%s\t%s\n", buf, buf2)) {
+ /* failure to print */
+ lock_rw_unlock(&z->lock);
+ lock_rw_unlock(&az->lock);
+ return;
+ }
+ lock_rw_unlock(&z->lock);
+ }
+ lock_rw_unlock(&az->lock);
+}
+
/** do the list_local_zones command */
static void
do_list_local_zones(SSL* ssl, struct local_zones* zones)
@@ -2787,6 +2834,9 @@ execute_cmd(struct daemon_remote* rc, SSL* ssl, char* cmd,
} else if(cmdcmp(p, "ip_ratelimit_list", 17)) {
do_ip_ratelimit_list(ssl, worker, p+17);
return;
+ } else if(cmdcmp(p, "list_auth_zones", 15)) {
+ do_list_auth_zones(ssl, worker->env.auth_zones);
+ 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 ed788720846a..6f4feaaad9d0 100644
--- a/daemon/stats.c
+++ b/daemon/stats.c
@@ -60,7 +60,9 @@
#include "sldns/sbuffer.h"
#include "services/cache/rrset.h"
#include "services/cache/infra.h"
+#include "services/authzone.h"
#include "validator/val_kcache.h"
+#include "validator/val_neg.h"
/** add timers and the values do not overflow or become negative */
static void
@@ -122,6 +124,30 @@ void server_stats_log(struct ub_server_stats* stats, struct worker* worker,
(unsigned)worker->env.mesh->stats_jostled);
}
+/** Set the neg cache stats. */
+static void
+set_neg_cache_stats(struct worker* worker, struct ub_server_stats* svr,
+ int reset)
+{
+ int m = modstack_find(&worker->env.mesh->mods, "validator");
+ struct val_env* ve;
+ struct val_neg_cache* neg;
+ if(m == -1)
+ return;
+ ve = (struct val_env*)worker->env.modinfo[m];
+ if(!ve->neg_cache)
+ return;
+ neg = ve->neg_cache;
+ lock_basic_lock(&neg->lock);
+ svr->num_neg_cache_noerror = (long long)neg->num_neg_cache_noerror;
+ svr->num_neg_cache_nxdomain = (long long)neg->num_neg_cache_nxdomain;
+ if(reset && !worker->env.cfg->stat_cumulative) {
+ neg->num_neg_cache_noerror = 0;
+ neg->num_neg_cache_nxdomain = 0;
+ }
+ lock_basic_unlock(&neg->lock);
+}
+
/** get rrsets bogus number from validator */
static size_t
get_rrset_bogus(struct worker* worker, int reset)
@@ -256,6 +282,25 @@ server_stats_compile(struct worker* worker, struct ub_stats_info* s, int reset)
s->svr.nonce_cache_count = 0;
s->svr.num_query_dnscrypt_replay = 0;
#endif /* USE_DNSCRYPT */
+ if(worker->env.auth_zones) {
+ if(reset && !worker->env.cfg->stat_cumulative) {
+ lock_rw_wrlock(&worker->env.auth_zones->lock);
+ } else {
+ lock_rw_rdlock(&worker->env.auth_zones->lock);
+ }
+ s->svr.num_query_authzone_up = (long long)worker->env.
+ auth_zones->num_query_up;
+ s->svr.num_query_authzone_down = (long long)worker->env.
+ auth_zones->num_query_down;
+ if(reset && !worker->env.cfg->stat_cumulative) {
+ worker->env.auth_zones->num_query_up = 0;
+ worker->env.auth_zones->num_query_down = 0;
+ }
+ lock_rw_unlock(&worker->env.auth_zones->lock);
+ }
+
+ /* Set neg cache usage numbers */
+ set_neg_cache_stats(worker, &s->svr, reset);
/* get tcp accept usage */
s->svr.tcp_accept_usage = 0;
diff --git a/daemon/worker.c b/daemon/worker.c
index 389a1de530ec..6121c7dbe363 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -342,7 +342,8 @@ worker_check_request(sldns_buffer* pkt, struct worker* worker)
verbose(VERB_QUERY, "request bad, has TC bit on");
return worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
}
- if(LDNS_OPCODE_WIRE(sldns_buffer_begin(pkt)) != LDNS_PACKET_QUERY) {
+ if(LDNS_OPCODE_WIRE(sldns_buffer_begin(pkt)) != LDNS_PACKET_QUERY &&
+ LDNS_OPCODE_WIRE(sldns_buffer_begin(pkt)) != LDNS_PACKET_NOTIFY) {
verbose(VERB_QUERY, "request unknown opcode %d",
LDNS_OPCODE_WIRE(sldns_buffer_begin(pkt)));
return worker_err_ratelimit(worker, LDNS_RCODE_NOTIMPL);
@@ -352,7 +353,9 @@ worker_check_request(sldns_buffer* pkt, struct worker* worker)
LDNS_QDCOUNT(sldns_buffer_begin(pkt)));
return worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
}
- if(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) != 0) {
+ if(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) != 0 &&
+ (LDNS_ANCOUNT(sldns_buffer_begin(pkt)) != 1 ||
+ LDNS_OPCODE_WIRE(sldns_buffer_begin(pkt)) != LDNS_PACKET_NOTIFY)) {
verbose(VERB_QUERY, "request wrong nr an=%d",
LDNS_ANCOUNT(sldns_buffer_begin(pkt)));
return worker_err_ratelimit(worker, LDNS_RCODE_FORMERR);
@@ -499,6 +502,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
* let validator do that */
return 0;
case sec_status_bogus:
+ case sec_status_secure_sentinel_fail:
/* some rrsets are bogus, reply servfail */
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
@@ -655,7 +659,8 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
}
}
/* check security status of the cached answer */
- if( rep->security == sec_status_bogus && must_validate) {
+ if(must_validate && (rep->security == sec_status_bogus ||
+ rep->security == sec_status_secure_sentinel_fail)) {
/* BAD cached */
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
@@ -940,6 +945,66 @@ answer_chaos(struct worker* w, struct query_info* qinfo,
return 0;
}
+/**
+ * Answer notify queries. These are notifies for authoritative zones,
+ * the reply is an ack that the notify has been received. We need to check
+ * access permission here.
+ * @param w: worker
+ * @param qinfo: query info. Pointer into packet buffer.
+ * @param edns: edns info from query.
+ * @param repinfo: reply info with source address.
+ * @param pkt: packet buffer.
+ */
+static void
+answer_notify(struct worker* w, struct query_info* qinfo,
+ struct edns_data* edns, sldns_buffer* pkt, struct comm_reply* repinfo)
+{
+ int refused = 0;
+ int rcode = LDNS_RCODE_NOERROR;
+ uint32_t serial = 0;
+ int has_serial;
+ if(!w->env.auth_zones) return;
+ has_serial = auth_zone_parse_notify_serial(pkt, &serial);
+ if(auth_zones_notify(w->env.auth_zones, &w->env, qinfo->qname,
+ qinfo->qname_len, qinfo->qclass, &repinfo->addr,
+ repinfo->addrlen, has_serial, serial, &refused)) {
+ rcode = LDNS_RCODE_NOERROR;
+ } else {
+ if(refused)
+ rcode = LDNS_RCODE_REFUSED;
+ else rcode = LDNS_RCODE_SERVFAIL;
+ }
+
+ if(verbosity >= VERB_DETAIL) {
+ char buf[380];
+ char zname[255+1];
+ char sr[25];
+ dname_str(qinfo->qname, zname);
+ sr[0]=0;
+ if(has_serial)
+ snprintf(sr, sizeof(sr), "serial %u ",
+ (unsigned)serial);
+ if(rcode == LDNS_RCODE_REFUSED)
+ snprintf(buf, sizeof(buf),
+ "refused NOTIFY %sfor %s from", sr, zname);
+ else if(rcode == LDNS_RCODE_SERVFAIL)
+ snprintf(buf, sizeof(buf),
+ "servfail for NOTIFY %sfor %s from", sr, zname);
+ else snprintf(buf, sizeof(buf),
+ "received NOTIFY %sfor %s from", sr, zname);
+ log_addr(VERB_DETAIL, buf, &repinfo->addr, repinfo->addrlen);
+ }
+ edns->edns_version = EDNS_ADVERTISED_VERSION;
+ edns->udp_size = EDNS_ADVERTISED_SIZE;
+ edns->ext_rcode = 0;
+ edns->bits &= EDNS_DO;
+ edns->opt_list = NULL;
+ error_encode(pkt, rcode, qinfo,
+ *(uint16_t*)(void *)sldns_buffer_begin(pkt),
+ sldns_buffer_read_u16_at(pkt, 2), edns);
+ LDNS_OPCODE_SET(sldns_buffer_begin(pkt), LDNS_PACKET_NOTIFY);
+}
+
static int
deny_refuse(struct comm_point* c, enum acl_access acl,
enum acl_access deny, enum acl_access refuse,
@@ -1238,6 +1303,12 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
regional_free_all(worker->scratchpad);
goto send_reply;
}
+ if(LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) ==
+ LDNS_PACKET_NOTIFY) {
+ answer_notify(worker, &qinfo, &edns, c->buffer, repinfo);
+ regional_free_all(worker->scratchpad);
+ goto send_reply;
+ }
if(local_zones_answer(worker->daemon->local_zones, &worker->env, &qinfo,
&edns, c->buffer, worker->scratchpad, repinfo, acladdr->taglist,
acladdr->taglen, acladdr->tag_actions,
@@ -1806,7 +1877,7 @@ struct outbound_entry*
worker_send_query(struct query_info* qinfo, uint16_t flags, int dnssec,
int want_dnssec, int nocaps, struct sockaddr_storage* addr,
socklen_t addrlen, uint8_t* zone, size_t zonelen, int ssl_upstream,
- struct module_qstate* q)
+ char* tls_auth_name, struct module_qstate* q)
{
struct worker* worker = q->env->worker;
struct outbound_entry* e = (struct outbound_entry*)regional_alloc(
@@ -1816,7 +1887,7 @@ worker_send_query(struct query_info* qinfo, uint16_t flags, int dnssec,
e->qstate = q;
e->qsent = outnet_serviced_query(worker->back, qinfo, flags, dnssec,
want_dnssec, nocaps, q->env->cfg->tcp_upstream,
- ssl_upstream, addr, addrlen, zone, zonelen, q,
+ ssl_upstream, tls_auth_name, addr, addrlen, zone, zonelen, q,
worker_handle_service_reply, e, worker->back->udp_buff, q->env);
if(!e->qsent) {
return NULL;
@@ -1863,7 +1934,8 @@ struct outbound_entry* libworker_send_query(
int ATTR_UNUSED(want_dnssec), int ATTR_UNUSED(nocaps),
struct sockaddr_storage* ATTR_UNUSED(addr), socklen_t ATTR_UNUSED(addrlen),
uint8_t* ATTR_UNUSED(zone), size_t ATTR_UNUSED(zonelen),
- int ATTR_UNUSED(ssl_upstream), struct module_qstate* ATTR_UNUSED(q))
+ int ATTR_UNUSED(ssl_upstream), char* ATTR_UNUSED(tls_auth_name),
+ struct module_qstate* ATTR_UNUSED(q))
{
log_assert(0);
return 0;
diff --git a/doc/Changelog b/doc/Changelog
index f29935375ba7..b44bdec8371b 100644
--- a/doc/Changelog
+++ b/doc/Changelog
@@ -1,6 +1,143 @@
+26 April 2018: Wouter
+ - Fix for crash in daemon_cleanup with dnstap during reload,
+ from Saksham Manchanda.
+ - Also that for dnscrypt.
+ - tag for 1.7.1rc1 release.
+
+25 April 2018: Ralph
+ - Fix memory leak when caching wildcard records for aggressive NSEC use
+
+24 April 2018: Wouter
+ - Fix contrib/fastrpz.patch for this release.
+ - Fix auth https for libev.
+
+24 April 2018: Ralph
+ - Added root-key-sentinel support
+
+23 April 2018: Wouter
+ - makedist uses bz2 for expat code, instead of tar.gz.
+ - Fix #4092: libunbound: use-caps-for-id lacks colon in
+ config_set_option.
+ - auth zone http download stores exact copy of downloaded file,
+ including comments in the file.
+ - Fix sldns parse failure for CDS alternate delete syntax empty hex.
+ - Attempt for auth zone fix; add of callback in mesh gets from
+ callback does not skip callback of result.
+ - Fix cname classification with qname minimisation enabled.
+ - list_auth_zones unbound-control command.
+
+20 April 2018: Wouter
+ - man page documentation for dns-over-tls forward-addr '#' notation.
+ - removed free from failed parse case.
+ - Fix #4091: Fix that reload of auth-zone does not merge the zonefile
+ with the previous contents.
+ - Delete auth zone when removed from config.
+
+19 April 2018: Wouter
+ - Can set tls authentication with forward-addr: IP#tls.auth.name
+ And put the public cert bundle in tls-cert-bundle: "ca-bundle.pem".
+ such as forward-addr: 9.9.9.9@853#dns.quad9.net or
+ 1.1.1.1@853#cloudflare-dns.com
+ - Fix #658: unbound using TLS in a forwarding configuration does not
+ verify the server's certificate (RFC 8310 support).
+ - For addr with #authname and no @port notation, the default is 853.
+
+18 April 2018: Wouter
+ - Fix auth-zone retry timer to be on schedule with retry timeout,
+ with backoff. Also time a refresh at the zone expiry.
+
+17 April 2018: Wouter
+ - auth zone notify work.
+ - allow-notify: config statement for auth-zones.
+ - unit test for allow-notify
+
+16 April 2018: Wouter
+ - Fix auth zone target lookup iterator.
+ - auth zone notify with prefix
+ - auth zone notify work.
+
+13 April 2018: Wouter
+ - Fix for max include depth for authzones.
+ - Fix memory free on fail for $INCLUDE in authzone.
+ - Fix that an internal error to look up the wrong rr type for
+ auth zone gets stopped, before trying to send there.
+ - auth zone notify work.
+
+10 April 2018: Ralph
+ - num.query.aggressive.NOERROR and num.query.aggressive.NXDOMAIN
+ statistics counters.
+
+10 April 2018: Wouter
+ - documentation for low-rtt and low-rtt-pct.
+ - auth zone notify work.
+
+9 April 2018: Wouter
+ - Fix that flush_zone sets prefetch ttl expired, so that with
+ serve-expired enabled it'll start prefetching those entries.
+ - num.query.authzone.up and num.query.authzone.down statistics counters.
+ - Fix downstream auth zone, only fallback when auth zone fails to
+ answer and fallback is enabled.
+ - Accept both option names with and without colon for get_option
+ and set_option.
+ - low-rtt and low-rtt-pct in unbound.conf enable the server selection
+ of fast servers for some percentage of the time.
+
+5 April 2018: Wouter
+ - Combine write of tcp length and tcp query for dns over tls.
+ - nitpick fixes in example.conf.
+ - Fix above stub queries for type NS and useless delegation point.
+ - Fix unbound-control over pipe with openssl 1.1.1, the TLSv1.3
+ tls_choose_sigalg routine does not allow the ciphers for the pipe,
+ so use TLSv1.2.
+ - ED448 support.
+
+3 April 2018: Wouter
+ - Fix #4043: make test fails due to v6 presentation issue in macOS.
+ - Fix unable to resolve after new WLAN connection, due to auth-zone
+ failing with a forwarder set. Now, auth-zone is only used for
+ answers (not referrals) when a forwarder is set.
+
+29 March 2018: Ralph
+ - Check "result" in dup_all(), by Florian Obser.
+
+23 March 2018: Ralph
+ - Fix unbound-control get_option aggressive-nsec
+
+21 March 2018: Ralph
+ - Do not use cached NSEC records to generate negative answers for
+ domains under DNSSEC Negative Trust Anchors.
+
+19 March 2018: Wouter
+ - iana port update.
+
+16 March 2018: Wouter
+ - corrected a minor typo in the changelog.
+ - move htobe64/be64toh portability code to cachedb.c.
+
+15 March 2018: Wouter
+ - Add --with-libhiredis, unbound support for a new cachedb backend
+ that uses a Redis server as the storage. This implementation
+ depends on the hiredis client library (https://redislabs.com/lp/hiredis/).
+ And unbound should be built with both --enable-cachedb and
+ --with-libhiredis[=PATH] (where $PATH/include/hiredis/hiredis.h
+ should exist). Patch from Jinmei Tatuya (Infoblox).
+ - Fix #3817: core dump happens in libunbound delete, when queued
+ servfail hits deleted message queue.
+ - Create additional tls service interfaces by opening them on other
+ portnumbers and listing the portnumbers as additional-tls-port: nr.
+
+13 March 2018: Wouter
+ - Fix typo in documentation.
+ - Fix #3736: Fix 0 TTL domains stuck on SERVFAIL unless manually
+ flushed with serve-expired on.
+
12 March 2018: Wouter
- Added documentation for aggressive-nsec: yes.
- - tag 1.7.0rc3.
+ - tag 1.7.0rc3. That became the 1.7.0 release on 15 Mar, trunk
+ now has 1.7.1 in development.
+ - Fix #3727: Protocol name is TLS, options have been renamed but
+ documentation is not consistent.
+ - Check IXFR start serial.
9 March 2018: Wouter
- Fix #3598: Fix swig build issue on rhel6 based system.
diff --git a/doc/README b/doc/README
index 58cd56fa8095..c8bfd43cd00b 100644
--- a/doc/README
+++ b/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.7.0
+README for Unbound 1.7.1
Copyright 2007 NLnet Labs
http://unbound.net
diff --git a/doc/example.conf.in b/doc/example.conf.in
index 73ed7fde0e5a..2260ba2544ab 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.0.
+# See unbound.conf(5) man page, version 1.7.1.
#
# this is a comment.
@@ -199,7 +199,7 @@ server:
# upstream connections use TCP only (and no UDP), "yes" or "no"
# useful for tunneling scenarios, default no.
# tcp-upstream: no
-
+
# upstream connections also use UDP (even if do-udp is no).
# useful if if you want UDP upstream, but don't provide UDP downstream.
# udp-upstream-without-downstream: no
@@ -320,7 +320,7 @@ server:
# enable to not answer version.server and version.bind queries.
# hide-version: no
-
+
# enable to not answer trustanchor.unbound queries.
# hide-trustanchor: no
@@ -458,6 +458,9 @@ server:
# trust anchor signaling sends a RFC8145 key tag query after priming.
# trust-anchor-signaling: yes
+
+ # Root key trust anchor sentinel (draft-ietf-dnsop-kskroll-sentinel)
+ # root-key-sentinel: yes
# File with DLV trusted keys. Same format as trust-anchor-file.
# There can be only one DLV configured, it is trusted from root down.
@@ -630,7 +633,7 @@ server:
# o inform acts like transparent, but logs client IP address
# o inform_deny drops queries and logs client IP address
# o always_transparent, always_refuse, always_nxdomain, resolve in
- # that way but ignore local data for that name.
+ # that way but ignore local data for that name
# o noview breaks out of that view towards global local-zones.
#
# defaults are localhost address, reverse for 127.0.0.1 and ::1
@@ -664,20 +667,23 @@ server:
# add a netblock specific override to a localzone, with zone type
# local-zone-override: "example.com" 192.0.2.0/24 refuse
- # service clients over SSL (on the TCP sockets), with plain DNS inside
- # the SSL stream. Give the certificate to use and private key.
+ # service clients over TLS (on the TCP sockets), with plain DNS inside
+ # the TLS stream. Give the certificate to use and private key.
# default is "" (disabled). requires restart to take effect.
# tls-service-key: "path/to/privatekeyfile.key"
# tls-service-pem: "path/to/publiccertfile.pem"
# tls-port: 853
- # request upstream over SSL (with plain DNS inside the SSL stream).
+ # request upstream over TLS (with plain DNS inside the TLS stream).
# Default is no. Can be turned on and off with unbound-control.
# tls-upstream: no
# Certificates used to authenticate connections made upstream.
# tls-cert-bundle: ""
+ # Also serve tls on these port numbers (eg. 443, ...), by listing
+ # additional-tls-port: portno for each of the port numbers.
+
# DNS64 prefix. Must be specified when DNS64 is use.
# Enable dns64 in module-config. Used to synthesize IPv6 from IPv4.
# dns64-prefix: 64:ff9b::0/96
@@ -715,6 +721,12 @@ server:
# 0 blocks when ip is ratelimited, otherwise let 1/xth traffic through
# ip-ratelimit-factor: 10
+ # 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
+ # select is disabled. prefetches are not sped up.
+ # low-rtt-pct: 0
+
# Specific options for ipsecmod. unbound needs to be configured with
# --enable-ipsecmod for these to take effect.
#
@@ -823,6 +835,8 @@ remote-control:
# has a copy of the root for local usage. The second serves example.org
# authoritatively. zonefile: reads from file (and writes to it if you also
# download it), master: fetches with AXFR and IXFR, or url to zonefile.
+# With allow-notify: you can give additional (apart from masters) sources of
+# notifies.
# auth-zone:
# name: "."
# for-downstream: no
@@ -851,7 +865,7 @@ remote-control:
# name: "viewname"
# local-zone: "example.com" redirect
# local-data: "example.com A 192.0.2.3"
-# local-data-ptr: "192.0.2.3 www.example.com"
+# local-data-ptr: "192.0.2.3 www.example.com"
# view-first: no
# view:
# name: "anotherview"
@@ -886,3 +900,11 @@ remote-control:
# backend: "testframe"
# # secret seed string to calculate hashed keys
# secret-seed: "default"
+#
+# # For "redis" backend:
+# # redis server's IP address or host name
+# redis-server-host: 127.0.0.1
+# # redis server's TCP port
+# redis-server-port: 6379
+# # timeout (in ms) for communication with the redis server
+# redis-timeout: 100
diff --git a/doc/libunbound.3.in b/doc/libunbound.3.in
index 357e981fff4b..24dfb9ef7047 100644
--- a/doc/libunbound.3.in
+++ b/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Mar 15, 2018" "NLnet Labs" "unbound 1.7.0"
+.TH "libunbound" "3" "May 3, 2018" "NLnet Labs" "unbound 1.7.1"
.\"
.\" 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.0 functions.
+\- Unbound DNS validating resolver 1.7.1 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/doc/unbound-anchor.8.in b/doc/unbound-anchor.8.in
index f50bf28af3f5..2c8140de8cc4 100644
--- a/doc/unbound-anchor.8.in
+++ b/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Mar 15, 2018" "NLnet Labs" "unbound 1.7.0"
+.TH "unbound-anchor" "8" "May 3, 2018" "NLnet Labs" "unbound 1.7.1"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
diff --git a/doc/unbound-checkconf.8.in b/doc/unbound-checkconf.8.in
index a07124e57a26..a4cddb1aff13 100644
--- a/doc/unbound-checkconf.8.in
+++ b/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Mar 15, 2018" "NLnet Labs" "unbound 1.7.0"
+.TH "unbound-checkconf" "8" "May 3, 2018" "NLnet Labs" "unbound 1.7.1"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in
index 53af91514eb7..0ff6b8e7e88a 100644
--- a/doc/unbound-control.8.in
+++ b/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Mar 15, 2018" "NLnet Labs" "unbound 1.7.0"
+.TH "unbound-control" "8" "May 3, 2018" "NLnet Labs" "unbound 1.7.1"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
@@ -144,6 +144,9 @@ Remove the name, type information from the cache.
Remove all information at or below the name from the cache.
The rrsets and key entries are removed so that new lookups will be performed.
This needs to walk and inspect the entire cache, and is a slow operation.
+The entries are set to expired in the implementation of this command (so,
+with serve\-expired enabled, it'll serve that information but schedule a
+prefetch for new information).
.TP
.B flush_bogus
Remove all bogus data from the cache.
@@ -286,6 +289,10 @@ estimated qps and qps limit from config. With +a it prints all ips, not
just the ratelimited ips, with their estimated qps. The ratelimited
ips are dropped before checking the cache.
.TP
+.B list_auth_zones
+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 view_list_local_zones \fIview\fR
\fIlist_local_zones\fR for given view.
.TP
@@ -598,6 +605,26 @@ dnscrypt queries replay. The client nonce must be unique for each client public
key/server secret key pair. This cache should be able to host QPS * `replay
window` interval keys to prevent replay of a query during `replay window`
seconds.
+.TP
+.I num.query.authzone.up
+The number of queries answered from auth\-zone data, upstream queries.
+These queries would otherwise have been sent (with fallback enabled) to
+the internet, but are now answered from the auth zone.
+.TP
+.I num.query.authzone.down
+The number of queries for downstream answered from auth\-zone data.
+These queries are from downstream clients, and have had an answer from
+the data in the auth zone.
+.TP
+.I num.query.aggressive.NOERROR
+The number of queries answered using cached NSEC records with NODATA RCODE.
+These queries would otherwise have been sent to the internet, but are now
+answered using cached data.
+.TP
+.I num.query.aggressive.NXDOMAIN
+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.
.SH "FILES"
.TP
.I @ub_conf_file@
diff --git a/doc/unbound-host.1.in b/doc/unbound-host.1.in
index 6842514d287e..ab2f00be9d0a 100644
--- a/doc/unbound-host.1.in
+++ b/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Mar 15, 2018" "NLnet Labs" "unbound 1.7.0"
+.TH "unbound\-host" "1" "May 3, 2018" "NLnet Labs" "unbound 1.7.1"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
diff --git a/doc/unbound.8.in b/doc/unbound.8.in
index 3c5786a79773..cef25e39c750 100644
--- a/doc/unbound.8.in
+++ b/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Mar 15, 2018" "NLnet Labs" "unbound 1.7.0"
+.TH "unbound" "8" "May 3, 2018" "NLnet Labs" "unbound 1.7.1"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.7.0.
+\- Unbound DNS validating resolver 1.7.1.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in
index 156e3bed5f47..94ddf70e46d6 100644
--- a/doc/unbound.conf.5.in
+++ b/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Mar 15, 2018" "NLnet Labs" "unbound 1.7.0"
+.TH "unbound.conf" "5" "May 3, 2018" "NLnet Labs" "unbound 1.7.1"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -288,7 +288,7 @@ silently (unless verbosity 3) without the option.
.B ip\-transparent: \fI<yes or no>
If yes, then use IP_TRANSPARENT socket option on sockets where unbound
is listening for incoming traffic. Default no. Allows you to bind to
-non\-local interfaces. For example for non\-existant IP addresses that
+non\-local interfaces. For example for non\-existent IP addresses that
are going to exist later on, with host failover configuration. This is
a lot like interface\-automatic, but that one services all interfaces
and with this option you can select which (future) interfaces unbound
@@ -399,8 +399,8 @@ change anything. Useful for TLS service providers, that want no udp downstream
but use udp to fetch data upstream.
.TP
.B tls\-upstream: \fI<yes or no>
-Enabled or disable whether the upstream queries use SSL only for transport.
-Default is no. Useful in tunneling scenarios. The SSL contains plain DNS in
+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).
.TP
@@ -409,7 +409,7 @@ Alternate syntax for \fBtls\-upstream\fR. If both are present in the config
file the last is used.
.TP
.B tls\-service\-key: \fI<file>
-If enabled, the server provider SSL service on its TCP sockets. The clients
+If enabled, the server provider TLS service on its TCP sockets. The clients
have to use tls\-upstream: yes. The file is the private key for the TLS
session. The public certificate is in the tls\-service\-pem file. Default
is "", turned off. Requires a restart (a reload is not enough) if changed,
@@ -429,8 +429,8 @@ turned off.
Alternate syntax for \fBtls\-service\-pem\fR.
.TP
.B tls\-port: \fI<number>
-The port number on which to provide TCP SSL service, default 853, only
-interfaces configured with that port number as @number get the SSL service.
+The port number on which to provide TCP TLS service, default 853, only
+interfaces configured with that port number as @number get the TLS service.
.TP
.B ssl\-port: \fI<number>
Alternate syntax for \fBtls\-port\fR.
@@ -444,6 +444,11 @@ urls, and also DNS over TLS connections.
.B ssl\-cert\-bundle: \fI<file>
Alternate syntax for \fBtls\-cert\-bundle\fR.
.TP
+.B additional\-tls\-port: \fI<portnr>
+List portnumbers as additional\-tls\-port, and when interfaces are defined,
+eg. with the @port suffix, as this port number, they provide dns over TLS
+service. Can list multiple, each on a new statement.
+.TP
.B use\-systemd: \fI<yes or no>
Enable or disable systemd socket activation.
Default is no.
@@ -728,8 +733,8 @@ This option only has effect when qname-minimisation is enabled. Default is off.
.B aggressive\-nsec: \fI<yes or no>
Aggressive NSEC uses the DNSSEC NSEC chain to synthesize NXDOMAIN
and other denials, using information from previous NXDOMAINs answers.
-Default is off. It helps to reduce the query rate towards targets that get
-a very high nonexistant name lookup rate.
+Default is no. It helps to reduce the query rate towards targets that get
+a very high nonexistent name lookup rate.
.TP
.B private\-address: \fI<IP address or subnet>
Give IPv4 of IPv6 addresses or classless subnets. These are addresses
@@ -844,6 +849,9 @@ expanded on start and on reload.
.B trust\-anchor\-signaling: \fI<yes or no>
Send RFC8145 key tag query after trust anchor priming. Default is on.
.TP
+.B root\-key\-sentinel: \fI<yes or no>
+Root key trust anchor sentinel. Default is on.
+.TP
.B dlv\-anchor\-file: \fI<filename>
This option was used during early days DNSSEC deployment when no parent-side
DS record registrations were easily available. Nowadays, it is best to have
@@ -1304,13 +1312,30 @@ to complete. Default is 10, allowing 1/10 traffic to flow normally.
This can make ordinary queries complete (if repeatedly queried for),
and enter the cache, whilst also mitigating the traffic flow by the
factor given.
+.TP 5
+.B low\-rtt: \fI<msec time>
+Set the time in millisecond that is considere a low ping time for fast
+server selection with the low\-rtt\-pct option, that turns this on or off.
+The default is 45 msec, a number from IPv6 quick response documents.
+.TP 5
+.B low\-rtt\-pct: \fI<number>
+Specify how many times out of 1000 to pick the fast server from the low
+rtt band. 0 turns the feature off. A value of 900 would pick the fast
+server when such fast servers are available 90 percent of the time, and
+the remaining time perform normal exploration of random servers.
+When prefetch is enabled (or serve\-expired), such prefetches are not
+sped up, because there is no one waiting for it, and it presents a good
+moment to perform server exploration. The low\-rtt option can be used
+to specify which servers are picked for fast server selection, servers
+with a ping roundtrip time below that value are considered.
+The default for low\-rtt\-pct is 0.
.SS "Remote Control Options"
In the
.B remote\-control:
clause are the declarations for the remote control facility. If this is
enabled, the \fIunbound\-control\fR(8) utility can be used to send
commands to the running unbound server. The server uses these clauses
-to setup SSLv3 / TLSv1 security for the connection. The
+to setup TLSv1 security for the connection. The
\fIunbound\-control\fR(8) utility also reads the \fBremote\-control\fR
section for options. To setup the correct self\-signed certificates use the
\fIunbound\-control\-setup\fR(8) utility.
@@ -1416,7 +1441,7 @@ the servers are unreachable, instead it is tried without this clause.
The default is no.
.TP
.B stub\-tls\-upstream: \fI<yes or no>
-Enabled or disable whether the queries to this stub use SSL for transport.
+Enabled or disable whether the queries to this stub use TLS for transport.
Default is no.
.TP
.B stub\-ssl\-upstream: \fI<yes or no>
@@ -1448,6 +1473,13 @@ Name of server to forward to. Is itself resolved before it is used.
.B forward\-addr: \fI<IP address>
IP address of server to forward to. Can be IP 4 or IP 6.
To use a nondefault port for DNS communication append '@' with the port number.
+If tls is enabled, then you can append a '#' and a name, then it'll check
+the tls authentication certificates with that name. If you combine
+the '@' and '#', the '@' comes first.
+.IP
+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.
.TP
.B forward\-first: \fI<yes or no>
If enabled, a query is attempted without the forward clause if it fails.
@@ -1456,7 +1488,7 @@ the servers are unreachable, instead it is tried without this clause.
The default is no.
.TP
.B forward\-tls\-upstream: \fI<yes or no>
-Enabled or disable whether the queries to this forwarder use SSL for transport.
+Enabled or disable whether the queries to this forwarder use TLS for transport.
Default is no.
.TP
.B forward\-ssl\-upstream: \fI<yes or no>
@@ -1496,6 +1528,14 @@ If none of the urls work, the masters are tried with IXFR and AXFR.
For https, the \fBtls\-cert\-bundle\fR and the hostname from the url are used
to authenticate the connection.
.TP
+.B allow\-notify: \fI<IP address or host name or netblockIP/prefix>
+With allow\-notify you can specify additional sources of notifies.
+When notified, the server attempts to first probe and then zone transfer.
+If the notify is from a master, it first attempts that master. Otherwise
+other masters are attempted. If there are no masters, but only urls, the
+file is downloaded when notified. The masters from master: statements are
+allowed notify by default.
+.TP
.B fallback\-enabled: \fI<yes or no>
Default no. If enabled, unbound falls back to querying the internet as
a resolver for this zone when lookups fail. For example for DNSSEC
@@ -1781,15 +1821,42 @@ If it finds a valid answer in the backend, Unbound uses it to respond
to the query without performing iterative DNS resolution.
If Unbound cannot even find an answer in the backend, it resolves the
query as usual, and stores the answer in the backend.
+.P
+If Unbound was built with
+\fB\-\-with\-libhiredis\fR
+on a system that has installed the hiredis C client library of Redis,
+then the "redis" backend can be used.
+This backend communicates with the specified Redis server over a TCP
+connection to store and retrive cache data.
+It can be used as a persistent and/or shared cache backend.
+It should be noted that Unbound never removes data stored in the Redis server,
+even if some data have expired in terms of DNS TTL or the Redis server has
+cached too much data;
+if necessary the Redis server must be configured to limit the cache size,
+preferably with some kind of least-recently-used eviction policy.
+This backend uses synchronous communication with the Redis server
+based on the assumption that the communication is stable and sufficiently
+fast.
+The thread waiting for a response from the Redis server cannot handle
+other DNS queries.
+Although the backend has the ability to reconnect to the server when
+the connection is closed unexpectedly and there is a configurable timeout
+in case the server is overly slow or hangs up, these cases are assumed
+to be very rare.
+If connection close or timeout happens too often, Unbound will be
+effectively unusable with this backend.
+It's the administrator's responsibility to make the assumption hold.
+.P
The
.B cachedb:
clause gives custom settings of the cache DB module.
.TP
.B backend: \fI<backend name>\fR
Specify the backend database name.
-Currently, only the in-memory "testframe" backend is supported.
-As the name suggests this backend is not of any practical use.
-This option defaults to "testframe".
+The default database is the in-memory backend named "testframe", which,
+as the name suggests, is not of any practical use.
+Depending on the build-time configuration, "redis" backend may also be
+used as described above.
.TP
.B secret-seed: \fI<"secret string">\fR
Specify a seed to calculate a hash value from query information.
@@ -1799,6 +1866,28 @@ operationally.
If the backend database is shared by multiple Unbound instances,
all instances must use the same secret seed.
This option defaults to "default".
+.P
+The following
+.B cachedb
+otions are specific to the redis backend.
+.TP
+.B redis-server-host: \fI<server address or name>\fR
+The IP (either v6 or v4) address or domain name of the Redis server.
+In general an IP address should be specified as otherwise Unbound will have to
+resolve the name of the server every time it establishes a connection
+to the server.
+This option defaults to "127.0.0.1".
+.TP
+.B redis-server-port: \fI<port number>\fR
+The TCP port number of the Redis server.
+This option defaults to 6379.
+.TP
+.B redis-timeout: \fI<msec>\fR
+The period until when Unbound waits for a response from the Redis sever.
+If this timeout expires Unbound closes the connection, treats it as
+if the Redis server does not have the requested data, and will try to
+re-establish a new connection later.
+This option defaults to 100 milliseconds.
.SH "MEMORY CONTROL EXAMPLE"
In the example config settings below memory usage is reduced. Some service
levels are lower, notable very large data and a high TCP load are no longer
diff --git a/iterator/iter_delegpt.c b/iterator/iter_delegpt.c
index ecf88b293da1..f88b3e115db3 100644
--- a/iterator/iter_delegpt.c
+++ b/iterator/iter_delegpt.c
@@ -84,7 +84,7 @@ struct delegpt* delegpt_copy(struct delegpt* dp, struct regional* region)
}
for(a = dp->target_list; a; a = a->next_target) {
if(!delegpt_add_addr(copy, region, &a->addr, a->addrlen,
- a->bogus, a->lame))
+ a->bogus, a->lame, a->tls_auth_name))
return NULL;
}
return copy;
@@ -176,13 +176,13 @@ delegpt_add_target(struct delegpt* dp, struct regional* region,
if(ns->got4 && ns->got6)
ns->resolved = 1;
}
- return delegpt_add_addr(dp, region, addr, addrlen, bogus, lame);
+ return delegpt_add_addr(dp, region, addr, addrlen, bogus, lame, NULL);
}
int
delegpt_add_addr(struct delegpt* dp, struct regional* region,
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t bogus,
- uint8_t lame)
+ uint8_t lame, char* tls_auth_name)
{
struct delegpt_addr* a;
log_assert(!dp->dp_type_mlc);
@@ -210,6 +210,13 @@ delegpt_add_addr(struct delegpt* dp, struct regional* region,
a->bogus = bogus;
a->lame = lame;
a->dnsseclame = 0;
+ if(tls_auth_name) {
+ a->tls_auth_name = regional_strdup(region, tls_auth_name);
+ if(!a->tls_auth_name)
+ return 0;
+ } else {
+ a->tls_auth_name = NULL;
+ }
return 1;
}
@@ -276,11 +283,16 @@ void delegpt_log(enum verbosity_value v, struct delegpt* dp)
(ns->done_pside6?" PSIDE_AAAA":""));
}
for(a = dp->target_list; a; a = a->next_target) {
+ char s[128];
const char* str = " ";
if(a->bogus && a->lame) str = " BOGUS ADDR_LAME ";
else if(a->bogus) str = " BOGUS ";
else if(a->lame) str = " ADDR_LAME ";
- log_addr(VERB_ALGO, str, &a->addr, a->addrlen);
+ if(a->tls_auth_name)
+ snprintf(s, sizeof(s), "%s[%s]", str,
+ a->tls_auth_name);
+ else snprintf(s, sizeof(s), "%s", str);
+ log_addr(VERB_ALGO, s, &a->addr, a->addrlen);
}
}
}
@@ -539,6 +551,7 @@ void delegpt_free_mlc(struct delegpt* dp)
a = dp->target_list;
while(a) {
na = a->next_target;
+ free(a->tls_auth_name);
free(a);
a = na;
}
@@ -585,7 +598,7 @@ int delegpt_add_ns_mlc(struct delegpt* dp, uint8_t* name, uint8_t lame)
}
int delegpt_add_addr_mlc(struct delegpt* dp, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t bogus, uint8_t lame)
+ socklen_t addrlen, uint8_t bogus, uint8_t lame, char* tls_auth_name)
{
struct delegpt_addr* a;
log_assert(dp->dp_type_mlc);
@@ -612,6 +625,15 @@ int delegpt_add_addr_mlc(struct delegpt* dp, struct sockaddr_storage* addr,
a->bogus = bogus;
a->lame = lame;
a->dnsseclame = 0;
+ if(tls_auth_name) {
+ a->tls_auth_name = strdup(tls_auth_name);
+ if(!a->tls_auth_name) {
+ free(a);
+ return 0;
+ }
+ } else {
+ a->tls_auth_name = NULL;
+ }
return 1;
}
@@ -632,7 +654,7 @@ int delegpt_add_target_mlc(struct delegpt* dp, uint8_t* name, size_t namelen,
if(ns->got4 && ns->got6)
ns->resolved = 1;
}
- return delegpt_add_addr_mlc(dp, addr, addrlen, bogus, lame);
+ return delegpt_add_addr_mlc(dp, addr, addrlen, bogus, lame, NULL);
}
size_t delegpt_get_mem(struct delegpt* dp)
diff --git a/iterator/iter_delegpt.h b/iterator/iter_delegpt.h
index 24f0574901d9..354bd6177380 100644
--- a/iterator/iter_delegpt.h
+++ b/iterator/iter_delegpt.h
@@ -151,6 +151,8 @@ struct delegpt_addr {
* option is useful to mark the address dnsseclame.
* This value is not copied in addr-copy and dp-copy. */
uint8_t dnsseclame;
+ /** the TLS authentication name, (if not NULL) to use. */
+ char* tls_auth_name;
};
/**
@@ -259,11 +261,12 @@ int delegpt_add_rrset(struct delegpt* dp, struct regional* regional,
* @param addrlen: the length of addr.
* @param bogus: if address is bogus.
* @param lame: if address is lame.
+ * @param tls_auth_name: TLS authentication name (or NULL).
* @return false on error.
*/
int delegpt_add_addr(struct delegpt* dp, struct regional* regional,
struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t bogus, uint8_t lame);
+ uint8_t bogus, uint8_t lame, char* tls_auth_name);
/**
* Find NS record in name list of delegation point.
@@ -394,10 +397,11 @@ int delegpt_add_ns_mlc(struct delegpt* dp, uint8_t* name, uint8_t lame);
* @param addrlen: the length of addr.
* @param bogus: if address is bogus.
* @param lame: if address is lame.
+ * @param tls_auth_name: TLS authentication name (or NULL).
* @return false on error.
*/
int delegpt_add_addr_mlc(struct delegpt* dp, struct sockaddr_storage* addr,
- socklen_t addrlen, uint8_t bogus, uint8_t lame);
+ socklen_t addrlen, uint8_t bogus, uint8_t lame, char* tls_auth_name);
/**
* Add target address to the delegation point.
diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c
index 0ba6c6ddfa9e..a44f54386dc4 100644
--- a/iterator/iter_fwd.c
+++ b/iterator/iter_fwd.c
@@ -231,14 +231,16 @@ read_fwds_addr(struct config_stub* s, struct delegpt* dp)
struct config_strlist* p;
struct sockaddr_storage addr;
socklen_t addrlen;
+ char* tls_auth_name;
for(p = s->addrs; p; p = p->next) {
log_assert(p->str);
- if(!extstrtoaddr(p->str, &addr, &addrlen)) {
+ if(!authextstrtoaddr(p->str, &addr, &addrlen, &tls_auth_name)) {
log_err("cannot parse forward %s ip address: '%s'",
s->name, p->str);
return 0;
}
- if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0)) {
+ if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
+ tls_auth_name)) {
log_err("out of memory");
return 0;
}
diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c
index 1d4c228fabc2..e8d09338e974 100644
--- a/iterator/iter_hints.c
+++ b/iterator/iter_hints.c
@@ -244,14 +244,16 @@ read_stubs_addr(struct config_stub* s, struct delegpt* dp)
struct config_strlist* p;
struct sockaddr_storage addr;
socklen_t addrlen;
+ char* auth_name;
for(p = s->addrs; p; p = p->next) {
log_assert(p->str);
- if(!extstrtoaddr(p->str, &addr, &addrlen)) {
+ if(!authextstrtoaddr(p->str, &addr, &addrlen, &auth_name)) {
log_err("cannot parse stub %s ip address: '%s'",
s->name, p->str);
return 0;
}
- if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0)) {
+ if(!delegpt_add_addr_mlc(dp, &addr, addrlen, 0, 0,
+ auth_name)) {
log_err("out of memory");
return 0;
}
diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c
index 70cab40faa80..752474cd8e6f 100644
--- a/iterator/iter_utils.c
+++ b/iterator/iter_utils.c
@@ -312,9 +312,9 @@ static int
iter_filter_order(struct iter_env* iter_env, struct module_env* env,
uint8_t* name, size_t namelen, uint16_t qtype, time_t now,
struct delegpt* dp, int* selected_rtt, int open_target,
- struct sock_list* blacklist)
+ struct sock_list* blacklist, time_t prefetch)
{
- int got_num = 0, low_rtt = 0, swap_to_front;
+ int got_num = 0, low_rtt = 0, swap_to_front, rtt_band = RTT_BAND;
struct delegpt_addr* a, *n, *prev=NULL;
/* fillup sel_rtt and find best rtt in the bunch */
@@ -329,6 +329,16 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
return 0 to force the caller to fetch more */
}
+ if(env->cfg->low_rtt_pct != 0 && prefetch == 0 &&
+ low_rtt < env->cfg->low_rtt &&
+ ub_random_max(env->rnd, 1000) < env->cfg->low_rtt_pct) {
+ /* the query is not prefetch, but for a downstream client,
+ * there is a low_rtt (fast) server. We choose that x% of the
+ * time */
+ /* pick rtt numbers from 0..LOWBAND_RTT */
+ rtt_band = env->cfg->low_rtt - low_rtt;
+ }
+
got_num = 0;
a = dp->result_list;
while(a) {
@@ -340,10 +350,10 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
}
/* classify the server address and determine what to do */
swap_to_front = 0;
- if(a->sel_rtt >= low_rtt && a->sel_rtt - low_rtt <= RTT_BAND) {
+ if(a->sel_rtt >= low_rtt && a->sel_rtt - low_rtt <= rtt_band) {
got_num++;
swap_to_front = 1;
- } else if(a->sel_rtt<low_rtt && low_rtt-a->sel_rtt<=RTT_BAND) {
+ } else if(a->sel_rtt<low_rtt && low_rtt-a->sel_rtt<=rtt_band) {
got_num++;
swap_to_front = 1;
}
@@ -400,13 +410,14 @@ struct delegpt_addr*
iter_server_selection(struct iter_env* iter_env,
struct module_env* env, struct delegpt* dp,
uint8_t* name, size_t namelen, uint16_t qtype, int* dnssec_lame,
- int* chase_to_rd, int open_target, struct sock_list* blacklist)
+ int* chase_to_rd, int open_target, struct sock_list* blacklist,
+ time_t prefetch)
{
int sel;
int selrtt;
struct delegpt_addr* a, *prev;
int num = iter_filter_order(iter_env, env, name, namelen, qtype,
- *env->now, dp, &selrtt, open_target, blacklist);
+ *env->now, dp, &selrtt, open_target, blacklist, prefetch);
if(num == 0)
return NULL;
@@ -625,7 +636,7 @@ iter_dp_is_useless(struct query_info* qinfo, uint16_t qflags,
}
int
-iter_indicates_dnssec_fwd(struct module_env* env, struct query_info *qinfo)
+iter_qname_indicates_dnssec(struct module_env* env, struct query_info *qinfo)
{
struct trust_anchor* a;
if(!env || !env->anchors || !qinfo || !qinfo->qname)
diff --git a/iterator/iter_utils.h b/iterator/iter_utils.h
index 602fa6db3d0d..e971d930b164 100644
--- a/iterator/iter_utils.h
+++ b/iterator/iter_utils.h
@@ -87,13 +87,18 @@ int iter_apply_cfg(struct iter_env* iter_env, struct config_file* cfg);
* @param open_target: number of currently outstanding target queries.
* If we wait for these, perhaps more server addresses become available.
* @param blacklist: the IP blacklist to use.
+ * @param prefetch: if not 0, prefetch is in use for this query.
+ * This means the query can have different timing, because prefetch is
+ * not waited upon by the downstream client, and thus a good time to
+ * perform exploration of other targets.
* @return best target or NULL if no target.
* if not null, that target is removed from the result list in the dp.
*/
struct delegpt_addr* iter_server_selection(struct iter_env* iter_env,
struct module_env* env, struct delegpt* dp, uint8_t* name,
size_t namelen, uint16_t qtype, int* dnssec_lame,
- int* chase_to_rd, int open_target, struct sock_list* blacklist);
+ int* chase_to_rd, int open_target, struct sock_list* blacklist,
+ time_t prefetch);
/**
* Allocate dns_msg from parsed msg, in regional.
@@ -174,15 +179,14 @@ int iter_dp_is_useless(struct query_info* qinfo, uint16_t qflags,
struct delegpt* dp);
/**
- * See if qname has DNSSEC needs in the forwarding case. This is true if
- * there is a trust anchor above it. Whether there is an insecure delegation
- * to the data is unknown, but CD-retry is needed.
+ * See if qname has DNSSEC needs. This is true if there is a trust anchor above
+ * it. Whether there is an insecure delegation to the data is unknown.
* @param env: environment with anchors.
* @param qinfo: query name and class.
* @return true if trust anchor above qname, false if no anchor or insecure
* point above qname.
*/
-int iter_indicates_dnssec_fwd(struct module_env* env,
+int iter_qname_indicates_dnssec(struct module_env* env,
struct query_info *qinfo);
/**
diff --git a/iterator/iterator.c b/iterator/iterator.c
index 7f3c65737d59..188a623a2bc7 100644
--- a/iterator/iterator.c
+++ b/iterator/iterator.c
@@ -1206,7 +1206,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qchase.qname_len, iq->qchase.qtype,
iq->qchase.qclass, qstate->query_flags,
qstate->region, qstate->env->scratch, 0);
- if(!msg && qstate->env->neg_cache) {
+ if(!msg && qstate->env->neg_cache &&
+ iter_qname_indicates_dnssec(qstate->env, &iq->qchase)) {
/* lookup in negative cache; may result in
* NOERROR/NODATA or NXDOMAIN answers that need validation */
msg = val_neg_getmsg(qstate->env->neg_cache, &iq->qchase,
@@ -1298,7 +1299,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
delnamelen = iq->qchase.qname_len;
}
if(iq->qchase.qtype == LDNS_RR_TYPE_DS || iq->refetch_glue ||
- (iq->qchase.qtype == LDNS_RR_TYPE_NS && qstate->prefetch_leeway)) {
+ (iq->qchase.qtype == LDNS_RR_TYPE_NS && qstate->prefetch_leeway
+ && can_have_last_resort(qstate->env, delname, delnamelen, iq->qchase.qclass))) {
/* remove first label from delname, root goes to hints,
* but only to fetch glue, not for qtype=DS. */
/* also when prefetching an NS record, fetch it again from
@@ -1414,6 +1416,12 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
*/
if(iter_dp_is_useless(&qstate->qinfo, qstate->query_flags,
iq->dp)) {
+ if(!can_have_last_resort(qstate->env, iq->dp->name, iq->dp->namelen, iq->qchase.qclass)) {
+ verbose(VERB_ALGO, "useless dp "
+ "but cannot go up, servfail");
+ return error_response(qstate, id,
+ LDNS_RCODE_SERVFAIL);
+ }
if(dname_is_root(iq->dp->name)) {
/* use safety belt */
verbose(VERB_QUERY, "Cache has root NS but "
@@ -1791,7 +1799,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
for(a = p->target_list; a; a=a->next_target) {
(void)delegpt_add_addr(iq->dp, qstate->region,
&a->addr, a->addrlen, a->bogus,
- a->lame);
+ a->lame, a->tls_auth_name);
}
}
iq->dp->has_parent_side_NS = 1;
@@ -2160,11 +2168,18 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
log_dns_msg("msg from auth zone",
&iq->response->qinfo, iq->response->rep);
}
- iq->num_current_queries++;
- iq->chase_to_rd = 0;
- iq->dnssec_lame_query = 0;
- iq->auth_zone_response = 1;
- return next_state(iq, QUERY_RESP_STATE);
+ if((iq->chase_flags&BIT_RD) && !(iq->response->rep->flags&BIT_AA)) {
+ verbose(VERB_ALGO, "forwarder, ignoring referral from auth zone");
+ } else {
+ lock_rw_wrlock(&qstate->env->auth_zones->lock);
+ qstate->env->auth_zones->num_query_up++;
+ lock_rw_unlock(&qstate->env->auth_zones->lock);
+ iq->num_current_queries++;
+ iq->chase_to_rd = 0;
+ iq->dnssec_lame_query = 0;
+ iq->auth_zone_response = 1;
+ return next_state(iq, QUERY_RESP_STATE);
+ }
}
iq->auth_zone_response = 0;
if(auth_fallback == 0) {
@@ -2253,7 +2268,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
target = iter_server_selection(ie, qstate->env, iq->dp,
iq->dp->name, iq->dp->namelen, iq->qchase.qtype,
&iq->dnssec_lame_query, &iq->chase_to_rd,
- iq->num_target_queries, qstate->blacklist);
+ iq->num_target_queries, qstate->blacklist,
+ qstate->prefetch_leeway);
/* If no usable target was selected... */
if(!target) {
@@ -2366,12 +2382,13 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
* (blacklist nonempty) and no trust-anchors are configured
* above the qname or on the first attempt when dnssec is on */
EDNS_DO| ((iq->chase_to_rd||(iq->chase_flags&BIT_RD)!=0)&&
- !qstate->blacklist&&(!iter_indicates_dnssec_fwd(qstate->env,
+ !qstate->blacklist&&(!iter_qname_indicates_dnssec(qstate->env,
&iq->qinfo_out)||target->attempts==1)?0:BIT_CD),
iq->dnssec_expected, iq->caps_fallback || is_caps_whitelisted(
ie, iq), &target->addr, target->addrlen,
iq->dp->name, iq->dp->namelen,
- (iq->dp->ssl_upstream || qstate->env->cfg->ssl_upstream), qstate);
+ (iq->dp->ssl_upstream || qstate->env->cfg->ssl_upstream),
+ target->tls_auth_name, qstate);
if(!outq) {
log_addr(VERB_DETAIL, "error sending query to auth server",
&target->addr, target->addrlen);
@@ -2440,9 +2457,10 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
}
type = response_type_from_server(
(int)((iq->chase_flags&BIT_RD) || iq->chase_to_rd),
- iq->response, &iq->qchase, iq->dp);
+ iq->response, &iq->qinfo_out, iq->dp);
iq->chase_to_rd = 0;
- if(type == RESPONSE_TYPE_REFERRAL && (iq->chase_flags&BIT_RD)) {
+ if(type == RESPONSE_TYPE_REFERRAL && (iq->chase_flags&BIT_RD) &&
+ !iq->auth_zone_response) {
/* When forwarding (RD bit is set), we handle referrals
* differently. No queries should be sent elsewhere */
type = RESPONSE_TYPE_ANSWER;
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
index 2c7b2cf072ac..4380d69caa6c 100644
--- a/libunbound/libworker.c
+++ b/libunbound/libworker.c
@@ -365,6 +365,7 @@ libworker_dobg(void* arg)
/* cleanup */
m = UB_LIBCMD_QUIT;
+ w->want_quit = 1;
tube_remove_bg_listen(w->ctx->qq_pipe);
tube_remove_bg_write(w->ctx->rr_pipe);
libworker_delete(w);
@@ -512,7 +513,8 @@ libworker_enter_result(struct ub_result* res, sldns_buffer* buf,
res->nxdomain = 1;
if(msg_security == sec_status_secure)
res->secure = 1;
- if(msg_security == sec_status_bogus)
+ if(msg_security == sec_status_bogus ||
+ msg_security == sec_status_secure_sentinel_fail)
res->bogus = 1;
}
@@ -713,6 +715,10 @@ add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
uint8_t* msg = NULL;
uint32_t len = 0;
+ if(w->want_quit) {
+ context_query_delete(q);
+ return;
+ }
/* serialize and delete unneeded q */
if(w->is_bg_thread) {
lock_basic_lock(&w->ctx->cfglock);
@@ -841,7 +847,8 @@ void libworker_alloc_cleanup(void* arg)
struct outbound_entry* libworker_send_query(struct query_info* qinfo,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, int ssl_upstream, struct module_qstate* q)
+ size_t zonelen, int ssl_upstream, char* tls_auth_name,
+ struct module_qstate* q)
{
struct libworker* w = (struct libworker*)q->env->worker;
struct outbound_entry* e = (struct outbound_entry*)regional_alloc(
@@ -851,8 +858,8 @@ struct outbound_entry* libworker_send_query(struct query_info* qinfo,
e->qstate = q;
e->qsent = outnet_serviced_query(w->back, qinfo, flags, dnssec,
want_dnssec, nocaps, q->env->cfg->tcp_upstream, ssl_upstream,
- addr, addrlen, zone, zonelen, q, libworker_handle_service_reply,
- e, w->back->udp_buff, q->env);
+ tls_auth_name, addr, addrlen, zone, zonelen, q,
+ libworker_handle_service_reply, e, w->back->udp_buff, q->env);
if(!e->qsent) {
return NULL;
}
@@ -972,7 +979,8 @@ struct outbound_entry* worker_send_query(struct query_info* ATTR_UNUSED(qinfo),
int ATTR_UNUSED(want_dnssec), int ATTR_UNUSED(nocaps),
struct sockaddr_storage* ATTR_UNUSED(addr), socklen_t ATTR_UNUSED(addrlen),
uint8_t* ATTR_UNUSED(zone), size_t ATTR_UNUSED(zonelen),
- int ATTR_UNUSED(ssl_upstream), struct module_qstate* ATTR_UNUSED(q))
+ int ATTR_UNUSED(ssl_upstream), char* ATTR_UNUSED(tls_auth_name),
+ struct module_qstate* ATTR_UNUSED(q))
{
log_assert(0);
return 0;
diff --git a/libunbound/libworker.h b/libunbound/libworker.h
index b546e89f2ca5..42aa5bae3567 100644
--- a/libunbound/libworker.h
+++ b/libunbound/libworker.h
@@ -75,6 +75,8 @@ struct libworker {
int is_bg;
/** is this a bg worker that is threaded (not forked)? */
int is_bg_thread;
+ /** want to quit, stop handling new content */
+ int want_quit;
/** copy of the module environment with worker local entries. */
struct module_env* env;
diff --git a/libunbound/unbound.h b/libunbound/unbound.h
index 1b0f54fd2b6b..fbd69cab0e71 100644
--- a/libunbound/unbound.h
+++ b/libunbound/unbound.h
@@ -747,6 +747,16 @@ struct ub_server_stats {
long long num_query_dnscrypt_replay;
/** number of dnscrypt nonces cache entries */
long long nonce_cache_count;
+ /** number of queries for unbound's auth_zones, upstream query */
+ long long num_query_authzone_up;
+ /** number of queries for unbound's auth_zones, downstream answers */
+ long long num_query_authzone_down;
+ /** number of times neg cache records were used to generate NOERROR
+ * responses. */
+ long long num_neg_cache_noerror;
+ /** number of times neg cache records were used to generate NXDOMAIN
+ * responses. */
+ long long num_neg_cache_nxdomain;
};
/**
diff --git a/libunbound/worker.h b/libunbound/worker.h
index 88e1cf799d47..7d2ede04ed09 100644
--- a/libunbound/worker.h
+++ b/libunbound/worker.h
@@ -63,6 +63,8 @@ struct query_info;
* @param zone: delegation point name.
* @param zonelen: length of zone name wireformat dname.
* @param ssl_upstream: use SSL for upstream queries.
+ * @param tls_auth_name: if ssl_upstream, use this name with TLS
+ * authentication.
* @param q: wich query state to reactivate upon return.
* @return: false on failure (memory or socket related). no query was
* sent.
@@ -70,7 +72,8 @@ struct query_info;
struct outbound_entry* libworker_send_query(struct query_info* qinfo,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, int ssl_upstream, struct module_qstate* q);
+ size_t zonelen, int ssl_upstream, char* tls_auth_name,
+ struct module_qstate* q);
/** process incoming replies from the network */
int libworker_handle_reply(struct comm_point* c, void* arg, int error,
@@ -115,6 +118,8 @@ void worker_sighandler(int sig, void* arg);
* @param zone: wireformat dname of the zone.
* @param zonelen: length of zone name.
* @param ssl_upstream: use SSL for upstream queries.
+ * @param tls_auth_name: if ssl_upstream, use this name with TLS
+ * authentication.
* @param q: wich query state to reactivate upon return.
* @return: false on failure (memory or socket related). no query was
* sent.
@@ -122,7 +127,8 @@ void worker_sighandler(int sig, void* arg);
struct outbound_entry* worker_send_query(struct query_info* qinfo,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, int ssl_upstream, struct module_qstate* q);
+ size_t zonelen, int ssl_upstream, char* tls_auth_name,
+ struct module_qstate* q);
/**
* process control messages from the main thread. Frees the control
diff --git a/pythonmod/interface.i b/pythonmod/interface.i
index 748dec52db41..72e6d99c7cf2 100644
--- a/pythonmod/interface.i
+++ b/pythonmod/interface.i
@@ -574,7 +574,7 @@ struct module_env {
struct outbound_entry* (*send_query)(struct query_info* qinfo,
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, int ssl_upstream,
+ uint8_t* zone, size_t zonelen, int ssl_upstream, char* tls_auth_name,
struct module_qstate* q);
void (*detach_subs)(struct module_qstate* qstate);
int (*attach_sub)(struct module_qstate* qstate,
diff --git a/services/authzone.c b/services/authzone.c
index 1da924d841ea..1f56ac8cfc87 100644
--- a/services/authzone.c
+++ b/services/authzone.c
@@ -86,13 +86,21 @@
#define AUTH_HTTP_PORT 80
/* auth https port number */
#define AUTH_HTTPS_PORT 443
+/* max depth for nested $INCLUDEs */
+#define MAX_INCLUDE_DEPTH 10
/** pick up nextprobe task to start waiting to perform transfer actions */
static void xfr_set_timeout(struct auth_xfer* xfr, struct module_env* env,
- int failure);
+ int failure, int lookup_only);
/** move to sending the probe packets, next if fails. task_probe */
static void xfr_probe_send_or_end(struct auth_xfer* xfr,
struct module_env* env);
+/** pick up probe task with specified(or NULL) destination first,
+ * or transfer task if nothing to probe, or false if already in progress */
+static int xfr_start_probe(struct auth_xfer* xfr, struct module_env* env,
+ struct auth_master* spec);
+/** delete xfer structure (not its tree entry) */
+void auth_xfer_delete(struct auth_xfer* xfr);
/** create new dns_msg */
static struct dns_msg*
@@ -1437,11 +1445,13 @@ az_remove_rr_decompress(struct auth_zone* z, uint8_t* pkt, size_t pktlen,
* @param state: parse state with $ORIGIN, $TTL and 'prev-dname' and so on,
* that is kept between includes.
* The lineno is set at 1 and then increased by the function.
+ * @param fname: file name.
+ * @param depth: recursion depth for includes
* returns false on failure, has printed an error message
*/
static int
az_parse_file(struct auth_zone* z, FILE* in, uint8_t* rr, size_t rrbuflen,
- struct sldns_file_parse_state* state)
+ struct sldns_file_parse_state* state, char* fname, int depth)
{
size_t rr_len, dname_len;
int status;
@@ -1459,6 +1469,11 @@ az_parse_file(struct auth_zone* z, FILE* in, uint8_t* rr, size_t rrbuflen,
FILE* inc;
int lineno_orig = state->lineno;
char* incfile = (char*)rr + 8;
+ if(depth > MAX_INCLUDE_DEPTH) {
+ log_err("%s:%d max include depth"
+ "exceeded", fname, state->lineno);
+ return 0;
+ }
/* skip spaces */
while(*incfile == ' ' || *incfile == '\t')
incfile++;
@@ -1480,11 +1495,12 @@ az_parse_file(struct auth_zone* z, FILE* in, uint8_t* rr, size_t rrbuflen,
}
/* recurse read that file now */
if(!az_parse_file(z, inc, rr, rrbuflen,
- state)) {
+ state, incfile, depth+1)) {
log_err("%s:%d cannot parse include "
- "file %s", z->zonefile,
+ "file %s", fname,
lineno_orig, incfile);
fclose(inc);
+ free(incfile);
return 0;
}
fclose(inc);
@@ -1496,7 +1512,7 @@ az_parse_file(struct auth_zone* z, FILE* in, uint8_t* rr, size_t rrbuflen,
continue;
}
if(status != 0) {
- log_err("parse error %s %d:%d: %s", z->zonefile,
+ log_err("parse error %s %d:%d: %s", fname,
state->lineno, LDNS_WIREPARSE_OFFSET(status),
sldns_get_errorstr_parse(status));
return 0;
@@ -1511,7 +1527,7 @@ az_parse_file(struct auth_zone* z, FILE* in, uint8_t* rr, size_t rrbuflen,
sldns_wire2str_type_buf(sldns_wirerr_get_type(rr,
rr_len, dname_len), buf, sizeof(buf));
log_err("%s:%d cannot insert RR of type %s",
- z->zonefile, state->lineno, buf);
+ fname, state->lineno, buf);
return 0;
}
}
@@ -1546,6 +1562,11 @@ auth_zone_read_zonefile(struct auth_zone* z)
free(n);
return 0;
}
+
+ /* clear the data tree */
+ traverse_postorder(&z->data, auth_data_del, NULL);
+ rbtree_init(&z->data, &auth_data_cmp);
+
memset(&state, 0, sizeof(state));
/* default TTL to 3600 */
state.default_ttl = 3600;
@@ -1555,7 +1576,7 @@ auth_zone_read_zonefile(struct auth_zone* z)
state.origin_len = z->namelen;
}
/* parse the (toplevel) file */
- if(!az_parse_file(z, in, rr, sizeof(rr), &state)) {
+ if(!az_parse_file(z, in, rr, sizeof(rr), &state, z->zonefile, 0)) {
char* n = sldns_wire2str_dname(z->name, z->namelen);
log_err("error parsing zonefile %s for %s",
z->zonefile, n?n:"error");
@@ -1569,9 +1590,9 @@ auth_zone_read_zonefile(struct auth_zone* z)
/** write buffer to file and check return codes */
static int
-write_out(FILE* out, const char* str)
+write_out(FILE* out, const char* str, size_t len)
{
- size_t r, len = strlen(str);
+ size_t r;
if(len == 0)
return 1;
r = fwrite(str, 1, len, out);
@@ -1634,7 +1655,7 @@ auth_zone_write_rrset(struct auth_zone* z, struct auth_data* node,
verbose(VERB_ALGO, "failed to rr2str rr %d", (int)i);
continue;
}
- if(!write_out(out, buf))
+ if(!write_out(out, buf, strlen(buf)))
return 0;
}
return 1;
@@ -1703,6 +1724,24 @@ auth_zones_read_zones(struct auth_zones* az)
return 1;
}
+/** find serial number of zone or false if none */
+int
+auth_zone_get_serial(struct auth_zone* z, uint32_t* serial)
+{
+ struct auth_data* apex;
+ struct auth_rrset* soa;
+ struct packed_rrset_data* d;
+ apex = az_find_name(z, z->name, z->namelen);
+ if(!apex) return 0;
+ soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
+ if(!soa || soa->data->count==0)
+ return 0; /* no RRset or no RRs in rrset */
+ if(soa->data->rr_len[0] < 2+4*5) return 0; /* SOA too short */
+ d = soa->data;
+ *serial = sldns_read_uint32(d->rr_data[0]+(d->rr_len[0]-20));
+ return 1;
+}
+
/** Find auth_zone SOA and populate the values in xfr(soa values). */
static int
xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr)
@@ -1808,6 +1847,7 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c)
lock_rw_unlock(&az->lock);
/* set options */
+ z->zone_deleted = 0;
if(!auth_zone_set_zonefile(z, c->zonefile)) {
if(x) {
lock_basic_unlock(&x->lock);
@@ -1840,10 +1880,65 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c)
return 1;
}
+/** set all auth zones deleted, then in auth_zones_cfg, it marks them
+ * as nondeleted (if they are still in the config), and then later
+ * we can find deleted zones */
+static void
+az_setall_deleted(struct auth_zones* az)
+{
+ struct auth_zone* z;
+ lock_rw_wrlock(&az->lock);
+ RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
+ lock_rw_wrlock(&z->lock);
+ z->zone_deleted = 1;
+ lock_rw_unlock(&z->lock);
+ }
+ lock_rw_unlock(&az->lock);
+}
+
+/** find zones that are marked deleted and delete them.
+ * This is called from apply_cfg, and there are no threads and no
+ * workers, so the xfr can just be deleted. */
+static void
+az_delete_deleted_zones(struct auth_zones* az)
+{
+ struct auth_zone* z;
+ struct auth_zone* delete_list = NULL, *next;
+ struct auth_xfer* xfr;
+ lock_rw_wrlock(&az->lock);
+ RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
+ lock_rw_wrlock(&z->lock);
+ if(z->zone_deleted) {
+ /* we cannot alter the rbtree right now, but
+ * we can put it on a linked list and then
+ * delete it */
+ z->delete_next = delete_list;
+ delete_list = z;
+ }
+ lock_rw_unlock(&z->lock);
+ }
+ /* now we are out of the tree loop and we can loop and delete
+ * the zones */
+ z = delete_list;
+ while(z) {
+ next = z->delete_next;
+ xfr = auth_xfer_find(az, z->name, z->namelen, z->dclass);
+ if(xfr) {
+ (void)rbtree_delete(&az->xtree, &xfr->node);
+ auth_xfer_delete(xfr);
+ }
+ (void)rbtree_delete(&az->ztree, &z->node);
+ auth_zone_delete(z);
+ z = next;
+ }
+ lock_rw_unlock(&az->lock);
+}
+
int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg,
int setup)
{
struct config_auth* p;
+ az_setall_deleted(az);
for(p = cfg->auths; p; p = p->next) {
if(!p->name || p->name[0] == 0) {
log_warn("auth-zone without a name, skipped");
@@ -1854,6 +1949,7 @@ int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg,
return 0;
}
}
+ az_delete_deleted_zones(az);
if(!auth_zones_read_zones(az))
return 0;
if(setup) {
@@ -1937,6 +2033,7 @@ auth_xfer_delete(struct auth_xfer* xfr)
}
free(xfr->task_transfer);
}
+ auth_free_masters(xfr->allow_notify_list);
free(xfr);
}
@@ -3153,10 +3250,13 @@ int auth_zones_answer(struct auth_zones* az, struct module_env* env,
/* answer it from zone z */
r = auth_zone_generate_answer(z, qinfo, temp, &msg, &fallback);
lock_rw_unlock(&z->lock);
- if(fallback) {
+ if(!r && fallback) {
/* fallback to regular answering (recursive) */
return 0;
}
+ lock_rw_wrlock(&az->lock);
+ az->num_query_down++;
+ lock_rw_unlock(&az->lock);
/* encode answer */
if(!r)
@@ -3186,6 +3286,187 @@ int auth_zones_can_fallback(struct auth_zones* az, uint8_t* nm, size_t nmlen,
return r;
}
+int
+auth_zone_parse_notify_serial(sldns_buffer* pkt, uint32_t *serial)
+{
+ struct query_info q;
+ uint16_t rdlen;
+ memset(&q, 0, sizeof(q));
+ sldns_buffer_set_position(pkt, 0);
+ if(!query_info_parse(&q, pkt)) return 0;
+ if(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) == 0) return 0;
+ /* skip name of RR in answer section */
+ if(sldns_buffer_remaining(pkt) < 1) return 0;
+ if(pkt_dname_len(pkt) == 0) return 0;
+ /* check type */
+ if(sldns_buffer_remaining(pkt) < 10 /* type,class,ttl,rdatalen*/)
+ return 0;
+ if(sldns_buffer_read_u16(pkt) != LDNS_RR_TYPE_SOA) return 0;
+ sldns_buffer_skip(pkt, 2); /* class */
+ sldns_buffer_skip(pkt, 4); /* ttl */
+ rdlen = sldns_buffer_read_u16(pkt); /* rdatalen */
+ if(sldns_buffer_remaining(pkt) < rdlen) return 0;
+ if(rdlen < 22) return 0; /* bad soa length */
+ sldns_buffer_skip(pkt, (ssize_t)(rdlen-20));
+ *serial = sldns_buffer_read_u32(pkt);
+ /* return true when has serial in answer section */
+ return 1;
+}
+
+/** see if addr appears in the list */
+static int
+addr_in_list(struct auth_addr* list, struct sockaddr_storage* addr,
+ socklen_t addrlen)
+{
+ struct auth_addr* p;
+ for(p=list; p; p=p->next) {
+ if(sockaddr_cmp_addr(addr, addrlen, &p->addr, p->addrlen)==0)
+ return 1;
+ }
+ return 0;
+}
+
+/** check if an address matches a master specification (or one of its
+ * addresses in the addr list) */
+static int
+addr_matches_master(struct auth_master* master, struct sockaddr_storage* addr,
+ socklen_t addrlen, struct auth_master** fromhost)
+{
+ struct sockaddr_storage a;
+ socklen_t alen = 0;
+ int net = 0;
+ if(addr_in_list(master->list, addr, addrlen)) {
+ *fromhost = master;
+ return 1;
+ }
+ /* compare address (but not port number, that is the destination
+ * port of the master, the port number of the received notify is
+ * allowed to by any port on that master) */
+ if(extstrtoaddr(master->host, &a, &alen) &&
+ sockaddr_cmp_addr(addr, addrlen, &a, alen)==0) {
+ *fromhost = master;
+ return 1;
+ }
+ /* prefixes, addr/len, like 10.0.0.0/8 */
+ /* not http and has a / and there is one / */
+ if(master->allow_notify && !master->http &&
+ strchr(master->host, '/') != NULL &&
+ strchr(master->host, '/') == strrchr(master->host, '/') &&
+ netblockstrtoaddr(master->host, UNBOUND_DNS_PORT, &a, &alen,
+ &net) && alen == addrlen) {
+ if(addr_in_common(addr, (addr_is_ip6(addr, addrlen)?128:32),
+ &a, net, alen) >= net) {
+ *fromhost = NULL; /* prefix does not have destination
+ to send the probe or transfer with */
+ return 1; /* matches the netblock */
+ }
+ }
+ return 0;
+}
+
+/** check access list for notifies */
+static int
+az_xfr_allowed_notify(struct auth_xfer* xfr, struct sockaddr_storage* addr,
+ socklen_t addrlen, struct auth_master** fromhost)
+{
+ struct auth_master* p;
+ for(p=xfr->allow_notify_list; p; p=p->next) {
+ if(addr_matches_master(p, addr, addrlen, fromhost)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/** see if the serial means the zone has to be updated, i.e. the serial
+ * is newer than the zone serial, or we have no zone */
+static int
+xfr_serial_means_update(struct auth_xfer* xfr, uint32_t serial)
+{
+ if(!xfr->have_zone)
+ return 1; /* no zone, anything is better */
+ if(xfr->zone_expired)
+ return 1; /* expired, the sent serial is better than expired
+ data */
+ if(compare_serial(xfr->serial, serial) < 0)
+ return 1; /* our serial is smaller than the sent serial,
+ the data is newer, fetch it */
+ return 0;
+}
+
+/** note notify serial, updates the notify information in the xfr struct */
+static void
+xfr_note_notify_serial(struct auth_xfer* xfr, int has_serial, uint32_t serial)
+{
+ if(xfr->notify_received && xfr->notify_has_serial && has_serial) {
+ /* see if this serial is newer */
+ if(compare_serial(xfr->notify_serial, serial) < 0)
+ xfr->notify_serial = serial;
+ } else if(xfr->notify_received && xfr->notify_has_serial &&
+ !has_serial) {
+ /* remove serial, we have notify without serial */
+ xfr->notify_has_serial = 0;
+ xfr->notify_serial = 0;
+ } else if(xfr->notify_received && !xfr->notify_has_serial) {
+ /* we already have notify without serial, keep it
+ * that way; no serial check when current operation
+ * is done */
+ } else {
+ xfr->notify_received = 1;
+ xfr->notify_has_serial = has_serial;
+ xfr->notify_serial = serial;
+ }
+}
+
+/** process a notify serial, start new probe or note serial. xfr is locked */
+static void
+xfr_process_notify(struct auth_xfer* xfr, struct module_env* env,
+ int has_serial, uint32_t serial, struct auth_master* fromhost)
+{
+ /* if the serial of notify is older than we have, don't fetch
+ * a zone, we already have it */
+ if(has_serial && !xfr_serial_means_update(xfr, serial))
+ return;
+ /* start new probe with this addr src, or note serial */
+ if(!xfr_start_probe(xfr, env, fromhost)) {
+ /* not started because already in progress, note the serial */
+ xfr_note_notify_serial(xfr, has_serial, serial);
+ lock_basic_unlock(&xfr->lock);
+ }
+}
+
+int auth_zones_notify(struct auth_zones* az, struct module_env* env,
+ uint8_t* nm, size_t nmlen, uint16_t dclass,
+ struct sockaddr_storage* addr, socklen_t addrlen, int has_serial,
+ uint32_t serial, int* refused)
+{
+ struct auth_xfer* xfr;
+ struct auth_master* fromhost = NULL;
+ /* see which zone this is */
+ lock_rw_rdlock(&az->lock);
+ xfr = auth_xfer_find(az, nm, nmlen, dclass);
+ if(!xfr) {
+ lock_rw_unlock(&az->lock);
+ /* no such zone, refuse the notify */
+ *refused = 1;
+ return 0;
+ }
+ lock_basic_lock(&xfr->lock);
+ lock_rw_unlock(&az->lock);
+
+ /* check access list for notifies */
+ if(!az_xfr_allowed_notify(xfr, addr, addrlen, &fromhost)) {
+ lock_basic_unlock(&xfr->lock);
+ /* notify not allowed, refuse the notify */
+ *refused = 1;
+ return 0;
+ }
+
+ /* process the notify */
+ xfr_process_notify(xfr, env, has_serial, serial, fromhost);
+ return 1;
+}
+
/** set a zone expired */
static void
auth_xfer_set_expired(struct auth_xfer* xfr, struct module_env* env,
@@ -3239,6 +3520,93 @@ xfr_masterlist_free_addrs(struct auth_master* list)
}
}
+/** copy a list of auth_addrs */
+static struct auth_addr*
+auth_addr_list_copy(struct auth_addr* source)
+{
+ struct auth_addr* list = NULL, *last = NULL;
+ struct auth_addr* p;
+ for(p=source; p; p=p->next) {
+ struct auth_addr* a = (struct auth_addr*)memdup(p, sizeof(*p));
+ if(!a) {
+ log_err("malloc failure");
+ auth_free_master_addrs(list);
+ return NULL;
+ }
+ a->next = NULL;
+ if(last) last->next = a;
+ if(!list) list = a;
+ last = a;
+ }
+ return list;
+}
+
+/** copy a master to a new structure, NULL on alloc failure */
+static struct auth_master*
+auth_master_copy(struct auth_master* o)
+{
+ struct auth_master* m;
+ if(!o) return NULL;
+ m = (struct auth_master*)memdup(o, sizeof(*o));
+ if(!m) {
+ log_err("malloc failure");
+ return NULL;
+ }
+ m->next = NULL;
+ if(m->host) {
+ m->host = strdup(m->host);
+ if(!m->host) {
+ free(m);
+ log_err("malloc failure");
+ return NULL;
+ }
+ }
+ if(m->file) {
+ m->file = strdup(m->file);
+ if(!m->file) {
+ free(m->host);
+ free(m);
+ log_err("malloc failure");
+ return NULL;
+ }
+ }
+ if(m->list) {
+ m->list = auth_addr_list_copy(m->list);
+ if(!m->list) {
+ free(m->file);
+ free(m->host);
+ free(m);
+ return NULL;
+ }
+ }
+ return m;
+}
+
+/** copy the master addresses from the task_probe lookups to the allow_notify
+ * list of masters */
+static void
+probe_copy_masters_for_allow_notify(struct auth_xfer* xfr)
+{
+ struct auth_master* list = NULL, *last = NULL;
+ struct auth_master* p;
+ /* build up new list with copies */
+ for(p = xfr->task_probe->masters; p; p=p->next) {
+ struct auth_master* m = auth_master_copy(p);
+ if(!m) {
+ auth_free_masters(list);
+ /* failed because of malloc failure, use old list */
+ return;
+ }
+ m->next = NULL;
+ if(last) last->next = m;
+ if(!list) list = m;
+ last = m;
+ }
+ /* success, replace list */
+ auth_free_masters(xfr->allow_notify_list);
+ xfr->allow_notify_list = list;
+}
+
/** start the lookups for task_transfer */
static void
xfr_transfer_start_lookups(struct auth_xfer* xfr)
@@ -3400,11 +3768,19 @@ xfr_transfer_nextmaster(struct auth_xfer* xfr)
if(xfr->task_transfer->scan_specific) {
xfr->task_transfer->scan_specific = NULL;
xfr->task_transfer->scan_target = xfr->task_transfer->masters;
+ if(xfr->task_transfer->scan_target && xfr->task_transfer->
+ scan_target->list)
+ xfr->task_transfer->scan_addr =
+ xfr->task_transfer->scan_target->list;
return;
}
if(!xfr->task_transfer->scan_target)
return;
xfr->task_transfer->scan_target = xfr->task_transfer->scan_target->next;
+ if(xfr->task_transfer->scan_target && xfr->task_transfer->
+ scan_target->list)
+ xfr->task_transfer->scan_addr =
+ xfr->task_transfer->scan_target->list;
return;
}
@@ -3422,11 +3798,19 @@ xfr_probe_nextmaster(struct auth_xfer* xfr)
if(xfr->task_probe->scan_specific) {
xfr->task_probe->scan_specific = NULL;
xfr->task_probe->scan_target = xfr->task_probe->masters;
+ if(xfr->task_probe->scan_target && xfr->task_probe->
+ scan_target->list)
+ xfr->task_probe->scan_addr =
+ xfr->task_probe->scan_target->list;
return;
}
if(!xfr->task_probe->scan_target)
return;
xfr->task_probe->scan_target = xfr->task_probe->scan_target->next;
+ if(xfr->task_probe->scan_target && xfr->task_probe->
+ scan_target->list)
+ xfr->task_probe->scan_addr =
+ xfr->task_probe->scan_target->list;
return;
}
@@ -3581,22 +3965,6 @@ check_packet_ok(sldns_buffer* pkt, uint16_t qtype, struct auth_xfer* xfr,
return 1;
}
-/** see if the serial means the zone has to be updated, i.e. the serial
- * is newer than the zone serial, or we have no zone */
-static int
-xfr_serial_means_update(struct auth_xfer* xfr, uint32_t serial)
-{
- if(!xfr->have_zone)
- return 1; /* no zone, anything is better */
- if(xfr->zone_expired)
- return 1; /* expired, the sent serial is better than expired
- data */
- if(compare_serial(xfr->serial, serial) < 0)
- return 1; /* our serial is smaller than the sent serial,
- the data is newer, fetch it */
- return 0;
-}
-
/** read one line from chunks into buffer at current position */
static int
chunkline_get_line(struct auth_chunk** chunk, size_t* chunk_pos,
@@ -3870,6 +4238,11 @@ chunkline_newline_removal(sldns_buffer* buf)
size_t i, end=sldns_buffer_limit(buf);
for(i=0; i<end; i++) {
char c = (char)sldns_buffer_read_u8_at(buf, i);
+ if(c == '\n' && i==end-1) {
+ sldns_buffer_write_u8_at(buf, i, 0);
+ sldns_buffer_set_limit(buf, end-1);
+ return;
+ }
if(c == '\n')
sldns_buffer_write_u8_at(buf, i, (uint8_t)' ');
}
@@ -4032,6 +4405,56 @@ log_rrlist_position(const char* label, struct auth_chunk* rr_chunk,
str, typestr);
}
+/** check that start serial is OK for ixfr. we are at rr_counter == 0,
+ * and we are going to check rr_counter == 1 (has to be type SOA) serial */
+static int
+ixfr_start_serial(struct auth_chunk* rr_chunk, int rr_num, size_t rr_pos,
+ uint8_t* rr_dname, uint16_t rr_type, uint16_t rr_class,
+ uint32_t rr_ttl, uint16_t rr_rdlen, uint8_t* rr_rdata,
+ size_t rr_nextpos, uint32_t transfer_serial, uint32_t xfr_serial)
+{
+ uint32_t startserial;
+ /* move forward on RR */
+ chunk_rrlist_gonext(&rr_chunk, &rr_num, &rr_pos, rr_nextpos);
+ if(chunk_rrlist_end(rr_chunk, rr_num)) {
+ /* no second SOA */
+ verbose(VERB_OPS, "IXFR has no second SOA record");
+ return 0;
+ }
+ if(!chunk_rrlist_get_current(rr_chunk, rr_num, rr_pos,
+ &rr_dname, &rr_type, &rr_class, &rr_ttl, &rr_rdlen,
+ &rr_rdata, &rr_nextpos)) {
+ verbose(VERB_OPS, "IXFR cannot parse second SOA record");
+ /* failed to parse RR */
+ return 0;
+ }
+ if(rr_type != LDNS_RR_TYPE_SOA) {
+ verbose(VERB_OPS, "IXFR second record is not type SOA");
+ return 0;
+ }
+ if(rr_rdlen < 22) {
+ verbose(VERB_OPS, "IXFR, second SOA has short rdlength");
+ return 0; /* bad SOA rdlen */
+ }
+ startserial = sldns_read_uint32(rr_rdata+rr_rdlen-20);
+ if(startserial == transfer_serial) {
+ /* empty AXFR, not an IXFR */
+ verbose(VERB_OPS, "IXFR second serial same as first");
+ return 0;
+ }
+ if(startserial != xfr_serial) {
+ /* wrong start serial, it does not match the serial in
+ * memory */
+ verbose(VERB_OPS, "IXFR is from serial %u to %u but %u "
+ "in memory, rejecting the zone transfer",
+ (unsigned)startserial, (unsigned)transfer_serial,
+ (unsigned)xfr_serial);
+ return 0;
+ }
+ /* everything OK in second SOA serial */
+ return 1;
+}
+
/** apply IXFR to zone in memory. z is locked. false on failure(mallocfail) */
static int
apply_ixfr(struct auth_xfer* xfr, struct auth_zone* z,
@@ -4078,6 +4501,13 @@ apply_ixfr(struct auth_xfer* xfr, struct auth_zone* z,
have_transfer_serial = 1;
transfer_serial = serial;
delmode = 1; /* gets negated below */
+ /* check second RR before going any further */
+ if(!ixfr_start_serial(rr_chunk, rr_num, rr_pos,
+ rr_dname, rr_type, rr_class, rr_ttl,
+ rr_rdlen, rr_rdata, rr_nextpos,
+ transfer_serial, xfr->serial)) {
+ return 0;
+ }
} else if(transfer_serial == serial) {
have_transfer_serial++;
if(rr_counter == 1) {
@@ -4308,6 +4738,28 @@ apply_http(struct auth_xfer* xfr, struct auth_zone* z,
return 1;
}
+/** write http chunks to zonefile to create downloaded file */
+static int
+auth_zone_write_chunks(struct auth_xfer* xfr, const char* fname)
+{
+ FILE* out;
+ struct auth_chunk* p;
+ out = fopen(fname, "w");
+ if(!out) {
+ log_err("could not open %s: %s", fname, strerror(errno));
+ return 0;
+ }
+ for(p = xfr->task_transfer->chunks_first; p ; p = p->next) {
+ if(!write_out(out, (char*)p->data, p->len)) {
+ log_err("could not write http download to %s", fname);
+ fclose(out);
+ return 0;
+ }
+ }
+ fclose(out);
+ return 1;
+}
+
/** write to zonefile after zone has been updated */
static void
xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env)
@@ -4346,7 +4798,13 @@ xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env)
}
snprintf(tmpfile, sizeof(tmpfile), "%s.tmp%u", z->zonefile,
(unsigned)getpid());
- if(!auth_zone_write_file(z, tmpfile)) {
+ if(xfr->task_transfer->master->http) {
+ /* use the stored chunk list to write them */
+ if(!auth_zone_write_chunks(xfr, tmpfile)) {
+ unlink(tmpfile);
+ lock_rw_unlock(&z->lock);
+ }
+ } else if(!auth_zone_write_file(z, tmpfile)) {
unlink(tmpfile);
lock_rw_unlock(&z->lock);
return;
@@ -4465,6 +4923,9 @@ xfr_transfer_lookup_host(struct auth_xfer* xfr, struct module_env* env)
/* not needed, host is in IP addr format */
return 0;
}
+ if(master->allow_notify)
+ return 0; /* allow-notifies are not transferred from, no
+ lookup is needed */
/* use mesh_new_callback to probe for non-addr hosts,
* and then wait for them to be looked up (in cache, or query) */
@@ -4519,6 +4980,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
socklen_t addrlen = 0;
struct auth_master* master = xfr->task_transfer->master;
if(!master) return 0;
+ if(master->allow_notify) return 0; /* only for notify */
/* get master addr */
if(xfr->task_transfer->scan_addr) {
@@ -4623,7 +5085,7 @@ 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);
+ xfr_set_timeout(xfr, env, 1, 0);
lock_basic_unlock(&xfr->lock);
}
@@ -4635,6 +5097,8 @@ xfr_master_add_addrs(struct auth_master* m, struct ub_packed_rrset_key* rrset,
size_t i;
struct packed_rrset_data* data;
if(!m || !rrset) return;
+ if(rrtype != LDNS_RR_TYPE_A && rrtype != LDNS_RR_TYPE_AAAA)
+ return;
data = (struct packed_rrset_data*)rrset->entry.data;
for(i=0; i<data->count; i++) {
struct auth_addr* a;
@@ -5056,8 +5520,30 @@ process_list_end_transfer(struct auth_xfer* xfr, struct module_env* env)
/* we fetched the zone, move to wait task */
xfr_transfer_disown(xfr);
- /* pick up the nextprobe task and wait (normail wait time) */
- xfr_set_timeout(xfr, env, 0);
+ if(xfr->notify_received && (!xfr->notify_has_serial ||
+ (xfr->notify_has_serial &&
+ xfr_serial_means_update(xfr, xfr->notify_serial)))) {
+ uint32_t sr = xfr->notify_serial;
+ int has_sr = xfr->notify_has_serial;
+ /* we received a notify while probe/transfer was
+ * in progress. start a new probe and transfer */
+ xfr->notify_received = 0;
+ xfr->notify_has_serial = 0;
+ xfr->notify_serial = 0;
+ if(!xfr_start_probe(xfr, env, NULL)) {
+ /* if we couldn't start it, already in
+ * progress; restore notify serial,
+ * while xfr still locked */
+ xfr->notify_received = 1;
+ xfr->notify_has_serial = has_sr;
+ xfr->notify_serial = sr;
+ lock_basic_unlock(&xfr->lock);
+ }
+ return;
+ } else {
+ /* pick up the nextprobe task and wait (normail wait time) */
+ xfr_set_timeout(xfr, env, 0, 0);
+ }
lock_basic_unlock(&xfr->lock);
return;
}
@@ -5248,6 +5734,9 @@ xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env,
/* pick master */
struct auth_master* master = xfr_probe_current_master(xfr);
if(!master) return 0;
+ if(master->allow_notify) return 0; /* only for notify */
+ if(master->http) return 0; /* only masters get SOA UDP probe,
+ not urls, if those are in this list */
/* get master addr */
if(xfr->task_probe->scan_addr) {
@@ -5400,7 +5889,7 @@ auth_xfer_probe_udp_callback(struct comm_point* c, void* arg, int err,
if(xfr->have_zone)
xfr->lease_time = *env->now;
if(xfr->task_nextprobe->worker == NULL)
- xfr_set_timeout(xfr, env, 0);
+ xfr_set_timeout(xfr, env, 0, 0);
}
/* other tasks are running, we don't do this anymore */
xfr_probe_disown(xfr);
@@ -5445,6 +5934,11 @@ xfr_probe_lookup_host(struct auth_xfer* xfr, struct module_env* env)
/* not needed, host is in IP addr format */
return 0;
}
+ if(master->allow_notify && !master->http &&
+ strchr(master->host, '/') != NULL &&
+ strchr(master->host, '/') == strrchr(master->host, '/')) {
+ return 0; /* is IP/prefix format, not something to look up */
+ }
/* use mesh_new_callback to probe for non-addr hosts,
* and then wait for them to be looked up (in cache, or query) */
@@ -5507,6 +6001,17 @@ xfr_probe_send_or_end(struct auth_xfer* xfr, struct module_env* env)
}
xfr_probe_move_to_next_lookup(xfr, env);
}
+ /* probe of list has ended. Create or refresh the list of of
+ * allow_notify addrs */
+ probe_copy_masters_for_allow_notify(xfr);
+ if(xfr->task_probe->only_lookup) {
+ /* 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);
+ lock_basic_unlock(&xfr->lock);
+ return;
+ }
/* send probe packets */
while(!xfr_probe_end_of_list(xfr)) {
@@ -5524,7 +6029,7 @@ xfr_probe_send_or_end(struct auth_xfer* xfr, struct module_env* env)
xfr_probe_disown(xfr);
/* pick up the nextprobe task and wait */
- xfr_set_timeout(xfr, env, 1);
+ xfr_set_timeout(xfr, env, 1, 0);
lock_basic_unlock(&xfr->lock);
}
@@ -5611,19 +6116,45 @@ auth_xfer_timer(void* arg)
xfr_nextprobe_disown(xfr);
+ if(!xfr_start_probe(xfr, env, NULL)) {
+ /* not started because already in progress */
+ lock_basic_unlock(&xfr->lock);
+ }
+}
+
+/** return true if there are probe (SOA UDP query) targets in the master list*/
+static int
+have_probe_targets(struct auth_master* list)
+{
+ struct auth_master* p;
+ for(p=list; p; p = p->next) {
+ if(!p->allow_notify && p->host)
+ return 1;
+ }
+ return 0;
+}
+
+/** start task_probe if possible, if no masters for probe start task_transfer
+ * returns true if task has been started, and false if the task is already
+ * in progress. */
+static int
+xfr_start_probe(struct auth_xfer* xfr, struct module_env* env,
+ struct auth_master* spec)
+{
/* see if we need to start a probe (or maybe it is already in
* progress (due to notify)) */
if(xfr->task_probe->worker == NULL) {
- if(xfr->task_probe->masters == NULL) {
+ if(!have_probe_targets(xfr->task_probe->masters) &&
+ !(xfr->task_probe->only_lookup &&
+ xfr->task_probe->masters != NULL)) {
/* useless to pick up task_probe, no masters to
* probe. Instead attempt to pick up task transfer */
if(xfr->task_transfer->worker == NULL) {
- xfr_start_transfer(xfr, env, NULL);
- } else {
- /* task transfer already in progress */
- lock_basic_unlock(&xfr->lock);
+ xfr_start_transfer(xfr, env, spec);
+ return 1;
}
- return;
+ /* task transfer already in progress */
+ return 0;
}
/* pick up the probe task ourselves */
@@ -5632,15 +6163,17 @@ auth_xfer_timer(void* arg)
xfr->task_probe->cp = NULL;
/* start the task */
- /* this was a timeout, so no specific first master to scan */
- xfr_probe_start_list(xfr, NULL);
+ /* 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 */
+ xfr_probe_start_list(xfr, spec);
/* setup to start the lookup of hostnames of masters afresh */
xfr_probe_start_lookups(xfr);
/* send the probe packet or next send, or end task */
xfr_probe_send_or_end(xfr, env);
- } else {
- lock_basic_unlock(&xfr->lock);
+ return 1;
}
+ return 0;
}
/** for task_nextprobe.
@@ -5648,10 +6181,11 @@ auth_xfer_timer(void* arg)
* @param xfr: task structure
* @param env: module environment, with worker and time.
* @param failure: set true if timer should be set for failure retry.
+ * @param lookup_only: only perform lookups when timer done, 0 sec timeout
*/
static void
xfr_set_timeout(struct auth_xfer* xfr, struct module_env* env,
- int failure)
+ int failure, int lookup_only)
{
struct timeval tv;
log_assert(xfr->task_nextprobe != NULL);
@@ -5661,7 +6195,7 @@ xfr_set_timeout(struct auth_xfer* xfr, struct module_env* env,
* but if expiry is sooner, use that one.
* after a failure, use the retry timer instead. */
xfr->task_nextprobe->next_probe = *env->now;
- if(xfr->lease_time)
+ if(xfr->lease_time && !failure)
xfr->task_nextprobe->next_probe = xfr->lease_time;
if(!failure) {
@@ -5684,6 +6218,12 @@ xfr_set_timeout(struct auth_xfer* xfr, struct module_env* env,
if(failure)
xfr->task_nextprobe->next_probe +=
xfr->task_nextprobe->backoff;
+ /* put the timer exactly on expiry, if possible */
+ if(xfr->lease_time && xfr->lease_time+xfr->expiry <
+ xfr->task_nextprobe->next_probe &&
+ xfr->lease_time+xfr->expiry > *env->now)
+ xfr->task_nextprobe->next_probe =
+ xfr->lease_time+xfr->expiry;
} else {
xfr->task_nextprobe->next_probe +=
xfr->task_nextprobe->backoff;
@@ -5708,6 +6248,13 @@ xfr_set_timeout(struct auth_xfer* xfr, struct module_env* env,
tv.tv_sec = xfr->task_nextprobe->next_probe -
*(xfr->task_nextprobe->env->now);
else tv.tv_sec = 0;
+ if(tv.tv_sec != 0 && lookup_only && xfr->task_probe->masters) {
+ /* don't lookup_only, if lookup timeout is 0 anyway,
+ * or if we don't have masters to lookup */
+ tv.tv_sec = 0;
+ if(xfr->task_probe && xfr->task_probe->worker == NULL)
+ xfr->task_probe->only_lookup = 1;
+ }
if(verbosity >= VERB_ALGO) {
char zname[255+1];
dname_str(xfr->name, zname);
@@ -5731,8 +6278,9 @@ auth_xfer_pickup_initial(struct auth_zones* az, struct module_env* env)
* notes the start time when the data was acquired */
if(x->have_zone)
x->lease_time = *env->now;
- if(x->task_nextprobe && x->task_nextprobe->worker == NULL)
- xfr_set_timeout(x, env, 0);
+ if(x->task_nextprobe && x->task_nextprobe->worker == NULL) {
+ xfr_set_timeout(x, env, 0, 1);
+ }
lock_basic_unlock(&x->lock);
}
lock_rw_unlock(&az->lock);
@@ -5889,7 +6437,7 @@ static char*
dup_all(char* str)
{
char* result = strdup(str);
- if(!str) {
+ if(!result) {
log_err("malloc failure");
return NULL;
}
@@ -6006,6 +6554,15 @@ xfer_set_masters(struct auth_master** list, struct config_auth* c,
return 0;
}
}
+ for(p = c->allow_notify; p; p = p->next) {
+ m = auth_master_new(&list);
+ m->allow_notify = 1;
+ m->host = strdup(p->str);
+ if(!m->host) {
+ log_err("malloc failure");
+ return 0;
+ }
+ }
return 1;
}
diff --git a/services/authzone.h b/services/authzone.h
index d54ef4b96e49..4e06c0654d99 100644
--- a/services/authzone.h
+++ b/services/authzone.h
@@ -77,6 +77,10 @@ struct auth_zones {
rbtree_type xtree;
/** do we have downstream enabled */
int have_downstream;
+ /** number of queries upstream */
+ size_t num_query_up;
+ /** number of queries downstream */
+ size_t num_query_down;
};
/**
@@ -122,6 +126,10 @@ struct auth_zone {
/** for upstream: this zone answers queries that unbound intends to
* send upstream. */
int for_upstream;
+ /** zone has been deleted */
+ int zone_deleted;
+ /** deletelist pointer, unused normally except during delete */
+ struct auth_zone* delete_next;
};
/**
@@ -214,8 +222,14 @@ struct auth_xfer {
* Hold the lock to access this member (and the serial).
*/
int notify_received;
+ /** true if the notify_received has a serial number */
+ int notify_has_serial;
/** serial number of the notify */
uint32_t notify_serial;
+ /** the list of masters for checking notifies. This list is
+ * empty on start, and a copy of the list from the probe_task when
+ * it is done looking them up. */
+ struct auth_master* allow_notify_list;
/* protected by the lock on the structure, information about
* the loaded authority zone. */
@@ -292,6 +306,9 @@ struct auth_probe {
struct auth_master* lookup_target;
/** are we looking up A or AAAA, first A, then AAAA (if ip6 enabled) */
int lookup_aaaa;
+ /** we only want to do lookups for making config work (for notify),
+ * don't proceed with UDP SOA probe queries */
+ int only_lookup;
/** once notified, or the timeout has been reached. a scan starts. */
/** the scan specific target (notify source), or NULL if none */
@@ -400,6 +417,9 @@ struct auth_master {
int http;
/** use IXFR for this master */
int ixfr;
+ /** this is an allow notify member, the master can send notifies
+ * to us, but we don't send SOA probes, or zone transfer from it */
+ int allow_notify;
/** use ssl for channel */
int ssl;
/** the port number (for urls) */
@@ -541,9 +561,39 @@ int auth_zone_set_fallback(struct auth_zone* z, char* fallbackstr);
int auth_zones_can_fallback(struct auth_zones* az, uint8_t* nm, size_t nmlen,
uint16_t dclass);
+/** process notify for auth zones.
+ * first checks the access list. Then processes the notify. This starts
+ * the probe sequence or it notes the serial number (if any)
+ * @param az: auth zones structure.
+ * @param env: module env of the worker that is handling the notify. it will
+ * pick up the task probe (or transfer), unless already in progress by
+ * another worker.
+ * @param nm: name of the zone. Uncompressed. from query.
+ * @param nmlen: length of name.
+ * @param dclass: class of zone.
+ * @param addr: source address of notify
+ * @param addrlen: length of addr.
+ * @param has_serial: if true, the notify has a serial attached.
+ * @param serial: the serial number, if has_serial is true.
+ * @param refused: is set to true on failure to note refused access.
+ * @return fail on failures (refused is false) and when access is
+ * denied (refused is true). True when processed.
+ */
+int auth_zones_notify(struct auth_zones* az, struct module_env* env,
+ uint8_t* nm, size_t nmlen, uint16_t dclass,
+ struct sockaddr_storage* addr, socklen_t addrlen, int has_serial,
+ uint32_t serial, int* refused);
+
+/** process notify packet and read serial number from SOA.
+ * returns 0 if no soa record in the notify */
+int auth_zone_parse_notify_serial(struct sldns_buffer* pkt, uint32_t *serial);
+
/** read auth zone from zonefile. caller must lock zone. false on failure */
int auth_zone_read_zonefile(struct auth_zone* z);
+/** find serial number of zone or false if none (no SOA record) */
+int auth_zone_get_serial(struct auth_zone* z, uint32_t* serial);
+
/** compare auth_zones for sorted rbtree */
int auth_zone_cmp(const void* z1, const void* z2);
diff --git a/services/cache/dns.c b/services/cache/dns.c
index 411793c6c270..35adc35b57ee 100644
--- a/services/cache/dns.c
+++ b/services/cache/dns.c
@@ -108,6 +108,48 @@ store_rrsets(struct module_env* env, struct reply_info* rep, time_t now,
}
}
+/** delete message from message cache */
+static void
+msg_cache_remove(struct module_env* env, uint8_t* qname, size_t qnamelen,
+ uint16_t qtype, uint16_t qclass, uint16_t flags)
+{
+ struct query_info k;
+ hashvalue_type h;
+
+ k.qname = qname;
+ k.qname_len = qnamelen;
+ k.qtype = qtype;
+ k.qclass = qclass;
+ k.local_alias = NULL;
+ h = query_info_hash(&k, flags);
+ slabhash_remove(env->msg_cache, h, &k);
+}
+
+/** remove servfail msg cache entry */
+static void
+msg_del_servfail(struct module_env* env, struct query_info* qinfo,
+ uint32_t flags)
+{
+ struct msgreply_entry* e;
+ /* see if the entry is servfail, and then remove it, so that
+ * lookups move from the cacheresponse stage to the recursionresponse
+ * stage */
+ e = msg_cache_lookup(env, qinfo->qname, qinfo->qname_len,
+ qinfo->qtype, qinfo->qclass, flags, 0, 0);
+ if(!e) return;
+ /* we don't check for the ttl here, also expired servfail entries
+ * are removed. If the user uses serve-expired, they would still be
+ * used to answer from cache */
+ if(FLAGS_GET_RCODE(((struct reply_info*)e->entry.data)->flags)
+ != LDNS_RCODE_SERVFAIL) {
+ lock_rw_unlock(&e->entry.lock);
+ return;
+ }
+ lock_rw_unlock(&e->entry.lock);
+ msg_cache_remove(env, qinfo->qname, qinfo->qname_len, qinfo->qtype,
+ qinfo->qclass, flags);
+}
+
void
dns_cache_store_msg(struct module_env* env, struct query_info* qinfo,
hashvalue_type hash, struct reply_info* rep, time_t leeway, int pside,
@@ -132,6 +174,12 @@ dns_cache_store_msg(struct module_env* env, struct query_info* qinfo,
* which could be useful for delegation information */
verbose(VERB_ALGO, "TTL 0: dropped msg from cache");
free(rep);
+ /* if the message is SERVFAIL in cache, remove that SERVFAIL,
+ * so that the TTL 0 response can be returned for future
+ * responses (i.e. don't get answered by the servfail from
+ * cache, but instead go to recursion to get this TTL0
+ * response). */
+ msg_del_servfail(env, qinfo, flags);
return;
}
diff --git a/services/cache/rrset.c b/services/cache/rrset.c
index 0b41fcd7dc3f..26c1aeb91c62 100644
--- a/services/cache/rrset.c
+++ b/services/cache/rrset.c
@@ -255,9 +255,11 @@ void rrset_cache_update_wildcard(struct rrset_cache* rrset_cache,
wc_dname[1] = (uint8_t)'*';
memmove(wc_dname+2, ce, ce_len);
+ free(rrset->rk.dname);
rrset->rk.dname_len = ce_len + 2;
rrset->rk.dname = (uint8_t*)memdup(wc_dname, rrset->rk.dname_len);
if(!rrset->rk.dname) {
+ alloc_special_release(alloc, rrset);
log_err("memdup failure in rrset_cache_update_wildcard");
return;
}
diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c
index d099ca9449b7..6639fd3fc5cf 100644
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -1056,6 +1056,26 @@ set_recvpktinfo(int s, int family)
return 1;
}
+/** see if interface is ssl, its port number == the ssl port number */
+static int
+if_is_ssl(const char* ifname, const char* port, int ssl_port,
+ struct config_strlist* additional_tls_port)
+{
+ struct config_strlist* s;
+ char* p = strchr(ifname, '@');
+ if(!p && atoi(port) == ssl_port)
+ return 1;
+ if(p && atoi(p+1) == ssl_port)
+ return 1;
+ for(s = additional_tls_port; s; s = s->next) {
+ if(p && atoi(p+1) == atoi(s->str))
+ return 1;
+ if(!p && atoi(port) == atoi(s->str))
+ return 1;
+ }
+ return 0;
+}
+
/**
* Helper for ports_open. Creates one interface (or NULL for default).
* @param ifname: The interface ip address.
@@ -1069,6 +1089,7 @@ set_recvpktinfo(int s, int family)
* @param rcv: receive buffer size for UDP
* @param snd: send buffer size for UDP
* @param ssl_port: ssl service port number
+ * @param additional_tls_port: list of additional ssl service port numbers.
* @param reuseport: try to set SO_REUSEPORT if nonNULL and true.
* set to false on exit if reuseport failed due to no kernel support.
* @param transparent: set IP_TRANSPARENT socket option.
@@ -1081,8 +1102,10 @@ set_recvpktinfo(int s, int family)
static int
ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
struct addrinfo *hints, const char* port, struct listen_port** list,
- size_t rcv, size_t snd, int ssl_port, int* reuseport, int transparent,
- int tcp_mss, int freebind, int use_systemd, int dnscrypt_port)
+ size_t rcv, size_t snd, int ssl_port,
+ struct config_strlist* additional_tls_port, int* reuseport,
+ int transparent, int tcp_mss, int freebind, int use_systemd,
+ int dnscrypt_port)
{
int s, noip6=0;
#ifdef USE_DNSCRYPT
@@ -1146,9 +1169,8 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
}
}
if(do_tcp) {
- int is_ssl = ((strchr(ifname, '@') &&
- atoi(strchr(ifname, '@')+1) == ssl_port) ||
- (!strchr(ifname, '@') && atoi(port) == ssl_port));
+ int is_ssl = if_is_ssl(ifname, port, ssl_port,
+ additional_tls_port);
if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1,
&noip6, 0, 0, reuseport, transparent, tcp_mss,
freebind, use_systemd)) == -1) {
@@ -1334,8 +1356,8 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
do_auto, cfg->do_udp, do_tcp,
&hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
- cfg->ssl_port, reuseport,
- cfg->ip_transparent,
+ cfg->ssl_port, cfg->additional_tls_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind, cfg->use_systemd,
cfg->dnscrypt_port)) {
listening_ports_free(list);
@@ -1348,8 +1370,8 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
do_auto, cfg->do_udp, do_tcp,
&hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
- cfg->ssl_port, reuseport,
- cfg->ip_transparent,
+ cfg->ssl_port, cfg->additional_tls_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind, cfg->use_systemd,
cfg->dnscrypt_port)) {
listening_ports_free(list);
@@ -1364,8 +1386,8 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
if(!ports_create_if(cfg->ifs[i], 0, cfg->do_udp,
do_tcp, &hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
- cfg->ssl_port, reuseport,
- cfg->ip_transparent,
+ cfg->ssl_port, cfg->additional_tls_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind, cfg->use_systemd,
cfg->dnscrypt_port)) {
listening_ports_free(list);
@@ -1378,8 +1400,8 @@ listening_ports_open(struct config_file* cfg, int* reuseport)
if(!ports_create_if(cfg->ifs[i], 0, cfg->do_udp,
do_tcp, &hints, portbuf, &list,
cfg->so_rcvbuf, cfg->so_sndbuf,
- cfg->ssl_port, reuseport,
- cfg->ip_transparent,
+ cfg->ssl_port, cfg->additional_tls_port,
+ reuseport, cfg->ip_transparent,
cfg->tcp_mss, cfg->ip_freebind, cfg->use_systemd,
cfg->dnscrypt_port)) {
listening_ports_free(list);
diff --git a/services/mesh.c b/services/mesh.c
index 3395dc62e674..3027cef00900 100644
--- a/services/mesh.c
+++ b/services/mesh.c
@@ -736,7 +736,8 @@ mesh_state_cleanup(struct mesh_state* mstate)
comm_point_drop_reply(&rep->query_reply);
mesh->num_reply_addrs--;
}
- for(cb=mstate->cb_list; cb; cb=cb->next) {
+ while((cb = mstate->cb_list)!=NULL) {
+ 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);
@@ -974,7 +975,8 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
else secure = 0;
if(!rep && rcode == LDNS_RCODE_NOERROR)
rcode = LDNS_RCODE_SERVFAIL;
- if(!rcode && rep->security == sec_status_bogus) {
+ if(!rcode && (rep->security == sec_status_bogus ||
+ rep->security == sec_status_secure_sentinel_fail)) {
if(!(reason = errinf_to_str(&m->s)))
rcode = LDNS_RCODE_SERVFAIL;
}
@@ -1040,7 +1042,8 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
/* examine security status */
if(m->s.env->need_to_validate && (!(r->qflags&BIT_CD) ||
m->s.env->cfg->ignore_cd) && rep &&
- rep->security <= sec_status_bogus) {
+ (rep->security <= sec_status_bogus ||
+ rep->security == sec_status_secure_sentinel_fail)) {
rcode = LDNS_RCODE_SERVFAIL;
if(m->s.env->cfg->stat_extended)
m->s.env->mesh->ans_bogus++;
@@ -1167,7 +1170,13 @@ void mesh_query_done(struct mesh_state* mstate)
}
}
mstate->replies_sent = 1;
- for(c = mstate->cb_list; c; c = c->next) {
+ while((c = mstate->cb_list) != NULL) {
+ /* take this cb off the list; so that the list can be
+ * changed, eg. by adds from the callback routine */
+ mstate->cb_list = c->next;
+ if(!mstate->reply_list && !mstate->cb_list &&
+ mstate->super_set.count == 0)
+ mstate->s.env->mesh->num_detached_states++;
mesh_do_callback(mstate, mstate->s.return_rcode, rep, c);
}
}
diff --git a/services/outside_network.c b/services/outside_network.c
index 92212be02f0d..63dfe4961183 100644
--- a/services/outside_network.c
+++ b/services/outside_network.c
@@ -364,6 +364,20 @@ outnet_tcp_take_into_use(struct waiting_tcp* w, uint8_t* pkt, size_t pkt_len)
comm_point_tcp_win_bio_cb(pend->c, pend->c->ssl);
#endif
pend->c->ssl_shake_state = comm_ssl_shake_write;
+#ifdef HAVE_SSL_SET1_HOST
+ if(w->tls_auth_name) {
+ SSL_set_verify(pend->c->ssl, SSL_VERIFY_PEER, NULL);
+ /* setting the hostname makes openssl verify the
+ * host name in the x509 certificate in the
+ * SSL connection*/
+ if(!SSL_set1_host(pend->c->ssl, w->tls_auth_name)) {
+ log_err("SSL_set1_host failed");
+ pend->c->fd = s;
+ comm_point_close(pend->c);
+ return 0;
+ }
+ }
+#endif /* HAVE_SSL_SET1_HOST */
}
w->pkt = NULL;
w->next_waiting = (void*)pend;
@@ -851,6 +865,7 @@ serviced_node_del(rbnode_type* node, void* ATTR_UNUSED(arg))
struct service_callback* p = sq->cblist, *np;
free(sq->qbuf);
free(sq->zone);
+ free(sq->tls_auth_name);
edns_opt_list_free(sq->opt_list);
while(p) {
np = p->next;
@@ -1284,6 +1299,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
w->cb = callback;
w->cb_arg = callback_arg;
w->ssl_upstream = sq->ssl_upstream;
+ w->tls_auth_name = sq->tls_auth_name;
#ifndef S_SPLINT_S
tv.tv_sec = timeout;
tv.tv_usec = 0;
@@ -1357,8 +1373,8 @@ lookup_serviced(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
static struct serviced_query*
serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
int want_dnssec, int nocaps, int tcp_upstream, int ssl_upstream,
- struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, int qtype, struct edns_option* opt_list)
+ char* tls_auth_name, struct sockaddr_storage* addr, socklen_t addrlen,
+ uint8_t* zone, size_t zonelen, int qtype, struct edns_option* opt_list)
{
struct serviced_query* sq = (struct serviced_query*)malloc(sizeof(*sq));
#ifdef UNBOUND_DEBUG
@@ -1386,12 +1402,24 @@ serviced_create(struct outside_network* outnet, sldns_buffer* buff, int dnssec,
sq->nocaps = nocaps;
sq->tcp_upstream = tcp_upstream;
sq->ssl_upstream = ssl_upstream;
+ if(tls_auth_name) {
+ sq->tls_auth_name = strdup(tls_auth_name);
+ if(!sq->tls_auth_name) {
+ free(sq->zone);
+ free(sq->qbuf);
+ free(sq);
+ return NULL;
+ }
+ } else {
+ sq->tls_auth_name = NULL;
+ }
memcpy(&sq->addr, addr, addrlen);
sq->addrlen = addrlen;
sq->opt_list = NULL;
if(opt_list) {
sq->opt_list = edns_opt_copy_alloc(opt_list);
if(!sq->opt_list) {
+ free(sq->tls_auth_name);
free(sq->zone);
free(sq->qbuf);
free(sq);
@@ -2055,7 +2083,7 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
struct serviced_query*
outnet_serviced_query(struct outside_network* outnet,
struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
- int nocaps, int tcp_upstream, int ssl_upstream,
+ int nocaps, int tcp_upstream, int ssl_upstream, char* tls_auth_name,
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
size_t zonelen, struct module_qstate* qstate,
comm_point_callback_type* callback, void* callback_arg, sldns_buffer* buff,
@@ -2078,8 +2106,9 @@ outnet_serviced_query(struct outside_network* outnet,
if(!sq) {
/* make new serviced query entry */
sq = serviced_create(outnet, buff, dnssec, want_dnssec, nocaps,
- tcp_upstream, ssl_upstream, addr, addrlen, zone,
- zonelen, (int)qinfo->qtype, qstate->edns_opts_back_out);
+ tcp_upstream, ssl_upstream, tls_auth_name, addr,
+ addrlen, zone, zonelen, (int)qinfo->qtype,
+ qstate->edns_opts_back_out);
if(!sq) {
free(cb);
return NULL;
diff --git a/services/outside_network.h b/services/outside_network.h
index 09b2e6cedff6..105f7651363f 100644
--- a/services/outside_network.h
+++ b/services/outside_network.h
@@ -290,6 +290,8 @@ struct waiting_tcp {
void* cb_arg;
/** if it uses ssl upstream */
int ssl_upstream;
+ /** ref to the tls_auth_name from the serviced_query */
+ char* tls_auth_name;
};
/**
@@ -332,6 +334,9 @@ struct serviced_query {
int nocaps;
/** tcp upstream used, use tcp, or ssl_upstream for SSL */
int tcp_upstream, ssl_upstream;
+ /** the name of the tls authentication name, eg. 'ns.example.com'
+ * or NULL */
+ char* tls_auth_name;
/** where to send it */
struct sockaddr_storage addr;
/** length of addr field in use. */
@@ -484,6 +489,8 @@ void pending_delete(struct outside_network* outnet, struct pending* p);
* @param nocaps: ignore use_caps_for_id and use unperturbed qname.
* @param tcp_upstream: use TCP for upstream queries.
* @param ssl_upstream: use SSL for upstream queries.
+ * @param tls_auth_name: when ssl_upstream is true, use this name to check
+ * the server's peer certificate.
* @param addr: to which server to send the query.
* @param addrlen: length of addr.
* @param zone: name of the zone of the delegation point. wireformat dname.
@@ -501,7 +508,7 @@ void pending_delete(struct outside_network* outnet, struct pending* p);
*/
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
- int nocaps, int tcp_upstream, int ssl_upstream,
+ int nocaps, int tcp_upstream, int ssl_upstream, char* tls_auth_name,
struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
size_t zonelen, struct module_qstate* qstate,
comm_point_callback_type* callback, void* callback_arg,
diff --git a/sldns/keyraw.c b/sldns/keyraw.c
index e2f14f2a4e97..2ec225bc5bd8 100644
--- a/sldns/keyraw.c
+++ b/sldns/keyraw.c
@@ -90,6 +90,14 @@ sldns_rr_dnskey_key_size_raw(const unsigned char* keydata,
case LDNS_ECDSAP384SHA384:
return 384;
#endif
+#ifdef USE_ED25519
+ case LDNS_ED25519:
+ return 256;
+#endif
+#ifdef USE_ED448
+ case LDNS_ED448:
+ return 456;
+#endif
default:
return 0;
}
@@ -409,6 +417,27 @@ sldns_ed255192pkey_raw(const unsigned char* key, size_t keylen)
}
#endif /* USE_ED25519 */
+#ifdef USE_ED448
+EVP_PKEY*
+sldns_ed4482pkey_raw(const unsigned char* key, size_t keylen)
+{
+ /* ASN1 for ED448 is 3043300506032b6571033a00 <57byteskey> */
+ uint8_t pre[] = {0x30, 0x43, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65,
+ 0x71, 0x03, 0x3a, 0x00};
+ int pre_len = 12;
+ uint8_t buf[256];
+ EVP_PKEY *evp_key;
+ /* pp gets modified by d2i() */
+ const unsigned char* pp = (unsigned char*)buf;
+ if(keylen != 57 || keylen + pre_len > sizeof(buf))
+ return NULL; /* wrong length */
+ memmove(buf, pre, pre_len);
+ memmove(buf+pre_len, key, keylen);
+ evp_key = d2i_PUBKEY(NULL, &pp, (int)(pre_len+keylen));
+ return evp_key;
+}
+#endif /* USE_ED448 */
+
int
sldns_digest_evp(unsigned char* data, unsigned int len, unsigned char* dest,
const EVP_MD* md)
diff --git a/sldns/keyraw.h b/sldns/keyraw.h
index 19653b46c7ba..989b02ce052e 100644
--- a/sldns/keyraw.h
+++ b/sldns/keyraw.h
@@ -102,6 +102,15 @@ RSA *sldns_key_buf2rsa_raw(unsigned char* key, size_t len);
EVP_PKEY* sldns_ed255192pkey_raw(const unsigned char* key, size_t len);
/**
+ * Converts a holding buffer with key material to EVP PKEY in openssl.
+ * Only available if ldns was compiled with ED448.
+ * \param[in] key the uncompressed wireformat of the key.
+ * \param[in] len length of key data
+ * \return the key or NULL on error.
+ */
+EVP_PKEY* sldns_ed4482pkey_raw(const unsigned char* key, size_t len);
+
+/**
* Utility function to calculate hash using generic EVP_MD pointer.
* \param[in] data the data to hash.
* \param[in] len length of data.
diff --git a/sldns/str2wire.c b/sldns/str2wire.c
index fdb355754028..1a51bb695607 100644
--- a/sldns/str2wire.c
+++ b/sldns/str2wire.c
@@ -1225,6 +1225,17 @@ int sldns_str2wire_b32_ext_buf(const char* str, uint8_t* rd, size_t* len)
return LDNS_WIREPARSE_ERR_OK;
}
+/** see if the string ends, or ends in whitespace */
+static int
+sldns_is_last_of_string(const char* str)
+{
+ if(*str == 0) return 1;
+ while(isspace((unsigned char)*str))
+ str++;
+ if(*str == 0) return 1;
+ return 0;
+}
+
int sldns_str2wire_hex_buf(const char* str, uint8_t* rd, size_t* len)
{
const char* s = str;
@@ -1234,7 +1245,7 @@ int sldns_str2wire_hex_buf(const char* str, uint8_t* rd, size_t* len)
s++;
continue;
}
- if(dlen == 0 && *s == '0' && *(s+1) == 0) {
+ if(dlen == 0 && *s == '0' && sldns_is_last_of_string(s+1)) {
*len = 0;
return LDNS_WIREPARSE_ERR_OK;
}
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
index 086afa8dddeb..2337e7a73728 100644
--- a/smallapp/unbound-control.c
+++ b/smallapp/unbound-control.c
@@ -142,6 +142,7 @@ usage(void)
printf(" ratelimit_list [+a] list ratelimited domains\n");
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(" 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");
@@ -349,6 +350,8 @@ static void print_extended(struct ub_stats_info* s)
PR_UL("num.answer.secure", s->svr.ans_secure);
PR_UL("num.answer.bogus", s->svr.ans_bogus);
PR_UL("num.rrset.bogus", s->svr.rrset_bogus);
+ PR_UL("num.query.aggressive.NOERROR", s->svr.num_neg_cache_noerror);
+ PR_UL("num.query.aggressive.NXDOMAIN", s->svr.num_neg_cache_nxdomain);
/* threat detection */
PR_UL("unwanted.queries", s->svr.unwanted_queries);
PR_UL("unwanted.replies", s->svr.unwanted_replies);
@@ -366,6 +369,8 @@ static void print_extended(struct ub_stats_info* s)
PR_UL("num.query.dnscrypt.replay",
s->svr.num_query_dnscrypt_replay);
#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);
}
/** print statistics out of memory structures */
@@ -476,10 +481,15 @@ setup_ctx(struct config_file* cfg)
free(c_cert);
} else {
/* Use ciphers that don't require authentication */
+#if defined(SSL_OP_NO_TLSv1_3)
+ /* in openssl 1.1.1, negotiation code for tls 1.3 does
+ * not allow the unauthenticated aNULL and eNULL ciphers */
+ SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_3);
+#endif
#ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
SSL_CTX_set_security_level(ctx, 0);
#endif
- if(!SSL_CTX_set_cipher_list(ctx, "aNULL, eNULL"))
+ if(!SSL_CTX_set_cipher_list(ctx, "aNULL:eNULL"))
ssl_err("Error setting NULL cipher!");
}
return ctx;
diff --git a/smallapp/worker_cb.c b/smallapp/worker_cb.c
index e88e8c8d754b..dda94cc670cf 100644
--- a/smallapp/worker_cb.c
+++ b/smallapp/worker_cb.c
@@ -105,7 +105,7 @@ struct outbound_entry* worker_send_query(
int ATTR_UNUSED(nocaps), struct sockaddr_storage* ATTR_UNUSED(addr),
socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
size_t ATTR_UNUSED(zonelen), int ATTR_UNUSED(ssl_upstream),
- struct module_qstate* ATTR_UNUSED(q))
+ char* ATTR_UNUSED(tls_auth_name), struct module_qstate* ATTR_UNUSED(q))
{
log_assert(0);
return 0;
@@ -137,7 +137,7 @@ struct outbound_entry* libworker_send_query(
int ATTR_UNUSED(nocaps), struct sockaddr_storage* ATTR_UNUSED(addr),
socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
size_t ATTR_UNUSED(zonelen), int ATTR_UNUSED(ssl_upstream),
- struct module_qstate* ATTR_UNUSED(q))
+ char* ATTR_UNUSED(tls_auth_name), struct module_qstate* ATTR_UNUSED(q))
{
log_assert(0);
return 0;
diff --git a/testcode/fake_event.c b/testcode/fake_event.c
index 300a42c154ab..860e2e81e324 100644
--- a/testcode/fake_event.c
+++ b/testcode/fake_event.c
@@ -1161,10 +1161,11 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
struct query_info* qinfo, uint16_t flags, int dnssec,
int ATTR_UNUSED(want_dnssec), int ATTR_UNUSED(nocaps),
int ATTR_UNUSED(tcp_upstream), int ATTR_UNUSED(ssl_upstream),
- struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, struct module_qstate* qstate,
- comm_point_callback_type* callback, void* callback_arg,
- sldns_buffer* ATTR_UNUSED(buff), struct module_env* ATTR_UNUSED(env))
+ char* ATTR_UNUSED(tls_auth_name), struct sockaddr_storage* addr,
+ socklen_t addrlen, uint8_t* zone, size_t zonelen,
+ struct module_qstate* qstate, comm_point_callback_type* callback,
+ void* callback_arg, sldns_buffer* ATTR_UNUSED(buff),
+ struct module_env* ATTR_UNUSED(env))
{
struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
struct fake_pending* pend = (struct fake_pending*)calloc(1,
diff --git a/testcode/unitverify.c b/testcode/unitverify.c
index 06691f822e40..95676e104905 100644
--- a/testcode/unitverify.c
+++ b/testcode/unitverify.c
@@ -548,6 +548,11 @@ verify_test(void)
verifytest_file("testdata/test_sigs.ed25519", "20170530140439");
}
#endif
+#ifdef USE_ED448
+ if(dnskey_algo_id_is_supported(LDNS_ED448)) {
+ verifytest_file("testdata/test_sigs.ed448", "20180408143630");
+ }
+#endif
#ifdef USE_SHA1
dstest_file("testdata/test_ds.sha1");
#endif
diff --git a/testdata/auth_xfr_ixfr.rpl b/testdata/auth_xfr_ixfr.rpl
index 91cc8b30365d..99cb75c926eb 100644
--- a/testdata/auth_xfr_ixfr.rpl
+++ b/testdata/auth_xfr_ixfr.rpl
@@ -38,7 +38,7 @@ mail.example.com. 3600 IN A 1.2.3.6
mail.example.com. 3600 IN A 1.2.3.7
zup.example.com. 3600 IN A 1.2.3.4
yyy.example.com. 3600 IN A 1.2.3.4
-yyy.example.com. 3600 IN AAAA ::5
+yyy.example.com. 3600 IN AAAA 2001:db8::5
r1.example.com. 3600 IN A 1.2.3.4
r1.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=
r2.example.com. 3600 IN A 1.2.3.4
@@ -195,7 +195,7 @@ example.com. IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 360
www.example.com. IN A 1.2.3.4
mail.example.com. 3600 IN A 1.2.3.6
zup.example.com. 3600 IN A 1.2.3.4
-yyy.example.com. 3600 IN AAAA ::5
+yyy.example.com. 3600 IN AAAA 2001:db8::5
r1.example.com. 3600 IN A 1.2.3.4
r2.example.com. 3600 IN A 1.2.3.4
r3.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 12345 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=
@@ -207,7 +207,7 @@ example.com. IN IXFR
SECTION ANSWER
www.example.com. IN A 1.2.3.5
mail.example.com. 3600 IN A 1.2.3.8
-mail.example.com. IN AAAA ::5
+mail.example.com. IN AAAA 2001:db8::5
add2.example.com. 3600 IN A 1.2.3.4
example.com. IN SOA ns.example.com. hostmaster.example.com. 2 3600 900 86400 3600
ENTRY_END
@@ -219,6 +219,7 @@ REPLY RD
SECTION QUESTION
www.example.com. IN A
ENTRY_END
+STEP 2 TIME_PASSES ELAPSE 1
; recursion happens here.
STEP 20 CHECK_ANSWER
@@ -263,7 +264,7 @@ mail.example.com. 3600 IN A 1.2.3.4
mail.example.com. 3600 IN A 1.2.3.5
mail.example.com. 3600 IN A 1.2.3.7
mail.example.com. 3600 IN A 1.2.3.8
-mail.example.com. 3600 IN AAAA ::5
+mail.example.com. 3600 IN AAAA 2001:db8::5
r1.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=
r2.example.com. 3600 IN RRSIG AAAA 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=
r2.example.com. 3600 IN RRSIG A 8 3 10200 20170612005010 20170515005010 42393 nlnetlabs.nl. NhEDrHkuIgHkjWhDRVsGOIJWZpSs+QdduilWFe5d+/ZhOheLJbaTYD5w6+ZZ3yPh1tNud+jlg+GyiOSVapLEO31swDCIarL1UfRjRSpxxDCHGag5Zu+S4hF+KURxO3cJk8jLBELMQyRuMRHoKrw/wsiLGVu1YpAyAPPMcjFBNbk=
diff --git a/testdata/auth_xfr_ixfrisaxfr.rpl b/testdata/auth_xfr_ixfrisaxfr.rpl
index ac6d4db766ad..cde392b69979 100644
--- a/testdata/auth_xfr_ixfrisaxfr.rpl
+++ b/testdata/auth_xfr_ixfrisaxfr.rpl
@@ -191,6 +191,7 @@ REPLY RD
SECTION QUESTION
www.example.com. IN A
ENTRY_END
+STEP 2 TIME_PASSES ELAPSE 1
; recursion happens here.
STEP 20 CHECK_ANSWER
diff --git a/testdata/auth_xfr_ixfrmismatch.rpl b/testdata/auth_xfr_ixfrmismatch.rpl
index f12e766d0ece..b1d71b474b53 100644
--- a/testdata/auth_xfr_ixfrmismatch.rpl
+++ b/testdata/auth_xfr_ixfrmismatch.rpl
@@ -222,6 +222,7 @@ REPLY RD
SECTION QUESTION
www.example.com. IN A
ENTRY_END
+STEP 2 TIME_PASSES ELAPSE 1
; recursion happens here.
STEP 20 CHECK_ANSWER
diff --git a/testdata/auth_xfr_ixfrnotimpl.rpl b/testdata/auth_xfr_ixfrnotimpl.rpl
index 94f03eb93e22..39b1b3ef3bbb 100644
--- a/testdata/auth_xfr_ixfrnotimpl.rpl
+++ b/testdata/auth_xfr_ixfrnotimpl.rpl
@@ -205,6 +205,7 @@ REPLY RD
SECTION QUESTION
www.example.com. IN A
ENTRY_END
+STEP 2 TIME_PASSES ELAPSE 1
; recursion happens here.
STEP 20 CHECK_ANSWER
diff --git a/testdata/auth_xfr_notify.rpl b/testdata/auth_xfr_notify.rpl
new file mode 100644
index 000000000000..3603a223fbbc
--- /dev/null
+++ b/testdata/auth_xfr_notify.rpl
@@ -0,0 +1,262 @@
+; config options
+server:
+ target-fetch-policy: "0 0 0 0 0"
+
+auth-zone:
+ name: "example.com."
+ ## zonefile (or none).
+ ## zonefile: "example.com.zone"
+ ## master by IP address or hostname
+ ## can list multiple masters, each on one line.
+ ## master:
+ master: 1.2.3.44
+ allow-notify: 127.0.0.1
+ ## url for http fetch
+ ## url:
+ ## queries from downstream clients get authoritative answers.
+ ## for-downstream: yes
+ for-downstream: yes
+ ## queries are used to fetch authoritative answers from this zone,
+ ## instead of unbound itself sending queries there.
+ ## for-upstream: yes
+ for-upstream: yes
+ ## on failures with for-upstream, fallback to sending queries to
+ ## the authority servers
+ ## fallback-enabled: no
+
+ ## this line generates zonefile: \n"/tmp/xxx.example.com"\n
+ zonefile:
+TEMPFILE_NAME example.com
+ ## this is the inline file /tmp/xxx.example.com
+ ## the tempfiles are deleted when the testrun is over.
+TEMPFILE_CONTENTS example.com
+example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600
+TEMPFILE_END
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test authority zone with a NOTIFY
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode subdomain
+ADJUST copy_id copy_query
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.44
+ENTRY_END
+RANGE_END
+
+; ns.example.net.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.44
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.net. IN NS
+SECTION ANSWER
+example.net. IN NS ns.example.net.
+SECTION ADDITIONAL
+ns.example.net. IN A 1.2.3.44
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN A
+SECTION ANSWER
+ns.example.net. IN A 1.2.3.44
+SECTION AUTHORITY
+example.net. IN NS ns.example.net.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN AAAA
+SECTION AUTHORITY
+example.net. IN NS ns.example.net.
+SECTION ADDITIONAL
+www.example.net. IN A 1.2.3.44
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com. IN NS ns.example.net.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 10.20.30.40
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN SOA
+SECTION ANSWER
+; serial, refresh, retry, expire, minimum
+example.com. IN SOA ns.example.com. hostmaster.example.com. 2 3600 900 86400 3600
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOTIMPL
+SECTION QUESTION
+example.com. IN IXFR
+SECTION ANSWER
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+example.com. IN AXFR
+SECTION ANSWER
+example.com. IN SOA ns.example.com. hostmaster.example.com. 2 3600 900 86400 3600
+example.com. IN NS ns.example.net.
+EXTRA_PACKET
+REPLY QR AA NOERROR
+SECTION QUESTION
+example.com. IN AXFR
+SECTION ANSWER
+www.example.com. IN A 1.2.3.4
+example.com. IN SOA ns.example.com. hostmaster.example.com. 2 3600 900 86400 3600
+ENTRY_END
+RANGE_END
+
+; lookups for notify hostnames.
+STEP 1 TIME_PASSES ELAPSED 0
+
+; now the query
+STEP 2 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 20 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR AA RD RA NXDOMAIN
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 1 3600 900 86400 3600
+ENTRY_END
+
+; NOTIFY example.com
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY NOTIFY
+SECTION QUESTION
+example.com. IN SOA
+ENTRY_END
+; notify reply
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA NOTIFY NOERROR
+SECTION QUESTION
+example.com. IN SOA
+SECTION ANSWER
+ENTRY_END
+
+STEP 50 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 60 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR AA RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A 1.2.3.4
+ENTRY_END
+
+; the zonefile was updated with new contents
+STEP 70 CHECK_TEMPFILE example.com
+FILE_BEGIN
+example.com. 3600 IN SOA ns.example.com. hostmaster.example.com. 2 3600 900 86400 3600
+example.com. 3600 IN NS ns.example.net.
+www.example.com. 3600 IN A 1.2.3.4
+FILE_END
+
+SCENARIO_END
diff --git a/testdata/ctrl_pipe.tdir/._bad_control.key b/testdata/ctrl_pipe.tdir/._bad_control.key
deleted file mode 100644
index a2faa6f81771..000000000000
--- a/testdata/ctrl_pipe.tdir/._bad_control.key
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._bad_control.pem b/testdata/ctrl_pipe.tdir/._bad_control.pem
deleted file mode 100644
index 2d09cd410113..000000000000
--- a/testdata/ctrl_pipe.tdir/._bad_control.pem
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._bad_server.key b/testdata/ctrl_pipe.tdir/._bad_server.key
deleted file mode 100644
index 0a2ee41f724a..000000000000
--- a/testdata/ctrl_pipe.tdir/._bad_server.key
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._bad_server.pem b/testdata/ctrl_pipe.tdir/._bad_server.pem
deleted file mode 100644
index cf59a782f5b9..000000000000
--- a/testdata/ctrl_pipe.tdir/._bad_server.pem
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._ctrl_pipe.conf b/testdata/ctrl_pipe.tdir/._ctrl_pipe.conf
deleted file mode 100644
index e588caa9e75f..000000000000
--- a/testdata/ctrl_pipe.tdir/._ctrl_pipe.conf
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._ctrl_pipe.dsc b/testdata/ctrl_pipe.tdir/._ctrl_pipe.dsc
deleted file mode 100644
index e2ab56651f6a..000000000000
--- a/testdata/ctrl_pipe.tdir/._ctrl_pipe.dsc
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._ctrl_pipe.post b/testdata/ctrl_pipe.tdir/._ctrl_pipe.post
deleted file mode 100644
index d3208b6f365e..000000000000
--- a/testdata/ctrl_pipe.tdir/._ctrl_pipe.post
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._ctrl_pipe.pre b/testdata/ctrl_pipe.tdir/._ctrl_pipe.pre
deleted file mode 100644
index 6e1c42c83888..000000000000
--- a/testdata/ctrl_pipe.tdir/._ctrl_pipe.pre
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._ctrl_pipe.test b/testdata/ctrl_pipe.tdir/._ctrl_pipe.test
deleted file mode 100644
index bc0ab5a70460..000000000000
--- a/testdata/ctrl_pipe.tdir/._ctrl_pipe.test
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._ctrl_pipe.testns b/testdata/ctrl_pipe.tdir/._ctrl_pipe.testns
deleted file mode 100644
index 89263e353937..000000000000
--- a/testdata/ctrl_pipe.tdir/._ctrl_pipe.testns
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._unbound_control.key b/testdata/ctrl_pipe.tdir/._unbound_control.key
deleted file mode 100644
index 474e6f1a3321..000000000000
--- a/testdata/ctrl_pipe.tdir/._unbound_control.key
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._unbound_control.pem b/testdata/ctrl_pipe.tdir/._unbound_control.pem
deleted file mode 100644
index 6eafa2b1748d..000000000000
--- a/testdata/ctrl_pipe.tdir/._unbound_control.pem
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._unbound_server.key b/testdata/ctrl_pipe.tdir/._unbound_server.key
deleted file mode 100644
index 9096da07aa24..000000000000
--- a/testdata/ctrl_pipe.tdir/._unbound_server.key
+++ /dev/null
Binary files differ
diff --git a/testdata/ctrl_pipe.tdir/._unbound_server.pem b/testdata/ctrl_pipe.tdir/._unbound_server.pem
deleted file mode 100644
index 0bd1053ef994..000000000000
--- a/testdata/ctrl_pipe.tdir/._unbound_server.pem
+++ /dev/null
Binary files differ
diff --git a/testdata/fwd_0ttlservfail.rpl b/testdata/fwd_0ttlservfail.rpl
new file mode 100644
index 000000000000..f1a6dc6291a0
--- /dev/null
+++ b/testdata/fwd_0ttlservfail.rpl
@@ -0,0 +1,85 @@
+; This is a comment.
+; config options go here.
+server:
+ serve-expired: yes
+forward-zone: name: "." forward-addr: 216.0.0.1
+CONFIG_END
+
+SCENARIO_BEGIN Zero ttl answer needs to override servfail in cache.
+RANGE_BEGIN 0 100
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR RD RA SERVFAIL
+ SECTION QUESTION
+www.example.com. IN A
+ SECTION ANSWER
+ ENTRY_END
+RANGE_END
+RANGE_BEGIN 200 300
+ ENTRY_BEGIN
+ MATCH opcode qtype qname
+ ADJUST copy_id
+ REPLY QR RD RA NOERROR
+ SECTION QUESTION
+www.example.com. IN A
+ SECTION ANSWER
+www.example.com. 0 IN A 10.20.30.40
+ ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA SERVFAIL
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+ENTRY_END
+
+; enough to pass by the TTL of the servfail answer in cache
+STEP 50 TIME_PASSES ELAPSE 40
+
+; this query triggers a prefetch
+STEP 210 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+STEP 220 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA SERVFAIL
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+ENTRY_END
+
+; this query gets the 0ttl answer
+STEP 230 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+STEP 240 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. 0 IN A 10.20.30.40
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/root_key_sentinel.rpl b/testdata/root_key_sentinel.rpl
new file mode 100755
index 000000000000..1b66c5aac77d
--- /dev/null
+++ b/testdata/root_key_sentinel.rpl
@@ -0,0 +1,185 @@
+; config options
+server:
+ trust-anchor: ". 145907 IN DNSKEY 257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0="
+ val-override-date: "20180423171826"
+ target-fetch-policy: "0 0 0 0 0"
+ trust-anchor-signaling: no
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test root key sentinel (draft-ietf-dnsop-kskroll-sentinel)
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+ ADDRESS 193.0.14.129
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET. IN A 193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN DNSKEY
+SECTION ANSWER
+. 172800 IN DNSKEY 256 3 8 AwEAAdU4aKlDgEpXWWpH5aXHJZI1Vm9Cm42mGAsqkz3akFctS6zsZHC3 pNNMug99fKa7OW+tRHIwZEc//mX8Jt6bcw5bPgRHG6u2eT8vUpbXDPVs 1ICGR6FhlwFWEOyxbIIiDfd7Eq6eALk5RNcauyE+/ZP+VdrhWZDeEWZR rPBLjByBWTHl+v/f+xvTJ3Stcq2tEqnzS2CCOr6RTJepprYhu+5Yl6aR ZmEVBK27WCW1Zrk1LekJvJXfcyKSKk19C5M5JWX58px6nB1IS0pMs6aC IK2yaQQVNUEg9XyQzBSv/rMxVNNy3VAqOjvh+OASpLMm4GECbSSe8jtj wG0I78sfMZc=
+. 172800 IN DNSKEY 257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=
+. 172800 IN DNSKEY 257 3 8 AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3 +/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kv ArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF 0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+e oZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfd RUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwN R1AkUTV74bU=
+. 172800 IN RRSIG DNSKEY 8 0 172800 20180512000000 20180421000000 19036 . e9I0U9vHrWZQN2v3aqxnHdq9BUCO8NG+4kNsaADxOndT9bJpUneAYfDz 4EJwJggjPjt6ms3Bh2pGJVOmfnRS5LQWLBKCgi+4p/vXVajWlZmIDvRr DhyYAS9ktrRLqHvXVZhx+udfvXoFuZnWSKVDFMI2fIL9wniJKCUdQ+nu 0a/iEsDBEVmwWw7T428yIQ6+NjvYQ36cf5mbchX58CBM7KfUGnsQLIAP 5tnkHM4kdIDbGCr78RCE916blRKETrbqtNi4hHIAscesJfRJsBZ+Tlho uyQie/SjGnvRULjADS5lCWKLDBRUIMzOomK4Tekrdrxk1DwcpL68xAHt 5D19Iw==
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NXDOMAIN
+SECTION QUESTION
+root-key-sentinel-is-ta-19036. IN A
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018042300 1800 900 604800 86400
+room. 86400 IN NSEC rs. NS DS RRSIG NSEC
+. 86400 IN NSEC aaa. NS SOA RRSIG NSEC DNSKEY
+. 86400 IN RRSIG SOA 8 0 86400 20180506050000 20180423040000 39570 . LboVfcSRUSuBcZPpkkOO1N6KpGO6DBzOGL6UtSVUssycPzGIZctcIM0s Kb71iBf3rxFjNVlgCuNFb74WpCyRQ2coB2uUQXVA81A+P4Qb62/s3Nr2 pRGxayA1Y0Uq2M4CRkh3bjgn/cEcEFSWTl+xDVjZO8hX98JdQjYmrVui 4zEQhsMM03sqkmjkH88owibWK7HDl6O0n6Imer2hCsVTlFv7PSrBHlXP KntkIMDtbGHZW/BkKnA6P1jfAVfgXr70bRVaDRddLqJp3EX6EuR83osg 8q46170NgCMCKK3ePItJYF16SEADFKdOQs19CMTXAN7M1p4cnGk2yRG/ 68BmCg==
+room. 86400 IN RRSIG NSEC 8 1 86400 20180506050000 20180423040000 39570 . Fmhf8s0yVixynVdO6VWLEctcvb7+3UK9gu+9BhUPBS0SNedhMwfyiYaR MzWU9P99gVYUT1G/vXRqbAabtD3Ccnt/ydUBguZq3pV5GL+7czeEbZ5z 8/LlS+wyw2OTe4DOKzBZ7oZAA/r/Tz2bhVA6kNyIKFXAmBXuh7I5Ty7H elbIWh7Lq7QjZwN9LL4M1kSNePH2cmS3Lu/scRf3m3fN/70sgoYzKNB7 +Hbi/YjXBbRIcj7tHA6iMoZLGPXRMJdb6NqJNIaDIDtOA95cFa4oRx2P usBW9lpXG0YY+KDm1J6UjxUP7TIn0yXt+c0vy2cz7zu++ZEkdU29WtBG dUQEaA==
+. 86400 IN RRSIG NSEC 8 0 86400 20180506050000 20180423040000 39570 . E1FeP4/GvcPksKXgas9pslduWU6+cqqSoJpgtCeymd6t7MORbnsQJdUo rjqbRtxvOOnv5g4uVZdv0krSc/eqw8HWEiCW0oZWYLcz+h8eI4htt4uv 8LciVgQn3Aspic2b8uWdPTJUPuc94esn5AJZDMK9VOTwZD2UVqbv/k9U 4LG0o56yRQshYTG2hiutFXLYmzFe2YmKct6G7W50O7s5hwxTqqRwv9av 1Q3UZUj/ZARNt9z53pygJsDPDX+L2q4lowtiHJCRPjijm8K3Bwb8uFsG 3YB20K9d3krack9c6gAMJzpgeuFQ/b2HxiZMJPvJ3tHqIhDn0U5qoZdT Xq0WTw==
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NXDOMAIN
+SECTION QUESTION
+root-key-sentinel-is-ta-20326. IN A
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018042300 1800 900 604800 86400
+. 86400 IN RRSIG SOA 8 0 86400 20180506050000 20180423040000 39570 . LboVfcSRUSuBcZPpkkOO1N6KpGO6DBzOGL6UtSVUssycPzGIZctcIM0s Kb71iBf3rxFjNVlgCuNFb74WpCyRQ2coB2uUQXVA81A+P4Qb62/s3Nr2 pRGxayA1Y0Uq2M4CRkh3bjgn/cEcEFSWTl+xDVjZO8hX98JdQjYmrVui 4zEQhsMM03sqkmjkH88owibWK7HDl6O0n6Imer2hCsVTlFv7PSrBHlXP KntkIMDtbGHZW/BkKnA6P1jfAVfgXr70bRVaDRddLqJp3EX6EuR83osg 8q46170NgCMCKK3ePItJYF16SEADFKdOQs19CMTXAN7M1p4cnGk2yRG/ 68BmCg==
+. 86400 IN NSEC aaa. NS SOA RRSIG NSEC DNSKEY
+. 86400 IN RRSIG NSEC 8 0 86400 20180506050000 20180423040000 39570 . E1FeP4/GvcPksKXgas9pslduWU6+cqqSoJpgtCeymd6t7MORbnsQJdUo rjqbRtxvOOnv5g4uVZdv0krSc/eqw8HWEiCW0oZWYLcz+h8eI4htt4uv 8LciVgQn3Aspic2b8uWdPTJUPuc94esn5AJZDMK9VOTwZD2UVqbv/k9U 4LG0o56yRQshYTG2hiutFXLYmzFe2YmKct6G7W50O7s5hwxTqqRwv9av 1Q3UZUj/ZARNt9z53pygJsDPDX+L2q4lowtiHJCRPjijm8K3Bwb8uFsG 3YB20K9d3krack9c6gAMJzpgeuFQ/b2HxiZMJPvJ3tHqIhDn0U5qoZdT Xq0WTw==
+room. 86400 IN NSEC rs. NS DS RRSIG NSEC
+room. 86400 IN RRSIG NSEC 8 1 86400 20180506050000 20180423040000 39570 . Fmhf8s0yVixynVdO6VWLEctcvb7+3UK9gu+9BhUPBS0SNedhMwfyiYaR MzWU9P99gVYUT1G/vXRqbAabtD3Ccnt/ydUBguZq3pV5GL+7czeEbZ5z 8/LlS+wyw2OTe4DOKzBZ7oZAA/r/Tz2bhVA6kNyIKFXAmBXuh7I5Ty7H elbIWh7Lq7QjZwN9LL4M1kSNePH2cmS3Lu/scRf3m3fN/70sgoYzKNB7 +Hbi/YjXBbRIcj7tHA6iMoZLGPXRMJdb6NqJNIaDIDtOA95cFa4oRx2P usBW9lpXG0YY+KDm1J6UjxUP7TIn0yXt+c0vy2cz7zu++ZEkdU29WtBG dUQEaA==
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NXDOMAIN
+SECTION QUESTION
+root-key-sentinel-not-ta-19036. IN A
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018042300 1800 900 604800 86400
+room. 86400 IN NSEC rs. NS DS RRSIG NSEC
+. 86400 IN NSEC aaa. NS SOA RRSIG NSEC DNSKEY
+. 86400 IN RRSIG SOA 8 0 86400 20180506050000 20180423040000 39570 . LboVfcSRUSuBcZPpkkOO1N6KpGO6DBzOGL6UtSVUssycPzGIZctcIM0s Kb71iBf3rxFjNVlgCuNFb74WpCyRQ2coB2uUQXVA81A+P4Qb62/s3Nr2 pRGxayA1Y0Uq2M4CRkh3bjgn/cEcEFSWTl+xDVjZO8hX98JdQjYmrVui 4zEQhsMM03sqkmjkH88owibWK7HDl6O0n6Imer2hCsVTlFv7PSrBHlXP KntkIMDtbGHZW/BkKnA6P1jfAVfgXr70bRVaDRddLqJp3EX6EuR83osg 8q46170NgCMCKK3ePItJYF16SEADFKdOQs19CMTXAN7M1p4cnGk2yRG/ 68BmCg==
+room. 86400 IN RRSIG NSEC 8 1 86400 20180506050000 20180423040000 39570 . Fmhf8s0yVixynVdO6VWLEctcvb7+3UK9gu+9BhUPBS0SNedhMwfyiYaR MzWU9P99gVYUT1G/vXRqbAabtD3Ccnt/ydUBguZq3pV5GL+7czeEbZ5z 8/LlS+wyw2OTe4DOKzBZ7oZAA/r/Tz2bhVA6kNyIKFXAmBXuh7I5Ty7H elbIWh7Lq7QjZwN9LL4M1kSNePH2cmS3Lu/scRf3m3fN/70sgoYzKNB7 +Hbi/YjXBbRIcj7tHA6iMoZLGPXRMJdb6NqJNIaDIDtOA95cFa4oRx2P usBW9lpXG0YY+KDm1J6UjxUP7TIn0yXt+c0vy2cz7zu++ZEkdU29WtBG dUQEaA==
+. 86400 IN RRSIG NSEC 8 0 86400 20180506050000 20180423040000 39570 . E1FeP4/GvcPksKXgas9pslduWU6+cqqSoJpgtCeymd6t7MORbnsQJdUo rjqbRtxvOOnv5g4uVZdv0krSc/eqw8HWEiCW0oZWYLcz+h8eI4htt4uv 8LciVgQn3Aspic2b8uWdPTJUPuc94esn5AJZDMK9VOTwZD2UVqbv/k9U 4LG0o56yRQshYTG2hiutFXLYmzFe2YmKct6G7W50O7s5hwxTqqRwv9av 1Q3UZUj/ZARNt9z53pygJsDPDX+L2q4lowtiHJCRPjijm8K3Bwb8uFsG 3YB20K9d3krack9c6gAMJzpgeuFQ/b2HxiZMJPvJ3tHqIhDn0U5qoZdT Xq0WTw==
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NXDOMAIN
+SECTION QUESTION
+root-key-sentinel-not-ta-20326. IN A
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018042300 1800 900 604800 86400
+. 86400 IN RRSIG SOA 8 0 86400 20180506050000 20180423040000 39570 . LboVfcSRUSuBcZPpkkOO1N6KpGO6DBzOGL6UtSVUssycPzGIZctcIM0s Kb71iBf3rxFjNVlgCuNFb74WpCyRQ2coB2uUQXVA81A+P4Qb62/s3Nr2 pRGxayA1Y0Uq2M4CRkh3bjgn/cEcEFSWTl+xDVjZO8hX98JdQjYmrVui 4zEQhsMM03sqkmjkH88owibWK7HDl6O0n6Imer2hCsVTlFv7PSrBHlXP KntkIMDtbGHZW/BkKnA6P1jfAVfgXr70bRVaDRddLqJp3EX6EuR83osg 8q46170NgCMCKK3ePItJYF16SEADFKdOQs19CMTXAN7M1p4cnGk2yRG/ 68BmCg==
+. 86400 IN NSEC aaa. NS SOA RRSIG NSEC DNSKEY
+. 86400 IN RRSIG NSEC 8 0 86400 20180506050000 20180423040000 39570 . E1FeP4/GvcPksKXgas9pslduWU6+cqqSoJpgtCeymd6t7MORbnsQJdUo rjqbRtxvOOnv5g4uVZdv0krSc/eqw8HWEiCW0oZWYLcz+h8eI4htt4uv 8LciVgQn3Aspic2b8uWdPTJUPuc94esn5AJZDMK9VOTwZD2UVqbv/k9U 4LG0o56yRQshYTG2hiutFXLYmzFe2YmKct6G7W50O7s5hwxTqqRwv9av 1Q3UZUj/ZARNt9z53pygJsDPDX+L2q4lowtiHJCRPjijm8K3Bwb8uFsG 3YB20K9d3krack9c6gAMJzpgeuFQ/b2HxiZMJPvJ3tHqIhDn0U5qoZdT Xq0WTw==
+room. 86400 IN NSEC rs. NS DS RRSIG NSEC
+room. 86400 IN RRSIG NSEC 8 1 86400 20180506050000 20180423040000 39570 . Fmhf8s0yVixynVdO6VWLEctcvb7+3UK9gu+9BhUPBS0SNedhMwfyiYaR MzWU9P99gVYUT1G/vXRqbAabtD3Ccnt/ydUBguZq3pV5GL+7czeEbZ5z 8/LlS+wyw2OTe4DOKzBZ7oZAA/r/Tz2bhVA6kNyIKFXAmBXuh7I5Ty7H elbIWh7Lq7QjZwN9LL4M1kSNePH2cmS3Lu/scRf3m3fN/70sgoYzKNB7 +Hbi/YjXBbRIcj7tHA6iMoZLGPXRMJdb6NqJNIaDIDtOA95cFa4oRx2P usBW9lpXG0YY+KDm1J6UjxUP7TIn0yXt+c0vy2cz7zu++ZEkdU29WtBG dUQEaA==
+ENTRY_END
+
+RANGE_END
+
+STEP 10 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+root-key-sentinel-is-ta-19036. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 11 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AD DO NXDOMAIN
+SECTION QUESTION
+root-key-sentinel-is-ta-19036. IN A
+SECTION ANSWER
+SECTION AUTHORITY
+. 3600 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018042300 1800 900 604800 86400
+. 86400 IN RRSIG SOA 8 0 86400 20180506050000 20180423040000 39570 . LboVfcSRUSuBcZPpkkOO1N6KpGO6DBzOGL6UtSVUssycPzGIZctcIM0s Kb71iBf3rxFjNVlgCuNFb74WpCyRQ2coB2uUQXVA81A+P4Qb62/s3Nr2 pRGxayA1Y0Uq2M4CRkh3bjgn/cEcEFSWTl+xDVjZO8hX98JdQjYmrVui 4zEQhsMM03sqkmjkH88owibWK7HDl6O0n6Imer2hCsVTlFv7PSrBHlXP KntkIMDtbGHZW/BkKnA6P1jfAVfgXr70bRVaDRddLqJp3EX6EuR83osg 8q46170NgCMCKK3ePItJYF16SEADFKdOQs19CMTXAN7M1p4cnGk2yRG/ 68BmCg==
+room. 86400 IN NSEC rs. NS DS RRSIG NSEC
+room. 86400 IN RRSIG NSEC 8 1 86400 20180506050000 20180423040000 39570 . Fmhf8s0yVixynVdO6VWLEctcvb7+3UK9gu+9BhUPBS0SNedhMwfyiYaR MzWU9P99gVYUT1G/vXRqbAabtD3Ccnt/ydUBguZq3pV5GL+7czeEbZ5z 8/LlS+wyw2OTe4DOKzBZ7oZAA/r/Tz2bhVA6kNyIKFXAmBXuh7I5Ty7H elbIWh7Lq7QjZwN9LL4M1kSNePH2cmS3Lu/scRf3m3fN/70sgoYzKNB7 +Hbi/YjXBbRIcj7tHA6iMoZLGPXRMJdb6NqJNIaDIDtOA95cFa4oRx2P usBW9lpXG0YY+KDm1J6UjxUP7TIn0yXt+c0vy2cz7zu++ZEkdU29WtBG dUQEaA==
+. 86400 IN NSEC aaa. NS SOA RRSIG NSEC DNSKEY
+. 86400 IN RRSIG NSEC 8 0 86400 20180506050000 20180423040000 39570 . E1FeP4/GvcPksKXgas9pslduWU6+cqqSoJpgtCeymd6t7MORbnsQJdUo rjqbRtxvOOnv5g4uVZdv0krSc/eqw8HWEiCW0oZWYLcz+h8eI4htt4uv 8LciVgQn3Aspic2b8uWdPTJUPuc94esn5AJZDMK9VOTwZD2UVqbv/k9U 4LG0o56yRQshYTG2hiutFXLYmzFe2YmKct6G7W50O7s5hwxTqqRwv9av 1Q3UZUj/ZARNt9z53pygJsDPDX+L2q4lowtiHJCRPjijm8K3Bwb8uFsG 3YB20K9d3krack9c6gAMJzpgeuFQ/b2HxiZMJPvJ3tHqIhDn0U5qoZdT Xq0WTw==
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+root-key-sentinel-not-ta-19036. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 22 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA DO SERVFAIL
+SECTION QUESTION
+root-key-sentinel-not-ta-19036. IN A
+ENTRY_END
+
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+root-key-sentinel-is-ta-20326. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 33 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA DO SERVFAIL
+SECTION QUESTION
+root-key-sentinel-is-ta-20326. IN A
+ENTRY_END
+
+STEP 40 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+root-key-sentinel-not-ta-20326. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 44 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AD DO NXDOMAIN
+SECTION QUESTION
+root-key-sentinel-not-ta-20326. IN A
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018042300 1800 900 604800 86400
+. 86400 IN RRSIG SOA 8 0 86400 20180506050000 20180423040000 39570 . LboVfcSRUSuBcZPpkkOO1N6KpGO6DBzOGL6UtSVUssycPzGIZctcIM0s Kb71iBf3rxFjNVlgCuNFb74WpCyRQ2coB2uUQXVA81A+P4Qb62/s3Nr2 pRGxayA1Y0Uq2M4CRkh3bjgn/cEcEFSWTl+xDVjZO8hX98JdQjYmrVui 4zEQhsMM03sqkmjkH88owibWK7HDl6O0n6Imer2hCsVTlFv7PSrBHlXP KntkIMDtbGHZW/BkKnA6P1jfAVfgXr70bRVaDRddLqJp3EX6EuR83osg 8q46170NgCMCKK3ePItJYF16SEADFKdOQs19CMTXAN7M1p4cnGk2yRG/ 68BmCg==
+. 86400 IN NSEC aaa. NS SOA RRSIG NSEC DNSKEY
+. 86400 IN RRSIG NSEC 8 0 86400 20180506050000 20180423040000 39570 . E1FeP4/GvcPksKXgas9pslduWU6+cqqSoJpgtCeymd6t7MORbnsQJdUo rjqbRtxvOOnv5g4uVZdv0krSc/eqw8HWEiCW0oZWYLcz+h8eI4htt4uv 8LciVgQn3Aspic2b8uWdPTJUPuc94esn5AJZDMK9VOTwZD2UVqbv/k9U 4LG0o56yRQshYTG2hiutFXLYmzFe2YmKct6G7W50O7s5hwxTqqRwv9av 1Q3UZUj/ZARNt9z53pygJsDPDX+L2q4lowtiHJCRPjijm8K3Bwb8uFsG 3YB20K9d3krack9c6gAMJzpgeuFQ/b2HxiZMJPvJ3tHqIhDn0U5qoZdT Xq0WTw==
+room. 86400 IN NSEC rs. NS DS RRSIG NSEC
+room. 86400 IN RRSIG NSEC 8 1 86400 20180506050000 20180423040000 39570 . Fmhf8s0yVixynVdO6VWLEctcvb7+3UK9gu+9BhUPBS0SNedhMwfyiYaR MzWU9P99gVYUT1G/vXRqbAabtD3Ccnt/ydUBguZq3pV5GL+7czeEbZ5z 8/LlS+wyw2OTe4DOKzBZ7oZAA/r/Tz2bhVA6kNyIKFXAmBXuh7I5Ty7H elbIWh7Lq7QjZwN9LL4M1kSNePH2cmS3Lu/scRf3m3fN/70sgoYzKNB7 +Hbi/YjXBbRIcj7tHA6iMoZLGPXRMJdb6NqJNIaDIDtOA95cFa4oRx2P usBW9lpXG0YY+KDm1J6UjxUP7TIn0yXt+c0vy2cz7zu++ZEkdU29WtBG dUQEaA==
+ENTRY_END
+SCENARIO_END
diff --git a/testdata/stream_ssl.tdir/stream_ssl.clie.conf b/testdata/stream_ssl.tdir/stream_ssl.clie.conf
index f62af1a86f45..4643c6d554fb 100644
--- a/testdata/stream_ssl.tdir/stream_ssl.clie.conf
+++ b/testdata/stream_ssl.tdir/stream_ssl.clie.conf
@@ -11,7 +11,8 @@ server:
do-not-query-localhost: no
ssl-upstream: yes
+ tls-cert-bundle: unbound_server.pem
forward-zone:
name: "."
- forward-addr: "127.0.0.1@@SERVPORT@"
+ forward-addr: "127.0.0.1@@SERVPORT@#unbound"
diff --git a/testdata/test_sigs.ed448 b/testdata/test_sigs.ed448
new file mode 100644
index 000000000000..3e5f14fe1d2a
--- /dev/null
+++ b/testdata/test_sigs.ed448
@@ -0,0 +1,21 @@
+; Signature test file
+
+; first entry is a DNSKEY answer, with the DNSKEY rrset used for verification.
+; later entries are verified with it.
+
+ENTRY_BEGIN
+SECTION QUESTION
+example.com. IN DNSKEY
+SECTION ANSWER
+example.com. IN DNSKEY 256 3 16 zqUQUbOlkWR1cEGLAr/50aOgpFIwyT3juetr4fT9TRIOdEaXK3Pzv6AvA4iNViZ6RAMD2xctd1EA ;{id = 39998 (zsk), size = 456b}
+ENTRY_END
+
+; entry to test
+ENTRY_BEGIN
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+mail.example.com. 3600 IN A 1.2.3.5
+mail.example.com. 3600 IN RRSIG A 16 3 3600 20180503143630 20180405143630 39998 example.com. 5T6sjxQ2sB9Crcx8hNKDCteUVc0vNpz8slOa58acb4yLP7dBysp/6dVZwl9/gUN+CWUl6QpkcEMAFx2AcgjPhncYzRpeKCNuJBgBBQrb4Fz2Kvqf7r7H4Day6JrWQDvWcMXf8U9r0Eq06hoJ48M52CkA
+ENTRY_END
+
diff --git a/testdata/val_negcache_nta.rpl b/testdata/val_negcache_nta.rpl
new file mode 100644
index 000000000000..2331643f27b4
--- /dev/null
+++ b/testdata/val_negcache_nta.rpl
@@ -0,0 +1,120 @@
+; config options
+; The island of trust is at testzone.nlnetlabs.nl
+server:
+ trust-anchor: "testzone.nlnetlabs.nl. IN DS 2926 8 2 6f8512d1e82eecbd684fc4a76f39f8c5b411af385494873bdead663ddb78a88b"
+ val-override-date: "20180213111425"
+ target-fetch-policy: "0 0 0 0 0"
+ trust-anchor-signaling: no
+ aggressive-nsec: yes
+ domain-insecure: "ant.testzone.nlnetlabs.nl"
+
+stub-zone:
+ name: "testzone.nlnetlabs.nl"
+ stub-addr: 185.49.140.60
+stub-zone:
+ name: "ant.testzone.nlnetlabs.nl"
+ stub-addr: 185.49.140.61
+CONFIG_END
+
+SCENARIO_BEGIN Test to not do aggressive NSEC for domains under NTA
+
+; testzone.nlnetlabs.nl nameserver
+RANGE_BEGIN 0 100
+ ADDRESS 185.49.140.60
+
+; response to DNSKEY priming query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+testzone.nlnetlabs.nl. IN DNSKEY
+SECTION ANSWER
+testzone.nlnetlabs.nl. 3600 IN DNSKEY 256 3 8 AwEAAbrNEg01ByEpUUiip+GNAkNVjUfeX7sl9kPUssR3JQvhCJWVs7aBY0Ae1cNtQWgzCmidGorlXvEY2nNBiMM4l7IXqopJsgyj+Cb3nQPVLi/7yVwUb+AIwSJw1gRFElMYonsMOL9qUrJi8BBCnCR0EqkL+X4slmtkXSJbzQAwvHI7
+testzone.nlnetlabs.nl. 3600 IN DNSKEY 257 3 8 AwEAAbn0eGV0wqMBQNSVTY//BoiOD7bexC7FcVv0fH9bwjKOA8I+ob377E14vZN2xRLC2b1GG5iBckjeI+N2dB9eC2KRnScU3Gbmtw75BBYfm/y4Hu72zEjEZ0ZGv6gjSZRv/1o87ODAwQaxN8/dQD+5U/5xu12XM39bCJZx2GWTbf5L
+testzone.nlnetlabs.nl. 3600 IN RRSIG DNSKEY 8 3 3600 20180313101254 20180213101254 2926 testzone.nlnetlabs.nl. gSLZb/dSKutRlAKSo8ZCC1R+SkvABMYBRQsms77WPfYCDbt5GbXeuGqwGdadjEN8gGSU+qrYNxBZRhlYY6d2vtl+DGh67qwteHSwOCw0VvU64eVh38maJA1U673U4JtlBALzBOA/UHmXPlCgPPoW3BG0U3T2Qir/mqOmegmpBcw=
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NS ns.nlnetlabs.nl.
+testzone.nlnetlabs.nl. 3600 IN RRSIG NS 8 3 3600 20180313102201 20180213102201 44940 testzone.nlnetlabs.nl. Ox0iKc+z3i1qR1wMr8TBPYzuYO5UTaLrBsDagJAd25fvCkGN+h3HPmWlCIW0cBHsS+IaHXr1JhWutjSCc4UBcY+sT7Y7Fw3V1qdZW2KzbSgWUyPkTXoYcIIVLacSUTXEyltW6jj61WEI/RaUGUCJortvwH5iv1Hzee343isxObI=
+SECTION ADDITIONAL
+ENTRY_END
+
+; response for antelope.testzone.nlnetlabs.nl.
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NXDOMAIN
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313102201 20180213102201 44940 testzone.nlnetlabs.nl. gTKn6U1nal9oA79IRxLa/7zexl6A0yJZzeEGBbZ5rh5feyAr2X4LTR9bPCgcHeMVggf4FP+kD1L/sxzj/YLwB1ZKGKlwnzsHtPFTlmvDClaqQ76DRZq5Vejr2ZfnclBUb2vtxaXywTRW8oueaaq9flcShEQ/cQ+KRU8sc344qd0=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313102201 20180213102201 44940 testzone.nlnetlabs.nl. QAgQ0AsMoYG02+VPfoOctSPlTHdQOkQt5fFkSkzIbVhUzNOqa+dB/Qkc81AwFeJosA+PvYjt6utcVkIWmK2Djy9eXC49gILtVF79vUe4G7ZrybO5NXjqNa5ANoUGM+yew4wkjeNOMVAsvs+1kvFY7S8RAa/0AIYlZHQ8vNBPNaI=
+testzone.nlnetlabs.nl. 3600 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 3600 IN RRSIG SOA 8 3 3600 20180313102201 20180213102201 44940 testzone.nlnetlabs.nl. GhmXNFQktZIgaBpGKwj9Q2mfq5+jcbRPK+PPgtRVicUPZga/d/iGEL8PV/8DzGwkaZbM14pamSUMgdJibW4zNhLz/ukjPilbjoj6giH1jtbdZLAQ6iK9pZ/4jKUEq4txviTczZNnDeolgPEEl4xo4NclQmi7zj1XBlQRbjvG0/0=
+SECTION ADDITIONAL
+ENTRY_END
+
+RANGE_END
+
+; ant.testzone.nlnetlabs.nl nameserver
+RANGE_BEGIN 0 100
+ ADDRESS 185.49.140.61
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+ant.testzone.nlnetlabs.nl. 10 IN TXT "domain under NTA"
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA DO AD NXDOMAIN
+SECTION QUESTION
+antelope.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+SECTION AUTHORITY
+testzone.nlnetlabs.nl. 3600 IN NSEC alligator.testzone.nlnetlabs.nl. NS SOA RRSIG NSEC DNSKEY
+testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 3 3600 20180313102201 20180213102201 44940 testzone.nlnetlabs.nl. gTKn6U1nal9oA79IRxLa/7zexl6A0yJZzeEGBbZ5rh5feyAr2X4LTR9bPCgcHeMVggf4FP+kD1L/sxzj/YLwB1ZKGKlwnzsHtPFTlmvDClaqQ76DRZq5Vejr2ZfnclBUb2vtxaXywTRW8oueaaq9flcShEQ/cQ+KRU8sc344qd0=
+alligator.testzone.nlnetlabs.nl. 3600 IN NSEC cheetah.testzone.nlnetlabs.nl. TXT RRSIG NSEC
+alligator.testzone.nlnetlabs.nl. 3600 IN RRSIG NSEC 8 4 3600 20180313102201 20180213102201 44940 testzone.nlnetlabs.nl. QAgQ0AsMoYG02+VPfoOctSPlTHdQOkQt5fFkSkzIbVhUzNOqa+dB/Qkc81AwFeJosA+PvYjt6utcVkIWmK2Djy9eXC49gILtVF79vUe4G7ZrybO5NXjqNa5ANoUGM+yew4wkjeNOMVAsvs+1kvFY7S8RAa/0AIYlZHQ8vNBPNaI=
+testzone.nlnetlabs.nl. 3600 IN SOA ns.nlnetlabs.nl. ralph.nlnetlabs.nl. 1 14400 3600 604800 3600
+testzone.nlnetlabs.nl. 3600 IN RRSIG SOA 8 3 3600 20180313102201 20180213102201 44940 testzone.nlnetlabs.nl. GhmXNFQktZIgaBpGKwj9Q2mfq5+jcbRPK+PPgtRVicUPZga/d/iGEL8PV/8DzGwkaZbM14pamSUMgdJibW4zNhLz/ukjPilbjoj6giH1jtbdZLAQ6iK9pZ/4jKUEq4txviTczZNnDeolgPEEl4xo4NclQmi7zj1XBlQRbjvG0/0=
+SECTION ADDITIONAL
+ENTRY_END
+
+; query for ant.testzone.nlnetlabs.nl, which is below an NTA
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+ENTRY_END
+
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA DO NOERROR
+SECTION QUESTION
+ant.testzone.nlnetlabs.nl. IN TXT
+SECTION ANSWER
+ant.testzone.nlnetlabs.nl. 10 IN TXT "domain under NTA"
+ENTRY_END
+
+SCENARIO_END
diff --git a/util/config_file.c b/util/config_file.c
index 0784f055912d..3bf5f6308715 100644
--- a/util/config_file.c
+++ b/util/config_file.c
@@ -106,7 +106,7 @@ config_create(void)
cfg->outgoing_tcp_mss = 0;
cfg->ssl_service_key = NULL;
cfg->ssl_service_pem = NULL;
- cfg->ssl_port = 853;
+ cfg->ssl_port = UNBOUND_DNS_OVER_TLS_PORT;
cfg->ssl_upstream = 0;
cfg->tls_cert_bundle = NULL;
cfg->use_syslog = 1;
@@ -161,6 +161,8 @@ config_create(void)
if(!(cfg->logfile = strdup(""))) goto error_exit;
if(!(cfg->pidfile = strdup(PIDFILE))) goto error_exit;
if(!(cfg->target_fetch_policy = strdup("3 2 1 0 0"))) goto error_exit;
+ cfg->low_rtt_pct = 0;
+ cfg->low_rtt = 45;
cfg->donotqueryaddrs = NULL;
cfg->donotquery_localhost = 1;
cfg->root_hints = NULL;
@@ -211,6 +213,7 @@ config_create(void)
cfg->trust_anchor_list = NULL;
cfg->trusted_keys_file_list = NULL;
cfg->trust_anchor_signaling = 1;
+ cfg->root_key_sentinel = 1;
cfg->dlv_anchor_file = NULL;
cfg->dlv_anchor_list = NULL;
cfg->domain_insecure = NULL;
@@ -386,6 +389,12 @@ struct config_file* config_create_forlib(void)
int config_set_option(struct config_file* cfg, const char* opt,
const char* val)
{
+ char buf[64];
+ if(!opt) return 0;
+ if(opt[strlen(opt)-1] != ':' && strlen(opt)+2<sizeof(buf)) {
+ snprintf(buf, sizeof(buf), "%s:", opt);
+ opt = buf;
+ }
S_NUMBER_OR_ZERO("verbosity:", verbosity)
else if(strcmp(opt, "statistics-interval:") == 0) {
if(strcmp(val, "0") == 0 || strcmp(val, "") == 0)
@@ -446,6 +455,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_STR("ssl-service-pem:", ssl_service_pem)
else S_NUMBER_NONZERO("ssl-port:", ssl_port)
else S_STR("tls-cert-bundle:", tls_cert_bundle)
+ else S_STRLIST("additional-tls-port:", additional_tls_port)
else S_YNO("interface-automatic:", if_automatic)
else S_YNO("use-systemd:", use_systemd)
else S_YNO("do-daemonize:", do_daemonize)
@@ -500,7 +510,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_YNO("harden-below-nxdomain:", harden_below_nxdomain)
else S_YNO("harden-referral-path:", harden_referral_path)
else S_YNO("harden-algo-downgrade:", harden_algo_downgrade)
- else S_YNO("use-caps-for-id", use_caps_bits_for_id)
+ else S_YNO("use-caps-for-id:", use_caps_bits_for_id)
else S_STRLIST("caps-whitelist:", caps_whitelist)
else S_SIZET_OR_ZERO("unwanted-reply-threshold:", unwanted_threshold)
else S_STRLIST("private-address:", private_address)
@@ -512,6 +522,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_STRLIST("trust-anchor:", trust_anchor_list)
else S_STRLIST("trusted-keys-file:", trusted_keys_file_list)
else S_YNO("trust-anchor-signaling:", trust_anchor_signaling)
+ else S_YNO("root-key-sentinel:", root_key_sentinel)
else S_STR("dlv-anchor-file:", dlv_anchor_file)
else S_STRLIST("dlv-anchor:", dlv_anchor_list)
else S_STRLIST("domain-insecure:", domain_insecure)
@@ -606,6 +617,8 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_POW2("ratelimit-slabs:", ratelimit_slabs)
else S_NUMBER_OR_ZERO("ip-ratelimit-factor:", ip_ratelimit_factor)
else S_NUMBER_OR_ZERO("ratelimit-factor:", ratelimit_factor)
+ else S_NUMBER_OR_ZERO("low-rtt:", low_rtt)
+ else S_NUMBER_OR_ZERO("low-rtt-pct:", low_rtt_pct)
else S_YNO("qname-minimisation:", qname_minimisation)
else S_YNO("qname-minimisation-strict:", qname_minimisation_strict)
#ifdef USE_IPSECMOD
@@ -800,8 +813,13 @@ int
config_get_option(struct config_file* cfg, const char* opt,
void (*func)(char*,void*), void* arg)
{
- char buf[1024];
+ char buf[1024], nopt[64];
size_t len = sizeof(buf);
+ if(opt && opt[strlen(opt)-1] == ':' && strlen(opt)<sizeof(nopt)) {
+ memmove(nopt, opt, strlen(opt));
+ nopt[strlen(opt)-1] = 0;
+ opt = nopt;
+ }
fptr_ok(fptr_whitelist_print_func(func));
O_DEC(opt, "verbosity", verbosity)
else O_DEC(opt, "statistics-interval", stat_interval)
@@ -856,6 +874,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_STR(opt, "ssl-service-pem", ssl_service_pem)
else O_DEC(opt, "ssl-port", ssl_port)
else O_STR(opt, "tls-cert-bundle", tls_cert_bundle)
+ else O_LST(opt, "additional-tls-port", additional_tls_port)
else O_YNO(opt, "use-systemd", use_systemd)
else O_YNO(opt, "do-daemonize", do_daemonize)
else O_STR(opt, "chroot", chrootdir)
@@ -888,7 +907,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "val-clean-additional", val_clean_additional)
else O_DEC(opt, "val-log-level", val_log_level)
else O_YNO(opt, "val-permissive-mode", val_permissive_mode)
- else O_YNO(opt, "aggressive-nsec:", aggressive_nsec)
+ 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_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations)
@@ -915,6 +934,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_LST(opt, "trust-anchor", trust_anchor_list)
else O_LST(opt, "trusted-keys-file", trusted_keys_file_list)
else O_YNO(opt, "trust-anchor-signaling", trust_anchor_signaling)
+ else O_YNO(opt, "root-key-sentinel", root_key_sentinel)
else O_LST(opt, "dlv-anchor", dlv_anchor_list)
else O_LST(opt, "control-interface", control_ifs)
else O_LST(opt, "domain-insecure", domain_insecure)
@@ -980,6 +1000,8 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_LS2(opt, "ratelimit-below-domain", ratelimit_below_domain)
else O_DEC(opt, "ip-ratelimit-factor", ip_ratelimit_factor)
else O_DEC(opt, "ratelimit-factor", ratelimit_factor)
+ else O_DEC(opt, "low-rtt", low_rtt)
+ else O_DEC(opt, "low-rtt-pct", low_rtt_pct)
else O_DEC(opt, "val-sig-skew-min", val_sig_skew_min)
else O_DEC(opt, "val-sig-skew-max", val_sig_skew_max)
else O_YNO(opt, "qname-minimisation", qname_minimisation)
@@ -1178,6 +1200,7 @@ config_delauth(struct config_auth* p)
free(p->name);
config_delstrlist(p->masters);
config_delstrlist(p->urls);
+ config_delstrlist(p->allow_notify);
free(p->zonefile);
free(p);
}
@@ -1274,6 +1297,7 @@ config_delete(struct config_file* cfg)
free(cfg->ssl_service_key);
free(cfg->ssl_service_pem);
free(cfg->tls_cert_bundle);
+ config_delstrlist(cfg->additional_tls_port);
free(cfg->log_identity);
config_del_strarray(cfg->ifs, cfg->num_ifs);
config_del_strarray(cfg->out_ifs, cfg->num_out_ifs);
diff --git a/util/config_file.h b/util/config_file.h
index 2e1c53ee0733..eba60b9a1356 100644
--- a/util/config_file.h
+++ b/util/config_file.h
@@ -102,6 +102,8 @@ struct config_file {
int ssl_upstream;
/** cert bundle for outgoing connections */
char* tls_cert_bundle;
+ /** additional tls ports */
+ struct config_strlist* additional_tls_port;
/** outgoing port range number of ports (per thread) */
int outgoing_num_ports;
@@ -141,6 +143,10 @@ struct config_file {
/** the target fetch policy for the iterator */
char* target_fetch_policy;
+ /** percent*10, how many times in 1000 to pick low rtt destinations */
+ int low_rtt_pct;
+ /** what time in msec is a low rtt destination */
+ int low_rtt;
/** automatic interface for incoming messages. Uses ipv6 remapping,
* and recvmsg/sendmsg ancillary data to detect interfaces, boolean */
@@ -285,6 +291,8 @@ struct config_file {
struct config_strlist* domain_insecure;
/** send key tag query */
int trust_anchor_signaling;
+ /** enable root key sentinel */
+ int root_key_sentinel;
/** if not 0, this value is the validation date for RRSIGs */
int32_t val_date_override;
@@ -507,6 +515,14 @@ struct config_file {
char* cachedb_backend;
/** secret seed for hash key calculation */
char* cachedb_secret;
+#ifdef USE_REDIS
+ /** redis server's IP address or host name */
+ char* redis_server_host;
+ /** redis server's TCP port */
+ int redis_server_port;
+ /** timeout (in ms) for communication with the redis server */
+ int redis_timeout;
+#endif
#endif
};
@@ -549,6 +565,8 @@ struct config_auth {
struct config_strlist* masters;
/** list of urls */
struct config_strlist* urls;
+ /** list of allow-notify */
+ struct config_strlist* allow_notify;
/** zonefile (or NULL) */
char* zonefile;
/** provide downstream answers */
diff --git a/util/configlexer.c b/util/configlexer.c
index 5d8d17cf3e01..7bc1f2e6f78f 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 254
-#define YY_END_OF_BUFFER 255
+#define YY_NUM_RULES 263
+#define YY_END_OF_BUFFER 264
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -372,284 +372,294 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[2508] =
+static yyconst flex_int16_t yy_accept[2599] =
{ 0,
- 1, 1, 236, 236, 240, 240, 244, 244, 248, 248,
- 1, 1, 255, 252, 1, 234, 234, 253, 2, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 253, 236, 237, 237, 238, 253, 240, 241, 241,
- 242, 253, 247, 244, 245, 245, 246, 253, 248, 249,
- 249, 250, 253, 251, 235, 2, 239, 251, 253, 252,
- 0, 1, 2, 2, 2, 2, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 236, 0,
- 240, 0, 247, 0, 244, 248, 0, 251, 0, 2,
- 2, 251, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 251, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 99, 252, 252, 252, 252, 252, 252, 252,
- 251, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 83, 252, 252, 252, 252, 252,
-
- 252, 8, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 103,
- 252, 251, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 251, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 43, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 186, 252, 14, 15,
- 252, 18, 17, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 98, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 172, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 3,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 251, 252, 252, 252, 252, 252, 231,
- 252, 252, 230, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 243, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 46, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 47, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 161, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 20, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 118, 252, 252, 243, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 213, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 136, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 117, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 81, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 28, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 29, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 44, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 97, 252, 252, 252,
- 96, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 45, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 137, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 34, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 201, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 38, 252, 39, 252,
- 252, 252, 252, 84, 252, 85, 252, 252, 252, 82,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 7, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 179, 252, 252,
- 252, 252, 120, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 35, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 153, 252, 152, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 16, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 48, 252, 252, 252, 252,
- 252, 252, 252, 160, 252, 252, 252, 252, 252, 87,
-
- 86, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 147, 252, 252, 252, 252, 252,
- 252, 252, 252, 104, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 66, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 70, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 42, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 150, 151, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 6,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 211, 252,
- 252, 232, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 32, 252, 252, 252, 252,
- 252, 252, 252, 252, 143, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 165, 252, 144, 252,
- 252, 177, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 33, 252,
- 252, 252, 252, 252, 252, 101, 91, 252, 92, 252,
- 252, 90, 252, 252, 252, 252, 252, 252, 252, 252,
- 115, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 200, 252, 252, 252, 252, 252, 252, 252,
- 252, 145, 252, 252, 252, 252, 252, 148, 252, 252,
- 176, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 80, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 40, 252, 252, 252, 22, 252, 252,
-
- 252, 252, 252, 19, 252, 252, 252, 23, 252, 125,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 55, 57, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 215, 252, 252, 252, 187, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 93, 252, 252, 252, 252, 252, 252, 252, 252, 114,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 226, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 119,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 171, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 135, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 130, 252,
- 138, 252, 252, 252, 252, 252, 107, 252, 252, 252,
- 76, 252, 252, 252, 252, 163, 252, 252, 252, 252,
- 252, 178, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 192, 252, 252, 252, 252, 252,
- 252, 100, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 134, 252, 252, 252, 252, 252, 58, 59, 252,
- 252, 252, 252, 252, 41, 252, 252, 252, 252, 252,
- 65, 139, 252, 154, 252, 180, 149, 252, 252, 252,
- 51, 252, 141, 252, 252, 252, 252, 252, 9, 252,
- 252, 252, 79, 252, 252, 252, 252, 205, 252, 162,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 133, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 121, 214, 252, 252, 252,
-
- 252, 191, 252, 252, 252, 252, 252, 252, 252, 252,
- 173, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 229, 252, 140, 252,
- 252, 252, 50, 52, 252, 252, 252, 252, 252, 252,
- 252, 78, 252, 252, 252, 252, 203, 252, 210, 252,
- 252, 252, 252, 252, 167, 30, 24, 26, 252, 252,
- 252, 252, 252, 31, 25, 27, 252, 252, 252, 252,
- 252, 252, 75, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 169, 166,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 49, 252, 102, 252, 252, 252, 252,
- 252, 252, 252, 252, 116, 13, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 224, 252, 227, 252, 252,
- 252, 252, 252, 252, 12, 252, 252, 21, 252, 252,
- 252, 209, 252, 212, 53, 252, 175, 252, 168, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 129, 128, 252, 252, 252, 252,
- 252, 252, 252, 170, 164, 252, 252, 252, 216, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 60, 252, 252, 252, 204, 252, 252, 252, 252,
- 252, 174, 252, 252, 252, 252, 252, 252, 252, 252,
- 54, 252, 252, 252, 88, 89, 252, 122, 252, 124,
- 252, 155, 252, 252, 252, 127, 252, 252, 181, 252,
- 252, 252, 252, 252, 109, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 188, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 156, 252, 252, 202, 252, 228, 252, 252, 252,
- 36, 252, 252, 252, 252, 4, 252, 252, 108, 252,
-
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 184, 252, 252, 252, 252, 252, 252, 252, 217, 252,
- 252, 252, 252, 252, 252, 190, 252, 252, 159, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 63, 252,
- 37, 208, 252, 185, 252, 252, 11, 252, 252, 252,
- 252, 252, 252, 157, 67, 252, 252, 252, 252, 252,
- 132, 252, 252, 252, 252, 252, 111, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 189, 105, 252, 94,
- 95, 252, 252, 252, 69, 73, 68, 252, 61, 252,
- 252, 252, 10, 252, 252, 252, 206, 252, 252, 252,
-
- 252, 131, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 74,
- 72, 252, 62, 225, 252, 252, 252, 146, 252, 252,
- 158, 252, 252, 252, 252, 252, 252, 123, 56, 252,
- 252, 252, 252, 252, 218, 252, 252, 252, 252, 252,
- 252, 252, 106, 71, 112, 113, 64, 252, 207, 126,
- 252, 252, 252, 252, 183, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 77, 252, 182, 252,
-
- 199, 222, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 5, 252, 252, 252, 223, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 110, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 142, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 219, 252, 252,
- 252, 252, 252, 252, 252, 252, 252, 252, 252, 252,
- 252, 252, 252, 252, 252, 233, 252, 252, 195, 252,
- 252, 252, 252, 252, 220, 252, 252, 252, 252, 252,
- 252, 221, 252, 252, 252, 193, 252, 196, 197, 252,
-
- 252, 252, 252, 252, 194, 198, 0
+ 1, 1, 245, 245, 249, 249, 253, 253, 257, 257,
+ 1, 1, 264, 261, 1, 243, 243, 262, 2, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 262, 245, 246, 246, 247, 262, 249, 250, 250,
+ 251, 262, 256, 253, 254, 254, 255, 262, 257, 258,
+ 258, 259, 262, 260, 244, 2, 248, 260, 262, 261,
+ 0, 1, 2, 2, 2, 2, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 245,
+ 0, 249, 0, 256, 0, 253, 257, 0, 260, 0,
+ 2, 2, 260, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 260, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 101, 261, 261, 261, 261, 261, 261, 261, 260, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 85, 261, 261, 261, 261,
+ 261, 261, 8, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 106, 261, 260, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 260, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 45, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 190, 261, 14, 15, 261,
+ 18, 17, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 100, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 176, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 3, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 260, 261, 261, 261,
+ 261, 261, 261, 261, 237, 261, 261, 236, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 252, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 48,
+ 261, 214, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 49, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 165, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 20, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 121, 261, 261, 252, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 219, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 140, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 120, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 83, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 28, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 29, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 46, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 99, 261, 261, 261, 261, 261, 98, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 47, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 141, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 36, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 205, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 40, 261,
+ 41, 261, 261, 261, 261, 86, 261, 87, 261, 261,
+ 261, 84, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 7, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 183, 261, 261, 261, 261, 123, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 37, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 157, 261, 156, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 16,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 50, 261, 261, 261, 261, 261, 261, 261,
+ 261, 164, 261, 261, 261, 261, 261, 89, 88, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 151, 261, 261, 261, 261, 261, 261, 261,
+ 261, 107, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 68, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 72, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 44, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 154, 155,
+ 261, 215, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 6, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 217, 261, 261, 261, 238, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 34, 261, 261, 261, 261, 261, 261, 261, 261, 147,
+ 261, 261, 261, 102, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 169, 261, 148, 261, 261, 181,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 35, 261, 261, 261,
+ 261, 261, 261, 104, 93, 261, 94, 261, 261, 92,
+ 261, 261, 261, 261, 261, 261, 261, 261, 118, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 204, 261, 261, 261, 261, 261, 261, 261, 261, 149,
+ 261, 261, 261, 261, 261, 152, 261, 261, 180, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 82, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 42, 261, 261, 261, 22, 261,
+ 261, 261, 261, 261, 19, 261, 261, 261, 23, 261,
+ 128, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 57,
+ 59, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 221, 261, 261, 261, 191, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 95, 261, 261, 261, 261, 261, 261,
+ 261, 261, 117, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 232, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 122, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 175, 261, 261, 261,
+ 261, 261, 261, 261, 261, 241, 261, 261, 261, 261,
+ 261, 261, 261, 261, 139, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 134, 261, 142, 261, 261,
+ 261, 261, 261, 110, 261, 261, 261, 261, 261, 78,
+ 261, 261, 261, 261, 167, 261, 261, 261, 261, 261,
+ 182, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 196, 261, 261, 261, 261, 261, 261,
+ 103, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 138, 261, 261, 261, 261, 261, 60, 61, 261, 261,
+ 261, 261, 261, 43, 261, 261, 261, 261, 261, 67,
+ 143, 261, 158, 261, 184, 153, 261, 261, 261, 53,
+
+ 261, 145, 261, 261, 261, 261, 261, 9, 261, 261,
+ 261, 81, 261, 261, 261, 261, 209, 261, 261, 261,
+ 166, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 137, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 124,
+ 220, 261, 261, 261, 261, 195, 261, 261, 261, 261,
+ 261, 261, 261, 261, 177, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 235, 261, 144, 261, 261, 261, 52, 54, 261, 261,
+ 261, 261, 261, 261, 261, 80, 261, 261, 261, 261,
+ 207, 261, 261, 261, 216, 261, 261, 261, 261, 261,
+ 261, 171, 30, 24, 26, 261, 261, 261, 261, 261,
+ 31, 25, 27, 261, 261, 261, 261, 261, 261, 77,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 173, 170, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 51, 261, 105, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 119, 13, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 230, 261, 233, 261, 261, 261,
+ 261, 261, 261, 12, 261, 261, 21, 261, 261, 261,
+ 213, 261, 261, 261, 218, 261, 55, 261, 179, 261,
+ 172, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 133, 132, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 174, 168, 261,
+ 261, 261, 222, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 62, 261, 261, 261, 208,
+
+ 261, 261, 261, 261, 261, 178, 261, 261, 261, 261,
+ 261, 261, 261, 261, 239, 240, 130, 56, 261, 261,
+ 261, 90, 91, 261, 125, 261, 127, 261, 159, 261,
+ 261, 261, 131, 261, 261, 185, 261, 261, 261, 261,
+ 261, 261, 261, 112, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 192, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 160, 261, 261, 206, 261, 234, 261, 261, 261, 38,
+ 261, 261, 261, 261, 4, 261, 261, 111, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 188,
+
+ 32, 33, 261, 261, 261, 261, 261, 261, 261, 223,
+ 261, 261, 261, 261, 261, 261, 194, 261, 261, 163,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 65,
+ 261, 39, 212, 261, 189, 261, 261, 11, 261, 261,
+ 261, 261, 261, 261, 161, 69, 261, 261, 261, 261,
+ 261, 136, 261, 261, 261, 261, 261, 114, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 193, 108, 261,
+ 96, 97, 261, 261, 261, 71, 75, 70, 261, 63,
+ 261, 261, 261, 10, 261, 261, 261, 210, 261, 261,
+ 261, 261, 135, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 76, 74, 261, 64, 231, 261, 261, 261, 150, 261,
+ 261, 162, 261, 261, 261, 261, 261, 261, 126, 58,
+ 261, 261, 261, 261, 261, 224, 261, 261, 261, 261,
+ 261, 261, 261, 109, 73, 115, 116, 66, 261, 211,
+ 129, 261, 261, 261, 261, 187, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 79, 261, 186,
+ 261, 203, 228, 261, 261, 261, 261, 261, 261, 261,
+
+ 261, 261, 5, 261, 261, 261, 229, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 113, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 146, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 225, 261,
+ 261, 261, 261, 261, 261, 261, 261, 261, 261, 261,
+ 261, 261, 261, 261, 261, 261, 242, 261, 261, 199,
+ 261, 261, 261, 261, 261, 226, 261, 261, 261, 261,
+ 261, 261, 227, 261, 261, 261, 197, 261, 200, 201,
+ 261, 261, 261, 261, 261, 198, 202, 0
+
} ;
static yyconst YY_CHAR yy_ec[256] =
@@ -695,571 +705,591 @@ static yyconst YY_CHAR yy_meta[67] =
1, 1, 1, 1, 1, 1
} ;
-static yyconst flex_uint16_t yy_base[2522] =
+static yyconst flex_uint16_t yy_base[2613] =
{ 0,
0, 0, 64, 67, 70, 72, 78, 84, 89, 92,
- 131, 137, 429, 374, 96, 7166, 7166, 7166, 109, 111,
- 85, 142, 180, 129, 134, 138, 183, 50, 166, 75,
- 214, 204, 179, 256, 141, 248, 304, 288, 303, 250,
- 136, 246, 318, 7166, 7166, 7166, 96, 315, 7166, 7166,
- 7166, 102, 314, 339, 7166, 7166, 7166, 278, 299, 7166,
- 7166, 7166, 115, 298, 7166, 305, 7166, 161, 346, 293,
- 363, 115, 0, 367, 0, 0, 107, 216, 145, 181,
- 227, 344, 284, 177, 339, 356, 346, 169, 268, 375,
- 355, 352, 366, 358, 363, 380, 392, 386, 403, 391,
-
- 393, 416, 425, 407, 415, 413, 438, 433, 440, 444,
- 434, 448, 458, 451, 471, 443, 257, 459, 464, 467,
- 468, 494, 475, 278, 489, 498, 493, 502, 486, 496,
- 506, 525, 524, 526, 528, 516, 532, 533, 252, 253,
- 237, 319, 235, 577, 259, 121, 312, 117, 587, 591,
- 0, 559, 545, 348, 566, 579, 387, 565, 569, 515,
- 585, 575, 589, 596, 599, 600, 608, 610, 654, 606,
- 619, 615, 624, 627, 637, 640, 645, 635, 628, 667,
- 651, 656, 681, 692, 684, 653, 687, 657, 690, 709,
- 701, 697, 696, 706, 702, 717, 704, 731, 728, 725,
-
- 734, 723, 739, 719, 748, 744, 742, 736, 737, 759,
- 755, 758, 769, 766, 764, 771, 782, 772, 793, 774,
- 799, 802, 785, 807, 798, 812, 707, 823, 816, 819,
- 801, 800, 818, 817, 825, 837, 828, 840, 844, 848,
- 852, 839, 845, 843, 860, 850, 857, 870, 876, 888,
- 241, 865, 890, 892, 879, 881, 899, 894, 903, 867,
- 897, 904, 905, 923, 913, 928, 909, 915, 919, 922,
- 932, 946, 948, 934, 949, 938, 957, 950, 960, 954,
- 962, 964, 970, 983, 977, 991, 985, 989, 987, 1005,
- 998, 1014, 1004, 1022, 1011, 1027, 1039, 1035, 1041, 1028,
-
- 1045, 1034, 1032, 1038, 1061, 1051, 1055, 1062, 1069, 1070,
- 1080, 1072, 1090, 1067, 1063, 1087, 1102, 1118, 1104, 1095,
- 1113, 1077, 7166, 1122, 1130, 1170, 1120, 1147, 1100, 1099,
- 1132, 1148, 1150, 1160, 1143, 1161, 1149, 1198, 1168, 1183,
- 1187, 1190, 1196, 1200, 1151, 1199, 1208, 1210, 1209, 1206,
- 1222, 1216, 1241, 1225, 1228, 1234, 1239, 1252, 1255, 1256,
- 1261, 1242, 1247, 1246, 1271, 1283, 1284, 1289, 1291, 1287,
- 1272, 1249, 1298, 1297, 1302, 1286, 1299, 1322, 1310, 1323,
- 1316, 1313, 1334, 1318, 1341, 1342, 1340, 1329, 1343, 1344,
- 1353, 1359, 1356, 1357, 7166, 1371, 1366, 1368, 1379, 1369,
-
- 1378, 7166, 1374, 1380, 1383, 1314, 1393, 1403, 1395, 1404,
- 1416, 1398, 1410, 1428, 1420, 1421, 1411, 1423, 1437, 1427,
- 1436, 1447, 1440, 1430, 1483, 1438, 1450, 1454, 1461, 1465,
- 1481, 1471, 1495, 1478, 1498, 1492, 1505, 1490, 1519, 1508,
- 1522, 1516, 1518, 1526, 1533, 1532, 1525, 1536, 1549, 7166,
- 1545, 1552, 1477, 1550, 1547, 1542, 1567, 1569, 1574, 1568,
- 1572, 1540, 1591, 1576, 1595, 1586, 1589, 1590, 1597, 1601,
- 1607, 1593, 1611, 1608, 1610, 1627, 1613, 1630, 1633, 1644,
- 1620, 1637, 1624, 1638, 1649, 1622, 1636, 1654, 1661, 1662,
- 1656, 1670, 1657, 1664, 1673, 1653, 1684, 1668, 1689, 1680,
-
- 1694, 1701, 1695, 1688, 1713, 1711, 1707, 1723, 1719, 1726,
- 1702, 1728, 1730, 1712, 1733, 1716, 1736, 1757, 1738, 1753,
- 1758, 1759, 1752, 1760, 1771, 1762, 1777, 1775, 1768, 1782,
- 1779, 1780, 1786, 1784, 1781, 1796, 1801, 1798, 1807, 1821,
- 1817, 1797, 1813, 1808, 1829, 1820, 1825, 1828, 1832, 1830,
- 1849, 1852, 1845, 1844, 1847, 1855, 1848, 1837, 1864, 1865,
- 1868, 1878, 1879, 1880, 1900, 1877, 1890, 1887, 1907, 1902,
- 1903, 1906, 1908, 1911, 1913, 1926, 1927, 1923, 1930, 1935,
- 1934, 1942, 1940, 1950, 1953, 1959, 1957, 1946, 1949, 1965,
- 1980, 1972, 1976, 7166, 1969, 1841, 1971, 1990, 1983, 1982,
-
- 1979, 1993, 1984, 1998, 1999, 2046, 7166, 2015, 7166, 7166,
- 1987, 7166, 7166, 2025, 2026, 2009, 2036, 2042, 2022, 2021,
- 2027, 2029, 2095, 2039, 2056, 2049, 2054, 2081, 2045, 2082,
- 2090, 2073, 2092, 2098, 2109, 2100, 2108, 2116, 2119, 2117,
- 2122, 2126, 2123, 2132, 2136, 2140, 2129, 2149, 2152, 2162,
- 7166, 2159, 2171, 2173, 2167, 2169, 2172, 2174, 2165, 2185,
- 2186, 2158, 2187, 2194, 2197, 2200, 2189, 7166, 2202, 2206,
- 2216, 2213, 2209, 2221, 2210, 2207, 2230, 2204, 2248, 7166,
- 2242, 2241, 2233, 2253, 2235, 2243, 2245, 2252, 2257, 2255,
- 2269, 2249, 2268, 2279, 2281, 2270, 2284, 2296, 2299, 2283,
-
- 2285, 2297, 2291, 2301, 2295, 2312, 2307, 2324, 2329, 2316,
- 2325, 2326, 2320, 2348, 2343, 2339, 2328, 2344, 2355, 2347,
- 2359, 2360, 2356, 2363, 2350, 2375, 2358, 2376, 2370, 7166,
- 2369, 2377, 7166, 2390, 2374, 2435, 2397, 2396, 2384, 2387,
- 2405, 2406, 2423, 2416, 2434, 2427, 2443, 2437, 2448, 2454,
- 2431, 2439, 2455, 2470, 2482, 2415, 207, 2489, 2466, 2473,
- 2518, 2483, 2493, 2474, 2490, 2503, 2500, 2486, 2509, 2487,
- 2515, 2508, 2535, 7166, 2516, 2525, 2521, 2536, 2546, 2542,
- 2541, 2545, 2548, 2543, 2561, 2568, 2563, 2553, 2569, 2564,
- 2572, 2570, 2574, 2598, 7166, 2580, 2581, 2584, 2588, 2607,
-
- 2608, 2609, 2611, 2616, 2623, 2615, 7166, 2606, 2631, 2644,
- 2629, 2610, 2626, 2637, 2659, 2640, 2654, 2641, 2656, 2658,
- 2649, 2664, 2672, 2666, 7166, 2668, 2681, 2676, 2671, 2680,
- 2685, 2684, 2703, 2692, 2695, 2693, 2704, 2705, 2720, 2711,
- 2718, 7166, 2707, 2731, 2727, 2719, 2721, 2732, 2738, 2724,
- 2741, 2761, 2762, 2745, 2758, 2764, 2748, 2756, 2759, 1133,
- 2755, 2765, 2776, 2752, 7166, 2780, 2778, 68, 2779, 2769,
- 2797, 2781, 2789, 2815, 2817, 2808, 2812, 2816, 2804, 2805,
- 2820, 2822, 2811, 2826, 2835, 2832, 2827, 2841, 2838, 2852,
- 2843, 2870, 7166, 2860, 2864, 2865, 2853, 2868, 2882, 2892,
-
- 2876, 2847, 2899, 2887, 7166, 2905, 2902, 2890, 2913, 2908,
- 2911, 2909, 2896, 2929, 2928, 2923, 2932, 2927, 2931, 2935,
- 2942, 2934, 2940, 2945, 2954, 7166, 2969, 2964, 2958, 2957,
- 2981, 2962, 2988, 2975, 2968, 2984, 2998, 3022, 2993, 3001,
- 3005, 3011, 3002, 3033, 3038, 3039, 3046, 3028, 3050, 3051,
- 3009, 3034, 3019, 3024, 3058, 3049, 3082, 3066, 184, 3070,
- 7166, 3080, 3072, 3074, 3079, 3110, 3089, 3086, 3085, 3109,
- 3106, 3116, 3112, 3115, 3114, 3113, 3123, 3134, 3130, 3135,
- 3144, 7166, 3149, 3151, 3139, 3154, 3140, 3163, 3159, 3147,
- 3148, 3170, 3157, 3175, 3186, 7166, 3179, 3184, 3185, 3187,
-
- 3194, 3197, 3183, 3202, 3196, 3204, 7166, 3205, 3210, 3213,
- 3227, 3224, 3215, 3225, 3238, 3219, 7166, 3221, 3220, 3232,
- 7166, 3254, 3242, 3230, 3246, 3253, 3237, 3270, 3252, 3249,
- 3257, 3273, 3286, 3264, 3283, 7166, 3276, 3309, 3281, 3284,
- 3279, 3297, 3303, 3320, 3305, 3302, 3331, 3319, 3322, 3308,
- 3311, 3324, 3335, 3326, 3336, 7166, 3343, 3341, 3360, 3362,
- 3347, 3353, 3363, 3354, 3364, 3367, 3370, 3376, 3374, 3389,
- 3393, 3386, 3399, 3406, 3400, 3405, 3397, 3409, 3422, 3424,
- 3420, 3427, 7166, 3410, 3425, 3430, 3426, 3432, 3435, 3433,
- 3442, 3438, 3453, 3459, 3449, 3455, 3483, 3484, 3448, 3462,
-
- 3473, 3475, 3477, 3470, 3479, 3487, 3504, 3486, 3488, 3490,
- 3497, 3508, 3491, 3511, 3502, 3524, 3521, 3528, 3532, 3536,
- 3529, 3535, 3534, 3539, 7166, 3530, 3549, 3546, 3570, 3574,
- 3576, 3559, 3563, 3562, 3557, 3583, 7166, 3569, 7166, 3567,
- 3586, 3592, 3600, 7166, 3598, 7166, 3599, 3595, 3596, 7166,
- 3601, 3615, 3603, 3627, 3620, 3602, 3608, 3635, 3623, 3629,
- 3625, 3641, 3642, 3638, 3644, 3648, 3655, 3649, 3659, 3652,
- 7166, 3674, 3663, 3669, 3673, 3676, 3684, 3668, 3671, 3685,
- 3697, 3672, 3704, 3708, 3712, 3700, 3714, 7166, 3703, 3722,
- 3707, 3719, 7166, 3718, 3727, 3731, 3709, 3730, 3736, 3734,
-
- 3755, 3750, 3740, 3767, 3771, 3763, 3765, 3775, 3754, 3769,
- 3776, 3783, 3787, 3781, 3778, 3798, 3790, 3799, 3825, 3826,
- 3817, 3828, 3801, 3827, 3738, 3829, 3812, 3811, 3813, 3821,
- 3823, 3851, 3852, 3846, 3847, 3848, 3855, 3845, 7166, 3870,
- 3856, 3872, 3879, 3871, 3873, 3857, 3883, 3882, 3890, 3895,
- 3903, 3900, 7166, 3904, 7166, 3896, 3911, 3920, 3922, 3907,
- 3928, 3929, 3927, 3931, 3932, 3948, 3940, 3937, 3942, 3952,
- 3943, 3959, 3958, 3954, 7166, 3951, 3964, 3979, 3967, 3978,
- 3985, 3996, 3986, 3981, 4020, 7166, 4001, 4000, 4002, 4009,
- 4014, 4021, 4024, 7166, 4012, 4017, 4026, 4022, 4034, 7166,
-
- 7166, 4023, 4033, 4046, 4050, 4041, 4038, 4053, 4049, 4056,
- 4058, 4045, 4062, 4068, 7166, 4074, 4064, 4083, 4091, 4092,
- 4094, 4079, 4077, 7166, 4093, 4103, 4090, 4098, 4115, 4104,
- 4117, 4113, 4114, 4133, 4125, 4120, 4139, 4146, 4147, 4148,
- 7166, 4149, 4142, 4153, 4143, 4156, 4159, 4164, 4141, 4161,
- 4169, 4166, 4183, 4182, 4180, 4196, 4190, 4177, 4188, 4200,
- 4207, 4204, 4186, 4209, 4206, 4215, 4218, 4220, 4217, 4238,
- 4219, 4227, 4241, 4245, 4255, 4250, 7166, 4256, 4239, 4260,
- 4233, 4259, 4261, 4268, 4264, 4280, 4243, 4251, 4278, 4254,
- 7166, 4302, 4286, 4277, 4297, 4288, 4314, 4301, 4291, 4295,
-
- 4312, 4305, 4322, 4313, 4320, 4324, 4317, 7166, 7166, 4327,
- 4332, 4334, 4330, 4339, 4347, 4338, 4354, 4341, 4359, 7166,
- 4357, 4376, 4350, 4371, 4381, 4384, 4385, 4382, 4379, 4372,
- 4374, 4383, 4397, 4386, 4390, 4406, 4403, 4417, 7166, 4409,
- 4408, 7166, 4413, 4422, 4419, 4420, 4438, 4435, 4447, 4441,
- 4430, 4440, 4449, 4450, 4465, 4461, 4467, 4464, 4472, 4484,
- 4478, 4487, 4460, 4477, 4488, 7166, 4481, 4491, 4494, 4476,
- 4505, 4490, 4514, 4498, 7166, 4518, 4516, 4525, 4524, 4527,
- 4509, 4535, 4528, 4533, 4536, 4522, 7166, 4539, 7166, 4537,
- 4545, 7166, 4547, 4556, 4543, 4573, 4567, 4572, 4574, 4578,
-
- 4560, 4581, 4564, 4566, 4584, 4587, 4586, 4575, 7166, 4609,
- 4600, 4611, 4613, 4612, 4615, 7166, 7166, 4596, 7166, 4614,
- 4616, 7166, 4619, 4617, 4602, 4608, 4649, 4651, 4633, 4646,
- 7166, 4655, 4636, 4663, 4657, 4644, 4658, 4660, 4667, 4642,
- 4659, 4669, 7166, 4678, 4691, 4700, 4686, 4687, 4705, 4706,
- 4689, 7166, 4712, 4718, 4692, 4716, 4715, 7166, 4714, 4724,
- 7166, 4732, 4728, 4730, 4735, 4750, 4749, 4753, 4742, 4741,
- 4768, 4759, 4757, 4763, 7166, 4747, 4751, 4772, 4774, 4767,
- 4769, 4805, 4798, 4802, 4794, 4807, 4809, 4811, 4812, 4792,
- 4815, 4817, 4816, 7166, 4833, 4819, 4822, 7166, 4835, 4832,
-
- 4838, 4839, 4842, 7166, 4849, 4859, 4862, 7166, 4868, 7166,
- 4865, 4850, 4855, 4853, 4854, 4893, 4890, 4896, 4883, 4900,
- 4898, 4894, 4911, 4905, 4901, 4892, 7166, 7166, 4913, 4932,
- 4915, 4916, 4917, 4910, 4923, 4951, 4943, 4952, 4949, 4960,
- 7166, 4953, 4936, 4961, 7166, 4937, 4964, 4944, 4971, 4968,
- 4972, 4950, 4982, 4993, 4987, 4996, 4977, 4988, 5000, 5006,
- 7166, 4989, 4991, 4998, 4995, 5012, 5015, 4999, 5020, 7166,
- 5025, 5043, 5042, 5037, 5030, 5038, 5048, 5053, 5054, 5046,
- 5047, 5055, 5077, 5066, 5074, 7166, 5080, 5064, 5070, 5082,
- 5092, 5095, 5081, 5096, 5087, 5098, 5099, 5088, 5091, 7166,
-
- 5115, 5103, 5109, 5124, 5113, 5127, 5132, 5137, 5134, 5122,
- 5129, 5147, 5143, 7166, 5125, 5123, 5142, 5159, 5148, 5158,
- 5167, 5156, 5171, 5155, 5186, 5170, 5189, 7166, 5180, 5183,
- 5190, 5174, 5196, 5200, 5197, 5206, 5207, 5205, 5223, 5210,
- 5217, 5216, 5222, 5232, 5233, 5226, 5250, 5247, 7166, 5234,
- 7166, 5237, 5255, 5268, 5270, 5264, 7166, 5265, 5260, 5263,
- 7166, 5273, 5277, 5261, 5282, 7166, 5298, 5291, 5287, 5303,
- 5289, 7166, 5305, 5314, 5319, 5313, 5327, 5310, 5312, 5328,
- 5321, 5322, 5316, 5330, 7166, 5334, 5342, 5347, 5354, 5344,
- 5346, 7166, 5348, 5356, 5352, 5363, 5358, 5365, 5357, 5374,
-
- 5369, 7166, 5372, 5377, 5394, 5390, 5400, 7166, 7166, 5392,
- 5407, 5409, 5384, 5415, 7166, 5414, 5405, 5401, 5420, 5417,
- 7166, 7166, 5422, 7166, 5428, 7166, 7166, 5425, 5433, 5423,
- 7166, 5424, 7166, 5436, 5447, 5440, 5432, 5453, 7166, 5442,
- 5450, 5464, 7166, 5457, 5473, 5452, 5463, 7166, 5471, 7166,
- 5475, 5472, 5477, 5484, 5480, 5481, 5487, 5496, 5501, 5506,
- 5510, 5500, 5497, 5516, 5519, 5513, 5518, 5526, 5529, 5522,
- 5523, 5524, 5511, 5527, 5521, 5535, 5546, 5538, 5540, 5553,
- 5545, 5556, 5573, 5562, 7166, 5557, 5554, 5563, 5582, 5565,
- 5572, 5583, 5578, 5594, 5606, 7166, 7166, 5610, 5590, 5603,
-
- 5597, 7166, 5598, 5601, 5600, 5609, 5617, 5612, 5613, 5641,
- 7166, 5620, 5639, 5623, 5633, 5634, 5647, 5640, 5644, 5645,
- 5649, 5658, 5657, 5664, 5675, 5668, 5672, 5661, 5678, 5673,
- 5674, 5691, 5695, 5698, 5701, 5706, 7166, 5689, 7166, 5700,
- 5692, 5707, 7166, 7166, 5711, 5714, 5715, 5722, 5725, 5729,
- 5728, 7166, 5730, 5736, 5746, 5734, 7166, 5748, 7166, 5750,
- 5735, 5751, 5755, 5765, 7166, 7166, 7166, 7166, 5767, 5744,
- 5756, 5763, 5770, 7166, 7166, 7166, 5775, 5771, 5781, 5783,
- 5782, 5792, 7166, 5784, 5809, 5810, 5789, 5805, 5817, 5813,
- 5816, 5827, 5818, 5824, 5819, 5828, 5829, 5830, 7166, 7166,
-
- 5822, 5836, 5858, 5854, 5860, 5843, 5863, 5864, 5862, 5853,
- 5866, 5870, 5861, 7166, 5876, 7166, 5872, 5878, 5889, 5895,
- 5900, 5902, 5912, 5905, 7166, 7166, 5896, 5897, 5899, 5919,
- 5901, 5916, 5906, 5930, 5931, 7166, 5922, 7166, 5933, 5947,
- 5936, 5954, 5948, 5957, 7166, 5946, 5952, 7166, 5963, 5945,
- 5961, 7166, 5968, 7166, 7166, 5966, 7166, 5971, 7166, 5977,
- 5984, 5987, 5999, 5998, 6000, 6004, 6002, 5992, 6006, 5990,
- 5995, 6015, 6013, 6012, 7166, 7166, 6020, 6014, 6017, 6026,
- 6021, 6034, 6030, 7166, 7166, 6040, 6041, 6048, 7166, 6027,
- 6053, 6042, 6050, 6044, 6043, 6067, 6058, 6047, 6076, 6069,
-
- 6090, 6094, 6096, 6098, 6085, 6087, 6080, 6078, 6093, 6086,
- 6089, 7166, 6110, 6127, 6114, 7166, 6134, 6128, 6138, 6137,
- 6131, 7166, 6121, 6143, 6141, 6144, 6136, 6149, 6133, 6147,
- 7166, 6150, 6166, 6167, 7166, 7166, 6157, 7166, 6169, 7166,
- 6164, 7166, 6183, 6186, 6180, 7166, 6190, 6196, 7166, 6192,
- 6194, 6178, 6199, 6206, 7166, 6204, 6215, 6223, 6229, 6214,
- 6213, 6230, 6219, 6209, 6224, 6239, 7166, 6225, 6233, 6243,
- 6240, 6241, 6259, 6256, 6242, 6255, 6264, 6268, 6251, 6279,
- 6269, 7166, 6284, 6287, 7166, 6276, 7166, 6289, 6278, 6293,
- 7166, 6302, 6290, 6285, 6299, 7166, 6306, 6295, 7166, 6301,
-
- 6313, 6319, 6321, 6311, 6320, 6315, 6324, 6332, 6338, 6342,
- 7166, 6337, 6333, 6357, 6355, 6358, 6367, 6345, 7166, 6351,
- 6368, 6360, 6372, 6374, 6375, 7166, 6377, 6362, 7166, 6386,
- 6393, 6398, 6382, 6400, 6397, 6407, 6410, 6406, 7166, 6412,
- 7166, 7166, 6395, 7166, 6394, 6425, 7166, 6415, 6417, 6408,
- 6420, 6436, 6435, 7166, 7166, 6432, 6422, 6437, 6448, 6449,
- 7166, 6430, 6441, 6455, 6439, 6459, 7166, 6462, 6452, 6463,
- 6464, 6467, 6453, 6482, 6474, 6488, 7166, 7166, 6486, 7166,
- 7166, 6502, 6503, 6501, 7166, 7166, 7166, 6504, 7166, 6507,
- 6518, 6510, 7166, 6508, 6520, 6509, 7166, 6519, 6517, 6521,
-
- 6527, 7166, 6522, 6530, 6552, 6543, 6555, 6541, 6554, 6549,
- 6577, 6565, 6537, 6548, 6557, 6566, 6568, 6572, 6574, 7166,
- 7166, 6587, 7166, 7166, 6594, 6596, 6597, 7166, 6593, 6603,
- 7166, 6606, 6592, 6598, 6608, 6600, 6611, 7166, 7166, 6595,
- 6614, 6605, 6625, 6621, 7166, 6640, 6633, 6632, 6642, 6630,
- 6627, 6634, 7166, 7166, 7166, 7166, 7166, 6648, 7166, 7166,
- 6641, 6652, 6635, 6657, 7166, 6658, 6669, 6660, 6661, 6674,
- 6685, 6682, 6675, 6679, 6677, 6678, 6684, 6690, 6700, 6715,
- 6709, 6719, 6722, 6725, 6728, 6712, 6713, 6726, 6727, 6730,
- 6736, 6749, 6739, 6724, 6743, 6748, 7166, 6753, 7166, 6751,
-
- 7166, 7166, 6744, 6746, 6771, 6758, 6786, 6787, 6770, 6759,
- 6773, 7166, 6763, 6775, 6797, 7166, 6785, 6788, 6790, 6794,
- 6795, 6799, 6798, 6822, 6811, 6804, 6833, 6832, 6844, 6839,
- 6836, 6838, 6842, 6834, 6849, 6846, 6848, 7166, 6854, 6860,
- 6850, 6863, 6864, 6867, 6869, 6859, 6891, 7166, 6889, 6886,
- 6896, 6878, 6881, 6880, 6902, 6899, 6908, 7166, 6885, 6913,
- 6915, 6916, 6931, 6928, 6929, 6918, 6939, 6941, 6945, 6949,
- 6943, 6944, 6935, 6948, 6938, 7166, 6952, 6963, 7166, 6962,
- 6964, 6966, 6968, 6991, 7166, 6983, 6978, 6979, 6999, 6986,
- 6981, 7166, 7001, 7002, 6996, 7166, 7006, 7166, 7166, 7012,
-
- 7013, 7015, 7004, 7016, 7166, 7166, 7166, 7074, 7081, 7088,
- 7095, 7102, 83, 7109, 7116, 7123, 7130, 7137, 7144, 7151,
- 7158
+ 131, 137, 352, 307, 96, 7434, 7434, 7434, 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, 7434, 7434, 7434, 104, 288, 7434, 7434,
+ 7434, 147, 286, 289, 7434, 7434, 7434, 305, 239, 7434,
+ 7434, 7434, 160, 210, 7434, 372, 7434, 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,
+
+ 408, 386, 424, 434, 409, 417, 403, 317, 425, 435,
+ 432, 443, 453, 469, 456, 470, 458, 476, 461, 503,
+ 467, 468, 509, 486, 212, 498, 490, 497, 504, 502,
+ 514, 517, 530, 528, 541, 539, 534, 558, 531, 190,
+ 164, 138, 231, 122, 592, 158, 79, 277, 66, 600,
+ 604, 0, 572, 577, 561, 583, 585, 598, 576, 597,
+ 588, 593, 611, 599, 609, 622, 624, 620, 340, 638,
+ 682, 643, 633, 634, 637, 645, 660, 649, 662, 663,
+ 666, 680, 655, 693, 694, 726, 701, 704, 718, 627,
+ 687, 710, 635, 715, 722, 729, 720, 745, 731, 753,
+
+ 755, 750, 739, 754, 747, 758, 748, 761, 763, 773,
+ 774, 771, 777, 772, 784, 788, 670, 780, 800, 790,
+ 817, 794, 816, 815, 828, 829, 807, 830, 819, 836,
+ 492, 833, 835, 846, 827, 834, 820, 849, 844, 847,
+ 864, 857, 843, 845, 876, 877, 888, 870, 872, 871,
+ 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, 1151, 1130, 1135, 1148, 1155,
+ 7434, 1173, 1166, 1218, 1164, 1175, 1209, 1181, 1168, 1196,
+ 1171, 1208, 1212, 1223, 1198, 1138, 1213, 1248, 1178, 1202,
+ 1226, 1240, 1236, 1247, 1243, 1245, 1244, 1263, 1271, 1251,
+ 1253, 1279, 1287, 1261, 1275, 1278, 1283, 1293, 1296, 1309,
+ 1298, 1292, 1314, 1311, 1317, 1323, 1306, 1334, 1333, 1326,
+ 1321, 1325, 1341, 1350, 1344, 1355, 1362, 1338, 1364, 1366,
+ 1382, 1372, 1376, 1365, 1389, 1378, 1373, 1368, 1390, 1392,
+
+ 1393, 1400, 1406, 1402, 1417, 7434, 1421, 1405, 1428, 1416,
+ 1410, 1427, 7434, 1438, 1414, 1432, 1445, 1433, 1452, 1457,
+ 1437, 1459, 1473, 1454, 1468, 1481, 1461, 1477, 1465, 1469,
+ 1476, 1486, 1478, 1501, 1494, 1492, 1538, 1495, 1497, 1507,
+ 1520, 1514, 1535, 1532, 1550, 1533, 1560, 1541, 1552, 1545,
+ 1568, 1559, 1566, 1577, 1575, 1576, 1584, 1590, 1581, 1591,
+ 1601, 7434, 1603, 1605, 1556, 1602, 1595, 1596, 1617, 1620,
+ 1622, 1634, 1630, 1644, 1637, 1161, 1625, 1636, 1629, 1639,
+ 1647, 1653, 1649, 1652, 1667, 1669, 1689, 1674, 1688, 1690,
+ 1664, 1692, 1693, 1702, 1677, 1694, 1681, 1695, 1704, 1682,
+
+ 1709, 1714, 1711, 1719, 1706, 1730, 1717, 1716, 1734, 1726,
+ 1744, 1731, 1741, 1736, 1743, 1755, 1745, 1750, 1778, 1771,
+ 1781, 1786, 1783, 1789, 1775, 1782, 1792, 1773, 1796, 1805,
+ 1809, 1815, 1804, 1820, 1803, 1831, 1823, 1811, 1821, 1842,
+ 1838, 1845, 1841, 1846, 1864, 1836, 1847, 1861, 1850, 1848,
+ 1857, 1874, 1882, 1862, 1871, 1887, 1895, 1896, 1877, 1884,
+ 1898, 1901, 1908, 1913, 1914, 1915, 1916, 1929, 1911, 1922,
+ 1921, 1927, 1938, 1930, 1956, 1943, 1948, 1951, 1953, 1958,
+ 1955, 1978, 1964, 1965, 1970, 1982, 1972, 1983, 1973, 1997,
+ 1985, 2000, 2011, 2013, 2001, 2014, 2017, 2006, 2023, 2010,
+
+ 2025, 2033, 2031, 2028, 2045, 2024, 2047, 2043, 2056, 2066,
+ 2065, 2059, 7434, 2052, 1998, 2053, 2072, 2070, 2060, 2089,
+ 2069, 2083, 2081, 2087, 2130, 7434, 2096, 7434, 7434, 2100,
+ 7434, 7434, 2104, 2114, 2128, 2118, 2123, 2110, 2129, 2133,
+ 2095, 2180, 2131, 2140, 2146, 2150, 2183, 2085, 2167, 2177,
+ 2170, 2188, 2163, 2190, 2191, 2201, 2194, 2205, 2218, 2207,
+ 2210, 2223, 2234, 2221, 2225, 2220, 2228, 2237, 2241, 2275,
+ 7434, 2252, 2249, 2251, 2250, 2254, 2263, 2264, 2255, 2269,
+ 2276, 2266, 2259, 2279, 2281, 2297, 2286, 7434, 2295, 2298,
+ 2306, 2300, 2291, 2312, 2314, 2310, 2318, 2315, 2321, 2320,
+
+ 2299, 2348, 7434, 2341, 2349, 2331, 2355, 2342, 2334, 2344,
+ 2350, 2346, 2356, 2370, 2362, 2369, 2375, 2373, 2376, 2390,
+ 2392, 2394, 2386, 2389, 2400, 2383, 2403, 2410, 2413, 2408,
+ 2419, 2414, 2407, 2432, 2433, 2421, 2448, 2434, 2436, 2440,
+ 2430, 2459, 2453, 2456, 2450, 2457, 2464, 2463, 2470, 2471,
+ 2460, 2461, 2487, 2475, 7434, 2469, 2489, 7434, 2484, 2485,
+ 2531, 2516, 2514, 2495, 2498, 2522, 2512, 2519, 2521, 2560,
+ 2543, 2555, 2541, 2561, 2567, 2550, 2544, 2571, 2569, 2578,
+ 2580, 1925, 2583, 2562, 2577, 2622, 2588, 2592, 2599, 2594,
+ 2589, 2604, 2610, 2611, 2616, 2620, 2629, 2640, 7434, 2619,
+
+ 2631, 2632, 2647, 2637, 2649, 2646, 2661, 2663, 2664, 2658,
+ 2668, 2667, 2674, 2662, 2669, 2673, 2675, 2689, 2708, 7434,
+ 2696, 7434, 2691, 2695, 2697, 2702, 2716, 2722, 2723, 2710,
+ 2725, 2713, 2718, 7434, 2720, 2738, 2755, 2748, 2743, 2740,
+ 2744, 2753, 2746, 2769, 2752, 2773, 2771, 2764, 2776, 2787,
+ 2778, 2790, 2797, 2798, 7434, 2800, 2788, 2801, 2782, 2811,
+ 2809, 2805, 2813, 2808, 2820, 2821, 2817, 2825, 2847, 2844,
+ 2846, 7434, 2836, 2860, 2856, 2850, 2840, 2861, 2868, 2857,
+ 2853, 2866, 2867, 2855, 2884, 2869, 2871, 2885, 2888, 1093,
+ 2883, 2894, 2886, 2882, 7434, 2895, 2904, 61, 2906, 2908,
+
+ 2912, 2913, 2910, 2925, 2909, 2943, 2947, 2939, 2946, 2949,
+ 2941, 2945, 2952, 2938, 2942, 2951, 2962, 2964, 2960, 2976,
+ 2974, 2987, 2975, 3002, 7434, 2996, 3000, 2999, 2984, 3009,
+ 3010, 3004, 3003, 3019, 3036, 3023, 7434, 2967, 3039, 3027,
+ 3046, 3045, 3043, 3060, 3034, 3050, 3066, 3057, 3055, 3069,
+ 3065, 3072, 3077, 3070, 3078, 3080, 3092, 7434, 2969, 3089,
+ 3087, 3091, 3104, 3094, 3129, 3107, 3118, 3110, 3119, 3155,
+ 3122, 3130, 3145, 3142, 3149, 3152, 3153, 3162, 3170, 3172,
+ 3157, 3156, 3181, 3179, 3182, 3146, 3201, 3198, 3206, 3229,
+ 3213, 2127, 3196, 7434, 3208, 3202, 3197, 3223, 3221, 3204,
+
+ 3231, 3237, 3246, 3233, 3235, 3253, 3257, 3262, 3263, 3259,
+ 3248, 3258, 3264, 3219, 3272, 3292, 3295, 7434, 3298, 3300,
+ 3284, 3302, 3286, 3307, 3304, 3291, 3294, 3308, 3296, 3321,
+ 3318, 7434, 3314, 3332, 3330, 3335, 3341, 3348, 3333, 3344,
+ 3345, 3342, 7434, 3359, 3361, 3353, 3366, 3354, 3364, 3373,
+ 3370, 3367, 7434, 3369, 3372, 3371, 3379, 3386, 7434, 3406,
+ 3388, 3385, 3391, 3390, 3407, 3419, 3401, 3399, 3409, 3418,
+ 3437, 3415, 3434, 7434, 3422, 3458, 3435, 3432, 3429, 3442,
+ 3445, 3468, 3453, 3461, 3479, 3474, 3466, 3462, 3465, 3480,
+ 3489, 3492, 3493, 7434, 3482, 3497, 3511, 3495, 3509, 3514,
+
+ 3505, 3516, 3520, 3530, 3531, 3529, 3523, 3542, 3547, 3541,
+ 3544, 3550, 3555, 3557, 3560, 3561, 3484, 3502, 3564, 3582,
+ 7434, 3567, 3585, 3586, 3578, 3584, 3587, 3592, 3600, 3597,
+ 3607, 3613, 3606, 3611, 3636, 3637, 3619, 3616, 3622, 3629,
+ 3631, 3626, 3628, 3633, 3644, 3664, 3642, 3646, 3653, 3655,
+ 3656, 3663, 3671, 3666, 3673, 3675, 3685, 3690, 3692, 3691,
+ 3680, 3693, 3719, 7434, 3700, 3709, 3688, 3710, 3728, 3729,
+ 3735, 3737, 3739, 3722, 3712, 3727, 3749, 3745, 7434, 3732,
+ 7434, 3752, 3753, 3759, 3768, 7434, 3771, 7434, 3775, 3762,
+ 3765, 7434, 3779, 3783, 3767, 3785, 3792, 3776, 3772, 3795,
+
+ 3787, 3799, 3798, 3807, 3812, 3809, 3820, 3805, 3819, 3831,
+ 3814, 3832, 7434, 3838, 3824, 3836, 3825, 3839, 3843, 3848,
+ 3856, 3847, 3858, 3846, 3874, 3864, 3885, 3876, 3891, 3869,
+ 3895, 7434, 3883, 3892, 3880, 3894, 7434, 3893, 3901, 3903,
+ 3909, 3907, 3918, 3910, 3914, 3920, 3919, 3945, 3940, 3938,
+ 3944, 3949, 3930, 3958, 3967, 3968, 3972, 3959, 3966, 3956,
+ 3965, 3977, 3982, 3992, 3993, 3994, 3980, 4000, 4002, 4007,
+ 3990, 3995, 3996, 3999, 4004, 4021, 4001, 4041, 4017, 4026,
+ 4024, 4028, 7434, 4047, 4030, 4051, 4053, 4043, 4045, 4039,
+ 4034, 4060, 4067, 4064, 4080, 4068, 7434, 4073, 7434, 4072,
+
+ 4075, 4101, 4100, 4104, 4086, 4107, 4090, 4099, 4091, 4113,
+ 4114, 4119, 4121, 4109, 4130, 4120, 4128, 4135, 4132, 7434,
+ 4133, 4127, 4152, 4147, 4155, 4156, 4166, 4175, 4150, 4165,
+ 4171, 4201, 7434, 4183, 4178, 4182, 4176, 4180, 4194, 4209,
+ 4206, 7434, 4195, 4203, 4211, 4205, 4216, 7434, 7434, 4204,
+ 4210, 4226, 4222, 4227, 4245, 4238, 4230, 4228, 4246, 4263,
+ 4244, 4249, 7434, 4264, 4250, 4262, 4274, 4275, 4276, 4273,
+ 4261, 7434, 4268, 4269, 4285, 4286, 4295, 4292, 4291, 4308,
+ 4309, 4311, 4297, 4300, 4290, 4317, 4310, 4324, 4299, 4331,
+ 4333, 7434, 4335, 4336, 4339, 4337, 4344, 4350, 4332, 4343,
+
+ 4351, 4356, 4363, 4366, 4370, 4371, 4376, 4378, 4364, 4379,
+ 4385, 4393, 4383, 4380, 4395, 4414, 4417, 4419, 4423, 4405,
+ 4424, 4407, 4408, 4430, 4432, 4422, 4434, 7434, 4438, 4421,
+ 4443, 4433, 4444, 4440, 4452, 4459, 4463, 4442, 4461, 4473,
+ 4464, 7434, 4478, 4469, 4470, 4487, 4479, 4492, 4486, 4496,
+ 4480, 4493, 4491, 4511, 4504, 4505, 4514, 4526, 7434, 7434,
+ 4520, 7434, 4509, 4533, 4519, 4528, 4531, 4522, 4536, 4539,
+ 4543, 7434, 4545, 4557, 4549, 4561, 4576, 4578, 4574, 4575,
+ 4570, 4562, 4564, 4573, 4584, 4563, 4567, 4597, 4604, 4595,
+ 4601, 4609, 7434, 4599, 4608, 4603, 7434, 4614, 4617, 4626,
+
+ 4625, 4623, 4635, 4647, 4637, 4628, 4624, 4648, 4650, 4652,
+ 4657, 4665, 4656, 4671, 4678, 4685, 4686, 4661, 4677, 4691,
+ 7434, 4681, 4696, 4690, 4676, 4711, 4688, 4712, 4697, 7434,
+ 4707, 4703, 4716, 7434, 4723, 4724, 4731, 4732, 4713, 4740,
+ 4735, 4737, 4738, 4736, 7434, 4749, 7434, 4752, 4758, 7434,
+ 4761, 4762, 4751, 4757, 4766, 4772, 4781, 4780, 4767, 4782,
+ 4778, 4771, 4788, 4798, 4800, 4797, 7434, 4809, 4802, 4807,
+ 4813, 4814, 4815, 7434, 7434, 4806, 7434, 4819, 4823, 7434,
+ 4817, 4831, 4836, 4834, 4853, 4850, 4856, 4849, 7434, 4858,
+ 4840, 4863, 4859, 4848, 4861, 4862, 4870, 4867, 4883, 4896,
+
+ 7434, 4879, 4891, 4904, 4887, 4892, 4908, 4916, 4897, 7434,
+ 4922, 4926, 4889, 4931, 4906, 7434, 4932, 4935, 7434, 4933,
+ 4945, 4924, 4951, 4944, 4952, 4960, 4943, 4949, 4971, 4962,
+ 4968, 4972, 7434, 4963, 4977, 4975, 4984, 4978, 4983, 5002,
+ 4995, 4999, 4998, 4986, 5004, 5018, 5020, 5008, 5025, 5013,
+ 5011, 5023, 5027, 5012, 7434, 5041, 5044, 5050, 7434, 5043,
+ 5038, 5039, 5042, 5046, 7434, 5063, 5067, 5069, 7434, 5073,
+ 7434, 5080, 5068, 5066, 5078, 5088, 5098, 5095, 5109, 5093,
+ 5106, 5111, 5101, 5126, 5122, 5128, 5124, 5121, 5115, 7434,
+ 7434, 5132, 5143, 5125, 5140, 5145, 5138, 5139, 5152, 5155,
+
+ 5163, 5159, 5173, 7434, 5170, 5156, 5171, 7434, 5153, 5183,
+ 5166, 5177, 5190, 5181, 5191, 5194, 5202, 5196, 5204, 5186,
+ 5201, 5219, 5214, 7434, 5208, 5213, 5221, 5218, 5230, 5216,
+ 5238, 5231, 7434, 5240, 5253, 5257, 5243, 5247, 5259, 5262,
+ 5266, 5268, 5258, 5265, 5274, 5282, 5281, 5292, 7434, 5293,
+ 5276, 5284, 5295, 5306, 5310, 5308, 5312, 5299, 5313, 5314,
+ 5301, 5311, 7434, 5324, 5316, 5326, 5332, 5328, 5341, 5333,
+ 5348, 5350, 5339, 5352, 5342, 5362, 7434, 5351, 5357, 5355,
+ 5377, 5365, 5368, 5375, 5378, 7434, 5383, 5376, 5379, 5385,
+ 5374, 5408, 5402, 5413, 7434, 5404, 5414, 5417, 5403, 5405,
+
+ 5412, 5420, 5429, 5432, 5435, 5443, 5426, 5441, 5449, 5456,
+ 5457, 5460, 5453, 5235, 5459, 7434, 5452, 7434, 5462, 5473,
+ 5478, 5494, 5482, 7434, 5481, 5490, 5488, 5492, 5501, 7434,
+ 5499, 5496, 5498, 5508, 7434, 5515, 5509, 5523, 5532, 5527,
+ 7434, 5546, 5545, 5547, 5537, 5554, 5551, 5539, 5555, 5549,
+ 5563, 5538, 5559, 7434, 5558, 5564, 5568, 5587, 5573, 5594,
+ 7434, 5576, 5579, 5583, 5601, 5582, 5603, 5574, 5606, 5589,
+ 7434, 5595, 5610, 5618, 5609, 5625, 7434, 7434, 5626, 5630,
+ 5638, 5620, 5642, 7434, 5644, 5623, 5637, 5651, 5647, 7434,
+ 7434, 5655, 7434, 5645, 7434, 7434, 5654, 5657, 5660, 7434,
+
+ 5661, 7434, 5671, 5676, 5664, 5670, 5674, 7434, 5666, 5682,
+ 5695, 7434, 5687, 5704, 5684, 5690, 7434, 5700, 5689, 5697,
+ 7434, 5709, 5713, 5720, 5721, 5716, 5714, 5719, 5729, 5730,
+ 5738, 5739, 5744, 5737, 5732, 5753, 5757, 5751, 5762, 5767,
+ 5768, 5760, 5766, 5770, 5759, 5764, 5778, 5774, 5783, 5776,
+ 5784, 5794, 5788, 5799, 5815, 5805, 5793, 5803, 7434, 5806,
+ 5795, 5800, 5825, 5822, 5832, 5833, 5846, 5847, 5852, 7434,
+ 7434, 5855, 5830, 5843, 5839, 7434, 5841, 5844, 5845, 5849,
+ 5868, 5864, 5860, 5885, 7434, 5890, 5883, 5893, 5879, 5880,
+ 5894, 5887, 5881, 5882, 5906, 5896, 5903, 5916, 5756, 5913,
+
+ 5917, 5918, 5929, 5919, 5921, 5930, 5936, 5947, 5948, 5951,
+ 7434, 5933, 7434, 5944, 5949, 5954, 7434, 7434, 5962, 5964,
+ 5970, 5957, 5965, 5985, 5984, 7434, 5971, 5989, 5987, 5977,
+ 7434, 5975, 5981, 6003, 7434, 5994, 6005, 5999, 6007, 6014,
+ 6023, 7434, 7434, 7434, 7434, 6024, 6009, 6016, 6022, 6028,
+ 7434, 7434, 7434, 6033, 6013, 6034, 6036, 6040, 6045, 7434,
+ 6042, 6043, 6063, 6058, 6047, 6076, 6070, 6074, 6060, 6064,
+ 6086, 6083, 6091, 6081, 6084, 6093, 6094, 7434, 7434, 6085,
+ 6099, 6122, 6109, 6119, 6104, 6103, 6123, 6118, 6117, 6125,
+ 6130, 6126, 7434, 6134, 7434, 6142, 6143, 6140, 6150, 6157,
+
+ 6159, 6155, 6162, 7434, 7434, 6153, 6161, 6160, 6173, 6175,
+ 6169, 6176, 6192, 6182, 7434, 6189, 7434, 6187, 6193, 6215,
+ 6211, 6205, 6212, 7434, 6214, 6209, 7434, 6221, 6216, 6218,
+ 7434, 6226, 6229, 6235, 7434, 6237, 7434, 6246, 7434, 6231,
+ 7434, 6239, 6254, 6247, 6261, 6260, 6265, 6266, 6268, 6256,
+ 6269, 6252, 6258, 6280, 6276, 6273, 7434, 7434, 6289, 6278,
+ 6282, 6286, 6285, 6313, 6290, 6307, 6310, 7434, 7434, 6309,
+ 6312, 6316, 7434, 6296, 6322, 6327, 6326, 6332, 6335, 6337,
+ 6330, 6341, 6348, 6342, 6362, 6364, 6366, 6369, 6357, 6371,
+ 6354, 6353, 6377, 6375, 6385, 7434, 6399, 6404, 6390, 7434,
+
+ 6409, 6403, 6411, 6413, 6406, 7434, 6396, 6416, 6417, 6419,
+ 6412, 6424, 6434, 6440, 7434, 7434, 7434, 7434, 6425, 6441,
+ 6444, 7434, 7434, 6432, 7434, 6446, 7434, 6439, 7434, 6448,
+ 6461, 6454, 7434, 6459, 6468, 7434, 6465, 6470, 6478, 6473,
+ 6474, 6479, 6488, 7434, 6484, 6497, 6499, 6503, 6489, 6487,
+ 6505, 6495, 6517, 6511, 6518, 7434, 6500, 6524, 6523, 6515,
+ 6520, 6537, 6534, 6532, 6530, 6544, 6551, 6527, 6558, 6546,
+ 7434, 6562, 6567, 7434, 6560, 7434, 6569, 6561, 6579, 7434,
+ 6572, 6566, 6568, 6555, 7434, 6589, 6583, 7434, 6576, 6600,
+ 6602, 6596, 6587, 6593, 6603, 6599, 6609, 6618, 6627, 7434,
+
+ 7434, 7434, 6610, 6611, 6638, 6635, 6637, 6646, 6625, 7434,
+ 6639, 6642, 6632, 6655, 6658, 6653, 7434, 6656, 6641, 7434,
+ 6657, 6661, 6667, 6663, 6674, 6681, 6686, 6689, 6687, 7434,
+ 6691, 7434, 7434, 6678, 7434, 6671, 6694, 7434, 6696, 6698,
+ 6680, 6701, 6709, 6706, 7434, 7434, 6703, 6720, 6718, 6729,
+ 6727, 7434, 6714, 6715, 6738, 6719, 6742, 7434, 6741, 6733,
+ 6730, 6744, 6745, 6724, 6756, 6757, 6761, 7434, 7434, 6760,
+ 7434, 7434, 6755, 6781, 6782, 7434, 7434, 7434, 6785, 7434,
+ 6789, 2173, 6788, 7434, 6794, 6777, 6783, 7434, 6796, 6791,
+ 6799, 6787, 7434, 6793, 6808, 6805, 6827, 6828, 6816, 6829,
+
+ 6830, 6841, 6845, 6821, 6822, 6826, 6854, 6855, 6843, 6850,
+ 7434, 7434, 6851, 7434, 7434, 6852, 6863, 6865, 7434, 6858,
+ 6871, 7434, 6875, 6861, 6868, 6882, 6869, 6891, 7434, 7434,
+ 6879, 6890, 6873, 6900, 6886, 7434, 6902, 6913, 6898, 6909,
+ 6896, 6903, 6906, 7434, 7434, 7434, 7434, 7434, 6916, 7434,
+ 7434, 6911, 6931, 6917, 6933, 7434, 6927, 6940, 6948, 6943,
+ 6941, 6954, 6939, 6938, 6958, 6970, 6944, 6972, 6968, 6975,
+ 6963, 6964, 6992, 6993, 6998, 7001, 6985, 6990, 7002, 7003,
+ 7006, 6982, 7009, 7023, 7012, 7022, 7021, 7434, 7027, 7434,
+ 7025, 7434, 7434, 7041, 7044, 7038, 7028, 7032, 7049, 7048,
+
+ 7050, 7037, 7434, 7058, 7052, 7053, 7434, 7061, 7055, 7067,
+ 7079, 7082, 7072, 7093, 7096, 7084, 7085, 7097, 7105, 7108,
+ 7099, 7109, 7111, 7112, 7088, 7126, 7125, 7133, 7434, 7136,
+ 7123, 7138, 7127, 7128, 7153, 7132, 7143, 7148, 7434, 7158,
+ 7152, 7157, 7163, 7167, 7168, 7165, 7172, 7174, 7434, 7170,
+ 7197, 7183, 7199, 7204, 7201, 7208, 7184, 7207, 7211, 7210,
+ 7217, 7213, 7214, 7226, 7231, 7227, 7434, 7222, 7232, 7434,
+ 7247, 7250, 7237, 7238, 7259, 7434, 7261, 7243, 7248, 7265,
+ 7268, 7264, 7434, 7269, 7276, 7273, 7434, 7285, 7434, 7434,
+ 7292, 7282, 7283, 7281, 7299, 7434, 7434, 7434, 7342, 7349,
+
+ 7356, 7363, 7370, 83, 7377, 7384, 7391, 7398, 7405, 7412,
+ 7419, 7426
} ;
-static yyconst flex_int16_t yy_def[2522] =
+static yyconst flex_int16_t yy_def[2613] =
{ 0,
- 2507, 1, 2508, 2508, 2509, 2509, 2510, 2510, 2511, 2511,
- 2512, 2512, 2507, 2513, 2507, 2507, 2507, 2507, 2514, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2515, 2507, 2507, 2507, 2515, 2516, 2507, 2507,
- 2507, 2516, 2517, 2507, 2507, 2507, 2507, 2517, 2518, 2507,
- 2507, 2507, 2518, 2519, 2507, 2520, 2507, 2519, 2519, 2513,
- 2513, 2507, 2521, 2514, 2521, 2514, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2515, 2515,
- 2516, 2516, 2517, 2517, 2507, 2518, 2518, 2519, 2519, 2520,
- 2520, 2519, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2519, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2519, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507,
- 2513, 2519, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2519, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2507, 2507,
- 2513, 2507, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2519, 2513, 2513, 2513, 2513, 2513, 2507,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2519, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2507, 2513,
- 2513, 2513, 2513, 2507, 2513, 2507, 2513, 2513, 2513, 2507,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2507, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2507,
-
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2507, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2507, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2507, 2513, 2507, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2507, 2513, 2513,
-
- 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2507, 2513, 2507,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2507, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2507, 2507, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2507, 2507, 2513, 2507, 2513, 2507, 2507, 2513, 2513, 2513,
- 2507, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2507, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2507, 2513, 2507,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2507, 2513, 2513, 2513,
-
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2507, 2513,
- 2513, 2513, 2507, 2507, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2507, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2507, 2507, 2507, 2507, 2513, 2513,
- 2513, 2513, 2513, 2507, 2507, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2507,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2507, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2507, 2513, 2513,
- 2513, 2507, 2513, 2507, 2507, 2513, 2507, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2507, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2507, 2513, 2513, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2507, 2507, 2513, 2507, 2513, 2507,
- 2513, 2507, 2513, 2513, 2513, 2507, 2513, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2507, 2513, 2507, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2507, 2513,
-
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513,
- 2507, 2507, 2513, 2507, 2513, 2513, 2507, 2513, 2513, 2513,
- 2513, 2513, 2513, 2507, 2507, 2513, 2513, 2513, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2507, 2513, 2507,
- 2507, 2513, 2513, 2513, 2507, 2507, 2507, 2513, 2507, 2513,
- 2513, 2513, 2507, 2513, 2513, 2513, 2507, 2513, 2513, 2513,
-
- 2513, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507,
- 2507, 2513, 2507, 2507, 2513, 2513, 2513, 2507, 2513, 2513,
- 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2507, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2507, 2507, 2507, 2507, 2507, 2513, 2507, 2507,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2507, 2513,
-
- 2507, 2507, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2507, 2513,
- 2513, 2513, 2513, 2513, 2507, 2513, 2513, 2513, 2513, 2513,
- 2513, 2507, 2513, 2513, 2513, 2507, 2513, 2507, 2507, 2513,
-
- 2513, 2513, 2513, 2513, 2507, 2507, 0, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507
+ 2598, 1, 2599, 2599, 2600, 2600, 2601, 2601, 2602, 2602,
+ 2603, 2603, 2598, 2604, 2598, 2598, 2598, 2598, 2605, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2606, 2598, 2598, 2598, 2606, 2607, 2598, 2598,
+ 2598, 2607, 2608, 2598, 2598, 2598, 2598, 2608, 2609, 2598,
+ 2598, 2598, 2609, 2610, 2598, 2611, 2598, 2610, 2610, 2604,
+ 2604, 2598, 2612, 2605, 2612, 2605, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2606,
+ 2606, 2607, 2607, 2608, 2608, 2598, 2609, 2609, 2610, 2610,
+ 2611, 2611, 2610, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2610, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2610, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2610, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2610, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2598, 2598, 2604,
+ 2598, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2610, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2610, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2598, 2604, 2598, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2598, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2598, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2598,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2598, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2598, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2598, 2604, 2598, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2598, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2598, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2598, 2604, 2598, 2604, 2598, 2598, 2604, 2604, 2604, 2598,
+
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2598, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2598, 2604, 2604, 2604, 2598, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2598, 2598, 2598, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2598, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2598, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2598, 2598, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2598, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2598, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2604, 2598, 2604, 2598, 2604, 2598, 2604,
+ 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2598, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2598,
+
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2598, 2598, 2598, 2604, 2604,
+ 2604, 2598, 2598, 2604, 2598, 2604, 2598, 2604, 2598, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2604, 2604, 2598, 2604, 2598, 2604, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+
+ 2598, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598,
+ 2604, 2598, 2598, 2604, 2598, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2598, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2598, 2604,
+ 2598, 2598, 2604, 2604, 2604, 2598, 2598, 2598, 2604, 2598,
+ 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2598, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2598, 2598, 2604, 2598, 2598, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2598, 2598, 2598, 2598, 2598, 2604, 2598,
+ 2598, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2598,
+ 2604, 2598, 2598, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+
+ 2604, 2604, 2598, 2604, 2604, 2604, 2598, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2598, 2604, 2604, 2604, 2598, 2604, 2598, 2598,
+ 2604, 2604, 2604, 2604, 2604, 2598, 2598, 0, 2598, 2598,
+
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598
} ;
-static yyconst flex_uint16_t yy_nxt[7233] =
+static yyconst flex_uint16_t yy_nxt[7501] =
{ 0,
14, 15, 16, 17, 18, 19, 18, 14, 14, 14,
14, 14, 18, 20, 21, 22, 23, 24, 25, 14,
@@ -1268,798 +1298,827 @@ static yyconst flex_uint16_t yy_nxt[7233] =
20, 21, 22, 23, 24, 25, 14, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 14, 14, 14, 41, 44, 45, 46, 44,
- 45, 46, 49, 50, 49, 50, 51, 101, 51, 54,
+ 45, 46, 49, 50, 49, 50, 51, 102, 51, 54,
55, 56, 57, 70, 18, 54, 55, 56, 57, 71,
- 18, 60, 61, 62, 60, 61, 62, 72, 81, 139,
-
- 139, 73, 103, 47, 101, 141, 47, 149, 141, 52,
- 75, 52, 75, 75, 71, 75, 72, 58, 146, 146,
- 73, 75, 153, 58, 71, 81, 77, 78, 63, 103,
- 79, 63, 15, 16, 17, 65, 66, 67, 15, 16,
- 17, 65, 66, 67, 80, 91, 71, 93, 76, 153,
- 71, 95, 68, 77, 78, 82, 149, 79, 68, 96,
- 147, 94, 83, 138, 155, 92, 84, 117, 71, 85,
- 69, 80, 91, 71, 93, 71, 69, 71, 95, 68,
- 71, 71, 82, 102, 71, 68, 96, 152, 94, 83,
- 138, 155, 92, 84, 117, 1118, 85, 86, 161, 97,
-
- 149, 87, 98, 167, 88, 71, 89, 90, 71, 99,
- 102, 100, 111, 156, 152, 906, 71, 108, 71, 71,
- 71, 109, 71, 71, 86, 161, 97, 104, 87, 98,
- 167, 88, 154, 89, 90, 105, 99, 110, 100, 111,
- 156, 106, 157, 71, 108, 107, 71, 70, 109, 70,
- 70, 349, 70, 71, 104, 71, 139, 139, 70, 154,
- 145, 118, 105, 135, 110, 119, 71, 136, 106, 157,
- 206, 137, 107, 112, 144, 120, 142, 113, 121, 143,
- 71, 143, 143, 114, 143, 216, 115, 71, 118, 71,
- 135, 140, 119, 116, 136, 71, 71, 206, 137, 168,
-
- 112, 127, 120, 128, 113, 121, 75, 71, 75, 75,
- 114, 75, 129, 115, 160, 146, 146, 71, 130, 131,
- 116, 122, 141, 71, 123, 141, 168, 71, 127, 132,
- 128, 124, 71, 133, 134, 125, 126, 149, 147, 129,
- 145, 160, 71, 71, 151, 130, 131, 148, 122, 148,
- 148, 123, 148, 144, 142, 235, 132, 140, 124, 158,
- 133, 134, 125, 126, 70, 162, 70, 70, 75, 70,
- 75, 75, 159, 75, 163, 70, 165, 166, 71, 75,
- 164, 171, 169, 71, 172, 71, 158, 71, 175, 173,
- 174, 71, 162, 176, 71, 71, 177, 71, 184, 159,
-
- 170, 163, 71, 165, 166, 71, 76, 164, 171, 178,
- 239, 172, 179, 71, 71, 175, 173, 174, 180, 71,
- 176, 181, 185, 177, 186, 71, 71, 170, 2507, 194,
- 71, 71, 71, 187, 182, 183, 178, 239, 191, 179,
- 189, 193, 71, 192, 190, 180, 71, 2507, 181, 185,
- 2507, 186, 71, 188, 71, 71, 194, 195, 196, 197,
- 187, 182, 183, 2507, 71, 191, 199, 189, 193, 198,
- 192, 190, 71, 71, 201, 205, 2507, 71, 200, 71,
- 188, 202, 71, 71, 195, 196, 197, 71, 203, 208,
- 71, 207, 204, 199, 210, 209, 198, 71, 71, 211,
-
- 215, 201, 205, 71, 2507, 200, 71, 71, 202, 212,
- 71, 218, 2507, 217, 71, 203, 208, 222, 207, 204,
- 213, 210, 209, 220, 214, 71, 211, 215, 71, 223,
- 221, 219, 71, 71, 224, 71, 212, 71, 218, 225,
- 217, 71, 242, 228, 222, 71, 230, 213, 227, 231,
- 220, 214, 229, 2507, 71, 71, 223, 221, 219, 232,
- 226, 224, 234, 71, 71, 71, 225, 71, 2507, 242,
- 228, 71, 71, 230, 233, 227, 231, 2507, 143, 229,
- 143, 143, 2507, 143, 71, 240, 232, 226, 148, 234,
- 148, 148, 75, 148, 75, 75, 236, 75, 149, 237,
-
- 241, 233, 243, 246, 71, 71, 238, 244, 71, 247,
- 245, 2507, 240, 249, 71, 250, 248, 2507, 71, 259,
- 2507, 251, 2507, 236, 71, 252, 237, 241, 71, 243,
- 151, 2507, 261, 238, 244, 71, 247, 245, 71, 71,
- 249, 262, 253, 248, 264, 71, 259, 71, 2507, 71,
- 260, 263, 252, 2507, 71, 269, 266, 2507, 71, 261,
- 2507, 268, 267, 71, 282, 2507, 71, 71, 262, 253,
- 254, 2507, 265, 273, 71, 255, 71, 260, 263, 71,
- 256, 272, 269, 266, 71, 280, 257, 258, 268, 267,
- 71, 270, 71, 71, 271, 71, 71, 254, 274, 265,
-
- 273, 279, 255, 283, 287, 275, 71, 256, 272, 290,
- 276, 292, 280, 257, 258, 281, 284, 288, 270, 323,
- 71, 271, 277, 71, 278, 274, 71, 285, 279, 71,
- 283, 71, 275, 286, 291, 71, 71, 276, 293, 289,
- 71, 71, 281, 71, 288, 71, 71, 294, 71, 277,
- 295, 278, 296, 299, 285, 297, 71, 298, 71, 302,
- 286, 291, 71, 303, 71, 304, 289, 71, 300, 301,
- 71, 310, 306, 71, 294, 71, 71, 295, 71, 296,
- 299, 71, 297, 71, 298, 308, 302, 71, 307, 313,
- 303, 305, 304, 316, 71, 300, 301, 71, 71, 306,
-
- 309, 311, 312, 71, 314, 71, 317, 315, 71, 318,
- 71, 71, 308, 71, 320, 307, 319, 330, 305, 2507,
- 316, 71, 321, 326, 71, 322, 2507, 309, 311, 312,
- 324, 314, 71, 327, 315, 335, 329, 71, 71, 71,
- 71, 71, 331, 319, 330, 333, 71, 336, 332, 321,
- 328, 71, 322, 325, 334, 71, 71, 149, 71, 339,
- 327, 337, 71, 329, 71, 338, 340, 71, 2507, 331,
- 344, 341, 333, 342, 358, 332, 71, 328, 71, 71,
- 325, 334, 71, 71, 71, 346, 343, 71, 337, 71,
- 347, 71, 338, 340, 345, 350, 71, 344, 341, 71,
-
- 342, 348, 2507, 351, 71, 352, 71, 353, 354, 71,
- 356, 360, 346, 343, 355, 71, 366, 347, 71, 361,
- 71, 345, 350, 359, 357, 2507, 364, 71, 348, 71,
- 351, 71, 352, 71, 353, 354, 71, 356, 71, 362,
- 2507, 355, 71, 71, 71, 365, 361, 367, 71, 368,
- 359, 357, 71, 364, 71, 369, 363, 370, 71, 371,
- 2507, 71, 71, 372, 373, 374, 362, 71, 375, 380,
- 376, 71, 365, 71, 367, 378, 368, 71, 379, 381,
- 377, 2507, 369, 363, 370, 71, 371, 71, 71, 71,
- 372, 373, 374, 71, 382, 375, 71, 376, 387, 71,
-
- 389, 71, 378, 71, 383, 379, 381, 377, 388, 71,
- 395, 392, 384, 385, 391, 386, 71, 2507, 390, 393,
- 394, 382, 71, 2507, 71, 387, 71, 389, 71, 396,
- 71, 383, 400, 397, 2507, 388, 398, 71, 392, 384,
- 385, 391, 386, 71, 71, 390, 393, 394, 401, 399,
- 71, 402, 403, 71, 404, 405, 396, 2507, 407, 400,
- 397, 71, 406, 398, 408, 409, 71, 71, 410, 413,
- 425, 71, 412, 71, 71, 401, 399, 71, 71, 403,
- 71, 404, 405, 411, 71, 407, 414, 415, 424, 406,
- 71, 408, 409, 416, 71, 417, 2507, 418, 419, 412,
-
- 71, 71, 71, 436, 426, 420, 71, 449, 71, 71,
- 411, 71, 450, 414, 415, 424, 71, 451, 421, 71,
- 416, 422, 417, 423, 418, 419, 71, 427, 434, 71,
- 436, 426, 420, 429, 71, 428, 433, 437, 71, 71,
- 435, 71, 1011, 71, 451, 421, 430, 447, 422, 431,
- 423, 432, 71, 438, 427, 434, 439, 71, 467, 71,
- 429, 71, 428, 433, 437, 452, 2507, 435, 448, 71,
- 2507, 149, 71, 430, 447, 458, 431, 454, 432, 453,
- 438, 456, 71, 439, 440, 441, 71, 71, 71, 71,
- 71, 455, 452, 457, 442, 448, 443, 444, 445, 71,
-
- 71, 446, 458, 461, 454, 459, 453, 71, 456, 71,
- 2507, 440, 441, 465, 460, 462, 471, 464, 455, 463,
- 457, 442, 71, 443, 444, 445, 71, 466, 446, 71,
- 461, 468, 469, 474, 2507, 71, 470, 71, 71, 71,
- 465, 460, 462, 472, 464, 71, 463, 71, 71, 71,
- 473, 475, 476, 2507, 466, 71, 478, 477, 468, 469,
- 474, 71, 479, 470, 71, 480, 481, 71, 2507, 486,
- 472, 482, 483, 71, 485, 487, 488, 473, 71, 497,
- 71, 71, 498, 478, 477, 71, 71, 484, 71, 479,
- 2507, 71, 480, 481, 71, 71, 486, 489, 482, 483,
-
- 71, 485, 487, 488, 490, 493, 494, 495, 496, 498,
- 71, 71, 503, 500, 484, 491, 499, 492, 502, 501,
- 508, 531, 71, 71, 489, 71, 71, 505, 71, 507,
- 71, 490, 493, 494, 495, 496, 71, 71, 71, 503,
- 500, 71, 491, 499, 492, 502, 501, 504, 506, 71,
- 509, 510, 71, 71, 505, 71, 507, 71, 511, 514,
- 516, 71, 71, 512, 513, 2507, 517, 515, 71, 2507,
- 520, 2507, 2507, 71, 504, 506, 518, 509, 510, 71,
- 71, 71, 71, 71, 521, 511, 514, 516, 523, 519,
- 512, 513, 71, 517, 515, 71, 71, 520, 71, 522,
-
- 524, 525, 526, 518, 527, 71, 528, 71, 71, 530,
- 71, 521, 529, 71, 532, 523, 519, 71, 71, 71,
- 533, 534, 71, 536, 535, 538, 522, 524, 525, 526,
- 537, 527, 71, 528, 71, 539, 530, 71, 542, 529,
- 2507, 532, 71, 71, 546, 543, 541, 533, 534, 71,
- 71, 535, 538, 545, 2507, 71, 544, 537, 540, 71,
- 71, 550, 71, 547, 548, 542, 71, 71, 549, 71,
- 558, 546, 543, 541, 2507, 71, 71, 71, 561, 71,
- 545, 559, 560, 544, 585, 540, 71, 2507, 550, 71,
- 547, 548, 562, 71, 2507, 549, 551, 558, 563, 564,
-
- 71, 552, 565, 553, 71, 561, 567, 2507, 559, 560,
- 71, 554, 566, 568, 555, 556, 71, 71, 570, 562,
- 71, 557, 71, 551, 569, 563, 564, 571, 552, 71,
- 553, 71, 572, 567, 71, 573, 2507, 71, 554, 566,
- 568, 555, 556, 575, 71, 570, 574, 71, 557, 576,
- 578, 569, 594, 579, 571, 71, 580, 71, 71, 572,
- 577, 71, 573, 581, 71, 71, 583, 582, 584, 588,
- 575, 71, 71, 574, 586, 71, 576, 578, 587, 71,
- 579, 71, 592, 580, 71, 590, 71, 577, 71, 71,
- 581, 149, 593, 583, 582, 584, 588, 589, 595, 591,
-
- 596, 586, 597, 2507, 599, 587, 71, 71, 71, 592,
- 598, 71, 590, 71, 601, 71, 602, 600, 606, 593,
- 611, 605, 609, 607, 589, 71, 591, 596, 71, 71,
- 71, 599, 71, 608, 71, 603, 71, 598, 604, 610,
- 71, 601, 612, 602, 600, 613, 71, 71, 605, 71,
- 71, 614, 71, 615, 616, 617, 2507, 620, 618, 71,
- 608, 71, 603, 71, 619, 604, 71, 621, 623, 71,
- 622, 628, 71, 2507, 2507, 71, 71, 71, 624, 630,
- 615, 616, 617, 71, 620, 618, 625, 626, 71, 627,
- 629, 619, 71, 71, 621, 71, 71, 622, 634, 631,
-
- 71, 71, 635, 71, 632, 624, 630, 71, 633, 71,
- 636, 637, 71, 625, 626, 640, 627, 629, 638, 71,
- 641, 639, 643, 71, 651, 634, 631, 71, 71, 635,
- 648, 632, 642, 71, 71, 633, 646, 636, 637, 644,
- 71, 71, 640, 647, 653, 638, 71, 650, 639, 643,
- 71, 71, 71, 649, 652, 71, 656, 648, 71, 642,
- 654, 645, 71, 646, 655, 71, 644, 71, 657, 71,
- 647, 653, 71, 658, 650, 71, 659, 71, 662, 663,
- 649, 652, 660, 656, 664, 666, 661, 654, 645, 667,
- 665, 71, 71, 671, 668, 657, 71, 71, 71, 71,
-
- 658, 71, 673, 659, 669, 670, 663, 71, 676, 660,
- 71, 674, 666, 661, 71, 672, 71, 665, 71, 71,
- 71, 71, 677, 71, 678, 71, 675, 683, 679, 673,
- 681, 669, 670, 680, 682, 71, 71, 71, 674, 684,
- 71, 2507, 672, 685, 698, 2507, 71, 71, 736, 677,
- 686, 678, 71, 675, 683, 687, 71, 681, 688, 71,
- 71, 682, 690, 689, 71, 691, 684, 71, 71, 71,
- 685, 71, 693, 692, 694, 697, 71, 686, 695, 696,
- 71, 2507, 687, 71, 71, 688, 71, 71, 71, 690,
- 689, 71, 691, 706, 71, 699, 700, 2507, 701, 693,
-
- 692, 694, 697, 71, 71, 695, 696, 71, 702, 703,
- 708, 704, 2507, 705, 2507, 2507, 71, 71, 71, 71,
- 706, 707, 699, 700, 709, 701, 71, 713, 714, 71,
- 710, 712, 715, 2507, 711, 702, 703, 708, 704, 71,
- 705, 71, 71, 716, 717, 71, 71, 71, 707, 719,
- 71, 709, 71, 718, 713, 714, 720, 710, 712, 715,
- 721, 711, 71, 722, 723, 71, 71, 724, 725, 71,
- 716, 717, 728, 71, 71, 726, 719, 730, 727, 71,
- 718, 71, 729, 720, 733, 71, 741, 721, 71, 149,
- 722, 723, 71, 731, 724, 725, 71, 734, 71, 728,
-
- 735, 732, 726, 737, 71, 727, 738, 739, 71, 729,
- 71, 71, 740, 742, 743, 71, 752, 2507, 71, 71,
- 731, 71, 71, 71, 734, 755, 71, 735, 732, 71,
- 737, 745, 71, 738, 739, 744, 761, 71, 71, 740,
- 742, 743, 751, 752, 754, 758, 753, 759, 71, 756,
- 2507, 2507, 755, 2507, 71, 757, 769, 774, 745, 760,
- 71, 71, 744, 746, 71, 71, 71, 747, 71, 751,
- 748, 754, 758, 753, 759, 71, 756, 749, 71, 771,
- 750, 71, 757, 769, 71, 71, 760, 2507, 71, 770,
- 746, 772, 2507, 71, 747, 71, 773, 748, 2507, 2507,
-
- 777, 775, 2507, 776, 749, 778, 771, 750, 762, 763,
- 2507, 764, 71, 2507, 765, 779, 770, 781, 772, 766,
- 71, 71, 782, 773, 780, 767, 768, 777, 775, 71,
- 776, 71, 778, 785, 71, 762, 763, 71, 764, 71,
- 783, 765, 779, 788, 781, 789, 766, 71, 71, 782,
- 784, 780, 767, 768, 786, 71, 71, 787, 71, 792,
- 785, 71, 71, 790, 2507, 71, 791, 783, 71, 794,
- 788, 71, 789, 793, 795, 71, 796, 784, 797, 71,
- 798, 786, 799, 2507, 787, 2507, 792, 800, 71, 806,
- 790, 71, 801, 791, 802, 803, 794, 71, 71, 807,
-
- 793, 71, 804, 796, 71, 805, 71, 810, 71, 799,
- 71, 71, 71, 71, 800, 808, 806, 809, 2507, 801,
- 811, 802, 803, 812, 71, 71, 71, 813, 71, 804,
- 815, 814, 805, 71, 817, 816, 71, 818, 819, 71,
- 821, 71, 808, 71, 809, 71, 71, 811, 71, 71,
- 812, 820, 71, 825, 813, 71, 824, 815, 814, 2507,
- 71, 817, 816, 822, 818, 819, 826, 821, 828, 71,
- 827, 823, 71, 2507, 71, 829, 833, 830, 820, 835,
- 71, 71, 71, 824, 71, 834, 831, 71, 71, 832,
- 822, 71, 71, 826, 71, 828, 71, 827, 823, 836,
-
- 837, 839, 829, 833, 830, 838, 835, 71, 71, 71,
- 840, 842, 834, 831, 841, 843, 832, 844, 71, 849,
- 71, 848, 71, 71, 71, 846, 836, 837, 839, 845,
- 71, 851, 838, 847, 71, 71, 71, 840, 71, 850,
- 71, 841, 843, 856, 844, 852, 71, 853, 848, 854,
- 859, 71, 846, 857, 860, 71, 845, 855, 861, 71,
- 847, 858, 863, 71, 71, 71, 850, 71, 71, 862,
- 856, 865, 852, 867, 853, 868, 854, 869, 71, 864,
- 857, 860, 71, 71, 855, 861, 71, 71, 858, 71,
- 866, 870, 871, 872, 71, 71, 862, 71, 71, 71,
-
- 867, 873, 149, 875, 869, 874, 864, 877, 71, 71,
- 884, 886, 885, 71, 71, 71, 71, 866, 870, 871,
- 872, 888, 876, 71, 887, 2507, 71, 905, 873, 71,
- 875, 2507, 874, 889, 877, 71, 71, 884, 886, 885,
- 890, 892, 891, 2507, 71, 71, 893, 2507, 888, 876,
- 878, 887, 879, 894, 71, 71, 880, 900, 881, 895,
- 889, 2507, 71, 882, 896, 897, 71, 890, 883, 891,
- 71, 899, 901, 71, 71, 898, 71, 878, 71, 879,
- 894, 902, 71, 880, 900, 881, 895, 71, 903, 904,
- 882, 896, 897, 71, 71, 883, 907, 908, 899, 901,
-
- 918, 2507, 898, 909, 2507, 71, 922, 916, 902, 71,
- 917, 2507, 71, 71, 919, 903, 920, 921, 924, 2507,
- 926, 71, 71, 928, 908, 71, 71, 918, 71, 71,
- 909, 910, 71, 922, 916, 923, 911, 917, 912, 71,
- 929, 919, 71, 920, 921, 924, 925, 71, 71, 913,
- 914, 927, 930, 932, 71, 71, 915, 71, 910, 933,
- 71, 931, 923, 911, 71, 912, 935, 929, 938, 936,
- 941, 937, 934, 925, 71, 71, 913, 914, 927, 930,
- 71, 71, 71, 915, 71, 71, 933, 71, 931, 939,
- 943, 945, 71, 935, 940, 946, 936, 941, 937, 934,
-
- 71, 942, 71, 71, 944, 947, 948, 71, 71, 71,
- 2507, 71, 949, 71, 950, 951, 939, 943, 945, 71,
- 71, 940, 946, 71, 952, 953, 954, 71, 942, 956,
- 957, 944, 955, 948, 959, 2507, 965, 71, 960, 949,
- 958, 950, 951, 961, 964, 71, 71, 71, 71, 71,
- 71, 952, 953, 954, 71, 71, 956, 962, 966, 955,
- 963, 959, 71, 965, 967, 71, 968, 958, 71, 970,
- 71, 964, 969, 972, 971, 973, 71, 974, 981, 71,
- 71, 975, 2507, 71, 962, 966, 978, 963, 71, 976,
- 977, 967, 982, 71, 980, 71, 970, 71, 71, 969,
-
- 972, 971, 973, 71, 974, 71, 983, 71, 975, 979,
- 71, 71, 990, 978, 984, 71, 976, 977, 985, 71,
- 71, 980, 986, 71, 71, 988, 987, 991, 992, 989,
- 2507, 71, 71, 983, 71, 993, 979, 994, 995, 996,
- 997, 984, 71, 71, 71, 985, 71, 999, 2507, 986,
- 71, 998, 988, 987, 1001, 992, 989, 71, 71, 71,
- 71, 1000, 993, 71, 994, 1002, 71, 997, 1003, 1004,
- 71, 71, 1005, 2507, 999, 1006, 1007, 71, 998, 1008,
- 71, 1001, 1009, 1010, 71, 1012, 1013, 71, 1000, 1015,
- 1017, 71, 1002, 1021, 71, 71, 1019, 71, 71, 1005,
-
- 71, 71, 1006, 71, 71, 1018, 1008, 1014, 71, 1009,
- 1010, 1016, 1012, 1013, 1020, 71, 1015, 71, 71, 71,
- 71, 1022, 1023, 1019, 1024, 1025, 1026, 2507, 71, 2507,
- 1028, 1029, 1018, 1027, 1014, 2507, 71, 1030, 1016, 1036,
- 2507, 1020, 1032, 71, 71, 1033, 2507, 71, 1022, 1031,
- 71, 71, 1025, 1026, 71, 71, 71, 1028, 1029, 71,
- 1027, 71, 1034, 1035, 1030, 71, 71, 1037, 1038, 1032,
- 1039, 71, 1033, 1045, 71, 1040, 1031, 71, 1053, 1048,
- 71, 1046, 71, 1049, 1047, 2507, 71, 1041, 2507, 1034,
- 1035, 71, 71, 1052, 1037, 1038, 1042, 1039, 1043, 71,
-
- 1045, 1044, 1040, 71, 71, 1053, 1048, 71, 1046, 71,
- 1049, 1047, 1050, 1051, 1041, 71, 1054, 1056, 1055, 1057,
- 1052, 71, 1058, 1042, 1060, 1043, 71, 1063, 1044, 71,
- 1059, 71, 1061, 2507, 2507, 71, 1062, 2507, 71, 1050,
- 1051, 71, 1066, 1054, 71, 1055, 1057, 71, 71, 1058,
- 71, 1060, 71, 1064, 1063, 1065, 1067, 1059, 1068, 1061,
- 1071, 1072, 71, 1062, 1069, 1070, 71, 71, 71, 1066,
- 71, 71, 1073, 71, 71, 1075, 1076, 1074, 1078, 71,
- 1064, 71, 1065, 1067, 71, 1068, 1081, 1071, 1072, 1079,
- 1077, 1069, 1070, 71, 1085, 1082, 71, 71, 1080, 1073,
-
- 1083, 71, 1075, 71, 1074, 1078, 1084, 71, 71, 1086,
- 2507, 1087, 1096, 1081, 71, 2507, 1079, 1077, 1094, 1098,
- 71, 1085, 1095, 71, 1097, 1080, 1108, 71, 2507, 2507,
- 2507, 1109, 71, 1084, 2507, 1106, 1086, 71, 1087, 1088,
- 71, 71, 1089, 1090, 71, 1094, 1098, 1091, 71, 1095,
- 71, 1097, 2507, 1092, 1099, 1100, 1101, 1093, 71, 1102,
- 1103, 71, 1106, 71, 1107, 1111, 1088, 71, 1105, 1089,
- 1090, 1104, 71, 71, 1091, 1110, 2507, 71, 71, 1117,
- 1092, 1099, 1100, 1101, 1093, 71, 1102, 1103, 71, 71,
- 71, 1107, 1111, 1119, 2507, 1105, 1120, 71, 1104, 1121,
-
- 1123, 2507, 1110, 1112, 1122, 71, 1117, 1127, 1113, 71,
- 1114, 71, 1115, 71, 1116, 1126, 1128, 1124, 71, 71,
- 1119, 71, 1125, 1120, 71, 71, 1121, 1123, 71, 1129,
- 1112, 1122, 1130, 1131, 1127, 1113, 1133, 1114, 1132, 1115,
- 1136, 1116, 1126, 1128, 1134, 71, 1137, 1139, 71, 71,
- 1135, 71, 71, 71, 71, 71, 1129, 1138, 1140, 1130,
- 1131, 2507, 71, 1133, 1141, 1132, 1144, 1136, 1142, 71,
- 1143, 1134, 1145, 71, 71, 1146, 1147, 1135, 71, 71,
- 1148, 1149, 1150, 71, 1138, 1140, 71, 71, 71, 1151,
- 71, 1141, 1152, 71, 1154, 1142, 71, 1143, 71, 1145,
-
- 1153, 1155, 71, 1147, 1157, 1156, 2507, 1148, 1149, 71,
- 1159, 1158, 1164, 1160, 71, 1162, 1151, 1165, 71, 1152,
- 1161, 1154, 71, 71, 71, 71, 71, 1153, 1155, 1163,
- 1166, 1157, 1156, 71, 1167, 71, 71, 1159, 1158, 1175,
- 1160, 71, 1162, 71, 71, 1168, 1169, 1161, 1170, 71,
- 1171, 1172, 71, 1173, 71, 1174, 1163, 1166, 71, 71,
- 71, 1176, 1179, 71, 71, 2507, 71, 1182, 1177, 71,
- 1180, 71, 1168, 1169, 1178, 1170, 71, 71, 1172, 1181,
- 1173, 71, 1174, 1183, 1184, 71, 1185, 1186, 71, 1179,
- 1187, 71, 71, 71, 1182, 1177, 71, 1180, 1188, 1189,
-
- 1190, 1178, 1194, 71, 1195, 1196, 1181, 1191, 2507, 71,
- 1183, 1184, 71, 1185, 1186, 71, 1192, 1187, 71, 1202,
- 71, 1193, 71, 71, 1197, 71, 1189, 1190, 1203, 1194,
- 1198, 1195, 1196, 1199, 1191, 1205, 71, 1200, 1204, 1207,
- 1201, 71, 71, 2507, 71, 1206, 1202, 71, 71, 1208,
- 71, 1197, 1210, 2507, 1209, 1203, 1211, 1198, 71, 71,
- 1199, 71, 1205, 71, 1200, 71, 1207, 1201, 1212, 1213,
- 71, 1214, 1206, 1215, 71, 71, 1208, 1217, 1216, 1210,
- 71, 1209, 71, 1211, 1218, 1220, 71, 1219, 2507, 2507,
- 1221, 1225, 71, 71, 1222, 1212, 1213, 1223, 1214, 71,
-
- 1215, 71, 71, 71, 1217, 1216, 71, 1224, 1226, 71,
- 1227, 1218, 1220, 71, 1219, 71, 1228, 1221, 1225, 1230,
- 1229, 1222, 1239, 1232, 1223, 71, 1234, 1231, 71, 1235,
- 1233, 1236, 71, 1237, 1224, 1226, 71, 1227, 71, 71,
- 1238, 1240, 2507, 1228, 71, 71, 1230, 1229, 71, 71,
- 1232, 1241, 1245, 1234, 1231, 1246, 1242, 1233, 1243, 71,
- 1237, 71, 1244, 71, 71, 71, 71, 1238, 1240, 71,
- 1247, 71, 71, 1248, 71, 1250, 1249, 71, 1241, 1245,
- 1256, 71, 1246, 1242, 1260, 1243, 1251, 71, 71, 1244,
- 1252, 1254, 71, 1257, 71, 1253, 1255, 1247, 71, 2507,
-
- 1248, 71, 1250, 1249, 1258, 1263, 1259, 1256, 1261, 71,
- 1262, 1264, 71, 1251, 71, 1272, 71, 1265, 71, 1266,
- 1257, 1267, 71, 71, 1270, 71, 71, 71, 1268, 71,
- 71, 1258, 1263, 1259, 1269, 1261, 71, 1262, 1271, 1273,
- 1275, 71, 1272, 71, 1265, 1274, 1266, 71, 1267, 1276,
- 71, 1270, 1277, 1281, 1278, 1268, 1279, 1282, 1286, 1280,
- 71, 1269, 1284, 71, 1293, 1271, 1273, 71, 71, 71,
- 1283, 71, 1274, 71, 71, 71, 1276, 1285, 71, 1277,
- 1281, 1278, 2507, 1279, 1282, 71, 1280, 1287, 71, 1284,
- 1288, 1290, 1289, 1291, 1292, 1294, 71, 1283, 71, 1295,
-
- 1296, 71, 71, 1297, 1285, 1298, 71, 1299, 71, 71,
- 1300, 1301, 2507, 71, 1287, 71, 1304, 1288, 1290, 1289,
- 1291, 1292, 71, 1302, 1303, 71, 1295, 1296, 1305, 1309,
- 1297, 71, 1298, 1308, 71, 71, 1306, 71, 71, 71,
- 71, 71, 71, 1304, 1307, 1310, 1313, 71, 1311, 1312,
- 1302, 1303, 1314, 1315, 71, 1305, 1309, 1318, 1316, 71,
- 1308, 2507, 71, 1306, 71, 1321, 71, 2507, 71, 1323,
- 1317, 1307, 1310, 1313, 71, 1311, 1312, 71, 1320, 1314,
- 71, 71, 1319, 71, 1318, 1316, 1324, 71, 71, 1328,
- 1322, 71, 1321, 1325, 71, 1326, 1323, 1317, 71, 1327,
-
- 1330, 1329, 71, 1331, 1334, 1320, 1332, 71, 71, 1319,
- 71, 71, 71, 71, 1333, 71, 1328, 1322, 1335, 1337,
- 1325, 1339, 1326, 71, 71, 1336, 1327, 1330, 1329, 1340,
- 1331, 1334, 1338, 1332, 1341, 1347, 71, 1343, 1342, 71,
- 1345, 1333, 71, 71, 1346, 1335, 71, 71, 71, 1350,
- 1377, 71, 1336, 71, 1344, 2507, 1340, 71, 71, 1338,
- 1348, 71, 1347, 1349, 1343, 1342, 71, 1345, 1351, 71,
- 71, 1346, 1353, 71, 1352, 71, 1350, 71, 1357, 71,
- 1358, 1344, 1354, 1363, 1362, 1355, 1359, 1348, 2507, 71,
- 1349, 1361, 1360, 71, 71, 1351, 1364, 1356, 1366, 1353,
-
- 1365, 1352, 71, 1367, 71, 2507, 71, 1358, 71, 1354,
- 71, 1362, 1355, 1359, 71, 71, 2507, 71, 1361, 1360,
- 71, 1369, 71, 1364, 1356, 1366, 71, 1365, 1368, 71,
- 1367, 1370, 1371, 1372, 1373, 1374, 1375, 71, 71, 2507,
- 71, 2507, 1379, 1380, 1376, 1381, 1378, 1382, 1369, 1383,
- 71, 71, 71, 1386, 2507, 1368, 71, 2507, 1370, 2507,
- 71, 1373, 71, 1375, 71, 71, 71, 71, 71, 1379,
- 1380, 1376, 1381, 1378, 1382, 1384, 1383, 1385, 1390, 1387,
- 1388, 1389, 1391, 2507, 71, 71, 71, 71, 1392, 1393,
- 71, 71, 1394, 1397, 71, 71, 71, 2507, 1395, 1396,
-
- 2507, 2507, 1384, 1399, 1385, 1390, 1387, 1388, 1389, 71,
- 71, 71, 71, 1398, 1401, 1392, 1393, 1400, 71, 1394,
- 1397, 71, 71, 1408, 1402, 1395, 1396, 1403, 1404, 71,
- 1399, 1405, 1409, 1407, 71, 71, 1406, 1410, 1411, 71,
- 1398, 1401, 71, 71, 1400, 1412, 71, 1419, 1414, 1420,
- 71, 1402, 2507, 1416, 1403, 1404, 1417, 1413, 1405, 71,
- 1407, 71, 1415, 1406, 1410, 1411, 71, 71, 71, 1418,
- 71, 71, 1412, 1423, 1421, 1414, 71, 1422, 1426, 71,
- 1416, 71, 71, 1417, 1413, 1424, 1425, 71, 1427, 1415,
- 71, 71, 1429, 71, 1428, 1430, 1418, 71, 71, 1431,
-
- 1423, 1421, 1432, 71, 1422, 1426, 71, 1435, 1440, 1433,
- 1436, 1437, 1424, 1425, 1442, 1427, 1443, 71, 71, 1429,
- 71, 1428, 1430, 1434, 71, 71, 1431, 1438, 1445, 1432,
- 1441, 1444, 1439, 1449, 1435, 71, 1433, 1436, 1437, 71,
- 71, 71, 1446, 1448, 1447, 1458, 2507, 1450, 71, 1451,
- 1434, 71, 1463, 71, 1453, 1452, 71, 1441, 1444, 71,
- 71, 71, 71, 71, 1454, 71, 1455, 1457, 2507, 1446,
- 1448, 1447, 71, 71, 1450, 1456, 1451, 71, 1459, 1460,
- 71, 1453, 1452, 1462, 71, 71, 1466, 1461, 71, 71,
- 1464, 1454, 71, 1455, 1457, 71, 1467, 71, 1465, 1468,
-
- 1472, 71, 1456, 71, 2507, 1459, 1460, 71, 1469, 1470,
- 1462, 1471, 1473, 71, 1461, 1475, 71, 1464, 71, 2507,
- 1474, 1476, 71, 1467, 1477, 1465, 1468, 1472, 1479, 71,
- 71, 71, 71, 71, 1478, 1469, 1470, 71, 1471, 1473,
- 1483, 1480, 71, 71, 1481, 2507, 1482, 1474, 1476, 1484,
- 1485, 1477, 71, 71, 71, 1479, 71, 1486, 1487, 71,
- 1489, 1478, 1488, 1491, 71, 1492, 1490, 1493, 1480, 2507,
- 1494, 1481, 71, 1482, 1495, 1497, 1484, 1485, 71, 2507,
- 71, 71, 71, 1500, 1486, 71, 71, 71, 71, 1488,
- 1491, 1498, 71, 1490, 1493, 71, 1496, 1494, 71, 1499,
-
- 71, 1495, 1497, 71, 1501, 71, 1502, 1503, 71, 1507,
- 1500, 1505, 1509, 1504, 1510, 1508, 71, 1512, 1498, 71,
- 1514, 71, 71, 1496, 1506, 71, 1499, 71, 1515, 71,
- 1516, 1501, 1517, 1502, 1503, 71, 1507, 1511, 1505, 71,
- 1504, 1513, 1508, 71, 1512, 71, 71, 1514, 71, 1518,
- 1519, 1506, 1520, 1522, 71, 1515, 71, 71, 71, 71,
- 1521, 1523, 1524, 1526, 1511, 1525, 71, 1528, 1513, 1527,
- 1529, 1533, 71, 1531, 1530, 1538, 1518, 71, 71, 1520,
- 71, 1532, 71, 1539, 71, 1540, 1541, 1521, 1523, 71,
- 71, 1545, 1525, 71, 71, 71, 1527, 1529, 71, 71,
-
- 71, 1530, 1538, 71, 1534, 1535, 1536, 71, 1532, 1542,
- 1539, 1537, 1544, 1541, 1543, 1547, 71, 71, 1545, 71,
- 1546, 1548, 1549, 1550, 1552, 71, 2507, 71, 1551, 1558,
- 71, 1534, 1535, 1536, 71, 1554, 71, 1557, 1537, 1544,
- 71, 71, 1547, 1553, 71, 1555, 1561, 1546, 1559, 1549,
- 1550, 71, 71, 71, 1556, 1551, 71, 1562, 1563, 71,
- 2507, 71, 1554, 71, 1557, 1560, 71, 1566, 1564, 71,
- 1553, 71, 1555, 71, 1569, 1559, 1565, 71, 71, 1567,
- 71, 1556, 1571, 1570, 1562, 1563, 71, 1568, 1573, 71,
- 1572, 1574, 1560, 71, 1566, 1564, 71, 1575, 71, 1576,
-
- 1577, 1569, 2507, 1565, 1578, 1579, 1567, 1580, 2507, 1571,
- 71, 71, 1581, 71, 1568, 71, 1582, 1572, 71, 1584,
- 71, 71, 71, 71, 71, 71, 1576, 1577, 1583, 71,
- 1585, 1578, 1579, 1586, 1580, 1589, 71, 1592, 1591, 1581,
- 1588, 1593, 71, 1582, 1590, 71, 1584, 71, 71, 1587,
- 1594, 1595, 71, 1598, 2507, 1583, 71, 1585, 71, 71,
- 1586, 71, 1589, 1599, 1592, 1591, 1600, 1588, 1593, 71,
- 1596, 1590, 1603, 1604, 71, 1597, 1587, 71, 1595, 71,
- 71, 1601, 1602, 1605, 1608, 1611, 71, 1606, 71, 71,
- 1599, 1609, 1607, 1600, 1612, 1615, 1610, 1596, 1613, 71,
-
- 71, 1614, 1597, 71, 71, 1616, 71, 1617, 1601, 1602,
- 1605, 71, 1620, 1619, 1606, 71, 71, 71, 1618, 1607,
- 71, 1622, 1623, 71, 1621, 1613, 71, 71, 1614, 71,
- 71, 1625, 1616, 71, 1617, 1624, 1627, 71, 1626, 1628,
- 1619, 1629, 1630, 1634, 71, 1618, 1631, 2507, 71, 1623,
- 1632, 1621, 1636, 71, 1633, 71, 1635, 71, 1625, 2507,
- 1640, 71, 1624, 71, 71, 1626, 71, 71, 1629, 1637,
- 1634, 1638, 71, 1631, 71, 71, 71, 1632, 71, 1636,
- 1639, 1633, 71, 1635, 71, 1641, 71, 1640, 1642, 1643,
- 1645, 1644, 1646, 1652, 1648, 71, 1637, 1649, 1638, 71,
-
- 1650, 1653, 1647, 71, 1651, 71, 71, 1639, 1661, 1666,
- 2507, 71, 71, 71, 71, 1642, 1643, 71, 1644, 1646,
- 71, 1648, 1654, 71, 1649, 71, 71, 1650, 1653, 1647,
- 1656, 1651, 1657, 1655, 1658, 71, 1659, 1667, 2507, 71,
- 1660, 71, 1662, 1665, 1663, 1670, 1664, 71, 71, 1654,
- 71, 71, 71, 71, 71, 71, 71, 1656, 71, 1657,
- 1655, 1658, 1668, 1659, 1667, 1669, 1671, 1660, 1673, 1662,
- 1665, 1663, 71, 1664, 1672, 71, 1674, 1676, 1675, 2507,
- 1680, 71, 1677, 71, 1678, 71, 1681, 1682, 71, 1668,
- 71, 1679, 1669, 1671, 71, 1673, 71, 71, 71, 71,
-
- 1683, 1672, 71, 1674, 1676, 1675, 71, 1680, 71, 1677,
- 1684, 1678, 1686, 1681, 1682, 1685, 1687, 71, 1679, 1688,
- 1689, 1691, 1694, 1690, 2507, 71, 71, 1683, 71, 1692,
- 71, 71, 1693, 1695, 1696, 1697, 2507, 1684, 1698, 71,
- 1700, 2507, 1685, 1687, 71, 71, 1688, 1689, 1691, 1694,
- 1690, 71, 1702, 71, 71, 71, 1692, 71, 1699, 1693,
- 1695, 1696, 1697, 71, 1703, 1698, 1704, 71, 1701, 71,
- 1705, 71, 1706, 1707, 71, 1708, 1709, 1713, 1712, 1702,
- 71, 71, 1710, 1711, 1714, 1699, 71, 1715, 71, 71,
- 71, 1703, 71, 1704, 1716, 1701, 71, 1705, 71, 1706,
-
- 1707, 1717, 71, 1709, 1713, 1712, 71, 71, 71, 1710,
- 1711, 71, 1718, 71, 1715, 1719, 1720, 2507, 1721, 2507,
- 1722, 1716, 1723, 2507, 2507, 1727, 1726, 1728, 1717, 2507,
- 2507, 71, 1724, 71, 2507, 1725, 1732, 71, 1729, 1733,
- 1730, 71, 1719, 1720, 71, 1721, 71, 1722, 71, 1723,
- 71, 71, 1727, 1726, 71, 71, 71, 1731, 71, 1724,
- 1734, 71, 1725, 1732, 1735, 1729, 1733, 1730, 1736, 1737,
- 1738, 71, 71, 1739, 71, 1748, 1740, 71, 71, 1741,
- 2507, 71, 1746, 1744, 1731, 1745, 1742, 1734, 71, 71,
- 1747, 1735, 71, 71, 71, 1736, 1737, 1738, 71, 1743,
-
- 1739, 71, 1748, 1740, 71, 1749, 1741, 71, 1751, 1746,
- 1744, 1750, 1745, 1742, 1752, 1754, 1753, 1747, 1756, 1755,
- 1758, 1759, 71, 1757, 1760, 1761, 1743, 2507, 1766, 71,
- 1767, 71, 71, 71, 1768, 71, 1765, 71, 1750, 71,
- 71, 1752, 1754, 1753, 71, 1762, 1755, 1758, 1759, 71,
- 71, 1760, 71, 1769, 71, 71, 71, 1767, 1770, 1763,
- 1771, 1768, 71, 1765, 1772, 2507, 1773, 1774, 1776, 1775,
- 1764, 71, 1762, 2507, 1778, 71, 71, 1777, 1784, 1780,
- 1769, 1779, 71, 71, 2507, 1782, 1763, 1771, 71, 71,
- 71, 71, 71, 1773, 1785, 1776, 1775, 1764, 1781, 71,
-
- 71, 1778, 1783, 71, 1777, 1784, 1780, 71, 1779, 1786,
- 71, 71, 1782, 1788, 1787, 1789, 71, 1791, 1792, 1790,
- 1793, 71, 1794, 1799, 2507, 1781, 71, 71, 71, 1783,
- 71, 1796, 71, 1795, 71, 71, 1786, 71, 71, 71,
- 1788, 1787, 1789, 1797, 1791, 71, 1790, 1793, 1798, 1794,
- 1799, 71, 1801, 1800, 71, 1802, 1805, 1803, 1796, 71,
- 1795, 1807, 1804, 1806, 71, 1808, 1809, 2507, 1812, 71,
- 1797, 2507, 1811, 1810, 2507, 1798, 71, 71, 1815, 1801,
- 1800, 71, 71, 1805, 1803, 71, 71, 71, 1807, 1804,
- 1806, 1816, 71, 71, 71, 1812, 1818, 1817, 1813, 1811,
-
- 1810, 1814, 1819, 71, 1821, 71, 1820, 1822, 1824, 71,
- 1826, 1827, 1823, 71, 1828, 1831, 71, 1825, 1816, 71,
- 71, 71, 1829, 1818, 1817, 1813, 71, 71, 1814, 1819,
- 71, 71, 1830, 1820, 71, 71, 1833, 71, 71, 1823,
- 1832, 1828, 71, 1834, 1825, 1835, 1839, 1836, 71, 1829,
- 1837, 2507, 71, 1840, 71, 1843, 1841, 1844, 1845, 1830,
- 1848, 71, 71, 71, 71, 1838, 71, 1832, 71, 1846,
- 1834, 71, 1835, 71, 1836, 1847, 71, 1837, 1842, 1850,
- 1840, 71, 71, 1841, 1844, 1845, 71, 71, 1851, 1849,
- 1852, 1855, 1838, 1853, 71, 71, 1846, 71, 71, 1854,
-
- 1858, 2507, 1847, 1856, 1857, 1842, 71, 1859, 2507, 71,
- 71, 1860, 2507, 71, 1863, 1851, 1849, 1852, 1855, 71,
- 1853, 1861, 71, 1864, 1865, 71, 1854, 1858, 71, 71,
- 1856, 1857, 1866, 1862, 1859, 71, 71, 1870, 1860, 71,
- 1867, 1863, 1869, 1871, 71, 71, 71, 1868, 1861, 71,
- 1864, 1865, 1874, 1872, 1873, 71, 71, 1875, 1878, 1866,
- 1862, 71, 71, 1876, 1870, 71, 1877, 1867, 1879, 1869,
- 1871, 71, 71, 71, 1868, 1880, 71, 1885, 2507, 1874,
- 1872, 1873, 2507, 1881, 1887, 1878, 71, 1886, 1890, 71,
- 1876, 1882, 2507, 1877, 71, 1879, 1883, 1888, 1884, 71,
-
- 71, 1896, 71, 71, 71, 1889, 1891, 71, 1893, 71,
- 1881, 1887, 71, 1892, 1886, 1890, 71, 1897, 1882, 1894,
- 1900, 71, 1902, 1883, 1888, 1884, 71, 1895, 71, 1898,
- 71, 2507, 1889, 1891, 1901, 1893, 1899, 71, 1903, 2507,
- 1892, 1904, 71, 1908, 71, 1905, 1894, 1907, 1906, 71,
- 1909, 71, 71, 71, 1895, 71, 1898, 1910, 71, 1911,
- 71, 71, 1914, 1899, 1921, 1903, 71, 71, 1904, 71,
- 1908, 1912, 1905, 71, 1907, 1906, 1913, 1909, 1917, 1918,
- 1915, 71, 1920, 71, 1910, 71, 71, 71, 1916, 1914,
- 1919, 71, 1922, 71, 1925, 71, 71, 71, 1912, 1923,
-
- 1924, 1926, 71, 1913, 71, 1917, 1918, 1915, 71, 1920,
- 1927, 71, 1935, 71, 1928, 1916, 71, 1919, 1929, 1922,
- 1930, 1925, 1932, 71, 1931, 1936, 1923, 1924, 1933, 71,
- 1934, 71, 1937, 71, 1939, 1943, 1944, 1927, 1938, 71,
- 71, 1928, 1941, 1945, 71, 1929, 71, 1930, 71, 1932,
- 1942, 1931, 1936, 71, 71, 1933, 71, 1934, 1940, 71,
- 1946, 71, 71, 71, 71, 1938, 1948, 71, 1947, 1941,
- 1949, 71, 71, 1950, 1951, 71, 1952, 1942, 1953, 71,
- 1954, 71, 1955, 1957, 1959, 1940, 71, 1946, 1958, 71,
- 1956, 71, 71, 1948, 1960, 1947, 71, 1949, 1961, 2507,
-
- 1950, 1951, 71, 71, 1964, 1953, 1962, 1963, 1965, 1955,
- 71, 71, 71, 1966, 71, 1958, 71, 1956, 1967, 71,
- 71, 1960, 1968, 71, 1969, 1961, 71, 1970, 2507, 1971,
- 1974, 1964, 1972, 1962, 1963, 71, 71, 1973, 1975, 71,
- 71, 1976, 1978, 1980, 1981, 71, 1977, 1983, 1979, 71,
- 71, 1969, 71, 1982, 1970, 71, 1971, 71, 71, 1972,
- 71, 71, 71, 71, 1973, 71, 71, 1984, 71, 1978,
- 1980, 1981, 1986, 1977, 71, 1979, 1985, 71, 1987, 71,
- 1982, 1988, 1989, 1991, 71, 71, 1990, 1992, 1993, 1997,
- 1999, 1996, 71, 71, 1984, 71, 71, 1995, 1994, 1986,
-
- 1998, 71, 71, 1985, 71, 1987, 2000, 2507, 1988, 1989,
- 1991, 71, 71, 1990, 1992, 1993, 1997, 71, 1996, 2001,
- 2003, 71, 71, 2002, 1995, 1994, 2004, 1998, 2005, 71,
- 2006, 2007, 2014, 71, 2008, 2016, 71, 71, 2010, 71,
- 71, 2009, 71, 2012, 2011, 71, 2001, 2003, 71, 71,
- 2002, 71, 71, 2004, 2013, 2005, 71, 2006, 2007, 71,
- 2015, 2008, 71, 2017, 2018, 2010, 2019, 2020, 2009, 2025,
- 2012, 2011, 71, 71, 2021, 2022, 2026, 2023, 71, 71,
- 71, 2013, 2027, 71, 71, 2507, 71, 2015, 71, 2024,
- 2017, 2018, 2030, 2019, 2020, 2031, 71, 71, 2028, 2029,
-
- 71, 2021, 2022, 71, 2023, 2032, 2033, 71, 2034, 2035,
- 2036, 71, 71, 71, 71, 2037, 2024, 71, 2038, 2030,
- 2039, 2040, 2031, 2507, 2041, 2028, 2029, 2045, 71, 2044,
- 71, 71, 2032, 2033, 71, 2034, 2035, 71, 2042, 71,
- 71, 2048, 2037, 2043, 2049, 71, 71, 2039, 2040, 2046,
- 71, 2041, 2051, 71, 71, 2047, 2044, 2050, 2052, 2053,
- 2054, 71, 2055, 2057, 71, 2042, 2056, 71, 71, 71,
- 2043, 2049, 2058, 71, 71, 71, 2046, 2059, 2061, 2051,
- 2060, 2062, 2047, 71, 2050, 71, 2053, 71, 2063, 71,
- 71, 2064, 2065, 2056, 71, 71, 2507, 2066, 2067, 2058,
-
- 2507, 2507, 71, 2068, 71, 2061, 71, 2060, 2062, 71,
- 71, 2071, 2070, 2069, 71, 2063, 2074, 2075, 2064, 2065,
- 71, 71, 71, 71, 2066, 2067, 2072, 2073, 71, 2076,
- 2068, 71, 2077, 2078, 2079, 2080, 2507, 2081, 2071, 2070,
- 2069, 2084, 2085, 2074, 71, 2083, 2082, 2086, 71, 71,
- 2092, 2087, 71, 2072, 2073, 71, 71, 71, 71, 2077,
- 2078, 71, 2080, 71, 2081, 2088, 71, 71, 71, 71,
- 2089, 2090, 2083, 2082, 2086, 71, 2507, 2091, 2087, 2093,
- 2096, 2094, 71, 2095, 2507, 2099, 2097, 2098, 2507, 2101,
- 2507, 2100, 71, 71, 2507, 2102, 2507, 71, 2090, 71,
-
- 71, 71, 71, 71, 2091, 71, 2093, 2096, 2094, 71,
- 2095, 71, 2099, 2097, 2098, 71, 2101, 71, 2100, 2103,
- 2104, 2105, 2102, 2106, 2507, 2107, 2108, 2109, 71, 2110,
- 2111, 2112, 2113, 2115, 71, 71, 71, 2114, 71, 71,
- 71, 71, 2116, 2121, 71, 71, 2103, 2104, 2105, 2118,
- 2106, 71, 2107, 2108, 2109, 71, 2110, 2111, 71, 2113,
- 2115, 71, 2117, 2120, 2114, 2119, 2122, 2125, 2123, 71,
- 71, 2128, 71, 2507, 2124, 71, 2118, 2126, 2131, 2127,
- 2507, 2130, 2507, 2507, 71, 71, 71, 71, 2129, 2117,
- 2120, 71, 2119, 71, 2125, 2123, 71, 2134, 2128, 2135,
-
- 71, 2124, 71, 2132, 2126, 71, 2127, 71, 2130, 2133,
- 71, 2136, 2138, 2137, 2140, 2129, 71, 2139, 2142, 2141,
- 2143, 2144, 2145, 71, 2134, 2146, 71, 2148, 2147, 71,
- 2132, 71, 2149, 2152, 71, 2151, 2133, 71, 71, 71,
- 2137, 71, 2155, 71, 2139, 71, 2141, 2143, 2144, 2150,
- 2154, 71, 71, 71, 71, 2147, 71, 2156, 2153, 71,
- 71, 2157, 2151, 2158, 2159, 71, 71, 2163, 2160, 71,
- 2167, 2161, 2162, 71, 2164, 2165, 2150, 2154, 2168, 71,
- 71, 71, 71, 71, 2156, 2153, 71, 71, 2157, 71,
- 2158, 2159, 71, 2166, 2163, 2160, 2169, 71, 2161, 2162,
-
- 2170, 2164, 2165, 2171, 2176, 2168, 71, 2172, 71, 2173,
- 2507, 2174, 2177, 2175, 2179, 71, 2178, 71, 2180, 71,
- 2166, 2181, 2182, 2169, 71, 71, 71, 2170, 71, 71,
- 2171, 2176, 71, 71, 2172, 71, 2173, 71, 2174, 2177,
- 2175, 2179, 2183, 2178, 2184, 2180, 2185, 2186, 2181, 71,
- 2187, 2190, 2189, 71, 2188, 2191, 2195, 2192, 2197, 2507,
- 71, 2196, 2199, 2194, 2507, 2193, 71, 71, 2198, 2183,
- 71, 2184, 71, 71, 2186, 71, 71, 71, 2190, 2189,
- 71, 2188, 71, 71, 2192, 2197, 71, 2200, 71, 71,
- 2194, 2201, 2193, 2203, 2202, 2198, 71, 2204, 2507, 2206,
-
- 2205, 2207, 2507, 71, 2211, 71, 71, 2208, 71, 2209,
- 2213, 2216, 2210, 2507, 2200, 2212, 2224, 71, 2201, 71,
- 2203, 2202, 71, 2215, 2204, 71, 2206, 2205, 2207, 71,
- 2214, 71, 2217, 71, 2208, 71, 2209, 2213, 71, 2210,
- 2218, 2219, 2212, 71, 2220, 71, 2221, 2222, 71, 2223,
- 2215, 2226, 71, 71, 71, 2229, 2227, 2214, 71, 2217,
- 2228, 2225, 71, 71, 71, 2230, 2231, 2218, 71, 71,
- 2234, 2220, 71, 2221, 2222, 2232, 2223, 2233, 71, 71,
- 71, 71, 71, 2227, 2236, 2237, 2235, 2228, 2225, 2238,
- 71, 2239, 2230, 2231, 71, 71, 2241, 2234, 71, 2242,
-
- 2240, 2244, 2232, 71, 2233, 2507, 2245, 71, 71, 2243,
- 2246, 2236, 2237, 2235, 2247, 71, 2238, 71, 71, 2251,
- 2249, 2252, 2248, 71, 71, 2254, 71, 2240, 71, 71,
- 2250, 2255, 71, 2245, 71, 2253, 2243, 2246, 71, 2259,
- 71, 71, 2256, 2257, 2261, 71, 2251, 2249, 2252, 2248,
- 71, 2258, 71, 2262, 71, 2263, 2260, 2250, 71, 71,
- 71, 2264, 2253, 71, 2266, 2265, 2259, 2267, 2271, 2256,
- 2257, 71, 71, 2268, 2269, 2270, 71, 71, 2258, 2274,
- 2262, 71, 2263, 2260, 71, 2272, 2507, 2277, 2264, 2278,
- 71, 2273, 2265, 2279, 71, 2271, 71, 71, 2280, 71,
-
- 2268, 71, 2270, 2275, 2276, 2281, 71, 71, 2283, 2285,
- 2507, 71, 2272, 71, 71, 2282, 71, 2284, 2273, 2286,
- 2279, 71, 2287, 2288, 2289, 71, 2290, 2293, 2291, 2300,
- 2275, 2276, 71, 71, 71, 2283, 71, 71, 2292, 71,
- 2295, 2296, 2282, 2294, 2284, 71, 71, 71, 2297, 71,
- 2288, 71, 2298, 2290, 71, 2291, 71, 2301, 2299, 71,
- 2302, 71, 2304, 2307, 71, 2292, 2303, 2295, 2296, 71,
- 2294, 71, 2306, 2305, 71, 71, 71, 2308, 71, 2298,
- 71, 2314, 2309, 2310, 2301, 2299, 2507, 71, 71, 2304,
- 2307, 71, 71, 2303, 71, 2311, 2312, 2313, 71, 2306,
-
- 2305, 71, 71, 71, 2308, 2318, 71, 2317, 2314, 2309,
- 2310, 2315, 2316, 71, 2320, 2321, 2323, 2322, 2319, 2324,
- 2328, 71, 2311, 2312, 2313, 71, 2327, 71, 2325, 2326,
- 2507, 2331, 2318, 2507, 2317, 2330, 2332, 2333, 2315, 2316,
- 71, 71, 71, 71, 2322, 2319, 71, 71, 71, 71,
- 2329, 2336, 2335, 2327, 2334, 2338, 71, 71, 71, 71,
- 71, 71, 2330, 2332, 2333, 2337, 71, 2339, 2340, 71,
- 2342, 2341, 2346, 2343, 2347, 2348, 71, 2329, 2336, 2335,
- 71, 2334, 71, 2350, 2344, 2351, 2353, 71, 71, 2345,
- 2349, 71, 2337, 71, 71, 2340, 71, 2342, 2341, 2354,
-
- 2343, 2347, 2348, 2352, 71, 71, 2355, 71, 2356, 2357,
- 2350, 71, 2351, 71, 2358, 2359, 71, 2349, 2360, 2361,
- 2507, 2363, 2362, 2365, 2507, 2366, 71, 2364, 2507, 2367,
- 2352, 71, 71, 71, 71, 71, 71, 71, 2369, 71,
- 2372, 2358, 71, 2368, 71, 71, 2361, 71, 2363, 2362,
- 71, 2370, 2366, 71, 2364, 2371, 2367, 2376, 2373, 2374,
- 71, 2375, 2377, 2378, 71, 2369, 71, 2381, 2380, 71,
- 2368, 71, 71, 71, 71, 2386, 2379, 2385, 2370, 71,
- 71, 71, 2371, 2382, 2376, 2373, 2374, 71, 2375, 2377,
- 2378, 71, 2384, 2383, 2381, 2380, 71, 71, 2388, 71,
-
- 71, 2387, 2386, 2379, 2385, 2392, 2390, 2389, 71, 2391,
- 2382, 2394, 2507, 71, 71, 2393, 71, 71, 71, 2384,
- 2383, 71, 2395, 71, 71, 2388, 2396, 2397, 2387, 71,
- 2398, 2399, 2392, 2390, 2389, 2400, 2391, 2401, 2394, 71,
- 2402, 2405, 2393, 2403, 2406, 2404, 2410, 2407, 71, 2395,
- 2411, 71, 71, 2396, 71, 2412, 2416, 2398, 71, 2417,
- 2507, 71, 2400, 71, 71, 71, 71, 71, 2405, 71,
- 2403, 2406, 2404, 2408, 2407, 71, 2409, 2411, 71, 2413,
- 2414, 2415, 71, 71, 2423, 71, 2417, 71, 71, 2419,
- 71, 2418, 71, 2420, 2421, 2425, 2422, 71, 71, 2507,
-
- 2408, 2426, 71, 2409, 2424, 2429, 2413, 2414, 2415, 71,
- 71, 2423, 71, 2427, 71, 2434, 2419, 2428, 2418, 2431,
- 2432, 2430, 2425, 2422, 71, 71, 71, 71, 2426, 71,
- 2433, 2424, 2429, 71, 71, 2437, 71, 71, 71, 2435,
- 2427, 2436, 2434, 71, 2428, 2438, 2431, 2432, 2430, 2439,
- 71, 2440, 2441, 2442, 2507, 2443, 2446, 2433, 2507, 2444,
- 2448, 71, 2437, 2447, 2507, 2445, 2435, 2507, 2436, 2451,
- 2449, 71, 71, 71, 2454, 71, 2439, 71, 71, 2441,
- 2442, 71, 2443, 71, 2456, 71, 2444, 71, 71, 71,
- 2447, 2450, 2445, 71, 2452, 2453, 2451, 2449, 71, 71,
-
- 2455, 2458, 71, 71, 2457, 2464, 71, 2459, 71, 2462,
- 2460, 2456, 2463, 2461, 2507, 2465, 2466, 71, 2450, 71,
- 71, 2452, 2453, 2468, 71, 71, 2469, 2455, 71, 2471,
- 71, 2457, 2464, 2467, 2459, 71, 2462, 2460, 71, 2463,
- 2461, 71, 2465, 2466, 2472, 2473, 2470, 71, 2474, 2475,
- 2468, 2476, 71, 2469, 71, 71, 2471, 71, 2477, 2478,
- 2467, 2479, 2480, 2481, 2485, 2483, 2482, 71, 71, 2484,
- 71, 2472, 2473, 2470, 71, 2474, 2475, 71, 71, 2487,
- 71, 2488, 71, 71, 71, 2477, 2478, 71, 71, 2480,
- 2481, 71, 2483, 2482, 2486, 2492, 2484, 2489, 2496, 2490,
-
- 2497, 71, 71, 71, 2491, 71, 2487, 71, 2488, 2493,
- 2494, 2507, 2495, 2498, 2499, 2500, 2505, 71, 71, 2507,
- 71, 2486, 71, 2501, 2489, 71, 2490, 2497, 2506, 2502,
- 71, 2491, 2507, 2507, 2507, 71, 2493, 2494, 71, 2495,
- 71, 71, 2500, 71, 2503, 71, 2504, 2507, 2507, 2507,
- 2501, 71, 71, 2507, 71, 71, 2502, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2503, 2507, 2504, 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, 2507, 74, 74, 74, 74, 139, 139, 2507, 2507,
- 2507, 139, 139, 141, 141, 2507, 2507, 141, 2507, 141,
- 143, 2507, 2507, 2507, 2507, 2507, 143, 146, 146, 2507,
- 2507, 2507, 146, 146, 148, 2507, 2507, 2507, 2507, 2507,
- 148, 150, 150, 2507, 150, 150, 150, 150, 75, 75,
- 2507, 75, 75, 75, 75, 13, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
-
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507
+ 18, 60, 61, 62, 60, 61, 62, 72, 82, 92,
+
+ 150, 73, 104, 47, 102, 150, 47, 140, 140, 52,
+ 75, 52, 75, 75, 71, 75, 72, 58, 148, 93,
+ 73, 75, 71, 58, 71, 82, 92, 103, 63, 104,
+ 94, 63, 15, 16, 17, 65, 66, 67, 15, 16,
+ 17, 65, 66, 67, 95, 112, 93, 118, 76, 71,
+ 142, 71, 68, 142, 103, 83, 71, 94, 68, 146,
+ 71, 145, 84, 147, 147, 96, 85, 140, 140, 86,
+ 69, 95, 112, 97, 118, 154, 69, 143, 155, 68,
+ 105, 71, 83, 359, 159, 68, 77, 78, 106, 84,
+ 79, 71, 96, 85, 107, 80, 86, 139, 108, 71,
+
+ 97, 71, 154, 153, 81, 155, 71, 105, 71, 71,
+ 71, 159, 71, 77, 78, 106, 150, 79, 156, 220,
+ 158, 107, 80, 98, 139, 108, 99, 71, 157, 141,
+ 153, 81, 87, 100, 142, 101, 88, 142, 71, 89,
+ 71, 90, 91, 71, 109, 156, 71, 158, 110, 150,
+ 98, 71, 162, 99, 71, 157, 128, 170, 129, 87,
+ 100, 71, 101, 88, 111, 71, 89, 130, 90, 91,
+ 71, 109, 119, 131, 164, 110, 120, 163, 148, 162,
+ 147, 147, 71, 128, 170, 129, 121, 71, 169, 122,
+ 146, 111, 113, 71, 130, 71, 114, 173, 71, 119,
+
+ 131, 164, 115, 120, 163, 116, 144, 132, 144, 144,
+ 71, 144, 117, 121, 71, 169, 122, 133, 160, 113,
+ 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, 2598, 71, 177, 126, 127, 71, 178, 161, 71,
+ 136, 2598, 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, 2598, 71, 175, 176, 179, 71, 180,
+ 181, 152, 2598, 2598, 2598, 186, 71, 188, 2598, 197,
+ 2598, 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, 2598, 71, 201, 2598, 71,
+ 2598, 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, 2598, 215,
+
+ 71, 2598, 202, 222, 331, 2598, 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,
+ 2598, 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, 2598, 2598, 71, 231,
+ 71, 2598, 240, 2598, 236, 232, 2598, 237, 2598, 2598,
+ 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, 2598, 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, 2598, 71, 71, 71, 2598, 71, 71, 267, 273,
+ 258, 268, 71, 265, 71, 278, 316, 2598, 71, 274,
+ 2598, 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, 2598, 406, 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, 2598, 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,
+
+ 71, 314, 71, 305, 313, 312, 304, 318, 307, 306,
+ 71, 71, 71, 71, 317, 308, 71, 309, 315, 71,
+ 319, 320, 310, 71, 321, 311, 322, 71, 314, 71,
+ 323, 313, 312, 71, 324, 325, 326, 328, 327, 71,
+ 332, 317, 334, 329, 339, 315, 71, 319, 320, 330,
+ 345, 338, 346, 322, 71, 71, 71, 323, 71, 150,
+ 335, 324, 337, 333, 341, 327, 71, 71, 71, 71,
+ 329, 339, 71, 71, 71, 71, 330, 336, 338, 342,
+ 340, 343, 71, 71, 71, 71, 71, 335, 71, 337,
+ 333, 341, 344, 347, 348, 349, 71, 350, 351, 353,
+
+ 2598, 352, 2598, 71, 336, 368, 342, 340, 343, 71,
+ 71, 71, 71, 354, 356, 71, 71, 357, 2598, 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, 2598, 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, 2598, 386, 379, 378, 71, 71, 381, 373, 71,
+ 380, 387, 71, 388, 71, 382, 71, 391, 392, 2598,
+ 71, 71, 398, 383, 397, 384, 389, 385, 71, 386,
+ 2598, 71, 399, 71, 400, 2598, 2598, 71, 387, 393,
+ 388, 71, 71, 407, 391, 392, 402, 394, 395, 398,
+ 396, 397, 401, 403, 71, 2598, 2598, 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, 1047, 71, 421, 408, 422, 420, 409, 412,
+ 71, 415, 416, 418, 71, 424, 71, 423, 425, 426,
+ 431, 427, 419, 2598, 71, 2598, 2598, 428, 429, 437,
+ 430, 421, 71, 71, 420, 2598, 2598, 71, 71, 2598,
+ 432, 71, 424, 71, 423, 436, 426, 431, 427, 438,
+ 71, 439, 71, 433, 428, 429, 434, 430, 435, 440,
+ 2598, 71, 445, 71, 71, 71, 441, 432, 446, 71,
+ 471, 71, 436, 613, 71, 447, 438, 71, 439, 442,
+ 433, 448, 443, 434, 444, 435, 440, 71, 449, 445,
+ 71, 459, 451, 441, 71, 446, 460, 471, 466, 463,
+
+ 71, 464, 447, 71, 450, 71, 442, 150, 448, 443,
+ 71, 444, 71, 475, 71, 449, 461, 71, 459, 451,
+ 71, 462, 2598, 460, 2598, 466, 463, 465, 464, 467,
+ 469, 450, 452, 453, 476, 71, 470, 71, 2598, 472,
+ 475, 71, 454, 468, 455, 456, 457, 71, 71, 458,
+ 481, 71, 71, 479, 465, 473, 467, 71, 477, 452,
+ 453, 476, 71, 470, 474, 71, 472, 478, 483, 454,
+ 468, 455, 456, 457, 480, 71, 458, 482, 485, 71,
+ 479, 487, 71, 71, 71, 477, 71, 71, 486, 484,
+ 71, 474, 71, 491, 478, 483, 488, 489, 490, 2598,
+
+ 71, 480, 71, 492, 482, 2598, 493, 495, 487, 494,
+ 71, 499, 496, 2598, 71, 486, 484, 71, 71, 500,
+ 491, 2598, 71, 488, 2598, 497, 71, 507, 511, 2598,
+ 492, 71, 71, 493, 495, 71, 494, 71, 499, 496,
+ 498, 502, 501, 503, 504, 71, 500, 510, 71, 509,
+ 71, 508, 497, 71, 507, 505, 71, 506, 512, 513,
+ 71, 515, 71, 518, 71, 71, 514, 498, 502, 501,
+ 503, 504, 71, 71, 510, 517, 509, 71, 508, 522,
+ 71, 519, 505, 71, 506, 512, 513, 516, 515, 71,
+ 518, 520, 523, 514, 71, 521, 2598, 527, 524, 526,
+
+ 528, 71, 517, 71, 71, 71, 525, 71, 519, 531,
+ 2598, 71, 71, 532, 516, 71, 530, 71, 520, 523,
+ 529, 71, 521, 533, 527, 524, 526, 528, 71, 71,
+ 535, 71, 71, 525, 536, 534, 531, 539, 537, 71,
+ 532, 71, 540, 530, 71, 71, 544, 529, 538, 71,
+ 533, 541, 546, 71, 547, 71, 71, 535, 545, 548,
+ 71, 536, 534, 550, 539, 537, 71, 71, 542, 540,
+ 543, 71, 71, 544, 549, 538, 71, 71, 541, 551,
+ 553, 547, 552, 555, 71, 545, 554, 558, 556, 2598,
+ 550, 71, 562, 71, 559, 542, 71, 543, 71, 560,
+
+ 71, 549, 561, 563, 71, 564, 551, 71, 71, 552,
+ 555, 557, 71, 554, 558, 71, 71, 71, 565, 562,
+ 71, 559, 566, 567, 2598, 71, 560, 575, 576, 561,
+ 563, 71, 564, 71, 71, 577, 71, 578, 557, 2598,
+ 71, 579, 2598, 2598, 2598, 565, 71, 2598, 2598, 566,
+ 567, 568, 580, 71, 575, 576, 569, 582, 570, 71,
+ 581, 584, 577, 602, 578, 587, 571, 583, 579, 572,
+ 573, 71, 71, 586, 71, 585, 574, 71, 568, 580,
+ 71, 589, 588, 569, 71, 570, 590, 581, 584, 71,
+ 591, 71, 587, 571, 583, 71, 572, 573, 71, 71,
+
+ 586, 595, 585, 574, 592, 71, 593, 71, 589, 588,
+ 594, 596, 597, 590, 71, 71, 71, 591, 598, 599,
+ 71, 601, 604, 71, 600, 2598, 603, 605, 595, 71,
+ 71, 592, 614, 593, 71, 71, 616, 594, 596, 597,
+ 71, 71, 71, 606, 150, 598, 599, 607, 601, 604,
+ 609, 600, 608, 603, 605, 610, 71, 612, 611, 71,
+ 615, 71, 618, 617, 71, 2598, 620, 621, 71, 71,
+ 606, 630, 2598, 71, 607, 71, 71, 609, 71, 608,
+ 619, 2598, 610, 71, 612, 611, 71, 615, 71, 618,
+ 617, 71, 71, 620, 621, 622, 625, 624, 623, 627,
+
+ 628, 626, 629, 71, 631, 632, 71, 619, 71, 633,
+ 634, 635, 636, 71, 2598, 637, 71, 639, 642, 638,
+ 71, 71, 622, 647, 624, 623, 627, 71, 71, 71,
+ 641, 71, 71, 71, 71, 643, 644, 634, 635, 636,
+ 640, 71, 637, 71, 639, 71, 638, 645, 71, 646,
+ 71, 648, 649, 71, 654, 71, 71, 641, 71, 650,
+ 656, 653, 643, 644, 651, 71, 655, 640, 652, 71,
+ 71, 658, 657, 71, 645, 71, 646, 659, 648, 649,
+ 71, 654, 71, 71, 71, 660, 650, 656, 653, 71,
+ 2598, 651, 661, 655, 71, 652, 662, 2598, 658, 657,
+
+ 665, 2598, 663, 667, 659, 670, 666, 668, 671, 669,
+ 71, 675, 71, 2598, 71, 2598, 2598, 71, 677, 661,
+ 71, 71, 71, 662, 664, 71, 672, 665, 71, 663,
+ 667, 71, 670, 666, 668, 71, 669, 673, 676, 674,
+ 679, 680, 71, 71, 71, 677, 678, 681, 71, 682,
+ 71, 664, 684, 672, 71, 683, 685, 693, 2598, 71,
+ 71, 689, 71, 686, 673, 676, 674, 679, 680, 699,
+ 71, 687, 690, 678, 681, 71, 688, 71, 695, 694,
+ 71, 71, 683, 685, 71, 71, 71, 71, 689, 71,
+ 686, 696, 691, 692, 2598, 700, 71, 697, 706, 690,
+
+ 71, 71, 702, 71, 701, 695, 694, 703, 2598, 704,
+ 71, 2598, 698, 71, 705, 708, 71, 2598, 696, 691,
+ 692, 71, 700, 71, 697, 706, 71, 2598, 2598, 707,
+ 2598, 701, 715, 938, 71, 71, 704, 71, 709, 698,
+ 71, 705, 708, 710, 711, 714, 712, 71, 713, 716,
+ 71, 717, 71, 71, 71, 71, 707, 720, 718, 715,
+ 71, 71, 719, 721, 71, 709, 71, 2598, 71, 71,
+ 710, 711, 714, 712, 722, 713, 716, 71, 717, 723,
+ 729, 724, 71, 725, 720, 718, 727, 71, 726, 719,
+ 71, 728, 71, 731, 71, 71, 730, 71, 735, 732,
+
+ 733, 722, 737, 71, 71, 761, 723, 729, 724, 71,
+ 725, 71, 71, 727, 734, 726, 736, 71, 728, 738,
+ 731, 71, 71, 730, 71, 735, 732, 733, 739, 737,
+ 740, 741, 744, 742, 746, 2598, 71, 71, 743, 71,
+ 71, 734, 747, 736, 745, 71, 738, 749, 748, 71,
+ 71, 752, 71, 71, 750, 739, 71, 740, 741, 744,
+ 742, 746, 71, 71, 150, 743, 751, 71, 755, 747,
+ 71, 745, 71, 753, 749, 748, 754, 758, 752, 756,
+ 759, 750, 71, 760, 71, 762, 71, 757, 763, 767,
+ 765, 71, 71, 751, 764, 71, 766, 799, 71, 71,
+
+ 753, 2598, 786, 754, 71, 71, 756, 759, 71, 71,
+ 760, 71, 762, 768, 757, 763, 767, 765, 769, 770,
+ 71, 764, 71, 776, 71, 778, 71, 2598, 71, 777,
+ 2598, 781, 779, 783, 71, 71, 782, 2598, 1157, 71,
+ 768, 2598, 2598, 71, 780, 769, 770, 771, 794, 71,
+ 776, 772, 778, 71, 773, 784, 777, 71, 781, 779,
+ 783, 774, 71, 782, 775, 785, 71, 71, 71, 71,
+ 71, 780, 71, 795, 771, 794, 796, 2598, 772, 71,
+ 804, 773, 784, 2416, 2417, 71, 800, 797, 774, 71,
+ 801, 775, 785, 787, 788, 2598, 789, 802, 798, 790,
+
+ 795, 803, 71, 796, 791, 805, 71, 804, 806, 71,
+ 792, 793, 71, 800, 797, 807, 71, 801, 808, 71,
+ 787, 788, 71, 789, 802, 798, 790, 71, 803, 71,
+ 71, 791, 805, 71, 810, 806, 809, 792, 793, 811,
+ 71, 812, 807, 813, 71, 808, 71, 814, 815, 71,
+ 817, 816, 818, 820, 819, 2598, 824, 71, 825, 71,
+ 71, 810, 71, 809, 71, 826, 811, 71, 812, 823,
+ 813, 834, 827, 71, 814, 815, 71, 817, 816, 818,
+ 71, 819, 821, 828, 829, 830, 831, 822, 71, 71,
+ 71, 71, 826, 71, 71, 832, 823, 833, 71, 827,
+
+ 835, 836, 71, 71, 837, 71, 843, 2598, 71, 2598,
+ 828, 829, 830, 831, 71, 71, 839, 838, 71, 840,
+ 71, 842, 832, 841, 833, 71, 2598, 835, 836, 844,
+ 71, 847, 2598, 843, 71, 851, 71, 71, 71, 71,
+ 845, 850, 848, 839, 838, 71, 840, 846, 842, 71,
+ 841, 71, 849, 71, 71, 854, 844, 71, 847, 71,
+ 71, 855, 851, 852, 856, 2598, 859, 845, 850, 848,
+ 71, 853, 857, 71, 846, 858, 860, 863, 862, 849,
+ 71, 71, 854, 71, 861, 71, 864, 71, 71, 71,
+ 852, 856, 865, 859, 71, 71, 867, 868, 853, 857,
+
+ 866, 71, 858, 860, 863, 862, 872, 869, 71, 71,
+ 871, 861, 71, 864, 71, 71, 870, 876, 873, 865,
+ 879, 874, 71, 867, 868, 71, 881, 866, 71, 71,
+ 882, 71, 875, 71, 869, 877, 878, 871, 883, 71,
+ 880, 889, 71, 870, 876, 873, 71, 71, 874, 71,
+ 886, 890, 71, 71, 887, 892, 884, 882, 71, 875,
+ 71, 888, 877, 878, 885, 883, 893, 880, 895, 71,
+ 891, 71, 71, 71, 897, 71, 898, 886, 890, 71,
+ 896, 887, 892, 884, 901, 894, 900, 71, 888, 71,
+ 899, 885, 71, 903, 902, 71, 71, 891, 71, 71,
+
+ 71, 897, 71, 150, 904, 906, 905, 896, 71, 71,
+ 71, 901, 894, 900, 71, 907, 908, 899, 909, 2598,
+ 903, 902, 918, 71, 71, 2598, 71, 2598, 71, 916,
+ 917, 904, 906, 905, 71, 919, 922, 71, 920, 921,
+ 2598, 2598, 907, 908, 2598, 909, 910, 923, 911, 918,
+ 2598, 71, 912, 71, 913, 71, 916, 917, 71, 914,
+ 71, 71, 919, 922, 915, 920, 921, 924, 928, 926,
+ 71, 927, 925, 910, 923, 911, 932, 933, 929, 912,
+ 71, 913, 71, 71, 931, 936, 914, 935, 930, 71,
+ 939, 915, 937, 940, 71, 928, 926, 934, 927, 71,
+
+ 71, 71, 952, 932, 933, 929, 71, 941, 71, 949,
+ 71, 931, 948, 2598, 935, 930, 71, 71, 951, 71,
+ 940, 953, 71, 2598, 934, 950, 960, 71, 71, 952,
+ 954, 71, 2598, 71, 941, 942, 949, 955, 71, 948,
+ 943, 958, 944, 71, 964, 951, 961, 956, 953, 71,
+ 71, 957, 950, 945, 946, 71, 959, 954, 71, 71,
+ 947, 71, 942, 962, 955, 970, 965, 943, 71, 944,
+ 71, 71, 963, 961, 956, 2598, 71, 966, 957, 71,
+ 945, 946, 967, 959, 968, 71, 71, 947, 71, 971,
+ 962, 973, 969, 965, 974, 975, 977, 71, 972, 963,
+
+ 71, 71, 71, 71, 966, 976, 71, 71, 71, 967,
+ 978, 968, 71, 71, 71, 979, 971, 981, 973, 969,
+ 990, 974, 975, 977, 980, 972, 982, 983, 71, 984,
+ 71, 988, 976, 985, 71, 71, 71, 978, 989, 986,
+ 987, 71, 2598, 991, 981, 993, 2598, 71, 992, 71,
+ 994, 980, 71, 982, 983, 71, 984, 71, 988, 71,
+ 985, 71, 71, 997, 71, 989, 986, 987, 995, 998,
+ 991, 996, 999, 1002, 1000, 992, 1003, 71, 1001, 71,
+ 1005, 2598, 71, 71, 1004, 71, 1006, 71, 2598, 1017,
+ 997, 71, 71, 1008, 71, 995, 998, 1007, 996, 999,
+
+ 1002, 1000, 2598, 71, 1009, 1001, 1010, 1011, 71, 2598,
+ 71, 1004, 71, 1006, 1012, 71, 1015, 71, 1014, 1016,
+ 1008, 71, 1013, 1018, 1007, 2598, 71, 71, 1021, 71,
+ 1019, 1009, 1026, 1010, 1011, 1020, 71, 71, 1022, 71,
+ 71, 1012, 1025, 1015, 71, 1014, 1016, 71, 71, 1013,
+ 71, 1023, 71, 1024, 1027, 1021, 71, 1019, 2598, 71,
+ 71, 1028, 1020, 1029, 71, 1022, 1030, 1031, 1032, 1025,
+ 1034, 1033, 2598, 1039, 1040, 71, 1035, 1038, 1023, 71,
+ 1024, 1043, 1041, 71, 2598, 71, 71, 1037, 1028, 71,
+ 1029, 1036, 71, 1030, 71, 71, 71, 1034, 1033, 71,
+
+ 71, 1042, 1044, 1035, 1038, 71, 71, 71, 71, 1041,
+ 71, 1045, 1046, 1048, 1037, 1049, 1053, 1050, 1036, 1051,
+ 2598, 71, 71, 71, 71, 71, 1052, 71, 1042, 1044,
+ 1057, 1058, 1054, 71, 71, 1055, 1056, 1059, 1045, 1046,
+ 1048, 1060, 1049, 71, 1050, 71, 1051, 71, 71, 71,
+ 1061, 71, 71, 1052, 1062, 2598, 1063, 1057, 1058, 1054,
+ 1064, 2598, 1055, 1056, 71, 1069, 1065, 1066, 1060, 1068,
+ 1071, 1067, 1074, 1070, 2598, 2598, 1114, 71, 71, 1094,
+ 71, 71, 71, 1063, 71, 71, 71, 1064, 71, 1072,
+ 71, 71, 1069, 1065, 1066, 1073, 1068, 1071, 1067, 71,
+
+ 1070, 71, 1075, 71, 1076, 1077, 71, 1078, 71, 1083,
+ 1086, 2598, 2598, 71, 71, 71, 1072, 1084, 1085, 1079,
+ 1090, 2598, 1073, 71, 1087, 1089, 71, 2598, 1080, 1075,
+ 1081, 1076, 1077, 1082, 1078, 71, 1083, 1086, 71, 71,
+ 1088, 71, 71, 71, 1084, 1085, 1079, 1090, 71, 71,
+ 1091, 1087, 1089, 1092, 1093, 1080, 1095, 1081, 71, 1096,
+ 1082, 1098, 71, 1097, 1099, 1101, 71, 1088, 2598, 2598,
+ 2598, 2598, 2598, 71, 1102, 71, 1104, 1091, 71, 1105,
+ 1092, 1093, 71, 1095, 71, 71, 1096, 1100, 1098, 71,
+ 1097, 1099, 1101, 1103, 71, 1109, 71, 1110, 1107, 71,
+
+ 1106, 1102, 1108, 1104, 71, 71, 1105, 1116, 71, 71,
+ 1111, 71, 1112, 1113, 1100, 1115, 71, 71, 1119, 71,
+ 1103, 1118, 1109, 1117, 1110, 1107, 71, 1106, 71, 1108,
+ 71, 71, 1125, 71, 1116, 1124, 1120, 1111, 1122, 1112,
+ 1113, 1121, 1115, 71, 1123, 1119, 71, 1132, 1118, 71,
+ 1117, 1133, 1134, 1147, 2598, 1135, 2598, 71, 71, 1125,
+ 2598, 71, 1124, 2598, 2598, 1122, 1136, 2598, 71, 71,
+ 1138, 1123, 1126, 1137, 1132, 1127, 1128, 1143, 1133, 1139,
+ 1129, 71, 1135, 1140, 71, 71, 1130, 1141, 71, 1142,
+ 1131, 71, 71, 1136, 71, 71, 71, 1138, 1144, 1126,
+
+ 1137, 71, 1127, 1128, 1143, 1145, 1139, 1129, 1148, 71,
+ 1140, 71, 1146, 1130, 1141, 1149, 1142, 1131, 71, 1158,
+ 71, 71, 1150, 2598, 1159, 1144, 1156, 1161, 1163, 1160,
+ 2598, 1179, 1145, 1164, 2598, 71, 71, 71, 1165, 1146,
+ 71, 71, 1149, 71, 1162, 71, 1158, 71, 1166, 1150,
+ 1151, 1159, 71, 1156, 1161, 1152, 1160, 1153, 71, 1154,
+ 71, 1155, 71, 1167, 1169, 1165, 1170, 1168, 71, 2598,
+ 71, 1162, 71, 1171, 71, 1166, 71, 1151, 1176, 1173,
+ 1175, 1178, 1152, 1172, 1153, 71, 1154, 71, 1155, 1174,
+ 1167, 1169, 71, 1170, 1168, 1177, 71, 71, 71, 1180,
+
+ 1171, 71, 71, 71, 1181, 1176, 1173, 1175, 1178, 1182,
+ 1172, 71, 2598, 1183, 1186, 1185, 1174, 1184, 1187, 1188,
+ 1192, 1189, 1177, 71, 1190, 71, 1180, 1191, 1193, 1196,
+ 71, 71, 1195, 71, 71, 71, 1182, 71, 1194, 71,
+ 1183, 71, 1185, 71, 1184, 1187, 71, 71, 1189, 1197,
+ 1198, 1190, 1199, 71, 1191, 1193, 1196, 71, 1200, 1195,
+ 71, 1201, 1203, 1202, 1204, 1194, 1206, 1205, 1207, 71,
+ 1208, 71, 71, 1209, 71, 1210, 1197, 1198, 1217, 1199,
+ 71, 71, 1213, 71, 71, 1200, 1218, 71, 1201, 1203,
+ 1202, 1204, 71, 71, 1205, 1211, 1212, 1208, 71, 1214,
+
+ 71, 1215, 1210, 71, 1219, 71, 71, 1216, 71, 71,
+ 71, 71, 71, 1220, 1221, 1224, 1225, 1223, 71, 2598,
+ 1222, 2598, 1211, 1212, 71, 71, 1214, 71, 1215, 71,
+ 71, 1219, 1227, 1228, 1216, 1231, 1229, 1226, 71, 1230,
+ 71, 1221, 1224, 1225, 1223, 71, 71, 1222, 71, 1232,
+ 1233, 1234, 1239, 1235, 71, 1240, 1238, 71, 71, 1227,
+ 1228, 71, 1231, 1229, 1226, 1236, 1230, 1246, 71, 1241,
+ 1237, 71, 1242, 71, 71, 1243, 71, 1233, 1234, 1239,
+ 1235, 71, 1240, 1238, 71, 1244, 1248, 1247, 1245, 1250,
+ 1249, 1279, 71, 1251, 1246, 2598, 1241, 71, 2598, 1242,
+
+ 71, 71, 1243, 1252, 71, 71, 1254, 71, 1257, 1280,
+ 1253, 1260, 1244, 71, 1247, 1245, 1250, 1249, 71, 71,
+ 1251, 71, 1255, 71, 1259, 1256, 2598, 1258, 71, 1263,
+ 1252, 71, 71, 1254, 71, 1257, 71, 1253, 1260, 1261,
+ 1269, 71, 2598, 2598, 71, 1262, 1265, 1264, 71, 1255,
+ 71, 1259, 1256, 71, 1258, 71, 1263, 1266, 1267, 71,
+ 1268, 1270, 71, 1274, 1271, 1273, 1261, 1269, 71, 71,
+ 71, 1272, 1262, 1265, 1264, 1276, 2598, 1281, 1278, 1283,
+ 71, 71, 1275, 71, 1266, 1267, 71, 1268, 1270, 71,
+ 1274, 1271, 1273, 1277, 71, 1282, 71, 2598, 1272, 71,
+
+ 71, 1284, 1276, 71, 1281, 1278, 71, 1285, 1286, 1275,
+ 1287, 1289, 2598, 1290, 1288, 2598, 2598, 71, 2598, 2598,
+ 1277, 71, 1282, 71, 71, 71, 71, 1292, 1284, 1291,
+ 1293, 71, 1294, 1305, 1285, 1286, 71, 1287, 1289, 71,
+ 1290, 1288, 1295, 1296, 1298, 71, 71, 1301, 1297, 1299,
+ 71, 1300, 71, 1302, 1292, 71, 1291, 1293, 71, 1294,
+ 1303, 71, 1308, 1304, 1307, 71, 1306, 71, 71, 1295,
+ 71, 1309, 71, 1310, 1301, 71, 71, 1311, 1300, 1317,
+ 1302, 71, 1314, 71, 1312, 71, 1313, 1303, 1318, 1308,
+ 1304, 1307, 71, 1306, 71, 71, 1315, 1320, 1316, 1319,
+
+ 1310, 1324, 71, 71, 1311, 71, 1317, 1321, 1322, 1314,
+ 71, 1312, 71, 1313, 71, 1318, 1323, 1329, 1325, 71,
+ 1331, 2598, 2598, 1315, 71, 1316, 1319, 71, 1324, 71,
+ 71, 71, 71, 1326, 1321, 1322, 1330, 1327, 1332, 71,
+ 1333, 2598, 1339, 1323, 1329, 1325, 1334, 1331, 71, 71,
+ 1328, 71, 1335, 1336, 1338, 1337, 1341, 1342, 71, 1340,
+ 1326, 71, 1343, 1330, 1327, 1332, 71, 71, 71, 1339,
+ 1345, 71, 1346, 1334, 71, 1347, 71, 1328, 71, 1335,
+ 1336, 1338, 1337, 1348, 71, 1344, 1340, 1349, 71, 1343,
+ 1350, 71, 71, 1351, 1352, 2598, 1353, 1345, 71, 1346,
+
+ 1354, 71, 1355, 1357, 71, 1356, 71, 71, 1359, 1358,
+ 71, 71, 1344, 1360, 71, 71, 1361, 1350, 71, 1363,
+ 1351, 1352, 71, 1353, 71, 1362, 71, 1354, 1364, 1355,
+ 1357, 71, 1356, 1366, 71, 1359, 1358, 71, 71, 1367,
+ 1360, 1365, 1368, 1361, 71, 1370, 71, 1369, 71, 1371,
+ 1372, 71, 1362, 71, 1373, 1364, 1375, 1376, 71, 71,
+ 1366, 1379, 1374, 71, 71, 1377, 1367, 1383, 1365, 1368,
+ 71, 71, 1370, 1380, 1369, 71, 1371, 71, 71, 1381,
+ 1378, 1373, 71, 1375, 1376, 71, 71, 71, 1379, 1374,
+ 1382, 1384, 1377, 1387, 1383, 71, 1385, 71, 1388, 1386,
+
+ 1380, 1389, 1390, 71, 1392, 2598, 1381, 1378, 71, 1391,
+ 2598, 1393, 1394, 71, 1396, 71, 1397, 1382, 1384, 71,
+ 1387, 2598, 71, 1385, 71, 1401, 1386, 1402, 1389, 1395,
+ 71, 71, 71, 71, 71, 1398, 1391, 1399, 1393, 1394,
+ 71, 1396, 71, 1397, 1403, 1400, 71, 1408, 71, 71,
+ 2598, 1404, 1401, 71, 1402, 1409, 1395, 71, 71, 71,
+ 1405, 2598, 1398, 1406, 1399, 1410, 1411, 1412, 2598, 71,
+ 2598, 1403, 1400, 1413, 1414, 1407, 1417, 71, 1404, 71,
+ 2598, 1415, 1409, 71, 71, 1416, 1419, 1405, 71, 1422,
+ 1406, 1418, 1410, 1411, 1412, 71, 1420, 71, 71, 1423,
+
+ 1413, 1425, 1407, 1417, 71, 71, 71, 71, 1415, 1421,
+ 1424, 71, 1416, 1419, 1428, 1426, 71, 1427, 1418, 71,
+ 1430, 71, 2598, 1420, 1429, 1433, 1436, 1431, 1432, 71,
+ 1434, 71, 71, 71, 71, 71, 1421, 1424, 71, 71,
+ 71, 71, 1426, 71, 1427, 1435, 71, 1430, 1437, 1438,
+ 1440, 1429, 1433, 1436, 1431, 1432, 71, 1434, 1439, 1442,
+ 71, 1441, 1443, 71, 1449, 71, 1445, 71, 1444, 71,
+ 1446, 1447, 1435, 71, 2598, 1448, 1438, 1440, 71, 2598,
+ 71, 1450, 71, 1452, 71, 1439, 71, 1459, 1441, 1443,
+ 71, 1449, 71, 1445, 1451, 1444, 1455, 1446, 1447, 71,
+
+ 1456, 1453, 1448, 71, 1454, 1457, 71, 71, 1450, 1458,
+ 1452, 71, 71, 1460, 71, 1461, 1462, 1463, 1465, 71,
+ 1466, 1451, 1467, 1455, 1464, 71, 1471, 1456, 1453, 71,
+ 71, 1454, 1457, 1472, 1468, 1470, 1458, 1469, 71, 71,
+ 71, 1473, 1461, 71, 1463, 1465, 71, 1466, 71, 1467,
+ 1475, 1464, 71, 71, 1476, 1474, 1478, 1480, 71, 71,
+ 71, 1468, 1470, 1477, 1469, 1481, 71, 71, 1473, 71,
+ 1479, 71, 71, 1484, 71, 1482, 1483, 1475, 2598, 1485,
+ 1489, 1476, 1474, 1478, 1480, 1495, 71, 1498, 1497, 71,
+ 1477, 71, 1481, 1486, 71, 71, 1487, 1479, 1490, 1488,
+
+ 1484, 1491, 1482, 1483, 71, 71, 1485, 1489, 1492, 1494,
+ 71, 1499, 1496, 1493, 71, 71, 1500, 71, 1504, 71,
+ 1486, 71, 71, 1487, 1501, 1490, 1488, 1502, 1491, 1503,
+ 1505, 1506, 2598, 71, 71, 1508, 1494, 1507, 1499, 1496,
+ 71, 1509, 71, 71, 71, 71, 1510, 1511, 71, 71,
+ 71, 1501, 1513, 1512, 1502, 71, 1503, 1505, 1506, 1516,
+ 1515, 71, 1508, 1514, 1507, 71, 71, 71, 1509, 71,
+ 1518, 1517, 1519, 1510, 1511, 2598, 1521, 71, 1523, 1520,
+ 1512, 1530, 1522, 71, 71, 71, 1516, 1515, 71, 71,
+ 1514, 1524, 1525, 1526, 1527, 1529, 1528, 1541, 1517, 1519,
+
+ 71, 71, 71, 71, 1534, 1523, 1520, 71, 71, 1522,
+ 1532, 1545, 71, 71, 71, 71, 1531, 1535, 1524, 1525,
+ 1526, 1527, 1529, 1528, 71, 71, 1533, 1536, 1539, 71,
+ 71, 71, 1540, 1537, 71, 1538, 71, 1532, 71, 71,
+ 1543, 1542, 1544, 1531, 1535, 1547, 1546, 71, 71, 71,
+ 71, 1550, 1548, 1533, 1536, 1539, 71, 1549, 1552, 1540,
+ 1537, 1551, 1538, 71, 1554, 1553, 2598, 1543, 1542, 1544,
+ 71, 71, 71, 1546, 71, 71, 71, 1555, 71, 1548,
+ 1558, 1556, 71, 71, 1549, 1552, 1557, 1559, 1551, 71,
+ 71, 1554, 1553, 1562, 1560, 71, 1565, 1567, 1561, 1563,
+
+ 1568, 2598, 71, 71, 1555, 71, 1566, 1558, 1556, 71,
+ 71, 1570, 1564, 1557, 1559, 71, 1569, 71, 71, 71,
+ 1562, 1560, 71, 1565, 71, 1561, 1563, 1571, 1572, 1582,
+ 1573, 1574, 71, 1566, 71, 1575, 1577, 1576, 1570, 1564,
+ 1578, 1579, 1580, 1569, 71, 1584, 71, 71, 1581, 1583,
+ 1586, 1585, 1589, 71, 1571, 1572, 71, 1573, 71, 1588,
+ 71, 71, 71, 71, 1576, 1590, 1591, 1578, 1579, 71,
+ 1587, 71, 71, 71, 1596, 1581, 1583, 71, 1585, 71,
+ 1598, 71, 71, 71, 1603, 1600, 1588, 1592, 1593, 1594,
+ 1601, 71, 1590, 1597, 1595, 1602, 1599, 1587, 71, 1606,
+
+ 71, 1596, 71, 71, 2598, 1610, 1605, 1607, 71, 71,
+ 1604, 1603, 71, 1609, 1592, 1593, 1594, 71, 71, 71,
+ 1597, 1595, 1602, 1599, 1612, 71, 71, 1615, 1608, 1611,
+ 71, 71, 71, 1605, 1607, 71, 1613, 1604, 1616, 1614,
+ 1609, 1617, 1618, 71, 71, 1619, 1620, 1621, 71, 1624,
+ 71, 1612, 1622, 71, 1615, 1608, 1611, 2598, 71, 71,
+ 1623, 71, 1627, 1613, 1628, 71, 1614, 71, 1617, 1618,
+ 71, 1626, 71, 1620, 1621, 71, 1624, 1625, 71, 1622,
+ 1630, 1629, 71, 1631, 71, 1632, 1633, 1623, 71, 1627,
+ 2598, 1635, 1634, 1640, 1636, 1637, 71, 1638, 1626, 1639,
+
+ 71, 71, 71, 71, 1625, 1641, 71, 1630, 1629, 71,
+ 1642, 1643, 71, 71, 71, 71, 2598, 71, 1635, 1634,
+ 1640, 1636, 1637, 71, 1638, 1646, 1639, 1644, 1645, 2598,
+ 1650, 1648, 1641, 1652, 71, 1655, 71, 1642, 71, 1649,
+ 71, 1647, 71, 71, 1653, 1651, 1654, 71, 71, 1659,
+ 1661, 1656, 1646, 71, 1644, 1645, 71, 1650, 1648, 1664,
+ 1652, 1660, 71, 71, 71, 71, 1649, 71, 1647, 1665,
+ 1657, 1653, 1651, 1654, 71, 1658, 71, 1661, 1656, 1667,
+ 1662, 1666, 1663, 1669, 1668, 1670, 71, 71, 1660, 71,
+ 1671, 71, 1672, 1673, 2598, 71, 71, 1657, 1676, 1674,
+
+ 71, 1675, 1658, 2598, 71, 1677, 1667, 1662, 1666, 1663,
+ 71, 1668, 1678, 1680, 1679, 71, 71, 71, 1681, 1683,
+ 71, 1684, 1682, 2598, 71, 71, 1674, 71, 1675, 71,
+ 71, 1685, 1677, 1687, 1686, 71, 71, 1689, 1688, 1678,
+ 1680, 1679, 71, 1690, 1691, 1692, 71, 1693, 1684, 1682,
+ 71, 71, 71, 1694, 1695, 71, 1696, 1697, 1685, 2598,
+ 1687, 1686, 71, 71, 1689, 1688, 1698, 1699, 1703, 1704,
+ 71, 71, 1692, 2598, 71, 71, 71, 71, 2598, 71,
+ 1694, 1695, 1700, 1696, 1697, 1701, 1702, 1705, 71, 1706,
+ 71, 71, 1708, 1698, 1699, 1703, 71, 71, 1707, 1709,
+
+ 71, 71, 1712, 1710, 1713, 71, 71, 1715, 1711, 1700,
+ 71, 71, 1701, 1702, 1705, 1714, 1706, 71, 1724, 71,
+ 71, 71, 1717, 1716, 2598, 1707, 1709, 71, 1720, 1712,
+ 1710, 1713, 1719, 1718, 1721, 1711, 71, 71, 1722, 71,
+ 1723, 71, 1714, 1729, 1727, 71, 71, 1725, 71, 1717,
+ 1716, 1726, 71, 71, 71, 1720, 71, 1728, 71, 1719,
+ 1718, 1721, 71, 1730, 1732, 1722, 1731, 1723, 1733, 1734,
+ 71, 1727, 1736, 71, 1725, 71, 1737, 1735, 1726, 71,
+ 1738, 1739, 2598, 2598, 1728, 1740, 1741, 71, 71, 71,
+ 1730, 1732, 71, 1731, 1742, 71, 1734, 71, 71, 1736,
+
+ 71, 71, 71, 1737, 1735, 1743, 71, 1738, 1739, 71,
+ 1744, 1747, 1740, 1741, 1745, 1748, 1749, 1750, 71, 1757,
+ 2598, 1742, 71, 1752, 1751, 1759, 71, 1746, 71, 1754,
+ 71, 71, 1743, 1753, 2598, 71, 71, 1744, 1747, 1755,
+ 1756, 1745, 1748, 71, 1750, 71, 1757, 71, 1758, 1761,
+ 1752, 1751, 1759, 1760, 1746, 71, 1754, 1763, 1766, 1762,
+ 1753, 71, 1764, 71, 2598, 71, 1755, 1756, 1765, 1767,
+ 71, 71, 71, 1769, 71, 1758, 1761, 1768, 1771, 1772,
+ 1760, 1770, 71, 71, 71, 1766, 1762, 1777, 71, 1764,
+ 71, 71, 1774, 1773, 1775, 1765, 1767, 1778, 1786, 71,
+
+ 1769, 71, 71, 1776, 1768, 1779, 1772, 71, 1770, 1781,
+ 71, 71, 1782, 1783, 71, 1780, 71, 71, 1784, 1774,
+ 1773, 1775, 71, 71, 1778, 71, 1785, 1793, 1787, 1790,
+ 1776, 1788, 1779, 1789, 71, 1795, 1797, 71, 71, 1782,
+ 1783, 71, 1780, 71, 1794, 1784, 1791, 71, 1796, 1792,
+ 71, 71, 71, 1785, 1793, 1787, 1790, 71, 1788, 71,
+ 1789, 1799, 71, 1797, 71, 1798, 71, 1800, 1801, 1803,
+ 1802, 1794, 1804, 1791, 1805, 1796, 1792, 71, 71, 2598,
+ 71, 71, 71, 71, 1807, 71, 1808, 1806, 1799, 71,
+ 2598, 1809, 1798, 1813, 1800, 1801, 1803, 1802, 1811, 1804,
+
+ 2598, 1805, 71, 1812, 1810, 71, 71, 71, 71, 1815,
+ 1816, 1807, 71, 1808, 1806, 1814, 1817, 71, 1809, 71,
+ 1813, 1818, 1820, 2598, 1819, 1811, 1822, 71, 1821, 1825,
+ 1812, 1810, 71, 1823, 71, 1826, 1815, 71, 1824, 1827,
+ 71, 1828, 1814, 1817, 1830, 71, 1834, 1829, 71, 1820,
+ 71, 1819, 1835, 1822, 71, 1821, 1831, 2598, 1836, 1839,
+ 71, 71, 1837, 71, 71, 71, 1827, 71, 1828, 1838,
+ 1832, 71, 1840, 1834, 1829, 1841, 1842, 71, 71, 71,
+ 1843, 1833, 71, 1831, 71, 1836, 1844, 1846, 1845, 1837,
+ 1847, 71, 71, 2598, 71, 71, 1838, 1832, 71, 1840,
+
+ 1848, 1849, 71, 1842, 1850, 71, 1854, 1851, 1833, 71,
+ 71, 1852, 71, 1844, 1846, 1845, 71, 1847, 1855, 1853,
+ 71, 1857, 71, 1856, 1858, 71, 1861, 1848, 1849, 71,
+ 71, 1850, 1859, 71, 1851, 71, 1860, 2598, 1852, 1862,
+ 71, 71, 1947, 71, 1863, 1855, 1853, 71, 1857, 1867,
+ 1856, 1858, 71, 71, 1865, 71, 1864, 71, 71, 1859,
+ 71, 1866, 1868, 1860, 1869, 1871, 1862, 1870, 1873, 71,
+ 71, 1863, 1872, 1874, 71, 1876, 1867, 71, 1877, 71,
+ 1878, 1865, 71, 1864, 1875, 1879, 71, 1881, 1866, 1868,
+ 1880, 1869, 71, 1884, 1870, 1873, 71, 71, 71, 1872,
+
+ 1874, 71, 1876, 1882, 71, 71, 1883, 71, 1887, 1885,
+ 1886, 1875, 1879, 71, 1881, 71, 1888, 1880, 1890, 1889,
+ 71, 71, 1891, 71, 1893, 1895, 1896, 1897, 1900, 1894,
+ 1882, 71, 71, 1883, 71, 1887, 1885, 1886, 71, 1892,
+ 71, 1899, 1898, 1888, 1902, 71, 1889, 71, 1905, 71,
+ 71, 71, 71, 71, 1897, 71, 1894, 1901, 1903, 1904,
+ 2598, 1906, 1908, 71, 2598, 71, 1892, 71, 1899, 1898,
+ 1909, 71, 71, 1911, 1912, 1905, 1907, 1917, 71, 1910,
+ 71, 71, 1915, 1913, 1901, 1903, 1904, 71, 1906, 71,
+ 71, 71, 1914, 1916, 71, 1921, 71, 1909, 1923, 1918,
+
+ 1911, 71, 1919, 1907, 71, 1920, 1910, 71, 1922, 1915,
+ 1913, 1924, 1925, 71, 71, 71, 71, 71, 71, 1914,
+ 1916, 1926, 71, 1927, 71, 1923, 1918, 1928, 1929, 1919,
+ 1933, 1930, 1920, 2598, 1931, 1922, 2598, 1935, 1924, 1925,
+ 1932, 71, 71, 71, 71, 1934, 1936, 71, 1926, 1937,
+ 1927, 71, 71, 71, 1928, 1929, 71, 1933, 1930, 71,
+ 1939, 1931, 1938, 1940, 1935, 71, 1941, 1932, 71, 2598,
+ 1942, 71, 1934, 1936, 71, 1948, 1937, 1943, 1944, 1946,
+ 71, 1945, 71, 1950, 1949, 1952, 1951, 1939, 71, 1938,
+ 1940, 71, 71, 1941, 2598, 71, 71, 1942, 71, 71,
+
+ 1959, 71, 1948, 2598, 1943, 1944, 1946, 1953, 1945, 1957,
+ 1950, 1949, 71, 1951, 1955, 1954, 1956, 71, 1958, 1960,
+ 71, 71, 1961, 1962, 1963, 1964, 1967, 71, 2598, 71,
+ 1966, 71, 1965, 71, 1953, 71, 1957, 71, 71, 1970,
+ 71, 1955, 1954, 1956, 1974, 1958, 1960, 71, 71, 1961,
+ 1962, 1963, 1964, 1967, 71, 1968, 1969, 1966, 1971, 1965,
+ 1972, 1975, 71, 1976, 1973, 1977, 71, 2598, 1978, 1981,
+ 2598, 71, 1982, 1979, 1983, 2598, 71, 71, 71, 1984,
+ 1985, 1995, 1968, 1969, 71, 71, 71, 1972, 71, 1980,
+ 71, 1973, 1977, 71, 71, 1978, 1981, 71, 71, 1982,
+
+ 1979, 1983, 71, 71, 1986, 1987, 1984, 71, 1989, 1991,
+ 1988, 1990, 71, 71, 1993, 71, 1980, 1992, 71, 1997,
+ 1994, 71, 71, 1998, 1996, 2000, 71, 1999, 71, 2001,
+ 2009, 1986, 1987, 71, 71, 1989, 1991, 1988, 1990, 2002,
+ 71, 1993, 71, 2004, 1992, 71, 1997, 1994, 71, 71,
+ 1998, 1996, 2003, 2005, 1999, 2007, 2001, 71, 2006, 71,
+ 2008, 2010, 71, 2011, 71, 71, 2002, 2013, 2012, 71,
+ 2004, 2015, 2017, 2018, 2016, 2014, 71, 71, 2019, 2003,
+ 2005, 71, 2007, 71, 71, 2006, 71, 2008, 2010, 2020,
+ 71, 2023, 2021, 71, 71, 2012, 71, 2024, 2015, 71,
+
+ 71, 2016, 2014, 71, 2022, 71, 2025, 2026, 2027, 71,
+ 71, 2028, 2031, 71, 2029, 71, 2020, 2030, 2023, 2021,
+ 2032, 71, 2034, 71, 2024, 2035, 71, 2033, 71, 71,
+ 2038, 2022, 2598, 2025, 71, 2027, 71, 2036, 2037, 71,
+ 2039, 2029, 2042, 71, 2030, 2040, 2041, 2032, 71, 2034,
+ 2043, 2044, 71, 71, 2033, 71, 2045, 2038, 71, 71,
+ 71, 2046, 2047, 2106, 2036, 2037, 2048, 2039, 71, 71,
+ 2049, 71, 2040, 2041, 2051, 2050, 71, 71, 71, 2052,
+ 2053, 2058, 2598, 71, 2054, 2055, 2060, 2598, 2046, 2047,
+ 71, 2057, 71, 2048, 2056, 71, 71, 2049, 71, 71,
+
+ 2598, 71, 2050, 71, 2061, 71, 71, 71, 2058, 71,
+ 2059, 2054, 2055, 71, 2062, 71, 2063, 71, 2057, 2064,
+ 2069, 2056, 71, 71, 2065, 2066, 2068, 71, 2067, 2072,
+ 2070, 2061, 71, 71, 71, 2073, 2071, 2059, 71, 71,
+ 2074, 2062, 71, 2063, 71, 71, 2064, 2069, 2075, 2076,
+ 2077, 2065, 2066, 2068, 71, 2067, 2072, 2070, 2078, 2079,
+ 2082, 71, 2073, 2071, 71, 2080, 2083, 2074, 2081, 71,
+ 2084, 71, 71, 2085, 2086, 2075, 2076, 2077, 71, 2087,
+ 71, 2088, 71, 71, 71, 71, 71, 2082, 71, 2089,
+ 2091, 71, 2080, 2083, 71, 2081, 2090, 2084, 2092, 71,
+
+ 2085, 2086, 2093, 71, 2094, 2095, 2087, 71, 2088, 2096,
+ 2097, 2100, 2101, 2098, 2099, 2104, 2089, 2091, 71, 71,
+ 71, 71, 71, 2090, 71, 2092, 71, 2103, 2105, 71,
+ 2598, 2094, 71, 71, 2102, 71, 2096, 2097, 2100, 2101,
+ 2098, 2099, 71, 2107, 2108, 71, 2110, 2113, 2598, 2109,
+ 2114, 2111, 71, 2112, 2103, 71, 71, 71, 71, 2115,
+ 71, 2102, 2116, 2117, 2118, 2119, 2598, 2598, 71, 71,
+ 2107, 2108, 71, 2110, 2113, 71, 2109, 2114, 2111, 2123,
+ 2112, 2120, 2124, 71, 2125, 2121, 71, 71, 71, 2116,
+ 71, 2118, 2119, 71, 2122, 2126, 71, 2127, 2129, 2131,
+
+ 2128, 71, 2132, 71, 71, 2130, 2123, 2133, 2120, 71,
+ 71, 2125, 2121, 2134, 71, 2135, 71, 2137, 2136, 2139,
+ 71, 2122, 2126, 71, 71, 2129, 71, 2128, 71, 2132,
+ 2138, 2140, 2130, 71, 2133, 2141, 2598, 2142, 71, 2148,
+ 2134, 2144, 71, 2143, 71, 2136, 71, 2145, 71, 2146,
+ 2147, 2149, 71, 71, 2598, 71, 2150, 2138, 2140, 2157,
+ 2154, 71, 71, 71, 2142, 2152, 2148, 71, 2144, 2153,
+ 2143, 2151, 71, 71, 2145, 71, 2146, 2147, 2149, 71,
+ 2155, 71, 71, 2150, 71, 2156, 71, 2154, 2158, 2159,
+ 2161, 2160, 2152, 2163, 2162, 2598, 2153, 71, 2151, 71,
+
+ 2164, 2167, 71, 71, 2165, 2168, 2169, 2155, 2166, 71,
+ 2170, 2176, 2156, 71, 2171, 71, 2159, 2161, 2160, 2177,
+ 71, 2162, 71, 71, 71, 71, 2174, 2164, 2167, 2172,
+ 71, 2165, 71, 71, 2173, 2166, 2175, 2170, 71, 2179,
+ 2178, 2171, 71, 71, 2180, 2181, 2177, 2182, 71, 2184,
+ 2183, 2598, 2598, 2174, 2598, 2598, 71, 71, 71, 2185,
+ 2186, 71, 71, 2175, 71, 71, 2179, 2178, 2191, 71,
+ 2187, 2180, 2181, 71, 2182, 2188, 2184, 2183, 2189, 71,
+ 2190, 71, 71, 2192, 2193, 2196, 2185, 2186, 2598, 71,
+ 2198, 2195, 71, 2194, 71, 2191, 71, 2187, 71, 71,
+
+ 71, 71, 2188, 2199, 2200, 2189, 2197, 2190, 71, 2204,
+ 2192, 2193, 71, 2201, 71, 71, 2202, 2198, 2195, 2203,
+ 2194, 71, 2205, 2206, 2598, 2207, 71, 2598, 71, 2208,
+ 2199, 71, 71, 2197, 2210, 2209, 2204, 2211, 2598, 2214,
+ 2201, 2215, 2212, 2202, 71, 2213, 2203, 2216, 71, 2217,
+ 71, 71, 2207, 71, 71, 71, 2208, 71, 2218, 2222,
+ 71, 2210, 2209, 2219, 2211, 71, 2214, 2221, 71, 2212,
+ 71, 2220, 2213, 2223, 71, 2224, 71, 2225, 71, 2226,
+ 2227, 2229, 2230, 2228, 2231, 71, 71, 2232, 2233, 2234,
+ 2219, 71, 2598, 71, 2221, 71, 2235, 71, 2220, 71,
+
+ 71, 2236, 2224, 2240, 71, 71, 2226, 71, 71, 2230,
+ 2228, 2231, 71, 2237, 2238, 71, 2234, 71, 2239, 71,
+ 2241, 71, 2244, 2243, 71, 71, 2245, 2242, 71, 71,
+ 2240, 2247, 2246, 2248, 2598, 71, 2598, 2249, 2598, 2598,
+ 2237, 2238, 2256, 2252, 2598, 2239, 71, 2598, 71, 71,
+ 2243, 71, 71, 2245, 2242, 71, 2250, 2251, 2247, 2246,
+ 2248, 71, 2253, 2255, 2249, 71, 71, 2254, 2258, 71,
+ 2252, 71, 2257, 2259, 71, 2260, 71, 2261, 2598, 2262,
+ 71, 71, 2263, 2250, 2251, 2264, 2266, 71, 2265, 2253,
+ 2255, 2267, 71, 71, 2254, 2258, 71, 2598, 2268, 2257,
+
+ 2259, 71, 2260, 71, 2261, 71, 2262, 2269, 71, 2263,
+ 71, 2271, 2264, 2266, 71, 2265, 71, 2270, 2267, 2272,
+ 2273, 2274, 2275, 2276, 71, 2268, 2279, 2278, 2280, 71,
+ 2277, 2284, 2598, 2281, 2269, 71, 2285, 2288, 71, 2283,
+ 2282, 2598, 71, 71, 2270, 71, 2272, 2273, 71, 2275,
+ 71, 71, 71, 2279, 2278, 71, 71, 2277, 71, 2286,
+ 2281, 2287, 2289, 71, 71, 2294, 2283, 2282, 2290, 2291,
+ 2292, 71, 2293, 71, 2295, 2296, 2297, 2300, 71, 71,
+ 71, 2298, 2301, 71, 2299, 71, 2286, 71, 2287, 2289,
+ 2302, 2307, 2294, 71, 2303, 2290, 2291, 2292, 71, 2293,
+
+ 71, 2295, 2296, 2297, 71, 2306, 2304, 71, 2298, 71,
+ 2305, 2299, 71, 71, 2308, 2310, 2309, 71, 71, 2311,
+ 2312, 2303, 2313, 71, 2315, 2314, 71, 71, 71, 2598,
+ 2317, 2318, 2306, 2304, 71, 2320, 71, 2305, 71, 71,
+ 2321, 2308, 71, 2309, 71, 2322, 2311, 2312, 2316, 2313,
+ 71, 2319, 2314, 2323, 71, 2324, 71, 71, 2318, 71,
+ 2325, 2326, 71, 71, 2327, 2329, 71, 2321, 2328, 71,
+ 2330, 71, 2322, 71, 2332, 2316, 71, 2331, 2319, 2333,
+ 2323, 2335, 2324, 71, 2338, 71, 2341, 2325, 2326, 2336,
+ 71, 2327, 2329, 2334, 71, 2328, 2337, 71, 2339, 71,
+
+ 71, 71, 2342, 2340, 2331, 71, 71, 71, 71, 2343,
+ 2344, 71, 2345, 2341, 2346, 71, 2336, 2347, 71, 2348,
+ 2334, 2352, 71, 2337, 2349, 2339, 71, 2350, 71, 2342,
+ 2340, 2351, 71, 2353, 2355, 71, 2343, 2344, 71, 71,
+ 2354, 71, 71, 2356, 2347, 2357, 2348, 2358, 71, 71,
+ 71, 2349, 2359, 2360, 2350, 2361, 2362, 71, 2351, 2363,
+ 2353, 2355, 2365, 2364, 71, 2368, 71, 2354, 2369, 2371,
+ 2356, 71, 2370, 2372, 71, 2598, 71, 71, 71, 2359,
+ 71, 71, 2361, 2362, 2373, 71, 2363, 2366, 2367, 2374,
+ 2364, 2375, 71, 2376, 71, 71, 71, 71, 2377, 2370,
+
+ 71, 2378, 71, 2380, 2379, 2382, 71, 2383, 2384, 2381,
+ 71, 2373, 2386, 71, 2366, 2367, 2374, 71, 2375, 71,
+ 71, 2388, 2387, 2389, 2385, 71, 71, 2391, 71, 2390,
+ 71, 2379, 2382, 71, 2383, 71, 2381, 71, 2392, 2386,
+ 71, 2393, 71, 2398, 2394, 71, 2395, 2396, 71, 2387,
+ 2389, 2385, 2405, 71, 71, 2397, 2390, 71, 71, 71,
+ 2399, 2400, 2402, 71, 2401, 2392, 71, 2411, 71, 71,
+ 2398, 2394, 71, 2395, 2396, 2404, 2403, 71, 2409, 2405,
+ 71, 71, 2397, 71, 71, 2406, 2407, 2399, 2400, 2402,
+ 2408, 2401, 2410, 2412, 71, 71, 71, 2414, 2413, 71,
+
+ 71, 2415, 2404, 2403, 2418, 2409, 2419, 2420, 2422, 2421,
+ 2423, 2598, 2406, 2407, 2425, 2424, 71, 2408, 2428, 2410,
+ 71, 71, 71, 2426, 71, 2413, 71, 71, 71, 2427,
+ 71, 2418, 71, 71, 2420, 71, 2421, 2423, 71, 2429,
+ 2430, 2425, 2424, 2431, 71, 2428, 2432, 71, 2435, 2439,
+ 2426, 2433, 2437, 2436, 2434, 71, 2427, 2598, 2438, 2440,
+ 71, 71, 2444, 2445, 2446, 71, 71, 71, 71, 71,
+ 2431, 2441, 2442, 2432, 2443, 2447, 2439, 2448, 2433, 2449,
+ 71, 2434, 71, 2450, 71, 2438, 2440, 2451, 2452, 71,
+ 71, 71, 2453, 71, 71, 2454, 2455, 71, 2441, 2442,
+
+ 71, 2443, 71, 2456, 71, 2458, 2449, 71, 71, 2457,
+ 71, 2459, 71, 2460, 71, 2452, 2461, 2462, 71, 2453,
+ 2463, 71, 2454, 2455, 2464, 71, 2465, 2466, 2598, 71,
+ 71, 2469, 2458, 2467, 2468, 71, 2457, 71, 2459, 71,
+ 2460, 71, 71, 2461, 2462, 71, 2470, 2471, 71, 2472,
+ 71, 2464, 71, 2465, 2466, 71, 71, 2477, 2469, 2473,
+ 2467, 2468, 2474, 2475, 2480, 2476, 71, 2479, 2478, 2481,
+ 71, 2598, 71, 2470, 2471, 2488, 2472, 71, 71, 71,
+ 71, 2484, 71, 71, 2477, 2489, 2473, 71, 2482, 2474,
+ 2475, 2480, 2476, 71, 2479, 2478, 2481, 71, 2483, 2485,
+
+ 2486, 2487, 71, 71, 2490, 2598, 2491, 71, 2484, 71,
+ 2492, 71, 2489, 2493, 71, 2482, 2494, 2496, 2598, 2499,
+ 2497, 71, 2495, 2498, 71, 2483, 2485, 2486, 2487, 71,
+ 2501, 71, 71, 2491, 2503, 2598, 2500, 71, 2502, 2511,
+ 71, 71, 71, 2494, 2496, 71, 2499, 2497, 71, 2495,
+ 2498, 71, 2504, 2507, 2505, 2506, 2512, 2508, 2509, 2510,
+ 71, 71, 71, 2500, 71, 2502, 71, 71, 2515, 2518,
+ 2598, 71, 2520, 2598, 2513, 2514, 71, 71, 2517, 2504,
+ 71, 2505, 2506, 71, 2508, 2509, 2510, 71, 71, 71,
+ 2516, 71, 71, 2519, 71, 2515, 2518, 71, 2521, 2520,
+
+ 71, 2513, 2514, 2524, 2522, 2517, 71, 2523, 2598, 2529,
+ 2525, 71, 2532, 2526, 2527, 2531, 2528, 2516, 71, 2536,
+ 2519, 71, 2530, 71, 71, 2521, 2533, 71, 2534, 2535,
+ 2524, 2522, 71, 2537, 2523, 71, 71, 2525, 71, 2532,
+ 2526, 2527, 2538, 2528, 71, 2539, 2536, 71, 71, 2530,
+ 71, 71, 2540, 2533, 2541, 2534, 2535, 2542, 2543, 2544,
+ 2545, 2548, 71, 2546, 71, 71, 71, 71, 2547, 2538,
+ 2549, 71, 71, 2550, 2552, 71, 2551, 71, 2556, 2540,
+ 2598, 2541, 71, 2598, 2542, 2543, 2544, 71, 2548, 2557,
+ 2546, 71, 71, 2555, 2553, 2547, 71, 71, 2554, 2558,
+
+ 2550, 2552, 71, 2551, 71, 2556, 71, 71, 2559, 71,
+ 2560, 71, 2562, 71, 2561, 2566, 2557, 2563, 2564, 2567,
+ 2555, 2553, 71, 71, 2569, 2554, 2558, 2565, 2568, 2570,
+ 2598, 2598, 2571, 2572, 2576, 2559, 71, 2560, 71, 2562,
+ 71, 2561, 2566, 71, 2563, 2564, 71, 71, 2574, 71,
+ 71, 2569, 71, 71, 2565, 2568, 71, 2573, 2575, 2571,
+ 2572, 71, 2598, 2577, 2578, 71, 71, 2579, 2580, 2581,
+ 71, 71, 2582, 2583, 2584, 2574, 71, 71, 2586, 2585,
+ 2587, 2589, 71, 2588, 2573, 2575, 71, 71, 2590, 71,
+ 2577, 2578, 2591, 2596, 2579, 2580, 2581, 2598, 71, 2582,
+
+ 71, 2584, 2592, 71, 71, 2586, 2585, 71, 71, 2593,
+ 2588, 2597, 71, 2594, 2595, 71, 2598, 2598, 2598, 2591,
+ 71, 71, 71, 2598, 71, 2598, 2598, 2598, 2598, 2592,
+ 2598, 71, 2598, 2598, 2598, 2598, 2593, 2598, 71, 2598,
+ 2594, 2595, 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, 2598,
+ 74, 74, 74, 74, 140, 140, 2598, 2598, 2598, 140,
+ 140, 142, 142, 2598, 2598, 142, 2598, 142, 144, 2598,
+
+ 2598, 2598, 2598, 2598, 144, 147, 147, 2598, 2598, 2598,
+ 147, 147, 149, 2598, 2598, 2598, 2598, 2598, 149, 151,
+ 151, 2598, 151, 151, 151, 151, 75, 75, 2598, 75,
+ 75, 75, 75, 13, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598
+
} ;
-static yyconst flex_int16_t yy_chk[7233] =
+static yyconst flex_int16_t yy_chk[7501] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -2069,794 +2128,823 @@ static yyconst flex_int16_t yy_chk[7233] =
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, 2513, 7, 8, 8, 8, 8, 28,
- 8, 9, 9, 9, 10, 10, 10, 15, 21, 47,
-
- 47, 15, 30, 3, 28, 52, 4, 868, 52, 5,
- 19, 6, 19, 19, 30, 19, 72, 7, 63, 63,
- 72, 19, 77, 8, 21, 21, 20, 20, 9, 30,
- 20, 10, 11, 11, 11, 11, 11, 11, 12, 12,
- 12, 12, 12, 12, 20, 24, 77, 25, 19, 77,
- 20, 26, 11, 20, 20, 22, 148, 20, 12, 26,
- 146, 25, 22, 41, 79, 24, 22, 35, 24, 22,
- 11, 20, 24, 25, 25, 41, 12, 26, 26, 11,
- 35, 22, 22, 29, 79, 12, 26, 68, 25, 22,
- 41, 79, 24, 22, 35, 959, 22, 23, 84, 27,
-
- 68, 23, 27, 88, 23, 29, 23, 23, 88, 27,
- 29, 27, 33, 80, 68, 757, 84, 32, 33, 23,
- 80, 32, 27, 959, 23, 84, 27, 31, 23, 27,
- 88, 23, 78, 23, 23, 31, 27, 32, 27, 33,
- 80, 31, 81, 32, 32, 31, 757, 42, 32, 42,
- 42, 251, 42, 31, 31, 78, 140, 140, 42, 78,
- 145, 36, 31, 40, 32, 36, 81, 40, 31, 81,
- 117, 40, 31, 34, 143, 36, 141, 34, 36, 58,
- 251, 58, 58, 34, 58, 124, 34, 36, 36, 40,
- 40, 139, 36, 34, 40, 34, 117, 117, 40, 89,
-
- 34, 38, 36, 38, 34, 36, 66, 89, 66, 66,
- 34, 66, 38, 34, 83, 147, 147, 124, 38, 39,
- 34, 37, 142, 83, 37, 142, 89, 38, 38, 39,
- 38, 37, 70, 39, 39, 37, 37, 64, 59, 38,
- 54, 83, 39, 37, 66, 38, 39, 69, 37, 69,
- 69, 37, 69, 53, 48, 154, 39, 43, 37, 82,
- 39, 39, 37, 37, 71, 85, 71, 71, 74, 71,
- 74, 74, 82, 74, 86, 71, 87, 87, 85, 74,
- 86, 91, 90, 82, 92, 87, 82, 154, 94, 93,
- 93, 92, 85, 95, 91, 86, 96, 94, 100, 82,
-
- 90, 86, 95, 87, 87, 93, 74, 86, 91, 97,
- 157, 92, 98, 14, 90, 94, 93, 93, 99, 96,
- 95, 99, 100, 96, 101, 98, 157, 90, 13, 106,
- 100, 97, 101, 102, 99, 99, 97, 157, 104, 98,
- 103, 105, 99, 104, 103, 99, 104, 0, 99, 100,
- 0, 101, 106, 102, 105, 102, 106, 107, 108, 109,
- 102, 99, 99, 0, 103, 104, 111, 103, 105, 110,
- 104, 103, 108, 111, 113, 116, 0, 107, 112, 109,
- 102, 114, 116, 110, 107, 108, 109, 112, 115, 119,
- 114, 118, 115, 111, 120, 119, 110, 113, 118, 121,
-
- 123, 113, 116, 119, 0, 112, 120, 121, 114, 122,
- 115, 126, 0, 125, 123, 115, 119, 129, 118, 115,
- 122, 120, 119, 127, 122, 129, 121, 123, 125, 130,
- 128, 126, 127, 122, 131, 130, 122, 126, 126, 132,
- 125, 128, 160, 134, 129, 131, 136, 122, 133, 137,
- 127, 122, 135, 0, 160, 136, 130, 128, 126, 138,
- 132, 131, 153, 133, 132, 134, 132, 135, 0, 160,
- 134, 137, 138, 136, 152, 133, 137, 0, 144, 135,
- 144, 144, 0, 144, 153, 158, 138, 132, 149, 153,
- 149, 149, 150, 149, 150, 150, 155, 150, 152, 156,
-
- 159, 152, 161, 164, 158, 155, 156, 162, 159, 164,
- 163, 0, 158, 166, 162, 167, 165, 0, 156, 170,
- 0, 168, 0, 155, 161, 168, 156, 159, 163, 161,
- 150, 0, 172, 156, 162, 164, 164, 163, 165, 166,
- 166, 173, 168, 165, 175, 170, 170, 167, 0, 168,
- 171, 174, 168, 0, 172, 179, 176, 0, 171, 172,
- 0, 178, 177, 173, 188, 0, 174, 179, 173, 168,
- 169, 0, 175, 182, 178, 169, 175, 171, 174, 176,
- 169, 181, 179, 176, 177, 186, 169, 169, 178, 177,
- 181, 180, 186, 169, 180, 182, 188, 169, 183, 175,
-
- 182, 185, 169, 189, 192, 184, 180, 169, 181, 195,
- 184, 197, 186, 169, 169, 187, 190, 193, 180, 227,
- 183, 180, 184, 185, 184, 183, 187, 190, 185, 189,
- 189, 184, 184, 191, 196, 193, 192, 184, 198, 194,
- 191, 195, 187, 197, 193, 194, 227, 199, 190, 184,
- 200, 184, 201, 204, 190, 202, 196, 203, 204, 207,
- 191, 196, 202, 208, 200, 209, 194, 199, 205, 206,
- 198, 215, 211, 201, 199, 208, 209, 200, 203, 201,
- 204, 207, 202, 206, 203, 213, 207, 205, 212, 217,
- 208, 210, 209, 220, 211, 205, 206, 212, 210, 211,
-
- 214, 216, 216, 215, 218, 214, 221, 219, 213, 222,
- 216, 218, 213, 220, 224, 212, 223, 232, 210, 0,
- 220, 217, 225, 229, 223, 226, 0, 214, 216, 216,
- 228, 218, 219, 230, 219, 237, 231, 225, 221, 232,
- 231, 222, 233, 223, 232, 235, 224, 238, 234, 225,
- 230, 226, 226, 228, 236, 229, 234, 233, 230, 241,
- 230, 239, 228, 231, 235, 240, 242, 237, 0, 233,
- 246, 243, 235, 244, 260, 234, 236, 230, 242, 238,
- 228, 236, 244, 239, 243, 248, 245, 240, 239, 246,
- 249, 241, 240, 242, 247, 252, 247, 246, 243, 245,
-
- 244, 250, 0, 253, 252, 254, 260, 255, 256, 248,
- 258, 262, 248, 245, 257, 249, 267, 249, 255, 263,
- 256, 247, 252, 261, 259, 0, 265, 250, 250, 253,
- 253, 254, 254, 258, 255, 256, 261, 258, 257, 264,
- 0, 257, 259, 262, 263, 266, 263, 268, 267, 269,
- 261, 259, 265, 265, 268, 270, 264, 271, 269, 272,
- 0, 270, 264, 273, 274, 275, 264, 266, 276, 281,
- 277, 271, 266, 274, 268, 279, 269, 276, 280, 282,
- 278, 0, 270, 264, 271, 272, 272, 273, 275, 278,
- 273, 274, 275, 280, 283, 276, 277, 277, 285, 279,
-
- 287, 281, 279, 282, 284, 280, 282, 278, 286, 283,
- 291, 289, 284, 284, 288, 284, 285, 0, 287, 290,
- 290, 283, 284, 0, 287, 285, 289, 287, 288, 292,
- 286, 284, 295, 293, 0, 286, 293, 291, 289, 284,
- 284, 288, 284, 293, 290, 287, 290, 290, 296, 294,
- 295, 297, 298, 292, 299, 300, 292, 0, 302, 295,
- 293, 294, 301, 293, 303, 304, 296, 300, 305, 308,
- 315, 303, 307, 302, 298, 296, 294, 304, 297, 298,
- 299, 299, 300, 306, 301, 302, 309, 310, 314, 301,
- 306, 303, 304, 310, 307, 311, 0, 311, 312, 307,
-
- 305, 308, 315, 322, 316, 313, 314, 329, 309, 310,
- 306, 312, 329, 309, 310, 314, 322, 330, 313, 311,
- 310, 313, 311, 313, 311, 312, 316, 317, 320, 313,
- 322, 316, 313, 318, 320, 317, 319, 324, 330, 329,
- 321, 317, 860, 319, 330, 313, 318, 327, 313, 318,
- 313, 318, 321, 324, 317, 320, 325, 318, 345, 327,
- 318, 324, 317, 319, 324, 331, 0, 321, 328, 325,
- 0, 331, 860, 318, 327, 337, 318, 333, 318, 332,
- 324, 335, 335, 325, 326, 326, 328, 332, 337, 333,
- 345, 334, 331, 336, 326, 328, 326, 326, 326, 334,
-
- 336, 326, 337, 339, 333, 338, 332, 339, 335, 326,
- 0, 326, 326, 343, 338, 340, 349, 342, 334, 341,
- 336, 326, 340, 326, 326, 326, 341, 344, 326, 342,
- 339, 346, 347, 352, 0, 343, 348, 338, 346, 344,
- 343, 338, 340, 350, 342, 350, 341, 347, 349, 348,
- 351, 353, 353, 0, 344, 352, 355, 354, 346, 347,
- 352, 351, 356, 348, 354, 357, 358, 355, 0, 362,
- 350, 359, 360, 356, 361, 363, 364, 351, 357, 371,
- 353, 362, 372, 355, 354, 364, 363, 360, 372, 356,
- 0, 358, 357, 358, 359, 360, 362, 365, 359, 360,
-
- 361, 361, 363, 364, 366, 367, 368, 369, 370, 372,
- 365, 371, 377, 374, 360, 366, 373, 366, 376, 375,
- 382, 406, 366, 367, 365, 376, 370, 379, 368, 381,
- 369, 366, 367, 368, 369, 370, 374, 373, 377, 377,
- 374, 375, 366, 373, 366, 376, 375, 378, 380, 379,
- 383, 384, 382, 406, 379, 381, 381, 384, 385, 388,
- 390, 378, 380, 386, 387, 0, 391, 389, 388, 0,
- 394, 0, 0, 383, 378, 380, 392, 383, 384, 387,
- 385, 386, 389, 390, 396, 385, 388, 390, 398, 393,
- 386, 387, 391, 391, 389, 393, 394, 394, 392, 397,
-
- 399, 400, 401, 392, 403, 397, 403, 398, 400, 405,
- 396, 396, 404, 403, 407, 398, 393, 401, 399, 404,
- 408, 409, 405, 411, 410, 413, 397, 399, 400, 401,
- 412, 403, 407, 403, 409, 414, 405, 412, 416, 404,
- 0, 407, 408, 410, 420, 417, 415, 408, 409, 413,
- 417, 410, 413, 419, 0, 411, 418, 412, 414, 415,
- 416, 424, 418, 421, 422, 416, 420, 414, 423, 424,
- 426, 420, 417, 415, 0, 421, 419, 426, 429, 423,
- 419, 427, 428, 418, 453, 414, 422, 0, 424, 427,
- 421, 422, 430, 428, 0, 423, 425, 426, 431, 432,
-
- 429, 425, 433, 425, 430, 429, 434, 0, 427, 428,
- 432, 425, 433, 435, 425, 425, 453, 434, 437, 430,
- 431, 425, 425, 425, 436, 431, 432, 438, 425, 438,
- 425, 436, 439, 434, 433, 440, 0, 435, 425, 433,
- 435, 425, 425, 442, 437, 437, 441, 440, 425, 443,
- 445, 436, 462, 446, 438, 442, 447, 443, 439, 439,
- 444, 441, 440, 448, 447, 444, 451, 449, 452, 456,
- 442, 446, 445, 441, 454, 448, 443, 445, 455, 462,
- 446, 456, 460, 447, 451, 458, 455, 444, 449, 454,
- 448, 452, 461, 451, 449, 452, 456, 457, 463, 459,
-
- 464, 454, 465, 0, 467, 455, 457, 460, 458, 460,
- 466, 461, 458, 459, 469, 464, 470, 468, 473, 461,
- 477, 472, 475, 473, 457, 466, 459, 464, 467, 468,
- 463, 467, 472, 474, 465, 471, 469, 466, 471, 476,
- 470, 469, 478, 470, 468, 479, 471, 474, 472, 475,
- 473, 480, 477, 481, 482, 483, 0, 486, 484, 481,
- 474, 486, 471, 483, 485, 471, 476, 487, 489, 478,
- 488, 494, 479, 0, 0, 487, 482, 484, 490, 496,
- 481, 482, 483, 480, 486, 484, 491, 492, 485, 493,
- 495, 485, 496, 488, 487, 491, 493, 488, 498, 497,
-
- 489, 490, 499, 494, 497, 490, 496, 498, 497, 492,
- 500, 501, 495, 491, 492, 504, 493, 495, 502, 500,
- 505, 503, 507, 497, 514, 498, 497, 504, 499, 499,
- 511, 497, 506, 501, 503, 497, 509, 500, 501, 508,
- 502, 511, 504, 510, 516, 502, 507, 513, 503, 507,
- 506, 514, 505, 512, 515, 516, 519, 511, 509, 506,
- 517, 508, 508, 509, 518, 510, 508, 512, 520, 513,
- 510, 516, 515, 521, 513, 517, 522, 519, 525, 526,
- 512, 515, 523, 519, 527, 529, 524, 517, 508, 530,
- 528, 523, 520, 533, 530, 520, 518, 521, 522, 524,
-
- 521, 526, 535, 522, 531, 532, 526, 529, 537, 523,
- 525, 536, 529, 524, 528, 534, 527, 528, 531, 532,
- 535, 530, 538, 534, 539, 533, 536, 543, 540, 535,
- 541, 531, 532, 540, 542, 536, 542, 538, 536, 544,
- 537, 0, 534, 545, 558, 0, 539, 544, 596, 538,
- 546, 539, 543, 536, 543, 547, 541, 541, 548, 546,
- 540, 542, 550, 549, 547, 551, 544, 548, 545, 550,
- 545, 549, 553, 552, 554, 557, 558, 546, 555, 556,
- 596, 0, 547, 554, 553, 548, 555, 557, 551, 550,
- 549, 552, 551, 566, 556, 559, 560, 0, 561, 553,
-
- 552, 554, 557, 559, 560, 555, 556, 561, 562, 563,
- 568, 564, 0, 565, 0, 0, 566, 562, 563, 564,
- 566, 567, 559, 560, 569, 561, 568, 573, 574, 567,
- 570, 572, 575, 0, 571, 562, 563, 568, 564, 565,
- 565, 570, 571, 576, 577, 572, 569, 573, 567, 579,
- 574, 569, 575, 578, 573, 574, 580, 570, 572, 575,
- 581, 571, 578, 582, 583, 576, 577, 584, 585, 579,
- 576, 577, 588, 581, 580, 586, 579, 590, 587, 583,
- 578, 582, 589, 580, 592, 588, 601, 581, 589, 584,
- 582, 583, 585, 591, 584, 585, 587, 593, 586, 588,
-
- 595, 591, 586, 597, 590, 587, 598, 599, 595, 589,
- 597, 592, 600, 602, 603, 593, 611, 0, 601, 591,
- 591, 600, 599, 603, 593, 616, 611, 595, 591, 598,
- 597, 605, 602, 598, 599, 604, 622, 604, 605, 600,
- 602, 603, 608, 611, 615, 619, 614, 620, 616, 617,
- 0, 0, 616, 0, 608, 618, 624, 629, 605, 621,
- 620, 619, 604, 606, 614, 615, 621, 606, 622, 608,
- 606, 615, 619, 614, 620, 617, 617, 606, 624, 626,
- 606, 618, 618, 624, 629, 606, 621, 0, 626, 625,
- 606, 627, 0, 627, 606, 625, 628, 606, 0, 0,
-
- 632, 630, 0, 631, 606, 633, 626, 606, 623, 623,
- 0, 623, 632, 0, 623, 634, 625, 636, 627, 623,
- 628, 630, 637, 628, 635, 623, 623, 632, 630, 631,
- 631, 633, 633, 640, 623, 623, 623, 634, 623, 636,
- 638, 623, 634, 643, 636, 644, 623, 637, 635, 637,
- 639, 635, 623, 623, 641, 638, 640, 642, 639, 647,
- 640, 641, 643, 645, 0, 642, 646, 638, 647, 649,
- 643, 644, 644, 648, 650, 645, 652, 639, 653, 646,
- 654, 641, 655, 0, 642, 0, 647, 656, 648, 662,
- 645, 649, 657, 646, 658, 659, 649, 662, 652, 663,
-
- 648, 650, 660, 652, 659, 661, 655, 666, 656, 655,
- 653, 657, 654, 658, 656, 664, 662, 665, 0, 657,
- 667, 658, 659, 669, 660, 661, 663, 670, 667, 660,
- 672, 671, 661, 664, 674, 673, 665, 675, 676, 666,
- 678, 669, 664, 678, 665, 670, 676, 667, 673, 675,
- 669, 677, 672, 682, 670, 671, 681, 672, 671, 0,
- 674, 674, 673, 679, 675, 676, 683, 678, 685, 677,
- 684, 679, 683, 0, 685, 686, 690, 687, 677, 692,
- 682, 681, 686, 681, 687, 691, 688, 679, 692, 689,
- 679, 688, 684, 683, 690, 685, 689, 684, 679, 693,
-
- 694, 696, 686, 690, 687, 695, 692, 693, 691, 696,
- 697, 699, 691, 688, 698, 700, 689, 701, 694, 706,
- 695, 705, 700, 697, 701, 703, 693, 694, 696, 702,
- 703, 708, 695, 704, 705, 698, 702, 697, 699, 707,
- 704, 698, 700, 712, 701, 709, 707, 710, 705, 711,
- 715, 706, 703, 713, 716, 710, 702, 711, 717, 713,
- 704, 714, 719, 708, 711, 712, 707, 717, 709, 718,
- 712, 721, 709, 723, 710, 724, 711, 725, 716, 720,
- 713, 716, 715, 718, 711, 717, 720, 714, 714, 725,
- 722, 726, 727, 728, 719, 723, 718, 727, 721, 722,
-
- 723, 729, 724, 732, 725, 731, 720, 735, 731, 729,
- 737, 739, 738, 735, 726, 728, 732, 722, 726, 727,
- 728, 741, 734, 739, 740, 0, 740, 756, 729, 734,
- 732, 0, 731, 742, 735, 738, 737, 737, 739, 738,
- 743, 745, 744, 0, 741, 742, 745, 0, 741, 734,
- 736, 740, 736, 746, 756, 744, 736, 751, 736, 747,
- 742, 0, 743, 736, 748, 749, 746, 743, 736, 744,
- 751, 750, 752, 745, 736, 749, 748, 736, 752, 736,
- 746, 753, 747, 736, 751, 736, 747, 749, 754, 755,
- 736, 748, 749, 750, 753, 736, 758, 759, 750, 752,
-
- 764, 0, 749, 760, 0, 759, 768, 762, 753, 754,
- 763, 0, 760, 764, 765, 754, 766, 767, 770, 0,
- 772, 755, 762, 775, 759, 768, 770, 764, 758, 765,
- 760, 761, 763, 768, 762, 769, 761, 763, 761, 767,
- 776, 765, 766, 766, 767, 770, 771, 772, 769, 761,
- 761, 773, 777, 779, 771, 775, 761, 761, 761, 780,
- 777, 778, 769, 761, 776, 761, 782, 776, 785, 783,
- 788, 784, 781, 771, 773, 778, 761, 761, 773, 777,
- 781, 780, 784, 761, 782, 779, 780, 783, 778, 786,
- 790, 792, 788, 782, 787, 793, 783, 788, 784, 781,
-
- 785, 789, 787, 790, 791, 794, 796, 786, 789, 792,
- 0, 791, 797, 793, 798, 799, 786, 790, 792, 796,
- 797, 787, 793, 798, 800, 801, 802, 799, 789, 804,
- 805, 791, 803, 796, 808, 0, 812, 794, 809, 797,
- 806, 798, 799, 809, 811, 808, 800, 801, 802, 812,
- 803, 800, 801, 802, 806, 804, 804, 810, 813, 803,
- 810, 808, 805, 812, 814, 813, 815, 806, 811, 817,
- 809, 811, 816, 819, 818, 820, 814, 821, 829, 816,
- 818, 822, 0, 810, 810, 813, 826, 810, 821, 823,
- 824, 814, 830, 817, 828, 819, 817, 820, 815, 816,
-
- 819, 818, 820, 822, 821, 824, 831, 826, 822, 827,
- 829, 823, 838, 826, 832, 828, 823, 824, 833, 830,
- 827, 828, 834, 832, 831, 836, 835, 839, 840, 837,
- 0, 834, 836, 831, 835, 841, 827, 843, 844, 845,
- 846, 832, 833, 837, 838, 833, 843, 848, 0, 834,
- 840, 847, 836, 835, 850, 840, 837, 841, 846, 839,
- 847, 849, 841, 850, 843, 851, 845, 846, 852, 853,
- 844, 848, 854, 0, 848, 855, 856, 849, 847, 857,
- 851, 850, 858, 859, 854, 861, 862, 857, 849, 864,
- 867, 864, 851, 872, 861, 858, 870, 855, 859, 854,
-
- 852, 853, 855, 856, 862, 869, 857, 863, 870, 858,
- 859, 866, 861, 862, 871, 863, 864, 867, 869, 866,
- 872, 873, 874, 870, 875, 876, 877, 0, 873, 0,
- 879, 880, 869, 878, 863, 0, 871, 881, 866, 887,
- 0, 871, 883, 879, 880, 884, 0, 876, 873, 882,
- 883, 877, 876, 877, 874, 878, 875, 879, 880, 881,
- 878, 882, 885, 886, 881, 884, 887, 888, 889, 883,
- 890, 886, 884, 894, 885, 891, 882, 889, 902, 897,
- 888, 895, 891, 898, 896, 0, 902, 892, 0, 885,
- 886, 890, 897, 901, 888, 889, 892, 890, 892, 894,
-
- 894, 892, 891, 895, 896, 902, 897, 898, 895, 892,
- 898, 896, 899, 900, 892, 901, 903, 906, 904, 907,
- 901, 899, 908, 892, 910, 892, 904, 913, 892, 908,
- 909, 900, 911, 0, 0, 913, 912, 0, 903, 899,
- 900, 907, 916, 903, 906, 904, 907, 910, 912, 908,
- 911, 910, 909, 914, 913, 915, 917, 909, 918, 911,
- 921, 922, 916, 912, 919, 920, 918, 915, 914, 916,
- 919, 917, 923, 922, 920, 925, 927, 924, 929, 923,
- 914, 921, 915, 917, 924, 918, 932, 921, 922, 930,
- 928, 919, 920, 925, 935, 933, 930, 929, 931, 923,
-
- 933, 932, 925, 928, 924, 929, 934, 935, 927, 936,
- 0, 937, 941, 932, 934, 0, 930, 928, 939, 943,
- 931, 935, 940, 936, 942, 931, 953, 933, 0, 0,
- 0, 954, 939, 934, 0, 951, 936, 937, 937, 938,
- 940, 943, 938, 938, 941, 939, 943, 938, 951, 940,
- 942, 942, 0, 938, 944, 945, 946, 938, 953, 947,
- 948, 938, 951, 954, 952, 956, 938, 948, 950, 938,
- 938, 949, 944, 952, 938, 955, 0, 945, 946, 958,
- 938, 944, 945, 946, 938, 947, 947, 948, 956, 949,
- 950, 952, 956, 960, 0, 950, 962, 955, 949, 963,
-
- 965, 0, 955, 957, 964, 958, 958, 968, 957, 960,
- 957, 963, 957, 964, 957, 967, 969, 966, 965, 962,
- 960, 957, 966, 962, 969, 968, 963, 965, 967, 970,
- 957, 964, 971, 972, 968, 957, 974, 957, 973, 957,
- 977, 957, 967, 969, 975, 971, 978, 980, 970, 966,
- 976, 973, 976, 975, 974, 972, 970, 979, 981, 971,
- 972, 0, 977, 974, 983, 973, 986, 977, 984, 979,
- 985, 975, 987, 978, 980, 988, 989, 976, 985, 987,
- 990, 991, 992, 981, 979, 981, 990, 991, 983, 993,
- 984, 983, 994, 986, 997, 984, 993, 985, 989, 987,
-
- 995, 998, 988, 989, 1000, 999, 0, 990, 991, 992,
- 1002, 1001, 1008, 1003, 994, 1005, 993, 1009, 997, 994,
- 1004, 997, 1003, 998, 999, 995, 1000, 995, 998, 1006,
- 1010, 1000, 999, 1001, 1011, 1005, 1002, 1002, 1001, 1020,
- 1003, 1004, 1005, 1006, 1008, 1012, 1013, 1004, 1014, 1009,
- 1015, 1016, 1010, 1018, 1013, 1019, 1006, 1010, 1016, 1019,
- 1018, 1022, 1024, 1012, 1014, 0, 1011, 1027, 1023, 1024,
- 1025, 1020, 1012, 1013, 1023, 1014, 1027, 1015, 1016, 1026,
- 1018, 1023, 1019, 1028, 1029, 1025, 1030, 1031, 1030, 1024,
- 1032, 1029, 1026, 1022, 1027, 1023, 1031, 1025, 1033, 1034,
-
- 1035, 1023, 1039, 1034, 1040, 1041, 1026, 1037, 0, 1028,
- 1028, 1029, 1032, 1030, 1031, 1037, 1038, 1032, 1041, 1045,
- 1039, 1038, 1035, 1040, 1042, 1033, 1034, 1035, 1046, 1039,
- 1043, 1040, 1041, 1043, 1037, 1048, 1042, 1044, 1047, 1050,
- 1044, 1046, 1043, 0, 1045, 1049, 1045, 1050, 1038, 1051,
- 1051, 1042, 1053, 0, 1052, 1046, 1054, 1043, 1048, 1044,
- 1043, 1049, 1048, 1052, 1044, 1054, 1050, 1044, 1055, 1057,
- 1047, 1058, 1049, 1059, 1053, 1055, 1051, 1061, 1060, 1053,
- 1058, 1052, 1057, 1054, 1062, 1064, 1061, 1063, 0, 0,
- 1065, 1069, 1062, 1064, 1066, 1055, 1057, 1067, 1058, 1059,
-
- 1059, 1060, 1063, 1065, 1061, 1060, 1066, 1068, 1070, 1067,
- 1071, 1062, 1064, 1069, 1063, 1068, 1072, 1065, 1069, 1074,
- 1073, 1066, 1084, 1076, 1067, 1072, 1078, 1075, 1070, 1079,
- 1077, 1080, 1071, 1081, 1068, 1070, 1077, 1071, 1073, 1075,
- 1082, 1085, 0, 1072, 1076, 1074, 1074, 1073, 1078, 1084,
- 1076, 1086, 1090, 1078, 1075, 1091, 1087, 1077, 1088, 1081,
- 1081, 1079, 1089, 1080, 1085, 1087, 1082, 1082, 1085, 1086,
- 1092, 1088, 1090, 1093, 1089, 1095, 1094, 1092, 1086, 1090,
- 1099, 1091, 1091, 1087, 1103, 1088, 1096, 1099, 1095, 1089,
- 1097, 1098, 1093, 1100, 1096, 1097, 1098, 1092, 1094, 0,
-
- 1093, 1100, 1095, 1094, 1101, 1106, 1102, 1099, 1104, 1104,
- 1105, 1107, 1101, 1096, 1102, 1115, 1103, 1108, 1105, 1109,
- 1100, 1110, 1097, 1098, 1113, 1108, 1106, 1109, 1111, 1110,
- 1113, 1101, 1106, 1102, 1112, 1104, 1111, 1105, 1114, 1116,
- 1118, 1115, 1115, 1107, 1108, 1117, 1109, 1112, 1110, 1119,
- 1114, 1113, 1120, 1124, 1121, 1111, 1122, 1124, 1128, 1123,
- 1117, 1112, 1126, 1116, 1135, 1114, 1116, 1118, 1121, 1126,
- 1124, 1119, 1117, 1123, 1122, 1120, 1119, 1127, 1124, 1120,
- 1124, 1121, 0, 1122, 1124, 1128, 1123, 1129, 1127, 1126,
- 1130, 1132, 1131, 1133, 1134, 1136, 1135, 1124, 1132, 1138,
-
- 1140, 1134, 1133, 1141, 1127, 1142, 1140, 1143, 1138, 1129,
- 1145, 1147, 0, 1130, 1129, 1131, 1151, 1130, 1132, 1131,
- 1133, 1134, 1136, 1148, 1149, 1141, 1138, 1140, 1152, 1156,
- 1141, 1142, 1142, 1155, 1148, 1149, 1153, 1145, 1147, 1143,
- 1151, 1156, 1153, 1151, 1154, 1157, 1160, 1157, 1158, 1159,
- 1148, 1149, 1161, 1162, 1152, 1152, 1156, 1165, 1163, 1155,
- 1155, 0, 1159, 1153, 1161, 1168, 1154, 0, 1160, 1170,
- 1164, 1154, 1157, 1160, 1158, 1158, 1159, 1164, 1167, 1161,
- 1162, 1163, 1166, 1165, 1165, 1163, 1172, 1166, 1168, 1176,
- 1169, 1170, 1168, 1173, 1167, 1174, 1170, 1164, 1169, 1175,
-
- 1178, 1177, 1173, 1179, 1182, 1167, 1180, 1178, 1174, 1166,
- 1179, 1182, 1175, 1172, 1181, 1176, 1176, 1169, 1183, 1185,
- 1173, 1187, 1174, 1177, 1180, 1184, 1175, 1178, 1177, 1189,
- 1179, 1182, 1186, 1180, 1190, 1197, 1181, 1192, 1191, 1186,
- 1195, 1181, 1189, 1183, 1196, 1183, 1191, 1184, 1197, 1200,
- 1225, 1185, 1184, 1187, 1194, 0, 1189, 1194, 1192, 1186,
- 1198, 1190, 1197, 1199, 1192, 1191, 1195, 1195, 1201, 1198,
- 1196, 1196, 1203, 1200, 1202, 1199, 1200, 1225, 1205, 1203,
- 1206, 1194, 1204, 1211, 1210, 1204, 1207, 1198, 0, 1202,
- 1199, 1209, 1208, 1209, 1201, 1201, 1212, 1204, 1214, 1203,
-
- 1213, 1202, 1206, 1215, 1207, 0, 1204, 1206, 1210, 1204,
- 1205, 1210, 1204, 1207, 1208, 1211, 0, 1215, 1209, 1208,
- 1214, 1217, 1212, 1212, 1204, 1214, 1213, 1213, 1216, 1217,
- 1215, 1218, 1219, 1220, 1221, 1222, 1223, 1216, 1218, 0,
- 1223, 0, 1227, 1228, 1224, 1229, 1226, 1230, 1217, 1231,
- 1228, 1227, 1229, 1234, 0, 1216, 1221, 0, 1218, 0,
- 1230, 1221, 1231, 1223, 1219, 1220, 1224, 1222, 1226, 1227,
- 1228, 1224, 1229, 1226, 1230, 1232, 1231, 1233, 1238, 1235,
- 1236, 1237, 1240, 0, 1238, 1234, 1235, 1236, 1241, 1242,
- 1232, 1233, 1243, 1246, 1237, 1241, 1246, 0, 1244, 1245,
-
- 0, 0, 1232, 1248, 1233, 1238, 1235, 1236, 1237, 1240,
- 1244, 1242, 1245, 1247, 1250, 1241, 1242, 1249, 1243, 1243,
- 1246, 1248, 1247, 1257, 1251, 1244, 1245, 1251, 1252, 1249,
- 1248, 1254, 1258, 1256, 1250, 1256, 1254, 1259, 1260, 1252,
- 1247, 1250, 1251, 1254, 1249, 1261, 1260, 1267, 1263, 1268,
- 1257, 1251, 0, 1265, 1251, 1252, 1265, 1262, 1254, 1258,
- 1256, 1259, 1264, 1254, 1259, 1260, 1263, 1261, 1262, 1266,
- 1264, 1265, 1261, 1271, 1269, 1263, 1268, 1270, 1274, 1267,
- 1265, 1269, 1271, 1265, 1262, 1272, 1273, 1266, 1276, 1264,
- 1276, 1270, 1278, 1274, 1277, 1279, 1266, 1273, 1272, 1280,
-
- 1271, 1269, 1281, 1277, 1270, 1274, 1279, 1283, 1287, 1282,
- 1283, 1284, 1272, 1273, 1289, 1276, 1290, 1280, 1278, 1278,
- 1284, 1277, 1279, 1282, 1281, 1283, 1280, 1285, 1292, 1281,
- 1288, 1291, 1285, 1297, 1283, 1282, 1282, 1283, 1284, 1288,
- 1287, 1289, 1293, 1296, 1295, 1307, 0, 1298, 1290, 1299,
- 1282, 1295, 1312, 1291, 1302, 1299, 1296, 1288, 1291, 1285,
- 1292, 1298, 1302, 1293, 1303, 1297, 1304, 1306, 0, 1293,
- 1296, 1295, 1303, 1299, 1298, 1305, 1299, 1307, 1308, 1309,
- 1306, 1302, 1299, 1311, 1312, 1304, 1316, 1310, 1309, 1305,
- 1313, 1303, 1308, 1304, 1306, 1310, 1317, 1311, 1314, 1318,
-
- 1322, 1313, 1305, 1317, 0, 1308, 1309, 1314, 1319, 1320,
- 1311, 1321, 1323, 1316, 1310, 1326, 1323, 1313, 1322, 0,
- 1325, 1327, 1318, 1317, 1328, 1314, 1318, 1322, 1330, 1327,
- 1319, 1320, 1325, 1321, 1329, 1319, 1320, 1328, 1321, 1323,
- 1334, 1331, 1326, 1330, 1332, 0, 1333, 1325, 1327, 1335,
- 1336, 1328, 1332, 1333, 1329, 1330, 1331, 1337, 1338, 1336,
- 1340, 1329, 1339, 1343, 1335, 1344, 1342, 1345, 1331, 0,
- 1346, 1332, 1334, 1333, 1347, 1349, 1335, 1336, 1337, 0,
- 1349, 1343, 1345, 1352, 1337, 1338, 1339, 1340, 1342, 1339,
- 1343, 1350, 1344, 1342, 1345, 1346, 1348, 1346, 1347, 1351,
-
- 1350, 1347, 1349, 1348, 1353, 1352, 1354, 1355, 1351, 1358,
- 1352, 1357, 1360, 1356, 1361, 1359, 1358, 1363, 1350, 1355,
- 1365, 1354, 1353, 1348, 1357, 1363, 1351, 1359, 1366, 1357,
- 1367, 1353, 1368, 1354, 1355, 1356, 1358, 1362, 1357, 1360,
- 1356, 1364, 1359, 1362, 1363, 1365, 1361, 1365, 1364, 1369,
- 1370, 1357, 1371, 1373, 1366, 1366, 1369, 1367, 1371, 1368,
- 1372, 1374, 1375, 1378, 1362, 1376, 1372, 1380, 1364, 1379,
- 1381, 1385, 1381, 1383, 1382, 1387, 1369, 1370, 1379, 1371,
- 1373, 1384, 1387, 1388, 1374, 1389, 1390, 1372, 1374, 1376,
- 1388, 1394, 1376, 1390, 1375, 1378, 1379, 1381, 1382, 1380,
-
- 1383, 1382, 1387, 1385, 1386, 1386, 1386, 1384, 1384, 1392,
- 1388, 1386, 1393, 1390, 1392, 1396, 1394, 1389, 1394, 1386,
- 1395, 1397, 1398, 1399, 1401, 1393, 0, 1396, 1400, 1407,
- 1399, 1386, 1386, 1386, 1400, 1403, 1395, 1406, 1386, 1393,
- 1398, 1392, 1396, 1402, 1402, 1404, 1412, 1395, 1410, 1398,
- 1399, 1401, 1404, 1397, 1405, 1400, 1407, 1413, 1414, 1405,
- 0, 1403, 1403, 1406, 1406, 1411, 1410, 1417, 1415, 1413,
- 1402, 1411, 1404, 1412, 1421, 1410, 1416, 1416, 1414, 1418,
- 1418, 1405, 1423, 1422, 1413, 1414, 1415, 1419, 1425, 1423,
- 1424, 1426, 1411, 1417, 1417, 1415, 1421, 1427, 1419, 1428,
-
- 1429, 1421, 0, 1416, 1430, 1431, 1418, 1432, 0, 1423,
- 1424, 1430, 1433, 1431, 1419, 1422, 1434, 1424, 1429, 1436,
- 1425, 1428, 1432, 1426, 1427, 1434, 1428, 1429, 1435, 1435,
- 1437, 1430, 1431, 1438, 1432, 1441, 1433, 1445, 1444, 1433,
- 1440, 1446, 1437, 1434, 1443, 1436, 1436, 1441, 1440, 1438,
- 1447, 1448, 1443, 1450, 0, 1435, 1438, 1437, 1445, 1446,
- 1438, 1444, 1441, 1451, 1445, 1444, 1452, 1440, 1446, 1451,
- 1449, 1443, 1455, 1456, 1448, 1449, 1438, 1447, 1448, 1452,
- 1450, 1453, 1454, 1457, 1459, 1461, 1449, 1458, 1453, 1454,
- 1451, 1460, 1458, 1452, 1462, 1465, 1460, 1449, 1463, 1463,
-
- 1456, 1464, 1449, 1458, 1455, 1467, 1457, 1468, 1453, 1454,
- 1457, 1459, 1471, 1470, 1458, 1470, 1464, 1461, 1469, 1458,
- 1467, 1473, 1474, 1460, 1472, 1463, 1462, 1465, 1464, 1472,
- 1468, 1477, 1467, 1469, 1468, 1476, 1479, 1474, 1478, 1480,
- 1470, 1481, 1482, 1486, 1471, 1469, 1483, 0, 1481, 1474,
- 1484, 1472, 1490, 1473, 1485, 1477, 1488, 1476, 1477, 0,
- 1495, 1486, 1476, 1479, 1478, 1478, 1480, 1483, 1481, 1491,
- 1486, 1493, 1484, 1483, 1482, 1485, 1490, 1484, 1488, 1490,
- 1494, 1485, 1495, 1488, 1491, 1496, 1493, 1495, 1497, 1498,
- 1500, 1499, 1501, 1507, 1503, 1494, 1491, 1504, 1493, 1501,
-
- 1505, 1508, 1502, 1503, 1506, 1504, 1497, 1494, 1518, 1525,
- 0, 1498, 1496, 1499, 1508, 1497, 1498, 1500, 1499, 1501,
- 1502, 1503, 1510, 1505, 1504, 1507, 1506, 1505, 1508, 1502,
- 1511, 1506, 1512, 1510, 1513, 1518, 1514, 1526, 0, 1511,
- 1515, 1525, 1520, 1524, 1521, 1529, 1523, 1526, 1510, 1510,
- 1512, 1514, 1513, 1520, 1515, 1521, 1524, 1511, 1523, 1512,
- 1510, 1513, 1527, 1514, 1526, 1528, 1530, 1515, 1533, 1520,
- 1524, 1521, 1529, 1523, 1532, 1533, 1534, 1536, 1535, 0,
- 1540, 1540, 1537, 1536, 1538, 1530, 1541, 1542, 1527, 1527,
- 1528, 1539, 1528, 1530, 1532, 1533, 1535, 1537, 1541, 1538,
-
- 1542, 1532, 1534, 1534, 1536, 1535, 1539, 1540, 1542, 1537,
- 1544, 1538, 1546, 1541, 1542, 1545, 1547, 1544, 1539, 1548,
- 1549, 1551, 1555, 1550, 0, 1547, 1548, 1542, 1551, 1553,
- 1545, 1555, 1554, 1556, 1557, 1559, 0, 1544, 1560, 1546,
- 1563, 0, 1545, 1547, 1549, 1550, 1548, 1549, 1551, 1555,
- 1550, 1553, 1565, 1559, 1557, 1556, 1553, 1554, 1562, 1554,
- 1556, 1557, 1559, 1560, 1566, 1560, 1567, 1563, 1564, 1564,
- 1568, 1562, 1569, 1570, 1565, 1571, 1572, 1577, 1576, 1565,
- 1570, 1569, 1573, 1574, 1578, 1562, 1576, 1579, 1567, 1566,
- 1577, 1566, 1568, 1567, 1580, 1564, 1573, 1568, 1572, 1569,
-
- 1570, 1581, 1574, 1572, 1577, 1576, 1580, 1571, 1581, 1573,
- 1574, 1578, 1582, 1579, 1579, 1583, 1584, 0, 1585, 0,
- 1586, 1580, 1587, 0, 0, 1590, 1589, 1591, 1581, 0,
- 0, 1590, 1588, 1585, 0, 1588, 1596, 1583, 1592, 1597,
- 1593, 1584, 1583, 1584, 1582, 1585, 1586, 1586, 1587, 1587,
- 1588, 1589, 1590, 1589, 1591, 1593, 1592, 1595, 1596, 1588,
- 1599, 1597, 1588, 1596, 1600, 1592, 1597, 1593, 1601, 1602,
- 1603, 1600, 1595, 1605, 1599, 1615, 1606, 1601, 1602, 1607,
- 0, 1603, 1613, 1611, 1595, 1612, 1609, 1599, 1605, 1612,
- 1614, 1600, 1614, 1615, 1613, 1601, 1602, 1603, 1606, 1609,
-
- 1605, 1607, 1615, 1606, 1611, 1616, 1607, 1609, 1618, 1613,
- 1611, 1617, 1612, 1609, 1619, 1621, 1620, 1614, 1623, 1622,
- 1624, 1625, 1619, 1623, 1626, 1629, 1609, 0, 1632, 1617,
- 1633, 1626, 1616, 1622, 1634, 1618, 1631, 1621, 1617, 1620,
- 1625, 1619, 1621, 1620, 1624, 1630, 1622, 1624, 1625, 1634,
- 1623, 1626, 1629, 1635, 1631, 1632, 1633, 1633, 1636, 1630,
- 1637, 1634, 1635, 1631, 1638, 0, 1639, 1640, 1643, 1642,
- 1630, 1630, 1630, 0, 1646, 1643, 1646, 1644, 1652, 1648,
- 1635, 1647, 1637, 1648, 0, 1650, 1630, 1637, 1639, 1652,
- 1636, 1638, 1642, 1639, 1653, 1643, 1642, 1630, 1649, 1640,
-
- 1644, 1646, 1651, 1647, 1644, 1652, 1648, 1650, 1647, 1654,
- 1649, 1651, 1650, 1656, 1655, 1657, 1657, 1659, 1660, 1658,
- 1662, 1653, 1663, 1668, 0, 1649, 1655, 1658, 1662, 1651,
- 1663, 1665, 1654, 1664, 1665, 1656, 1654, 1664, 1668, 1659,
- 1656, 1655, 1657, 1666, 1659, 1660, 1658, 1662, 1667, 1663,
- 1668, 1666, 1671, 1669, 1667, 1672, 1675, 1673, 1665, 1669,
- 1664, 1677, 1674, 1676, 1671, 1678, 1679, 0, 1682, 1675,
- 1666, 0, 1681, 1680, 0, 1667, 1674, 1676, 1684, 1671,
- 1669, 1673, 1672, 1675, 1673, 1680, 1681, 1677, 1677, 1674,
- 1676, 1685, 1678, 1679, 1682, 1682, 1688, 1687, 1683, 1681,
-
- 1680, 1683, 1689, 1688, 1691, 1684, 1690, 1692, 1694, 1689,
- 1696, 1697, 1693, 1685, 1698, 1702, 1683, 1695, 1685, 1687,
- 1693, 1690, 1699, 1688, 1687, 1683, 1695, 1698, 1683, 1689,
- 1699, 1691, 1701, 1690, 1692, 1694, 1704, 1696, 1697, 1693,
- 1703, 1698, 1702, 1705, 1695, 1706, 1709, 1707, 1703, 1699,
- 1708, 0, 1705, 1710, 1701, 1713, 1711, 1715, 1716, 1701,
- 1719, 1710, 1716, 1704, 1715, 1708, 1706, 1703, 1711, 1717,
- 1705, 1707, 1706, 1709, 1707, 1718, 1708, 1708, 1712, 1721,
- 1710, 1717, 1713, 1711, 1715, 1716, 1712, 1719, 1722, 1720,
- 1723, 1726, 1708, 1724, 1724, 1722, 1717, 1720, 1718, 1725,
-
- 1730, 0, 1718, 1727, 1729, 1712, 1721, 1731, 0, 1726,
- 1723, 1732, 0, 1732, 1735, 1722, 1720, 1723, 1726, 1729,
- 1724, 1733, 1730, 1736, 1737, 1725, 1725, 1730, 1727, 1731,
- 1727, 1729, 1738, 1734, 1731, 1733, 1735, 1742, 1732, 1734,
- 1739, 1735, 1741, 1743, 1738, 1736, 1737, 1740, 1733, 1740,
- 1736, 1737, 1746, 1744, 1745, 1742, 1741, 1747, 1752, 1738,
- 1734, 1743, 1739, 1748, 1742, 1746, 1750, 1739, 1753, 1741,
- 1743, 1744, 1745, 1750, 1740, 1754, 1752, 1758, 0, 1746,
- 1744, 1745, 0, 1755, 1760, 1752, 1748, 1759, 1764, 1747,
- 1748, 1755, 0, 1750, 1753, 1753, 1756, 1762, 1756, 1759,
-
- 1764, 1771, 1760, 1756, 1758, 1763, 1765, 1754, 1768, 1755,
- 1755, 1760, 1762, 1767, 1759, 1764, 1763, 1773, 1755, 1769,
- 1776, 1765, 1778, 1756, 1762, 1756, 1769, 1770, 1771, 1774,
- 1768, 0, 1763, 1765, 1777, 1768, 1775, 1767, 1779, 0,
- 1767, 1780, 1770, 1784, 1773, 1781, 1769, 1783, 1782, 1778,
- 1786, 1779, 1776, 1774, 1770, 1783, 1774, 1787, 1775, 1788,
- 1781, 1782, 1791, 1775, 1799, 1779, 1777, 1780, 1780, 1784,
- 1784, 1789, 1781, 1786, 1783, 1782, 1790, 1786, 1795, 1796,
- 1793, 1787, 1798, 1790, 1787, 1791, 1788, 1793, 1794, 1791,
- 1797, 1795, 1800, 1789, 1804, 1794, 1799, 1797, 1789, 1801,
-
- 1803, 1805, 1796, 1790, 1798, 1795, 1796, 1793, 1801, 1798,
- 1806, 1803, 1817, 1800, 1807, 1794, 1804, 1797, 1810, 1800,
- 1811, 1804, 1813, 1813, 1812, 1818, 1801, 1803, 1814, 1806,
- 1816, 1810, 1819, 1805, 1823, 1830, 1832, 1806, 1820, 1807,
- 1818, 1807, 1828, 1834, 1817, 1810, 1811, 1811, 1812, 1813,
- 1829, 1812, 1818, 1816, 1814, 1814, 1820, 1816, 1825, 1819,
- 1835, 1823, 1830, 1832, 1828, 1820, 1837, 1825, 1836, 1828,
- 1838, 1837, 1829, 1840, 1841, 1834, 1842, 1829, 1844, 1836,
- 1845, 1840, 1846, 1849, 1852, 1825, 1835, 1835, 1851, 1841,
- 1847, 1846, 1838, 1837, 1853, 1836, 1844, 1838, 1854, 0,
-
- 1840, 1841, 1847, 1842, 1857, 1844, 1855, 1856, 1858, 1846,
- 1849, 1852, 1845, 1859, 1851, 1851, 1853, 1847, 1860, 1855,
- 1856, 1853, 1861, 1854, 1862, 1854, 1857, 1863, 0, 1864,
- 1867, 1857, 1865, 1855, 1856, 1858, 1863, 1866, 1868, 1862,
- 1859, 1869, 1871, 1873, 1874, 1860, 1870, 1876, 1872, 1861,
- 1873, 1862, 1866, 1875, 1863, 1864, 1864, 1867, 1865, 1865,
- 1875, 1870, 1871, 1872, 1866, 1868, 1874, 1877, 1869, 1871,
- 1873, 1874, 1879, 1870, 1876, 1872, 1878, 1878, 1880, 1879,
- 1875, 1881, 1882, 1884, 1881, 1877, 1883, 1886, 1887, 1891,
- 1893, 1890, 1880, 1887, 1877, 1882, 1886, 1889, 1888, 1879,
-
- 1892, 1884, 1888, 1878, 1890, 1880, 1894, 0, 1881, 1882,
- 1884, 1891, 1883, 1883, 1886, 1887, 1891, 1893, 1890, 1895,
- 1899, 1889, 1892, 1898, 1889, 1888, 1900, 1892, 1901, 1899,
- 1903, 1904, 1912, 1894, 1905, 1914, 1901, 1903, 1907, 1905,
- 1904, 1906, 1900, 1909, 1908, 1895, 1895, 1899, 1906, 1898,
- 1898, 1908, 1909, 1900, 1910, 1901, 1907, 1903, 1904, 1912,
- 1913, 1905, 1914, 1915, 1916, 1907, 1917, 1918, 1906, 1923,
- 1909, 1908, 1915, 1916, 1919, 1920, 1924, 1921, 1913, 1918,
- 1910, 1910, 1925, 1919, 1920, 0, 1917, 1913, 1921, 1922,
- 1915, 1916, 1928, 1917, 1918, 1929, 1923, 1922, 1926, 1927,
-
- 1928, 1919, 1920, 1924, 1921, 1930, 1931, 1926, 1932, 1933,
- 1934, 1927, 1930, 1931, 1925, 1935, 1922, 1929, 1936, 1928,
- 1938, 1940, 1929, 0, 1941, 1926, 1927, 1947, 1938, 1946,
- 1932, 1941, 1930, 1931, 1933, 1932, 1933, 1934, 1942, 1940,
- 1935, 1950, 1935, 1945, 1951, 1936, 1942, 1938, 1940, 1948,
- 1945, 1941, 1954, 1946, 1947, 1949, 1946, 1953, 1955, 1956,
- 1958, 1948, 1960, 1962, 1949, 1942, 1961, 1951, 1950, 1953,
- 1945, 1951, 1963, 1956, 1961, 1954, 1948, 1964, 1970, 1954,
- 1969, 1971, 1949, 1970, 1953, 1955, 1956, 1958, 1972, 1960,
- 1962, 1973, 1977, 1961, 1963, 1971, 0, 1978, 1979, 1963,
-
- 0, 0, 1972, 1980, 1964, 1970, 1969, 1969, 1971, 1973,
- 1978, 1984, 1982, 1981, 1977, 1972, 1987, 1988, 1973, 1977,
- 1979, 1981, 1980, 1984, 1978, 1979, 1985, 1986, 1987, 1989,
- 1980, 1982, 1990, 1991, 1992, 1993, 0, 1994, 1984, 1982,
- 1981, 1997, 1998, 1987, 1988, 1996, 1995, 2001, 1985, 1986,
- 2006, 2002, 1990, 1985, 1986, 1991, 1989, 1993, 1995, 1990,
- 1991, 2001, 1993, 1994, 1994, 2003, 1992, 1996, 1997, 1998,
- 2003, 2004, 1996, 1995, 2001, 2002, 0, 2005, 2002, 2007,
- 2010, 2008, 2006, 2009, 0, 2013, 2011, 2012, 0, 2017,
- 0, 2015, 2010, 2004, 0, 2018, 0, 2003, 2004, 2005,
-
- 2013, 2009, 2007, 2008, 2005, 2011, 2007, 2010, 2008, 2012,
- 2009, 2017, 2013, 2011, 2012, 2015, 2017, 2018, 2015, 2019,
- 2020, 2021, 2018, 2022, 0, 2023, 2024, 2027, 2019, 2028,
- 2029, 2030, 2031, 2033, 2020, 2027, 2028, 2032, 2029, 2021,
- 2031, 2022, 2034, 2041, 2024, 2033, 2019, 2020, 2021, 2037,
- 2022, 2023, 2023, 2024, 2027, 2032, 2028, 2029, 2030, 2031,
- 2033, 2037, 2035, 2040, 2032, 2039, 2042, 2046, 2043, 2034,
- 2035, 2050, 2039, 0, 2044, 2041, 2037, 2047, 2056, 2049,
- 0, 2053, 0, 0, 2050, 2046, 2040, 2043, 2051, 2035,
- 2040, 2047, 2039, 2042, 2046, 2043, 2044, 2061, 2050, 2062,
-
- 2051, 2044, 2049, 2058, 2047, 2056, 2049, 2053, 2053, 2060,
- 2058, 2063, 2065, 2064, 2067, 2051, 2060, 2066, 2069, 2068,
- 2070, 2071, 2072, 2061, 2061, 2073, 2062, 2077, 2074, 2070,
- 2058, 2068, 2077, 2080, 2071, 2079, 2060, 2064, 2063, 2065,
- 2064, 2067, 2083, 2066, 2066, 2069, 2068, 2070, 2071, 2078,
- 2082, 2074, 2073, 2078, 2072, 2074, 2079, 2086, 2081, 2077,
- 2081, 2087, 2079, 2088, 2090, 2080, 2090, 2093, 2091, 2083,
- 2097, 2092, 2092, 2082, 2094, 2095, 2078, 2082, 2098, 2086,
- 2087, 2092, 2095, 2094, 2086, 2081, 2098, 2088, 2087, 2093,
- 2088, 2090, 2091, 2096, 2093, 2091, 2099, 2097, 2092, 2092,
-
- 2100, 2094, 2095, 2101, 2106, 2098, 2096, 2102, 2100, 2103,
- 0, 2104, 2107, 2105, 2109, 2099, 2108, 2108, 2110, 2107,
- 2096, 2111, 2113, 2099, 2105, 2110, 2106, 2100, 2111, 2101,
- 2101, 2106, 2109, 2102, 2102, 2103, 2103, 2104, 2104, 2107,
- 2105, 2109, 2114, 2108, 2115, 2110, 2117, 2118, 2111, 2113,
- 2119, 2123, 2121, 2115, 2120, 2124, 2128, 2125, 2129, 0,
- 2123, 2128, 2132, 2127, 0, 2126, 2114, 2118, 2130, 2114,
- 2121, 2115, 2129, 2117, 2118, 2127, 2120, 2119, 2123, 2121,
- 2125, 2120, 2124, 2126, 2125, 2129, 2130, 2133, 2128, 2132,
- 2127, 2134, 2126, 2139, 2137, 2130, 2137, 2141, 0, 2144,
-
- 2143, 2145, 0, 2141, 2150, 2133, 2134, 2147, 2139, 2148,
- 2152, 2156, 2148, 0, 2133, 2151, 2164, 2152, 2134, 2145,
- 2139, 2137, 2143, 2154, 2141, 2144, 2144, 2143, 2145, 2147,
- 2153, 2150, 2157, 2151, 2147, 2148, 2148, 2152, 2153, 2148,
- 2158, 2159, 2151, 2156, 2160, 2154, 2161, 2162, 2164, 2163,
- 2154, 2166, 2161, 2160, 2157, 2170, 2168, 2153, 2163, 2157,
- 2169, 2165, 2158, 2165, 2168, 2171, 2172, 2158, 2159, 2162,
- 2175, 2160, 2169, 2161, 2162, 2173, 2163, 2174, 2166, 2171,
- 2172, 2175, 2170, 2168, 2177, 2178, 2176, 2169, 2165, 2179,
- 2179, 2180, 2171, 2172, 2176, 2174, 2183, 2175, 2173, 2184,
-
- 2181, 2188, 2173, 2177, 2174, 0, 2189, 2178, 2181, 2186,
- 2190, 2177, 2178, 2176, 2192, 2186, 2179, 2189, 2180, 2197,
- 2194, 2198, 2193, 2183, 2194, 2201, 2184, 2181, 2188, 2193,
- 2195, 2202, 2190, 2189, 2198, 2200, 2186, 2190, 2195, 2206,
- 2200, 2192, 2203, 2204, 2208, 2197, 2197, 2194, 2198, 2193,
- 2204, 2205, 2201, 2209, 2206, 2210, 2207, 2195, 2202, 2205,
- 2203, 2212, 2200, 2207, 2214, 2213, 2206, 2215, 2220, 2203,
- 2204, 2208, 2213, 2216, 2217, 2218, 2212, 2209, 2205, 2223,
- 2209, 2210, 2210, 2207, 2218, 2221, 0, 2225, 2212, 2227,
- 2220, 2222, 2213, 2228, 2215, 2220, 2214, 2216, 2230, 2222,
-
- 2216, 2228, 2218, 2224, 2224, 2231, 2217, 2221, 2233, 2235,
- 0, 2223, 2221, 2224, 2225, 2232, 2227, 2234, 2222, 2236,
- 2228, 2233, 2237, 2238, 2240, 2230, 2243, 2248, 2245, 2257,
- 2224, 2224, 2231, 2245, 2243, 2233, 2235, 2232, 2246, 2234,
- 2250, 2251, 2232, 2249, 2234, 2238, 2236, 2250, 2252, 2237,
- 2238, 2240, 2253, 2243, 2248, 2245, 2249, 2258, 2256, 2251,
- 2259, 2257, 2262, 2265, 2246, 2246, 2260, 2250, 2251, 2262,
- 2249, 2256, 2264, 2263, 2253, 2252, 2258, 2266, 2265, 2253,
- 2263, 2273, 2268, 2269, 2258, 2256, 0, 2259, 2260, 2262,
- 2265, 2269, 2273, 2260, 2264, 2270, 2271, 2272, 2266, 2264,
-
- 2263, 2268, 2270, 2271, 2266, 2276, 2272, 2275, 2273, 2268,
- 2269, 2274, 2274, 2275, 2282, 2283, 2288, 2284, 2279, 2290,
- 2294, 2274, 2270, 2271, 2272, 2279, 2292, 2276, 2291, 2291,
- 0, 2298, 2276, 0, 2275, 2296, 2299, 2300, 2274, 2274,
- 2284, 2282, 2283, 2288, 2284, 2279, 2290, 2294, 2296, 2292,
- 2295, 2304, 2303, 2292, 2301, 2306, 2299, 2291, 2298, 2295,
- 2300, 2303, 2296, 2299, 2300, 2305, 2301, 2307, 2308, 2304,
- 2310, 2309, 2312, 2310, 2313, 2314, 2313, 2295, 2304, 2303,
- 2308, 2301, 2306, 2316, 2311, 2317, 2319, 2314, 2310, 2311,
- 2315, 2305, 2305, 2309, 2307, 2308, 2315, 2310, 2309, 2322,
-
- 2310, 2313, 2314, 2318, 2312, 2316, 2325, 2317, 2326, 2327,
- 2316, 2318, 2317, 2319, 2329, 2330, 2311, 2315, 2332, 2333,
- 0, 2335, 2334, 2337, 0, 2340, 2322, 2336, 0, 2341,
- 2318, 2333, 2329, 2325, 2340, 2326, 2327, 2334, 2343, 2336,
- 2347, 2329, 2330, 2342, 2342, 2332, 2333, 2335, 2335, 2334,
- 2337, 2344, 2340, 2341, 2336, 2346, 2341, 2351, 2348, 2349,
- 2344, 2350, 2352, 2358, 2343, 2343, 2351, 2363, 2362, 2350,
- 2342, 2348, 2347, 2352, 2363, 2369, 2361, 2368, 2344, 2346,
- 2361, 2349, 2346, 2364, 2351, 2348, 2349, 2358, 2350, 2352,
- 2358, 2362, 2367, 2366, 2363, 2362, 2364, 2366, 2371, 2368,
-
- 2369, 2370, 2369, 2361, 2368, 2375, 2373, 2372, 2367, 2374,
- 2364, 2377, 0, 2370, 2373, 2376, 2375, 2376, 2374, 2367,
- 2366, 2372, 2378, 2377, 2371, 2371, 2379, 2380, 2370, 2378,
- 2381, 2382, 2375, 2373, 2372, 2383, 2374, 2384, 2377, 2379,
- 2385, 2388, 2376, 2386, 2389, 2387, 2393, 2390, 2381, 2378,
- 2394, 2386, 2387, 2379, 2380, 2395, 2403, 2381, 2382, 2404,
- 0, 2383, 2383, 2394, 2384, 2388, 2389, 2385, 2388, 2390,
- 2386, 2389, 2387, 2391, 2390, 2391, 2392, 2394, 2393, 2396,
- 2398, 2400, 2395, 2403, 2410, 2404, 2404, 2396, 2392, 2406,
- 2400, 2405, 2398, 2407, 2408, 2413, 2409, 2406, 2410, 0,
-
- 2391, 2414, 2413, 2392, 2411, 2418, 2396, 2398, 2400, 2409,
- 2405, 2410, 2411, 2415, 2414, 2423, 2406, 2417, 2405, 2420,
- 2421, 2419, 2413, 2409, 2417, 2407, 2408, 2418, 2414, 2419,
- 2422, 2411, 2418, 2420, 2421, 2426, 2415, 2423, 2422, 2424,
- 2415, 2425, 2423, 2426, 2417, 2427, 2420, 2421, 2419, 2428,
- 2425, 2429, 2430, 2431, 0, 2432, 2435, 2422, 0, 2433,
- 2437, 2424, 2426, 2436, 0, 2434, 2424, 0, 2425, 2441,
- 2439, 2428, 2427, 2434, 2444, 2431, 2428, 2432, 2430, 2430,
- 2431, 2433, 2432, 2429, 2446, 2436, 2433, 2437, 2435, 2441,
- 2436, 2440, 2434, 2439, 2442, 2443, 2441, 2439, 2446, 2440,
-
- 2445, 2449, 2442, 2443, 2447, 2454, 2444, 2450, 2445, 2452,
- 2450, 2446, 2453, 2451, 0, 2455, 2456, 2452, 2440, 2454,
- 2453, 2442, 2443, 2459, 2459, 2450, 2460, 2445, 2449, 2462,
- 2447, 2447, 2454, 2457, 2450, 2451, 2452, 2450, 2456, 2453,
- 2451, 2455, 2455, 2456, 2463, 2464, 2461, 2457, 2465, 2466,
- 2459, 2467, 2460, 2460, 2461, 2462, 2462, 2466, 2468, 2469,
- 2457, 2470, 2471, 2472, 2477, 2474, 2473, 2464, 2465, 2475,
- 2463, 2463, 2464, 2461, 2473, 2465, 2466, 2475, 2467, 2480,
- 2468, 2481, 2471, 2472, 2469, 2468, 2469, 2474, 2470, 2471,
- 2472, 2477, 2474, 2473, 2478, 2486, 2475, 2482, 2490, 2483,
-
- 2491, 2480, 2478, 2481, 2484, 2482, 2480, 2483, 2481, 2487,
- 2488, 0, 2489, 2493, 2494, 2495, 2503, 2487, 2488, 0,
- 2491, 2478, 2486, 2497, 2482, 2490, 2483, 2491, 2504, 2500,
- 2484, 2484, 0, 0, 0, 2495, 2487, 2488, 2489, 2489,
- 2493, 2494, 2495, 2503, 2501, 2497, 2502, 0, 0, 0,
- 2497, 2500, 2501, 0, 2502, 2504, 2500, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2501, 0, 2502, 2508, 2508, 2508, 2508, 2508, 2508,
- 2508, 2509, 2509, 2509, 2509, 2509, 2509, 2509, 2510, 2510,
- 2510, 2510, 2510, 2510, 2510, 2511, 2511, 2511, 2511, 2511,
-
- 2511, 2511, 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2514,
- 2514, 0, 2514, 2514, 2514, 2514, 2515, 2515, 0, 0,
- 0, 2515, 2515, 2516, 2516, 0, 0, 2516, 0, 2516,
- 2517, 0, 0, 0, 0, 0, 2517, 2518, 2518, 0,
- 0, 0, 2518, 2518, 2519, 0, 0, 0, 0, 0,
- 2519, 2520, 2520, 0, 2520, 2520, 2520, 2520, 2521, 2521,
- 0, 2521, 2521, 2521, 2521, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
-
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507, 2507,
- 2507, 2507
+ 7, 7, 7, 2604, 7, 8, 8, 8, 8, 28,
+ 8, 9, 9, 9, 10, 10, 10, 15, 21, 24,
+
+ 898, 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,
+ 12, 12, 12, 12, 25, 33, 24, 35, 19, 29,
+ 52, 33, 11, 52, 29, 22, 25, 25, 12, 146,
+ 35, 144, 22, 63, 63, 26, 22, 141, 141, 22,
+ 11, 25, 33, 26, 35, 77, 12, 142, 78, 11,
+ 31, 22, 22, 257, 82, 12, 20, 20, 31, 22,
+ 20, 26, 26, 22, 31, 20, 22, 41, 31, 77,
+
+ 26, 78, 77, 68, 20, 78, 31, 31, 82, 41,
+ 20, 82, 257, 20, 20, 31, 68, 20, 79, 125,
+ 81, 31, 20, 27, 41, 31, 27, 81, 80, 140,
+ 68, 20, 23, 27, 143, 27, 23, 143, 79, 23,
+ 70, 23, 23, 80, 32, 79, 27, 81, 32, 64,
+ 27, 125, 84, 27, 23, 80, 38, 90, 38, 23,
+ 27, 84, 27, 23, 32, 90, 23, 38, 23, 23,
+ 32, 32, 36, 38, 86, 32, 36, 85, 59, 84,
+ 148, 148, 38, 38, 90, 38, 36, 86, 89, 36,
+ 54, 32, 34, 89, 38, 85, 34, 92, 36, 36,
+
+ 38, 86, 34, 36, 85, 34, 58, 39, 58, 58,
+ 92, 58, 34, 36, 34, 89, 36, 39, 83, 34,
+ 91, 39, 39, 34, 92, 53, 95, 48, 43, 34,
+ 39, 83, 34, 40, 39, 95, 108, 40, 91, 34,
+ 37, 40, 83, 37, 39, 83, 14, 169, 39, 39,
+ 37, 13, 91, 95, 37, 37, 108, 96, 83, 40,
+ 40, 0, 37, 108, 40, 91, 96, 37, 40, 42,
+ 37, 42, 42, 66, 42, 66, 66, 37, 66, 169,
+ 42, 37, 37, 69, 96, 69, 69, 71, 69, 71,
+ 71, 74, 71, 74, 74, 87, 74, 93, 71, 88,
+
+ 88, 87, 74, 0, 93, 94, 94, 97, 88, 98,
+ 99, 66, 0, 0, 0, 101, 87, 102, 0, 107,
+ 0, 94, 87, 99, 93, 102, 88, 88, 87, 74,
+ 97, 98, 94, 94, 97, 100, 98, 99, 100, 101,
+ 105, 103, 107, 106, 102, 105, 107, 101, 105, 104,
+ 109, 100, 100, 104, 110, 0, 106, 111, 0, 100,
+ 0, 103, 100, 103, 109, 100, 101, 105, 103, 104,
+ 106, 111, 105, 104, 110, 112, 104, 109, 100, 100,
+ 104, 110, 112, 113, 111, 114, 115, 116, 103, 118,
+ 117, 116, 113, 119, 121, 115, 104, 117, 0, 122,
+
+ 119, 0, 112, 127, 231, 0, 121, 122, 114, 116,
+ 113, 124, 114, 115, 116, 118, 118, 117, 116, 120,
+ 119, 121, 126, 127, 123, 124, 122, 128, 120, 127,
+ 127, 231, 129, 130, 120, 123, 128, 126, 124, 123,
+ 0, 130, 120, 129, 133, 132, 120, 131, 123, 126,
+ 127, 123, 134, 131, 128, 120, 132, 139, 135, 129,
+ 130, 120, 123, 136, 137, 133, 123, 134, 155, 133,
+ 139, 133, 132, 137, 131, 138, 0, 0, 136, 134,
+ 135, 0, 155, 0, 139, 135, 0, 153, 0, 0,
+ 136, 137, 133, 145, 154, 145, 145, 138, 145, 159,
+
+ 155, 150, 138, 150, 150, 151, 150, 151, 151, 155,
+ 151, 153, 157, 156, 153, 159, 154, 160, 158, 161,
+ 162, 154, 156, 0, 157, 158, 159, 161, 163, 166,
+ 165, 164, 162, 168, 190, 166, 160, 158, 164, 157,
+ 156, 167, 193, 151, 160, 158, 161, 162, 165, 170,
+ 163, 174, 158, 170, 175, 163, 172, 165, 164, 168,
+ 168, 166, 166, 167, 173, 178, 190, 177, 167, 176,
+ 170, 0, 173, 174, 193, 0, 175, 170, 174, 179,
+ 170, 175, 172, 172, 176, 183, 217, 0, 178, 180,
+ 0, 173, 178, 181, 183, 177, 176, 170, 171, 177,
+
+ 191, 179, 180, 171, 182, 181, 179, 182, 171, 217,
+ 184, 185, 183, 217, 171, 171, 180, 192, 187, 182,
+ 181, 171, 177, 0, 298, 171, 191, 191, 192, 195,
+ 171, 182, 184, 185, 182, 171, 188, 184, 185, 186,
+ 187, 171, 171, 188, 186, 187, 189, 194, 199, 192,
+ 196, 298, 198, 197, 194, 192, 186, 189, 186, 197,
+ 200, 195, 201, 188, 203, 186, 186, 0, 196, 202,
+ 199, 186, 204, 189, 194, 199, 206, 196, 203, 205,
+ 197, 208, 207, 186, 198, 186, 205, 207, 209, 202,
+ 210, 203, 200, 204, 201, 211, 202, 206, 212, 204,
+
+ 208, 215, 209, 206, 214, 213, 205, 219, 208, 207,
+ 212, 214, 210, 211, 218, 209, 213, 210, 216, 218,
+ 220, 220, 211, 215, 221, 212, 222, 216, 215, 220,
+ 223, 214, 213, 222, 224, 225, 226, 228, 227, 219,
+ 232, 218, 233, 229, 237, 216, 227, 220, 220, 230,
+ 243, 236, 244, 222, 224, 223, 221, 223, 229, 237,
+ 234, 224, 235, 232, 239, 227, 235, 225, 226, 228,
+ 229, 237, 232, 236, 233, 230, 230, 234, 236, 240,
+ 238, 241, 243, 239, 244, 234, 240, 234, 238, 235,
+ 232, 239, 242, 245, 246, 247, 242, 248, 249, 251,
+
+ 0, 250, 0, 241, 234, 266, 240, 238, 241, 248,
+ 250, 249, 251, 252, 254, 245, 246, 255, 0, 242,
+ 245, 246, 256, 261, 248, 249, 251, 247, 250, 253,
+ 258, 253, 252, 259, 261, 260, 265, 266, 254, 258,
+ 252, 254, 255, 262, 255, 263, 269, 0, 256, 256,
+ 261, 264, 267, 268, 265, 262, 253, 258, 273, 259,
+ 259, 260, 260, 265, 270, 267, 271, 272, 274, 263,
+ 262, 269, 263, 269, 264, 274, 276, 275, 264, 267,
+ 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,
+ 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, 890, 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, 890, 320, 311, 0, 0, 315, 313, 0,
+ 321, 317, 315, 318, 314, 322, 317, 320, 318, 324,
+ 316, 325, 319, 321, 318, 319, 321, 319, 321, 325,
+ 0, 323, 327, 322, 321, 325, 326, 321, 328, 327,
+ 346, 324, 322, 476, 328, 329, 324, 346, 325, 326,
+ 321, 330, 326, 321, 326, 321, 325, 329, 332, 327,
+ 326, 335, 333, 326, 330, 328, 336, 346, 341, 338,
+
+ 476, 339, 329, 335, 332, 333, 326, 339, 330, 326,
+ 341, 326, 332, 349, 336, 332, 337, 349, 335, 333,
+ 338, 337, 0, 336, 0, 341, 338, 340, 339, 342,
+ 344, 332, 334, 334, 350, 340, 345, 345, 0, 347,
+ 349, 350, 334, 343, 334, 334, 334, 342, 337, 334,
+ 355, 343, 347, 353, 340, 348, 342, 334, 351, 334,
+ 334, 350, 344, 345, 348, 351, 347, 352, 357, 334,
+ 343, 334, 334, 334, 354, 353, 334, 356, 359, 352,
+ 353, 361, 355, 357, 356, 351, 354, 348, 360, 358,
+ 360, 348, 361, 364, 352, 357, 362, 363, 363, 0,
+
+ 364, 354, 358, 365, 356, 0, 366, 368, 361, 367,
+ 359, 371, 369, 0, 365, 360, 358, 366, 362, 372,
+ 364, 0, 367, 362, 0, 370, 363, 377, 381, 0,
+ 365, 372, 368, 366, 368, 369, 367, 371, 371, 369,
+ 370, 374, 373, 375, 376, 377, 372, 380, 370, 379,
+ 374, 378, 370, 373, 377, 376, 375, 376, 382, 383,
+ 381, 385, 376, 388, 382, 380, 384, 370, 374, 373,
+ 375, 376, 379, 378, 380, 387, 379, 388, 378, 392,
+ 383, 389, 376, 385, 376, 382, 383, 386, 385, 384,
+ 388, 390, 393, 384, 386, 391, 0, 397, 394, 396,
+
+ 398, 387, 387, 389, 394, 390, 395, 398, 389, 401,
+ 0, 392, 397, 402, 386, 393, 400, 396, 390, 393,
+ 399, 391, 391, 403, 397, 394, 396, 398, 395, 399,
+ 405, 400, 401, 395, 407, 404, 401, 410, 408, 402,
+ 402, 404, 411, 400, 408, 403, 415, 399, 409, 411,
+ 403, 412, 417, 415, 418, 410, 405, 405, 416, 419,
+ 407, 407, 404, 421, 410, 408, 412, 409, 414, 411,
+ 414, 416, 418, 415, 420, 409, 421, 414, 412, 422,
+ 423, 418, 422, 425, 417, 416, 424, 427, 426, 0,
+ 421, 419, 431, 424, 428, 414, 420, 414, 422, 429,
+
+ 427, 420, 430, 432, 429, 433, 422, 425, 430, 422,
+ 425, 426, 423, 424, 427, 431, 428, 433, 434, 431,
+ 426, 428, 435, 436, 0, 432, 429, 438, 439, 430,
+ 432, 436, 433, 435, 438, 440, 439, 441, 426, 0,
+ 434, 442, 0, 0, 0, 434, 440, 0, 0, 435,
+ 436, 437, 443, 442, 438, 439, 437, 445, 437, 441,
+ 444, 446, 440, 465, 441, 449, 437, 445, 442, 437,
+ 437, 444, 446, 448, 443, 447, 437, 437, 437, 443,
+ 448, 451, 450, 437, 450, 437, 452, 444, 446, 445,
+ 453, 449, 449, 437, 445, 465, 437, 437, 452, 447,
+
+ 448, 457, 447, 437, 454, 453, 455, 451, 451, 450,
+ 456, 458, 459, 452, 455, 456, 454, 453, 460, 461,
+ 459, 464, 467, 457, 463, 0, 466, 468, 457, 458,
+ 460, 454, 477, 455, 467, 468, 479, 456, 458, 459,
+ 461, 466, 463, 469, 464, 460, 461, 470, 464, 467,
+ 472, 463, 471, 466, 468, 473, 469, 475, 474, 470,
+ 478, 471, 481, 480, 477, 0, 483, 484, 479, 473,
+ 469, 491, 0, 472, 470, 478, 475, 472, 480, 471,
+ 482, 0, 473, 474, 475, 474, 481, 478, 483, 481,
+ 480, 484, 482, 483, 484, 485, 487, 486, 485, 488,
+
+ 489, 487, 490, 491, 492, 493, 485, 482, 486, 494,
+ 495, 496, 497, 488, 0, 498, 495, 500, 503, 499,
+ 497, 500, 485, 508, 486, 485, 488, 489, 487, 490,
+ 502, 492, 493, 496, 498, 504, 505, 495, 496, 497,
+ 501, 494, 498, 499, 500, 505, 499, 506, 501, 507,
+ 503, 509, 510, 502, 513, 508, 507, 502, 504, 511,
+ 515, 512, 504, 505, 511, 510, 514, 501, 511, 506,
+ 512, 517, 516, 509, 506, 514, 507, 518, 509, 510,
+ 513, 513, 515, 511, 517, 519, 511, 515, 512, 518,
+ 0, 511, 520, 514, 516, 511, 521, 0, 517, 516,
+
+ 523, 0, 522, 525, 518, 528, 524, 526, 529, 527,
+ 520, 533, 528, 0, 525, 0, 0, 519, 535, 520,
+ 521, 526, 523, 521, 522, 522, 530, 523, 524, 522,
+ 525, 527, 528, 524, 526, 529, 527, 531, 534, 532,
+ 537, 538, 535, 533, 530, 535, 536, 539, 531, 540,
+ 538, 522, 542, 530, 532, 541, 543, 549, 0, 534,
+ 539, 546, 537, 544, 531, 534, 532, 537, 538, 554,
+ 536, 545, 547, 536, 539, 546, 545, 541, 551, 550,
+ 543, 540, 541, 543, 542, 544, 547, 550, 546, 549,
+ 544, 552, 548, 548, 0, 555, 551, 553, 560, 547,
+
+ 548, 554, 557, 545, 556, 551, 550, 557, 0, 558,
+ 555, 0, 553, 552, 559, 562, 559, 0, 552, 548,
+ 548, 553, 555, 560, 553, 560, 556, 0, 0, 561,
+ 0, 556, 569, 782, 557, 558, 558, 561, 563, 553,
+ 562, 559, 562, 564, 565, 568, 566, 563, 567, 570,
+ 569, 571, 564, 565, 566, 567, 561, 574, 572, 569,
+ 571, 570, 573, 575, 782, 563, 572, 0, 568, 574,
+ 564, 565, 568, 566, 576, 567, 570, 573, 571, 577,
+ 583, 578, 576, 579, 574, 572, 581, 577, 580, 573,
+ 578, 582, 579, 585, 581, 575, 584, 580, 589, 586,
+
+ 587, 576, 591, 583, 584, 615, 577, 583, 578, 585,
+ 579, 587, 589, 581, 588, 580, 590, 582, 582, 592,
+ 585, 586, 588, 584, 591, 589, 586, 587, 593, 591,
+ 594, 595, 598, 596, 600, 0, 590, 615, 597, 592,
+ 595, 588, 601, 590, 599, 598, 592, 603, 602, 600,
+ 593, 606, 594, 596, 604, 593, 597, 594, 595, 598,
+ 596, 600, 599, 606, 601, 597, 605, 604, 609, 601,
+ 603, 599, 602, 607, 603, 602, 608, 611, 606, 610,
+ 612, 604, 608, 614, 605, 616, 607, 610, 617, 621,
+ 619, 614, 616, 605, 618, 609, 620, 648, 612, 619,
+
+ 607, 0, 641, 608, 611, 610, 610, 612, 621, 618,
+ 614, 617, 616, 622, 610, 617, 621, 619, 623, 624,
+ 623, 618, 622, 627, 648, 633, 624, 0, 620, 630,
+ 0, 636, 634, 638, 641, 627, 637, 0, 992, 630,
+ 622, 0, 0, 633, 635, 623, 624, 625, 643, 638,
+ 627, 625, 633, 634, 625, 639, 630, 636, 636, 634,
+ 638, 625, 637, 637, 625, 640, 992, 635, 639, 625,
+ 643, 635, 640, 644, 625, 643, 645, 0, 625, 644,
+ 653, 625, 639, 2382, 2382, 645, 649, 646, 625, 646,
+ 650, 625, 640, 642, 642, 0, 642, 651, 647, 642,
+
+ 644, 652, 653, 645, 642, 654, 649, 653, 655, 651,
+ 642, 642, 2382, 649, 646, 656, 650, 650, 657, 642,
+ 642, 642, 647, 642, 651, 647, 642, 652, 652, 654,
+ 655, 642, 654, 657, 659, 655, 658, 642, 642, 660,
+ 656, 661, 656, 662, 658, 657, 660, 663, 664, 661,
+ 666, 665, 667, 669, 668, 0, 673, 659, 674, 666,
+ 664, 659, 662, 658, 665, 675, 660, 667, 661, 672,
+ 662, 683, 676, 663, 663, 664, 668, 666, 665, 667,
+ 669, 668, 670, 677, 678, 679, 680, 670, 673, 675,
+ 674, 672, 675, 676, 679, 681, 672, 682, 683, 676,
+
+ 684, 685, 677, 678, 686, 682, 693, 0, 680, 0,
+ 677, 678, 679, 680, 670, 681, 689, 687, 684, 690,
+ 685, 692, 681, 691, 682, 687, 0, 684, 685, 694,
+ 693, 697, 0, 693, 689, 701, 686, 690, 701, 692,
+ 695, 700, 698, 689, 687, 691, 690, 696, 692, 696,
+ 691, 694, 699, 695, 698, 704, 694, 697, 697, 700,
+ 699, 705, 701, 702, 706, 0, 709, 695, 700, 698,
+ 706, 702, 707, 709, 696, 708, 710, 713, 712, 699,
+ 704, 708, 704, 710, 711, 712, 714, 702, 705, 711,
+ 702, 706, 715, 709, 707, 713, 717, 718, 702, 707,
+
+ 716, 715, 708, 710, 713, 712, 722, 719, 716, 714,
+ 721, 711, 718, 714, 717, 719, 720, 726, 723, 715,
+ 729, 724, 726, 717, 718, 723, 731, 716, 724, 720,
+ 732, 721, 725, 722, 719, 727, 728, 721, 733, 725,
+ 730, 738, 727, 720, 726, 723, 733, 730, 724, 728,
+ 735, 739, 729, 732, 736, 741, 734, 732, 731, 725,
+ 736, 737, 727, 728, 734, 733, 742, 730, 744, 741,
+ 740, 734, 735, 738, 746, 739, 747, 735, 739, 740,
+ 745, 736, 741, 734, 750, 743, 749, 737, 737, 745,
+ 748, 734, 743, 752, 751, 744, 746, 740, 742, 751,
+
+ 752, 746, 748, 747, 753, 756, 754, 745, 756, 749,
+ 750, 750, 743, 749, 754, 757, 759, 748, 760, 0,
+ 752, 751, 764, 759, 760, 0, 753, 0, 757, 762,
+ 763, 753, 756, 754, 764, 765, 768, 765, 766, 767,
+ 0, 0, 757, 759, 0, 760, 761, 769, 761, 764,
+ 0, 767, 761, 763, 761, 762, 762, 763, 768, 761,
+ 769, 766, 765, 768, 761, 766, 767, 770, 773, 771,
+ 761, 772, 770, 761, 769, 761, 776, 777, 774, 761,
+ 773, 761, 771, 777, 775, 780, 761, 779, 774, 776,
+ 783, 761, 781, 784, 772, 773, 771, 778, 772, 770,
+
+ 774, 784, 791, 776, 777, 774, 775, 785, 779, 788,
+ 778, 775, 787, 0, 779, 774, 785, 780, 790, 781,
+ 784, 792, 783, 0, 778, 789, 800, 787, 791, 791,
+ 793, 788, 0, 790, 785, 786, 788, 794, 789, 787,
+ 786, 797, 786, 792, 804, 790, 801, 795, 792, 793,
+ 794, 796, 789, 786, 786, 795, 798, 793, 800, 796,
+ 786, 786, 786, 802, 794, 810, 805, 786, 797, 786,
+ 801, 802, 803, 801, 795, 0, 804, 806, 796, 798,
+ 786, 786, 807, 798, 808, 806, 803, 786, 805, 811,
+ 802, 813, 809, 805, 814, 815, 817, 810, 812, 803,
+
+ 807, 814, 808, 809, 806, 816, 812, 811, 815, 807,
+ 818, 808, 816, 813, 817, 819, 811, 823, 813, 809,
+ 832, 814, 815, 817, 821, 812, 824, 825, 818, 826,
+ 823, 830, 816, 827, 824, 821, 825, 818, 831, 828,
+ 829, 826, 0, 833, 823, 836, 0, 819, 835, 830,
+ 836, 821, 832, 824, 825, 827, 826, 833, 830, 835,
+ 827, 828, 829, 838, 831, 831, 828, 829, 837, 839,
+ 833, 837, 840, 843, 841, 835, 844, 836, 842, 840,
+ 846, 0, 839, 841, 845, 843, 847, 838, 0, 859,
+ 838, 845, 842, 849, 837, 837, 839, 848, 837, 840,
+
+ 843, 841, 0, 848, 850, 842, 851, 852, 844, 0,
+ 847, 845, 846, 847, 853, 849, 857, 851, 856, 858,
+ 849, 859, 854, 860, 848, 0, 850, 857, 863, 852,
+ 861, 850, 868, 851, 852, 862, 853, 854, 864, 856,
+ 858, 853, 867, 857, 862, 856, 858, 864, 861, 854,
+ 860, 865, 863, 866, 869, 863, 867, 861, 0, 865,
+ 866, 870, 862, 871, 868, 864, 873, 874, 875, 867,
+ 877, 876, 0, 882, 883, 873, 878, 881, 865, 877,
+ 866, 886, 884, 870, 0, 871, 869, 880, 870, 876,
+ 871, 879, 881, 873, 884, 875, 880, 877, 876, 874,
+
+ 878, 885, 887, 878, 881, 882, 883, 879, 886, 884,
+ 887, 888, 889, 891, 880, 892, 897, 893, 879, 894,
+ 0, 894, 891, 885, 888, 893, 896, 889, 885, 887,
+ 902, 903, 899, 892, 896, 900, 901, 904, 888, 889,
+ 891, 905, 892, 897, 893, 899, 894, 900, 905, 903,
+ 906, 901, 902, 896, 907, 0, 908, 902, 903, 899,
+ 909, 0, 900, 901, 904, 914, 910, 911, 905, 913,
+ 916, 912, 919, 915, 0, 0, 959, 914, 908, 938,
+ 911, 915, 906, 908, 912, 909, 907, 909, 910, 917,
+ 916, 913, 914, 910, 911, 918, 913, 916, 912, 919,
+
+ 915, 917, 920, 918, 921, 922, 938, 923, 959, 926,
+ 929, 0, 0, 921, 923, 920, 917, 927, 928, 924,
+ 933, 0, 918, 929, 930, 932, 922, 0, 924, 920,
+ 924, 921, 922, 924, 923, 926, 926, 929, 928, 927,
+ 931, 924, 933, 932, 927, 928, 924, 933, 930, 931,
+ 934, 930, 932, 935, 936, 924, 939, 924, 934, 940,
+ 924, 942, 936, 941, 943, 945, 940, 931, 0, 0,
+ 0, 0, 0, 945, 946, 935, 948, 934, 939, 949,
+ 935, 936, 943, 939, 942, 941, 940, 944, 942, 946,
+ 941, 943, 945, 947, 949, 953, 948, 954, 951, 944,
+
+ 950, 946, 952, 948, 951, 947, 949, 961, 950, 954,
+ 955, 952, 956, 957, 944, 960, 953, 955, 964, 956,
+ 947, 963, 953, 962, 954, 951, 961, 950, 960, 952,
+ 962, 957, 969, 964, 961, 968, 965, 955, 966, 956,
+ 957, 965, 960, 963, 967, 964, 966, 971, 963, 968,
+ 962, 972, 973, 986, 0, 974, 0, 967, 969, 969,
+ 0, 971, 968, 0, 0, 966, 975, 0, 965, 972,
+ 977, 967, 970, 976, 971, 970, 970, 982, 972, 978,
+ 970, 974, 974, 979, 973, 986, 970, 980, 975, 981,
+ 970, 976, 977, 975, 970, 982, 981, 977, 983, 970,
+
+ 976, 978, 970, 970, 982, 984, 978, 970, 987, 979,
+ 979, 980, 985, 970, 980, 988, 981, 970, 984, 993,
+ 983, 985, 989, 0, 995, 983, 991, 997, 999, 996,
+ 0, 1014, 984, 999, 0, 993, 997, 988, 1000, 985,
+ 987, 996, 988, 1000, 998, 989, 993, 995, 1001, 989,
+ 990, 995, 991, 991, 997, 990, 996, 990, 1014, 990,
+ 999, 990, 998, 1002, 1004, 1000, 1005, 1003, 990, 0,
+ 1001, 998, 1004, 1006, 1005, 1001, 1002, 990, 1011, 1008,
+ 1010, 1013, 990, 1007, 990, 1003, 990, 1011, 990, 1009,
+ 1002, 1004, 1006, 1005, 1003, 1012, 1007, 1012, 1010, 1015,
+
+ 1006, 1008, 1009, 1013, 1016, 1011, 1008, 1010, 1013, 1017,
+ 1007, 1015, 0, 1019, 1022, 1021, 1009, 1020, 1023, 1024,
+ 1028, 1025, 1012, 1021, 1026, 1023, 1015, 1027, 1029, 1033,
+ 1026, 1016, 1031, 1027, 1017, 1029, 1017, 1019, 1030, 1020,
+ 1019, 1022, 1021, 1025, 1020, 1023, 1024, 1028, 1025, 1034,
+ 1035, 1026, 1036, 1033, 1027, 1029, 1033, 1031, 1037, 1031,
+ 1030, 1038, 1040, 1039, 1041, 1030, 1044, 1042, 1045, 1035,
+ 1046, 1034, 1039, 1047, 1036, 1048, 1034, 1035, 1056, 1036,
+ 1037, 1042, 1051, 1040, 1041, 1037, 1057, 1038, 1038, 1040,
+ 1039, 1041, 1046, 1048, 1042, 1049, 1050, 1046, 1044, 1052,
+
+ 1045, 1054, 1048, 1049, 1058, 1047, 1052, 1055, 1054, 1051,
+ 1056, 1055, 1050, 1060, 1061, 1063, 1064, 1062, 1057, 0,
+ 1061, 0, 1049, 1050, 1062, 1058, 1052, 1061, 1054, 1064,
+ 1063, 1058, 1066, 1067, 1055, 1070, 1068, 1065, 1068, 1069,
+ 1067, 1061, 1063, 1064, 1062, 1060, 1065, 1061, 1069, 1071,
+ 1072, 1073, 1078, 1075, 1072, 1079, 1077, 1070, 1066, 1066,
+ 1067, 1075, 1070, 1068, 1065, 1076, 1069, 1083, 1079, 1080,
+ 1076, 1078, 1081, 1073, 1077, 1081, 1071, 1072, 1073, 1078,
+ 1075, 1080, 1079, 1077, 1081, 1082, 1085, 1084, 1082, 1087,
+ 1086, 1117, 1083, 1088, 1083, 0, 1080, 1076, 0, 1081,
+
+ 1084, 1088, 1081, 1089, 1089, 1087, 1091, 1082, 1095, 1118,
+ 1090, 1098, 1082, 1086, 1084, 1082, 1087, 1086, 1085, 1090,
+ 1088, 1095, 1092, 1117, 1097, 1093, 0, 1096, 1091, 1101,
+ 1089, 1092, 1093, 1091, 1098, 1095, 1096, 1090, 1098, 1099,
+ 1107, 1118, 0, 0, 1101, 1100, 1103, 1102, 1099, 1092,
+ 1097, 1097, 1093, 1100, 1096, 1102, 1101, 1104, 1105, 1103,
+ 1106, 1108, 1107, 1112, 1109, 1111, 1099, 1107, 1106, 1104,
+ 1105, 1110, 1100, 1103, 1102, 1114, 0, 1119, 1116, 1122,
+ 1110, 1108, 1113, 1111, 1104, 1105, 1109, 1106, 1108, 1112,
+ 1112, 1109, 1111, 1115, 1113, 1120, 1114, 0, 1110, 1115,
+
+ 1116, 1123, 1114, 1119, 1119, 1116, 1122, 1124, 1125, 1113,
+ 1126, 1128, 0, 1129, 1127, 0, 0, 1125, 0, 0,
+ 1115, 1120, 1120, 1126, 1123, 1124, 1127, 1131, 1123, 1130,
+ 1132, 1128, 1133, 1142, 1124, 1125, 1130, 1126, 1128, 1129,
+ 1129, 1127, 1134, 1135, 1136, 1133, 1131, 1138, 1135, 1136,
+ 1134, 1137, 1132, 1139, 1131, 1138, 1130, 1132, 1137, 1133,
+ 1140, 1139, 1145, 1141, 1144, 1142, 1143, 1143, 1140, 1134,
+ 1141, 1146, 1144, 1147, 1138, 1135, 1136, 1148, 1137, 1154,
+ 1139, 1147, 1151, 1145, 1149, 1148, 1150, 1140, 1155, 1145,
+ 1141, 1144, 1149, 1143, 1150, 1151, 1152, 1157, 1153, 1156,
+
+ 1147, 1161, 1152, 1146, 1148, 1154, 1154, 1158, 1159, 1151,
+ 1153, 1149, 1155, 1150, 1156, 1155, 1160, 1165, 1162, 1161,
+ 1167, 0, 0, 1152, 1157, 1153, 1156, 1167, 1161, 1158,
+ 1160, 1159, 1162, 1163, 1158, 1159, 1166, 1163, 1168, 1165,
+ 1169, 0, 1175, 1160, 1165, 1162, 1170, 1167, 1166, 1168,
+ 1163, 1175, 1171, 1172, 1174, 1173, 1177, 1178, 1163, 1176,
+ 1163, 1174, 1180, 1166, 1163, 1168, 1176, 1169, 1170, 1175,
+ 1183, 1180, 1184, 1170, 1171, 1185, 1172, 1163, 1173, 1171,
+ 1172, 1174, 1173, 1187, 1178, 1182, 1176, 1189, 1177, 1180,
+ 1190, 1182, 1183, 1191, 1193, 0, 1194, 1183, 1184, 1184,
+
+ 1195, 1190, 1196, 1198, 1191, 1197, 1195, 1185, 1200, 1199,
+ 1187, 1199, 1182, 1201, 1189, 1198, 1202, 1190, 1193, 1204,
+ 1191, 1193, 1194, 1194, 1196, 1203, 1201, 1195, 1205, 1196,
+ 1198, 1197, 1197, 1207, 1200, 1200, 1199, 1203, 1202, 1208,
+ 1201, 1206, 1209, 1202, 1208, 1211, 1204, 1210, 1206, 1212,
+ 1214, 1205, 1203, 1211, 1215, 1205, 1217, 1217, 1209, 1207,
+ 1207, 1220, 1216, 1215, 1217, 1218, 1208, 1224, 1206, 1209,
+ 1210, 1212, 1211, 1221, 1210, 1216, 1212, 1214, 1218, 1222,
+ 1219, 1215, 1219, 1217, 1217, 1224, 1222, 1220, 1220, 1216,
+ 1223, 1225, 1218, 1228, 1224, 1221, 1226, 1223, 1229, 1227,
+
+ 1221, 1230, 1231, 1226, 1234, 0, 1222, 1219, 1230, 1233,
+ 0, 1235, 1236, 1225, 1239, 1228, 1240, 1223, 1225, 1235,
+ 1228, 0, 1233, 1226, 1227, 1244, 1227, 1245, 1230, 1238,
+ 1229, 1234, 1238, 1236, 1231, 1241, 1233, 1242, 1235, 1236,
+ 1239, 1239, 1240, 1240, 1246, 1243, 1242, 1249, 1241, 1244,
+ 0, 1247, 1244, 1245, 1245, 1250, 1238, 1243, 1247, 1246,
+ 1248, 0, 1241, 1248, 1242, 1251, 1252, 1253, 0, 1253,
+ 0, 1246, 1243, 1254, 1255, 1248, 1258, 1250, 1247, 1249,
+ 0, 1256, 1250, 1251, 1248, 1257, 1260, 1248, 1252, 1263,
+ 1248, 1259, 1251, 1252, 1253, 1260, 1261, 1254, 1258, 1264,
+
+ 1254, 1266, 1248, 1258, 1261, 1259, 1255, 1256, 1256, 1262,
+ 1265, 1257, 1257, 1260, 1269, 1267, 1262, 1268, 1259, 1267,
+ 1271, 1263, 0, 1261, 1270, 1274, 1277, 1272, 1273, 1271,
+ 1275, 1264, 1265, 1266, 1272, 1273, 1262, 1265, 1274, 1268,
+ 1277, 1269, 1267, 1275, 1268, 1276, 1270, 1271, 1278, 1279,
+ 1281, 1270, 1274, 1277, 1272, 1273, 1279, 1275, 1280, 1284,
+ 1276, 1282, 1285, 1281, 1291, 1280, 1287, 1282, 1286, 1285,
+ 1288, 1289, 1276, 1291, 0, 1290, 1279, 1281, 1290, 0,
+ 1278, 1292, 1288, 1294, 1289, 1280, 1284, 1301, 1282, 1285,
+ 1286, 1291, 1287, 1287, 1293, 1286, 1296, 1288, 1289, 1292,
+
+ 1298, 1295, 1290, 1294, 1295, 1298, 1293, 1296, 1292, 1300,
+ 1294, 1300, 1298, 1302, 1301, 1303, 1304, 1305, 1307, 1295,
+ 1308, 1293, 1309, 1296, 1306, 1305, 1312, 1298, 1295, 1307,
+ 1309, 1295, 1298, 1313, 1310, 1311, 1300, 1310, 1308, 1303,
+ 1302, 1314, 1303, 1304, 1305, 1307, 1306, 1308, 1314, 1309,
+ 1316, 1306, 1310, 1311, 1317, 1315, 1319, 1322, 1312, 1316,
+ 1313, 1310, 1311, 1318, 1310, 1323, 1322, 1317, 1314, 1315,
+ 1321, 1319, 1321, 1326, 1318, 1324, 1325, 1316, 0, 1327,
+ 1329, 1317, 1315, 1319, 1322, 1335, 1324, 1338, 1337, 1329,
+ 1318, 1323, 1323, 1327, 1325, 1326, 1328, 1321, 1330, 1328,
+
+ 1326, 1331, 1324, 1325, 1330, 1327, 1327, 1329, 1332, 1334,
+ 1331, 1339, 1336, 1332, 1328, 1337, 1340, 1335, 1345, 1338,
+ 1327, 1336, 1334, 1328, 1341, 1330, 1328, 1343, 1331, 1344,
+ 1346, 1347, 0, 1339, 1343, 1350, 1334, 1347, 1339, 1336,
+ 1332, 1351, 1344, 1350, 1346, 1341, 1352, 1353, 1340, 1351,
+ 1345, 1341, 1355, 1354, 1343, 1347, 1344, 1346, 1347, 1358,
+ 1357, 1353, 1350, 1356, 1347, 1352, 1354, 1358, 1351, 1357,
+ 1360, 1359, 1361, 1352, 1353, 0, 1364, 1356, 1366, 1362,
+ 1354, 1374, 1365, 1361, 1355, 1359, 1358, 1357, 1362, 1365,
+ 1356, 1367, 1368, 1369, 1370, 1373, 1371, 1385, 1359, 1361,
+
+ 1371, 1366, 1360, 1364, 1378, 1366, 1362, 1373, 1374, 1365,
+ 1376, 1389, 1370, 1367, 1368, 1369, 1375, 1379, 1367, 1368,
+ 1369, 1370, 1373, 1371, 1375, 1376, 1377, 1380, 1383, 1385,
+ 1379, 1378, 1384, 1381, 1377, 1382, 1383, 1376, 1389, 1384,
+ 1387, 1386, 1388, 1375, 1379, 1391, 1390, 1380, 1381, 1387,
+ 1382, 1395, 1393, 1377, 1380, 1383, 1386, 1394, 1397, 1384,
+ 1381, 1396, 1382, 1388, 1399, 1398, 0, 1387, 1386, 1388,
+ 1390, 1399, 1391, 1390, 1393, 1394, 1396, 1400, 1395, 1393,
+ 1403, 1401, 1400, 1397, 1394, 1397, 1402, 1404, 1396, 1398,
+ 1401, 1399, 1398, 1407, 1405, 1402, 1409, 1411, 1406, 1408,
+
+ 1412, 0, 1403, 1409, 1400, 1404, 1410, 1403, 1401, 1405,
+ 1406, 1414, 1408, 1402, 1404, 1407, 1413, 1408, 1410, 1414,
+ 1407, 1405, 1413, 1409, 1411, 1406, 1408, 1415, 1416, 1426,
+ 1417, 1418, 1412, 1410, 1415, 1419, 1421, 1420, 1414, 1408,
+ 1422, 1423, 1424, 1413, 1420, 1429, 1422, 1423, 1425, 1427,
+ 1431, 1430, 1434, 1416, 1415, 1416, 1417, 1417, 1418, 1433,
+ 1430, 1426, 1419, 1421, 1420, 1435, 1436, 1422, 1423, 1424,
+ 1432, 1425, 1432, 1427, 1438, 1425, 1427, 1429, 1430, 1434,
+ 1440, 1438, 1431, 1433, 1445, 1443, 1433, 1437, 1437, 1437,
+ 1443, 1435, 1435, 1439, 1437, 1444, 1441, 1432, 1436, 1448,
+
+ 1439, 1438, 1437, 1441, 0, 1452, 1447, 1449, 1444, 1445,
+ 1446, 1445, 1440, 1451, 1437, 1437, 1437, 1443, 1447, 1451,
+ 1439, 1437, 1444, 1441, 1454, 1449, 1446, 1457, 1450, 1453,
+ 1453, 1448, 1452, 1447, 1449, 1450, 1455, 1446, 1458, 1456,
+ 1451, 1461, 1463, 1455, 1456, 1464, 1465, 1466, 1463, 1469,
+ 1454, 1454, 1467, 1457, 1457, 1450, 1453, 0, 1465, 1461,
+ 1468, 1468, 1473, 1455, 1474, 1458, 1456, 1466, 1461, 1463,
+ 1467, 1471, 1464, 1465, 1466, 1469, 1469, 1470, 1470, 1467,
+ 1476, 1475, 1471, 1477, 1473, 1478, 1479, 1468, 1475, 1473,
+ 0, 1481, 1480, 1486, 1482, 1483, 1474, 1484, 1471, 1485,
+
+ 1476, 1482, 1486, 1483, 1470, 1487, 1487, 1476, 1475, 1481,
+ 1488, 1489, 1484, 1479, 1480, 1477, 0, 1478, 1481, 1480,
+ 1486, 1482, 1483, 1485, 1484, 1492, 1485, 1490, 1491, 0,
+ 1496, 1494, 1487, 1499, 1490, 1502, 1488, 1488, 1494, 1495,
+ 1491, 1492, 1496, 1489, 1500, 1498, 1501, 1495, 1492, 1505,
+ 1507, 1503, 1492, 1498, 1490, 1491, 1499, 1496, 1494, 1510,
+ 1499, 1506, 1502, 1507, 1501, 1500, 1495, 1506, 1492, 1511,
+ 1504, 1500, 1498, 1501, 1503, 1504, 1505, 1507, 1503, 1513,
+ 1508, 1512, 1509, 1514, 1513, 1515, 1504, 1508, 1506, 1509,
+ 1515, 1510, 1516, 1517, 0, 1513, 1511, 1504, 1520, 1518,
+
+ 1518, 1519, 1504, 0, 1512, 1522, 1513, 1508, 1512, 1509,
+ 1514, 1513, 1523, 1525, 1524, 1525, 1519, 1515, 1526, 1528,
+ 1522, 1529, 1527, 0, 1516, 1517, 1518, 1527, 1519, 1524,
+ 1520, 1531, 1522, 1533, 1532, 1523, 1529, 1536, 1535, 1523,
+ 1525, 1524, 1532, 1537, 1538, 1539, 1531, 1540, 1529, 1527,
+ 1526, 1528, 1539, 1541, 1542, 1533, 1543, 1544, 1531, 0,
+ 1533, 1532, 1535, 1536, 1536, 1535, 1546, 1548, 1553, 1554,
+ 1537, 1538, 1539, 0, 1541, 1544, 1542, 1543, 0, 1540,
+ 1541, 1542, 1549, 1543, 1544, 1551, 1552, 1555, 1546, 1556,
+ 1553, 1548, 1558, 1546, 1548, 1553, 1554, 1549, 1557, 1559,
+
+ 1551, 1552, 1562, 1560, 1563, 1555, 1559, 1565, 1561, 1549,
+ 1562, 1556, 1551, 1552, 1555, 1564, 1556, 1561, 1576, 1558,
+ 1557, 1560, 1568, 1566, 0, 1557, 1559, 1563, 1570, 1562,
+ 1560, 1563, 1569, 1568, 1571, 1561, 1566, 1564, 1572, 1565,
+ 1573, 1569, 1564, 1583, 1581, 1576, 1570, 1578, 1568, 1568,
+ 1566, 1579, 1571, 1572, 1573, 1570, 1581, 1582, 1578, 1569,
+ 1568, 1571, 1579, 1584, 1586, 1572, 1585, 1573, 1587, 1588,
+ 1582, 1581, 1591, 1584, 1578, 1583, 1592, 1590, 1579, 1591,
+ 1593, 1594, 0, 0, 1582, 1595, 1596, 1594, 1588, 1586,
+ 1584, 1586, 1585, 1585, 1597, 1587, 1588, 1590, 1593, 1591,
+
+ 1595, 1596, 1592, 1592, 1590, 1598, 1598, 1593, 1594, 1597,
+ 1599, 1602, 1595, 1596, 1600, 1603, 1604, 1605, 1602, 1613,
+ 0, 1597, 1599, 1607, 1606, 1615, 1605, 1600, 1613, 1609,
+ 1603, 1606, 1598, 1608, 0, 1600, 1609, 1599, 1602, 1611,
+ 1612, 1600, 1603, 1604, 1605, 1615, 1613, 1607, 1614, 1618,
+ 1607, 1606, 1615, 1617, 1600, 1608, 1609, 1621, 1624, 1620,
+ 1608, 1611, 1622, 1622, 0, 1612, 1611, 1612, 1623, 1625,
+ 1614, 1617, 1620, 1627, 1618, 1614, 1618, 1626, 1629, 1630,
+ 1617, 1628, 1627, 1624, 1621, 1624, 1620, 1636, 1628, 1622,
+ 1623, 1625, 1632, 1631, 1634, 1623, 1625, 1637, 1644, 1626,
+
+ 1627, 1630, 1634, 1635, 1626, 1638, 1630, 1631, 1628, 1640,
+ 1629, 1632, 1641, 1642, 1636, 1639, 1635, 1638, 1643, 1632,
+ 1631, 1634, 1639, 1637, 1637, 1644, 1643, 1650, 1645, 1648,
+ 1635, 1646, 1638, 1647, 1641, 1652, 1654, 1643, 1642, 1641,
+ 1642, 1640, 1639, 1645, 1651, 1643, 1649, 1648, 1653, 1649,
+ 1651, 1654, 1650, 1643, 1650, 1645, 1648, 1646, 1646, 1647,
+ 1647, 1657, 1652, 1654, 1649, 1656, 1653, 1658, 1660, 1662,
+ 1661, 1651, 1663, 1649, 1664, 1653, 1649, 1661, 1662, 0,
+ 1656, 1663, 1660, 1657, 1667, 1664, 1668, 1666, 1657, 1658,
+ 0, 1670, 1656, 1674, 1658, 1660, 1662, 1661, 1672, 1663,
+
+ 0, 1664, 1666, 1673, 1670, 1674, 1667, 1673, 1668, 1676,
+ 1677, 1667, 1670, 1668, 1666, 1675, 1678, 1675, 1670, 1672,
+ 1674, 1679, 1681, 0, 1680, 1672, 1683, 1676, 1682, 1685,
+ 1673, 1670, 1680, 1684, 1678, 1686, 1676, 1677, 1684, 1687,
+ 1683, 1688, 1675, 1678, 1692, 1681, 1694, 1689, 1679, 1681,
+ 1682, 1680, 1695, 1683, 1689, 1682, 1693, 0, 1696, 1699,
+ 1688, 1685, 1697, 1687, 1694, 1684, 1687, 1686, 1688, 1698,
+ 1693, 1692, 1700, 1694, 1689, 1701, 1702, 1697, 1698, 1695,
+ 1703, 1693, 1693, 1693, 1696, 1696, 1705, 1707, 1706, 1697,
+ 1709, 1699, 1709, 0, 1700, 1706, 1698, 1693, 1702, 1700,
+
+ 1710, 1711, 1701, 1702, 1712, 1711, 1716, 1713, 1693, 1705,
+ 1707, 1714, 1703, 1705, 1707, 1706, 1712, 1709, 1717, 1715,
+ 1714, 1719, 1710, 1718, 1720, 1720, 1723, 1710, 1711, 1713,
+ 1715, 1712, 1721, 1716, 1713, 1718, 1722, 0, 1714, 1725,
+ 1721, 1717, 1814, 1719, 1726, 1717, 1715, 1725, 1719, 1730,
+ 1718, 1720, 1726, 1723, 1728, 1730, 1727, 1728, 1722, 1721,
+ 1727, 1729, 1731, 1722, 1732, 1735, 1725, 1734, 1737, 1729,
+ 1732, 1726, 1736, 1738, 1814, 1740, 1730, 1731, 1741, 1734,
+ 1742, 1728, 1737, 1727, 1739, 1743, 1738, 1745, 1729, 1731,
+ 1744, 1732, 1735, 1747, 1734, 1737, 1736, 1743, 1739, 1736,
+
+ 1738, 1740, 1740, 1746, 1744, 1741, 1746, 1742, 1751, 1748,
+ 1750, 1739, 1743, 1745, 1745, 1751, 1752, 1744, 1754, 1753,
+ 1747, 1746, 1755, 1752, 1757, 1759, 1760, 1761, 1765, 1758,
+ 1746, 1748, 1750, 1746, 1753, 1751, 1748, 1750, 1758, 1756,
+ 1761, 1764, 1762, 1752, 1767, 1754, 1753, 1756, 1770, 1755,
+ 1762, 1757, 1759, 1760, 1761, 1765, 1758, 1766, 1768, 1769,
+ 0, 1771, 1772, 1764, 0, 1766, 1756, 1768, 1764, 1762,
+ 1773, 1767, 1770, 1775, 1776, 1770, 1771, 1782, 1773, 1774,
+ 1769, 1775, 1780, 1778, 1766, 1768, 1769, 1771, 1771, 1772,
+ 1778, 1774, 1779, 1781, 1780, 1787, 1779, 1773, 1789, 1783,
+
+ 1775, 1776, 1784, 1771, 1782, 1785, 1774, 1783, 1788, 1780,
+ 1778, 1790, 1791, 1791, 1784, 1788, 1781, 1785, 1789, 1779,
+ 1781, 1792, 1787, 1793, 1790, 1789, 1783, 1794, 1796, 1784,
+ 1800, 1797, 1785, 0, 1798, 1788, 0, 1802, 1790, 1791,
+ 1799, 1793, 1799, 1796, 1800, 1801, 1803, 1792, 1792, 1804,
+ 1793, 1801, 1794, 1797, 1794, 1796, 1798, 1800, 1797, 1802,
+ 1806, 1798, 1805, 1807, 1802, 1807, 1808, 1799, 1803, 0,
+ 1809, 1804, 1801, 1803, 1805, 1815, 1804, 1810, 1811, 1813,
+ 1808, 1812, 1806, 1819, 1817, 1821, 1820, 1806, 1809, 1805,
+ 1807, 1817, 1813, 1808, 0, 1810, 1811, 1809, 1815, 1812,
+
+ 1827, 1819, 1815, 0, 1810, 1811, 1813, 1822, 1812, 1825,
+ 1819, 1817, 1820, 1820, 1823, 1822, 1823, 1821, 1826, 1828,
+ 1825, 1823, 1829, 1831, 1832, 1833, 1837, 1827, 0, 1826,
+ 1836, 1828, 1834, 1822, 1822, 1832, 1825, 1833, 1831, 1840,
+ 1829, 1823, 1822, 1823, 1845, 1826, 1828, 1834, 1837, 1829,
+ 1831, 1832, 1833, 1837, 1836, 1838, 1839, 1836, 1842, 1834,
+ 1843, 1846, 1838, 1847, 1844, 1848, 1840, 0, 1849, 1852,
+ 0, 1839, 1853, 1850, 1855, 0, 1845, 1852, 1848, 1856,
+ 1857, 1868, 1838, 1839, 1843, 1842, 1844, 1843, 1850, 1851,
+ 1847, 1844, 1848, 1846, 1849, 1849, 1852, 1855, 1853, 1853,
+
+ 1850, 1855, 1851, 1856, 1858, 1859, 1856, 1857, 1862, 1864,
+ 1860, 1863, 1859, 1868, 1866, 1862, 1851, 1865, 1863, 1870,
+ 1867, 1866, 1864, 1872, 1869, 1874, 1858, 1873, 1870, 1875,
+ 1886, 1858, 1859, 1860, 1872, 1862, 1864, 1860, 1863, 1876,
+ 1865, 1866, 1867, 1880, 1865, 1869, 1870, 1867, 1875, 1873,
+ 1872, 1869, 1879, 1881, 1873, 1883, 1875, 1874, 1882, 1882,
+ 1885, 1887, 1886, 1888, 1876, 1879, 1876, 1892, 1889, 1880,
+ 1880, 1897, 1899, 1901, 1898, 1894, 1887, 1881, 1903, 1879,
+ 1881, 1883, 1883, 1885, 1894, 1882, 1889, 1885, 1887, 1904,
+ 1888, 1907, 1905, 1897, 1892, 1889, 1898, 1909, 1897, 1899,
+
+ 1901, 1898, 1894, 1905, 1906, 1909, 1910, 1911, 1913, 1906,
+ 1903, 1914, 1918, 1907, 1915, 1904, 1904, 1916, 1907, 1905,
+ 1919, 1910, 1922, 1915, 1909, 1923, 1913, 1920, 1919, 1916,
+ 1926, 1906, 0, 1910, 1911, 1913, 1920, 1924, 1925, 1918,
+ 1927, 1915, 1930, 1914, 1916, 1928, 1929, 1919, 1922, 1922,
+ 1931, 1932, 1923, 1927, 1920, 1926, 1933, 1926, 1928, 1924,
+ 1925, 1934, 1935, 1999, 1924, 1925, 1936, 1927, 1929, 1930,
+ 1937, 1935, 1928, 1929, 1939, 1938, 1934, 1931, 1932, 1940,
+ 1941, 1946, 0, 1933, 1942, 1943, 1948, 0, 1934, 1935,
+ 1938, 1945, 1936, 1936, 1944, 1999, 1937, 1937, 1945, 1942,
+
+ 0, 1939, 1938, 1946, 1949, 1943, 1940, 1941, 1946, 1944,
+ 1947, 1942, 1943, 1948, 1950, 1950, 1951, 1947, 1945, 1952,
+ 1957, 1944, 1949, 1951, 1953, 1954, 1956, 1953, 1955, 1961,
+ 1958, 1949, 1957, 1952, 1961, 1962, 1960, 1947, 1954, 1962,
+ 1963, 1950, 1958, 1951, 1956, 1960, 1952, 1957, 1964, 1965,
+ 1966, 1953, 1954, 1956, 1955, 1955, 1961, 1958, 1967, 1968,
+ 1973, 1964, 1962, 1960, 1963, 1969, 1974, 1963, 1972, 1973,
+ 1975, 1965, 1966, 1977, 1978, 1964, 1965, 1966, 1975, 1979,
+ 1977, 1980, 1974, 1978, 1979, 1967, 1968, 1973, 1980, 1981,
+ 1983, 1969, 1969, 1974, 1972, 1972, 1982, 1975, 1984, 1983,
+
+ 1977, 1978, 1986, 1982, 1987, 1988, 1979, 1981, 1980, 1989,
+ 1990, 1993, 1994, 1991, 1992, 1997, 1981, 1983, 1989, 1990,
+ 1993, 1994, 1987, 1982, 1984, 1984, 1992, 1996, 1998, 1986,
+ 0, 1987, 1988, 1991, 1995, 1996, 1989, 1990, 1993, 1994,
+ 1991, 1992, 1997, 2000, 2001, 1995, 2003, 2006, 0, 2002,
+ 2007, 2004, 2000, 2005, 1996, 1998, 2001, 2002, 2004, 2008,
+ 2005, 1995, 2009, 2010, 2012, 2014, 0, 0, 2003, 2006,
+ 2000, 2001, 2012, 2003, 2006, 2007, 2002, 2007, 2004, 2020,
+ 2005, 2015, 2021, 2014, 2022, 2016, 2008, 2009, 2015, 2009,
+ 2010, 2012, 2014, 2016, 2019, 2023, 2022, 2024, 2027, 2029,
+
+ 2025, 2019, 2030, 2020, 2023, 2028, 2020, 2032, 2015, 2021,
+ 2027, 2022, 2016, 2033, 2032, 2034, 2030, 2037, 2036, 2039,
+ 2033, 2019, 2023, 2025, 2024, 2027, 2029, 2025, 2028, 2030,
+ 2038, 2040, 2028, 2036, 2032, 2041, 0, 2046, 2038, 2055,
+ 2033, 2048, 2034, 2047, 2037, 2036, 2039, 2049, 2047, 2050,
+ 2054, 2056, 2055, 2040, 0, 2048, 2057, 2038, 2040, 2065,
+ 2062, 2049, 2041, 2046, 2046, 2059, 2055, 2050, 2048, 2061,
+ 2047, 2058, 2054, 2056, 2049, 2057, 2050, 2054, 2056, 2058,
+ 2063, 2061, 2062, 2057, 2059, 2064, 2065, 2062, 2066, 2067,
+ 2069, 2068, 2059, 2071, 2070, 0, 2061, 2064, 2058, 2069,
+
+ 2072, 2075, 2063, 2070, 2073, 2076, 2077, 2063, 2074, 2067,
+ 2080, 2085, 2064, 2068, 2081, 2066, 2067, 2069, 2068, 2086,
+ 2074, 2070, 2072, 2075, 2080, 2071, 2083, 2072, 2075, 2082,
+ 2073, 2073, 2076, 2077, 2082, 2074, 2084, 2080, 2081, 2088,
+ 2087, 2081, 2086, 2085, 2089, 2090, 2086, 2091, 2083, 2094,
+ 2092, 0, 0, 2083, 0, 0, 2089, 2088, 2084, 2096,
+ 2097, 2082, 2087, 2084, 2090, 2092, 2088, 2087, 2102, 2091,
+ 2098, 2089, 2090, 2094, 2091, 2099, 2094, 2092, 2100, 2098,
+ 2101, 2096, 2097, 2103, 2106, 2109, 2096, 2097, 0, 2099,
+ 2111, 2108, 2106, 2107, 2102, 2102, 2100, 2098, 2101, 2108,
+
+ 2107, 2103, 2099, 2112, 2113, 2100, 2110, 2101, 2111, 2119,
+ 2103, 2106, 2109, 2114, 2110, 2112, 2116, 2111, 2108, 2118,
+ 2107, 2114, 2120, 2121, 0, 2122, 2118, 0, 2116, 2123,
+ 2112, 2113, 2119, 2110, 2126, 2125, 2119, 2128, 0, 2132,
+ 2114, 2133, 2129, 2116, 2122, 2130, 2118, 2134, 2126, 2136,
+ 2121, 2123, 2122, 2125, 2120, 2129, 2123, 2130, 2138, 2144,
+ 2128, 2126, 2125, 2140, 2128, 2132, 2132, 2143, 2133, 2129,
+ 2140, 2142, 2130, 2145, 2134, 2146, 2136, 2147, 2142, 2148,
+ 2149, 2151, 2152, 2150, 2153, 2138, 2144, 2154, 2155, 2156,
+ 2140, 2152, 0, 2143, 2143, 2150, 2159, 2153, 2142, 2146,
+
+ 2145, 2159, 2146, 2163, 2147, 2148, 2148, 2149, 2151, 2152,
+ 2150, 2153, 2156, 2160, 2161, 2155, 2156, 2160, 2162, 2154,
+ 2164, 2161, 2167, 2166, 2163, 2162, 2170, 2165, 2159, 2165,
+ 2163, 2172, 2171, 2174, 0, 2174, 0, 2175, 0, 0,
+ 2160, 2161, 2181, 2177, 0, 2162, 2166, 0, 2170, 2167,
+ 2166, 2171, 2164, 2170, 2165, 2172, 2176, 2176, 2172, 2171,
+ 2174, 2175, 2178, 2180, 2175, 2177, 2176, 2179, 2183, 2181,
+ 2177, 2178, 2182, 2184, 2179, 2185, 2180, 2186, 0, 2187,
+ 2182, 2184, 2188, 2176, 2176, 2189, 2191, 2183, 2190, 2178,
+ 2180, 2192, 2192, 2191, 2179, 2183, 2189, 0, 2193, 2182,
+
+ 2184, 2185, 2185, 2186, 2186, 2187, 2187, 2194, 2188, 2188,
+ 2190, 2197, 2189, 2191, 2194, 2190, 2193, 2195, 2192, 2198,
+ 2199, 2201, 2202, 2203, 2195, 2193, 2207, 2205, 2208, 2199,
+ 2204, 2212, 0, 2209, 2194, 2207, 2212, 2219, 2197, 2211,
+ 2210, 0, 2202, 2198, 2195, 2205, 2198, 2199, 2201, 2202,
+ 2203, 2211, 2204, 2207, 2205, 2208, 2209, 2204, 2210, 2213,
+ 2209, 2214, 2220, 2212, 2219, 2230, 2211, 2210, 2221, 2224,
+ 2226, 2224, 2228, 2213, 2231, 2232, 2234, 2237, 2228, 2214,
+ 2220, 2235, 2238, 2221, 2235, 2226, 2213, 2230, 2214, 2220,
+ 2239, 2245, 2230, 2232, 2240, 2221, 2224, 2226, 2234, 2228,
+
+ 2231, 2231, 2232, 2234, 2237, 2243, 2241, 2235, 2235, 2238,
+ 2242, 2235, 2240, 2241, 2246, 2248, 2247, 2239, 2242, 2249,
+ 2250, 2240, 2251, 2245, 2253, 2252, 2250, 2243, 2249, 0,
+ 2255, 2257, 2243, 2241, 2252, 2259, 2246, 2242, 2247, 2257,
+ 2260, 2246, 2248, 2247, 2251, 2261, 2249, 2250, 2254, 2251,
+ 2254, 2258, 2252, 2262, 2260, 2263, 2253, 2255, 2257, 2261,
+ 2264, 2265, 2259, 2258, 2266, 2268, 2268, 2260, 2267, 2265,
+ 2269, 2264, 2261, 2263, 2272, 2254, 2262, 2270, 2258, 2273,
+ 2262, 2277, 2263, 2266, 2281, 2270, 2284, 2264, 2265, 2278,
+ 2267, 2266, 2268, 2275, 2284, 2267, 2279, 2269, 2282, 2275,
+
+ 2278, 2272, 2286, 2283, 2270, 2282, 2273, 2283, 2277, 2287,
+ 2289, 2281, 2290, 2284, 2291, 2289, 2278, 2292, 2279, 2293,
+ 2275, 2297, 2287, 2279, 2294, 2282, 2293, 2295, 2286, 2286,
+ 2283, 2296, 2294, 2298, 2303, 2292, 2287, 2289, 2296, 2290,
+ 2299, 2291, 2295, 2304, 2292, 2305, 2293, 2306, 2297, 2303,
+ 2304, 2294, 2307, 2308, 2295, 2309, 2311, 2298, 2296, 2312,
+ 2298, 2303, 2314, 2313, 2309, 2316, 2299, 2299, 2318, 2321,
+ 2304, 2313, 2319, 2322, 2306, 0, 2307, 2305, 2311, 2307,
+ 2319, 2312, 2309, 2311, 2323, 2308, 2312, 2315, 2315, 2324,
+ 2313, 2325, 2316, 2326, 2314, 2318, 2321, 2315, 2327, 2319,
+
+ 2322, 2328, 2324, 2331, 2329, 2336, 2323, 2337, 2339, 2334,
+ 2336, 2323, 2341, 2325, 2315, 2315, 2324, 2334, 2325, 2341,
+ 2326, 2343, 2342, 2344, 2340, 2327, 2329, 2348, 2328, 2347,
+ 2331, 2329, 2336, 2337, 2337, 2339, 2334, 2340, 2349, 2341,
+ 2342, 2350, 2347, 2356, 2351, 2344, 2353, 2354, 2343, 2342,
+ 2344, 2340, 2364, 2353, 2354, 2355, 2347, 2349, 2356, 2348,
+ 2357, 2359, 2361, 2364, 2360, 2349, 2351, 2373, 2350, 2361,
+ 2356, 2351, 2360, 2353, 2354, 2363, 2362, 2355, 2367, 2364,
+ 2359, 2357, 2355, 2362, 2363, 2365, 2365, 2357, 2359, 2361,
+ 2366, 2360, 2370, 2374, 2373, 2365, 2366, 2379, 2375, 2370,
+
+ 2367, 2381, 2363, 2362, 2383, 2367, 2385, 2386, 2389, 2387,
+ 2390, 0, 2365, 2365, 2392, 2391, 2386, 2366, 2396, 2370,
+ 2374, 2375, 2387, 2394, 2379, 2375, 2392, 2383, 2381, 2395,
+ 2390, 2383, 2394, 2385, 2386, 2389, 2387, 2390, 2391, 2397,
+ 2398, 2392, 2391, 2399, 2396, 2396, 2400, 2395, 2402, 2405,
+ 2394, 2401, 2403, 2402, 2401, 2399, 2395, 0, 2404, 2406,
+ 2404, 2405, 2410, 2413, 2416, 2406, 2397, 2398, 2400, 2401,
+ 2399, 2407, 2408, 2400, 2409, 2417, 2405, 2418, 2401, 2420,
+ 2402, 2401, 2409, 2421, 2403, 2404, 2406, 2423, 2424, 2410,
+ 2413, 2416, 2425, 2407, 2408, 2426, 2427, 2420, 2407, 2408,
+
+ 2424, 2409, 2417, 2428, 2418, 2432, 2420, 2425, 2427, 2431,
+ 2421, 2433, 2433, 2434, 2423, 2424, 2435, 2437, 2431, 2425,
+ 2438, 2426, 2426, 2427, 2439, 2435, 2440, 2441, 0, 2432,
+ 2428, 2449, 2432, 2442, 2443, 2441, 2431, 2439, 2433, 2434,
+ 2434, 2437, 2442, 2435, 2437, 2443, 2452, 2453, 2440, 2454,
+ 2452, 2439, 2438, 2440, 2441, 2449, 2454, 2460, 2449, 2455,
+ 2442, 2443, 2457, 2458, 2463, 2459, 2457, 2462, 2461, 2464,
+ 2453, 0, 2455, 2452, 2453, 2471, 2454, 2464, 2463, 2458,
+ 2461, 2467, 2460, 2467, 2460, 2472, 2455, 2459, 2465, 2457,
+ 2458, 2463, 2459, 2462, 2462, 2461, 2464, 2465, 2466, 2468,
+
+ 2469, 2470, 2471, 2472, 2473, 0, 2474, 2469, 2467, 2466,
+ 2475, 2468, 2472, 2476, 2470, 2465, 2477, 2479, 0, 2482,
+ 2480, 2482, 2478, 2481, 2477, 2466, 2468, 2469, 2470, 2478,
+ 2484, 2473, 2474, 2474, 2486, 0, 2483, 2475, 2485, 2498,
+ 2476, 2479, 2480, 2477, 2479, 2481, 2482, 2480, 2483, 2478,
+ 2481, 2485, 2487, 2494, 2489, 2491, 2499, 2495, 2496, 2497,
+ 2487, 2486, 2484, 2483, 2491, 2485, 2489, 2497, 2502, 2506,
+ 0, 2498, 2509, 0, 2500, 2501, 2502, 2496, 2505, 2487,
+ 2494, 2489, 2491, 2495, 2495, 2496, 2497, 2500, 2499, 2501,
+ 2504, 2505, 2506, 2508, 2509, 2502, 2506, 2504, 2510, 2509,
+
+ 2508, 2500, 2501, 2513, 2511, 2505, 2510, 2512, 0, 2518,
+ 2514, 2513, 2521, 2515, 2516, 2520, 2517, 2504, 2511, 2525,
+ 2508, 2512, 2519, 2516, 2517, 2510, 2522, 2525, 2523, 2524,
+ 2513, 2511, 2514, 2526, 2512, 2515, 2518, 2514, 2521, 2521,
+ 2515, 2516, 2527, 2517, 2519, 2528, 2525, 2520, 2522, 2519,
+ 2523, 2524, 2530, 2522, 2531, 2523, 2524, 2532, 2533, 2534,
+ 2535, 2538, 2531, 2536, 2527, 2526, 2533, 2534, 2537, 2527,
+ 2540, 2536, 2528, 2541, 2542, 2530, 2541, 2532, 2546, 2530,
+ 0, 2531, 2537, 0, 2532, 2533, 2534, 2538, 2538, 2547,
+ 2536, 2541, 2535, 2545, 2543, 2537, 2542, 2540, 2544, 2548,
+
+ 2541, 2542, 2543, 2541, 2546, 2546, 2544, 2545, 2550, 2550,
+ 2551, 2547, 2553, 2548, 2552, 2557, 2547, 2554, 2555, 2558,
+ 2545, 2543, 2552, 2557, 2560, 2544, 2548, 2556, 2559, 2561,
+ 0, 0, 2562, 2563, 2568, 2550, 2551, 2551, 2553, 2553,
+ 2555, 2552, 2557, 2554, 2554, 2555, 2558, 2556, 2565, 2560,
+ 2559, 2560, 2562, 2563, 2556, 2559, 2561, 2564, 2566, 2562,
+ 2563, 2568, 0, 2569, 2571, 2564, 2566, 2572, 2573, 2574,
+ 2565, 2569, 2575, 2577, 2578, 2565, 2573, 2574, 2580, 2579,
+ 2581, 2584, 2578, 2582, 2564, 2566, 2571, 2579, 2585, 2572,
+ 2569, 2571, 2586, 2594, 2572, 2573, 2574, 0, 2575, 2575,
+
+ 2577, 2578, 2588, 2582, 2580, 2580, 2579, 2581, 2584, 2591,
+ 2582, 2595, 2586, 2592, 2593, 2585, 0, 0, 0, 2586,
+ 2594, 2592, 2593, 0, 2588, 0, 0, 0, 0, 2588,
+ 0, 2591, 0, 0, 0, 0, 2591, 0, 2595, 0,
+ 2592, 2593, 2599, 2599, 2599, 2599, 2599, 2599, 2599, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2601, 2601, 2601, 2601,
+ 2601, 2601, 2601, 2602, 2602, 2602, 2602, 2602, 2602, 2602,
+ 2603, 2603, 2603, 2603, 2603, 2603, 2603, 2605, 2605, 0,
+ 2605, 2605, 2605, 2605, 2606, 2606, 0, 0, 0, 2606,
+ 2606, 2607, 2607, 0, 0, 2607, 0, 2607, 2608, 0,
+
+ 0, 0, 0, 0, 2608, 2609, 2609, 0, 0, 0,
+ 2609, 2609, 2610, 0, 0, 0, 0, 0, 2610, 2611,
+ 2611, 0, 2611, 2611, 2611, 2611, 2612, 2612, 0, 2612,
+ 2612, 2612, 2612, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598,
+ 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598, 2598
+
} ;
static yy_state_type yy_last_accepting_state;
@@ -3066,7 +3154,7 @@ static void config_end_include(void)
#define YY_NO_INPUT 1
#endif
-#line 3068 "<stdout>"
+#line 3156 "<stdout>"
#define INITIAL 0
#define quotedstring 1
@@ -3289,7 +3377,7 @@ YY_DECL
{
#line 206 "util/configlexer.lex"
-#line 3291 "<stdout>"
+#line 3379 "<stdout>"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -3322,13 +3410,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 >= 2508 )
+ if ( yy_current_state >= 2599 )
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] != 7166 );
+ while ( yy_base[yy_current_state] != 7434 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -3513,1057 +3601,1102 @@ YY_RULE_SETUP
case 32:
YY_RULE_SETUP
#line 241 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSTEMD) }
+{ YDVAR(1, VAR_ADDITIONAL_TLS_PORT) }
YY_BREAK
case 33:
YY_RULE_SETUP
#line 242 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_DAEMONIZE) }
+{ YDVAR(1, VAR_ADDITIONAL_TLS_PORT) }
YY_BREAK
case 34:
YY_RULE_SETUP
#line 243 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_USE_SYSTEMD) }
YY_BREAK
case 35:
YY_RULE_SETUP
#line 244 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_DO_DAEMONIZE) }
YY_BREAK
case 36:
YY_RULE_SETUP
#line 245 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
+{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 37:
YY_RULE_SETUP
#line 246 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
+{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 38:
YY_RULE_SETUP
#line 247 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_RCVBUF) }
+{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
YY_BREAK
case 39:
YY_RULE_SETUP
#line 248 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_SNDBUF) }
+{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
YY_BREAK
case 40:
YY_RULE_SETUP
#line 249 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_REUSEPORT) }
+{ YDVAR(1, VAR_SO_RCVBUF) }
YY_BREAK
case 41:
YY_RULE_SETUP
#line 250 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_TRANSPARENT) }
+{ YDVAR(1, VAR_SO_SNDBUF) }
YY_BREAK
case 42:
YY_RULE_SETUP
#line 251 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_FREEBIND) }
+{ YDVAR(1, VAR_SO_REUSEPORT) }
YY_BREAK
case 43:
YY_RULE_SETUP
#line 252 "util/configlexer.lex"
-{ YDVAR(1, VAR_CHROOT) }
+{ YDVAR(1, VAR_IP_TRANSPARENT) }
YY_BREAK
case 44:
YY_RULE_SETUP
#line 253 "util/configlexer.lex"
-{ YDVAR(1, VAR_USERNAME) }
+{ YDVAR(1, VAR_IP_FREEBIND) }
YY_BREAK
case 45:
YY_RULE_SETUP
#line 254 "util/configlexer.lex"
-{ YDVAR(1, VAR_DIRECTORY) }
+{ YDVAR(1, VAR_CHROOT) }
YY_BREAK
case 46:
YY_RULE_SETUP
#line 255 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOGFILE) }
+{ YDVAR(1, VAR_USERNAME) }
YY_BREAK
case 47:
YY_RULE_SETUP
#line 256 "util/configlexer.lex"
-{ YDVAR(1, VAR_PIDFILE) }
+{ YDVAR(1, VAR_DIRECTORY) }
YY_BREAK
case 48:
YY_RULE_SETUP
#line 257 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_HINTS) }
+{ YDVAR(1, VAR_LOGFILE) }
YY_BREAK
case 49:
YY_RULE_SETUP
#line 258 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
+{ YDVAR(1, VAR_PIDFILE) }
YY_BREAK
case 50:
YY_RULE_SETUP
#line 259 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
+{ YDVAR(1, VAR_ROOT_HINTS) }
YY_BREAK
case 51:
YY_RULE_SETUP
#line 260 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
+{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
YY_BREAK
case 52:
YY_RULE_SETUP
#line 261 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
+{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
YY_BREAK
case 53:
YY_RULE_SETUP
#line 262 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
+{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
YY_BREAK
case 54:
YY_RULE_SETUP
#line 263 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
+{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
YY_BREAK
case 55:
YY_RULE_SETUP
#line 264 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
YY_BREAK
case 56:
YY_RULE_SETUP
#line 265 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
YY_BREAK
case 57:
YY_RULE_SETUP
#line 266 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_TTL) }
YY_BREAK
case 58:
YY_RULE_SETUP
#line 267 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_HOST_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
YY_BREAK
case 59:
YY_RULE_SETUP
#line 268 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_LAME_TTL) }
+{ YDVAR(1, VAR_CACHE_MIN_TTL) }
YY_BREAK
case 60:
YY_RULE_SETUP
#line 269 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
+{ YDVAR(1, VAR_INFRA_HOST_TTL) }
YY_BREAK
case 61:
YY_RULE_SETUP
#line 270 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
+{ YDVAR(1, VAR_INFRA_LAME_TTL) }
YY_BREAK
case 62:
YY_RULE_SETUP
#line 271 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
+{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
YY_BREAK
case 63:
YY_RULE_SETUP
#line 272 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
+{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
YY_BREAK
case 64:
YY_RULE_SETUP
#line 273 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
+{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
YY_BREAK
case 65:
YY_RULE_SETUP
#line 274 "util/configlexer.lex"
-{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
+{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
YY_BREAK
case 66:
YY_RULE_SETUP
#line 275 "util/configlexer.lex"
-{ YDVAR(1, VAR_DELAY_CLOSE) }
+{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
YY_BREAK
case 67:
YY_RULE_SETUP
#line 276 "util/configlexer.lex"
-{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
+{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
YY_BREAK
case 68:
YY_RULE_SETUP
#line 277 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
+{ YDVAR(1, VAR_DELAY_CLOSE) }
YY_BREAK
case 69:
YY_RULE_SETUP
#line 278 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
+{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
YY_BREAK
case 70:
YY_RULE_SETUP
#line 279 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_GLUE) }
+{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
YY_BREAK
case 71:
YY_RULE_SETUP
#line 280 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
+{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
YY_BREAK
case 72:
YY_RULE_SETUP
#line 281 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
+{ YDVAR(1, VAR_HARDEN_GLUE) }
YY_BREAK
case 73:
YY_RULE_SETUP
#line 282 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
+{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
YY_BREAK
case 74:
YY_RULE_SETUP
#line 283 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
+{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
YY_BREAK
case 75:
YY_RULE_SETUP
#line 284 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
+{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
YY_BREAK
case 76:
YY_RULE_SETUP
#line 285 "util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
YY_BREAK
case 77:
YY_RULE_SETUP
#line 286 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
+{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
YY_BREAK
case 78:
YY_RULE_SETUP
#line 287 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
YY_BREAK
case 79:
YY_RULE_SETUP
#line 288 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
+{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
YY_BREAK
case 80:
YY_RULE_SETUP
#line 289 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH_KEY) }
+{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
YY_BREAK
case 81:
YY_RULE_SETUP
#line 290 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH) }
+{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
YY_BREAK
case 82:
YY_RULE_SETUP
#line 291 "util/configlexer.lex"
-{ YDVAR(0, VAR_STUB_ZONE) }
+{ YDVAR(1, VAR_PREFETCH_KEY) }
YY_BREAK
case 83:
YY_RULE_SETUP
#line 292 "util/configlexer.lex"
-{ YDVAR(1, VAR_NAME) }
+{ YDVAR(1, VAR_PREFETCH) }
YY_BREAK
case 84:
YY_RULE_SETUP
#line 293 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_ADDR) }
+{ YDVAR(0, VAR_STUB_ZONE) }
YY_BREAK
case 85:
YY_RULE_SETUP
#line 294 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_HOST) }
+{ YDVAR(1, VAR_NAME) }
YY_BREAK
case 86:
YY_RULE_SETUP
#line 295 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_PRIME) }
+{ YDVAR(1, VAR_STUB_ADDR) }
YY_BREAK
case 87:
YY_RULE_SETUP
#line 296 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_FIRST) }
+{ YDVAR(1, VAR_STUB_HOST) }
YY_BREAK
case 88:
YY_RULE_SETUP
#line 297 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_PRIME) }
YY_BREAK
case 89:
YY_RULE_SETUP
#line 298 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_FIRST) }
YY_BREAK
case 90:
YY_RULE_SETUP
#line 299 "util/configlexer.lex"
-{ YDVAR(0, VAR_FORWARD_ZONE) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
YY_BREAK
case 91:
YY_RULE_SETUP
#line 300 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_ADDR) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
YY_BREAK
case 92:
YY_RULE_SETUP
#line 301 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_HOST) }
+{ YDVAR(0, VAR_FORWARD_ZONE) }
YY_BREAK
case 93:
YY_RULE_SETUP
#line 302 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_FIRST) }
+{ YDVAR(1, VAR_FORWARD_ADDR) }
YY_BREAK
case 94:
YY_RULE_SETUP
#line 303 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_HOST) }
YY_BREAK
case 95:
YY_RULE_SETUP
#line 304 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_FIRST) }
YY_BREAK
case 96:
YY_RULE_SETUP
#line 305 "util/configlexer.lex"
-{ YDVAR(0, VAR_AUTH_ZONE) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
YY_BREAK
case 97:
YY_RULE_SETUP
#line 306 "util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEFILE) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
YY_BREAK
case 98:
YY_RULE_SETUP
#line 307 "util/configlexer.lex"
-{ YDVAR(1, VAR_MASTER) }
+{ YDVAR(0, VAR_AUTH_ZONE) }
YY_BREAK
case 99:
YY_RULE_SETUP
#line 308 "util/configlexer.lex"
-{ YDVAR(1, VAR_URL) }
+{ YDVAR(1, VAR_ZONEFILE) }
YY_BREAK
case 100:
YY_RULE_SETUP
#line 309 "util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
+{ YDVAR(1, VAR_MASTER) }
YY_BREAK
case 101:
YY_RULE_SETUP
#line 310 "util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_UPSTREAM) }
+{ YDVAR(1, VAR_URL) }
YY_BREAK
case 102:
YY_RULE_SETUP
#line 311 "util/configlexer.lex"
-{ YDVAR(1, VAR_FALLBACK_ENABLED) }
+{ YDVAR(1, VAR_ALLOW_NOTIFY) }
YY_BREAK
case 103:
YY_RULE_SETUP
#line 312 "util/configlexer.lex"
-{ YDVAR(0, VAR_VIEW) }
+{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
YY_BREAK
case 104:
YY_RULE_SETUP
#line 313 "util/configlexer.lex"
-{ YDVAR(1, VAR_VIEW_FIRST) }
+{ YDVAR(1, VAR_FOR_UPSTREAM) }
YY_BREAK
case 105:
YY_RULE_SETUP
#line 314 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
+{ YDVAR(1, VAR_FALLBACK_ENABLED) }
YY_BREAK
case 106:
YY_RULE_SETUP
#line 315 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
+{ YDVAR(0, VAR_VIEW) }
YY_BREAK
case 107:
YY_RULE_SETUP
#line 316 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL) }
+{ YDVAR(1, VAR_VIEW_FIRST) }
YY_BREAK
case 108:
YY_RULE_SETUP
#line 317 "util/configlexer.lex"
-{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
YY_BREAK
case 109:
YY_RULE_SETUP
#line 318 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
YY_BREAK
case 110:
YY_RULE_SETUP
#line 319 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
+{ YDVAR(2, VAR_ACCESS_CONTROL) }
YY_BREAK
case 111:
YY_RULE_SETUP
#line 320 "util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
+{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
YY_BREAK
case 112:
YY_RULE_SETUP
#line 321 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
YY_BREAK
case 113:
YY_RULE_SETUP
#line 322 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
YY_BREAK
case 114:
YY_RULE_SETUP
#line 323 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
YY_BREAK
case 115:
YY_RULE_SETUP
#line 324 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
YY_BREAK
case 116:
YY_RULE_SETUP
#line 325 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
YY_BREAK
case 117:
YY_RULE_SETUP
#line 326 "util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
+{ YDVAR(1, VAR_HIDE_IDENTITY) }
YY_BREAK
case 118:
YY_RULE_SETUP
#line 327 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
+{ YDVAR(1, VAR_HIDE_VERSION) }
YY_BREAK
case 119:
YY_RULE_SETUP
#line 328 "util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
+{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
YY_BREAK
case 120:
YY_RULE_SETUP
#line 329 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
+{ YDVAR(1, VAR_IDENTITY) }
YY_BREAK
case 121:
YY_RULE_SETUP
#line 330 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
+{ YDVAR(1, VAR_VERSION) }
YY_BREAK
case 122:
YY_RULE_SETUP
#line 331 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_MODULE_CONF) }
YY_BREAK
case 123:
YY_RULE_SETUP
#line 332 "util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR) }
YY_BREAK
case 124:
YY_RULE_SETUP
#line 333 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
+{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
YY_BREAK
case 125:
YY_RULE_SETUP
#line 334 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
YY_BREAK
case 126:
YY_RULE_SETUP
#line 335 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
+{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
YY_BREAK
case 127:
YY_RULE_SETUP
#line 336 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
+{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
YY_BREAK
case 128:
YY_RULE_SETUP
#line 337 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
+{ YDVAR(1, VAR_TRUST_ANCHOR) }
YY_BREAK
case 129:
YY_RULE_SETUP
#line 338 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
YY_BREAK
case 130:
YY_RULE_SETUP
#line 339 "util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
+{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
YY_BREAK
case 131:
YY_RULE_SETUP
#line 340 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
+{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
YY_BREAK
case 132:
YY_RULE_SETUP
#line 341 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
YY_BREAK
case 133:
YY_RULE_SETUP
#line 342 "util/configlexer.lex"
-{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
YY_BREAK
case 134:
YY_RULE_SETUP
#line 343 "util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+{ YDVAR(1, VAR_BOGUS_TTL) }
YY_BREAK
case 135:
YY_RULE_SETUP
#line 344 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
YY_BREAK
case 136:
YY_RULE_SETUP
#line 345 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_DSA) }
+{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
YY_BREAK
case 137:
YY_RULE_SETUP
#line 346 "util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_SHA1) }
+{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
YY_BREAK
case 138:
YY_RULE_SETUP
#line 347 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
YY_BREAK
case 139:
YY_RULE_SETUP
#line 348 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+{ YDVAR(1, VAR_SERVE_EXPIRED) }
YY_BREAK
case 140:
YY_RULE_SETUP
#line 349 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+{ YDVAR(1, VAR_FAKE_DSA) }
YY_BREAK
case 141:
YY_RULE_SETUP
#line 350 "util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+{ YDVAR(1, VAR_FAKE_SHA1) }
YY_BREAK
case 142:
YY_RULE_SETUP
#line 351 "util/configlexer.lex"
-{
- YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
YY_BREAK
case 143:
YY_RULE_SETUP
-#line 353 "util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
+#line 352 "util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
YY_BREAK
case 144:
YY_RULE_SETUP
-#line 354 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
+#line 353 "util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
YY_BREAK
case 145:
YY_RULE_SETUP
-#line 355 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
+#line 354 "util/configlexer.lex"
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
YY_BREAK
case 146:
YY_RULE_SETUP
-#line 356 "util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
+#line 355 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
YY_BREAK
case 147:
YY_RULE_SETUP
#line 357 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+{ YDVAR(1, VAR_ADD_HOLDDOWN) }
YY_BREAK
case 148:
YY_RULE_SETUP
#line 358 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_IDENTITY) }
+{ YDVAR(1, VAR_DEL_HOLDDOWN) }
YY_BREAK
case 149:
YY_RULE_SETUP
#line 359 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+{ YDVAR(1, VAR_KEEP_MISSING) }
YY_BREAK
case 150:
YY_RULE_SETUP
#line 360 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
YY_BREAK
case 151:
YY_RULE_SETUP
#line 361 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_REPLIES) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
YY_BREAK
case 152:
YY_RULE_SETUP
#line 362 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_LOG_IDENTITY) }
YY_BREAK
case 153:
YY_RULE_SETUP
#line 363 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
YY_BREAK
case 154:
YY_RULE_SETUP
#line 364 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
YY_BREAK
case 155:
YY_RULE_SETUP
#line 365 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOG_REPLIES) }
YY_BREAK
case 156:
YY_RULE_SETUP
#line 366 "util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
YY_BREAK
case 157:
YY_RULE_SETUP
#line 367 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
YY_BREAK
case 158:
YY_RULE_SETUP
#line 368 "util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
YY_BREAK
case 159:
YY_RULE_SETUP
#line 369 "util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
YY_BREAK
case 160:
YY_RULE_SETUP
#line 370 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_ENABLE) }
+{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
YY_BREAK
case 161:
YY_RULE_SETUP
#line 371 "util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_KEY) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
YY_BREAK
case 162:
YY_RULE_SETUP
#line 372 "util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
YY_BREAK
case 163:
YY_RULE_SETUP
#line 373 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
YY_BREAK
case 164:
YY_RULE_SETUP
#line 374 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(1, VAR_SHM_ENABLE) }
YY_BREAK
case 165:
YY_RULE_SETUP
#line 375 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_SHM_KEY) }
YY_BREAK
case 166:
YY_RULE_SETUP
#line 376 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
YY_BREAK
case 167:
YY_RULE_SETUP
#line 377 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
YY_BREAK
case 168:
YY_RULE_SETUP
#line 378 "util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
YY_BREAK
case 169:
YY_RULE_SETUP
#line 379 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
YY_BREAK
case 170:
YY_RULE_SETUP
#line 380 "util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
YY_BREAK
case 171:
YY_RULE_SETUP
#line 381 "util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
YY_BREAK
case 172:
YY_RULE_SETUP
#line 382 "util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
YY_BREAK
case 173:
YY_RULE_SETUP
#line 383 "util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
YY_BREAK
case 174:
YY_RULE_SETUP
#line 384 "util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
YY_BREAK
case 175:
YY_RULE_SETUP
#line 385 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
YY_BREAK
case 176:
YY_RULE_SETUP
#line 386 "util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(0, VAR_PYTHON) }
YY_BREAK
case 177:
YY_RULE_SETUP
#line 387 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
YY_BREAK
case 178:
YY_RULE_SETUP
#line 388 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
YY_BREAK
case 179:
YY_RULE_SETUP
#line 389 "util/configlexer.lex"
-{ YDVAR(1, VAR_DEFINE_TAG) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
YY_BREAK
case 180:
YY_RULE_SETUP
#line 390 "util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
YY_BREAK
case 181:
YY_RULE_SETUP
#line 391 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
YY_BREAK
case 182:
YY_RULE_SETUP
#line 392 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
YY_BREAK
case 183:
YY_RULE_SETUP
#line 393 "util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
+{ YDVAR(1, VAR_DEFINE_TAG) }
YY_BREAK
case 184:
YY_RULE_SETUP
#line 394 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
YY_BREAK
case 185:
YY_RULE_SETUP
#line 395 "util/configlexer.lex"
-{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
YY_BREAK
case 186:
YY_RULE_SETUP
#line 396 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
YY_BREAK
case 187:
YY_RULE_SETUP
#line 397 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
YY_BREAK
case 188:
YY_RULE_SETUP
#line 398 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
YY_BREAK
case 189:
YY_RULE_SETUP
#line 399 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
YY_BREAK
case 190:
YY_RULE_SETUP
#line 400 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+{ YDVAR(0, VAR_DNSTAP) }
YY_BREAK
case 191:
YY_RULE_SETUP
#line 401 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
YY_BREAK
case 192:
YY_RULE_SETUP
#line 402 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
YY_BREAK
case 193:
YY_RULE_SETUP
#line 403 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
YY_BREAK
case 194:
YY_RULE_SETUP
-#line 405 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+#line 404 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
YY_BREAK
case 195:
YY_RULE_SETUP
-#line 407 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+#line 405 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
YY_BREAK
case 196:
YY_RULE_SETUP
-#line 409 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+#line 406 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
YY_BREAK
case 197:
YY_RULE_SETUP
-#line 411 "util/configlexer.lex"
+#line 407 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
YY_BREAK
case 198:
YY_RULE_SETUP
-#line 413 "util/configlexer.lex"
+#line 409 "util/configlexer.lex"
{
- YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+ YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
YY_BREAK
case 199:
YY_RULE_SETUP
-#line 415 "util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
+#line 411 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
YY_BREAK
case 200:
YY_RULE_SETUP
-#line 416 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
+#line 413 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
YY_BREAK
case 201:
YY_RULE_SETUP
-#line 417 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+#line 415 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
YY_BREAK
case 202:
YY_RULE_SETUP
-#line 418 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
+#line 417 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
YY_BREAK
case 203:
YY_RULE_SETUP
#line 419 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
YY_BREAK
case 204:
YY_RULE_SETUP
#line 420 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_IP_RATELIMIT) }
YY_BREAK
case 205:
YY_RULE_SETUP
#line 421 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+{ YDVAR(1, VAR_RATELIMIT) }
YY_BREAK
case 206:
YY_RULE_SETUP
#line 422 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
YY_BREAK
case 207:
YY_RULE_SETUP
#line 423 "util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
YY_BREAK
case 208:
YY_RULE_SETUP
#line 424 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
YY_BREAK
case 209:
YY_RULE_SETUP
#line 425 "util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
YY_BREAK
case 210:
YY_RULE_SETUP
#line 426 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
YY_BREAK
case 211:
YY_RULE_SETUP
#line 427 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
YY_BREAK
case 212:
YY_RULE_SETUP
#line 428 "util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
+{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
YY_BREAK
case 213:
YY_RULE_SETUP
#line 429 "util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
YY_BREAK
case 214:
YY_RULE_SETUP
#line 430 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
+{ YDVAR(1, VAR_LOW_RTT) }
YY_BREAK
case 215:
YY_RULE_SETUP
#line 431 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
+{ YDVAR(1, VAR_LOW_RTT_PCT) }
YY_BREAK
case 216:
YY_RULE_SETUP
#line 432 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
+{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
YY_BREAK
case 217:
YY_RULE_SETUP
#line 433 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
+{ YDVAR(2, VAR_RESPONSE_IP) }
YY_BREAK
case 218:
YY_RULE_SETUP
#line 434 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
+{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
YY_BREAK
case 219:
YY_RULE_SETUP
#line 435 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
+{ YDVAR(0, VAR_DNSCRYPT) }
YY_BREAK
case 220:
YY_RULE_SETUP
#line 436 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
+{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
YY_BREAK
case 221:
YY_RULE_SETUP
-#line 438 "util/configlexer.lex"
-{
- YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
+#line 437 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PORT) }
YY_BREAK
case 222:
YY_RULE_SETUP
-#line 440 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
+#line 438 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
YY_BREAK
case 223:
YY_RULE_SETUP
-#line 441 "util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
+#line 439 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
YY_BREAK
case 224:
YY_RULE_SETUP
-#line 442 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
+#line 440 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
YY_BREAK
case 225:
YY_RULE_SETUP
-#line 443 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
+#line 441 "util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
YY_BREAK
case 226:
YY_RULE_SETUP
-#line 444 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_HOOK) }
+#line 442 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
YY_BREAK
case 227:
YY_RULE_SETUP
-#line 445 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
+#line 444 "util/configlexer.lex"
+{
+ YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
YY_BREAK
case 228:
YY_RULE_SETUP
#line 446 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
YY_BREAK
case 229:
YY_RULE_SETUP
#line 447 "util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
YY_BREAK
case 230:
YY_RULE_SETUP
#line 448 "util/configlexer.lex"
-{ YDVAR(0, VAR_CACHEDB) }
+{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
YY_BREAK
case 231:
YY_RULE_SETUP
#line 449 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
YY_BREAK
case 232:
YY_RULE_SETUP
#line 450 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+{ YDVAR(1, VAR_IPSECMOD_HOOK) }
YY_BREAK
case 233:
YY_RULE_SETUP
#line 451 "util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
YY_BREAK
case 234:
-/* rule 234 can match eol */
YY_RULE_SETUP
#line 452 "util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++; }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
YY_BREAK
-/* Quoted strings. Strip leading and ending quotes */
case 235:
YY_RULE_SETUP
+#line 453 "util/configlexer.lex"
+{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+ YY_BREAK
+case 236:
+YY_RULE_SETUP
+#line 454 "util/configlexer.lex"
+{ YDVAR(0, VAR_CACHEDB) }
+ YY_BREAK
+case 237:
+YY_RULE_SETUP
#line 455 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+ YY_BREAK
+case 238:
+YY_RULE_SETUP
+#line 456 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+ YY_BREAK
+case 239:
+YY_RULE_SETUP
+#line 457 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+ YY_BREAK
+case 240:
+YY_RULE_SETUP
+#line 458 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+ YY_BREAK
+case 241:
+YY_RULE_SETUP
+#line 459 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+ YY_BREAK
+case 242:
+YY_RULE_SETUP
+#line 460 "util/configlexer.lex"
+{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+ YY_BREAK
+case 243:
+/* rule 243 can match eol */
+YY_RULE_SETUP
+#line 461 "util/configlexer.lex"
+{ LEXOUT(("NL\n")); cfg_parser->line++; }
+ YY_BREAK
+/* Quoted strings. Strip leading and ending quotes */
+case 244:
+YY_RULE_SETUP
+#line 464 "util/configlexer.lex"
{ BEGIN(quotedstring); LEXOUT(("QS ")); }
YY_BREAK
case YY_STATE_EOF(quotedstring):
-#line 456 "util/configlexer.lex"
+#line 465 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 236:
+case 245:
YY_RULE_SETUP
-#line 461 "util/configlexer.lex"
+#line 470 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 237:
-/* rule 237 can match eol */
+case 246:
+/* rule 246 can match eol */
YY_RULE_SETUP
-#line 462 "util/configlexer.lex"
+#line 471 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end \"");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 238:
+case 247:
YY_RULE_SETUP
-#line 464 "util/configlexer.lex"
+#line 473 "util/configlexer.lex"
{
LEXOUT(("QE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -4576,34 +4709,34 @@ YY_RULE_SETUP
}
YY_BREAK
/* Single Quoted strings. Strip leading and ending quotes */
-case 239:
+case 248:
YY_RULE_SETUP
-#line 476 "util/configlexer.lex"
+#line 485 "util/configlexer.lex"
{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
YY_BREAK
case YY_STATE_EOF(singlequotedstr):
-#line 477 "util/configlexer.lex"
+#line 486 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 240:
+case 249:
YY_RULE_SETUP
-#line 482 "util/configlexer.lex"
+#line 491 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 241:
-/* rule 241 can match eol */
+case 250:
+/* rule 250 can match eol */
YY_RULE_SETUP
-#line 483 "util/configlexer.lex"
+#line 492 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end '");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 242:
+case 251:
YY_RULE_SETUP
-#line 485 "util/configlexer.lex"
+#line 494 "util/configlexer.lex"
{
LEXOUT(("SQE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -4616,38 +4749,38 @@ YY_RULE_SETUP
}
YY_BREAK
/* include: directive */
-case 243:
+case 252:
YY_RULE_SETUP
-#line 497 "util/configlexer.lex"
+#line 506 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
YY_BREAK
case YY_STATE_EOF(include):
-#line 499 "util/configlexer.lex"
+#line 508 "util/configlexer.lex"
{
yyerror("EOF inside include directive");
BEGIN(inc_prev);
}
YY_BREAK
-case 244:
+case 253:
YY_RULE_SETUP
-#line 503 "util/configlexer.lex"
+#line 512 "util/configlexer.lex"
{ LEXOUT(("ISP ")); /* ignore */ }
YY_BREAK
-case 245:
-/* rule 245 can match eol */
+case 254:
+/* rule 254 can match eol */
YY_RULE_SETUP
-#line 504 "util/configlexer.lex"
+#line 513 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++;}
YY_BREAK
-case 246:
+case 255:
YY_RULE_SETUP
-#line 505 "util/configlexer.lex"
+#line 514 "util/configlexer.lex"
{ LEXOUT(("IQS ")); BEGIN(include_quoted); }
YY_BREAK
-case 247:
+case 256:
YY_RULE_SETUP
-#line 506 "util/configlexer.lex"
+#line 515 "util/configlexer.lex"
{
LEXOUT(("Iunquotedstr(%s) ", yytext));
config_start_include_glob(yytext);
@@ -4655,27 +4788,27 @@ YY_RULE_SETUP
}
YY_BREAK
case YY_STATE_EOF(include_quoted):
-#line 511 "util/configlexer.lex"
+#line 520 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
BEGIN(inc_prev);
}
YY_BREAK
-case 248:
+case 257:
YY_RULE_SETUP
-#line 515 "util/configlexer.lex"
+#line 524 "util/configlexer.lex"
{ LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 249:
-/* rule 249 can match eol */
+case 258:
+/* rule 258 can match eol */
YY_RULE_SETUP
-#line 516 "util/configlexer.lex"
+#line 525 "util/configlexer.lex"
{ yyerror("newline before \" in include name");
cfg_parser->line++; BEGIN(inc_prev); }
YY_BREAK
-case 250:
+case 259:
YY_RULE_SETUP
-#line 518 "util/configlexer.lex"
+#line 527 "util/configlexer.lex"
{
LEXOUT(("IQE "));
yytext[yyleng - 1] = '\0';
@@ -4685,7 +4818,7 @@ YY_RULE_SETUP
YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(val):
-#line 524 "util/configlexer.lex"
+#line 533 "util/configlexer.lex"
{
LEXOUT(("LEXEOF "));
yy_set_bol(1); /* Set beginning of line, so "^" rules match. */
@@ -4697,33 +4830,33 @@ case YY_STATE_EOF(val):
}
}
YY_BREAK
-case 251:
+case 260:
YY_RULE_SETUP
-#line 535 "util/configlexer.lex"
+#line 544 "util/configlexer.lex"
{ LEXOUT(("unquotedstr(%s) ", yytext));
if(--num_args == 0) { BEGIN(INITIAL); }
yylval.str = strdup(yytext); return STRING_ARG; }
YY_BREAK
-case 252:
+case 261:
YY_RULE_SETUP
-#line 539 "util/configlexer.lex"
+#line 548 "util/configlexer.lex"
{
ub_c_error_msg("unknown keyword '%s'", yytext);
}
YY_BREAK
-case 253:
+case 262:
YY_RULE_SETUP
-#line 543 "util/configlexer.lex"
+#line 552 "util/configlexer.lex"
{
ub_c_error_msg("stray '%s'", yytext);
}
YY_BREAK
-case 254:
+case 263:
YY_RULE_SETUP
-#line 547 "util/configlexer.lex"
+#line 556 "util/configlexer.lex"
ECHO;
YY_BREAK
-#line 4725 "<stdout>"
+#line 4858 "<stdout>"
case YY_END_OF_BUFFER:
{
@@ -5014,7 +5147,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 >= 2508 )
+ if ( yy_current_state >= 2599 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
@@ -5042,11 +5175,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 >= 2508 )
+ if ( yy_current_state >= 2599 )
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 == 2507);
+ yy_is_jam = (yy_current_state == 2598);
return yy_is_jam ? 0 : yy_current_state;
}
@@ -5685,7 +5818,7 @@ void yyfree (void * ptr )
#define YYTABLES_NAME "yytables"
-#line 547 "util/configlexer.lex"
+#line 556 "util/configlexer.lex"
diff --git a/util/configlexer.lex b/util/configlexer.lex
index 0e158d1610a0..73dfe4bd4f29 100644
--- a/util/configlexer.lex
+++ b/util/configlexer.lex
@@ -238,6 +238,8 @@ ssl-port{COLON} { YDVAR(1, VAR_SSL_PORT) }
tls-port{COLON} { YDVAR(1, VAR_SSL_PORT) }
ssl-cert-bundle{COLON} { YDVAR(1, VAR_TLS_CERT_BUNDLE) }
tls-cert-bundle{COLON} { YDVAR(1, VAR_TLS_CERT_BUNDLE) }
+additional-ssl-port{COLON} { YDVAR(1, VAR_ADDITIONAL_TLS_PORT) }
+additional-tls-port{COLON} { YDVAR(1, VAR_ADDITIONAL_TLS_PORT) }
use-systemd{COLON} { YDVAR(1, VAR_USE_SYSTEMD) }
do-daemonize{COLON} { YDVAR(1, VAR_DO_DAEMONIZE) }
interface{COLON} { YDVAR(1, VAR_INTERFACE) }
@@ -306,6 +308,7 @@ auth-zone{COLON} { YDVAR(0, VAR_AUTH_ZONE) }
zonefile{COLON} { YDVAR(1, VAR_ZONEFILE) }
master{COLON} { YDVAR(1, VAR_MASTER) }
url{COLON} { YDVAR(1, VAR_URL) }
+allow-notify{COLON} { YDVAR(1, VAR_ALLOW_NOTIFY) }
for-downstream{COLON} { YDVAR(1, VAR_FOR_DOWNSTREAM) }
for-upstream{COLON} { YDVAR(1, VAR_FOR_UPSTREAM) }
fallback-enabled{COLON} { YDVAR(1, VAR_FALLBACK_ENABLED) }
@@ -333,6 +336,7 @@ auto-trust-anchor-file{COLON} { YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
trusted-keys-file{COLON} { YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
trust-anchor{COLON} { YDVAR(1, VAR_TRUST_ANCHOR) }
trust-anchor-signaling{COLON} { YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
+root-key-sentinel{COLON} { YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
val-override-date{COLON} { YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
val-sig-skew-min{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
val-sig-skew-max{COLON} { YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
@@ -423,6 +427,8 @@ ratelimit-for-domain{COLON} { YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
ratelimit-below-domain{COLON} { YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
ip-ratelimit-factor{COLON} { YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
ratelimit-factor{COLON} { YDVAR(1, VAR_RATELIMIT_FACTOR) }
+low-rtt{COLON} { YDVAR(1, VAR_LOW_RTT) }
+low-rtt-pct{COLON} { YDVAR(1, VAR_LOW_RTT_PCT) }
response-ip-tag{COLON} { YDVAR(2, VAR_RESPONSE_IP_TAG) }
response-ip{COLON} { YDVAR(2, VAR_RESPONSE_IP) }
response-ip-data{COLON} { YDVAR(2, VAR_RESPONSE_IP_DATA) }
@@ -448,6 +454,9 @@ ipsecmod-strict{COLON} { YDVAR(1, VAR_IPSECMOD_STRICT) }
cachedb{COLON} { YDVAR(0, VAR_CACHEDB) }
backend{COLON} { YDVAR(1, VAR_CACHEDB_BACKEND) }
secret-seed{COLON} { YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+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) }
<INITIAL,val>{NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++; }
diff --git a/util/configparser.c b/util/configparser.c
index 421339fe9754..d0e99df81769 100644
--- a/util/configparser.c
+++ b/util/configparser.c
@@ -329,34 +329,42 @@ extern int yydebug;
VAR_USE_SYSTEMD = 458,
VAR_SHM_ENABLE = 459,
VAR_SHM_KEY = 460,
- VAR_DNSCRYPT = 461,
- VAR_DNSCRYPT_ENABLE = 462,
- VAR_DNSCRYPT_PORT = 463,
- VAR_DNSCRYPT_PROVIDER = 464,
- VAR_DNSCRYPT_SECRET_KEY = 465,
- VAR_DNSCRYPT_PROVIDER_CERT = 466,
- VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 467,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 468,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 469,
- VAR_DNSCRYPT_NONCE_CACHE_SIZE = 470,
- VAR_DNSCRYPT_NONCE_CACHE_SLABS = 471,
- VAR_IPSECMOD_ENABLED = 472,
- VAR_IPSECMOD_HOOK = 473,
- VAR_IPSECMOD_IGNORE_BOGUS = 474,
- VAR_IPSECMOD_MAX_TTL = 475,
- VAR_IPSECMOD_WHITELIST = 476,
- VAR_IPSECMOD_STRICT = 477,
- VAR_CACHEDB = 478,
- VAR_CACHEDB_BACKEND = 479,
- VAR_CACHEDB_SECRETSEED = 480,
- VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 481,
- VAR_FOR_UPSTREAM = 482,
- VAR_AUTH_ZONE = 483,
- VAR_ZONEFILE = 484,
- VAR_MASTER = 485,
- VAR_URL = 486,
- VAR_FOR_DOWNSTREAM = 487,
- VAR_FALLBACK_ENABLED = 488
+ 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_ADDITIONAL_TLS_PORT = 493,
+ VAR_LOW_RTT = 494,
+ VAR_LOW_RTT_PCT = 495,
+ VAR_ALLOW_NOTIFY = 496
};
#endif
/* Tokens. */
@@ -563,34 +571,42 @@ extern int yydebug;
#define VAR_USE_SYSTEMD 458
#define VAR_SHM_ENABLE 459
#define VAR_SHM_KEY 460
-#define VAR_DNSCRYPT 461
-#define VAR_DNSCRYPT_ENABLE 462
-#define VAR_DNSCRYPT_PORT 463
-#define VAR_DNSCRYPT_PROVIDER 464
-#define VAR_DNSCRYPT_SECRET_KEY 465
-#define VAR_DNSCRYPT_PROVIDER_CERT 466
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 467
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 468
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 469
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 470
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 471
-#define VAR_IPSECMOD_ENABLED 472
-#define VAR_IPSECMOD_HOOK 473
-#define VAR_IPSECMOD_IGNORE_BOGUS 474
-#define VAR_IPSECMOD_MAX_TTL 475
-#define VAR_IPSECMOD_WHITELIST 476
-#define VAR_IPSECMOD_STRICT 477
-#define VAR_CACHEDB 478
-#define VAR_CACHEDB_BACKEND 479
-#define VAR_CACHEDB_SECRETSEED 480
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 481
-#define VAR_FOR_UPSTREAM 482
-#define VAR_AUTH_ZONE 483
-#define VAR_ZONEFILE 484
-#define VAR_MASTER 485
-#define VAR_URL 486
-#define VAR_FOR_DOWNSTREAM 487
-#define VAR_FALLBACK_ENABLED 488
+#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_ADDITIONAL_TLS_PORT 493
+#define VAR_LOW_RTT 494
+#define VAR_LOW_RTT_PCT 495
+#define VAR_ALLOW_NOTIFY 496
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -601,7 +617,7 @@ union YYSTYPE
char* str;
-#line 605 "util/configparser.c" /* yacc.c:355 */
+#line 621 "util/configparser.c" /* yacc.c:355 */
};
typedef union YYSTYPE YYSTYPE;
@@ -618,7 +634,7 @@ int yyparse (void);
/* Copy the second part of user declarations. */
-#line 622 "util/configparser.c" /* yacc.c:358 */
+#line 638 "util/configparser.c" /* yacc.c:358 */
#ifdef short
# undef short
@@ -860,21 +876,21 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 2
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 473
+#define YYLAST 489
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 234
+#define YYNTOKENS 242
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 254
+#define YYNNTS 262
/* YYNRULES -- Number of rules. */
-#define YYNRULES 485
+#define YYNRULES 501
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 726
+#define YYNSTATES 750
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK 2
-#define YYMAXUTOK 488
+#define YYMAXUTOK 496
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -931,62 +947,65 @@ static const yytype_uint8 yytranslate[] =
195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
- 225, 226, 227, 228, 229, 230, 231, 232, 233
+ 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
+ 235, 236, 237, 238, 239, 240, 241
};
#if YYDEBUG
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 160, 160, 160, 161, 161, 162, 162, 163, 163,
- 163, 164, 164, 165, 169, 174, 175, 176, 176, 176,
- 177, 177, 178, 178, 179, 179, 180, 180, 181, 181,
- 181, 182, 182, 182, 183, 183, 184, 184, 185, 185,
- 186, 186, 187, 187, 188, 188, 189, 189, 190, 190,
- 191, 191, 191, 192, 192, 192, 193, 193, 193, 194,
- 194, 195, 195, 196, 196, 197, 197, 198, 198, 198,
- 199, 199, 200, 200, 201, 201, 201, 202, 202, 203,
- 203, 204, 204, 205, 205, 205, 206, 206, 207, 207,
- 208, 208, 209, 209, 210, 210, 211, 211, 211, 212,
- 212, 213, 213, 213, 214, 214, 214, 215, 215, 215,
- 216, 216, 216, 216, 217, 217, 217, 218, 218, 218,
- 219, 219, 220, 220, 221, 221, 222, 222, 223, 223,
- 223, 224, 224, 225, 225, 226, 227, 227, 228, 228,
- 229, 229, 230, 231, 231, 232, 232, 233, 233, 234,
- 234, 234, 235, 235, 236, 236, 237, 237, 238, 238,
- 239, 239, 239, 240, 240, 240, 241, 241, 241, 242,
- 242, 243, 243, 244, 244, 245, 245, 246, 246, 247,
- 249, 261, 262, 263, 263, 263, 263, 263, 264, 266,
- 278, 279, 280, 280, 280, 280, 281, 283, 297, 298,
- 299, 299, 299, 299, 300, 300, 300, 302, 318, 319,
- 320, 320, 320, 320, 321, 321, 321, 323, 332, 341,
- 352, 361, 370, 379, 390, 399, 410, 423, 438, 449,
- 466, 483, 496, 511, 520, 529, 538, 547, 556, 565,
- 574, 583, 592, 601, 610, 619, 628, 637, 646, 655,
- 662, 669, 678, 685, 694, 703, 717, 726, 735, 744,
- 751, 758, 784, 792, 799, 806, 813, 820, 828, 836,
- 844, 851, 862, 869, 878, 887, 896, 903, 910, 918,
- 926, 936, 946, 956, 969, 980, 988, 1001, 1010, 1019,
- 1028, 1038, 1048, 1056, 1069, 1078, 1086, 1095, 1103, 1116,
- 1125, 1132, 1142, 1152, 1162, 1172, 1182, 1192, 1202, 1212,
- 1219, 1226, 1233, 1242, 1251, 1260, 1267, 1277, 1294, 1301,
- 1319, 1332, 1345, 1354, 1363, 1372, 1381, 1391, 1401, 1412,
- 1421, 1430, 1443, 1456, 1465, 1472, 1481, 1490, 1499, 1508,
- 1516, 1529, 1537, 1566, 1573, 1588, 1598, 1608, 1615, 1622,
- 1631, 1645, 1664, 1683, 1695, 1707, 1719, 1730, 1749, 1759,
- 1768, 1776, 1784, 1797, 1810, 1823, 1836, 1845, 1854, 1864,
- 1874, 1887, 1900, 1911, 1924, 1935, 1948, 1958, 1965, 1972,
- 1981, 1991, 2001, 2011, 2018, 2025, 2034, 2044, 2054, 2061,
- 2068, 2075, 2085, 2095, 2105, 2115, 2145, 2155, 2163, 2172,
- 2187, 2196, 2201, 2202, 2203, 2203, 2203, 2204, 2204, 2204,
- 2205, 2205, 2207, 2217, 2226, 2233, 2243, 2250, 2257, 2264,
- 2271, 2276, 2277, 2278, 2278, 2279, 2279, 2280, 2280, 2281,
- 2282, 2283, 2284, 2285, 2286, 2288, 2296, 2303, 2311, 2319,
- 2326, 2333, 2342, 2351, 2360, 2369, 2378, 2387, 2392, 2393,
- 2394, 2396, 2402, 2412, 2419, 2428, 2436, 2442, 2443, 2445,
- 2445, 2445, 2446, 2446, 2447, 2448, 2449, 2450, 2451, 2453,
- 2463, 2473, 2480, 2489, 2496, 2505, 2513, 2526, 2534, 2547,
- 2552, 2553, 2554, 2554, 2556, 2570
+ 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, 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, 699,
+ 708, 717, 731, 740, 749, 758, 765, 772, 798, 806,
+ 813, 820, 827, 834, 842, 850, 858, 865, 876, 887,
+ 894, 903, 912, 921, 928, 935, 943, 951, 961, 971,
+ 981, 994, 1005, 1013, 1026, 1035, 1044, 1053, 1063, 1073,
+ 1081, 1094, 1103, 1111, 1120, 1128, 1141, 1150, 1157, 1167,
+ 1177, 1187, 1197, 1207, 1217, 1227, 1237, 1244, 1251, 1258,
+ 1267, 1276, 1285, 1292, 1302, 1319, 1326, 1344, 1357, 1370,
+ 1379, 1388, 1397, 1406, 1416, 1426, 1437, 1446, 1455, 1468,
+ 1481, 1490, 1497, 1506, 1515, 1524, 1533, 1541, 1554, 1562,
+ 1591, 1598, 1613, 1623, 1633, 1640, 1647, 1656, 1670, 1689,
+ 1708, 1720, 1732, 1744, 1755, 1774, 1784, 1793, 1801, 1809,
+ 1822, 1835, 1848, 1861, 1870, 1879, 1888, 1897, 1907, 1917,
+ 1930, 1943, 1954, 1967, 1978, 1991, 2001, 2008, 2015, 2024,
+ 2034, 2044, 2054, 2061, 2068, 2077, 2087, 2097, 2104, 2111,
+ 2118, 2126, 2136, 2146, 2156, 2166, 2196, 2206, 2214, 2223,
+ 2238, 2247, 2252, 2253, 2254, 2254, 2254, 2255, 2255, 2255,
+ 2256, 2256, 2258, 2268, 2277, 2284, 2294, 2301, 2308, 2315,
+ 2322, 2327, 2328, 2329, 2329, 2330, 2330, 2331, 2331, 2332,
+ 2333, 2334, 2335, 2336, 2337, 2339, 2347, 2354, 2362, 2370,
+ 2377, 2384, 2393, 2402, 2411, 2420, 2429, 2438, 2443, 2444,
+ 2445, 2447, 2453, 2463, 2470, 2479, 2487, 2493, 2494, 2496,
+ 2496, 2496, 2497, 2497, 2498, 2499, 2500, 2501, 2502, 2504,
+ 2514, 2524, 2531, 2540, 2547, 2556, 2564, 2577, 2585, 2598,
+ 2603, 2604, 2605, 2605, 2606, 2606, 2606, 2608, 2622, 2637,
+ 2649, 2664
};
#endif
@@ -1068,23 +1087,27 @@ static const char *const yytname[] =
"VAR_VIEW_FIRST", "VAR_SERVE_EXPIRED", "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_DNSCRYPT", "VAR_DNSCRYPT_ENABLE",
- "VAR_DNSCRYPT_PORT", "VAR_DNSCRYPT_PROVIDER", "VAR_DNSCRYPT_SECRET_KEY",
- "VAR_DNSCRYPT_PROVIDER_CERT", "VAR_DNSCRYPT_PROVIDER_CERT_ROTATED",
+ "VAR_SHM_KEY", "VAR_ROOT_KEY_SENTINEL", "VAR_DNSCRYPT",
+ "VAR_DNSCRYPT_ENABLE", "VAR_DNSCRYPT_PORT", "VAR_DNSCRYPT_PROVIDER",
+ "VAR_DNSCRYPT_SECRET_KEY", "VAR_DNSCRYPT_PROVIDER_CERT",
+ "VAR_DNSCRYPT_PROVIDER_CERT_ROTATED",
"VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE",
"VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS",
"VAR_DNSCRYPT_NONCE_CACHE_SIZE", "VAR_DNSCRYPT_NONCE_CACHE_SLABS",
"VAR_IPSECMOD_ENABLED", "VAR_IPSECMOD_HOOK", "VAR_IPSECMOD_IGNORE_BOGUS",
"VAR_IPSECMOD_MAX_TTL", "VAR_IPSECMOD_WHITELIST", "VAR_IPSECMOD_STRICT",
"VAR_CACHEDB", "VAR_CACHEDB_BACKEND", "VAR_CACHEDB_SECRETSEED",
- "VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM", "VAR_FOR_UPSTREAM",
- "VAR_AUTH_ZONE", "VAR_ZONEFILE", "VAR_MASTER", "VAR_URL",
- "VAR_FOR_DOWNSTREAM", "VAR_FALLBACK_ENABLED", "$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_CACHEDB_REDISHOST", "VAR_CACHEDB_REDISPORT",
+ "VAR_CACHEDB_REDISTIMEOUT", "VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM",
+ "VAR_FOR_UPSTREAM", "VAR_AUTH_ZONE", "VAR_ZONEFILE", "VAR_MASTER",
+ "VAR_URL", "VAR_FOR_DOWNSTREAM", "VAR_FALLBACK_ENABLED",
+ "VAR_ADDITIONAL_TLS_PORT", "VAR_LOW_RTT", "VAR_LOW_RTT_PCT",
+ "VAR_ALLOW_NOTIFY", "$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",
@@ -1098,14 +1121,15 @@ static const char *const yytname[] =
"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_use_systemd", "server_do_daemonize",
- "server_use_syslog", "server_log_time_ascii", "server_log_queries",
- "server_log_replies", "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", "server_trust_anchor_file",
- "server_trusted_keys_file", "server_trust_anchor",
- "server_trust_anchor_signaling", "server_domain_insecure",
+ "server_tls_cert_bundle", "server_additional_tls_port",
+ "server_use_systemd", "server_do_daemonize", "server_use_syslog",
+ "server_log_time_ascii", "server_log_queries", "server_log_replies",
+ "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",
+ "server_trust_anchor_file", "server_trusted_keys_file",
+ "server_trust_anchor", "server_trust_anchor_signaling",
+ "server_root_key_sentinel", "server_domain_insecure",
"server_hide_identity", "server_hide_version", "server_hide_trustanchor",
"server_identity", "server_version", "server_so_rcvbuf",
"server_so_sndbuf", "server_so_reuseport", "server_ip_transparent",
@@ -1148,24 +1172,24 @@ static const char *const yytname[] =
"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_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", "auth_master", "auth_url",
- "auth_for_downstream", "auth_for_upstream", "auth_fallback_enabled",
- "view_name", "view_local_zone", "view_response_ip",
- "view_response_ip_data", "view_local_data", "view_local_data_ptr",
- "view_first", "rcstart", "contents_rc", "content_rc",
- "rc_control_enable", "rc_control_port", "rc_control_interface",
- "rc_control_use_cert", "rc_server_key_file", "rc_server_cert_file",
- "rc_control_key_file", "rc_control_cert_file", "dtstart", "contents_dt",
- "content_dt", "dt_dnstap_enable", "dt_dnstap_socket_path",
- "dt_dnstap_send_identity", "dt_dnstap_send_version",
- "dt_dnstap_identity", "dt_dnstap_version",
+ "server_ratelimit_factor", "server_low_rtt", "server_low_rtt_pct",
+ "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",
+ "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",
+ "view_local_data", "view_local_data_ptr", "view_first", "rcstart",
+ "contents_rc", "content_rc", "rc_control_enable", "rc_control_port",
+ "rc_control_interface", "rc_control_use_cert", "rc_server_key_file",
+ "rc_server_cert_file", "rc_control_key_file", "rc_control_cert_file",
+ "dtstart", "contents_dt", "content_dt", "dt_dnstap_enable",
+ "dt_dnstap_socket_path", "dt_dnstap_send_identity",
+ "dt_dnstap_send_version", "dt_dnstap_identity", "dt_dnstap_version",
"dt_dnstap_log_resolver_query_messages",
"dt_dnstap_log_resolver_response_messages",
"dt_dnstap_log_client_query_messages",
@@ -1182,7 +1206,8 @@ static const char *const yytname[] =
"dnsc_dnscrypt_shared_secret_cache_slabs",
"dnsc_dnscrypt_nonce_cache_size", "dnsc_dnscrypt_nonce_cache_slabs",
"cachedbstart", "contents_cachedb", "content_cachedb",
- "cachedb_backend_name", "cachedb_secret_seed", YY_NULLPTR
+ "cachedb_backend_name", "cachedb_secret_seed", "redis_server_host",
+ "redis_server_port", "redis_timeout", YY_NULLPTR
};
#endif
@@ -1214,14 +1239,15 @@ static const yytype_uint16 yytoknum[] =
455, 456, 457, 458, 459, 460, 461, 462, 463, 464,
465, 466, 467, 468, 469, 470, 471, 472, 473, 474,
475, 476, 477, 478, 479, 480, 481, 482, 483, 484,
- 485, 486, 487, 488
+ 485, 486, 487, 488, 489, 490, 491, 492, 493, 494,
+ 495, 496
};
# endif
-#define YYPACT_NINF -223
+#define YYPACT_NINF -184
#define yypact_value_is_default(Yystate) \
- (!!((Yystate) == (-223)))
+ (!!((Yystate) == (-184)))
#define YYTABLE_NINF -1
@@ -1232,79 +1258,81 @@ static const yytype_uint16 yytoknum[] =
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- -223, 0, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, 217, -36, -31, -39, -35, -24,
- -128, -100, -159, -222, 2, 3, 4, 5, 6, 21,
- 22, 23, 24, 25, 26, 29, 30, 32, 33, 34,
- 35, 36, 48, 49, 50, 51, 53, 54, 55, 56,
- 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
- 76, 77, 78, 79, 80, 82, 83, 84, 85, 86,
- 88, 89, 92, 94, 95, 96, 98, 99, 100, 101,
- 102, 103, 104, 105, 106, 107, 108, 109, 110, 113,
- 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, 147, 148, 149, 150, 151, 152, 153, 154, 155,
- 156, 157, 158, 159, 160, 161, 162, 163, 164, 165,
- 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
- 176, 177, 178, 179, 180, 181, 189, 190, 191, 192,
- 193, 194, 195, 197, 198, 199, 200, 201, 202, 203,
- 204, 205, 206, 207, 208, 209, 210, 211, 212, 214,
- 215, 216, 247, 248, 249, 250, 254, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, 255, 256, 298, 299, 300, 301, -223, -223, -223,
- -223, -223, -223, -223, 302, 303, 304, 305, 306, -223,
- -223, -223, -223, -223, -223, 310, 314, 315, 339, 340,
- 341, 343, -223, -223, -223, -223, -223, -223, -223, -223,
- 353, 354, 355, 356, 357, 358, 359, -223, -223, -223,
- -223, -223, -223, -223, -223, 360, 361, 362, 363, 364,
- 365, 400, 402, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, 413, 414, 415, 416, 417, 418, 419, 420,
- 421, 422, 423, 430, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, 431, -223, -223,
- 432, 434, 435, 436, 437, 438, 439, 440, 441, 442,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, 443, 444, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, 445, 446, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, 447, 448, 449,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, 450,
- 451, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, 452, 453, 454, 455,
- 456, 457, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, 458, -223, -223, 459, 460, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, 461, 462, 463, -223,
- -223, -223, -223, -223, -223, -223
+ -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, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, 304,
+ 305, 306, 307, 308, 309, -184, -184, -184, -184, -184,
+ -184, -184, 310, 314, 318, 319, 343, -184, -184, -184,
+ -184, -184, -184, 344, 345, 347, 357, 358, 359, 360,
+ -184, -184, -184, -184, -184, -184, -184, -184, 361, 362,
+ 363, 364, 365, 366, 367, 368, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, 369, 404, 406, 418, 419,
+ 420, 421, 422, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, 423, 424, 425, 426, 427, 428, 435, 436,
+ 437, 438, 439, 440, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, 442, -184, -184,
+ 443, 444, 445, 446, 447, 448, 452, 453, 454, 455,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, 456, 457, 458, 459, 460, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, 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, 463, 464, 465, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, 466, 467, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, 468, 469, 470, 471, 472, 473, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, 474, -184, -184, 475, 476, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ 477, 478, 479, -184, -184, -184, -184, -184, -184, -184
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1312,9 +1340,9 @@ static const yytype_int16 yypact[] =
means the default is an error. */
static const yytype_uint16 yydefact[] =
{
- 2, 0, 1, 14, 180, 189, 401, 447, 420, 197,
- 456, 479, 207, 3, 16, 182, 191, 199, 209, 403,
- 422, 449, 458, 481, 4, 5, 6, 10, 13, 8,
+ 2, 0, 1, 14, 184, 193, 411, 457, 430, 201,
+ 466, 489, 211, 3, 16, 186, 195, 203, 213, 413,
+ 432, 459, 468, 491, 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,
@@ -1331,122 +1359,126 @@ static const yytype_uint16 yydefact[] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 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, 177, 113,
- 114, 115, 116, 179, 162, 78, 67, 93, 110, 111,
- 29, 30, 31, 32, 33, 69, 83, 84, 99, 55,
- 65, 56, 170, 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, 178,
- 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, 148,
- 158, 171, 173, 172, 174, 175, 176, 152, 161, 164,
- 165, 0, 0, 0, 0, 0, 0, 181, 183, 184,
- 185, 187, 188, 186, 0, 0, 0, 0, 0, 190,
- 192, 193, 194, 195, 196, 0, 0, 0, 0, 0,
- 0, 0, 198, 200, 201, 204, 205, 202, 206, 203,
- 0, 0, 0, 0, 0, 0, 0, 208, 210, 211,
- 212, 213, 214, 215, 216, 0, 0, 0, 0, 0,
- 0, 0, 0, 402, 404, 406, 405, 411, 407, 408,
- 409, 410, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 421, 423, 424, 425, 426, 427,
- 428, 429, 430, 431, 432, 433, 434, 0, 448, 450,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 457, 459, 460, 461, 463, 464, 462, 465, 466, 467,
- 468, 0, 0, 480, 482, 483, 218, 217, 224, 233,
- 231, 239, 240, 243, 241, 242, 244, 245, 259, 260,
- 261, 262, 263, 285, 286, 287, 292, 293, 236, 294,
- 295, 298, 296, 297, 300, 301, 302, 315, 273, 274,
- 276, 277, 303, 318, 268, 270, 319, 325, 326, 327,
- 237, 284, 339, 340, 269, 334, 255, 232, 264, 316,
- 322, 304, 0, 0, 343, 238, 219, 254, 308, 220,
- 234, 235, 265, 266, 341, 306, 310, 311, 221, 344,
- 288, 314, 256, 272, 320, 321, 324, 333, 267, 337,
- 335, 336, 278, 283, 312, 313, 279, 280, 305, 329,
- 257, 258, 246, 248, 249, 250, 251, 252, 345, 346,
- 347, 289, 290, 291, 299, 348, 349, 0, 0, 0,
- 307, 281, 452, 358, 362, 360, 359, 363, 361, 0,
- 0, 366, 367, 225, 226, 227, 228, 229, 230, 309,
- 323, 338, 368, 369, 282, 350, 0, 0, 0, 0,
- 0, 0, 330, 331, 332, 453, 275, 271, 328, 253,
- 222, 223, 370, 372, 371, 373, 374, 375, 247, 376,
- 377, 378, 381, 380, 379, 382, 383, 384, 385, 386,
- 394, 0, 398, 399, 0, 0, 400, 387, 392, 388,
- 389, 390, 391, 393, 412, 414, 413, 416, 417, 418,
- 419, 415, 435, 436, 437, 438, 439, 440, 441, 442,
- 443, 444, 445, 446, 451, 469, 470, 471, 474, 472,
- 473, 475, 476, 477, 478, 484, 485, 317, 342, 357,
- 454, 455, 364, 365, 351, 352, 0, 0, 0, 356,
- 395, 396, 397, 355, 353, 354
+ 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, 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, 185, 187, 188, 189, 191,
+ 192, 190, 0, 0, 0, 0, 0, 194, 196, 197,
+ 198, 199, 200, 0, 0, 0, 0, 0, 0, 0,
+ 202, 204, 205, 208, 209, 206, 210, 207, 0, 0,
+ 0, 0, 0, 0, 0, 0, 212, 214, 215, 216,
+ 217, 221, 218, 219, 220, 0, 0, 0, 0, 0,
+ 0, 0, 0, 412, 414, 416, 415, 421, 417, 418,
+ 419, 420, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 431, 433, 434, 435, 436, 437,
+ 438, 439, 440, 441, 442, 443, 444, 0, 458, 460,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 467, 469, 470, 471, 473, 474, 472, 475, 476, 477,
+ 478, 0, 0, 0, 0, 0, 490, 492, 493, 494,
+ 495, 496, 223, 222, 229, 238, 236, 244, 245, 248,
+ 246, 247, 249, 250, 265, 266, 267, 268, 269, 292,
+ 293, 294, 299, 300, 241, 301, 302, 305, 303, 304,
+ 307, 308, 309, 322, 280, 281, 283, 284, 310, 325,
+ 274, 276, 326, 332, 333, 334, 242, 291, 346, 347,
+ 275, 341, 261, 237, 270, 323, 329, 311, 0, 0,
+ 350, 243, 224, 260, 315, 225, 239, 240, 271, 272,
+ 348, 313, 317, 318, 226, 351, 295, 321, 262, 279,
+ 327, 328, 331, 340, 273, 344, 342, 343, 285, 290,
+ 319, 320, 286, 287, 312, 336, 263, 264, 251, 253,
+ 254, 255, 256, 257, 352, 353, 354, 296, 297, 298,
+ 306, 355, 356, 0, 0, 0, 314, 288, 462, 365,
+ 369, 367, 366, 370, 368, 0, 0, 373, 374, 230,
+ 231, 232, 233, 234, 235, 316, 330, 345, 377, 378,
+ 289, 357, 0, 0, 0, 0, 0, 0, 337, 338,
+ 339, 463, 282, 277, 335, 259, 227, 228, 278, 379,
+ 381, 380, 382, 383, 384, 252, 258, 375, 376, 385,
+ 386, 387, 390, 389, 388, 391, 392, 393, 394, 395,
+ 404, 0, 408, 409, 0, 0, 410, 396, 402, 397,
+ 398, 399, 401, 403, 400, 422, 424, 423, 426, 427,
+ 428, 429, 425, 445, 446, 447, 448, 449, 450, 451,
+ 452, 453, 454, 455, 456, 461, 479, 480, 481, 484,
+ 482, 483, 485, 486, 487, 488, 497, 498, 499, 500,
+ 501, 324, 349, 364, 464, 465, 371, 372, 358, 359,
+ 0, 0, 0, 363, 405, 406, 407, 362, 360, 361
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223, -223, -223, -223, -223, -223, -223,
- -223, -223, -223, -223
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+ -184, -184
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 13, 14, 24, 197, 15, 25, 367, 16,
- 26, 379, 17, 27, 392, 18, 28, 407, 198, 199,
- 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
- 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- 220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
- 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
- 240, 241, 242, 243, 244, 245, 246, 247, 248, 249,
- 250, 251, 252, 253, 254, 255, 256, 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, 368, 369, 370,
- 371, 372, 373, 380, 381, 382, 383, 384, 408, 409,
- 410, 411, 412, 413, 414, 393, 394, 395, 396, 397,
- 398, 399, 19, 29, 423, 424, 425, 426, 427, 428,
- 429, 430, 431, 20, 30, 444, 445, 446, 447, 448,
- 449, 450, 451, 452, 453, 454, 455, 456, 21, 31,
- 458, 459, 357, 358, 359, 360, 22, 32, 470, 471,
- 472, 473, 474, 475, 476, 477, 478, 479, 480, 23,
- 33, 483, 484, 485
+ -1, 1, 13, 14, 24, 201, 15, 25, 375, 16,
+ 26, 387, 17, 27, 400, 18, 28, 416, 202, 203,
+ 204, 205, 206, 207, 208, 209, 210, 211, 212, 213,
+ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
+ 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,
+ 244, 245, 246, 247, 248, 249, 250, 251, 252, 253,
+ 254, 255, 256, 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, 376, 377, 378, 379, 380, 381, 388, 389, 390,
+ 391, 392, 417, 418, 419, 420, 421, 422, 423, 424,
+ 401, 402, 403, 404, 405, 406, 407, 19, 29, 433,
+ 434, 435, 436, 437, 438, 439, 440, 441, 20, 30,
+ 454, 455, 456, 457, 458, 459, 460, 461, 462, 463,
+ 464, 465, 466, 21, 31, 468, 469, 365, 366, 367,
+ 368, 22, 32, 480, 481, 482, 483, 484, 485, 486,
+ 487, 488, 489, 490, 23, 33, 496, 497, 498, 499,
+ 500, 501
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -1454,116 +1486,118 @@ static const yytype_int16 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_uint16 yytable[] =
{
- 2, 385, 481, 482, 361, 400, 362, 363, 457, 374,
- 0, 3, 486, 487, 488, 489, 490, 375, 376, 432,
- 433, 434, 435, 436, 437, 438, 439, 440, 441, 442,
- 443, 491, 492, 493, 494, 495, 496, 386, 387, 497,
- 498, 4, 499, 500, 501, 502, 503, 5, 460, 461,
- 462, 463, 464, 465, 466, 467, 468, 469, 504, 505,
- 506, 507, 388, 508, 509, 510, 511, 364, 415, 416,
- 417, 418, 419, 420, 421, 422, 512, 513, 514, 515,
- 516, 517, 518, 519, 520, 521, 522, 523, 524, 525,
- 526, 6, 527, 528, 529, 530, 531, 365, 532, 533,
- 366, 377, 534, 378, 535, 536, 537, 7, 538, 539,
- 540, 541, 542, 543, 544, 545, 546, 547, 548, 549,
- 550, 389, 390, 551, 552, 553, 554, 555, 556, 557,
- 558, 559, 560, 561, 562, 563, 564, 565, 566, 567,
- 568, 569, 570, 571, 572, 573, 8, 574, 575, 576,
- 577, 578, 579, 580, 581, 582, 391, 583, 584, 585,
- 586, 587, 588, 589, 590, 591, 592, 593, 594, 595,
- 596, 597, 598, 599, 600, 601, 602, 603, 604, 605,
- 606, 607, 608, 609, 610, 611, 612, 613, 614, 615,
- 616, 617, 401, 9, 402, 403, 404, 405, 406, 618,
- 619, 620, 621, 622, 623, 624, 10, 625, 626, 627,
- 628, 629, 630, 631, 632, 633, 634, 635, 636, 637,
- 638, 639, 640, 11, 641, 642, 643, 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, 644, 645, 646,
- 647, 62, 63, 64, 648, 649, 650, 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, 651, 652,
- 653, 654, 655, 656, 657, 658, 659, 106, 107, 108,
- 660, 109, 110, 111, 661, 662, 112, 113, 114, 115,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
- 126, 127, 128, 129, 130, 131, 132, 133, 134, 663,
- 664, 665, 135, 666, 136, 137, 138, 139, 140, 141,
- 142, 143, 144, 667, 668, 669, 670, 671, 672, 673,
- 674, 675, 676, 677, 678, 679, 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,
- 680, 179, 681, 180, 181, 182, 183, 184, 185, 186,
- 187, 188, 189, 682, 683, 684, 685, 686, 687, 688,
- 689, 690, 691, 692, 190, 191, 192, 193, 194, 195,
- 693, 694, 695, 196, 696, 697, 698, 699, 700, 701,
- 702, 703, 704, 705, 706, 707, 708, 709, 710, 711,
- 712, 713, 714, 715, 716, 717, 718, 719, 720, 721,
- 722, 723, 724, 725
+ 2, 408, 393, 369, 467, 370, 371, 502, 382, 503,
+ 0, 3, 504, 505, 506, 507, 383, 384, 442, 443,
+ 444, 445, 446, 447, 448, 449, 450, 451, 452, 453,
+ 425, 426, 427, 428, 429, 430, 431, 432, 394, 395,
+ 508, 4, 491, 492, 493, 494, 495, 5, 470, 471,
+ 472, 473, 474, 475, 476, 477, 478, 479, 509, 510,
+ 511, 512, 513, 396, 514, 515, 372, 516, 517, 518,
+ 519, 520, 521, 522, 523, 524, 525, 526, 527, 528,
+ 529, 530, 531, 532, 533, 534, 535, 536, 537, 538,
+ 539, 6, 540, 541, 542, 543, 373, 544, 545, 374,
+ 385, 546, 386, 547, 548, 549, 550, 7, 551, 552,
+ 553, 554, 555, 556, 557, 558, 559, 560, 561, 562,
+ 563, 564, 397, 398, 565, 566, 567, 568, 569, 570,
+ 571, 572, 573, 574, 575, 576, 577, 578, 579, 580,
+ 581, 582, 583, 584, 585, 586, 8, 587, 588, 589,
+ 590, 591, 592, 593, 594, 595, 596, 399, 597, 598,
+ 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, 409, 9, 410, 411, 412, 413, 414, 631,
+ 632, 633, 415, 634, 635, 636, 637, 10, 638, 639,
+ 640, 641, 642, 643, 644, 645, 646, 647, 648, 649,
+ 650, 651, 652, 653, 11, 654, 655, 656, 657, 658,
+ 659, 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, 660, 661, 662, 663, 62, 63, 64, 664, 665,
+ 666, 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, 667, 668, 669, 670, 671, 672, 673, 674,
+ 675, 106, 107, 108, 676, 109, 110, 111, 677, 678,
+ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
+ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
+ 132, 133, 134, 679, 680, 681, 135, 682, 136, 137,
+ 138, 139, 140, 141, 142, 143, 144, 683, 684, 685,
+ 686, 687, 688, 689, 690, 691, 692, 693, 694, 695,
+ 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, 696, 179, 697, 180, 181, 182,
+ 183, 184, 185, 186, 187, 188, 189, 190, 698, 699,
+ 700, 701, 702, 703, 704, 705, 706, 707, 708, 191,
+ 192, 193, 194, 195, 196, 709, 710, 711, 712, 713,
+ 714, 197, 715, 716, 717, 718, 719, 720, 721, 198,
+ 199, 200, 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
};
static const yytype_int16 yycheck[] =
{
- 0, 40, 224, 225, 40, 40, 42, 43, 108, 40,
- -1, 11, 10, 10, 10, 10, 10, 48, 49, 147,
- 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
- 158, 10, 10, 10, 10, 10, 10, 76, 77, 10,
- 10, 41, 10, 10, 10, 10, 10, 47, 207, 208,
- 209, 210, 211, 212, 213, 214, 215, 216, 10, 10,
- 10, 10, 101, 10, 10, 10, 10, 103, 92, 93,
- 94, 95, 96, 97, 98, 99, 10, 10, 10, 10,
+ 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,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 91, 10, 10, 10, 10, 10, 133, 10, 10,
- 136, 132, 10, 134, 10, 10, 10, 107, 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, 160, 161, 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, 195, 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, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 227, 193, 229, 230, 231, 232, 233, 10,
- 10, 10, 10, 10, 10, 10, 206, 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, 223, 10, 10, 10, -1, 228, 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, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 217, 218, 219, 220, 221, 222,
- 10, 10, 10, 226, 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, 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, 235, 0, 11, 41, 47, 91, 107, 146, 193,
- 206, 223, 228, 236, 237, 240, 243, 246, 249, 436,
- 447, 462, 470, 483, 238, 241, 244, 247, 250, 437,
- 448, 463, 471, 484, 12, 13, 14, 15, 16, 17,
+ 0, 243, 0, 11, 41, 47, 91, 107, 146, 193,
+ 207, 224, 232, 244, 245, 248, 251, 254, 257, 449,
+ 460, 475, 483, 496, 246, 249, 252, 255, 258, 450,
+ 461, 476, 484, 497, 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,
@@ -1579,36 +1613,38 @@ static const yytype_uint16 yystos[] =
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,
- 217, 218, 219, 220, 221, 222, 226, 239, 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,
- 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, 466, 467, 468,
- 469, 40, 42, 43, 103, 133, 136, 242, 411, 412,
- 413, 414, 415, 416, 40, 48, 49, 132, 134, 245,
- 417, 418, 419, 420, 421, 40, 76, 77, 101, 160,
- 161, 195, 248, 429, 430, 431, 432, 433, 434, 435,
- 40, 227, 229, 230, 231, 232, 233, 251, 422, 423,
- 424, 425, 426, 427, 428, 92, 93, 94, 95, 96,
- 97, 98, 99, 438, 439, 440, 441, 442, 443, 444,
- 445, 446, 147, 148, 149, 150, 151, 152, 153, 154,
- 155, 156, 157, 158, 449, 450, 451, 452, 453, 454,
- 455, 456, 457, 458, 459, 460, 461, 108, 464, 465,
- 207, 208, 209, 210, 211, 212, 213, 214, 215, 216,
- 472, 473, 474, 475, 476, 477, 478, 479, 480, 481,
- 482, 224, 225, 485, 486, 487, 10, 10, 10, 10,
+ 206, 218, 219, 220, 221, 222, 223, 230, 238, 239,
+ 240, 247, 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, 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, 479, 480, 481, 482, 40,
+ 42, 43, 103, 133, 136, 250, 423, 424, 425, 426,
+ 427, 428, 40, 48, 49, 132, 134, 253, 429, 430,
+ 431, 432, 433, 40, 76, 77, 101, 160, 161, 195,
+ 256, 442, 443, 444, 445, 446, 447, 448, 40, 231,
+ 233, 234, 235, 236, 237, 241, 259, 434, 435, 436,
+ 437, 438, 439, 440, 441, 92, 93, 94, 95, 96,
+ 97, 98, 99, 451, 452, 453, 454, 455, 456, 457,
+ 458, 459, 147, 148, 149, 150, 151, 152, 153, 154,
+ 155, 156, 157, 158, 462, 463, 464, 465, 466, 467,
+ 468, 469, 470, 471, 472, 473, 474, 108, 477, 478,
+ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
+ 485, 486, 487, 488, 489, 490, 491, 492, 493, 494,
+ 495, 225, 226, 227, 228, 229, 498, 499, 500, 501,
+ 502, 503, 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,
@@ -1632,61 +1668,63 @@ 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
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_uint16 yyr1[] =
{
- 0, 234, 235, 235, 236, 236, 236, 236, 236, 236,
- 236, 236, 236, 236, 237, 238, 238, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 240, 241, 241, 242, 242, 242, 242, 242, 242, 243,
- 244, 244, 245, 245, 245, 245, 245, 246, 247, 247,
- 248, 248, 248, 248, 248, 248, 248, 249, 250, 250,
- 251, 251, 251, 251, 251, 251, 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, 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, 437, 438, 438, 438, 438, 438, 438,
- 438, 438, 439, 440, 441, 442, 443, 444, 445, 446,
- 447, 448, 448, 449, 449, 449, 449, 449, 449, 449,
- 449, 449, 449, 449, 449, 450, 451, 452, 453, 454,
- 455, 456, 457, 458, 459, 460, 461, 462, 463, 463,
- 464, 465, 466, 467, 468, 469, 470, 471, 471, 472,
- 472, 472, 472, 472, 472, 472, 472, 472, 472, 473,
- 474, 475, 476, 477, 478, 479, 480, 481, 482, 483,
- 484, 484, 485, 485, 486, 487
+ 0, 242, 243, 243, 244, 244, 244, 244, 244, 244,
+ 244, 244, 244, 244, 245, 246, 246, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
+ 247, 247, 247, 247, 248, 249, 249, 250, 250, 250,
+ 250, 250, 250, 251, 252, 252, 253, 253, 253, 253,
+ 253, 254, 255, 255, 256, 256, 256, 256, 256, 256,
+ 256, 257, 258, 258, 259, 259, 259, 259, 259, 259,
+ 259, 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, 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, 444, 445, 446, 447,
+ 448, 449, 450, 450, 451, 451, 451, 451, 451, 451,
+ 451, 451, 452, 453, 454, 455, 456, 457, 458, 459,
+ 460, 461, 461, 462, 462, 462, 462, 462, 462, 462,
+ 462, 462, 462, 462, 462, 463, 464, 465, 466, 467,
+ 468, 469, 470, 471, 472, 473, 474, 475, 476, 476,
+ 477, 478, 479, 480, 481, 482, 483, 484, 484, 485,
+ 485, 485, 485, 485, 485, 485, 485, 485, 485, 486,
+ 487, 488, 489, 490, 491, 492, 493, 494, 495, 496,
+ 497, 497, 498, 498, 498, 498, 498, 499, 500, 501,
+ 502, 503
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -1710,11 +1748,11 @@ 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, 2, 0, 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, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 2, 0, 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, 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,
@@ -1723,12 +1761,13 @@ 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, 2, 3, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 3, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 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, 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, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 3, 3, 3, 2, 2,
@@ -1740,7 +1779,8 @@ static const yytype_uint8 yyr2[] =
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, 2, 2
+ 2, 0, 1, 1, 1, 1, 1, 2, 2, 2,
+ 2, 2
};
@@ -2417,15 +2457,15 @@ yyreduce:
switch (yyn)
{
case 14:
-#line 170 "util/configparser.y" /* yacc.c:1646 */
+#line 173 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(server:)\n"));
}
-#line 2425 "util/configparser.c" /* yacc.c:1646 */
+#line 2465 "util/configparser.c" /* yacc.c:1646 */
break;
- case 180:
-#line 250 "util/configparser.y" /* yacc.c:1646 */
+ case 184:
+#line 255 "util/configparser.y" /* yacc.c:1646 */
{
struct config_stub* s;
OUTYY(("\nP(stub_zone:)\n"));
@@ -2436,11 +2476,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2440 "util/configparser.c" /* yacc.c:1646 */
+#line 2480 "util/configparser.c" /* yacc.c:1646 */
break;
- case 189:
-#line 267 "util/configparser.y" /* yacc.c:1646 */
+ case 193:
+#line 272 "util/configparser.y" /* yacc.c:1646 */
{
struct config_stub* s;
OUTYY(("\nP(forward_zone:)\n"));
@@ -2451,11 +2491,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2455 "util/configparser.c" /* yacc.c:1646 */
+#line 2495 "util/configparser.c" /* yacc.c:1646 */
break;
- case 197:
-#line 284 "util/configparser.y" /* yacc.c:1646 */
+ case 201:
+#line 289 "util/configparser.y" /* yacc.c:1646 */
{
struct config_view* s;
OUTYY(("\nP(view:)\n"));
@@ -2468,11 +2508,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2472 "util/configparser.c" /* yacc.c:1646 */
+#line 2512 "util/configparser.c" /* yacc.c:1646 */
break;
- case 207:
-#line 303 "util/configparser.y" /* yacc.c:1646 */
+ case 211:
+#line 308 "util/configparser.y" /* yacc.c:1646 */
{
struct config_auth* s;
OUTYY(("\nP(auth_zone:)\n"));
@@ -2487,11 +2527,11 @@ yyreduce:
} else
yyerror("out of memory");
}
-#line 2491 "util/configparser.c" /* yacc.c:1646 */
+#line 2531 "util/configparser.c" /* yacc.c:1646 */
break;
- case 217:
-#line 324 "util/configparser.y" /* yacc.c:1646 */
+ case 222:
+#line 330 "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)
@@ -2499,11 +2539,11 @@ yyreduce:
else cfg_parser->cfg->num_threads = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2503 "util/configparser.c" /* yacc.c:1646 */
+#line 2543 "util/configparser.c" /* yacc.c:1646 */
break;
- case 218:
-#line 333 "util/configparser.y" /* yacc.c:1646 */
+ case 223:
+#line 339 "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)
@@ -2511,11 +2551,11 @@ yyreduce:
else cfg_parser->cfg->verbosity = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2515 "util/configparser.c" /* yacc.c:1646 */
+#line 2555 "util/configparser.c" /* yacc.c:1646 */
break;
- case 219:
-#line 342 "util/configparser.y" /* yacc.c:1646 */
+ case 224:
+#line 348 "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)
@@ -2525,11 +2565,11 @@ yyreduce:
else cfg_parser->cfg->stat_interval = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2529 "util/configparser.c" /* yacc.c:1646 */
+#line 2569 "util/configparser.c" /* yacc.c:1646 */
break;
- case 220:
-#line 353 "util/configparser.y" /* yacc.c:1646 */
+ case 225:
+#line 359 "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)
@@ -2537,11 +2577,11 @@ yyreduce:
else cfg_parser->cfg->stat_cumulative = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2541 "util/configparser.c" /* yacc.c:1646 */
+#line 2581 "util/configparser.c" /* yacc.c:1646 */
break;
- case 221:
-#line 362 "util/configparser.y" /* yacc.c:1646 */
+ case 226:
+#line 368 "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)
@@ -2549,11 +2589,11 @@ yyreduce:
else cfg_parser->cfg->stat_extended = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2553 "util/configparser.c" /* yacc.c:1646 */
+#line 2593 "util/configparser.c" /* yacc.c:1646 */
break;
- case 222:
-#line 371 "util/configparser.y" /* yacc.c:1646 */
+ case 227:
+#line 377 "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)
@@ -2561,11 +2601,11 @@ yyreduce:
else cfg_parser->cfg->shm_enable = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2565 "util/configparser.c" /* yacc.c:1646 */
+#line 2605 "util/configparser.c" /* yacc.c:1646 */
break;
- case 223:
-#line 380 "util/configparser.y" /* yacc.c:1646 */
+ case 228:
+#line 386 "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)
@@ -2575,11 +2615,11 @@ yyreduce:
else cfg_parser->cfg->shm_key = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2579 "util/configparser.c" /* yacc.c:1646 */
+#line 2619 "util/configparser.c" /* yacc.c:1646 */
break;
- case 224:
-#line 391 "util/configparser.y" /* yacc.c:1646 */
+ case 229:
+#line 397 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2587,11 +2627,11 @@ yyreduce:
else cfg_parser->cfg->port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2591 "util/configparser.c" /* yacc.c:1646 */
+#line 2631 "util/configparser.c" /* yacc.c:1646 */
break;
- case 225:
-#line 400 "util/configparser.y" /* yacc.c:1646 */
+ case 230:
+#line 406 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_send_client_subnet:%s)\n", (yyvsp[0].str)));
@@ -2601,11 +2641,11 @@ yyreduce:
OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
#endif
}
-#line 2605 "util/configparser.c" /* yacc.c:1646 */
+#line 2645 "util/configparser.c" /* yacc.c:1646 */
break;
- case 226:
-#line 411 "util/configparser.y" /* yacc.c:1646 */
+ case 231:
+#line 417 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_zone:%s)\n", (yyvsp[0].str)));
@@ -2616,11 +2656,11 @@ yyreduce:
OUTYY(("P(Compiled without edns subnet option, ignoring)\n"));
#endif
}
-#line 2620 "util/configparser.c" /* yacc.c:1646 */
+#line 2660 "util/configparser.c" /* yacc.c:1646 */
break;
- case 227:
-#line 424 "util/configparser.y" /* yacc.c:1646 */
+ case 232:
+#line 430 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(server_client_subnet_always_forward:%s)\n", (yyvsp[0].str)));
@@ -2634,11 +2674,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2638 "util/configparser.c" /* yacc.c:1646 */
+#line 2678 "util/configparser.c" /* yacc.c:1646 */
break;
- case 228:
-#line 439 "util/configparser.y" /* yacc.c:1646 */
+ case 233:
+#line 445 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(client_subnet_opcode:%s)\n", (yyvsp[0].str)));
@@ -2648,11 +2688,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2652 "util/configparser.c" /* yacc.c:1646 */
+#line 2692 "util/configparser.c" /* yacc.c:1646 */
break;
- case 229:
-#line 450 "util/configparser.y" /* yacc.c:1646 */
+ case 234:
+#line 456 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv4:%s)\n", (yyvsp[0].str)));
@@ -2668,11 +2708,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2672 "util/configparser.c" /* yacc.c:1646 */
+#line 2712 "util/configparser.c" /* yacc.c:1646 */
break;
- case 230:
-#line 467 "util/configparser.y" /* yacc.c:1646 */
+ case 235:
+#line 473 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef CLIENT_SUBNET
OUTYY(("P(max_client_subnet_ipv6:%s)\n", (yyvsp[0].str)));
@@ -2688,11 +2728,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 2692 "util/configparser.c" /* yacc.c:1646 */
+#line 2732 "util/configparser.c" /* yacc.c:1646 */
break;
- case 231:
-#line 484 "util/configparser.y" /* yacc.c:1646 */
+ case 236:
+#line 490 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_ifs == 0)
@@ -2704,11 +2744,11 @@ yyreduce:
else
cfg_parser->cfg->ifs[cfg_parser->cfg->num_ifs++] = (yyvsp[0].str);
}
-#line 2708 "util/configparser.c" /* yacc.c:1646 */
+#line 2748 "util/configparser.c" /* yacc.c:1646 */
break;
- case 232:
-#line 497 "util/configparser.y" /* yacc.c:1646 */
+ case 237:
+#line 503 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_interface:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->num_out_ifs == 0)
@@ -2722,11 +2762,11 @@ yyreduce:
cfg_parser->cfg->out_ifs[
cfg_parser->cfg->num_out_ifs++] = (yyvsp[0].str);
}
-#line 2726 "util/configparser.c" /* yacc.c:1646 */
+#line 2766 "util/configparser.c" /* yacc.c:1646 */
break;
- case 233:
-#line 512 "util/configparser.y" /* yacc.c:1646 */
+ case 238:
+#line 518 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_outgoing_range:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2734,11 +2774,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_ports = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2738 "util/configparser.c" /* yacc.c:1646 */
+#line 2778 "util/configparser.c" /* yacc.c:1646 */
break;
- case 234:
-#line 521 "util/configparser.y" /* yacc.c:1646 */
+ case 239:
+#line 527 "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,
@@ -2746,11 +2786,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 2750 "util/configparser.c" /* yacc.c:1646 */
+#line 2790 "util/configparser.c" /* yacc.c:1646 */
break;
- case 235:
-#line 530 "util/configparser.y" /* yacc.c:1646 */
+ case 240:
+#line 536 "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,
@@ -2758,11 +2798,11 @@ yyreduce:
yyerror("port number or range (\"low-high\") expected");
free((yyvsp[0].str));
}
-#line 2762 "util/configparser.c" /* yacc.c:1646 */
+#line 2802 "util/configparser.c" /* yacc.c:1646 */
break;
- case 236:
-#line 539 "util/configparser.y" /* yacc.c:1646 */
+ case 241:
+#line 545 "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)
@@ -2770,11 +2810,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2774 "util/configparser.c" /* yacc.c:1646 */
+#line 2814 "util/configparser.c" /* yacc.c:1646 */
break;
- case 237:
-#line 548 "util/configparser.y" /* yacc.c:1646 */
+ case 242:
+#line 554 "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)
@@ -2782,11 +2822,11 @@ yyreduce:
else cfg_parser->cfg->incoming_num_tcp = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2786 "util/configparser.c" /* yacc.c:1646 */
+#line 2826 "util/configparser.c" /* yacc.c:1646 */
break;
- case 238:
-#line 557 "util/configparser.y" /* yacc.c:1646 */
+ case 243:
+#line 563 "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)
@@ -2794,11 +2834,11 @@ yyreduce:
else cfg_parser->cfg->if_automatic = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2798 "util/configparser.c" /* yacc.c:1646 */
+#line 2838 "util/configparser.c" /* yacc.c:1646 */
break;
- case 239:
-#line 566 "util/configparser.y" /* yacc.c:1646 */
+ case 244:
+#line 572 "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)
@@ -2806,11 +2846,11 @@ yyreduce:
else cfg_parser->cfg->do_ip4 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2810 "util/configparser.c" /* yacc.c:1646 */
+#line 2850 "util/configparser.c" /* yacc.c:1646 */
break;
- case 240:
-#line 575 "util/configparser.y" /* yacc.c:1646 */
+ case 245:
+#line 581 "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)
@@ -2818,11 +2858,11 @@ yyreduce:
else cfg_parser->cfg->do_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2822 "util/configparser.c" /* yacc.c:1646 */
+#line 2862 "util/configparser.c" /* yacc.c:1646 */
break;
- case 241:
-#line 584 "util/configparser.y" /* yacc.c:1646 */
+ case 246:
+#line 590 "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)
@@ -2830,11 +2870,11 @@ yyreduce:
else cfg_parser->cfg->do_udp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2834 "util/configparser.c" /* yacc.c:1646 */
+#line 2874 "util/configparser.c" /* yacc.c:1646 */
break;
- case 242:
-#line 593 "util/configparser.y" /* yacc.c:1646 */
+ case 247:
+#line 599 "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)
@@ -2842,11 +2882,11 @@ yyreduce:
else cfg_parser->cfg->do_tcp = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2846 "util/configparser.c" /* yacc.c:1646 */
+#line 2886 "util/configparser.c" /* yacc.c:1646 */
break;
- case 243:
-#line 602 "util/configparser.y" /* yacc.c:1646 */
+ case 248:
+#line 608 "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)
@@ -2854,11 +2894,11 @@ yyreduce:
else cfg_parser->cfg->prefer_ip6 = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2858 "util/configparser.c" /* yacc.c:1646 */
+#line 2898 "util/configparser.c" /* yacc.c:1646 */
break;
- case 244:
-#line 611 "util/configparser.y" /* yacc.c:1646 */
+ case 249:
+#line 617 "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)
@@ -2866,11 +2906,11 @@ yyreduce:
else cfg_parser->cfg->tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2870 "util/configparser.c" /* yacc.c:1646 */
+#line 2910 "util/configparser.c" /* yacc.c:1646 */
break;
- case 245:
-#line 620 "util/configparser.y" /* yacc.c:1646 */
+ case 250:
+#line 626 "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)
@@ -2878,11 +2918,11 @@ yyreduce:
else cfg_parser->cfg->outgoing_tcp_mss = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2882 "util/configparser.c" /* yacc.c:1646 */
+#line 2922 "util/configparser.c" /* yacc.c:1646 */
break;
- case 246:
-#line 629 "util/configparser.y" /* yacc.c:1646 */
+ case 251:
+#line 635 "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)
@@ -2890,11 +2930,11 @@ yyreduce:
else cfg_parser->cfg->tcp_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2894 "util/configparser.c" /* yacc.c:1646 */
+#line 2934 "util/configparser.c" /* yacc.c:1646 */
break;
- case 247:
-#line 638 "util/configparser.y" /* yacc.c:1646 */
+ case 252:
+#line 644 "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)
@@ -2902,11 +2942,11 @@ yyreduce:
else cfg_parser->cfg->udp_upstream_without_downstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2906 "util/configparser.c" /* yacc.c:1646 */
+#line 2946 "util/configparser.c" /* yacc.c:1646 */
break;
- case 248:
-#line 647 "util/configparser.y" /* yacc.c:1646 */
+ case 253:
+#line 653 "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)
@@ -2914,31 +2954,31 @@ yyreduce:
else cfg_parser->cfg->ssl_upstream = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2918 "util/configparser.c" /* yacc.c:1646 */
+#line 2958 "util/configparser.c" /* yacc.c:1646 */
break;
- case 249:
-#line 656 "util/configparser.y" /* yacc.c:1646 */
+ case 254:
+#line 662 "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 2928 "util/configparser.c" /* yacc.c:1646 */
+#line 2968 "util/configparser.c" /* yacc.c:1646 */
break;
- case 250:
-#line 663 "util/configparser.y" /* yacc.c:1646 */
+ case 255:
+#line 669 "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 2938 "util/configparser.c" /* yacc.c:1646 */
+#line 2978 "util/configparser.c" /* yacc.c:1646 */
break;
- case 251:
-#line 670 "util/configparser.y" /* yacc.c:1646 */
+ case 256:
+#line 676 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ssl_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -2946,21 +2986,32 @@ yyreduce:
else cfg_parser->cfg->ssl_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 2950 "util/configparser.c" /* yacc.c:1646 */
+#line 2990 "util/configparser.c" /* yacc.c:1646 */
break;
- case 252:
-#line 679 "util/configparser.y" /* yacc.c:1646 */
+ case 257:
+#line 685 "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 2960 "util/configparser.c" /* yacc.c:1646 */
+#line 3000 "util/configparser.c" /* yacc.c:1646 */
break;
- case 253:
-#line 686 "util/configparser.y" /* yacc.c:1646 */
+ case 258:
+#line 692 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_additional_tls_port:%s)\n", (yyvsp[0].str)));
+ if(!cfg_strlist_insert(&cfg_parser->cfg->additional_tls_port,
+ (yyvsp[0].str)))
+ yyerror("out of memory");
+ }
+#line 3011 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 259:
+#line 700 "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)
@@ -2968,11 +3019,11 @@ yyreduce:
else cfg_parser->cfg->use_systemd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2972 "util/configparser.c" /* yacc.c:1646 */
+#line 3023 "util/configparser.c" /* yacc.c:1646 */
break;
- case 254:
-#line 695 "util/configparser.y" /* yacc.c:1646 */
+ case 260:
+#line 709 "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)
@@ -2980,11 +3031,11 @@ yyreduce:
else cfg_parser->cfg->do_daemonize = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 2984 "util/configparser.c" /* yacc.c:1646 */
+#line 3035 "util/configparser.c" /* yacc.c:1646 */
break;
- case 255:
-#line 704 "util/configparser.y" /* yacc.c:1646 */
+ case 261:
+#line 718 "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)
@@ -2997,11 +3048,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3001 "util/configparser.c" /* yacc.c:1646 */
+#line 3052 "util/configparser.c" /* yacc.c:1646 */
break;
- case 256:
-#line 718 "util/configparser.y" /* yacc.c:1646 */
+ case 262:
+#line 732 "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)
@@ -3009,11 +3060,11 @@ yyreduce:
else cfg_parser->cfg->log_time_ascii = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3013 "util/configparser.c" /* yacc.c:1646 */
+#line 3064 "util/configparser.c" /* yacc.c:1646 */
break;
- case 257:
-#line 727 "util/configparser.y" /* yacc.c:1646 */
+ case 263:
+#line 741 "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)
@@ -3021,11 +3072,11 @@ yyreduce:
else cfg_parser->cfg->log_queries = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3025 "util/configparser.c" /* yacc.c:1646 */
+#line 3076 "util/configparser.c" /* yacc.c:1646 */
break;
- case 258:
-#line 736 "util/configparser.y" /* yacc.c:1646 */
+ case 264:
+#line 750 "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)
@@ -3033,31 +3084,31 @@ yyreduce:
else cfg_parser->cfg->log_replies = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3037 "util/configparser.c" /* yacc.c:1646 */
+#line 3088 "util/configparser.c" /* yacc.c:1646 */
break;
- case 259:
-#line 745 "util/configparser.y" /* yacc.c:1646 */
+ case 265:
+#line 759 "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 3047 "util/configparser.c" /* yacc.c:1646 */
+#line 3098 "util/configparser.c" /* yacc.c:1646 */
break;
- case 260:
-#line 752 "util/configparser.y" /* yacc.c:1646 */
+ case 266:
+#line 766 "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 3057 "util/configparser.c" /* yacc.c:1646 */
+#line 3108 "util/configparser.c" /* yacc.c:1646 */
break;
- case 261:
-#line 759 "util/configparser.y" /* yacc.c:1646 */
+ case 267:
+#line 773 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_directory:%s)\n", (yyvsp[0].str)));
free(cfg_parser->cfg->directory);
@@ -3082,105 +3133,105 @@ yyreduce:
}
}
}
-#line 3086 "util/configparser.c" /* yacc.c:1646 */
+#line 3137 "util/configparser.c" /* yacc.c:1646 */
break;
- case 262:
-#line 785 "util/configparser.y" /* yacc.c:1646 */
+ case 268:
+#line 799 "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 3097 "util/configparser.c" /* yacc.c:1646 */
+#line 3148 "util/configparser.c" /* yacc.c:1646 */
break;
- case 263:
-#line 793 "util/configparser.y" /* yacc.c:1646 */
+ case 269:
+#line 807 "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 3107 "util/configparser.c" /* yacc.c:1646 */
+#line 3158 "util/configparser.c" /* yacc.c:1646 */
break;
- case 264:
-#line 800 "util/configparser.y" /* yacc.c:1646 */
+ case 270:
+#line 814 "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 3117 "util/configparser.c" /* yacc.c:1646 */
+#line 3168 "util/configparser.c" /* yacc.c:1646 */
break;
- case 265:
-#line 807 "util/configparser.y" /* yacc.c:1646 */
+ case 271:
+#line 821 "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 3127 "util/configparser.c" /* yacc.c:1646 */
+#line 3178 "util/configparser.c" /* yacc.c:1646 */
break;
- case 266:
-#line 814 "util/configparser.y" /* yacc.c:1646 */
+ case 272:
+#line 828 "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 3137 "util/configparser.c" /* yacc.c:1646 */
+#line 3188 "util/configparser.c" /* yacc.c:1646 */
break;
- case 267:
-#line 821 "util/configparser.y" /* yacc.c:1646 */
+ case 273:
+#line 835 "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 3148 "util/configparser.c" /* yacc.c:1646 */
+#line 3199 "util/configparser.c" /* yacc.c:1646 */
break;
- case 268:
-#line 829 "util/configparser.y" /* yacc.c:1646 */
+ case 274:
+#line 843 "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 3159 "util/configparser.c" /* yacc.c:1646 */
+#line 3210 "util/configparser.c" /* yacc.c:1646 */
break;
- case 269:
-#line 837 "util/configparser.y" /* yacc.c:1646 */
+ case 275:
+#line 851 "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 3170 "util/configparser.c" /* yacc.c:1646 */
+#line 3221 "util/configparser.c" /* yacc.c:1646 */
break;
- case 270:
-#line 845 "util/configparser.y" /* yacc.c:1646 */
+ case 276:
+#line 859 "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 3180 "util/configparser.c" /* yacc.c:1646 */
+#line 3231 "util/configparser.c" /* yacc.c:1646 */
break;
- case 271:
-#line 852 "util/configparser.y" /* yacc.c:1646 */
+ case 277:
+#line 866 "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)
@@ -3190,21 +3241,35 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3194 "util/configparser.c" /* yacc.c:1646 */
+#line 3245 "util/configparser.c" /* yacc.c:1646 */
break;
- case 272:
-#line 863 "util/configparser.y" /* yacc.c:1646 */
+ case 278:
+#line 877 "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)
+ yyerror("expected yes or no.");
+ else
+ cfg_parser->cfg->root_key_sentinel =
+ (strcmp((yyvsp[0].str), "yes")==0);
+ free((yyvsp[0].str));
+ }
+#line 3259 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 279:
+#line 888 "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 3204 "util/configparser.c" /* yacc.c:1646 */
+#line 3269 "util/configparser.c" /* yacc.c:1646 */
break;
- case 273:
-#line 870 "util/configparser.y" /* yacc.c:1646 */
+ case 280:
+#line 895 "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)
@@ -3212,11 +3277,11 @@ yyreduce:
else cfg_parser->cfg->hide_identity = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3216 "util/configparser.c" /* yacc.c:1646 */
+#line 3281 "util/configparser.c" /* yacc.c:1646 */
break;
- case 274:
-#line 879 "util/configparser.y" /* yacc.c:1646 */
+ case 281:
+#line 904 "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)
@@ -3224,11 +3289,11 @@ yyreduce:
else cfg_parser->cfg->hide_version = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3228 "util/configparser.c" /* yacc.c:1646 */
+#line 3293 "util/configparser.c" /* yacc.c:1646 */
break;
- case 275:
-#line 888 "util/configparser.y" /* yacc.c:1646 */
+ case 282:
+#line 913 "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)
@@ -3236,53 +3301,53 @@ yyreduce:
else cfg_parser->cfg->hide_trustanchor = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3240 "util/configparser.c" /* yacc.c:1646 */
+#line 3305 "util/configparser.c" /* yacc.c:1646 */
break;
- case 276:
-#line 897 "util/configparser.y" /* yacc.c:1646 */
+ case 283:
+#line 922 "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 3250 "util/configparser.c" /* yacc.c:1646 */
+#line 3315 "util/configparser.c" /* yacc.c:1646 */
break;
- case 277:
-#line 904 "util/configparser.y" /* yacc.c:1646 */
+ case 284:
+#line 929 "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 3260 "util/configparser.c" /* yacc.c:1646 */
+#line 3325 "util/configparser.c" /* yacc.c:1646 */
break;
- case 278:
-#line 911 "util/configparser.y" /* yacc.c:1646 */
+ case 285:
+#line 936 "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 3271 "util/configparser.c" /* yacc.c:1646 */
+#line 3336 "util/configparser.c" /* yacc.c:1646 */
break;
- case 279:
-#line 919 "util/configparser.y" /* yacc.c:1646 */
+ case 286:
+#line 944 "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 3282 "util/configparser.c" /* yacc.c:1646 */
+#line 3347 "util/configparser.c" /* yacc.c:1646 */
break;
- case 280:
-#line 927 "util/configparser.y" /* yacc.c:1646 */
+ case 287:
+#line 952 "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)
@@ -3291,11 +3356,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3295 "util/configparser.c" /* yacc.c:1646 */
+#line 3360 "util/configparser.c" /* yacc.c:1646 */
break;
- case 281:
-#line 937 "util/configparser.y" /* yacc.c:1646 */
+ case 288:
+#line 962 "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)
@@ -3304,11 +3369,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3308 "util/configparser.c" /* yacc.c:1646 */
+#line 3373 "util/configparser.c" /* yacc.c:1646 */
break;
- case 282:
-#line 947 "util/configparser.y" /* yacc.c:1646 */
+ case 289:
+#line 972 "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)
@@ -3317,11 +3382,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3321 "util/configparser.c" /* yacc.c:1646 */
+#line 3386 "util/configparser.c" /* yacc.c:1646 */
break;
- case 283:
-#line 957 "util/configparser.y" /* yacc.c:1646 */
+ case 290:
+#line 982 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_edns_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3333,11 +3398,11 @@ yyreduce:
else cfg_parser->cfg->edns_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3337 "util/configparser.c" /* yacc.c:1646 */
+#line 3402 "util/configparser.c" /* yacc.c:1646 */
break;
- case 284:
-#line 970 "util/configparser.y" /* yacc.c:1646 */
+ case 291:
+#line 995 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_msg_buffer_size:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3347,22 +3412,22 @@ yyreduce:
else cfg_parser->cfg->msg_buffer_size = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3351 "util/configparser.c" /* yacc.c:1646 */
+#line 3416 "util/configparser.c" /* yacc.c:1646 */
break;
- case 285:
-#line 981 "util/configparser.y" /* yacc.c:1646 */
+ case 292:
+#line 1006 "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 3362 "util/configparser.c" /* yacc.c:1646 */
+#line 3427 "util/configparser.c" /* yacc.c:1646 */
break;
- case 286:
-#line 989 "util/configparser.y" /* yacc.c:1646 */
+ case 293:
+#line 1014 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_msg_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3374,11 +3439,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3378 "util/configparser.c" /* yacc.c:1646 */
+#line 3443 "util/configparser.c" /* yacc.c:1646 */
break;
- case 287:
-#line 1002 "util/configparser.y" /* yacc.c:1646 */
+ case 294:
+#line 1027 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_num_queries_per_thread:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3386,11 +3451,11 @@ yyreduce:
else cfg_parser->cfg->num_queries_per_thread = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3390 "util/configparser.c" /* yacc.c:1646 */
+#line 3455 "util/configparser.c" /* yacc.c:1646 */
break;
- case 288:
-#line 1011 "util/configparser.y" /* yacc.c:1646 */
+ case 295:
+#line 1036 "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)
@@ -3398,11 +3463,11 @@ yyreduce:
else cfg_parser->cfg->jostle_time = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3402 "util/configparser.c" /* yacc.c:1646 */
+#line 3467 "util/configparser.c" /* yacc.c:1646 */
break;
- case 289:
-#line 1020 "util/configparser.y" /* yacc.c:1646 */
+ case 296:
+#line 1045 "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)
@@ -3410,11 +3475,11 @@ yyreduce:
else cfg_parser->cfg->delay_close = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3414 "util/configparser.c" /* yacc.c:1646 */
+#line 3479 "util/configparser.c" /* yacc.c:1646 */
break;
- case 290:
-#line 1029 "util/configparser.y" /* yacc.c:1646 */
+ case 297:
+#line 1054 "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)
@@ -3423,11 +3488,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3427 "util/configparser.c" /* yacc.c:1646 */
+#line 3492 "util/configparser.c" /* yacc.c:1646 */
break;
- case 291:
-#line 1039 "util/configparser.y" /* yacc.c:1646 */
+ case 298:
+#line 1064 "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)
@@ -3436,22 +3501,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3440 "util/configparser.c" /* yacc.c:1646 */
+#line 3505 "util/configparser.c" /* yacc.c:1646 */
break;
- case 292:
-#line 1049 "util/configparser.y" /* yacc.c:1646 */
+ case 299:
+#line 1074 "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 3451 "util/configparser.c" /* yacc.c:1646 */
+#line 3516 "util/configparser.c" /* yacc.c:1646 */
break;
- case 293:
-#line 1057 "util/configparser.y" /* yacc.c:1646 */
+ case 300:
+#line 1082 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_rrset_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3463,11 +3528,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3467 "util/configparser.c" /* yacc.c:1646 */
+#line 3532 "util/configparser.c" /* yacc.c:1646 */
break;
- case 294:
-#line 1070 "util/configparser.y" /* yacc.c:1646 */
+ case 301:
+#line 1095 "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)
@@ -3475,22 +3540,22 @@ yyreduce:
else cfg_parser->cfg->host_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3479 "util/configparser.c" /* yacc.c:1646 */
+#line 3544 "util/configparser.c" /* yacc.c:1646 */
break;
- case 295:
-#line 1079 "util/configparser.y" /* yacc.c:1646 */
+ case 302:
+#line 1104 "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 3490 "util/configparser.c" /* yacc.c:1646 */
+#line 3555 "util/configparser.c" /* yacc.c:1646 */
break;
- case 296:
-#line 1087 "util/configparser.y" /* yacc.c:1646 */
+ case 303:
+#line 1112 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_numhosts:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3498,22 +3563,22 @@ yyreduce:
else cfg_parser->cfg->infra_cache_numhosts = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3502 "util/configparser.c" /* yacc.c:1646 */
+#line 3567 "util/configparser.c" /* yacc.c:1646 */
break;
- case 297:
-#line 1096 "util/configparser.y" /* yacc.c:1646 */
+ case 304:
+#line 1121 "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 3513 "util/configparser.c" /* yacc.c:1646 */
+#line 3578 "util/configparser.c" /* yacc.c:1646 */
break;
- case 298:
-#line 1104 "util/configparser.y" /* yacc.c:1646 */
+ case 305:
+#line 1129 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_infra_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -3525,11 +3590,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3529 "util/configparser.c" /* yacc.c:1646 */
+#line 3594 "util/configparser.c" /* yacc.c:1646 */
break;
- case 299:
-#line 1117 "util/configparser.y" /* yacc.c:1646 */
+ case 306:
+#line 1142 "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)
@@ -3537,21 +3602,21 @@ yyreduce:
else cfg_parser->cfg->infra_cache_min_rtt = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3541 "util/configparser.c" /* yacc.c:1646 */
+#line 3606 "util/configparser.c" /* yacc.c:1646 */
break;
- case 300:
-#line 1126 "util/configparser.y" /* yacc.c:1646 */
+ case 307:
+#line 1151 "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 3551 "util/configparser.c" /* yacc.c:1646 */
+#line 3616 "util/configparser.c" /* yacc.c:1646 */
break;
- case 301:
-#line 1133 "util/configparser.y" /* yacc.c:1646 */
+ case 308:
+#line 1158 "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)
@@ -3560,11 +3625,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3564 "util/configparser.c" /* yacc.c:1646 */
+#line 3629 "util/configparser.c" /* yacc.c:1646 */
break;
- case 302:
-#line 1143 "util/configparser.y" /* yacc.c:1646 */
+ case 309:
+#line 1168 "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)
@@ -3573,11 +3638,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3577 "util/configparser.c" /* yacc.c:1646 */
+#line 3642 "util/configparser.c" /* yacc.c:1646 */
break;
- case 303:
-#line 1153 "util/configparser.y" /* yacc.c:1646 */
+ case 310:
+#line 1178 "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)
@@ -3586,11 +3651,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3590 "util/configparser.c" /* yacc.c:1646 */
+#line 3655 "util/configparser.c" /* yacc.c:1646 */
break;
- case 304:
-#line 1163 "util/configparser.y" /* yacc.c:1646 */
+ case 311:
+#line 1188 "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)
@@ -3599,11 +3664,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3603 "util/configparser.c" /* yacc.c:1646 */
+#line 3668 "util/configparser.c" /* yacc.c:1646 */
break;
- case 305:
-#line 1173 "util/configparser.y" /* yacc.c:1646 */
+ case 312:
+#line 1198 "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)
@@ -3612,11 +3677,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3616 "util/configparser.c" /* yacc.c:1646 */
+#line 3681 "util/configparser.c" /* yacc.c:1646 */
break;
- case 306:
-#line 1183 "util/configparser.y" /* yacc.c:1646 */
+ case 313:
+#line 1208 "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)
@@ -3625,11 +3690,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3629 "util/configparser.c" /* yacc.c:1646 */
+#line 3694 "util/configparser.c" /* yacc.c:1646 */
break;
- case 307:
-#line 1193 "util/configparser.y" /* yacc.c:1646 */
+ case 314:
+#line 1218 "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)
@@ -3638,11 +3703,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3642 "util/configparser.c" /* yacc.c:1646 */
+#line 3707 "util/configparser.c" /* yacc.c:1646 */
break;
- case 308:
-#line 1203 "util/configparser.y" /* yacc.c:1646 */
+ case 315:
+#line 1228 "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)
@@ -3651,41 +3716,41 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3655 "util/configparser.c" /* yacc.c:1646 */
+#line 3720 "util/configparser.c" /* yacc.c:1646 */
break;
- case 309:
-#line 1213 "util/configparser.y" /* yacc.c:1646 */
+ case 316:
+#line 1238 "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 3665 "util/configparser.c" /* yacc.c:1646 */
+#line 3730 "util/configparser.c" /* yacc.c:1646 */
break;
- case 310:
-#line 1220 "util/configparser.y" /* yacc.c:1646 */
+ case 317:
+#line 1245 "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 3675 "util/configparser.c" /* yacc.c:1646 */
+#line 3740 "util/configparser.c" /* yacc.c:1646 */
break;
- case 311:
-#line 1227 "util/configparser.y" /* yacc.c:1646 */
+ case 318:
+#line 1252 "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 3685 "util/configparser.c" /* yacc.c:1646 */
+#line 3750 "util/configparser.c" /* yacc.c:1646 */
break;
- case 312:
-#line 1234 "util/configparser.y" /* yacc.c:1646 */
+ case 319:
+#line 1259 "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)
@@ -3693,11 +3758,11 @@ yyreduce:
else cfg_parser->cfg->prefetch = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3697 "util/configparser.c" /* yacc.c:1646 */
+#line 3762 "util/configparser.c" /* yacc.c:1646 */
break;
- case 313:
-#line 1243 "util/configparser.y" /* yacc.c:1646 */
+ case 320:
+#line 1268 "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)
@@ -3705,11 +3770,11 @@ yyreduce:
else cfg_parser->cfg->prefetch_key = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3709 "util/configparser.c" /* yacc.c:1646 */
+#line 3774 "util/configparser.c" /* yacc.c:1646 */
break;
- case 314:
-#line 1252 "util/configparser.y" /* yacc.c:1646 */
+ case 321:
+#line 1277 "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)
@@ -3717,21 +3782,21 @@ yyreduce:
else cfg_parser->cfg->unwanted_threshold = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3721 "util/configparser.c" /* yacc.c:1646 */
+#line 3786 "util/configparser.c" /* yacc.c:1646 */
break;
- case 315:
-#line 1261 "util/configparser.y" /* yacc.c:1646 */
+ case 322:
+#line 1286 "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 3731 "util/configparser.c" /* yacc.c:1646 */
+#line 3796 "util/configparser.c" /* yacc.c:1646 */
break;
- case 316:
-#line 1268 "util/configparser.y" /* yacc.c:1646 */
+ case 323:
+#line 1293 "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)
@@ -3740,11 +3805,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3744 "util/configparser.c" /* yacc.c:1646 */
+#line 3809 "util/configparser.c" /* yacc.c:1646 */
break;
- case 317:
-#line 1278 "util/configparser.y" /* yacc.c:1646 */
+ case 324:
+#line 1303 "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 &&
@@ -3760,21 +3825,21 @@ yyreduce:
fatal_exit("out of memory adding acl");
}
}
-#line 3764 "util/configparser.c" /* yacc.c:1646 */
+#line 3829 "util/configparser.c" /* yacc.c:1646 */
break;
- case 318:
-#line 1295 "util/configparser.y" /* yacc.c:1646 */
+ case 325:
+#line 1320 "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 3774 "util/configparser.c" /* yacc.c:1646 */
+#line 3839 "util/configparser.c" /* yacc.c:1646 */
break;
- case 319:
-#line 1302 "util/configparser.y" /* yacc.c:1646 */
+ case 326:
+#line 1327 "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) {
@@ -3791,11 +3856,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3795 "util/configparser.c" /* yacc.c:1646 */
+#line 3860 "util/configparser.c" /* yacc.c:1646 */
break;
- case 320:
-#line 1320 "util/configparser.y" /* yacc.c:1646 */
+ case 327:
+#line 1345 "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) {
@@ -3807,11 +3872,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3811 "util/configparser.c" /* yacc.c:1646 */
+#line 3876 "util/configparser.c" /* yacc.c:1646 */
break;
- case 321:
-#line 1333 "util/configparser.y" /* yacc.c:1646 */
+ case 328:
+#line 1358 "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) {
@@ -3823,11 +3888,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 3827 "util/configparser.c" /* yacc.c:1646 */
+#line 3892 "util/configparser.c" /* yacc.c:1646 */
break;
- case 322:
-#line 1346 "util/configparser.y" /* yacc.c:1646 */
+ case 329:
+#line 1371 "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)
@@ -3835,11 +3900,11 @@ yyreduce:
else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3839 "util/configparser.c" /* yacc.c:1646 */
+#line 3904 "util/configparser.c" /* yacc.c:1646 */
break;
- case 323:
-#line 1355 "util/configparser.y" /* yacc.c:1646 */
+ case 330:
+#line 1380 "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)
@@ -3847,11 +3912,11 @@ yyreduce:
else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3851 "util/configparser.c" /* yacc.c:1646 */
+#line 3916 "util/configparser.c" /* yacc.c:1646 */
break;
- case 324:
-#line 1364 "util/configparser.y" /* yacc.c:1646 */
+ case 331:
+#line 1389 "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)
@@ -3859,11 +3924,11 @@ yyreduce:
else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3863 "util/configparser.c" /* yacc.c:1646 */
+#line 3928 "util/configparser.c" /* yacc.c:1646 */
break;
- case 325:
-#line 1373 "util/configparser.y" /* yacc.c:1646 */
+ case 332:
+#line 1398 "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)
@@ -3871,11 +3936,11 @@ yyreduce:
else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3875 "util/configparser.c" /* yacc.c:1646 */
+#line 3940 "util/configparser.c" /* yacc.c:1646 */
break;
- case 326:
-#line 1382 "util/configparser.y" /* yacc.c:1646 */
+ case 333:
+#line 1407 "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)
@@ -3884,11 +3949,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3888 "util/configparser.c" /* yacc.c:1646 */
+#line 3953 "util/configparser.c" /* yacc.c:1646 */
break;
- case 327:
-#line 1392 "util/configparser.y" /* yacc.c:1646 */
+ case 334:
+#line 1417 "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)
@@ -3897,11 +3962,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3901 "util/configparser.c" /* yacc.c:1646 */
+#line 3966 "util/configparser.c" /* yacc.c:1646 */
break;
- case 328:
-#line 1402 "util/configparser.y" /* yacc.c:1646 */
+ case 335:
+#line 1427 "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)
@@ -3911,11 +3976,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3915 "util/configparser.c" /* yacc.c:1646 */
+#line 3980 "util/configparser.c" /* yacc.c:1646 */
break;
- case 329:
-#line 1413 "util/configparser.y" /* yacc.c:1646 */
+ case 336:
+#line 1438 "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)
@@ -3923,11 +3988,11 @@ yyreduce:
else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3927 "util/configparser.c" /* yacc.c:1646 */
+#line 3992 "util/configparser.c" /* yacc.c:1646 */
break;
- case 330:
-#line 1422 "util/configparser.y" /* yacc.c:1646 */
+ case 337:
+#line 1447 "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)
@@ -3935,11 +4000,11 @@ yyreduce:
else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 3939 "util/configparser.c" /* yacc.c:1646 */
+#line 4004 "util/configparser.c" /* yacc.c:1646 */
break;
- case 331:
-#line 1431 "util/configparser.y" /* yacc.c:1646 */
+ case 338:
+#line 1456 "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)
@@ -3951,11 +4016,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3955 "util/configparser.c" /* yacc.c:1646 */
+#line 4020 "util/configparser.c" /* yacc.c:1646 */
break;
- case 332:
-#line 1444 "util/configparser.y" /* yacc.c:1646 */
+ case 339:
+#line 1469 "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)
@@ -3967,11 +4032,11 @@ yyreduce:
#endif
free((yyvsp[0].str));
}
-#line 3971 "util/configparser.c" /* yacc.c:1646 */
+#line 4036 "util/configparser.c" /* yacc.c:1646 */
break;
- case 333:
-#line 1457 "util/configparser.y" /* yacc.c:1646 */
+ case 340:
+#line 1482 "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)
@@ -3979,21 +4044,21 @@ yyreduce:
else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 3983 "util/configparser.c" /* yacc.c:1646 */
+#line 4048 "util/configparser.c" /* yacc.c:1646 */
break;
- case 334:
-#line 1466 "util/configparser.y" /* yacc.c:1646 */
+ case 341:
+#line 1491 "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 3993 "util/configparser.c" /* yacc.c:1646 */
+#line 4058 "util/configparser.c" /* yacc.c:1646 */
break;
- case 335:
-#line 1473 "util/configparser.y" /* yacc.c:1646 */
+ case 342:
+#line 1498 "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)
@@ -4001,11 +4066,11 @@ yyreduce:
else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4005 "util/configparser.c" /* yacc.c:1646 */
+#line 4070 "util/configparser.c" /* yacc.c:1646 */
break;
- case 336:
-#line 1482 "util/configparser.y" /* yacc.c:1646 */
+ case 343:
+#line 1507 "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)
@@ -4013,11 +4078,11 @@ yyreduce:
else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4017 "util/configparser.c" /* yacc.c:1646 */
+#line 4082 "util/configparser.c" /* yacc.c:1646 */
break;
- case 337:
-#line 1491 "util/configparser.y" /* yacc.c:1646 */
+ case 344:
+#line 1516 "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)
@@ -4025,11 +4090,11 @@ yyreduce:
else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4029 "util/configparser.c" /* yacc.c:1646 */
+#line 4094 "util/configparser.c" /* yacc.c:1646 */
break;
- case 338:
-#line 1500 "util/configparser.y" /* yacc.c:1646 */
+ case 345:
+#line 1525 "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)
@@ -4038,22 +4103,22 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4042 "util/configparser.c" /* yacc.c:1646 */
+#line 4107 "util/configparser.c" /* yacc.c:1646 */
break;
- case 339:
-#line 1509 "util/configparser.y" /* yacc.c:1646 */
+ case 346:
+#line 1534 "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 4053 "util/configparser.c" /* yacc.c:1646 */
+#line 4118 "util/configparser.c" /* yacc.c:1646 */
break;
- case 340:
-#line 1517 "util/configparser.y" /* yacc.c:1646 */
+ case 347:
+#line 1542 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4065,22 +4130,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4069 "util/configparser.c" /* yacc.c:1646 */
+#line 4134 "util/configparser.c" /* yacc.c:1646 */
break;
- case 341:
-#line 1530 "util/configparser.y" /* yacc.c:1646 */
+ case 348:
+#line 1555 "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 4080 "util/configparser.c" /* yacc.c:1646 */
+#line 4145 "util/configparser.c" /* yacc.c:1646 */
break;
- case 342:
-#line 1538 "util/configparser.y" /* yacc.c:1646 */
+ case 349:
+#line 1563 "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 &&
@@ -4108,21 +4173,21 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 4112 "util/configparser.c" /* yacc.c:1646 */
+#line 4177 "util/configparser.c" /* yacc.c:1646 */
break;
- case 343:
-#line 1567 "util/configparser.y" /* yacc.c:1646 */
+ case 350:
+#line 1592 "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 4122 "util/configparser.c" /* yacc.c:1646 */
+#line 4187 "util/configparser.c" /* yacc.c:1646 */
break;
- case 344:
-#line 1574 "util/configparser.y" /* yacc.c:1646 */
+ case 351:
+#line 1599 "util/configparser.y" /* yacc.c:1646 */
{
char* ptr;
OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -4136,11 +4201,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 4140 "util/configparser.c" /* yacc.c:1646 */
+#line 4205 "util/configparser.c" /* yacc.c:1646 */
break;
- case 345:
-#line 1589 "util/configparser.y" /* yacc.c:1646 */
+ case 352:
+#line 1614 "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)
@@ -4149,11 +4214,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4153 "util/configparser.c" /* yacc.c:1646 */
+#line 4218 "util/configparser.c" /* yacc.c:1646 */
break;
- case 346:
-#line 1599 "util/configparser.y" /* yacc.c:1646 */
+ case 353:
+#line 1624 "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)
@@ -4162,31 +4227,31 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4166 "util/configparser.c" /* yacc.c:1646 */
+#line 4231 "util/configparser.c" /* yacc.c:1646 */
break;
- case 347:
-#line 1609 "util/configparser.y" /* yacc.c:1646 */
+ case 354:
+#line 1634 "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 4176 "util/configparser.c" /* yacc.c:1646 */
+#line 4241 "util/configparser.c" /* yacc.c:1646 */
break;
- case 348:
-#line 1616 "util/configparser.y" /* yacc.c:1646 */
+ case 355:
+#line 1641 "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 4186 "util/configparser.c" /* yacc.c:1646 */
+#line 4251 "util/configparser.c" /* yacc.c:1646 */
break;
- case 349:
-#line 1623 "util/configparser.y" /* yacc.c:1646 */
+ case 356:
+#line 1648 "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)
@@ -4194,11 +4259,11 @@ yyreduce:
else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4198 "util/configparser.c" /* yacc.c:1646 */
+#line 4263 "util/configparser.c" /* yacc.c:1646 */
break;
- case 350:
-#line 1632 "util/configparser.y" /* yacc.c:1646 */
+ case 357:
+#line 1657 "util/configparser.y" /* yacc.c:1646 */
{
char* p, *s = (yyvsp[0].str);
OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -4211,11 +4276,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4215 "util/configparser.c" /* yacc.c:1646 */
+#line 4280 "util/configparser.c" /* yacc.c:1646 */
break;
- case 351:
-#line 1646 "util/configparser.y" /* yacc.c:1646 */
+ case 358:
+#line 1671 "util/configparser.y" /* yacc.c:1646 */
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4233,11 +4298,11 @@ yyreduce:
}
}
}
-#line 4237 "util/configparser.c" /* yacc.c:1646 */
+#line 4302 "util/configparser.c" /* yacc.c:1646 */
break;
- case 352:
-#line 1665 "util/configparser.y" /* yacc.c:1646 */
+ case 359:
+#line 1690 "util/configparser.y" /* yacc.c:1646 */
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4255,11 +4320,11 @@ yyreduce:
}
}
}
-#line 4259 "util/configparser.c" /* yacc.c:1646 */
+#line 4324 "util/configparser.c" /* yacc.c:1646 */
break;
- case 353:
-#line 1684 "util/configparser.y" /* yacc.c:1646 */
+ case 360:
+#line 1709 "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,
@@ -4270,11 +4335,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4274 "util/configparser.c" /* yacc.c:1646 */
+#line 4339 "util/configparser.c" /* yacc.c:1646 */
break;
- case 354:
-#line 1696 "util/configparser.y" /* yacc.c:1646 */
+ case 361:
+#line 1721 "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,
@@ -4285,11 +4350,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4289 "util/configparser.c" /* yacc.c:1646 */
+#line 4354 "util/configparser.c" /* yacc.c:1646 */
break;
- case 355:
-#line 1708 "util/configparser.y" /* yacc.c:1646 */
+ case 362:
+#line 1733 "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,
@@ -4300,11 +4365,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4304 "util/configparser.c" /* yacc.c:1646 */
+#line 4369 "util/configparser.c" /* yacc.c:1646 */
break;
- case 356:
-#line 1720 "util/configparser.y" /* yacc.c:1646 */
+ case 363:
+#line 1745 "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,
@@ -4314,11 +4379,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4318 "util/configparser.c" /* yacc.c:1646 */
+#line 4383 "util/configparser.c" /* yacc.c:1646 */
break;
- case 357:
-#line 1731 "util/configparser.y" /* yacc.c:1646 */
+ case 364:
+#line 1756 "util/configparser.y" /* yacc.c:1646 */
{
size_t len = 0;
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
@@ -4336,11 +4401,11 @@ yyreduce:
}
}
}
-#line 4340 "util/configparser.c" /* yacc.c:1646 */
+#line 4405 "util/configparser.c" /* yacc.c:1646 */
break;
- case 358:
-#line 1750 "util/configparser.y" /* yacc.c:1646 */
+ case 365:
+#line 1775 "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)
@@ -4348,11 +4413,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4352 "util/configparser.c" /* yacc.c:1646 */
+#line 4417 "util/configparser.c" /* yacc.c:1646 */
break;
- case 359:
-#line 1760 "util/configparser.y" /* yacc.c:1646 */
+ case 366:
+#line 1785 "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)
@@ -4360,33 +4425,33 @@ yyreduce:
else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4364 "util/configparser.c" /* yacc.c:1646 */
+#line 4429 "util/configparser.c" /* yacc.c:1646 */
break;
- case 360:
-#line 1769 "util/configparser.y" /* yacc.c:1646 */
+ case 367:
+#line 1794 "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 4375 "util/configparser.c" /* yacc.c:1646 */
+#line 4440 "util/configparser.c" /* yacc.c:1646 */
break;
- case 361:
-#line 1777 "util/configparser.y" /* yacc.c:1646 */
+ case 368:
+#line 1802 "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 4386 "util/configparser.c" /* yacc.c:1646 */
+#line 4451 "util/configparser.c" /* yacc.c:1646 */
break;
- case 362:
-#line 1785 "util/configparser.y" /* yacc.c:1646 */
+ case 369:
+#line 1810 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4398,11 +4463,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4402 "util/configparser.c" /* yacc.c:1646 */
+#line 4467 "util/configparser.c" /* yacc.c:1646 */
break;
- case 363:
-#line 1798 "util/configparser.y" /* yacc.c:1646 */
+ case 370:
+#line 1823 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4414,11 +4479,11 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 4418 "util/configparser.c" /* yacc.c:1646 */
+#line 4483 "util/configparser.c" /* yacc.c:1646 */
break;
- case 364:
-#line 1811 "util/configparser.y" /* yacc.c:1646 */
+ case 371:
+#line 1836 "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) {
@@ -4430,11 +4495,11 @@ yyreduce:
"ratelimit-for-domain");
}
}
-#line 4434 "util/configparser.c" /* yacc.c:1646 */
+#line 4499 "util/configparser.c" /* yacc.c:1646 */
break;
- case 365:
-#line 1824 "util/configparser.y" /* yacc.c:1646 */
+ case 372:
+#line 1849 "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) {
@@ -4446,11 +4511,11 @@ yyreduce:
"ratelimit-below-domain");
}
}
-#line 4450 "util/configparser.c" /* yacc.c:1646 */
+#line 4515 "util/configparser.c" /* yacc.c:1646 */
break;
- case 366:
-#line 1837 "util/configparser.y" /* yacc.c:1646 */
+ case 373:
+#line 1862 "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)
@@ -4458,11 +4523,11 @@ yyreduce:
else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4462 "util/configparser.c" /* yacc.c:1646 */
+#line 4527 "util/configparser.c" /* yacc.c:1646 */
break;
- case 367:
-#line 1846 "util/configparser.y" /* yacc.c:1646 */
+ case 374:
+#line 1871 "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)
@@ -4470,11 +4535,35 @@ yyreduce:
else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4474 "util/configparser.c" /* yacc.c:1646 */
+#line 4539 "util/configparser.c" /* yacc.c:1646 */
break;
- case 368:
-#line 1855 "util/configparser.y" /* yacc.c:1646 */
+ case 375:
+#line 1880 "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)
+ yyerror("number expected");
+ else cfg_parser->cfg->low_rtt = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 4551 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 376:
+#line 1889 "util/configparser.y" /* yacc.c:1646 */
+ {
+ OUTYY(("P(server_low_rtt_pct:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->low_rtt_pct = atoi((yyvsp[0].str));
+ free((yyvsp[0].str));
+ }
+#line 4563 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 377:
+#line 1898 "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)
@@ -4483,11 +4572,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4487 "util/configparser.c" /* yacc.c:1646 */
+#line 4576 "util/configparser.c" /* yacc.c:1646 */
break;
- case 369:
-#line 1865 "util/configparser.y" /* yacc.c:1646 */
+ case 378:
+#line 1908 "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)
@@ -4496,11 +4585,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4500 "util/configparser.c" /* yacc.c:1646 */
+#line 4589 "util/configparser.c" /* yacc.c:1646 */
break;
- case 370:
-#line 1875 "util/configparser.y" /* yacc.c:1646 */
+ case 379:
+#line 1918 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
@@ -4512,11 +4601,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4516 "util/configparser.c" /* yacc.c:1646 */
+#line 4605 "util/configparser.c" /* yacc.c:1646 */
break;
- case 371:
-#line 1888 "util/configparser.y" /* yacc.c:1646 */
+ case 380:
+#line 1931 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
@@ -4528,11 +4617,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4532 "util/configparser.c" /* yacc.c:1646 */
+#line 4621 "util/configparser.c" /* yacc.c:1646 */
break;
- case 372:
-#line 1901 "util/configparser.y" /* yacc.c:1646 */
+ case 381:
+#line 1944 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -4542,11 +4631,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4546 "util/configparser.c" /* yacc.c:1646 */
+#line 4635 "util/configparser.c" /* yacc.c:1646 */
break;
- case 373:
-#line 1912 "util/configparser.y" /* yacc.c:1646 */
+ case 382:
+#line 1955 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -4558,11 +4647,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4562 "util/configparser.c" /* yacc.c:1646 */
+#line 4651 "util/configparser.c" /* yacc.c:1646 */
break;
- case 374:
-#line 1925 "util/configparser.y" /* yacc.c:1646 */
+ case 383:
+#line 1968 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -4572,11 +4661,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4576 "util/configparser.c" /* yacc.c:1646 */
+#line 4665 "util/configparser.c" /* yacc.c:1646 */
break;
- case 375:
-#line 1936 "util/configparser.y" /* yacc.c:1646 */
+ case 384:
+#line 1979 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_IPSECMOD
OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -4588,11 +4677,11 @@ yyreduce:
OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
#endif
}
-#line 4592 "util/configparser.c" /* yacc.c:1646 */
+#line 4681 "util/configparser.c" /* yacc.c:1646 */
break;
- case 376:
-#line 1949 "util/configparser.y" /* yacc.c:1646 */
+ case 385:
+#line 1992 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->stubs->name)
@@ -4601,31 +4690,31 @@ yyreduce:
free(cfg_parser->cfg->stubs->name);
cfg_parser->cfg->stubs->name = (yyvsp[0].str);
}
-#line 4605 "util/configparser.c" /* yacc.c:1646 */
+#line 4694 "util/configparser.c" /* yacc.c:1646 */
break;
- case 377:
-#line 1959 "util/configparser.y" /* yacc.c:1646 */
+ case 386:
+#line 2002 "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 4615 "util/configparser.c" /* yacc.c:1646 */
+#line 4704 "util/configparser.c" /* yacc.c:1646 */
break;
- case 378:
-#line 1966 "util/configparser.y" /* yacc.c:1646 */
+ case 387:
+#line 2009 "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 4625 "util/configparser.c" /* yacc.c:1646 */
+#line 4714 "util/configparser.c" /* yacc.c:1646 */
break;
- case 379:
-#line 1973 "util/configparser.y" /* yacc.c:1646 */
+ case 388:
+#line 2016 "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)
@@ -4633,11 +4722,11 @@ yyreduce:
else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4637 "util/configparser.c" /* yacc.c:1646 */
+#line 4726 "util/configparser.c" /* yacc.c:1646 */
break;
- case 380:
-#line 1982 "util/configparser.y" /* yacc.c:1646 */
+ case 389:
+#line 2025 "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)
@@ -4646,11 +4735,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4650 "util/configparser.c" /* yacc.c:1646 */
+#line 4739 "util/configparser.c" /* yacc.c:1646 */
break;
- case 381:
-#line 1992 "util/configparser.y" /* yacc.c:1646 */
+ case 390:
+#line 2035 "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)
@@ -4659,11 +4748,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4663 "util/configparser.c" /* yacc.c:1646 */
+#line 4752 "util/configparser.c" /* yacc.c:1646 */
break;
- case 382:
-#line 2002 "util/configparser.y" /* yacc.c:1646 */
+ case 391:
+#line 2045 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->forwards->name)
@@ -4672,31 +4761,31 @@ yyreduce:
free(cfg_parser->cfg->forwards->name);
cfg_parser->cfg->forwards->name = (yyvsp[0].str);
}
-#line 4676 "util/configparser.c" /* yacc.c:1646 */
+#line 4765 "util/configparser.c" /* yacc.c:1646 */
break;
- case 383:
-#line 2012 "util/configparser.y" /* yacc.c:1646 */
+ case 392:
+#line 2055 "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 4686 "util/configparser.c" /* yacc.c:1646 */
+#line 4775 "util/configparser.c" /* yacc.c:1646 */
break;
- case 384:
-#line 2019 "util/configparser.y" /* yacc.c:1646 */
+ case 393:
+#line 2062 "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 4696 "util/configparser.c" /* yacc.c:1646 */
+#line 4785 "util/configparser.c" /* yacc.c:1646 */
break;
- case 385:
-#line 2026 "util/configparser.y" /* yacc.c:1646 */
+ case 394:
+#line 2069 "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)
@@ -4704,11 +4793,11 @@ yyreduce:
else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4708 "util/configparser.c" /* yacc.c:1646 */
+#line 4797 "util/configparser.c" /* yacc.c:1646 */
break;
- case 386:
-#line 2035 "util/configparser.y" /* yacc.c:1646 */
+ case 395:
+#line 2078 "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)
@@ -4717,11 +4806,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4721 "util/configparser.c" /* yacc.c:1646 */
+#line 4810 "util/configparser.c" /* yacc.c:1646 */
break;
- case 387:
-#line 2045 "util/configparser.y" /* yacc.c:1646 */
+ case 396:
+#line 2088 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->auths->name)
@@ -4730,41 +4819,52 @@ yyreduce:
free(cfg_parser->cfg->auths->name);
cfg_parser->cfg->auths->name = (yyvsp[0].str);
}
-#line 4734 "util/configparser.c" /* yacc.c:1646 */
+#line 4823 "util/configparser.c" /* yacc.c:1646 */
break;
- case 388:
-#line 2055 "util/configparser.y" /* yacc.c:1646 */
+ case 397:
+#line 2098 "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 4744 "util/configparser.c" /* yacc.c:1646 */
+#line 4833 "util/configparser.c" /* yacc.c:1646 */
break;
- case 389:
-#line 2062 "util/configparser.y" /* yacc.c:1646 */
+ case 398:
+#line 2105 "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 4754 "util/configparser.c" /* yacc.c:1646 */
+#line 4843 "util/configparser.c" /* yacc.c:1646 */
break;
- case 390:
-#line 2069 "util/configparser.y" /* yacc.c:1646 */
+ case 399:
+#line 2112 "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 4764 "util/configparser.c" /* yacc.c:1646 */
+#line 4853 "util/configparser.c" /* yacc.c:1646 */
break;
- case 391:
-#line 2076 "util/configparser.y" /* yacc.c:1646 */
+ case 400:
+#line 2119 "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 4864 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 401:
+#line 2127 "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)
@@ -4773,11 +4873,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4777 "util/configparser.c" /* yacc.c:1646 */
+#line 4877 "util/configparser.c" /* yacc.c:1646 */
break;
- case 392:
-#line 2086 "util/configparser.y" /* yacc.c:1646 */
+ case 402:
+#line 2137 "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)
@@ -4786,11 +4886,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4790 "util/configparser.c" /* yacc.c:1646 */
+#line 4890 "util/configparser.c" /* yacc.c:1646 */
break;
- case 393:
-#line 2096 "util/configparser.y" /* yacc.c:1646 */
+ case 403:
+#line 2147 "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)
@@ -4799,11 +4899,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4803 "util/configparser.c" /* yacc.c:1646 */
+#line 4903 "util/configparser.c" /* yacc.c:1646 */
break;
- case 394:
-#line 2106 "util/configparser.y" /* yacc.c:1646 */
+ case 404:
+#line 2157 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
if(cfg_parser->cfg->views->name)
@@ -4812,11 +4912,11 @@ yyreduce:
free(cfg_parser->cfg->views->name);
cfg_parser->cfg->views->name = (yyvsp[0].str);
}
-#line 4816 "util/configparser.c" /* yacc.c:1646 */
+#line 4916 "util/configparser.c" /* yacc.c:1646 */
break;
- case 395:
-#line 2116 "util/configparser.y" /* yacc.c:1646 */
+ case 405:
+#line 2167 "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 &&
@@ -4845,11 +4945,11 @@ yyreduce:
fatal_exit("out of memory adding local-zone");
}
}
-#line 4849 "util/configparser.c" /* yacc.c:1646 */
+#line 4949 "util/configparser.c" /* yacc.c:1646 */
break;
- case 396:
-#line 2146 "util/configparser.y" /* yacc.c:1646 */
+ case 406:
+#line 2197 "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));
@@ -4858,22 +4958,22 @@ yyreduce:
fatal_exit("out of memory adding per-view "
"response-ip action");
}
-#line 4862 "util/configparser.c" /* yacc.c:1646 */
+#line 4962 "util/configparser.c" /* yacc.c:1646 */
break;
- case 397:
-#line 2156 "util/configparser.y" /* yacc.c:1646 */
+ case 407:
+#line 2207 "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 4873 "util/configparser.c" /* yacc.c:1646 */
+#line 4973 "util/configparser.c" /* yacc.c:1646 */
break;
- case 398:
-#line 2164 "util/configparser.y" /* yacc.c:1646 */
+ case 408:
+#line 2215 "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))) {
@@ -4881,11 +4981,11 @@ yyreduce:
free((yyvsp[0].str));
}
}
-#line 4885 "util/configparser.c" /* yacc.c:1646 */
+#line 4985 "util/configparser.c" /* yacc.c:1646 */
break;
- case 399:
-#line 2173 "util/configparser.y" /* yacc.c:1646 */
+ case 409:
+#line 2224 "util/configparser.y" /* yacc.c:1646 */
{
char* ptr;
OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -4899,11 +4999,11 @@ yyreduce:
yyerror("local-data-ptr could not be reversed");
}
}
-#line 4903 "util/configparser.c" /* yacc.c:1646 */
+#line 5003 "util/configparser.c" /* yacc.c:1646 */
break;
- case 400:
-#line 2188 "util/configparser.y" /* yacc.c:1646 */
+ case 410:
+#line 2239 "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)
@@ -4911,19 +5011,19 @@ yyreduce:
else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4915 "util/configparser.c" /* yacc.c:1646 */
+#line 5015 "util/configparser.c" /* yacc.c:1646 */
break;
- case 401:
-#line 2197 "util/configparser.y" /* yacc.c:1646 */
+ case 411:
+#line 2248 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(remote-control:)\n"));
}
-#line 4923 "util/configparser.c" /* yacc.c:1646 */
+#line 5023 "util/configparser.c" /* yacc.c:1646 */
break;
- case 412:
-#line 2208 "util/configparser.y" /* yacc.c:1646 */
+ case 422:
+#line 2259 "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)
@@ -4932,11 +5032,11 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4936 "util/configparser.c" /* yacc.c:1646 */
+#line 5036 "util/configparser.c" /* yacc.c:1646 */
break;
- case 413:
-#line 2218 "util/configparser.y" /* yacc.c:1646 */
+ case 423:
+#line 2269 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -4944,21 +5044,21 @@ yyreduce:
else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 4948 "util/configparser.c" /* yacc.c:1646 */
+#line 5048 "util/configparser.c" /* yacc.c:1646 */
break;
- case 414:
-#line 2227 "util/configparser.y" /* yacc.c:1646 */
+ case 424:
+#line 2278 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
yyerror("out of memory");
}
-#line 4958 "util/configparser.c" /* yacc.c:1646 */
+#line 5058 "util/configparser.c" /* yacc.c:1646 */
break;
- case 415:
-#line 2234 "util/configparser.y" /* yacc.c:1646 */
+ case 425:
+#line 2285 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4967,122 +5067,122 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 4971 "util/configparser.c" /* yacc.c:1646 */
+#line 5071 "util/configparser.c" /* yacc.c:1646 */
break;
- case 416:
-#line 2244 "util/configparser.y" /* yacc.c:1646 */
+ case 426:
+#line 2295 "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 4981 "util/configparser.c" /* yacc.c:1646 */
+#line 5081 "util/configparser.c" /* yacc.c:1646 */
break;
- case 417:
-#line 2251 "util/configparser.y" /* yacc.c:1646 */
+ case 427:
+#line 2302 "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 4991 "util/configparser.c" /* yacc.c:1646 */
+#line 5091 "util/configparser.c" /* yacc.c:1646 */
break;
- case 418:
-#line 2258 "util/configparser.y" /* yacc.c:1646 */
+ case 428:
+#line 2309 "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 5001 "util/configparser.c" /* yacc.c:1646 */
+#line 5101 "util/configparser.c" /* yacc.c:1646 */
break;
- case 419:
-#line 2265 "util/configparser.y" /* yacc.c:1646 */
+ case 429:
+#line 2316 "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 5011 "util/configparser.c" /* yacc.c:1646 */
+#line 5111 "util/configparser.c" /* yacc.c:1646 */
break;
- case 420:
-#line 2272 "util/configparser.y" /* yacc.c:1646 */
+ case 430:
+#line 2323 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(dnstap:)\n"));
}
-#line 5019 "util/configparser.c" /* yacc.c:1646 */
+#line 5119 "util/configparser.c" /* yacc.c:1646 */
break;
- case 435:
-#line 2289 "util/configparser.y" /* yacc.c:1646 */
+ case 445:
+#line 2340 "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 5030 "util/configparser.c" /* yacc.c:1646 */
+#line 5130 "util/configparser.c" /* yacc.c:1646 */
break;
- case 436:
-#line 2297 "util/configparser.y" /* yacc.c:1646 */
+ case 446:
+#line 2348 "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 5040 "util/configparser.c" /* yacc.c:1646 */
+#line 5140 "util/configparser.c" /* yacc.c:1646 */
break;
- case 437:
-#line 2304 "util/configparser.y" /* yacc.c:1646 */
+ case 447:
+#line 2355 "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 5051 "util/configparser.c" /* yacc.c:1646 */
+#line 5151 "util/configparser.c" /* yacc.c:1646 */
break;
- case 438:
-#line 2312 "util/configparser.y" /* yacc.c:1646 */
+ case 448:
+#line 2363 "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 5062 "util/configparser.c" /* yacc.c:1646 */
+#line 5162 "util/configparser.c" /* yacc.c:1646 */
break;
- case 439:
-#line 2320 "util/configparser.y" /* yacc.c:1646 */
+ case 449:
+#line 2371 "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 5072 "util/configparser.c" /* yacc.c:1646 */
+#line 5172 "util/configparser.c" /* yacc.c:1646 */
break;
- case 440:
-#line 2327 "util/configparser.y" /* yacc.c:1646 */
+ case 450:
+#line 2378 "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 5082 "util/configparser.c" /* yacc.c:1646 */
+#line 5182 "util/configparser.c" /* yacc.c:1646 */
break;
- case 441:
-#line 2334 "util/configparser.y" /* yacc.c:1646 */
+ case 451:
+#line 2385 "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)
@@ -5090,11 +5190,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_resolver_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5094 "util/configparser.c" /* yacc.c:1646 */
+#line 5194 "util/configparser.c" /* yacc.c:1646 */
break;
- case 442:
-#line 2343 "util/configparser.y" /* yacc.c:1646 */
+ case 452:
+#line 2394 "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)
@@ -5102,11 +5202,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_resolver_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5106 "util/configparser.c" /* yacc.c:1646 */
+#line 5206 "util/configparser.c" /* yacc.c:1646 */
break;
- case 443:
-#line 2352 "util/configparser.y" /* yacc.c:1646 */
+ case 453:
+#line 2403 "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)
@@ -5114,11 +5214,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_client_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5118 "util/configparser.c" /* yacc.c:1646 */
+#line 5218 "util/configparser.c" /* yacc.c:1646 */
break;
- case 444:
-#line 2361 "util/configparser.y" /* yacc.c:1646 */
+ case 454:
+#line 2412 "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)
@@ -5126,11 +5226,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_client_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5130 "util/configparser.c" /* yacc.c:1646 */
+#line 5230 "util/configparser.c" /* yacc.c:1646 */
break;
- case 445:
-#line 2370 "util/configparser.y" /* yacc.c:1646 */
+ case 455:
+#line 2421 "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)
@@ -5138,11 +5238,11 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5142 "util/configparser.c" /* yacc.c:1646 */
+#line 5242 "util/configparser.c" /* yacc.c:1646 */
break;
- case 446:
-#line 2379 "util/configparser.y" /* yacc.c:1646 */
+ case 456:
+#line 2430 "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)
@@ -5150,29 +5250,29 @@ yyreduce:
else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
(strcmp((yyvsp[0].str), "yes")==0);
}
-#line 5154 "util/configparser.c" /* yacc.c:1646 */
+#line 5254 "util/configparser.c" /* yacc.c:1646 */
break;
- case 447:
-#line 2388 "util/configparser.y" /* yacc.c:1646 */
+ case 457:
+#line 2439 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(python:)\n"));
}
-#line 5162 "util/configparser.c" /* yacc.c:1646 */
+#line 5262 "util/configparser.c" /* yacc.c:1646 */
break;
- case 451:
-#line 2397 "util/configparser.y" /* yacc.c:1646 */
+ case 461:
+#line 2448 "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 5172 "util/configparser.c" /* yacc.c:1646 */
+#line 5272 "util/configparser.c" /* yacc.c:1646 */
break;
- case 452:
-#line 2403 "util/configparser.y" /* yacc.c:1646 */
+ case 462:
+#line 2454 "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)
@@ -5181,21 +5281,21 @@ yyreduce:
(strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5185 "util/configparser.c" /* yacc.c:1646 */
+#line 5285 "util/configparser.c" /* yacc.c:1646 */
break;
- case 453:
-#line 2413 "util/configparser.y" /* yacc.c:1646 */
+ case 463:
+#line 2464 "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 5195 "util/configparser.c" /* yacc.c:1646 */
+#line 5295 "util/configparser.c" /* yacc.c:1646 */
break;
- case 454:
-#line 2420 "util/configparser.y" /* yacc.c:1646 */
+ case 464:
+#line 2471 "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));
@@ -5203,31 +5303,31 @@ yyreduce:
(yyvsp[-1].str), (yyvsp[0].str)))
fatal_exit("out of memory adding response-ip");
}
-#line 5207 "util/configparser.c" /* yacc.c:1646 */
+#line 5307 "util/configparser.c" /* yacc.c:1646 */
break;
- case 455:
-#line 2429 "util/configparser.y" /* yacc.c:1646 */
+ case 465:
+#line 2480 "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 5218 "util/configparser.c" /* yacc.c:1646 */
+#line 5318 "util/configparser.c" /* yacc.c:1646 */
break;
- case 456:
-#line 2437 "util/configparser.y" /* yacc.c:1646 */
+ case 466:
+#line 2488 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(dnscrypt:)\n"));
OUTYY(("\nP(dnscrypt:)\n"));
}
-#line 5227 "util/configparser.c" /* yacc.c:1646 */
+#line 5327 "util/configparser.c" /* yacc.c:1646 */
break;
- case 469:
-#line 2454 "util/configparser.y" /* yacc.c:1646 */
+ case 479:
+#line 2505 "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)
@@ -5235,11 +5335,11 @@ yyreduce:
else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
free((yyvsp[0].str));
}
-#line 5239 "util/configparser.c" /* yacc.c:1646 */
+#line 5339 "util/configparser.c" /* yacc.c:1646 */
break;
- case 470:
-#line 2464 "util/configparser.y" /* yacc.c:1646 */
+ case 480:
+#line 2515 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
@@ -5248,21 +5348,21 @@ yyreduce:
else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
free((yyvsp[0].str));
}
-#line 5252 "util/configparser.c" /* yacc.c:1646 */
+#line 5352 "util/configparser.c" /* yacc.c:1646 */
break;
- case 471:
-#line 2474 "util/configparser.y" /* yacc.c:1646 */
+ case 481:
+#line 2525 "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 5262 "util/configparser.c" /* yacc.c:1646 */
+#line 5362 "util/configparser.c" /* yacc.c:1646 */
break;
- case 472:
-#line 2481 "util/configparser.y" /* yacc.c:1646 */
+ case 482:
+#line 2532 "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)))
@@ -5270,21 +5370,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 5274 "util/configparser.c" /* yacc.c:1646 */
+#line 5374 "util/configparser.c" /* yacc.c:1646 */
break;
- case 473:
-#line 2490 "util/configparser.y" /* yacc.c:1646 */
+ case 483:
+#line 2541 "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 5284 "util/configparser.c" /* yacc.c:1646 */
+#line 5384 "util/configparser.c" /* yacc.c:1646 */
break;
- case 474:
-#line 2497 "util/configparser.y" /* yacc.c:1646 */
+ case 484:
+#line 2548 "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)))
@@ -5292,22 +5392,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 5296 "util/configparser.c" /* yacc.c:1646 */
+#line 5396 "util/configparser.c" /* yacc.c:1646 */
break;
- case 475:
-#line 2506 "util/configparser.y" /* yacc.c:1646 */
+ case 485:
+#line 2557 "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 5307 "util/configparser.c" /* yacc.c:1646 */
+#line 5407 "util/configparser.c" /* yacc.c:1646 */
break;
- case 476:
-#line 2514 "util/configparser.y" /* yacc.c:1646 */
+ case 486:
+#line 2565 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -5319,22 +5419,22 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5323 "util/configparser.c" /* yacc.c:1646 */
+#line 5423 "util/configparser.c" /* yacc.c:1646 */
break;
- case 477:
-#line 2527 "util/configparser.y" /* yacc.c:1646 */
+ case 487:
+#line 2578 "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 5334 "util/configparser.c" /* yacc.c:1646 */
+#line 5434 "util/configparser.c" /* yacc.c:1646 */
break;
- case 478:
-#line 2535 "util/configparser.y" /* yacc.c:1646 */
+ case 488:
+#line 2586 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
if(atoi((yyvsp[0].str)) == 0)
@@ -5346,19 +5446,19 @@ yyreduce:
}
free((yyvsp[0].str));
}
-#line 5350 "util/configparser.c" /* yacc.c:1646 */
+#line 5450 "util/configparser.c" /* yacc.c:1646 */
break;
- case 479:
-#line 2548 "util/configparser.y" /* yacc.c:1646 */
+ case 489:
+#line 2599 "util/configparser.y" /* yacc.c:1646 */
{
OUTYY(("\nP(cachedb:)\n"));
}
-#line 5358 "util/configparser.c" /* yacc.c:1646 */
+#line 5458 "util/configparser.c" /* yacc.c:1646 */
break;
- case 484:
-#line 2557 "util/configparser.y" /* yacc.c:1646 */
+ case 497:
+#line 2609 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_CACHEDB
OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
@@ -5371,11 +5471,11 @@ yyreduce:
OUTYY(("P(Compiled without cachedb, ignoring)\n"));
#endif
}
-#line 5375 "util/configparser.c" /* yacc.c:1646 */
+#line 5475 "util/configparser.c" /* yacc.c:1646 */
break;
- case 485:
-#line 2571 "util/configparser.y" /* yacc.c:1646 */
+ case 498:
+#line 2623 "util/configparser.y" /* yacc.c:1646 */
{
#ifdef USE_CACHEDB
OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
@@ -5389,11 +5489,60 @@ yyreduce:
free((yyvsp[0].str));
#endif
}
-#line 5393 "util/configparser.c" /* yacc.c:1646 */
+#line 5493 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 499:
+#line 2638 "util/configparser.y" /* yacc.c:1646 */
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
+ free(cfg_parser->cfg->redis_server_host);
+ cfg_parser->cfg->redis_server_host = (yyvsp[0].str);
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ free((yyvsp[0].str));
+ #endif
+ }
+#line 5508 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 500:
+#line 2650 "util/configparser.y" /* yacc.c:1646 */
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ int port;
+ OUTYY(("P(redis_server_port:%s)\n", (yyvsp[0].str)));
+ port = atoi((yyvsp[0].str));
+ if(port == 0 || port < 0 || port > 65535)
+ yyerror("valid redis server port number expected");
+ else cfg_parser->cfg->redis_server_port = port;
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free((yyvsp[0].str));
+ }
+#line 5526 "util/configparser.c" /* yacc.c:1646 */
+ break;
+
+ case 501:
+#line 2665 "util/configparser.y" /* yacc.c:1646 */
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
+ if(atoi((yyvsp[0].str)) == 0)
+ yyerror("redis timeout value expected");
+ else cfg_parser->cfg->redis_timeout = atoi((yyvsp[0].str));
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free((yyvsp[0].str));
+ }
+#line 5542 "util/configparser.c" /* yacc.c:1646 */
break;
-#line 5397 "util/configparser.c" /* yacc.c:1646 */
+#line 5546 "util/configparser.c" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -5621,7 +5770,7 @@ yyreturn:
#endif
return yyresult;
}
-#line 2585 "util/configparser.y" /* yacc.c:1906 */
+#line 2677 "util/configparser.y" /* yacc.c:1906 */
/* parse helper routines could be here */
diff --git a/util/configparser.h b/util/configparser.h
index 21e14670541f..8cf14049c5f3 100644
--- a/util/configparser.h
+++ b/util/configparser.h
@@ -248,34 +248,42 @@ extern int yydebug;
VAR_USE_SYSTEMD = 458,
VAR_SHM_ENABLE = 459,
VAR_SHM_KEY = 460,
- VAR_DNSCRYPT = 461,
- VAR_DNSCRYPT_ENABLE = 462,
- VAR_DNSCRYPT_PORT = 463,
- VAR_DNSCRYPT_PROVIDER = 464,
- VAR_DNSCRYPT_SECRET_KEY = 465,
- VAR_DNSCRYPT_PROVIDER_CERT = 466,
- VAR_DNSCRYPT_PROVIDER_CERT_ROTATED = 467,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE = 468,
- VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS = 469,
- VAR_DNSCRYPT_NONCE_CACHE_SIZE = 470,
- VAR_DNSCRYPT_NONCE_CACHE_SLABS = 471,
- VAR_IPSECMOD_ENABLED = 472,
- VAR_IPSECMOD_HOOK = 473,
- VAR_IPSECMOD_IGNORE_BOGUS = 474,
- VAR_IPSECMOD_MAX_TTL = 475,
- VAR_IPSECMOD_WHITELIST = 476,
- VAR_IPSECMOD_STRICT = 477,
- VAR_CACHEDB = 478,
- VAR_CACHEDB_BACKEND = 479,
- VAR_CACHEDB_SECRETSEED = 480,
- VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM = 481,
- VAR_FOR_UPSTREAM = 482,
- VAR_AUTH_ZONE = 483,
- VAR_ZONEFILE = 484,
- VAR_MASTER = 485,
- VAR_URL = 486,
- VAR_FOR_DOWNSTREAM = 487,
- VAR_FALLBACK_ENABLED = 488
+ 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_ADDITIONAL_TLS_PORT = 493,
+ VAR_LOW_RTT = 494,
+ VAR_LOW_RTT_PCT = 495,
+ VAR_ALLOW_NOTIFY = 496
};
#endif
/* Tokens. */
@@ -482,34 +490,42 @@ extern int yydebug;
#define VAR_USE_SYSTEMD 458
#define VAR_SHM_ENABLE 459
#define VAR_SHM_KEY 460
-#define VAR_DNSCRYPT 461
-#define VAR_DNSCRYPT_ENABLE 462
-#define VAR_DNSCRYPT_PORT 463
-#define VAR_DNSCRYPT_PROVIDER 464
-#define VAR_DNSCRYPT_SECRET_KEY 465
-#define VAR_DNSCRYPT_PROVIDER_CERT 466
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 467
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 468
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 469
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 470
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 471
-#define VAR_IPSECMOD_ENABLED 472
-#define VAR_IPSECMOD_HOOK 473
-#define VAR_IPSECMOD_IGNORE_BOGUS 474
-#define VAR_IPSECMOD_MAX_TTL 475
-#define VAR_IPSECMOD_WHITELIST 476
-#define VAR_IPSECMOD_STRICT 477
-#define VAR_CACHEDB 478
-#define VAR_CACHEDB_BACKEND 479
-#define VAR_CACHEDB_SECRETSEED 480
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 481
-#define VAR_FOR_UPSTREAM 482
-#define VAR_AUTH_ZONE 483
-#define VAR_ZONEFILE 484
-#define VAR_MASTER 485
-#define VAR_URL 486
-#define VAR_FOR_DOWNSTREAM 487
-#define VAR_FALLBACK_ENABLED 488
+#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_ADDITIONAL_TLS_PORT 493
+#define VAR_LOW_RTT 494
+#define VAR_LOW_RTT_PCT 495
+#define VAR_ALLOW_NOTIFY 496
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -520,7 +536,7 @@ union YYSTYPE
char* str;
-#line 524 "util/configparser.h" /* yacc.c:1909 */
+#line 540 "util/configparser.h" /* yacc.c:1909 */
};
typedef union YYSTYPE YYSTYPE;
diff --git a/util/configparser.y b/util/configparser.y
index 7e23fca16823..a71bf914c762 100644
--- a/util/configparser.y
+++ b/util/configparser.y
@@ -142,6 +142,7 @@ extern struct config_parser_state* cfg_parser;
%token VAR_VIEW_FIRST VAR_SERVE_EXPIRED 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
%token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
%token VAR_DNSCRYPT_SECRET_KEY VAR_DNSCRYPT_PROVIDER_CERT
%token VAR_DNSCRYPT_PROVIDER_CERT_ROTATED
@@ -152,9 +153,11 @@ extern struct config_parser_state* cfg_parser;
%token VAR_IPSECMOD_ENABLED VAR_IPSECMOD_HOOK VAR_IPSECMOD_IGNORE_BOGUS
%token VAR_IPSECMOD_MAX_TTL VAR_IPSECMOD_WHITELIST VAR_IPSECMOD_STRICT
%token VAR_CACHEDB VAR_CACHEDB_BACKEND VAR_CACHEDB_SECRETSEED
+%token VAR_CACHEDB_REDISHOST VAR_CACHEDB_REDISPORT VAR_CACHEDB_REDISTIMEOUT
%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
+%token VAR_FALLBACK_ENABLED VAR_ADDITIONAL_TLS_PORT VAR_LOW_RTT VAR_LOW_RTT_PCT
+%token VAR_ALLOW_NOTIFY
%%
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -240,11 +243,13 @@ content_server: server_num_threads | server_verbosity | server_port |
server_response_ip_tag | server_response_ip | server_response_ip_data |
server_shm_enable | server_shm_key | server_fake_sha1 |
server_hide_trustanchor | server_trust_anchor_signaling |
+ server_root_key_sentinel |
server_ipsecmod_enabled | server_ipsecmod_hook |
server_ipsecmod_ignore_bogus | server_ipsecmod_max_ttl |
server_ipsecmod_whitelist | server_ipsecmod_strict |
server_udp_upstream_without_downstream | server_aggressive_nsec |
- server_tls_cert_bundle
+ server_tls_cert_bundle | server_additional_tls_port | server_low_rtt |
+ server_low_rtt_pct
;
stubstart: VAR_STUB_ZONE
{
@@ -318,7 +323,8 @@ authstart: VAR_AUTH_ZONE
contents_auth: contents_auth content_auth
| ;
content_auth: auth_name | auth_zonefile | auth_master | auth_url |
- auth_for_downstream | auth_for_upstream | auth_fallback_enabled
+ auth_for_downstream | auth_for_upstream | auth_fallback_enabled |
+ auth_allow_notify
;
server_num_threads: VAR_NUM_THREADS STRING_ARG
{
@@ -682,6 +688,14 @@ server_tls_cert_bundle: VAR_TLS_CERT_BUNDLE STRING_ARG
cfg_parser->cfg->tls_cert_bundle = $2;
}
;
+server_additional_tls_port: VAR_ADDITIONAL_TLS_PORT STRING_ARG
+ {
+ OUTYY(("P(server_additional_tls_port:%s)\n", $2));
+ if(!cfg_strlist_insert(&cfg_parser->cfg->additional_tls_port,
+ $2))
+ yyerror("out of memory");
+ }
+ ;
server_use_systemd: VAR_USE_SYSTEMD STRING_ARG
{
OUTYY(("P(server_use_systemd:%s)\n", $2));
@@ -859,6 +873,17 @@ server_trust_anchor_signaling: VAR_TRUST_ANCHOR_SIGNALING STRING_ARG
free($2);
}
;
+server_root_key_sentinel: VAR_ROOT_KEY_SENTINEL STRING_ARG
+ {
+ OUTYY(("P(server_root_key_sentinel:%s)\n", $2));
+ if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+ yyerror("expected yes or no.");
+ else
+ cfg_parser->cfg->root_key_sentinel =
+ (strcmp($2, "yes")==0);
+ free($2);
+ }
+ ;
server_domain_insecure: VAR_DOMAIN_INSECURE STRING_ARG
{
OUTYY(("P(server_domain_insecure:%s)\n", $2));
@@ -1851,6 +1876,24 @@ server_ratelimit_factor: VAR_RATELIMIT_FACTOR STRING_ARG
free($2);
}
;
+server_low_rtt: VAR_LOW_RTT STRING_ARG
+ {
+ OUTYY(("P(server_low_rtt:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->low_rtt = atoi($2);
+ free($2);
+ }
+ ;
+server_low_rtt_pct: VAR_LOW_RTT_PCT STRING_ARG
+ {
+ OUTYY(("P(server_low_rtt_pct:%s)\n", $2));
+ if(atoi($2) == 0 && strcmp($2, "0") != 0)
+ yyerror("number expected");
+ else cfg_parser->cfg->low_rtt_pct = atoi($2);
+ free($2);
+ }
+ ;
server_qname_minimisation: VAR_QNAME_MINIMISATION STRING_ARG
{
OUTYY(("P(server_qname_minimisation:%s)\n", $2));
@@ -2072,6 +2115,14 @@ auth_url: VAR_URL STRING_ARG
yyerror("out of memory");
}
;
+auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG
+ {
+ OUTYY(("P(allow-notify:%s)\n", $2));
+ if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
+ $2))
+ yyerror("out of memory");
+ }
+ ;
auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG
{
OUTYY(("P(for-downstream:%s)\n", $2));
@@ -2551,7 +2602,8 @@ cachedbstart: VAR_CACHEDB
;
contents_cachedb: contents_cachedb content_cachedb
| ;
-content_cachedb: cachedb_backend_name | cachedb_secret_seed
+content_cachedb: cachedb_backend_name | cachedb_secret_seed |
+ redis_server_host | redis_server_port | redis_timeout
;
cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG
{
@@ -2582,6 +2634,46 @@ cachedb_secret_seed: VAR_CACHEDB_SECRETSEED STRING_ARG
#endif
}
;
+redis_server_host: VAR_CACHEDB_REDISHOST STRING_ARG
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_server_host:%s)\n", $2));
+ free(cfg_parser->cfg->redis_server_host);
+ cfg_parser->cfg->redis_server_host = $2;
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ free($2);
+ #endif
+ }
+ ;
+redis_server_port: VAR_CACHEDB_REDISPORT STRING_ARG
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ int port;
+ OUTYY(("P(redis_server_port:%s)\n", $2));
+ port = atoi($2);
+ if(port == 0 || port < 0 || port > 65535)
+ yyerror("valid redis server port number expected");
+ else cfg_parser->cfg->redis_server_port = port;
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free($2);
+ }
+ ;
+redis_timeout: VAR_CACHEDB_REDISTIMEOUT STRING_ARG
+ {
+ #if defined(USE_CACHEDB) && defined(USE_REDIS)
+ OUTYY(("P(redis_timeout:%s)\n", $2));
+ if(atoi($2) == 0)
+ yyerror("redis timeout value expected");
+ else cfg_parser->cfg->redis_timeout = atoi($2);
+ #else
+ OUTYY(("P(Compiled without cachedb or redis, ignoring)\n"));
+ #endif
+ free($2);
+ }
+ ;
%%
/* parse helper routines could be here */
diff --git a/util/data/dname.c b/util/data/dname.c
index 517af2843e2c..c7360f75f32a 100644
--- a/util/data/dname.c
+++ b/util/data/dname.c
@@ -523,6 +523,29 @@ dname_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs)
return lastdiff;
}
+int
+dname_lab_startswith(uint8_t* label, char* prefix, char** endptr)
+{
+ size_t plen = strlen(prefix);
+ size_t orig_plen = plen;
+ size_t lablen = (size_t)*label;
+ if(plen > lablen)
+ return 0;
+ label++;
+ while(plen--) {
+ if(*prefix != tolower((unsigned char)*label)) {
+ return 0;
+ }
+ prefix++; label++;
+ }
+ if(orig_plen < lablen)
+ *endptr = (char *)label;
+ else
+ /* prefix length == label length */
+ *endptr = NULL;
+ return 1;
+}
+
int
dname_buffer_write(sldns_buffer* pkt, uint8_t* dname)
{
diff --git a/util/data/dname.h b/util/data/dname.h
index 53b341bf7ef7..53a33c689bc0 100644
--- a/util/data/dname.h
+++ b/util/data/dname.h
@@ -186,6 +186,17 @@ int dname_count_size_labels(uint8_t* dname, size_t* size);
int dname_lab_cmp(uint8_t* d1, int labs1, uint8_t* d2, int labs2, int* mlabs);
/**
+ * Check if labels starts with given prefix
+ * @param label: dname label
+ * @param prefix: the string to match label with, null terminated.
+ * @param endptr: pointer to location in label after prefix, only if return
+ * value is 1. NULL if nothing in the label after the prefix, i.e. prefix
+ * and label are the same.
+ * @return: 1 if label starts with prefix, else 0
+ */
+int dname_lab_startswith(uint8_t* label, char* prefix, char** endptr);
+
+/**
* See if domain name d1 is a strict subdomain of d2.
* That is a subdomain, but not equal.
* @param d1: domain name, uncompressed wireformat
diff --git a/util/data/msgparse.c b/util/data/msgparse.c
index 288720068b10..13cad8a26630 100644
--- a/util/data/msgparse.c
+++ b/util/data/msgparse.c
@@ -1028,6 +1028,32 @@ parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
return 0;
}
+/** skip RR in packet */
+static int
+skip_pkt_rr(sldns_buffer* pkt)
+{
+ if(sldns_buffer_remaining(pkt) < 1) return 0;
+ if(!pkt_dname_len(pkt))
+ return 0;
+ if(sldns_buffer_remaining(pkt) < 4) return 0;
+ sldns_buffer_skip(pkt, 4); /* type and class */
+ if(!skip_ttl_rdata(pkt))
+ return 0;
+ return 1;
+}
+
+/** skip RRs from packet */
+static int
+skip_pkt_rrs(sldns_buffer* pkt, int num)
+{
+ int i;
+ for(i=0; i<num; i++) {
+ if(!skip_pkt_rr(pkt))
+ return 0;
+ }
+ return 1;
+}
+
int
parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns,
struct regional* region)
@@ -1035,8 +1061,12 @@ parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns,
size_t rdata_len;
uint8_t* rdata_ptr;
log_assert(LDNS_QDCOUNT(sldns_buffer_begin(pkt)) == 1);
- log_assert(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) == 0);
- log_assert(LDNS_NSCOUNT(sldns_buffer_begin(pkt)) == 0);
+ if(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) != 0 ||
+ LDNS_NSCOUNT(sldns_buffer_begin(pkt)) != 0) {
+ if(!skip_pkt_rrs(pkt, ((int)LDNS_ANCOUNT(sldns_buffer_begin(pkt)))+
+ ((int)LDNS_NSCOUNT(sldns_buffer_begin(pkt)))))
+ return 0;
+ }
/* check edns section is present */
if(LDNS_ARCOUNT(sldns_buffer_begin(pkt)) > 1) {
return LDNS_RCODE_FORMERR;
diff --git a/util/data/msgreply.c b/util/data/msgreply.c
index e25b42cc257a..772f5d1f1029 100644
--- a/util/data/msgreply.c
+++ b/util/data/msgreply.c
@@ -534,8 +534,9 @@ query_info_parse(struct query_info* m, sldns_buffer* query)
/* minimum size: header + \0 + qtype + qclass */
if(sldns_buffer_limit(query) < LDNS_HEADER_SIZE + 5)
return 0;
- if(LDNS_OPCODE_WIRE(q) != LDNS_PACKET_QUERY ||
- LDNS_QDCOUNT(q) != 1 || sldns_buffer_position(query) != 0)
+ if((LDNS_OPCODE_WIRE(q) != LDNS_PACKET_QUERY && LDNS_OPCODE_WIRE(q) !=
+ LDNS_PACKET_NOTIFY) || LDNS_QDCOUNT(q) != 1 ||
+ sldns_buffer_position(query) != 0)
return 0;
sldns_buffer_skip(query, LDNS_HEADER_SIZE);
m->qname = sldns_buffer_current(query);
diff --git a/util/data/packed_rrset.c b/util/data/packed_rrset.c
index 9944087cbf51..7b9d5494d960 100644
--- a/util/data/packed_rrset.c
+++ b/util/data/packed_rrset.c
@@ -253,6 +253,7 @@ sec_status_to_string(enum sec_status s)
case sec_status_bogus: return "sec_status_bogus";
case sec_status_indeterminate: return "sec_status_indeterminate";
case sec_status_insecure: return "sec_status_insecure";
+ case sec_status_secure_sentinel_fail: return "sec_status_secure_sentinel_fail";
case sec_status_secure: return "sec_status_secure";
}
return "unknown_sec_status_value";
diff --git a/util/data/packed_rrset.h b/util/data/packed_rrset.h
index 28f603d6f98f..3a5335ddfa59 100644
--- a/util/data/packed_rrset.h
+++ b/util/data/packed_rrset.h
@@ -187,6 +187,10 @@ enum sec_status {
* insecure. Generally this means that this RRset is below a trust
* anchor, but also below a verified, insecure delegation. */
sec_status_insecure,
+ /** SECURE_SENTINEL_FAIL means that the object (RRset or message)
+ * validated according to local policy but did not succeed in the root
+ * KSK sentinel test (draft-ietf-dnsop-kskroll-sentinel). */
+ sec_status_secure_sentinel_fail,
/** SECURE means that the object (RRset or message) validated
* according to local policy. */
sec_status_secure
diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c
index 400a15de2ebb..302b6f7843ea 100644
--- a/util/fptr_wlist.c
+++ b/util/fptr_wlist.c
@@ -311,7 +311,8 @@ int
fptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
int nocaps, struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, int ssl_upstream, struct module_qstate* q))
+ uint8_t* zone, size_t zonelen, int ssl_upstream, char* tls_auth_name,
+ struct module_qstate* q))
{
if(fptr == &worker_send_query) return 1;
else if(fptr == &libworker_send_query) return 1;
diff --git a/util/fptr_wlist.h b/util/fptr_wlist.h
index 39e3f2d7f21b..03c2b92b45aa 100644
--- a/util/fptr_wlist.h
+++ b/util/fptr_wlist.h
@@ -212,7 +212,8 @@ int fptr_whitelist_hash_markdelfunc(lruhash_markdelfunc_type fptr);
int fptr_whitelist_modenv_send_query(struct outbound_entry* (*fptr)(
struct query_info* qinfo, uint16_t flags, int dnssec, int want_dnssec,
int nocaps, struct sockaddr_storage* addr, socklen_t addrlen,
- uint8_t* zone, size_t zonelen, int ssl_upstream, struct module_qstate* q));
+ uint8_t* zone, size_t zonelen, int ssl_upstream, char* tls_auth_name,
+ struct module_qstate* q));
/**
* Check function pointer whitelist for module_env detach_subs callback values.
diff --git a/util/iana_ports.inc b/util/iana_ports.inc
index e44a796dc4ad..b35cf7d29b0c 100644
--- a/util/iana_ports.inc
+++ b/util/iana_ports.inc
@@ -4890,6 +4890,7 @@
9006,
9007,
9009,
+9011,
9020,
9021,
9022,
diff --git a/util/module.h b/util/module.h
index 73db994bd7a3..c6e5164de6d6 100644
--- a/util/module.h
+++ b/util/module.h
@@ -338,6 +338,8 @@ struct module_env {
* @param zone: delegation point name.
* @param zonelen: length of zone name.
* @param ssl_upstream: use SSL for upstream queries.
+ * @param tls_auth_name: if ssl_upstream, use this name with TLS
+ * authentication.
* @param q: wich query state to reactivate upon return.
* @return: false on failure (memory or socket related). no query was
* sent. Or returns an outbound entry with qsent and qstate set.
@@ -348,7 +350,7 @@ struct module_env {
uint16_t flags, int dnssec, int want_dnssec, int nocaps,
struct sockaddr_storage* addr, socklen_t addrlen,
uint8_t* zone, size_t zonelen, int ssl_upstream,
- struct module_qstate* q);
+ char* tls_auth_name, struct module_qstate* q);
/**
* Detach-subqueries.
diff --git a/util/net_help.c b/util/net_help.c
index fdc8b0558af0..40bfefb6426a 100644
--- a/util/net_help.c
+++ b/util/net_help.c
@@ -241,7 +241,8 @@ ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
socklen_t* addrlen, int* net)
{
- char* s = NULL;
+ char buf[64];
+ char* s;
*net = (str_is_ip6(str)?128:32);
if((s=strchr(str, '/'))) {
if(atoi(s+1) > *net) {
@@ -253,24 +254,65 @@ int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
log_err("cannot parse netblock: '%s'", str);
return 0;
}
- if(!(s = strdup(str))) {
- log_err("out of memory");
- return 0;
- }
- *strchr(s, '/') = '\0';
+ strlcpy(buf, str, sizeof(buf));
+ s = strchr(buf, '/');
+ if(s) *s = 0;
+ s = buf;
}
if(!ipstrtoaddr(s?s:str, port, addr, addrlen)) {
- free(s);
log_err("cannot parse ip address: '%s'", str);
return 0;
}
if(s) {
- free(s);
addr_mask(addr, *addrlen, *net);
}
return 1;
}
+int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
+ socklen_t* addrlen, char** auth_name)
+{
+ char* s;
+ int port = UNBOUND_DNS_PORT;
+ if((s=strchr(str, '@'))) {
+ char buf[MAX_ADDR_STRLEN];
+ size_t len = (size_t)(s-str);
+ char* hash = strchr(s+1, '#');
+ if(hash) {
+ *auth_name = hash+1;
+ } else {
+ *auth_name = NULL;
+ }
+ if(len >= MAX_ADDR_STRLEN) {
+ return 0;
+ }
+ (void)strlcpy(buf, str, sizeof(buf));
+ buf[len] = 0;
+ port = atoi(s+1);
+ if(port == 0) {
+ if(!hash && strcmp(s+1,"0")!=0)
+ return 0;
+ if(hash && strncmp(s+1,"0#",2)!=0)
+ return 0;
+ }
+ return ipstrtoaddr(buf, port, addr, addrlen);
+ }
+ if((s=strchr(str, '#'))) {
+ char buf[MAX_ADDR_STRLEN];
+ size_t len = (size_t)(s-str);
+ if(len >= MAX_ADDR_STRLEN) {
+ return 0;
+ }
+ (void)strlcpy(buf, str, sizeof(buf));
+ buf[len] = 0;
+ port = UNBOUND_DNS_OVER_TLS_PORT;
+ *auth_name = s+1;
+ return ipstrtoaddr(buf, port, addr, addrlen);
+ }
+ *auth_name = NULL;
+ return ipstrtoaddr(str, port, addr, addrlen);
+}
+
/** store port number into sockaddr structure */
void
sockaddr_store_port(struct sockaddr_storage* addr, socklen_t addrlen, int port)
diff --git a/util/net_help.h b/util/net_help.h
index 2d6fce91db6e..5e0d3a62936e 100644
--- a/util/net_help.h
+++ b/util/net_help.h
@@ -190,7 +190,7 @@ int ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
/**
* Convert ip netblock (ip/netsize) string and port to sockaddr.
- * *SLOW*, does a malloc internally to avoid writing over 'ip' string.
+ * performs a copy internally to avoid writing over 'ip' string.
* @param ip: ip4 or ip6 address string.
* @param port: port number, host format.
* @param addr: where to store sockaddr.
@@ -202,6 +202,20 @@ int netblockstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
socklen_t* addrlen, int* net);
/**
+ * Convert address string, with "@port" appendix, to sockaddr.
+ * It can also have an "#tls-auth-name" appendix (after the port).
+ * The returned tls-auth-name string is a pointer into the input string.
+ * Uses DNS port by default.
+ * @param str: the string
+ * @param addr: where to store sockaddr.
+ * @param addrlen: length of stored sockaddr is returned.
+ * @param auth_name: returned pointer to tls_auth_name, or NULL if none.
+ * @return 0 on error.
+ */
+int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
+ socklen_t* addrlen, char** auth_name);
+
+/**
* Store port number into sockaddr structure
* @param addr: sockaddr structure, ip4 or ip6.
* @param addrlen: length of addr.
diff --git a/util/netevent.c b/util/netevent.c
index fc6f6a9ea8b5..f0d72e038441 100644
--- a/util/netevent.c
+++ b/util/netevent.c
@@ -46,6 +46,7 @@
#include "util/fptr_wlist.h"
#include "sldns/pkthdr.h"
#include "sldns/sbuffer.h"
+#include "sldns/str2wire.h"
#include "dnstap/dnstap.h"
#include "dnscrypt/dnscrypt.h"
#ifdef HAVE_OPENSSL_SSL_H
@@ -1209,9 +1210,24 @@ ssl_handle_write(struct comm_point* c)
if(c->tcp_byte_count < sizeof(uint16_t)) {
uint16_t len = htons(sldns_buffer_limit(c->buffer));
ERR_clear_error();
- r = SSL_write(c->ssl,
- (void*)(((uint8_t*)&len)+c->tcp_byte_count),
- (int)(sizeof(uint16_t)-c->tcp_byte_count));
+ if(sizeof(uint16_t)+sldns_buffer_remaining(c->buffer) <
+ LDNS_RR_BUF_SIZE) {
+ /* combine the tcp length and the query for write,
+ * this emulates writev */
+ uint8_t buf[LDNS_RR_BUF_SIZE];
+ memmove(buf, &len, sizeof(uint16_t));
+ memmove(buf+sizeof(uint16_t),
+ sldns_buffer_current(c->buffer),
+ sldns_buffer_remaining(c->buffer));
+ r = SSL_write(c->ssl, (void*)(buf+c->tcp_byte_count),
+ (int)(sizeof(uint16_t)+
+ sldns_buffer_remaining(c->buffer)
+ - c->tcp_byte_count));
+ } else {
+ r = SSL_write(c->ssl,
+ (void*)(((uint8_t*)&len)+c->tcp_byte_count),
+ (int)(sizeof(uint16_t)-c->tcp_byte_count));
+ }
if(r <= 0) {
int want = SSL_get_error(c->ssl, r);
if(want == SSL_ERROR_ZERO_RETURN) {
diff --git a/util/tube.c b/util/tube.c
index f42d22cb3f20..dc6e3c2e7f78 100644
--- a/util/tube.c
+++ b/util/tube.c
@@ -454,8 +454,9 @@ int tube_setup_bg_write(struct tube* tube, struct comm_base* base)
int tube_queue_item(struct tube* tube, uint8_t* msg, size_t len)
{
- struct tube_res_list* item =
- (struct tube_res_list*)malloc(sizeof(*item));
+ struct tube_res_list* item;
+ if(!tube || !tube->res_com) return 0;
+ item = (struct tube_res_list*)malloc(sizeof(*item));
if(!item) {
free(msg);
log_err("out of memory for async answer");
@@ -687,8 +688,9 @@ int tube_setup_bg_write(struct tube* ATTR_UNUSED(tube),
int tube_queue_item(struct tube* tube, uint8_t* msg, size_t len)
{
- struct tube_res_list* item =
- (struct tube_res_list*)malloc(sizeof(*item));
+ struct tube_res_list* item;
+ if(!tube) return 0;
+ item = (struct tube_res_list*)malloc(sizeof(*item));
verbose(VERB_ALGO, "tube queue_item len %d", (int)len);
if(!item) {
free(msg);
diff --git a/util/ub_event.c b/util/ub_event.c
index fba2f2488296..78481a982055 100644
--- a/util/ub_event.c
+++ b/util/ub_event.c
@@ -95,6 +95,7 @@ UB_EV_BITS_CB(comm_timer_callback)
UB_EV_BITS_CB(comm_signal_callback)
UB_EV_BITS_CB(comm_point_local_handle_callback)
UB_EV_BITS_CB(comm_point_raw_handle_callback)
+UB_EV_BITS_CB(comm_point_http_handle_callback)
UB_EV_BITS_CB(tube_handle_signal)
UB_EV_BITS_CB(comm_base_handle_slow_accept)
@@ -116,12 +117,17 @@ static void (*NATIVE_BITS_CB(void (*cb)(int, short, void*)))(int, short, void*)
return my_comm_point_local_handle_callback;
else if(cb == comm_point_raw_handle_callback)
return my_comm_point_raw_handle_callback;
+ else if(cb == comm_point_http_handle_callback)
+ return my_comm_point_http_handle_callback;
else if(cb == tube_handle_signal)
return my_tube_handle_signal;
else if(cb == comm_base_handle_slow_accept)
return my_comm_base_handle_slow_accept;
- else
+ else {
+ log_assert(0); /* this NULL callback pointer should not happen,
+ we should have the necessary routine listed above */
return NULL;
+ }
}
#else
# define NATIVE_BITS(b) (b)
diff --git a/validator/val_anchor.c b/validator/val_anchor.c
index 6c6322447d6d..8ae9e7f3bce0 100644
--- a/validator/val_anchor.c
+++ b/validator/val_anchor.c
@@ -1309,3 +1309,44 @@ anchor_list_keytags(struct trust_anchor* ta, uint16_t* list, size_t num)
qsort(list, ret, sizeof(*list), keytag_compare);
return ret;
}
+
+int
+anchor_has_keytag(struct val_anchors* anchors, uint8_t* name, int namelabs,
+ size_t namelen, uint16_t dclass, uint16_t keytag)
+{
+ uint16_t* taglist;
+ uint16_t* tl;
+ size_t numtag, i;
+ struct trust_anchor* anchor = anchor_find(anchors,
+ name, namelabs, namelen, dclass);
+ if(!anchor)
+ return 0;
+ if(!anchor->numDS && !anchor->numDNSKEY) {
+ lock_basic_unlock(&anchor->lock);
+ return 0;
+ }
+
+ taglist = calloc(anchor->numDS + anchor->numDNSKEY, sizeof(*taglist));
+ if(!taglist) {
+ lock_basic_unlock(&anchor->lock);
+ return 0;
+ }
+
+ numtag = anchor_list_keytags(anchor, taglist,
+ anchor->numDS+anchor->numDNSKEY);
+ lock_basic_unlock(&anchor->lock);
+ if(!numtag) {
+ free(taglist);
+ return 0;
+ }
+ tl = taglist;
+ for(i=0; i<numtag; i++) {
+ if(*tl == keytag) {
+ free(taglist);
+ return 1;
+ }
+ tl++;
+ }
+ free(taglist);
+ return 0;
+}
diff --git a/validator/val_anchor.h b/validator/val_anchor.h
index 318a2b227cc7..a2a795d093d2 100644
--- a/validator/val_anchor.h
+++ b/validator/val_anchor.h
@@ -227,4 +227,19 @@ void anchors_delete_insecure(struct val_anchors* anchors, uint16_t c,
*/
size_t anchor_list_keytags(struct trust_anchor* ta, uint16_t* list, size_t num);
+/**
+ * Check if there is a trust anchor for given zone with this keytag.
+ *
+ * @param anchors: anchor storage
+ * @param name: name of trust anchor (wireformat)
+ * @param namelabs: labels in name
+ * @param namelen: length of name
+ * @param dclass: class of trust anchor
+ * @param keytag: keytag
+ * @return 1 if there is a trust anchor in the trustachor store for this zone
+ * and keytag, else 0.
+ */
+int anchor_has_keytag(struct val_anchors* anchors, uint8_t* name, int namelabs,
+ size_t namelen, uint16_t dclass, uint16_t keytag);
+
#endif /* VALIDATOR_VAL_ANCHOR_H */
diff --git a/validator/val_neg.c b/validator/val_neg.c
index 541238148307..c494a6be637f 100644
--- a/validator/val_neg.c
+++ b/validator/val_neg.c
@@ -1515,6 +1515,10 @@ val_neg_getmsg(struct val_neg_cache* neg, struct query_info* qinfo,
return NULL;
if(addsoa && !add_soa(rrset_cache, now, region, msg, NULL))
return NULL;
+
+ lock_basic_lock(&neg->lock);
+ neg->num_neg_cache_noerror++;
+ lock_basic_unlock(&neg->lock);
return msg;
} else if(nsec && val_nsec_proves_name_error(nsec, qinfo->qname)) {
if(!(msg = dns_msg_create(qinfo->qname, qinfo->qname_len,
@@ -1578,7 +1582,7 @@ val_neg_getmsg(struct val_neg_cache* neg, struct query_info* qinfo,
rcode = LDNS_RCODE_NXDOMAIN;
else if(!nsec_proves_nodata(wcrr, &wc_qinfo,
&nodata_wc) || nodata_wc)
- /* &nodata_wc shoudn't be set, wc_qinfo
+ /* &nodata_wc shouldn't be set, wc_qinfo
* already contains wildcard domain. */
/* NSEC doesn't prove anything for
* wildcard. */
@@ -1595,6 +1599,14 @@ val_neg_getmsg(struct val_neg_cache* neg, struct query_info* qinfo,
if(addsoa && !add_soa(rrset_cache, now, region, msg, NULL))
return NULL;
+ /* Increment statistic counters */
+ lock_basic_lock(&neg->lock);
+ if(rcode == LDNS_RCODE_NOERROR)
+ neg->num_neg_cache_noerror++;
+ else if(rcode == LDNS_RCODE_NXDOMAIN)
+ neg->num_neg_cache_nxdomain++;
+ lock_basic_unlock(&neg->lock);
+
FLAGS_SET_RCODE(msg->rep->flags, rcode);
return msg;
}
diff --git a/validator/val_neg.h b/validator/val_neg.h
index 00dad6df1f5c..877f5c944747 100644
--- a/validator/val_neg.h
+++ b/validator/val_neg.h
@@ -80,6 +80,12 @@ struct val_neg_cache {
size_t max;
/** max nsec3 iterations allowed */
size_t nsec3_max_iter;
+ /** number of times neg cache records were used to generate NOERROR
+ * responses. */
+ size_t num_neg_cache_noerror;
+ /** number of times neg cache records were used to generate NXDOMAIN
+ * responses. */
+ size_t num_neg_cache_nxdomain;
};
/**
diff --git a/validator/val_secalgo.c b/validator/val_secalgo.c
index 7f5c5181fd2d..95200a48b61b 100644
--- a/validator/val_secalgo.c
+++ b/validator/val_secalgo.c
@@ -231,7 +231,10 @@ dnskey_algo_id_is_supported(int id)
#ifdef USE_ED25519
case LDNS_ED25519:
#endif
-#if (defined(HAVE_EVP_SHA256) && defined(USE_SHA2)) || (defined(HAVE_EVP_SHA512) && defined(USE_SHA2)) || defined(USE_ECDSA)
+#ifdef USE_ED448
+ case LDNS_ED448:
+#endif
+#if (defined(HAVE_EVP_SHA256) && defined(USE_SHA2)) || (defined(HAVE_EVP_SHA512) && defined(USE_SHA2)) || defined(USE_ECDSA) || defined(USE_ED25519) || defined(USE_ED448)
return 1;
#endif
@@ -569,6 +572,17 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
*digest_type = NULL;
break;
#endif /* USE_ED25519 */
+#ifdef USE_ED448
+ case LDNS_ED448:
+ *evp_key = sldns_ed4482pkey_raw(key, keylen);
+ if(!*evp_key) {
+ verbose(VERB_QUERY, "verify: "
+ "sldns_ed4482pkey_raw failed");
+ return 0;
+ }
+ *digest_type = NULL;
+ break;
+#endif /* USE_ED448 */
default:
verbose(VERB_QUERY, "verify: unknown algorithm %d",
algo);
diff --git a/validator/validator.c b/validator/validator.c
index 5ed45e9bdefd..5777b2932cb4 100644
--- a/validator/validator.c
+++ b/validator/validator.c
@@ -40,6 +40,7 @@
* According to RFC 4034.
*/
#include "config.h"
+#include <ctype.h>
#include "validator/validator.h"
#include "validator/val_anchor.h"
#include "validator/val_kcache.h"
@@ -478,6 +479,31 @@ generate_keytag_query(struct module_qstate* qstate, int id,
}
/**
+ * Get keytag as uint16_t from string
+ *
+ * @param start: start of string containing keytag
+ * @param keytag: pointer where to store the extracted keytag
+ * @return: 1 if keytag was extracted, else 0.
+ */
+static int
+sentinel_get_keytag(char* start, uint16_t* keytag) {
+ char* keytag_str;
+ char* e = NULL;
+ keytag_str = calloc(1, SENTINEL_KEYTAG_LEN + 1 /* null byte */);
+ if(!keytag_str)
+ return 0;
+ memmove(keytag_str, start, SENTINEL_KEYTAG_LEN);
+ keytag_str[SENTINEL_KEYTAG_LEN] = '\0';
+ *keytag = (uint16_t)strtol(keytag_str, &e, 10);
+ if(!e || *e != '\0') {
+ free(keytag_str);
+ return 0;
+ }
+ free(keytag_str);
+ return 1;
+}
+
+/**
* Prime trust anchor for use.
* Generate and dispatch a priming query for the given trust anchor.
* The trust anchor can be DNSKEY or DS and does not have to be signed.
@@ -2223,6 +2249,34 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
vq->orig_msg->rep->security = sec_status_indeterminate;
}
+ if(vq->orig_msg->rep->security == sec_status_secure &&
+ qstate->env->cfg->root_key_sentinel &&
+ (qstate->qinfo.qtype == LDNS_RR_TYPE_A ||
+ qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA)) {
+ char* keytag_start;
+ uint16_t keytag;
+ if(*qstate->qinfo.qname == strlen(SENTINEL_IS) +
+ SENTINEL_KEYTAG_LEN &&
+ dname_lab_startswith(qstate->qinfo.qname, SENTINEL_IS,
+ &keytag_start)) {
+ if(sentinel_get_keytag(keytag_start, &keytag) &&
+ !anchor_has_keytag(qstate->env->anchors,
+ (uint8_t*)"", 1, 0, vq->qchase.qclass, keytag)) {
+ vq->orig_msg->rep->security =
+ sec_status_secure_sentinel_fail;
+ }
+ } else if(*qstate->qinfo.qname == strlen(SENTINEL_NOT) +
+ SENTINEL_KEYTAG_LEN &&
+ dname_lab_startswith(qstate->qinfo.qname, SENTINEL_NOT,
+ &keytag_start)) {
+ if(sentinel_get_keytag(keytag_start, &keytag) &&
+ anchor_has_keytag(qstate->env->anchors,
+ (uint8_t*)"", 1, 0, vq->qchase.qclass, keytag)) {
+ vq->orig_msg->rep->security =
+ sec_status_secure_sentinel_fail;
+ }
+ }
+ }
/* store results in cache */
if(qstate->query_flags&BIT_RD) {
/* if secure, this will override cache anyway, no need
diff --git a/validator/validator.h b/validator/validator.h
index 9a591078f71c..9e4c8a9414a1 100644
--- a/validator/validator.h
+++ b/validator/validator.h
@@ -67,6 +67,13 @@ struct config_strlist;
/** max number of query restarts, number of IPs to probe */
#define VAL_MAX_RESTART_COUNT 5
+/** Root key sentinel is ta preamble */
+#define SENTINEL_IS "root-key-sentinel-is-ta-"
+/** Root key sentinel is not ta preamble */
+#define SENTINEL_NOT "root-key-sentinel-not-ta-"
+/** Root key sentinal keytag length */
+#define SENTINEL_KEYTAG_LEN 5
+
/**
* Global state for the validator.
*/