aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2017-02-03 13:06:34 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2017-02-03 13:06:34 +0000
commitbd51c20871bac7a49ea0adc443050f2894cfd5f3 (patch)
treec551994131aa8f3315a21aeaf4f9bc2a8b757e89
parent27c2fff0f2fef695b0599fc3931cacfc16376e88 (diff)
downloadsrc-bd51c20871bac7a49ea0adc443050f2894cfd5f3.tar.gz
src-bd51c20871bac7a49ea0adc443050f2894cfd5f3.zip
import unbound 1.6.0vendor/unbound/1.6.0
Notes
Notes: svn path=/vendor/unbound/dist/; revision=313158 svn path=/vendor/unbound/1.6.0/; revision=313159; tag=vendor/unbound/1.6.0
-rw-r--r--.gitattributes1
-rw-r--r--Makefile.in138
-rw-r--r--cachedb/cachedb.c26
-rw-r--r--config.h.in12
-rwxr-xr-xconfigure77
-rw-r--r--configure.ac32
-rw-r--r--contrib/libunbound.pc.in6
-rwxr-xr-xcontrib/unbound_munin_17
-rw-r--r--daemon/acl_list.c81
-rw-r--r--daemon/acl_list.h7
-rw-r--r--daemon/cachedump.c2
-rw-r--r--daemon/daemon.c22
-rw-r--r--daemon/daemon.h3
-rw-r--r--daemon/remote.c337
-rw-r--r--daemon/stats.c1
-rw-r--r--daemon/stats.h3
-rw-r--r--daemon/unbound.c38
-rw-r--r--daemon/worker.c249
-rw-r--r--daemon/worker.h1
-rw-r--r--dns64/dns64.c5
-rw-r--r--doc/CNAME-basedRedirectionDesignNotes.pdfbin0 -> 83264 bytes
-rw-r--r--doc/Changelog174
-rw-r--r--doc/README2
-rw-r--r--doc/example.conf.in47
-rw-r--r--doc/libunbound.3.in6
-rw-r--r--doc/unbound-anchor.8.in4
-rw-r--r--doc/unbound-checkconf.8.in2
-rw-r--r--doc/unbound-control.8.in42
-rw-r--r--doc/unbound-host.1.in2
-rw-r--r--doc/unbound.8.in4
-rw-r--r--doc/unbound.conf.5.in81
-rw-r--r--iterator/iter_delegpt.c1
-rw-r--r--iterator/iter_delegpt.h4
-rw-r--r--iterator/iter_fwd.c2
-rw-r--r--iterator/iter_hints.c3
-rw-r--r--iterator/iter_utils.c1
-rw-r--r--iterator/iterator.c162
-rw-r--r--libunbound/context.c1
-rw-r--r--libunbound/libunbound.c13
-rw-r--r--libunbound/libworker.c44
-rw-r--r--libunbound/libworker.h3
-rw-r--r--libunbound/python/doc/conf.py5
-rw-r--r--libunbound/python/doc/examples/example1a.rst45
-rw-r--r--libunbound/python/doc/examples/example1b.rst44
-rw-r--r--libunbound/python/doc/examples/example2.rst64
-rw-r--r--libunbound/python/doc/examples/example3.rst9
-rw-r--r--libunbound/python/doc/examples/example4.rst46
-rw-r--r--libunbound/python/doc/examples/example5.rst17
-rw-r--r--libunbound/python/doc/examples/example6.rst12
-rw-r--r--libunbound/python/doc/examples/example7.rst33
-rw-r--r--libunbound/python/doc/examples/example8.rst44
-rw-r--r--libunbound/python/doc/examples/index.rst16
-rw-r--r--libunbound/python/doc/install.rst39
-rw-r--r--libunbound/python/doc/intro.rst95
-rw-r--r--libunbound/worker.h29
-rw-r--r--pythonmod/doc/conf.py5
-rw-r--r--pythonmod/doc/examples/example1.rst14
-rw-r--r--pythonmod/doc/examples/example2.rst45
-rw-r--r--pythonmod/doc/examples/example4.rst180
-rw-r--r--pythonmod/doc/examples/example5.rst191
-rw-r--r--pythonmod/doc/examples/example6.rst299
-rw-r--r--pythonmod/doc/examples/index.rst17
-rw-r--r--pythonmod/doc/install.rst44
-rw-r--r--pythonmod/doc/modules/functions.rst139
-rw-r--r--pythonmod/doc/modules/struct.rst187
-rw-r--r--pythonmod/examples/edns.py194
-rw-r--r--pythonmod/examples/inplace_callbacks.py244
-rw-r--r--pythonmod/interface.i427
-rw-r--r--pythonmod/pythonmod.c42
-rw-r--r--pythonmod/pythonmod.h12
-rw-r--r--pythonmod/test-edns.conf17
-rw-r--r--pythonmod/test-inplace_callbacks.py17
-rw-r--r--services/cache/dns.c9
-rw-r--r--services/localzone.c215
-rw-r--r--services/localzone.h26
-rw-r--r--services/mesh.c199
-rw-r--r--services/mesh.h26
-rw-r--r--services/outside_network.c23
-rw-r--r--services/outside_network.h27
-rw-r--r--services/view.c207
-rw-r--r--services/view.h135
-rw-r--r--sldns/str2wire.c14
-rw-r--r--sldns/wire2str.c11
-rw-r--r--smallapp/unbound-anchor.c11
-rw-r--r--smallapp/unbound-checkconf.c10
-rw-r--r--smallapp/unbound-control.c21
-rw-r--r--smallapp/worker_cb.c28
-rw-r--r--testcode/asynclook.c2
-rw-r--r--testcode/fake_event.c24
-rw-r--r--testcode/memstats.c1
-rw-r--r--testcode/perf.c1
-rw-r--r--testcode/streamtcp.c3
-rw-r--r--testdata/04-checkconf.tpkgbin5127 -> 5169 bytes
-rw-r--r--testdata/09-unbound-control.tpkgbin7028 -> 7433 bytes
-rw-r--r--testdata/local_cname.rpl491
-rw-r--r--testdata/stop_nxdomain_minimised.rpl110
-rw-r--r--testdata/val_cnamewctonodata.rpl2
-rw-r--r--testdata/val_ds_sha2.crpl1
-rw-r--r--testdata/val_ds_sha2_downgrade.crpl1
-rw-r--r--testdata/val_nodata_failsig.rpl4
-rw-r--r--testdata/val_nsec3_wcany.rpl2
-rw-r--r--testdata/val_nsec3_wcany_nodeny.rpl2
-rw-r--r--testdata/views.rpl210
-rw-r--r--util/config_file.c41
-rw-r--r--util/config_file.h48
-rw-r--r--util/configlexer.c4534
-rw-r--r--util/configlexer.lex11
-rw-r--r--util/configparser.c2115
-rw-r--r--util/configparser.h192
-rw-r--r--util/configparser.y167
-rw-r--r--util/data/msgencode.c73
-rw-r--r--util/data/msgparse.c19
-rw-r--r--util/data/msgparse.h9
-rw-r--r--util/data/msgreply.c153
-rw-r--r--util/data/msgreply.h149
-rw-r--r--util/fptr_wlist.c41
-rw-r--r--util/fptr_wlist.h26
-rw-r--r--util/iana_ports.inc8
-rw-r--r--util/module.c254
-rw-r--r--util/module.h301
-rw-r--r--validator/autotrust.c1
-rw-r--r--validator/val_neg.c1
-rw-r--r--validator/val_nsec.c2
-rw-r--r--validator/val_nsec3.c2
-rw-r--r--validator/val_secalgo.c22
-rw-r--r--validator/val_sigcrypt.c2
-rw-r--r--validator/val_utils.c26
-rw-r--r--validator/validator.c6
128 files changed, 9838 insertions, 4409 deletions
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000000..6414a0ab5302
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+testdata/*.[0-9] linguist-documentation
diff --git a/Makefile.in b/Makefile.in
index 77e38eaa5142..997282e44b28 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -101,7 +101,7 @@ util/data/msgreply.c util/data/packed_rrset.c iterator/iterator.c \
iterator/iter_delegpt.c iterator/iter_donotq.c iterator/iter_fwd.c \
iterator/iter_hints.c iterator/iter_priv.c iterator/iter_resptype.c \
iterator/iter_scrub.c iterator/iter_utils.c services/listen_dnsport.c \
-services/localzone.c services/mesh.c services/modstack.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/fptr_wlist.c util/locks.c util/log.c util/mini_event.c util/module.c \
@@ -117,7 +117,7 @@ $(DNSTAP_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 \
iter_donotq.lo iter_fwd.lo iter_hints.lo iter_priv.lo iter_resptype.lo \
-iter_scrub.lo iter_utils.lo localzone.lo mesh.lo modstack.lo \
+iter_scrub.lo iter_utils.lo localzone.lo mesh.lo modstack.lo view.lo \
outbound_list.lo alloc.lo config_file.lo configlexer.lo configparser.lo \
fptr_wlist.lo locks.lo log.lo mini_event.lo module.lo net_help.lo \
random.lo rbtree.lo regional.lo rtt.lo dnstree.lo lookup3.lo lruhash.lo \
@@ -625,7 +625,8 @@ msgencode.lo msgencode.o: $(srcdir)/util/data/msgencode.c config.h $(srcdir)/uti
$(srcdir)/util/data/msgreply.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/util/data/dname.h $(srcdir)/util/regional.h $(srcdir)/util/net_help.h \
- $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/sldns/sbuffer.h $(srcdir)/services/localzone.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/module.h $(srcdir)/services/view.h
msgparse.lo msgparse.o: $(srcdir)/util/data/msgparse.c config.h $(srcdir)/util/data/msgparse.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
@@ -635,7 +636,9 @@ msgreply.lo msgreply.o: $(srcdir)/util/data/msgreply.c config.h $(srcdir)/util/d
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/storage/lookup3.h $(srcdir)/util/alloc.h $(srcdir)/util/netevent.h $(srcdir)/util/net_help.h \
$(srcdir)/util/data/dname.h $(srcdir)/util/regional.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgencode.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/wire2str.h
+ $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgencode.h $(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/wire2str.h \
+ $(srcdir)/util/module.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h \
+ $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h
packed_rrset.lo packed_rrset.o: $(srcdir)/util/data/packed_rrset.c config.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/util/data/dname.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/alloc.h $(srcdir)/util/regional.h \
@@ -705,25 +708,32 @@ listen_dnsport.lo listen_dnsport.o: $(srcdir)/services/listen_dnsport.c config.h
$(srcdir)/util/net_help.h $(srcdir)/sldns/sbuffer.h
localzone.lo localzone.o: $(srcdir)/services/localzone.c config.h $(srcdir)/services/localzone.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/storage/dnstree.h \
- $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/regional.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h \
- $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/net_help.h \
- $(srcdir)/util/netevent.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/util/as112.h
+ $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
+ $(srcdir)/sldns/rrdef.h $(srcdir)/services/view.h $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/sbuffer.h \
+ $(srcdir)/util/regional.h $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h \
+ $(srcdir)/util/data/msgencode.h $(srcdir)/util/net_help.h $(srcdir)/util/netevent.h $(srcdir)/util/as112.h
mesh.lo mesh.o: $(srcdir)/services/mesh.c config.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
$(srcdir)/util/netevent.h $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/module.h \
$(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/services/modstack.h \
$(srcdir)/services/outbound_list.h $(srcdir)/services/cache/dns.h $(srcdir)/util/net_help.h \
$(srcdir)/util/regional.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/timehist.h $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/tube.h $(srcdir)/util/alloc.h $(srcdir)/util/config_file.h $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/util/tube.h $(srcdir)/util/alloc.h $(srcdir)/util/config_file.h $(srcdir)/sldns/sbuffer.h \
+ $(srcdir)/sldns/wire2str.h $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h \
+ $(srcdir)/services/view.h $(srcdir)/util/data/dname.h
modstack.lo modstack.o: $(srcdir)/services/modstack.c config.h $(srcdir)/services/modstack.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(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/fptr_wlist.h $(srcdir)/util/netevent.h \
$(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/dns64/dns64.h \
$(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/validator/validator.h \
- $(srcdir)/validator/val_utils.h $(PYTHONMOD_HEADER) $(srcdir)/cachedb/cachedb.h
+ $(srcdir)/validator/val_utils.h $(PYTHONMOD_HEADER)
+view.lo view.o: $(srcdir)/services/view.c config.h $(srcdir)/services/view.h $(srcdir)/util/rbtree.h \
+ $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h \
+ $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h \
+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
+ $(srcdir)/sldns/rrdef.h $(srcdir)/util/config_file.h
outbound_list.lo outbound_list.o: $(srcdir)/services/outbound_list.c config.h \
$(srcdir)/services/outbound_list.h $(srcdir)/services/outside_network.h $(srcdir)/util/rbtree.h \
$(srcdir)/util/netevent.h
@@ -760,15 +770,15 @@ fptr_wlist.lo fptr_wlist.o: $(srcdir)/util/fptr_wlist.c config.h $(srcdir)/util/
$(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)/util/mini_event.h \
$(srcdir)/util/rbtree.h $(srcdir)/services/outside_network.h \
- $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/dns64/dns64.h \
- $(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h \
- $(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_anchor.h \
- $(srcdir)/validator/val_nsec3.h $(srcdir)/validator/val_sigcrypt.h $(srcdir)/validator/val_kentry.h \
- $(srcdir)/validator/val_neg.h $(srcdir)/validator/autotrust.h $(srcdir)/libunbound/libworker.h \
- $(srcdir)/libunbound/context.h $(srcdir)/util/alloc.h $(srcdir)/libunbound/unbound.h \
- $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h \
- $(PYTHONMOD_HEADER) $(srcdir)/cachedb/cachedb.h
+ $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/view.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/dns64/dns64.h $(srcdir)/iterator/iterator.h \
+ $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/validator/validator.h \
+ $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_anchor.h $(srcdir)/validator/val_nsec3.h \
+ $(srcdir)/validator/val_sigcrypt.h $(srcdir)/validator/val_kentry.h $(srcdir)/validator/val_neg.h \
+ $(srcdir)/validator/autotrust.h $(srcdir)/libunbound/libworker.h $(srcdir)/libunbound/context.h \
+ $(srcdir)/util/alloc.h $(srcdir)/libunbound/unbound.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
+ $(srcdir)/util/config_file.h $(PYTHONMOD_HEADER)
locks.lo locks.o: $(srcdir)/util/locks.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h
log.lo log.o: $(srcdir)/util/log.c config.h $(srcdir)/util/log.h $(srcdir)/util/locks.h $(srcdir)/sldns/sbuffer.h
mini_event.lo mini_event.o: $(srcdir)/util/mini_event.c config.h $(srcdir)/util/mini_event.h $(srcdir)/util/rbtree.h \
@@ -778,7 +788,7 @@ mini_event.lo mini_event.o: $(srcdir)/util/mini_event.c config.h $(srcdir)/util/
$(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h
module.lo module.o: $(srcdir)/util/module.c config.h $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
- $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h
+ $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
netevent.lo netevent.o: $(srcdir)/util/netevent.c config.h $(srcdir)/util/netevent.h $(srcdir)/util/ub_event.h \
$(srcdir)/util/log.h $(srcdir)/util/net_help.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/locks.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \
@@ -902,14 +912,7 @@ dns64.lo dns64.o: $(srcdir)/dns64/dns64.c config.h $(srcdir)/dns64/dns64.h $(src
$(srcdir)/util/storage/slabhash.h $(srcdir)/util/config_file.h $(srcdir)/util/fptr_wlist.h \
$(srcdir)/util/netevent.h $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
$(srcdir)/services/modstack.h $(srcdir)/util/net_help.h $(srcdir)/util/regional.h
-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)/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
+cachedb.lo cachedb.o: $(srcdir)/cachedb/cachedb.c config.h
checklocks.lo checklocks.o: $(srcdir)/testcode/checklocks.c config.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/testcode/checklocks.h
unitanchor.lo unitanchor.o: $(srcdir)/testcode/unitanchor.c config.h $(srcdir)/util/log.h $(srcdir)/util/data/dname.h \
@@ -956,9 +959,11 @@ testpkts.lo testpkts.o: $(srcdir)/testcode/testpkts.c config.h $(srcdir)/testcod
unitldns.lo unitldns.o: $(srcdir)/testcode/unitldns.c config.h $(srcdir)/util/log.h $(srcdir)/testcode/unitmain.h \
$(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
- $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/regional.h $(srcdir)/util/log.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h $(srcdir)/util/locks.h \
- $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h $(srcdir)/util/locks.h \
+ $(srcdir)/util/log.h $(srcdir)/util/regional.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h \
+ $(srcdir)/services/localzone.h $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/str2wire.h
cachedump.lo cachedump.o: $(srcdir)/daemon/cachedump.c config.h $(srcdir)/daemon/cachedump.h \
$(srcdir)/daemon/remote.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 \
@@ -978,10 +983,10 @@ daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h $(srcdir)/daemon/daemon.h
$(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
$(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h $(srcdir)/util/module.h $(srcdir)/dnstap/dnstap.h \
$(srcdir)/daemon/remote.h $(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/storage/slabhash.h \
- $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h $(srcdir)/util/random.h $(srcdir)/util/tube.h \
- $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h
+ $(srcdir)/services/view.h $(srcdir)/util/config_file.h $(srcdir)/util/storage/lookup3.h \
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h $(srcdir)/util/random.h \
+ $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h
remote.lo remote.o: $(srcdir)/daemon/remote.c config.h $(srcdir)/daemon/remote.h $(srcdir)/daemon/worker.h \
$(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/data/packed_rrset.h \
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/netevent.h \
@@ -992,12 +997,12 @@ remote.lo remote.o: $(srcdir)/daemon/remote.c config.h $(srcdir)/daemon/remote.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)/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)/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)/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 \
@@ -1025,8 +1030,8 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
$(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h \
$(srcdir)/util/module.h $(srcdir)/dnstap/dnstap.h $(srcdir)/daemon/daemon.h \
$(srcdir)/services/modstack.h $(srcdir)/daemon/remote.h $(srcdir)/daemon/acl_list.h \
- $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/config_file.h $(srcdir)/util/regional.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h \
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h $(srcdir)/util/config_file.h \
+ $(srcdir)/util/regional.h $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h \
$(srcdir)/services/outside_network.h $(srcdir)/services/outbound_list.h \
$(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
$(srcdir)/services/cache/dns.h $(srcdir)/services/mesh.h $(srcdir)/services/localzone.h \
@@ -1054,8 +1059,8 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
$(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h \
$(srcdir)/util/module.h $(srcdir)/dnstap/dnstap.h $(srcdir)/daemon/daemon.h \
$(srcdir)/services/modstack.h $(srcdir)/daemon/remote.h $(srcdir)/daemon/acl_list.h \
- $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/config_file.h $(srcdir)/util/regional.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h \
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h $(srcdir)/util/config_file.h \
+ $(srcdir)/util/regional.h $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h \
$(srcdir)/services/outside_network.h $(srcdir)/services/outbound_list.h \
$(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
$(srcdir)/services/cache/dns.h $(srcdir)/services/mesh.h $(srcdir)/services/localzone.h \
@@ -1064,9 +1069,11 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
$(srcdir)/validator/val_anchor.h $(srcdir)/libunbound/context.h $(srcdir)/libunbound/unbound.h \
$(srcdir)/libunbound/libworker.h
acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
- $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/regional.h $(srcdir)/util/log.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h $(srcdir)/util/locks.h \
- $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/services/view.h $(srcdir)/util/locks.h \
+ $(srcdir)/util/log.h $(srcdir)/util/regional.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h \
+ $(srcdir)/services/localzone.h $(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h \
+ $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h \
+ $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/str2wire.h
daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h $(srcdir)/daemon/daemon.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/services/modstack.h \
$(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
@@ -1074,10 +1081,10 @@ daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h $(srcdir)/daemon/daemon.h
$(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \
$(srcdir)/daemon/stats.h $(srcdir)/util/timehist.h $(srcdir)/util/module.h $(srcdir)/dnstap/dnstap.h \
$(srcdir)/daemon/remote.h $(srcdir)/daemon/acl_list.h $(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h \
- $(srcdir)/util/config_file.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/storage/slabhash.h \
- $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h $(srcdir)/util/random.h $(srcdir)/util/tube.h \
- $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h
+ $(srcdir)/services/view.h $(srcdir)/util/config_file.h $(srcdir)/util/storage/lookup3.h \
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/services/listen_dnsport.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/localzone.h $(srcdir)/util/random.h \
+ $(srcdir)/util/tube.h $(srcdir)/util/net_help.h $(srcdir)/sldns/keyraw.h
stats.lo stats.o: $(srcdir)/daemon/stats.c config.h $(srcdir)/daemon/stats.h $(srcdir)/util/timehist.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 \
@@ -1125,7 +1132,7 @@ unbound-checkconf.lo unbound-checkconf.o: $(srcdir)/smallapp/unbound-checkconf.c
$(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h \
$(srcdir)/util/rbtree.h $(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h $(srcdir)/services/localzone.h \
- $(srcdir)/sldns/sbuffer.h $(PYTHONMOD_HEADER)
+ $(srcdir)/services/view.h $(srcdir)/sldns/sbuffer.h $(PYTHONMOD_HEADER)
worker_cb.lo worker_cb.o: $(srcdir)/smallapp/worker_cb.c config.h $(srcdir)/libunbound/context.h \
$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
$(srcdir)/libunbound/unbound.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
@@ -1137,8 +1144,9 @@ context.lo context.o: $(srcdir)/libunbound/context.c config.h $(srcdir)/libunbou
$(srcdir)/libunbound/unbound.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
$(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h \
- $(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
- $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/util/storage/dnstree.h $(srcdir)/services/view.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h \
+ $(srcdir)/sldns/sbuffer.h
libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbound/unbound.h \
$(srcdir)/libunbound/unbound-event.h config.h $(srcdir)/libunbound/context.h $(srcdir)/util/locks.h \
$(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
@@ -1146,9 +1154,9 @@ libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbou
$(srcdir)/util/config_file.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/regional.h \
$(srcdir)/util/random.h $(srcdir)/util/net_help.h $(srcdir)/util/tube.h $(srcdir)/util/ub_event.h \
- $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/infra.h \
- $(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
- $(srcdir)/sldns/sbuffer.h
+ $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/view.h \
+ $(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h \
+ $(srcdir)/util/storage/slabhash.h $(srcdir)/sldns/sbuffer.h
libworker.lo libworker.o: $(srcdir)/libunbound/libworker.c config.h $(srcdir)/libunbound/libworker.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
$(srcdir)/libunbound/context.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
@@ -1156,12 +1164,12 @@ libworker.lo libworker.o: $(srcdir)/libunbound/libworker.c config.h $(srcdir)/li
$(srcdir)/libunbound/unbound-event.h $(srcdir)/services/outside_network.h $(srcdir)/util/netevent.h \
$(srcdir)/services/mesh.h $(srcdir)/util/data/msgparse.h \
$(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
- $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/rrset.h \
- $(srcdir)/util/storage/slabhash.h $(srcdir)/services/outbound_list.h $(srcdir)/util/fptr_wlist.h \
- $(srcdir)/util/tube.h $(srcdir)/util/regional.h $(srcdir)/util/random.h $(srcdir)/util/config_file.h \
- $(srcdir)/util/storage/lookup3.h $(srcdir)/util/net_help.h $(srcdir)/util/data/dname.h \
- $(srcdir)/util/data/msgencode.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
- $(srcdir)/sldns/str2wire.h
+ $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/view.h \
+ $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/services/outbound_list.h \
+ $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/regional.h $(srcdir)/util/random.h \
+ $(srcdir)/util/config_file.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/net_help.h \
+ $(srcdir)/util/data/dname.h $(srcdir)/util/data/msgencode.h $(srcdir)/iterator/iter_fwd.h \
+ $(srcdir)/iterator/iter_hints.h $(srcdir)/sldns/str2wire.h
unbound-host.lo unbound-host.o: $(srcdir)/smallapp/unbound-host.c config.h $(srcdir)/libunbound/unbound.h \
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
asynclook.lo asynclook.o: $(srcdir)/testcode/asynclook.c config.h $(srcdir)/libunbound/unbound.h \
diff --git a/cachedb/cachedb.c b/cachedb/cachedb.c
index 76d9afa47c8f..a326d6ef8dbc 100644
--- a/cachedb/cachedb.c
+++ b/cachedb/cachedb.c
@@ -547,8 +547,8 @@ cachedb_handle_query(struct module_qstate* qstate,
return;
}
- if(qstate->blacklist) {
- /* cache is blacklisted */
+ if(qstate->blacklist || qstate->no_cache_lookup) {
+ /* cache is blacklisted or we are instructed from edns to not look */
/* pass request to next module */
qstate->ext_state[id] = module_wait_module;
return;
@@ -556,10 +556,15 @@ cachedb_handle_query(struct module_qstate* qstate,
/* lookup inside unbound's internal cache */
if(cachedb_intcache_lookup(qstate)) {
- if(verbosity >= VERB_ALGO)
- log_dns_msg("cachedb internal cache lookup",
- &qstate->return_msg->qinfo,
- qstate->return_msg->rep);
+ if(verbosity >= VERB_ALGO) {
+ if(qstate->return_msg->rep)
+ log_dns_msg("cachedb internal cache lookup",
+ &qstate->return_msg->qinfo,
+ qstate->return_msg->rep);
+ else log_info("cachedb internal cache lookup: rcode %s",
+ sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)?
+ sldns_lookup_by_id(sldns_rcodes, qstate->return_rcode)->name:"??");
+ }
/* we are done with the query */
qstate->ext_state[id] = module_finished;
return;
@@ -595,8 +600,8 @@ static void
cachedb_handle_response(struct module_qstate* qstate,
struct cachedb_qstate* ATTR_UNUSED(iq), struct cachedb_env* ie, int id)
{
- /* check if we are enabled, and skip if not */
- if(!ie->enabled) {
+ /* check if we are not enabled or instructed to not cache, and skip */
+ if(!ie->enabled || qstate->no_cache_store) {
/* we are done with the query */
qstate->ext_state[id] = module_finished;
return;
@@ -649,6 +654,11 @@ cachedb_operate(struct module_qstate* qstate, enum module_ev event, int id,
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
return;
}
+ if(!iq && (event == module_event_moddone)) {
+ /* during priming, module done but we never started */
+ qstate->ext_state[id] = module_finished;
+ return;
+ }
log_err("bad event for cachedb");
(void)error_response(qstate, id, LDNS_RCODE_SERVFAIL);
diff --git a/config.h.in b/config.h.in
index 04fc74396e95..5806b9c75082 100644
--- a/config.h.in
+++ b/config.h.in
@@ -107,6 +107,9 @@
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
+/* Define to 1 if you have the `DSA_SIG_set0' function. */
+#undef HAVE_DSA_SIG_SET0
+
/* Define to 1 if you have the <endian.h> header file. */
#undef HAVE_ENDIAN_H
@@ -143,6 +146,9 @@
/* Define to 1 if you have the `EVP_cleanup' function. */
#undef HAVE_EVP_CLEANUP
+/* Define to 1 if you have the `EVP_dss1' function. */
+#undef HAVE_EVP_DSS1
+
/* Define to 1 if you have the `EVP_MD_CTX_new' function. */
#undef HAVE_EVP_MD_CTX_NEW
@@ -344,9 +350,6 @@
/* Define to 1 if you have the `recvmsg' function. */
#undef HAVE_RECVMSG
-/* define if you have the sbrk() call */
-#undef HAVE_SBRK
-
/* Define to 1 if you have the `sendmsg' function. */
#undef HAVE_SENDMSG
@@ -395,6 +398,9 @@
/* Define if you have the SSL libraries installed. */
#undef HAVE_SSL
+/* Define to 1 if you have the `SSL_CTX_set_security_level' function. */
+#undef HAVE_SSL_CTX_SET_SECURITY_LEVEL
+
/* Define to 1 if you have the <stdarg.h> header file. */
#undef HAVE_STDARG_H
diff --git a/configure b/configure
index 54f93db12417..52fd17560e27 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.5.10.
+# Generated by GNU Autoconf 2.69 for unbound 1.6.0.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.5.10'
-PACKAGE_STRING='unbound 1.5.10'
+PACKAGE_VERSION='1.6.0'
+PACKAGE_STRING='unbound 1.6.0'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl'
PACKAGE_URL=''
@@ -659,6 +659,7 @@ WINAPPS
WINDRES
CHECKLOCK_OBJ
staticexe
+PC_LIBEVENT_DEPENDENCY
UNBOUND_EVENT_UNINSTALL
UNBOUND_EVENT_INSTALL
SSLLIB
@@ -678,6 +679,7 @@ WITH_PYTHONMODULE
swig
SWIG_LIB
SWIG
+PC_PY_DEPENDENCY
PY_MAJOR_VERSION
PYTHON_SITE_PKG
PYTHON_LDFLAGS
@@ -1401,7 +1403,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.5.10 to adapt to many kinds of systems.
+\`configure' configures unbound 1.6.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1466,7 +1468,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.5.10:";;
+ short | recursive ) echo "Configuration of unbound 1.6.0:";;
esac
cat <<\_ACEOF
@@ -1656,7 +1658,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.5.10
+unbound configure 1.6.0
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2365,7 +2367,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.5.10, which was
+It was created by unbound $as_me 1.6.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2715,13 +2717,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
UNBOUND_VERSION_MAJOR=1
-UNBOUND_VERSION_MINOR=5
+UNBOUND_VERSION_MINOR=6
-UNBOUND_VERSION_MICRO=10
+UNBOUND_VERSION_MICRO=0
LIBUNBOUND_CURRENT=6
-LIBUNBOUND_REVISION=2
+LIBUNBOUND_REVISION=3
LIBUNBOUND_AGE=4
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -2771,6 +2773,7 @@ LIBUNBOUND_AGE=4
# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
# 1.5.9 had 6:1:4
# 1.5.10 had 6:2:4
+# 1.6.0 had 6:3:4
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -16823,6 +16826,8 @@ $as_echo "#define HAVE_PYTHON 1" >>confdefs.h
LIBS="$PYTHON_LDFLAGS $LIBS"
CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
ub_have_python=yes
+ PC_PY_DEPENDENCY="python"
+
# Check for SWIG
ub_have_swig=no
@@ -17535,7 +17540,7 @@ fi
done
-for ac_func in OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup
+for ac_func in OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup DSA_SIG_set0 EVP_dss1
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -17551,12 +17556,13 @@ done
# these check_funcs need -lssl
BAKLIBS="$LIBS"
LIBS="-lssl $LIBS"
-for ac_func in OPENSSL_init_ssl
+for ac_func in OPENSSL_init_ssl SSL_CTX_set_security_level
do :
- ac_fn_c_check_func "$LINENO" "OPENSSL_init_ssl" "ac_cv_func_OPENSSL_init_ssl"
-if test "x$ac_cv_func_OPENSSL_init_ssl" = xyes; then :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
-#define HAVE_OPENSSL_INIT_SSL 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
fi
@@ -17925,13 +17931,13 @@ if test "${enable_dsa+set}" = set; then :
fi
use_dsa="no"
-case "$enable_ecdsa" in
+case "$enable_dsa" in
no)
;;
*)
# detect if DSA is supported, and turn it off if not.
- ac_fn_c_check_func "$LINENO" "EVP_dss1" "ac_cv_func_EVP_dss1"
-if test "x$ac_cv_func_EVP_dss1" = xyes; then :
+ ac_fn_c_check_func "$LINENO" "DSA_SIG_new" "ac_cv_func_DSA_SIG_new"
+if test "x$ac_cv_func_DSA_SIG_new" = xyes; then :
cat >>confdefs.h <<_ACEOF
@@ -18378,6 +18384,8 @@ _ACEOF
fi
done
# only in libev. (tested on 4.00)
+ PC_LIBEVENT_DEPENDENCY="libevent"
+
if test -n "$BAK_LDFLAGS_SET"; then
LDFLAGS="$BAK_LDFLAGS"
fi
@@ -18959,33 +18967,6 @@ fi
done
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sbrk" >&5
-$as_echo_n "checking for sbrk... " >&6; }
-# catch the warning of deprecated sbrk
-old_cflags="$CFLAGS"
-CFLAGS="$CFLAGS -Werror"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
-
-int main(void) { void* cur = sbrk(0); printf("%u\n", (unsigned)(size_t)((char*)cur - (char*)sbrk(0))); return 0; }
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define HAVE_SBRK 1" >>confdefs.h
-
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$old_cflags"
-
# check if setreuid en setregid fail, on MacOSX10.4(darwin8).
if echo $build_os | grep darwin8 > /dev/null; then
@@ -19939,7 +19920,7 @@ _ACEOF
-version=1.5.10
+version=1.6.0
date=`date +'%b %e, %Y'`
@@ -20454,7 +20435,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.5.10, which was
+This file was extended by unbound $as_me 1.6.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -20520,7 +20501,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-unbound config.status 1.5.10
+unbound config.status 1.6.0
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index fc2c67684ad0..d8505393552e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -9,15 +9,15 @@ sinclude(dnstap/dnstap.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
-m4_define([VERSION_MINOR],[5])
-m4_define([VERSION_MICRO],[10])
+m4_define([VERSION_MINOR],[6])
+m4_define([VERSION_MICRO],[0])
AC_INIT(unbound, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), unbound-bugs@nlnetlabs.nl, unbound)
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
LIBUNBOUND_CURRENT=6
-LIBUNBOUND_REVISION=2
+LIBUNBOUND_REVISION=3
LIBUNBOUND_AGE=4
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -67,6 +67,7 @@ LIBUNBOUND_AGE=4
# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
# 1.5.9 had 6:1:4
# 1.5.10 had 6:2:4
+# 1.6.0 had 6:3:4
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -543,6 +544,8 @@ if test x_$ub_test_python != x_no; then
LIBS="$PYTHON_LDFLAGS $LIBS"
CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
ub_have_python=yes
+ PC_PY_DEPENDENCY="python"
+ AC_SUBST(PC_PY_DEPENDENCY)
# Check for SWIG
ub_have_swig=no
@@ -673,12 +676,12 @@ else
AC_MSG_RESULT([no])
fi
AC_CHECK_HEADERS([openssl/conf.h openssl/engine.h openssl/bn.h openssl/dh.h openssl/dsa.h openssl/rsa.h],,, [AC_INCLUDES_DEFAULT])
-AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup])
+AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup DSA_SIG_set0 EVP_dss1])
# these check_funcs need -lssl
BAKLIBS="$LIBS"
LIBS="-lssl $LIBS"
-AC_CHECK_FUNCS([OPENSSL_init_ssl])
+AC_CHECK_FUNCS([OPENSSL_init_ssl SSL_CTX_set_security_level])
LIBS="$BAKLIBS"
AC_CHECK_DECLS([SSL_COMP_get_compression_methods,sk_SSL_COMP_pop_free,SSL_CTX_set_ecdh_auto], [], [], [
@@ -864,12 +867,12 @@ esac
AC_ARG_ENABLE(dsa, AC_HELP_STRING([--disable-dsa], [Disable DSA support]))
use_dsa="no"
-case "$enable_ecdsa" in
+case "$enable_dsa" in
no)
;;
*)
# detect if DSA is supported, and turn it off if not.
- AC_CHECK_FUNC(EVP_dss1, [
+ AC_CHECK_FUNC(DSA_SIG_new, [
AC_DEFINE_UNQUOTED([USE_DSA], [1], [Define this to enable DSA support.])
], [if test "x$enable_dsa" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support DSA and you used --enable-dsa.])
fi ])
@@ -1000,6 +1003,8 @@ large outgoing port ranges. ])
AC_CHECK_FUNCS([event_base_get_method]) # only in libevent 1.4.3 and later
AC_CHECK_FUNCS([ev_loop]) # only in libev. (tested on 3.51)
AC_CHECK_FUNCS([ev_default_loop]) # only in libev. (tested on 4.00)
+ PC_LIBEVENT_DEPENDENCY="libevent"
+ AC_SUBST(PC_LIBEVENT_DEPENDENCY)
if test -n "$BAK_LDFLAGS_SET"; then
LDFLAGS="$BAK_LDFLAGS"
fi
@@ -1142,19 +1147,6 @@ AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit se
AC_CHECK_FUNCS([setresuid],,[AC_CHECK_FUNCS([setreuid])])
AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])])
-AC_MSG_CHECKING([for sbrk])
-# catch the warning of deprecated sbrk
-old_cflags="$CFLAGS"
-CFLAGS="$CFLAGS -Werror"
-AC_COMPILE_IFELSE([AC_LANG_SOURCE(AC_INCLUDES_DEFAULT
-[[
-int main(void) { void* cur = sbrk(0); printf("%u\n", (unsigned)(size_t)((char*)cur - (char*)sbrk(0))); return 0; }
-]])], [
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_SBRK, 1, [define if you have the sbrk() call])
- ], [AC_MSG_RESULT(no)])
-CFLAGS="$old_cflags"
-
# check if setreuid en setregid fail, on MacOSX10.4(darwin8).
if echo $build_os | grep darwin8 > /dev/null; then
AC_DEFINE(DARWIN_BROKEN_SETREUID, 1, [Define this if on macOSX10.4-darwin8 and setreuid and setregid do not work])
diff --git a/contrib/libunbound.pc.in b/contrib/libunbound.pc.in
index c0d1286401cc..130bef520372 100644
--- a/contrib/libunbound.pc.in
+++ b/contrib/libunbound.pc.in
@@ -7,7 +7,7 @@ Name: unbound
Description: Library with validating, recursive, and caching DNS resolver
URL: http://www.unbound.net
Version: @PACKAGE_VERSION@
-Requires:
-Libs: -L${libdir} -lunbound @SSLLIB@ @LIBS@
-Libs.private: @LDFLAGS@
+Requires: libcrypto libssl @PC_LIBEVENT_DEPENDENCY@ @PC_PY_DEPENDENCY@
+Libs: -L${libdir} -lunbound
+Libs.private: @SSLLIB@ @LIBS@
Cflags: -I${includedir}
diff --git a/contrib/unbound_munin_ b/contrib/unbound_munin_
index 69e9f31163ca..5d3dff8e813e 100755
--- a/contrib/unbound_munin_
+++ b/contrib/unbound_munin_
@@ -150,7 +150,7 @@ get_state ( ) {
fi
done
# try to get it
- echo $$ >$lock
+ if echo $$ >$lock ; then : ; else break; fi
done
# do not refetch if the file exists and only LEE seconds old
if test -f $state; then
@@ -266,7 +266,6 @@ if test "$1" = "config" ; then
echo "graph_args --base 1024 -l 0"
echo "graph_vlabel memory used in bytes"
echo "graph_category DNS"
- p_config "mem.total.sbrk" "Total memory" "GAUGE"
p_config "mem.cache.rrset" "RRset cache memory" "GAUGE"
p_config "mem.cache.message" "Message cache memory" "GAUGE"
p_config "mem.mod.iterator" "Iterator module memory" "GAUGE"
@@ -458,20 +457,6 @@ queue)
done
;;
memory)
- mn=`echo mem.total.sbrk | sed $ABBREV | tr . _`
- get_value 'mem.total.sbrk'
- if test $value -eq 0; then
- chk=`echo $ctrl | sed -e 's/-control$/-checkconf/'`
- pidf=`$chk -o pidfile $conf 2>&1`
- pid=`cat $pidf 2>&1`
- value=`ps -p "$pid" -o rss= 2>&1`
- if test "`expr $value + 1 - 1 2>&1`" -eq "$value" 2>&1; then
- value=`expr $value \* 1024`
- else
- value=0
- fi
- fi
- echo "$mn.value" $value
for x in mem.cache.rrset mem.cache.message mem.mod.iterator \
mem.mod.validator msg.cache.count rrset.cache.count \
infra.cache.count key.cache.count; do
diff --git a/daemon/acl_list.c b/daemon/acl_list.c
index d09b46e5e046..f7d71b9fddb9 100644
--- a/daemon/acl_list.c
+++ b/daemon/acl_list.c
@@ -170,6 +170,23 @@ acl_list_tags_cfg(struct acl_list* acl, const char* str, uint8_t* bitmap,
return 1;
}
+/** apply acl_view string */
+static int
+acl_list_view_cfg(struct acl_list* acl, const char* str, const char* str2,
+ struct views* vs)
+{
+ struct acl_addr* node;
+ if(!(node=acl_find_or_create(acl, str)))
+ return 0;
+ node->view = views_find_view(vs, str2, 0 /* get read lock*/);
+ if(!node->view) {
+ log_err("no view with name: %s", str2);
+ return 0;
+ }
+ lock_rw_unlock(&node->view->lock);
+ return 1;
+}
+
/** apply acl_tag_action string */
static int
acl_list_tag_action_cfg(struct acl_list* acl, struct config_file* cfg,
@@ -210,15 +227,47 @@ acl_list_tag_action_cfg(struct acl_list* acl, struct config_file* cfg,
/** check wire data parse */
static int
-check_data(const char* data)
+check_data(const char* data, const struct config_strlist* head)
{
char buf[65536];
uint8_t rr[LDNS_RR_BUF_SIZE];
size_t len = sizeof(rr);
int res;
- snprintf(buf, sizeof(buf), "%s %s", "example.com.", data);
+ /* '.' is sufficient for validation, and it makes the call to
+ * sldns_wirerr_get_type() simpler below. */
+ snprintf(buf, sizeof(buf), "%s %s", ".", data);
res = sldns_str2wire_rr_buf(buf, rr, &len, NULL, 3600, NULL, 0,
NULL, 0);
+
+ /* Reject it if we would end up having CNAME and other data (including
+ * another CNAME) for the same tag. */
+ if(res == 0 && head) {
+ const char* err_data = NULL;
+
+ if(sldns_wirerr_get_type(rr, len, 1) == LDNS_RR_TYPE_CNAME) {
+ /* adding CNAME while other data already exists. */
+ err_data = data;
+ } else {
+ snprintf(buf, sizeof(buf), "%s %s", ".", head->str);
+ len = sizeof(rr);
+ res = sldns_str2wire_rr_buf(buf, rr, &len, NULL, 3600,
+ NULL, 0, NULL, 0);
+ if(res != 0) {
+ /* This should be impossible here as head->str
+ * has been validated, but we check it just in
+ * case. */
+ return 0;
+ }
+ if(sldns_wirerr_get_type(rr, len, 1) ==
+ LDNS_RR_TYPE_CNAME) /* already have CNAME */
+ err_data = head->str;
+ }
+ if(err_data) {
+ log_err("redirect tag data '%s' must not coexist with "
+ "other data.", err_data);
+ return 0;
+ }
+ }
if(res == 0)
return 1;
log_err("rr data [char %d] parse error %s",
@@ -258,7 +307,7 @@ acl_list_tag_data_cfg(struct acl_list* acl, struct config_file* cfg,
}
/* check data? */
- if(!check_data(data)) {
+ if(!check_data(data, node->tag_datas[tagid])) {
log_err("cannot parse access-control-tag data: %s %s '%s'",
str, tag, data);
return 0;
@@ -312,6 +361,27 @@ read_acl_tags(struct acl_list* acl, struct config_file* cfg)
return 1;
}
+/** read acl view config */
+static int
+read_acl_view(struct acl_list* acl, struct config_file* cfg, struct views* v)
+{
+ struct config_str2list* np, *p = cfg->acl_view;
+ cfg->acl_view = NULL;
+ while(p) {
+ log_assert(p->str && p->str2);
+ if(!acl_list_view_cfg(acl, p->str, p->str2, v)) {
+ return 0;
+ }
+ /* free the items as we go to free up memory */
+ np = p->next;
+ free(p->str);
+ free(p->str2);
+ free(p);
+ p = np;
+ }
+ return 1;
+}
+
/** read acl tag actions config */
static int
read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg)
@@ -362,12 +432,15 @@ read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg)
}
int
-acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg)
+acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg,
+ struct views* v)
{
regional_free_all(acl->region);
addr_tree_init(&acl->tree);
if(!read_acl_list(acl, cfg))
return 0;
+ if(!read_acl_view(acl, cfg, v))
+ return 0;
if(!read_acl_tags(acl, cfg))
return 0;
if(!read_acl_tag_actions(acl, cfg))
diff --git a/daemon/acl_list.h b/daemon/acl_list.h
index fc0e9cabf3df..ca9fd2d4b9d0 100644
--- a/daemon/acl_list.h
+++ b/daemon/acl_list.h
@@ -43,6 +43,7 @@
#ifndef DAEMON_ACL_LIST_H
#define DAEMON_ACL_LIST_H
#include "util/storage/dnstree.h"
+#include "services/view.h"
struct config_file;
struct regional;
@@ -100,6 +101,8 @@ struct acl_addr {
struct config_strlist** tag_datas;
/** size of the tag_datas array */
size_t tag_datas_size;
+ /* view element, NULL if none */
+ struct view* view;
};
/**
@@ -118,9 +121,11 @@ void acl_list_delete(struct acl_list* acl);
* Process access control config.
* @param acl: where to store.
* @param cfg: config options.
+ * @param v: views structure
* @return 0 on error.
*/
-int acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg);
+int acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg,
+ struct views* v);
/**
* Lookup access control status for acl structure.
diff --git a/daemon/cachedump.c b/daemon/cachedump.c
index 4b0a583a6547..8992e6cb8f3d 100644
--- a/daemon/cachedump.c
+++ b/daemon/cachedump.c
@@ -563,6 +563,7 @@ load_qinfo(char* str, struct query_info* qinfo, struct regional* region)
qinfo->qclass = sldns_wirerr_get_class(rr, rr_len, dname_len);
qinfo->qname_len = dname_len;
qinfo->qname = (uint8_t*)regional_alloc_init(region, rr, dname_len);
+ qinfo->local_alias = NULL;
if(!qinfo->qname) {
log_warn("error out of memory");
return NULL;
@@ -826,6 +827,7 @@ int print_deleg_lookup(SSL* ssl, struct worker* worker, uint8_t* nm,
qinfo.qname_len = nmlen;
qinfo.qtype = LDNS_RR_TYPE_A;
qinfo.qclass = LDNS_RR_CLASS_IN;
+ qinfo.local_alias = NULL;
dname_str(nm, b);
if(!ssl_printf(ssl, "The following name servers are used for lookup "
diff --git a/daemon/daemon.c b/daemon/daemon.c
index 2ed9af8fe66f..88c695be3163 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -79,6 +79,7 @@
#include "services/cache/rrset.h"
#include "services/cache/infra.h"
#include "services/localzone.h"
+#include "services/view.h"
#include "services/modstack.h"
#include "util/module.h"
#include "util/random.h"
@@ -248,9 +249,16 @@ daemon_init(void)
free(daemon);
return NULL;
}
+ /* init edns_known_options */
+ if(!edns_known_options_init(daemon->env)) {
+ free(daemon->env);
+ free(daemon);
+ return NULL;
+ }
alloc_init(&daemon->superalloc, NULL, 0);
daemon->acl = acl_list_create();
if(!daemon->acl) {
+ edns_known_options_delete(daemon->env);
free(daemon->env);
free(daemon);
return NULL;
@@ -347,6 +355,7 @@ static void daemon_setup_modules(struct daemon* daemon)
daemon->env)) {
fatal_exit("failed to setup modules");
}
+ log_edns_known_options(VERB_ALGO, daemon->env);
}
/**
@@ -542,8 +551,15 @@ void
daemon_fork(struct daemon* daemon)
{
log_assert(daemon);
- if(!acl_list_apply_cfg(daemon->acl, daemon->cfg))
+ if(!(daemon->views = views_create()))
+ fatal_exit("Could not create views: out of memory");
+ /* create individual views and their localzone/data trees */
+ if(!views_apply_cfg(daemon->views, daemon->cfg))
+ fatal_exit("Could not set up views");
+
+ if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->views))
fatal_exit("Could not setup access control list");
+ /* create global local_zones */
if(!(daemon->local_zones = local_zones_create()))
fatal_exit("Could not create local zones: out of memory");
if(!local_zones_apply_cfg(daemon->local_zones, daemon->cfg))
@@ -605,6 +621,8 @@ daemon_cleanup(struct daemon* daemon)
slabhash_clear(daemon->env->msg_cache);
local_zones_delete(daemon->local_zones);
daemon->local_zones = NULL;
+ views_delete(daemon->views);
+ daemon->views = NULL;
/* key cache is cleared by module desetup during next daemon_fork() */
daemon_remote_clear(daemon->rc);
for(i=0; i<daemon->num; i++)
@@ -634,6 +652,8 @@ daemon_delete(struct daemon* daemon)
slabhash_delete(daemon->env->msg_cache);
rrset_cache_delete(daemon->env->rrset_cache);
infra_delete(daemon->env->infra_cache);
+ edns_known_options_delete(daemon->env);
+ inplace_cb_lists_delete(daemon->env);
}
ub_randfree(daemon->rand);
alloc_clear(&daemon->superalloc);
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 48c0b4f78a00..9177c0fd6bce 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -53,6 +53,7 @@ struct module_env;
struct rrset_cache;
struct acl_list;
struct local_zones;
+struct views;
struct ub_randstate;
struct daemon_remote;
@@ -111,6 +112,8 @@ struct daemon {
struct timeval time_last_stat;
/** time when daemon started */
struct timeval time_boot;
+ /** views structure containing view tree */
+ struct views* views;
#ifdef USE_DNSTAP
/** the dnstap environment master value, copied and changed by threads*/
struct dt_env* dtenv;
diff --git a/daemon/remote.c b/daemon/remote.c
index 3fe6650b4ba6..d4ac833e33d0 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -146,6 +146,7 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d)
* the command : "openssl dhparam -C 2048"
* (some openssl versions reject DH that is 'too small', eg. 512).
*/
+#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL)
#ifndef S_SPLINT_S
static DH *get_dh2048(void)
{
@@ -203,6 +204,7 @@ err:
return NULL;
}
#endif /* SPLINT */
+#endif /* OPENSSL_VERSION_NUMBER < 0x10100000 */
struct daemon_remote*
daemon_remote_create(struct config_file* cfg)
@@ -243,12 +245,18 @@ daemon_remote_create(struct config_file* cfg)
if (cfg->remote_control_use_cert == 0) {
/* No certificates are requested */
- if(!SSL_CTX_set_cipher_list(rc->ctx, "aNULL")) {
+#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")) {
log_crypto_err("Failed to set aNULL cipher list");
daemon_remote_delete(rc);
return NULL;
}
+ /* in openssl 1.1, the securitylevel 0 allows eNULL, that
+ * does not need the DH */
+#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL)
/* Since we have no certificates and hence no source of
* DH params, let's generate and set them
*/
@@ -257,6 +265,7 @@ daemon_remote_create(struct config_file* cfg)
daemon_remote_delete(rc);
return NULL;
}
+#endif
return rc;
}
rc->use_cert = 1;
@@ -760,6 +769,8 @@ print_stats(SSL* ssl, const char* nm, struct stats_info* s)
(unsigned long)s->svr.num_queries_missed_cache)) return 0;
if(!ssl_printf(ssl, "%s.num.prefetch"SQ"%lu\n", nm,
(unsigned long)s->svr.num_queries_prefetch)) return 0;
+ if(!ssl_printf(ssl, "%s.num.zero_ttl"SQ"%lu\n", nm,
+ (unsigned long)s->svr.zero_ttl_responses)) return 0;
if(!ssl_printf(ssl, "%s.num.recursivereplies"SQ"%lu\n", nm,
(unsigned long)s->mesh_replies_sent)) return 0;
if(!ssl_printf(ssl, "%s.requestlist.avg"SQ"%g\n", nm,
@@ -818,12 +829,6 @@ print_mem(SSL* ssl, struct worker* worker, struct daemon* daemon)
{
int m;
size_t msg, rrset, val, iter;
-#ifdef HAVE_SBRK
- extern void* unbound_start_brk;
- void* cur = sbrk(0);
- if(!print_longnum(ssl, "mem.total.sbrk"SQ,
- (size_t)((char*)cur - (char*)unbound_start_brk))) return 0;
-#endif /* HAVE_SBRK */
msg = slabhash_get_mem(daemon->env->msg_cache);
rrset = slabhash_get_mem(&daemon->env->rrset_cache->table);
val=0;
@@ -1123,8 +1128,8 @@ find_arg2(SSL* ssl, char* arg, char** arg2)
}
/** Add a new zone */
-static void
-do_zone_add(SSL* ssl, struct worker* worker, char* arg)
+static int
+perform_zone_add(SSL* ssl, struct local_zones* zones, char* arg)
{
uint8_t* nm;
int nmlabs;
@@ -1133,83 +1138,266 @@ do_zone_add(SSL* ssl, struct worker* worker, char* arg)
enum localzone_type t;
struct local_zone* z;
if(!find_arg2(ssl, arg, &arg2))
- return;
+ return 0;
if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
- return;
+ return 0;
if(!local_zone_str2type(arg2, &t)) {
ssl_printf(ssl, "error not a zone type. %s\n", arg2);
free(nm);
- return;
+ return 0;
}
- lock_rw_wrlock(&worker->daemon->local_zones->lock);
- if((z=local_zones_find(worker->daemon->local_zones, nm, nmlen,
+ lock_rw_wrlock(&zones->lock);
+ if((z=local_zones_find(zones, nm, nmlen,
nmlabs, LDNS_RR_CLASS_IN))) {
/* already present in tree */
lock_rw_wrlock(&z->lock);
z->type = t; /* update type anyway */
lock_rw_unlock(&z->lock);
free(nm);
- lock_rw_unlock(&worker->daemon->local_zones->lock);
- send_ok(ssl);
- return;
+ lock_rw_unlock(&zones->lock);
+ return 1;
}
- if(!local_zones_add_zone(worker->daemon->local_zones, nm, nmlen,
+ if(!local_zones_add_zone(zones, nm, nmlen,
nmlabs, LDNS_RR_CLASS_IN, t)) {
- lock_rw_unlock(&worker->daemon->local_zones->lock);
+ lock_rw_unlock(&zones->lock);
ssl_printf(ssl, "error out of memory\n");
- return;
+ return 0;
}
- lock_rw_unlock(&worker->daemon->local_zones->lock);
+ lock_rw_unlock(&zones->lock);
+ return 1;
+}
+
+/** Do the local_zone command */
+static void
+do_zone_add(SSL* ssl, struct local_zones* zones, char* arg)
+{
+ if(!perform_zone_add(ssl, zones, arg))
+ return;
send_ok(ssl);
}
-/** Remove a zone */
+/** Do the local_zones command */
static void
-do_zone_remove(SSL* ssl, struct worker* worker, char* arg)
+do_zones_add(SSL* ssl, struct local_zones* zones)
+{
+ char buf[2048];
+ int num = 0;
+ while(ssl_read_line(ssl, buf, sizeof(buf))) {
+ if(buf[0] == 0x04 && buf[1] == 0)
+ break; /* end of transmission */
+ if(!perform_zone_add(ssl, zones, buf)) {
+ if(!ssl_printf(ssl, "error for input line: %s\n", buf))
+ return;
+ }
+ else
+ num++;
+ }
+ (void)ssl_printf(ssl, "added %d zones\n", num);
+}
+
+/** Remove a zone */
+static int
+perform_zone_remove(SSL* ssl, struct local_zones* zones, char* arg)
{
uint8_t* nm;
int nmlabs;
size_t nmlen;
struct local_zone* z;
if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
- return;
- lock_rw_wrlock(&worker->daemon->local_zones->lock);
- if((z=local_zones_find(worker->daemon->local_zones, nm, nmlen,
+ return 0;
+ lock_rw_wrlock(&zones->lock);
+ if((z=local_zones_find(zones, nm, nmlen,
nmlabs, LDNS_RR_CLASS_IN))) {
/* present in tree */
- local_zones_del_zone(worker->daemon->local_zones, z);
+ local_zones_del_zone(zones, z);
}
- lock_rw_unlock(&worker->daemon->local_zones->lock);
+ lock_rw_unlock(&zones->lock);
free(nm);
+ return 1;
+}
+
+/** Do the local_zone_remove command */
+static void
+do_zone_remove(SSL* ssl, struct local_zones* zones, char* arg)
+{
+ if(!perform_zone_remove(ssl, zones, arg))
+ return;
send_ok(ssl);
}
-/** Add new RR data */
+/** Do the local_zones_remove command */
static void
-do_data_add(SSL* ssl, struct worker* worker, char* arg)
+do_zones_remove(SSL* ssl, struct local_zones* zones)
+{
+ char buf[2048];
+ int num = 0;
+ while(ssl_read_line(ssl, buf, sizeof(buf))) {
+ if(buf[0] == 0x04 && buf[1] == 0)
+ break; /* end of transmission */
+ if(!perform_zone_remove(ssl, zones, buf)) {
+ if(!ssl_printf(ssl, "error for input line: %s\n", buf))
+ return;
+ }
+ else
+ num++;
+ }
+ (void)ssl_printf(ssl, "removed %d zones\n", num);
+}
+
+/** Add new RR data */
+static int
+perform_data_add(SSL* ssl, struct local_zones* zones, char* arg)
{
- if(!local_zones_add_RR(worker->daemon->local_zones, arg)) {
+ if(!local_zones_add_RR(zones, arg)) {
ssl_printf(ssl,"error in syntax or out of memory, %s\n", arg);
- return;
+ return 0;
}
+ return 1;
+}
+
+/** Do the local_data command */
+static void
+do_data_add(SSL* ssl, struct local_zones* zones, char* arg)
+{
+ if(!perform_data_add(ssl, zones, arg))
+ return;
send_ok(ssl);
}
-/** Remove RR data */
+/** Do the local_datas command */
static void
-do_data_remove(SSL* ssl, struct worker* worker, char* arg)
+do_datas_add(SSL* ssl, struct local_zones* zones)
+{
+ char buf[2048];
+ int num = 0;
+ while(ssl_read_line(ssl, buf, sizeof(buf))) {
+ if(buf[0] == 0x04 && buf[1] == 0)
+ break; /* end of transmission */
+ if(!perform_data_add(ssl, zones, buf)) {
+ if(!ssl_printf(ssl, "error for input line: %s\n", buf))
+ return;
+ }
+ else
+ num++;
+ }
+ (void)ssl_printf(ssl, "added %d datas\n", num);
+}
+
+/** Remove RR data */
+static int
+perform_data_remove(SSL* ssl, struct local_zones* zones, char* arg)
{
uint8_t* nm;
int nmlabs;
size_t nmlen;
if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
- return;
- local_zones_del_data(worker->daemon->local_zones, nm,
+ return 0;
+ local_zones_del_data(zones, nm,
nmlen, nmlabs, LDNS_RR_CLASS_IN);
free(nm);
+ return 1;
+}
+
+/** Do the local_data_remove command */
+static void
+do_data_remove(SSL* ssl, struct local_zones* zones, char* arg)
+{
+ if(!perform_data_remove(ssl, zones, arg))
+ return;
send_ok(ssl);
}
+/** Do the local_datas_remove command */
+static void
+do_datas_remove(SSL* ssl, struct local_zones* zones)
+{
+ char buf[2048];
+ int num = 0;
+ while(ssl_read_line(ssl, buf, sizeof(buf))) {
+ if(buf[0] == 0x04 && buf[1] == 0)
+ break; /* end of transmission */
+ if(!perform_data_remove(ssl, zones, buf)) {
+ if(!ssl_printf(ssl, "error for input line: %s\n", buf))
+ return;
+ }
+ else
+ num++;
+ }
+ (void)ssl_printf(ssl, "removed %d datas\n", num);
+}
+
+/** Add a new zone to view */
+static void
+do_view_zone_add(SSL* ssl, struct worker* worker, char* arg)
+{
+ char* arg2;
+ struct view* v;
+ if(!find_arg2(ssl, arg, &arg2))
+ return;
+ v = views_find_view(worker->daemon->views,
+ arg, 1 /* get write lock*/);
+ if(!v) {
+ ssl_printf(ssl,"no view with name: %s\n", arg);
+ return;
+ }
+ do_zone_add(ssl, v->local_zones, arg2);
+ lock_rw_unlock(&v->lock);
+}
+
+/** Remove a zone from view */
+static void
+do_view_zone_remove(SSL* ssl, struct worker* worker, char* arg)
+{
+ char* arg2;
+ struct view* v;
+ if(!find_arg2(ssl, arg, &arg2))
+ return;
+ v = views_find_view(worker->daemon->views,
+ arg, 1 /* get write lock*/);
+ if(!v) {
+ ssl_printf(ssl,"no view with name: %s\n", arg);
+ return;
+ }
+ do_zone_remove(ssl, v->local_zones, arg2);
+ lock_rw_unlock(&v->lock);
+}
+
+/** Add new RR data to view */
+static void
+do_view_data_add(SSL* ssl, struct worker* worker, char* arg)
+{
+ char* arg2;
+ struct view* v;
+ if(!find_arg2(ssl, arg, &arg2))
+ return;
+ v = views_find_view(worker->daemon->views,
+ arg, 1 /* get write lock*/);
+ if(!v) {
+ ssl_printf(ssl,"no view with name: %s\n", arg);
+ return;
+ }
+ do_data_add(ssl, v->local_zones, arg2);
+ lock_rw_unlock(&v->lock);
+}
+
+/** Remove RR data from view */
+static void
+do_view_data_remove(SSL* ssl, struct worker* worker, char* arg)
+{
+ char* arg2;
+ struct view* v;
+ if(!find_arg2(ssl, arg, &arg2))
+ return;
+ v = views_find_view(worker->daemon->views,
+ arg, 1 /* get write lock*/);
+ if(!v) {
+ ssl_printf(ssl,"no view with name: %s\n", arg);
+ return;
+ }
+ do_data_remove(ssl, v->local_zones, arg2);
+ lock_rw_unlock(&v->lock);
+}
+
/** cache lookup of nameservers */
static void
do_lookup(SSL* ssl, struct worker* worker, char* arg)
@@ -1238,6 +1426,7 @@ do_cache_remove(struct worker* worker, uint8_t* nm, size_t nmlen,
k.qname_len = nmlen;
k.qtype = t;
k.qclass = c;
+ k.local_alias = NULL;
h = query_info_hash(&k, 0);
slabhash_remove(worker->env.msg_cache, h, &k);
if(t == LDNS_RR_TYPE_AAAA) {
@@ -2183,6 +2372,14 @@ do_set_option(SSL* ssl, struct worker* worker, char* arg)
(void)ssl_printf(ssl, "error setting option\n");
return;
}
+ /* effectuate some arguments */
+ if(strcmp(arg, "val-override-date:") == 0) {
+ int m = modstack_find(&worker->env.mesh->mods, "validator");
+ struct val_env* val_env = NULL;
+ if(m != -1) val_env = (struct val_env*)worker->env.modinfo[m];
+ if(val_env)
+ val_env->date_override = worker->env.cfg->val_date_override;
+ }
send_ok(ssl);
}
@@ -2263,9 +2460,8 @@ do_list_stubs(SSL* ssl, struct worker* worker)
/** do the list_local_zones command */
static void
-do_list_local_zones(SSL* ssl, struct worker* worker)
+do_list_local_zones(SSL* ssl, struct local_zones* zones)
{
- struct local_zones* zones = worker->daemon->local_zones;
struct local_zone* z;
char buf[257];
lock_rw_rdlock(&zones->lock);
@@ -2286,9 +2482,8 @@ do_list_local_zones(SSL* ssl, struct worker* worker)
/** do the list_local_data command */
static void
-do_list_local_data(SSL* ssl, struct worker* worker)
+do_list_local_data(SSL* ssl, struct worker* worker, struct local_zones* zones)
{
- struct local_zones* zones = worker->daemon->local_zones;
struct local_zone* z;
struct local_data* d;
struct local_rrset* p;
@@ -2324,6 +2519,34 @@ do_list_local_data(SSL* ssl, struct worker* worker)
lock_rw_unlock(&zones->lock);
}
+/** do the view_list_local_zones command */
+static void
+do_view_list_local_zones(SSL* ssl, struct worker* worker, char* arg)
+{
+ struct view* v = views_find_view(worker->daemon->views,
+ arg, 0 /* get read lock*/);
+ if(!v) {
+ ssl_printf(ssl,"no view with name: %s\n", arg);
+ return;
+ }
+ do_list_local_zones(ssl, v->local_zones);
+ lock_rw_unlock(&v->lock);
+}
+
+/** do the view_list_local_data command */
+static void
+do_view_list_local_data(SSL* ssl, struct worker* worker, char* arg)
+{
+ struct view* v = views_find_view(worker->daemon->views,
+ arg, 0 /* get read lock*/);
+ if(!v) {
+ ssl_printf(ssl,"no view with name: %s\n", arg);
+ return;
+ }
+ do_list_local_data(ssl, worker, v->local_zones);
+ lock_rw_unlock(&v->lock);
+}
+
/** struct for user arg ratelimit list */
struct ratelimit_list_arg {
/** the infra cache */
@@ -2436,10 +2659,16 @@ execute_cmd(struct daemon_remote* rc, SSL* ssl, char* cmd,
do_insecure_list(ssl, worker);
return;
} else if(cmdcmp(p, "list_local_zones", 16)) {
- do_list_local_zones(ssl, worker);
+ do_list_local_zones(ssl, worker->daemon->local_zones);
return;
} else if(cmdcmp(p, "list_local_data", 15)) {
- do_list_local_data(ssl, worker);
+ do_list_local_data(ssl, worker, worker->daemon->local_zones);
+ return;
+ } else if(cmdcmp(p, "view_list_local_zones", 21)) {
+ do_view_list_local_zones(ssl, worker, skipwhite(p+21));
+ return;
+ } else if(cmdcmp(p, "view_list_local_data", 20)) {
+ do_view_list_local_data(ssl, worker, skipwhite(p+20));
return;
} else if(cmdcmp(p, "ratelimit_list", 14)) {
do_ratelimit_list(ssl, worker, p+14);
@@ -2505,13 +2734,29 @@ execute_cmd(struct daemon_remote* rc, SSL* ssl, char* cmd,
if(cmdcmp(p, "verbosity", 9)) {
do_verbosity(ssl, skipwhite(p+9));
} else if(cmdcmp(p, "local_zone_remove", 17)) {
- do_zone_remove(ssl, worker, skipwhite(p+17));
+ do_zone_remove(ssl, worker->daemon->local_zones, skipwhite(p+17));
+ } else if(cmdcmp(p, "local_zones_remove", 18)) {
+ do_zones_remove(ssl, worker->daemon->local_zones);
} else if(cmdcmp(p, "local_zone", 10)) {
- do_zone_add(ssl, worker, skipwhite(p+10));
+ do_zone_add(ssl, worker->daemon->local_zones, skipwhite(p+10));
+ } else if(cmdcmp(p, "local_zones", 11)) {
+ do_zones_add(ssl, worker->daemon->local_zones);
} else if(cmdcmp(p, "local_data_remove", 17)) {
- do_data_remove(ssl, worker, skipwhite(p+17));
+ do_data_remove(ssl, worker->daemon->local_zones, skipwhite(p+17));
+ } else if(cmdcmp(p, "local_datas_remove", 18)) {
+ do_datas_remove(ssl, worker->daemon->local_zones);
} else if(cmdcmp(p, "local_data", 10)) {
- do_data_add(ssl, worker, skipwhite(p+10));
+ do_data_add(ssl, worker->daemon->local_zones, skipwhite(p+10));
+ } else if(cmdcmp(p, "local_datas", 11)) {
+ do_datas_add(ssl, worker->daemon->local_zones);
+ } else if(cmdcmp(p, "view_local_zone_remove", 22)) {
+ do_view_zone_remove(ssl, worker, skipwhite(p+22));
+ } else if(cmdcmp(p, "view_local_zone", 15)) {
+ do_view_zone_add(ssl, worker, skipwhite(p+15));
+ } else if(cmdcmp(p, "view_local_data_remove", 22)) {
+ do_view_data_remove(ssl, worker, skipwhite(p+22));
+ } else if(cmdcmp(p, "view_local_data", 15)) {
+ do_view_data_add(ssl, worker, skipwhite(p+15));
} else if(cmdcmp(p, "flush_zone", 10)) {
do_flush_zone(ssl, worker, skipwhite(p+10));
} else if(cmdcmp(p, "flush_type", 10)) {
diff --git a/daemon/stats.c b/daemon/stats.c
index 838cf05ae52c..0687c0d24b43 100644
--- a/daemon/stats.c
+++ b/daemon/stats.c
@@ -251,6 +251,7 @@ void server_stats_add(struct stats_info* total, struct stats_info* a)
total->svr.qEDNS += a->svr.qEDNS;
total->svr.qEDNS_DO += a->svr.qEDNS_DO;
total->svr.ans_rcode_nodata += a->svr.ans_rcode_nodata;
+ total->svr.zero_ttl_responses += a->svr.zero_ttl_responses;
total->svr.ans_secure += a->svr.ans_secure;
total->svr.ans_bogus += a->svr.ans_bogus;
total->svr.rrset_bogus += a->svr.rrset_bogus;
diff --git a/daemon/stats.h b/daemon/stats.h
index 6985446ce299..6c4178fc5317 100644
--- a/daemon/stats.h
+++ b/daemon/stats.h
@@ -131,7 +131,8 @@ struct server_stats {
size_t unwanted_queries;
/** usage of tcp accept list */
size_t tcp_accept_usage;
-
+ /** answers served from expired cache */
+ size_t zero_ttl_responses;
/** histogram data exported to array
* if the array is the same size, no data is lost, and
* if all histograms are same size (is so by default) then
diff --git a/daemon/unbound.c b/daemon/unbound.c
index 73e9fcbb6234..df9504254922 100644
--- a/daemon/unbound.c
+++ b/daemon/unbound.c
@@ -87,11 +87,6 @@
# include "nss.h"
#endif
-#ifdef HAVE_SBRK
-/** global debug value to keep track of heap memory allocation */
-void* unbound_start_brk = 0;
-#endif
-
/** print usage. */
static void usage(void)
{
@@ -244,19 +239,32 @@ checkrlimits(struct config_file* cfg)
#endif /* S_SPLINT_S */
}
+/** set default logfile identity based on value from argv[0] at startup **/
+static void
+log_ident_set_fromdefault(struct config_file* cfg,
+ const char *log_default_identity)
+{
+ if(cfg->log_identity == NULL || cfg->log_identity[0] == 0)
+ log_ident_set(log_default_identity);
+ else
+ log_ident_set(cfg->log_identity);
+}
+
/** set verbosity, check rlimits, cache settings */
static void
apply_settings(struct daemon* daemon, struct config_file* cfg,
- int cmdline_verbose, int debug_mode)
+ int cmdline_verbose, int debug_mode, const char* log_default_identity)
{
/* apply if they have changed */
verbosity = cmdline_verbose + cfg->verbosity;
if (debug_mode > 1) {
cfg->use_syslog = 0;
+ free(cfg->logfile);
cfg->logfile = NULL;
}
daemon_apply_cfg(daemon, cfg);
checkrlimits(cfg);
+ log_ident_set_fromdefault(cfg, log_default_identity);
}
#ifdef HAVE_KILL
@@ -586,9 +594,10 @@ perform_setup(struct daemon* daemon, struct config_file* cfg, int debug_mode,
* @param cmdline_verbose: verbosity resulting from commandline -v.
* These increase verbosity as specified in the config file.
* @param debug_mode: if set, do not daemonize.
+ * @param log_default_identity: Default identity to report in logs
*/
static void
-run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode)
+run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode, const char* log_default_identity)
{
struct config_file* cfg = NULL;
struct daemon* daemon = NULL;
@@ -610,7 +619,7 @@ run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode)
cfgfile);
log_warn("Continuing with default config settings");
}
- apply_settings(daemon, cfg, cmdline_verbose, debug_mode);
+ apply_settings(daemon, cfg, cmdline_verbose, debug_mode, log_default_identity);
if(!done_setup)
config_lookup_uid(cfg);
@@ -618,7 +627,7 @@ run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode)
if(!daemon_open_shared_ports(daemon))
fatal_exit("could not open ports");
if(!done_setup) {
- perform_setup(daemon, cfg, debug_mode, &cfgfile);
+ perform_setup(daemon, cfg, debug_mode, &cfgfile);
done_setup = 1;
} else {
/* reopen log after HUP to facilitate log rotation */
@@ -665,19 +674,16 @@ main(int argc, char* argv[])
int c;
const char* cfgfile = CONFIGFILE;
const char* winopt = NULL;
+ const char* log_ident_default;
int cmdline_verbose = 0;
int debug_mode = 0;
#ifdef UB_ON_WINDOWS
int cmdline_cfg = 0;
#endif
-#ifdef HAVE_SBRK
- /* take debug snapshot of heap */
- unbound_start_brk = sbrk(0);
-#endif
-
log_init(NULL, 0, NULL);
- log_ident_set(strrchr(argv[0],'/')?strrchr(argv[0],'/')+1:argv[0]);
+ log_ident_default = strrchr(argv[0],'/')?strrchr(argv[0],'/')+1:argv[0];
+ log_ident_set(log_ident_default);
/* parse the options */
while( (c=getopt(argc, argv, "c:dhvw:")) != -1) {
switch(c) {
@@ -721,7 +727,7 @@ main(int argc, char* argv[])
return 1;
}
- run_daemon(cfgfile, cmdline_verbose, debug_mode);
+ run_daemon(cfgfile, cmdline_verbose, debug_mode, log_ident_default);
log_init(NULL, 0, NULL); /* close logfile */
return 0;
}
diff --git a/daemon/worker.c b/daemon/worker.c
index 70d07ba8e8f7..09a1465423f3 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -101,57 +101,14 @@
*/
#define PREFETCH_EXPIRY_ADD 60
-#ifdef UNBOUND_ALLOC_STATS
-/** measure memory leakage */
-static void
-debug_memleak(size_t accounted, size_t heap,
- size_t total_alloc, size_t total_free)
-{
- static int init = 0;
- static size_t base_heap, base_accounted, base_alloc, base_free;
- size_t base_af, cur_af, grow_af, grow_acc;
- if(!init) {
- init = 1;
- base_heap = heap;
- base_accounted = accounted;
- base_alloc = total_alloc;
- base_free = total_free;
- }
- base_af = base_alloc - base_free;
- cur_af = total_alloc - total_free;
- grow_af = cur_af - base_af;
- grow_acc = accounted - base_accounted;
- log_info("Leakage: %d leaked. growth: %u use, %u acc, %u heap",
- (int)(grow_af - grow_acc), (unsigned)grow_af,
- (unsigned)grow_acc, (unsigned)(heap - base_heap));
-}
-
-/** give debug heap size indication */
-static void
-debug_total_mem(size_t calctotal)
-{
-#ifdef HAVE_SBRK
- extern void* unbound_start_brk;
- extern size_t unbound_mem_alloc, unbound_mem_freed;
- void* cur = sbrk(0);
- int total = cur-unbound_start_brk;
- log_info("Total heap memory estimate: %u total-alloc: %u "
- "total-free: %u", (unsigned)total,
- (unsigned)unbound_mem_alloc, (unsigned)unbound_mem_freed);
- debug_memleak(calctotal, (size_t)total,
- unbound_mem_alloc, unbound_mem_freed);
-#else
- (void)calctotal;
-#endif /* HAVE_SBRK */
-}
-#endif /* UNBOUND_ALLOC_STATS */
-
/** Report on memory usage by this thread and global */
static void
worker_mem_report(struct worker* ATTR_UNUSED(worker),
struct serviced_query* ATTR_UNUSED(cur_serv))
{
#ifdef UNBOUND_ALLOC_STATS
+ /* measure memory leakage */
+ extern size_t unbound_mem_alloc, unbound_mem_freed;
/* debug func in validator module */
size_t total, front, back, mesh, msg, rrset, infra, ac, superac;
size_t me, iter, val, anch;
@@ -199,7 +156,9 @@ worker_mem_report(struct worker* ATTR_UNUSED(worker),
(unsigned)mesh, (unsigned)msg, (unsigned)rrset,
(unsigned)infra, (unsigned)iter, (unsigned)val, (unsigned)anch,
(unsigned)ac, (unsigned)superac, (unsigned)me);
- debug_total_mem(total);
+ log_info("Total heap memory estimate: %u total-alloc: %u "
+ "total-free: %u", (unsigned)total,
+ (unsigned)unbound_mem_alloc, (unsigned)unbound_mem_freed);
#else /* no UNBOUND_ALLOC_STATS */
size_t val = 0;
int i;
@@ -485,6 +444,10 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
if(!dp) { /* no delegation, need to reprime */
return 0;
}
+ /* In case we have a local alias, copy it into the delegation message.
+ * Shallow copy should be fine, as we'll be done with msg in this
+ * function. */
+ msg->qinfo.local_alias = qinfo->local_alias;
if(must_validate) {
switch(check_delegation_secure(msg->rep)) {
case sec_status_unchecked:
@@ -497,8 +460,9 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!edns_opt_inplace_reply(edns, worker->scratchpad))
- return 0;
+ if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL,
+ msg->rep, LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ return 0;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
if(worker->stats.extended) {
@@ -526,12 +490,16 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!edns_opt_inplace_reply(edns, worker->scratchpad))
- return 0;
+ if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, msg->rep,
+ (int)(flags&LDNS_RCODE_MASK), edns, worker->scratchpad))
+ return 0;
msg->rep->flags |= BIT_QR|BIT_RA;
if(!reply_info_answer_encode(&msg->qinfo, msg->rep, id, flags,
repinfo->c->buffer, 0, 1, worker->scratchpad,
udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
+ if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
+ LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ edns->opt_list = NULL;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
&msg->qinfo, id, flags, edns);
}
@@ -553,17 +521,29 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
int secure;
int must_validate = (!(flags&BIT_CD) || worker->env.cfg->ignore_cd)
&& worker->env.need_to_validate;
- /* see if it is possible */
- if(rep->ttl < timenow) {
- /* the rrsets may have been updated in the meantime.
- * we will refetch the message format from the
- * authoritative server
- */
- return 0;
+ if(worker->env.cfg->serve_expired) {
+ /* always lock rrsets, rep->ttl is ignored */
+ if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
+ return 0;
+ /* below, rrsets with ttl before timenow become TTL 0 in
+ * the response */
+ /* This response was served with zero TTL */
+ if (timenow >= rep->ttl) {
+ worker->stats.zero_ttl_responses++;
+ }
+ } else {
+ /* see if it is possible */
+ if(rep->ttl < timenow) {
+ /* the rrsets may have been updated in the meantime.
+ * we will refetch the message format from the
+ * authoritative server
+ */
+ return 0;
+ }
+ if(!rrset_array_lock(rep->ref, rep->rrset_count, timenow))
+ return 0;
+ /* locked and ids and ttls are OK. */
}
- if(!rrset_array_lock(rep->ref, rep->rrset_count, timenow))
- return 0;
- /* locked and ids and ttls are OK. */
/* check CNAME chain (if any) */
if(rep->an_numrrsets > 0 && (rep->rrsets[0]->rk.type ==
htons(LDNS_RR_TYPE_CNAME) || rep->rrsets[0]->rk.type ==
@@ -584,8 +564,9 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!edns_opt_inplace_reply(edns, worker->scratchpad))
- return 0;
+ if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, rep,
+ LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ return 0;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, id, flags, edns);
rrset_array_unlock_touch(worker->env.rrset_cache,
@@ -616,11 +597,15 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!edns_opt_inplace_reply(edns, worker->scratchpad))
- return 0;
+ if(!inplace_cb_reply_cache_call(&worker->env, qinfo, NULL, rep,
+ (int)(flags&LDNS_RCODE_MASK), edns, worker->scratchpad))
+ return 0;
if(!reply_info_answer_encode(qinfo, rep, id, flags,
repinfo->c->buffer, timenow, 1, worker->scratchpad,
udpsize, edns, (int)(edns->bits & EDNS_DO), secure)) {
+ if(!inplace_cb_reply_servfail_call(&worker->env, qinfo, NULL, NULL,
+ LDNS_RCODE_SERVFAIL, edns, worker->scratchpad))
+ edns->opt_list = NULL;
error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, id, flags, edns);
}
@@ -692,8 +677,9 @@ chaos_replystr(sldns_buffer* pkt, const char* str, struct edns_data* edns,
edns->edns_version = EDNS_ADVERTISED_VERSION;
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->bits &= EDNS_DO;
- if(!edns_opt_inplace_reply(edns, worker->scratchpad))
- edns->opt_list = NULL;
+ if(!inplace_cb_reply_local_call(&worker->env, NULL, NULL, NULL,
+ LDNS_RCODE_NOERROR, edns, worker->scratchpad))
+ edns->opt_list = NULL;
attach_edns_record(pkt, edns);
}
@@ -944,12 +930,12 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
regional_free_all(worker->scratchpad);
goto send_reply;
}
- if(local_zones_answer(worker->daemon->local_zones, &qinfo, &edns,
- c->buffer, worker->scratchpad, repinfo,
- acladdr->taglist, acladdr->taglen, acladdr->tag_actions,
+ if(local_zones_answer(worker->daemon->local_zones, &worker->env, &qinfo,
+ &edns, c->buffer, worker->scratchpad, repinfo, acladdr->taglist,
+ acladdr->taglen, acladdr->tag_actions,
acladdr->tag_actions_size, acladdr->tag_datas,
acladdr->tag_datas_size, worker->daemon->cfg->tagname,
- worker->daemon->cfg->num_tags)) {
+ worker->daemon->cfg->num_tags, acladdr->view)) {
regional_free_all(worker->scratchpad);
if(sldns_buffer_limit(c->buffer) == 0) {
comm_point_drop_reply(repinfo);
@@ -986,44 +972,70 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
&repinfo->addr, repinfo->addrlen);
goto send_reply;
}
- h = query_info_hash(&qinfo, sldns_buffer_read_u16_at(c->buffer, 2));
- if((e=slabhash_lookup(worker->env.msg_cache, h, &qinfo, 0))) {
- /* answer from cache - we have acquired a readlock on it */
- if(answer_from_cache(worker, &qinfo,
- (struct reply_info*)e->data,
- *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
- sldns_buffer_read_u16_at(c->buffer, 2), repinfo,
- &edns)) {
- /* prefetch it if the prefetch TTL expired */
- if(worker->env.cfg->prefetch && *worker->env.now >=
- ((struct reply_info*)e->data)->prefetch_ttl) {
- time_t leeway = ((struct reply_info*)e->
- data)->ttl - *worker->env.now;
+
+ /* If we've found a local alias, replace the qname with the alias
+ * target before resolving it. */
+ if(qinfo.local_alias) {
+ struct ub_packed_rrset_key* rrset = qinfo.local_alias->rrset;
+ struct packed_rrset_data* d = rrset->entry.data;
+
+ /* Sanity check: our current implementation only supports
+ * a single CNAME RRset as a local alias. */
+ if(qinfo.local_alias->next ||
+ rrset->rk.type != htons(LDNS_RR_TYPE_CNAME) ||
+ d->count != 1) {
+ log_err("assumption failure: unexpected local alias");
+ regional_free_all(worker->scratchpad);
+ return 0; /* drop it */
+ }
+ qinfo.qname = d->rr_data[0] + 2;
+ qinfo.qname_len = d->rr_len[0] - 2;
+ }
+
+ if(!edns_bypass_cache_stage(edns.opt_list, &worker->env)) {
+ h = query_info_hash(&qinfo, sldns_buffer_read_u16_at(c->buffer, 2));
+ if((e=slabhash_lookup(worker->env.msg_cache, h, &qinfo, 0))) {
+ /* answer from cache - we have acquired a readlock on it */
+ if(answer_from_cache(worker, &qinfo,
+ (struct reply_info*)e->data,
+ *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
+ sldns_buffer_read_u16_at(c->buffer, 2), repinfo,
+ &edns)) {
+ /* prefetch it if the prefetch TTL expired */
+ if((worker->env.cfg->prefetch || worker->env.cfg->serve_expired)
+ && *worker->env.now >=
+ ((struct reply_info*)e->data)->prefetch_ttl) {
+ time_t leeway = ((struct reply_info*)e->
+ data)->ttl - *worker->env.now;
+ if(((struct reply_info*)e->data)->ttl
+ < *worker->env.now)
+ leeway = 0;
+ lock_rw_unlock(&e->lock);
+ reply_and_prefetch(worker, &qinfo,
+ sldns_buffer_read_u16_at(c->buffer, 2),
+ repinfo, leeway);
+ rc = 0;
+ regional_free_all(worker->scratchpad);
+ goto send_reply_rc;
+ }
lock_rw_unlock(&e->lock);
- reply_and_prefetch(worker, &qinfo,
- sldns_buffer_read_u16_at(c->buffer, 2),
- repinfo, leeway);
- rc = 0;
regional_free_all(worker->scratchpad);
- goto send_reply_rc;
+ goto send_reply;
}
+ verbose(VERB_ALGO, "answer from the cache failed");
lock_rw_unlock(&e->lock);
- regional_free_all(worker->scratchpad);
- goto send_reply;
}
- verbose(VERB_ALGO, "answer from the cache failed");
- lock_rw_unlock(&e->lock);
- }
- if(!LDNS_RD_WIRE(sldns_buffer_begin(c->buffer))) {
- if(answer_norec_from_cache(worker, &qinfo,
- *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
- sldns_buffer_read_u16_at(c->buffer, 2), repinfo,
- &edns)) {
- regional_free_all(worker->scratchpad);
- goto send_reply;
+ if(!LDNS_RD_WIRE(sldns_buffer_begin(c->buffer))) {
+ if(answer_norec_from_cache(worker, &qinfo,
+ *(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
+ sldns_buffer_read_u16_at(c->buffer, 2), repinfo,
+ &edns)) {
+ regional_free_all(worker->scratchpad);
+ goto send_reply;
+ }
+ verbose(VERB_ALGO, "answer norec from cache -- "
+ "need to validate or not primed");
}
- verbose(VERB_ALGO, "answer norec from cache -- "
- "need to validate or not primed");
}
sldns_buffer_rewind(c->buffer);
server_stats_querymiss(&worker->stats, worker);
@@ -1377,11 +1389,10 @@ worker_delete(struct worker* worker)
}
struct outbound_entry*
-worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
- uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec,
- int nocaps, struct edns_option* opt_list,
- struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone,
- size_t zonelen, struct module_qstate* q)
+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)
{
struct worker* worker = q->env->worker;
struct outbound_entry* e = (struct outbound_entry*)regional_alloc(
@@ -1389,11 +1400,10 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
if(!e)
return NULL;
e->qstate = q;
- e->qsent = outnet_serviced_query(worker->back, qname,
- qnamelen, qtype, qclass, flags, dnssec, want_dnssec, nocaps,
- q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, opt_list,
- addr, addrlen, zone, zonelen, worker_handle_service_reply, e,
- worker->back->udp_buff);
+ 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,
+ worker_handle_service_reply, e, worker->back->udp_buff, q->env);
if(!e->qsent) {
return NULL;
}
@@ -1433,14 +1443,13 @@ void worker_stop_accept(void* arg)
}
/* --- fake callbacks for fptr_wlist to work --- */
-struct outbound_entry* libworker_send_query(uint8_t* ATTR_UNUSED(qname),
- size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
- uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
- int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
- struct sockaddr_storage* ATTR_UNUSED(addr),
- socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
- size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q))
+struct outbound_entry* libworker_send_query(
+ struct query_info* ATTR_UNUSED(qinfo),
+ uint16_t ATTR_UNUSED(flags), int ATTR_UNUSED(dnssec),
+ 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))
{
log_assert(0);
return 0;
diff --git a/daemon/worker.h b/daemon/worker.h
index 63613430b054..d6c87c80739c 100644
--- a/daemon/worker.h
+++ b/daemon/worker.h
@@ -61,6 +61,7 @@ struct ub_randstate;
struct regional;
struct tube;
struct daemon_remote;
+struct query_info;
/** worker commands */
enum worker_commands {
diff --git a/dns64/dns64.c b/dns64/dns64.c
index 5fa2096b8c5e..befec864d6ab 100644
--- a/dns64/dns64.c
+++ b/dns64/dns64.c
@@ -825,8 +825,9 @@ dns64_inform_super(struct module_qstate* qstate, int id,
}
/* Store the generated response in cache. */
- if (!dns_cache_store(super->env, &super->qinfo, super->return_msg->rep,
- 0, 0, 0, NULL, super->query_flags))
+ if (!super->no_cache_store &&
+ !dns_cache_store(super->env, &super->qinfo, super->return_msg->rep,
+ 0, 0, 0, NULL, super->query_flags))
log_err("out of memory");
}
diff --git a/doc/CNAME-basedRedirectionDesignNotes.pdf b/doc/CNAME-basedRedirectionDesignNotes.pdf
new file mode 100644
index 000000000000..2be2273edb97
--- /dev/null
+++ b/doc/CNAME-basedRedirectionDesignNotes.pdf
Binary files differ
diff --git a/doc/Changelog b/doc/Changelog
index 039eade55b63..57a13c8c537d 100644
--- a/doc/Changelog
+++ b/doc/Changelog
@@ -1,3 +1,177 @@
+8 December 2016: Wouter
+ - Fix downcast warnings from visual studio in sldns code.
+
+7 December 2016: Ralph
+ - Add DSA support for OpenSSL 1.1.0
+ - Fix remote control without cert for LibreSSL
+
+6 December 2016: George
+ - Added generic EDNS code for registering known EDNS option codes,
+ bypassing the cache response stage and uniquifying mesh states. Four EDNS
+ option lists were added to module_qstate (module_qstate.edns_opts_*) to
+ store EDNS options from/to front/back side.
+ - Added two flags to module_qstate (no_cache_lookup, no_cache_store) that
+ control the modules' cache interactions.
+ - Added code for registering inplace callback functions. The registered
+ functions can be called just before replying with local data or Chaos,
+ replying from cache, replying with SERVFAIL, replying with a resolved
+ query, sending a query to a nameserver. The functions can inspect the
+ available data and maybe change response/query related data (i.e. append
+ EDNS options).
+ - Updated Python module for the above.
+ - Updated Python documentation.
+
+5 December 2016: Ralph
+ - Fix #1173: differ local-zone type deny from unset
+ tag_actions element.
+
+5 December 2016: Wouter
+ - Fix #1170: document that 'inform' local-zone uses local-data.
+
+1 December 2016: Ralph
+ - hyphen as minus fix, by Andreas Schulze
+
+30 November 2016: Ralph
+ - Added local-zones and local-data bulk addition and removal
+ functionality in unbound-control (local_zones, local_zones_remove,
+ local_datas and local_datas_remove).
+ - iana portlist update
+
+29 November 2016: Wouter
+ - version 1.6.0 is in the development branch.
+ - braces in view.c around lock statements.
+
+28 November 2016: Wouter
+ - new install-sh.
+
+25 November 2016: Wouter
+ - Fix that with openssl 1.1 control-use-cert: no uses less cpu, by
+ using no encryption over the unix socket.
+
+22 Novenber 2016: Ralph
+ - Make access-control-tag-data RDATA absolute. This makes the RDATA
+ origin consistent between local-data and access-control-tag-data.
+ - Fix NSEC ENT wildcard check. Matching wildcard does not have to be a
+ subdomain of the NSEC owner.
+ - QNAME minimisation uses QTYPE=A, therefore always check cache for
+ this type in harden-below-nxdomain functionality.
+ - Added unit test for QNAME minimisation + harden below nxdomain
+ synergy.
+
+22 November 2016: Wouter
+ - iana portlist update.
+ - Fix unit tests for DS hash processing for fake-dsa test option.
+ - patch from Dag-Erling Smorgrav that removes code that relies
+ on sbrk().
+
+21 November 2016: Wouter
+ - Fix #1158: reference RFC 8020 "NXDOMAIN: There Really Is Nothing
+ Underneath" for the harden-below-nxdomain option.
+
+10 November 2016: Ralph
+ - Fix #1155: test status code of unbound-control in 04-checkconf,
+ not the status code from the tee command.
+
+4 November 2016: Ralph
+ - Added stub-ssl-upstream and forward-ssl-upstream options.
+
+4 November 2016: Wouter
+ - configure detects ssl security level API function in the autoconf
+ manner. Every function on its own, so that other libraries (eg.
+ LibreSSL) can develop their API without hindrance.
+ - Fix #1154: segfault when reading config with duplicate zones.
+ - Note that for harden-below-nxdomain the nxdomain must be secure,
+ this means nsec3 with optout is insufficient.
+
+3 November 2016: Ralph
+ - Set OpenSSL security level to 0 when using aNULL ciphers.
+
+3 November 2016: Wouter
+ - .gitattributes line for githubs code language display.
+ - log-identity: config option to set sys log identity, patch from
+ "Robin H. Johnson" <robbat2@gentoo.org>
+
+2 November 2016: Wouter
+ - iana portlist update.
+
+31 October 2016: Wouter
+ - Fix failure to build on arm64 with no sbrk.
+ - iana portlist update.
+
+28 October 2016: Wouter
+ - Patch for server.num.zero_ttl stats for count of expired replies,
+ from Pavel Odintsov.
+
+26 October 2016: Wouter
+ - Fix unit tests for openssl 1.1, with no DSA, by faking DSA, enabled
+ with the undocumented switch 'fake-dsa'. It logs a warning.
+
+25 October 2016: Wouter
+ - Fix #1134: unbound-control set_option -- val-override-date: -1 works
+ immediately to ignore datetime, or back to 0 to enable it again.
+ The -- is to ignore the '-1' as an option flag.
+
+24 October 2016: Wouter
+ - serve-expired config option: serve expired responses with TTL 0.
+ - g.root-servers.net has AAAA address.
+
+21 October 2016: Wouter
+ - Ported tests for local_cname unit test to testbound framework.
+
+20 October 2016: Wouter
+ - suppress compile warning in lex files.
+ - init lzt variable, for older gcc compiler warnings.
+ - fix --enable-dsa to work, instead of copying ecdsa enable.
+ - Fix DNSSEC validation of query type ANY with DNAME answers.
+ - Fixup query_info local_alias init.
+
+19 October 2016: Wouter
+ - Fix #1130: whitespace in example.conf.in more consistent.
+
+18 October 2016: Wouter
+ - Patch that resolves CNAMEs entered in local-data conf statements that
+ point to data on the internet, from Jinmei Tatuya (Infoblox).
+ - Removed patch comments from acllist.c and msgencode.c
+ - Added documentation doc/CNAME-basedRedirectionDesignNotes.pdf,
+ from Jinmei Tatuya (Infoblox).
+ - Fix #1125: unbound could reuse an answer packet incorrectly for
+ clients with different EDNS parameters, from Jinmei Tatuya.
+ - Fix #1118: libunbound.pc sets strange Libs, Libs.private values.
+ - Added Requires line to libunbound.pc
+ - Please doxygen by modifying mesh.h
+
+17 October 2016: Wouter
+ - Re-fix #839 from view commit overwrite.
+ - Fixup const void cast warning.
+
+12 October 2016: Ralph
+ - Free view config elements.
+
+11 October 2016: Ralph
+ - Added qname-minimisation-strict config option.
+ - iana portlist update.
+ - fix memoryleak logfile when in debug mode.
+
+5 October 2016: Ralph
+ - Added views functionality.
+ - Fix #1117: spelling errors, from Robert Edmonds.
+
+30 September 2016: Wouter
+ - Fix Nits for 1.5.10 reported by Dag-Erling Smorgrav.
+
+29 September 2016: Wouter
+ - Fix #838: 1.5.10 cannot be built on Solaris, undefined PATH_MAX.
+ - Fix #839: Memory grows unexpectedly with large RPZ files.
+ - Fix #840: infinite loop in unbound_munin_ plugin on unowned lockfile.
+ - Fix #841: big local-zone's make it consume large amounts of memory.
+
+27 September 2016: Wouter
+ - tag for 1.5.10 release
+ - trunk contains 1.5.11 in development.
+ - Fix dnstap relaying "random" messages instead of resolver/forwarder
+ responses, from Nikolay Edigaryev.
+ - Fix #836: unbound could echo back EDNS options in an error response.
+
20 September 2016: Wouter
- iana portlist update.
- Fix #835: fix --disable-dsa with nettle verify.
diff --git a/doc/README b/doc/README
index 66e2f34d2bda..661adcbdf236 100644
--- a/doc/README
+++ b/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.5.10
+README for Unbound 1.6.0
Copyright 2007 NLnet Labs
http://unbound.net
diff --git a/doc/example.conf.in b/doc/example.conf.in
index c520c881f0e9..55bbc32e616f 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.5.10.
+# See unbound.conf(5) man page, version 1.6.0.
#
# this is a comment.
@@ -52,7 +52,7 @@ server:
# outgoing-interface: 192.0.2.153
# outgoing-interface: 2001:DB8::5
# outgoing-interface: 2001:DB8::6
-
+
# Specify a netblock to use remainder 64 bits as random bits for
# upstream queries. Uses freebind option (Linux).
# outgoing-interface: 2001:DB8::/64
@@ -171,7 +171,7 @@ server:
# the maximum number of hosts that are cached (roundtrip, EDNS, lame).
# infra-cache-numhosts: 10000
-
+
# define a number of tags here, use with local-zone, access-control.
# repeat the define-tag statement to add additional tags.
# define-tag: "tag1 tag2 tag3"
@@ -230,6 +230,9 @@ server:
# set redirect data for particular tag for access control element
# access-control-tag-data: 192.0.2.0/24 tag2 "A 127.0.0.1"
+ # Set view for access control element
+ # access-control-view: 192.0.2.0/24 viewname
+
# if given, a chroot(2) is done to the given directory.
# i.e. you can chroot to the working directory, for example,
# for extra security, but make sure all files are in that directory.
@@ -272,9 +275,13 @@ server:
# logfile: ""
# Log to syslog(3) if yes. The log facility LOG_DAEMON is used to
- # log to, with identity "unbound". If yes, it overrides the logfile.
+ # log to. If yes, it overrides the logfile.
# use-syslog: yes
+ # Log identity to report. if empty, defaults to the name of argv[0]
+ # (usually "unbound").
+ # log-identity: ""
+
# print UTC timestamp in ascii to logfile, default is epoch in seconds.
# log-time-ascii: no
@@ -328,7 +335,7 @@ server:
# Harden against queries that fall under dnssec-signed nxdomain names.
# harden-below-nxdomain: no
- # Harden the referral path by performing additional queries for
+ # Harden the referral path by performing additional queries for
# infrastructure data. Validates the replies (if possible).
# Default off, because the lookups burden the server. Experimental
# implementation of draft-wijngaards-dnsext-resolver-side-mitigation.
@@ -344,6 +351,12 @@ server:
# to NS when possible.
# qname-minimisation: no
+ # QNAME minimisation in strict mode. Do not fall-back to sending full
+ # QNAME to potentially broken nameservers. A lot of domains will not be
+ # resolvable when this option in enabled.
+ # This option only has effect when qname-minimisation is enabled.
+ # qname-minimisation-strict: no
+
# Use 0x20-encoded random bits in the query to foil spoof attempts.
# This feature is an experimental implementation of draft dns-0x20.
# use-caps-for-id: no
@@ -477,6 +490,10 @@ server:
# that set CD but cannot validate themselves.
# ignore-cd-flag: no
+ # Serve expired reponses from cache, with TTL 0 in the response,
+ # and then attempt to fetch the data afresh.
+ # serve-expired: no
+
# Have the validator log failed validations for your diagnosis.
# 0: off. 1: A line per failed user query. 2: With reason and bad IP.
# val-log-level: 0
@@ -578,7 +595,7 @@ server:
# o redirect serves the zone data for any subdomain in the zone.
# o nodefault can be used to normally resolve AS112 zones.
# o typetransparent resolves normally for other types and other names
- # o inform resolves normally, but logs client IP address
+ # 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.
@@ -700,6 +717,7 @@ remote-control:
# stub-addr: 192.0.2.68
# stub-prime: no
# stub-first: no
+# stub-ssl-upstream: no
# stub-zone:
# name: "example.org"
# stub-host: ns.example.com.
@@ -715,6 +733,23 @@ remote-control:
# forward-addr: 192.0.2.68
# forward-addr: 192.0.2.73@5355 # forward to port 5355.
# forward-first: no
+# forward-ssl-upstream: no
# forward-zone:
# name: "example.org"
# forward-host: fwd.example.com
+
+# Views
+# Create named views. Name must be unique. Map views to requests using
+# the access-control-view option. Views can contain zero or more local-zone
+# and local-data options. Options from matching views will override global
+# options. Global options will be used if no matching view is found.
+# With view-first yes, it will try to answer using the global local-zone and
+# local-data elements if there is no view specific match.
+# view:
+# name: "viewname"
+# local-zone: "example.com" redirect
+# local-data: "example.com A 192.0.2.3"
+# view-first: no
+# view:
+# name: "anotherview"
+# local-zone: "example.com" refuse
diff --git a/doc/libunbound.3.in b/doc/libunbound.3.in
index 1bf3fc2c880b..37d63a5d2452 100644
--- a/doc/libunbound.3.in
+++ b/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
+.TH "libunbound" "3" "Dec 15, 2016" "NLnet Labs" "unbound 1.6.0"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -43,7 +43,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.5.10 functions.
+\- Unbound DNS validating resolver 1.6.0 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
@@ -180,7 +180,7 @@ and
.B ub_ctx_hosts
to read them.
Before you call this, use the openssl functions CRYPTO_set_id_callback and
-CRYPTO_set_locking_callback to set up asyncronous operation if you use
+CRYPTO_set_locking_callback to set up asynchronous operation if you use
lib openssl (the application calls these functions once for initialisation).
Openssl 1.0.0 or later uses the CRYPTO_THREADID_set_callback function.
.TP
diff --git a/doc/unbound-anchor.8.in b/doc/unbound-anchor.8.in
index 7403caa41455..31a48c26e1e5 100644
--- a/doc/unbound-anchor.8.in
+++ b/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
+.TH "unbound-anchor" "8" "Dec 15, 2016" "NLnet Labs" "unbound 1.6.0"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
@@ -67,7 +67,7 @@ List the builtin root key and builtin root update certificate on stdout.
.B \-u \fIname
The server name, it connects to https://name. Specify without https:// prefix.
The default is "data.iana.org". It connects to the port specified with \-P.
-You can pass an IPv4 addres or IPv6 address (no brackets) if you want.
+You can pass an IPv4 address or IPv6 address (no brackets) if you want.
.TP
.B \-x \fIpath
The pathname to the root\-anchors.xml file on the server. (forms URL with \-u).
diff --git a/doc/unbound-checkconf.8.in b/doc/unbound-checkconf.8.in
index 03f5b3cd36a6..d9a5b03aea1a 100644
--- a/doc/unbound-checkconf.8.in
+++ b/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
+.TH "unbound-checkconf" "8" "Dec 15, 2016" "NLnet Labs" "unbound 1.6.0"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/doc/unbound-control.8.in b/doc/unbound-control.8.in
index 9089db9b55e5..aa801c4bda71 100644
--- a/doc/unbound-control.8.in
+++ b/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
+.TH "unbound-control" "8" "Dec 15, 2016" "NLnet Labs" "unbound 1.6.0"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
@@ -99,6 +99,22 @@ but if the name has become an empty nonterminal (there is still data in
domain names below the removed name), NOERROR nodata answers are the
result for that name.
.TP
+.B local_zones
+Add local zones read from stdin of unbound\-control. Input is read per line,
+with name space type on a line. For bulk additions.
+.TP
+.B local_zones_remove
+Remove local zones read from stdin of unbound\-control. Input is one name per
+line. For bulk removals.
+.TP
+.B local_datas
+Add local data RRs read from stdin of unbound\-control. Input is one RR per
+line. For bulk additions.
+.TP
+.B local_datas_remove
+Remove local data RRs read from stdin of unbound\-control. Input is one name per
+line. For bulk removals.
+.TP
.B dump_cache
The contents of the cache is printed in a text format to stdout. You can
redirect it to a file to store the cache in a file.
@@ -263,6 +279,21 @@ estimated qps and qps limit from config. With +a it prints all domains, not
just the ratelimited domains, with their estimated qps. The ratelimited
domains return an error for uncached (new) queries, but cached queries work
as normal.
+.TP
+.B view_list_local_zones \fIview\fR
+\fIlist_local_zones\fR for given view.
+.TP
+.B view_local_zone \fIview\fR \fIname\fR \fItype
+\fIlocal_zone\fR for given view.
+.TP
+.B view_local_zone_remove \fIview\fR \fIname
+\fIlocal_zone_remove\fR for given view.
+.TP
+.B view_local_data \fIview\fR \fIRR data...
+\fIlocal_data\fR for given view.
+.TP
+.B view_local_data_remove \fIview\fR \fIname
+\fIlocal_data_remove\fR for given view.
.SH "EXIT CODE"
The unbound\-control program exits with status code 1 on error, 0 on success.
.SH "SET UP"
@@ -301,6 +332,9 @@ and resulted in recursive processing, taking a slot in the requestlist.
Not part of the recursivereplies (or the histogram thereof) or cachemiss,
as a cache response was sent.
.TP
+.I threadX.num.zero_ttl
+number of replies with ttl zero, because they served an expired cache entry.
+.TP
.I threadX.num.recursivereplies
The number of replies sent to queries that needed recursive processing. Could be smaller than threadX.num.cachemiss if due to timeouts no replies were sent for some queries.
.TP
@@ -350,6 +384,9 @@ summed over threads.
.I total.num.prefetch
summed over threads.
.TP
+.I total.num.zero_ttl
+summed over threads.
+.TP
.I total.num.recursivereplies
summed over threads.
.TP
@@ -384,9 +421,6 @@ uptime since server boot in seconds.
time since last statistics printout, in seconds.
.SH EXTENDED STATISTICS
.TP
-.I mem.total.sbrk
-If sbrk(2) is available, an estimate of the heap size of the program in number of bytes. Close to the total memory used by the program, as reported by top and ps. Could be wrong if the OS allocates memory non\-contiguously.
-.TP
.I mem.cache.rrset
Memory in bytes in use by the RRset cache.
.TP
diff --git a/doc/unbound-host.1.in b/doc/unbound-host.1.in
index 04d19addb0a2..b7fe345cbe27 100644
--- a/doc/unbound-host.1.in
+++ b/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
+.TH "unbound\-host" "1" "Dec 15, 2016" "NLnet Labs" "unbound 1.6.0"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
diff --git a/doc/unbound.8.in b/doc/unbound.8.in
index 78e497d5d0ef..af2ac111b73e 100644
--- a/doc/unbound.8.in
+++ b/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
+.TH "unbound" "8" "Dec 15, 2016" "NLnet Labs" "unbound 1.6.0"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.5.10.
+\- Unbound DNS validating resolver 1.6.0.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/doc/unbound.conf.5.in b/doc/unbound.conf.5.in
index f813c44edc98..39ce95c57993 100644
--- a/doc/unbound.conf.5.in
+++ b/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
+.TH "unbound.conf" "5" "Dec 15, 2016" "NLnet Labs" "unbound 1.6.0"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -151,8 +151,8 @@ netblock, or the randomisation will be compromised. Consider combining with
to increase the likelihood of IPv6 nameservers being selected for queries.
On Linux you need these two commands to be able to use the freebind socket
option to receive traffic for the ip6 netblock:
-ip -6 addr add mynetblock/64 dev lo &&
-ip -6 route add local mynetblock/64 dev lo
+ip \-6 addr add mynetblock/64 dev lo &&
+ip \-6 route add local mynetblock/64 dev lo
.TP
.B outgoing\-range: \fI<number>
Number of ports to open. This number of file descriptors can be opened per
@@ -474,6 +474,9 @@ order of the define-tag values.
.B access\-control\-tag\-data: \fI<IP netblock> <tag> <"resource record string">
Set redirect data for particular tag for given access control element.
.TP
+.B access\-control\-view: \fI<IP netblock> <view name>
+Set view for given access control element.
+.TP
.B chroot: \fI<directory>
If chroot is enabled, you should pass the configfile (from the
commandline) as a full path from the original root. After the
@@ -531,6 +534,13 @@ The log facility LOG_DAEMON is used, with identity "unbound".
The logfile setting is overridden when use\-syslog is turned on.
The default is to log to syslog.
.TP
+.B log\-identity: \fI<string>
+If "" is given (default), then the name of the executable, usually "unbound"
+is used to report to the log. Enter a string to override it
+with that, which is useful on systems that run more than one instance of
+unbound, with different configurations, so that the logs can be easily
+distinguished against.
+.TP
.B log\-time\-ascii: \fI<yes or no>
Sets logfile lines to use a timestamp in UTC ascii. Default is no, which
prints the seconds since 1970 in brackets. No effect if using syslog, in
@@ -614,14 +624,15 @@ unsigned to badly signed often. If turned off you run the risk of a
downgrade attack that disables security for a zone. Default is on.
.TP
.B harden\-below\-nxdomain: \fI<yes or no>
-From draft\-vixie\-dnsext\-resimprove, returns nxdomain to queries for a name
+From RFC 8020 (with title "NXDOMAIN: There Really Is Nothing Underneath"),
+returns nxdomain to queries for a name
below another name that is already known to be nxdomain. DNSSEC mandates
noerror for empty nonterminals, hence this is possible. Very old software
might return nxdomain for empty nonterminals (that usually happen for reverse
IP address lookups), and thus may be incompatible with this. To try to avoid
this only DNSSEC-secure nxdomains are used, because the old software does not
have DNSSEC. Default is off.
-Currently, draft\-ietf\-dnsop\-nxdomain\-cut promotes this technique.
+The nxdomain must be secure, this means nsec3 with optout is insufficient.
.TP
.B harden\-referral\-path: \fI<yes or no>
Harden the referral path by performing additional queries for
@@ -658,8 +669,15 @@ Can be given multiple times, for different domains.
.B qname\-minimisation: \fI<yes or no>
Send minimum amount of information to upstream servers to enhance privacy.
Only sent minimum required labels of the QNAME and set QTYPE to NS when
-possible. Best effort approach, full QNAME and original QTYPE will be sent when
-upstream replies with a RCODE other than NOERROR. Default is off.
+possible. Best effort approach; full QNAME and original QTYPE will be sent when
+upstream replies with a RCODE other than NOERROR, except when receiving
+NXDOMAIN from a DNSSEC signed zone. Default is off.
+.TP
+.B qname\-minimisation\-strict: \fI<yes or no>
+QNAME minimisation in strict mode. Do not fall-back to sending full QNAME to
+potentially broken nameservers. A lot of domains will not be resolvable when
+this option in enabled. Only use if you know what you are doing.
+This option only has effect when qname-minimisation is enabled. Default is off.
.TP
.B private\-address: \fI<IP address or subnet>
Give IPv4 of IPv6 addresses or classless subnets. These are addresses
@@ -859,6 +877,11 @@ servers that set the CD flag but cannot validate DNSSEC themselves are
the clients, and then unbound provides them with DNSSEC protection.
The default value is "no".
.TP
+.B serve\-expired: \fI<yes or no>
+If enabled, unbound attempts to serve old responses from cache with a
+TTL of 0 in the response without waiting for the actual resolution to finish.
+The actual resolution answer ends up in the cache later on. Default is "no".
+.TP
.B val\-nsec3\-keysize\-iterations: \fI<"list of values">
List of keysize and iteration count values, separated by spaces, surrounded
by quotes. Default is "1024 150 2048 500 4096 2500". This determines the
@@ -978,11 +1001,11 @@ queries for www.example.com and www.foo.example.com are redirected, so
that users with web browsers cannot access sites with suffix example.com.
.TP 10
\h'5'\fIinform\fR
-The query is answered normally. The client IP address (@portnumber)
-is printed to the logfile. The log message is: timestamp, unbound-pid,
-info: zonename inform IP@port queryname type class. This option can be
-used for normal resolution, but machines looking up infected names are
-logged, eg. to run antivirus on them.
+The query is answered normally, same as transparent. The client IP
+address (@portnumber) is printed to the logfile. The log message is:
+timestamp, unbound-pid, info: zonename inform IP@port queryname type
+class. This option can be used for normal resolution, but machines
+looking up infected names are logged, eg. to run antivirus on them.
.TP 10
\h'5'\fIinform_deny\fR
The query is dropped, like 'deny', and logged, like 'inform'. Ie. find
@@ -1280,6 +1303,10 @@ If enabled, a query is attempted without the stub clause if it fails.
The data could not be retrieved and would have caused SERVFAIL because
the servers are unreachable, instead it is tried without this clause.
The default is no.
+.TP
+.B stub\-ssl\-upstream: \fI<yes or no>
+Enabled or disable whether the queries to this stub use SSL for transport.
+Default is no.
.SS "Forward Zone Options"
.LP
There may be multiple
@@ -1310,6 +1337,36 @@ If enabled, a query is attempted without the forward clause if it fails.
The data could not be retrieved and would have caused SERVFAIL because
the servers are unreachable, instead it is tried without this clause.
The default is no.
+.TP
+.B forward\-ssl\-upstream: \fI<yes or no>
+Enabled or disable whether the queries to this forwarder use SSL for transport.
+Default is no.
+.SS "View Options"
+.LP
+There may be multiple
+.B view:
+clauses. Each with a \fBname:\fR and zero or more \fBlocal\-zone\fR and
+\fBlocal\-data\fR elements. View can be mapped to requests by specifying the view
+name in an \fBaccess\-control\-view\fR element. Options from matching views will
+override global options. Global options will be used if no matching view
+is found.
+.TP
+.B name: \fI<view name>
+Name of the view. Must be unique. This name is used in access\-control\-view
+elements.
+.TP
+.B local\-zone: \fI<zone> <type>
+View specific local\-zone elements. Has the same types and behaviour as the
+global local\-zone elements.
+.TP
+.B local\-data: \fI"<resource record string>"
+View specific local\-data elements. Has the same behaviour as the global
+local\-data elements.
+.TP
+.B view\-first: \fI<yes or no>
+If enabled, it attempts to use the global local\-zone and local\-data if there
+is no match in the view specific options.
+The default is no.
.SS "Python Module Options"
.LP
The
diff --git a/iterator/iter_delegpt.c b/iterator/iter_delegpt.c
index 0e251ff583c4..ecf88b293da1 100644
--- a/iterator/iter_delegpt.c
+++ b/iterator/iter_delegpt.c
@@ -72,6 +72,7 @@ struct delegpt* delegpt_copy(struct delegpt* dp, struct regional* region)
return NULL;
copy->bogus = dp->bogus;
copy->has_parent_side_NS = dp->has_parent_side_NS;
+ copy->ssl_upstream = dp->ssl_upstream;
for(ns = dp->nslist; ns; ns = ns->next) {
if(!delegpt_add_ns(copy, region, ns->name, ns->lame))
return NULL;
diff --git a/iterator/iter_delegpt.h b/iterator/iter_delegpt.h
index eb771359c5f9..4bd79c81af09 100644
--- a/iterator/iter_delegpt.h
+++ b/iterator/iter_delegpt.h
@@ -81,6 +81,8 @@ struct delegpt {
uint8_t has_parent_side_NS;
/** for assertions on type of delegpt */
uint8_t dp_type_mlc;
+ /** use SSL for upstream query */
+ uint8_t ssl_upstream;
};
/**
@@ -355,7 +357,7 @@ void delegpt_no_ipv4(struct delegpt* dp);
/**
* create malloced delegation point, with the given name
- * @param name: uncompressed wireformat of degegpt name.
+ * @param name: uncompressed wireformat of delegpt name.
* @return NULL on alloc failure
*/
struct delegpt* delegpt_create_mlc(uint8_t* name);
diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c
index 3e580ca35513..1c40d41641da 100644
--- a/iterator/iter_fwd.c
+++ b/iterator/iter_fwd.c
@@ -265,6 +265,8 @@ read_forwards(struct iter_forwards* fwd, struct config_file* cfg)
* last resort will ask for parent-side NS record and thus
* fallback to the internet name servers on a failure */
dp->has_parent_side_NS = (uint8_t)!s->isfirst;
+ /* use SSL for queries to this forwarder */
+ dp->ssl_upstream = (uint8_t)s->ssl_upstream;
verbose(VERB_QUERY, "Forward zone server list:");
delegpt_log(VERB_QUERY, dp);
if(!forwards_insert(fwd, LDNS_RR_CLASS_IN, dp))
diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c
index 5fd90177aff0..7fb665200c63 100644
--- a/iterator/iter_hints.c
+++ b/iterator/iter_hints.c
@@ -149,6 +149,7 @@ compile_time_root_prime(int do_ip4, int do_ip6)
if(!ah(dp, "D.ROOT-SERVERS.NET.", "2001:500:2d::d")) goto failed;
if(!ah(dp, "E.ROOT-SERVERS.NET.", "2001:500:a8::e")) goto failed;
if(!ah(dp, "F.ROOT-SERVERS.NET.", "2001:500:2f::f")) goto failed;
+ if(!ah(dp, "G.ROOT-SERVERS.NET.", "2001:500:12::d0d")) goto failed;
if(!ah(dp, "H.ROOT-SERVERS.NET.", "2001:500:1::53")) goto failed;
if(!ah(dp, "I.ROOT-SERVERS.NET.", "2001:7fe::53")) goto failed;
if(!ah(dp, "J.ROOT-SERVERS.NET.", "2001:503:c27::2:30")) goto failed;
@@ -275,6 +276,8 @@ read_stubs(struct iter_hints* hints, struct config_file* cfg)
* last resort will ask for parent-side NS record and thus
* fallback to the internet name servers on a failure */
dp->has_parent_side_NS = (uint8_t)!s->isfirst;
+ /* ssl_upstream */
+ dp->ssl_upstream = (uint8_t)s->ssl_upstream;
delegpt_log(VERB_QUERY, dp);
if(!hints_insert(hints, LDNS_RR_CLASS_IN, dp, !s->isprime))
return 0;
diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c
index 874dd6850e4e..344b6aafd7fb 100644
--- a/iterator/iter_utils.c
+++ b/iterator/iter_utils.c
@@ -532,6 +532,7 @@ causes_cycle(struct module_qstate* qstate, uint8_t* name, size_t namelen,
qinf.qname_len = namelen;
qinf.qtype = t;
qinf.qclass = c;
+ qinf.local_alias = NULL;
fptr_ok(fptr_whitelist_modenv_detect_cycle(
qstate->env->detect_cycle));
return (*qstate->env->detect_cycle)(qstate, &qinf,
diff --git a/iterator/iterator.c b/iterator/iterator.c
index cc7e9378c9e7..f60893323a10 100644
--- a/iterator/iterator.c
+++ b/iterator/iterator.c
@@ -230,9 +230,8 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super)
return;
} else {
/* see if the failure did get (parent-lame) info */
- if(!cache_fill_missing(super->env,
- super_iq->qchase.qclass, super->region,
- super_iq->dp))
+ if(!cache_fill_missing(super->env, super_iq->qchase.qclass,
+ super->region, super_iq->dp))
log_err("out of memory adding missing");
}
dpns->resolved = 1; /* mark as failed */
@@ -278,27 +277,29 @@ error_response(struct module_qstate* qstate, int id, int rcode)
static int
error_response_cache(struct module_qstate* qstate, int id, int rcode)
{
- /* store in cache */
- struct reply_info err;
- if(qstate->prefetch_leeway > NORR_TTL) {
- verbose(VERB_ALGO, "error response for prefetch in cache");
- /* attempt to adjust the cache entry prefetch */
- if(dns_cache_prefetch_adjust(qstate->env, &qstate->qinfo,
- NORR_TTL, qstate->query_flags))
- return error_response(qstate, id, rcode);
- /* if that fails (not in cache), fall through to store err */
- }
- memset(&err, 0, sizeof(err));
- err.flags = (uint16_t)(BIT_QR | BIT_RA);
- FLAGS_SET_RCODE(err.flags, rcode);
- err.qdcount = 1;
- err.ttl = NORR_TTL;
- err.prefetch_ttl = PREFETCH_TTL_CALC(err.ttl);
- /* do not waste time trying to validate this servfail */
- err.security = sec_status_indeterminate;
- verbose(VERB_ALGO, "store error response in message cache");
- iter_dns_store(qstate->env, &qstate->qinfo, &err, 0, 0, 0, NULL,
- qstate->query_flags);
+ if(!qstate->no_cache_store) {
+ /* store in cache */
+ struct reply_info err;
+ if(qstate->prefetch_leeway > NORR_TTL) {
+ verbose(VERB_ALGO, "error response for prefetch in cache");
+ /* attempt to adjust the cache entry prefetch */
+ if(dns_cache_prefetch_adjust(qstate->env, &qstate->qinfo,
+ NORR_TTL, qstate->query_flags))
+ return error_response(qstate, id, rcode);
+ /* if that fails (not in cache), fall through to store err */
+ }
+ memset(&err, 0, sizeof(err));
+ err.flags = (uint16_t)(BIT_QR | BIT_RA);
+ FLAGS_SET_RCODE(err.flags, rcode);
+ err.qdcount = 1;
+ err.ttl = NORR_TTL;
+ err.prefetch_ttl = PREFETCH_TTL_CALC(err.ttl);
+ /* do not waste time trying to validate this servfail */
+ err.security = sec_status_indeterminate;
+ verbose(VERB_ALGO, "store error response in message cache");
+ iter_dns_store(qstate->env, &qstate->qinfo, &err, 0, 0, 0, NULL,
+ qstate->query_flags);
+ }
return error_response(qstate, id, rcode);
}
@@ -551,6 +552,7 @@ generate_sub_request(uint8_t* qname, size_t qnamelen, uint16_t qtype,
qinf.qname_len = qnamelen;
qinf.qtype = qtype;
qinf.qclass = qclass;
+ qinf.local_alias = NULL;
/* RD should be set only when sending the query back through the INIT
* state. */
@@ -968,7 +970,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
{
uint8_t* delname;
size_t delnamelen;
- struct dns_msg* msg;
+ struct dns_msg* msg = NULL;
log_query_info(VERB_DETAIL, "resolving", &qstate->qinfo);
/* check effort */
@@ -1008,13 +1010,13 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
* getting older results from cache is a bad idea, no cache */
verbose(VERB_ALGO, "cache blacklisted, going to the network");
msg = NULL;
- } else {
+ } else if(!qstate->no_cache_lookup) {
msg = dns_cache_lookup(qstate->env, iq->qchase.qname,
iq->qchase.qname_len, iq->qchase.qtype,
iq->qchase.qclass, qstate->query_flags,
qstate->region, qstate->env->scratch);
if(!msg && qstate->env->neg_cache) {
- /* lookup in negative cache; may result in
+ /* 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,
qstate->region, qstate->env->rrset_cache,
@@ -1700,10 +1702,11 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
/* if this was a parent-side glue query itself, then store that
* failure in cache. */
- if(iq->query_for_pside_glue && !iq->pside_glue)
- iter_store_parentside_neg(qstate->env, &qstate->qinfo,
- iq->deleg_msg?iq->deleg_msg->rep:
- (iq->response?iq->response->rep:NULL));
+ if(!qstate->no_cache_store && iq->query_for_pside_glue
+ && !iq->pside_glue)
+ iter_store_parentside_neg(qstate->env, &qstate->qinfo,
+ iq->deleg_msg?iq->deleg_msg->rep:
+ (iq->response?iq->response->rep:NULL));
verbose(VERB_QUERY, "out of query targets -- returning SERVFAIL");
/* fail -- no more targets, no more hope of targets, no hope
@@ -1787,8 +1790,6 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
int tf_policy;
struct delegpt_addr* target;
struct outbound_entry* outq;
- /* EDNS options to set on outgoing packet */
- struct edns_option* opt_list = NULL;
/* NOTE: a request will encounter this state for each target it
* needs to send a query to. That is, at least one per referral,
@@ -2011,6 +2012,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qinfo_out.qname_len = iq->dp->namelen;
iq->qinfo_out.qtype = LDNS_RR_TYPE_A;
iq->qinfo_out.qclass = iq->qchase.qclass;
+ iq->qinfo_out.local_alias = NULL;
iq->minimise_count = 0;
}
@@ -2068,7 +2070,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|| iq->qchase.qtype == LDNS_RR_TYPE_A)))
/* Stop minimising this query, resolve "as usual" */
iq->minimisation_state = DONOT_MINIMISE_STATE;
- else {
+ else if(!qstate->no_cache_lookup) {
struct dns_msg* msg = dns_cache_lookup(qstate->env,
iq->qinfo_out.qname, iq->qinfo_out.qname_len,
iq->qinfo_out.qtype, iq->qinfo_out.qclass,
@@ -2088,7 +2090,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
/* Do not increment qname, continue incrementing next
* iteration */
iq->minimisation_state = MINIMISE_STATE;
- else
+ else if(!qstate->env->cfg->qname_minimisation_strict)
/* Too many time-outs detected for this QNAME and QTYPE.
* We give up, disable QNAME minimisation. */
iq->minimisation_state = DONOT_MINIMISE_STATE;
@@ -2106,9 +2108,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
iq->dnssec_lame_query?" but lame_query anyway": "");
}
fptr_ok(fptr_whitelist_modenv_send_query(qstate->env->send_query));
- outq = (*qstate->env->send_query)(
- iq->qinfo_out.qname, iq->qinfo_out.qname_len,
- iq->qinfo_out.qtype, iq->qinfo_out.qclass,
+ outq = (*qstate->env->send_query)(&iq->qinfo_out,
iq->chase_flags | (iq->chase_to_rd?BIT_RD:0),
/* unset CD if to forwarder(RD set) and not dnssec retry
* (blacklist nonempty) and no trust-anchors are configured
@@ -2117,8 +2117,9 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
!qstate->blacklist&&(!iter_indicates_dnssec_fwd(qstate->env,
&iq->qinfo_out)||target->attempts==1)?0:BIT_CD),
iq->dnssec_expected, iq->caps_fallback || is_caps_whitelisted(
- ie, iq), opt_list, &target->addr, target->addrlen,
- iq->dp->name, iq->dp->namelen, qstate);
+ ie, iq), &target->addr, target->addrlen,
+ iq->dp->name, iq->dp->namelen,
+ (iq->dp->ssl_upstream || qstate->env->cfg->ssl_upstream), qstate);
if(!outq) {
log_addr(VERB_DETAIL, "error sending query to auth server",
&target->addr, target->addrlen);
@@ -2259,10 +2260,11 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->num_target_queries = 0;
return processDSNSFind(qstate, iq, id);
}
- iter_dns_store(qstate->env, &iq->response->qinfo,
- iq->response->rep, 0, qstate->prefetch_leeway,
- iq->dp&&iq->dp->has_parent_side_NS,
- qstate->region, qstate->query_flags);
+ if(!qstate->no_cache_store)
+ iter_dns_store(qstate->env, &iq->response->qinfo,
+ iq->response->rep, 0, qstate->prefetch_leeway,
+ iq->dp&&iq->dp->has_parent_side_NS,
+ qstate->region, qstate->query_flags);
/* close down outstanding requests to be discarded */
outbound_list_clear(&iq->outlist);
iq->num_current_queries = 0;
@@ -2275,12 +2277,15 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
&qstate->reply->addr, qstate->reply->addrlen,
qstate->region);
if(iq->minimisation_state != DONOT_MINIMISE_STATE) {
- /* Best effort qname-minimisation.
- * Stop minimising and send full query when RCODE
- * is not NOERROR. */
if(FLAGS_GET_RCODE(iq->response->rep->flags) !=
- LDNS_RCODE_NOERROR)
+ LDNS_RCODE_NOERROR) {
+ if(qstate->env->cfg->qname_minimisation_strict)
+ return final_state(iq);
+ /* Best effort qname-minimisation.
+ * Stop minimising and send full query when
+ * RCODE is not NOERROR. */
iq->minimisation_state = DONOT_MINIMISE_STATE;
+ }
if(FLAGS_GET_RCODE(iq->response->rep->flags) ==
LDNS_RCODE_NXDOMAIN) {
/* Stop resolving when NXDOMAIN is DNSSEC
@@ -2327,7 +2332,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
}
/* if hardened, only store referral if we asked for it */
- if(!qstate->env->cfg->harden_referral_path ||
+ if(!qstate->no_cache_store &&
+ (!qstate->env->cfg->harden_referral_path ||
( qstate->qinfo.qtype == LDNS_RR_TYPE_NS
&& (qstate->query_flags&BIT_RD)
&& !(qstate->query_flags&BIT_CD)
@@ -2342,7 +2348,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->qchase.qname, iq->qchase.qname_len,
LDNS_RR_TYPE_NS, iq->qchase.qclass)
)
- )) {
+ ))) {
/* Store the referral under the current query */
/* no prefetch-leeway, since its not the answer */
iter_dns_store(qstate->env, &iq->response->qinfo,
@@ -2355,16 +2361,17 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
iq->response->rep, iq->dp->name);
}
/* store parent-side-in-zone-glue, if directly queried for */
- if(iq->query_for_pside_glue && !iq->pside_glue) {
- iq->pside_glue = reply_find_rrset(iq->response->rep,
- iq->qchase.qname, iq->qchase.qname_len,
- iq->qchase.qtype, iq->qchase.qclass);
- if(iq->pside_glue) {
- log_rrset_key(VERB_ALGO, "found parent-side "
- "glue", iq->pside_glue);
- iter_store_parentside_rrset(qstate->env,
- iq->pside_glue);
- }
+ if(!qstate->no_cache_store && iq->query_for_pside_glue
+ && !iq->pside_glue) {
+ iq->pside_glue = reply_find_rrset(iq->response->rep,
+ iq->qchase.qname, iq->qchase.qname_len,
+ iq->qchase.qtype, iq->qchase.qclass);
+ if(iq->pside_glue) {
+ log_rrset_key(VERB_ALGO, "found parent-side "
+ "glue", iq->pside_glue);
+ iter_store_parentside_rrset(qstate->env,
+ iq->pside_glue);
+ }
}
/* Reset the event state, setting the current delegation
@@ -2445,10 +2452,11 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
/* NOTE : set referral=1, so that rrsets get stored but not
* the partial query answer (CNAME only). */
/* prefetchleeway applied because this updates answer parts */
- iter_dns_store(qstate->env, &iq->response->qinfo,
- iq->response->rep, 1, qstate->prefetch_leeway,
- iq->dp&&iq->dp->has_parent_side_NS, NULL,
- qstate->query_flags);
+ if(!qstate->no_cache_store)
+ iter_dns_store(qstate->env, &iq->response->qinfo,
+ iq->response->rep, 1, qstate->prefetch_leeway,
+ iq->dp&&iq->dp->has_parent_side_NS, NULL,
+ qstate->query_flags);
/* set the current request's qname to the new value. */
iq->qchase.qname = sname;
iq->qchase.qname_len = snamelen;
@@ -2527,7 +2535,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
/* LAME, THROWAWAY and "unknown" all end up here.
* Recycle to the QUERYTARGETS state to hopefully try a
* different target. */
- if (qstate->env->cfg->qname_minimisation)
+ if (qstate->env->cfg->qname_minimisation &&
+ !qstate->env->cfg->qname_minimisation_strict)
iq->minimisation_state = DONOT_MINIMISE_STATE;
return next_state(iq, QUERYTARGETS_STATE);
}
@@ -2927,10 +2936,11 @@ processFinished(struct module_qstate* qstate, struct iter_qstate* iq,
&qstate->qinfo);
/* store negative cache element for parent side glue. */
- if(iq->query_for_pside_glue && !iq->pside_glue)
- iter_store_parentside_neg(qstate->env, &qstate->qinfo,
- iq->deleg_msg?iq->deleg_msg->rep:
- (iq->response?iq->response->rep:NULL));
+ if(!qstate->no_cache_store && iq->query_for_pside_glue
+ && !iq->pside_glue)
+ iter_store_parentside_neg(qstate->env, &qstate->qinfo,
+ iq->deleg_msg?iq->deleg_msg->rep:
+ (iq->response?iq->response->rep:NULL));
if(!iq->response) {
verbose(VERB_ALGO, "No response is set, servfail");
return error_response(qstate, id, LDNS_RCODE_SERVFAIL);
@@ -2966,7 +2976,7 @@ processFinished(struct module_qstate* qstate, struct iter_qstate* iq,
/* store message with the finished prepended items,
* but only if we did recursion. The nonrecursion referral
* from cache does not need to be stored in the msg cache. */
- if(qstate->query_flags&BIT_RD) {
+ if(!qstate->no_cache_store && qstate->query_flags&BIT_RD) {
iter_dns_store(qstate->env, &qstate->qinfo,
iq->response->rep, 0, qstate->prefetch_leeway,
iq->dp&&iq->dp->has_parent_side_NS,
@@ -3141,6 +3151,18 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
LDNS_RCODE_NOERROR)
goto handle_it;
+
+ /* Copy the edns options we may got from the back end */
+ if(edns.opt_list) {
+ qstate->edns_opts_back_in = edns_opt_copy_region(edns.opt_list,
+ qstate->region);
+ if(!qstate->edns_opts_back_in) {
+ log_err("out of memory on incoming message");
+ /* like packet got dropped */
+ goto handle_it;
+ }
+ }
+
/* remove CD-bit, we asked for in case we handle validation ourself */
prs->flags &= ~BIT_CD;
diff --git a/libunbound/context.c b/libunbound/context.c
index 4469b5bb4eb2..94a2472ae531 100644
--- a/libunbound/context.c
+++ b/libunbound/context.c
@@ -62,6 +62,7 @@ context_finalize(struct ub_ctx* ctx)
config_apply(cfg);
if(!modstack_setup(&ctx->mods, cfg->module_conf, ctx->env))
return UB_INITFAIL;
+ log_edns_known_options(VERB_ALGO, ctx->env);
ctx->local_zones = local_zones_create();
if(!ctx->local_zones)
return UB_NOMEM;
diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c
index 69ccb08f45cb..aaaaec08ce9e 100644
--- a/libunbound/libunbound.c
+++ b/libunbound/libunbound.c
@@ -132,6 +132,15 @@ static struct ub_ctx* ub_ctx_create_nopipe(void)
errno = ENOMEM;
return NULL;
}
+ /* init edns_known_options */
+ if(!edns_known_options_init(ctx->env)) {
+ config_delete(ctx->env->cfg);
+ free(ctx->env);
+ ub_randfree(ctx->seed_rnd);
+ free(ctx);
+ errno = ENOMEM;
+ return NULL;
+ }
ctx->env->alloc = &ctx->superalloc;
ctx->env->worker = NULL;
ctx->env->need_to_validate = 0;
@@ -151,6 +160,7 @@ ub_ctx_create(void)
ub_randfree(ctx->seed_rnd);
config_delete(ctx->env->cfg);
modstack_desetup(&ctx->mods, ctx->env);
+ edns_known_options_delete(ctx->env);
free(ctx->env);
free(ctx);
errno = e;
@@ -162,6 +172,7 @@ ub_ctx_create(void)
ub_randfree(ctx->seed_rnd);
config_delete(ctx->env->cfg);
modstack_desetup(&ctx->mods, ctx->env);
+ edns_known_options_delete(ctx->env);
free(ctx->env);
free(ctx);
errno = e;
@@ -298,6 +309,8 @@ ub_ctx_delete(struct ub_ctx* ctx)
rrset_cache_delete(ctx->env->rrset_cache);
infra_delete(ctx->env->infra_cache);
config_delete(ctx->env->cfg);
+ edns_known_options_delete(ctx->env);
+ inplace_cb_lists_delete(ctx->env);
free(ctx->env);
}
ub_randfree(ctx->seed_rnd);
diff --git a/libunbound/libworker.c b/libunbound/libworker.c
index 6f535414407d..c90101956d51 100644
--- a/libunbound/libworker.c
+++ b/libunbound/libworker.c
@@ -573,10 +573,12 @@ setup_qinfo_edns(struct libworker* w, struct ctx_query* q,
{
qinfo->qtype = (uint16_t)q->res->qtype;
qinfo->qclass = (uint16_t)q->res->qclass;
+ qinfo->local_alias = NULL;
qinfo->qname = sldns_str2wire_dname(q->res->qname, &qinfo->qname_len);
if(!qinfo->qname) {
return 0;
}
+ qinfo->local_alias = NULL;
edns->edns_present = 1;
edns->ext_rcode = 0;
edns->edns_version = 0;
@@ -607,9 +609,9 @@ int libworker_fg(struct ub_ctx* ctx, struct ctx_query* q)
/* see if there is a fixed answer */
sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
- if(local_zones_answer(ctx->local_zones, &qinfo, &edns,
+ if(local_zones_answer(ctx->local_zones, w->env, &qinfo, &edns,
w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
- NULL, 0, NULL, 0)) {
+ NULL, 0, NULL, 0, NULL)) {
regional_free_all(w->env->scratch);
libworker_fillup_fg(q, LDNS_RCODE_NOERROR,
w->back->udp_buff, sec_status_insecure, NULL);
@@ -678,9 +680,9 @@ int libworker_attach_mesh(struct ub_ctx* ctx, struct ctx_query* q,
/* see if there is a fixed answer */
sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
- if(local_zones_answer(ctx->local_zones, &qinfo, &edns,
+ if(local_zones_answer(ctx->local_zones, w->env, &qinfo, &edns,
w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
- NULL, 0, NULL, 0)) {
+ NULL, 0, NULL, 0, NULL)) {
regional_free_all(w->env->scratch);
free(qinfo.qname);
libworker_event_done_cb(q, LDNS_RCODE_NOERROR,
@@ -799,9 +801,9 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
/* see if there is a fixed answer */
sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
- if(local_zones_answer(w->ctx->local_zones, &qinfo, &edns,
+ if(local_zones_answer(w->ctx->local_zones, w->env, &qinfo, &edns,
w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
- NULL, 0, NULL, 0)) {
+ NULL, 0, NULL, 0, NULL)) {
regional_free_all(w->env->scratch);
q->msg_security = sec_status_insecure;
add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL);
@@ -824,11 +826,10 @@ void libworker_alloc_cleanup(void* arg)
slabhash_clear(w->env->msg_cache);
}
-struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen,
- uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec,
- int want_dnssec, int nocaps, struct edns_option* opt_list,
+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, struct module_qstate* q)
+ size_t zonelen, int ssl_upstream, struct module_qstate* q)
{
struct libworker* w = (struct libworker*)q->env->worker;
struct outbound_entry* e = (struct outbound_entry*)regional_alloc(
@@ -836,11 +837,10 @@ struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen,
if(!e)
return NULL;
e->qstate = q;
- e->qsent = outnet_serviced_query(w->back, qname,
- qnamelen, qtype, qclass, flags, dnssec, want_dnssec, nocaps,
- q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, opt_list,
- addr, addrlen, zone, zonelen, libworker_handle_service_reply,
- e, w->back->udp_buff);
+ 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);
if(!e->qsent) {
return NULL;
}
@@ -955,14 +955,12 @@ void worker_sighandler(int ATTR_UNUSED(sig), void* ATTR_UNUSED(arg))
log_assert(0);
}
-struct outbound_entry* worker_send_query(uint8_t* ATTR_UNUSED(qname),
- size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
- uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
- int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
- struct sockaddr_storage* ATTR_UNUSED(addr),
- socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone),
- size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q))
+struct outbound_entry* worker_send_query(struct query_info* ATTR_UNUSED(qinfo),
+ uint16_t ATTR_UNUSED(flags), int ATTR_UNUSED(dnssec),
+ 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))
{
log_assert(0);
return 0;
diff --git a/libunbound/libworker.h b/libunbound/libworker.h
index 00143475bbce..b546e89f2ca5 100644
--- a/libunbound/libworker.h
+++ b/libunbound/libworker.h
@@ -1,5 +1,5 @@
/*
- * libunbound/worker.h - worker thread or process that resolves
+ * libunbound/libworker.h - worker thread or process that resolves
*
* Copyright (c) 2007, NLnet Labs. All rights reserved.
*
@@ -59,6 +59,7 @@ struct regional;
struct tube;
struct sldns_buffer;
struct ub_event_base;
+struct query_info;
/**
* The library-worker status structure
diff --git a/libunbound/python/doc/conf.py b/libunbound/python/doc/conf.py
index 97fca2125f83..1766036b9a1f 100644
--- a/libunbound/python/doc/conf.py
+++ b/libunbound/python/doc/conf.py
@@ -82,10 +82,13 @@ pygments_style = 'sphinx'
# Options for HTML output
# -----------------------
+# The theme that the html output should use.
+html_theme = "classic"
+
# The style sheet to use for HTML and HTML Help pages. A file of that name
# must exist either in Sphinx' static/ path, or in one of the custom paths
# given in html_static_path.
-html_style = 'default.css'
+#html_style = 'default.css'
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
diff --git a/libunbound/python/doc/examples/example1a.rst b/libunbound/python/doc/examples/example1a.rst
index 3c81547f2948..f46cb92f47e8 100644
--- a/libunbound/python/doc/examples/example1a.rst
+++ b/libunbound/python/doc/examples/example1a.rst
@@ -1,26 +1,33 @@
.. _example_resolve_name:
-==============================
Resolve a name
-==============================
+==============
-This basic example shows how to create a context and resolve a host address (DNS record of A type).
+This basic example shows how to create a context and resolve a host address
+(DNS record of A type).
+
+Source code
+-----------
::
- #!/usr/bin/python
- import unbound
-
- ctx = unbound.ub_ctx()
- ctx.resolvconf("/etc/resolv.conf")
-
- status, result = ctx.resolve("www.google.com")
- if status == 0 and result.havedata:
- print "Result.data:", result.data.address_list
- elif status != 0:
- print "Resolve error:", unbound.ub_strerror(status)
-
-In contrast with C API, the source code is more compact while the performance of C implementation is preserved.
-The main advantage is that you need not take care about the deallocation and allocation of context and result structures; pyUnbound module do it automatically for you.
-
-If only domain name is given, the :meth:`unbound.ub_ctx.resolve` looks for A records in IN class.
+ #!/usr/bin/python
+ import unbound
+
+ ctx = unbound.ub_ctx()
+ ctx.resolvconf("/etc/resolv.conf")
+
+ status, result = ctx.resolve("www.google.com")
+ if status == 0 and result.havedata:
+ print "Result.data:", result.data.address_list
+ elif status != 0:
+ print "Resolve error:", unbound.ub_strerror(status)
+
+In contrast with the C API, the source code is more compact while the
+performance of C implementation is preserved.
+The main advantage is that you need not take care about the deallocation and
+allocation of context and result structures; pyUnbound module does it
+automatically for you.
+
+If only domain name is given, the :meth:`unbound.ub_ctx.resolve` looks for
+A records in IN class.
diff --git a/libunbound/python/doc/examples/example1b.rst b/libunbound/python/doc/examples/example1b.rst
index ea1e6f57de65..1adae2cb1298 100644
--- a/libunbound/python/doc/examples/example1b.rst
+++ b/libunbound/python/doc/examples/example1b.rst
@@ -1,33 +1,37 @@
.. _example_reverse_lookup:
-==============================
Reverse DNS lookup
-==============================
+==================
-Reverse DNS lookup involves determining the hostname associated with a given IP address.
+Reverse DNS lookup involves determining the hostname associated with a given IP
+address.
This example shows how reverse lookup can be done using unbound module.
For the reverse DNS records, the special domain in-addr.arpa is reserved.
-For example, a host name for the IP address 74.125.43.147 can be obtained by issuing a DNS query for the PTR record for address 147.43.125.74.in-addr.arpa.
+For example, a host name for the IP address ``74.125.43.147`` can be obtained
+by issuing a DNS query for the PTR record for address
+``147.43.125.74.in-addr.arpa.``
+
+Source code
+-----------
::
- #!/usr/bin/python
- import unbound
-
- ctx = unbound.ub_ctx()
- ctx.resolvconf("/etc/resolv.conf")
-
- status, result = ctx.resolve(unbound.reverse("74.125.43.147") + ".in-addr.arpa.", unbound.RR_TYPE_PTR, unbound.RR_CLASS_IN)
- if status == 0 and result.havedata:
- print "Result.data:", result.data.domain_list
- elif status != 0:
- print "Resolve error:", unbound.ub_strerror(status)
-
-In order to simplify the python code, unbound module contains function which reverses the hostname components.
-This function is defined as follows::
+ #!/usr/bin/python
+ import unbound
- def reverse(domain):
- return '.'.join([a for a in domain.split(".")][::-1])
+ ctx = unbound.ub_ctx()
+ ctx.resolvconf("/etc/resolv.conf")
+ status, result = ctx.resolve(unbound.reverse("74.125.43.147") + ".in-addr.arpa.", unbound.RR_TYPE_PTR, unbound.RR_CLASS_IN)
+ if status == 0 and result.havedata:
+ print "Result.data:", result.data.domain_list
+ elif status != 0:
+ print "Resolve error:", unbound.ub_strerror(status)
+
+In order to simplify the python code, unbound module contains the
+:meth:`unbound.reverse` function which reverses the hostname components.
+This function is defined as follows::
+ def reverse(domain):
+ return '.'.join([a for a in domain.split(".")][::-1])
diff --git a/libunbound/python/doc/examples/example2.rst b/libunbound/python/doc/examples/example2.rst
index c009ec1f5ae7..a2bf2cbf5199 100644
--- a/libunbound/python/doc/examples/example2.rst
+++ b/libunbound/python/doc/examples/example2.rst
@@ -1,41 +1,41 @@
.. _example_setup_ctx:
-==============================
Lookup from threads
-==============================
+===================
-This example shows how to use unbound module from a threaded program.
-In this example, three lookup threads are created which work in background.
-Each thread resolves different DNS record.
+This example shows how to use unbound module from a threaded program.
+In this example, three lookup threads are created which work in background.
+Each thread resolves different DNS record.
+
+Source code
+-----------
::
- #!/usr/bin/python
- from unbound import ub_ctx, RR_TYPE_A, RR_CLASS_IN
- from threading import Thread
-
- ctx = ub_ctx()
- ctx.resolvconf("/etc/resolv.conf")
-
- class LookupThread(Thread):
- def __init__(self,ctx, name):
- Thread.__init__(self)
- self.ctx = ctx
- self.name = name
-
- def run(self):
- print "Thread lookup started:",self.name
- status, result = self.ctx.resolve(self.name, RR_TYPE_A, RR_CLASS_IN)
- if status == 0 and result.havedata:
- print " Result:",self.name,":", result.data.address_list
-
- threads = []
- for name in ["www.fit.vutbr.cz","www.vutbr.cz","www.google.com"]:
- thread = LookupThread(ctx, name)
- thread.start()
- threads.append(thread)
-
- for thread in threads:
- thread.join()
+ #!/usr/bin/python
+ from unbound import ub_ctx, RR_TYPE_A, RR_CLASS_IN
+ from threading import Thread
+
+ ctx = ub_ctx()
+ ctx.resolvconf("/etc/resolv.conf")
+
+ class LookupThread(Thread):
+ def __init__(self,ctx, name):
+ Thread.__init__(self)
+ self.ctx = ctx
+ self.name = name
+
+ def run(self):
+ print "Thread lookup started:",self.name
+ status, result = self.ctx.resolve(self.name, RR_TYPE_A, RR_CLASS_IN)
+ if status == 0 and result.havedata:
+ print " Result:",self.name,":", result.data.address_list
+ threads = []
+ for name in ["www.fit.vutbr.cz","www.vutbr.cz","www.google.com"]:
+ thread = LookupThread(ctx, name)
+ thread.start()
+ threads.append(thread)
+ for thread in threads:
+ thread.join()
diff --git a/libunbound/python/doc/examples/example3.rst b/libunbound/python/doc/examples/example3.rst
index 91360335c63a..b0626b55f9c1 100644
--- a/libunbound/python/doc/examples/example3.rst
+++ b/libunbound/python/doc/examples/example3.rst
@@ -1,12 +1,14 @@
.. _example_asynch:
-==============================
Asynchronous lookup
-==============================
+===================
This example performs the name lookup in the background.
The main program keeps running while the name is resolved.
+Source code
+-----------
+
::
#!/usr/bin/python
@@ -33,4 +35,5 @@ The main program keeps running while the name is resolved.
if (status != 0):
print "Resolve error:", unbound.ub_strerror(status)
-The :meth:`unbound.ub_ctx.resolve_async` method is able to pass on any Python object. In this example, we used a dictionary object `my_data`.
+The :meth:`unbound.ub_ctx.resolve_async` method is able to pass on any Python
+object. In this example, we used a dictionary object ``my_data``.
diff --git a/libunbound/python/doc/examples/example4.rst b/libunbound/python/doc/examples/example4.rst
index 996ef4ede924..3b43eb85f939 100644
--- a/libunbound/python/doc/examples/example4.rst
+++ b/libunbound/python/doc/examples/example4.rst
@@ -1,33 +1,35 @@
.. _example_examine:
-==============================
DNSSEC validator
-==============================
+================
This example program performs DNSSEC validation of a DNS lookup.
+Source code
+-----------
+
::
- #!/usr/bin/python
- import os
- from unbound import ub_ctx,RR_TYPE_A,RR_CLASS_IN
-
- ctx = ub_ctx()
- ctx.resolvconf("/etc/resolv.conf")
- if (os.path.isfile("keys")):
- ctx.add_ta_file("keys") #read public keys for DNSSEC verification
-
- status, result = ctx.resolve("www.nic.cz", RR_TYPE_A, RR_CLASS_IN)
- if status == 0 and result.havedata:
-
- print "Result:", result.data.address_list
-
- if result.secure:
- print "Result is secure"
- elif result.bogus:
- print "Result is bogus"
- else:
- print "Result is insecure"
+ #!/usr/bin/python
+ import os
+ from unbound import ub_ctx,RR_TYPE_A,RR_CLASS_IN
+
+ ctx = ub_ctx()
+ ctx.resolvconf("/etc/resolv.conf")
+ if (os.path.isfile("keys")):
+ ctx.add_ta_file("keys") #read public keys for DNSSEC verification
+
+ status, result = ctx.resolve("www.nic.cz", RR_TYPE_A, RR_CLASS_IN)
+ if status == 0 and result.havedata:
+
+ print "Result:", result.data.address_list
+
+ if result.secure:
+ print "Result is secure"
+ elif result.bogus:
+ print "Result is bogus"
+ else:
+ print "Result is insecure"
More detailed informations can be seen in libUnbound DNSSEC tutorial `here`_.
diff --git a/libunbound/python/doc/examples/example5.rst b/libunbound/python/doc/examples/example5.rst
index 0a31d9a57e76..9262014bb7fd 100644
--- a/libunbound/python/doc/examples/example5.rst
+++ b/libunbound/python/doc/examples/example5.rst
@@ -1,13 +1,17 @@
.. _example_resolver_only:
-==============================
Resolver only
-==============================
+=============
This example program shows how to perform DNS resolution only.
Unbound contains two basic modules: resolver and validator.
-In case, the validator is not necessary, the validator module can be turned off using "module-config" option.
-This option contains a list of module names separated by the space char. This list determined which modules should be employed and in what order.
+In case, the validator is not necessary, the validator module can be turned off
+using "module-config" option.
+This option contains a list of module names separated by the space char. This
+list determined which modules should be employed and in what order.
+
+Source code
+-----------
::
@@ -25,5 +29,6 @@ This option contains a list of module names separated by the space char. This li
print "Result:", result.data.address_list
.. note::
- The :meth:`unbound.ub_ctx.set_option` method must be used before the first resolution (i.e. before :meth:`unbound.ub_ctx.resolve` or :meth:`unbound.ub_ctx.resolve_async` call).
-
+ The :meth:`unbound.ub_ctx.set_option` method must be used before the first
+ resolution (i.e. before :meth:`unbound.ub_ctx.resolve` or
+ :meth:`unbound.ub_ctx.resolve_async` call).
diff --git a/libunbound/python/doc/examples/example6.rst b/libunbound/python/doc/examples/example6.rst
index 478e13909277..6fde8b25fd8d 100644
--- a/libunbound/python/doc/examples/example6.rst
+++ b/libunbound/python/doc/examples/example6.rst
@@ -1,11 +1,13 @@
.. _example_localzone:
-==============================
Local zone manipulation
-==============================
+=======================
-This example program shows how to define local zone containing custom DNS records.
+This example program shows how to define local zone containing custom DNS
+records.
-.. literalinclude:: example6-1.py
- :language: python
+Source code
+-----------
+.. literalinclude:: example6-1.py
+ :language: python
diff --git a/libunbound/python/doc/examples/example7.rst b/libunbound/python/doc/examples/example7.rst
index d4050215e435..2f48c8f0f26f 100644
--- a/libunbound/python/doc/examples/example7.rst
+++ b/libunbound/python/doc/examples/example7.rst
@@ -1,18 +1,33 @@
.. _example_idna:
-=================================================
Internationalized domain name support
-=================================================
+=====================================
Unlike the libUnbound, pyUnbound is able to handle IDN queries.
-.. literalinclude:: example7-1.py
- :language: python
+Automatic IDN DNAME conversion
+-------------------------------
-If we use unicode string in :meth:`unbound.ub_ctx.resolve` method, the IDN DNAME conversion (if it is necessary) is performed on background.
+If we use unicode string in :meth:`unbound.ub_ctx.resolve` method,
+the IDN DNAME conversion (if it is necessary) is performed on background.
-.. literalinclude:: example7-2.py
- :language: python
+Source code
+...........
-The :class:`unbound.ub_data` class contains attributes suffix which converts the dname to UTF string. These attributes have the '_idn' suffix.
-Apart from this aproach, two conversion functions exist (:func:`unbound.idn2dname` and :func:`unbound.dname2idn`).
+.. literalinclude:: example7-1.py
+ :language: python
+
+IDN converted attributes
+------------------------
+
+The :class:`unbound.ub_data` class contains attributes suffix which converts
+the dname to UTF string. These attributes have the ``_idn`` suffix.
+
+Apart from this aproach, two conversion functions exist
+(:func:`unbound.idn2dname` and :func:`unbound.dname2idn`).
+
+Source code
+...........
+
+.. literalinclude:: example7-2.py
+ :language: python
diff --git a/libunbound/python/doc/examples/example8.rst b/libunbound/python/doc/examples/example8.rst
index 8cdfcdc0a904..16c14047576b 100644
--- a/libunbound/python/doc/examples/example8.rst
+++ b/libunbound/python/doc/examples/example8.rst
@@ -1,28 +1,34 @@
.. _example_mxlookup:
-=================================================
Lookup for MX and NS records
-=================================================
+============================
-The pyUnbound extension provides functions which are able to encode RAW RDATA produces by unbound resolver (see :class:`unbound.ub_data`).
+The pyUnbound extension provides functions which are able to encode RAW RDATA
+produces by unbound resolver (see :class:`unbound.ub_data`).
-.. literalinclude:: example8-1.py
- :language: python
+Source code
+-----------
-Previous example produces following output::
+.. literalinclude:: example8-1.py
+ :language: python
- Result:
- raw data: 00 0F 05 6D 61 69 6C 34 03 6E 69 63 02 63 7A 00;00 14 02 6D 78 05 63 7A 6E 69 63 03 6F 72 67 00;00 0A 04 6D 61 69 6C 03 6E 69 63 02 63 7A 00
- priority:15 address: mail4.nic.cz.
- priority:20 address: mx.cznic.org.
- priority:10 address: mail.nic.cz.
+Output
+------
- Result:
- raw data: D9 1F CD 32
- address: 217.31.205.50
+The previous example produces the following output::
- Result:
- raw data: 01 61 02 6E 73 03 6E 69 63 02 63 7A 00;01 65 02 6E 73 03 6E 69 63 02 63 7A 00;01 63 02 6E 73 03 6E 69 63 02 63 7A 00
- host: a.ns.nic.cz.
- host: e.ns.nic.cz.
- host: c.ns.nic.cz.
+ Result:
+ raw data: 00 0F 05 6D 61 69 6C 34 03 6E 69 63 02 63 7A 00;00 14 02 6D 78 05 63 7A 6E 69 63 03 6F 72 67 00;00 0A 04 6D 61 69 6C 03 6E 69 63 02 63 7A 00
+ priority:15 address: mail4.nic.cz.
+ priority:20 address: mx.cznic.org.
+ priority:10 address: mail.nic.cz.
+
+ Result:
+ raw data: D9 1F CD 32
+ address: 217.31.205.50
+
+ Result:
+ raw data: 01 61 02 6E 73 03 6E 69 63 02 63 7A 00;01 65 02 6E 73 03 6E 69 63 02 63 7A 00;01 63 02 6E 73 03 6E 69 63 02 63 7A 00
+ host: a.ns.nic.cz.
+ host: e.ns.nic.cz.
+ host: c.ns.nic.cz.
diff --git a/libunbound/python/doc/examples/index.rst b/libunbound/python/doc/examples/index.rst
index c2c9cf457117..283261652dc0 100644
--- a/libunbound/python/doc/examples/index.rst
+++ b/libunbound/python/doc/examples/index.rst
@@ -1,14 +1,16 @@
Examples
-==============================
+========
-Here you can find several examples which utilizes the unbound library in Python environment.
-Unbound is a caching validator and resolver and can be linked into an application, as a library where can answer DNS queries for the application.
+Here you can find several examples which utilizes the unbound library in Python
+environment. Unbound is a caching validator and resolver and can be linked into
+an application, as a library where can answer DNS queries for the application.
This set of examples shows how to use the functions from Python environment.
-`Tutorials`
+Tutorials
+---------
.. toctree::
- :maxdepth: 1
- :glob:
+ :maxdepth: 1
+ :glob:
- example*
+ example*
diff --git a/libunbound/python/doc/install.rst b/libunbound/python/doc/install.rst
index a073a5c6603f..bb3118984de3 100644
--- a/libunbound/python/doc/install.rst
+++ b/libunbound/python/doc/install.rst
@@ -1,31 +1,38 @@
Installation
-===================================
+============
-**Prerequisites**
+Prerequisites
+-------------
Python 2.4 or higher, SWIG 1.3 or higher, GNU make
-**Compiling**
+Compiling
+---------
After downloading, you can compile the pyUnbound library by doing::
- > tar -xzf unbound-x.x.x-py.tar.gz
- > cd unbound-x.x.x
- > ./configure --with-pyunbound
- > make
+ > tar -xzf unbound-x.x.x-py.tar.gz
+ > cd unbound-x.x.x
+ > ./configure --with-pyunbound
+ > make
-You may want to --with-pythonmodule as well if you want to use python as
-a module in the resolver.
+You may want to enable ``--with-pythonmodule`` as well if you want to use
+python as a module in the resolver.
-You need GNU make to compile sources; SWIG and Python devel libraries to compile extension module.
+You need ``GNU make`` to compile sources; ``SWIG`` and ``Python devel``
+libraries to compile extension module.
-**Testing**
+Testing
+-------
-If the compilation is successful, you can test the python LDNS extension module by::
+If the compilation is successful, you can test the python LDNS extension module
+by::
- > cd contrib/python
- > make testenv
- > ./dns-lookup.py
+ > cd contrib/python
+ > make testenv
+ > ./dns-lookup.py
-You may want to make install in the main directory since make testenv is for debugging. In contrib/examples you can find simple applications written in Python using the Unbound extension.
+You may want to ``make install`` in the main directory since ``make testenv``
+is for debugging. In contrib/examples you can find simple applications written
+in Python using the Unbound extension.
diff --git a/libunbound/python/doc/intro.rst b/libunbound/python/doc/intro.rst
index f751f54c07be..e490d2c6f508 100644
--- a/libunbound/python/doc/intro.rst
+++ b/libunbound/python/doc/intro.rst
@@ -1,39 +1,58 @@
Introduction
-===================================
-
-**Unbound**
-
- `Unbound`_ is an implementation of a DNS resolver, that performs caching and DNSSEC validation.
- Together with unbound, the libunbound library is provided.
- This library can be used to convert hostnames to ip addresses, and back, as well as obtain other information.
- Since the resolver allows to specify the class and type of a query (A record, NS, MX, ...), this library offers powerful resolving tool.
- The library also performs public-key validation of results with DNSSEC.
-
- .. _Unbound: http://www.unbound.net/documentation
-
-**pyUnbound**
-
- The pyUnbound is an extension module for Python which provides an object-oriented interface to libunbound.
- It is the first Python module which offers thread-safe caching resolver.
-
- The interface was designed with the emphasis on the simplicity of use.
- There are two main classes :class:`unbound.ub_ctx` (a validation and resolution context) and :class:`unbound.ub_result` which contains the validation and resolution results.
- The objects are thread-safe, and a context can be used in non-threaded as well as threaded environment.
- Resolution can be performed blocking and non-blocking (i.e. asynchronous).
- The asynchronous method returns from the call immediately, so that processing can go on, while the results become available later.
-
-**Features**
- * customizable caching validation resolver for synchronous and asynchronous lookups
- * easy to use object interface
- * easy to integrate extension module
- * designed for thread environment (i.e. thread-safe)
- * allows define and customize of local zone and its RR's during the operation (i.e. without restart)
- * includes encoding functions to simplify the results retrieval
- * Internationalized domain name (`IDN`_) support
-
- .. _IDN: http://en.wikipedia.org/wiki/Internationalized_domain_name
-
-**Application area**
- * DNS-based applications performing DNS lookups; the caching resolver can reduce overhead
- * Applications where the validation of DNS records is required
- * Great solution for customizable and dynamic DNS-based white/blacklists (spam rejection, connection rejection, ...) using the dynamic local zone manipulation
+============
+
+Unbound
+-------
+
+`Unbound`_ is an implementation of a DNS resolver, that performs caching and
+DNSSEC validation.
+Together with unbound, the libunbound library is provided.
+This library can be used to convert hostnames to ip addresses, and back, as
+well as obtain other information.
+Since the resolver allows to specify the class and type of a query (A record,
+NS, MX, ...), this library offers powerful resolving tool.
+The library also performs public-key validation of results with DNSSEC.
+
+.. _Unbound: http://www.unbound.net/documentation
+
+pyUnbound
+---------
+
+The pyUnbound is an extension module for Python which provides an
+object-oriented interface to libunbound.
+It is the first Python module which offers thread-safe caching resolver.
+
+The interface was designed with the emphasis on the simplicity of use.
+There are two main classes :class:`unbound.ub_ctx` (a validation and resolution
+context) and :class:`unbound.ub_result` which contains the validation and
+resolution results.
+The objects are thread-safe, and a context can be used in non-threaded as well
+as threaded environment.
+Resolution can be performed blocking and non-blocking (i.e. asynchronous).
+The asynchronous method returns from the call immediately, so that processing
+can go on, while the results become available later.
+
+Features
+--------
+
+* Customizable caching validation resolver for synchronous and asynchronous
+ lookups
+* Easy to use object interface
+* Easy to integrate extension module
+* Designed for thread environment (i.e. thread-safe)
+* Allows define and customize of local zone and its RR's during the operation
+ (i.e. without restart)
+* Includes encoding functions to simplify the results retrieval
+* Internationalized domain name (`IDN`_) support
+
+.. _IDN: http://en.wikipedia.org/wiki/Internationalized_domain_name
+
+Application area
+----------------
+
+* DNS-based applications performing DNS lookups; the caching resolver can
+ reduce overhead
+* Applications where the validation of DNS records is required
+* Great solution for customizable and dynamic DNS-based white/blacklists (spam
+ rejection, connection rejection, ...) using the dynamic local zone
+ manipulation
diff --git a/libunbound/worker.h b/libunbound/worker.h
index b8d8dd88a8d9..88e1cf799d47 100644
--- a/libunbound/worker.h
+++ b/libunbound/worker.h
@@ -49,31 +49,28 @@ struct comm_point;
struct module_qstate;
struct tube;
struct edns_option;
+struct query_info;
/**
* Worker service routine to send serviced queries to authoritative servers.
- * @param qname: query name. (host order)
- * @param qnamelen: length in bytes of qname, including trailing 0.
- * @param qtype: query type. (host order)
- * @param qclass: query class. (host order)
+ * @param qinfo: query info.
* @param flags: host order flags word, with opcode and CD bit.
* @param dnssec: if set, EDNS record will have DO bit set.
* @param want_dnssec: signatures needed.
* @param nocaps: ignore capsforid(if in config), do not perturb qname.
- * @param opt_list: EDNS options on outgoing packet.
* @param addr: where to.
* @param addrlen: length of addr.
* @param zone: delegation point name.
* @param zonelen: length of zone name wireformat dname.
+ * @param ssl_upstream: use SSL for upstream queries.
* @param q: wich query state to reactivate upon return.
* @return: false on failure (memory or socket related). no query was
* sent.
*/
-struct outbound_entry* libworker_send_query(uint8_t* qname, size_t qnamelen,
- uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec,
- int want_dnssec, int nocaps, struct edns_option* opt_list,
+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, struct module_qstate* q);
+ size_t zonelen, int ssl_upstream, struct module_qstate* q);
/** process incoming replies from the network */
int libworker_handle_reply(struct comm_point* c, void* arg, int error,
@@ -108,28 +105,24 @@ void worker_sighandler(int sig, void* arg);
/**
* Worker service routine to send serviced queries to authoritative servers.
- * @param qname: query name. (host order)
- * @param qnamelen: length in bytes of qname, including trailing 0.
- * @param qtype: query type. (host order)
- * @param qclass: query class. (host order)
+ * @param qinfo: query info.
* @param flags: host order flags word, with opcode and CD bit.
* @param dnssec: if set, EDNS record will have DO bit set.
* @param want_dnssec: signatures needed.
* @param nocaps: ignore capsforid(if in config), do not perturb qname.
- * @param opt_list: EDNS options on outgoing packet.
* @param addr: where to.
* @param addrlen: length of addr.
* @param zone: wireformat dname of the zone.
* @param zonelen: length of zone name.
+ * @param ssl_upstream: use SSL for upstream queries.
* @param q: wich query state to reactivate upon return.
* @return: false on failure (memory or socket related). no query was
* sent.
*/
-struct outbound_entry* worker_send_query(uint8_t* qname, size_t qnamelen,
- uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec,
- int want_dnssec, int nocaps, struct edns_option* opt_list,
+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, struct module_qstate* q);
+ size_t zonelen, int ssl_upstream, struct module_qstate* q);
/**
* process control messages from the main thread. Frees the control
diff --git a/pythonmod/doc/conf.py b/pythonmod/doc/conf.py
index bc7a5aba68d5..7fcfe2d0508c 100644
--- a/pythonmod/doc/conf.py
+++ b/pythonmod/doc/conf.py
@@ -80,10 +80,13 @@ pygments_style = 'sphinx'
# Options for HTML output
# -----------------------
+# The theme that the html output should use.
+html_theme = "classic"
+
# The style sheet to use for HTML and HTML Help pages. A file of that name
# must exist either in Sphinx' static/ path, or in one of the custom paths
# given in html_static_path.
-html_style = 'default.css'
+#html_style = 'default.css'
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
diff --git a/pythonmod/doc/examples/example1.rst b/pythonmod/doc/examples/example1.rst
index b49e64409255..ccd76da5a77e 100644
--- a/pythonmod/doc/examples/example1.rst
+++ b/pythonmod/doc/examples/example1.rst
@@ -1,10 +1,12 @@
.. _log_handler:
Packet logger
-=========================
+=============
This example shows how to log and print details about query and response.
-As soon as the ``iterator`` has finished (event is :data:`module_event_moddone`), ``qstate.return_msg`` contains response packet or ``None``.
+As soon as the ``iterator`` has finished (event is
+:data:`module_event_moddone`), ``qstate.return_msg`` contains response packet
+or ``None``.
This packet will be send to a client that asked for it.
Complete source code
@@ -14,14 +16,16 @@ Complete source code
:language: python
Testing
-------------------
+-------
Run the unbound server:
``root@localhost>unbound -dv -c ./test-log.conf``
-In case you use own configuration file, don't forget to enable python module: ``module-config: "validator python iterator"`` and use valid script path: ``python-script: "./examples/log.py"``.
+In case you use own configuration file, don't forget to enable python module:
+``module-config: "validator python iterator"`` and use valid script path:
+``python-script: "./examples/log.py"``.
-Example of output::
+Example of output::
[1231790168] unbound[7941:0] info: response for <f.gtld-servers.NET. AAAA IN>
[1231790168] unbound[7941:0] info: reply from <gtld-servers.NET.> 192.5.6.31#53
diff --git a/pythonmod/doc/examples/example2.rst b/pythonmod/doc/examples/example2.rst
index f00fcc239609..4ba9239a003f 100644
--- a/pythonmod/doc/examples/example2.rst
+++ b/pythonmod/doc/examples/example2.rst
@@ -1,12 +1,14 @@
Response generation
-=====================
+===================
This example shows how to handle queries and generate response packet.
.. note::
- If the python module is the first module and validator module is enabled (``module-config: "python validator iterator"``),
- a return_msg security flag has to be set at least to 2. Leaving security flag untouched causes that the
- response will be refused by unbound worker as unbound will consider it as non-valid response.
+ If the python module is the first module and validator module is enabled
+ (``module-config: "python validator iterator"``), a return_msg security flag
+ has to be set at least to 2. Leaving security flag untouched causes that the
+ response will be refused by unbound worker as unbound will consider it as
+ non-valid response.
Complete source code
--------------------
@@ -27,20 +29,21 @@ Query for a A record ending with .localdomain
Dig produces the following output::
- ;; global options: printcmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48426
- ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
-
- ;; QUESTION SECTION:
- ;test.xxx.localdomain. IN A
-
- ;; ANSWER SECTION:
- test.xxx.localdomain. 10 IN A 127.0.0.1
-
- ;; Query time: 2 msec
- ;; SERVER: 127.0.0.1#53(127.0.0.1)
- ;; WHEN: Mon Jan 01 12:46:02 2009
- ;; MSG SIZE rcvd: 54
-
-As we handle (override) in python module only queries ending with "localdomain.", the unboud can still resolve host names.
+ ;; global options: printcmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48426
+ ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
+
+ ;; QUESTION SECTION:
+ ;test.xxx.localdomain. IN A
+
+ ;; ANSWER SECTION:
+ test.xxx.localdomain. 10 IN A 127.0.0.1
+
+ ;; Query time: 2 msec
+ ;; SERVER: 127.0.0.1#53(127.0.0.1)
+ ;; WHEN: Mon Jan 01 12:46:02 2009
+ ;; MSG SIZE rcvd: 54
+
+As we handle (override) in the python module only queries ending with
+``localdomain.``, unboud can still resolve host names.
diff --git a/pythonmod/doc/examples/example4.rst b/pythonmod/doc/examples/example4.rst
index b665351e84ec..3382109903aa 100644
--- a/pythonmod/doc/examples/example4.rst
+++ b/pythonmod/doc/examples/example4.rst
@@ -1,15 +1,19 @@
DNS-based language dictionary
-===============================
+=============================
This example shows how to create a simple language dictionary based on **DNS**
-service within 15 minutes. The translation will be performed using TXT resource records.
+service within 15 minutes. The translation will be performed using TXT resource
+records.
Key parts
------------
+---------
Initialization
-~~~~~~~~~~~~~~~~~~~~~~~
-On **init()** module loads dictionary from a text file containing records in ``word [tab] translation`` format.
+~~~~~~~~~~~~~~
+
+On **init()** module loads dictionary from a text file containing records in
+``word [tab] translation`` format.
+
::
def init(id, cfg):
@@ -20,11 +24,14 @@ On **init()** module loads dictionary from a text file containing records in ``w
The suitable file can be found at http://slovnik.zcu.cz
DNS query and word lookup
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~
-Let's define the following format od DNS queries: ``word1[.]word2[.] ... wordN[.]{en,cs}[._dict_.cz.]``.
+Let's define the following format od DNS queries:
+``word1[.]word2[.] ... wordN[.]{en,cs}[._dict_.cz.]``.
Word lookup is done by simple ``dict`` lookup from broken DNS request.
-Query name is divided into a list of labels. This list is accessible as qname_list attribute.
+Query name is divided into a list of labels. This list is accessible as
+``qname_list`` attribute.
+
::
aword = ' '.join(qstate.qinfo.qname_list[0:-4]) #skip last four labels
@@ -37,35 +44,40 @@ Query name is divided into a list of labels. This list is accessible as qname_li
if (adict == "cs") and (aword in cz_dict):
words = cz_dict[aword] # CS -> EN
-In the first step, we get a string in the form: ``word1[space]word2[space]...word[space]``.
-In the second assignment, fourth label from the end is obtained. This label should contains *"cs"* or *"en"*.
-This label determines the direction of translation.
-
+In the first step, we get a string in the form:
+``word1[space]word2[space]...word[space]``.
+In the second assignment, fourth label from the end is obtained. This label
+should contains *"cs"* or *"en"*. This label determines the direction of
+translation.
Forming of a DNS reply
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~
DNS reply is formed only on valid match and added as TXT answer.
+
::
- msg = DNSMessage(qstate.qinfo.qname_str, RR_TYPE_TXT, RR_CLASS_IN, PKT_AA)
+ msg = DNSMessage(qstate.qinfo.qname_str, RR_TYPE_TXT, RR_CLASS_IN, PKT_AA)
- for w in words:
- msg.answer.append("%s 300 IN TXT \"%s\"" % (qstate.qinfo.qname_str, w.replace("\"", "\\\"")))
+ for w in words:
+ msg.answer.append("%s 300 IN TXT \"%s\"" % (qstate.qinfo.qname_str, w.replace("\"", "\\\"")))
- if not msg.set_return_msg(qstate):
- qstate.ext_state[id] = MODULE_ERROR
- return True
+ if not msg.set_return_msg(qstate):
+ qstate.ext_state[id] = MODULE_ERROR
+ return True
- qstate.return_rcode = RCODE_NOERROR
- qstate.ext_state[id] = MODULE_FINISHED
- return True
+ qstate.return_rcode = RCODE_NOERROR
+ qstate.ext_state[id] = MODULE_FINISHED
+ return True
-In the first step, a :class:`DNSMessage` instance is created for a given query *(type TXT)*.
+In the first step, a :class:`DNSMessage` instance is created for a given query
+*(type TXT)*.
The fourth argument specifies the flags *(authoritative answer)*.
-In the second step, we append TXT records containing the translation *(on the right side of RR)*.
+In the second step, we append TXT records containing the translation *(on the
+right side of RR)*.
Then, the response is finished and ``qstate.return_msg`` contains new response.
-If no error, the module sets :attr:`module_qstate.return_rcode` and :attr:`module_qstate.ext_state`.
+If no error, the module sets :attr:`module_qstate.return_rcode` and
+:attr:`module_qstate.ext_state`.
**Steps:**
@@ -82,80 +94,82 @@ Run the Unbound server:
In case you use own configuration file, don't forget to enable Python module::
- module-config: "validator python iterator"
+ module-config: "validator python iterator"
and use valid script path::
- python-script: "./examples/dict.py"
+ python-script: "./examples/dict.py"
The translation from english word *"a bar fly"* to Czech can be done by doing:
``>>>dig TXT @127.0.0.1 a.bar.fly.en._dict_.cz``
-::
+::
+
+ ; (1 server found)
+ ;; global options: printcmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48691
+ ;; flags: aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
+
+ ;; QUESTION SECTION:
+ ;a.bar.fly.en._dict_.cz. IN TXT
+
+ ;; ANSWER SECTION:
+ a.bar.fly.en._dict_.cz. 300 IN TXT "barov\253 povale\232"
+
+ ;; Query time: 5 msec
+ ;; SERVER: 127.0.0.1#53(127.0.0.1)
+ ;; WHEN: Mon Jan 01 17:44:18 2009
+ ;; MSG SIZE rcvd: 67
- ; (1 server found)
- ;; global options: printcmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48691
- ;; flags: aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
-
- ;; QUESTION SECTION:
- ;a.bar.fly.en._dict_.cz. IN TXT
-
- ;; ANSWER SECTION:
- a.bar.fly.en._dict_.cz. 300 IN TXT "barov\253 povale\232"
-
- ;; Query time: 5 msec
- ;; SERVER: 127.0.0.1#53(127.0.0.1)
- ;; WHEN: Mon Jan 01 17:44:18 2009
- ;; MSG SIZE rcvd: 67
-
``>>>dig TXT @127.0.0.1 nic.cs._dict_.cz``
+
::
- ; <<>> DiG 9.5.0-P2 <<>> TXT @127.0.0.1 nic.cs._dict_.cz
- ; (1 server found)
- ;; global options: printcmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58710
- ;; flags: aa rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0
-
- ;; QUESTION SECTION:
- ;nic.cs._dict_.cz. IN TXT
-
- ;; ANSWER SECTION:
- nic.cs._dict_.cz. 300 IN TXT "aught"
- nic.cs._dict_.cz. 300 IN TXT "naught"
- nic.cs._dict_.cz. 300 IN TXT "nihil"
- nic.cs._dict_.cz. 300 IN TXT "nix"
- nic.cs._dict_.cz. 300 IN TXT "nothing"
- nic.cs._dict_.cz. 300 IN TXT "zilch"
-
- ;; Query time: 0 msec
- ;; SERVER: 127.0.0.1#53(127.0.0.1)
- ;; WHEN: Mon Jan 01 17:45:39 2009
- ;; MSG SIZE rcvd: 143
-
-Proof that the unbound still works as resolver.
+ ; <<>> DiG 9.5.0-P2 <<>> TXT @127.0.0.1 nic.cs._dict_.cz
+ ; (1 server found)
+ ;; global options: printcmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58710
+ ;; flags: aa rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0
+
+ ;; QUESTION SECTION:
+ ;nic.cs._dict_.cz. IN TXT
+
+ ;; ANSWER SECTION:
+ nic.cs._dict_.cz. 300 IN TXT "aught"
+ nic.cs._dict_.cz. 300 IN TXT "naught"
+ nic.cs._dict_.cz. 300 IN TXT "nihil"
+ nic.cs._dict_.cz. 300 IN TXT "nix"
+ nic.cs._dict_.cz. 300 IN TXT "nothing"
+ nic.cs._dict_.cz. 300 IN TXT "zilch"
+
+ ;; Query time: 0 msec
+ ;; SERVER: 127.0.0.1#53(127.0.0.1)
+ ;; WHEN: Mon Jan 01 17:45:39 2009
+ ;; MSG SIZE rcvd: 143
+
+ Proof that the unbound still works as resolver.
``>>>dig A @127.0.0.1 www.nic.cz``
+
::
- ; (1 server found)
- ;; global options: printcmd
- ;; Got answer:
- ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19996
- ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5
-
- ;; QUESTION SECTION:
- ;www.nic.cz. IN A
-
- ;; ANSWER SECTION:
- www.nic.cz. 1662 IN A 217.31.205.50
-
- ;; AUTHORITY SECTION:
- ...
+ ; (1 server found)
+ ;; global options: printcmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19996
+ ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5
+
+ ;; QUESTION SECTION:
+ ;www.nic.cz. IN A
+
+ ;; ANSWER SECTION:
+ www.nic.cz. 1662 IN A 217.31.205.50
+
+ ;; AUTHORITY SECTION:
+ ...
Complete source code
--------------------
diff --git a/pythonmod/doc/examples/example5.rst b/pythonmod/doc/examples/example5.rst
new file mode 100644
index 000000000000..058fc331e4ba
--- /dev/null
+++ b/pythonmod/doc/examples/example5.rst
@@ -0,0 +1,191 @@
+EDNS options
+============
+
+This example shows how to interact with EDNS options.
+
+When quering unbound with the EDNS option ``65001`` and data ``0xc001`` we
+expect an answer with the same EDNS option code and data ``0xdeadbeef``.
+
+
+Key parts
+~~~~~~~~~
+
+This example relies on the following functionalities:
+
+
+Registering EDNS options
+------------------------
+
+By registering EDNS options we can tune unbound's behavior when encountering a
+query with a known EDNS option. The two available options are:
+
+- ``bypass_cache_stage``: If set to ``True`` unbound will not try to answer
+ from cache. Instead execution is passed to the modules
+- ``no_aggregation``: If set to ``True`` unbound will consider this query
+ unique and will not aggregate it with similar queries
+
+Both values default to ``False``.
+
+.. code-block:: python
+
+ if not register_edns_option(env, 65001, bypass_cache_stage=True,
+ no_aggregation=True):
+ log_info("python: Could not register EDNS option {}".format(65001))
+
+
+EDNS option lists
+-----------------
+
+EDNS option lists can be found in the :class:`module_qstate` class. There are
+four available lists in total:
+
+- :class:`module_qstate.edns_opts_front_in`: options that came from the client
+ side. **Should not** be changed
+- :class:`module_qstate.edns_opts_back_out`: options that will be sent to the
+ server side. Can be populated by edns literate modules
+- :class:`module_qstate.edns_opts_back_in`: options that came from the server
+ side. **Should not** be changed
+- :class:`module_qstate.edns_opts_front_out`: options that will be sent to the
+ client side. Can be populated by edns literate modules
+
+Each list element has the following members:
+
+- ``code``: the EDNS option code;
+- ``data``: the EDNS option data.
+
+
+Reading an EDNS option list
+...........................
+
+The lists' contents can be accessed in python by their ``_iter`` counterpart as
+an iterator:
+
+.. code-block:: python
+
+ if not edns_opt_list_is_empty(qstate.edns_opts_front_in):
+ for o in qstate.edns_opts_front_in_iter:
+ log_info("python: Code: {}, Data: '{}'".format(o.code,
+ "".join('{:02x}'.format(x) for x in o.data)))
+
+
+Writing to an EDNS option list
+..............................
+
+By appending to an EDNS option list we can add new EDNS options. The new
+element is going to be allocated in :class:`module_qstate.region`. The data
+**must** be represented with a python ``bytearray``:
+
+.. code-block:: python
+
+ b = bytearray.fromhex("deadbeef")
+ if not edns_opt_list_append(qstate.edns_opts_front_out,
+ o.code, b, qstate.region):
+ log_info("python: Could not append EDNS option {}".format(o.code))
+
+We can also remove an EDNS option code from an EDNS option list.
+
+.. code-block:: python
+
+ if not edns_opt_list_remove(edns_opt_list, code):
+ log_info("python: Option code {} was not found in the "
+ "list.".format(code))
+
+.. note:: All occurences of the EDNS option code will be removed from the list:
+
+
+Controlling other modules' cache behavior
+-----------------------------------------
+
+During the modules' operation, some modules may interact with the cache
+(e.g., iterator). This behavior can be controlled by using the following
+:class:`module_qstate` flags:
+
+- :class:`module_qstate.no_cache_lookup`: Modules *operating after* this module
+ will not lookup the cache for an answer
+- :class:`module_qstate.no_cache_store`: Modules *operating after* this module
+ will not store the response in the cache
+
+Both values default to ``0``.
+
+.. code-block:: python
+
+ def operate(id, event, qstate, qdata):
+ if (event == MODULE_EVENT_NEW) or (event == MODULE_EVENT_PASS):
+ # Detect if edns option code 56001 is present from the client side. If
+ # so turn on the flags for cache management.
+ if not edns_opt_list_is_empty(qstate.edns_opts_front_in):
+ log_info("python: searching for edns option code 65001 during NEW "
+ "or PASS event ")
+ for o in qstate.edns_opts_front_in_iter:
+ if o.code == 65001:
+ log_info("python: found edns option code 65001")
+ # Instruct other modules to not lookup for an
+ # answer in the cache.
+ qstate.no_cache_lookup = 1
+ log_info("python: enabled no_cache_lookup")
+
+ # Instruct other modules to not store the answer in
+ # the cache.
+ qstate.no_cache_store = 1
+ log_info("python: enabled no_cache_store")
+
+
+Testing
+~~~~~~~
+
+Run the Unbound server: ::
+
+ root@localhost$ unbound -dv -c ./test-edns.conf
+
+In case you use your own configuration file, don't forget to enable the Python
+module::
+
+ module-config: "validator python iterator"
+
+and use a valid script path::
+
+ python-script: "./examples/edns.py"
+
+Quering with EDNS option ``65001:0xc001``:
+
+::
+
+ root@localhost$ dig @localhost nlnetlabs.nl +ednsopt=65001:c001
+
+ ; <<>> DiG 9.10.3-P4-Ubuntu <<>> @localhost nlnetlabs.nl +ednsopt=65001:c001
+ ; (1 server found)
+ ;; global options: +cmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33450
+ ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 3
+
+ ;; OPT PSEUDOSECTION:
+ ; EDNS: version: 0, flags:; udp: 4096
+ ; OPT=65001: de ad be ef ("....")
+ ;; QUESTION SECTION:
+ ;nlnetlabs.nl. IN A
+
+ ;; ANSWER SECTION:
+ nlnetlabs.nl. 10200 IN A 185.49.140.10
+
+ ;; AUTHORITY SECTION:
+ nlnetlabs.nl. 10200 IN NS anyns.pch.net.
+ nlnetlabs.nl. 10200 IN NS ns.nlnetlabs.nl.
+ nlnetlabs.nl. 10200 IN NS ns-ext1.sidn.nl.
+ nlnetlabs.nl. 10200 IN NS sec2.authdns.ripe.net.
+
+ ;; ADDITIONAL SECTION:
+ ns.nlnetlabs.nl. 10200 IN AAAA 2a04:b900::8:0:0:60
+ ns.nlnetlabs.nl. 10200 IN A 185.49.140.60
+
+ ;; Query time: 10 msec
+ ;; SERVER: 127.0.0.1#53(127.0.0.1)
+ ;; WHEN: Mon Dec 05 14:50:56 CET 2016
+ ;; MSG SIZE rcvd: 212
+
+
+Complete source code
+~~~~~~~~~~~~~~~~~~~~
+
+.. literalinclude:: ../../examples/edns.py
+ :language: python
diff --git a/pythonmod/doc/examples/example6.rst b/pythonmod/doc/examples/example6.rst
new file mode 100644
index 000000000000..ce89aab99f40
--- /dev/null
+++ b/pythonmod/doc/examples/example6.rst
@@ -0,0 +1,299 @@
+Inplace callbacks
+=================
+
+This example shows how to register and use inplace callback functions. These
+functions are going to be called just before unbound replies back to a client.
+They can perform certain actions without interrupting unbound's execution flow
+(e.g. add/remove EDNS options, manipulate the reply).
+
+Two different scenarios will be shown:
+
+- If answering from cache and the client used EDNS option code ``65002`` we
+ will answer with the same code but with data ``0xdeadbeef``;
+- When answering with a SERVFAIL we also add an empty EDNS option code
+ ``65003``.
+
+
+Key parts
+~~~~~~~~~
+
+This example relies on the following functionalities:
+
+
+Registering inplace callback functions
+--------------------------------------
+
+There are four types of inplace callback functions:
+
+- `inplace callback reply functions`_
+- `inplace callback reply_cache functions`_
+- `inplace callback reply_local functions`_
+- `inplace callback reply_servfail functions`_
+
+
+Inplace callback reply functions
+................................
+
+Called when answering with a *resolved* query.
+
+The callback function's prototype is the following:
+
+.. code-block:: python
+
+ def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering with a resolved query.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. It contains the available opt_lists; It
+ SHOULD NOT be altered;
+ :param rep: reply_info struct;
+ :param rcode: return code for the query;
+ :param edns: edns_data to be sent to the client side. It SHOULD NOT be
+ altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+ """
+
+.. note:: The function's name is irrelevant.
+
+We can register such function as:
+
+.. code-block:: python
+
+ if not register_inplace_cb_reply(inplace_reply_callback, env):
+ log_info("python: Could not register inplace callback function.")
+
+
+Inplace callback reply_cache functions
+......................................
+
+Called when answering *from cache*.
+
+The callback function's prototype is the following:
+
+.. code-block:: python
+
+ def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering from the cache.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. None;
+ :param rep: reply_info struct;
+ :param rcode: return code for the query;
+ :param edns: edns_data sent from the client side. The list with the EDNS
+ options is accesible through edns.opt_list. It SHOULD NOT be
+ altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+ """
+
+.. note:: The function's name is irrelevant.
+
+We can register such function as:
+
+.. code-block:: python
+
+ if not register_inplace_cb_reply_cache(inplace_cache_callback, env):
+ log_info("python: Could not register inplace callback function.")
+
+
+Inplace callback reply_local functions
+......................................
+
+Called when answering with *local data* or a *Chaos(CH) reply*.
+
+The callback function's prototype is the following:
+
+.. code-block:: python
+
+ def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering from local data.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. None;
+ :param rep: reply_info struct;
+ :param rcode: return code for the query;
+ :param edns: edns_data sent from the client side. The list with the
+ EDNS options is accesible through edns.opt_list. It
+ SHOULD NOT be altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+ """
+
+.. note:: The function's name is irrelevant.
+
+We can register such function as:
+
+.. code-block:: python
+
+ if not register_inplace_cb_reply_local(inplace_local_callback, env):
+ log_info("python: Could not register inplace callback function.")
+
+
+Inplace callback reply_servfail functions
+.........................................
+
+Called when answering with *SERVFAIL*.
+
+The callback function's prototype is the following:
+
+.. code-block:: python
+
+ def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering with SERVFAIL.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. If not None the relevant opt_lists are
+ available here;
+ :param rep: reply_info struct. None;
+ :param rcode: return code for the query. LDNS_RCODE_SERVFAIL;
+ :param edns: edns_data to be sent to the client side. If qstate is None
+ edns.opt_list contains the EDNS options sent from the client
+ side. It SHOULD NOT be altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+ """
+
+.. note:: The function's name is irrelevant.
+
+We can register such function as:
+
+.. code-block:: python
+
+ if not register_inplace_cb_reply_servfail(inplace_servfail_callback, env):
+ log_info("python: Could not register inplace callback function.")
+
+
+Testing
+~~~~~~~
+
+Run the Unbound server: ::
+
+ root@localhost$ unbound -dv -c ./test-inplace_callbacks.conf
+
+In case you use your own configuration file, don't forget to enable the Python
+module::
+
+ module-config: "validator python iterator"
+
+and use a valid script path ::
+
+ python-script: "./examples/inplace_callbacks.py"
+
+On the first query for the nlnetlabs.nl A record we get no EDNS option back:
+
+::
+
+ root@localhost$ dig @localhost nlnetlabs.nl +ednsopt=65002
+
+ ; <<>> DiG 9.10.3-P4-Ubuntu <<>> @localhost nlnetlabs.nl +ednsopt=65002
+ ; (1 server found)
+ ;; global options: +cmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48057
+ ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 3
+
+ ;; OPT PSEUDOSECTION:
+ ; EDNS: version: 0, flags:; udp: 4096
+ ;; QUESTION SECTION:
+ ;nlnetlabs.nl. IN A
+
+ ;; ANSWER SECTION:
+ nlnetlabs.nl. 10200 IN A 185.49.140.10
+
+ ;; AUTHORITY SECTION:
+ nlnetlabs.nl. 10200 IN NS ns.nlnetlabs.nl.
+ nlnetlabs.nl. 10200 IN NS sec2.authdns.ripe.net.
+ nlnetlabs.nl. 10200 IN NS anyns.pch.net.
+ nlnetlabs.nl. 10200 IN NS ns-ext1.sidn.nl.
+
+ ;; ADDITIONAL SECTION:
+ ns.nlnetlabs.nl. 10200 IN A 185.49.140.60
+ ns.nlnetlabs.nl. 10200 IN AAAA 2a04:b900::8:0:0:60
+
+ ;; Query time: 813 msec
+ ;; SERVER: 127.0.0.1#53(127.0.0.1)
+ ;; WHEN: Mon Dec 05 16:15:32 CET 2016
+ ;; MSG SIZE rcvd: 204
+
+When we issue the same query again we get a cached response and the expected
+``65002: 0xdeadbeef`` EDNS option:
+
+::
+
+ root@localhost$ dig @localhost nlnetlabs.nl +ednsopt=65002
+
+ ; <<>> DiG 9.10.3-P4-Ubuntu <<>> @localhost nlnetlabs.nl +ednsopt=65002
+ ; (1 server found)
+ ;; global options: +cmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26489
+ ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 3
+
+ ;; OPT PSEUDOSECTION:
+ ; EDNS: version: 0, flags:; udp: 4096
+ ; OPT=65002: de ad be ef ("....")
+ ;; QUESTION SECTION:
+ ;nlnetlabs.nl. IN A
+
+ ;; ANSWER SECTION:
+ nlnetlabs.nl. 10197 IN A 185.49.140.10
+
+ ;; AUTHORITY SECTION:
+ nlnetlabs.nl. 10197 IN NS ns.nlnetlabs.nl.
+ nlnetlabs.nl. 10197 IN NS sec2.authdns.ripe.net.
+ nlnetlabs.nl. 10197 IN NS anyns.pch.net.
+ nlnetlabs.nl. 10197 IN NS ns-ext1.sidn.nl.
+
+ ;; ADDITIONAL SECTION:
+ ns.nlnetlabs.nl. 10197 IN AAAA 2a04:b900::8:0:0:60
+ ns.nlnetlabs.nl. 10197 IN A 185.49.140.60
+
+ ;; Query time: 0 msec
+ ;; SERVER: 127.0.0.1#53(127.0.0.1)
+ ;; WHEN: Mon Dec 05 16:50:04 CET 2016
+ ;; MSG SIZE rcvd: 212
+
+By issuing a query for a bogus domain unbound replies with SERVFAIL and an
+empty EDNS option code ``65003``. *For this example to work unbound needs to be
+validating*:
+
+::
+
+ root@localhost$ dig @localhost bogus.nlnetlabs.nl txt
+
+ ; <<>> DiG 9.10.3-P4-Ubuntu <<>> @localhost bogus.nlnetlabs.nl txt
+ ; (1 server found)
+ ;; global options: +cmd
+ ;; Got answer:
+ ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 19865
+ ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
+
+ ;; OPT PSEUDOSECTION:
+ ; EDNS: version: 0, flags:; udp: 4096
+ ; OPT=65003
+ ;; QUESTION SECTION:
+ ;bogus.nlnetlabs.nl. IN TXT
+
+ ;; Query time: 11 msec
+ ;; SERVER: 127.0.0.1#53(127.0.0.1)
+ ;; WHEN: Mon Dec 05 17:06:01 CET 2016
+ ;; MSG SIZE rcvd: 51
+
+
+Complete source code
+~~~~~~~~~~~~~~~~~~~~
+.. literalinclude:: ../../examples/inplace_callbacks.py
+ :language: python
diff --git a/pythonmod/doc/examples/index.rst b/pythonmod/doc/examples/index.rst
index 6c50225810ef..93d9b8e1e133 100644
--- a/pythonmod/doc/examples/index.rst
+++ b/pythonmod/doc/examples/index.rst
@@ -1,15 +1,16 @@
.. _Tutorials:
-==============================
-Tutorials
-==============================
+Examples
+========
-Here you can find several tutorials which clarify the usage and capabilities of Unbound scriptable interface.
+Here you can find several tutorials which clarify the usage and capabilities of
+the Unbound scriptable interface.
-`Tutorials`
+Tutorials
+---------
.. toctree::
- :maxdepth: 2
- :glob:
+ :maxdepth: 2
+ :glob:
- example*
+ example*
diff --git a/pythonmod/doc/install.rst b/pythonmod/doc/install.rst
index 991e2b4becf9..b8d0b9fa60d1 100644
--- a/pythonmod/doc/install.rst
+++ b/pythonmod/doc/install.rst
@@ -1,39 +1,44 @@
Installation
-===================================
+============
-**Prerequisites**
+Prerequisites
+-------------
Python 2.4 or higher, SWIG 1.3 or higher, GNU make
-**Download**
+Download
+--------
You can download the source codes `here`_.
The latest release is 1.1.1, Jan 15, 2009.
.. _here: unbound-1.1.1-py.tar.gz
-**Compiling**
+Compiling
+---------
After downloading, you can compile the Unbound library by doing::
- > tar -xzf unbound-1.1.1-py.tar.gz
- > cd unbound-1.1.1
- > ./configure --with-pythonmodule
- > make
+ > tar -xzf unbound-1.1.1-py.tar.gz
+ > cd unbound-1.1.1
+ > ./configure --with-pythonmodule
+ > make
You need GNU make to compile sources.
SWIG and Python devel libraries to compile extension module.
-**Testing**
+Testing
+-------
If the compilation is successful, you can test the extension module by::
- > cd pythonmod
- > make sudo # or "make test" or "make suexec"
+ > cd pythonmod
+ > make sudo # or "make test" or "make suexec"
-This will start unbound server with language dictionary service (see :ref:`Tutorials`).
+This will start unbound server with language dictionary service
+(see :ref:`Tutorials`).
In order to test this service, type::
-
+
> dig TXT @127.0.0.1 aught.en._dict_.cz
Dig should print this message (czech equivalent of aught)::
@@ -44,16 +49,17 @@ Dig should print this message (czech equivalent of aught)::
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30085
;; flags: aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
-
+
;; QUESTION SECTION:
- ;aught.en._dict_.cz. IN TXT
-
+ ;aught.en._dict_.cz. IN TXT
+
;; ANSWER SECTION:
- aught.en._dict_.cz. 300 IN TXT "nic"
-
+ aught.en._dict_.cz. 300 IN TXT "nic"
+
;; Query time: 11 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jan 10 16:45:58 2009
;; MSG SIZE rcvd: 52
-The ``pythonmod/examples`` directory contains simple applications written in Python.
+The ``pythonmod/examples`` directory contains simple applications written in
+Python.
diff --git a/pythonmod/doc/modules/functions.rst b/pythonmod/doc/modules/functions.rst
index 45a469fec04e..627d44922477 100644
--- a/pythonmod/doc/modules/functions.rst
+++ b/pythonmod/doc/modules/functions.rst
@@ -7,25 +7,26 @@ Network
.. function:: ntohs(netshort)
This subroutine converts values between the host and network byte order.
- Specifically, **ntohs()** converts 16-bit quantities from network byte order to host byte order.
-
+ Specifically, **ntohs()** converts 16-bit quantities from network byte order
+ to host byte order.
+
:param netshort: 16-bit short addr
:rtype: converted addr
-
-
+
+
Cache
-----
.. function:: storeQueryInCache(qstate, qinfo, msgrep, is_referral)
Store pending query in local cache.
-
+
:param qstate: :class:`module_qstate`
:param qinfo: :class:`query_info`
:param msgrep: :class:`reply_info`
:param is_referal: integer
:rtype: boolean
-
+
.. function:: invalidateQueryInCache(qstate, qinfo)
Invalidate record in local cache.
@@ -34,6 +35,111 @@ Cache
:param qinfo: :class:`query_info`
+EDNS options
+------------
+
+.. function:: register_edns_option(env, code, bypass_cache_stage=False, no_aggregation=False)
+
+ Register EDNS option code.
+
+ :param env: :class:`module_env`
+ :param code: option code(integer)
+ :param bypass_cache_stage: whether to bypass the cache response stage
+ :param no_aggregation: whether this query should be unique
+ :return: ``1`` if successful, ``0`` otherwise
+ :rtype: integer
+
+.. function:: edns_opt_list_find(list, code)
+
+ Find the EDNS option code in the EDNS option list.
+
+ :param list: linked list of :class:`edns_option`
+ :param code: option code (integer)
+ :return: the edns option if found or None
+ :rtype: :class:`edns_option` or None
+
+.. function:: edns_opt_list_remove(list, code);
+
+ Remove an ENDS option code from the list.
+ .. note:: All :class:`edns_option` with the code will be removed
+
+ :param list: linked list of :class:`edns_option`
+ :param code: option code (integer)
+ :return: ``1`` if at least one :class:`edns_option` was removed, ``0`` otherwise
+ :rtype: integer
+
+.. function:: edns_opt_list_append(list, code, data, region)
+
+ Append given EDNS option code with data to the list.
+
+ :param list: linked list of :class:`edns_option`
+ :param code: option code (integer)
+ :param data: EDNS data. **Must** be a :class:`bytearray`
+ :param region: :class:`regional`
+
+.. function:: edns_opt_list_is_empty(list)
+
+ Check if an EDNS option list is empty.
+
+ :param list: linked list of :class:`edns_option`
+ :return: ``1`` if list is empty, ``0`` otherwise
+ :rtype: integer
+
+
+Inplace callbacks
+-----------------
+
+.. function:: inplace_cb_reply(qinfo, qstate, rep, rcode, edns, opt_list_out, region)
+
+ Function prototype for callback functions used in
+ `register_inplace_cb_reply`_, `register_inplace_cb_reply_cache`_,
+ `register_inplace_cb_reply_local` and `register_inplace_cb_reply_servfail`.
+
+ :param qinfo: :class:`query_info`
+ :param qstate: :class:`module_qstate`
+ :param rep: :class:`reply_info`
+ :param rcode: return code (integer), check ``RCODE_`` constants.
+ :param edns: :class:`edns_data`
+ :param opt_list_out: :class:`edns_option`. EDNS option list to append options to.
+ :param region: :class:`regional`
+
+.. function:: register_inplace_cb_reply(py_cb, env)
+
+ Register py_cb as an inplace reply callback function.
+
+ :param py_cb: Python function that follows `inplace_cb_reply`_'s prototype. **Must** be callable.
+ :param env: :class:`module_env`
+ :return: True on success, False otherwise
+ :rtype: boolean
+
+.. function:: register_inplace_cb_reply_cache(py_cb, env)
+
+ Register py_cb as an inplace reply_cache callback function.
+
+ :param py_cb: Python function that follows `inplace_cb_reply`_'s prototype. **Must** be callable.
+ :param env: :class:`module_env`
+ :return: True on success, False otherwise
+ :rtype: boolean
+
+.. function:: register_inplace_cb_reply_local(py_cb, env)
+
+ Register py_cb as an inplace reply_local callback function.
+
+ :param py_cb: Python function that follows `inplace_cb_reply`_'s prototype. **Must** be callable.
+ :param env: :class:`module_env`
+ :return: True on success, False otherwise
+ :rtype: boolean
+
+.. function:: register_inplace_cb_reply_servfail(py_cb, env)
+
+ Register py_cb as an inplace reply_servfail callback function.
+
+ :param py_cb: Python function that follows `inplace_cb_reply`_'s prototype. **Must** be callable.
+ :param env: :class:`module_env`
+ :return: True on success, False otherwise
+ :rtype: boolean
+
+
Logging
-------
@@ -71,50 +177,51 @@ Logging
:param msg: string desc to accompany the hexdump.
:param data: data to dump in hex format.
:param length: length of data.
-
+
.. function:: log_dns_msg(str, qinfo, reply)
Log DNS message.
-
+
:param str: string message
:param qinfo: :class:`query_info`
:param reply: :class:`reply_info`
-
+
.. function:: log_query_info(verbosity_value, str, qinf)
Log query information.
-
+
:param verbosity_value: see constants
:param str: string message
:param qinf: :class:`query_info`
-
+
.. function:: regional_log_stats(r)
Log regional statistics.
-
+
:param r: :class:`regional`
+
Debugging
---------
.. function:: strextstate(module_ext_state)
Debug utility, module external qstate to string.
-
+
:param module_ext_state: the state value.
:rtype: descriptive string.
.. function:: strmodulevent(module_event)
Debug utility, module event to string.
-
+
:param module_event: the module event value.
:rtype: descriptive string.
-
+
.. function:: ldns_rr_type2str(atype)
Convert RR type to string.
-
+
.. function:: ldns_rr_class2str(aclass)
Convert RR class to string.
diff --git a/pythonmod/doc/modules/struct.rst b/pythonmod/doc/modules/struct.rst
index 669f36d91ea2..3af5d8a48c01 100644
--- a/pythonmod/doc/modules/struct.rst
+++ b/pythonmod/doc/modules/struct.rst
@@ -6,55 +6,94 @@ module_qstate
.. class:: module_qstate
- Module state, per query.
-
- This class provides these data attributes:
-
- .. attribute:: qinfo
-
- (:class:`query_info`) Informations about query being answered. Name, RR type, RR class.
-
- .. attribute:: query_flags
-
- (uint16) Flags for query. See QF_BIT\_ predefined constants.
-
- .. attribute:: is_priming
-
- If this is a (stub or root) priming query (with hints).
-
- .. attribute:: reply
-
- comm_reply contains server replies.
-
- .. attribute:: return_msg
-
- (:class:`dns_msg`) The reply message, with message for client and calling module (read-only attribute).
- Note that if you want to create of modify return_msg you should use :class:`DNSMessage`.
-
- .. attribute:: return_rcode
-
- The rcode, in case of error, instead of a reply message. Determines whether the return_msg contains reply.
-
- .. attribute:: region
-
- Region for this query. Cleared when query process finishes.
-
- .. attribute:: curmod
-
- Which module is executing.
-
- .. attribute:: ext_state[]
-
- Module states.
-
- .. attribute:: env
-
- Environment for this query.
-
- .. attribute:: mesh_info
-
- Mesh related information for this query.
+ Module state, per query.
+
+ This class provides these data attributes:
+
+ .. attribute:: qinfo
+
+ (:class:`query_info`) Informations about query being answered. Name, RR type, RR class.
+
+ .. attribute:: query_flags
+
+ (uint16) Flags for query. See QF_BIT\_ predefined constants.
+
+ .. attribute:: is_priming
+
+ If this is a (stub or root) priming query (with hints).
+
+ .. attribute:: reply
+
+ comm_reply contains server replies.
+
+ .. attribute:: return_msg
+
+ (:class:`dns_msg`) The reply message, with message for client and calling module (read-only attribute).
+ Note that if you want to create of modify return_msg you should use :class:`DNSMessage`.
+
+ .. attribute:: return_rcode
+
+ The rcode, in case of error, instead of a reply message. Determines whether the return_msg contains reply.
+
+ .. attribute:: region
+
+ Region for this query. Cleared when query process finishes.
+
+ .. attribute:: curmod
+
+ Which module is executing.
+
+ .. attribute:: ext_state[]
+
+ Module states.
+
+ .. attribute:: env
+
+ Environment for this query.
+ .. attribute:: mesh_info
+
+ Mesh related information for this query.
+
+ .. attribute:: edns_opts_front_in
+
+ Incoming EDNS options from the front end.
+
+ .. attribute:: edns_opts_front_in_iter
+
+ Iterator for `edns_opts_front_in`.
+
+ .. attribute:: edns_opts_back_out
+
+ Outgoing EDNS options to the back end.
+
+ .. attribute:: edns_opts_back_out_iter
+
+ Iterator for `edns_opts_back_out`.
+
+ .. attribute:: edns_opts_back_in
+
+ Incoming EDNS options from the back end.
+
+ .. attribute:: edns_opts_back_in_iter
+
+ Iterator for `ends_opts_back_in`.
+
+ .. attribute:: edns_opts_front_out
+
+ Outgoing EDNS options to the front end.
+
+ .. attribute:: edns_opts_front_out_iter
+
+ Iterator for `edns_opts_front_out`.
+
+ .. attribute:: no_cache_lookup
+
+ Flag to indicate whether modules should answer from the cache.
+
+ .. attribute:: no_cache_store
+
+ Flag to indicate whether modules should store answer in the cache.
query_info
----------------
@@ -94,7 +133,57 @@ query_info
.. attribute:: qclass_str
The ``qclass`` in display presentation format (string).
-
+
+edns_data
+---------
+
+.. class:: edns_data
+
+ This class represents the EDNS information parsed/encoded from/to a packet. It provides these data attributes:
+
+ .. attribute:: edns_present
+
+ If EDNS OPT record is present.
+
+ .. attribute:: ext_rcode
+
+ Extended RCODE.
+
+ .. attribute:: edns_version
+
+ The EDNS version number.
+
+ .. attribute:: bits
+
+ The EDNS bits field from ttl (host order): Z.
+
+ .. attribute:: udp_size
+
+ UDP reassembly size.
+
+ .. attribute:: opt_list
+
+ The EDNS option list.
+
+ .. attribute:: opt_list_iter
+
+ Iterator for `opt_list`.
+
+edns_option
+-----------
+
+.. class:: edns_option
+
+ This class represents an EDNS option (code, data) found in EDNS option lists. It provides these data attributes:
+
+ .. attribute:: code
+
+ The EDNS option code.
+
+ .. attribute:: data
+
+ The EDNS option data.
+
reply_info
--------------------
diff --git a/pythonmod/examples/edns.py b/pythonmod/examples/edns.py
new file mode 100644
index 000000000000..3fae1c652af8
--- /dev/null
+++ b/pythonmod/examples/edns.py
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+'''
+ edns.py: python module showcasing EDNS option functionality.
+
+ Copyright (c) 2016, NLnet Labs.
+
+ This software is open source.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of the organization nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+'''
+#Try:
+# - dig @localhost nlnetlabs.nl +ednsopt=65001:c001
+# This query will always reach the modules stage as EDNS option 65001 is
+# registered to bypass the cache response stage. It will also be handled
+# as a unique query because of the no_aggregation flag. This means that
+# it will not be aggregated with other queries for the same qinfo.
+# For demonstration purposes when option 65001 with hexdata 'c001' is
+# sent from the client side this module will reply with the same code and
+# data 'deadbeef'.
+
+# Useful functions:
+# edns_opt_list_is_empty(edns_opt_list):
+# Check if the option list is empty.
+# Return True if empty, False otherwise.
+#
+# edns_opt_list_append(edns_opt_list, code, data_bytearray, region):
+# Append the EDNS option with code and data_bytearray to the given
+# edns_opt_list.
+# NOTE: data_bytearray MUST be a Python bytearray.
+# Return True on success, False on failure.
+#
+# edns_opt_list_remove(edns_opt_list, code):
+# Remove all occurences of the given EDNS option code from the
+# edns_opt_list.
+# Return True when at least one EDNS option was removed, False otherwise.
+#
+# register_edns_option(env, code, bypass_cache_stage=True,
+# no_aggregation=True):
+# Register EDNS option code as a known EDNS option.
+# bypass_cache_stage:
+# bypasses answering from cache and allows the query to reach the
+# modules for further EDNS handling.
+# no_aggregation:
+# makes every query with the said EDNS option code unique.
+# Return True on success, False on failure.
+#
+# Examples on how to use the functions are given in this file.
+
+
+def init_standard(id, env):
+ """New version of the init function.
+ The function's signature is the same as the C counterpart and allows for
+ extra functionality during init.
+ ..note:: This function is preferred by unbound over the old init function.
+ ..note:: The previously accesible configuration options can now be found in
+ env.cgf.
+ """
+ log_info("python: inited script {}".format(env.cfg.python_script))
+
+ # Register EDNS option 65001 as a known EDNS option.
+ if not register_edns_option(env, 65001, bypass_cache_stage=True,
+ no_aggregation=True):
+ return False
+
+ return True
+
+
+def init(id, cfg):
+ """Previous version init function.
+ ..note:: This function is still supported for backwards compatibility when
+ the init_standard function is missing. When init_standard is
+ present this function SHOULD be ommited to avoid confusion to the
+ reader.
+ """
+ return True
+
+
+def deinit(id): return True
+
+
+def inform_super(id, qstate, superqstate, qdata): return True
+
+
+def operate(id, event, qstate, qdata):
+ if (event == MODULE_EVENT_NEW) or (event == MODULE_EVENT_PASS):
+ # Detect if EDNS option code 56001 is present from the client side. If
+ # so turn on the flags for cache management.
+ if not edns_opt_list_is_empty(qstate.edns_opts_front_in):
+ log_info("python: searching for EDNS option code 65001 during NEW "
+ "or PASS event ")
+ for o in qstate.edns_opts_front_in_iter:
+ if o.code == 65001:
+ log_info("python: found EDNS option code 65001")
+ # Instruct other modules to not lookup for an
+ # answer in the cache.
+ qstate.no_cache_lookup = 1
+ log_info("python: enabled no_cache_lookup")
+
+ # Instruct other modules to not store the answer in
+ # the cache.
+ qstate.no_cache_store = 1
+ log_info("python: enabled no_cache_store")
+
+ #Pass on the query
+ qstate.ext_state[id] = MODULE_WAIT_MODULE
+ return True
+
+ elif event == MODULE_EVENT_MODDONE:
+ # If the client sent EDNS option code 65001 and data 'c001' reply
+ # with the same code and data 'deadbeef'.
+ if not edns_opt_list_is_empty(qstate.edns_opts_front_in):
+ log_info("python: searching for EDNS option code 65001 during "
+ "MODDONE")
+ for o in qstate.edns_opts_front_in_iter:
+ if o.code == 65001 and o.data == bytearray.fromhex("c001"):
+ b = bytearray.fromhex("deadbeef")
+ if not edns_opt_list_append(qstate.edns_opts_front_out,
+ o.code, b, qstate.region):
+ qstate.ext_state[id] = MODULE_ERROR
+ return False
+
+ # List every EDNS option in all lists.
+ # The available lists are:
+ # - qstate.edns_opts_front_in: EDNS options that came from the
+ # client side. SHOULD NOT be changed;
+ #
+ # - qstate.edns_opts_back_out: EDNS options that will be sent to the
+ # server side. Can be populated by
+ # EDNS literate modules;
+ #
+ # - qstate.edns_opts_back_in: EDNS options that came from the
+ # server side. SHOULD NOT be changed;
+ #
+ # - qstate.edns_opts_front_out: EDNS options that will be sent to the
+ # client side. Can be populated by
+ # EDNS literate modules;
+ #
+ # The lists' contents can be accessed in python by their _iter
+ # counterpart as an iterator.
+ if not edns_opt_list_is_empty(qstate.edns_opts_front_in):
+ log_info("python: EDNS options in edns_opts_front_in:")
+ for o in qstate.edns_opts_front_in_iter:
+ log_info("python: Code: {}, Data: '{}'".format(o.code,
+ "".join('{:02x}'.format(x) for x in o.data)))
+
+ if not edns_opt_list_is_empty(qstate.edns_opts_back_out):
+ log_info("python: EDNS options in edns_opts_back_out:")
+ for o in qstate.edns_opts_back_out_iter:
+ log_info("python: Code: {}, Data: '{}'".format(o.code,
+ "".join('{:02x}'.format(x) for x in o.data)))
+
+ if not edns_opt_list_is_empty(qstate.edns_opts_back_in):
+ log_info("python: EDNS options in edns_opts_back_in:")
+ for o in qstate.edns_opts_back_in_iter:
+ log_info("python: Code: {}, Data: '{}'".format(o.code,
+ "".join('{:02x}'.format(x) for x in o.data)))
+
+ if not edns_opt_list_is_empty(qstate.edns_opts_front_out):
+ log_info("python: EDNS options in edns_opts_front_out:")
+ for o in qstate.edns_opts_front_out_iter:
+ log_info("python: Code: {}, Data: '{}'".format(o.code,
+ "".join('{:02x}'.format(x) for x in o.data)))
+
+ qstate.ext_state[id] = MODULE_FINISHED
+ return True
+
+ log_err("pythonmod: Unknown event")
+ qstate.ext_state[id] = MODULE_ERROR
+ return True
diff --git a/pythonmod/examples/inplace_callbacks.py b/pythonmod/examples/inplace_callbacks.py
new file mode 100644
index 000000000000..e87614a12470
--- /dev/null
+++ b/pythonmod/examples/inplace_callbacks.py
@@ -0,0 +1,244 @@
+# -*- coding: utf-8 -*-
+'''
+ inplace_callbacks.py: python module showcasing inplace callback function
+ registration and functionality.
+
+ Copyright (c) 2016, NLnet Labs.
+
+ This software is open source.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of the organization nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+'''
+#Try:
+# - dig @localhost nlnetlabs.nl +ednsopt=65002:
+# This query *could* be answered from cache. If so, unbound will reply
+# with the same EDNS option 65002, but with hexdata 'deadbeef' as data.
+#
+# - dig @localhost bogus.nlnetlabs.nl txt:
+# This query returns SERVFAIL as the txt record of bogus.nlnetlabs.nl is
+# intentionally bogus. The reply will contain an empty EDNS option
+# with option code 65003.
+# (unbound needs to be validating for this example to work)
+
+# Useful functions:
+# register_inplace_cb_reply(inplace_reply_callback, env):
+# Register the reply_callback function as an inplace callback function
+# when answering with a resolved query.
+# Return True on success, False on failure.
+#
+# register_inplace_cb_reply_cache(inplace_reply_cache_callback, env):
+# Register the reply_cache_callback function as an inplace callback
+# function when answering from cache.
+# Return True on success, False on failure.
+#
+# register_inplace_cb_reply_local(inplace_reply_local_callback, env):
+# Register the reply_local_callback function as an inplace callback
+# function when answering from local data or chaos reply.
+# Return True on success, False on failure.
+#
+# register_inplace_cb_reply_servfail(inplace_reply_servfail_callback, env):
+# Register the reply_servfail_callback function as an inplace callback
+# function when answering with servfail.
+# Return True on success, False on failure.
+#
+# Examples on how to use the functions are given in this file.
+
+
+def inplace_reply_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering with a resolved query.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. It contains the available opt_lists; It
+ SHOULD NOT be altered;
+ :param rep: reply_info struct;
+ :param rcode: return code for the query;
+ :param edns: edns_data to be sent to the client side. It SHOULD NOT be
+ altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+ """
+ log_info("python: called back while replying.")
+ return True
+
+
+def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering from the cache.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. None;
+ :param rep: reply_info struct;
+ :param rcode: return code for the query;
+ :param edns: edns_data sent from the client side. The list with the EDNS
+ options is accesible through edns.opt_list. It SHOULD NOT be
+ altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+
+ For demostration purposes we want to see if EDNS option 65002 is present
+ and reply with a new value.
+ """
+ log_info("python: called back while answering from cache.")
+ # Inspect the incoming EDNS options.
+ if not edns_opt_list_is_empty(edns.opt_list):
+ log_info("python: available EDNS options:")
+ for o in edns.opt_list_iter:
+ log_info("python: Code: {}, Data: '{}'".format(o.code,
+ "".join('{:02x}'.format(x) for x in o.data)))
+ if o.code == 65002:
+ log_info("python: *found option code 65002*")
+
+ # add to opt_list
+ # Data MUST be represented in a bytearray.
+ b = bytearray.fromhex("deadbeef")
+ if edns_opt_list_append(opt_list_out, o.code, b, region):
+ log_info("python: *added new option code 65002*")
+ else:
+ log_info("python: *failed to add new option code 65002*")
+ return False
+ break
+
+ return True
+
+
+def inplace_local_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering from local data.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. None;
+ :param rep: reply_info struct;
+ :param rcode: return code for the query;
+ :param edns: edns_data sent from the client side. The list with the
+ EDNS options is accesible through edns.opt_list. It
+ SHOULD NOT be altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+ """
+ log_info("python: called back while replying with local data or chaos"
+ " reply.")
+ return True
+
+
+def inplace_servfail_callback(qinfo, qstate, rep, rcode, edns, opt_list_out,
+ region):
+ """Function that will be registered as an inplace callback function.
+ It will be called when answering with SERVFAIL.
+ :param qinfo: query_info struct;
+ :param qstate: module qstate. If not None the relevant opt_lists are
+ available here;
+ :param rep: reply_info struct. None;
+ :param rcode: return code for the query. LDNS_RCODE_SERVFAIL;
+ :param edns: edns_data to be sent to the client side. If qstate is None
+ edns.opt_list contains the EDNS options sent from the client
+ side. It SHOULD NOT be altered;
+ :param opt_list_out: the list with the EDNS options that will be sent as a
+ reply. It can be populated with EDNS options;
+ :param region: region to allocate temporary data. Needs to be used when we
+ want to append a new option to opt_list_out.
+ :return: True on success, False on failure.
+
+ For demostration purposes we want to reply with an empty EDNS code '65003'.
+ """
+ log_info("python: called back while servfail.")
+ b = bytearray.fromhex("")
+ edns_opt_list_append(opt_list_out, 65003, b, region)
+ return True
+
+
+def init_standard(id, env):
+ """New version of the init function.
+ The function's signature is the same as the C counterpart and allows for
+ extra functionality during init.
+ ..note:: This function is preferred by unbound over the old init function.
+ ..note:: The previously accesible configuration options can now be found in
+ env.cgf.
+ """
+ log_info("python: inited script {}".format(env.cfg.python_script))
+
+ # Register the inplace_reply_callback function as an inplace callback
+ # function when answering a resolved query.
+ if not register_inplace_cb_reply(inplace_reply_callback, env):
+ return False
+
+ # Register the inplace_cache_callback function as an inplace callback
+ # function when answering from cache.
+ if not register_inplace_cb_reply_cache(inplace_cache_callback, env):
+ return False
+
+ # Register the inplace_local_callback function as an inplace callback
+ # function when answering from local data.
+ if not register_inplace_cb_reply_local(inplace_local_callback, env):
+ return False
+
+ # Register the inplace_servfail_callback function as an inplace callback
+ # function when answering with SERVFAIL.
+ if not register_inplace_cb_reply_servfail(inplace_servfail_callback, env):
+ return False
+
+ return True
+
+
+def init(id, cfg):
+ """Previous version init function.
+ ..note:: This function is still supported for backwards compatibility when
+ the init_standard function is missing. When init_standard is
+ present this function SHOULD be ommited to avoid confusion to the
+ reader.
+ """
+ return True
+
+
+def deinit(id): return True
+
+
+def inform_super(id, qstate, superqstate, qdata): return True
+
+
+def operate(id, event, qstate, qdata):
+ if (event == MODULE_EVENT_NEW) or (event == MODULE_EVENT_PASS):
+ qstate.ext_state[id] = MODULE_WAIT_MODULE
+ return True
+
+ elif event == MODULE_EVENT_MODDONE:
+ qstate.ext_state[id] = MODULE_FINISHED
+ return True
+
+ log_err("pythonmod: Unknown event")
+ qstate.ext_state[id] = MODULE_ERROR
+ return True
diff --git a/pythonmod/interface.i b/pythonmod/interface.i
index 4b20c6ec135c..89d138486606 100644
--- a/pythonmod/interface.i
+++ b/pythonmod/interface.i
@@ -1,7 +1,6 @@
/*
* interface.i: unbound python module
*/
-
%module unboundmodule
%{
/**
@@ -34,10 +33,10 @@
#include "sldns/pkthdr.h"
%}
-%include "stdint.i" // uint_16_t can be known type now
+%include "stdint.i" /* uint_16_t can be known type now */
%inline %{
- //converts [len][data][len][data][0] string to a List of labels (PyBytes)
+ /* converts [len][data][len][data][0] string to a List of labels (PyBytes) */
PyObject* GetNameAsLabelList(const char* name, int len) {
PyObject* list;
int cnt=0, i;
@@ -202,13 +201,16 @@ struct packed_rrset_key {
char* dname;
size_t dname_len;
uint32_t flags;
- uint16_t type; //rrset type in network format
- uint16_t rrset_class; //rrset class in network format
+ uint16_t type; /* rrset type in network format */
+ uint16_t rrset_class; /* rrset class in network format */
%mutable;
};
-//This subroutine converts values between the host and network byte order.
-//Specifically, ntohs() converts 16-bit quantities from network byte order to host byte order.
+/**
+ * This subroutine converts values between the host and network byte order.
+ * Specifically, ntohs() converts 16-bit quantities from network byte order to
+ * host byte order.
+ */
uint16_t ntohs(uint16_t netshort);
%inline %{
@@ -269,17 +271,24 @@ struct lruhash_entry {
%ignore packed_rrset_data::rr_data;
struct packed_rrset_data {
- uint32_t ttl; //TTL (in seconds like time())
+ /* TTL (in seconds like time()) */
+ uint32_t ttl;
- size_t count; //number of rrs
- size_t rrsig_count; //number of rrsigs
+ /* number of rrs */
+ size_t count;
+ /* number of rrsigs */
+ size_t rrsig_count;
enum rrset_trust trust;
enum sec_status security;
- size_t* rr_len; //length of every rr's rdata
- uint32_t *rr_ttl; //ttl of every rr
- uint8_t** rr_data; //array of pointers to every rr's rdata; The rr_data[i] rdata is stored in uncompressed wireformat.
+ /* length of every rr's rdata */
+ size_t* rr_len;
+ /* ttl of every rr */
+ uint32_t *rr_ttl;
+ /* array of pointers to every rr's rdata. The rr_data[i] rdata is stored in
+ * uncompressed wireformat. */
+ uint8_t** rr_data;
};
%pythoncode %{
@@ -359,10 +368,10 @@ struct reply_info {
size_t an_numrrsets;
size_t ns_numrrsets;
size_t ar_numrrsets;
- size_t rrset_count; // an_numrrsets + ns_numrrsets + ar_numrrsets
+ size_t rrset_count; /* an_numrrsets + ns_numrrsets + ar_numrrsets */
struct ub_packed_rrset_key** rrsets;
- struct rrset_ref ref[1]; //?
+ struct rrset_ref ref[1]; /* ? */
};
struct rrset_ref {
@@ -396,11 +405,11 @@ struct dns_msg {
struct rrset_ref* _rrset_ref_get(struct reply_info* r, int idx) {
if ((r != NULL) && (idx >= 0) && ((size_t)idx < r->rrset_count)) {
-//printf("_rrset_ref_get: %lX key:%lX\n", r->ref + idx, r->ref[idx].key);
+/* printf("_rrset_ref_get: %lX key:%lX\n", r->ref + idx, r->ref[idx].key); */
return &(r->ref[idx]);
-// return &(r->ref[idx]);
+/* return &(r->ref[idx]); */
}
-//printf("_rrset_ref_get: NULL\n");
+/* printf("_rrset_ref_get: NULL\n"); */
return NULL;
}
%}
@@ -479,30 +488,166 @@ struct comm_reply {
if _newclass:family = _swig_property(_family_get)
%}
}
+
+/* ************************************************************************************ *
+ Structure edns_option
+ * ************************************************************************************ */
+/* Rename the members to follow the python convention of marking them as
+ * private. Access to the opt_code and opt_data members is given by the later
+ * python defined code and data members respectively. */
+%rename(_next) edns_option::next;
+%rename(_opt_code) edns_option::opt_code;
+%rename(_opt_len) edns_option::opt_len;
+%rename(_opt_data) edns_option::opt_data;
+struct edns_option {
+ struct edns_option* next;
+ uint16_t opt_code;
+ size_t opt_len;
+ uint8_t* opt_data;
+};
+
+%inline %{
+ PyObject* _edns_option_opt_code_get(struct edns_option* option) {
+ uint16_t opt_code = option->opt_code;
+ return PyInt_FromLong(opt_code);
+ }
+
+ PyObject* _edns_option_opt_data_get(struct edns_option* option) {
+ return PyByteArray_FromStringAndSize((uint8_t*)option->opt_data,
+ option->opt_len);
+ }
+%}
+%extend edns_option {
+ %pythoncode %{
+ def _opt_code_get(self): return _edns_option_opt_code_get(self)
+ __swig_getmethods__["code"] = _opt_code_get
+ if _newclass: opt_code = _swig_property(_opt_code_get)
+
+ def _opt_data_get(self): return _edns_option_opt_data_get(self)
+ __swig_getmethods__["data"] = _opt_data_get
+ if _newclass: opt_data = _swig_property(_opt_data_get)
+ %}
+}
+
/* ************************************************************************************ *
+ Structure edns_data
+ * ************************************************************************************ */
+/* This is ignored because we will pass a double pointer of this to Python
+ * with custom getmethods. This is done to bypass Swig's behavior to pass NULL
+ * pointers as None. */
+%ignore edns_data::opt_list;
+struct edns_data {
+ int edns_present;
+ uint8_t ext_rcode;
+ uint8_t edns_version;
+ uint16_t bits;
+ uint16_t udp_size;
+ struct edns_option* opt_list;
+};
+%inline %{
+ struct edns_option** _edns_data_opt_list_get(struct edns_data* edns) {
+ return &edns->opt_list;
+ }
+%}
+%extend edns_data {
+ %pythoncode %{
+ def _opt_list_iter(self): return EdnsOptsListIter(self.opt_list)
+ __swig_getmethods__["opt_list_iter"] = _opt_list_iter
+ if _newclass:opt_list_iter = _swig_property(_opt_list_iter)
+ def _opt_list(self): return _edns_data_opt_list_get(self)
+ __swig_getmethods__["opt_list"] = _opt_list
+ if _newclass:opt_list = _swig_property(_opt_list)
+ %}
+}
+
+/* ************************************************************************************ *
+ Structure module_env
+ * ************************************************************************************ */
+struct module_env {
+ struct config_file* cfg;
+ struct slabhash* msg_cache;
+ struct rrset_cache* rrset_cache;
+ struct infra_cache* infra_cache;
+ struct key_cache* key_cache;
+
+ /* --- services --- */
+ 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,
+ struct module_qstate* q);
+ void (*detach_subs)(struct module_qstate* qstate);
+ int (*attach_sub)(struct module_qstate* qstate,
+ struct query_info* qinfo, uint16_t qflags, int prime,
+ int valrec, struct module_qstate** newq);
+ void (*kill_sub)(struct module_qstate* newq);
+ int (*detect_cycle)(struct module_qstate* qstate,
+ struct query_info* qinfo, uint16_t flags, int prime,
+ int valrec);
+
+ struct regional* scratch;
+ struct sldns_buffer* scratch_buffer;
+ struct worker* worker;
+ struct mesh_area* mesh;
+ struct alloc_cache* alloc;
+ struct ub_randstate* rnd;
+ time_t* now;
+ struct timeval* now_tv;
+ int need_to_validate;
+ struct val_anchors* anchors;
+ struct val_neg_cache* neg_cache;
+ struct comm_timer* probe_timer;
+ struct iter_forwards* fwds;
+ struct iter_hints* hints;
+ void* modinfo[MAX_MODULE];
+
+ void* inplace_cb_lists[inplace_cb_types_total];
+ struct edns_known_option* edns_known_options;
+ size_t edns_known_options_num;
+};
+
+
+/* ************************************************************************************ *
Structure module_qstate
* ************************************************************************************ */
%ignore module_qstate::ext_state;
%ignore module_qstate::minfo;
+/* These are ignored because we will pass a double pointer of them to Python
+ * with custom getmethods. This is done to bypass Swig's behavior to pass NULL
+ * pointers as None. */
+%ignore module_qstate::edns_opts_front_in;
+%ignore module_qstate::edns_opts_back_out;
+%ignore module_qstate::edns_opts_back_in;
+%ignore module_qstate::edns_opts_front_out;
+
/* Query state */
struct module_qstate {
struct query_info qinfo;
- uint16_t query_flags; //See QF_BIT_xx constants
- int is_priming;
+ uint16_t query_flags; /* See QF_BIT_xx constants */
+ int is_priming;
+ int is_valrec;
struct comm_reply* reply;
struct dns_msg* return_msg;
- int return_rcode;
+ int return_rcode;
struct regional* region; /* unwrapped */
- int curmod;
+ int curmod;
- enum module_ext_state ext_state[MAX_MODULE];
- void* minfo[MAX_MODULE];
+ enum module_ext_state ext_state[MAX_MODULE];
+ void* minfo[MAX_MODULE];
+ time_t prefetch_leeway;
struct module_env* env; /* unwrapped */
struct mesh_state* mesh_info;
+
+ struct edns_option* edns_opts_front_in;
+ struct edns_option* edns_opts_back_out;
+ struct edns_option* edns_opts_back_in;
+ struct edns_option* edns_opts_front_out;
+ int no_cache_lookup;
+ int no_cache_store;
};
%constant int MODULE_COUNT = MAX_MODULE;
@@ -540,6 +685,25 @@ struct module_qstate {
def __getitem__(self, index): return _unboundmodule._ext_state_get(self.obj, index)
def __setitem__(self, index, value): _unboundmodule._ext_state_set(self.obj, index, value)
def __len__(self): return _unboundmodule.MODULE_COUNT
+
+ class EdnsOptsListIter:
+ def __init__(self, obj):
+ self._current = obj
+ self._temp = None
+ def __iter__(self): return self
+ def __next__(self):
+ """Python 3 compatibility"""
+ return self._get_next()
+ def next(self):
+ """Python 2 compatibility"""
+ return self._get_next()
+ def _get_next(self):
+ if not edns_opt_list_is_empty(self._current):
+ self._temp = self._current
+ self._current = _p_p_edns_option_get_next(self._current)
+ return _dereference_edns_option(self._temp)
+ else:
+ raise StopIteration
%}
%inline %{
@@ -549,12 +713,42 @@ struct module_qstate {
}
return 0;
}
-
+
void _ext_state_set(struct module_qstate* q, int idx, enum module_ext_state state) {
if ((q != NULL) && (idx >= 0) && (idx < MAX_MODULE)) {
q->ext_state[idx] = state;
}
}
+
+ int edns_opt_list_is_empty(struct edns_option** opt) {
+ if (!opt || !(*opt)) return 1;
+ return 0;
+ }
+
+ struct edns_option* _dereference_edns_option(struct edns_option** opt) {
+ if (!opt) return NULL;
+ return *opt;
+ }
+
+ struct edns_option** _p_p_edns_option_get_next(struct edns_option** opt) {
+ return &(*opt)->next;
+ }
+
+ struct edns_option** _edns_opts_front_in_get(struct module_qstate* q) {
+ return &q->edns_opts_front_in;
+ }
+
+ struct edns_option** _edns_opts_back_out_get(struct module_qstate* q) {
+ return &q->edns_opts_back_out;
+ }
+
+ struct edns_option** _edns_opts_back_in_get(struct module_qstate* q) {
+ return &q->edns_opts_back_in;
+ }
+
+ struct edns_option** _edns_opts_front_out_get(struct module_qstate* q) {
+ return &q->edns_opts_front_out;
+ }
%}
%extend module_qstate {
@@ -566,6 +760,32 @@ struct module_qstate {
def __ext_state_get(self): return ExtState(self)
__swig_getmethods__["ext_state"] = __ext_state_get
if _newclass:ext_state = _swig_property(__ext_state_get)#, __ext_state_set)
+
+ def _edns_opts_front_in_iter(self): return EdnsOptsListIter(self.edns_opts_front_in)
+ __swig_getmethods__["edns_opts_front_in_iter"] = _edns_opts_front_in_iter
+ if _newclass:edns_opts_front_in_iter = _swig_property(_edns_opts_front_in_iter)
+ def _edns_opts_back_out_iter(self): return EdnsOptsListIter(self.edns_opts_back_out)
+ __swig_getmethods__["edns_opts_back_out_iter"] = _edns_opts_back_out_iter
+ if _newclass:edns_opts_back_out_iter = _swig_property(_edns_opts_back_out_iter)
+ def _edns_opts_back_in_iter(self): return EdnsOptsListIter(self.edns_opts_back_in)
+ __swig_getmethods__["edns_opts_back_in_iter"] = _edns_opts_back_in_iter
+ if _newclass:edns_opts_back_in_iter = _swig_property(_edns_opts_back_in_iter)
+ def _edns_opts_front_out_iter(self): return EdnsOptsListIter(self.edns_opts_front_out)
+ __swig_getmethods__["edns_opts_front_out_iter"] = _edns_opts_front_out_iter
+ if _newclass:edns_opts_front_out_iter = _swig_property(_edns_opts_front_out_iter)
+
+ def _edns_opts_front_in(self): return _edns_opts_front_in_get(self)
+ __swig_getmethods__["edns_opts_front_in"] = _edns_opts_front_in
+ if _newclass:edns_opts_front_in = _swig_property(_edns_opts_front_in)
+ def _edns_opts_back_out(self): return _edns_opts_back_out_get(self)
+ __swig_getmethods__["edns_opts_back_out"] = _edns_opts_back_out
+ if _newclass:edns_opts_back_out = _swig_property(_edns_opts_back_out)
+ def _edns_opts_back_in(self): return _edns_opts_back_in_get(self)
+ __swig_getmethods__["edns_opts_back_in"] = _edns_opts_back_in
+ if _newclass:edns_opts_back_in = _swig_property(_edns_opts_back_in)
+ def _edns_opts_front_out(self): return _edns_opts_front_out_get(self)
+ __swig_getmethods__["edns_opts_front_out"] = _edns_opts_front_out
+ if _newclass:edns_opts_front_out = _swig_property(_edns_opts_front_out)
%}
}
@@ -1037,8 +1257,9 @@ struct delegpt* find_delegation(struct module_qstate* qstate, char *nm, size_t n
/* ************************************************************************************ *
Functions
* ************************************************************************************ */
-
-// Various debuging functions
+/******************************
+ * Various debuging functions *
+ ******************************/
void verbose(enum verbosity_value level, const char* format, ...);
void log_info(const char* format, ...);
void log_err(const char* format, ...);
@@ -1048,24 +1269,166 @@ void log_dns_msg(const char* str, struct query_info* qinfo, struct reply_info* r
void log_query_info(enum verbosity_value v, const char* str, struct query_info* qinf);
void regional_log_stats(struct regional *r);
-// Free allocated memory from marked sources returning corresponding types
+/***************************************************************************
+ * Free allocated memory from marked sources returning corresponding types *
+ ***************************************************************************/
%typemap(newfree, noblock = 1) char * {
free($1);
}
-// Mark as source returning newly allocated memory
+/***************************************************
+ * Mark as source returning newly allocated memory *
+ ***************************************************/
%newobject sldns_wire2str_type;
%newobject sldns_wire2str_class;
-// LDNS functions
+/******************
+ * LDNS functions *
+ ******************/
char *sldns_wire2str_type(const uint16_t atype);
char *sldns_wire2str_class(const uint16_t aclass);
-// Functions from pythonmod_utils
+/**********************************
+ * Functions from pythonmod_utils *
+ **********************************/
int storeQueryInCache(struct module_qstate* qstate, struct query_info* qinfo, struct reply_info* msgrep, int is_referral);
void invalidateQueryInCache(struct module_qstate* qstate, struct query_info* qinfo);
-// Module conversion functions
+/*******************************
+ * Module conversion functions *
+ *******************************/
const char* strextstate(enum module_ext_state s);
const char* strmodulevent(enum module_ev e);
+/**************************
+ * Edns related functions *
+ **************************/
+struct edns_option* edns_opt_list_find(struct edns_option* list, uint16_t code);
+int edns_register_option(uint16_t opt_code, int bypass_cache_stage,
+ int no_aggregation, struct module_env* env);
+
+%pythoncode %{
+ def register_edns_option(env, code, bypass_cache_stage=False,
+ no_aggregation=False):
+ """Wrapper function to provide keyword attributes."""
+ return edns_register_option(code, bypass_cache_stage,
+ no_aggregation, env)
+%}
+
+/******************************
+ * Callback related functions *
+ ******************************/
+/* typemap to check if argument is callable */
+%typemap(in) PyObject *py_cb {
+ if (!PyCallable_Check($input)) {
+ SWIG_exception_fail(SWIG_TypeError, "Need a callable object!");
+ return NULL;
+ }
+ $1 = $input;
+}
+/* typemap to get content/size from a bytearray */
+%typemap(in) (size_t len, uint8_t* py_bytearray_data) {
+ if (!PyByteArray_CheckExact($input)) {
+ SWIG_exception_fail(SWIG_TypeError, "Expected bytearray!");
+ return NULL;
+ }
+ $2 = PyByteArray_AsString($input);
+ $1 = PyByteArray_Size($input);
+}
+
+int edns_opt_list_remove(struct edns_option** list, uint16_t code);
+int edns_opt_list_append(struct edns_option** list, uint16_t code, size_t len,
+ uint8_t* py_bytearray_data, struct regional* region);
+
+%{
+ /* This function is called by unbound in order to call the python
+ * callback function. */
+ int python_inplace_cb_reply_generic(struct query_info* qinfo,
+ struct module_qstate* qstate, struct reply_info* rep, int rcode,
+ struct edns_data* edns, struct edns_option** opt_list_out,
+ struct regional* region, void* python_callback)
+ {
+ PyObject *func, *py_edns, *py_qstate, *py_opt_list_out, *py_qinfo;
+ PyObject *py_rep, *py_region;
+ PyObject *result;
+ int res = 0;
+
+ func = (PyObject *) python_callback;
+ PyGILState_STATE gstate = PyGILState_Ensure();
+ py_edns = SWIG_NewPointerObj((void*) edns, SWIGTYPE_p_edns_data, 0);
+ py_qstate = SWIG_NewPointerObj((void*) qstate,
+ SWIGTYPE_p_module_qstate, 0);
+ py_opt_list_out = SWIG_NewPointerObj((void*) opt_list_out,
+ SWIGTYPE_p_p_edns_option, 0);
+ py_qinfo = SWIG_NewPointerObj((void*) qinfo, SWIGTYPE_p_query_info, 0);
+ py_rep = SWIG_NewPointerObj((void*) rep, SWIGTYPE_p_reply_info, 0);
+ py_region = SWIG_NewPointerObj((void*) region, SWIGTYPE_p_regional, 0);
+ result = PyObject_CallFunction(func, "OOOiOOO", py_qinfo, py_qstate,
+ py_rep, rcode, py_edns, py_opt_list_out, py_region);
+ Py_XDECREF(py_edns);
+ Py_XDECREF(py_qstate);
+ Py_XDECREF(py_opt_list_out);
+ Py_XDECREF(py_qinfo);
+ Py_XDECREF(py_rep);
+ Py_XDECREF(py_region);
+ if (result) {
+ res = PyInt_AsLong(result);
+ }
+ Py_XDECREF(result);
+ PyGILState_Release(gstate);
+ return res;
+ }
+
+ /* Swig implementations for Python */
+ static int register_inplace_cb_reply(PyObject* py_cb,
+ struct module_env* env)
+ {
+ int ret = inplace_cb_reply_register(
+ python_inplace_cb_reply_generic, (void*) py_cb, env);
+ if (ret) Py_INCREF(py_cb);
+ return ret;
+ }
+ static int register_inplace_cb_reply_cache(PyObject* py_cb,
+ struct module_env* env)
+ {
+ int ret = inplace_cb_reply_cache_register(
+ python_inplace_cb_reply_generic, (void*) py_cb, env);
+ if (ret) Py_INCREF(py_cb);
+ return ret;
+ }
+ static int register_inplace_cb_reply_local(PyObject* py_cb,
+ struct module_env* env)
+ {
+ int ret = inplace_cb_reply_local_register(
+ python_inplace_cb_reply_generic, (void*) py_cb, env);
+ if (ret) Py_INCREF(py_cb);
+ return ret;
+ }
+ static int register_inplace_cb_reply_servfail(PyObject* py_cb,
+ struct module_env* env)
+ {
+ int ret = inplace_cb_reply_servfail_register(
+ python_inplace_cb_reply_generic, (void*) py_cb, env);
+ if (ret) Py_INCREF(py_cb);
+ return ret;
+ }
+%}
+/* C declarations */
+int inplace_cb_reply_register(
+ inplace_cb_reply_func_t* cb, void* cb_arg, struct module_env* env);
+int inplace_cb_reply_cache_register(
+ inplace_cb_reply_func_t* cb, void* cb_arg, struct module_env* env);
+int inplace_cb_reply_local_register(
+ inplace_cb_reply_func_t* cb, void* cb_arg, struct module_env* env);
+int inplace_cb_reply_servfail_register(
+ inplace_cb_reply_func_t* cb, void* cb_arg, struct module_env* env);
+
+/* Swig declarations */
+static int register_inplace_cb_reply(PyObject* py_cb,
+ struct module_env* env);
+static int register_inplace_cb_reply_cache(PyObject* py_cb,
+ struct module_env* env);
+static int register_inplace_cb_reply_local(PyObject* py_cb,
+ struct module_env* env);
+static int register_inplace_cb_reply_servfail(PyObject* py_cb,
+ struct module_env* env);
diff --git a/pythonmod/pythonmod.c b/pythonmod/pythonmod.c
index 6c5e6392df4b..92e09dcacfaf 100644
--- a/pythonmod/pythonmod.c
+++ b/pythonmod/pythonmod.c
@@ -112,8 +112,10 @@ int pythonmod_init(struct module_env* env, int id)
{
/* Initialize module */
FILE* script_py = NULL;
- PyObject* py_cfg, *res;
+ PyObject* py_init_arg, *res;
PyGILState_STATE gil;
+ int init_standard = 1;
+
struct pythonmod_env* pe = (struct pythonmod_env*)calloc(1, sizeof(struct pythonmod_env));
if (!pe)
{
@@ -156,10 +158,10 @@ int pythonmod_init(struct module_env* env, int id)
PyRun_SimpleString("import sys \n");
PyRun_SimpleString("sys.path.append('.') \n");
if(env->cfg->directory && env->cfg->directory[0]) {
- char wdir[1524];
- snprintf(wdir, sizeof(wdir), "sys.path.append('%s') \n",
- env->cfg->directory);
- PyRun_SimpleString(wdir);
+ char wdir[1524];
+ snprintf(wdir, sizeof(wdir), "sys.path.append('%s') \n",
+ env->cfg->directory);
+ PyRun_SimpleString(wdir);
}
PyRun_SimpleString("sys.path.append('"RUN_DIR"') \n");
PyRun_SimpleString("sys.path.append('"SHARE_DIR"') \n");
@@ -198,11 +200,15 @@ int pythonmod_init(struct module_env* env, int id)
fclose(script_py);
- if ((pe->func_init = PyDict_GetItemString(pe->dict, "init")) == NULL)
+ if ((pe->func_init = PyDict_GetItemString(pe->dict, "init_standard")) == NULL)
{
- log_err("pythonmod: function init is missing in %s", pe->fname);
- PyGILState_Release(gil);
- return 0;
+ init_standard = 0;
+ if ((pe->func_init = PyDict_GetItemString(pe->dict, "init")) == NULL)
+ {
+ log_err("pythonmod: function init is missing in %s", pe->fname);
+ PyGILState_Release(gil);
+ return 0;
+ }
}
if ((pe->func_deinit = PyDict_GetItemString(pe->dict, "deinit")) == NULL)
{
@@ -223,16 +229,28 @@ int pythonmod_init(struct module_env* env, int id)
return 0;
}
- py_cfg = SWIG_NewPointerObj((void*) env->cfg, SWIGTYPE_p_config_file, 0);
- res = PyObject_CallFunction(pe->func_init, "iO", id, py_cfg);
+ if (init_standard)
+ {
+ py_init_arg = SWIG_NewPointerObj((void*) env, SWIGTYPE_p_module_env, 0);
+ }
+ else
+ {
+ py_init_arg = SWIG_NewPointerObj((void*) env->cfg,
+ SWIGTYPE_p_config_file, 0);
+ }
+ res = PyObject_CallFunction(pe->func_init, "iO", id, py_init_arg);
if (PyErr_Occurred())
{
log_err("pythonmod: Exception occurred in function init");
PyErr_Print();
+ Py_XDECREF(res);
+ Py_XDECREF(py_init_arg);
+ PyGILState_Release(gil);
+ return 0;
}
Py_XDECREF(res);
- Py_XDECREF(py_cfg);
+ Py_XDECREF(py_init_arg);
PyGILState_Release(gil);
return 1;
diff --git a/pythonmod/pythonmod.h b/pythonmod/pythonmod.h
index b108cf9234c1..2386882de9c2 100644
--- a/pythonmod/pythonmod.h
+++ b/pythonmod/pythonmod.h
@@ -55,14 +55,22 @@ int pythonmod_init(struct module_env* env, int id);
void pythonmod_deinit(struct module_env* env, int id);
/** python module operate on a query */
-void pythonmod_operate(struct module_qstate* qstate, enum module_ev event, int id, struct outbound_entry* outbound);
+void pythonmod_operate(struct module_qstate* qstate, enum module_ev event,
+ int id, struct outbound_entry* outbound);
/** python module */
-void pythonmod_inform_super(struct module_qstate* qstate, int id, struct module_qstate* super);
+void pythonmod_inform_super(struct module_qstate* qstate, int id,
+ struct module_qstate* super);
/** python module cleanup query state */
void pythonmod_clear(struct module_qstate* qstate, int id);
/** python module alloc size routine */
size_t pythonmod_get_mem(struct module_env* env, int id);
+
+/** Declared here for fptr_wlist access. The definition is in interface.i. */
+int python_inplace_cb_reply_generic(struct query_info* qinfo,
+ struct module_qstate* qstate, struct reply_info* rep, int rcode,
+ struct edns_data* edns, struct edns_option** opt_list_out,
+ struct regional* region, void* python_callback);
#endif /* PYTHONMOD_H */
diff --git a/pythonmod/test-edns.conf b/pythonmod/test-edns.conf
new file mode 100644
index 000000000000..440947f01e34
--- /dev/null
+++ b/pythonmod/test-edns.conf
@@ -0,0 +1,17 @@
+# Example configuration file for edns.py
+server:
+ verbosity: 1
+ interface: 0.0.0.0
+ do-daemonize: no
+ access-control: 0.0.0.0/0 allow
+ chroot: ""
+ username: ""
+ directory: ""
+ logfile: ""
+ pidfile: "unbound.pid"
+ module-config: "validator python iterator"
+
+# Python config section
+python:
+ # Script file to load
+ python-script: "./examples/edns.py"
diff --git a/pythonmod/test-inplace_callbacks.py b/pythonmod/test-inplace_callbacks.py
new file mode 100644
index 000000000000..d7081faa616e
--- /dev/null
+++ b/pythonmod/test-inplace_callbacks.py
@@ -0,0 +1,17 @@
+# Example configuration file for edns.py
+server:
+ verbosity: 1
+ interface: 0.0.0.0
+ do-daemonize: no
+ access-control: 0.0.0.0/0 allow
+ chroot: ""
+ username: ""
+ directory: ""
+ logfile: ""
+ pidfile: "unbound.pid"
+ module-config: "validator python iterator"
+
+# Python config section
+python:
+ # Script file to load
+ python-script: "./examples/inplace_callbacks.py"
diff --git a/services/cache/dns.c b/services/cache/dns.c
index 84db7a77884c..148b5cb875ab 100644
--- a/services/cache/dns.c
+++ b/services/cache/dns.c
@@ -194,6 +194,7 @@ msg_cache_lookup(struct module_env* env, uint8_t* qname, size_t qnamelen,
k.qname_len = qnamelen;
k.qtype = qtype;
k.qclass = qclass;
+ k.local_alias = NULL;
h = query_info_hash(&k, flags);
e = slabhash_lookup(env->msg_cache, h, &k, wr);
@@ -361,6 +362,7 @@ dns_msg_create(uint8_t* qname, size_t qnamelen, uint16_t qtype,
msg->qinfo.qname_len = qnamelen;
msg->qinfo.qtype = qtype;
msg->qinfo.qclass = qclass;
+ msg->qinfo.local_alias = NULL;
/* non-packed reply_info, because it needs to grow the array */
msg->rep = (struct reply_info*)regional_alloc_zero(region,
sizeof(struct reply_info)-sizeof(struct rrset_ref));
@@ -716,6 +718,7 @@ dns_cache_lookup(struct module_env* env,
k.qname_len = qnamelen;
k.qtype = qtype;
k.qclass = qclass;
+ k.local_alias = NULL;
h = query_info_hash(&k, flags);
e = slabhash_lookup(env->msg_cache, h, &k, 0);
if(e) {
@@ -795,9 +798,9 @@ dns_cache_lookup(struct module_env* env,
dname_remove_label(&k.qname, &k.qname_len);
h = query_info_hash(&k, flags);
e = slabhash_lookup(env->msg_cache, h, &k, 0);
- if(!e && k.qtype != LDNS_RR_TYPE_NS &&
+ if(!e && k.qtype != LDNS_RR_TYPE_A &&
env->cfg->qname_minimisation) {
- k.qtype = LDNS_RR_TYPE_NS;
+ k.qtype = LDNS_RR_TYPE_A;
h = query_info_hash(&k, flags);
e = slabhash_lookup(env->msg_cache, h, &k, 0);
}
@@ -817,7 +820,7 @@ dns_cache_lookup(struct module_env* env,
lock_rw_unlock(&e->lock);
}
k.qtype = qtype;
- }
+ }
/* fill common RR types for ANY response to avoid requery */
if(qtype == LDNS_RR_TYPE_ANY) {
diff --git a/services/localzone.c b/services/localzone.c
index 3268477d769c..0ea74d856873 100644
--- a/services/localzone.c
+++ b/services/localzone.c
@@ -52,6 +52,11 @@
#include "util/data/msgreply.h"
#include "util/data/msgparse.h"
#include "util/as112.h"
+#include "util/config_file.h"
+
+/* maximum RRs in an RRset, to cap possible 'endless' list RRs.
+ * with 16 bytes for an A record, a 64K packet has about 4000 max */
+#define LOCALZONE_RRSET_COUNT_MAX 4096
struct local_zones*
local_zones_create(void)
@@ -154,7 +159,7 @@ local_zone_create(uint8_t* nm, size_t len, int labs,
z->namelen = len;
z->namelabs = labs;
lock_rw_init(&z->lock);
- z->region = regional_create();
+ z->region = regional_create_custom(sizeof(struct regional));
if(!z->region) {
free(z);
return NULL;
@@ -181,13 +186,17 @@ lz_enter_zone_dname(struct local_zones* zones, uint8_t* nm, size_t len,
lock_rw_wrlock(&zones->lock);
lock_rw_wrlock(&z->lock);
if(!rbtree_insert(&zones->ztree, &z->node)) {
+ struct local_zone* oldz;
log_warn("duplicate local-zone");
lock_rw_unlock(&z->lock);
- local_zone_delete(z);
+ /* save zone name locally before deallocation,
+ * otherwise, nm is gone if we zone_delete now. */
+ oldz = z;
/* find the correct zone, so not an error for duplicate */
z = local_zones_find(zones, nm, len, labs, c);
lock_rw_wrlock(&z->lock);
lock_rw_unlock(&zones->lock);
+ local_zone_delete(oldz);
return z;
}
lock_rw_unlock(&zones->lock);
@@ -275,16 +284,20 @@ get_rr_nameclass(const char* str, uint8_t** nm, uint16_t* dclass)
* Find an rrset in local data structure.
* @param data: local data domain name structure.
* @param type: type to look for (host order).
+ * @param alias_ok: 1 if matching a non-exact, alias type such as CNAME is
+ * allowed. otherwise 0.
* @return rrset pointer or NULL if not found.
*/
static struct local_rrset*
-local_data_find_type(struct local_data* data, uint16_t type)
+local_data_find_type(struct local_data* data, uint16_t type, int alias_ok)
{
struct local_rrset* p;
type = htons(type);
for(p = data->rrsets; p; p = p->next) {
if(p->rrset->rk.type == type)
return p;
+ if(alias_ok && p->rrset->rk.type == htons(LDNS_RR_TYPE_CNAME))
+ return p;
}
return NULL;
}
@@ -342,13 +355,18 @@ new_local_rrset(struct regional* region, struct local_data* node,
/** insert RR into RRset data structure; Wastes a couple of bytes */
static int
insert_rr(struct regional* region, struct packed_rrset_data* pd,
- uint8_t* rdata, size_t rdata_len, time_t ttl)
+ uint8_t* rdata, size_t rdata_len, time_t ttl, const char* rrstr)
{
size_t* oldlen = pd->rr_len;
time_t* oldttl = pd->rr_ttl;
uint8_t** olddata = pd->rr_data;
/* add RR to rrset */
+ if(pd->count > LOCALZONE_RRSET_COUNT_MAX) {
+ log_warn("RRset '%s' has more than %d records, record ignored",
+ rrstr, LOCALZONE_RRSET_COUNT_MAX);
+ return 1;
+ }
pd->count++;
pd->rr_len = regional_alloc(region, sizeof(*pd->rr_len)*pd->count);
pd->rr_ttl = regional_alloc(region, sizeof(*pd->rr_ttl)*pd->count);
@@ -459,7 +477,23 @@ lz_enter_rr_into_zone(struct local_zone* z, const char* rrstr)
log_assert(node);
free(nm);
- rrset = local_data_find_type(node, rrtype);
+ /* Reject it if we would end up having CNAME and other data (including
+ * another CNAME) for a redirect zone. */
+ if(z->type == local_zone_redirect && node->rrsets) {
+ const char* othertype = NULL;
+ if (rrtype == LDNS_RR_TYPE_CNAME)
+ othertype = "other";
+ else if (node->rrsets->rrset->rk.type ==
+ htons(LDNS_RR_TYPE_CNAME)) {
+ othertype = "CNAME";
+ }
+ if(othertype) {
+ log_err("local-data '%s' in redirect zone must not "
+ "coexist with %s local-data", rrstr, othertype);
+ return 0;
+ }
+ }
+ rrset = local_data_find_type(node, rrtype, 0);
if(!rrset) {
rrset = new_local_rrset(z->region, node, rrtype, rrclass);
if(!rrset)
@@ -479,7 +513,7 @@ lz_enter_rr_into_zone(struct local_zone* z, const char* rrstr)
verbose(VERB_ALGO, "ignoring duplicate RR: %s", rrstr);
return 1;
}
- return insert_rr(z->region, pd, rdata, rdata_len, ttl);
+ return insert_rr(z->region, pd, rdata, rdata_len, ttl, rrstr);
}
/** enter a data RR into auth data; a zone for it must exist */
@@ -1148,8 +1182,8 @@ void local_zones_print(struct local_zones* zones)
/** encode answer consisting of 1 rrset */
static int
-local_encode(struct query_info* qinfo, struct edns_data* edns,
- sldns_buffer* buf, struct regional* temp,
+local_encode(struct query_info* qinfo, struct module_env* env,
+ struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
struct ub_packed_rrset_key* rrset, int ansec, int rcode)
{
struct reply_info rep;
@@ -1168,23 +1202,22 @@ local_encode(struct query_info* qinfo, struct edns_data* edns,
edns->udp_size = EDNS_ADVERTISED_SIZE;
edns->ext_rcode = 0;
edns->bits &= EDNS_DO;
- if(!edns_opt_inplace_reply(edns, temp) ||
- !reply_info_answer_encode(qinfo, &rep,
+ if(!inplace_cb_reply_local_call(env, qinfo, NULL, &rep, rcode, edns, temp)
+ || !reply_info_answer_encode(qinfo, &rep,
*(uint16_t*)sldns_buffer_begin(buf),
sldns_buffer_read_u16_at(buf, 2),
- buf, 0, 0, temp, udpsize, edns,
+ buf, 0, 0, temp, udpsize, edns,
(int)(edns->bits&EDNS_DO), 0))
error_encode(buf, (LDNS_RCODE_SERVFAIL|BIT_AA), qinfo,
*(uint16_t*)sldns_buffer_begin(buf),
- sldns_buffer_read_u16_at(buf, 2), edns);
+ sldns_buffer_read_u16_at(buf, 2), edns);
return 1;
}
/** find local data tag string match for the given type in the list */
static int
find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
- struct ub_packed_rrset_key* r, struct regional* temp,
- uint8_t* zname, size_t zlen)
+ struct ub_packed_rrset_key* r, struct regional* temp)
{
struct config_strlist* p;
char buf[65536];
@@ -1193,18 +1226,21 @@ find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
int res;
struct packed_rrset_data* d;
for(p=list; p; p=p->next) {
+ uint16_t rdr_type;
+
len = sizeof(rr);
/* does this element match the type? */
snprintf(buf, sizeof(buf), ". %s", p->str);
res = sldns_str2wire_rr_buf(buf, rr, &len, NULL, 3600,
- zname, zlen, NULL, 0);
+ NULL, 0, NULL, 0);
if(res != 0)
/* parse errors are already checked before, in
* acllist check_data, skip this for robustness */
continue;
if(len < 1 /* . */ + 8 /* typeclassttl*/ + 2 /*rdatalen*/)
continue;
- if(sldns_wirerr_get_type(rr, len, 1) != qinfo->qtype)
+ rdr_type = sldns_wirerr_get_type(rr, len, 1);
+ if(rdr_type != qinfo->qtype && rdr_type != LDNS_RR_TYPE_CNAME)
continue;
/* do we have entries already? if not setup key */
@@ -1212,7 +1248,7 @@ find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
r->entry.key = r;
r->rk.dname = qinfo->qname;
r->rk.dname_len = qinfo->qname_len;
- r->rk.type = htons(qinfo->qtype);
+ r->rk.type = htons(rdr_type);
r->rk.rrset_class = htons(qinfo->qclass);
r->rk.flags = 0;
d = (struct packed_rrset_data*)regional_alloc_zero(
@@ -1261,6 +1297,20 @@ find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
if(!d) return 0; /* out of memory */
d->count++;
}
+ /* If we've found a non-exact alias type of local data, make a shallow
+ * copy of the RRset and remember it in qinfo to complete the alias
+ * chain later. */
+ if(r->rk.dname && qinfo->qtype != LDNS_RR_TYPE_CNAME &&
+ r->rk.type == htons(LDNS_RR_TYPE_CNAME)) {
+ qinfo->local_alias =
+ regional_alloc_zero(temp, sizeof(struct local_rrset));
+ if(!qinfo->local_alias)
+ return 0; /* out of memory */
+ qinfo->local_alias->rrset =
+ regional_alloc_init(temp, r, sizeof(*r));
+ if(!qinfo->local_alias->rrset)
+ return 0; /* out of memory */
+ }
if(r->rk.dname)
return 1;
return 0;
@@ -1268,11 +1318,11 @@ find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
/** answer local data match */
static int
-local_data_answer(struct local_zone* z, struct query_info* qinfo,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- int labs, struct local_data** ldp, enum localzone_type lz_type,
- int tag, struct config_strlist** tag_datas, size_t tag_datas_size,
- char** tagname, int num_tags)
+local_data_answer(struct local_zone* z, struct module_env* env,
+ struct query_info* qinfo, struct edns_data* edns, sldns_buffer* buf,
+ struct regional* temp, int labs, struct local_data** ldp,
+ enum localzone_type lz_type, int tag, struct config_strlist** tag_datas,
+ size_t tag_datas_size, char** tagname, int num_tags)
{
struct local_data key;
struct local_data* ld;
@@ -1288,11 +1338,17 @@ local_data_answer(struct local_zone* z, struct query_info* qinfo,
if(tag != -1 && (size_t)tag<tag_datas_size && tag_datas[tag]) {
struct ub_packed_rrset_key r;
memset(&r, 0, sizeof(r));
- if(find_tag_datas(qinfo, tag_datas[tag], &r, temp,
- z->name, z->namelen)) {
+ if(find_tag_datas(qinfo, tag_datas[tag], &r, temp)) {
verbose(VERB_ALGO, "redirect with tag data [%d] %s",
tag, (tag<num_tags?tagname[tag]:"null"));
- return local_encode(qinfo, edns, buf, temp,
+
+ /* If we found a matching alias, we should
+ * use it as part of the answer, but we can't
+ * encode it until we complete the alias
+ * chain. */
+ if(qinfo->local_alias)
+ return 1;
+ return local_encode(qinfo, env, edns, buf, temp,
&r, 1, LDNS_RCODE_NOERROR);
}
}
@@ -1302,24 +1358,42 @@ local_data_answer(struct local_zone* z, struct query_info* qinfo,
if(!ld) {
return 0;
}
- lr = local_data_find_type(ld, qinfo->qtype);
+ lr = local_data_find_type(ld, qinfo->qtype, 1);
if(!lr)
return 0;
+
+ /* Special case for alias matching. See local_data_answer(). */
+ if(lz_type == local_zone_redirect &&
+ qinfo->qtype != LDNS_RR_TYPE_CNAME &&
+ lr->rrset->rk.type == htons(LDNS_RR_TYPE_CNAME)) {
+ qinfo->local_alias =
+ regional_alloc_zero(temp, sizeof(struct local_rrset));
+ if(!qinfo->local_alias)
+ return 0; /* out of memory */
+ qinfo->local_alias->rrset =
+ regional_alloc_init(temp, lr->rrset, sizeof(*lr->rrset));
+ if(!qinfo->local_alias->rrset)
+ return 0; /* out of memory */
+ qinfo->local_alias->rrset->rk.dname = qinfo->qname;
+ qinfo->local_alias->rrset->rk.dname_len = qinfo->qname_len;
+ return 1;
+ }
if(lz_type == local_zone_redirect) {
/* convert rrset name to query name; like a wildcard */
struct ub_packed_rrset_key r = *lr->rrset;
r.rk.dname = qinfo->qname;
r.rk.dname_len = qinfo->qname_len;
- return local_encode(qinfo, edns, buf, temp, &r, 1,
+ return local_encode(qinfo, env, edns, buf, temp, &r, 1,
LDNS_RCODE_NOERROR);
}
- return local_encode(qinfo, edns, buf, temp, lr->rrset, 1,
+ return local_encode(qinfo, env, edns, buf, temp, lr->rrset, 1,
LDNS_RCODE_NOERROR);
}
/**
* answer in case where no exact match is found
* @param z: zone for query
+ * @param env: module environment
* @param qinfo: query
* @param edns: edns from query
* @param buf: buffer for answer.
@@ -1329,9 +1403,9 @@ local_data_answer(struct local_zone* z, struct query_info* qinfo,
* @return 1 if a reply is to be sent, 0 if not.
*/
static int
-lz_zone_answer(struct local_zone* z, struct query_info* qinfo,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- struct local_data* ld, enum localzone_type lz_type)
+lz_zone_answer(struct local_zone* z, struct module_env* env,
+ struct query_info* qinfo, struct edns_data* edns, sldns_buffer* buf,
+ struct regional* temp, struct local_data* ld, enum localzone_type lz_type)
{
if(lz_type == local_zone_deny || lz_type == local_zone_inform_deny) {
/** no reply at all, signal caller by clearing buffer. */
@@ -1357,7 +1431,7 @@ lz_zone_answer(struct local_zone* z, struct query_info* qinfo,
int rcode = (ld || lz_type == local_zone_redirect)?
LDNS_RCODE_NOERROR:LDNS_RCODE_NXDOMAIN;
if(z->soa)
- return local_encode(qinfo, edns, buf, temp,
+ return local_encode(qinfo, env, edns, buf, temp,
z->soa, 0, rcode);
error_encode(buf, (rcode|BIT_AA), qinfo,
*(uint16_t*)sldns_buffer_begin(buf),
@@ -1375,7 +1449,7 @@ lz_zone_answer(struct local_zone* z, struct query_info* qinfo,
if(ld && ld->rrsets) {
int rcode = LDNS_RCODE_NOERROR;
if(z->soa)
- return local_encode(qinfo, edns, buf, temp,
+ return local_encode(qinfo, env, edns, buf, temp,
z->soa, 0, rcode);
error_encode(buf, (rcode|BIT_AA), qinfo,
*(uint16_t*)sldns_buffer_begin(buf),
@@ -1402,7 +1476,7 @@ lz_inform_print(struct local_zone* z, struct query_info* qinfo,
log_nametypeclass(0, txt, qinfo->qname, qinfo->qtype, qinfo->qclass);
}
-enum localzone_type
+static enum localzone_type
lz_type(uint8_t *taglist, size_t taglen, uint8_t *taglist2, size_t taglen2,
uint8_t *tagactions, size_t tagactionssize, enum localzone_type lzt,
struct comm_reply* repinfo, struct rbtree_t* override_tree, int* tag,
@@ -1448,54 +1522,79 @@ lz_type(uint8_t *taglist, size_t taglen, uint8_t *taglist2, size_t taglen2,
}
int
-local_zones_answer(struct local_zones* zones, struct query_info* qinfo,
- struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
- struct comm_reply* repinfo, uint8_t* taglist, size_t taglen,
- uint8_t* tagactions, size_t tagactionssize,
+local_zones_answer(struct local_zones* zones, struct module_env* env,
+ struct query_info* qinfo, struct edns_data* edns, sldns_buffer* buf,
+ struct regional* temp, struct comm_reply* repinfo, uint8_t* taglist,
+ size_t taglen, uint8_t* tagactions, size_t tagactionssize,
struct config_strlist** tag_datas, size_t tag_datas_size,
- char** tagname, int num_tags)
+ char** tagname, int num_tags, struct view* view)
{
/* see if query is covered by a zone,
* if so: - try to match (exact) local data
* - look at zone type for negative response. */
int labs = dname_count_labels(qinfo->qname);
struct local_data* ld = NULL;
- struct local_zone* z;
- enum localzone_type lzt;
+ struct local_zone* z = NULL;
+ enum localzone_type lzt = local_zone_transparent;
int r, tag = -1;
- lock_rw_rdlock(&zones->lock);
- z = local_zones_tags_lookup(zones, qinfo->qname,
- qinfo->qname_len, labs, qinfo->qclass, taglist, taglen, 0);
+
+ if(view) {
+ lock_rw_rdlock(&view->lock);
+ if(view->local_zones &&
+ (z = local_zones_lookup(view->local_zones,
+ qinfo->qname, qinfo->qname_len, labs,
+ qinfo->qclass))) {
+ verbose(VERB_ALGO,
+ "using localzone from view: %s",
+ view->name);
+ lock_rw_rdlock(&z->lock);
+ lzt = z->type;
+ }
+ if(!z && !view->isfirst){
+ lock_rw_unlock(&view->lock);
+ return 0;
+ }
+ lock_rw_unlock(&view->lock);
+ }
if(!z) {
+ /* try global local_zones tree */
+ lock_rw_rdlock(&zones->lock);
+ if(!(z = local_zones_tags_lookup(zones, qinfo->qname,
+ qinfo->qname_len, labs, qinfo->qclass, taglist,
+ taglen, 0))) {
+ lock_rw_unlock(&zones->lock);
+ return 0;
+ }
+ lock_rw_rdlock(&z->lock);
+
+ lzt = lz_type(taglist, taglen, z->taglist, z->taglen,
+ tagactions, tagactionssize, z->type, repinfo,
+ z->override_tree, &tag, tagname, num_tags);
lock_rw_unlock(&zones->lock);
- return 0;
}
- lock_rw_rdlock(&z->lock);
- lock_rw_unlock(&zones->lock);
-
- lzt = lz_type(taglist, taglen, z->taglist, z->taglen, tagactions,
- tagactionssize, z->type, repinfo, z->override_tree, &tag,
- tagname, num_tags);
-
if((lzt == local_zone_inform || lzt == local_zone_inform_deny)
&& repinfo)
lz_inform_print(z, qinfo, repinfo);
- if(lzt != local_zone_always_refuse && lzt != local_zone_always_transparent
+ if(lzt != local_zone_always_refuse
+ && lzt != local_zone_always_transparent
&& lzt != local_zone_always_nxdomain
- && local_data_answer(z, qinfo, edns, buf, temp, labs, &ld, lzt,
- tag, tag_datas, tag_datas_size, tagname, num_tags)) {
+ && local_data_answer(z, env, qinfo, edns, buf, temp, labs, &ld, lzt,
+ tag, tag_datas, tag_datas_size, tagname, num_tags)) {
lock_rw_unlock(&z->lock);
- return 1;
+ /* We should tell the caller that encode is deferred if we found
+ * a local alias. */
+ return !qinfo->local_alias;
}
- r = lz_zone_answer(z, qinfo, edns, buf, temp, ld, lzt);
+ r = lz_zone_answer(z, env, qinfo, edns, buf, temp, ld, lzt);
lock_rw_unlock(&z->lock);
- return r;
+ return r && !qinfo->local_alias; /* see above */
}
const char* local_zone_type2str(enum localzone_type t)
{
switch(t) {
+ case local_zone_unset: return "unset";
case local_zone_deny: return "deny";
case local_zone_refuse: return "refuse";
case local_zone_redirect: return "redirect";
diff --git a/services/localzone.h b/services/localzone.h
index 69fdbee2d7a3..6db9b3dd97db 100644
--- a/services/localzone.h
+++ b/services/localzone.h
@@ -44,6 +44,8 @@
#include "util/rbtree.h"
#include "util/locks.h"
#include "util/storage/dnstree.h"
+#include "util/module.h"
+#include "services/view.h"
struct ub_packed_rrset_key;
struct regional;
struct config_file;
@@ -59,8 +61,10 @@ struct config_strlist;
* local-data directly.
*/
enum localzone_type {
+ /** unset type, used for unset tag_action elements */
+ local_zone_unset = 0,
/** drop query */
- local_zone_deny = 0,
+ local_zone_deny,
/** answer with error */
local_zone_refuse,
/** answer nxdomain or nodata */
@@ -264,6 +268,7 @@ void local_zones_print(struct local_zones* zones);
* Answer authoritatively for local zones.
* Takes care of locking.
* @param zones: the stored zones (shared, read only).
+ * @param env: the module environment.
* @param qinfo: query info (parsed).
* @param edns: edns info (parsed).
* @param buf: buffer with query ID and flags, also for reply.
@@ -277,16 +282,25 @@ void local_zones_print(struct local_zones* zones);
* @param tag_datas_size: size of tag_datas array.
* @param tagname: array of tag name strings (for debug output).
* @param num_tags: number of items in tagname array.
+ * @param view: answer using this view. May be NULL.
* @return true if answer is in buffer. false if query is not answered
* by authority data. If the reply should be dropped altogether, the return
* value is true, but the buffer is cleared (empty).
+ * It can also return true if a non-exact alias answer is found. In this
+ * case qinfo->local_alias points to the corresponding alias RRset but the
+ * answer is NOT encoded in buffer. It's the caller's responsibility to
+ * complete the alias chain (if needed) and encode the final set of answer.
+ * Data pointed to by qinfo->local_alias is allocated in 'temp' or refers to
+ * configuration data. So the caller will need to make a deep copy of it
+ * if it needs to keep it beyond the lifetime of 'temp' or a dynamic update
+ * to local zone data.
*/
-int local_zones_answer(struct local_zones* zones, struct query_info* qinfo,
- struct edns_data* edns, struct sldns_buffer* buf, struct regional* temp,
- struct comm_reply* repinfo, uint8_t* taglist, size_t taglen,
- uint8_t* tagactions, size_t tagactionssize,
+int local_zones_answer(struct local_zones* zones, struct module_env* env,
+ struct query_info* qinfo, struct edns_data* edns, struct sldns_buffer* buf,
+ struct regional* temp, struct comm_reply* repinfo, uint8_t* taglist,
+ size_t taglen, uint8_t* tagactions, size_t tagactionssize,
struct config_strlist** tag_datas, size_t tag_datas_size,
- char** tagname, int num_tags);
+ char** tagname, int num_tags, struct view* view);
/**
* Parse the string into localzone type.
diff --git a/services/mesh.c b/services/mesh.c
index b0434b3ff0c3..83a01ede82af 100644
--- a/services/mesh.c
+++ b/services/mesh.c
@@ -56,6 +56,9 @@
#include "util/alloc.h"
#include "util/config_file.h"
#include "sldns/sbuffer.h"
+#include "sldns/wire2str.h"
+#include "services/localzone.h"
+#include "util/data/dname.h"
/** subtract timers and the values do not overflow or become negative */
static void
@@ -127,6 +130,11 @@ mesh_state_compare(const void* ap, const void* bp)
struct mesh_state* a = (struct mesh_state*)ap;
struct mesh_state* b = (struct mesh_state*)bp;
+ if(a->unique < b->unique)
+ return -1;
+ if(a->unique > b->unique)
+ return 1;
+
if(a->s.is_priming && !b->s.is_priming)
return -1;
if(!a->s.is_priming && b->s.is_priming)
@@ -282,10 +290,13 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
uint16_t qflags, struct edns_data* edns, struct comm_reply* rep,
uint16_t qid)
{
- struct mesh_state* s = mesh_area_find(mesh, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
+ struct mesh_state* s = NULL;
+ int unique = edns_unique_mesh_state(edns->opt_list, mesh->env);
int was_detached = 0;
int was_noreply = 0;
int added = 0;
+ if(!unique)
+ s = mesh_area_find(mesh, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
/* does this create a new reply state? */
if(!s || s->list_select == mesh_no_list) {
if(!mesh_make_new_space(mesh, rep->c->buffer)) {
@@ -315,13 +326,32 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
s = mesh_state_create(mesh->env, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
if(!s) {
log_err("mesh_state_create: out of memory; SERVFAIL");
- if(!edns_opt_inplace_reply(edns, mesh->env->scratch))
- edns->opt_list = NULL;
+ if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, NULL, NULL,
+ LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
comm_point_send_reply(rep);
return;
}
+ if(unique)
+ mesh_state_make_unique(s);
+ /* copy the edns options we got from the front */
+ if(edns->opt_list) {
+ s->s.edns_opts_front_in = edns_opt_copy_region(edns->opt_list,
+ s->s.region);
+ if(!s->s.edns_opts_front_in) {
+ log_err("mesh_state_create: out of memory; SERVFAIL");
+ if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, NULL,
+ NULL, LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ edns->opt_list = NULL;
+ error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
+ qinfo, qid, qflags, edns);
+ comm_point_send_reply(rep);
+ return;
+ }
+ }
+
#ifdef UNBOUND_DEBUG
n =
#else
@@ -338,10 +368,11 @@ void mesh_new_client(struct mesh_area* mesh, struct query_info* qinfo,
if(!s->reply_list && !s->cb_list)
was_noreply = 1;
/* add reply to s */
- if(!mesh_state_add_reply(s, edns, rep, qid, qflags, qinfo->qname)) {
+ if(!mesh_state_add_reply(s, edns, rep, qid, qflags, qinfo)) {
log_err("mesh_new_client: out of memory; SERVFAIL");
- if(!edns_opt_inplace_reply(edns, mesh->env->scratch))
- edns->opt_list = NULL;
+ if(!inplace_cb_reply_servfail_call(mesh->env, qinfo, &s->s,
+ NULL, LDNS_RCODE_SERVFAIL, edns, mesh->env->scratch))
+ edns->opt_list = NULL;
error_encode(rep->c->buffer, LDNS_RCODE_SERVFAIL,
qinfo, qid, qflags, edns);
comm_point_send_reply(rep);
@@ -380,10 +411,13 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
uint16_t qflags, struct edns_data* edns, sldns_buffer* buf,
uint16_t qid, mesh_cb_func_t cb, void* cb_arg)
{
- struct mesh_state* s = mesh_area_find(mesh, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
+ struct mesh_state* s = NULL;
+ int unique = edns_unique_mesh_state(edns->opt_list, mesh->env);
int was_detached = 0;
int was_noreply = 0;
int added = 0;
+ if(!unique)
+ s = mesh_area_find(mesh, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
/* there are no limits on the number of callbacks */
/* see if it already exists, if not, create one */
@@ -395,6 +429,15 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
if(!s) {
return 0;
}
+ if(unique)
+ mesh_state_make_unique(s);
+ if(edns->opt_list) {
+ s->s.edns_opts_front_in = edns_opt_copy_region(edns->opt_list,
+ s->s.region);
+ if(!s->s.edns_opts_front_in) {
+ return 0;
+ }
+ }
#ifdef UNBOUND_DEBUG
n =
#else
@@ -433,7 +476,8 @@ mesh_new_callback(struct mesh_area* mesh, struct query_info* qinfo,
void mesh_new_prefetch(struct mesh_area* mesh, struct query_info* qinfo,
uint16_t qflags, time_t leeway)
{
- struct mesh_state* s = mesh_area_find(mesh, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
+ struct mesh_state* s = mesh_area_find(mesh, qinfo, qflags&(BIT_RD|BIT_CD),
+ 0, 0);
#ifdef UNBOUND_DEBUG
struct rbnode_t* n;
#endif
@@ -452,6 +496,7 @@ void mesh_new_prefetch(struct mesh_area* mesh, struct query_info* qinfo,
mesh->stats_dropped ++;
return;
}
+
s = mesh_state_create(mesh->env, qinfo, qflags&(BIT_RD|BIT_CD), 0, 0);
if(!s) {
log_err("prefetch mesh_state_create: out of memory");
@@ -525,9 +570,11 @@ mesh_state_create(struct module_env* env, struct query_info* qinfo,
rbtree_init(&mstate->super_set, &mesh_state_ref_compare);
rbtree_init(&mstate->sub_set, &mesh_state_ref_compare);
mstate->num_activated = 0;
+ mstate->unique = NULL;
/* init module qstate */
mstate->s.qinfo.qtype = qinfo->qtype;
mstate->s.qinfo.qclass = qinfo->qclass;
+ mstate->s.qinfo.local_alias = NULL;
mstate->s.qinfo.qname_len = qinfo->qname_len;
mstate->s.qinfo.qname = regional_alloc_init(region, qinfo->qname,
qinfo->qname_len);
@@ -547,14 +594,34 @@ mesh_state_create(struct module_env* env, struct query_info* qinfo,
mstate->s.env = env;
mstate->s.mesh_info = mstate;
mstate->s.prefetch_leeway = 0;
+ mstate->s.no_cache_lookup = 0;
+ mstate->s.no_cache_store = 0;
/* init modules */
for(i=0; i<env->mesh->mods.num; i++) {
mstate->s.minfo[i] = NULL;
mstate->s.ext_state[i] = module_state_initial;
}
+ /* init edns option lists */
+ mstate->s.edns_opts_front_in = NULL;
+ mstate->s.edns_opts_back_out = NULL;
+ mstate->s.edns_opts_back_in = NULL;
+ mstate->s.edns_opts_front_out = NULL;
+
return mstate;
}
+int
+mesh_state_is_unique(struct mesh_state* mstate)
+{
+ return mstate->unique != NULL;
+}
+
+void
+mesh_state_make_unique(struct mesh_state* mstate)
+{
+ mstate->unique = mstate;
+}
+
void
mesh_state_cleanup(struct mesh_state* mstate)
{
@@ -689,8 +756,7 @@ int mesh_attach_sub(struct module_qstate* qstate, struct query_info* qinfo,
{
/* find it, if not, create it */
struct mesh_area* mesh = qstate->env->mesh;
- struct mesh_state* sub = mesh_area_find(mesh, qinfo, qflags, prime,
- valrec);
+ struct mesh_state* sub = mesh_area_find(mesh, qinfo, qflags, prime, valrec);
int was_detached;
if(mesh_detect_cycle_found(qstate, sub)) {
verbose(VERB_ALGO, "attach failed, cycle detected");
@@ -701,8 +767,7 @@ int mesh_attach_sub(struct module_qstate* qstate, struct query_info* qinfo,
struct rbnode_t* n;
#endif
/* create a new one */
- sub = mesh_state_create(qstate->env, qinfo, qflags, prime,
- valrec);
+ sub = mesh_state_create(qstate->env, qinfo, qflags, prime, valrec);
if(!sub) {
log_err("mesh_attach_sub: out of memory");
return 0;
@@ -804,6 +869,15 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
}
/* send the reply */
if(rcode) {
+ if(rcode == LDNS_RCODE_SERVFAIL) {
+ if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
+ rep, rcode, &r->edns, m->s.region))
+ r->edns.opt_list = NULL;
+ } else {
+ if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep, rcode,
+ &r->edns, m->s.region))
+ r->edns.opt_list = NULL;
+ }
fptr_ok(fptr_whitelist_mesh_cb(r->cb));
(*r->cb)(r->cb_arg, rcode, r->buf, sec_status_unchecked, NULL);
} else {
@@ -813,8 +887,10 @@ mesh_do_callback(struct mesh_state* m, int rcode, struct reply_info* rep,
r->edns.udp_size = EDNS_ADVERTISED_SIZE;
r->edns.ext_rcode = 0;
r->edns.bits &= EDNS_DO;
- if(!edns_opt_inplace_reply(&r->edns, m->s.region) ||
- !reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
+
+ if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep,
+ LDNS_RCODE_NOERROR, &r->edns, m->s.region) ||
+ !reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->buf, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
(int)(r->edns.bits & EDNS_DO), secure))
@@ -847,6 +923,9 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
struct timeval end_time;
struct timeval duration;
int secure;
+ /* Copy the client's EDNS for later restore, to make sure the edns
+ * compare is with the correct edns options. */
+ struct edns_data edns_bak = r->edns;
/* examine security status */
if(m->s.env->need_to_validate && (!(r->qflags&BIT_CD) ||
m->s.env->cfg->ignore_cd) && rep &&
@@ -861,7 +940,13 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
if(!rep && rcode == LDNS_RCODE_NOERROR)
rcode = LDNS_RCODE_SERVFAIL;
/* send the reply */
+ /* We don't reuse the encoded answer if either the previous or current
+ * response has a local alias. We could compare the alias records
+ * and still reuse the previous answer if they are the same, but that
+ * would be complicated and error prone for the relatively minor case.
+ * So we err on the side of safety. */
if(prev && prev->qflags == r->qflags &&
+ !prev->local_alias && !r->local_alias &&
prev->edns.edns_present == r->edns.edns_present &&
prev->edns.bits == r->edns.bits &&
prev->edns.udp_size == r->edns.udp_size &&
@@ -878,6 +963,16 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
comm_point_send_reply(&r->query_reply);
} else if(rcode) {
m->s.qinfo.qname = r->qname;
+ m->s.qinfo.local_alias = r->local_alias;
+ if(rcode == LDNS_RCODE_SERVFAIL) {
+ if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
+ rep, rcode, &r->edns, m->s.region))
+ r->edns.opt_list = NULL;
+ } else {
+ if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep, rcode,
+ &r->edns, m->s.region))
+ r->edns.opt_list = NULL;
+ }
error_encode(r->query_reply.c->buffer, rcode, &m->s.qinfo,
r->qid, r->qflags, &r->edns);
comm_point_send_reply(&r->query_reply);
@@ -888,16 +983,22 @@ mesh_send_reply(struct mesh_state* m, int rcode, struct reply_info* rep,
r->edns.ext_rcode = 0;
r->edns.bits &= EDNS_DO;
m->s.qinfo.qname = r->qname;
- if(!edns_opt_inplace_reply(&r->edns, m->s.region) ||
- !reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
+ m->s.qinfo.local_alias = r->local_alias;
+ if(!inplace_cb_reply_call(m->s.env, &m->s.qinfo, &m->s, rep,
+ LDNS_RCODE_NOERROR, &r->edns, m->s.region) ||
+ !reply_info_answer_encode(&m->s.qinfo, rep, r->qid,
r->qflags, r->query_reply.c->buffer, 0, 1,
m->s.env->scratch, udp_size, &r->edns,
(int)(r->edns.bits & EDNS_DO), secure))
{
+ if(!inplace_cb_reply_servfail_call(m->s.env, &m->s.qinfo, &m->s,
+ rep, LDNS_RCODE_SERVFAIL, &r->edns, m->s.region))
+ r->edns.opt_list = NULL;
error_encode(r->query_reply.c->buffer,
LDNS_RCODE_SERVFAIL, &m->s.qinfo, r->qid,
r->qflags, &r->edns);
}
+ r->edns = edns_bak;
comm_point_send_reply(&r->query_reply);
}
/* account */
@@ -963,6 +1064,10 @@ struct mesh_state* mesh_area_find(struct mesh_area* mesh,
key.s.is_valrec = valrec;
key.s.qinfo = *qinfo;
key.s.query_flags = qflags;
+ /* We are searching for a similar mesh state when we DO want to
+ * aggregate the state. Thus unique is set to NULL. (default when we
+ * desire aggregation).*/
+ key.unique = NULL;
result = (struct mesh_state*)rbtree_search(&mesh->all, &key);
return result;
@@ -996,7 +1101,8 @@ int mesh_state_add_cb(struct mesh_state* s, struct edns_data* edns,
}
int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
- struct comm_reply* rep, uint16_t qid, uint16_t qflags, uint8_t* qname)
+ struct comm_reply* rep, uint16_t qid, uint16_t qflags,
+ const struct query_info* qinfo)
{
struct mesh_reply* r = regional_alloc(s->s.region,
sizeof(struct mesh_reply));
@@ -1014,10 +1120,62 @@ int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
r->qflags = qflags;
r->start_time = *s->s.env->now_tv;
r->next = s->reply_list;
- r->qname = regional_alloc_init(s->s.region, qname,
+ r->qname = regional_alloc_init(s->s.region, qinfo->qname,
s->s.qinfo.qname_len);
if(!r->qname)
return 0;
+
+ /* Data related to local alias stored in 'qinfo' (if any) is ephemeral
+ * and can be different for different original queries (even if the
+ * replaced query name is the same). So we need to make a deep copy
+ * and store the copy for each reply info. */
+ if(qinfo->local_alias) {
+ struct packed_rrset_data* d;
+ struct packed_rrset_data* dsrc;
+ r->local_alias = regional_alloc_zero(s->s.region,
+ sizeof(*qinfo->local_alias));
+ if(!r->local_alias)
+ return 0;
+ r->local_alias->rrset = regional_alloc_init(s->s.region,
+ qinfo->local_alias->rrset,
+ sizeof(*qinfo->local_alias->rrset));
+ if(!r->local_alias->rrset)
+ return 0;
+ dsrc = qinfo->local_alias->rrset->entry.data;
+
+ /* In the current implementation, a local alias must be
+ * a single CNAME RR (see worker_handle_request()). */
+ log_assert(!qinfo->local_alias->next && dsrc->count == 1 &&
+ qinfo->local_alias->rrset->rk.type ==
+ htons(LDNS_RR_TYPE_CNAME));
+ /* Technically, we should make a local copy for the owner
+ * name of the RRset, but in the case of the first (and
+ * currently only) local alias RRset, the owner name should
+ * point to the qname of the corresponding query, which should
+ * be valid throughout the lifetime of this mesh_reply. So
+ * we can skip copying. */
+ log_assert(qinfo->local_alias->rrset->rk.dname ==
+ sldns_buffer_at(rep->c->buffer, LDNS_HEADER_SIZE));
+
+ d = regional_alloc_init(s->s.region, dsrc,
+ sizeof(struct packed_rrset_data)
+ + sizeof(size_t) + sizeof(uint8_t*) + sizeof(time_t));
+ if(!d)
+ return 0;
+ r->local_alias->rrset->entry.data = d;
+ d->rr_len = (size_t*)((uint8_t*)d +
+ sizeof(struct packed_rrset_data));
+ d->rr_data = (uint8_t**)&(d->rr_len[1]);
+ d->rr_ttl = (time_t*)&(d->rr_data[1]);
+ d->rr_len[0] = dsrc->rr_len[0];
+ d->rr_ttl[0] = dsrc->rr_ttl[0];
+ d->rr_data[0] = regional_alloc_init(s->s.region,
+ dsrc->rr_data[0], d->rr_len[0]);
+ if(!d->rr_data[0])
+ return 0;
+ } else
+ r->local_alias = NULL;
+
s->reply_list = r;
return 1;
}
@@ -1212,8 +1370,9 @@ mesh_detect_cycle(struct module_qstate* qstate, struct query_info* qinfo,
uint16_t flags, int prime, int valrec)
{
struct mesh_area* mesh = qstate->env->mesh;
- struct mesh_state* dep_m = mesh_area_find(mesh, qinfo, flags, prime,
- valrec);
+ struct mesh_state* dep_m = NULL;
+ if(!mesh_state_is_unique(qstate->mesh_info))
+ dep_m = mesh_area_find(mesh, qinfo, flags, prime, valrec);
return mesh_detect_cycle_found(qstate, dep_m);
}
diff --git a/services/mesh.h b/services/mesh.h
index 086e39094e8f..7dd62ef19b62 100644
--- a/services/mesh.h
+++ b/services/mesh.h
@@ -180,6 +180,8 @@ struct mesh_state {
/** if this state is in the forever list, jostle list, or neither */
enum mesh_list_select { mesh_no_list, mesh_forever_list,
mesh_jostle_list } list_select;
+ /** pointer to this state for uniqueness or NULL */
+ struct mesh_state* unique;
/** true if replies have been sent out (at end for alignment) */
uint8_t replies_sent;
@@ -214,6 +216,8 @@ struct mesh_reply {
uint16_t qflags;
/** qname from this query. len same as mesh qinfo. */
uint8_t* qname;
+ /** same as that in query_info. */
+ struct local_rrset* local_alias;
};
/**
@@ -415,6 +419,21 @@ struct mesh_state* mesh_state_create(struct module_env* env,
struct query_info* qinfo, uint16_t qflags, int prime, int valrec);
/**
+ * Check if the mesh state is unique.
+ * A unique mesh state uses it's unique member to point to itself, else NULL.
+ * @param mstate: mesh state to check.
+ * @return true if the mesh state is unique, false otherwise.
+ */
+int mesh_state_is_unique(struct mesh_state* mstate);
+
+/**
+ * Make a mesh state unique.
+ * A unique mesh state uses it's unique member to point to itself.
+ * @param mstate: mesh state to check.
+ */
+void mesh_state_make_unique(struct mesh_state* mstate);
+
+/**
* Cleanup a mesh state and its query state. Does not do rbtree or
* reference cleanup.
* @param mstate: mesh state to cleanup. Its pointer may no longer be used
@@ -459,11 +478,12 @@ int mesh_state_attachment(struct mesh_state* super, struct mesh_state* sub);
* @param rep: comm point reply info.
* @param qid: ID of reply.
* @param qflags: original query flags.
- * @param qname: original query name.
+ * @param qinfo: original query info.
* @return: 0 on alloc error.
*/
-int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
- struct comm_reply* rep, uint16_t qid, uint16_t qflags, uint8_t* qname);
+int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns,
+ struct comm_reply* rep, uint16_t qid, uint16_t qflags,
+ const struct query_info* qinfo);
/**
* Create new callback structure and attach it to a mesh state.
diff --git a/services/outside_network.c b/services/outside_network.c
index dd25ab39ba70..eba019520700 100644
--- a/services/outside_network.c
+++ b/services/outside_network.c
@@ -1879,7 +1879,7 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
return 0;
}
#ifdef USE_DNSTAP
- if(outnet->dtenv &&
+ if(error == NETEVENT_NOERROR && outnet->dtenv &&
(outnet->dtenv->log_resolver_response_messages ||
outnet->dtenv->log_forwarder_response_messages))
dt_msg_send_outside_response(outnet->dtenv, &sq->addr, c->type,
@@ -1986,17 +1986,22 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
struct serviced_query*
outnet_serviced_query(struct outside_network* outnet,
- uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
- uint16_t flags, int dnssec, int want_dnssec, int nocaps,
- int tcp_upstream, int ssl_upstream, struct edns_option* opt_list,
+ struct query_info* qinfo, uint16_t flags, 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, comm_point_callback_t* callback, void* callback_arg,
- sldns_buffer* buff)
+ size_t zonelen, struct module_qstate* qstate,
+ comm_point_callback_t* callback, void* callback_arg, sldns_buffer* buff,
+ struct module_env* env)
{
struct serviced_query* sq;
struct service_callback* cb;
- serviced_gen_query(buff, qname, qnamelen, qtype, qclass, flags);
- sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen, opt_list);
+ if(!inplace_cb_query_call(env, qinfo, flags, addr, addrlen, zone, zonelen,
+ qstate, qstate->region))
+ return NULL;
+ serviced_gen_query(buff, qinfo->qname, qinfo->qname_len, qinfo->qtype,
+ qinfo->qclass, flags);
+ sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen,
+ qstate->edns_opts_back_out);
/* duplicate entries are included in the callback list, because
* there is a counterpart registration by our caller that needs to
* be doubly-removed (with callbacks perhaps). */
@@ -2006,7 +2011,7 @@ outnet_serviced_query(struct outside_network* outnet,
/* make new serviced query entry */
sq = serviced_create(outnet, buff, dnssec, want_dnssec, nocaps,
tcp_upstream, ssl_upstream, addr, addrlen, zone,
- zonelen, (int)qtype, opt_list);
+ 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 d6a448c0b68b..f006b04cb734 100644
--- a/services/outside_network.h
+++ b/services/outside_network.h
@@ -59,6 +59,9 @@ struct sldns_buffer;
struct serviced_query;
struct dt_env;
struct edns_option;
+struct module_env;
+struct module_qstate;
+struct query_info;
/**
* Send queries to outside servers and wait for answers from servers.
@@ -471,10 +474,7 @@ void pending_delete(struct outside_network* outnet, struct pending* p);
* Perform a serviced query to the authoritative servers.
* Duplicate efforts are detected, and EDNS, TCP and UDP retry is performed.
* @param outnet: outside network, with rbtree of serviced queries.
- * @param qname: what qname to query.
- * @param qnamelen: length of qname in octets including 0 root label.
- * @param qtype: rrset type to query (host format)
- * @param qclass: query class. (host format)
+ * @param qinfo: query info.
* @param flags: flags u16 (host format), includes opcode, CD bit.
* @param dnssec: if set, DO bit is set in EDNS queries.
* If the value includes BIT_CD, CD bit is set when in EDNS queries.
@@ -484,27 +484,28 @@ 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 opt_list: pass edns option list (deep copied into serviced query)
- * these options are set on the outgoing packets.
- * @param callback: callback function.
- * @param callback_arg: user argument to callback function.
* @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.
This is the delegation point name for which the server is deemed
authoritative.
* @param zonelen: length of zone.
+ * @param qstate: module qstate. Mainly for inspecting the available
+ * edns_opts_lists.
+ * @param callback: callback function.
+ * @param callback_arg: user argument to callback function.
* @param buff: scratch buffer to create query contents in. Empty on exit.
+ * @param env: the module environment.
* @return 0 on error, or pointer to serviced query that is used to answer
* this serviced query may be shared with other callbacks as well.
*/
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
- uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
- uint16_t flags, int dnssec, int want_dnssec, int nocaps,
- int tcp_upstream, int ssl_upstream, struct edns_option* opt_list,
+ struct query_info* qinfo, uint16_t flags, 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, comm_point_callback_t* callback, void* callback_arg,
- struct sldns_buffer* buff);
+ size_t zonelen, struct module_qstate* qstate,
+ comm_point_callback_t* callback, void* callback_arg,
+ struct sldns_buffer* buff, struct module_env* env);
/**
* Remove service query callback.
diff --git a/services/view.c b/services/view.c
new file mode 100644
index 000000000000..b2d86513d4f4
--- /dev/null
+++ b/services/view.c
@@ -0,0 +1,207 @@
+/*
+ * services/view.c - named views containing local zones authority service.
+ *
+ * Copyright (c) 2016, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains functions to enable named views that can hold local zone
+ * authority service.
+ */
+#include "config.h"
+#include "services/view.h"
+#include "services/localzone.h"
+#include "util/config_file.h"
+
+int
+view_cmp(const void* v1, const void* v2)
+{
+ struct view* a = (struct view*)v1;
+ struct view* b = (struct view*)v2;
+
+ return strcmp(a->name, b->name);
+}
+
+struct views*
+views_create(void)
+{
+ struct views* v = (struct views*)calloc(1,
+ sizeof(*v));
+ if(!v)
+ return NULL;
+ rbtree_init(&v->vtree, &view_cmp);
+ lock_rw_init(&v->lock);
+ lock_protect(&v->lock, &v->vtree, sizeof(v->vtree));
+ return v;
+}
+
+void
+view_delete(struct view* v)
+{
+ if(!v)
+ return;
+ lock_rw_destroy(&v->lock);
+ local_zones_delete(v->local_zones);
+ free(v->name);
+ free(v);
+}
+
+static void
+delviewnode(rbnode_t* n, void* ATTR_UNUSED(arg))
+{
+ struct view* v = (struct view*)n;
+ view_delete(v);
+}
+
+void
+views_delete(struct views* v)
+{
+ if(!v)
+ return;
+ lock_rw_destroy(&v->lock);
+ traverse_postorder(&v->vtree, delviewnode, NULL);
+ free(v);
+}
+
+/** create a new view */
+static struct view*
+view_create(char* name)
+{
+ struct view* v = (struct view*)calloc(1, sizeof(*v));
+ if(!v)
+ return NULL;
+ v->node.key = v;
+ if(!(v->name = strdup(name))) {
+ free(v);
+ return NULL;
+ }
+ lock_rw_init(&v->lock);
+ lock_protect(&v->lock, &v->name, sizeof(*v)-sizeof(rbnode_t));
+ return v;
+}
+
+/** enter a new view returns with WRlock */
+static struct view*
+views_enter_view_name(struct views* vs, char* name)
+{
+ struct view* v = view_create(name);
+ if(!v) {
+ log_err("out of memory");
+ return NULL;
+ }
+
+ /* add to rbtree */
+ lock_rw_wrlock(&vs->lock);
+ lock_rw_wrlock(&v->lock);
+ if(!rbtree_insert(&vs->vtree, &v->node)) {
+ log_warn("duplicate view: %s", name);
+ lock_rw_unlock(&v->lock);
+ view_delete(v);
+ lock_rw_unlock(&vs->lock);
+ return NULL;
+ }
+ lock_rw_unlock(&vs->lock);
+ return v;
+}
+
+int
+views_apply_cfg(struct views* vs, struct config_file* cfg)
+{
+ struct config_view* cv;
+ struct view* v;
+ struct config_file lz_cfg;
+ /* Check existence of name in first view (last in config). Rest of
+ * views are already checked when parsing config. */
+ if(cfg->views && !cfg->views->name) {
+ log_err("view without a name");
+ return 0;
+ }
+ for(cv = cfg->views; cv; cv = cv->next) {
+ /* create and enter view */
+ if(!(v = views_enter_view_name(vs, cv->name)))
+ return 0;
+ v->isfirst = cv->isfirst;
+ if(cv->local_zones || cv->local_data) {
+ if(!(v->local_zones = local_zones_create())){
+ lock_rw_unlock(&v->lock);
+ return 0;
+ }
+ memset(&lz_cfg, 0, sizeof(lz_cfg));
+ lz_cfg.local_zones = cv->local_zones;
+ lz_cfg.local_data = cv->local_data;
+ lz_cfg.local_zones_nodefault =
+ cv->local_zones_nodefault;
+ if(!local_zones_apply_cfg(v->local_zones, &lz_cfg)){
+ lock_rw_unlock(&v->lock);
+ return 0;
+ }
+ /* local_zones, local_zones_nodefault and local_data
+ * are free'd from config_view by local_zones_apply_cfg.
+ * Set pointers to NULL. */
+ cv->local_zones = NULL;
+ cv->local_data = NULL;
+ cv->local_zones_nodefault = NULL;
+ }
+ lock_rw_unlock(&v->lock);
+ }
+ return 1;
+}
+
+/** find a view by name */
+struct view*
+views_find_view(struct views* vs, const char* name, int write)
+{
+ struct view* v;
+ struct view key;
+ key.node.key = &v;
+ key.name = (char *)name;
+ lock_rw_rdlock(&vs->lock);
+ if(!(v = (struct view*)rbtree_search(&vs->vtree, &key.node))) {
+ lock_rw_unlock(&vs->lock);
+ return 0;
+ }
+ if(write) {
+ lock_rw_wrlock(&v->lock);
+ } else {
+ lock_rw_rdlock(&v->lock);
+ }
+ lock_rw_unlock(&vs->lock);
+ return v;
+}
+
+void views_print(struct views* v)
+{
+ /* TODO implement print */
+ (void)v;
+}
diff --git a/services/view.h b/services/view.h
new file mode 100644
index 000000000000..f64b2461e305
--- /dev/null
+++ b/services/view.h
@@ -0,0 +1,135 @@
+/*
+ * services/view.h - named views containing local zones authority service.
+ *
+ * Copyright (c) 2016, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains functions to enable named views that can hold local zone
+ * authority service.
+ */
+
+#ifndef SERVICES_VIEW_H
+#define SERVICES_VIEW_H
+#include "util/rbtree.h"
+#include "util/locks.h"
+struct regional;
+struct config_file;
+struct config_view;
+
+
+/**
+ * Views storage, shared.
+ */
+struct views {
+ /** lock on the view tree */
+ lock_rw_t lock;
+ /** rbtree of struct view */
+ rbtree_t vtree;
+};
+
+/**
+ * View. Named structure holding local authority zones.
+ */
+struct view {
+ /** rbtree node, key is name */
+ rbnode_t node;
+ /** view name.
+ * Has to be right after rbnode_t due to pointer arithmatic in
+ * view_create's lock protect */
+ char* name;
+ /** view specific local authority zones */
+ struct local_zones* local_zones;
+ /** Fallback to global local_zones when there is no match in the view
+ * specific tree. 1 for yes, 0 for no */
+ int isfirst;
+ /** lock on the data in the structure
+ * For the node and name you
+ * need to also hold the views_tree lock to change them (or to
+ * delete this view) */
+ lock_rw_t lock;
+};
+
+
+/**
+ * Create views storage
+ * @return new struct or NULL on error.
+ */
+struct views* views_create(void);
+
+/**
+ * Delete views storage
+ * @param v: views to delete.
+ */
+void views_delete(struct views* v);
+
+/**
+ * Apply config settings;
+ * Takes care of locking.
+ * @param v: view is set up.
+ * @param cfg: config data.
+ * @return false on error.
+ */
+int views_apply_cfg(struct views* v, struct config_file* cfg);
+
+/**
+ * Compare two view entries in rbtree. Sort canonical.
+ * @param v1: view 1
+ * @param v2: view 2
+ * @return: negative, positive or 0 comparison value.
+ */
+int view_cmp(const void* v1, const void* v2);
+
+/**
+ * Delete one view
+ * @param v: view to delete.
+ */
+void view_delete(struct view* v);
+
+/**
+ * Debug helper. Print all views
+ * Takes care of locking.
+ * @param v: the views tree
+ */
+void views_print(struct views* v);
+
+/* Find a view by name.
+ * @param vs: views
+ * @param name: name of the view we are looking for
+ * @param write: 1 for obtaining write lock on found view, 0 for read lock
+ * @return: locked view or NULL.
+ */
+struct view* views_find_view(struct views* vs, const char* name, int write);
+
+#endif /* SERVICES_VIEW_H */
diff --git a/sldns/str2wire.c b/sldns/str2wire.c
index e624e269e33e..75c5d71b1ac6 100644
--- a/sldns/str2wire.c
+++ b/sldns/str2wire.c
@@ -328,7 +328,7 @@ rrinternal_write_typeclassttl(sldns_buffer* strbuf, uint8_t* rr, size_t len,
/** find delimiters for type */
static const char*
-rrinternal_get_delims(sldns_rdf_type rdftype, uint16_t r_cnt, uint16_t r_max)
+rrinternal_get_delims(sldns_rdf_type rdftype, size_t r_cnt, size_t r_max)
{
switch(rdftype) {
case LDNS_RDF_TYPE_B64 :
@@ -463,7 +463,7 @@ rrinternal_parse_unknown(sldns_buffer* strbuf, char* token, size_t token_len,
static int
rrinternal_parse_rdf(sldns_buffer* strbuf, char* token, size_t token_len,
uint8_t* rr, size_t rr_len, size_t* rr_cur_len, sldns_rdf_type rdftype,
- uint16_t rr_type, uint16_t r_cnt, uint16_t r_max, size_t dname_len,
+ uint16_t rr_type, size_t r_cnt, size_t r_max, size_t dname_len,
uint8_t* origin, size_t origin_len)
{
size_t len;
@@ -613,7 +613,7 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len,
uint8_t* origin, size_t origin_len)
{
const sldns_rr_descriptor *desc = sldns_rr_descript((uint16_t)rr_type);
- uint16_t r_cnt, r_min, r_max;
+ size_t r_cnt, r_min, r_max;
size_t rr_cur_len = dname_len + 10, pre_data_pos, token_strlen;
int was_unknown_rr_format = 0, parens = 0, status, quoted;
const char* delimiters;
@@ -693,7 +693,7 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len,
sldns_buffer_position(strbuf));
}
/* write rdata length */
- sldns_write_uint16(rr+dname_len+8, rr_cur_len-dname_len-10);
+ sldns_write_uint16(rr+dname_len+8, (uint16_t)(rr_cur_len-dname_len-10));
*rr_len = rr_cur_len;
return LDNS_WIREPARSE_ERR_OK;
}
@@ -1369,7 +1369,7 @@ int sldns_str2wire_time_buf(const char* str, uint8_t* rd, size_t* len)
if (tm.tm_sec < 0 || tm.tm_sec > 59)
return LDNS_WIREPARSE_ERR_SYNTAX_TIME;
- sldns_write_uint32(rd, sldns_mktime_from_utc(&tm));
+ sldns_write_uint32(rd, (uint32_t)sldns_mktime_from_utc(&tm));
} else {
/* handle it as 32 bits timestamp */
char *end;
@@ -1932,7 +1932,7 @@ int sldns_str2wire_tag_buf(const char* str, uint8_t* rd, size_t* len)
if(!isalnum((unsigned char)*ptr))
return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_TAG, ptr-str);
}
- rd[0] = slen;
+ rd[0] = (uint8_t)slen;
memmove(rd+1, str, slen);
*len = slen+1;
return LDNS_WIREPARSE_ERR_OK;
@@ -2000,7 +2000,7 @@ int sldns_str2wire_hip_buf(const char* str, uint8_t* rd, size_t* len)
return RET_ERR_SHIFT(e, s-(char*)str);
if(pklen > 65535)
return RET_ERR(LDNS_WIREPARSE_ERR_LABEL_OVERFLOW, s-(char*)str+65535);
- sldns_write_uint16(rd+2, pklen);
+ sldns_write_uint16(rd+2, (uint16_t)pklen);
*len = 4 + hitlen + pklen;
return LDNS_WIREPARSE_ERR_OK;
diff --git a/sldns/wire2str.c b/sldns/wire2str.c
index 639f56fae72e..0efa65f75664 100644
--- a/sldns/wire2str.c
+++ b/sldns/wire2str.c
@@ -667,7 +667,7 @@ int sldns_wire2str_rdata_scan(uint8_t** d, size_t* dlen, char** s,
uint8_t* origd = *d;
char* origs = *s;
size_t origdlen = *dlen, origslen = *slen;
- uint16_t r_cnt, r_max;
+ size_t r_cnt, r_max;
sldns_rdf_type rdftype;
int w = 0, n;
@@ -788,8 +788,9 @@ int sldns_wire2str_dname_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen,
}
/* spool label characters, end with '.' */
- if(in_buf && *dlen < labellen) labellen = *dlen;
- else if(!in_buf && pos+labellen > pkt+pktlen)
+ if(in_buf && *dlen < (size_t)labellen)
+ labellen = (uint8_t)*dlen;
+ else if(!in_buf && pos+(size_t)labellen > pkt+pktlen)
labellen = (uint8_t)(pkt + pktlen - pos);
for(i=0; i<(unsigned)labellen; i++) {
w += dname_char_print(s, slen, *pos++);
@@ -1960,10 +1961,10 @@ int sldns_wire2str_edns_scan(uint8_t** data, size_t* data_len, char** str,
w += sldns_str_print(str, str_len, " ; udp: %u", (unsigned)udpsize);
if(rdatalen) {
- if(*data_len < rdatalen) {
+ if((size_t)*data_len < rdatalen) {
w += sldns_str_print(str, str_len,
" ; Error EDNS rdata too short; ");
- rdatalen = *data_len;
+ rdatalen = (uint16_t)*data_len;
}
w += print_edns_opts(str, str_len, *data, rdatalen);
(*data) += rdatalen;
diff --git a/smallapp/unbound-anchor.c b/smallapp/unbound-anchor.c
index 00ab5e2ae0ef..68ff3ccc7b22 100644
--- a/smallapp/unbound-anchor.c
+++ b/smallapp/unbound-anchor.c
@@ -420,8 +420,14 @@ read_builtin_cert(void)
{
const char* builtin_cert = get_builtin_cert();
STACK_OF(X509)* sk;
- BIO *bio = BIO_new_mem_buf((void*)builtin_cert,
- (int)strlen(builtin_cert));
+ BIO *bio;
+ char* d = strdup(builtin_cert); /* to avoid const warnings in the
+ changed prototype of BIO_new_mem_buf */
+ if(!d) {
+ if(verb) printf("out of memory\n");
+ exit(0);
+ }
+ bio = BIO_new_mem_buf(d, (int)strlen(d));
if(!bio) {
if(verb) printf("out of memory\n");
exit(0);
@@ -432,6 +438,7 @@ read_builtin_cert(void)
exit(0);
}
BIO_free(bio);
+ free(d);
return sk;
}
diff --git a/smallapp/unbound-checkconf.c b/smallapp/unbound-checkconf.c
index 51f8e648ab7a..eebc0e76ee8a 100644
--- a/smallapp/unbound-checkconf.c
+++ b/smallapp/unbound-checkconf.c
@@ -97,7 +97,10 @@ static void
print_option(struct config_file* cfg, const char* opt, int final)
{
if(strcmp(opt, "pidfile") == 0 && final) {
- printf("%s\n", fname_after_chroot(cfg->pidfile, cfg, 1));
+ char *p = fname_after_chroot(cfg->pidfile, cfg, 1);
+ if(!p) fatal_exit("out of memory");
+ printf("%s\n", p);
+ free(p);
return;
}
if(!config_get_option(cfg, opt, config_print_func, stdout))
@@ -115,12 +118,15 @@ check_mod(struct config_file* cfg, struct module_func_block* fb)
env.scratch_buffer = sldns_buffer_new(BUFSIZ);
if(!env.scratch || !env.scratch_buffer)
fatal_exit("out of memory");
+ if(!edns_known_options_init(&env))
+ fatal_exit("out of memory");
if(!(*fb->init)(&env, 0)) {
fatal_exit("bad config for %s module", fb->name);
}
(*fb->deinit)(&env, 0);
sldns_buffer_free(env.scratch_buffer);
regional_destroy(env.scratch);
+ edns_known_options_delete(&env);
}
/** check localzones */
@@ -486,7 +492,7 @@ check_hints(struct config_file* cfg)
static void
checkconf(const char* cfgfile, const char* opt, int final)
{
- char oldwd[PATH_MAX];
+ char oldwd[4096];
struct config_file* cfg = config_create();
if(!cfg)
fatal_exit("out of memory");
diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c
index 19268edabde7..20a7c16499a7 100644
--- a/smallapp/unbound-control.c
+++ b/smallapp/unbound-control.c
@@ -176,7 +176,10 @@ setup_ctx(struct config_file* cfg)
free(c_cert);
} else {
/* Use ciphers that don't require authentication */
- if(!SSL_CTX_set_cipher_list(ctx, "aNULL"))
+#ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
+ SSL_CTX_set_security_level(ctx, 0);
+#endif
+ if(!SSL_CTX_set_cipher_list(ctx, "aNULL, eNULL"))
ssl_err("Error setting NULL cipher!");
}
return ctx;
@@ -300,6 +303,15 @@ send_file(SSL* ssl, FILE* in, char* buf, size_t sz)
}
}
+/** send end-of-file marker to server */
+static void
+send_eof(SSL* ssl)
+{
+ char e[] = {0x04, 0x0a};
+ if(SSL_write(ssl, e, (int)sizeof(e)) <= 0)
+ ssl_err("could not SSL_write end-of-file marker");
+}
+
/** send command and display result */
static int
go_cmd(SSL* ssl, int quiet, int argc, char* argv[])
@@ -325,6 +337,13 @@ go_cmd(SSL* ssl, int quiet, int argc, char* argv[])
if(argc == 1 && strcmp(argv[0], "load_cache") == 0) {
send_file(ssl, stdin, buf, sizeof(buf));
}
+ else if(argc == 1 && (strcmp(argv[0], "local_zones") == 0 ||
+ strcmp(argv[0], "local_zones_remove") == 0 ||
+ strcmp(argv[0], "local_datas") == 0 ||
+ strcmp(argv[0], "local_datas_remove") == 0)) {
+ send_file(ssl, stdin, buf, sizeof(buf));
+ send_eof(ssl);
+ }
while(1) {
ERR_clear_error();
diff --git a/smallapp/worker_cb.c b/smallapp/worker_cb.c
index 6ed95ac0107c..e88e8c8d754b 100644
--- a/smallapp/worker_cb.c
+++ b/smallapp/worker_cb.c
@@ -99,14 +99,13 @@ void worker_sighandler(int ATTR_UNUSED(sig), void* ATTR_UNUSED(arg))
log_assert(0);
}
-struct outbound_entry* worker_send_query(uint8_t* ATTR_UNUSED(qname),
- size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
- uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
+struct outbound_entry* worker_send_query(
+ struct query_info* ATTR_UNUSED(qinfo), uint16_t ATTR_UNUSED(flags),
int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
- struct sockaddr_storage* ATTR_UNUSED(addr),
+ 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), struct module_qstate* ATTR_UNUSED(q))
+ size_t ATTR_UNUSED(zonelen), int ATTR_UNUSED(ssl_upstream),
+ struct module_qstate* ATTR_UNUSED(q))
{
log_assert(0);
return 0;
@@ -132,14 +131,13 @@ worker_alloc_cleanup(void* ATTR_UNUSED(arg))
log_assert(0);
}
-struct outbound_entry* libworker_send_query(uint8_t* ATTR_UNUSED(qname),
- size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype),
- uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags),
+struct outbound_entry* libworker_send_query(
+ struct query_info* ATTR_UNUSED(qinfo), uint16_t ATTR_UNUSED(flags),
int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec),
- int ATTR_UNUSED(nocaps), struct edns_option* ATTR_UNUSED(opt_list),
- struct sockaddr_storage* ATTR_UNUSED(addr),
+ 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), struct module_qstate* ATTR_UNUSED(q))
+ size_t ATTR_UNUSED(zonelen), int ATTR_UNUSED(ssl_upstream),
+ struct module_qstate* ATTR_UNUSED(q))
{
log_assert(0);
return 0;
@@ -225,8 +223,8 @@ struct order_id {
int order_lock_cmp(const void* e1, const void* e2)
{
- struct order_id* o1 = (struct order_id*)e1;
- struct order_id* o2 = (struct order_id*)e2;
+ const struct order_id* o1 = e1;
+ const struct order_id* o2 = e2;
if(o1->thr < o2->thr) return -1;
if(o1->thr > o2->thr) return 1;
if(o1->instance < o2->instance) return -1;
@@ -237,7 +235,7 @@ int order_lock_cmp(const void* e1, const void* e2)
int
codeline_cmp(const void* a, const void* b)
{
- return strcmp((const char*)a, (const char*)b);
+ return strcmp(a, b);
}
int replay_var_compare(const void* ATTR_UNUSED(a), const void* ATTR_UNUSED(b))
diff --git a/testcode/asynclook.c b/testcode/asynclook.c
index 43e1dccf5b78..96cb2e3b2613 100644
--- a/testcode/asynclook.c
+++ b/testcode/asynclook.c
@@ -470,7 +470,7 @@ int main(int argc, char** argv)
return 1;
}
- /* perform asyncronous calls */
+ /* perform asynchronous calls */
num_wait = argc;
for(i=0; i<argc; i++) {
lookups[i].name = argv[i];
diff --git a/testcode/fake_event.c b/testcode/fake_event.c
index 7e0d075cd0fa..bc6588617f05 100644
--- a/testcode/fake_event.c
+++ b/testcode/fake_event.c
@@ -1036,13 +1036,13 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
}
struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
- uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
- 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 edns_option* opt_list,
+ 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, comm_point_callback_t* callback, void* callback_arg,
- sldns_buffer* ATTR_UNUSED(buff))
+ size_t zonelen, struct module_qstate* qstate,
+ comm_point_callback_t* 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,
@@ -1050,7 +1050,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
char z[256];
log_assert(pend);
log_nametypeclass(VERB_OPS, "pending serviced query",
- qname, qtype, qclass);
+ qinfo->qname, qinfo->qtype, qinfo->qclass);
dname_str(zone, z);
verbose(VERB_OPS, "pending serviced query zone %s flags%s%s%s%s",
z, (flags&BIT_RD)?" RD":"", (flags&BIT_CD)?" CD":"",
@@ -1065,9 +1065,9 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
sldns_buffer_write_u16(pend->buffer, 0); /* ancount */
sldns_buffer_write_u16(pend->buffer, 0); /* nscount */
sldns_buffer_write_u16(pend->buffer, 0); /* arcount */
- sldns_buffer_write(pend->buffer, qname, qnamelen);
- sldns_buffer_write_u16(pend->buffer, qtype);
- sldns_buffer_write_u16(pend->buffer, qclass);
+ sldns_buffer_write(pend->buffer, qinfo->qname, qinfo->qname_len);
+ sldns_buffer_write_u16(pend->buffer, qinfo->qtype);
+ sldns_buffer_write_u16(pend->buffer, qinfo->qclass);
sldns_buffer_flip(pend->buffer);
if(1) {
/* add edns */
@@ -1077,7 +1077,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
edns.edns_version = EDNS_ADVERTISED_VERSION;
edns.udp_size = EDNS_ADVERTISED_SIZE;
edns.bits = 0;
- edns.opt_list = opt_list;
+ edns.opt_list = qstate->edns_opts_back_out;
if(dnssec)
edns.bits = EDNS_DO;
attach_edns_record(pend->buffer, &edns);
@@ -1086,7 +1086,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
pend->addrlen = addrlen;
pend->zone = memdup(zone, zonelen);
pend->zonelen = zonelen;
- pend->qtype = (int)qtype;
+ pend->qtype = (int)qinfo->qtype;
log_assert(pend->zone);
pend->callback = callback;
pend->cb_arg = callback_arg;
diff --git a/testcode/memstats.c b/testcode/memstats.c
index 1cca02e74dcf..e837bbf3b49d 100644
--- a/testcode/memstats.c
+++ b/testcode/memstats.c
@@ -236,6 +236,7 @@ printstats(rbtree_t* tree)
int main(int argc, const char* argv[])
{
rbtree_t* tree = 0;
+ log_init(NULL, 0, 0);
if(argc != 2) {
usage();
}
diff --git a/testcode/perf.c b/testcode/perf.c
index 320cbc933e9e..d11357c4acaa 100644
--- a/testcode/perf.c
+++ b/testcode/perf.c
@@ -487,6 +487,7 @@ qlist_parse_line(sldns_buffer* buf, char* p)
qinfo.qname = sldns_str2wire_dname(nm, &qinfo.qname_len);
if(!qinfo.qname)
return 0;
+ qinfo.local_alias = NULL;
qinfo_query_encode(buf, &qinfo);
sldns_buffer_write_u16_at(buf, 0, 0); /* zero ID */
if(rec) LDNS_RD_SET(sldns_buffer_begin(buf));
diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c
index 05dcf98a85ec..34b5c0281369 100644
--- a/testcode/streamtcp.c
+++ b/testcode/streamtcp.c
@@ -128,6 +128,9 @@ write_q(int fd, int udp, SSL* ssl, sldns_buffer* buf, uint16_t id,
qinfo.qtype = sldns_get_rr_type_by_name(strtype);
qinfo.qclass = sldns_get_rr_class_by_name(strclass);
+ /* clear local alias */
+ qinfo.local_alias = NULL;
+
/* make query */
qinfo_query_encode(buf, &qinfo);
sldns_buffer_write_u16_at(buf, 0, id);
diff --git a/testdata/04-checkconf.tpkg b/testdata/04-checkconf.tpkg
index f2ffe3535ff7..c100355de7ba 100644
--- a/testdata/04-checkconf.tpkg
+++ b/testdata/04-checkconf.tpkg
Binary files differ
diff --git a/testdata/09-unbound-control.tpkg b/testdata/09-unbound-control.tpkg
index 62b2097bde5c..d5b11b77f044 100644
--- a/testdata/09-unbound-control.tpkg
+++ b/testdata/09-unbound-control.tpkg
Binary files differ
diff --git a/testdata/local_cname.rpl b/testdata/local_cname.rpl
new file mode 100644
index 000000000000..9f7c4f101ead
--- /dev/null
+++ b/testdata/local_cname.rpl
@@ -0,0 +1,491 @@
+; config options
+server:
+ # put unbound.conf config options here.
+
+ access-control: 127.0.0.1/32 allow_snoop #allow queries with RD bit
+
+ # DNSSEC trust anchor taken from a real world example. Used for
+ # DNSSEC-signed CNAME target.
+ trust-anchor: "infoblox.com. 172800 IN DNSKEY 257 3 5 AwEAAerW6xQkJIb5wxm48RoHD/LE8r/GzmdIGOam0lQczIth+I9ctltV dDJXz5BH8j4TOaOH1gBRCXhsPDyPom/eLEkdUuXNuhV6QnWGHOtz1fuY EO+kBqaI79jR0K31OmevR/H/F3C8gi4T6//6G9qsftvcl6m7+V1vI2+c cgxiiOlMrZZb4YAhue1+tRw57f3aVOSNtcrONO/Jffgb9jbDTKRi33oT fDznyPa1lCWMbuybr/LaCU0LP6fG4BII/FDWFi5rQxMHygWfscdYX06c eGUzHqiuNNGL8Jze6johni71T/hJGtLMozkY7qxOLfWBXOu9kr1MBQh5 6hfibOZMZJM="
+ # Use a fixed and faked date for DNSSEC validation to avoid run-time
+ # re-signing test signatures.
+ val-override-date: "20161001003725"
+
+ define-tag: "cname cname2 nx servfail sec ambiguous"
+ access-control-tag: 127.0.0.1/32 "cname cname2 nx servfail sec"
+
+ # Basic case: one CNAME whose target exists.
+ local-zone: example.com static
+ local-zone-tag: example.com "cname"
+ access-control-tag: 127.0.0.1/32 "cname"
+ access-control-tag-action: 127.0.0.1/32 "cname" redirect
+ access-control-tag-data: 127.0.0.1/32 "cname" "CNAME example.org."
+
+ # Similar to the above, but different original query name.
+ local-zone: another.example.com static
+ local-zone-tag: another.example.com "cname2"
+ access-control-tag: 127.0.0.1/32 "cname2"
+ access-control-tag-action: 127.0.0.1/32 "cname2" redirect
+ access-control-tag-data: 127.0.0.1/32 "cname2" "CNAME example.org."
+
+ # CNAME target is expected to be nonexistent.
+ local-zone: nx.example.com static
+ local-zone-tag: nx.example.com "nx"
+ access-control-tag: 127.0.0.1/32 "nx"
+ access-control-tag-action: 127.0.0.1/32 "nx" redirect
+ access-control-tag-data: 127.0.0.1/32 "nx" "CNAME nx.example.org."
+
+ # Resolution of this CNAME target will result in SERVFAIL.
+ local-zone: servfail.example.com static
+ local-zone-tag: servfail.example.com "servfail"
+ access-control-tag-action: 127.0.0.1/32 "servfail" redirect
+ access-control-tag-data: 127.0.0.1/32 "servfail" "CNAME servfail.example.org."
+
+ # CNAME target is supposed to be DNSSEC-signed.
+ local-zone: sec.example.com static
+ local-zone-tag: sec.example.com "sec"
+ access-control-tag-action: 127.0.0.1/32 "sec" redirect
+ access-control-tag-data: 127.0.0.1/32 "sec" "CNAME www.infoblox.com."
+
+ # Test setup for non-tag based redirect
+ local-zone: example.net redirect
+ local-data: "example.net. IN CNAME cname.example.org."
+
+ ### template zone and tag intended to be used for tests with CNAME and
+ ### other data.
+ ##local-zone: ambiguous.example.com redirect
+ ##@LOCALDATA1@
+ ##@LOCALDATA2@
+ ##local-zone-tag: ambiguous.example.com "ambiguous"
+ ##access-control-tag-action: 127.0.0.1/32 "ambiguous" redirect
+ ##@TAGDATA1@
+ ##@TAGDATA2@
+
+
+
+ target-fetch-policy: "0 0 0 0 0"
+
+# send the queries to the test server (see the 10.0.10.3 entries below)
+forward-zone:
+ name: "."
+ forward-addr: 10.0.10.3
+CONFIG_END
+
+; short one-line description of scenario:
+SCENARIO_BEGIN Test local-data CNAME aliases
+
+; Specification of the answers that the upstream server provides to unbound
+RANGE_BEGIN 0 1000
+ ADDRESS 10.0.10.3
+; put entries here with answers to specific qname, qtype
+
+; infoblox.com
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+infoblox.com. IN DNSKEY
+SECTION ANSWER
+infoblox.com. 172800 IN DNSKEY 256 3 5 AwEAAbi2VnVHFm5rO2EiawNWhTTRPPzaA+VEdpGOc+CtwIZq86C4Ndbp 0M7XTi0wru0Pgh54oGZ3ty9WllYEnVfoA1rcGwFJmAln7KKAuQP+dlGE yHPJYduAjG/JFA6Qq0zj18AmWgks+qvethASMm3PtihQkNytjmQWjiL6 6h8cQwFP
+infoblox.com. 172800 IN DNSKEY 257 3 5 AwEAAerW6xQkJIb5wxm48RoHD/LE8r/GzmdIGOam0lQczIth+I9ctltV dDJXz5BH8j4TOaOH1gBRCXhsPDyPom/eLEkdUuXNuhV6QnWGHOtz1fuY EO+kBqaI79jR0K31OmevR/H/F3C8gi4T6//6G9qsftvcl6m7+V1vI2+c cgxiiOlMrZZb4YAhue1+tRw57f3aVOSNtcrONO/Jffgb9jbDTKRi33oT fDznyPa1lCWMbuybr/LaCU0LP6fG4BII/FDWFi5rQxMHygWfscdYX06c eGUzHqiuNNGL8Jze6johni71T/hJGtLMozkY7qxOLfWBXOu9kr1MBQh5 6hfibOZMZJM=
+infoblox.com. 172800 IN RRSIG DNSKEY 5 2 172800 20161004003725 20160930000830 31651 infoblox.com. Ds7LZY2W59fq9cWgqi3W6so1NGFa7JdjO8zlhK3hGu2a2WG1W/rVftom rCf0gdI5q4BZJnq2o0SdLd/U7he1uWz8ATntEETiNs9/8G7myNK17wQu AN/+3gol+qT4DX0CA3Boz7Z+xFQbTwnnJJvGASa/1jPMIYU8DiyNx3Pe SSh9lbyU/4YI0mshn5ZC2HCFChxr+aVJxk4UHjaPfHhWwVu9oM4IbEfn KD9x4ltKjjy0pXMYqVlNs9+tG2nXdwr/6Q4G+yfRBAcW+cWeW5w4igxf xYFq4Y5gkZetGOReoNODZ9YC9WvcxBo+qY/iUN2k+lEFq+oL8+DthAGH uA1krw==
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.infoblox.com. IN A
+SECTION ANSWER
+www.infoblox.com. 3600 IN A 161.47.10.70
+www.infoblox.com. 3600 IN RRSIG A 5 3 3600 20161003223322 20160929221122 14916 infoblox.com. WbO9ydRAoRTPvdK18atTdLEkkMGoOjuwbcb6vVI0d6Sea3xkcBMNmtst Wdzr+pKEJqO2bfm167X6uhcOHanHZRnirlTnEbuTdsP0HCiIEGQD5iHg UNH2FJSKGNYBmgZKJpuLhDca7oqtkl8EyGA+UEt6Rtq6aW8V0wpkhPHi Pug='
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+; example.org
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.org. IN A
+SECTION ANSWER
+example.org. IN A 192.0.2.1
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+cname.example.org. IN A
+SECTION ANSWER
+cname.example.org. IN A 192.0.2.2
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.org. IN AAAA
+SECTION ANSWER
+SECTION AUTHORITY
+example.org. IN SOA ns.example.org. hostmaster.example.org. 2016101900 28800 7200 604800 3600
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NXDOMAIN
+SECTION QUESTION
+nx.example.org. IN A
+SECTION ANSWER
+SECTION AUTHORITY
+example.org. IN SOA ns.example.org. hostmaster.example.org. 2016101900 28800 7200 604800 3600
+SECTION ADDITIONAL
+ENTRY_END
+
+; for norec query
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.org. IN NS
+SECTION ANSWER
+example.org. IN NS ns.example.
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR SERVFAIL
+SECTION QUESTION
+servfail.example.org. IN A
+SECTION ANSWER
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+; end of entries with answers from upstream server
+RANGE_END
+; Steps where queries are sent, one at a time, to unbound.
+; QUERY is what the downstream client sends to unbound.
+; CHECK_ANSWER contains the response from unbound.
+
+
+; Basic case: both exact and subdomain matches result in the same CNAME
+STEP 10 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+example.com. IN CNAME
+ENTRY_END
+
+; For type-CNAME queries, the CNAME itself will be returned
+STEP 20 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+example.com. IN CNAME
+SECTION ANSWER
+example.com. IN CNAME example.org.
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 30 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+alias.example.com. IN CNAME
+ENTRY_END
+
+; For type-CNAME queries, the CNAME itself will be returned
+STEP 40 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+alias.example.com. IN CNAME
+SECTION ANSWER
+alias.example.com. IN CNAME example.org.
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+; Basic case: both exact and subdomain matches result in the same CNAME
+; For other types, a complete CNAME chain will have to be returned
+STEP 50 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+example.com. IN A
+ENTRY_END
+
+STEP 60 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+example.com. IN A
+SECTION ANSWER
+example.com. IN CNAME example.org.
+example.org. IN A 192.0.2.1
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 70 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+alias.example.com. IN A
+ENTRY_END
+
+STEP 80 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+alias.example.com. IN A
+SECTION ANSWER
+alias.example.com. IN CNAME example.org.
+example.org. IN A 192.0.2.1
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+; Basic case: both exact and subdomain matches result in the same CNAME.
+; The result is the same for non-recursive query as long as a
+; complete chain is cached.
+STEP 90 QUERY
+ENTRY_BEGIN
+REPLY
+SECTION QUESTION
+example.com. IN A
+ENTRY_END
+
+STEP 100 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA NOERROR
+SECTION QUESTION
+example.com. IN A
+SECTION ANSWER
+example.com. IN CNAME example.org.
+example.org. IN A 192.0.2.1
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 110 QUERY
+ENTRY_BEGIN
+REPLY
+SECTION QUESTION
+alias.example.com. IN A
+ENTRY_END
+
+STEP 120 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA NOERROR
+SECTION QUESTION
+alias.example.com. IN A
+SECTION ANSWER
+alias.example.com. IN CNAME example.org.
+example.org. IN A 192.0.2.1
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+; Similar to the above, but these are local-zone redirect, instead of
+; tag-based policies.
+STEP 130 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+example.net. IN CNAME
+ENTRY_END
+
+; For type-CNAME queries, the CNAME itself will be returned
+STEP 140 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+example.net. IN CNAME
+SECTION ANSWER
+example.net. IN CNAME cname.example.org.
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 150 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+alias.example.net. IN CNAME
+ENTRY_END
+
+; For type-CNAME queries, the CNAME itself will be returned
+STEP 160 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+alias.example.net. IN CNAME
+SECTION ANSWER
+alias.example.net. IN CNAME cname.example.org.
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 170 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+example.net. IN A
+ENTRY_END
+
+STEP 180 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+example.net. IN A
+SECTION ANSWER
+example.net. IN CNAME cname.example.org.
+cname.example.org. IN A 192.0.2.2
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+STEP 190 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+alias.example.net. IN A
+ENTRY_END
+
+STEP 200 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+alias.example.net. IN A
+SECTION ANSWER
+alias.example.net. IN CNAME cname.example.org.
+cname.example.org. IN A 192.0.2.2
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+
+; Relatively minor cases follow
+
+; query type doesn't exist for the CNAME target. The original query
+; succeeds with an "incomplete" chain only containing the CNAME.
+STEP 210 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+example.com. IN AAAA
+ENTRY_END
+
+STEP 220 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NOERROR
+SECTION QUESTION
+example.com. IN AAAA
+SECTION ANSWER
+example.com. IN CNAME example.org.
+SECTION AUTHORITY
+example.org. 3600 IN SOA ns.example.org. hostmaster.example.org. 2016101900 28800 7200 604800 3600
+SECTION ADDITIONAL
+ENTRY_END
+
+; The CNAME target name doesn't exist. NXDOMAIN with the CNAME will
+; be returned.
+STEP 230 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+nx.example.com. IN A
+ENTRY_END
+
+STEP 240 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA AA NXDOMAIN
+SECTION QUESTION
+nx.example.com. IN A
+SECTION ANSWER
+nx.example.com. IN CNAME nx.example.org.
+SECTION AUTHORITY
+example.org. 3600 IN SOA ns.example.org. hostmaster.example.org. 2016101900 28800 7200 604800 3600
+SECTION ADDITIONAL
+ENTRY_END
+
+; Resolution for the CNAME target will result in SERVFAIL. It will
+; be forwarded to the original query. The answer section should be
+; empty.
+STEP 250 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+servfail.example.com. IN A
+ENTRY_END
+
+STEP 260 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA SERVFAIL
+SECTION QUESTION
+servfail.example.com. IN A
+SECTION ANSWER
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+; The CNAME target is DNSSEC-signed and it's validated. If the original
+; query enabled the DNSSEC, the RRSIGs will be included in the answer,
+; but the response should have the AD bit off
+STEP 270 QUERY
+ENTRY_BEGIN
+REPLY RD DO
+SECTION QUESTION
+sec.example.com. IN A
+ENTRY_END
+
+STEP 280 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD DO RA AA NOERROR
+SECTION QUESTION
+sec.example.com. IN A
+SECTION ANSWER
+sec.example.com. IN CNAME www.infoblox.com.
+www.infoblox.com. 3600 IN A 161.47.10.70
+www.infoblox.com. 3600 IN RRSIG A 5 3 3600 20161003223322 20160929221122 14916 infoblox.com. WbO9ydRAoRTPvdK18atTdLEkkMGoOjuwbcb6vVI0d6Sea3xkcBMNmtst Wdzr+pKEJqO2bfm167X6uhcOHanHZRnirlTnEbuTdsP0HCiIEGQD5iHg UNH2FJSKGNYBmgZKJpuLhDca7oqtkl8EyGA+UEt6Rtq6aW8V0wpkhPHi Pug='
+SECTION AUTHORITY
+SECTION ADDITIONAL
+ENTRY_END
+
+
+SCENARIO_END
diff --git a/testdata/stop_nxdomain_minimised.rpl b/testdata/stop_nxdomain_minimised.rpl
new file mode 100644
index 000000000000..8882b7bd9080
--- /dev/null
+++ b/testdata/stop_nxdomain_minimised.rpl
@@ -0,0 +1,110 @@
+; config options
+server:
+ target-fetch-policy: "0 0 0 0 0"
+ harden-below-nxdomain: yes
+ qname-minimisation: yes
+ trust-anchor: ". IN DNSKEY 257 3 5 AQPQ41chR9DEHt/aIzIFAqanbDlRflJoRs5yz1jFsoRIT7dWf0r+PeDuewdxkszNH6wnU4QL8pfKFRh5PIYVBLK3"
+ val-override-date: "20070916134226"
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+stub-zone:
+ name: "anotherexample.local."
+ stub-addr: 10.20.30.40
+CONFIG_END
+
+SCENARIO_BEGIN Test stop cache search on nxdomain for QNAME minimised query
+
+; 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
+. 3600 IN DNSKEY 257 3 5 AQPQ41chR9DEHt/aIzIFAqanbDlRflJoRs5yz1jFsoRIT7dWf0r+PeDuewdxkszNH6wnU4QL8pfKFRh5PIYVBLK3 ;{id = 30900 (ksk), size = 512b}
+. 3600 IN RRSIG DNSKEY 5 0 3600 20070926134150 20070829134150 30900 . BlVcSh8xSgm7ne+XVCJwNHQKjk5kTJgG4Fa3sOSfp3YUjb2YclmVWyIw7XEHl0/C6CN5gdy18idnM6vT6Hy42A== ;{id = 30900}
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NXDOMAIN
+SECTION QUESTION
+local. IN A
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2010111601 1800 900 604800 86400
+. 86400 IN RRSIG SOA 5 0 86400 20070926134150 20070829134150 30900 . bOYbFZZp7vWWC2oxV+kph+YXjoQj2f6QJktlgmzRI7oReFX9jy/LibTPQi/sW0SGHpLaj3G5p4IfIlBibne4DA== ;{id = 30900}
+. 86400 IN NSEC ac. NS SOA RRSIG NSEC DNSKEY
+. 86400 IN RRSIG NSEC 5 0 86400 20070926134150 20070829134150 30900 . U+/m5+FmczzkosEx1aTP7MK/F3PpcKWct8CzM1jhjwNe2RlnW7qFe0IH8SLzD/elvxDTQMpJSMlKOhUUdapB8g== ;{id = 30900}
+lk. 86400 IN NSEC lr. NS DS RRSIG NSEC
+lk. 86400 IN RRSIG NSEC 5 1 86400 20070926134150 20070829134150 30900 . j6Pw5Eu9vGHDJcckTSWa8YD1b7FV7c/Z8aVkLfJCH+iPcaa40/LSp784+t2PnAAXL8fgriNL6jF/ve1rti3ANQ== ;{id = 30900}
+ENTRY_END
+RANGE_END
+
+RANGE_BEGIN 0 100
+ ADDRESS 10.20.30.40
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR AA NOERROR
+SECTION QUESTION
+anotherexample.local. IN TXT
+SECTION ANSWER
+anotherexample.local. 86400 IN TXT "should not resolve this"
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+example.local. IN TXT
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NXDOMAIN
+SECTION QUESTION
+example.local. IN TXT
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2010111601 1800 900 604800 86400
+ENTRY_END
+
+STEP 20 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+anotherexample.local. IN TXT
+ENTRY_END
+
+; query should be answered using NXDOMAIN for local in cache
+STEP 30 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NXDOMAIN
+SECTION QUESTION
+anotherexample.local. IN TXT
+SECTION AUTHORITY
+. 86400 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2010111601 1800 900 604800 86400
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/val_cnamewctonodata.rpl b/testdata/val_cnamewctonodata.rpl
index 9c3928a19317..83aec7a025e8 100644
--- a/testdata/val_cnamewctonodata.rpl
+++ b/testdata/val_cnamewctonodata.rpl
@@ -11,7 +11,7 @@ stub-zone:
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
CONFIG_END
-SCENARIO_BEGIN Test validator with wilcard cname to nodata
+SCENARIO_BEGIN Test validator with wildcard cname to nodata
; K.ROOT-SERVERS.NET.
RANGE_BEGIN 0 100
diff --git a/testdata/val_ds_sha2.crpl b/testdata/val_ds_sha2.crpl
index bbf18118597b..6b92e230f486 100644
--- a/testdata/val_ds_sha2.crpl
+++ b/testdata/val_ds_sha2.crpl
@@ -4,6 +4,7 @@ server:
trust-anchor: "example.com. 3600 IN DS 2854 3 1 46e4ffc6e9a4793b488954bd3f0cc6af0dfb201b"
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
+ fake-dsa: yes
stub-zone:
name: "."
diff --git a/testdata/val_ds_sha2_downgrade.crpl b/testdata/val_ds_sha2_downgrade.crpl
index ee9a171233d5..ea4a48105cd4 100644
--- a/testdata/val_ds_sha2_downgrade.crpl
+++ b/testdata/val_ds_sha2_downgrade.crpl
@@ -4,6 +4,7 @@ server:
trust-anchor: "example.com. 3600 IN DS 2854 3 1 46e4ffc6e9a4793b488954bd3f0cc6af0dfb201b"
val-override-date: "20070916134226"
target-fetch-policy: "0 0 0 0 0"
+ fake-dsa: yes
stub-zone:
name: "."
diff --git a/testdata/val_nodata_failsig.rpl b/testdata/val_nodata_failsig.rpl
index df3b75e019e4..27d5d30c8314 100644
--- a/testdata/val_nodata_failsig.rpl
+++ b/testdata/val_nodata_failsig.rpl
@@ -130,8 +130,10 @@ SECTION ANSWER
SECTION AUTHORITY
; SOA record is missing in reply.
; Denies A, note this is the end of the NSEC chain.
+; this RRSIG is failed, we set to 0 base64 data to make this easy to detect
www.example.com. IN NSEC example.com. RRSIG NSEC
-www.example.com. 3600 IN RRSIG NSEC 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFDA8yqBITvLruoQjn/eqjYjwCwySAhUAk5/f3H1HKMsvM+spmmswwFtndyY= ;{id = 2854}
+;www.example.com. 3600 IN RRSIG NSEC 3 3 3600 20070926135752 20070829135752 2854 example.com. MC0CFDA8yqBITvLruoQjn/eqjYjwCwySAhUAk5/f3H1HKMsvM+spmmswwFtndyY= ;{id = 2854}
+www.example.com. 3600 IN RRSIG NSEC 3 3 3600 20070926135752 20070829135752 2854 example.com.
; Denies wildcard
example.com. IN NSEC ns.example.com. NS SOA RRSIG NSEC DNSKEY
example.com. 3600 IN RRSIG NSEC 3 2 3600 20070926135752 20070829135752 2854 example.com. MCwCFGlz/gvGdVxEo3Kpr+MijEGCZgwaAhRU7qbF13vmCVgR8dFw7LQFKopV6w== ;{id = 2854}
diff --git a/testdata/val_nsec3_wcany.rpl b/testdata/val_nsec3_wcany.rpl
index fff0aa7cd4d0..37074a6a6e0f 100644
--- a/testdata/val_nsec3_wcany.rpl
+++ b/testdata/val_nsec3_wcany.rpl
@@ -10,7 +10,7 @@ stub-zone:
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
CONFIG_END
-SCENARIO_BEGIN Test validator with NSEC3 wilcard qtype ANY response.
+SCENARIO_BEGIN Test validator with NSEC3 wildcard qtype ANY response.
; K.ROOT-SERVERS.NET.
RANGE_BEGIN 0 100
diff --git a/testdata/val_nsec3_wcany_nodeny.rpl b/testdata/val_nsec3_wcany_nodeny.rpl
index 9215ccc04a4d..080f086c8ea5 100644
--- a/testdata/val_nsec3_wcany_nodeny.rpl
+++ b/testdata/val_nsec3_wcany_nodeny.rpl
@@ -10,7 +10,7 @@ stub-zone:
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
CONFIG_END
-SCENARIO_BEGIN Test validator with NSEC3 wilcard qtype ANY without denial.
+SCENARIO_BEGIN Test validator with NSEC3 wildcard qtype ANY without denial.
; K.ROOT-SERVERS.NET.
RANGE_BEGIN 0 100
diff --git a/testdata/views.rpl b/testdata/views.rpl
new file mode 100644
index 000000000000..d4031363b9ef
--- /dev/null
+++ b/testdata/views.rpl
@@ -0,0 +1,210 @@
+; config options
+server:
+ target-fetch-policy: "0 0 0 0 0"
+
+ access-control: 10.10.10.0/24 allow
+ access-control-view: 10.10.10.10/32 "view1"
+ access-control-view: 10.10.10.20/32 "view2"
+ access-control-view: 10.10.10.30/32 "view3"
+ access-control-view: 10.10.10.40/32 "view4"
+
+ local-zone: "example.com." redirect
+ local-data: 'example.com. IN TXT "global"'
+
+view:
+ name: "view1"
+ local-zone: "nomatch.example.com." redirect
+ local-data: 'nomatch.example.com. IN TXT "view 1"'
+ view-first: no
+
+view:
+ name: "view2"
+ local-zone: "example.com." redirect
+ local-data: 'example.com. IN TXT "view 2"'
+ ; view-first default = no
+
+view:
+ name: "view3"
+ local-zone: "nomatch.example.com." redirect
+ local-data: 'nomatch.example.com. IN TXT "view 3"'
+ view-first: yes
+
+view:
+ name: "view4"
+ local-zone: "example.com." redirect
+ local-data: 'example.com. IN TXT "view 4"'
+ view-first: yes
+
+stub-zone:
+ name: "."
+ stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
+CONFIG_END
+SCENARIO_BEGIN Test view specific local-zone and local-data elements
+
+; 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
+example.com. IN TXT
+SECTION AUTHORITY
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+ ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+com. IN NS
+SECTION ANSWER
+com. IN NS a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net. IN A 192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN TXT
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+ ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN NS
+SECTION ANSWER
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+example.com. IN TXT
+SECTION ANSWER
+example.com. IN TXT "auth data"
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY ADDRESS 10.10.10.10
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+example.com. IN TXT
+ENTRY_END
+STEP 2 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA
+SECTION QUESTION
+example.com. IN TXT
+SECTION ANSWER
+example.com. IN TXT "auth data"
+SECTION AUTHORITY
+example.com. IN NS ns.example.com.
+SECTION ADDITIONAL
+ns.example.com. IN A 1.2.3.4
+ENTRY_END
+
+STEP 3 QUERY ADDRESS 10.10.10.20
+ENTRY_BEGIN
+SECTION QUESTION
+example.com. IN TXT
+ENTRY_END
+STEP 4 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA
+SECTION QUESTION
+example.com. IN TXT
+SECTION ANSWER
+example.com. IN TXT "view 2"
+ENTRY_END
+
+STEP 5 QUERY ADDRESS 10.10.10.30
+ENTRY_BEGIN
+SECTION QUESTION
+example.com. IN TXT
+ENTRY_END
+STEP 6 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA
+SECTION QUESTION
+example.com. IN TXT
+SECTION ANSWER
+example.com. IN TXT "global"
+ENTRY_END
+
+STEP 7 QUERY ADDRESS 10.10.10.40
+ENTRY_BEGIN
+SECTION QUESTION
+example.com. IN TXT
+ENTRY_END
+STEP 8 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA
+SECTION QUESTION
+example.com. IN TXT
+SECTION ANSWER
+example.com. IN TXT "view 4"
+ENTRY_END
+
+STEP 9 QUERY ADDRESS 10.10.10.50
+ENTRY_BEGIN
+SECTION QUESTION
+example.com. IN TXT
+ENTRY_END
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA AA
+SECTION QUESTION
+example.com. IN TXT
+SECTION ANSWER
+example.com. IN TXT "global"
+ENTRY_END
+
+SCENARIO_END
diff --git a/util/config_file.c b/util/config_file.c
index b13a49c7b157..881c85f599db 100644
--- a/util/config_file.c
+++ b/util/config_file.c
@@ -105,6 +105,7 @@ config_create(void)
cfg->ssl_port = 853;
cfg->ssl_upstream = 0;
cfg->use_syslog = 1;
+ cfg->log_identity = NULL; /* changed later with argv[0] */
cfg->log_time_ascii = 0;
cfg->log_queries = 0;
#ifndef USE_WINSOCK
@@ -170,6 +171,7 @@ config_create(void)
cfg->out_ifs = NULL;
cfg->stubs = NULL;
cfg->forwards = NULL;
+ cfg->views = NULL;
cfg->acls = NULL;
cfg->harden_short_bufsize = 0;
cfg->harden_large_queries = 0;
@@ -202,6 +204,7 @@ config_create(void)
cfg->val_log_squelch = 0;
cfg->val_permissive_mode = 0;
cfg->ignore_cd = 0;
+ cfg->serve_expired = 0;
cfg->add_holddown = 30*24*3600;
cfg->del_holddown = 30*24*3600;
cfg->keep_missing = 366*24*3600; /* one year plus a little leeway */
@@ -247,6 +250,7 @@ config_create(void)
cfg->ratelimit_below_domain = NULL;
cfg->ratelimit_factor = 10;
cfg->qname_minimisation = 0;
+ cfg->qname_minimisation_strict = 0;
return cfg;
error_exit:
config_delete(cfg);
@@ -367,6 +371,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
log_set_time_asc(cfg->log_time_ascii); }
else S_SIZET_NONZERO("max-udp-size:", max_udp_size)
else S_YNO("use-syslog:", use_syslog)
+ else S_STR("log-identity:", log_identity)
else S_YNO("extended-statistics:", stat_extended)
else S_YNO("statistics-cumulative:", stat_cumulative)
else S_YNO("do-ip4:", do_ip4)
@@ -453,6 +458,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_YNO("log-queries:", log_queries)
else S_YNO("val-permissive-mode:", val_permissive_mode)
else S_YNO("ignore-cd-flag:", ignore_cd)
+ else S_YNO("serve-expired:", serve_expired)
else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations)
else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown)
else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown)
@@ -486,6 +492,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
else S_POW2("ratelimit-slabs:", ratelimit_slabs)
else S_NUMBER_OR_ZERO("ratelimit-factor:", ratelimit_factor)
else S_YNO("qname-minimisation:", qname_minimisation)
+ else S_YNO("qname-minimisation-strict:", qname_minimisation_strict)
else if(strcmp(opt, "define-tag:") ==0) {
return config_add_tag(cfg, val);
/* val_sig_skew_min and max are copied into val_env during init,
@@ -509,10 +516,11 @@ int config_set_option(struct config_file* cfg, const char* opt,
/* unknown or unsupported (from the set_option interface):
* interface, outgoing-interface, access-control,
* stub-zone, name, stub-addr, stub-host, stub-prime
- * forward-first, stub-first,
- * forward-zone, name, forward-addr, forward-host,
+ * forward-first, stub-first, forward-ssl-upstream,
+ * stub-ssl-upstream, forward-zone,
+ * name, forward-addr, forward-host,
* ratelimit-for-domain, ratelimit-below-domain,
- * local-zone-tag */
+ * local-zone-tag, access-control-view */
return 0;
}
return 1;
@@ -675,6 +683,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_YNO(opt, "statistics-cumulative", stat_cumulative)
else O_YNO(opt, "extended-statistics", stat_extended)
else O_YNO(opt, "use-syslog", use_syslog)
+ else O_STR(opt, "log-identity", log_identity)
else O_YNO(opt, "log-time-ascii", log_time_ascii)
else O_DEC(opt, "num-threads", num_threads)
else O_IFC(opt, "interface", num_ifs, ifs)
@@ -748,6 +757,7 @@ config_get_option(struct config_file* cfg, const char* opt,
else O_DEC(opt, "val-log-level", val_log_level)
else O_YNO(opt, "val-permissive-mode", val_permissive_mode)
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)
else O_UNS(opt, "add-holddown", add_holddown)
else O_UNS(opt, "del-holddown", del_holddown)
@@ -791,12 +801,14 @@ config_get_option(struct config_file* cfg, const char* opt,
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)
+ else O_YNO(opt, "qname-minimisation-strict", qname_minimisation_strict)
else O_IFC(opt, "define-tag", num_tags, tagname)
else O_LTG(opt, "local-zone-tag", local_zone_tags)
else O_LTG(opt, "access-control-tag", acl_tags)
else O_LS3(opt, "local-zone-override", local_zone_overrides)
else O_LS3(opt, "access-control-tag-action", acl_tag_actions)
else O_LS3(opt, "access-control-tag-data", acl_tag_datas)
+ else O_LS2(opt, "access-control-view", acl_view)
/* not here:
* outgoing-permit, outgoing-avoid - have list of ports
* local-zone - zones and nodefault variables
@@ -983,6 +995,27 @@ config_delstubs(struct config_stub* p)
}
}
+void
+config_delview(struct config_view* p)
+{
+ if(!p) return;
+ free(p->name);
+ config_deldblstrlist(p->local_zones);
+ config_delstrlist(p->local_zones_nodefault);
+ config_delstrlist(p->local_data);
+ free(p);
+}
+
+void
+config_delviews(struct config_view* p)
+{
+ struct config_view* np;
+ while(p) {
+ np = p->next;
+ config_delview(p);
+ p = np;
+ }
+}
/** delete string array */
static void
config_del_strarray(char** array, int num)
@@ -1021,10 +1054,12 @@ config_delete(struct config_file* cfg)
free(cfg->target_fetch_policy);
free(cfg->ssl_service_key);
free(cfg->ssl_service_pem);
+ free(cfg->log_identity);
config_del_strarray(cfg->ifs, cfg->num_ifs);
config_del_strarray(cfg->out_ifs, cfg->num_out_ifs);
config_delstubs(cfg->stubs);
config_delstubs(cfg->forwards);
+ config_delviews(cfg->views);
config_delstrlist(cfg->donotqueryaddrs);
config_delstrlist(cfg->root_hints);
free(cfg->identity);
diff --git a/util/config_file.h b/util/config_file.h
index 07edff7b4cf4..071b408e7c34 100644
--- a/util/config_file.h
+++ b/util/config_file.h
@@ -42,6 +42,7 @@
#ifndef UTIL_CONFIG_FILE_H
#define UTIL_CONFIG_FILE_H
struct config_stub;
+struct config_view;
struct config_strlist;
struct config_str2list;
struct config_str3list;
@@ -167,6 +168,8 @@ struct config_file {
struct config_stub* stubs;
/** the forward zone definitions, linked list */
struct config_stub* forwards;
+ /** the views definitions, linked list */
+ struct config_view* views;
/** list of donotquery addresses, linked list */
struct config_strlist* donotqueryaddrs;
/** list of access control entries, linked list */
@@ -226,6 +229,8 @@ struct config_file {
int log_time_ascii;
/** log queries with one line per query */
int log_queries;
+ /** log identity to report */
+ char* log_identity;
/** do not report identity (id.server, hostname.bind) */
int hide_identity;
@@ -272,6 +277,8 @@ struct config_file {
int val_permissive_mode;
/** ignore the CD flag in incoming queries and refuse them bogus data */
int ignore_cd;
+ /** serve expired entries and prefetch them */
+ int serve_expired;
/** nsec3 maximum iterations per key size, string */
char* val_nsec3_key_iterations;
/** autotrust add holddown time, in seconds */
@@ -310,6 +317,8 @@ struct config_file {
struct config_str3list* acl_tag_actions;
/** list of aclname, tagname, redirectdata */
struct config_str3list* acl_tag_datas;
+ /** list of aclname, view*/
+ struct config_str2list* acl_view;
/** tag list, array with tagname[i] is malloced string */
char** tagname;
/** number of items in the taglist */
@@ -396,6 +405,9 @@ struct config_file {
int ratelimit_factor;
/** minimise outgoing QNAME and hide original QTYPE if possible */
int qname_minimisation;
+ /** minimise QNAME in strict mode, minimise according to RFC.
+ * Do not apply fallback */
+ int qname_minimisation_strict;
};
/** from cfg username, after daemonise setup performed */
@@ -421,6 +433,27 @@ struct config_stub {
int isprime;
/** if forward-first is set (failover to without if fails) */
int isfirst;
+ /* use SSL for queries to this stub */
+ int ssl_upstream;
+};
+
+/**
+ * View config options
+ */
+struct config_view {
+ /** next in list */
+ struct config_view* next;
+ /** view name */
+ char* name;
+ /** local zones */
+ struct config_str2list* local_zones;
+ /** local data RRs */
+ struct config_strlist* local_data;
+ /** local zones nodefault list */
+ struct config_strlist* local_zones_nodefault;
+ /** Fallback to global local_zones when there is no match in the view
+ * view specific tree. 1 for yes, 0 for no */
+ int isfirst;
};
/**
@@ -682,6 +715,18 @@ void config_delstub(struct config_stub* p);
void config_delstubs(struct config_stub* list);
/**
+ * Delete a view item
+ * @param p: view item
+ */
+void config_delview(struct config_view* p);
+
+/**
+ * Delete items in config view list.
+ * @param list: list.
+ */
+void config_delviews(struct config_view* list);
+
+/**
* Convert 14digit to time value
* @param str: string of 14 digits
* @return time value or 0 for error.
@@ -904,4 +949,7 @@ char* w_lookup_reg_str(const char* key, const char* name);
void w_config_adjust_directory(struct config_file* cfg);
#endif /* UB_ON_WINDOWS */
+/** debug option for unit tests. */
+extern int fake_dsa;
+
#endif /* UTIL_CONFIG_FILE_H */
diff --git a/util/configlexer.c b/util/configlexer.c
index 533420463aa8..a47eb9513b6d 100644
--- a/util/configlexer.c
+++ b/util/configlexer.c
@@ -184,7 +184,7 @@ extern FILE *yyin, *yyout;
do \
{ \
/* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
+ yy_size_t yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
*yy_cp = (yy_hold_char); \
YY_RESTORE_YY_MORE_OFFSET \
@@ -378,8 +378,8 @@ static void yy_fatal_error (yyconst char msg[] );
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 188
-#define YY_END_OF_BUFFER 189
+#define YY_NUM_RULES 197
+#define YY_END_OF_BUFFER 198
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -387,214 +387,223 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[1880] =
+static yyconst flex_int16_t yy_accept[1956] =
{ 0,
- 1, 1, 170, 170, 174, 174, 178, 178, 182, 182,
- 1, 1, 189, 186, 1, 168, 168, 187, 2, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 187,
- 170, 171, 171, 172, 187, 174, 175, 175, 176, 187,
- 181, 178, 179, 179, 180, 187, 182, 183, 183, 184,
- 187, 185, 169, 2, 173, 185, 187, 186, 0, 1,
- 2, 2, 2, 2, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 170, 0, 174, 0,
- 181, 0, 178, 182, 0, 185, 0, 2, 2, 185,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 185, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 185, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 75, 186, 186, 186, 186, 186, 186, 7, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 185, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 185, 186, 186, 186, 186, 186, 35, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 148,
- 186, 13, 14, 186, 17, 16, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 135, 186,
- 186, 186, 186, 186, 186, 186, 3, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 185, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 177, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 38, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 39, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 19, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 90, 177, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 89, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 73, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 24, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 36, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 37,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 26, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 162, 186, 186,
- 186, 186, 186, 186, 30, 186, 31, 186, 186, 186,
-
- 76, 186, 77, 186, 74, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 6, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 142, 186, 186, 186, 186, 92,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 27, 186, 186, 186, 186, 186, 186,
- 118, 186, 117, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 15,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 40,
- 186, 186, 186, 186, 186, 186, 186, 186, 79, 78,
- 186, 186, 186, 186, 186, 186, 186, 114, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 58,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 62, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 34, 186, 186,
- 186, 186, 186, 186, 186, 186, 116, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 5, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 110, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 128, 186,
- 111, 186, 186, 140, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 25, 186, 186, 186, 186, 81,
- 186, 82, 80, 186, 186, 186, 186, 186, 186, 186,
- 88, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 112, 186, 186, 186, 186, 186, 186,
- 139, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 72, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 32,
- 186, 186, 21, 186, 186, 186, 18, 186, 97, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 47, 49, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 149, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 83, 186,
- 186, 186, 186, 186, 186, 87, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 91, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 134,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 101, 186, 105, 186, 186, 186, 186, 186,
- 86, 186, 186, 68, 186, 126, 186, 186, 186, 186,
- 186, 141, 186, 186, 186, 186, 186, 186, 186, 154,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 104, 186, 186, 186, 186, 186, 50, 51, 186,
-
- 186, 33, 57, 106, 186, 119, 186, 143, 115, 186,
- 186, 43, 186, 108, 186, 186, 186, 186, 186, 8,
- 186, 186, 186, 71, 186, 186, 186, 186, 164, 186,
- 125, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 93, 153, 186, 186, 186, 186, 186, 186, 186, 186,
- 136, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 107, 186, 186, 42,
- 44, 186, 186, 186, 186, 186, 186, 186, 70, 186,
-
- 186, 186, 186, 163, 186, 186, 186, 186, 130, 22,
- 23, 186, 186, 186, 186, 186, 186, 186, 67, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 132, 129, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 41, 186, 186, 186, 186, 186, 186, 186, 12,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 11, 186, 186, 20, 186, 186, 186, 167, 186, 45,
- 186, 138, 131, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 100, 99, 186, 186, 186, 133,
- 127, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 52, 186, 186, 186, 137, 186, 186, 186, 186, 186,
- 186, 186, 186, 46, 186, 186, 186, 94, 96, 120,
- 186, 186, 186, 98, 186, 186, 144, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 150, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 121,
- 186, 186, 186, 28, 186, 186, 186, 4, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 152, 186, 186,
- 124, 186, 186, 186, 186, 186, 186, 186, 55, 186,
-
- 29, 147, 186, 10, 186, 186, 186, 186, 186, 122,
- 59, 186, 186, 186, 103, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 151, 84, 186, 186, 186,
- 186, 61, 65, 60, 186, 53, 186, 9, 186, 186,
- 165, 186, 186, 102, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 66, 64, 186,
- 54, 186, 113, 186, 123, 186, 186, 186, 186, 95,
- 48, 186, 186, 186, 186, 186, 186, 186, 85, 63,
- 56, 166, 186, 186, 186, 146, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
-
- 186, 186, 186, 69, 186, 145, 161, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 109, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 157, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 155, 186, 158,
- 159, 186, 186, 186, 186, 186, 156, 160, 0
+ 1, 1, 179, 179, 183, 183, 187, 187, 191, 191,
+ 1, 1, 198, 195, 1, 177, 177, 196, 2, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 196,
+ 179, 180, 180, 181, 196, 183, 184, 184, 185, 196,
+ 190, 187, 188, 188, 189, 196, 191, 192, 192, 193,
+ 196, 194, 178, 2, 182, 194, 196, 195, 0, 1,
+ 2, 2, 2, 2, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 179, 0,
+ 183, 0, 190, 0, 187, 191, 0, 194, 0, 2,
+ 2, 194, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 194, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 194, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 76,
+ 195, 195, 195, 195, 195, 195, 8, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 87, 194, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 194, 195, 195,
+ 195, 195, 195, 36, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 157, 195, 14, 15, 195, 18,
+ 17, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 143, 195, 195, 195, 195,
+ 195, 195, 195, 195, 3, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 194, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 186, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 39, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 40, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 20, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 95, 195, 186, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 111, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 94, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 74, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 25, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 37, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 38, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 27, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 171, 195, 195, 195, 195, 195, 195, 195, 31, 195,
+ 32, 195, 195, 195, 77, 195, 78, 195, 195, 75,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 7, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 150, 195, 195, 195, 195, 97, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 28, 195, 195, 195, 195, 195, 195, 126, 195, 125,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 16, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 41, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 80, 79, 195,
+ 195, 195, 195, 195, 195, 195, 195, 121, 195, 195,
+ 195, 195, 195, 195, 195, 88, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 59, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 63, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 35,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 124,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 6,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 117, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 136, 195, 118, 195, 195, 148, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 26,
+ 195, 195, 195, 195, 83, 195, 84, 195, 82, 195,
+ 195, 195, 195, 195, 195, 195, 93, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 119,
+ 195, 195, 195, 195, 195, 122, 195, 147, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 73, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 33, 195, 195,
+ 22, 195, 195, 195, 195, 19, 195, 102, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 48, 50, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 158, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 85, 195, 195,
+ 195, 195, 195, 195, 195, 92, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 96, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 142,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 110, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 106, 195, 112, 195, 195, 195,
+ 195, 195, 91, 195, 195, 69, 195, 134, 195, 195,
+ 195, 195, 195, 149, 195, 195, 195, 195, 195, 195,
+ 195, 163, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 109, 195, 195, 195, 195, 195,
+ 51, 52, 195, 195, 34, 58, 113, 195, 127, 195,
+ 151, 123, 195, 195, 44, 195, 115, 195, 195, 195,
+ 195, 195, 9, 195, 195, 195, 72, 195, 195, 195,
+ 195, 173, 195, 133, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 98, 162, 195, 195, 195,
+ 195, 195, 195, 195, 195, 144, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 114, 195, 195, 43, 45, 195, 195, 195,
+ 195, 195, 195, 195, 71, 195, 195, 195, 195, 172,
+ 195, 195, 195, 195, 138, 23, 24, 195, 195, 195,
+ 195, 195, 195, 195, 195, 68, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 140, 137,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 42,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 13, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 12,
+ 195, 195, 21, 195, 195, 195, 176, 195, 46, 195,
+ 146, 139, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 105, 104, 195, 195, 195, 195,
+ 141, 135, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 53, 195, 195, 195, 145, 195, 195, 195,
+ 195, 195, 195, 195, 195, 47, 195, 195, 81, 195,
+ 99, 101, 128, 195, 195, 195, 103, 195, 195, 152,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 159, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 129, 195, 195, 195, 29, 195,
+ 195, 195, 195, 4, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 155, 195, 195, 195, 195,
+ 195, 195, 195, 195, 161, 195, 195, 132, 195, 195,
+ 195, 195, 195, 195, 195, 195, 56, 195, 30, 156,
+ 195, 11, 195, 195, 195, 195, 195, 195, 130, 60,
+ 195, 195, 195, 108, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 160, 89, 195, 86, 195, 195,
+
+ 195, 62, 66, 61, 195, 54, 195, 10, 195, 195,
+ 195, 174, 195, 195, 107, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 67, 65,
+ 195, 55, 195, 120, 195, 195, 131, 195, 195, 195,
+ 195, 100, 49, 195, 195, 195, 195, 195, 195, 195,
+ 90, 64, 57, 195, 175, 195, 195, 195, 154, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 70, 195,
+ 153, 170, 195, 195, 195, 195, 195, 195, 5, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 116, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 166,
+ 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 195, 195, 164, 195, 167, 168, 195, 195, 195,
+ 195, 195, 165, 169, 0
} ;
static yyconst YY_CHAR yy_ec[256] =
@@ -640,433 +649,447 @@ static yyconst YY_CHAR yy_meta[66] =
1, 1, 1, 1, 1
} ;
-static yyconst flex_uint16_t yy_base[1894] =
+static yyconst flex_uint16_t yy_base[1970] =
{ 0,
0, 0, 63, 66, 69, 71, 77, 83, 88, 91,
- 129, 135, 355, 314, 95, 5425, 5425, 5425, 107, 110,
- 142, 180, 108, 50, 145, 172, 118, 148, 121, 181,
- 197, 166, 241, 137, 225, 260, 233, 228, 257, 116,
- 263, 5425, 5425, 5425, 94, 244, 5425, 5425, 5425, 96,
- 221, 251, 5425, 5425, 5425, 304, 212, 5425, 5425, 5425,
- 102, 208, 5425, 308, 5425, 268, 318, 206, 322, 111,
- 0, 326, 0, 0, 201, 170, 217, 317, 193, 309,
- 318, 310, 183, 312, 336, 311, 307, 341, 343, 245,
- 335, 350, 363, 156, 346, 370, 371, 357, 358, 376,
-
- 387, 391, 393, 398, 386, 397, 385, 399, 414, 408,
- 429, 412, 421, 422, 424, 418, 352, 435, 439, 450,
- 438, 431, 467, 448, 459, 455, 164, 174, 141, 296,
- 134, 509, 165, 122, 312, 115, 513, 517, 0, 486,
- 487, 488, 496, 510, 501, 506, 502, 515, 529, 526,
- 533, 536, 542, 586, 538, 508, 541, 532, 548, 545,
- 553, 549, 559, 560, 565, 576, 582, 584, 569, 597,
- 598, 622, 618, 610, 609, 620, 616, 624, 627, 625,
- 626, 629, 638, 634, 641, 642, 647, 659, 655, 651,
- 667, 653, 665, 646, 661, 674, 682, 697, 677, 688,
-
- 678, 699, 711, 710, 701, 695, 722, 723, 715, 725,
- 716, 718, 719, 724, 728, 745, 752, 734, 344, 763,
- 765, 751, 755, 768, 769, 774, 738, 762, 784, 772,
- 778, 782, 788, 786, 795, 813, 815, 798, 817, 801,
- 805, 812, 790, 827, 825, 836, 811, 828, 845, 847,
- 863, 254, 857, 850, 846, 862, 869, 868, 874, 880,
- 876, 877, 887, 890, 835, 892, 895, 908, 888, 904,
- 907, 928, 927, 935, 922, 918, 930, 955, 937, 1000,
- 926, 952, 945, 946, 962, 943, 940, 957, 971, 979,
- 981, 982, 999, 990, 984, 1006, 1004, 1009, 1017, 1036,
-
- 1018, 1024, 1032, 1039, 1052, 1001, 1037, 1042, 1049, 1041,
- 1057, 1066, 1051, 1061, 1065, 1067, 1068, 1069, 1089, 1097,
- 1078, 1103, 1107, 1085, 1099, 1098, 1105, 1113, 1115, 1100,
- 1118, 5425, 1122, 1117, 1131, 1134, 1132, 1141, 5425, 1136,
- 1135, 1137, 1161, 1158, 1164, 1163, 1176, 1157, 1165, 1168,
- 1170, 1178, 1172, 1184, 1188, 1234, 1186, 1190, 1194, 1226,
- 1216, 1198, 1211, 1199, 1227, 1214, 1220, 1237, 1230, 1241,
- 1239, 1256, 1251, 1257, 1269, 1278, 1268, 1264, 1262, 1277,
- 1281, 1274, 1292, 1291, 1290, 1279, 1305, 1295, 1307, 1315,
- 1301, 1316, 1324, 1331, 1329, 1333, 1335, 1317, 1334, 1332,
-
- 1344, 1341, 1342, 1328, 1350, 1349, 1343, 1370, 1361, 1363,
- 1362, 1381, 1369, 1371, 1376, 1384, 1389, 1390, 1391, 1394,
- 1403, 1411, 1398, 1418, 1425, 1426, 1422, 1414, 1420, 1406,
- 1430, 1440, 1436, 1438, 1444, 1445, 1447, 1441, 1455, 1466,
- 1477, 1473, 1459, 1474, 1461, 1462, 1471, 1472, 1491, 1485,
- 1482, 1496, 1493, 1517, 1506, 1507, 1509, 1511, 1505, 1522,
- 1512, 1521, 1518, 1523, 1524, 1539, 1542, 1554, 1543, 1553,
- 1555, 1548, 1558, 1565, 1567, 1551, 1575, 1570, 5425, 1569,
- 1573, 1597, 1592, 1587, 1581, 1599, 1591, 1585, 1633, 5425,
- 1598, 5425, 5425, 1600, 5425, 5425, 1612, 1616, 1619, 1620,
-
- 1682, 1624, 1635, 1636, 1627, 1641, 1651, 1663, 1660, 1665,
- 1671, 1678, 1672, 1668, 1687, 1692, 1688, 1709, 1695, 1703,
- 1702, 1719, 1725, 1730, 1735, 1729, 1731, 1733, 1734, 1722,
- 1738, 1746, 1736, 1748, 1745, 1758, 1775, 1757, 5425, 1765,
- 1768, 1780, 1764, 1785, 1772, 1795, 5425, 1767, 1784, 1769,
- 1799, 1796, 1800, 1812, 1804, 1810, 1805, 1825, 1815, 1803,
- 1838, 1823, 1826, 1845, 1848, 1850, 1830, 1846, 1855, 1841,
- 1863, 1867, 1856, 1851, 1853, 1875, 1868, 1874, 1879, 1877,
- 1880, 1878, 1876, 1885, 1889, 1934, 1907, 1894, 1902, 1895,
- 1926, 1925, 1927, 1919, 1924, 1944, 1941, 1958, 1957, 1960,
-
- 1959, 1964, 1970, 1914, 1987, 1967, 1991, 1984, 1990, 2003,
- 1994, 2000, 2005, 1997, 1931, 2006, 5425, 1922, 2009, 2015,
- 2025, 2032, 2036, 2026, 2035, 2031, 2039, 2030, 2046, 2040,
- 2042, 2055, 2054, 5425, 2058, 2052, 2065, 2079, 2081, 2083,
- 2085, 2089, 2093, 2082, 5425, 2087, 2100, 2097, 2096, 2091,
- 2109, 2104, 2113, 2131, 2114, 2132, 2138, 2136, 2123, 2141,
- 1942, 2140, 2126, 2145, 2155, 2158, 2159, 2165, 2175, 2176,
- 5425, 2166, 2185, 2172, 2182, 2191, 2193, 2186, 2190, 2195,
- 2202, 2207, 120, 2205, 2215, 2206, 2210, 5425, 76, 2212,
- 2221, 2211, 2200, 2234, 2239, 2240, 2233, 2241, 2249, 2242,
-
- 2237, 2252, 2250, 2251, 2273, 2261, 2262, 2279, 2267, 2289,
- 2286, 2288, 2282, 2298, 2281, 2284, 2300, 2302, 2314, 2311,
- 2306, 2315, 2316, 2320, 2327, 2328, 2317, 2318, 2332, 2343,
- 2337, 2333, 2347, 5425, 2369, 2354, 2363, 2355, 2367, 2361,
- 2389, 2359, 2370, 2386, 2379, 2382, 2397, 2400, 2398, 2399,
- 2406, 2408, 2405, 2409, 2394, 2419, 2424, 2433, 2418, 2457,
- 2428, 1982, 2430, 5425, 2436, 2427, 2425, 2449, 2478, 2445,
- 2434, 2454, 2465, 2464, 2463, 2483, 2472, 2494, 5425, 2492,
- 2491, 2484, 2497, 2481, 2507, 2508, 2512, 2500, 2511, 2509,
- 2521, 2524, 2514, 2523, 2530, 5425, 2535, 2546, 2528, 2549,
-
- 2545, 2539, 2550, 2563, 2547, 2542, 2553, 2564, 2548, 2559,
- 2552, 2581, 2569, 2574, 2575, 2595, 2583, 2580, 2601, 5425,
- 2585, 2617, 2605, 2607, 2616, 2609, 2625, 2620, 2608, 2610,
- 2612, 2622, 2643, 2635, 2634, 2651, 2639, 2641, 2644, 2649,
- 2659, 2650, 2667, 2656, 2668, 2661, 2680, 2677, 2687, 2676,
- 2700, 2702, 2706, 2707, 2709, 5425, 2711, 2713, 2694, 2718,
- 2701, 2703, 2747, 2752, 2727, 2732, 2729, 2734, 2735, 2730,
- 2739, 2744, 2745, 2748, 2756, 2760, 2750, 2768, 2773, 2772,
- 2786, 2783, 2785, 2780, 2792, 2791, 2803, 5425, 2794, 2798,
- 2797, 2813, 2806, 2810, 5425, 2816, 5425, 2818, 2837, 2831,
-
- 5425, 2835, 5425, 2839, 5425, 2843, 2841, 2832, 2827, 2849,
- 2850, 2833, 2851, 2860, 2856, 2845, 2870, 2882, 2866, 2883,
- 5425, 2871, 2877, 2894, 2887, 2876, 2879, 2893, 2897, 2898,
- 2906, 2905, 2908, 2909, 5425, 2916, 2931, 2915, 2933, 5425,
- 2913, 2940, 2935, 2925, 2953, 2950, 2943, 2942, 2949, 2938,
- 2970, 2957, 2978, 2964, 2966, 2967, 2983, 2993, 2969, 2990,
- 2999, 2996, 2984, 2998, 3004, 2989, 3009, 3000, 3008, 3012,
- 3014, 3019, 3016, 5425, 3038, 3039, 3027, 3040, 3041, 3036,
- 5425, 3055, 5425, 3049, 3054, 3051, 3046, 3063, 3066, 3079,
- 3077, 3096, 3087, 3074, 3082, 3080, 3089, 3084, 3093, 5425,
-
- 3083, 3099, 3118, 3112, 3115, 3126, 3132, 3125, 3111, 5425,
- 3140, 3123, 3144, 3142, 3143, 3153, 3149, 3169, 5425, 5425,
- 3146, 3152, 3139, 3158, 3186, 3167, 3170, 5425, 3171, 3189,
- 3182, 3190, 3196, 3194, 3179, 3185, 3207, 3197, 3212, 3213,
- 3214, 3216, 3236, 3221, 3224, 3231, 3244, 3246, 3245, 5425,
- 3250, 3238, 3254, 3256, 3252, 3258, 3263, 3251, 3265, 3277,
- 3260, 3273, 3289, 3295, 3282, 3279, 3281, 3296, 3285, 3310,
- 3311, 3313, 3318, 3316, 5425, 3322, 3302, 3325, 3306, 3324,
- 3326, 3338, 3343, 3321, 3339, 3340, 3344, 5425, 3336, 3348,
- 3360, 3346, 3373, 3358, 3354, 3379, 5425, 3352, 3390, 3377,
-
- 3386, 3385, 3371, 3401, 3382, 3395, 5425, 3405, 3399, 3396,
- 3407, 3419, 3422, 3425, 3426, 3418, 3413, 3417, 3430, 3444,
- 3421, 3424, 3454, 3441, 3440, 3446, 3458, 3453, 3465, 3468,
- 3470, 3451, 3473, 3480, 3475, 3494, 3497, 3477, 3486, 3500,
- 3489, 3504, 3493, 3485, 3513, 3495, 3519, 3506, 5425, 3520,
- 3525, 3529, 3534, 3516, 3532, 3537, 3533, 3540, 5425, 3543,
- 5425, 3551, 3545, 5425, 3546, 3541, 3535, 3562, 3556, 3560,
- 3573, 3575, 3590, 3578, 5425, 3587, 3576, 3582, 3584, 5425,
- 3595, 5425, 5425, 3581, 3583, 3616, 3608, 3612, 3626, 3627,
- 5425, 3622, 3610, 3631, 3624, 3615, 3634, 3635, 3638, 3618,
-
- 3649, 3621, 3652, 5425, 3661, 3665, 3651, 3670, 3673, 3674,
- 5425, 3668, 3681, 3658, 3685, 3687, 3693, 3699, 3688, 3701,
- 3691, 3700, 3709, 3711, 5425, 3710, 3716, 3686, 3723, 3720,
- 3714, 3727, 3737, 3738, 3732, 3743, 3751, 3736, 3746, 5425,
- 3761, 3763, 5425, 3747, 3756, 3759, 5425, 3771, 5425, 3778,
- 3774, 3767, 3772, 3791, 3787, 3797, 3788, 3802, 3795, 3799,
- 3813, 3809, 3801, 5425, 5425, 3810, 3811, 3825, 3829, 3819,
- 3814, 3839, 3837, 3843, 5425, 3824, 3840, 3827, 3838, 3855,
- 3844, 3847, 3861, 3864, 3858, 3870, 3852, 3865, 5425, 3871,
- 3859, 3874, 3882, 3869, 3885, 5425, 3899, 3901, 3900, 3902,
-
- 3905, 3914, 3907, 3917, 3908, 3909, 3919, 3924, 3925, 3920,
- 3937, 3930, 3938, 3953, 3935, 5425, 3950, 3956, 3940, 3958,
- 3942, 3957, 3965, 3972, 3970, 3952, 3974, 3975, 3976, 5425,
- 3984, 3982, 3981, 3987, 3993, 3998, 4006, 3986, 4009, 4013,
- 4007, 4021, 4002, 4011, 4014, 4023, 4015, 4034, 4036, 4033,
- 4056, 4054, 5425, 4039, 5425, 4055, 4066, 4060, 4068, 4051,
- 5425, 4061, 4070, 5425, 4053, 5425, 4072, 4084, 4080, 4078,
- 4101, 5425, 4108, 4095, 4111, 4098, 4099, 4096, 4117, 5425,
- 4116, 4121, 4114, 4125, 4126, 4135, 4127, 4136, 4128, 4123,
- 4153, 5425, 4145, 4160, 4168, 4158, 4167, 5425, 5425, 4157,
-
- 4173, 5425, 5425, 5425, 4170, 5425, 4163, 5425, 5425, 4172,
- 4175, 5425, 4178, 5425, 4183, 4188, 4187, 4184, 4186, 5425,
- 4190, 4195, 4212, 5425, 4210, 4224, 4205, 4211, 5425, 4221,
- 5425, 4220, 4227, 4214, 4230, 4231, 4240, 4242, 4232, 4243,
- 4233, 4237, 4251, 4260, 4246, 4268, 4270, 4248, 4257, 4267,
- 4258, 4269, 4285, 4271, 4278, 4276, 4294, 4291, 4302, 4310,
- 5425, 5425, 4295, 4296, 4297, 4305, 4308, 4313, 4312, 4327,
- 5425, 4320, 4322, 4329, 4335, 4316, 4341, 4337, 4346, 4345,
- 4352, 4348, 4354, 4351, 4362, 4356, 5425, 4373, 4368, 5425,
- 5425, 4364, 4371, 4385, 4375, 4381, 4388, 4400, 5425, 4391,
-
- 4401, 4407, 4397, 5425, 4413, 4402, 4416, 4419, 5425, 5425,
- 5425, 4422, 4398, 4426, 4425, 4431, 4432, 4433, 5425, 4427,
- 4434, 4440, 4429, 4438, 4455, 4457, 4474, 4468, 4475, 4476,
- 5425, 5425, 4466, 4478, 4477, 4480, 4483, 4471, 4482, 4484,
- 4487, 5425, 4491, 4470, 4507, 4513, 4514, 4524, 4518, 5425,
- 4509, 4510, 4512, 4529, 4516, 4533, 4534, 4532, 4536, 4541,
- 5425, 4539, 4540, 5425, 4560, 4556, 4557, 5425, 4573, 5425,
- 4576, 5425, 5425, 4558, 4580, 4579, 4577, 4586, 4588, 4571,
- 4596, 4594, 4592, 4591, 5425, 5425, 4624, 4605, 4598, 5425,
- 5425, 4607, 4609, 4623, 4613, 4615, 4603, 4602, 4614, 4637,
-
- 4629, 4642, 4646, 4636, 4644, 4639, 4641, 4656, 4657, 4658,
- 5425, 4661, 4679, 4675, 5425, 4663, 4687, 4685, 4684, 4676,
- 4695, 4683, 4688, 5425, 4690, 4686, 4694, 5425, 5425, 5425,
- 4722, 4728, 4721, 5425, 4726, 4732, 5425, 4725, 4715, 4705,
- 4716, 4739, 4720, 4743, 4742, 4741, 5425, 4753, 4758, 4750,
- 4747, 4766, 4760, 4762, 4771, 4777, 4757, 4786, 4769, 5425,
- 4790, 4791, 4787, 5425, 4795, 4785, 4774, 5425, 4806, 4802,
- 4798, 4811, 4821, 4804, 4814, 4808, 4827, 4833, 4829, 4825,
- 4819, 4841, 4835, 4832, 4846, 4852, 4845, 5425, 4849, 4855,
- 5425, 4853, 4861, 4860, 4877, 4881, 4883, 4879, 5425, 4886,
-
- 5425, 5425, 4888, 5425, 4890, 4880, 4882, 4893, 4895, 5425,
- 5425, 4897, 4898, 4907, 5425, 4899, 4903, 4909, 4916, 4921,
- 4913, 4917, 4920, 4924, 4930, 5425, 5425, 4922, 4952, 4953,
- 4950, 5425, 5425, 5425, 4959, 5425, 4957, 5425, 4963, 4956,
- 5425, 4966, 4958, 5425, 4949, 4962, 4974, 4968, 4978, 4977,
- 4981, 4972, 4986, 4991, 4998, 4992, 5010, 5425, 5425, 5012,
- 5425, 5015, 5425, 5016, 5425, 5005, 5019, 5009, 5021, 5425,
- 5425, 5023, 4995, 5013, 5030, 5022, 5034, 5029, 5425, 5425,
- 5425, 5425, 5051, 5038, 5046, 5425, 5048, 5050, 5047, 5049,
- 5053, 5056, 5073, 5064, 5062, 5070, 5084, 5087, 5090, 5074,
-
- 5089, 5106, 5091, 5425, 5094, 5425, 5425, 5093, 5107, 5110,
- 5111, 5100, 5116, 5114, 5123, 5117, 5132, 5127, 5124, 5143,
- 5134, 5157, 5144, 5155, 5159, 5147, 5151, 5163, 5161, 5162,
- 5173, 5169, 5175, 5170, 5425, 5172, 5179, 5182, 5190, 5204,
- 5202, 5193, 5210, 5213, 5217, 5208, 5197, 5218, 5219, 5220,
- 5229, 5228, 5231, 5425, 5246, 5247, 5238, 5240, 5235, 5242,
- 5245, 5265, 5268, 5263, 5271, 5276, 5273, 5425, 5277, 5425,
- 5425, 5278, 5262, 5275, 5285, 5287, 5425, 5425, 5425, 5333,
- 5340, 5347, 5354, 5361, 82, 5368, 5375, 5382, 5389, 5396,
- 5403, 5410, 5417
-
+ 129, 135, 354, 275, 95, 5624, 5624, 5624, 107, 110,
+ 142, 180, 108, 145, 152, 186, 50, 149, 121, 182,
+ 210, 177, 254, 137, 225, 229, 205, 227, 273, 116,
+ 271, 5624, 5624, 5624, 94, 268, 5624, 5624, 5624, 96,
+ 261, 295, 5624, 5624, 5624, 299, 256, 5624, 5624, 5624,
+ 102, 250, 5624, 318, 5624, 141, 322, 228, 326, 111,
+ 0, 330, 0, 0, 257, 235, 277, 324, 310, 266,
+ 323, 314, 125, 312, 348, 322, 326, 341, 320, 351,
+ 339, 359, 357, 374, 209, 362, 378, 392, 358, 373,
+
+ 386, 404, 389, 405, 410, 398, 379, 424, 409, 435,
+ 414, 432, 422, 430, 431, 429, 445, 218, 441, 464,
+ 456, 450, 455, 477, 481, 472, 460, 483, 224, 174,
+ 220, 150, 172, 524, 206, 159, 272, 122, 528, 536,
+ 0, 495, 519, 307, 515, 525, 513, 520, 514, 528,
+ 542, 539, 547, 468, 557, 601, 552, 546, 540, 549,
+ 559, 564, 580, 573, 574, 581, 572, 592, 598, 625,
+ 586, 611, 602, 633, 640, 639, 632, 623, 643, 642,
+ 655, 659, 649, 650, 651, 660, 658, 666, 654, 652,
+ 670, 679, 676, 690, 677, 682, 702, 685, 706, 703,
+
+ 715, 697, 707, 712, 718, 722, 729, 724, 726, 725,
+ 733, 754, 750, 758, 742, 743, 745, 756, 751, 763,
+ 760, 772, 454, 778, 791, 780, 782, 795, 790, 793,
+ 784, 787, 799, 803, 805, 812, 807, 815, 814, 823,
+ 837, 813, 826, 841, 828, 829, 839, 852, 854, 849,
+ 850, 860, 862, 872, 863, 889, 509, 877, 878, 886,
+ 873, 884, 903, 909, 905, 900, 912, 896, 904, 925,
+ 918, 921, 944, 923, 939, 934, 950, 935, 959, 936,
+ 942, 954, 970, 961, 1015, 963, 983, 998, 985, 974,
+ 981, 994, 995, 986, 1008, 1011, 1019, 1022, 1036, 1020,
+
+ 1038, 1025, 1047, 1032, 1055, 551, 1042, 1052, 1054, 1057,
+ 1074, 1069, 1079, 1067, 1064, 1077, 1081, 1075, 1084, 1100,
+ 1096, 1093, 1110, 1115, 1113, 1120, 1117, 1111, 1127, 1129,
+ 1126, 1112, 1123, 1140, 1131, 1160, 1158, 1143, 1165, 5624,
+ 1167, 1148, 1170, 1162, 1153, 1172, 5624, 1156, 1182, 1190,
+ 1138, 1197, 1181, 1199, 1185, 1214, 1193, 1195, 1217, 1203,
+ 1220, 1211, 1209, 1259, 1219, 1230, 1234, 1257, 1253, 1243,
+ 1268, 1246, 1273, 1264, 1270, 1266, 1280, 1288, 1298, 1295,
+ 1292, 1301, 1231, 5624, 1309, 1318, 1305, 1302, 1308, 1315,
+ 1324, 1322, 1331, 1327, 1330, 1326, 1347, 1343, 1340, 1369,
+
+ 1349, 1355, 1363, 1368, 1371, 1372, 1379, 1357, 1375, 1358,
+ 1383, 1385, 1384, 1386, 1373, 1396, 1389, 1395, 1416, 1390,
+ 1402, 1407, 1421, 1413, 1405, 1422, 1430, 1435, 1432, 1436,
+ 1429, 1440, 1449, 1458, 1448, 1444, 1471, 1475, 1468, 1462,
+ 1467, 1483, 1477, 1487, 1488, 1479, 1490, 1486, 1503, 1497,
+ 1510, 1509, 1515, 1525, 1521, 1513, 1526, 1504, 1511, 1514,
+ 1524, 1530, 1536, 1543, 1546, 1547, 1550, 1571, 1549, 1556,
+ 1561, 1574, 1569, 1576, 1563, 1567, 1584, 1592, 1577, 1593,
+ 1605, 1607, 1596, 1608, 1609, 1602, 1613, 1620, 1627, 1617,
+ 1629, 1637, 1624, 5624, 1632, 1635, 1649, 1651, 1640, 1665,
+
+ 1660, 1648, 1644, 1692, 5624, 1657, 5624, 5624, 1662, 5624,
+ 5624, 1682, 1675, 1690, 1685, 1678, 1741, 1683, 1680, 1695,
+ 1700, 1723, 1722, 1734, 1724, 1736, 1747, 1751, 1750, 1738,
+ 1757, 1763, 1766, 1765, 1770, 1774, 1777, 1778, 1790, 1788,
+ 1730, 1798, 1799, 1800, 1801, 1803, 1813, 1814, 1817, 1815,
+ 1808, 1812, 1829, 1818, 1828, 5624, 1823, 1840, 1850, 1838,
+ 1842, 1839, 1833, 1860, 5624, 1841, 1867, 1861, 1858, 1864,
+ 1873, 1874, 1888, 1877, 1884, 1887, 1885, 1894, 1900, 1875,
+ 1898, 1902, 1911, 1921, 1922, 1909, 1919, 1927, 1913, 1936,
+ 1943, 1938, 1924, 1939, 1948, 1930, 1947, 1944, 1956, 1945,
+
+ 1963, 1954, 1958, 1964, 1966, 2011, 1975, 1980, 1977, 1971,
+ 1997, 1991, 1983, 1985, 1994, 2013, 2010, 2024, 2026, 2028,
+ 2009, 2034, 2040, 2038, 2045, 2075, 2050, 2055, 2057, 2051,
+ 2069, 2059, 2072, 2065, 2066, 2068, 2084, 5624, 2078, 2097,
+ 2090, 2091, 2117, 2111, 2095, 2110, 2107, 2120, 2106, 2121,
+ 2112, 2128, 2131, 2136, 2134, 5624, 2130, 2144, 2139, 2155,
+ 2159, 2163, 2156, 2166, 2174, 2171, 5624, 2161, 2179, 2195,
+ 2170, 2188, 2183, 2190, 2187, 2182, 2192, 2200, 2215, 2219,
+ 2212, 2209, 2222, 2208, 2229, 2223, 2230, 2226, 2235, 2239,
+ 2245, 2252, 2256, 2262, 5624, 2246, 2260, 2265, 2257, 2274,
+
+ 2278, 2280, 2275, 2279, 2283, 2281, 106, 2282, 2290, 2285,
+ 2286, 5624, 2296, 90, 2302, 2303, 2294, 2323, 2332, 2328,
+ 2329, 2321, 2322, 2339, 2325, 2327, 2330, 2338, 2349, 2347,
+ 2355, 2352, 2345, 2357, 2374, 2376, 2378, 2372, 2380, 2371,
+ 2379, 2382, 2373, 2406, 2398, 5624, 2414, 2412, 2405, 2403,
+ 2408, 2419, 2415, 2409, 2410, 2416, 2445, 2425, 2436, 2448,
+ 5624, 2397, 2446, 2454, 2439, 2463, 2452, 2469, 2455, 2466,
+ 2470, 2472, 2467, 2481, 2487, 2495, 2483, 2497, 2503, 2496,
+ 2501, 2499, 2491, 2515, 2520, 2512, 2521, 2544, 2540, 176,
+ 2523, 5624, 2539, 2530, 2528, 2529, 2563, 2555, 2556, 2566,
+
+ 2565, 2567, 2559, 2570, 2551, 2573, 2554, 5624, 2581, 2593,
+ 2580, 2605, 2589, 2610, 2607, 2592, 2614, 2597, 2616, 2615,
+ 2622, 2628, 2620, 2624, 2626, 5624, 2632, 2635, 2640, 2639,
+ 2637, 2642, 2641, 2658, 2643, 2651, 2653, 2678, 2667, 2655,
+ 2665, 2666, 2682, 2669, 2670, 2673, 2694, 2686, 2692, 2696,
+ 5624, 2693, 2729, 2697, 2709, 2705, 2713, 2734, 2731, 2726,
+ 2719, 2721, 2723, 2740, 2725, 2739, 2751, 2742, 2730, 2761,
+ 2757, 2748, 2762, 2764, 2774, 2778, 2775, 2776, 2772, 2782,
+ 2786, 2790, 2788, 2799, 2800, 2813, 2815, 5624, 2818, 2819,
+ 2804, 2820, 2821, 2809, 2833, 2834, 2812, 2837, 2838, 2827,
+
+ 2839, 2845, 2841, 2844, 2848, 2850, 2854, 2860, 2849, 2864,
+ 2881, 2883, 2876, 2889, 2887, 2891, 2880, 2890, 2885, 2921,
+ 5624, 2884, 2902, 2919, 2901, 2912, 2914, 2925, 5624, 2915,
+ 5624, 2931, 2937, 2939, 5624, 2943, 5624, 2944, 2929, 5624,
+ 2946, 2952, 2932, 2950, 2941, 2957, 2954, 2978, 2963, 2984,
+ 2964, 2976, 2988, 2974, 2989, 5624, 2995, 2979, 2990, 2998,
+ 3002, 3003, 3008, 2991, 3012, 3031, 3035, 3041, 3016, 3042,
+ 5624, 3030, 3045, 3027, 3043, 5624, 3024, 3051, 3053, 3054,
+ 3079, 3057, 3056, 3068, 3059, 3062, 3063, 3098, 3095, 3081,
+ 3083, 3080, 3107, 3106, 3109, 3090, 3110, 3116, 3114, 3103,
+
+ 3108, 3112, 3104, 3135, 3131, 3124, 3129, 3130, 3138, 3133,
+ 5624, 3153, 3156, 3148, 3157, 3158, 3162, 5624, 3172, 5624,
+ 3141, 3169, 3179, 3168, 3185, 3177, 3183, 3199, 3189, 3176,
+ 3207, 3195, 3204, 3200, 3206, 3205, 3212, 5624, 3216, 3219,
+ 3222, 3236, 3231, 3248, 3254, 3247, 3239, 5624, 3234, 3244,
+ 3260, 3258, 3264, 3268, 3276, 3277, 3291, 5624, 5624, 3274,
+ 3297, 3285, 3281, 3283, 3280, 3295, 3296, 5624, 3286, 3312,
+ 3304, 3323, 3325, 3310, 3317, 5624, 3320, 3334, 3331, 3341,
+ 3337, 3339, 3344, 3346, 3342, 3338, 3347, 3359, 3357, 3370,
+ 5624, 3372, 3373, 3379, 3376, 3380, 3383, 3381, 3374, 3386,
+
+ 3402, 3375, 3390, 3394, 3400, 3404, 3407, 3403, 3414, 3408,
+ 3433, 3415, 3437, 3435, 3444, 3440, 5624, 3448, 3427, 3450,
+ 3422, 3456, 3457, 3452, 3468, 3441, 3449, 3463, 3466, 5624,
+ 3451, 3470, 3473, 3472, 3488, 3474, 3483, 3501, 3503, 5624,
+ 3495, 3506, 3496, 3510, 3515, 3493, 3525, 3508, 3520, 5624,
+ 3522, 3516, 3521, 3532, 3544, 3549, 3550, 3551, 3546, 3537,
+ 3543, 3548, 3564, 3547, 3553, 3568, 3566, 3571, 3570, 3582,
+ 3593, 3591, 3588, 3594, 3601, 3595, 3597, 3587, 3576, 3602,
+ 3623, 3608, 3604, 3613, 3637, 3624, 3635, 3629, 3617, 3649,
+ 3626, 3650, 3643, 5624, 3644, 3653, 3658, 3659, 3640, 3666,
+
+ 3656, 3667, 3669, 5624, 3674, 5624, 3662, 3683, 5624, 3685,
+ 3684, 3671, 3681, 3686, 3688, 3698, 3709, 3713, 3689, 5624,
+ 3720, 3701, 3717, 3718, 5624, 3723, 5624, 3722, 5624, 3724,
+ 3728, 3737, 3735, 3755, 3741, 3757, 5624, 3751, 3740, 3762,
+ 3764, 3750, 3749, 3768, 3769, 3748, 3777, 3766, 3779, 5624,
+ 3789, 3795, 3784, 3798, 3805, 5624, 3800, 5624, 3796, 3814,
+ 3791, 3815, 3826, 3829, 3830, 3813, 3818, 3819, 3843, 3836,
+ 3825, 5624, 3832, 3840, 3850, 3863, 3853, 3846, 3847, 3867,
+ 3869, 3870, 3874, 3877, 3884, 3876, 3875, 5624, 3895, 3902,
+ 5624, 3892, 3888, 3898, 3901, 5624, 3912, 5624, 3914, 3906,
+
+ 3899, 3922, 3923, 3927, 3930, 3919, 3933, 3935, 3929, 3959,
+ 3944, 3941, 5624, 5624, 3953, 3957, 3970, 3971, 3962, 3955,
+ 3979, 3976, 3977, 5624, 3958, 3982, 3967, 3980, 3986, 3978,
+ 3999, 3992, 3998, 3997, 4006, 3994, 4008, 5624, 4009, 4007,
+ 4013, 4022, 4023, 4004, 4024, 5624, 4032, 4043, 4035, 4038,
+ 4040, 4055, 4058, 4060, 4051, 4050, 4061, 4069, 4074, 4057,
+ 4081, 4068, 4089, 4091, 4073, 5624, 4093, 4094, 4078, 4099,
+ 4084, 4100, 4101, 4114, 4107, 4090, 4095, 4113, 4112, 5624,
+ 4118, 4120, 4108, 4140, 4146, 4129, 4149, 4125, 4152, 4145,
+ 5624, 4150, 4155, 4136, 4156, 4137, 4163, 4179, 4159, 4182,
+
+ 4183, 4180, 4170, 4189, 5624, 4178, 5624, 4190, 4201, 4204,
+ 4213, 4210, 5624, 4197, 4206, 5624, 4196, 5624, 4224, 4229,
+ 4216, 4226, 4244, 5624, 4245, 4233, 4249, 4240, 4241, 4239,
+ 4261, 5624, 4242, 4267, 4248, 4259, 4260, 4263, 4278, 4277,
+ 4273, 4279, 4282, 4289, 5624, 4285, 4291, 4302, 4305, 4297,
+ 5624, 5624, 4300, 4316, 5624, 5624, 5624, 4303, 5624, 4307,
+ 5624, 5624, 4310, 4321, 5624, 4331, 5624, 4306, 4334, 4320,
+ 4323, 4333, 5624, 4327, 4337, 4339, 5624, 4342, 4357, 4341,
+ 4340, 5624, 4356, 5624, 4365, 4369, 4360, 4372, 4375, 4379,
+ 4380, 4373, 4363, 4387, 4382, 4383, 4391, 4384, 4393, 4405,
+
+ 4408, 4397, 4399, 4412, 4404, 4415, 4426, 4424, 4416, 4414,
+ 4432, 4440, 4438, 4447, 4448, 5624, 5624, 4442, 4439, 4446,
+ 4450, 4469, 4459, 4453, 4480, 5624, 4458, 4473, 4465, 4484,
+ 4472, 4475, 4476, 4474, 4485, 4488, 4517, 4498, 4507, 4500,
+ 4518, 4506, 5624, 4515, 4509, 5624, 5624, 4510, 4529, 4535,
+ 4525, 4520, 4539, 4537, 5624, 4533, 4550, 4558, 4556, 5624,
+ 4561, 4544, 4570, 4572, 5624, 5624, 5624, 4573, 4557, 4565,
+ 4567, 4575, 4577, 4568, 4581, 5624, 4571, 4588, 4605, 4596,
+ 4591, 4612, 4614, 4617, 4623, 4619, 4625, 4626, 5624, 5624,
+ 4615, 4631, 4629, 4630, 4627, 4632, 4637, 4638, 4649, 5624,
+
+ 4663, 4662, 4650, 4656, 4664, 4670, 4674, 4671, 5624, 4659,
+ 4665, 4684, 4681, 4690, 4695, 4683, 4699, 4705, 4710, 5624,
+ 4707, 4706, 5624, 4714, 4711, 4708, 5624, 4720, 5624, 4724,
+ 5624, 5624, 4729, 4726, 4728, 4736, 4744, 4757, 4758, 4741,
+ 4746, 4644, 4761, 4763, 5624, 5624, 4769, 4747, 4756, 4768,
+ 5624, 5624, 4772, 4764, 4773, 4774, 4783, 4766, 4775, 4779,
+ 4804, 4794, 4810, 4814, 4816, 4802, 4819, 4800, 4796, 4823,
+ 4806, 4808, 5624, 4834, 4833, 4843, 5624, 4838, 4852, 4850,
+ 4849, 4842, 4866, 4851, 4859, 5624, 4862, 4855, 5624, 4847,
+ 5624, 5624, 5624, 4875, 4886, 4879, 5624, 4885, 4896, 5624,
+
+ 4892, 4894, 4881, 4877, 4884, 4904, 4898, 4914, 4893, 4922,
+ 5624, 4907, 4920, 4929, 4924, 4934, 4930, 4917, 4921, 4942,
+ 4941, 4928, 4952, 4944, 5624, 4958, 4959, 4965, 5624, 4972,
+ 4955, 4951, 4957, 5624, 4979, 4969, 4966, 4987, 4989, 4981,
+ 4982, 4971, 4995, 5001, 5010, 5624, 4993, 4992, 5014, 5008,
+ 5006, 5027, 5028, 5024, 5624, 5026, 5015, 5624, 5029, 5031,
+ 5016, 5042, 5048, 5049, 5050, 5054, 5624, 5060, 5624, 5624,
+ 5061, 5624, 5064, 5051, 5063, 5057, 5067, 5074, 5624, 5624,
+ 5072, 5068, 5077, 5624, 5076, 5078, 5092, 5073, 5094, 5090,
+ 5095, 5109, 5093, 5110, 5624, 5624, 5112, 5624, 5113, 5116,
+
+ 5124, 5624, 5624, 5624, 5118, 5624, 5129, 5624, 5130, 5131,
+ 5120, 5624, 5144, 5135, 5624, 5145, 5137, 5147, 5152, 5165,
+ 5161, 5142, 5153, 5157, 5176, 5177, 5164, 5170, 5624, 5624,
+ 5185, 5624, 5186, 5624, 5180, 5187, 5624, 5184, 5197, 5191,
+ 5199, 5624, 5624, 5212, 5204, 5203, 5214, 5201, 5209, 5205,
+ 5624, 5624, 5624, 5226, 5624, 5218, 5223, 5224, 5624, 5241,
+ 5242, 5239, 5244, 5245, 5232, 5248, 5240, 5237, 5264, 5274,
+ 5276, 5272, 5275, 5256, 5271, 5282, 5278, 5293, 5624, 5279,
+ 5624, 5624, 5291, 5299, 5300, 5297, 5301, 5296, 5624, 5298,
+ 5303, 5304, 5316, 5313, 5328, 5330, 5326, 5346, 5331, 5343,
+
+ 5349, 5342, 5338, 5350, 5344, 5360, 5363, 5356, 5365, 5353,
+ 5624, 5359, 5370, 5375, 5372, 5395, 5393, 5381, 5402, 5404,
+ 5408, 5407, 5391, 5368, 5412, 5417, 5409, 5421, 5423, 5624,
+ 5433, 5440, 5430, 5435, 5446, 5437, 5439, 5451, 5443, 5461,
+ 5459, 5463, 5464, 5624, 5470, 5624, 5624, 5472, 5465, 5474,
+ 5480, 5482, 5624, 5624, 5624, 5532, 5539, 5546, 5553, 5560,
+ 82, 5567, 5574, 5581, 5588, 5595, 5602, 5609, 5616
} ;
-static yyconst flex_int16_t yy_def[1894] =
+static yyconst flex_int16_t yy_def[1970] =
{ 0,
- 1879, 1, 1880, 1880, 1881, 1881, 1882, 1882, 1883, 1883,
- 1884, 1884, 1879, 1885, 1879, 1879, 1879, 1879, 1886, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1887, 1879, 1879, 1879, 1887, 1888, 1879, 1879, 1879, 1888,
- 1889, 1879, 1879, 1879, 1879, 1889, 1890, 1879, 1879, 1879,
- 1890, 1891, 1879, 1892, 1879, 1891, 1891, 1885, 1885, 1879,
- 1893, 1886, 1893, 1886, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1887, 1887, 1888, 1888,
- 1889, 1889, 1879, 1890, 1890, 1891, 1891, 1892, 1892, 1891,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1891, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1891, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1891, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1891, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1879, 1879, 1885, 1879, 1879, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1891, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1891, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1879, 1885, 1885, 1885,
-
- 1879, 1885, 1879, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1879, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1879,
- 1885, 1879, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1879, 1885, 1885, 1885, 1879, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1879, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1879, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1879, 1885, 1879, 1885, 1885, 1885, 1885,
- 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1879, 1879, 1885,
-
- 1885, 1879, 1879, 1879, 1885, 1879, 1885, 1879, 1879, 1885,
- 1885, 1879, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1879, 1885,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1879,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
-
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1879, 1879,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1879, 1885, 1885, 1885, 1879, 1885, 1879,
- 1885, 1879, 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1879, 1885, 1885, 1885, 1879,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1879, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1879, 1879, 1879,
- 1885, 1885, 1885, 1879, 1885, 1885, 1879, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1879, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1885,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885,
-
- 1879, 1879, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1879,
- 1879, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1879, 1879, 1885, 1885, 1885,
- 1885, 1879, 1879, 1879, 1885, 1879, 1885, 1879, 1885, 1885,
- 1879, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1879, 1885,
- 1879, 1885, 1879, 1885, 1879, 1885, 1885, 1885, 1885, 1879,
- 1879, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1879,
- 1879, 1879, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
-
- 1885, 1885, 1885, 1879, 1885, 1879, 1879, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1879, 1885, 1885, 1885, 1885, 1885, 1885,
- 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1879, 1885, 1879,
- 1879, 1885, 1885, 1885, 1885, 1885, 1879, 1879, 0, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879
-
+ 1955, 1, 1956, 1956, 1957, 1957, 1958, 1958, 1959, 1959,
+ 1960, 1960, 1955, 1961, 1955, 1955, 1955, 1955, 1962, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1963, 1955, 1955, 1955, 1963, 1964, 1955, 1955, 1955, 1964,
+ 1965, 1955, 1955, 1955, 1955, 1965, 1966, 1955, 1955, 1955,
+ 1966, 1967, 1955, 1968, 1955, 1967, 1967, 1961, 1961, 1955,
+ 1969, 1962, 1969, 1962, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1963, 1963,
+ 1964, 1964, 1965, 1965, 1955, 1966, 1966, 1967, 1967, 1968,
+ 1968, 1967, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1967, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1967, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1955, 1967, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1967, 1961, 1961,
+ 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1955, 1961, 1955, 1955, 1961, 1955,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1967, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1955, 1961, 1967, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961,
+ 1955, 1961, 1961, 1961, 1955, 1961, 1955, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1955, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1955, 1961, 1955, 1961, 1961, 1955, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1955, 1961, 1955, 1961, 1955, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1955, 1961, 1955, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1955, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1955, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1955, 1961, 1961, 1955, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1955, 1961, 1961, 1955, 1955, 1955, 1961, 1955, 1961,
+ 1955, 1955, 1961, 1961, 1955, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1955, 1961, 1961, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1955, 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1955, 1961, 1961, 1955, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1955, 1955, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1955, 1961, 1961, 1961, 1955, 1961, 1955, 1961,
+ 1955, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1955, 1961, 1961, 1961, 1961,
+ 1955, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1955, 1961, 1961, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1955, 1961,
+ 1955, 1955, 1955, 1961, 1961, 1961, 1955, 1961, 1961, 1955,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1955, 1961,
+ 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1961, 1961, 1955, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961, 1955, 1955,
+ 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1955,
+ 1961, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1955, 1955, 1961, 1955, 1961, 1961,
+
+ 1961, 1955, 1955, 1955, 1961, 1955, 1961, 1955, 1961, 1961,
+ 1961, 1955, 1961, 1961, 1955, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1955,
+ 1961, 1955, 1961, 1955, 1961, 1961, 1955, 1961, 1961, 1961,
+ 1961, 1955, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1955, 1955, 1961, 1955, 1961, 1961, 1961, 1955, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961,
+ 1955, 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1955, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1955, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1955,
+ 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961,
+ 1961, 1961, 1961, 1955, 1961, 1955, 1955, 1961, 1961, 1961,
+ 1961, 1961, 1955, 1955, 0, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955
} ;
-static yyconst flex_uint16_t yy_nxt[5491] =
+static yyconst flex_uint16_t yy_nxt[5690] =
{ 0,
14, 15, 16, 17, 18, 19, 18, 14, 14, 14,
14, 18, 20, 14, 21, 22, 23, 24, 14, 25,
@@ -1075,605 +1098,627 @@ static yyconst flex_uint16_t yy_nxt[5491] =
14, 21, 22, 23, 24, 14, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 14, 14, 14, 14, 42, 43, 44, 42, 43,
- 44, 47, 48, 47, 48, 49, 88, 49, 52, 53,
+ 44, 47, 48, 47, 48, 49, 96, 49, 52, 53,
54, 55, 68, 18, 52, 53, 54, 55, 69, 18,
- 58, 59, 60, 58, 59, 60, 70, 127, 127, 129,
+ 58, 59, 60, 58, 59, 60, 70, 129, 129, 131,
- 71, 45, 129, 88, 45, 134, 134, 50, 73, 50,
- 73, 73, 70, 73, 137, 56, 71, 68, 73, 68,
- 68, 56, 68, 86, 75, 76, 61, 68, 800, 61,
+ 71, 45, 131, 96, 45, 136, 136, 50, 73, 50,
+ 73, 73, 70, 73, 830, 56, 71, 68, 73, 68,
+ 68, 56, 68, 86, 75, 76, 61, 68, 139, 61,
15, 16, 17, 63, 64, 65, 15, 16, 17, 63,
- 64, 65, 77, 87, 95, 74, 69, 97, 69, 66,
- 86, 75, 76, 137, 78, 66, 69, 89, 69, 69,
- 135, 79, 111, 167, 96, 90, 133, 67, 80, 77,
- 87, 95, 132, 67, 97, 69, 66, 127, 127, 130,
- 69, 78, 66, 69, 89, 142, 69, 91, 79, 111,
- 92, 96, 90, 98, 69, 80, 81, 93, 105, 94,
-
- 82, 99, 128, 83, 69, 84, 85, 100, 69, 102,
- 69, 101, 142, 103, 91, 141, 152, 92, 69, 69,
- 98, 69, 146, 81, 93, 105, 94, 82, 99, 104,
- 83, 69, 84, 85, 100, 69, 102, 112, 101, 69,
- 103, 113, 141, 152, 69, 120, 137, 121, 143, 146,
- 135, 114, 133, 123, 115, 69, 104, 106, 124, 132,
- 160, 107, 122, 69, 112, 332, 69, 108, 113, 125,
- 109, 69, 120, 126, 121, 143, 116, 110, 114, 69,
- 123, 115, 130, 69, 106, 124, 117, 160, 107, 122,
- 118, 119, 69, 140, 108, 69, 125, 109, 69, 129,
-
- 126, 128, 129, 116, 110, 131, 137, 131, 131, 73,
- 131, 73, 73, 117, 73, 134, 134, 118, 119, 136,
- 140, 136, 136, 68, 136, 68, 68, 73, 68, 73,
- 73, 144, 73, 68, 147, 148, 156, 73, 157, 150,
- 151, 149, 153, 154, 145, 69, 139, 69, 69, 69,
- 69, 161, 69, 297, 1879, 69, 69, 1879, 144, 193,
- 155, 147, 148, 156, 74, 157, 150, 151, 149, 153,
- 158, 145, 159, 69, 69, 162, 168, 163, 161, 69,
- 164, 69, 69, 174, 69, 171, 169, 155, 69, 172,
- 69, 175, 173, 165, 166, 69, 69, 158, 1879, 159,
-
- 182, 69, 162, 168, 163, 176, 170, 164, 69, 69,
- 174, 178, 171, 169, 69, 177, 172, 180, 175, 173,
- 165, 166, 179, 69, 69, 69, 181, 182, 183, 69,
- 184, 69, 176, 170, 185, 69, 69, 69, 178, 186,
- 1879, 187, 177, 188, 180, 189, 69, 192, 190, 179,
- 69, 195, 69, 181, 191, 183, 69, 184, 194, 69,
- 69, 185, 69, 199, 202, 198, 186, 69, 187, 69,
- 188, 196, 189, 69, 192, 190, 69, 69, 195, 197,
- 200, 191, 203, 1879, 204, 194, 69, 1879, 69, 1879,
- 199, 202, 198, 69, 1879, 207, 1879, 69, 196, 1879,
-
- 205, 201, 1879, 206, 1879, 69, 197, 200, 1879, 203,
- 131, 204, 131, 131, 136, 131, 136, 136, 73, 136,
- 73, 73, 208, 73, 137, 69, 69, 205, 201, 209,
- 206, 210, 211, 212, 69, 213, 214, 1879, 227, 69,
- 69, 215, 216, 218, 69, 217, 69, 1879, 69, 208,
- 226, 1879, 219, 69, 1879, 139, 209, 228, 210, 211,
- 212, 231, 213, 230, 69, 227, 229, 69, 215, 216,
- 69, 69, 217, 220, 69, 233, 69, 226, 232, 69,
- 69, 237, 234, 69, 228, 235, 69, 69, 231, 236,
- 230, 69, 238, 229, 239, 1879, 243, 69, 69, 240,
-
- 220, 221, 233, 69, 244, 232, 222, 69, 237, 234,
- 245, 223, 235, 241, 69, 242, 236, 224, 225, 238,
- 69, 239, 69, 243, 69, 248, 240, 251, 221, 246,
- 249, 253, 252, 222, 254, 69, 69, 245, 223, 247,
- 241, 250, 242, 255, 224, 225, 257, 69, 69, 1879,
- 256, 259, 1879, 270, 69, 1879, 69, 249, 69, 252,
- 69, 261, 69, 69, 69, 69, 247, 69, 250, 258,
- 255, 262, 69, 257, 260, 263, 69, 256, 259, 69,
- 69, 264, 265, 266, 69, 69, 267, 272, 261, 69,
- 277, 69, 271, 69, 268, 269, 258, 69, 262, 69,
-
- 273, 260, 263, 69, 274, 69, 278, 275, 264, 265,
- 266, 276, 69, 267, 272, 69, 69, 277, 280, 271,
- 69, 268, 269, 281, 283, 284, 69, 273, 279, 1879,
- 286, 287, 288, 69, 275, 69, 1879, 69, 276, 137,
- 282, 285, 289, 292, 291, 305, 296, 290, 69, 69,
- 281, 283, 284, 69, 69, 279, 69, 69, 287, 294,
- 69, 69, 69, 69, 293, 295, 69, 282, 285, 289,
- 292, 291, 69, 296, 290, 298, 69, 299, 300, 1879,
- 1879, 301, 302, 69, 303, 309, 294, 306, 308, 69,
- 69, 293, 295, 69, 304, 1879, 307, 321, 1879, 1879,
-
- 69, 69, 298, 69, 299, 300, 69, 69, 301, 302,
- 69, 303, 69, 310, 306, 308, 69, 311, 312, 313,
- 69, 304, 69, 307, 69, 314, 69, 316, 69, 315,
- 318, 326, 317, 69, 319, 320, 69, 1879, 1879, 69,
- 310, 322, 346, 69, 311, 312, 313, 1879, 323, 69,
- 69, 69, 314, 69, 316, 69, 315, 318, 326, 317,
- 327, 319, 320, 69, 324, 69, 69, 325, 322, 328,
- 329, 333, 336, 69, 69, 323, 330, 331, 334, 339,
- 1879, 335, 337, 69, 69, 69, 1879, 327, 69, 338,
- 340, 324, 341, 343, 325, 69, 328, 329, 333, 336,
-
- 69, 69, 342, 330, 331, 334, 69, 69, 335, 337,
- 344, 348, 69, 351, 69, 69, 338, 340, 69, 341,
- 343, 345, 349, 347, 350, 69, 69, 355, 69, 342,
- 69, 352, 1879, 69, 353, 356, 354, 344, 348, 1879,
- 351, 1879, 69, 357, 361, 69, 69, 379, 345, 349,
- 347, 350, 373, 360, 355, 362, 69, 1879, 352, 358,
- 69, 353, 365, 354, 69, 69, 69, 359, 69, 363,
- 357, 361, 374, 69, 378, 69, 376, 375, 69, 373,
- 360, 69, 362, 137, 69, 364, 358, 1879, 377, 365,
- 69, 380, 1879, 69, 359, 69, 363, 383, 1879, 374,
-
- 69, 378, 381, 376, 375, 382, 385, 387, 384, 69,
- 1879, 389, 364, 366, 367, 377, 399, 69, 380, 69,
- 69, 386, 69, 368, 383, 369, 370, 371, 69, 381,
- 372, 388, 382, 391, 387, 384, 390, 69, 69, 69,
- 366, 367, 69, 399, 69, 392, 393, 69, 386, 394,
- 368, 395, 369, 370, 371, 69, 69, 372, 388, 396,
- 391, 404, 69, 390, 397, 398, 400, 401, 408, 402,
- 69, 407, 1879, 405, 69, 69, 394, 69, 395, 69,
- 69, 406, 403, 411, 410, 412, 396, 69, 404, 69,
- 69, 397, 398, 400, 401, 69, 402, 409, 407, 69,
-
- 405, 413, 415, 69, 69, 69, 69, 69, 406, 403,
- 411, 410, 412, 414, 417, 416, 69, 418, 1879, 419,
- 421, 420, 1879, 69, 409, 422, 1879, 69, 413, 415,
- 425, 423, 424, 1879, 426, 69, 69, 69, 69, 1879,
- 414, 69, 416, 69, 418, 69, 419, 421, 420, 427,
- 428, 69, 422, 69, 429, 69, 69, 425, 423, 424,
- 69, 426, 435, 430, 431, 432, 434, 433, 436, 69,
- 69, 1879, 69, 69, 69, 69, 427, 428, 437, 69,
- 438, 429, 439, 440, 1879, 444, 441, 1879, 446, 435,
- 430, 431, 432, 434, 433, 69, 69, 1879, 442, 69,
-
- 443, 69, 69, 69, 445, 437, 69, 438, 69, 439,
- 69, 447, 444, 441, 69, 446, 69, 454, 448, 1879,
- 455, 456, 69, 461, 69, 442, 69, 443, 69, 460,
- 459, 445, 69, 457, 1879, 462, 69, 69, 447, 463,
- 464, 1879, 458, 465, 454, 448, 449, 455, 456, 69,
- 461, 450, 69, 451, 69, 469, 460, 459, 69, 1879,
- 467, 452, 462, 466, 69, 69, 463, 464, 69, 458,
- 465, 453, 69, 449, 468, 69, 470, 69, 450, 69,
- 451, 471, 469, 472, 473, 474, 477, 467, 452, 69,
- 466, 475, 479, 476, 69, 69, 478, 480, 453, 481,
-
- 69, 468, 69, 470, 483, 484, 69, 137, 471, 486,
- 472, 473, 69, 477, 482, 69, 69, 69, 475, 69,
- 476, 485, 489, 478, 480, 491, 490, 492, 69, 69,
- 69, 483, 484, 69, 487, 493, 486, 488, 494, 69,
- 495, 482, 497, 69, 496, 69, 1879, 500, 485, 498,
- 499, 501, 491, 69, 69, 69, 502, 505, 503, 504,
- 1879, 487, 69, 1879, 488, 506, 69, 69, 507, 69,
- 69, 69, 69, 69, 500, 512, 498, 499, 516, 69,
- 69, 69, 69, 502, 508, 503, 504, 69, 69, 509,
- 511, 513, 506, 510, 515, 507, 517, 514, 518, 69,
-
- 69, 69, 512, 1879, 519, 526, 521, 69, 69, 69,
- 523, 508, 1879, 533, 69, 522, 509, 511, 513, 69,
- 510, 515, 69, 517, 514, 518, 520, 69, 69, 69,
- 524, 519, 69, 521, 525, 527, 69, 523, 530, 528,
- 529, 69, 522, 531, 69, 532, 534, 535, 542, 69,
- 536, 538, 69, 520, 537, 539, 69, 524, 69, 1879,
- 69, 525, 527, 69, 69, 530, 528, 529, 69, 540,
- 531, 541, 532, 534, 69, 543, 69, 536, 69, 69,
- 544, 537, 69, 69, 546, 69, 548, 550, 547, 549,
- 551, 552, 1879, 69, 1879, 545, 540, 69, 541, 69,
-
- 69, 553, 543, 554, 69, 556, 555, 544, 557, 69,
- 69, 69, 69, 548, 550, 69, 549, 551, 552, 559,
- 69, 563, 545, 69, 560, 558, 564, 565, 553, 69,
- 554, 69, 556, 555, 69, 557, 561, 562, 566, 567,
- 571, 570, 569, 69, 69, 69, 559, 69, 563, 69,
- 69, 568, 558, 564, 565, 69, 69, 572, 573, 69,
- 69, 69, 69, 561, 562, 566, 567, 571, 570, 569,
- 574, 576, 575, 578, 579, 577, 586, 69, 568, 580,
- 69, 69, 581, 582, 572, 573, 69, 583, 591, 69,
- 585, 69, 69, 69, 1879, 584, 137, 574, 576, 575,
-
- 578, 579, 577, 69, 587, 69, 580, 69, 69, 581,
- 582, 69, 588, 69, 583, 589, 590, 585, 592, 69,
- 593, 594, 584, 69, 600, 69, 1879, 605, 601, 69,
- 69, 587, 602, 603, 604, 69, 69, 69, 69, 588,
- 613, 616, 589, 590, 1879, 592, 1879, 593, 594, 595,
- 69, 600, 617, 596, 69, 601, 597, 69, 69, 602,
- 603, 604, 69, 598, 614, 69, 599, 613, 616, 618,
- 1879, 69, 615, 69, 69, 619, 595, 621, 1879, 69,
- 596, 625, 1879, 597, 1879, 1879, 620, 622, 624, 69,
- 598, 614, 623, 599, 606, 607, 618, 608, 69, 615,
-
- 609, 69, 619, 69, 621, 610, 69, 630, 625, 69,
- 69, 611, 612, 620, 622, 624, 69, 626, 628, 623,
- 69, 606, 607, 627, 608, 69, 69, 609, 629, 631,
- 69, 632, 610, 69, 630, 633, 634, 635, 611, 612,
- 69, 69, 636, 637, 626, 628, 1879, 69, 638, 1879,
- 627, 641, 639, 640, 642, 629, 631, 69, 632, 645,
- 69, 1879, 633, 69, 643, 646, 644, 69, 69, 69,
- 637, 69, 69, 69, 69, 638, 69, 647, 641, 639,
- 640, 642, 648, 69, 69, 650, 69, 649, 651, 653,
- 1879, 643, 646, 644, 652, 69, 69, 654, 655, 658,
-
- 659, 660, 69, 69, 647, 69, 69, 69, 1879, 656,
- 69, 1879, 650, 69, 649, 651, 653, 657, 69, 665,
- 670, 652, 69, 69, 654, 655, 658, 659, 660, 662,
- 661, 663, 664, 69, 69, 667, 656, 69, 69, 666,
- 669, 69, 69, 69, 657, 668, 665, 670, 69, 671,
- 69, 673, 674, 69, 672, 675, 662, 661, 663, 664,
- 677, 69, 667, 69, 69, 676, 666, 669, 69, 678,
- 683, 679, 668, 680, 682, 681, 69, 685, 673, 69,
- 684, 672, 686, 69, 69, 688, 69, 677, 69, 69,
- 689, 69, 676, 69, 69, 691, 678, 683, 679, 687,
-
- 680, 69, 681, 690, 685, 69, 69, 684, 692, 703,
- 694, 693, 69, 69, 69, 69, 69, 137, 69, 702,
- 695, 720, 691, 69, 1879, 1879, 687, 69, 704, 736,
- 690, 705, 69, 69, 1879, 692, 703, 694, 693, 1879,
- 69, 706, 734, 708, 709, 69, 702, 695, 696, 710,
- 697, 707, 69, 779, 698, 704, 699, 69, 705, 711,
- 69, 700, 69, 69, 69, 69, 701, 712, 706, 69,
- 708, 709, 69, 715, 713, 696, 710, 697, 707, 69,
- 69, 698, 69, 699, 714, 716, 711, 719, 700, 718,
- 725, 717, 881, 701, 712, 69, 69, 69, 69, 721,
-
- 715, 713, 69, 1879, 722, 69, 723, 726, 69, 727,
- 730, 714, 716, 728, 719, 729, 718, 725, 717, 731,
- 69, 735, 69, 737, 724, 69, 721, 733, 69, 69,
- 732, 722, 69, 723, 726, 69, 727, 730, 69, 740,
- 728, 69, 729, 69, 69, 738, 731, 69, 735, 739,
- 737, 724, 741, 69, 733, 743, 742, 732, 744, 745,
- 746, 751, 747, 69, 69, 1879, 1879, 749, 69, 69,
- 69, 748, 738, 69, 69, 750, 739, 69, 69, 741,
- 69, 753, 743, 742, 69, 744, 745, 746, 752, 747,
- 69, 754, 69, 69, 749, 755, 69, 756, 748, 757,
-
- 760, 759, 750, 69, 1879, 758, 761, 763, 753, 765,
- 767, 764, 766, 1879, 762, 752, 768, 69, 754, 69,
- 69, 69, 755, 69, 756, 69, 757, 69, 759, 69,
- 770, 69, 758, 761, 69, 69, 765, 767, 69, 766,
- 769, 762, 69, 768, 771, 772, 773, 69, 774, 1879,
- 777, 69, 69, 776, 775, 781, 1879, 770, 778, 782,
- 780, 69, 1879, 1879, 69, 1879, 1879, 769, 1879, 69,
- 69, 771, 772, 773, 69, 774, 69, 777, 69, 69,
- 776, 775, 781, 69, 783, 778, 782, 780, 784, 786,
- 785, 787, 788, 69, 791, 789, 69, 69, 793, 790,
-
- 794, 796, 1879, 69, 69, 792, 1879, 808, 1879, 1879,
- 69, 783, 795, 69, 69, 784, 786, 785, 787, 788,
- 69, 791, 789, 69, 69, 797, 790, 798, 69, 69,
- 799, 69, 792, 69, 801, 802, 803, 805, 69, 795,
- 69, 809, 807, 69, 69, 69, 804, 806, 69, 69,
- 69, 1879, 797, 69, 798, 810, 811, 799, 812, 69,
- 1879, 801, 802, 803, 805, 814, 813, 816, 815, 807,
- 817, 69, 69, 804, 806, 69, 818, 69, 69, 69,
- 69, 819, 810, 811, 820, 812, 821, 69, 69, 69,
- 69, 822, 814, 813, 816, 815, 823, 817, 824, 69,
-
- 69, 825, 826, 818, 831, 69, 827, 828, 819, 1879,
- 830, 69, 829, 821, 1879, 1879, 832, 69, 822, 69,
- 69, 836, 69, 823, 69, 824, 69, 69, 825, 826,
- 834, 831, 833, 827, 828, 837, 69, 830, 69, 829,
- 69, 835, 838, 832, 69, 840, 839, 842, 836, 69,
- 843, 841, 69, 69, 69, 69, 69, 834, 69, 833,
- 845, 844, 837, 846, 847, 69, 69, 848, 835, 838,
- 69, 69, 840, 839, 842, 69, 849, 843, 841, 850,
- 1879, 69, 851, 853, 854, 69, 852, 845, 844, 857,
- 846, 847, 69, 69, 848, 858, 855, 69, 859, 69,
-
- 856, 69, 861, 860, 862, 69, 850, 69, 69, 851,
- 853, 854, 863, 852, 864, 865, 857, 69, 866, 1879,
- 69, 868, 858, 870, 69, 859, 871, 69, 867, 861,
- 860, 872, 69, 874, 869, 69, 69, 69, 69, 863,
- 880, 864, 865, 69, 69, 866, 69, 69, 868, 873,
- 870, 883, 882, 884, 885, 867, 69, 69, 1879, 1879,
- 874, 869, 69, 69, 890, 69, 69, 880, 69, 886,
- 889, 69, 69, 891, 69, 1879, 873, 875, 883, 882,
- 884, 885, 876, 69, 877, 887, 878, 69, 879, 888,
- 892, 890, 69, 893, 895, 69, 886, 889, 896, 894,
-
- 891, 69, 69, 69, 875, 897, 898, 899, 901, 876,
- 69, 877, 902, 878, 900, 879, 69, 892, 903, 69,
- 893, 69, 69, 905, 904, 896, 894, 907, 908, 69,
- 69, 906, 69, 898, 899, 69, 910, 909, 69, 902,
- 912, 900, 914, 911, 916, 69, 69, 69, 913, 69,
- 69, 904, 69, 915, 907, 908, 917, 1879, 906, 69,
- 924, 69, 69, 910, 909, 918, 69, 912, 69, 919,
- 911, 916, 920, 69, 921, 913, 923, 69, 922, 927,
- 69, 929, 928, 69, 69, 69, 69, 69, 69, 925,
- 69, 69, 918, 930, 935, 926, 919, 69, 1879, 920,
-
- 931, 69, 69, 923, 933, 922, 927, 69, 929, 928,
- 932, 934, 69, 69, 936, 938, 925, 937, 69, 69,
- 930, 69, 926, 69, 939, 941, 942, 931, 940, 943,
- 947, 933, 945, 69, 944, 946, 1879, 932, 934, 69,
- 948, 936, 938, 69, 937, 69, 69, 69, 69, 949,
- 69, 950, 941, 942, 69, 69, 943, 947, 69, 951,
- 69, 944, 946, 69, 952, 953, 954, 948, 955, 957,
- 1879, 956, 69, 69, 962, 958, 949, 69, 950, 69,
- 960, 69, 69, 961, 963, 959, 951, 69, 69, 69,
- 964, 952, 953, 954, 69, 955, 957, 69, 956, 69,
-
- 965, 962, 958, 966, 967, 69, 69, 960, 968, 970,
- 961, 963, 959, 971, 69, 69, 969, 964, 69, 972,
- 1879, 973, 974, 976, 1879, 69, 978, 965, 975, 1879,
- 966, 967, 69, 979, 977, 968, 1879, 989, 69, 69,
- 69, 69, 1879, 969, 69, 69, 972, 69, 973, 69,
- 976, 69, 988, 978, 980, 975, 69, 984, 981, 982,
- 979, 977, 985, 983, 987, 69, 986, 69, 69, 990,
- 69, 1879, 69, 69, 991, 992, 996, 69, 993, 988,
- 997, 994, 69, 69, 984, 69, 69, 998, 69, 985,
- 69, 987, 995, 986, 69, 999, 990, 1000, 69, 1001,
-
- 1002, 991, 992, 996, 1003, 993, 69, 997, 994, 1010,
- 69, 69, 1004, 1011, 998, 1005, 1006, 1014, 69, 995,
- 1007, 69, 999, 69, 69, 1009, 1001, 1002, 1012, 69,
- 69, 1003, 69, 1008, 1016, 69, 69, 1013, 1018, 1004,
- 1011, 69, 1005, 1006, 69, 1015, 1019, 1007, 69, 1017,
- 1020, 69, 1009, 1022, 69, 1012, 69, 1021, 1023, 1027,
- 1008, 1016, 1028, 1024, 1013, 69, 1026, 1879, 1030, 69,
- 69, 69, 1015, 69, 1025, 69, 1017, 69, 1031, 69,
- 1022, 69, 1879, 69, 1021, 1023, 1027, 69, 69, 69,
- 1024, 1029, 1032, 1026, 69, 1030, 1034, 1033, 69, 1035,
-
- 1036, 1025, 1037, 1039, 69, 1031, 1038, 1040, 69, 69,
- 1041, 1044, 1046, 1042, 69, 69, 1048, 69, 1029, 1032,
- 69, 69, 1045, 1034, 1033, 69, 1035, 1036, 1043, 1037,
- 1039, 69, 69, 1038, 1040, 69, 69, 1041, 1044, 1047,
- 1042, 1049, 1050, 69, 69, 1051, 69, 69, 1053, 1045,
- 1052, 69, 1054, 69, 69, 1043, 1056, 1060, 1055, 1061,
- 1879, 1879, 1062, 69, 1066, 1063, 1047, 1057, 1049, 69,
- 1058, 69, 1051, 69, 1064, 1053, 69, 1052, 69, 1054,
- 69, 69, 1059, 1056, 1065, 1055, 1061, 69, 69, 1062,
- 1067, 69, 1063, 1068, 1057, 69, 1069, 1058, 1070, 1071,
-
- 1072, 1064, 69, 1073, 69, 69, 1074, 69, 69, 1059,
- 1075, 1065, 1076, 1077, 1080, 1083, 69, 1067, 1879, 1879,
- 1068, 69, 69, 1069, 1082, 1070, 1071, 69, 69, 1078,
- 1073, 69, 1081, 1074, 69, 1079, 69, 69, 69, 1076,
- 1077, 1080, 69, 1084, 1086, 1085, 69, 69, 1087, 1088,
- 69, 1082, 69, 1090, 69, 1089, 1078, 69, 1091, 1081,
- 1097, 1092, 1079, 1094, 1093, 69, 1879, 1099, 1098, 1879,
- 1084, 1086, 1085, 1100, 69, 1087, 69, 69, 69, 69,
- 1090, 1095, 1089, 1101, 69, 1091, 1096, 69, 1092, 69,
- 1094, 1093, 69, 69, 1099, 1098, 1102, 1105, 1107, 1103,
-
- 1100, 69, 1104, 1106, 69, 1108, 1109, 1879, 1095, 1110,
- 1101, 1112, 69, 1096, 1111, 69, 1113, 69, 69, 1114,
- 69, 69, 69, 1102, 1105, 69, 1103, 69, 1115, 1104,
- 1116, 69, 1108, 1109, 69, 1118, 1110, 69, 1112, 1117,
- 1124, 1111, 1119, 1113, 1120, 1122, 1114, 1125, 1123, 69,
- 69, 1127, 1126, 69, 1879, 1115, 69, 1116, 1121, 1128,
- 1130, 69, 1118, 69, 69, 1134, 1117, 1124, 1136, 1119,
- 69, 1120, 1122, 1131, 1129, 1123, 1135, 69, 69, 1126,
- 69, 69, 69, 1132, 69, 1121, 1128, 69, 1137, 1133,
- 69, 69, 1134, 1138, 1139, 1136, 69, 1879, 1143, 1140,
-
- 1131, 1129, 1141, 1135, 1142, 69, 1144, 69, 69, 69,
- 1132, 1148, 1145, 1147, 1146, 1137, 1133, 69, 1149, 1879,
- 69, 1139, 1150, 69, 69, 1143, 1140, 69, 69, 1141,
- 1151, 1142, 69, 1144, 69, 69, 1152, 1153, 1148, 1145,
- 1147, 1146, 1879, 1155, 1156, 69, 1154, 1879, 1158, 1150,
- 69, 69, 69, 1157, 69, 1159, 1161, 1151, 1163, 69,
- 1160, 1879, 69, 1152, 1153, 1164, 1162, 1879, 1166, 69,
- 1879, 1156, 1879, 1154, 69, 1158, 69, 1169, 1167, 1165,
- 1157, 1170, 69, 69, 69, 1163, 1168, 1160, 69, 69,
- 69, 1173, 69, 1162, 69, 1166, 69, 1171, 69, 1174,
-
- 1175, 69, 1176, 69, 1169, 1167, 1165, 1180, 1170, 1178,
- 1172, 69, 1179, 1168, 1177, 69, 1181, 69, 1173, 69,
- 69, 1182, 1183, 69, 1171, 1185, 1174, 69, 1184, 1187,
- 1186, 1188, 1189, 69, 69, 1191, 1178, 1172, 1192, 1179,
- 69, 1177, 1190, 1181, 69, 1193, 1879, 1200, 69, 69,
- 1879, 69, 1198, 1879, 69, 1184, 69, 1186, 1188, 69,
- 69, 1202, 69, 69, 69, 1192, 1194, 1195, 1196, 1190,
- 1199, 1204, 1210, 1197, 69, 1201, 69, 69, 69, 1198,
- 1203, 69, 69, 1205, 69, 1206, 69, 1208, 1202, 1207,
- 69, 1209, 69, 1194, 1195, 1196, 69, 1199, 69, 1210,
-
- 1197, 1211, 1201, 1212, 1213, 1214, 1220, 1203, 1215, 69,
- 1205, 69, 1206, 1216, 1208, 69, 1207, 69, 1209, 1217,
- 69, 1219, 1218, 69, 69, 1222, 1223, 1221, 69, 1224,
- 1212, 1213, 1214, 69, 69, 1215, 1225, 69, 1227, 69,
- 1216, 1879, 1226, 69, 1228, 69, 1217, 1229, 1219, 1218,
- 1232, 69, 1222, 1230, 1221, 69, 69, 69, 1231, 69,
- 69, 1233, 69, 69, 69, 1227, 1234, 1235, 69, 1226,
- 1236, 1228, 1237, 1239, 1229, 1238, 1240, 1232, 69, 69,
- 1230, 1243, 69, 1244, 69, 1231, 1247, 1246, 1233, 69,
- 1241, 69, 69, 1234, 1235, 1242, 69, 1236, 1245, 1237,
-
- 1239, 1248, 1238, 69, 1250, 1249, 69, 1253, 69, 1252,
- 1244, 69, 1254, 69, 1251, 69, 1256, 1241, 69, 1255,
- 1258, 1257, 1242, 69, 69, 1245, 1260, 69, 1259, 1261,
- 1879, 69, 69, 69, 1262, 69, 1252, 1263, 69, 1254,
- 1264, 1251, 69, 1256, 69, 1265, 1255, 1266, 1257, 1267,
- 1269, 69, 1275, 1268, 69, 1259, 1261, 69, 69, 1271,
- 1270, 1262, 1879, 69, 1263, 1272, 1276, 69, 1273, 1274,
- 69, 69, 69, 69, 1266, 69, 1267, 1269, 69, 69,
- 1268, 69, 1277, 69, 69, 1278, 1271, 1270, 1280, 69,
- 1279, 1281, 1272, 1276, 69, 1273, 1274, 1282, 69, 1284,
-
- 69, 1879, 1287, 1283, 1288, 1286, 1289, 1290, 1291, 1277,
- 1285, 69, 1278, 69, 69, 1280, 69, 1279, 1281, 69,
- 69, 69, 69, 1292, 1294, 69, 1284, 1879, 69, 1287,
- 1283, 1288, 1286, 69, 1290, 1291, 1293, 1285, 1296, 1295,
- 1297, 1298, 1879, 1299, 1300, 1879, 69, 1301, 69, 1879,
- 69, 1294, 1307, 69, 69, 1305, 69, 1302, 1303, 69,
- 69, 1304, 69, 1293, 69, 69, 1295, 1297, 1298, 69,
- 1299, 1300, 69, 69, 1301, 1306, 69, 1309, 1310, 1307,
- 1311, 1879, 1305, 1308, 1302, 1303, 1312, 69, 1304, 69,
- 69, 1313, 1316, 1315, 1314, 1317, 69, 1330, 1324, 69,
-
- 1319, 1318, 1306, 69, 1309, 1310, 69, 1311, 69, 1320,
- 1308, 69, 69, 1312, 1879, 1321, 1325, 1322, 1313, 69,
- 1315, 1314, 1317, 69, 69, 69, 69, 1319, 1318, 69,
- 1327, 69, 1323, 1326, 1334, 1331, 1320, 69, 69, 69,
- 1328, 1329, 1321, 1325, 1322, 1333, 1332, 69, 69, 69,
- 1879, 1336, 69, 1335, 69, 1337, 1341, 1327, 69, 1323,
- 1326, 69, 1331, 1338, 1340, 69, 1339, 1328, 1329, 1342,
- 69, 1345, 1333, 1332, 69, 69, 69, 1343, 1336, 1344,
- 1335, 69, 1337, 1341, 69, 69, 1347, 1346, 1348, 69,
- 1338, 1340, 1352, 1339, 69, 1349, 1342, 69, 1345, 69,
-
- 1350, 69, 1353, 1351, 1343, 69, 1344, 1354, 1355, 69,
- 69, 1358, 69, 1347, 1346, 1348, 69, 1357, 1356, 1352,
- 1360, 1364, 1349, 1359, 1361, 69, 69, 1350, 1362, 69,
- 1351, 1365, 1363, 69, 1354, 69, 1366, 69, 1358, 69,
- 69, 1367, 1368, 1369, 1357, 1356, 1370, 69, 69, 69,
- 1359, 69, 69, 1371, 1372, 1362, 1374, 69, 1365, 1363,
- 1373, 1375, 69, 69, 1376, 69, 1879, 69, 1367, 1368,
- 1369, 1377, 1380, 1378, 1379, 69, 69, 69, 69, 1381,
- 1371, 69, 69, 1374, 1382, 69, 1383, 1373, 1375, 1384,
- 69, 1376, 1390, 69, 1387, 1385, 69, 69, 1377, 69,
-
- 1378, 1379, 69, 69, 1388, 1386, 1381, 69, 69, 69,
- 1392, 1382, 69, 1383, 1389, 1393, 1384, 1391, 1398, 1390,
- 69, 1387, 1385, 69, 1394, 1879, 1397, 1395, 1399, 1396,
- 1402, 1388, 1386, 1401, 1400, 1403, 1404, 69, 69, 69,
- 69, 1389, 1393, 69, 1391, 69, 69, 69, 1406, 1408,
- 1405, 1394, 69, 1397, 1395, 69, 1396, 69, 69, 1407,
- 1401, 1400, 69, 69, 1409, 1410, 1411, 1412, 69, 1414,
- 1413, 1415, 1879, 69, 1416, 69, 69, 1405, 69, 1417,
- 69, 1420, 1421, 1879, 1418, 1879, 1407, 1424, 69, 1879,
- 69, 69, 1410, 1411, 69, 69, 69, 1413, 1415, 1419,
-
- 1422, 1416, 1428, 69, 1429, 1423, 1417, 1427, 69, 1421,
- 69, 1418, 69, 69, 69, 1425, 1426, 1431, 1879, 69,
- 69, 1433, 69, 1432, 69, 69, 1419, 1422, 1430, 1428,
- 1435, 69, 1423, 1434, 1427, 1438, 69, 1436, 1437, 1440,
- 69, 1441, 1425, 1426, 69, 69, 1439, 69, 1433, 69,
- 1432, 69, 69, 69, 1442, 1430, 1443, 1435, 1444, 69,
- 1434, 69, 1438, 1445, 1436, 1437, 1440, 1450, 1441, 1446,
- 1447, 69, 69, 1439, 69, 1448, 1456, 69, 1449, 1879,
- 1451, 1442, 1453, 1443, 1879, 1444, 1457, 1454, 1452, 69,
- 1455, 69, 69, 69, 69, 1879, 1446, 1447, 69, 69,
-
- 1458, 1460, 1448, 1456, 69, 1449, 69, 1451, 69, 1453,
- 69, 1459, 1461, 1457, 1454, 1452, 69, 1455, 69, 1462,
- 1463, 1465, 69, 1464, 1466, 1471, 1467, 1458, 1460, 1468,
- 1478, 1469, 1879, 69, 69, 1470, 69, 69, 1459, 69,
- 1879, 1472, 1475, 1879, 1477, 1879, 69, 1463, 1465, 69,
- 1464, 1466, 69, 1467, 69, 69, 1468, 1473, 1469, 69,
- 1474, 69, 1470, 69, 69, 69, 69, 1476, 1472, 1475,
- 1479, 1477, 1480, 69, 69, 1482, 1481, 1483, 1879, 1879,
- 1484, 1487, 1485, 69, 1473, 1486, 1490, 1474, 1489, 1491,
- 1492, 69, 1488, 1879, 1476, 69, 69, 1479, 69, 1480,
-
- 1493, 69, 1496, 1481, 1483, 69, 69, 1484, 69, 1485,
- 69, 69, 1486, 69, 1494, 1489, 69, 1495, 1498, 1488,
- 1497, 69, 69, 1499, 69, 69, 69, 1493, 69, 1496,
- 1500, 1501, 1504, 69, 1502, 1879, 1505, 1503, 1879, 1507,
- 1506, 1494, 1509, 69, 1495, 1498, 1508, 1497, 69, 69,
- 69, 1510, 69, 1511, 1879, 1512, 1514, 1500, 69, 69,
- 1515, 1502, 69, 1505, 1503, 69, 1507, 1506, 69, 69,
- 69, 69, 1513, 1508, 1516, 69, 1517, 1518, 69, 1519,
- 69, 69, 1512, 1514, 69, 1521, 69, 1515, 1522, 69,
- 1520, 1523, 1529, 1524, 1525, 69, 69, 1526, 69, 1513,
-
- 1527, 1516, 1531, 1517, 1518, 69, 69, 69, 69, 69,
- 1530, 1528, 1521, 1532, 69, 1522, 69, 1520, 1523, 1529,
- 1524, 1525, 1533, 69, 1526, 1535, 1534, 1527, 1538, 69,
- 1536, 1542, 69, 69, 69, 69, 1537, 1530, 1528, 1541,
- 69, 1540, 1543, 69, 1539, 1546, 69, 1544, 69, 1533,
- 69, 69, 1535, 1534, 69, 1538, 1550, 1536, 69, 1551,
- 69, 1545, 1879, 1537, 1548, 69, 1541, 69, 1540, 1543,
- 1547, 1539, 1546, 69, 1544, 69, 1549, 1552, 1555, 69,
- 1553, 1554, 1879, 69, 69, 1560, 69, 1556, 1545, 69,
- 69, 1548, 69, 1557, 69, 1559, 1561, 1547, 1558, 1564,
-
- 69, 1562, 69, 1549, 1552, 1555, 69, 1553, 1554, 69,
- 1563, 69, 1560, 69, 1556, 1565, 1567, 1566, 1568, 69,
- 1557, 1569, 1559, 69, 1570, 1558, 69, 1572, 1562, 69,
- 1573, 1575, 1571, 1879, 1574, 69, 69, 1563, 69, 69,
- 69, 1577, 1565, 1567, 1566, 69, 1576, 1578, 1569, 1585,
- 1582, 69, 1580, 1581, 69, 1584, 1583, 69, 1575, 1571,
- 69, 1574, 1579, 69, 69, 69, 1586, 69, 1577, 69,
- 69, 69, 69, 1576, 1578, 1587, 69, 1582, 69, 1580,
- 1581, 1588, 1584, 1583, 1589, 1593, 1590, 1591, 1879, 1579,
- 1592, 1879, 1594, 69, 1879, 69, 1595, 1597, 1879, 1602,
-
- 1599, 1598, 1587, 1596, 69, 1601, 69, 1879, 69, 69,
- 1600, 1589, 69, 69, 69, 69, 69, 1592, 69, 1594,
- 69, 69, 69, 1595, 1597, 69, 1602, 1599, 1598, 69,
- 1596, 1603, 1601, 1604, 1605, 1879, 1606, 1600, 1607, 1608,
- 1611, 1609, 1610, 1615, 1879, 69, 1612, 69, 69, 1614,
- 69, 69, 69, 1613, 69, 1616, 69, 1617, 1603, 1618,
- 1604, 1605, 69, 1606, 1619, 1607, 1608, 69, 1609, 1610,
- 69, 69, 69, 1612, 69, 1620, 1614, 69, 69, 69,
- 1613, 1621, 1616, 1622, 1617, 1623, 1618, 1624, 1628, 1625,
- 1879, 1619, 1626, 1627, 69, 69, 69, 1629, 69, 1630,
-
- 1631, 1633, 1620, 1634, 1879, 1639, 1635, 1879, 1621, 69,
- 1622, 69, 1623, 1647, 69, 69, 1625, 69, 69, 1626,
- 1627, 1632, 1638, 1640, 69, 1879, 69, 1631, 1646, 69,
- 69, 1636, 69, 1635, 69, 1637, 69, 1641, 1642, 1643,
- 69, 69, 1644, 69, 1648, 69, 1645, 69, 1632, 1638,
- 1640, 69, 69, 69, 1651, 1646, 1649, 1879, 1652, 1650,
- 1654, 69, 69, 1653, 1641, 1642, 1643, 69, 1879, 1644,
- 1655, 1648, 1660, 1645, 69, 69, 1657, 69, 1656, 69,
- 69, 1651, 69, 1649, 69, 1652, 1650, 1654, 1658, 1659,
- 1653, 1662, 1663, 1661, 69, 69, 69, 1655, 1664, 69,
-
- 1665, 69, 1667, 1657, 1666, 1656, 1668, 1669, 1670, 1672,
- 1671, 1879, 1682, 69, 69, 1658, 1659, 69, 1662, 1663,
- 1661, 69, 69, 69, 69, 69, 69, 1665, 69, 1667,
- 1673, 1666, 69, 69, 1669, 1670, 1672, 1671, 1674, 1879,
- 1675, 1676, 1677, 69, 1678, 1680, 1681, 1679, 1683, 1685,
- 1686, 1879, 1688, 69, 69, 1684, 1879, 1673, 69, 69,
- 69, 1691, 1692, 69, 69, 1674, 69, 1675, 1676, 1677,
- 69, 1678, 1680, 1681, 1679, 1683, 1685, 69, 1687, 69,
- 69, 69, 1684, 1689, 1690, 69, 1693, 1694, 69, 1692,
- 1696, 69, 1695, 1697, 1698, 69, 69, 1699, 69, 1700,
-
- 69, 1701, 1702, 1703, 69, 1687, 1704, 69, 1706, 69,
- 1689, 1690, 69, 1693, 1694, 69, 1705, 1696, 1707, 1695,
- 1697, 1698, 1710, 69, 69, 69, 1700, 1708, 69, 69,
- 1703, 1709, 1711, 69, 1712, 1706, 69, 1713, 1715, 1714,
- 69, 1717, 69, 1705, 69, 1707, 69, 1716, 1718, 69,
- 1719, 1721, 69, 1723, 1708, 1720, 1726, 69, 1709, 69,
- 1727, 1712, 1722, 69, 1713, 69, 1714, 69, 1717, 1729,
- 69, 69, 1879, 69, 1716, 1718, 1731, 1719, 1721, 69,
- 1724, 1725, 1720, 69, 69, 1728, 1730, 69, 1732, 1722,
- 69, 69, 1733, 69, 1734, 1735, 1729, 1736, 69, 69,
-
- 1737, 1738, 1740, 1731, 1741, 1739, 1879, 1724, 1725, 1744,
- 1879, 1742, 1728, 1730, 1879, 69, 1743, 69, 69, 69,
- 69, 69, 1735, 1745, 69, 1748, 69, 1737, 69, 1740,
- 1746, 69, 1739, 69, 1747, 69, 69, 69, 1742, 1749,
- 1750, 69, 1751, 1743, 1752, 69, 1756, 69, 1753, 1754,
- 1745, 69, 1748, 1757, 69, 69, 1755, 1746, 69, 69,
- 69, 1747, 69, 1758, 1759, 1760, 1749, 1750, 69, 1751,
- 1761, 1752, 1762, 1756, 1763, 1753, 1754, 1765, 1767, 1770,
- 1757, 1764, 1768, 1755, 1766, 1879, 1769, 69, 69, 1771,
- 69, 69, 1760, 1772, 69, 69, 69, 69, 1774, 1762,
-
- 69, 69, 1788, 1879, 69, 1767, 69, 1776, 1764, 1768,
- 69, 1766, 69, 1769, 1777, 69, 69, 1773, 1775, 69,
- 1772, 1779, 1778, 1780, 69, 1774, 1781, 1782, 1783, 69,
- 69, 1784, 1786, 69, 1776, 1785, 69, 1787, 1789, 1879,
- 1879, 1777, 1879, 69, 1773, 1775, 1790, 69, 69, 1778,
- 69, 69, 1791, 69, 69, 1783, 1793, 69, 1784, 69,
- 69, 69, 1785, 1792, 1787, 1789, 1794, 69, 69, 1795,
- 1797, 1796, 69, 1790, 1798, 1804, 69, 1799, 1800, 1791,
- 1801, 1806, 1805, 1793, 69, 69, 69, 69, 69, 69,
- 1792, 69, 1802, 1794, 69, 1807, 1795, 1797, 1796, 1803,
-
- 69, 1798, 69, 1808, 1799, 1800, 1809, 1801, 69, 1805,
- 1810, 69, 69, 1812, 1816, 1811, 1813, 1817, 1879, 1802,
- 1814, 1879, 69, 1815, 1819, 69, 1803, 69, 69, 69,
- 1808, 69, 69, 1809, 1879, 1879, 1818, 1810, 69, 1821,
- 1826, 1823, 1811, 1813, 69, 69, 1820, 1814, 69, 69,
- 1815, 1819, 69, 1822, 69, 69, 1824, 1825, 1834, 1827,
- 1830, 69, 69, 1818, 1828, 69, 1821, 1826, 1823, 1829,
- 69, 1831, 69, 1820, 1835, 1832, 1839, 1833, 1879, 1836,
- 1822, 69, 69, 1824, 1825, 69, 1827, 1830, 1842, 69,
- 1879, 1828, 1837, 69, 1841, 69, 1829, 69, 1831, 69,
-
- 69, 69, 1832, 1838, 1833, 1840, 1836, 69, 69, 1843,
- 69, 69, 1844, 69, 1845, 1842, 1846, 69, 1847, 1837,
- 69, 1841, 1849, 1848, 1879, 1850, 1852, 1853, 69, 1854,
- 1838, 69, 1840, 1851, 1879, 69, 1843, 1855, 1856, 1844,
- 69, 1845, 69, 1846, 1858, 1847, 69, 1864, 69, 1849,
- 1848, 69, 1850, 1852, 1853, 69, 69, 69, 69, 1857,
- 1851, 1859, 1860, 1861, 1855, 1856, 69, 69, 1862, 69,
- 1863, 1858, 1865, 69, 1864, 1866, 69, 1867, 69, 1868,
- 69, 1869, 1870, 69, 69, 69, 1857, 1871, 1859, 1860,
- 1861, 1872, 1875, 1873, 1874, 1862, 1877, 1863, 1878, 1865,
-
- 69, 69, 1866, 69, 1867, 1876, 69, 1879, 1869, 69,
- 1879, 69, 1879, 69, 69, 69, 69, 1879, 1872, 1875,
- 1873, 1874, 1879, 69, 1879, 69, 1879, 1879, 1879, 1879,
- 1879, 1879, 1876, 41, 41, 41, 41, 41, 41, 41,
- 46, 46, 46, 46, 46, 46, 46, 51, 51, 51,
- 51, 51, 51, 51, 57, 57, 57, 57, 57, 57,
- 57, 62, 62, 62, 62, 62, 62, 62, 72, 72,
- 1879, 72, 72, 72, 72, 127, 127, 1879, 1879, 1879,
- 127, 127, 129, 129, 1879, 1879, 129, 1879, 129, 131,
- 1879, 1879, 1879, 1879, 1879, 131, 134, 134, 1879, 1879,
-
- 1879, 134, 134, 136, 1879, 1879, 1879, 1879, 1879, 136,
- 138, 138, 1879, 138, 138, 138, 138, 73, 73, 1879,
- 73, 73, 73, 73, 13, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879
+ 64, 65, 77, 87, 69, 74, 69, 98, 69, 66,
+ 86, 75, 76, 131, 78, 66, 131, 88, 154, 69,
+ 139, 79, 112, 69, 90, 97, 142, 67, 80, 77,
+ 87, 89, 91, 67, 98, 69, 66, 129, 129, 139,
+ 69, 78, 66, 69, 88, 154, 914, 69, 79, 112,
+ 69, 90, 97, 142, 99, 80, 81, 137, 89, 91,
+
+ 82, 92, 100, 83, 93, 84, 85, 135, 101, 106,
+ 134, 94, 102, 95, 69, 69, 170, 121, 69, 122,
+ 69, 99, 103, 81, 69, 196, 104, 82, 92, 100,
+ 83, 93, 84, 85, 123, 101, 106, 113, 94, 102,
+ 95, 114, 105, 69, 121, 117, 122, 69, 69, 103,
+ 144, 115, 124, 104, 116, 118, 69, 125, 132, 119,
+ 120, 123, 130, 69, 113, 69, 69, 69, 114, 105,
+ 107, 143, 117, 69, 108, 136, 136, 144, 115, 124,
+ 109, 116, 118, 110, 125, 126, 119, 120, 139, 127,
+ 111, 149, 69, 128, 137, 69, 135, 107, 143, 134,
+
+ 133, 108, 133, 133, 69, 133, 132, 109, 145, 130,
+ 110, 69, 126, 69, 211, 69, 127, 111, 149, 73,
+ 128, 73, 73, 138, 73, 138, 138, 68, 138, 68,
+ 68, 73, 68, 73, 73, 145, 73, 68, 146, 148,
+ 150, 73, 155, 152, 153, 69, 151, 158, 69, 161,
+ 69, 147, 69, 1955, 163, 156, 141, 159, 69, 1955,
+ 69, 69, 69, 160, 69, 146, 148, 150, 74, 155,
+ 152, 153, 157, 151, 158, 164, 161, 69, 147, 69,
+ 162, 163, 165, 1955, 159, 1955, 69, 1955, 166, 69,
+ 160, 167, 171, 176, 172, 69, 69, 69, 177, 157,
+
+ 69, 178, 164, 1955, 168, 169, 174, 162, 184, 165,
+ 175, 69, 69, 180, 173, 166, 69, 69, 167, 171,
+ 176, 172, 179, 181, 69, 177, 1955, 69, 178, 183,
+ 69, 168, 169, 174, 182, 184, 69, 175, 186, 185,
+ 180, 173, 69, 69, 190, 189, 1955, 69, 69, 179,
+ 181, 187, 69, 191, 192, 188, 183, 193, 1955, 194,
+ 69, 182, 69, 303, 197, 186, 185, 69, 69, 69,
+ 69, 190, 189, 69, 195, 222, 198, 201, 187, 69,
+ 191, 192, 188, 69, 193, 200, 194, 202, 69, 207,
+ 203, 197, 69, 69, 69, 206, 199, 205, 69, 208,
+
+ 1955, 195, 69, 198, 201, 1955, 69, 1955, 1955, 209,
+ 69, 204, 200, 1955, 202, 69, 207, 203, 1955, 69,
+ 340, 69, 206, 199, 205, 133, 208, 133, 133, 138,
+ 133, 138, 138, 139, 138, 210, 209, 73, 204, 73,
+ 73, 212, 73, 214, 213, 216, 215, 69, 217, 218,
+ 1955, 69, 69, 69, 219, 220, 232, 69, 69, 221,
+ 402, 403, 210, 69, 230, 233, 69, 223, 212, 1955,
+ 214, 213, 216, 215, 141, 217, 231, 69, 69, 235,
+ 69, 219, 220, 232, 69, 69, 221, 69, 224, 69,
+ 69, 230, 233, 234, 1955, 69, 236, 69, 237, 1955,
+
+ 238, 241, 69, 231, 239, 1955, 235, 240, 242, 249,
+ 69, 69, 69, 1955, 243, 224, 225, 247, 69, 69,
+ 234, 226, 1955, 236, 69, 237, 227, 238, 241, 1955,
+ 69, 239, 228, 229, 240, 242, 69, 244, 248, 69,
+ 69, 243, 245, 225, 247, 250, 253, 251, 226, 69,
+ 256, 1955, 254, 227, 1955, 255, 246, 252, 257, 228,
+ 229, 69, 258, 69, 244, 248, 259, 260, 262, 245,
+ 69, 69, 250, 266, 261, 264, 267, 69, 69, 254,
+ 69, 69, 255, 246, 252, 257, 268, 69, 69, 69,
+ 69, 263, 69, 69, 260, 262, 69, 69, 69, 265,
+
+ 266, 261, 264, 267, 69, 269, 271, 270, 69, 275,
+ 272, 273, 274, 268, 69, 69, 276, 69, 263, 277,
+ 69, 278, 279, 69, 282, 283, 265, 280, 69, 285,
+ 281, 1955, 269, 271, 270, 69, 1955, 272, 273, 274,
+ 69, 69, 286, 276, 69, 69, 277, 284, 278, 289,
+ 69, 282, 291, 69, 280, 290, 69, 281, 288, 287,
+ 69, 292, 69, 69, 139, 294, 293, 69, 295, 286,
+ 297, 69, 296, 301, 284, 298, 289, 300, 1955, 291,
+ 69, 69, 290, 69, 302, 288, 287, 299, 69, 69,
+ 304, 311, 69, 293, 69, 295, 69, 297, 69, 296,
+
+ 301, 69, 298, 305, 300, 309, 313, 306, 307, 308,
+ 69, 302, 312, 310, 299, 314, 69, 304, 69, 316,
+ 69, 315, 69, 1955, 1955, 69, 1955, 322, 69, 69,
+ 305, 69, 309, 69, 306, 307, 308, 69, 317, 312,
+ 310, 69, 314, 69, 318, 69, 319, 320, 315, 321,
+ 69, 69, 69, 69, 322, 323, 324, 325, 326, 328,
+ 1955, 69, 327, 1955, 69, 317, 69, 69, 329, 1955,
+ 331, 318, 330, 319, 320, 69, 321, 69, 332, 69,
+ 334, 333, 323, 324, 325, 326, 337, 69, 69, 327,
+ 69, 341, 69, 345, 335, 329, 336, 331, 69, 330,
+
+ 69, 69, 338, 339, 346, 332, 342, 334, 333, 343,
+ 69, 69, 344, 337, 347, 69, 69, 349, 341, 352,
+ 345, 335, 69, 336, 69, 348, 350, 69, 351, 338,
+ 339, 346, 354, 342, 69, 353, 343, 356, 69, 344,
+ 1955, 69, 69, 69, 349, 1955, 352, 69, 359, 355,
+ 69, 365, 348, 350, 363, 351, 69, 364, 357, 69,
+ 358, 69, 353, 69, 356, 1955, 360, 368, 369, 361,
+ 1955, 362, 69, 69, 69, 359, 355, 69, 365, 370,
+ 69, 363, 69, 366, 371, 357, 373, 358, 69, 381,
+ 1955, 367, 69, 360, 368, 369, 361, 69, 362, 69,
+
+ 372, 69, 389, 382, 386, 383, 370, 387, 69, 384,
+ 366, 371, 69, 373, 1955, 1955, 381, 385, 367, 69,
+ 390, 69, 1955, 139, 69, 388, 1955, 372, 374, 375,
+ 382, 386, 69, 69, 387, 393, 69, 392, 376, 391,
+ 377, 378, 379, 395, 385, 380, 69, 390, 394, 69,
+ 398, 396, 388, 69, 399, 374, 375, 69, 69, 400,
+ 69, 397, 393, 69, 392, 376, 391, 377, 378, 379,
+ 69, 401, 380, 404, 69, 394, 69, 398, 396, 405,
+ 69, 406, 407, 1955, 409, 69, 400, 408, 397, 412,
+ 69, 416, 69, 69, 410, 69, 411, 413, 401, 417,
+
+ 404, 415, 69, 419, 1955, 69, 405, 69, 406, 407,
+ 414, 409, 69, 69, 408, 69, 412, 69, 416, 69,
+ 418, 410, 69, 411, 413, 420, 417, 421, 415, 423,
+ 422, 69, 424, 425, 69, 426, 428, 414, 69, 427,
+ 1955, 429, 1955, 431, 430, 448, 433, 418, 69, 69,
+ 69, 69, 420, 69, 421, 69, 423, 422, 69, 424,
+ 425, 69, 426, 432, 69, 69, 427, 69, 429, 69,
+ 431, 430, 434, 433, 435, 436, 69, 437, 69, 438,
+ 439, 69, 441, 1955, 442, 444, 69, 445, 1955, 440,
+ 432, 69, 452, 1955, 69, 443, 69, 450, 69, 434,
+
+ 69, 435, 436, 69, 437, 69, 438, 439, 69, 441,
+ 69, 442, 444, 446, 445, 447, 440, 449, 451, 69,
+ 69, 453, 443, 69, 450, 1955, 455, 456, 69, 458,
+ 1955, 69, 457, 69, 1955, 69, 459, 69, 460, 461,
+ 446, 69, 447, 454, 449, 451, 1955, 69, 487, 69,
+ 468, 1955, 69, 455, 456, 69, 458, 69, 69, 457,
+ 469, 470, 1955, 459, 471, 460, 461, 473, 69, 69,
+ 454, 462, 69, 472, 474, 487, 463, 468, 464, 1955,
+ 475, 69, 476, 1955, 69, 477, 465, 469, 470, 466,
+ 478, 69, 480, 479, 473, 69, 467, 69, 462, 1955,
+
+ 472, 474, 69, 463, 69, 464, 69, 475, 69, 476,
+ 481, 69, 477, 465, 483, 484, 466, 478, 69, 480,
+ 479, 482, 485, 467, 488, 489, 69, 486, 490, 1955,
+ 69, 491, 492, 69, 493, 494, 69, 481, 496, 69,
+ 69, 483, 484, 69, 498, 495, 69, 139, 482, 485,
+ 497, 488, 499, 69, 486, 490, 69, 501, 491, 492,
+ 69, 493, 69, 500, 69, 69, 507, 502, 69, 69,
+ 503, 498, 495, 506, 508, 509, 504, 497, 69, 499,
+ 505, 69, 510, 511, 501, 69, 512, 69, 515, 513,
+ 500, 514, 517, 69, 502, 69, 69, 503, 516, 518,
+
+ 506, 69, 519, 521, 520, 522, 69, 69, 1955, 69,
+ 69, 69, 532, 69, 528, 515, 513, 69, 514, 527,
+ 523, 69, 69, 69, 69, 516, 518, 69, 69, 519,
+ 524, 520, 522, 69, 69, 525, 529, 530, 531, 526,
+ 69, 528, 533, 69, 534, 69, 527, 523, 537, 1955,
+ 535, 69, 538, 539, 69, 543, 540, 524, 1955, 69,
+ 69, 544, 525, 529, 530, 531, 526, 69, 69, 533,
+ 69, 534, 536, 69, 69, 537, 541, 535, 69, 538,
+ 539, 542, 69, 540, 547, 545, 69, 69, 544, 546,
+ 550, 548, 549, 551, 552, 554, 69, 555, 1955, 536,
+
+ 69, 556, 553, 541, 559, 69, 69, 1955, 542, 69,
+ 557, 547, 545, 69, 1955, 69, 546, 69, 548, 549,
+ 551, 69, 554, 561, 69, 69, 69, 558, 69, 553,
+ 560, 563, 564, 569, 566, 69, 565, 557, 562, 568,
+ 570, 69, 69, 567, 571, 573, 1955, 69, 69, 69,
+ 561, 69, 69, 69, 558, 572, 574, 560, 563, 69,
+ 569, 566, 69, 69, 69, 562, 568, 570, 69, 575,
+ 567, 571, 573, 582, 69, 576, 578, 577, 579, 580,
+ 1955, 69, 572, 574, 69, 69, 581, 69, 69, 583,
+ 586, 584, 585, 590, 69, 1955, 575, 587, 1955, 69,
+
+ 582, 69, 576, 578, 577, 69, 580, 69, 588, 69,
+ 589, 591, 69, 581, 69, 69, 583, 586, 584, 585,
+ 590, 592, 69, 593, 587, 594, 595, 597, 1955, 596,
+ 69, 69, 601, 598, 69, 588, 599, 589, 591, 606,
+ 69, 600, 1955, 69, 605, 69, 69, 69, 592, 603,
+ 593, 69, 594, 595, 597, 69, 596, 604, 139, 601,
+ 598, 602, 69, 599, 608, 69, 607, 69, 600, 610,
+ 69, 605, 611, 69, 609, 69, 603, 613, 69, 612,
+ 614, 1955, 69, 620, 604, 626, 69, 69, 602, 69,
+ 621, 608, 623, 607, 1955, 69, 610, 625, 69, 634,
+
+ 69, 609, 622, 69, 613, 624, 612, 614, 615, 635,
+ 620, 1955, 616, 69, 637, 617, 69, 621, 69, 623,
+ 69, 69, 618, 69, 625, 619, 634, 1955, 69, 622,
+ 69, 636, 624, 69, 638, 615, 635, 657, 69, 616,
+ 639, 637, 617, 1955, 1955, 1955, 640, 1955, 642, 618,
+ 641, 646, 619, 627, 628, 1955, 629, 1955, 636, 630,
+ 69, 69, 69, 643, 631, 644, 645, 639, 69, 1955,
+ 632, 633, 69, 640, 69, 642, 69, 641, 646, 69,
+ 627, 628, 651, 629, 650, 69, 630, 647, 69, 69,
+ 643, 631, 644, 645, 648, 69, 649, 632, 633, 656,
+
+ 652, 69, 653, 69, 69, 658, 655, 654, 69, 651,
+ 1955, 650, 69, 659, 647, 69, 69, 660, 1955, 667,
+ 661, 648, 662, 649, 1955, 670, 69, 652, 69, 653,
+ 664, 1955, 668, 655, 654, 665, 69, 69, 69, 69,
+ 659, 69, 663, 672, 660, 666, 69, 661, 669, 662,
+ 69, 69, 69, 69, 676, 69, 69, 664, 671, 668,
+ 673, 69, 665, 675, 674, 677, 69, 69, 678, 663,
+ 672, 69, 666, 681, 679, 669, 69, 69, 69, 69,
+ 69, 676, 680, 682, 1955, 671, 695, 673, 69, 684,
+ 675, 674, 677, 683, 687, 678, 69, 685, 69, 69,
+
+ 681, 679, 69, 688, 686, 69, 689, 691, 692, 680,
+ 682, 69, 69, 69, 690, 69, 684, 694, 698, 693,
+ 683, 687, 69, 69, 685, 69, 69, 697, 699, 696,
+ 688, 686, 69, 689, 691, 692, 69, 700, 69, 701,
+ 69, 690, 702, 703, 694, 704, 693, 69, 705, 69,
+ 706, 69, 707, 708, 697, 710, 696, 69, 712, 69,
+ 69, 711, 69, 709, 700, 69, 701, 714, 69, 702,
+ 703, 715, 704, 713, 69, 705, 69, 69, 716, 707,
+ 708, 69, 69, 69, 717, 69, 69, 727, 711, 719,
+ 709, 1955, 69, 718, 139, 728, 69, 720, 715, 733,
+
+ 713, 69, 69, 729, 69, 716, 1955, 730, 1955, 69,
+ 734, 717, 731, 69, 727, 69, 719, 732, 69, 735,
+ 718, 69, 728, 69, 720, 721, 733, 722, 736, 69,
+ 729, 723, 69, 724, 730, 69, 737, 734, 725, 731,
+ 738, 742, 740, 726, 732, 745, 735, 69, 69, 69,
+ 739, 69, 721, 741, 722, 736, 746, 744, 723, 743,
+ 724, 1955, 69, 737, 69, 725, 69, 738, 742, 740,
+ 726, 753, 69, 752, 755, 757, 69, 739, 69, 761,
+ 741, 756, 754, 69, 744, 763, 743, 747, 69, 69,
+ 759, 758, 748, 69, 749, 69, 760, 69, 753, 762,
+
+ 752, 755, 757, 69, 69, 750, 69, 69, 756, 754,
+ 69, 764, 751, 69, 747, 766, 69, 759, 758, 748,
+ 765, 749, 69, 760, 767, 769, 762, 768, 69, 69,
+ 770, 1955, 750, 69, 771, 69, 773, 774, 764, 751,
+ 772, 779, 766, 775, 69, 69, 1955, 765, 69, 69,
+ 69, 1955, 769, 776, 768, 69, 778, 770, 69, 69,
+ 780, 771, 777, 773, 774, 782, 69, 772, 69, 69,
+ 775, 783, 69, 781, 69, 784, 786, 69, 787, 785,
+ 776, 788, 69, 778, 795, 1955, 791, 780, 790, 777,
+ 792, 1955, 782, 69, 69, 789, 800, 69, 783, 69,
+
+ 781, 69, 784, 786, 69, 787, 785, 793, 69, 69,
+ 794, 795, 69, 796, 797, 790, 798, 69, 799, 808,
+ 69, 69, 789, 800, 801, 69, 69, 802, 69, 805,
+ 69, 803, 1955, 69, 793, 804, 806, 794, 69, 807,
+ 796, 797, 1955, 798, 811, 799, 69, 69, 1955, 809,
+ 69, 801, 810, 69, 802, 812, 805, 69, 803, 816,
+ 69, 69, 804, 806, 69, 813, 807, 69, 69, 815,
+ 814, 811, 817, 69, 820, 819, 809, 69, 818, 810,
+ 822, 823, 812, 69, 69, 824, 826, 821, 1955, 1955,
+ 69, 1955, 813, 1955, 69, 69, 815, 814, 69, 817,
+
+ 69, 820, 819, 69, 829, 818, 825, 822, 828, 827,
+ 832, 831, 69, 69, 821, 833, 69, 69, 69, 69,
+ 69, 69, 834, 69, 69, 838, 835, 836, 69, 837,
+ 839, 829, 69, 825, 69, 828, 827, 832, 831, 840,
+ 69, 69, 833, 1955, 841, 842, 843, 844, 848, 834,
+ 1955, 846, 838, 835, 836, 845, 837, 847, 851, 69,
+ 69, 69, 854, 69, 849, 69, 69, 69, 69, 1955,
+ 69, 841, 842, 843, 844, 848, 69, 69, 846, 850,
+ 852, 853, 845, 69, 847, 69, 856, 69, 855, 854,
+ 69, 849, 857, 69, 860, 69, 858, 859, 863, 862,
+
+ 861, 1955, 1955, 864, 881, 1955, 850, 852, 853, 69,
+ 69, 69, 69, 856, 69, 855, 69, 69, 69, 857,
+ 69, 860, 865, 858, 859, 863, 862, 861, 866, 867,
+ 864, 869, 868, 870, 871, 69, 69, 872, 873, 874,
+ 1955, 69, 875, 69, 69, 876, 69, 69, 69, 865,
+ 69, 878, 69, 69, 69, 866, 867, 69, 869, 868,
+ 870, 871, 877, 69, 872, 873, 874, 879, 880, 875,
+ 884, 882, 876, 883, 69, 886, 887, 69, 878, 885,
+ 888, 1955, 891, 69, 69, 889, 69, 893, 894, 877,
+ 69, 890, 69, 69, 879, 880, 892, 884, 882, 895,
+
+ 883, 69, 886, 897, 69, 69, 885, 69, 69, 891,
+ 69, 896, 889, 898, 893, 899, 900, 901, 890, 69,
+ 903, 69, 904, 892, 902, 69, 895, 905, 906, 69,
+ 897, 1955, 1955, 69, 69, 69, 907, 69, 896, 69,
+ 898, 69, 899, 900, 901, 915, 1955, 903, 1955, 919,
+ 69, 902, 913, 69, 916, 906, 917, 918, 69, 69,
+ 1955, 69, 929, 907, 908, 931, 69, 69, 69, 909,
+ 920, 910, 915, 911, 921, 912, 919, 69, 69, 913,
+ 922, 916, 69, 917, 918, 924, 923, 926, 927, 69,
+ 925, 908, 69, 69, 69, 932, 909, 69, 910, 930,
+
+ 911, 69, 912, 69, 69, 69, 928, 922, 69, 933,
+ 934, 69, 924, 923, 926, 927, 935, 925, 69, 69,
+ 936, 937, 932, 938, 939, 940, 930, 69, 941, 1955,
+ 69, 69, 942, 928, 943, 69, 933, 934, 944, 949,
+ 945, 947, 950, 69, 948, 69, 952, 936, 69, 946,
+ 938, 939, 69, 69, 69, 941, 951, 953, 69, 942,
+ 69, 943, 69, 955, 69, 944, 69, 945, 947, 956,
+ 69, 948, 954, 69, 957, 69, 946, 69, 69, 69,
+ 69, 69, 958, 951, 953, 960, 963, 959, 964, 69,
+ 955, 69, 961, 69, 966, 965, 69, 971, 962, 954,
+
+ 967, 957, 969, 69, 69, 69, 968, 69, 69, 958,
+ 970, 69, 973, 963, 959, 964, 69, 977, 979, 961,
+ 69, 966, 965, 974, 69, 962, 972, 967, 978, 969,
+ 69, 69, 69, 968, 69, 69, 975, 970, 980, 973,
+ 976, 981, 1955, 69, 977, 979, 982, 69, 983, 984,
+ 974, 69, 986, 972, 988, 978, 987, 69, 985, 69,
+ 992, 69, 1955, 69, 69, 980, 990, 69, 69, 69,
+ 989, 991, 69, 982, 995, 983, 984, 69, 69, 986,
+ 69, 988, 994, 987, 993, 985, 69, 992, 996, 69,
+ 998, 1000, 1002, 990, 997, 69, 999, 989, 991, 69,
+
+ 69, 995, 69, 1004, 1006, 1001, 1007, 1008, 1003, 994,
+ 69, 993, 69, 69, 69, 996, 69, 998, 1000, 1002,
+ 69, 997, 1005, 999, 69, 1009, 69, 1010, 69, 1011,
+ 1004, 1006, 1001, 1013, 1012, 1003, 1014, 69, 69, 1016,
+ 1017, 1019, 69, 1021, 1018, 1020, 1015, 69, 1027, 1005,
+ 69, 69, 1009, 69, 1010, 1955, 69, 69, 69, 69,
+ 1013, 1012, 1026, 1014, 1024, 69, 1016, 1022, 1023, 1025,
+ 1021, 69, 69, 1015, 1028, 69, 69, 69, 1029, 69,
+ 1030, 1033, 69, 69, 1031, 1032, 69, 69, 69, 1026,
+ 1034, 1024, 69, 1035, 1022, 1023, 1025, 1036, 69, 1037,
+
+ 1038, 1028, 69, 1039, 1041, 1029, 1040, 1030, 1033, 1043,
+ 1042, 1031, 1032, 1048, 69, 1047, 1050, 1034, 69, 69,
+ 1035, 69, 69, 69, 1036, 69, 1037, 69, 69, 69,
+ 1039, 1041, 1053, 1040, 1044, 1049, 1043, 1042, 1045, 69,
+ 69, 1051, 1047, 1050, 1054, 1052, 1057, 1055, 1955, 1056,
+ 69, 1046, 69, 69, 1058, 1059, 1060, 69, 1063, 69,
+ 1061, 1044, 1049, 69, 1062, 1045, 1065, 69, 1051, 69,
+ 69, 1054, 1052, 1066, 1055, 69, 1056, 69, 1046, 69,
+ 1067, 69, 69, 1060, 69, 1063, 1064, 1061, 69, 1068,
+ 69, 1062, 69, 1065, 1069, 69, 1070, 1071, 1072, 1955,
+
+ 1066, 69, 69, 1073, 1074, 1075, 1076, 1067, 1077, 1955,
+ 1079, 1083, 69, 1064, 69, 1078, 69, 69, 1080, 1955,
+ 1955, 1069, 69, 1070, 1071, 1072, 69, 69, 69, 69,
+ 1073, 1074, 1075, 69, 1081, 1077, 69, 1079, 1083, 1082,
+ 69, 69, 1078, 1084, 1085, 1080, 69, 1088, 1087, 1089,
+ 69, 1086, 1955, 1955, 69, 1090, 1091, 1092, 1955, 1094,
+ 1093, 1081, 69, 1095, 1101, 69, 1082, 1955, 69, 69,
+ 1084, 1085, 1102, 69, 1088, 1104, 1096, 1106, 1086, 69,
+ 69, 69, 1090, 69, 1092, 1097, 1094, 1093, 1103, 69,
+ 1095, 69, 69, 1098, 69, 69, 1099, 69, 1105, 1102,
+
+ 69, 69, 1104, 1096, 1106, 1107, 69, 1108, 1100, 1955,
+ 1109, 1111, 1097, 1110, 1112, 1103, 1114, 69, 69, 69,
+ 1098, 69, 1113, 1099, 1115, 1105, 1116, 1117, 69, 1122,
+ 1118, 1125, 1119, 69, 1108, 1100, 69, 1109, 1111, 1120,
+ 1110, 69, 69, 1121, 69, 69, 69, 69, 69, 1113,
+ 69, 1115, 69, 1116, 69, 1124, 1122, 1118, 1123, 1119,
+ 1126, 1127, 69, 1128, 1130, 1129, 1120, 69, 69, 69,
+ 1121, 69, 1131, 69, 1132, 1133, 69, 1139, 1134, 69,
+ 1140, 1135, 1124, 1149, 1142, 1123, 69, 1126, 1127, 1136,
+ 1128, 69, 1129, 1141, 69, 69, 69, 1144, 1137, 1131,
+
+ 69, 1132, 1133, 1138, 1139, 1134, 69, 69, 1135, 1148,
+ 69, 1142, 1143, 1145, 69, 69, 1136, 69, 1150, 1146,
+ 1141, 69, 1147, 69, 1144, 1137, 1151, 69, 1152, 1153,
+ 1138, 1154, 1155, 69, 1159, 1156, 1148, 69, 69, 1143,
+ 1145, 1168, 69, 69, 69, 69, 1146, 1955, 1158, 1147,
+ 69, 1161, 1157, 1151, 69, 1152, 1153, 69, 1154, 1155,
+ 69, 1159, 1156, 1160, 1162, 1171, 1163, 1165, 1167, 69,
+ 1166, 1955, 69, 1169, 69, 1158, 1170, 69, 1161, 1157,
+ 1164, 1172, 69, 1174, 1955, 69, 69, 1183, 1955, 1955,
+ 1160, 1162, 69, 1163, 1165, 1167, 69, 1166, 69, 1173,
+
+ 1169, 1175, 69, 1170, 1178, 1176, 69, 1164, 1172, 1180,
+ 1181, 1177, 69, 1182, 69, 69, 1179, 1186, 69, 69,
+ 1188, 69, 1184, 69, 69, 1185, 1173, 1187, 1175, 69,
+ 1191, 1178, 1176, 69, 69, 69, 1180, 1181, 1177, 1189,
+ 1182, 1190, 69, 1179, 1186, 1194, 1193, 1188, 69, 1184,
+ 69, 1192, 1185, 1200, 1187, 69, 1195, 1191, 69, 1196,
+ 1197, 69, 1198, 69, 1203, 1201, 1189, 1202, 1190, 69,
+ 1204, 1205, 69, 1193, 1199, 69, 69, 69, 1192, 69,
+ 69, 1206, 69, 1195, 69, 69, 1196, 1197, 1207, 1198,
+ 1209, 1203, 1201, 1208, 1202, 69, 1211, 69, 1205, 1210,
+
+ 1214, 1199, 1215, 1212, 1213, 1220, 1218, 1221, 69, 1955,
+ 69, 69, 69, 69, 69, 1207, 1219, 69, 69, 69,
+ 1208, 69, 1216, 1211, 69, 1225, 1210, 1214, 69, 1215,
+ 1212, 1213, 69, 1218, 1224, 1217, 1222, 1223, 69, 1226,
+ 69, 69, 69, 1219, 1227, 69, 69, 1228, 1229, 1216,
+ 1230, 1231, 69, 69, 1232, 1233, 1234, 1235, 1236, 1239,
+ 69, 1224, 1217, 1222, 1223, 69, 1226, 1237, 1955, 1238,
+ 1246, 69, 1244, 69, 1228, 69, 1248, 1230, 69, 69,
+ 1245, 1232, 69, 1234, 1250, 1236, 69, 69, 69, 69,
+ 69, 1240, 1241, 1242, 69, 69, 1238, 1247, 1243, 1244,
+
+ 1252, 69, 1249, 1248, 69, 1253, 69, 1245, 69, 1251,
+ 69, 69, 69, 1255, 1256, 1257, 1254, 1258, 1240, 1241,
+ 1242, 69, 1259, 1267, 1247, 1243, 69, 1252, 1260, 1249,
+ 1262, 69, 1253, 69, 69, 1261, 1251, 1263, 1266, 69,
+ 1255, 69, 1257, 1254, 69, 1264, 69, 1265, 69, 1259,
+ 1269, 1270, 1268, 69, 69, 1260, 1271, 1262, 69, 69,
+ 69, 1272, 1261, 69, 1263, 1266, 1274, 1273, 1275, 1955,
+ 69, 1277, 1264, 1276, 1265, 69, 1279, 1269, 1278, 1268,
+ 1281, 69, 69, 1295, 69, 69, 69, 69, 69, 69,
+ 1280, 69, 1282, 1274, 1273, 1275, 1284, 1285, 1277, 1288,
+
+ 1276, 1283, 69, 1279, 69, 1278, 69, 1281, 69, 69,
+ 1286, 1287, 1291, 1296, 69, 1299, 1289, 1280, 1294, 1282,
+ 69, 1290, 1293, 1284, 1285, 69, 69, 1292, 1283, 69,
+ 1297, 69, 69, 69, 1298, 69, 1301, 1286, 1287, 69,
+ 69, 1300, 69, 1289, 1302, 1294, 69, 1303, 1290, 1293,
+ 1304, 69, 1305, 1306, 1292, 69, 1307, 1309, 1311, 1308,
+ 1955, 69, 69, 1301, 69, 1312, 1310, 69, 1300, 1313,
+ 1314, 1315, 1317, 69, 1303, 69, 1321, 1304, 69, 1305,
+ 1306, 69, 69, 1316, 1318, 1311, 1308, 69, 69, 1319,
+ 1320, 69, 1312, 1310, 69, 1324, 69, 69, 1315, 1317,
+
+ 69, 1326, 1325, 1321, 69, 69, 1322, 69, 1323, 69,
+ 1316, 1318, 69, 1329, 1332, 1327, 1319, 1320, 1328, 69,
+ 1331, 69, 69, 69, 69, 1330, 69, 69, 1326, 1325,
+ 1335, 1955, 1333, 1322, 1338, 1323, 69, 1336, 1337, 69,
+ 1329, 1332, 1327, 1334, 1342, 1328, 1955, 69, 1955, 1339,
+ 1340, 69, 1330, 1341, 1345, 69, 69, 1335, 69, 1333,
+ 69, 69, 69, 1343, 1336, 1337, 69, 1344, 1346, 1347,
+ 1334, 1348, 1352, 69, 1349, 69, 1339, 1340, 69, 69,
+ 1341, 1345, 1351, 1955, 1350, 1355, 69, 69, 69, 69,
+ 1343, 1353, 1354, 69, 1344, 69, 1347, 1357, 1348, 1352,
+
+ 69, 1349, 69, 1356, 69, 1359, 69, 69, 1360, 1351,
+ 1358, 1350, 1355, 1361, 1362, 69, 1955, 69, 1353, 1354,
+ 1364, 1365, 69, 1363, 1357, 1366, 1374, 69, 1367, 69,
+ 1356, 1368, 1359, 69, 69, 1360, 69, 1358, 69, 1369,
+ 1361, 1362, 1372, 69, 1377, 1370, 1371, 1364, 1365, 1373,
+ 1363, 69, 69, 69, 1384, 1367, 69, 69, 1368, 1375,
+ 1376, 1380, 1378, 69, 69, 1379, 1369, 69, 69, 1372,
+ 69, 1377, 1370, 1371, 69, 1381, 1373, 1383, 69, 1382,
+ 1955, 69, 1386, 1385, 69, 69, 1375, 1376, 69, 1378,
+ 1390, 69, 1379, 1387, 1388, 1391, 1392, 1389, 1393, 1955,
+
+ 1955, 69, 1381, 1955, 1383, 69, 1382, 69, 69, 1386,
+ 1385, 1394, 69, 69, 69, 69, 1396, 1390, 1395, 1397,
+ 1387, 1388, 69, 1392, 1389, 1393, 69, 1398, 1399, 1400,
+ 69, 1401, 1402, 69, 1405, 1403, 69, 69, 1394, 69,
+ 69, 1407, 1404, 1396, 69, 1395, 1397, 1406, 1409, 1408,
+ 69, 1410, 69, 1411, 1398, 1399, 1400, 69, 1401, 1402,
+ 69, 69, 1403, 1414, 1416, 69, 1412, 69, 69, 1404,
+ 1413, 69, 1415, 69, 1406, 1409, 1408, 1417, 1410, 69,
+ 1411, 1418, 69, 1419, 1421, 1420, 1422, 1955, 1424, 1955,
+ 1414, 69, 1423, 69, 1425, 69, 69, 69, 1426, 1415,
+
+ 69, 1427, 1429, 1432, 1417, 69, 1428, 1430, 69, 69,
+ 1419, 1421, 1420, 1433, 69, 69, 69, 69, 69, 1423,
+ 69, 1425, 1435, 1434, 69, 1426, 1431, 1443, 1427, 1429,
+ 69, 1436, 69, 1428, 1430, 69, 69, 69, 1437, 1438,
+ 1433, 1439, 69, 1445, 69, 69, 69, 69, 1440, 1435,
+ 1434, 69, 1441, 1431, 1443, 1442, 1444, 1446, 1436, 1447,
+ 69, 69, 69, 1448, 1449, 1437, 1438, 1450, 1439, 1451,
+ 69, 1452, 1455, 69, 1454, 1440, 69, 1453, 69, 1441,
+ 1456, 69, 1442, 1444, 1446, 1457, 1447, 1458, 69, 69,
+ 1448, 1449, 1459, 69, 1450, 69, 69, 1460, 69, 69,
+
+ 1461, 1454, 1462, 1463, 1453, 1465, 69, 69, 1466, 1464,
+ 1467, 69, 69, 1468, 1458, 1470, 69, 1469, 1473, 69,
+ 1474, 1475, 69, 1477, 1460, 1955, 1471, 69, 69, 69,
+ 1463, 69, 69, 69, 1480, 1466, 1464, 69, 69, 69,
+ 1468, 1472, 1470, 1476, 1469, 69, 69, 1474, 1475, 1478,
+ 69, 69, 69, 1471, 1479, 1481, 69, 1482, 69, 1483,
+ 1484, 1480, 1485, 69, 1486, 1487, 1955, 69, 1472, 1492,
+ 1476, 1489, 1490, 1488, 69, 69, 1478, 1499, 69, 1493,
+ 1491, 1479, 1481, 69, 69, 1495, 1483, 69, 69, 1485,
+ 69, 1486, 1487, 69, 69, 1494, 1492, 69, 1489, 1490,
+
+ 1488, 69, 1496, 1497, 1500, 1498, 1493, 1491, 69, 1501,
+ 1502, 1504, 1495, 1503, 1955, 1955, 69, 69, 69, 1511,
+ 69, 69, 1494, 1509, 1955, 1505, 1510, 69, 69, 1496,
+ 1497, 1500, 1498, 1506, 69, 69, 1501, 1502, 1512, 69,
+ 1503, 1507, 69, 1508, 69, 1513, 1511, 1514, 69, 1515,
+ 1509, 69, 1505, 1510, 69, 1516, 1517, 1524, 1518, 1526,
+ 1506, 1519, 69, 1520, 69, 1512, 1521, 69, 1507, 1522,
+ 1508, 69, 1513, 1523, 1514, 1527, 1515, 69, 69, 69,
+ 69, 1525, 69, 69, 1524, 1518, 69, 69, 1519, 1534,
+ 1520, 1528, 1531, 1521, 1529, 1533, 1522, 69, 69, 69,
+
+ 1523, 69, 1527, 1530, 1532, 69, 1535, 1537, 1525, 1538,
+ 1540, 69, 1536, 1548, 1543, 69, 69, 69, 1528, 1531,
+ 69, 1529, 1533, 69, 1539, 1541, 1545, 69, 1542, 69,
+ 1530, 1532, 1546, 1535, 1537, 69, 1544, 1540, 69, 1536,
+ 69, 69, 1547, 69, 69, 69, 1549, 1550, 69, 1552,
+ 1555, 1539, 1541, 1545, 69, 1542, 1551, 1553, 69, 69,
+ 1554, 69, 1556, 1544, 1557, 69, 1559, 1560, 1955, 69,
+ 1558, 69, 69, 1549, 1550, 69, 1552, 69, 69, 69,
+ 69, 1561, 1562, 1551, 1553, 1563, 1565, 1554, 1564, 1556,
+ 1566, 1567, 1569, 1559, 69, 69, 1568, 1558, 69, 1570,
+
+ 1574, 69, 1955, 69, 1955, 1571, 1572, 69, 1561, 1562,
+ 69, 69, 1563, 69, 1573, 1564, 1576, 69, 69, 1569,
+ 69, 69, 69, 1568, 1575, 69, 1570, 1574, 1577, 69,
+ 1579, 69, 1571, 1572, 1578, 69, 1580, 69, 1583, 1581,
+ 1582, 1573, 69, 69, 1584, 1585, 69, 1586, 1587, 1589,
+ 69, 1575, 69, 69, 69, 1577, 1588, 1579, 1590, 1955,
+ 1591, 1578, 69, 1580, 69, 1583, 1581, 1582, 1593, 1600,
+ 69, 1584, 1585, 1592, 1586, 1587, 69, 69, 69, 1594,
+ 69, 1595, 1598, 1588, 69, 69, 69, 1591, 69, 1596,
+ 1597, 69, 1599, 1601, 1602, 1593, 69, 69, 1604, 1609,
+
+ 1592, 1607, 1603, 69, 1605, 1606, 1594, 69, 1595, 1598,
+ 69, 69, 69, 69, 69, 1608, 1596, 1597, 69, 1599,
+ 1601, 1602, 69, 69, 1610, 1604, 69, 1611, 1607, 1603,
+ 1613, 1605, 1606, 1612, 1614, 1616, 69, 1615, 69, 1617,
+ 1955, 1618, 1608, 1619, 69, 69, 1620, 69, 69, 1622,
+ 1623, 1621, 1624, 69, 1611, 69, 69, 1613, 69, 1625,
+ 1612, 1614, 1616, 69, 1615, 1626, 1617, 69, 1618, 1627,
+ 1619, 69, 1629, 69, 1630, 69, 1622, 69, 1621, 1624,
+ 1628, 1631, 69, 1632, 1955, 1633, 1625, 1636, 69, 1635,
+ 1634, 1637, 1626, 1638, 69, 69, 69, 1641, 1639, 69,
+
+ 1640, 1630, 1645, 69, 1642, 69, 69, 1628, 69, 69,
+ 69, 69, 1633, 69, 1636, 69, 1635, 1634, 1637, 69,
+ 1638, 1643, 1644, 1646, 1641, 1639, 69, 1640, 1955, 69,
+ 1649, 1642, 1647, 1648, 69, 1650, 1651, 1652, 1654, 1653,
+ 1955, 1955, 1955, 69, 1655, 1955, 1656, 1657, 1643, 1644,
+ 69, 1696, 69, 69, 1660, 69, 1659, 69, 1658, 1647,
+ 1648, 69, 1650, 69, 69, 69, 1653, 69, 69, 69,
+ 69, 1655, 1661, 1656, 1657, 69, 69, 1662, 1663, 1664,
+ 1665, 1660, 69, 1659, 1666, 1658, 1668, 69, 69, 1670,
+ 1667, 1669, 1673, 1955, 69, 1955, 1671, 69, 1676, 1661,
+
+ 69, 69, 69, 69, 1662, 1663, 1664, 1665, 69, 69,
+ 1677, 1666, 69, 1668, 1672, 1675, 1670, 1667, 1669, 69,
+ 1674, 69, 69, 1671, 1678, 1676, 1679, 1680, 69, 1682,
+ 1681, 1955, 1685, 69, 1684, 1686, 1683, 69, 1688, 1689,
+ 1955, 1672, 1675, 69, 69, 69, 69, 1674, 69, 69,
+ 1690, 1678, 69, 1679, 1680, 1691, 1682, 1681, 69, 1685,
+ 1687, 1684, 69, 1683, 69, 1688, 69, 69, 1692, 1693,
+ 1694, 1695, 1697, 1702, 69, 1703, 1699, 1690, 1698, 69,
+ 1700, 1701, 69, 1955, 69, 69, 1711, 1687, 1704, 1707,
+ 1955, 1710, 1705, 1706, 69, 69, 69, 1694, 1695, 69,
+
+ 1702, 69, 69, 1708, 69, 1698, 69, 69, 1701, 1712,
+ 69, 69, 69, 69, 1709, 1704, 1707, 69, 1710, 1705,
+ 1706, 69, 1715, 1713, 1714, 1955, 1716, 1955, 1717, 1718,
+ 1708, 1720, 69, 1721, 69, 1719, 1712, 1723, 69, 1724,
+ 69, 1709, 69, 1722, 69, 1725, 69, 1726, 69, 1715,
+ 1713, 1714, 69, 1716, 69, 1717, 1718, 69, 1720, 1727,
+ 1721, 69, 1719, 1729, 1723, 1730, 1724, 1728, 1732, 1731,
+ 1722, 69, 69, 1733, 1726, 1735, 69, 1734, 1738, 1736,
+ 69, 69, 1737, 1739, 1749, 69, 1727, 69, 69, 69,
+ 69, 1740, 1730, 69, 1728, 1732, 1731, 69, 1741, 1742,
+
+ 69, 1743, 1735, 1746, 69, 1738, 1736, 1955, 1744, 1737,
+ 1739, 1745, 1748, 69, 1747, 69, 1750, 69, 1740, 69,
+ 1751, 1753, 69, 69, 69, 1741, 1742, 1752, 1743, 1754,
+ 69, 69, 69, 1755, 69, 1744, 69, 1756, 1745, 1748,
+ 1758, 1747, 69, 1750, 1762, 69, 1757, 1751, 1759, 1760,
+ 1761, 1763, 69, 1955, 1752, 69, 1754, 1765, 69, 69,
+ 69, 1764, 69, 1767, 1756, 1766, 69, 69, 69, 1769,
+ 1770, 1762, 69, 1757, 1768, 1759, 1760, 1761, 1763, 69,
+ 69, 1771, 69, 1772, 1765, 1774, 1773, 1775, 1764, 69,
+ 69, 1776, 1766, 69, 1777, 69, 69, 69, 1779, 1778,
+
+ 1780, 1768, 1783, 69, 69, 1782, 1784, 69, 1771, 69,
+ 69, 1781, 1774, 1773, 1775, 1785, 1787, 69, 1776, 69,
+ 69, 1777, 1786, 1788, 1790, 69, 1778, 69, 1789, 1783,
+ 69, 69, 1782, 69, 1792, 1795, 1791, 1796, 1781, 69,
+ 1798, 1800, 1785, 1787, 69, 1797, 69, 1799, 69, 1786,
+ 1788, 1790, 69, 69, 69, 1789, 1793, 1794, 1801, 1802,
+ 1803, 1804, 69, 1791, 69, 69, 69, 69, 1800, 69,
+ 1805, 1806, 1797, 1807, 1799, 1808, 1809, 1811, 1812, 1815,
+ 69, 1955, 1955, 1793, 1794, 1801, 69, 69, 69, 69,
+ 1813, 1814, 69, 1816, 1810, 69, 1820, 1805, 69, 69,
+
+ 1807, 69, 69, 1809, 1811, 69, 69, 1817, 1819, 1818,
+ 69, 69, 69, 1821, 69, 69, 69, 1813, 1814, 1822,
+ 1816, 1810, 1823, 1820, 1829, 1826, 1827, 1830, 69, 1832,
+ 69, 69, 69, 69, 1817, 1819, 1818, 1824, 1825, 1831,
+ 1821, 1834, 1955, 1828, 1833, 1836, 1822, 69, 69, 1823,
+ 69, 69, 1826, 1827, 69, 1837, 69, 1840, 69, 1841,
+ 1835, 1838, 69, 1842, 1824, 1825, 1831, 69, 69, 69,
+ 1828, 1833, 1836, 69, 1839, 69, 1843, 1844, 1845, 1846,
+ 69, 1851, 69, 69, 1840, 69, 1841, 1835, 1838, 1847,
+ 69, 69, 1848, 1849, 1850, 69, 1852, 1853, 1855, 69,
+
+ 1854, 1839, 69, 69, 1844, 1845, 1846, 1856, 69, 1857,
+ 1859, 1861, 1955, 1955, 69, 69, 1847, 1858, 69, 1848,
+ 1849, 1850, 69, 69, 69, 69, 1860, 1854, 1862, 69,
+ 1863, 1864, 1866, 1868, 1856, 69, 1857, 69, 1865, 69,
+ 1867, 69, 69, 69, 1858, 1955, 1955, 69, 1879, 1870,
+ 69, 1955, 69, 1860, 1869, 1862, 69, 1863, 1864, 1866,
+ 1868, 69, 69, 1871, 69, 1865, 1872, 1867, 1876, 1873,
+ 69, 1878, 1875, 1874, 1877, 69, 1870, 69, 69, 69,
+ 69, 1869, 69, 69, 1880, 1881, 69, 1882, 1883, 1887,
+ 1871, 1884, 1885, 1872, 69, 1876, 1873, 1886, 1878, 1875,
+
+ 1874, 1877, 69, 1888, 1889, 1890, 1892, 1893, 1955, 69,
+ 69, 1880, 69, 69, 69, 1883, 69, 69, 1884, 1885,
+ 69, 1891, 1894, 1897, 1886, 1895, 1896, 1955, 1899, 69,
+ 1888, 69, 1890, 1898, 69, 69, 69, 69, 69, 69,
+ 1900, 69, 69, 1901, 1902, 1910, 1903, 1906, 1891, 1894,
+ 1897, 69, 1895, 1896, 69, 1899, 1904, 1955, 1905, 1907,
+ 1898, 1911, 1912, 1915, 69, 1908, 69, 1900, 69, 69,
+ 1901, 1902, 1909, 1903, 1906, 1918, 69, 1917, 1955, 1930,
+ 69, 69, 69, 1904, 69, 1905, 1907, 69, 69, 1912,
+ 1913, 69, 1908, 1914, 69, 1916, 1921, 69, 69, 1909,
+
+ 1919, 69, 1918, 69, 1917, 1920, 69, 1922, 69, 1923,
+ 69, 1924, 1955, 69, 1925, 1955, 1926, 1913, 1955, 69,
+ 1914, 1929, 1916, 1921, 1927, 1928, 1955, 1919, 1955, 69,
+ 1931, 69, 1920, 69, 1922, 1932, 1923, 1934, 1924, 1933,
+ 69, 1925, 69, 1926, 1955, 69, 69, 69, 1929, 1936,
+ 69, 1927, 1928, 1935, 1944, 69, 1937, 1931, 1940, 69,
+ 1938, 69, 1932, 1943, 1934, 1939, 1933, 1941, 69, 1942,
+ 1946, 69, 1955, 69, 1947, 69, 1936, 69, 69, 1945,
+ 1935, 69, 1948, 1937, 69, 1940, 1949, 1938, 1950, 69,
+ 1943, 1953, 1939, 1954, 1941, 1951, 1942, 69, 1955, 69,
+
+ 1955, 69, 69, 69, 1952, 1955, 1945, 1955, 69, 1948,
+ 69, 1955, 69, 1949, 1955, 1950, 1955, 1955, 69, 1955,
+ 69, 1955, 1951, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1952, 41, 41, 41, 41, 41, 41, 41, 46,
+ 46, 46, 46, 46, 46, 46, 51, 51, 51, 51,
+ 51, 51, 51, 57, 57, 57, 57, 57, 57, 57,
+ 62, 62, 62, 62, 62, 62, 62, 72, 72, 1955,
+ 72, 72, 72, 72, 129, 129, 1955, 1955, 1955, 129,
+ 129, 131, 131, 1955, 1955, 131, 1955, 131, 133, 1955,
+ 1955, 1955, 1955, 1955, 133, 136, 136, 1955, 1955, 1955,
+
+ 136, 136, 138, 1955, 1955, 1955, 1955, 1955, 138, 140,
+ 140, 1955, 140, 140, 140, 140, 73, 73, 1955, 73,
+ 73, 73, 73, 13, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955
} ;
-static yyconst flex_int16_t yy_chk[5491] =
+static yyconst flex_int16_t yy_chk[5690] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -1682,602 +1727,624 @@ static yyconst flex_int16_t yy_chk[5491] =
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, 3, 3, 3, 4, 4,
- 4, 5, 5, 6, 6, 5, 24, 6, 7, 7,
- 7, 7, 1885, 7, 8, 8, 8, 8, 24, 8,
+ 4, 5, 5, 6, 6, 5, 27, 6, 7, 7,
+ 7, 7, 1961, 7, 8, 8, 8, 8, 27, 8,
9, 9, 9, 10, 10, 10, 15, 45, 45, 50,
- 15, 3, 50, 24, 4, 61, 61, 5, 19, 6,
- 19, 19, 70, 19, 689, 7, 70, 40, 19, 40,
- 40, 8, 40, 23, 20, 20, 9, 40, 683, 10,
+ 15, 3, 50, 27, 4, 61, 61, 5, 19, 6,
+ 19, 19, 70, 19, 707, 7, 70, 40, 19, 40,
+ 40, 8, 40, 23, 20, 20, 9, 40, 714, 10,
11, 11, 11, 11, 11, 11, 12, 12, 12, 12,
- 12, 12, 20, 23, 27, 19, 23, 29, 20, 11,
- 23, 20, 20, 136, 21, 12, 27, 25, 683, 29,
- 134, 21, 34, 94, 28, 25, 133, 11, 21, 20,
- 23, 27, 131, 12, 29, 34, 11, 128, 128, 129,
- 21, 21, 12, 25, 25, 76, 28, 26, 21, 34,
- 26, 28, 25, 30, 94, 21, 22, 26, 32, 26,
-
- 22, 30, 127, 22, 32, 22, 22, 30, 76, 31,
- 26, 30, 76, 31, 26, 75, 83, 26, 22, 30,
- 30, 83, 79, 22, 26, 32, 26, 22, 30, 31,
- 22, 79, 22, 22, 30, 31, 31, 35, 30, 75,
- 31, 35, 75, 83, 68, 37, 62, 37, 77, 79,
- 57, 35, 52, 38, 35, 77, 31, 33, 38, 51,
- 90, 33, 37, 35, 35, 252, 38, 33, 35, 39,
- 33, 37, 37, 39, 37, 77, 36, 33, 35, 33,
- 38, 35, 46, 90, 33, 38, 36, 90, 33, 37,
- 36, 36, 252, 66, 33, 39, 39, 33, 36, 130,
-
- 39, 41, 130, 36, 33, 56, 66, 56, 56, 64,
- 56, 64, 64, 36, 64, 135, 135, 36, 36, 67,
- 66, 67, 67, 69, 67, 69, 69, 72, 69, 72,
- 72, 78, 72, 69, 80, 81, 86, 72, 87, 82,
- 82, 81, 84, 85, 78, 87, 64, 80, 82, 86,
- 84, 91, 14, 219, 13, 78, 81, 0, 78, 117,
- 85, 80, 81, 86, 72, 87, 82, 82, 81, 84,
- 88, 78, 89, 91, 85, 92, 95, 93, 91, 88,
- 93, 89, 219, 99, 95, 97, 96, 85, 92, 97,
- 117, 100, 98, 93, 93, 98, 99, 88, 0, 89,
-
- 107, 93, 92, 95, 93, 101, 96, 93, 96, 97,
- 99, 103, 97, 96, 100, 102, 97, 105, 100, 98,
- 93, 93, 104, 107, 105, 101, 106, 107, 108, 102,
- 109, 103, 101, 96, 109, 106, 104, 108, 103, 110,
- 0, 111, 102, 112, 105, 113, 110, 116, 114, 104,
- 112, 119, 109, 106, 115, 108, 116, 109, 118, 113,
- 114, 109, 115, 122, 124, 121, 110, 111, 111, 122,
- 112, 119, 113, 118, 116, 114, 121, 119, 119, 120,
- 123, 115, 125, 0, 126, 118, 124, 0, 120, 0,
- 122, 124, 121, 126, 0, 142, 0, 125, 119, 0,
-
- 140, 123, 0, 141, 0, 123, 120, 123, 0, 125,
- 132, 126, 132, 132, 137, 132, 137, 137, 138, 137,
- 138, 138, 143, 138, 140, 141, 142, 140, 123, 144,
- 141, 145, 146, 147, 143, 148, 149, 0, 156, 145,
- 147, 149, 150, 152, 146, 151, 156, 0, 144, 143,
- 155, 0, 153, 148, 0, 138, 144, 157, 145, 146,
- 147, 160, 148, 159, 150, 156, 158, 149, 149, 150,
- 158, 151, 151, 153, 152, 162, 155, 155, 161, 157,
- 153, 165, 163, 160, 157, 163, 159, 162, 160, 164,
- 159, 161, 166, 158, 167, 0, 169, 163, 164, 167,
-
- 153, 154, 162, 165, 170, 161, 154, 169, 165, 163,
- 171, 154, 163, 167, 166, 168, 164, 154, 154, 166,
- 167, 167, 168, 169, 154, 173, 167, 176, 154, 172,
- 174, 178, 177, 154, 179, 170, 171, 171, 154, 172,
- 167, 175, 168, 180, 154, 154, 182, 175, 174, 0,
- 181, 184, 0, 194, 177, 0, 173, 174, 176, 177,
- 172, 186, 178, 180, 181, 179, 172, 182, 175, 183,
- 180, 187, 184, 182, 185, 188, 183, 181, 184, 185,
- 186, 189, 190, 191, 194, 187, 192, 196, 186, 190,
- 201, 192, 195, 189, 193, 193, 183, 188, 187, 195,
-
- 197, 185, 188, 193, 198, 191, 202, 199, 189, 190,
- 191, 200, 196, 192, 196, 199, 201, 201, 203, 195,
- 197, 193, 193, 204, 205, 206, 200, 197, 202, 0,
- 208, 209, 210, 206, 199, 198, 0, 202, 200, 205,
- 204, 207, 211, 214, 213, 227, 218, 212, 204, 203,
- 204, 205, 206, 209, 211, 202, 212, 213, 209, 216,
- 207, 208, 214, 210, 215, 217, 215, 204, 207, 211,
- 214, 213, 218, 218, 212, 220, 227, 221, 222, 0,
- 0, 223, 224, 216, 225, 231, 216, 228, 230, 222,
- 217, 215, 217, 223, 226, 0, 229, 243, 0, 0,
-
- 228, 220, 220, 221, 221, 222, 224, 225, 223, 224,
- 230, 225, 226, 232, 228, 230, 231, 233, 234, 235,
- 232, 226, 229, 229, 234, 236, 233, 238, 243, 237,
- 240, 247, 239, 235, 241, 242, 238, 0, 0, 240,
- 232, 244, 265, 241, 233, 234, 235, 0, 245, 247,
- 242, 236, 236, 237, 238, 239, 237, 240, 247, 239,
- 248, 241, 242, 245, 246, 244, 248, 246, 244, 249,
- 250, 253, 255, 265, 246, 245, 251, 251, 254, 258,
- 0, 254, 256, 249, 255, 250, 0, 248, 254, 257,
- 259, 246, 260, 262, 246, 253, 249, 250, 253, 255,
-
- 256, 251, 261, 251, 251, 254, 258, 257, 254, 256,
- 263, 267, 259, 269, 261, 262, 257, 259, 260, 260,
- 262, 264, 268, 266, 268, 263, 269, 271, 264, 261,
- 266, 270, 0, 267, 270, 272, 270, 263, 267, 0,
- 269, 0, 270, 273, 276, 271, 268, 287, 264, 268,
- 266, 268, 281, 275, 271, 277, 276, 0, 270, 274,
- 275, 270, 279, 270, 281, 273, 272, 274, 277, 278,
- 273, 276, 282, 274, 286, 279, 284, 283, 287, 281,
- 275, 286, 277, 283, 284, 278, 274, 0, 285, 279,
- 282, 288, 0, 278, 274, 288, 278, 291, 0, 282,
-
- 285, 286, 289, 284, 283, 290, 293, 295, 292, 289,
- 0, 297, 278, 280, 280, 285, 306, 290, 288, 291,
- 292, 294, 295, 280, 291, 280, 280, 280, 294, 289,
- 280, 296, 290, 299, 295, 292, 298, 293, 280, 306,
- 280, 280, 297, 306, 296, 300, 300, 298, 294, 301,
- 280, 302, 280, 280, 280, 299, 301, 280, 296, 303,
- 299, 310, 302, 298, 304, 305, 307, 308, 314, 309,
- 303, 313, 0, 311, 300, 307, 301, 304, 302, 310,
- 308, 312, 309, 317, 316, 318, 303, 309, 310, 313,
- 305, 304, 305, 307, 308, 311, 309, 315, 313, 314,
-
- 311, 319, 321, 315, 312, 316, 317, 318, 312, 309,
- 317, 316, 318, 320, 323, 322, 321, 324, 0, 325,
- 327, 326, 0, 324, 315, 328, 0, 319, 319, 321,
- 331, 329, 330, 0, 333, 320, 326, 325, 330, 0,
- 320, 322, 322, 327, 324, 323, 325, 327, 326, 334,
- 335, 328, 328, 329, 336, 334, 331, 331, 329, 330,
- 333, 333, 342, 337, 338, 340, 341, 340, 343, 335,
- 337, 0, 336, 341, 340, 342, 334, 335, 344, 338,
- 345, 336, 346, 347, 0, 351, 348, 0, 353, 342,
- 337, 338, 340, 341, 340, 348, 344, 0, 349, 343,
-
- 350, 346, 345, 349, 352, 344, 350, 345, 351, 346,
- 353, 354, 351, 348, 347, 353, 352, 357, 355, 0,
- 358, 359, 354, 363, 357, 349, 355, 350, 358, 362,
- 361, 352, 359, 360, 0, 364, 362, 364, 354, 365,
- 366, 0, 360, 367, 357, 355, 356, 358, 359, 363,
- 363, 356, 366, 356, 361, 371, 362, 361, 367, 0,
- 369, 356, 364, 368, 360, 365, 365, 366, 369, 360,
- 367, 356, 356, 356, 370, 368, 372, 371, 356, 370,
- 356, 373, 371, 374, 375, 376, 379, 369, 356, 373,
- 368, 377, 381, 378, 372, 374, 380, 382, 356, 383,
-
- 379, 370, 378, 372, 385, 386, 377, 375, 373, 388,
- 374, 375, 382, 379, 384, 380, 376, 386, 377, 381,
- 378, 387, 390, 380, 382, 391, 390, 392, 385, 384,
- 383, 385, 386, 388, 389, 393, 388, 389, 394, 391,
- 395, 384, 397, 387, 396, 389, 0, 400, 387, 398,
- 399, 401, 391, 390, 392, 398, 402, 405, 403, 404,
- 0, 389, 393, 0, 389, 406, 404, 395, 407, 394,
- 400, 396, 399, 397, 400, 410, 398, 399, 414, 402,
- 403, 407, 401, 402, 408, 403, 404, 406, 405, 408,
- 409, 411, 406, 408, 413, 407, 415, 412, 416, 409,
-
- 411, 410, 410, 0, 417, 423, 418, 413, 408, 414,
- 420, 408, 0, 430, 415, 419, 408, 409, 411, 412,
- 408, 413, 416, 415, 412, 416, 417, 417, 418, 419,
- 421, 417, 420, 418, 422, 424, 423, 420, 427, 425,
- 426, 421, 419, 428, 430, 429, 431, 432, 438, 422,
- 433, 435, 428, 417, 434, 435, 424, 421, 429, 0,
- 427, 422, 424, 425, 426, 427, 425, 426, 431, 436,
- 428, 437, 429, 431, 433, 439, 434, 433, 432, 438,
- 440, 434, 435, 436, 441, 437, 442, 444, 441, 443,
- 445, 446, 0, 439, 0, 440, 436, 443, 437, 445,
-
- 446, 447, 439, 448, 440, 450, 449, 440, 451, 447,
- 448, 442, 444, 442, 444, 441, 443, 445, 446, 453,
- 451, 457, 440, 450, 454, 452, 458, 459, 447, 449,
- 448, 453, 450, 449, 452, 451, 455, 456, 460, 461,
- 465, 464, 463, 459, 455, 456, 453, 457, 457, 458,
- 461, 462, 452, 458, 459, 454, 463, 466, 467, 462,
- 460, 464, 465, 455, 456, 460, 461, 465, 464, 463,
- 468, 470, 469, 472, 473, 471, 480, 466, 462, 474,
- 467, 469, 475, 476, 466, 467, 472, 477, 485, 476,
- 478, 470, 468, 471, 0, 477, 473, 468, 470, 469,
-
- 472, 473, 471, 474, 481, 475, 474, 480, 478, 475,
- 476, 481, 482, 477, 477, 483, 484, 478, 486, 485,
- 487, 488, 477, 488, 491, 484, 0, 500, 494, 487,
- 483, 481, 497, 498, 499, 482, 491, 486, 494, 482,
- 502, 505, 483, 484, 0, 486, 0, 487, 488, 489,
- 497, 491, 506, 489, 498, 494, 489, 499, 500, 497,
- 498, 499, 502, 489, 503, 505, 489, 502, 505, 507,
- 0, 489, 504, 503, 504, 508, 489, 510, 0, 506,
- 489, 514, 0, 489, 0, 0, 509, 511, 513, 507,
- 489, 503, 512, 489, 501, 501, 507, 501, 509, 504,
-
- 501, 508, 508, 510, 510, 501, 514, 519, 514, 511,
- 513, 501, 501, 509, 511, 513, 512, 515, 517, 512,
- 501, 501, 501, 516, 501, 515, 517, 501, 518, 520,
- 516, 521, 501, 519, 519, 522, 523, 524, 501, 501,
- 521, 520, 525, 526, 515, 517, 0, 518, 527, 0,
- 516, 530, 528, 529, 531, 518, 520, 522, 521, 534,
- 530, 0, 522, 523, 532, 535, 533, 526, 524, 527,
- 526, 528, 529, 525, 533, 527, 531, 536, 530, 528,
- 529, 531, 537, 535, 532, 540, 534, 538, 541, 543,
- 0, 532, 535, 533, 542, 538, 536, 544, 545, 548,
-
- 549, 550, 543, 540, 536, 548, 541, 550, 0, 546,
- 545, 0, 540, 537, 538, 541, 543, 546, 542, 555,
- 560, 542, 549, 544, 544, 545, 548, 549, 550, 552,
- 551, 553, 554, 546, 552, 557, 546, 551, 553, 556,
- 559, 560, 555, 557, 546, 558, 555, 560, 556, 561,
- 554, 563, 564, 559, 562, 565, 552, 551, 553, 554,
- 567, 562, 557, 558, 563, 566, 556, 559, 567, 568,
- 573, 569, 558, 570, 572, 571, 561, 575, 563, 570,
- 574, 562, 576, 564, 568, 578, 565, 567, 566, 574,
- 579, 575, 566, 569, 573, 581, 568, 573, 569, 577,
-
- 570, 571, 571, 580, 575, 572, 577, 574, 582, 588,
- 584, 583, 578, 576, 583, 580, 582, 579, 581, 587,
- 585, 604, 581, 584, 0, 0, 577, 585, 589, 618,
- 580, 590, 588, 590, 0, 582, 588, 584, 583, 0,
- 589, 591, 615, 593, 594, 587, 587, 585, 586, 595,
- 586, 592, 604, 661, 586, 589, 586, 594, 590, 596,
- 618, 586, 595, 592, 591, 593, 586, 597, 591, 615,
- 593, 594, 586, 599, 598, 586, 595, 586, 592, 597,
- 661, 586, 596, 586, 598, 600, 596, 603, 586, 602,
- 606, 601, 762, 586, 597, 599, 598, 601, 600, 605,
-
- 599, 598, 602, 0, 605, 606, 605, 607, 603, 608,
- 611, 598, 600, 609, 603, 610, 602, 606, 601, 612,
- 762, 616, 608, 619, 605, 605, 605, 614, 609, 607,
- 613, 605, 611, 605, 607, 614, 608, 611, 612, 622,
- 609, 610, 610, 613, 616, 620, 612, 619, 616, 621,
- 619, 605, 623, 620, 614, 625, 624, 613, 626, 627,
- 628, 633, 629, 621, 624, 0, 0, 631, 628, 626,
- 622, 630, 620, 625, 623, 632, 621, 627, 630, 623,
- 631, 636, 625, 624, 629, 626, 627, 628, 635, 629,
- 636, 637, 633, 632, 631, 638, 635, 639, 630, 640,
-
- 643, 642, 632, 637, 0, 641, 644, 647, 636, 648,
- 649, 647, 648, 0, 646, 635, 650, 638, 637, 639,
- 644, 640, 638, 641, 639, 646, 640, 642, 642, 650,
- 652, 643, 641, 644, 649, 648, 648, 649, 647, 648,
- 651, 646, 652, 650, 653, 654, 655, 651, 656, 0,
- 659, 653, 655, 658, 657, 663, 0, 652, 660, 664,
- 662, 659, 0, 0, 663, 0, 0, 651, 0, 654,
- 656, 653, 654, 655, 658, 656, 657, 659, 662, 660,
- 658, 657, 663, 664, 665, 660, 664, 662, 666, 668,
- 667, 669, 670, 665, 674, 672, 666, 667, 676, 673,
-
- 677, 679, 0, 668, 672, 675, 0, 693, 0, 0,
- 674, 665, 678, 669, 670, 666, 668, 667, 669, 670,
- 675, 674, 672, 673, 678, 680, 673, 681, 679, 676,
- 682, 677, 675, 680, 684, 685, 686, 690, 693, 678,
- 681, 694, 692, 684, 686, 682, 687, 691, 687, 692,
- 690, 0, 680, 685, 681, 695, 696, 682, 697, 691,
- 0, 684, 685, 686, 690, 699, 698, 701, 700, 692,
- 702, 697, 694, 687, 691, 701, 703, 695, 696, 698,
- 700, 704, 695, 696, 705, 697, 706, 699, 703, 704,
- 702, 707, 699, 698, 701, 700, 708, 702, 709, 706,
-
- 707, 710, 711, 703, 716, 709, 712, 713, 704, 0,
- 715, 705, 714, 706, 0, 0, 717, 708, 707, 715,
- 713, 721, 716, 708, 711, 709, 712, 710, 710, 711,
- 719, 716, 718, 712, 713, 722, 714, 715, 717, 714,
- 718, 720, 723, 717, 721, 725, 724, 727, 721, 720,
- 728, 726, 719, 722, 723, 727, 728, 719, 724, 718,
- 730, 729, 722, 731, 732, 725, 726, 733, 720, 723,
- 729, 732, 725, 724, 727, 731, 735, 728, 726, 736,
- 0, 730, 737, 739, 740, 733, 738, 730, 729, 742,
- 731, 732, 736, 738, 733, 743, 741, 742, 744, 740,
-
- 741, 737, 746, 745, 747, 739, 736, 735, 743, 737,
- 739, 740, 748, 738, 749, 750, 742, 745, 751, 0,
- 746, 753, 743, 755, 744, 744, 756, 741, 752, 746,
- 745, 757, 755, 759, 754, 747, 749, 750, 748, 748,
- 761, 749, 750, 753, 751, 751, 752, 754, 753, 758,
- 755, 765, 763, 766, 767, 752, 759, 756, 0, 0,
- 759, 754, 757, 767, 771, 766, 761, 761, 763, 768,
- 770, 758, 771, 772, 765, 0, 758, 760, 765, 763,
- 766, 767, 760, 770, 760, 769, 760, 768, 760, 769,
- 773, 771, 772, 774, 776, 760, 768, 770, 777, 775,
-
- 772, 775, 774, 773, 760, 778, 780, 781, 783, 760,
- 777, 760, 784, 760, 782, 760, 769, 773, 785, 784,
- 774, 776, 782, 787, 786, 777, 775, 789, 790, 781,
- 780, 788, 778, 780, 781, 783, 792, 791, 788, 784,
- 794, 782, 797, 793, 799, 785, 786, 790, 795, 789,
- 787, 786, 793, 798, 789, 790, 800, 0, 788, 791,
- 807, 794, 792, 792, 791, 801, 799, 794, 795, 802,
- 793, 799, 803, 797, 804, 795, 806, 802, 805, 809,
- 806, 811, 810, 801, 798, 805, 809, 800, 803, 808,
- 811, 807, 801, 812, 817, 808, 802, 810, 0, 803,
-
- 813, 804, 808, 806, 815, 805, 809, 813, 811, 810,
- 814, 816, 814, 815, 818, 821, 808, 819, 818, 812,
- 812, 817, 808, 821, 822, 823, 824, 813, 822, 825,
- 829, 815, 827, 816, 826, 828, 0, 814, 816, 819,
- 830, 818, 821, 823, 819, 824, 829, 826, 830, 831,
- 831, 832, 823, 824, 825, 822, 825, 829, 828, 833,
- 832, 826, 828, 827, 834, 835, 836, 830, 837, 839,
- 0, 838, 835, 834, 844, 840, 831, 837, 832, 838,
- 842, 833, 839, 843, 845, 841, 833, 840, 842, 836,
- 846, 834, 835, 836, 844, 837, 839, 841, 838, 846,
-
- 847, 844, 840, 848, 849, 843, 845, 842, 850, 852,
- 843, 845, 841, 853, 850, 848, 851, 846, 847, 854,
- 0, 855, 857, 859, 0, 849, 861, 847, 858, 0,
- 848, 849, 859, 862, 860, 850, 0, 870, 851, 861,
- 852, 862, 0, 851, 853, 854, 854, 855, 855, 857,
- 859, 858, 869, 861, 863, 858, 860, 865, 863, 864,
- 862, 860, 866, 864, 868, 865, 867, 867, 870, 871,
- 866, 0, 868, 869, 872, 873, 877, 871, 874, 869,
- 878, 875, 872, 873, 865, 863, 874, 879, 877, 866,
- 864, 868, 876, 867, 875, 880, 871, 881, 876, 882,
-
- 883, 872, 873, 877, 884, 874, 878, 878, 875, 890,
- 880, 879, 885, 891, 879, 886, 887, 894, 884, 876,
- 887, 882, 880, 883, 881, 889, 882, 883, 892, 886,
- 885, 884, 889, 887, 898, 891, 890, 893, 900, 885,
- 891, 887, 886, 887, 893, 896, 902, 887, 894, 899,
- 904, 892, 889, 907, 896, 892, 898, 906, 908, 912,
- 887, 898, 913, 909, 893, 909, 911, 0, 915, 900,
- 908, 912, 896, 902, 910, 899, 899, 904, 916, 907,
- 907, 906, 0, 916, 906, 908, 912, 910, 911, 913,
- 909, 914, 917, 911, 915, 915, 919, 918, 914, 920,
-
- 922, 910, 923, 925, 919, 916, 924, 926, 917, 922,
- 927, 930, 932, 928, 926, 923, 934, 927, 914, 917,
- 918, 920, 931, 919, 918, 925, 920, 922, 929, 923,
- 925, 928, 924, 924, 926, 929, 930, 927, 930, 933,
- 928, 936, 937, 932, 931, 938, 933, 934, 941, 931,
- 939, 941, 942, 938, 936, 929, 944, 946, 943, 947,
- 0, 0, 948, 944, 952, 949, 933, 945, 936, 937,
- 945, 939, 938, 943, 950, 941, 950, 939, 942, 942,
- 948, 947, 945, 944, 951, 943, 947, 949, 946, 948,
- 953, 945, 949, 954, 945, 952, 955, 945, 956, 957,
-
- 958, 950, 954, 959, 955, 956, 960, 959, 951, 945,
- 961, 951, 962, 963, 966, 969, 953, 953, 0, 0,
- 954, 957, 963, 955, 968, 956, 957, 966, 960, 964,
- 959, 958, 967, 960, 962, 965, 964, 961, 968, 962,
- 963, 966, 965, 970, 972, 971, 969, 967, 973, 975,
- 970, 968, 971, 977, 973, 976, 964, 972, 978, 967,
- 984, 979, 965, 980, 979, 977, 0, 986, 985, 0,
- 970, 972, 971, 987, 980, 973, 975, 976, 978, 979,
- 977, 982, 976, 988, 987, 978, 982, 984, 979, 986,
- 980, 979, 985, 982, 986, 985, 989, 991, 993, 990,
-
- 987, 988, 990, 992, 989, 994, 995, 0, 982, 996,
- 988, 998, 994, 982, 997, 991, 999, 990, 996, 1001,
- 995, 1001, 998, 989, 991, 993, 990, 997, 1002, 990,
- 1003, 999, 994, 995, 992, 1005, 996, 1002, 998, 1004,
- 1009, 997, 1006, 999, 1007, 1008, 1001, 1011, 1008, 1009,
- 1004, 1013, 1012, 1005, 0, 1002, 1003, 1003, 1007, 1014,
- 1016, 1012, 1005, 1008, 1006, 1021, 1004, 1009, 1023, 1006,
- 1007, 1007, 1008, 1017, 1015, 1008, 1022, 1023, 1011, 1012,
- 1014, 1015, 1013, 1018, 1021, 1007, 1014, 1017, 1024, 1018,
- 1022, 1016, 1021, 1025, 1026, 1023, 1024, 0, 1031, 1027,
-
- 1017, 1015, 1029, 1022, 1030, 1026, 1032, 1018, 1027, 1029,
- 1018, 1036, 1033, 1035, 1034, 1024, 1018, 1035, 1037, 0,
- 1031, 1026, 1038, 1036, 1025, 1031, 1027, 1030, 1032, 1029,
- 1039, 1030, 1034, 1032, 1033, 1038, 1040, 1041, 1036, 1033,
- 1035, 1034, 0, 1043, 1044, 1037, 1042, 0, 1046, 1038,
- 1039, 1040, 1041, 1045, 1042, 1047, 1049, 1039, 1052, 1044,
- 1048, 0, 1045, 1040, 1041, 1053, 1051, 0, 1055, 1046,
- 0, 1044, 0, 1042, 1043, 1046, 1052, 1058, 1056, 1054,
- 1045, 1059, 1047, 1049, 1048, 1052, 1057, 1048, 1051, 1058,
- 1055, 1061, 1053, 1051, 1054, 1055, 1056, 1060, 1061, 1062,
-
- 1063, 1057, 1064, 1059, 1058, 1056, 1054, 1068, 1059, 1066,
- 1060, 1062, 1067, 1057, 1065, 1060, 1069, 1066, 1061, 1067,
- 1065, 1070, 1071, 1069, 1060, 1073, 1062, 1063, 1072, 1076,
- 1074, 1077, 1078, 1064, 1068, 1080, 1066, 1060, 1081, 1067,
- 1077, 1065, 1079, 1069, 1079, 1082, 0, 1086, 1070, 1071,
- 0, 1072, 1084, 0, 1074, 1072, 1073, 1074, 1077, 1084,
- 1076, 1089, 1080, 1078, 1081, 1081, 1083, 1083, 1083, 1079,
- 1085, 1091, 1098, 1083, 1089, 1087, 1082, 1085, 1086, 1084,
- 1090, 1083, 1087, 1092, 1092, 1093, 1090, 1095, 1089, 1094,
- 1098, 1096, 1095, 1083, 1083, 1083, 1094, 1085, 1091, 1098,
-
- 1083, 1099, 1087, 1100, 1101, 1102, 1109, 1090, 1103, 1103,
- 1092, 1093, 1093, 1104, 1095, 1100, 1094, 1096, 1096, 1105,
- 1105, 1108, 1106, 1102, 1101, 1111, 1112, 1110, 1099, 1113,
- 1100, 1101, 1102, 1106, 1110, 1103, 1114, 1109, 1116, 1104,
- 1104, 0, 1115, 1108, 1117, 1111, 1105, 1118, 1108, 1106,
- 1121, 1117, 1111, 1119, 1110, 1118, 1116, 1112, 1120, 1121,
- 1113, 1122, 1122, 1114, 1115, 1116, 1123, 1124, 1119, 1115,
- 1125, 1117, 1126, 1128, 1118, 1127, 1129, 1121, 1125, 1124,
- 1119, 1131, 1120, 1132, 1126, 1120, 1135, 1134, 1122, 1132,
- 1130, 1128, 1123, 1123, 1124, 1130, 1127, 1125, 1133, 1126,
-
- 1128, 1136, 1127, 1129, 1137, 1136, 1130, 1140, 1131, 1139,
- 1132, 1133, 1141, 1135, 1138, 1138, 1143, 1130, 1134, 1142,
- 1145, 1144, 1130, 1144, 1139, 1133, 1147, 1141, 1146, 1148,
- 0, 1143, 1136, 1146, 1150, 1137, 1139, 1151, 1140, 1141,
- 1152, 1138, 1142, 1143, 1148, 1153, 1142, 1154, 1144, 1155,
- 1157, 1145, 1166, 1156, 1154, 1146, 1148, 1147, 1150, 1160,
- 1158, 1150, 0, 1151, 1151, 1162, 1167, 1152, 1163, 1165,
- 1155, 1157, 1153, 1167, 1154, 1156, 1155, 1157, 1158, 1166,
- 1156, 1160, 1168, 1163, 1165, 1169, 1160, 1158, 1171, 1162,
- 1170, 1172, 1162, 1167, 1169, 1163, 1165, 1173, 1170, 1176,
-
- 1168, 0, 1178, 1174, 1179, 1177, 1181, 1184, 1185, 1168,
- 1176, 1171, 1169, 1172, 1177, 1171, 1174, 1170, 1172, 1184,
- 1178, 1185, 1179, 1186, 1188, 1176, 1176, 0, 1173, 1178,
- 1174, 1179, 1177, 1181, 1184, 1185, 1187, 1176, 1190, 1189,
- 1192, 1193, 0, 1194, 1195, 0, 1187, 1196, 1193, 0,
- 1188, 1188, 1202, 1196, 1186, 1200, 1200, 1197, 1198, 1202,
- 1192, 1199, 1195, 1187, 1189, 1190, 1189, 1192, 1193, 1194,
- 1194, 1195, 1197, 1198, 1196, 1201, 1199, 1205, 1206, 1202,
- 1207, 0, 1200, 1203, 1197, 1198, 1208, 1201, 1199, 1207,
- 1203, 1209, 1213, 1212, 1210, 1214, 1214, 1228, 1221, 1205,
-
- 1216, 1215, 1201, 1206, 1205, 1206, 1212, 1207, 1208, 1217,
- 1203, 1209, 1210, 1208, 0, 1218, 1222, 1219, 1209, 1213,
- 1212, 1210, 1214, 1215, 1228, 1216, 1219, 1216, 1215, 1221,
- 1224, 1217, 1220, 1223, 1232, 1229, 1217, 1218, 1222, 1220,
- 1226, 1227, 1218, 1222, 1219, 1231, 1230, 1223, 1226, 1224,
- 0, 1234, 1231, 1233, 1227, 1235, 1238, 1224, 1230, 1220,
- 1223, 1229, 1229, 1236, 1237, 1232, 1236, 1226, 1227, 1239,
- 1235, 1244, 1231, 1230, 1238, 1233, 1234, 1241, 1234, 1242,
- 1233, 1236, 1235, 1238, 1239, 1244, 1246, 1245, 1248, 1237,
- 1236, 1237, 1253, 1236, 1245, 1250, 1239, 1246, 1244, 1241,
-
- 1251, 1242, 1254, 1252, 1241, 1252, 1242, 1255, 1256, 1248,
- 1253, 1259, 1251, 1246, 1245, 1248, 1250, 1258, 1257, 1253,
- 1261, 1266, 1250, 1260, 1261, 1255, 1257, 1251, 1262, 1254,
- 1252, 1267, 1263, 1259, 1255, 1256, 1268, 1260, 1259, 1263,
- 1258, 1269, 1270, 1271, 1258, 1257, 1272, 1262, 1266, 1267,
- 1260, 1261, 1271, 1273, 1274, 1262, 1277, 1270, 1267, 1263,
- 1276, 1278, 1276, 1268, 1279, 1278, 0, 1269, 1269, 1270,
- 1271, 1280, 1283, 1281, 1282, 1273, 1279, 1272, 1277, 1284,
- 1273, 1274, 1281, 1277, 1285, 1282, 1286, 1276, 1278, 1287,
- 1287, 1279, 1294, 1280, 1291, 1288, 1285, 1291, 1280, 1283,
-
- 1281, 1282, 1284, 1288, 1292, 1290, 1284, 1294, 1286, 1290,
- 1297, 1285, 1292, 1286, 1293, 1298, 1287, 1295, 1303, 1294,
- 1293, 1291, 1288, 1295, 1299, 0, 1302, 1300, 1304, 1301,
- 1307, 1292, 1290, 1306, 1305, 1308, 1309, 1297, 1299, 1298,
- 1300, 1293, 1298, 1301, 1295, 1303, 1305, 1306, 1311, 1313,
- 1310, 1299, 1302, 1302, 1300, 1304, 1301, 1307, 1310, 1312,
- 1306, 1305, 1308, 1309, 1314, 1315, 1317, 1318, 1312, 1320,
- 1319, 1321, 0, 1315, 1322, 1311, 1313, 1310, 1319, 1323,
- 1321, 1325, 1326, 0, 1324, 0, 1312, 1329, 1317, 0,
- 1326, 1314, 1315, 1317, 1318, 1322, 1320, 1319, 1321, 1324,
-
- 1327, 1322, 1334, 1323, 1335, 1328, 1323, 1333, 1325, 1326,
- 1324, 1324, 1327, 1328, 1329, 1331, 1332, 1337, 0, 1333,
- 1332, 1339, 1331, 1338, 1338, 1334, 1324, 1327, 1336, 1334,
- 1341, 1335, 1328, 1340, 1333, 1344, 1336, 1342, 1343, 1346,
- 1343, 1347, 1331, 1332, 1337, 1341, 1345, 1339, 1339, 1344,
- 1338, 1340, 1345, 1347, 1348, 1336, 1349, 1341, 1350, 1342,
- 1340, 1346, 1344, 1351, 1342, 1343, 1346, 1358, 1347, 1352,
- 1354, 1350, 1348, 1345, 1349, 1356, 1365, 1354, 1357, 0,
- 1359, 1348, 1360, 1349, 0, 1350, 1367, 1362, 1359, 1360,
- 1363, 1365, 1352, 1356, 1351, 0, 1352, 1354, 1358, 1362,
-
- 1368, 1370, 1356, 1365, 1357, 1357, 1359, 1359, 1363, 1360,
- 1367, 1369, 1371, 1367, 1362, 1359, 1370, 1363, 1369, 1373,
- 1374, 1376, 1368, 1375, 1377, 1383, 1378, 1368, 1370, 1379,
- 1390, 1381, 0, 1374, 1378, 1382, 1376, 1377, 1369, 1371,
- 0, 1384, 1387, 0, 1389, 0, 1373, 1374, 1376, 1375,
- 1375, 1377, 1383, 1378, 1381, 1379, 1379, 1385, 1381, 1382,
- 1386, 1390, 1382, 1384, 1385, 1387, 1389, 1388, 1384, 1387,
- 1391, 1389, 1393, 1386, 1388, 1395, 1394, 1396, 0, 0,
- 1397, 1405, 1400, 1393, 1385, 1401, 1411, 1386, 1410, 1413,
- 1415, 1391, 1407, 0, 1388, 1400, 1396, 1391, 1394, 1393,
-
- 1416, 1407, 1419, 1394, 1396, 1397, 1395, 1397, 1405, 1400,
- 1410, 1401, 1401, 1411, 1417, 1410, 1413, 1418, 1422, 1407,
- 1421, 1415, 1418, 1423, 1419, 1417, 1416, 1416, 1421, 1419,
- 1425, 1426, 1430, 1422, 1427, 0, 1432, 1428, 0, 1434,
- 1433, 1417, 1436, 1427, 1418, 1422, 1435, 1421, 1425, 1428,
- 1423, 1437, 1434, 1438, 0, 1439, 1441, 1425, 1432, 1430,
- 1442, 1427, 1426, 1432, 1428, 1433, 1434, 1433, 1435, 1436,
- 1439, 1441, 1440, 1435, 1443, 1442, 1444, 1445, 1437, 1446,
- 1438, 1440, 1439, 1441, 1445, 1448, 1448, 1442, 1449, 1443,
- 1447, 1450, 1456, 1451, 1452, 1449, 1451, 1453, 1444, 1440,
-
- 1454, 1443, 1458, 1444, 1445, 1450, 1446, 1452, 1447, 1454,
- 1457, 1455, 1448, 1459, 1456, 1449, 1455, 1447, 1450, 1456,
- 1451, 1452, 1460, 1453, 1453, 1464, 1463, 1454, 1467, 1458,
- 1465, 1472, 1457, 1463, 1464, 1465, 1466, 1457, 1455, 1470,
- 1459, 1469, 1473, 1466, 1468, 1476, 1467, 1474, 1460, 1460,
- 1469, 1468, 1464, 1463, 1476, 1467, 1480, 1465, 1472, 1481,
- 1473, 1475, 0, 1466, 1478, 1470, 1470, 1474, 1469, 1473,
- 1477, 1468, 1476, 1475, 1474, 1478, 1479, 1482, 1485, 1477,
- 1483, 1484, 0, 1480, 1479, 1493, 1482, 1486, 1475, 1484,
- 1481, 1478, 1483, 1488, 1486, 1492, 1494, 1477, 1489, 1497,
-
- 1485, 1495, 1492, 1479, 1482, 1485, 1489, 1483, 1484, 1493,
- 1496, 1488, 1493, 1495, 1486, 1498, 1501, 1500, 1502, 1496,
- 1488, 1503, 1492, 1494, 1505, 1489, 1497, 1507, 1495, 1500,
- 1508, 1513, 1506, 0, 1512, 1503, 1513, 1496, 1498, 1501,
- 1506, 1515, 1498, 1501, 1500, 1502, 1514, 1516, 1503, 1524,
- 1521, 1505, 1518, 1520, 1507, 1523, 1522, 1508, 1513, 1506,
- 1512, 1512, 1517, 1515, 1514, 1520, 1525, 1523, 1515, 1516,
- 1517, 1518, 1521, 1514, 1516, 1526, 1524, 1521, 1522, 1518,
- 1520, 1527, 1523, 1522, 1528, 1534, 1529, 1530, 0, 1517,
- 1533, 0, 1535, 1525, 0, 1526, 1536, 1538, 0, 1544,
-
- 1540, 1539, 1526, 1537, 1533, 1543, 1528, 0, 1544, 1538,
- 1541, 1528, 1527, 1529, 1530, 1535, 1534, 1533, 1536, 1535,
- 1539, 1537, 1540, 1536, 1538, 1541, 1544, 1540, 1539, 1543,
- 1537, 1545, 1543, 1546, 1547, 0, 1548, 1541, 1549, 1551,
- 1554, 1552, 1553, 1558, 0, 1545, 1555, 1551, 1552, 1557,
- 1553, 1546, 1547, 1556, 1555, 1559, 1549, 1560, 1545, 1562,
- 1546, 1547, 1548, 1548, 1563, 1549, 1551, 1554, 1552, 1553,
- 1558, 1556, 1557, 1555, 1559, 1565, 1557, 1562, 1563, 1560,
- 1556, 1566, 1559, 1567, 1560, 1569, 1562, 1571, 1577, 1574,
- 0, 1563, 1575, 1576, 1566, 1567, 1574, 1578, 1565, 1579,
-
- 1580, 1582, 1565, 1583, 0, 1589, 1584, 0, 1566, 1580,
- 1567, 1569, 1569, 1598, 1571, 1577, 1574, 1576, 1575, 1575,
- 1576, 1581, 1588, 1592, 1578, 0, 1579, 1580, 1597, 1584,
- 1583, 1587, 1582, 1584, 1581, 1587, 1589, 1593, 1593, 1594,
- 1598, 1597, 1595, 1588, 1599, 1592, 1596, 1593, 1581, 1588,
- 1592, 1595, 1599, 1596, 1602, 1597, 1600, 0, 1603, 1601,
- 1605, 1594, 1587, 1604, 1593, 1593, 1594, 1601, 0, 1595,
- 1606, 1599, 1612, 1596, 1604, 1600, 1608, 1606, 1607, 1607,
- 1602, 1602, 1605, 1600, 1603, 1603, 1601, 1605, 1609, 1610,
- 1604, 1614, 1616, 1613, 1608, 1609, 1610, 1606, 1617, 1612,
-
- 1618, 1616, 1620, 1608, 1619, 1607, 1621, 1622, 1623, 1626,
- 1625, 0, 1640, 1614, 1620, 1609, 1610, 1613, 1614, 1616,
- 1613, 1622, 1619, 1618, 1626, 1617, 1623, 1618, 1625, 1620,
- 1627, 1619, 1627, 1621, 1622, 1623, 1626, 1625, 1631, 0,
- 1632, 1633, 1635, 1640, 1636, 1638, 1639, 1636, 1641, 1643,
- 1644, 0, 1646, 1639, 1641, 1642, 0, 1627, 1643, 1633,
- 1631, 1650, 1651, 1638, 1635, 1631, 1632, 1632, 1633, 1635,
- 1636, 1636, 1638, 1639, 1636, 1641, 1643, 1642, 1645, 1646,
- 1645, 1644, 1642, 1648, 1649, 1651, 1652, 1653, 1650, 1651,
- 1655, 1648, 1654, 1656, 1657, 1657, 1649, 1658, 1653, 1659,
-
- 1654, 1661, 1662, 1663, 1652, 1645, 1665, 1659, 1667, 1655,
- 1648, 1649, 1667, 1652, 1653, 1656, 1666, 1655, 1669, 1654,
- 1656, 1657, 1672, 1666, 1658, 1663, 1659, 1670, 1661, 1662,
- 1663, 1671, 1673, 1665, 1674, 1667, 1671, 1675, 1677, 1676,
- 1670, 1679, 1674, 1666, 1669, 1669, 1676, 1678, 1680, 1672,
- 1681, 1683, 1675, 1685, 1670, 1682, 1687, 1681, 1671, 1673,
- 1689, 1674, 1684, 1680, 1675, 1677, 1676, 1679, 1679, 1692,
- 1684, 1678, 0, 1683, 1678, 1680, 1694, 1681, 1683, 1682,
- 1686, 1686, 1682, 1687, 1685, 1690, 1693, 1689, 1695, 1684,
- 1686, 1692, 1696, 1690, 1697, 1698, 1692, 1700, 1694, 1693,
-
- 1703, 1705, 1707, 1694, 1708, 1706, 0, 1686, 1686, 1713,
- 0, 1709, 1690, 1693, 0, 1695, 1712, 1698, 1706, 1696,
- 1707, 1697, 1698, 1714, 1700, 1718, 1703, 1703, 1705, 1707,
- 1716, 1708, 1706, 1709, 1717, 1712, 1713, 1716, 1709, 1719,
- 1720, 1717, 1721, 1712, 1722, 1714, 1725, 1718, 1723, 1723,
- 1714, 1721, 1718, 1728, 1719, 1722, 1724, 1716, 1723, 1720,
- 1728, 1717, 1724, 1729, 1730, 1731, 1719, 1720, 1725, 1721,
- 1735, 1722, 1737, 1725, 1739, 1723, 1723, 1742, 1745, 1748,
- 1728, 1740, 1746, 1724, 1743, 0, 1747, 1745, 1731, 1749,
- 1729, 1730, 1731, 1750, 1740, 1737, 1743, 1735, 1752, 1737,
-
- 1746, 1739, 1773, 0, 1742, 1745, 1748, 1754, 1740, 1746,
- 1752, 1743, 1747, 1747, 1755, 1750, 1749, 1751, 1753, 1751,
- 1750, 1757, 1756, 1760, 1753, 1752, 1762, 1764, 1766, 1754,
- 1756, 1767, 1769, 1773, 1754, 1768, 1755, 1772, 1774, 0,
- 0, 1755, 0, 1766, 1751, 1753, 1775, 1768, 1757, 1756,
- 1760, 1774, 1776, 1762, 1764, 1766, 1778, 1767, 1767, 1769,
- 1776, 1772, 1768, 1777, 1772, 1774, 1783, 1778, 1775, 1784,
- 1787, 1785, 1777, 1775, 1788, 1794, 1784, 1789, 1790, 1776,
- 1791, 1796, 1795, 1778, 1785, 1789, 1787, 1790, 1788, 1783,
- 1777, 1791, 1792, 1783, 1792, 1797, 1784, 1787, 1785, 1793,
-
- 1795, 1788, 1794, 1798, 1789, 1790, 1799, 1791, 1796, 1795,
- 1800, 1793, 1800, 1802, 1809, 1801, 1803, 1810, 0, 1792,
- 1805, 0, 1797, 1808, 1812, 1798, 1793, 1801, 1799, 1803,
- 1798, 1808, 1805, 1799, 0, 0, 1811, 1800, 1812, 1814,
- 1819, 1816, 1801, 1803, 1802, 1809, 1813, 1805, 1810, 1811,
- 1808, 1812, 1814, 1815, 1813, 1816, 1817, 1818, 1827, 1820,
- 1823, 1815, 1819, 1811, 1821, 1818, 1814, 1819, 1816, 1822,
- 1817, 1824, 1821, 1813, 1828, 1825, 1832, 1826, 0, 1829,
- 1815, 1820, 1823, 1817, 1818, 1826, 1820, 1823, 1836, 1827,
- 0, 1821, 1830, 1824, 1834, 1822, 1822, 1825, 1824, 1829,
-
- 1830, 1828, 1825, 1831, 1826, 1833, 1829, 1832, 1834, 1837,
- 1836, 1831, 1838, 1833, 1839, 1836, 1840, 1837, 1841, 1830,
- 1838, 1834, 1843, 1842, 0, 1844, 1846, 1847, 1839, 1848,
- 1831, 1842, 1833, 1845, 0, 1847, 1837, 1849, 1850, 1838,
- 1841, 1839, 1840, 1840, 1852, 1841, 1846, 1859, 1843, 1843,
- 1842, 1844, 1844, 1846, 1847, 1845, 1848, 1849, 1850, 1851,
- 1845, 1853, 1855, 1856, 1849, 1850, 1852, 1851, 1857, 1853,
- 1858, 1852, 1860, 1859, 1859, 1861, 1857, 1862, 1858, 1863,
- 1860, 1864, 1865, 1861, 1855, 1856, 1851, 1866, 1853, 1855,
- 1856, 1867, 1873, 1869, 1872, 1857, 1875, 1858, 1876, 1860,
-
- 1873, 1864, 1861, 1862, 1862, 1874, 1863, 0, 1864, 1865,
- 0, 1867, 0, 1874, 1866, 1869, 1872, 0, 1867, 1873,
- 1869, 1872, 0, 1875, 0, 1876, 0, 0, 0, 0,
- 0, 0, 1874, 1880, 1880, 1880, 1880, 1880, 1880, 1880,
- 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1882, 1882, 1882,
- 1882, 1882, 1882, 1882, 1883, 1883, 1883, 1883, 1883, 1883,
- 1883, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1886, 1886,
- 0, 1886, 1886, 1886, 1886, 1887, 1887, 0, 0, 0,
- 1887, 1887, 1888, 1888, 0, 0, 1888, 0, 1888, 1889,
- 0, 0, 0, 0, 0, 1889, 1890, 1890, 0, 0,
-
- 0, 1890, 1890, 1891, 0, 0, 0, 0, 0, 1891,
- 1892, 1892, 0, 1892, 1892, 1892, 1892, 1893, 1893, 0,
- 1893, 1893, 1893, 1893, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879,
- 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879
+ 12, 12, 20, 23, 707, 19, 23, 29, 20, 11,
+ 23, 20, 20, 132, 21, 12, 132, 24, 83, 29,
+ 138, 21, 34, 83, 25, 28, 66, 11, 21, 20,
+ 23, 24, 25, 12, 29, 34, 11, 130, 130, 66,
+ 21, 21, 12, 24, 24, 83, 790, 28, 21, 34,
+ 25, 25, 28, 66, 30, 21, 22, 136, 24, 25,
+
+ 22, 26, 30, 22, 26, 22, 22, 135, 30, 32,
+ 133, 26, 30, 26, 790, 32, 95, 37, 22, 37,
+ 30, 30, 31, 22, 26, 118, 31, 22, 26, 30,
+ 22, 26, 22, 22, 37, 30, 32, 35, 26, 30,
+ 26, 35, 31, 37, 37, 36, 37, 95, 31, 31,
+ 76, 35, 38, 31, 35, 36, 118, 38, 131, 36,
+ 36, 37, 129, 35, 35, 38, 68, 36, 35, 31,
+ 33, 75, 36, 76, 33, 137, 137, 76, 35, 38,
+ 33, 35, 36, 33, 38, 39, 36, 36, 62, 39,
+ 33, 80, 33, 39, 57, 75, 52, 33, 75, 51,
+
+ 56, 33, 56, 56, 80, 56, 46, 33, 77, 41,
+ 33, 39, 39, 14, 144, 77, 39, 33, 80, 64,
+ 39, 64, 64, 67, 64, 67, 67, 69, 67, 69,
+ 69, 72, 69, 72, 72, 77, 72, 69, 78, 79,
+ 81, 72, 84, 82, 82, 144, 81, 86, 79, 89,
+ 84, 78, 82, 13, 91, 85, 64, 87, 89, 0,
+ 86, 81, 78, 88, 87, 78, 79, 81, 72, 84,
+ 82, 82, 85, 81, 86, 92, 89, 91, 78, 88,
+ 90, 91, 93, 0, 87, 0, 85, 0, 94, 90,
+ 88, 94, 96, 99, 97, 93, 99, 92, 100, 85,
+
+ 96, 101, 92, 0, 94, 94, 98, 90, 107, 93,
+ 98, 100, 94, 103, 97, 94, 97, 107, 94, 96,
+ 99, 97, 102, 104, 101, 100, 0, 103, 101, 106,
+ 98, 94, 94, 98, 105, 107, 106, 98, 109, 108,
+ 103, 97, 102, 104, 112, 111, 0, 109, 105, 102,
+ 104, 110, 111, 113, 114, 110, 106, 115, 0, 116,
+ 113, 105, 108, 223, 119, 109, 108, 116, 114, 115,
+ 112, 112, 111, 110, 117, 154, 120, 122, 110, 119,
+ 113, 114, 110, 117, 115, 121, 116, 123, 122, 127,
+ 124, 119, 223, 123, 121, 126, 120, 125, 127, 128,
+
+ 0, 117, 120, 120, 122, 0, 154, 0, 0, 142,
+ 126, 124, 121, 0, 123, 124, 127, 124, 0, 125,
+ 257, 128, 126, 120, 125, 134, 128, 134, 134, 139,
+ 134, 139, 139, 142, 139, 143, 142, 140, 124, 140,
+ 140, 145, 140, 147, 146, 149, 148, 257, 150, 151,
+ 0, 147, 149, 145, 151, 152, 159, 143, 148, 153,
+ 306, 306, 143, 146, 157, 160, 150, 155, 145, 0,
+ 147, 146, 149, 148, 140, 150, 158, 152, 159, 162,
+ 151, 151, 152, 159, 158, 153, 153, 160, 155, 306,
+ 157, 157, 160, 161, 0, 155, 163, 161, 164, 0,
+
+ 165, 167, 162, 158, 166, 0, 162, 166, 168, 173,
+ 167, 164, 165, 0, 169, 155, 156, 171, 163, 166,
+ 161, 156, 0, 163, 171, 164, 156, 165, 167, 0,
+ 168, 166, 156, 156, 166, 168, 169, 170, 172, 156,
+ 173, 169, 170, 156, 171, 174, 176, 175, 156, 172,
+ 179, 0, 177, 156, 0, 178, 170, 175, 180, 156,
+ 156, 178, 181, 170, 170, 172, 182, 183, 185, 170,
+ 177, 174, 174, 189, 184, 187, 190, 176, 175, 177,
+ 180, 179, 178, 170, 175, 180, 191, 183, 184, 185,
+ 190, 186, 189, 181, 183, 185, 187, 182, 186, 188,
+
+ 189, 184, 187, 190, 188, 192, 194, 193, 191, 197,
+ 195, 196, 196, 191, 193, 195, 198, 192, 186, 199,
+ 196, 200, 201, 198, 204, 205, 188, 202, 194, 206,
+ 203, 0, 192, 194, 193, 202, 0, 195, 196, 196,
+ 197, 200, 207, 198, 199, 203, 199, 205, 200, 209,
+ 204, 204, 211, 201, 202, 210, 205, 203, 208, 207,
+ 206, 212, 208, 210, 209, 214, 213, 207, 215, 207,
+ 217, 211, 216, 221, 205, 218, 209, 220, 0, 211,
+ 215, 216, 210, 217, 222, 208, 207, 219, 213, 219,
+ 224, 231, 212, 213, 218, 215, 214, 217, 221, 216,
+
+ 221, 220, 218, 225, 220, 229, 233, 226, 227, 228,
+ 222, 222, 232, 230, 219, 234, 224, 224, 226, 236,
+ 227, 235, 231, 0, 0, 232, 0, 242, 229, 225,
+ 225, 230, 229, 228, 226, 227, 228, 233, 237, 232,
+ 230, 234, 234, 235, 238, 237, 239, 240, 235, 241,
+ 236, 242, 239, 238, 242, 243, 244, 245, 246, 248,
+ 0, 240, 247, 0, 243, 237, 245, 246, 249, 0,
+ 251, 238, 250, 239, 240, 241, 241, 247, 251, 244,
+ 252, 251, 243, 244, 245, 246, 255, 250, 251, 247,
+ 248, 258, 249, 261, 253, 249, 254, 251, 252, 250,
+
+ 253, 255, 256, 256, 262, 251, 259, 252, 251, 259,
+ 254, 261, 260, 255, 263, 258, 259, 265, 258, 268,
+ 261, 253, 262, 254, 260, 264, 266, 256, 267, 256,
+ 256, 262, 270, 259, 268, 269, 259, 272, 266, 260,
+ 0, 263, 269, 265, 265, 0, 268, 264, 274, 271,
+ 267, 278, 264, 266, 276, 267, 271, 277, 273, 272,
+ 273, 274, 269, 270, 272, 0, 275, 280, 281, 275,
+ 0, 275, 276, 278, 280, 274, 271, 275, 278, 282,
+ 281, 276, 273, 279, 283, 273, 284, 273, 277, 286,
+ 0, 279, 282, 275, 280, 281, 275, 279, 275, 284,
+
+ 283, 286, 293, 287, 290, 288, 282, 291, 283, 288,
+ 279, 283, 290, 284, 0, 0, 286, 289, 279, 291,
+ 294, 287, 0, 289, 294, 292, 0, 283, 285, 285,
+ 287, 290, 292, 293, 291, 297, 288, 296, 285, 295,
+ 285, 285, 285, 299, 289, 285, 295, 294, 298, 296,
+ 302, 300, 292, 285, 303, 285, 285, 297, 300, 304,
+ 298, 301, 297, 302, 296, 285, 295, 285, 285, 285,
+ 304, 305, 285, 307, 299, 298, 301, 302, 300, 308,
+ 307, 309, 310, 0, 312, 303, 304, 311, 301, 315,
+ 308, 318, 309, 305, 313, 310, 314, 316, 305, 319,
+
+ 307, 317, 315, 321, 0, 314, 308, 312, 309, 310,
+ 316, 312, 311, 318, 311, 316, 315, 313, 318, 317,
+ 320, 313, 319, 314, 316, 322, 319, 323, 317, 325,
+ 324, 322, 326, 327, 321, 328, 330, 316, 320, 329,
+ 0, 331, 0, 333, 332, 351, 335, 320, 323, 328,
+ 332, 325, 322, 324, 323, 327, 325, 324, 326, 326,
+ 327, 333, 328, 334, 331, 329, 329, 330, 331, 335,
+ 333, 332, 336, 335, 337, 338, 351, 339, 334, 341,
+ 342, 338, 344, 0, 345, 348, 342, 348, 0, 343,
+ 334, 345, 355, 0, 348, 346, 337, 353, 336, 336,
+
+ 344, 337, 338, 339, 339, 341, 341, 342, 343, 344,
+ 346, 345, 348, 349, 348, 350, 343, 352, 354, 353,
+ 349, 356, 346, 355, 353, 0, 357, 358, 350, 360,
+ 0, 357, 359, 358, 0, 352, 361, 354, 362, 363,
+ 349, 360, 350, 356, 352, 354, 0, 363, 383, 362,
+ 365, 0, 356, 357, 358, 359, 360, 365, 361, 359,
+ 366, 367, 0, 361, 368, 362, 363, 369, 366, 383,
+ 356, 364, 367, 368, 370, 383, 364, 365, 364, 0,
+ 371, 370, 372, 0, 372, 373, 364, 366, 367, 364,
+ 374, 369, 376, 375, 369, 368, 364, 364, 364, 0,
+
+ 368, 370, 374, 364, 376, 364, 371, 371, 375, 372,
+ 377, 373, 373, 364, 379, 380, 364, 374, 377, 376,
+ 375, 378, 381, 364, 385, 386, 378, 382, 387, 0,
+ 381, 388, 389, 380, 390, 391, 379, 377, 393, 382,
+ 388, 379, 380, 387, 395, 392, 389, 385, 378, 381,
+ 394, 385, 396, 390, 382, 387, 386, 398, 388, 389,
+ 392, 390, 391, 397, 396, 394, 402, 399, 395, 393,
+ 399, 395, 392, 401, 403, 404, 400, 394, 399, 396,
+ 400, 398, 405, 406, 398, 397, 407, 401, 410, 408,
+ 397, 409, 412, 402, 399, 408, 410, 399, 411, 413,
+
+ 401, 403, 414, 416, 415, 417, 404, 400, 0, 405,
+ 406, 415, 425, 409, 421, 410, 408, 407, 409, 420,
+ 418, 411, 413, 412, 414, 411, 413, 417, 420, 414,
+ 419, 415, 417, 418, 416, 419, 422, 423, 424, 419,
+ 421, 421, 426, 425, 427, 422, 420, 418, 429, 0,
+ 428, 424, 430, 431, 419, 435, 432, 419, 0, 423,
+ 426, 436, 419, 422, 423, 424, 419, 431, 427, 426,
+ 429, 427, 428, 428, 430, 429, 433, 428, 432, 430,
+ 431, 434, 436, 432, 439, 437, 435, 433, 436, 438,
+ 442, 440, 441, 443, 444, 446, 434, 447, 0, 428,
+
+ 440, 447, 445, 433, 450, 441, 439, 0, 434, 437,
+ 448, 439, 437, 438, 0, 443, 438, 446, 440, 441,
+ 443, 442, 446, 452, 448, 444, 445, 449, 447, 445,
+ 451, 453, 454, 458, 455, 450, 454, 448, 452, 457,
+ 459, 449, 458, 456, 460, 462, 0, 452, 451, 459,
+ 452, 456, 460, 453, 449, 461, 463, 451, 453, 455,
+ 458, 455, 461, 454, 457, 452, 457, 459, 462, 464,
+ 456, 460, 462, 471, 463, 465, 467, 466, 468, 469,
+ 0, 464, 461, 463, 465, 466, 470, 469, 467, 472,
+ 475, 473, 474, 479, 470, 0, 464, 476, 0, 471,
+
+ 471, 475, 465, 467, 466, 476, 469, 473, 477, 468,
+ 478, 480, 472, 470, 474, 479, 472, 475, 473, 474,
+ 479, 481, 477, 482, 476, 483, 484, 486, 0, 485,
+ 478, 480, 490, 487, 483, 477, 488, 478, 480, 495,
+ 486, 489, 0, 481, 493, 482, 484, 485, 481, 492,
+ 482, 487, 483, 484, 486, 490, 485, 492, 488, 490,
+ 487, 491, 493, 488, 497, 489, 496, 491, 489, 499,
+ 495, 493, 500, 496, 498, 492, 492, 502, 499, 501,
+ 503, 0, 503, 506, 492, 516, 502, 497, 491, 498,
+ 509, 497, 513, 496, 0, 506, 499, 515, 501, 518,
+
+ 509, 498, 512, 500, 502, 514, 501, 503, 504, 519,
+ 506, 0, 504, 513, 521, 504, 516, 509, 519, 513,
+ 512, 518, 504, 515, 515, 504, 518, 0, 514, 512,
+ 504, 520, 514, 520, 522, 504, 519, 541, 521, 504,
+ 523, 521, 504, 0, 0, 0, 524, 0, 526, 504,
+ 525, 530, 504, 517, 517, 0, 517, 0, 520, 517,
+ 523, 522, 525, 527, 517, 528, 529, 523, 541, 0,
+ 517, 517, 524, 524, 526, 526, 530, 525, 530, 517,
+ 517, 517, 535, 517, 534, 527, 517, 531, 529, 528,
+ 527, 517, 528, 529, 532, 531, 533, 517, 517, 540,
+
+ 536, 532, 537, 534, 533, 542, 539, 538, 535, 535,
+ 0, 534, 536, 543, 531, 537, 538, 544, 0, 551,
+ 545, 532, 546, 533, 0, 554, 540, 536, 539, 537,
+ 548, 0, 552, 539, 538, 549, 542, 543, 544, 545,
+ 543, 546, 547, 557, 544, 550, 551, 545, 553, 546,
+ 552, 547, 548, 550, 561, 549, 554, 548, 555, 552,
+ 558, 557, 549, 560, 559, 562, 555, 553, 563, 547,
+ 557, 563, 550, 566, 564, 553, 560, 562, 558, 566,
+ 561, 561, 564, 567, 0, 555, 580, 558, 559, 569,
+ 560, 559, 562, 568, 572, 563, 569, 570, 564, 568,
+
+ 566, 564, 570, 573, 571, 567, 574, 576, 577, 564,
+ 567, 571, 572, 580, 575, 574, 569, 579, 583, 578,
+ 568, 572, 575, 577, 570, 576, 573, 582, 584, 581,
+ 573, 571, 578, 574, 576, 577, 581, 585, 579, 586,
+ 582, 575, 587, 588, 579, 589, 578, 586, 590, 583,
+ 591, 589, 592, 593, 582, 595, 581, 587, 597, 584,
+ 585, 596, 593, 594, 585, 588, 586, 599, 596, 587,
+ 588, 600, 589, 598, 590, 590, 592, 594, 601, 592,
+ 593, 591, 598, 600, 602, 597, 595, 607, 596, 604,
+ 594, 0, 602, 603, 599, 608, 603, 605, 600, 613,
+
+ 598, 601, 604, 609, 605, 601, 0, 610, 0, 610,
+ 614, 602, 611, 607, 607, 609, 604, 612, 608, 615,
+ 603, 613, 608, 614, 605, 606, 613, 606, 616, 612,
+ 609, 606, 615, 606, 610, 611, 617, 614, 606, 611,
+ 618, 621, 619, 606, 612, 624, 615, 621, 617, 606,
+ 618, 616, 606, 620, 606, 616, 625, 623, 606, 622,
+ 606, 0, 618, 617, 619, 606, 620, 618, 621, 619,
+ 606, 628, 622, 627, 630, 632, 624, 618, 623, 636,
+ 620, 631, 629, 625, 623, 639, 622, 626, 627, 630,
+ 634, 633, 626, 628, 626, 629, 635, 632, 628, 637,
+
+ 627, 630, 632, 634, 635, 626, 636, 631, 631, 629,
+ 633, 640, 626, 626, 626, 642, 639, 634, 633, 626,
+ 641, 626, 637, 635, 643, 645, 637, 644, 641, 642,
+ 646, 0, 626, 645, 647, 640, 649, 650, 640, 626,
+ 648, 655, 642, 651, 649, 647, 0, 641, 646, 644,
+ 651, 0, 645, 652, 644, 643, 654, 646, 648, 650,
+ 657, 647, 653, 649, 650, 659, 652, 648, 657, 653,
+ 651, 660, 655, 658, 654, 661, 663, 659, 664, 662,
+ 652, 665, 658, 654, 671, 0, 669, 657, 668, 653,
+ 669, 0, 659, 660, 663, 666, 676, 661, 660, 668,
+
+ 658, 662, 661, 663, 664, 664, 662, 670, 671, 666,
+ 670, 671, 665, 672, 673, 668, 674, 669, 675, 684,
+ 676, 673, 666, 676, 677, 675, 672, 678, 674, 681,
+ 677, 679, 0, 670, 670, 680, 682, 670, 678, 683,
+ 672, 673, 0, 674, 687, 675, 684, 682, 0, 685,
+ 681, 677, 686, 679, 678, 688, 681, 680, 679, 692,
+ 683, 686, 680, 682, 688, 689, 683, 685, 687, 691,
+ 690, 687, 693, 689, 697, 696, 685, 690, 694, 686,
+ 699, 700, 688, 691, 696, 701, 703, 698, 0, 0,
+ 692, 0, 689, 0, 693, 699, 691, 690, 697, 693,
+
+ 694, 697, 696, 698, 706, 694, 702, 699, 705, 704,
+ 709, 708, 700, 703, 698, 710, 701, 704, 702, 706,
+ 708, 705, 711, 710, 711, 717, 713, 715, 709, 716,
+ 718, 706, 717, 702, 713, 705, 704, 709, 708, 719,
+ 715, 716, 710, 0, 720, 721, 722, 723, 727, 711,
+ 0, 725, 717, 713, 715, 724, 716, 726, 730, 722,
+ 723, 718, 733, 725, 728, 726, 720, 721, 727, 0,
+ 719, 720, 721, 722, 723, 727, 728, 724, 725, 729,
+ 731, 732, 724, 733, 726, 730, 735, 729, 734, 733,
+ 732, 728, 736, 731, 739, 734, 737, 738, 742, 741,
+
+ 740, 0, 0, 743, 762, 0, 729, 731, 732, 740,
+ 738, 743, 735, 735, 736, 734, 737, 741, 739, 736,
+ 742, 739, 744, 737, 738, 742, 741, 740, 745, 747,
+ 743, 749, 748, 750, 751, 762, 745, 752, 753, 754,
+ 0, 750, 755, 749, 744, 756, 751, 754, 755, 744,
+ 748, 758, 747, 753, 756, 745, 747, 752, 749, 748,
+ 750, 751, 757, 758, 752, 753, 754, 759, 760, 755,
+ 765, 763, 756, 764, 759, 767, 768, 765, 758, 766,
+ 768, 0, 771, 757, 763, 769, 760, 773, 774, 757,
+ 767, 770, 764, 769, 759, 760, 772, 765, 763, 775,
+
+ 764, 766, 767, 777, 770, 773, 766, 768, 771, 771,
+ 772, 776, 769, 778, 773, 779, 780, 781, 770, 774,
+ 783, 777, 784, 772, 782, 775, 775, 785, 786, 783,
+ 777, 0, 0, 776, 780, 778, 787, 782, 776, 781,
+ 778, 779, 779, 780, 781, 791, 0, 783, 0, 796,
+ 786, 782, 789, 784, 793, 786, 794, 795, 785, 787,
+ 0, 791, 805, 787, 788, 807, 795, 796, 794, 788,
+ 797, 788, 791, 788, 797, 788, 796, 793, 789, 789,
+ 798, 793, 788, 794, 795, 800, 799, 802, 803, 805,
+ 801, 788, 807, 798, 799, 809, 788, 803, 788, 806,
+
+ 788, 797, 788, 801, 800, 802, 804, 798, 804, 810,
+ 811, 806, 800, 799, 802, 803, 812, 801, 811, 809,
+ 813, 814, 809, 815, 816, 817, 806, 813, 818, 0,
+ 816, 810, 819, 804, 820, 818, 810, 811, 821, 827,
+ 822, 824, 828, 812, 825, 815, 830, 813, 814, 823,
+ 815, 816, 817, 820, 819, 818, 829, 831, 823, 819,
+ 821, 820, 824, 833, 825, 821, 822, 822, 824, 834,
+ 827, 825, 832, 828, 835, 831, 823, 830, 829, 833,
+ 832, 835, 836, 829, 831, 838, 840, 837, 841, 836,
+ 833, 837, 839, 840, 843, 842, 834, 848, 839, 832,
+
+ 844, 835, 846, 841, 842, 839, 845, 844, 845, 836,
+ 847, 846, 850, 840, 837, 841, 838, 854, 856, 839,
+ 843, 843, 842, 852, 848, 839, 849, 844, 855, 846,
+ 849, 852, 847, 845, 850, 854, 853, 847, 857, 850,
+ 853, 858, 0, 856, 854, 856, 859, 855, 860, 861,
+ 852, 857, 863, 849, 865, 855, 864, 861, 862, 862,
+ 869, 863, 0, 865, 860, 857, 867, 853, 869, 859,
+ 866, 868, 858, 859, 872, 860, 861, 866, 864, 863,
+ 868, 865, 871, 864, 870, 862, 872, 869, 873, 867,
+ 875, 877, 879, 867, 874, 871, 876, 866, 868, 870,
+
+ 873, 872, 874, 881, 883, 878, 884, 885, 880, 871,
+ 879, 870, 875, 877, 878, 873, 876, 875, 877, 879,
+ 880, 874, 882, 876, 881, 886, 883, 887, 882, 889,
+ 881, 883, 878, 891, 890, 880, 892, 884, 885, 894,
+ 895, 896, 891, 897, 895, 896, 893, 894, 903, 882,
+ 897, 886, 886, 887, 887, 0, 889, 890, 892, 893,
+ 891, 890, 902, 892, 900, 900, 894, 898, 899, 901,
+ 897, 895, 896, 893, 904, 898, 899, 901, 905, 903,
+ 906, 909, 904, 902, 907, 908, 905, 909, 906, 902,
+ 910, 900, 907, 911, 898, 899, 901, 912, 908, 913,
+
+ 914, 904, 910, 915, 917, 905, 916, 906, 909, 919,
+ 918, 907, 908, 923, 913, 922, 925, 910, 917, 911,
+ 911, 912, 922, 919, 912, 915, 913, 914, 918, 916,
+ 915, 917, 928, 916, 920, 924, 919, 918, 920, 925,
+ 923, 926, 922, 925, 930, 927, 934, 932, 0, 933,
+ 926, 920, 927, 930, 936, 938, 939, 924, 943, 920,
+ 941, 920, 924, 928, 942, 920, 945, 939, 926, 932,
+ 943, 930, 927, 946, 932, 933, 933, 934, 920, 945,
+ 947, 936, 938, 939, 941, 943, 944, 941, 944, 948,
+ 942, 942, 947, 945, 949, 946, 950, 951, 952, 0,
+
+ 946, 949, 951, 953, 954, 955, 957, 947, 958, 0,
+ 960, 964, 954, 944, 952, 959, 948, 958, 961, 0,
+ 0, 949, 950, 950, 951, 952, 953, 955, 959, 964,
+ 953, 954, 955, 957, 962, 958, 960, 960, 964, 963,
+ 961, 962, 959, 965, 966, 961, 963, 969, 968, 970,
+ 965, 967, 0, 0, 969, 972, 973, 974, 0, 977,
+ 975, 962, 977, 978, 982, 974, 963, 0, 972, 966,
+ 965, 966, 983, 967, 969, 985, 979, 987, 967, 968,
+ 970, 975, 972, 973, 974, 980, 977, 975, 984, 978,
+ 978, 979, 980, 981, 983, 982, 981, 985, 986, 983,
+
+ 986, 987, 985, 979, 987, 988, 984, 989, 981, 0,
+ 990, 992, 980, 991, 993, 984, 995, 981, 992, 990,
+ 981, 991, 994, 981, 996, 986, 997, 998, 996, 1003,
+ 999, 1006, 1000, 989, 989, 981, 988, 990, 992, 1001,
+ 991, 1000, 1003, 1002, 994, 993, 1001, 995, 997, 994,
+ 1002, 996, 999, 997, 998, 1005, 1003, 999, 1004, 1000,
+ 1007, 1008, 1006, 1009, 1012, 1010, 1001, 1007, 1008, 1005,
+ 1002, 1010, 1013, 1004, 1014, 1015, 1009, 1021, 1016, 1021,
+ 1022, 1016, 1005, 1030, 1024, 1004, 1014, 1007, 1008, 1017,
+ 1009, 1012, 1010, 1023, 1013, 1015, 1016, 1026, 1019, 1013,
+
+ 1017, 1014, 1015, 1019, 1021, 1016, 1024, 1022, 1016, 1029,
+ 1019, 1024, 1025, 1027, 1030, 1026, 1017, 1023, 1031, 1028,
+ 1023, 1027, 1028, 1025, 1026, 1019, 1032, 1029, 1033, 1034,
+ 1019, 1035, 1036, 1032, 1041, 1037, 1029, 1028, 1034, 1025,
+ 1027, 1049, 1033, 1036, 1035, 1031, 1028, 0, 1040, 1028,
+ 1037, 1043, 1039, 1032, 1039, 1033, 1034, 1040, 1035, 1036,
+ 1041, 1041, 1037, 1042, 1044, 1052, 1045, 1046, 1047, 1043,
+ 1046, 0, 1049, 1050, 1042, 1040, 1051, 1047, 1043, 1039,
+ 1045, 1053, 1050, 1055, 0, 1046, 1044, 1065, 0, 0,
+ 1042, 1044, 1045, 1045, 1046, 1047, 1052, 1046, 1051, 1054,
+
+ 1050, 1056, 1053, 1051, 1060, 1057, 1054, 1045, 1053, 1062,
+ 1063, 1057, 1060, 1064, 1055, 1056, 1061, 1069, 1065, 1063,
+ 1071, 1064, 1066, 1062, 1069, 1067, 1054, 1070, 1056, 1057,
+ 1074, 1060, 1057, 1066, 1067, 1061, 1062, 1063, 1057, 1072,
+ 1064, 1073, 1071, 1061, 1069, 1078, 1077, 1071, 1074, 1066,
+ 1070, 1075, 1067, 1084, 1070, 1075, 1079, 1074, 1077, 1080,
+ 1081, 1072, 1082, 1073, 1087, 1085, 1072, 1086, 1073, 1079,
+ 1088, 1089, 1078, 1077, 1083, 1081, 1086, 1082, 1075, 1080,
+ 1085, 1090, 1083, 1079, 1084, 1087, 1080, 1081, 1092, 1082,
+ 1094, 1087, 1085, 1093, 1086, 1089, 1096, 1088, 1089, 1095,
+
+ 1099, 1083, 1100, 1097, 1098, 1104, 1102, 1105, 1090, 0,
+ 1092, 1093, 1099, 1102, 1095, 1092, 1103, 1094, 1096, 1098,
+ 1093, 1097, 1101, 1096, 1100, 1109, 1095, 1099, 1103, 1100,
+ 1097, 1098, 1104, 1102, 1108, 1101, 1106, 1107, 1105, 1110,
+ 1101, 1108, 1106, 1103, 1111, 1107, 1110, 1112, 1113, 1101,
+ 1114, 1115, 1109, 1112, 1116, 1118, 1119, 1120, 1121, 1124,
+ 1121, 1108, 1101, 1106, 1107, 1119, 1110, 1122, 0, 1123,
+ 1128, 1111, 1126, 1114, 1112, 1113, 1131, 1114, 1116, 1126,
+ 1127, 1116, 1115, 1119, 1133, 1121, 1118, 1127, 1120, 1131,
+ 1124, 1125, 1125, 1125, 1122, 1123, 1123, 1129, 1125, 1126,
+
+ 1135, 1128, 1132, 1131, 1129, 1136, 1125, 1127, 1132, 1134,
+ 1134, 1133, 1136, 1138, 1139, 1141, 1137, 1142, 1125, 1125,
+ 1125, 1137, 1143, 1152, 1129, 1125, 1135, 1135, 1144, 1132,
+ 1146, 1146, 1136, 1141, 1143, 1145, 1134, 1147, 1151, 1138,
+ 1138, 1139, 1141, 1137, 1142, 1148, 1148, 1149, 1144, 1143,
+ 1154, 1155, 1153, 1145, 1152, 1144, 1156, 1146, 1149, 1153,
+ 1151, 1157, 1145, 1147, 1147, 1151, 1159, 1158, 1160, 0,
+ 1154, 1162, 1148, 1161, 1149, 1160, 1164, 1154, 1163, 1153,
+ 1166, 1161, 1155, 1179, 1159, 1164, 1162, 1156, 1157, 1158,
+ 1165, 1165, 1167, 1159, 1158, 1160, 1169, 1170, 1162, 1173,
+
+ 1161, 1168, 1163, 1164, 1167, 1163, 1166, 1166, 1169, 1168,
+ 1171, 1172, 1175, 1180, 1179, 1182, 1174, 1165, 1178, 1167,
+ 1170, 1174, 1177, 1169, 1170, 1178, 1173, 1176, 1168, 1172,
+ 1181, 1171, 1174, 1176, 1181, 1177, 1184, 1171, 1172, 1175,
+ 1180, 1183, 1183, 1174, 1185, 1178, 1182, 1186, 1174, 1177,
+ 1187, 1184, 1188, 1189, 1176, 1189, 1190, 1192, 1195, 1191,
+ 0, 1181, 1186, 1184, 1191, 1196, 1193, 1188, 1183, 1197,
+ 1198, 1199, 1201, 1187, 1186, 1185, 1207, 1187, 1199, 1188,
+ 1189, 1193, 1195, 1200, 1202, 1195, 1191, 1190, 1192, 1203,
+ 1205, 1196, 1196, 1193, 1201, 1211, 1197, 1198, 1199, 1201,
+
+ 1207, 1213, 1212, 1207, 1200, 1202, 1208, 1203, 1210, 1212,
+ 1200, 1202, 1205, 1216, 1219, 1214, 1203, 1205, 1215, 1213,
+ 1218, 1208, 1211, 1210, 1214, 1217, 1215, 1219, 1213, 1212,
+ 1222, 0, 1221, 1208, 1226, 1210, 1216, 1223, 1224, 1222,
+ 1216, 1219, 1214, 1221, 1232, 1215, 0, 1217, 0, 1228,
+ 1230, 1218, 1217, 1231, 1235, 1223, 1224, 1222, 1221, 1221,
+ 1228, 1226, 1230, 1233, 1223, 1224, 1231, 1234, 1236, 1238,
+ 1221, 1239, 1243, 1233, 1240, 1232, 1228, 1230, 1239, 1235,
+ 1231, 1235, 1242, 0, 1241, 1246, 1246, 1243, 1242, 1238,
+ 1233, 1244, 1245, 1234, 1234, 1236, 1238, 1248, 1239, 1243,
+
+ 1240, 1240, 1241, 1247, 1248, 1251, 1244, 1245, 1252, 1242,
+ 1249, 1241, 1246, 1253, 1254, 1247, 0, 1249, 1244, 1245,
+ 1257, 1259, 1253, 1255, 1248, 1260, 1268, 1251, 1261, 1261,
+ 1247, 1262, 1251, 1252, 1259, 1252, 1254, 1249, 1257, 1263,
+ 1253, 1254, 1266, 1255, 1271, 1264, 1265, 1257, 1259, 1267,
+ 1255, 1266, 1260, 1262, 1279, 1261, 1267, 1268, 1262, 1269,
+ 1270, 1275, 1273, 1271, 1263, 1274, 1263, 1264, 1265, 1266,
+ 1273, 1271, 1264, 1265, 1270, 1276, 1267, 1278, 1274, 1277,
+ 0, 1269, 1281, 1280, 1278, 1279, 1269, 1270, 1275, 1273,
+ 1284, 1277, 1274, 1282, 1283, 1285, 1286, 1283, 1287, 0,
+
+ 0, 1276, 1276, 0, 1278, 1280, 1277, 1281, 1282, 1281,
+ 1280, 1289, 1283, 1287, 1286, 1284, 1292, 1284, 1290, 1293,
+ 1282, 1283, 1285, 1286, 1283, 1287, 1293, 1294, 1295, 1297,
+ 1292, 1299, 1300, 1289, 1303, 1301, 1294, 1301, 1289, 1295,
+ 1290, 1305, 1302, 1292, 1300, 1290, 1293, 1304, 1307, 1306,
+ 1297, 1308, 1299, 1309, 1294, 1295, 1297, 1306, 1299, 1300,
+ 1302, 1303, 1301, 1311, 1315, 1304, 1310, 1309, 1305, 1302,
+ 1310, 1307, 1312, 1308, 1304, 1307, 1306, 1316, 1308, 1312,
+ 1309, 1317, 1311, 1318, 1320, 1319, 1321, 0, 1323, 0,
+ 1311, 1315, 1322, 1320, 1325, 1316, 1325, 1310, 1326, 1312,
+
+ 1319, 1327, 1329, 1332, 1316, 1327, 1328, 1330, 1317, 1318,
+ 1318, 1320, 1319, 1333, 1322, 1323, 1330, 1321, 1328, 1322,
+ 1326, 1325, 1335, 1334, 1329, 1326, 1331, 1344, 1327, 1329,
+ 1332, 1336, 1336, 1328, 1330, 1334, 1333, 1331, 1337, 1339,
+ 1333, 1340, 1344, 1347, 1335, 1340, 1337, 1339, 1341, 1335,
+ 1334, 1341, 1342, 1331, 1344, 1343, 1345, 1348, 1336, 1349,
+ 1342, 1343, 1345, 1350, 1351, 1337, 1339, 1352, 1340, 1353,
+ 1347, 1354, 1357, 1349, 1356, 1341, 1350, 1355, 1351, 1342,
+ 1358, 1348, 1343, 1345, 1348, 1359, 1349, 1360, 1356, 1355,
+ 1350, 1351, 1361, 1352, 1352, 1360, 1353, 1362, 1354, 1357,
+
+ 1363, 1356, 1364, 1365, 1355, 1368, 1362, 1358, 1369, 1367,
+ 1370, 1365, 1359, 1371, 1360, 1373, 1369, 1372, 1375, 1361,
+ 1376, 1377, 1371, 1379, 1362, 0, 1374, 1363, 1376, 1364,
+ 1365, 1367, 1368, 1377, 1383, 1369, 1367, 1370, 1372, 1373,
+ 1371, 1374, 1373, 1378, 1372, 1375, 1383, 1376, 1377, 1381,
+ 1379, 1378, 1374, 1374, 1382, 1384, 1381, 1385, 1382, 1386,
+ 1387, 1383, 1388, 1388, 1389, 1390, 0, 1386, 1374, 1396,
+ 1378, 1393, 1394, 1392, 1394, 1396, 1381, 1403, 1384, 1397,
+ 1395, 1382, 1384, 1390, 1385, 1399, 1386, 1387, 1392, 1388,
+ 1389, 1389, 1390, 1393, 1395, 1398, 1396, 1399, 1393, 1394,
+
+ 1392, 1397, 1400, 1401, 1404, 1402, 1397, 1395, 1403, 1406,
+ 1408, 1410, 1399, 1409, 0, 0, 1406, 1398, 1402, 1417,
+ 1400, 1401, 1398, 1414, 0, 1411, 1415, 1404, 1408, 1400,
+ 1401, 1404, 1402, 1411, 1417, 1414, 1406, 1408, 1419, 1409,
+ 1409, 1412, 1410, 1412, 1415, 1420, 1417, 1421, 1412, 1422,
+ 1414, 1411, 1411, 1415, 1421, 1423, 1425, 1433, 1426, 1435,
+ 1411, 1427, 1419, 1428, 1422, 1419, 1429, 1420, 1412, 1430,
+ 1412, 1426, 1420, 1431, 1421, 1436, 1422, 1430, 1428, 1429,
+ 1433, 1434, 1423, 1425, 1433, 1426, 1435, 1427, 1427, 1443,
+ 1428, 1437, 1440, 1429, 1438, 1442, 1430, 1436, 1437, 1431,
+
+ 1431, 1438, 1436, 1439, 1441, 1434, 1444, 1447, 1434, 1448,
+ 1450, 1441, 1446, 1468, 1458, 1440, 1439, 1442, 1437, 1440,
+ 1443, 1438, 1442, 1446, 1449, 1453, 1463, 1444, 1454, 1447,
+ 1439, 1441, 1464, 1444, 1447, 1450, 1460, 1450, 1453, 1446,
+ 1448, 1458, 1466, 1449, 1468, 1460, 1469, 1470, 1463, 1472,
+ 1476, 1449, 1453, 1463, 1454, 1454, 1471, 1474, 1470, 1464,
+ 1475, 1471, 1478, 1460, 1479, 1474, 1481, 1483, 0, 1466,
+ 1480, 1472, 1469, 1469, 1470, 1475, 1472, 1476, 1481, 1480,
+ 1478, 1485, 1486, 1471, 1474, 1487, 1489, 1475, 1488, 1478,
+ 1490, 1491, 1493, 1481, 1483, 1479, 1492, 1480, 1487, 1494,
+
+ 1498, 1493, 0, 1485, 0, 1495, 1496, 1486, 1485, 1486,
+ 1488, 1492, 1487, 1489, 1497, 1488, 1500, 1490, 1491, 1493,
+ 1495, 1496, 1498, 1492, 1499, 1494, 1494, 1498, 1501, 1497,
+ 1503, 1499, 1495, 1496, 1502, 1502, 1504, 1503, 1507, 1505,
+ 1506, 1497, 1505, 1500, 1508, 1509, 1501, 1510, 1511, 1513,
+ 1504, 1499, 1510, 1506, 1509, 1501, 1512, 1503, 1514, 0,
+ 1515, 1502, 1508, 1504, 1507, 1507, 1505, 1506, 1519, 1527,
+ 1511, 1508, 1509, 1518, 1510, 1511, 1513, 1519, 1512, 1520,
+ 1518, 1521, 1524, 1512, 1520, 1514, 1515, 1515, 1521, 1522,
+ 1523, 1524, 1525, 1528, 1529, 1519, 1527, 1523, 1531, 1536,
+
+ 1518, 1534, 1530, 1529, 1532, 1533, 1520, 1522, 1521, 1524,
+ 1531, 1528, 1534, 1532, 1533, 1535, 1522, 1523, 1525, 1525,
+ 1528, 1529, 1530, 1535, 1537, 1531, 1536, 1538, 1534, 1530,
+ 1540, 1532, 1533, 1539, 1541, 1544, 1538, 1542, 1540, 1545,
+ 0, 1548, 1535, 1549, 1542, 1539, 1550, 1545, 1548, 1552,
+ 1553, 1551, 1554, 1544, 1538, 1537, 1541, 1540, 1552, 1556,
+ 1539, 1541, 1544, 1551, 1542, 1557, 1545, 1549, 1548, 1558,
+ 1549, 1556, 1561, 1550, 1562, 1554, 1552, 1553, 1551, 1554,
+ 1559, 1563, 1562, 1564, 0, 1568, 1556, 1571, 1557, 1570,
+ 1569, 1572, 1557, 1573, 1559, 1569, 1558, 1577, 1574, 1561,
+
+ 1575, 1562, 1581, 1570, 1578, 1571, 1574, 1559, 1563, 1577,
+ 1564, 1568, 1568, 1572, 1571, 1573, 1570, 1569, 1572, 1575,
+ 1573, 1579, 1580, 1582, 1577, 1574, 1578, 1575, 0, 1581,
+ 1585, 1578, 1583, 1584, 1580, 1586, 1587, 1588, 1592, 1591,
+ 0, 0, 0, 1579, 1593, 0, 1594, 1595, 1579, 1580,
+ 1582, 1642, 1583, 1591, 1598, 1584, 1597, 1586, 1596, 1583,
+ 1584, 1585, 1586, 1587, 1588, 1595, 1591, 1593, 1594, 1592,
+ 1596, 1593, 1599, 1594, 1595, 1597, 1598, 1601, 1602, 1603,
+ 1604, 1598, 1642, 1597, 1605, 1596, 1607, 1599, 1603, 1610,
+ 1606, 1608, 1613, 0, 1604, 0, 1611, 1610, 1616, 1599,
+
+ 1602, 1601, 1605, 1611, 1601, 1602, 1603, 1604, 1606, 1608,
+ 1617, 1605, 1607, 1607, 1612, 1615, 1610, 1606, 1608, 1613,
+ 1614, 1616, 1612, 1611, 1618, 1616, 1619, 1621, 1614, 1624,
+ 1622, 0, 1628, 1615, 1626, 1630, 1625, 1617, 1634, 1635,
+ 0, 1612, 1615, 1618, 1622, 1621, 1626, 1614, 1619, 1625,
+ 1636, 1618, 1624, 1619, 1621, 1637, 1624, 1622, 1628, 1628,
+ 1633, 1626, 1630, 1625, 1634, 1634, 1635, 1633, 1638, 1639,
+ 1640, 1641, 1643, 1649, 1636, 1650, 1647, 1636, 1644, 1640,
+ 1647, 1648, 1637, 0, 1641, 1648, 1659, 1633, 1653, 1655,
+ 0, 1658, 1654, 1654, 1649, 1638, 1639, 1640, 1641, 1643,
+
+ 1649, 1644, 1654, 1656, 1658, 1644, 1650, 1647, 1648, 1660,
+ 1653, 1655, 1656, 1659, 1657, 1653, 1655, 1660, 1658, 1654,
+ 1654, 1657, 1663, 1661, 1662, 0, 1664, 0, 1665, 1666,
+ 1656, 1668, 1662, 1669, 1669, 1667, 1660, 1671, 1668, 1672,
+ 1666, 1657, 1661, 1670, 1671, 1674, 1672, 1675, 1663, 1663,
+ 1661, 1662, 1664, 1664, 1665, 1665, 1666, 1667, 1668, 1676,
+ 1669, 1670, 1667, 1679, 1671, 1680, 1672, 1678, 1682, 1681,
+ 1670, 1675, 1674, 1683, 1675, 1684, 1678, 1683, 1688, 1685,
+ 1682, 1676, 1687, 1690, 1704, 1690, 1676, 1681, 1680, 1684,
+ 1679, 1694, 1680, 1688, 1678, 1682, 1681, 1685, 1695, 1696,
+
+ 1687, 1698, 1684, 1701, 1683, 1688, 1685, 0, 1699, 1687,
+ 1690, 1699, 1703, 1694, 1702, 1704, 1705, 1696, 1694, 1703,
+ 1706, 1708, 1705, 1698, 1695, 1695, 1696, 1707, 1698, 1709,
+ 1701, 1709, 1702, 1710, 1699, 1699, 1707, 1712, 1699, 1703,
+ 1714, 1702, 1706, 1705, 1718, 1712, 1713, 1706, 1715, 1716,
+ 1717, 1719, 1708, 0, 1707, 1718, 1709, 1721, 1713, 1719,
+ 1710, 1720, 1715, 1723, 1712, 1722, 1722, 1714, 1717, 1726,
+ 1727, 1718, 1716, 1713, 1724, 1715, 1716, 1717, 1719, 1721,
+ 1720, 1728, 1724, 1730, 1721, 1732, 1731, 1733, 1720, 1732,
+ 1723, 1735, 1722, 1731, 1736, 1733, 1726, 1727, 1738, 1737,
+
+ 1739, 1724, 1742, 1728, 1737, 1741, 1743, 1736, 1728, 1742,
+ 1730, 1740, 1732, 1731, 1733, 1744, 1747, 1735, 1735, 1740,
+ 1741, 1736, 1745, 1748, 1750, 1738, 1737, 1739, 1749, 1742,
+ 1748, 1747, 1741, 1743, 1752, 1754, 1751, 1756, 1740, 1744,
+ 1759, 1761, 1744, 1747, 1751, 1757, 1750, 1760, 1745, 1745,
+ 1748, 1750, 1749, 1757, 1761, 1749, 1753, 1753, 1762, 1763,
+ 1764, 1765, 1754, 1751, 1756, 1752, 1753, 1759, 1761, 1760,
+ 1766, 1768, 1757, 1771, 1760, 1773, 1774, 1776, 1777, 1782,
+ 1762, 0, 0, 1753, 1753, 1762, 1763, 1764, 1765, 1774,
+ 1778, 1781, 1766, 1783, 1775, 1776, 1788, 1766, 1768, 1771,
+
+ 1771, 1775, 1773, 1774, 1776, 1777, 1782, 1785, 1787, 1786,
+ 1781, 1788, 1778, 1789, 1785, 1783, 1786, 1778, 1781, 1790,
+ 1783, 1775, 1791, 1788, 1799, 1793, 1794, 1800, 1790, 1805,
+ 1787, 1793, 1789, 1791, 1785, 1787, 1786, 1792, 1792, 1801,
+ 1789, 1809, 0, 1797, 1807, 1811, 1790, 1792, 1794, 1791,
+ 1797, 1799, 1793, 1794, 1800, 1813, 1805, 1817, 1811, 1818,
+ 1810, 1814, 1801, 1819, 1792, 1792, 1801, 1807, 1809, 1810,
+ 1797, 1807, 1811, 1814, 1816, 1817, 1820, 1821, 1822, 1823,
+ 1822, 1828, 1813, 1816, 1817, 1818, 1818, 1810, 1814, 1824,
+ 1819, 1823, 1825, 1826, 1827, 1824, 1831, 1833, 1836, 1821,
+
+ 1835, 1816, 1827, 1820, 1821, 1822, 1823, 1838, 1828, 1839,
+ 1841, 1845, 0, 0, 1825, 1826, 1824, 1840, 1835, 1825,
+ 1826, 1827, 1838, 1831, 1833, 1836, 1844, 1835, 1846, 1840,
+ 1847, 1848, 1850, 1856, 1838, 1839, 1839, 1841, 1849, 1848,
+ 1854, 1846, 1845, 1850, 1840, 0, 0, 1849, 1868, 1858,
+ 1844, 0, 1847, 1844, 1857, 1846, 1856, 1847, 1848, 1850,
+ 1856, 1857, 1858, 1860, 1854, 1849, 1861, 1854, 1865, 1862,
+ 1865, 1867, 1864, 1863, 1866, 1868, 1858, 1862, 1867, 1860,
+ 1861, 1857, 1863, 1864, 1869, 1870, 1866, 1871, 1872, 1876,
+ 1860, 1873, 1874, 1861, 1874, 1865, 1862, 1875, 1867, 1864,
+
+ 1863, 1866, 1869, 1877, 1878, 1880, 1884, 1885, 0, 1875,
+ 1872, 1869, 1870, 1873, 1871, 1872, 1877, 1880, 1873, 1874,
+ 1876, 1883, 1886, 1890, 1875, 1887, 1888, 0, 1892, 1883,
+ 1877, 1878, 1880, 1891, 1888, 1886, 1890, 1884, 1885, 1887,
+ 1893, 1891, 1892, 1894, 1895, 1903, 1896, 1899, 1883, 1886,
+ 1890, 1894, 1887, 1888, 1893, 1892, 1897, 0, 1898, 1900,
+ 1891, 1904, 1905, 1908, 1897, 1901, 1895, 1893, 1896, 1899,
+ 1894, 1895, 1902, 1896, 1899, 1912, 1903, 1910, 0, 1924,
+ 1902, 1900, 1905, 1897, 1898, 1898, 1900, 1901, 1904, 1905,
+ 1906, 1910, 1901, 1907, 1908, 1909, 1915, 1912, 1906, 1902,
+
+ 1913, 1907, 1912, 1909, 1910, 1914, 1924, 1916, 1913, 1917,
+ 1915, 1918, 0, 1914, 1919, 0, 1920, 1906, 0, 1918,
+ 1907, 1923, 1909, 1915, 1921, 1922, 0, 1913, 0, 1923,
+ 1925, 1917, 1914, 1916, 1916, 1926, 1917, 1928, 1918, 1927,
+ 1919, 1919, 1920, 1920, 0, 1922, 1921, 1927, 1923, 1931,
+ 1925, 1921, 1922, 1929, 1939, 1926, 1932, 1925, 1935, 1928,
+ 1933, 1929, 1926, 1938, 1928, 1934, 1927, 1936, 1933, 1937,
+ 1941, 1931, 0, 1934, 1942, 1936, 1931, 1937, 1932, 1940,
+ 1929, 1939, 1943, 1932, 1935, 1935, 1945, 1933, 1948, 1938,
+ 1938, 1951, 1934, 1952, 1936, 1949, 1937, 1941, 0, 1940,
+
+ 0, 1942, 1943, 1949, 1950, 0, 1940, 0, 1945, 1943,
+ 1948, 0, 1950, 1945, 0, 1948, 0, 0, 1951, 0,
+ 1952, 0, 1949, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1950, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1957,
+ 1957, 1957, 1957, 1957, 1957, 1957, 1958, 1958, 1958, 1958,
+ 1958, 1958, 1958, 1959, 1959, 1959, 1959, 1959, 1959, 1959,
+ 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1962, 1962, 0,
+ 1962, 1962, 1962, 1962, 1963, 1963, 0, 0, 0, 1963,
+ 1963, 1964, 1964, 0, 0, 1964, 0, 1964, 1965, 0,
+ 0, 0, 0, 0, 1965, 1966, 1966, 0, 0, 0,
+
+ 1966, 1966, 1967, 0, 0, 0, 0, 0, 1967, 1968,
+ 1968, 0, 1968, 1968, 1968, 1968, 1969, 1969, 0, 1969,
+ 1969, 1969, 1969, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955,
+ 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955
} ;
static yy_state_type yy_last_accepting_state;
@@ -2308,7 +2375,9 @@ char *yytext;
*/
/* because flex keeps having sign-unsigned compare problems that are unfixed*/
+#if defined(__clang__)||(defined(__GNUC__)&&((__GNUC__ >4)||(defined(__GNUC_MINOR__)&&(__GNUC__ ==4)&&(__GNUC_MINOR__ >=2))))
#pragma GCC diagnostic ignored "-Wsign-compare"
+#endif
#include <ctype.h>
#include <string.h>
@@ -2478,7 +2547,7 @@ static void config_end_include(void)
#endif
#define YY_NO_INPUT 1
-#line 185 "util/configlexer.lex"
+#line 187 "util/configlexer.lex"
#ifndef YY_NO_UNPUT
#define YY_NO_UNPUT 1
#endif
@@ -2486,7 +2555,7 @@ static void config_end_include(void)
#define YY_NO_INPUT 1
#endif
-#line 2488 "<stdout>"
+#line 2557 "<stdout>"
#define INITIAL 0
#define quotedstring 1
@@ -2707,9 +2776,9 @@ YY_DECL
}
{
-#line 205 "util/configlexer.lex"
+#line 207 "util/configlexer.lex"
-#line 2711 "<stdout>"
+#line 2780 "<stdout>"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -2742,13 +2811,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 >= 1880 )
+ if ( yy_current_state >= 1956 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 5425 );
+ while ( yy_base[yy_current_state] != 5624 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -2774,884 +2843,929 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
YY_RULE_SETUP
-#line 206 "util/configlexer.lex"
+#line 208 "util/configlexer.lex"
{
LEXOUT(("SP ")); /* ignore */ }
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 208 "util/configlexer.lex"
+#line 210 "util/configlexer.lex"
{
/* note that flex makes the longest match and '.' is any but not nl */
LEXOUT(("comment(%s) ", yytext)); /* ignore */ }
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 211 "util/configlexer.lex"
+#line 213 "util/configlexer.lex"
{ YDVAR(0, VAR_SERVER) }
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 212 "util/configlexer.lex"
+#line 214 "util/configlexer.lex"
{ YDVAR(1, VAR_QNAME_MINIMISATION) }
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 213 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_THREADS) }
+#line 215 "util/configlexer.lex"
+{ YDVAR(1, VAR_QNAME_MINIMISATION_STRICT) }
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 214 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERBOSITY) }
+#line 216 "util/configlexer.lex"
+{ YDVAR(1, VAR_NUM_THREADS) }
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 215 "util/configlexer.lex"
-{ YDVAR(1, VAR_PORT) }
+#line 217 "util/configlexer.lex"
+{ YDVAR(1, VAR_VERBOSITY) }
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 216 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_RANGE) }
+#line 218 "util/configlexer.lex"
+{ YDVAR(1, VAR_PORT) }
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 217 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_PORT_PERMIT) }
+#line 219 "util/configlexer.lex"
+{ YDVAR(1, VAR_OUTGOING_RANGE) }
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 218 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_PORT_AVOID) }
+#line 220 "util/configlexer.lex"
+{ YDVAR(1, VAR_OUTGOING_PORT_PERMIT) }
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 219 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_NUM_TCP) }
+#line 221 "util/configlexer.lex"
+{ YDVAR(1, VAR_OUTGOING_PORT_AVOID) }
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 220 "util/configlexer.lex"
-{ YDVAR(1, VAR_INCOMING_NUM_TCP) }
+#line 222 "util/configlexer.lex"
+{ YDVAR(1, VAR_OUTGOING_NUM_TCP) }
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 221 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_IP4) }
+#line 223 "util/configlexer.lex"
+{ YDVAR(1, VAR_INCOMING_NUM_TCP) }
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 222 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_IP6) }
+#line 224 "util/configlexer.lex"
+{ YDVAR(1, VAR_DO_IP4) }
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 223 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFER_IP6) }
+#line 225 "util/configlexer.lex"
+{ YDVAR(1, VAR_DO_IP6) }
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 224 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_UDP) }
+#line 226 "util/configlexer.lex"
+{ YDVAR(1, VAR_PREFER_IP6) }
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 225 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_TCP) }
+#line 227 "util/configlexer.lex"
+{ YDVAR(1, VAR_DO_UDP) }
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 226 "util/configlexer.lex"
-{ YDVAR(1, VAR_TCP_UPSTREAM) }
+#line 228 "util/configlexer.lex"
+{ YDVAR(1, VAR_DO_TCP) }
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 227 "util/configlexer.lex"
-{ YDVAR(1, VAR_TCP_MSS) }
+#line 229 "util/configlexer.lex"
+{ YDVAR(1, VAR_TCP_UPSTREAM) }
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 228 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_TCP_MSS) }
+#line 230 "util/configlexer.lex"
+{ YDVAR(1, VAR_TCP_MSS) }
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 229 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_UPSTREAM) }
+#line 231 "util/configlexer.lex"
+{ YDVAR(1, VAR_OUTGOING_TCP_MSS) }
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 230 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
+#line 232 "util/configlexer.lex"
+{ YDVAR(1, VAR_SSL_UPSTREAM) }
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 231 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
+#line 233 "util/configlexer.lex"
+{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 232 "util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_PORT) }
+#line 234 "util/configlexer.lex"
+{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 233 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_DAEMONIZE) }
+#line 235 "util/configlexer.lex"
+{ YDVAR(1, VAR_SSL_PORT) }
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 234 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+#line 236 "util/configlexer.lex"
+{ YDVAR(1, VAR_DO_DAEMONIZE) }
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 235 "util/configlexer.lex"
+#line 237 "util/configlexer.lex"
{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 236 "util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
+#line 238 "util/configlexer.lex"
+{ YDVAR(1, VAR_INTERFACE) }
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 237 "util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
+#line 239 "util/configlexer.lex"
+{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 238 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_RCVBUF) }
+#line 240 "util/configlexer.lex"
+{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 239 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_SNDBUF) }
+#line 241 "util/configlexer.lex"
+{ YDVAR(1, VAR_SO_RCVBUF) }
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 240 "util/configlexer.lex"
-{ YDVAR(1, VAR_SO_REUSEPORT) }
+#line 242 "util/configlexer.lex"
+{ YDVAR(1, VAR_SO_SNDBUF) }
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 241 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_TRANSPARENT) }
+#line 243 "util/configlexer.lex"
+{ YDVAR(1, VAR_SO_REUSEPORT) }
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 242 "util/configlexer.lex"
-{ YDVAR(1, VAR_IP_FREEBIND) }
+#line 244 "util/configlexer.lex"
+{ YDVAR(1, VAR_IP_TRANSPARENT) }
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 243 "util/configlexer.lex"
-{ YDVAR(1, VAR_CHROOT) }
+#line 245 "util/configlexer.lex"
+{ YDVAR(1, VAR_IP_FREEBIND) }
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 244 "util/configlexer.lex"
-{ YDVAR(1, VAR_USERNAME) }
+#line 246 "util/configlexer.lex"
+{ YDVAR(1, VAR_CHROOT) }
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 245 "util/configlexer.lex"
-{ YDVAR(1, VAR_DIRECTORY) }
+#line 247 "util/configlexer.lex"
+{ YDVAR(1, VAR_USERNAME) }
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 246 "util/configlexer.lex"
-{ YDVAR(1, VAR_LOGFILE) }
+#line 248 "util/configlexer.lex"
+{ YDVAR(1, VAR_DIRECTORY) }
YY_BREAK
case 39:
YY_RULE_SETUP
-#line 247 "util/configlexer.lex"
-{ YDVAR(1, VAR_PIDFILE) }
+#line 249 "util/configlexer.lex"
+{ YDVAR(1, VAR_LOGFILE) }
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 248 "util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_HINTS) }
+#line 250 "util/configlexer.lex"
+{ YDVAR(1, VAR_PIDFILE) }
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 249 "util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
+#line 251 "util/configlexer.lex"
+{ YDVAR(1, VAR_ROOT_HINTS) }
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 250 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
+#line 252 "util/configlexer.lex"
+{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 251 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
+#line 253 "util/configlexer.lex"
+{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
YY_BREAK
case 44:
YY_RULE_SETUP
-#line 252 "util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
+#line 254 "util/configlexer.lex"
+{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
YY_BREAK
case 45:
YY_RULE_SETUP
-#line 253 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
+#line 255 "util/configlexer.lex"
+{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 254 "util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
+#line 256 "util/configlexer.lex"
+{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
YY_BREAK
case 47:
YY_RULE_SETUP
-#line 255 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_TTL) }
+#line 257 "util/configlexer.lex"
+{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 256 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
+#line 258 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHE_MAX_TTL) }
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 257 "util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_TTL) }
+#line 259 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
YY_BREAK
case 50:
YY_RULE_SETUP
-#line 258 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_HOST_TTL) }
+#line 260 "util/configlexer.lex"
+{ YDVAR(1, VAR_CACHE_MIN_TTL) }
YY_BREAK
case 51:
YY_RULE_SETUP
-#line 259 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_LAME_TTL) }
+#line 261 "util/configlexer.lex"
+{ YDVAR(1, VAR_INFRA_HOST_TTL) }
YY_BREAK
case 52:
YY_RULE_SETUP
-#line 260 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
+#line 262 "util/configlexer.lex"
+{ YDVAR(1, VAR_INFRA_LAME_TTL) }
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 261 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
+#line 263 "util/configlexer.lex"
+{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
YY_BREAK
case 54:
YY_RULE_SETUP
-#line 262 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
+#line 264 "util/configlexer.lex"
+{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
YY_BREAK
case 55:
YY_RULE_SETUP
-#line 263 "util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
+#line 265 "util/configlexer.lex"
+{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
YY_BREAK
case 56:
YY_RULE_SETUP
-#line 264 "util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
+#line 266 "util/configlexer.lex"
+{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
YY_BREAK
case 57:
YY_RULE_SETUP
-#line 265 "util/configlexer.lex"
-{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
+#line 267 "util/configlexer.lex"
+{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
YY_BREAK
case 58:
YY_RULE_SETUP
-#line 266 "util/configlexer.lex"
-{ YDVAR(1, VAR_DELAY_CLOSE) }
+#line 268 "util/configlexer.lex"
+{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
YY_BREAK
case 59:
YY_RULE_SETUP
-#line 267 "util/configlexer.lex"
-{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
+#line 269 "util/configlexer.lex"
+{ YDVAR(1, VAR_DELAY_CLOSE) }
YY_BREAK
case 60:
YY_RULE_SETUP
-#line 268 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
+#line 270 "util/configlexer.lex"
+{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
YY_BREAK
case 61:
YY_RULE_SETUP
-#line 269 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
+#line 271 "util/configlexer.lex"
+{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
YY_BREAK
case 62:
YY_RULE_SETUP
-#line 270 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_GLUE) }
+#line 272 "util/configlexer.lex"
+{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
YY_BREAK
case 63:
YY_RULE_SETUP
-#line 271 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
+#line 273 "util/configlexer.lex"
+{ YDVAR(1, VAR_HARDEN_GLUE) }
YY_BREAK
case 64:
YY_RULE_SETUP
-#line 272 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
+#line 274 "util/configlexer.lex"
+{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
YY_BREAK
case 65:
YY_RULE_SETUP
-#line 273 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
+#line 275 "util/configlexer.lex"
+{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
YY_BREAK
case 66:
YY_RULE_SETUP
-#line 274 "util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
+#line 276 "util/configlexer.lex"
+{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
YY_BREAK
case 67:
YY_RULE_SETUP
-#line 275 "util/configlexer.lex"
-{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
+#line 277 "util/configlexer.lex"
+{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
YY_BREAK
case 68:
YY_RULE_SETUP
-#line 276 "util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+#line 278 "util/configlexer.lex"
+{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
YY_BREAK
case 69:
YY_RULE_SETUP
-#line 277 "util/configlexer.lex"
-{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
+#line 279 "util/configlexer.lex"
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
YY_BREAK
case 70:
YY_RULE_SETUP
-#line 278 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
+#line 280 "util/configlexer.lex"
+{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
YY_BREAK
case 71:
YY_RULE_SETUP
-#line 279 "util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
+#line 281 "util/configlexer.lex"
+{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
YY_BREAK
case 72:
YY_RULE_SETUP
-#line 280 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH_KEY) }
+#line 282 "util/configlexer.lex"
+{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
YY_BREAK
case 73:
YY_RULE_SETUP
-#line 281 "util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH) }
+#line 283 "util/configlexer.lex"
+{ YDVAR(1, VAR_PREFETCH_KEY) }
YY_BREAK
case 74:
YY_RULE_SETUP
-#line 282 "util/configlexer.lex"
-{ YDVAR(0, VAR_STUB_ZONE) }
+#line 284 "util/configlexer.lex"
+{ YDVAR(1, VAR_PREFETCH) }
YY_BREAK
case 75:
YY_RULE_SETUP
-#line 283 "util/configlexer.lex"
-{ YDVAR(1, VAR_NAME) }
+#line 285 "util/configlexer.lex"
+{ YDVAR(0, VAR_STUB_ZONE) }
YY_BREAK
case 76:
YY_RULE_SETUP
-#line 284 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_ADDR) }
+#line 286 "util/configlexer.lex"
+{ YDVAR(1, VAR_NAME) }
YY_BREAK
case 77:
YY_RULE_SETUP
-#line 285 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_HOST) }
+#line 287 "util/configlexer.lex"
+{ YDVAR(1, VAR_STUB_ADDR) }
YY_BREAK
case 78:
YY_RULE_SETUP
-#line 286 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_PRIME) }
+#line 288 "util/configlexer.lex"
+{ YDVAR(1, VAR_STUB_HOST) }
YY_BREAK
case 79:
YY_RULE_SETUP
-#line 287 "util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_FIRST) }
+#line 289 "util/configlexer.lex"
+{ YDVAR(1, VAR_STUB_PRIME) }
YY_BREAK
case 80:
YY_RULE_SETUP
-#line 288 "util/configlexer.lex"
-{ YDVAR(0, VAR_FORWARD_ZONE) }
+#line 290 "util/configlexer.lex"
+{ YDVAR(1, VAR_STUB_FIRST) }
YY_BREAK
case 81:
YY_RULE_SETUP
-#line 289 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_ADDR) }
+#line 291 "util/configlexer.lex"
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
YY_BREAK
case 82:
YY_RULE_SETUP
-#line 290 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_HOST) }
+#line 292 "util/configlexer.lex"
+{ YDVAR(0, VAR_FORWARD_ZONE) }
YY_BREAK
case 83:
YY_RULE_SETUP
-#line 291 "util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_FIRST) }
+#line 293 "util/configlexer.lex"
+{ YDVAR(1, VAR_FORWARD_ADDR) }
YY_BREAK
case 84:
YY_RULE_SETUP
-#line 292 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
+#line 294 "util/configlexer.lex"
+{ YDVAR(1, VAR_FORWARD_HOST) }
YY_BREAK
case 85:
YY_RULE_SETUP
-#line 293 "util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
+#line 295 "util/configlexer.lex"
+{ YDVAR(1, VAR_FORWARD_FIRST) }
YY_BREAK
case 86:
YY_RULE_SETUP
-#line 294 "util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL) }
+#line 296 "util/configlexer.lex"
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
YY_BREAK
case 87:
YY_RULE_SETUP
-#line 295 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
+#line 297 "util/configlexer.lex"
+{ YDVAR(0, VAR_VIEW) }
YY_BREAK
case 88:
YY_RULE_SETUP
-#line 296 "util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
+#line 298 "util/configlexer.lex"
+{ YDVAR(1, VAR_VIEW_FIRST) }
YY_BREAK
case 89:
YY_RULE_SETUP
-#line 297 "util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
+#line 299 "util/configlexer.lex"
+{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
YY_BREAK
case 90:
YY_RULE_SETUP
-#line 298 "util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
+#line 300 "util/configlexer.lex"
+{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
YY_BREAK
case 91:
YY_RULE_SETUP
-#line 299 "util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
+#line 301 "util/configlexer.lex"
+{ YDVAR(2, VAR_ACCESS_CONTROL) }
YY_BREAK
case 92:
YY_RULE_SETUP
-#line 300 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
+#line 302 "util/configlexer.lex"
+{ YDVAR(1, VAR_HIDE_IDENTITY) }
YY_BREAK
case 93:
YY_RULE_SETUP
-#line 301 "util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
+#line 303 "util/configlexer.lex"
+{ YDVAR(1, VAR_HIDE_VERSION) }
YY_BREAK
case 94:
YY_RULE_SETUP
-#line 302 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
+#line 304 "util/configlexer.lex"
+{ YDVAR(1, VAR_IDENTITY) }
YY_BREAK
case 95:
YY_RULE_SETUP
-#line 303 "util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
+#line 305 "util/configlexer.lex"
+{ YDVAR(1, VAR_VERSION) }
YY_BREAK
case 96:
YY_RULE_SETUP
-#line 304 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
+#line 306 "util/configlexer.lex"
+{ YDVAR(1, VAR_MODULE_CONF) }
YY_BREAK
case 97:
YY_RULE_SETUP
-#line 305 "util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
+#line 307 "util/configlexer.lex"
+{ YDVAR(1, VAR_DLV_ANCHOR) }
YY_BREAK
case 98:
YY_RULE_SETUP
-#line 306 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
+#line 308 "util/configlexer.lex"
+{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
YY_BREAK
case 99:
YY_RULE_SETUP
-#line 307 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
+#line 309 "util/configlexer.lex"
+{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
YY_BREAK
case 100:
YY_RULE_SETUP
-#line 308 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+#line 310 "util/configlexer.lex"
+{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
YY_BREAK
case 101:
YY_RULE_SETUP
-#line 309 "util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
+#line 311 "util/configlexer.lex"
+{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
YY_BREAK
case 102:
YY_RULE_SETUP
-#line 310 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
+#line 312 "util/configlexer.lex"
+{ YDVAR(1, VAR_TRUST_ANCHOR) }
YY_BREAK
case 103:
YY_RULE_SETUP
-#line 311 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
+#line 313 "util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
YY_BREAK
case 104:
YY_RULE_SETUP
-#line 312 "util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+#line 314 "util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
YY_BREAK
case 105:
YY_RULE_SETUP
-#line 313 "util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+#line 315 "util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
YY_BREAK
case 106:
YY_RULE_SETUP
-#line 314 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+#line 316 "util/configlexer.lex"
+{ YDVAR(1, VAR_BOGUS_TTL) }
YY_BREAK
case 107:
YY_RULE_SETUP
-#line 315 "util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+#line 317 "util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
YY_BREAK
case 108:
YY_RULE_SETUP
-#line 316 "util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+#line 318 "util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
YY_BREAK
case 109:
YY_RULE_SETUP
-#line 317 "util/configlexer.lex"
+#line 319 "util/configlexer.lex"
+{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+ YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 320 "util/configlexer.lex"
+{ YDVAR(1, VAR_SERVE_EXPIRED) }
+ YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 321 "util/configlexer.lex"
+{ YDVAR(1, VAR_FAKE_DSA) }
+ YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 322 "util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+ YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 323 "util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+ YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 324 "util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+ YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 325 "util/configlexer.lex"
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+ YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 326 "util/configlexer.lex"
{
YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
YY_BREAK
-case 110:
+case 117:
YY_RULE_SETUP
-#line 319 "util/configlexer.lex"
+#line 328 "util/configlexer.lex"
{ YDVAR(1, VAR_ADD_HOLDDOWN) }
YY_BREAK
-case 111:
+case 118:
YY_RULE_SETUP
-#line 320 "util/configlexer.lex"
+#line 329 "util/configlexer.lex"
{ YDVAR(1, VAR_DEL_HOLDDOWN) }
YY_BREAK
-case 112:
+case 119:
YY_RULE_SETUP
-#line 321 "util/configlexer.lex"
+#line 330 "util/configlexer.lex"
{ YDVAR(1, VAR_KEEP_MISSING) }
YY_BREAK
-case 113:
+case 120:
YY_RULE_SETUP
-#line 322 "util/configlexer.lex"
+#line 331 "util/configlexer.lex"
{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
YY_BREAK
-case 114:
+case 121:
YY_RULE_SETUP
-#line 323 "util/configlexer.lex"
+#line 332 "util/configlexer.lex"
{ YDVAR(1, VAR_USE_SYSLOG) }
YY_BREAK
-case 115:
+case 122:
YY_RULE_SETUP
-#line 324 "util/configlexer.lex"
+#line 333 "util/configlexer.lex"
+{ YDVAR(1, VAR_LOG_IDENTITY) }
+ YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 334 "util/configlexer.lex"
{ YDVAR(1, VAR_LOG_TIME_ASCII) }
YY_BREAK
-case 116:
+case 124:
YY_RULE_SETUP
-#line 325 "util/configlexer.lex"
+#line 335 "util/configlexer.lex"
{ YDVAR(1, VAR_LOG_QUERIES) }
YY_BREAK
-case 117:
+case 125:
YY_RULE_SETUP
-#line 326 "util/configlexer.lex"
+#line 336 "util/configlexer.lex"
{ YDVAR(2, VAR_LOCAL_ZONE) }
YY_BREAK
-case 118:
+case 126:
YY_RULE_SETUP
-#line 327 "util/configlexer.lex"
+#line 337 "util/configlexer.lex"
{ YDVAR(1, VAR_LOCAL_DATA) }
YY_BREAK
-case 119:
+case 127:
YY_RULE_SETUP
-#line 328 "util/configlexer.lex"
+#line 338 "util/configlexer.lex"
{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
YY_BREAK
-case 120:
+case 128:
YY_RULE_SETUP
-#line 329 "util/configlexer.lex"
+#line 339 "util/configlexer.lex"
{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
YY_BREAK
-case 121:
+case 129:
YY_RULE_SETUP
-#line 330 "util/configlexer.lex"
+#line 340 "util/configlexer.lex"
{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
YY_BREAK
-case 122:
+case 130:
YY_RULE_SETUP
-#line 331 "util/configlexer.lex"
+#line 341 "util/configlexer.lex"
{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
YY_BREAK
-case 123:
+case 131:
YY_RULE_SETUP
-#line 332 "util/configlexer.lex"
+#line 342 "util/configlexer.lex"
{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
YY_BREAK
-case 124:
+case 132:
YY_RULE_SETUP
-#line 333 "util/configlexer.lex"
+#line 343 "util/configlexer.lex"
{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
YY_BREAK
-case 125:
+case 133:
YY_RULE_SETUP
-#line 334 "util/configlexer.lex"
+#line 344 "util/configlexer.lex"
{ YDVAR(0, VAR_REMOTE_CONTROL) }
YY_BREAK
-case 126:
+case 134:
YY_RULE_SETUP
-#line 335 "util/configlexer.lex"
+#line 345 "util/configlexer.lex"
{ YDVAR(1, VAR_CONTROL_ENABLE) }
YY_BREAK
-case 127:
+case 135:
YY_RULE_SETUP
-#line 336 "util/configlexer.lex"
+#line 346 "util/configlexer.lex"
{ YDVAR(1, VAR_CONTROL_INTERFACE) }
YY_BREAK
-case 128:
+case 136:
YY_RULE_SETUP
-#line 337 "util/configlexer.lex"
+#line 347 "util/configlexer.lex"
{ YDVAR(1, VAR_CONTROL_PORT) }
YY_BREAK
-case 129:
+case 137:
YY_RULE_SETUP
-#line 338 "util/configlexer.lex"
+#line 348 "util/configlexer.lex"
{ YDVAR(1, VAR_CONTROL_USE_CERT) }
YY_BREAK
-case 130:
+case 138:
YY_RULE_SETUP
-#line 339 "util/configlexer.lex"
+#line 349 "util/configlexer.lex"
{ YDVAR(1, VAR_SERVER_KEY_FILE) }
YY_BREAK
-case 131:
+case 139:
YY_RULE_SETUP
-#line 340 "util/configlexer.lex"
+#line 350 "util/configlexer.lex"
{ YDVAR(1, VAR_SERVER_CERT_FILE) }
YY_BREAK
-case 132:
+case 140:
YY_RULE_SETUP
-#line 341 "util/configlexer.lex"
+#line 351 "util/configlexer.lex"
{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
YY_BREAK
-case 133:
+case 141:
YY_RULE_SETUP
-#line 342 "util/configlexer.lex"
+#line 352 "util/configlexer.lex"
{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
YY_BREAK
-case 134:
+case 142:
YY_RULE_SETUP
-#line 343 "util/configlexer.lex"
+#line 353 "util/configlexer.lex"
{ YDVAR(1, VAR_PYTHON_SCRIPT) }
YY_BREAK
-case 135:
+case 143:
YY_RULE_SETUP
-#line 344 "util/configlexer.lex"
+#line 354 "util/configlexer.lex"
{ YDVAR(0, VAR_PYTHON) }
YY_BREAK
-case 136:
+case 144:
YY_RULE_SETUP
-#line 345 "util/configlexer.lex"
+#line 355 "util/configlexer.lex"
{ YDVAR(1, VAR_DOMAIN_INSECURE) }
YY_BREAK
-case 137:
+case 145:
YY_RULE_SETUP
-#line 346 "util/configlexer.lex"
+#line 356 "util/configlexer.lex"
{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
YY_BREAK
-case 138:
+case 146:
YY_RULE_SETUP
-#line 347 "util/configlexer.lex"
+#line 357 "util/configlexer.lex"
{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
YY_BREAK
-case 139:
+case 147:
YY_RULE_SETUP
-#line 348 "util/configlexer.lex"
+#line 358 "util/configlexer.lex"
{ YDVAR(1, VAR_MAX_UDP_SIZE) }
YY_BREAK
-case 140:
+case 148:
YY_RULE_SETUP
-#line 349 "util/configlexer.lex"
+#line 359 "util/configlexer.lex"
{ YDVAR(1, VAR_DNS64_PREFIX) }
YY_BREAK
-case 141:
+case 149:
YY_RULE_SETUP
-#line 350 "util/configlexer.lex"
+#line 360 "util/configlexer.lex"
{ YDVAR(1, VAR_DNS64_SYNTHALL) }
YY_BREAK
-case 142:
+case 150:
YY_RULE_SETUP
-#line 351 "util/configlexer.lex"
+#line 361 "util/configlexer.lex"
{ YDVAR(1, VAR_DEFINE_TAG) }
YY_BREAK
-case 143:
+case 151:
YY_RULE_SETUP
-#line 352 "util/configlexer.lex"
+#line 362 "util/configlexer.lex"
{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
YY_BREAK
-case 144:
+case 152:
YY_RULE_SETUP
-#line 353 "util/configlexer.lex"
+#line 363 "util/configlexer.lex"
{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
YY_BREAK
-case 145:
+case 153:
YY_RULE_SETUP
-#line 354 "util/configlexer.lex"
+#line 364 "util/configlexer.lex"
{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
YY_BREAK
-case 146:
+case 154:
YY_RULE_SETUP
-#line 355 "util/configlexer.lex"
+#line 365 "util/configlexer.lex"
{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
YY_BREAK
-case 147:
+case 155:
YY_RULE_SETUP
-#line 356 "util/configlexer.lex"
+#line 366 "util/configlexer.lex"
+{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+ YY_BREAK
+case 156:
+YY_RULE_SETUP
+#line 367 "util/configlexer.lex"
{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
YY_BREAK
-case 148:
+case 157:
YY_RULE_SETUP
-#line 357 "util/configlexer.lex"
+#line 368 "util/configlexer.lex"
{ YDVAR(0, VAR_DNSTAP) }
YY_BREAK
-case 149:
+case 158:
YY_RULE_SETUP
-#line 358 "util/configlexer.lex"
+#line 369 "util/configlexer.lex"
{ YDVAR(1, VAR_DNSTAP_ENABLE) }
YY_BREAK
-case 150:
+case 159:
YY_RULE_SETUP
-#line 359 "util/configlexer.lex"
+#line 370 "util/configlexer.lex"
{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
YY_BREAK
-case 151:
+case 160:
YY_RULE_SETUP
-#line 360 "util/configlexer.lex"
+#line 371 "util/configlexer.lex"
{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
YY_BREAK
-case 152:
+case 161:
YY_RULE_SETUP
-#line 361 "util/configlexer.lex"
+#line 372 "util/configlexer.lex"
{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
YY_BREAK
-case 153:
+case 162:
YY_RULE_SETUP
-#line 362 "util/configlexer.lex"
+#line 373 "util/configlexer.lex"
{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
YY_BREAK
-case 154:
+case 163:
YY_RULE_SETUP
-#line 363 "util/configlexer.lex"
+#line 374 "util/configlexer.lex"
{ YDVAR(1, VAR_DNSTAP_VERSION) }
YY_BREAK
-case 155:
+case 164:
YY_RULE_SETUP
-#line 364 "util/configlexer.lex"
+#line 375 "util/configlexer.lex"
{
YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
YY_BREAK
-case 156:
+case 165:
YY_RULE_SETUP
-#line 366 "util/configlexer.lex"
+#line 377 "util/configlexer.lex"
{
YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
YY_BREAK
-case 157:
+case 166:
YY_RULE_SETUP
-#line 368 "util/configlexer.lex"
+#line 379 "util/configlexer.lex"
{
YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
YY_BREAK
-case 158:
+case 167:
YY_RULE_SETUP
-#line 370 "util/configlexer.lex"
+#line 381 "util/configlexer.lex"
{
YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
YY_BREAK
-case 159:
+case 168:
YY_RULE_SETUP
-#line 372 "util/configlexer.lex"
+#line 383 "util/configlexer.lex"
{
YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
YY_BREAK
-case 160:
+case 169:
YY_RULE_SETUP
-#line 374 "util/configlexer.lex"
+#line 385 "util/configlexer.lex"
{
YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
YY_BREAK
-case 161:
+case 170:
YY_RULE_SETUP
-#line 376 "util/configlexer.lex"
+#line 387 "util/configlexer.lex"
{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
YY_BREAK
-case 162:
+case 171:
YY_RULE_SETUP
-#line 377 "util/configlexer.lex"
+#line 388 "util/configlexer.lex"
{ YDVAR(1, VAR_RATELIMIT) }
YY_BREAK
-case 163:
+case 172:
YY_RULE_SETUP
-#line 378 "util/configlexer.lex"
+#line 389 "util/configlexer.lex"
{ YDVAR(1, VAR_RATELIMIT_SLABS) }
YY_BREAK
-case 164:
+case 173:
YY_RULE_SETUP
-#line 379 "util/configlexer.lex"
+#line 390 "util/configlexer.lex"
{ YDVAR(1, VAR_RATELIMIT_SIZE) }
YY_BREAK
-case 165:
+case 174:
YY_RULE_SETUP
-#line 380 "util/configlexer.lex"
+#line 391 "util/configlexer.lex"
{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
YY_BREAK
-case 166:
+case 175:
YY_RULE_SETUP
-#line 381 "util/configlexer.lex"
+#line 392 "util/configlexer.lex"
{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
YY_BREAK
-case 167:
+case 176:
YY_RULE_SETUP
-#line 382 "util/configlexer.lex"
+#line 393 "util/configlexer.lex"
{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
YY_BREAK
-case 168:
-/* rule 168 can match eol */
+case 177:
+/* rule 177 can match eol */
YY_RULE_SETUP
-#line 383 "util/configlexer.lex"
+#line 394 "util/configlexer.lex"
{ LEXOUT(("NL\n")); cfg_parser->line++; }
YY_BREAK
/* Quoted strings. Strip leading and ending quotes */
-case 169:
+case 178:
YY_RULE_SETUP
-#line 386 "util/configlexer.lex"
+#line 397 "util/configlexer.lex"
{ BEGIN(quotedstring); LEXOUT(("QS ")); }
YY_BREAK
case YY_STATE_EOF(quotedstring):
-#line 387 "util/configlexer.lex"
+#line 398 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 170:
+case 179:
YY_RULE_SETUP
-#line 392 "util/configlexer.lex"
+#line 403 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 171:
-/* rule 171 can match eol */
+case 180:
+/* rule 180 can match eol */
YY_RULE_SETUP
-#line 393 "util/configlexer.lex"
+#line 404 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end \"");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 172:
+case 181:
YY_RULE_SETUP
-#line 395 "util/configlexer.lex"
+#line 406 "util/configlexer.lex"
{
LEXOUT(("QE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -3664,34 +3778,34 @@ YY_RULE_SETUP
}
YY_BREAK
/* Single Quoted strings. Strip leading and ending quotes */
-case 173:
+case 182:
YY_RULE_SETUP
-#line 407 "util/configlexer.lex"
+#line 418 "util/configlexer.lex"
{ BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
YY_BREAK
case YY_STATE_EOF(singlequotedstr):
-#line 408 "util/configlexer.lex"
+#line 419 "util/configlexer.lex"
{
yyerror("EOF inside quoted string");
if(--num_args == 0) { BEGIN(INITIAL); }
else { BEGIN(val); }
}
YY_BREAK
-case 174:
+case 183:
YY_RULE_SETUP
-#line 413 "util/configlexer.lex"
+#line 424 "util/configlexer.lex"
{ LEXOUT(("STR(%s) ", yytext)); yymore(); }
YY_BREAK
-case 175:
-/* rule 175 can match eol */
+case 184:
+/* rule 184 can match eol */
YY_RULE_SETUP
-#line 414 "util/configlexer.lex"
+#line 425 "util/configlexer.lex"
{ yyerror("newline inside quoted string, no end '");
cfg_parser->line++; BEGIN(INITIAL); }
YY_BREAK
-case 176:
+case 185:
YY_RULE_SETUP
-#line 416 "util/configlexer.lex"
+#line 427 "util/configlexer.lex"
{
LEXOUT(("SQE "));
if(--num_args == 0) { BEGIN(INITIAL); }
@@ -3704,38 +3818,38 @@ YY_RULE_SETUP
}
YY_BREAK
/* include: directive */
-case 177:
+case 186:
YY_RULE_SETUP
-#line 428 "util/configlexer.lex"
+#line 439 "util/configlexer.lex"
{
LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
YY_BREAK
case YY_STATE_EOF(include):
-#line 430 "util/configlexer.lex"
+#line 441 "util/configlexer.lex"
{
yyerror("EOF inside include directive");
BEGIN(inc_prev);
}