sync to unbound 1.13.2
authorflorian <florian@openbsd.org>
Sat, 14 Aug 2021 07:32:46 +0000 (07:32 +0000)
committerflorian <florian@openbsd.org>
Sat, 14 Aug 2021 07:32:46 +0000 (07:32 +0000)
OK sthen

65 files changed:
sbin/unwind/libunbound/config.h
sbin/unwind/libunbound/dnstap/dnstap.h
sbin/unwind/libunbound/iterator/iter_scrub.c
sbin/unwind/libunbound/iterator/iter_utils.c
sbin/unwind/libunbound/iterator/iter_utils.h
sbin/unwind/libunbound/iterator/iterator.c
sbin/unwind/libunbound/iterator/iterator.h
sbin/unwind/libunbound/libunbound/context.c
sbin/unwind/libunbound/libunbound/libworker.c
sbin/unwind/libunbound/libunbound/worker.h
sbin/unwind/libunbound/respip/respip.c
sbin/unwind/libunbound/services/authzone.c
sbin/unwind/libunbound/services/authzone.h
sbin/unwind/libunbound/services/cache/dns.c
sbin/unwind/libunbound/services/cache/dns.h
sbin/unwind/libunbound/services/cache/infra.c
sbin/unwind/libunbound/services/listen_dnsport.c
sbin/unwind/libunbound/services/listen_dnsport.h
sbin/unwind/libunbound/services/localzone.c
sbin/unwind/libunbound/services/localzone.h
sbin/unwind/libunbound/services/mesh.c
sbin/unwind/libunbound/services/modstack.c
sbin/unwind/libunbound/services/outside_network.c
sbin/unwind/libunbound/services/outside_network.h
sbin/unwind/libunbound/services/rpz.c
sbin/unwind/libunbound/sldns/keyraw.c
sbin/unwind/libunbound/sldns/keyraw.h
sbin/unwind/libunbound/sldns/parse.c
sbin/unwind/libunbound/sldns/parse.h
sbin/unwind/libunbound/sldns/parseutil.c
sbin/unwind/libunbound/sldns/parseutil.h
sbin/unwind/libunbound/sldns/rrdef.c
sbin/unwind/libunbound/sldns/rrdef.h
sbin/unwind/libunbound/sldns/sbuffer.h
sbin/unwind/libunbound/sldns/str2wire.c
sbin/unwind/libunbound/sldns/str2wire.h
sbin/unwind/libunbound/sldns/wire2str.c
sbin/unwind/libunbound/sldns/wire2str.h
sbin/unwind/libunbound/util/config_file.c
sbin/unwind/libunbound/util/config_file.h
sbin/unwind/libunbound/util/configlexer.c
sbin/unwind/libunbound/util/configlexer.lex
sbin/unwind/libunbound/util/configparser.h
sbin/unwind/libunbound/util/configparser.y
sbin/unwind/libunbound/util/data/dname.h
sbin/unwind/libunbound/util/data/msgreply.c
sbin/unwind/libunbound/util/fptr_wlist.c
sbin/unwind/libunbound/util/iana_ports.inc
sbin/unwind/libunbound/util/net_help.c
sbin/unwind/libunbound/util/net_help.h
sbin/unwind/libunbound/util/netevent.c
sbin/unwind/libunbound/util/netevent.h
sbin/unwind/libunbound/util/shm_side/shm_main.c
sbin/unwind/libunbound/util/storage/lookup3.c
sbin/unwind/libunbound/util/ub_event_pluggable.c
sbin/unwind/libunbound/validator/autotrust.c
sbin/unwind/libunbound/validator/val_anchor.c
sbin/unwind/libunbound/validator/val_nsec.c
sbin/unwind/libunbound/validator/val_secalgo.c
sbin/unwind/libunbound/validator/val_secalgo.h
sbin/unwind/libunbound/validator/val_sigcrypt.c
sbin/unwind/libunbound/validator/val_sigcrypt.h
sbin/unwind/libunbound/validator/val_utils.c
sbin/unwind/libunbound/validator/validator.c
sbin/unwind/libunbound/validator/validator.h

index 8043b28..435139a 100644 (file)
@@ -29,6 +29,9 @@
 /* Whether daemon is deprecated */
 /* #undef DEPRECATED_DAEMON */
 
+/* Deprecate RSA 1024 bit length, makes that an unsupported key */
+/* #undef DEPRECATE_RSA_1024 */
+
 /* Define this to enable kernel based UDP source port randomization. */
 #define DISABLE_EXPLICIT_PORT_RANDOMISATION 1
 
 #define HAVE_EVP_CLEANUP 1
 
 /* Define to 1 if you have the `EVP_DigestVerify' function. */
-/* #undef HAVE_EVP_DIGESTVERIFY */
+#define HAVE_EVP_DIGESTVERIFY 1
 
 /* Define to 1 if you have the `EVP_dss1' function. */
 #define HAVE_EVP_DSS1 1
 /* Define to 1 if you have the `OPENSSL_init_ssl' function. */
 #define HAVE_OPENSSL_INIT_SSL 1
 
+/* Define to 1 if you have the <openssl/param_build.h> header file. */
+/* #undef HAVE_OPENSSL_PARAM_BUILD_H */
+
 /* Define to 1 if you have the <openssl/rand.h> header file. */
 #define HAVE_OPENSSL_RAND_H 1
 
 /* Define to 1 if you have the <openssl/ssl.h> header file. */
 #define HAVE_OPENSSL_SSL_H 1
 
+/* Define to 1 if you have the `OSSL_PARAM_BLD_new' function. */
+/* #undef HAVE_OSSL_PARAM_BLD_NEW */
+
 /* Define if you have POSIX threads libraries and header files. */
 /* #undef HAVE_PTHREAD */
 
 /* Define if you have the SSL libraries installed. */
 #define HAVE_SSL /**/
 
+/* Define to 1 if you have the `SSL_CTX_set_alpn_protos' function. */
+#define HAVE_SSL_CTX_SET_ALPN_PROTOS 1
+
 /* Define to 1 if you have the `SSL_CTX_set_alpn_select_cb' function. */
 #define HAVE_SSL_CTX_SET_ALPN_SELECT_CB 1
 
    function. */
 /* #undef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB */
 
+/* Define to 1 if you have the `SSL_get0_alpn_selected' function. */
+#define HAVE_SSL_GET0_ALPN_SELECTED 1
+
 /* Define to 1 if you have the `SSL_get0_peername' function. */
-/* #undef HAVE_SSL_GET0_PEERNAME */
+#define HAVE_SSL_GET0_PEERNAME 1
+
+/* Define to 1 if you have the `SSL_get1_peer_certificate' function. */
+/* #undef HAVE_SSL_GET1_PEER_CERTIFICATE */
 
 /* Define to 1 if you have the `SSL_set1_host' function. */
 #define HAVE_SSL_SET1_HOST 1
 #define PACKAGE_NAME "unbound"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "unbound 1.13.1"
+#define PACKAGE_STRING "unbound 1.13.2"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "unbound"
 #define PACKAGE_URL ""
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "1.13.1"
+#define PACKAGE_VERSION "1.13.2"
 
 /* default pidfile location */
 #define PIDFILE ""
 #define ROOT_CERT_FILE "/var/unbound/etc/icannbundle.pem"
 
 /* version number for resource files */
-#define RSRC_PACKAGE_VERSION 1,13,1,0
+#define RSRC_PACKAGE_VERSION 1,13,2,0
 
 /* Directory to chdir to */
 #define RUN_DIR "/var/unbound/etc"
 /* Define if you enable libevent */
 #define USE_LIBEVENT 1
 
+/* Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a
+   default outgoing port range. This is only for the libunbound on Linux and
+   does not affect unbound resolving daemon itself. This may severely limit
+   the number of available outgoing ports and thus decrease randomness. Define
+   this only when the target system restricts (e.g. some of SELinux enabled
+   distributions) the use of non-ephemeral ports. */
+/* #undef USE_LINUX_IP_LOCAL_PORT_RANGE */
+
 /* Define if you want to use internal select based events */
 /* #undef USE_MINI_EVENT */
 
index 783b8c5..449fae7 100644 (file)
@@ -123,12 +123,14 @@ dt_delete(struct dt_env *env);
  * Create and send a new dnstap "Message" event of type CLIENT_QUERY.
  * @param env: dnstap environment object.
  * @param qsock: address/port of client.
+ * @param rsock: local (service) address/port.
  * @param cptype: comm_udp or comm_tcp.
  * @param qmsg: query message.
  */
 void
 dt_msg_send_client_query(struct dt_env *env,
                         struct sockaddr_storage *qsock,
+                        struct sockaddr_storage *rsock,
                         enum comm_point_type cptype,
                         struct sldns_buffer *qmsg);
 
@@ -136,12 +138,14 @@ dt_msg_send_client_query(struct dt_env *env,
  * Create and send a new dnstap "Message" event of type CLIENT_RESPONSE.
  * @param env: dnstap environment object.
  * @param qsock: address/port of client.
+ * @param rsock: local (service) address/port.
  * @param cptype: comm_udp or comm_tcp.
  * @param rmsg: response message.
  */
 void
 dt_msg_send_client_response(struct dt_env *env,
                            struct sockaddr_storage *qsock,
+                           struct sockaddr_storage *rsock,
                            enum comm_point_type cptype,
                            struct sldns_buffer *rmsg);
 
@@ -150,7 +154,8 @@ dt_msg_send_client_response(struct dt_env *env,
  * FORWARDER_QUERY. The type used is dependent on the value of the RD bit
  * in the query header.
  * @param env: dnstap environment object.
- * @param rsock: address/port of server the query is being sent to.
+ * @param rsock: address/port of server (upstream) the query is being sent to.
+ * @param qsock: address/port of server (local) the query is being sent from.
  * @param cptype: comm_udp or comm_tcp.
  * @param zone: query zone.
  * @param zone_len: length of zone.
@@ -159,6 +164,7 @@ dt_msg_send_client_response(struct dt_env *env,
 void
 dt_msg_send_outside_query(struct dt_env *env,
                          struct sockaddr_storage *rsock,
+                         struct sockaddr_storage *qsock,
                          enum comm_point_type cptype,
                          uint8_t *zone, size_t zone_len,
                          struct sldns_buffer *qmsg);
@@ -168,7 +174,8 @@ dt_msg_send_outside_query(struct dt_env *env,
  * FORWARDER_RESPONSE. The type used is dependent on the value of the RD bit
  * in the query header.
  * @param env: dnstap environment object.
- * @param rsock: address/port of server the response was received from.
+ * @param rsock: address/port of server (upstream) the response was received from.
+ * @param qsock: address/port of server (local) the response was received to.
  * @param cptype: comm_udp or comm_tcp.
  * @param zone: query zone.
  * @param zone_len: length of zone.
@@ -181,6 +188,7 @@ dt_msg_send_outside_query(struct dt_env *env,
 void
 dt_msg_send_outside_response(struct dt_env *env,
                             struct sockaddr_storage *rsock,
+                            struct sockaddr_storage *qsock,
                             enum comm_point_type cptype,
                             uint8_t *zone, size_t zone_len,
                             uint8_t *qbuf, size_t qbuf_len,
index aae934d..f093c1b 100644 (file)
@@ -640,25 +640,37 @@ store_rrset(sldns_buffer* pkt, struct msg_parse* msg, struct module_env* env,
 
 /**
  * Check if right hand name in NSEC is within zone
+ * @param pkt: the packet buffer for decompression.
  * @param rrset: the NSEC rrset
  * @param zonename: the zone name.
  * @return true if BAD.
  */
-static int sanitize_nsec_is_overreach(struct rrset_parse* rrset, 
-       uint8_t* zonename)
+static int sanitize_nsec_is_overreach(sldns_buffer* pkt,
+       struct rrset_parse* rrset, uint8_t* zonename)
 {
        struct rr_parse* rr;
        uint8_t* rhs;
        size_t len;
        log_assert(rrset->type == LDNS_RR_TYPE_NSEC);
        for(rr = rrset->rr_first; rr; rr = rr->next) {
+               size_t pos = sldns_buffer_position(pkt);
+               size_t rhspos;
                rhs = rr->ttl_data+4+2;
                len = sldns_read_uint16(rr->ttl_data+4);
-               if(!dname_valid(rhs, len)) {
-                       /* malformed domain name in rdata */
+               rhspos = rhs-sldns_buffer_begin(pkt);
+               sldns_buffer_set_position(pkt, rhspos);
+               if(pkt_dname_len(pkt) == 0) {
+                       /* malformed */
+                       sldns_buffer_set_position(pkt, pos);
                        return 1;
                }
-               if(!dname_subdomain_c(rhs, zonename)) {
+               if(sldns_buffer_position(pkt)-rhspos > len) {
+                       /* outside of rdata boundaries */
+                       sldns_buffer_set_position(pkt, pos);
+                       return 1;
+               }
+               sldns_buffer_set_position(pkt, pos);
+               if(!pkt_sub(pkt, rhs, zonename)) {
                        /* overreaching */
                        return 1;
                }
@@ -791,7 +803,7 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg,
                }
                /* check if right hand side of NSEC is within zone */
                if(rrset->type == LDNS_RR_TYPE_NSEC &&
-                       sanitize_nsec_is_overreach(rrset, zonename)) {
+                       sanitize_nsec_is_overreach(pkt, rrset, zonename)) {
                        remove_rrset("sanitize: removing overreaching NSEC "
                                "RRset:", pkt, msg, prev, &rrset);
                        continue;
index 7bc67da..668f898 100644 (file)
@@ -50,6 +50,7 @@
 #include "services/cache/infra.h"
 #include "services/cache/dns.h"
 #include "services/cache/rrset.h"
+#include "services/outside_network.h"
 #include "util/net_help.h"
 #include "util/module.h"
 #include "util/log.h"
@@ -439,6 +440,7 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
                prev = NULL;
                a = dp->result_list;
                for(i = 0; i < got_num; i++) {
+                       if(!a) break; /* robustness */
                        swap_to_front = 0;
                        if(a->addr.ss_family != AF_INET6 && attempt == -1) {
                                /* if we only have ip4 at low attempt count,
@@ -496,6 +498,7 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
                prev = NULL;
                a = dp->result_list;
                for(i = 0; i < got_num; i++) {
+                       if(!a) break; /* robustness */
                        swap_to_front = 0;
                        if(a->addr.ss_family != AF_INET && attempt == -1) {
                                /* if we only have ip6 at low attempt count,
@@ -1390,7 +1393,8 @@ int iter_dp_cangodown(struct query_info* qinfo, struct delegpt* dp)
 }
 
 int
-iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf)
+iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf,
+       uint8_t** retdpname, size_t* retdpnamelen)
 {
        struct iter_hints_stub *stub;
        struct delegpt *dp;
@@ -1419,6 +1423,10 @@ iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf)
                        dname_str(stub->dp->name, dpname);
                        verbose(VERB_ALGO, "stub for %s %s has no_cache", qname, dpname);
                }
+               if(retdpname) {
+                       *retdpname = stub->dp->name;
+                       *retdpnamelen = stub->dp->namelen;
+               }
                return (stub->dp->no_cache);
        }
 
@@ -1431,7 +1439,31 @@ iter_stub_fwd_no_cache(struct module_qstate *qstate, struct query_info *qinf)
                        dname_str(dp->name, dpname);
                        verbose(VERB_ALGO, "forward for %s %s has no_cache", qname, dpname);
                }
+               if(retdpname) {
+                       *retdpname = dp->name;
+                       *retdpnamelen = dp->namelen;
+               }
                return (dp->no_cache);
        }
+       if(retdpname) {
+               *retdpname = NULL;
+               *retdpnamelen = 0;
+       }
        return 0;
 }
+
+void iterator_set_ip46_support(struct module_stack* mods,
+       struct module_env* env, struct outside_network* outnet)
+{
+       int m = modstack_find(mods, "iterator");
+       struct iter_env* ie = NULL;
+       if(m == -1)
+               return;
+       ie = (struct iter_env*)env->modinfo[m];
+       if(outnet->pending == NULL)
+               return; /* we are in testbound, no rbtree for UDP */
+       if(outnet->num_ip4 == 0)
+               ie->supports_ipv4 = 0;
+       if(outnet->num_ip6 == 0)
+               ie->supports_ipv6 = 0;
+}
index f771930..509d292 100644 (file)
@@ -59,6 +59,8 @@ struct reply_info;
 struct module_qstate;
 struct sock_list;
 struct ub_packed_rrset_key;
+struct module_stack;
+struct outside_network;
 
 /**
  * Process config options and set iterator module state.
@@ -130,7 +132,7 @@ struct dns_msg* dns_copy_msg(struct dns_msg* from, struct regional* regional);
  *     can be prefetch-updates.
  * @param region: to copy modified (cache is better) rrs back to.
  * @param flags: with BIT_CD for dns64 AAAA translated queries.
- * @return void, because we are not interested in alloc errors,
+ * return void, because we are not interested in alloc errors,
  *     the iterator and validator can operate on the results in their
  *     scratch space (the qstate.region) and are not dependent on the cache.
  *     It is useful to log the alloc failure (for the server operator),
@@ -380,9 +382,26 @@ int iter_dp_cangodown(struct query_info* qinfo, struct delegpt* dp);
  * Lookup if no_cache is set in stub or fwd.
  * @param qstate: query state with env with hints and fwds.
  * @param qinf: query name to lookup for.
+ * @param retdpname: returns NULL or the deepest enclosing name of fwd or stub.
+ *     This is the name under which the closest lookup is going to happen.
+ *     Used for NXDOMAIN checks, above that it is an nxdomain from a
+ *     different server and zone. You can pass NULL to not get it.
+ * @param retdpnamelen: returns the length of the dpname.
  * @return true if no_cache is set in stub or fwd.
  */
 int iter_stub_fwd_no_cache(struct module_qstate *qstate,
-       struct query_info *qinf);
+       struct query_info *qinf, uint8_t** retdpname, size_t* retdpnamelen);
+
+/**
+ * Set support for IP4 and IP6 depending on outgoing interfaces
+ * in the outside network.  If none, no support, so no use to lookup
+ * the AAAA and then attempt to use it if there is no outgoing-interface
+ * for it.
+ * @param mods: modstack to find iterator module in.
+ * @param env: module env, find iterator module (if one) in there.
+ * @param outnet: outside network structure.
+ */
+void iterator_set_ip46_support(struct module_stack* mods,
+       struct module_env* env, struct outside_network* outnet);
 
 #endif /* ITERATOR_ITER_UTILS_H */
index 99d0201..f0105ad 100644 (file)
@@ -585,6 +585,60 @@ handle_cname_response(struct module_qstate* qstate, struct iter_qstate* iq,
        return 1;
 }
 
+/** add response specific error information for log servfail */
+static void
+errinf_reply(struct module_qstate* qstate, struct iter_qstate* iq)
+{
+       if(qstate->env->cfg->val_log_level < 2 && !qstate->env->cfg->log_servfail)
+               return;
+       if((qstate->reply && qstate->reply->addrlen != 0) ||
+               (iq->fail_reply && iq->fail_reply->addrlen != 0)) {
+               char from[256], frm[512];
+               if(qstate->reply && qstate->reply->addrlen != 0)
+                       addr_to_str(&qstate->reply->addr, qstate->reply->addrlen,
+                               from, sizeof(from));
+               else
+                       addr_to_str(&iq->fail_reply->addr, iq->fail_reply->addrlen,
+                               from, sizeof(from));
+               snprintf(frm, sizeof(frm), "from %s", from);
+               errinf(qstate, frm);
+       }
+       if(iq->scrub_failures || iq->parse_failures) {
+               if(iq->scrub_failures)
+                       errinf(qstate, "upstream response failed scrub");
+               if(iq->parse_failures)
+                       errinf(qstate, "could not parse upstream response");
+       } else if(iq->response == NULL && iq->timeout_count != 0) {
+               errinf(qstate, "upstream server timeout");
+       } else if(iq->response == NULL) {
+               errinf(qstate, "no server to query");
+               if(iq->dp) {
+                       if(iq->dp->target_list == NULL)
+                               errinf(qstate, "no addresses for nameservers");
+                       else    errinf(qstate, "nameserver addresses not usable");
+                       if(iq->dp->nslist == NULL)
+                               errinf(qstate, "have no nameserver names");
+                       if(iq->dp->bogus)
+                               errinf(qstate, "NS record was dnssec bogus");
+               }
+       }
+       if(iq->response && iq->response->rep) {
+               if(FLAGS_GET_RCODE(iq->response->rep->flags) != 0) {
+                       char rcode[256], rc[32];
+                       (void)sldns_wire2str_rcode_buf(
+                               FLAGS_GET_RCODE(iq->response->rep->flags),
+                               rc, sizeof(rc));
+                       snprintf(rcode, sizeof(rcode), "got %s", rc);
+                       errinf(qstate, rcode);
+               } else {
+                       /* rcode NOERROR */
+                       if(iq->response->rep->an_numrrsets == 0) {
+                               errinf(qstate, "nodata answer");
+                       }
+               }
+       }
+}
+
 /** see if last resort is possible - does config allow queries to parent */
 static int
 can_have_last_resort(struct module_env* env, uint8_t* nm, size_t nmlen,
@@ -1228,8 +1282,8 @@ static int
 processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
        struct iter_env* ie, int id)
 {
-       uint8_t* delname;
-       size_t delnamelen;
+       uint8_t* delname, *dpname=NULL;
+       size_t delnamelen, dpnamelen=0;
        struct dns_msg* msg = NULL;
 
        log_query_info(VERB_DETAIL, "resolving", &qstate->qinfo);
@@ -1283,7 +1337,7 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
        /* This either results in a query restart (CNAME cache response), a
         * terminating response (ANSWER), or a cache miss (null). */
        
-       if (iter_stub_fwd_no_cache(qstate, &iq->qchase)) {
+       if (iter_stub_fwd_no_cache(qstate, &iq->qchase, &dpname, &dpnamelen)) {
                /* Asked to not query cache. */
                verbose(VERB_ALGO, "no-cache set, going to the network");
                qstate->no_cache_lookup = 1;
@@ -1298,7 +1352,8 @@ processInitRequest(struct module_qstate* qstate, struct iter_qstate* iq,
                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, 0);
+                       qstate->region, qstate->env->scratch, 0, dpname,
+                       dpnamelen);
                if(!msg && qstate->env->neg_cache &&
                        iter_qname_indicates_dnssec(qstate->env, &iq->qchase)) {
                        /* lookup in negative cache; may result in
@@ -1921,6 +1976,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
                 * of a response. */
                errinf(qstate, "all the configured stub or forward servers failed,");
                errinf_dname(qstate, "at zone", iq->dp->name);
+               errinf_reply(qstate, iq);
                verbose(VERB_QUERY, "configured stub or forward servers failed -- returning SERVFAIL");
                return error_response_cache(qstate, id, LDNS_RCODE_SERVFAIL);
        }
@@ -2067,6 +2123,7 @@ processLastResort(struct module_qstate* qstate, struct iter_qstate* iq,
 
        errinf(qstate, "all servers for this domain failed,");
        errinf_dname(qstate, "at zone", iq->dp->name);
+       errinf_reply(qstate, iq);
        verbose(VERB_QUERY, "out of query targets -- returning SERVFAIL");
        /* fail -- no more targets, no more hope of targets, no hope 
         * of a response. */
@@ -2288,7 +2345,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                iq->qinfo_out.qname, iq->qinfo_out.qname_len, 
                                iq->qinfo_out.qtype, iq->qinfo_out.qclass, 
                                qstate->query_flags, qstate->region, 
-                               qstate->env->scratch, 0);
+                               qstate->env->scratch, 0, iq->dp->name,
+                               iq->dp->namelen);
                        if(msg && FLAGS_GET_RCODE(msg->rep->flags) ==
                                LDNS_RCODE_NOERROR)
                                /* no need to send query if it is already 
@@ -2611,7 +2669,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                (iq->dp->ssl_upstream || qstate->env->cfg->ssl_upstream),
                target->tls_auth_name, qstate);
        if(!outq) {
-               log_addr(VERB_DETAIL, "error sending query to auth server", 
+               log_addr(VERB_QUERY, "error sending query to auth server",
                        &target->addr, target->addrlen);
                if(!(iq->chase_flags & BIT_RD) && !iq->ratelimit_ok)
                    infra_ratelimit_dec(qstate->env->infra_cache, iq->dp->name,
@@ -2957,6 +3015,8 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
                        qstate->env->detach_subs));
                (*qstate->env->detach_subs)(qstate);
                iq->num_target_queries = 0;
+               iq->response = NULL;
+               iq->fail_reply = NULL;
                verbose(VERB_ALGO, "cleared outbound list for next round");
                return next_state(iq, QUERYTARGETS_STATE);
        } else if(type == RESPONSE_TYPE_CNAME) {
@@ -3720,6 +3780,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
        }
 
        /* parse message */
+       iq->fail_reply = qstate->reply;
        prs = (struct msg_parse*)regional_alloc(qstate->env->scratch, 
                sizeof(struct msg_parse));
        if(!prs) {
@@ -3733,12 +3794,15 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
        sldns_buffer_set_position(pkt, 0);
        if(parse_packet(pkt, prs, qstate->env->scratch) != LDNS_RCODE_NOERROR) {
                verbose(VERB_ALGO, "parse error on reply packet");
+               iq->parse_failures++;
                goto handle_it;
        }
        /* edns is not examined, but removed from message to help cache */
        if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
-               LDNS_RCODE_NOERROR)
+               LDNS_RCODE_NOERROR) {
+               iq->parse_failures++;
                goto handle_it;
+       }
 
        /* Copy the edns options we may got from the back end */
        if(edns.opt_list) {
@@ -3772,6 +3836,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
                        iq->num_current_queries--;
                        verbose(VERB_DETAIL, "Capsforid: scrub failed, starting fallback with no response");
                }
+               iq->scrub_failures++;
                goto handle_it;
        }
 
index 342ac20..dc5e575 100644 (file)
@@ -61,7 +61,7 @@ struct rbtree_type;
  * its subqueries */
 #define MAX_TARGET_NX          5
 /** max number of query restarts. Determines max number of CNAME chain. */
-#define MAX_RESTART_COUNT       8
+#define MAX_RESTART_COUNT      11
 /** max number of referrals. Makes sure resolver does not run away */
 #define MAX_REFERRAL_COUNT     130
 /** max number of queries-sent-out.  Make sure large NS set does not loop */
@@ -406,6 +406,12 @@ struct iter_qstate {
        int auth_zone_response;
        /** True if the auth_zones should not be consulted for the query */
        int auth_zone_avoid;
+       /** true if there have been scrubbing failures of reply packets */
+       int scrub_failures;
+       /** true if there have been parse failures of reply packets */
+       int parse_failures;
+       /** a failure printout address for last received answer */
+       struct comm_reply* fail_reply;
 };
 
 /**
index cff2831..e589c6a 100644 (file)
@@ -69,6 +69,7 @@ context_finalize(struct ub_ctx* ctx)
        } else {
                log_init(cfg->logfile, cfg->use_syslog, NULL);
        }
+       cfg_apply_local_port_policy(cfg, 65536);
        config_apply(cfg);
        if(!modstack_setup(&ctx->mods, cfg->module_conf, ctx->env))
                return UB_INITFAIL;
@@ -78,7 +79,8 @@ context_finalize(struct ub_ctx* ctx)
                return UB_NOMEM;
        if(!local_zones_apply_cfg(ctx->local_zones, cfg))
                return UB_INITFAIL;
-       if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1, &is_rpz))
+       if(!auth_zones_apply_cfg(ctx->env->auth_zones, cfg, 1, &is_rpz,
+               ctx->env, &ctx->mods))
                return UB_INITFAIL;
        if(!edns_strings_apply_cfg(ctx->env->edns_strings, cfg))
                return UB_INITFAIL;
index 7f46df3..8a9ca94 100644 (file)
@@ -241,7 +241,9 @@ libworker_setup(struct ub_ctx* ctx, int is_bg, struct ub_event_base* eb)
                ports, numports, cfg->unwanted_threshold,
                cfg->outgoing_tcp_mss, &libworker_alloc_cleanup, w,
                cfg->do_udp || cfg->udp_upstream_without_downstream, w->sslctx,
-               cfg->delay_close, cfg->tls_use_sni, NULL, cfg->udp_connect);
+               cfg->delay_close, cfg->tls_use_sni, NULL, cfg->udp_connect,
+               cfg->max_reuse_tcp_queries, cfg->tcp_reuse_timeout,
+               cfg->tcp_auth_query_timeout);
        w->env->outnet = w->back;
        if(!w->is_bg || w->is_bg_thread) {
                lock_basic_unlock(&ctx->cfglock);
@@ -454,8 +456,15 @@ fill_res(struct ub_result* res, struct ub_packed_rrset_key* answer,
                if(rep->rrset_count != 0)
                        res->ttl = (int)rep->ttl;
                res->data = (char**)calloc(1, sizeof(char*));
+               if(!res->data)
+                       return 0; /* out of memory */
                res->len = (int*)calloc(1, sizeof(int));
-               return (res->data && res->len);
+               if(!res->len) {
+                       free(res->data);
+                       res->data = NULL;
+                       return 0; /* out of memory */
+               }
+               return 1;
        }
        data = (struct packed_rrset_data*)answer->entry.data;
        if(query_dname_compare(rq->qname, answer->rk.dname) != 0) {
@@ -463,15 +472,30 @@ fill_res(struct ub_result* res, struct ub_packed_rrset_key* answer,
                        return 0; /* out of memory */
        } else  res->canonname = NULL;
        res->data = (char**)calloc(data->count+1, sizeof(char*));
+       if(!res->data)
+               return 0; /* out of memory */
        res->len = (int*)calloc(data->count+1, sizeof(int));
-       if(!res->data || !res->len)
+       if(!res->len) {
+               free(res->data);
+               res->data = NULL;
                return 0; /* out of memory */
+       }
        for(i=0; i<data->count; i++) {
                /* remove rdlength from rdata */
                res->len[i] = (int)(data->rr_len[i] - 2);
                res->data[i] = memdup(data->rr_data[i]+2, (size_t)res->len[i]);
-               if(!res->data[i])
+               if(!res->data[i]) {
+                       size_t j;
+                       for(j=0; j<i; j++) {
+                               free(res->data[j]);
+                               res->data[j] = NULL;
+                       }
+                       free(res->data);
+                       res->data = NULL;
+                       free(res->len);
+                       res->len = NULL;
                        return 0; /* out of memory */
+               }
        }
        /* ttl for positive answers, from CNAME and answer RRs */
        if(data->count != 0) {
@@ -876,35 +900,6 @@ struct outbound_entry* libworker_send_query(struct query_info* qinfo,
        return e;
 }
 
-int 
-libworker_handle_reply(struct comm_point* c, void* arg, int error,
-        struct comm_reply* reply_info)
-{
-       struct module_qstate* q = (struct module_qstate*)arg;
-       struct libworker* lw = (struct libworker*)q->env->worker;
-       struct outbound_entry e;
-       e.qstate = q;
-       e.qsent = NULL;
-
-       if(error != 0) {
-               mesh_report_reply(lw->env->mesh, &e, reply_info, error);
-               return 0;
-       }
-       /* sanity check. */
-       if(!LDNS_QR_WIRE(sldns_buffer_begin(c->buffer))
-               || LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) !=
-                       LDNS_PACKET_QUERY
-               || LDNS_QDCOUNT(sldns_buffer_begin(c->buffer)) > 1) {
-               /* error becomes timeout for the module as if this reply
-                * never arrived. */
-               mesh_report_reply(lw->env->mesh, &e, reply_info, 
-                       NETEVENT_TIMEOUT);
-               return 0;
-       }
-       mesh_report_reply(lw->env->mesh, &e, reply_info, NETEVENT_NOERROR);
-       return 0;
-}
-
 int 
 libworker_handle_service_reply(struct comm_point* c, void* arg, int error,
         struct comm_reply* reply_info)
@@ -947,14 +942,6 @@ int worker_handle_request(struct comm_point* ATTR_UNUSED(c),
        return 0;
 }
 
-int worker_handle_reply(struct comm_point* ATTR_UNUSED(c), 
-       void* ATTR_UNUSED(arg), int ATTR_UNUSED(error),
-        struct comm_reply* ATTR_UNUSED(reply_info))
-{
-       log_assert(0);
-       return 0;
-}
-
 int worker_handle_service_reply(struct comm_point* ATTR_UNUSED(c), 
        void* ATTR_UNUSED(arg), int ATTR_UNUSED(error),
         struct comm_reply* ATTR_UNUSED(reply_info))
index fe1d518..bf74738 100644 (file)
@@ -75,10 +75,6 @@ struct outbound_entry* libworker_send_query(struct query_info* qinfo,
        size_t zonelen, int ssl_upstream, char* tls_auth_name,
        struct module_qstate* q);
 
-/** process incoming replies from the network */
-int libworker_handle_reply(struct comm_point* c, void* arg, int error,
-        struct comm_reply* reply_info);
-
 /** process incoming serviced query replies from the network */
 int libworker_handle_service_reply(struct comm_point* c, void* arg, int error,
         struct comm_reply* reply_info);
@@ -146,10 +142,6 @@ void worker_handle_control_cmd(struct tube* tube, uint8_t* msg, size_t len,
 int worker_handle_request(struct comm_point* c, void* arg, int error,
        struct comm_reply* repinfo);
 
-/** process incoming replies from the network */
-int worker_handle_reply(struct comm_point* c, void* arg, int error, 
-       struct comm_reply* reply_info);
-
 /** process incoming serviced query replies from the network */
 int worker_handle_service_reply(struct comm_point* c, void* arg, int error, 
        struct comm_reply* reply_info);
index 8fe82cd..aae41f5 100644 (file)
@@ -129,7 +129,7 @@ respip_sockaddr_delete(struct respip_set* set, struct resp_addr* node)
        struct resp_addr* prev;
        prev = (struct resp_addr*)rbtree_previous((struct rbnode_type*)node);   
        lock_rw_destroy(&node->lock);
-       rbtree_delete(&set->ip_tree, node);
+       (void)rbtree_delete(&set->ip_tree, node);
        /* no free'ing, all allocated in region */
        if(!prev)
                addr_tree_init_parents((rbtree_type*)set);
index 2ef782c..e6e3a8c 100644 (file)
 #include "sldns/parseutil.h"
 #include "sldns/keyraw.h"
 #include "validator/val_nsec3.h"
+#include "validator/val_nsec.h"
 #include "validator/val_secalgo.h"
+#include "validator/val_sigcrypt.h"
+#include "validator/val_anchor.h"
+#include "validator/val_utils.h"
 #include <ctype.h>
 
 /** bytes to use for NSEC3 hash buffer. 20 for sha1 */
@@ -1741,9 +1745,45 @@ int auth_zone_write_file(struct auth_zone* z, const char* fname)
        return 1;
 }
 
+/** offline verify for zonemd, while reading a zone file to immediately
+ * spot bad hashes in zonefile as they are read.
+ * Creates temp buffers, but uses anchors and validation environment
+ * from the module_env. */
+static void
+zonemd_offline_verify(struct auth_zone* z, struct module_env* env_for_val,
+       struct module_stack* mods)
+{
+       struct module_env env;
+       time_t now = 0;
+       if(!z->zonemd_check)
+               return;
+       env = *env_for_val;
+       env.scratch_buffer = sldns_buffer_new(env.cfg->msg_buffer_size);
+       if(!env.scratch_buffer) {
+               log_err("out of memory");
+               goto clean_exit;
+       }
+       env.scratch = regional_create();
+       if(!env.now) {
+               env.now = &now;
+               now = time(NULL);
+       }
+       if(!env.scratch) {
+               log_err("out of memory");
+               goto clean_exit;
+       }
+       auth_zone_verify_zonemd(z, &env, mods, NULL, 1, 0);
+
+clean_exit:
+       /* clean up and exit */
+       sldns_buffer_free(env.scratch_buffer);
+       regional_destroy(env.scratch);
+}
+
 /** read all auth zones from file (if they have) */
 static int
-auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg)
+auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg,
+       struct module_env* env, struct module_stack* mods)
 {
        struct auth_zone* z;
        lock_rw_wrlock(&az->lock);
@@ -1754,12 +1794,162 @@ auth_zones_read_zones(struct auth_zones* az, struct config_file* cfg)
                        lock_rw_unlock(&az->lock);
                        return 0;
                }
+               if(z->zonefile && z->zonefile[0]!=0 && env)
+                       zonemd_offline_verify(z, env, mods);
                lock_rw_unlock(&z->lock);
        }
        lock_rw_unlock(&az->lock);
        return 1;
 }
 
+/** fetch the content of a ZONEMD RR from the rdata */
+static int zonemd_fetch_parameters(struct auth_rrset* zonemd_rrset, size_t i,
+       uint32_t* serial, int* scheme, int* hashalgo, uint8_t** hash,
+       size_t* hashlen)
+{
+       size_t rr_len;
+       uint8_t* rdata;
+       if(i >= zonemd_rrset->data->count)
+               return 0;
+       rr_len = zonemd_rrset->data->rr_len[i];
+       if(rr_len < 2+4+1+1)
+               return 0; /* too short, for rdlen+serial+scheme+algo */
+       rdata = zonemd_rrset->data->rr_data[i];
+       *serial = sldns_read_uint32(rdata+2);
+       *scheme = rdata[6];
+       *hashalgo = rdata[7];
+       *hashlen = rr_len - 8;
+       if(*hashlen == 0)
+               *hash = NULL;
+       else    *hash = rdata+8;
+       return 1;
+}
+
+/**
+ * See if the ZONEMD scheme, hash occurs more than once.
+ * @param zonemd_rrset: the zonemd rrset to check with the RRs in it.
+ * @param index: index of the original, this is allowed to have that
+ *     scheme and hashalgo, but other RRs should not have it.
+ * @param scheme: the scheme to check for.
+ * @param hashalgo: the hash algorithm to check for.
+ * @return true if it occurs more than once.
+ */
+static int zonemd_is_duplicate_scheme_hash(struct auth_rrset* zonemd_rrset,
+       size_t index, int scheme, int hashalgo)
+{
+       size_t j;
+       for(j=0; j<zonemd_rrset->data->count; j++) {
+               uint32_t serial2 = 0;
+               int scheme2 = 0, hashalgo2 = 0;
+               uint8_t* hash2 = NULL;
+               size_t hashlen2 = 0;
+               if(index == j) {
+                       /* this is the original */
+                       continue;
+               }
+               if(!zonemd_fetch_parameters(zonemd_rrset, j, &serial2,
+                       &scheme2, &hashalgo2, &hash2, &hashlen2)) {
+                       /* malformed, skip it */
+                       continue;
+               }
+               if(scheme == scheme2 && hashalgo == hashalgo2) {
+                       /* duplicate scheme, hash */
+                       verbose(VERB_ALGO, "zonemd duplicate for scheme %d "
+                               "and hash %d", scheme, hashalgo);
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+/**
+ * Check ZONEMDs if present for the auth zone.  Depending on config
+ * it can warn or fail on that.  Checks the hash of the ZONEMD.
+ * @param z: auth zone to check for.
+ *     caller must hold lock on zone.
+ * @param env: module env for temp buffers.
+ * @param reason: returned on failure.
+ * @return false on failure, true if hash checks out.
+ */
+static int auth_zone_zonemd_check_hash(struct auth_zone* z,
+       struct module_env* env, char** reason)
+{
+       /* loop over ZONEMDs and see which one is valid. if not print
+        * failure (depending on config) */
+       struct auth_data* apex;
+       struct auth_rrset* zonemd_rrset;
+       size_t i;
+       struct regional* region = NULL;
+       struct sldns_buffer* buf = NULL;
+       uint32_t soa_serial = 0;
+       region = env->scratch;
+       regional_free_all(region);
+       buf = env->scratch_buffer;
+       if(!auth_zone_get_serial(z, &soa_serial)) {
+               *reason = "zone has no SOA serial";
+               return 0;
+       }
+
+       apex = az_find_name(z, z->name, z->namelen);
+       if(!apex) {
+               *reason = "zone has no apex";
+               return 0;
+       }
+       zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD);
+       if(!zonemd_rrset || zonemd_rrset->data->count==0) {
+               *reason = "zone has no ZONEMD";
+               return 0; /* no RRset or no RRs in rrset */
+       }
+
+       /* we have a ZONEMD, check if it is correct */
+       for(i=0; i<zonemd_rrset->data->count; i++) {
+               uint32_t serial = 0;
+               int scheme = 0, hashalgo = 0;
+               uint8_t* hash = NULL;
+               size_t hashlen = 0;
+               if(!zonemd_fetch_parameters(zonemd_rrset, i, &serial, &scheme,
+                       &hashalgo, &hash, &hashlen)) {
+                       /* malformed RR */
+                       *reason = "ZONEMD rdata malformed";
+                       continue;
+               }
+               /* check for duplicates */
+               if(zonemd_is_duplicate_scheme_hash(zonemd_rrset, i, scheme,
+                       hashalgo)) {
+                       /* duplicate hash of the same scheme,hash
+                        * is not allowed. */
+                       *reason = "ZONEMD RRSet contains more than one RR "
+                               "with the same scheme and hash algorithm";
+                       continue;
+               }
+               regional_free_all(region);
+               if(serial != soa_serial) {
+                       *reason = "ZONEMD serial is wrong";
+                       continue;
+               }
+               if(auth_zone_generate_zonemd_check(z, scheme, hashalgo,
+                       hash, hashlen, region, buf, reason)) {
+                       /* success */
+                       if(verbosity >= VERB_ALGO) {
+                               char zstr[255+1];
+                               dname_str(z->name, zstr);
+                               verbose(VERB_ALGO, "auth-zone %s ZONEMD hash is correct", zstr);
+                       }
+                       return 1;
+               }
+               /* try next one */
+       }
+       /* fail, we may have reason */
+       if(!*reason)
+               *reason = "no ZONEMD records found";
+       if(verbosity >= VERB_ALGO) {
+               char zstr[255+1];
+               dname_str(z->name, zstr);
+               verbose(VERB_ALGO, "auth-zone %s ZONEMD failed: %s", zstr, *reason);
+       }
+       return 0;
+}
+
 /** find serial number of zone or false if none */
 int
 auth_zone_get_serial(struct auth_zone* z, uint32_t* serial)
@@ -1779,7 +1969,7 @@ auth_zone_get_serial(struct auth_zone* z, uint32_t* serial)
 }
 
 /** Find auth_zone SOA and populate the values in xfr(soa values). */
-static int
+int
 xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr)
 {
        struct auth_data* apex;
@@ -1908,6 +2098,8 @@ auth_zones_cfg(struct auth_zones* az, struct config_auth* c)
        z->for_downstream = c->for_downstream;
        z->for_upstream = c->for_upstream;
        z->fallback_enabled = c->fallback_enabled;
+       z->zonemd_check = c->zonemd_check;
+       z->zonemd_reject_absence = c->zonemd_reject_absence;
        if(c->isrpz && !z->rpz){
                if(!(z->rpz = rpz_create(c))){
                        fatal_exit("Could not setup RPZ zones");
@@ -2000,7 +2192,8 @@ az_delete_deleted_zones(struct auth_zones* az)
 }
 
 int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg,
-       int setup, int* is_rpz)
+       int setup, int* is_rpz, struct module_env* env,
+       struct module_stack* mods)
 {
        struct config_auth* p;
        az_setall_deleted(az);
@@ -2016,7 +2209,7 @@ int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg,
                }
        }
        az_delete_deleted_zones(az);
-       if(!auth_zones_read_zones(az, cfg))
+       if(!auth_zones_read_zones(az, cfg, env, mods))
                return 0;
        if(setup) {
                if(!auth_zones_setup_zones(az))
@@ -4959,6 +5152,9 @@ xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env)
                lock_rw_unlock(&z->lock);
                return;
        }
+#ifdef UB_ON_WINDOWS
+       (void)unlink(zfilename); /* windows does not replace file with rename() */
+#endif
        if(rename(tmpfile, zfilename) < 0) {
                log_err("could not rename(%s, %s): %s", tmpfile, zfilename,
                        strerror(errno));
@@ -4969,6 +5165,28 @@ xfr_write_after_update(struct auth_xfer* xfr, struct module_env* env)
        lock_rw_unlock(&z->lock);
 }
 
+/** reacquire locks and structures. Starts with no locks, ends
+ * with xfr and z locks, if fail, no z lock */
+static int xfr_process_reacquire_locks(struct auth_xfer* xfr,
+       struct module_env* env, struct auth_zone** z)
+{
+       /* release xfr lock, then, while holding az->lock grab both
+        * z->lock and xfr->lock */
+       lock_rw_rdlock(&env->auth_zones->lock);
+       *z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen,
+               xfr->dclass);
+       if(!*z) {
+               lock_rw_unlock(&env->auth_zones->lock);
+               lock_basic_lock(&xfr->lock);
+               *z = NULL;
+               return 0;
+       }
+       lock_rw_wrlock(&(*z)->lock);
+       lock_basic_lock(&xfr->lock);
+       lock_rw_unlock(&env->auth_zones->lock);
+       return 1;
+}
+
 /** process chunk list and update zone in memory,
  * return false if it did not work */
 static int
@@ -4978,21 +5196,12 @@ xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env,
        struct auth_zone* z;
 
        /* obtain locks and structures */
-       /* release xfr lock, then, while holding az->lock grab both
-        * z->lock and xfr->lock */
        lock_basic_unlock(&xfr->lock);
-       lock_rw_rdlock(&env->auth_zones->lock);
-       z = auth_zone_find(env->auth_zones, xfr->name, xfr->namelen,
-               xfr->dclass);
-       if(!z) {
-               lock_rw_unlock(&env->auth_zones->lock);
+       if(!xfr_process_reacquire_locks(xfr, env, &z)) {
                /* the zone is gone, ignore xfr results */
-               lock_basic_lock(&xfr->lock);
                return 0;
        }
-       lock_rw_wrlock(&z->lock);
-       lock_basic_lock(&xfr->lock);
-       lock_rw_unlock(&env->auth_zones->lock);
+       /* holding xfr and z locks */
 
        /* apply data */
        if(xfr->task_transfer->master->http) {
@@ -5027,6 +5236,35 @@ xfr_process_chunk_list(struct auth_xfer* xfr, struct module_env* env,
                        " (or malformed RR)", xfr->task_transfer->master->host);
                return 0;
        }
+
+       /* release xfr lock while verifying zonemd because it may have
+        * to spawn lookups in the state machines */
+       lock_basic_unlock(&xfr->lock);
+       /* holding z lock */
+       auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 0);
+       if(z->zone_expired) {
+               char zname[256];
+               /* ZONEMD must have failed */
+               /* reacquire locks, so we hold xfr lock on exit of routine,
+                * and both xfr and z again after releasing xfr for potential
+                * state machine mesh callbacks */
+               lock_rw_unlock(&z->lock);
+               if(!xfr_process_reacquire_locks(xfr, env, &z))
+                       return 0;
+               dname_str(xfr->name, zname);
+               verbose(VERB_ALGO, "xfr from %s: ZONEMD failed for %s, transfer is failed", xfr->task_transfer->master->host, zname);
+               xfr->zone_expired = 1;
+               lock_rw_unlock(&z->lock);
+               return 0;
+       }
+       /* reacquire locks, so we hold xfr lock on exit of routine,
+        * and both xfr and z again after releasing xfr for potential
+        * state machine mesh callbacks */
+       lock_rw_unlock(&z->lock);
+       if(!xfr_process_reacquire_locks(xfr, env, &z))
+               return 0;
+       /* holding xfr and z locks */
+
        if(xfr->have_zone)
                xfr->lease_time = *env->now;
 
@@ -5188,7 +5426,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
                xfr->task_transfer->cp = outnet_comm_point_for_http(
                        env->outnet, auth_xfer_transfer_http_callback, xfr,
                        &addr, addrlen, -1, master->ssl, master->host,
-                       master->file);
+                       master->file, env->cfg);
                if(!xfr->task_transfer->cp) {
                        char zname[255+1], as[256];
                        dname_str(xfr->name, zname);
@@ -5210,7 +5448,7 @@ xfr_transfer_init_fetch(struct auth_xfer* xfr, struct module_env* env)
        /* perform AXFR/IXFR */
        /* set the packet to be written */
        /* create new ID */
-       xfr->task_transfer->id = (uint16_t)(ub_random(env->rnd)&0xffff);
+       xfr->task_transfer->id = GET_RANDOM_ID(env->rnd);
        xfr_create_ixfr_packet(xfr, env->scratch_buffer,
                xfr->task_transfer->id, master);
 
@@ -6060,7 +6298,7 @@ xfr_probe_send_probe(struct auth_xfer* xfr, struct module_env* env,
        /* create new ID for new probes, but not on timeout retries,
         * this means we'll accept replies to previous retries to same ip */
        if(timeout == AUTH_PROBE_TIMEOUT)
-               xfr->task_probe->id = (uint16_t)(ub_random(env->rnd)&0xffff);
+               xfr->task_probe->id = GET_RANDOM_ID(env->rnd);
        xfr_create_soa_probe_packet(xfr, env->scratch_buffer, 
                xfr->task_probe->id);
        /* we need to remove the cp if we have a different ip4/ip6 type now */
@@ -6933,12 +7171,14 @@ xfer_set_masters(struct auth_master** list, struct config_auth* c,
        if(with_http)
          for(p = c->urls; p; p = p->next) {
                m = auth_master_new(&list);
+               if(!m) return 0;
                m->http = 1;
                if(!parse_url(p->str, &m->host, &m->file, &m->port, &m->ssl))
                        return 0;
        }
        for(p = c->masters; p; p = p->next) {
                m = auth_master_new(&list);
+               if(!m) return 0;
                m->ixfr = 1; /* this flag is not configurable */
                m->host = strdup(p->str);
                if(!m->host) {
@@ -6948,6 +7188,7 @@ xfer_set_masters(struct auth_master** list, struct config_auth* c,
        }
        for(p = c->allow_notify; p; p = p->next) {
                m = auth_master_new(&list);
+               if(!m) return 0;
                m->allow_notify = 1;
                m->host = strdup(p->str);
                if(!m->host) {
@@ -6972,3 +7213,1131 @@ compare_serial(uint32_t a, uint32_t b)
                return 1;
        }
 }
+
+int zonemd_hashalgo_supported(int hashalgo)
+{
+       if(hashalgo == ZONEMD_ALGO_SHA384) return 1;
+       if(hashalgo == ZONEMD_ALGO_SHA512) return 1;
+       return 0;
+}
+
+int zonemd_scheme_supported(int scheme)
+{
+       if(scheme == ZONEMD_SCHEME_SIMPLE) return 1;
+       return 0;
+}
+
+/** initialize hash for hashing with zonemd hash algo */
+static struct secalgo_hash* zonemd_digest_init(int hashalgo, char** reason)
+{
+       struct secalgo_hash *h;
+       if(hashalgo == ZONEMD_ALGO_SHA384) {
+               /* sha384 */
+               h = secalgo_hash_create_sha384();
+               if(!h)
+                       *reason = "digest sha384 could not be created";
+               return h;
+       } else if(hashalgo == ZONEMD_ALGO_SHA512) {
+               /* sha512 */
+               h = secalgo_hash_create_sha512();
+               if(!h)
+                       *reason = "digest sha512 could not be created";
+               return h;
+       }
+       /* unknown hash algo */
+       *reason = "unsupported algorithm";
+       return NULL;
+}
+
+/** update the hash for zonemd */
+static int zonemd_digest_update(int hashalgo, struct secalgo_hash* h,
+       uint8_t* data, size_t len, char** reason)
+{
+       if(hashalgo == ZONEMD_ALGO_SHA384) {
+               if(!secalgo_hash_update(h, data, len)) {
+                       *reason = "digest sha384 failed";
+                       return 0;
+               }
+               return 1;
+       } else if(hashalgo == ZONEMD_ALGO_SHA512) {
+               if(!secalgo_hash_update(h, data, len)) {
+                       *reason = "digest sha512 failed";
+                       return 0;
+               }
+               return 1;
+       }
+       /* unknown hash algo */
+       *reason = "unsupported algorithm";
+       return 0;
+}
+
+/** finish the hash for zonemd */
+static int zonemd_digest_finish(int hashalgo, struct secalgo_hash* h,
+       uint8_t* result, size_t hashlen, size_t* resultlen, char** reason)
+{
+       if(hashalgo == ZONEMD_ALGO_SHA384) {
+               if(hashlen < 384/8) {
+                       *reason = "digest buffer too small for sha384";
+                       return 0;
+               }
+               if(!secalgo_hash_final(h, result, hashlen, resultlen)) {
+                       *reason = "digest sha384 finish failed";
+                       return 0;
+               }
+               return 1;
+       } else if(hashalgo == ZONEMD_ALGO_SHA512) {
+               if(hashlen < 512/8) {
+                       *reason = "digest buffer too small for sha512";
+                       return 0;
+               }
+               if(!secalgo_hash_final(h, result, hashlen, resultlen)) {
+                       *reason = "digest sha512 finish failed";
+                       return 0;
+               }
+               return 1;
+       }
+       /* unknown algo */
+       *reason = "unsupported algorithm";
+       return 0;
+}
+
+/** add rrsets from node to the list */
+static size_t authdata_rrsets_to_list(struct auth_rrset** array,
+       size_t arraysize, struct auth_rrset* first)
+{
+       struct auth_rrset* rrset = first;
+       size_t num = 0;
+       while(rrset) {
+               if(num >= arraysize)
+                       return num;
+               array[num] = rrset;
+               num++;
+               rrset = rrset->next;
+       }
+       return num;
+}
+
+/** compare rr list entries */
+static int rrlist_compare(const void* arg1, const void* arg2)
+{
+       struct auth_rrset* r1 = *(struct auth_rrset**)arg1;
+       struct auth_rrset* r2 = *(struct auth_rrset**)arg2;
+       uint16_t t1, t2;
+       if(r1 == NULL) t1 = LDNS_RR_TYPE_RRSIG;
+       else t1 = r1->type;
+       if(r2 == NULL) t2 = LDNS_RR_TYPE_RRSIG;
+       else t2 = r2->type;
+       if(t1 < t2)
+               return -1;
+       if(t1 > t2)
+               return 1;
+       return 0;
+}
+
+/** add type RRSIG to rr list if not one there already,
+ * this is to perform RRSIG collate processing at that point. */
+static void addrrsigtype_if_needed(struct auth_rrset** array,
+       size_t arraysize, size_t* rrnum, struct auth_data* node)
+{
+       if(az_domain_rrset(node, LDNS_RR_TYPE_RRSIG))
+               return; /* already one there */
+       if((*rrnum) >= arraysize)
+               return; /* array too small? */
+       array[*rrnum] = NULL; /* nothing there, but need entry in list */
+       (*rrnum)++;
+}
+
+/** collate the RRs in an RRset using the simple scheme */
+static int zonemd_simple_rrset(struct auth_zone* z, int hashalgo,
+       struct secalgo_hash* h, struct auth_data* node,
+       struct auth_rrset* rrset, struct regional* region,
+       struct sldns_buffer* buf, char** reason)
+{
+       /* canonicalize */
+       struct ub_packed_rrset_key key;
+       memset(&key, 0, sizeof(key));
+       key.entry.key = &key;
+       key.entry.data = rrset->data;
+       key.rk.dname = node->name;
+       key.rk.dname_len = node->namelen;
+       key.rk.type = htons(rrset->type);
+       key.rk.rrset_class = htons(z->dclass);
+       if(!rrset_canonicalize_to_buffer(region, buf, &key)) {
+               *reason = "out of memory";
+               return 0;
+       }
+       regional_free_all(region);
+
+       /* hash */
+       if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf),
+               sldns_buffer_limit(buf), reason)) {
+               return 0;
+       }
+       return 1;
+}
+
+/** count number of RRSIGs in a domain name rrset list */
+static size_t zonemd_simple_count_rrsig(struct auth_rrset* rrset,
+       struct auth_rrset** rrlist, size_t rrnum,
+       struct auth_zone* z, struct auth_data* node)
+{
+       size_t i, count = 0;
+       if(rrset) {
+               size_t j;
+               for(j = 0; j<rrset->data->count; j++) {
+                       if(rrsig_rdata_get_type_covered(rrset->data->
+                               rr_data[j], rrset->data->rr_len[j]) ==
+                               LDNS_RR_TYPE_ZONEMD &&
+                               query_dname_compare(z->name, node->name)==0) {
+                               /* omit RRSIGs over type ZONEMD at apex */
+                               continue;
+                       }
+                       count++;
+               }
+       }
+       for(i=0; i<rrnum; i++) {
+               if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD &&
+                       query_dname_compare(z->name, node->name)==0) {
+                       /* omit RRSIGs over type ZONEMD at apex */
+                       continue;
+               }
+               count += (rrlist[i]?rrlist[i]->data->rrsig_count:0);
+       }
+       return count;
+}
+
+/** allocate sparse rrset data for the number of entries in tepm region */
+static int zonemd_simple_rrsig_allocs(struct regional* region,
+       struct packed_rrset_data* data, size_t count)
+{
+       data->rr_len = regional_alloc(region, sizeof(*data->rr_len) * count);
+       if(!data->rr_len) {
+               return 0;
+       }
+       data->rr_ttl = regional_alloc(region, sizeof(*data->rr_ttl) * count);
+       if(!data->rr_ttl) {
+               return 0;
+       }
+       data->rr_data = regional_alloc(region, sizeof(*data->rr_data) * count);
+       if(!data->rr_data) {
+               return 0;
+       }
+       return 1;
+}
+
+/** add the RRSIGs from the rrs in the domain into the data */
+static void add_rrlist_rrsigs_into_data(struct packed_rrset_data* data,
+       size_t* done, struct auth_rrset** rrlist, size_t rrnum,
+       struct auth_zone* z, struct auth_data* node)
+{
+       size_t i;
+       for(i=0; i<rrnum; i++) {
+               size_t j;
+               if(!rrlist[i])
+                       continue;
+               if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD &&
+                       query_dname_compare(z->name, node->name)==0) {
+                       /* omit RRSIGs over type ZONEMD at apex */
+                       continue;
+               }
+               for(j = 0; j<rrlist[i]->data->rrsig_count; j++) {
+                       data->rr_len[*done] = rrlist[i]->data->rr_len[rrlist[i]->data->count + j];
+                       data->rr_ttl[*done] = rrlist[i]->data->rr_ttl[rrlist[i]->data->count + j];
+                       /* reference the rdata in the rrset, no need to
+                        * copy it, it is no longer needed at the end of
+                        * the routine */
+                       data->rr_data[*done] = rrlist[i]->data->rr_data[rrlist[i]->data->count + j];
+                       (*done)++;
+               }
+       }
+}
+
+static void add_rrset_into_data(struct packed_rrset_data* data,
+       size_t* done, struct auth_rrset* rrset,
+       struct auth_zone* z, struct auth_data* node)
+{
+       if(rrset) {
+               size_t j;
+               for(j = 0; j<rrset->data->count; j++) {
+                       if(rrsig_rdata_get_type_covered(rrset->data->
+                               rr_data[j], rrset->data->rr_len[j]) ==
+                               LDNS_RR_TYPE_ZONEMD &&
+                               query_dname_compare(z->name, node->name)==0) {
+                               /* omit RRSIGs over type ZONEMD at apex */
+                               continue;
+                       }
+                       data->rr_len[*done] = rrset->data->rr_len[j];
+                       data->rr_ttl[*done] = rrset->data->rr_ttl[j];
+                       /* reference the rdata in the rrset, no need to
+                        * copy it, it is no longer need at the end of
+                        * the routine */
+                       data->rr_data[*done] = rrset->data->rr_data[j];
+                       (*done)++;
+               }
+       }
+}
+
+/** collate the RRSIGs using the simple scheme */
+static int zonemd_simple_rrsig(struct auth_zone* z, int hashalgo,
+       struct secalgo_hash* h, struct auth_data* node,
+       struct auth_rrset* rrset, struct auth_rrset** rrlist, size_t rrnum,
+       struct regional* region, struct sldns_buffer* buf, char** reason)
+{
+       /* the rrset pointer can be NULL, this means it is type RRSIG and
+        * there is no ordinary type RRSIG there.  The RRSIGs are stored
+        * with the RRsets in their data.
+        *
+        * The RRset pointer can be nonNULL. This happens if there is
+        * no RR that is covered by the RRSIG for the domain.  Then this
+        * RRSIG RR is stored in an rrset of type RRSIG. The other RRSIGs
+        * are stored in the rrset entries for the RRs in the rr list for
+        * the domain node.  We need to collate the rrset's data, if any, and
+        * the rrlist's rrsigs */
+       /* if this is the apex, omit RRSIGs that cover type ZONEMD */
+       /* build rrsig rrset */
+       size_t done = 0;
+       struct ub_packed_rrset_key key;
+       struct packed_rrset_data data;
+       memset(&key, 0, sizeof(key));
+       memset(&data, 0, sizeof(data));
+       key.entry.key = &key;
+       key.entry.data = &data;
+       key.rk.dname = node->name;
+       key.rk.dname_len = node->namelen;
+       key.rk.type = htons(LDNS_RR_TYPE_RRSIG);
+       key.rk.rrset_class = htons(z->dclass);
+       data.count = zonemd_simple_count_rrsig(rrset, rrlist, rrnum, z, node);
+       if(!zonemd_simple_rrsig_allocs(region, &data, data.count)) {
+               *reason = "out of memory";
+               regional_free_all(region);
+               return 0;
+       }
+       /* all the RRSIGs stored in the other rrsets for this domain node */
+       add_rrlist_rrsigs_into_data(&data, &done, rrlist, rrnum, z, node);
+       /* plus the RRSIGs stored in an rrset of type RRSIG for this node */
+       add_rrset_into_data(&data, &done, rrset, z, node);
+
+       /* canonicalize */
+       if(!rrset_canonicalize_to_buffer(region, buf, &key)) {
+               *reason = "out of memory";
+               regional_free_all(region);
+               return 0;
+       }
+       regional_free_all(region);
+
+       /* hash */
+       if(!zonemd_digest_update(hashalgo, h, sldns_buffer_begin(buf),
+               sldns_buffer_limit(buf), reason)) {
+               return 0;
+       }
+       return 1;
+}
+
+/** collate a domain's rrsets using the simple scheme */
+static int zonemd_simple_domain(struct auth_zone* z, int hashalgo,
+       struct secalgo_hash* h, struct auth_data* node,
+       struct regional* region, struct sldns_buffer* buf, char** reason)
+{
+       const size_t rrlistsize = 65536;
+       struct auth_rrset* rrlist[rrlistsize];
+       size_t i, rrnum = 0;
+       /* see if the domain is out of scope, the zone origin,
+        * that would be omitted */
+       if(!dname_subdomain_c(node->name, z->name))
+               return 1; /* continue */
+       /* loop over the rrsets in ascending order. */
+       rrnum = authdata_rrsets_to_list(rrlist, rrlistsize, node->rrsets);
+       addrrsigtype_if_needed(rrlist, rrlistsize, &rrnum, node);
+       qsort(rrlist, rrnum, sizeof(*rrlist), rrlist_compare);
+       for(i=0; i<rrnum; i++) {
+               if(rrlist[i] && rrlist[i]->type == LDNS_RR_TYPE_ZONEMD &&
+                       query_dname_compare(z->name, node->name) == 0) {
+                       /* omit type ZONEMD at apex */
+                       continue;
+               }
+               if(rrlist[i] == NULL || rrlist[i]->type ==
+                       LDNS_RR_TYPE_RRSIG) {
+                       if(!zonemd_simple_rrsig(z, hashalgo, h, node,
+                               rrlist[i], rrlist, rrnum, region, buf, reason))
+                               return 0;
+               } else if(!zonemd_simple_rrset(z, hashalgo, h, node,
+                       rrlist[i], region, buf, reason)) {
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+/** collate the zone using the simple scheme */
+static int zonemd_simple_collate(struct auth_zone* z, int hashalgo,
+       struct secalgo_hash* h, struct regional* region,
+       struct sldns_buffer* buf, char** reason)
+{
+       /* our tree is sorted in canonical order, so we can just loop over
+        * the tree */
+       struct auth_data* n;
+       RBTREE_FOR(n, struct auth_data*, &z->data) {
+               if(!zonemd_simple_domain(z, hashalgo, h, n, region, buf,
+                       reason))
+                       return 0;
+       }
+       return 1;
+}
+
+int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme,
+       int hashalgo, uint8_t* hash, size_t hashlen, size_t* resultlen,
+       struct regional* region, struct sldns_buffer* buf, char** reason)
+{
+       struct secalgo_hash* h = zonemd_digest_init(hashalgo, reason);
+       if(!h) {
+               if(!*reason)
+                       *reason = "digest init fail";
+               return 0;
+       }
+       if(scheme == ZONEMD_SCHEME_SIMPLE) {
+               if(!zonemd_simple_collate(z, hashalgo, h, region, buf, reason)) {
+                       if(!*reason) *reason = "scheme simple collate fail";
+                       secalgo_hash_delete(h);
+                       return 0;
+               }
+       }
+       if(!zonemd_digest_finish(hashalgo, h, hash, hashlen, resultlen,
+               reason)) {
+               secalgo_hash_delete(h);
+               *reason = "digest finish fail";
+               return 0;
+       }
+       secalgo_hash_delete(h);
+       return 1;
+}
+
+int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme,
+       int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region,
+       struct sldns_buffer* buf, char** reason)
+{
+       uint8_t gen[512];
+       size_t genlen = 0;
+       if(!zonemd_hashalgo_supported(hashalgo)) {
+               *reason = "unsupported algorithm";
+               return 0;
+       }
+       if(!zonemd_scheme_supported(scheme)) {
+               *reason = "unsupported scheme";
+               return 0;
+       }
+       if(hashlen < 12) {
+               /* the ZONEMD draft requires digests to fail if too small */
+               *reason = "digest length too small, less than 12";
+               return 0;
+       }
+       /* generate digest */
+       if(!auth_zone_generate_zonemd_hash(z, scheme, hashalgo, gen,
+               sizeof(gen), &genlen, region, buf, reason)) {
+               /* reason filled in by zonemd hash routine */
+               return 0;
+       }
+       /* check digest length */
+       if(hashlen != genlen) {
+               *reason = "incorrect digest length";
+               if(verbosity >= VERB_ALGO) {
+                       verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d",
+                               scheme, hashalgo);
+                       log_hex("ZONEMD should be  ", gen, genlen);
+                       log_hex("ZONEMD to check is", hash, hashlen);
+               }
+               return 0;
+       }
+       /* check digest */
+       if(memcmp(hash, gen, genlen) != 0) {
+               *reason = "incorrect digest";
+               if(verbosity >= VERB_ALGO) {
+                       verbose(VERB_ALGO, "zonemd scheme=%d hashalgo=%d",
+                               scheme, hashalgo);
+                       log_hex("ZONEMD should be  ", gen, genlen);
+                       log_hex("ZONEMD to check is", hash, hashlen);
+               }
+               return 0;
+       }
+       return 1;
+}
+
+/** log auth zone message with zone name in front. */
+static void auth_zone_log(uint8_t* name, enum verbosity_value level,
+       const char* format, ...) ATTR_FORMAT(printf, 3, 4);
+static void auth_zone_log(uint8_t* name, enum verbosity_value level,
+       const char* format, ...)
+{
+       va_list args;
+       va_start(args, format);
+       if(verbosity >= level) {
+               char str[255+1];
+               char msg[MAXSYSLOGMSGLEN];
+               dname_str(name, str);
+               vsnprintf(msg, sizeof(msg), format, args);
+               verbose(level, "auth zone %s %s", str, msg);
+       }
+       va_end(args);
+}
+
+/** ZONEMD, dnssec verify the rrset with the dnskey */
+static int zonemd_dnssec_verify_rrset(struct auth_zone* z,
+       struct module_env* env, struct module_stack* mods,
+       struct ub_packed_rrset_key* dnskey, struct auth_data* node,
+       struct auth_rrset* rrset, char** why_bogus)
+{
+       struct ub_packed_rrset_key pk;
+       enum sec_status sec;
+       struct val_env* ve;
+       int m;
+       m = modstack_find(mods, "validator");
+       if(m == -1) {
+               auth_zone_log(z->name, VERB_ALGO, "zonemd dnssec verify: have "
+                       "DNSKEY chain of trust, but no validator module");
+               return 0;
+       }
+       ve = (struct val_env*)env->modinfo[m];
+
+       memset(&pk, 0, sizeof(pk));
+       pk.entry.key = &pk;
+       pk.entry.data = rrset->data;
+       pk.rk.dname = node->name;
+       pk.rk.dname_len = node->namelen;
+       pk.rk.type = htons(rrset->type);
+       pk.rk.rrset_class = htons(z->dclass);
+       if(verbosity >= VERB_ALGO) {
+               char typestr[32];
+               typestr[0]=0;
+               sldns_wire2str_type_buf(rrset->type, typestr, sizeof(typestr));
+               auth_zone_log(z->name, VERB_ALGO,
+                       "zonemd: verify %s RRset with DNSKEY", typestr);
+       }
+       sec = dnskeyset_verify_rrset(env, ve, &pk, dnskey, NULL, why_bogus,
+               LDNS_SECTION_ANSWER, NULL);
+       if(sec == sec_status_secure) {
+               return 1;
+       }
+       if(why_bogus)
+               auth_zone_log(z->name, VERB_ALGO, "DNSSEC verify was bogus: %s", *why_bogus);
+       return 0;
+}
+
+/** check for nsec3, the RR with params equal, if bitmap has the type */
+static int nsec3_of_param_has_type(struct auth_rrset* nsec3, int algo,
+       size_t iter, uint8_t* salt, size_t saltlen, uint16_t rrtype)
+{
+       int i, count = (int)nsec3->data->count;
+       struct ub_packed_rrset_key pk;
+       memset(&pk, 0, sizeof(pk));
+       pk.entry.data = nsec3->data;
+       for(i=0; i<count; i++) {
+               int rralgo;
+               size_t rriter, rrsaltlen;
+               uint8_t* rrsalt;
+               if(!nsec3_get_params(&pk, i, &rralgo, &rriter, &rrsalt,
+                       &rrsaltlen))
+                       continue; /* no parameters, malformed */
+               if(rralgo != algo || rriter != iter || rrsaltlen != saltlen)
+                       continue; /* different parameters */
+               if(saltlen != 0) {
+                       if(rrsalt == NULL || salt == NULL)
+                               continue;
+                       if(memcmp(rrsalt, salt, saltlen) != 0)
+                               continue; /* different salt parameters */
+               }
+               if(nsec3_has_type(&pk, i, rrtype))
+                       return 1;
+       }
+       return 0;
+}
+
+/** Verify the absence of ZONEMD with DNSSEC by checking NSEC, NSEC3 type flag.
+ * return false on failure, reason contains description of failure. */
+static int zonemd_check_dnssec_absence(struct auth_zone* z,
+       struct module_env* env, struct module_stack* mods,
+       struct ub_packed_rrset_key* dnskey, struct auth_data* apex,
+       char** reason, char** why_bogus)
+{
+       struct auth_rrset* nsec = NULL;
+       if(!apex) {
+               *reason = "zone has no apex domain but ZONEMD missing";
+               return 0;
+       }
+       nsec = az_domain_rrset(apex, LDNS_RR_TYPE_NSEC);
+       if(nsec) {
+               struct ub_packed_rrset_key pk;
+               /* dnssec verify the NSEC */
+               if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex,
+                       nsec, why_bogus)) {
+                       *reason = "DNSSEC verify failed for NSEC RRset";
+                       return 0;
+               }
+               /* check type bitmap */
+               memset(&pk, 0, sizeof(pk));
+               pk.entry.data = nsec->data;
+               if(nsec_has_type(&pk, LDNS_RR_TYPE_ZONEMD)) {
+                       *reason = "DNSSEC NSEC bitmap says type ZONEMD exists";
+                       return 0;
+               }
+               auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC verification of absence of ZONEMD secure");
+       } else {
+               /* NSEC3 perhaps ? */
+               int algo;
+               size_t iter, saltlen;
+               uint8_t* salt;
+               struct auth_rrset* nsec3param = az_domain_rrset(apex,
+                       LDNS_RR_TYPE_NSEC3PARAM);
+               struct auth_data* match;
+               struct auth_rrset* nsec3;
+               if(!nsec3param) {
+                       *reason = "zone has no NSEC information but ZONEMD missing";
+                       return 0;
+               }
+               if(!az_nsec3_param(z, &algo, &iter, &salt, &saltlen)) {
+                       *reason = "zone has no NSEC information but ZONEMD missing";
+                       return 0;
+               }
+               /* find the NSEC3 record */
+               match = az_nsec3_find_exact(z, z->name, z->namelen, algo,
+                       iter, salt, saltlen);
+               if(!match) {
+                       *reason = "zone has no NSEC3 domain for the apex but ZONEMD missing";
+                       return 0;
+               }
+               nsec3 = az_domain_rrset(match, LDNS_RR_TYPE_NSEC3);
+               if(!nsec3) {
+                       *reason = "zone has no NSEC3 RRset for the apex but ZONEMD missing";
+                       return 0;
+               }
+               /* dnssec verify the NSEC3 */
+               if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, match,
+                       nsec3, why_bogus)) {
+                       *reason = "DNSSEC verify failed for NSEC3 RRset";
+                       return 0;
+               }
+               /* check type bitmap */
+               if(nsec3_of_param_has_type(nsec3, algo, iter, salt, saltlen,
+                       LDNS_RR_TYPE_ZONEMD)) {
+                       *reason = "DNSSEC NSEC3 bitmap says type ZONEMD exists";
+                       return 0;
+               }
+               auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC NSEC3 verification of absence of ZONEMD secure");
+       }
+
+       return 1;
+}
+
+/** Verify the SOA and ZONEMD DNSSEC signatures.
+ * return false on failure, reason contains description of failure. */
+static int zonemd_check_dnssec_soazonemd(struct auth_zone* z,
+       struct module_env* env, struct module_stack* mods,
+       struct ub_packed_rrset_key* dnskey, struct auth_data* apex,
+       struct auth_rrset* zonemd_rrset, char** reason, char** why_bogus)
+{
+       struct auth_rrset* soa;
+       if(!apex) {
+               *reason = "zone has no apex domain";
+               return 0;
+       }
+       soa = az_domain_rrset(apex, LDNS_RR_TYPE_SOA);
+       if(!soa) {
+               *reason = "zone has no SOA RRset";
+               return 0;
+       }
+       if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex, soa,
+               why_bogus)) {
+               *reason = "DNSSEC verify failed for SOA RRset";
+               return 0;
+       }
+       if(!zonemd_dnssec_verify_rrset(z, env, mods, dnskey, apex,
+               zonemd_rrset, why_bogus)) {
+               *reason = "DNSSEC verify failed for ZONEMD RRset";
+               return 0;
+       }
+       auth_zone_log(z->name, VERB_ALGO, "zonemd DNSSEC verification of SOA and ZONEMD RRsets secure");
+       return 1;
+}
+
+/**
+ * Fail the ZONEMD verification.
+ * @param z: auth zone that fails.
+ * @param env: environment with config, to ignore failure or not.
+ * @param reason: failure string description.
+ * @param why_bogus: failure string for DNSSEC verification failure.
+ * @param result: strdup result in here if not NULL.
+ */
+static void auth_zone_zonemd_fail(struct auth_zone* z, struct module_env* env,
+       char* reason, char* why_bogus, char** result)
+{
+       char zstr[255+1];
+       /* if fail: log reason, and depending on config also take action
+        * and drop the zone, eg. it is gone from memory, set zone_expired */
+       dname_str(z->name, zstr);
+       if(!reason) reason = "verification failed";
+       if(result) {
+               if(why_bogus) {
+                       char res[1024];
+                       snprintf(res, sizeof(res), "%s: %s", reason,
+                               why_bogus);
+                       *result = strdup(res);
+               } else {
+                       *result = strdup(reason);
+               }
+               if(!*result) log_err("out of memory");
+       } else {
+               log_warn("auth zone %s: ZONEMD verification failed: %s", zstr, reason);
+       }
+
+       if(env->cfg->zonemd_permissive_mode) {
+               verbose(VERB_ALGO, "zonemd-permissive-mode enabled, "
+                       "not blocking zone %s", zstr);
+               return;
+       }
+
+       /* expired means the zone gives servfail and is not used by
+        * lookup if fallback_enabled*/
+       z->zone_expired = 1;
+}
+
+/**
+ * Verify the zonemd with DNSSEC and hash check, with given key.
+ * @param z: auth zone.
+ * @param env: environment with config and temp buffers.
+ * @param mods: module stack with validator env for verification.
+ * @param dnskey: dnskey that we can use, or NULL.  If nonnull, the key
+ *     has been verified and is the start of the chain of trust.
+ * @param is_insecure: if true, the dnskey is not used, the zone is insecure.
+ *     And dnssec is not used.  It is DNSSEC secure insecure or not under
+ *     a trust anchor.
+ * @param result: if not NULL result reason copied here.
+ */
+static void
+auth_zone_verify_zonemd_with_key(struct auth_zone* z, struct module_env* env,
+       struct module_stack* mods, struct ub_packed_rrset_key* dnskey,
+       int is_insecure, char** result)
+{
+       char* reason = NULL, *why_bogus = NULL;
+       struct auth_data* apex = NULL;
+       struct auth_rrset* zonemd_rrset = NULL;
+       int zonemd_absent = 0, zonemd_absence_dnssecok = 0;
+
+       /* see if ZONEMD is present or absent. */
+       apex = az_find_name(z, z->name, z->namelen);
+       if(!apex) {
+               zonemd_absent = 1;
+       } else {
+               zonemd_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_ZONEMD);
+               if(!zonemd_rrset || zonemd_rrset->data->count==0) {
+                       zonemd_absent = 1;
+                       zonemd_rrset = NULL;
+               }
+       }
+
+       /* if no DNSSEC, done. */
+       /* if no ZONEMD, and DNSSEC, use DNSKEY to verify NSEC or NSEC3 for
+        * zone apex.  Check ZONEMD bit is turned off or else fail */
+       /* if ZONEMD, and DNSSEC, check DNSSEC signature on SOA and ZONEMD,
+        * or else fail */
+       if(!dnskey && !is_insecure) {
+               auth_zone_zonemd_fail(z, env, "DNSKEY missing", NULL, result);
+               return;
+       } else if(!zonemd_rrset && dnskey && !is_insecure) {
+               /* fetch, DNSSEC verify, and check NSEC/NSEC3 */
+               if(!zonemd_check_dnssec_absence(z, env, mods, dnskey, apex,
+                       &reason, &why_bogus)) {
+                       auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
+                       return;
+               }
+               zonemd_absence_dnssecok = 1;
+       } else if(zonemd_rrset && dnskey && !is_insecure) {
+               /* check DNSSEC verify of SOA and ZONEMD */
+               if(!zonemd_check_dnssec_soazonemd(z, env, mods, dnskey, apex,
+                       zonemd_rrset, &reason, &why_bogus)) {
+                       auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
+                       return;
+               }
+       }
+
+       if(zonemd_absent && z->zonemd_reject_absence) {
+               auth_zone_zonemd_fail(z, env, "ZONEMD absent and that is not allowed by config", NULL, result);
+               return;
+       }
+       if(zonemd_absent && zonemd_absence_dnssecok) {
+               auth_zone_log(z->name, VERB_ALGO, "DNSSEC verified nonexistence of ZONEMD");
+               if(result) {
+                       *result = strdup("DNSSEC verified nonexistence of ZONEMD");
+                       if(!*result) log_err("out of memory");
+               }
+               return;
+       }
+       if(zonemd_absent) {
+               auth_zone_log(z->name, VERB_ALGO, "no ZONEMD present");
+               if(result) {
+                       *result = strdup("no ZONEMD present");
+                       if(!*result) log_err("out of memory");
+               }
+               return;
+       }
+
+       /* check ZONEMD checksum and report or else fail. */
+       if(!auth_zone_zonemd_check_hash(z, env, &reason)) {
+               auth_zone_zonemd_fail(z, env, reason, NULL, result);
+               return;
+       }
+
+       /* success! log the success */
+       auth_zone_log(z->name, VERB_ALGO, "ZONEMD verification successful");
+       if(result) {
+               *result = strdup("ZONEMD verification successful");
+               if(!*result) log_err("out of memory");
+       }
+}
+
+/**
+ * verify the zone DNSKEY rrset from the trust anchor
+ * This is possible because the anchor is for the zone itself, and can
+ * thus apply straight to the zone DNSKEY set.
+ * @param z: the auth zone.
+ * @param env: environment with time and temp buffers.
+ * @param mods: module stack for validator environment for dnssec validation.
+ * @param anchor: trust anchor to use
+ * @param is_insecure: returned, true if the zone is securely insecure.
+ * @param why_bogus: if the routine fails, returns the failure reason.
+ * @param keystorage: where to store the ub_packed_rrset_key that is created
+ *     on success. A pointer to it is returned on success.
+ * @return the dnskey RRset, reference to zone data and keystorage, or
+ *     NULL on failure.
+ */
+static struct ub_packed_rrset_key*
+zonemd_get_dnskey_from_anchor(struct auth_zone* z, struct module_env* env,
+       struct module_stack* mods, struct trust_anchor* anchor,
+       int* is_insecure, char** why_bogus,
+       struct ub_packed_rrset_key* keystorage)
+{
+       struct auth_data* apex;
+       struct auth_rrset* dnskey_rrset;
+       enum sec_status sec;
+       struct val_env* ve;
+       int m;
+
+       apex = az_find_name(z, z->name, z->namelen);
+       if(!apex) {
+               *why_bogus = "have trust anchor, but zone has no apex domain for DNSKEY";
+               return 0;
+       }
+       dnskey_rrset = az_domain_rrset(apex, LDNS_RR_TYPE_DNSKEY);
+       if(!dnskey_rrset || dnskey_rrset->data->count==0) {
+               *why_bogus = "have trust anchor, but zone has no DNSKEY";
+               return 0;
+       }
+
+       m = modstack_find(mods, "validator");
+       if(m == -1) {
+               *why_bogus = "have trust anchor, but no validator module";
+               return 0;
+       }
+       ve = (struct val_env*)env->modinfo[m];
+
+       memset(keystorage, 0, sizeof(*keystorage));
+       keystorage->entry.key = keystorage;
+       keystorage->entry.data = dnskey_rrset->data;
+       keystorage->rk.dname = apex->name;
+       keystorage->rk.dname_len = apex->namelen;
+       keystorage->rk.type = htons(LDNS_RR_TYPE_DNSKEY);
+       keystorage->rk.rrset_class = htons(z->dclass);
+       auth_zone_log(z->name, VERB_QUERY,
+               "zonemd: verify DNSKEY RRset with trust anchor");
+       sec = val_verify_DNSKEY_with_TA(env, ve, keystorage, anchor->ds_rrset,
+               anchor->dnskey_rrset, NULL, why_bogus, NULL);
+       regional_free_all(env->scratch);
+       if(sec == sec_status_secure) {
+               /* success */
+               *is_insecure = 0;
+               return keystorage;
+       } else if(sec == sec_status_insecure) {
+               /* insecure */
+               *is_insecure = 1;
+       } else {
+               /* bogus */
+               *is_insecure = 0;
+               auth_zone_log(z->name, VERB_ALGO,
+                       "zonemd: verify DNSKEY RRset with trust anchor failed: %s", *why_bogus);
+       }
+       return NULL;
+}
+
+/** callback for ZONEMD lookup of DNSKEY */
+void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode, sldns_buffer* buf,
+       enum sec_status sec, char* why_bogus, int ATTR_UNUSED(was_ratelimited))
+{
+       struct auth_zone* z = (struct auth_zone*)arg;
+       struct module_env* env;
+       char* reason = NULL;
+       struct ub_packed_rrset_key* dnskey = NULL;
+       int is_insecure = 0;
+
+       lock_rw_wrlock(&z->lock);
+       env = z->zonemd_callback_env;
+       /* release the env variable so another worker can pick up the
+        * ZONEMD verification task if it wants to */
+       z->zonemd_callback_env = NULL;
+       if(!env || env->outnet->want_to_quit || z->zone_deleted) {
+               lock_rw_unlock(&z->lock);
+               return; /* stop on quit */
+       }
+
+       /* process result */
+       if(sec == sec_status_bogus) {
+               reason = why_bogus;
+               if(!reason)
+                       reason = "lookup of DNSKEY was bogus";
+               auth_zone_log(z->name, VERB_ALGO,
+                       "zonemd lookup of DNSKEY was bogus: %s", reason);
+       } else if(rcode == LDNS_RCODE_NOERROR) {
+               uint16_t wanted_qtype = LDNS_RR_TYPE_DNSKEY;
+               struct regional* temp = env->scratch;
+               struct query_info rq;
+               struct reply_info* rep;
+               memset(&rq, 0, sizeof(rq));
+               rep = parse_reply_in_temp_region(buf, temp, &rq);
+               if(rep && rq.qtype == wanted_qtype &&
+                       query_dname_compare(z->name, rq.qname) == 0 &&
+                       FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NOERROR) {
+                       /* parsed successfully */
+                       struct ub_packed_rrset_key* answer =
+                               reply_find_answer_rrset(&rq, rep);
+                       if(answer && sec == sec_status_secure) {
+                               dnskey = answer;
+                               auth_zone_log(z->name, VERB_ALGO,
+                                       "zonemd lookup of DNSKEY was secure");
+                       } else if(sec == sec_status_secure && !answer) {
+                               is_insecure = 1;
+                               auth_zone_log(z->name, VERB_ALGO,
+                                       "zonemd lookup of DNSKEY has no content, but is secure, treat as insecure");
+                       } else if(sec == sec_status_insecure) {
+                               is_insecure = 1;
+                               auth_zone_log(z->name, VERB_ALGO,
+                                       "zonemd lookup of DNSKEY was insecure");
+                       } else if(sec == sec_status_indeterminate) {
+                               is_insecure = 1;
+                               auth_zone_log(z->name, VERB_ALGO,
+                                       "zonemd lookup of DNSKEY was indeterminate, treat as insecure");
+                       } else {
+                               auth_zone_log(z->name, VERB_ALGO,
+                                       "zonemd lookup of DNSKEY has nodata");
+                               reason = "lookup of DNSKEY has nodata";
+                       }
+               } else if(rep && rq.qtype == wanted_qtype &&
+                       query_dname_compare(z->name, rq.qname) == 0 &&
+                       FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN &&
+                       sec == sec_status_secure) {
+                       /* secure nxdomain, so the zone is like some RPZ zone
+                        * that does not exist in the wider internet, with
+                        * a secure nxdomain answer outside of it. So we
+                        * treat the zonemd zone without a dnssec chain of
+                        * trust, as insecure. */
+                       is_insecure = 1;
+                       auth_zone_log(z->name, VERB_ALGO,
+                               "zonemd lookup of DNSKEY was secure NXDOMAIN, treat as insecure");
+               } else if(rep && rq.qtype == wanted_qtype &&
+                       query_dname_compare(z->name, rq.qname) == 0 &&
+                       FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN &&
+                       sec == sec_status_insecure) {
+                       is_insecure = 1;
+                       auth_zone_log(z->name, VERB_ALGO,
+                               "zonemd lookup of DNSKEY was insecure NXDOMAIN, treat as insecure");
+               } else if(rep && rq.qtype == wanted_qtype &&
+                       query_dname_compare(z->name, rq.qname) == 0 &&
+                       FLAGS_GET_RCODE(rep->flags) == LDNS_RCODE_NXDOMAIN &&
+                       sec == sec_status_indeterminate) {
+                       is_insecure = 1;
+                       auth_zone_log(z->name, VERB_ALGO,
+                               "zonemd lookup of DNSKEY was indeterminate NXDOMAIN, treat as insecure");
+               } else {
+                       auth_zone_log(z->name, VERB_ALGO,
+                               "zonemd lookup of DNSKEY has no answer");
+                       reason = "lookup of DNSKEY has no answer";
+               }
+       } else {
+               auth_zone_log(z->name, VERB_ALGO,
+                       "zonemd lookup of DNSKEY failed");
+               reason = "lookup of DNSKEY failed";
+       }
+
+       if(reason) {
+               auth_zone_zonemd_fail(z, env, reason, NULL, NULL);
+               lock_rw_unlock(&z->lock);
+               return;
+       }
+
+       auth_zone_verify_zonemd_with_key(z, env, &env->mesh->mods, dnskey,
+               is_insecure, NULL);
+       regional_free_all(env->scratch);
+       lock_rw_unlock(&z->lock);
+}
+
+/** lookup DNSKEY for ZONEMD verification */
+static int
+zonemd_lookup_dnskey(struct auth_zone* z, struct module_env* env)
+{
+       struct query_info qinfo;
+       uint16_t qflags = BIT_RD;
+       struct edns_data edns;
+       sldns_buffer* buf = env->scratch_buffer;
+
+       if(z->zonemd_callback_env) {
+               /* another worker is already working on the callback
+                * for the DNSKEY lookup for ZONEMD verification.
+                * We do not also have to do ZONEMD verification, let that
+                * worker do it */
+               auth_zone_log(z->name, VERB_ALGO,
+                       "zonemd needs lookup of DNSKEY and that already worked on by another worker");
+               return 1;
+       }
+
+       /* use mesh_new_callback to lookup the DNSKEY,
+        * and then wait for them to be looked up (in cache, or query) */
+       qinfo.qname_len = z->namelen;
+       qinfo.qname = z->name;
+       qinfo.qclass = z->dclass;
+       qinfo.qtype = LDNS_RR_TYPE_DNSKEY;
+       qinfo.local_alias = NULL;
+       if(verbosity >= VERB_ALGO) {
+               char buf1[512];
+               char buf2[LDNS_MAX_DOMAINLEN+1];
+               dname_str(z->name, buf2);
+               snprintf(buf1, sizeof(buf1), "auth zone %s: lookup DNSKEY "
+                       "for zonemd verification", buf2);
+               log_query_info(VERB_ALGO, buf1, &qinfo);
+       }
+       edns.edns_present = 1;
+       edns.ext_rcode = 0;
+       edns.edns_version = 0;
+       edns.bits = EDNS_DO;
+       edns.opt_list = NULL;
+       if(sldns_buffer_capacity(buf) < 65535)
+               edns.udp_size = (uint16_t)sldns_buffer_capacity(buf);
+       else    edns.udp_size = 65535;
+
+       /* store the worker-specific module env for the callback.
+        * We can then reference this when the callback executes */
+       z->zonemd_callback_env = env;
+       /* the callback can be called straight away */
+       lock_rw_unlock(&z->lock);
+       if(!mesh_new_callback(env->mesh, &qinfo, qflags, &edns, buf, 0,
+               &auth_zonemd_dnskey_lookup_callback, z)) {
+               lock_rw_wrlock(&z->lock);
+               log_err("out of memory lookup up dnskey for zonemd");
+               return 0;
+       }
+       lock_rw_wrlock(&z->lock);
+       return 1;
+}
+
+void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env,
+       struct module_stack* mods, char** result, int offline, int only_online)
+{
+       char* reason = NULL, *why_bogus = NULL;
+       struct trust_anchor* anchor = NULL;
+       struct ub_packed_rrset_key* dnskey = NULL;
+       struct ub_packed_rrset_key keystorage;
+       int is_insecure = 0;
+       /* verify the ZONEMD if present.
+        * If not present check if absence is allowed by DNSSEC */
+       if(!z->zonemd_check)
+               return;
+
+       /* if zone is under a trustanchor */
+       /* is it equal to trustanchor - get dnskey's verified */
+       /* else, find chain of trust by fetching DNSKEYs lookup for zone */
+       /* result if that, if insecure, means no DNSSEC for the ZONEMD,
+        * otherwise we have the zone DNSKEY for the DNSSEC verification. */
+       if(env->anchors)
+               anchor = anchors_lookup(env->anchors, z->name, z->namelen,
+                       z->dclass);
+       if(anchor && anchor->numDS == 0 && anchor->numDNSKEY == 0) {
+               /* domain-insecure trust anchor for unsigned zones */
+               lock_basic_unlock(&anchor->lock);
+               if(only_online)
+                       return;
+               dnskey = NULL;
+               is_insecure = 1;
+       } else if(anchor && query_dname_compare(z->name, anchor->name) == 0) {
+               if(only_online) {
+                       lock_basic_unlock(&anchor->lock);
+                       return;
+               }
+               /* equal to trustanchor, no need for online lookups */
+               dnskey = zonemd_get_dnskey_from_anchor(z, env, mods, anchor,
+                       &is_insecure, &why_bogus, &keystorage);
+               lock_basic_unlock(&anchor->lock);
+               if(!dnskey && !reason && !is_insecure) {
+                       reason = "verify DNSKEY RRset with trust anchor failed";
+               }
+       } else if(anchor) {
+               lock_basic_unlock(&anchor->lock);
+               /* perform online lookups */
+               if(offline)
+                       return;
+               /* setup online lookups, and wait for them */
+               if(zonemd_lookup_dnskey(z, env)) {
+                       /* wait for the lookup */
+                       return;
+               }
+               reason = "could not lookup DNSKEY for chain of trust";
+       } else {
+               /* the zone is not under a trust anchor */
+               if(only_online)
+                       return;
+               dnskey = NULL;
+               is_insecure = 1;
+       }
+
+       if(reason) {
+               auth_zone_zonemd_fail(z, env, reason, why_bogus, result);
+               return;
+       }
+
+       auth_zone_verify_zonemd_with_key(z, env, mods, dnskey, is_insecure,
+               result);
+       regional_free_all(env->scratch);
+}
+
+void auth_zones_pickup_zonemd_verify(struct auth_zones* az,
+       struct module_env* env)
+{
+       struct auth_zone key;
+       uint8_t savezname[255+1];
+       size_t savezname_len;
+       struct auth_zone* z;
+       key.node.key = &key;
+       lock_rw_rdlock(&az->lock);
+       RBTREE_FOR(z, struct auth_zone*, &az->ztree) {
+               lock_rw_wrlock(&z->lock);
+               if(!z->zonemd_check) {
+                       lock_rw_unlock(&z->lock);
+                       continue;
+               }
+               key.dclass = z->dclass;
+               key.namelabs = z->namelabs;
+               if(z->namelen > sizeof(savezname)) {
+                       lock_rw_unlock(&z->lock);
+                       log_err("auth_zones_pickup_zonemd_verify: zone name too long");
+                       continue;
+               }
+               savezname_len = z->namelen;
+               memmove(savezname, z->name, z->namelen);
+               lock_rw_unlock(&az->lock);
+               auth_zone_verify_zonemd(z, env, &env->mesh->mods, NULL, 0, 1);
+               lock_rw_unlock(&z->lock);
+               lock_rw_rdlock(&az->lock);
+               /* find the zone we had before, it is not deleted,
+                * because we have a flag for that that is processed at
+                * apply_cfg time */
+               key.namelen = savezname_len;
+               key.name = savezname;
+               z = (struct auth_zone*)rbtree_search(&az->ztree, &key);
+               if(!z)
+                       break;
+       }
+       lock_rw_unlock(&az->lock);
+}
index 3d94f30..ffe234d 100644 (file)
@@ -132,8 +132,17 @@ struct auth_zone {
        /** for upstream: this zone answers queries that unbound intends to
         * send upstream. */
        int for_upstream;
+       /** check ZONEMD records */
+       int zonemd_check;
+       /** reject absence of ZONEMD records */
+       int zonemd_reject_absence;
        /** RPZ zones */
        struct rpz* rpz;
+       /** store the env (worker thread specific) for the zonemd callbacks
+        * from the mesh with the results of the lookup, if nonNULL, some
+        * worker has already picked up the zonemd verification task and
+        * this worker does not have to do it as well. */
+       struct module_env* zonemd_callback_env;
        /** zone has been deleted */
        int zone_deleted;
        /** deletelist pointer, unused normally except during delete */
@@ -474,10 +483,13 @@ struct auth_zones* auth_zones_create(void);
  * @param cfg: config to apply.
  * @param setup: if true, also sets up values in the auth zones structure
  * @param is_rpz: set to 1 if at least one RPZ zone is configured.
+ * @param env: environment for offline verification.
+ * @param mods: modules in environment.
  * @return false on failure.
  */
 int auth_zones_apply_cfg(struct auth_zones* az, struct config_file* cfg,
-       int setup, int* is_rpz);
+       int setup, int* is_rpz, struct module_env* env,
+       struct module_stack* mods);
 
 /** initial pick up of worker timeouts, ties events to worker event loop
  * @param az: auth zones structure
@@ -625,6 +637,9 @@ int auth_zone_read_zonefile(struct auth_zone* z, struct config_file* cfg);
 /** find serial number of zone or false if none (no SOA record) */
 int auth_zone_get_serial(struct auth_zone* z, uint32_t* serial);
 
+/** Find auth_zone SOA and populate the values in xfr(soa values). */
+int xfr_find_soa(struct auth_zone* z, struct auth_xfer* xfr);
+
 /** compare auth_zones for sorted rbtree */
 int auth_zone_cmp(const void* z1, const void* z2);
 
@@ -685,4 +700,83 @@ void auth_xfer_transfer_lookup_callback(void* arg, int rcode,
  */
 int compare_serial(uint32_t a, uint32_t b);
 
+/**
+ * Generate ZONEMD digest for the auth zone.
+ * @param z: the auth zone to digest.
+ *     omits zonemd at apex and its RRSIG from the digest.
+ * @param scheme: the collation scheme to use.  Numbers as defined for ZONEMD.
+ * @param hashalgo: the hash algo, from the registry defined for ZONEMD type.
+ * @param hash: the result buffer.
+ * @param buflen: size of the result buffer, must be large enough. or the
+ *     routine fails.
+ * @param resultlen: size of the hash in the result buffer of the result.
+ * @param region: temp region for allocs during canonicalisation.
+ * @param buf: temp buffer during canonicalisation.
+ * @param reason: failure reason, returns a string, NULL on success.
+ * @return false on failure.
+ */
+int auth_zone_generate_zonemd_hash(struct auth_zone* z, int scheme,
+       int hashalgo, uint8_t* hash, size_t buflen, size_t* resultlen,
+       struct regional* region, struct sldns_buffer* buf, char** reason);
+
+/** ZONEMD scheme definitions */
+#define ZONEMD_SCHEME_SIMPLE 1
+
+/** ZONEMD hash algorithm definition for SHA384 */
+#define ZONEMD_ALGO_SHA384 1
+/** ZONEMD hash algorithm definition for SHA512 */
+#define ZONEMD_ALGO_SHA512 2
+
+/** returns true if a zonemd hash algo is supported */
+int zonemd_hashalgo_supported(int hashalgo);
+/** returns true if a zonemd scheme is supported */
+int zonemd_scheme_supported(int scheme);
+
+/**
+ * Check ZONEMD digest for the auth zone.
+ * @param z: auth zone to digest.
+ * @param scheme: zonemd scheme.
+ * @param hashalgo: zonemd hash algorithm.
+ * @param hash: the hash to check.
+ * @param hashlen: length of hash buffer.
+ * @param region: temp region for allocs during canonicalisation.
+ * @param buf: temp buffer during canonicalisation.
+ * @param reason: string returned with failure reason.
+ * @return false on failure.
+ */
+int auth_zone_generate_zonemd_check(struct auth_zone* z, int scheme,
+       int hashalgo, uint8_t* hash, size_t hashlen, struct regional* region,
+       struct sldns_buffer* buf, char** reason);
+
+/**
+ * Perform ZONEMD checks and verification for the auth zone.
+ * This includes DNSSEC verification if applicable.
+ * @param z: auth zone to check.  Caller holds lock. wrlock.
+ * @param env: with temp region, buffer and config.
+ * @param mods: module stack for validator env.
+ * @param result: if not NULL, result string strdupped in here.
+ * @param offline: if true, there is no spawned lookup when online is needed.
+ *     Those zones are skipped for ZONEMD checking.
+ * @param only_online: if true, only for ZONEMD that need online lookup
+ *     of DNSKEY chain of trust are processed.
+ */
+void auth_zone_verify_zonemd(struct auth_zone* z, struct module_env* env,
+       struct module_stack* mods, char** result, int offline,
+       int only_online);
+
+/** mesh callback for zonemd on lookup of dnskey */
+void auth_zonemd_dnskey_lookup_callback(void* arg, int rcode,
+       struct sldns_buffer* buf, enum sec_status sec, char* why_bogus,
+       int was_ratelimited);
+
+/**
+ * Check the ZONEMD records that need online DNSSEC chain lookups,
+ * for them spawn the lookup process to get it checked out.
+ * Attaches the lookup process to the worker event base and mesh state.
+ * @param az: auth zones, every zones is checked.
+ * @param env: env of the worker where the task is attached.
+ */
+void auth_zones_pickup_zonemd_verify(struct auth_zones* az,
+       struct module_env* env);
+
 #endif /* SERVICES_AUTHZONE_H */
index f3149b6..5b64fe4 100644 (file)
@@ -801,7 +801,7 @@ struct dns_msg*
 dns_cache_lookup(struct module_env* env,
        uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
        uint16_t flags, struct regional* region, struct regional* scratch,
-       int no_partial)
+       int no_partial, uint8_t* dpname, size_t dpnamelen)
 {
        struct lruhash_entry* e;
        struct query_info k;
@@ -923,6 +923,9 @@ dns_cache_lookup(struct module_env* env,
         * the same.  We search upwards for NXDOMAINs. */
        if(env->cfg->harden_below_nxdomain) {
                while(!dname_is_root(k.qname)) {
+                       if(dpname && dpnamelen
+                               && !dname_subdomain_c(k.qname, dpname))
+                               break; /* no synth nxdomain above the stub */
                        dname_remove_label(&k.qname, &k.qname_len);
                        h = query_info_hash(&k, flags);
                        e = slabhash_lookup(env->msg_cache, h, &k, 0);
index f1b77fb..bece837 100644 (file)
@@ -164,6 +164,8 @@ struct dns_msg* tomsg(struct module_env* env, struct query_info* q,
  * @param scratch: where to allocate temporary data.
  * @param no_partial: if true, only complete messages and not a partial
  *     one (with only the start of the CNAME chain and not the rest).
+ * @param dpname: if not NULL, do not return NXDOMAIN above this name.
+ * @param dpnamelen: length of dpname.
  * @return new response message (alloced in region, rrsets do not have IDs).
  *     or NULL on error or if not found in cache.
  *     TTLs are made relative to the current time.
@@ -171,7 +173,7 @@ struct dns_msg* tomsg(struct module_env* env, struct query_info* q,
 struct dns_msg* dns_cache_lookup(struct module_env* env,
        uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
        uint16_t flags, struct regional* region, struct regional* scratch,
-       int no_partial);
+       int no_partial, uint8_t* dpname, size_t dpnamelen);
 
 /** 
  * find and add A and AAAA records for missing nameservers in delegpt 
index 2d16bcd..518e696 100644 (file)
@@ -236,6 +236,9 @@ infra_create(struct config_file* cfg)
                sizeof(struct infra_cache));
        size_t maxmem = cfg->infra_cache_numhosts * (sizeof(struct infra_key)+
                sizeof(struct infra_data)+INFRA_BYTES_NAME);
+       if(!infra) {
+               return NULL;
+       }
        infra->hosts = slabhash_create(cfg->infra_cache_slabs,
                INFRA_HOST_STARTSIZE, maxmem, &infra_sizefunc, &infra_compfunc,
                &infra_delkeyfunc, &infra_deldatafunc, NULL);
index b790660..b43def5 100644 (file)
@@ -133,6 +133,16 @@ verbose_print_addr(struct addrinfo *addr)
        }
 }
 
+void
+verbose_print_unbound_socket(struct unbound_socket* ub_sock)
+{
+       if(verbosity >= VERB_ALGO) {
+               log_info("listing of unbound_socket structure:");
+               verbose_print_addr(ub_sock->addr);
+               log_info("s is: %d, fam is: %s", ub_sock->s, ub_sock->fam == AF_INET?"AF_INET":"AF_INET6");
+       }
+}
+
 #ifdef HAVE_SYSTEMD
 static int
 systemd_get_activated(int family, int socktype, int listen,
@@ -442,6 +452,10 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
        if(err != NULL)
                log_warn("error setting IP DiffServ codepoint %d on UDP socket: %s", dscp, err);
        if(family == AF_INET6) {
+# if defined(IPV6_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)
+               int omit6_set = 0;
+               int action;
+# endif
 # if defined(IPV6_V6ONLY)
                if(v6only) {
                        int val=(v6only==2)?0:1;
@@ -490,6 +504,39 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
                        return -1;
                }
 # endif /* IPv6 MTU */
+# if defined(IPV6_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)
+#  if defined(IP_PMTUDISC_OMIT)
+               action = IP_PMTUDISC_OMIT;
+               if (setsockopt(s, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
+                       &action, (socklen_t)sizeof(action)) < 0) {
+
+                       if (errno != EINVAL) {
+                               log_err("setsockopt(..., IPV6_MTU_DISCOVER, IP_PMTUDISC_OMIT...) failed: %s",
+                                       strerror(errno));
+                               sock_close(s);
+                               *noproto = 0;
+                               *inuse = 0;
+                               return -1;
+                       }
+               }
+               else
+               {
+                   omit6_set = 1;
+               }
+#  endif
+               if (omit6_set == 0) {
+                       action = IP_PMTUDISC_DONT;
+                       if (setsockopt(s, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
+                               &action, (socklen_t)sizeof(action)) < 0) {
+                               log_err("setsockopt(..., IPV6_MTU_DISCOVER, IP_PMTUDISC_DONT...) failed: %s",
+                                       strerror(errno));
+                               sock_close(s);
+                               *noproto = 0;
+                               *inuse = 0;
+                               return -1;
+                       }
+               }
+# endif /* IPV6_MTU_DISCOVER */
        } else if(family == AF_INET) {
 #  if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)
 /* linux 3.15 has IP_PMTUDISC_OMIT, Hannes Frederic Sowa made it so that
@@ -916,7 +963,7 @@ static int
 make_sock(int stype, const char* ifname, const char* port, 
        struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd,
        int* reuseport, int transparent, int tcp_mss, int nodelay, int freebind,
-       int use_systemd, int dscp)
+       int use_systemd, int dscp, struct unbound_socket* ub_sock)
 {
        struct addrinfo *res = NULL;
        int r, s, inuse, noproto;
@@ -958,7 +1005,11 @@ make_sock(int stype, const char* ifname, const char* port,
                        *noip6 = 1;
                }
        }
-       freeaddrinfo(res);
+
+       ub_sock->addr = res;
+       ub_sock->s = s;
+       ub_sock->fam = hints->ai_family;
+
        return s;
 }
 
@@ -967,7 +1018,7 @@ static int
 make_sock_port(int stype, const char* ifname, const char* port, 
        struct addrinfo *hints, int v6only, int* noip6, size_t rcv, size_t snd,
        int* reuseport, int transparent, int tcp_mss, int nodelay, int freebind,
-       int use_systemd, int dscp)
+       int use_systemd, int dscp, struct unbound_socket* ub_sock)
 {
        char* s = strchr(ifname, '@');
        if(s) {
@@ -990,11 +1041,11 @@ make_sock_port(int stype, const char* ifname, const char* port,
                p[strlen(s+1)]=0;
                return make_sock(stype, newif, p, hints, v6only, noip6, rcv,
                        snd, reuseport, transparent, tcp_mss, nodelay, freebind,
-                       use_systemd, dscp);
+                       use_systemd, dscp, ub_sock);
        }
        return make_sock(stype, ifname, port, hints, v6only, noip6, rcv, snd,
                reuseport, transparent, tcp_mss, nodelay, freebind, use_systemd,
-               dscp);
+               dscp, ub_sock);
 }
 
 /**
@@ -1002,10 +1053,11 @@ make_sock_port(int stype, const char* ifname, const char* port,
  * @param list: list head. changed.
  * @param s: fd.
  * @param ftype: if fd is UDP.
+ * @param ub_sock: socket with address.
  * @return false on failure. list in unchanged then.
  */
 static int
-port_insert(struct listen_port** list, int s, enum listen_type ftype)
+port_insert(struct listen_port** list, int s, enum listen_type ftype, struct unbound_socket* ub_sock)
 {
        struct listen_port* item = (struct listen_port*)malloc(
                sizeof(struct listen_port));
@@ -1014,6 +1066,7 @@ port_insert(struct listen_port** list, int s, enum listen_type ftype)
        item->next = *list;
        item->fd = s;
        item->ftype = ftype;
+       item->socket = ub_sock;
        *list = item;
        return 1;
 }
@@ -1043,7 +1096,7 @@ set_recvpktinfo(int s, int family)
                        return 0;
                }
 #           else
-               log_err("no IPV6_RECVPKTINFO and no IPV6_PKTINFO option, please "
+               log_err("no IPV6_RECVPKTINFO and IPV6_PKTINFO options, please "
                        "disable interface-automatic or do-ip6 in config");
                return 0;
 #           endif /* defined IPV6_RECVPKTINFO */
@@ -1093,18 +1146,6 @@ if_is_ssl(const char* ifname, const char* port, int ssl_port,
        return 0;
 }
 
-/** see if interface is https, its port number == the https port number */
-static int
-if_is_https(const char* ifname, const char* port, int https_port)
-{
-       char* p = strchr(ifname, '@');
-       if(!p && atoi(port) == https_port)
-               return 1;
-       if(p && atoi(p+1) == https_port)
-               return 1;
-       return 0;
-}
-
 /**
  * Helper for ports_open. Creates one interface (or NULL for default).
  * @param ifname: The interface ip address.
@@ -1142,6 +1183,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
        int s, noip6=0;
        int is_https = if_is_https(ifname, port, https_port);
        int nodelay = is_https && http2_nodelay;
+       struct unbound_socket* ub_sock;
 #ifdef USE_DNSCRYPT
        int is_dnscrypt = ((strchr(ifname, '@') && 
                        atoi(strchr(ifname, '@')+1) == dnscrypt_port) ||
@@ -1153,10 +1195,16 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
 
        if(!do_udp && !do_tcp)
                return 0;
+
        if(do_auto) {
+               ub_sock = calloc(1, sizeof(struct unbound_socket));
+               if(!ub_sock)
+                       return 0;
                if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1, 
                        &noip6, rcv, snd, reuseport, transparent,
-                       tcp_mss, nodelay, freebind, use_systemd, dscp)) == -1) {
+                       tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
+                       freeaddrinfo(ub_sock->addr);
+                       free(ub_sock);
                        if(noip6) {
                                log_warn("IPv6 protocol not available");
                                return 1;
@@ -1166,18 +1214,27 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                /* getting source addr packet info is highly non-portable */
                if(!set_recvpktinfo(s, hints->ai_family)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
+                       free(ub_sock);
                        return 0;
                }
                if(!port_insert(list, s,
-                  is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil)) {
+                  is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil, ub_sock)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
+                       free(ub_sock);
                        return 0;
                }
        } else if(do_udp) {
+               ub_sock = calloc(1, sizeof(struct unbound_socket));
+               if(!ub_sock)
+                       return 0;
                /* regular udp socket */
                if((s = make_sock_port(SOCK_DGRAM, ifname, port, hints, 1, 
                        &noip6, rcv, snd, reuseport, transparent,
-                       tcp_mss, nodelay, freebind, use_systemd, dscp)) == -1) {
+                       tcp_mss, nodelay, freebind, use_systemd, dscp, ub_sock)) == -1) {
+                       freeaddrinfo(ub_sock->addr);
+                       free(ub_sock);
                        if(noip6) {
                                log_warn("IPv6 protocol not available");
                                return 1;
@@ -1185,8 +1242,10 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                        return 0;
                }
                if(!port_insert(list, s,
-                  is_dnscrypt?listen_type_udp_dnscrypt:listen_type_udp)) {
+                  is_dnscrypt?listen_type_udp_dnscrypt:listen_type_udp, ub_sock)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
+                       free(ub_sock);
                        return 0;
                }
        }
@@ -1194,6 +1253,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                int is_ssl = if_is_ssl(ifname, port, ssl_port,
                        tls_additional_port);
                enum listen_type port_type;
+               ub_sock = calloc(1, sizeof(struct unbound_socket));
+               if(!ub_sock)
+                       return 0;
                if(is_ssl)
                        port_type = listen_type_ssl;
                else if(is_https)
@@ -1204,7 +1266,9 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                        port_type = listen_type_tcp;
                if((s = make_sock_port(SOCK_STREAM, ifname, port, hints, 1, 
                        &noip6, 0, 0, reuseport, transparent, tcp_mss, nodelay,
-                       freebind, use_systemd, dscp)) == -1) {
+                       freebind, use_systemd, dscp, ub_sock)) == -1) {
+                       freeaddrinfo(ub_sock->addr);
+                       free(ub_sock);
                        if(noip6) {
                                /*log_warn("IPv6 protocol not available");*/
                                return 1;
@@ -1213,8 +1277,10 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp,
                }
                if(is_ssl)
                        verbose(VERB_ALGO, "setup TCP for SSL service");
-               if(!port_insert(list, s, port_type)) {
+               if(!port_insert(list, s, port_type, ub_sock)) {
                        sock_close(s);
+                       freeaddrinfo(ub_sock->addr);
+                       free(ub_sock);
                        return 0;
                }
        }
@@ -1280,14 +1346,14 @@ listen_create(struct comm_base* base, struct listen_port* ports,
                if(ports->ftype == listen_type_udp ||
                   ports->ftype == listen_type_udp_dnscrypt)
                        cp = comm_point_create_udp(base, ports->fd, 
-                               front->udp_buff, cb, cb_arg);
+                               front->udp_buff, cb, cb_arg, ports->socket);
                else if(ports->ftype == listen_type_tcp ||
                                ports->ftype == listen_type_tcp_dnscrypt)
                        cp = comm_point_create_tcp(base, ports->fd, 
                                tcp_accept_count, tcp_idle_timeout,
                                harden_large_queries, 0, NULL,
                                tcp_conn_limit, bufsize, front->udp_buff,
-                               ports->ftype, cb, cb_arg);
+                               ports->ftype, cb, cb_arg, ports->socket);
                else if(ports->ftype == listen_type_ssl ||
                        ports->ftype == listen_type_http) {
                        cp = comm_point_create_tcp(base, ports->fd, 
@@ -1295,7 +1361,7 @@ listen_create(struct comm_base* base, struct listen_port* ports,
                                harden_large_queries,
                                http_max_streams, http_endpoint,
                                tcp_conn_limit, bufsize, front->udp_buff,
-                               ports->ftype, cb, cb_arg);
+                               ports->ftype, cb, cb_arg, ports->socket);
                        if(http_notls && ports->ftype == listen_type_http)
                                cp->ssl = NULL;
                        else
@@ -1322,7 +1388,7 @@ listen_create(struct comm_base* base, struct listen_port* ports,
                } else if(ports->ftype == listen_type_udpancil ||
                                  ports->ftype == listen_type_udpancil_dnscrypt)
                        cp = comm_point_create_udp_ancil(base, ports->fd, 
-                               front->udp_buff, cb, cb_arg);
+                               front->udp_buff, cb, cb_arg, ports->socket);
                if(!cp) {
                        log_err("can't create commpoint");      
                        listen_delete(front);
@@ -1506,13 +1572,12 @@ resolve_ifa_name(struct ifaddrs *ifas, const char *search_ifa, char ***ip_addres
 }
 #endif /* HAVE_GETIFADDRS */
 
-int resolve_interface_names(struct config_file* cfg, char*** resif,
-       int* num_resif)
+int resolve_interface_names(char** ifs, int num_ifs,
+       struct config_strlist* list, char*** resif, int* num_resif)
 {
 #ifdef HAVE_GETIFADDRS
-       int i;
        struct ifaddrs *addrs = NULL;
-       if(cfg->num_ifs == 0) {
+       if(num_ifs == 0 && list == NULL) {
                *resif = NULL;
                *num_resif = 0;
                return 1;
@@ -1523,38 +1588,73 @@ int resolve_interface_names(struct config_file* cfg, char*** resif,
                freeifaddrs(addrs);
                return 0;
        }
-       for(i=0; i<cfg->num_ifs; i++) {
-               if(!resolve_ifa_name(addrs, cfg->ifs[i], resif, num_resif)) {
-                       freeifaddrs(addrs);
-                       config_del_strarray(*resif, *num_resif);
-                       *resif = NULL;
-                       *num_resif = 0;
-                       return 0;
+       if(ifs) {
+               int i;
+               for(i=0; i<num_ifs; i++) {
+                       if(!resolve_ifa_name(addrs, ifs[i], resif, num_resif)) {
+                               freeifaddrs(addrs);
+                               config_del_strarray(*resif, *num_resif);
+                               *resif = NULL;
+                               *num_resif = 0;
+                               return 0;
+                       }
                }
        }
+       if(list) {
+               struct config_strlist* p;
+               for(p = list; p; p = p->next) {
+                       if(!resolve_ifa_name(addrs, p->str, resif, num_resif)) {
+                               freeifaddrs(addrs);
+                               config_del_strarray(*resif, *num_resif);
+                               *resif = NULL;
+                               *num_resif = 0;
+                               return 0;
+                       }
+}
+       }
        freeifaddrs(addrs);
        return 1;
 #else
-       int i;
-       if(cfg->num_ifs == 0) {
+       struct config_strlist* p;
+       if(num_ifs == 0 && list == NULL) {
                *resif = NULL;
                *num_resif = 0;
                return 1;
        }
-       *num_resif = cfg->num_ifs;
+       *num_resif = num_ifs;
+       for(p = list; p; p = p->next) {
+               (*num_resif)++;
+       }
        *resif = calloc(*num_resif, sizeof(**resif));
        if(!*resif) {
                log_err("out of memory");
                return 0;
        }
-       for(i=0; i<*num_resif; i++) {
-               (*resif)[i] = strdup(cfg->ifs[i]);
-               if(!((*resif)[i])) {
-                       log_err("out of memory");
-                       config_del_strarray(*resif, *num_resif);
-                       *resif = NULL;
-                       *num_resif = 0;
-                       return 0;
+       if(ifs) {
+               int i;
+               for(i=0; i<num_ifs; i++) {
+                       (*resif)[i] = strdup(ifs[i]);
+                       if(!((*resif)[i])) {
+                               log_err("out of memory");
+                               config_del_strarray(*resif, *num_resif);
+                               *resif = NULL;
+                               *num_resif = 0;
+                               return 0;
+                       }
+               }
+       }
+       if(list) {
+               int idx = num_ifs;
+               for(p = list; p; p = p->next) {
+                       (*resif)[idx] = strdup(p->str);
+                       if(!((*resif)[idx])) {
+                               log_err("out of memory");
+                               config_del_strarray(*resif, *num_resif);
+                               *resif = NULL;
+                               *num_resif = 0;
+                               return 0;
+                       }
+                       idx++;
                }
        }
        return 1;
@@ -1656,6 +1756,7 @@ listening_ports_open(struct config_file* cfg, char** ifs, int num_ifs,
                        }
                }
        }
+
        return list;
 }
 
@@ -1667,6 +1768,11 @@ void listening_ports_free(struct listen_port* list)
                if(list->fd != -1) {
                        sock_close(list->fd);
                }
+               /* rc_ports don't have ub_socket */
+               if(list->socket) {
+                       freeaddrinfo(list->socket->addr);
+                       free(list->socket);
+               }
                free(list);
                list = nx;
        }
@@ -2371,6 +2477,10 @@ static int http2_query_read_done(struct http2_session* h2_session,
                        "buffer already assigned to stream");
                return -1;
        }
+    
+    /* the c->buffer might be used by mesh_send_reply and no be cleard
+        * need to be cleared before use */
+       sldns_buffer_clear(h2_session->c->buffer);
        if(sldns_buffer_remaining(h2_session->c->buffer) <
                sldns_buffer_remaining(h2_stream->qbuffer)) {
                /* qbuffer will be free'd in frame close cb */
@@ -2572,18 +2682,45 @@ static int http2_buffer_uri_query(struct http2_session* h2_session,
                return 0;
        }
 
-       if(!(b64len = sldns_b64url_pton(
-               (char const *)start, length,
-               sldns_buffer_current(h2_stream->qbuffer),
-               expectb64len)) || b64len < 0) {
-               lock_basic_lock(&http2_query_buffer_count_lock);
-               http2_query_buffer_count -= expectb64len;
-               lock_basic_unlock(&http2_query_buffer_count_lock);
-               sldns_buffer_free(h2_stream->qbuffer);
-               h2_stream->qbuffer = NULL;
-               /* return without error, method can be an
-                * unknown POST */
-               return 1;
+       if(sldns_b64_contains_nonurl((char const*)start, length)) {
+               char buf[65536+4];
+               verbose(VERB_ALGO, "HTTP2 stream contains wrong b64 encoding");
+               /* copy to the scratch buffer temporarily to terminate the
+                * string with a zero */
+               if(length+1 > sizeof(buf)) {
+                       /* too long */
+                       lock_basic_lock(&http2_query_buffer_count_lock);
+                       http2_query_buffer_count -= expectb64len;
+                       lock_basic_unlock(&http2_query_buffer_count_lock);
+                       sldns_buffer_free(h2_stream->qbuffer);
+                       h2_stream->qbuffer = NULL;
+                       return 1;
+               }
+               memmove(buf, start, length);
+               buf[length] = 0;
+               if(!(b64len = sldns_b64_pton(buf, sldns_buffer_current(
+                       h2_stream->qbuffer), expectb64len)) || b64len < 0) {
+                       lock_basic_lock(&http2_query_buffer_count_lock);
+                       http2_query_buffer_count -= expectb64len;
+                       lock_basic_unlock(&http2_query_buffer_count_lock);
+                       sldns_buffer_free(h2_stream->qbuffer);
+                       h2_stream->qbuffer = NULL;
+                       return 1;
+               }
+       } else {
+               if(!(b64len = sldns_b64url_pton(
+                       (char const *)start, length,
+                       sldns_buffer_current(h2_stream->qbuffer),
+                       expectb64len)) || b64len < 0) {
+                       lock_basic_lock(&http2_query_buffer_count_lock);
+                       http2_query_buffer_count -= expectb64len;
+                       lock_basic_unlock(&http2_query_buffer_count_lock);
+                       sldns_buffer_free(h2_stream->qbuffer);
+                       h2_stream->qbuffer = NULL;
+                       /* return without error, method can be an
+                        * unknown POST */
+                       return 1;
+               }
        }
        sldns_buffer_skip(h2_stream->qbuffer, (size_t)b64len);
        return 1;
index f438ff4..1e51be9 100644 (file)
@@ -102,6 +102,18 @@ enum listen_type {
        listen_type_http
 };
 
+/*
+ * socket properties (just like NSD nsd_socket structure definition)
+ */
+struct unbound_socket {
+       /** socket-address structure */
+        struct addrinfo *       addr;
+       /** socket descriptor returned by socket() syscall */
+        int                     s;
+       /** address family (AF_INET/IF_INET6) */
+        int                     fam;
+};
+
 /**
  * Single linked list to store shared ports that have been 
  * opened for use by all threads.
@@ -113,6 +125,8 @@ struct listen_port {
        int fd;
        /** type of file descriptor, udp or tcp */
        enum listen_type ftype;
+       /** fill in unbpound_socket structure for every opened socket at Unbound startup */
+       struct unbound_socket* socket;
 };
 
 /**
@@ -136,16 +150,19 @@ struct listen_port* listening_ports_open(struct config_file* cfg,
  */
 void listening_ports_free(struct listen_port* list);
 
+struct config_strlist;
 /**
  * Resolve interface names in config and store result IP addresses
- * @param cfg: config
+ * @param ifs: array of interfaces.  The list of interface names, if not NULL.
+ * @param num_ifs: length of ifs array.
+ * @param list: if not NULL, this is used as the list of interface names.
  * @param resif: string array (malloced array of malloced strings) with
  *     result.  NULL if cfg has none.
  * @param num_resif: length of resif.  Zero if cfg has zero num_ifs.
  * @return 0 on failure.
  */
-int resolve_interface_names(struct config_file* cfg, char*** resif,
-       int* num_resif);
+int resolve_interface_names(char** ifs, int num_ifs,
+       struct config_strlist* list, char*** resif, int* num_resif);
 
 /**
  * Create commpoints with for this thread for the shared ports.
@@ -424,4 +441,9 @@ int http2_submit_dns_response(void* v);
 
 char* set_ip_dscp(int socket, int addrfamily, int ds);
 
+/** for debug and profiling purposes only
+ * @param ub_sock: the structure containing created socket info we want to print or log for
+ */
+void verbose_print_unbound_socket(struct unbound_socket* ub_sock);
+
 #endif /* LISTEN_DNSPORT_H */
index fd2ff2b..54f55ab 100644 (file)
@@ -745,9 +745,15 @@ static int
 lz_enter_zones(struct local_zones* zones, struct config_file* cfg)
 {
        struct config_str2list* p;
+#ifndef THREADS_DISABLED
        struct local_zone* z;
+#endif
        for(p = cfg->local_zones; p; p = p->next) {
-               if(!(z=lz_enter_zone(zones, p->str, p->str2, 
+               if(!(
+#ifndef THREADS_DISABLED
+                       z=
+#endif
+                       lz_enter_zone(zones, p->str, p->str2,
                        LDNS_RR_CLASS_IN)))
                        return 0;
                lock_rw_unlock(&z->lock);
@@ -1027,7 +1033,9 @@ lz_setup_implicit(struct local_zones* zones, struct config_file* cfg)
        }
        if(have_name) {
                uint8_t* n2;
+#ifndef THREADS_DISABLED
                struct local_zone* z;
+#endif
                /* allocate zone of smallest shared topdomain to contain em */
                n2 = nm;
                dname_remove_labels(&n2, &nmlen, nmlabs - match);
@@ -1039,7 +1047,11 @@ lz_setup_implicit(struct local_zones* zones, struct config_file* cfg)
                }
                log_nametypeclass(VERB_ALGO, "implicit transparent local-zone", 
                        n2, 0, dclass);
-               if(!(z=lz_enter_zone_dname(zones, n2, nmlen, match, 
+               if(!(
+#ifndef THREADS_DISABLED
+                       z=
+#endif
+                       lz_enter_zone_dname(zones, n2, nmlen, match,
                        local_zone_transparent, dclass))) {
                        return 0;
                }
index 3da5c87..b52d81d 100644 (file)
@@ -158,7 +158,7 @@ struct local_zone {
        rbtree_type data;
        /** if data contains zone apex SOA data, this is a ptr to it. */
        struct ub_packed_rrset_key* soa;
-       /** if data contains zone apex SOA data, this is a prt to an
+       /** if data contains zone apex SOA data, this is a ptr to an
         * artificial negative SOA rrset (TTL is the minimum of the TTL and the
         * SOA.MINIMUM). */
        struct ub_packed_rrset_key* soa_negative;
index 91d23de..5679a8b 100644 (file)
@@ -99,7 +99,7 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d)
 {
 #ifndef S_SPLINT_S
        size_t leftover;
-       if(d == 0) {
+       if(d <= 0) {
                avg->tv_sec = 0;
                avg->tv_usec = 0;
                return;
@@ -108,7 +108,13 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d)
        avg->tv_usec = sum->tv_usec / d;
        /* handle fraction from seconds divide */
        leftover = sum->tv_sec - avg->tv_sec*d;
-       avg->tv_usec += (leftover*1000000)/d;
+       if(leftover <= 0)
+               leftover = 0;
+       avg->tv_usec += (((long long)leftover)*((long long)1000000))/d;
+       if(avg->tv_sec < 0)
+               avg->tv_sec = 0;
+       if(avg->tv_usec < 0)
+               avg->tv_usec = 0;
 #endif
 }
 
@@ -433,7 +439,7 @@ mesh_serve_expired_init(struct mesh_state* mstate, int timeout)
        mstate->s.serve_expired_data->get_cached_answer =
                mstate->s.serve_expired_data->get_cached_answer?
                mstate->s.serve_expired_data->get_cached_answer:
-               mesh_serve_expired_lookup;
+               &mesh_serve_expired_lookup;
 
        /* In case this timer already popped, start it again */
        if(!mstate->s.serve_expired_data->timer) {
@@ -1813,8 +1819,7 @@ mesh_detect_cycle(struct module_qstate* qstate, struct query_info* qinfo,
 {
        struct mesh_area* mesh = qstate->env->mesh;
        struct mesh_state* dep_m = NULL;
-       if(!mesh_state_is_unique(qstate->mesh_info))
-               dep_m = mesh_area_find(mesh, NULL, qinfo, flags, prime, valrec);
+       dep_m = mesh_area_find(mesh, NULL, qinfo, flags, prime, valrec);
        return mesh_detect_cycle_found(qstate, dep_m);
 }
 
@@ -1941,7 +1946,7 @@ mesh_serve_expired_callback(void* arg)
        while(1) {
                fptr_ok(fptr_whitelist_serve_expired_lookup(
                        qstate->serve_expired_data->get_cached_answer));
-               msg = qstate->serve_expired_data->get_cached_answer(qstate,
+               msg = (*qstate->serve_expired_data->get_cached_answer)(qstate,
                        lookup_qinfo);
                if(!msg)
                        return;
index a600549..da8e623 100644 (file)
@@ -88,57 +88,56 @@ count_modules(const char* s)
         return num;
 }
 
-void 
+void
 modstack_init(struct module_stack* stack)
 {
        stack->num = 0;
        stack->mod = NULL;
 }
 
-int 
+int
 modstack_config(struct module_stack* stack, const char* module_conf)
 {
-        int i;
-        verbose(VERB_QUERY, "module config: \"%s\"", module_conf);
-        stack->num = count_modules(module_conf);
-        if(stack->num == 0) {
-                log_err("error: no modules specified");
-                return 0;
-        }
-        if(stack->num > MAX_MODULE) {
-                log_err("error: too many modules (%d max %d)",
-                        stack->num, MAX_MODULE);
-                return 0;
-        }
-        stack->mod = (struct module_func_block**)calloc((size_t)
-                stack->num, sizeof(struct module_func_block*));
-        if(!stack->mod) {
-                log_err("out of memory");
-                return 0;
-        }
-        for(i=0; i<stack->num; i++) {
-                stack->mod[i] = module_factory(&module_conf);
-                if(!stack->mod[i]) {
+       int i;
+       verbose(VERB_QUERY, "module config: \"%s\"", module_conf);
+       stack->num = count_modules(module_conf);
+       if(stack->num == 0) {
+               log_err("error: no modules specified");
+               return 0;
+       }
+       if(stack->num > MAX_MODULE) {
+               log_err("error: too many modules (%d max %d)",
+                       stack->num, MAX_MODULE);
+               return 0;
+       }
+       stack->mod = (struct module_func_block**)calloc((size_t)
+               stack->num, sizeof(struct module_func_block*));
+       if(!stack->mod) {
+               log_err("out of memory");
+               return 0;
+       }
+       for(i=0; i<stack->num; i++) {
+               stack->mod[i] = module_factory(&module_conf);
+               if(!stack->mod[i]) {
                        char md[256];
                        snprintf(md, sizeof(md), "%s", module_conf);
                        if(strchr(md, ' ')) *(strchr(md, ' ')) = 0;
                        if(strchr(md, '\t')) *(strchr(md, '\t')) = 0;
-                        log_err("Unknown value in module-config, module: '%s'."
+                       log_err("Unknown value in module-config, module: '%s'."
                                " This module is not present (not compiled in),"
-                               " See the list of linked modules with unbound -h",
-                                md);
-                        return 0;
-                }
-        }
-        return 1;
+                               " See the list of linked modules with unbound -V", md);
+                       return 0;
+               }
+       }
+       return 1;
 }
 
 /** The list of module names */
 const char**
 module_list_avail(void)
 {
-        /* these are the modules available */
-        static const char* names[] = {
+       /* these are the modules available */
+       static const char* names[] = {
                "dns64",
 #ifdef WITH_PYTHONMODULE
                "python",
@@ -156,7 +155,7 @@ module_list_avail(void)
                "subnetcache",
 #endif
 #ifdef USE_IPSET
-                "ipset",
+               "ipset",
 #endif
                "respip",
                "validator",
index 6c6b42c..a3f982e 100644 (file)
@@ -90,8 +90,8 @@ static int randomize_and_send_udp(struct pending* pend, sldns_buffer* packet,
 static void waiting_list_remove(struct outside_network* outnet,
        struct waiting_tcp* w);
 
-/** remove reused element from tree and lru list */
-static void reuse_tcp_remove_tree_list(struct outside_network* outnet,
+/** select a DNS ID for a TCP stream */
+static uint16_t tcp_select_id(struct outside_network* outnet,
        struct reuse_tcp* reuse);
 
 int 
@@ -198,15 +198,17 @@ waiting_tcp_delete(struct waiting_tcp* w)
  * Pick random outgoing-interface of that family, and bind it.
  * port set to 0 so OS picks a port number for us.
  * if it is the ANY address, do not bind.
+ * @param pend: pending tcp structure, for storing the local address choice.
  * @param w: tcp structure with destination address.
  * @param s: socket fd.
  * @return false on error, socket closed.
  */
 static int
-pick_outgoing_tcp(struct waiting_tcp* w, int s)
+pick_outgoing_tcp(struct pending_tcp* pend, struct waiting_tcp* w, int s)
 {
        struct port_if* pi = NULL;
        int num;
+       pend->pi = NULL;
 #ifdef INET6
        if(addr_is_ip6(&w->addr, w->addrlen))
                num = w->outnet->num_ip6;
@@ -226,6 +228,7 @@ pick_outgoing_tcp(struct waiting_tcp* w, int s)
 #endif
                pi = &w->outnet->ip4_ifs[ub_random_max(w->outnet->rnd, num)];
        log_assert(pi);
+       pend->pi = pi;
        if(addr_is_any(&pi->addr, pi->addrlen)) {
                /* binding to the ANY interface is for listening sockets */
                return 1;
@@ -235,7 +238,14 @@ pick_outgoing_tcp(struct waiting_tcp* w, int s)
                ((struct sockaddr_in6*)&pi->addr)->sin6_port = 0;
        else    ((struct sockaddr_in*)&pi->addr)->sin_port = 0;
        if(bind(s, (struct sockaddr*)&pi->addr, pi->addrlen) != 0) {
-               log_err("outgoing tcp: bind: %s", sock_strerror(errno));
+#ifndef USE_WINSOCK
+#ifdef EADDRNOTAVAIL
+               if(!(verbosity < 4 && errno == EADDRNOTAVAIL))
+#endif
+#else /* USE_WINSOCK */
+               if(!(verbosity < 4 && WSAGetLastError() == WSAEADDRNOTAVAIL))
+#endif
+                   log_err("outgoing tcp: bind: %s", sock_strerror(errno));
                sock_close(s);
                return 0;
        }
@@ -337,6 +347,8 @@ log_reuse_tcp(enum verbosity_value v, const char* msg, struct reuse_tcp* reuse)
        uint16_t port;
        char addrbuf[128];
        if(verbosity < v) return;
+       if(!reuse || !reuse->pending || !reuse->pending->c)
+               return;
        addr_to_str(&reuse->addr, reuse->addrlen, addrbuf, sizeof(addrbuf));
        port = ntohs(((struct sockaddr_in*)&reuse->addr)->sin_port);
        verbose(v, "%s %s#%u fd %d", msg, addrbuf, (unsigned)port,
@@ -356,6 +368,8 @@ static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse)
                w->write_wait_next->write_wait_prev = NULL;
        else    reuse->write_wait_last = NULL;
        w->write_wait_queued = 0;
+       w->write_wait_next = NULL;
+       w->write_wait_prev = NULL;
        return w;
 }
 
@@ -363,6 +377,8 @@ static struct waiting_tcp* reuse_write_wait_pop(struct reuse_tcp* reuse)
 static void reuse_write_wait_remove(struct reuse_tcp* reuse,
        struct waiting_tcp* w)
 {
+       log_assert(w);
+       log_assert(w->write_wait_queued);
        if(!w)
                return;
        if(!w->write_wait_queued)
@@ -370,10 +386,16 @@ static void reuse_write_wait_remove(struct reuse_tcp* reuse,
        if(w->write_wait_prev)
                w->write_wait_prev->write_wait_next = w->write_wait_next;
        else    reuse->write_wait_first = w->write_wait_next;
+       log_assert(!w->write_wait_prev ||
+               w->write_wait_prev->write_wait_next != w->write_wait_prev);
        if(w->write_wait_next)
                w->write_wait_next->write_wait_prev = w->write_wait_prev;
        else    reuse->write_wait_last = w->write_wait_prev;
+       log_assert(!w->write_wait_next
+               || w->write_wait_next->write_wait_prev != w->write_wait_next);
        w->write_wait_queued = 0;
+       w->write_wait_next = NULL;
+       w->write_wait_prev = NULL;
 }
 
 /** push the element after the last on the writewait list */
@@ -384,6 +406,8 @@ static void reuse_write_wait_push_back(struct reuse_tcp* reuse,
        log_assert(!w->write_wait_queued);
        if(reuse->write_wait_last) {
                reuse->write_wait_last->write_wait_next = w;
+               log_assert(reuse->write_wait_last->write_wait_next !=
+                       reuse->write_wait_last);
                w->write_wait_prev = reuse->write_wait_last;
        } else {
                reuse->write_wait_first = w;
@@ -396,9 +420,18 @@ static void reuse_write_wait_push_back(struct reuse_tcp* reuse,
 void
 reuse_tree_by_id_insert(struct reuse_tcp* reuse, struct waiting_tcp* w)
 {
+#ifdef UNBOUND_DEBUG
+       rbnode_type* added;
+#endif
        log_assert(w->id_node.key == NULL);
        w->id_node.key = w;
+#ifdef UNBOUND_DEBUG
+       added =
+#else
+       (void)
+#endif
        rbtree_insert(&reuse->tree_by_id, &w->id_node);
+       log_assert(added);  /* should have been added */
 }
 
 /** find element in tree by id */
@@ -424,34 +457,45 @@ tree_by_id_get_id(rbnode_type* node)
 }
 
 /** insert into reuse tcp tree and LRU, false on failure (duplicate) */
-static int
+int
 reuse_tcp_insert(struct outside_network* outnet, struct pending_tcp* pend_tcp)
 {
        log_reuse_tcp(VERB_CLIENT, "reuse_tcp_insert", &pend_tcp->reuse);
        if(pend_tcp->reuse.item_on_lru_list) {
                if(!pend_tcp->reuse.node.key)
-                       log_err("internal error: reuse_tcp_insert: on lru list without key");
+                       log_err("internal error: reuse_tcp_insert: "
+                               "in lru list without key");
                return 1;
        }
        pend_tcp->reuse.node.key = &pend_tcp->reuse;
        pend_tcp->reuse.pending = pend_tcp;
        if(!rbtree_insert(&outnet->tcp_reuse, &pend_tcp->reuse.node)) {
-               /* this is a duplicate connection, close this one */
-               verbose(VERB_CLIENT, "reuse_tcp_insert: duplicate connection");
-               pend_tcp->reuse.node.key = NULL;
-               return 0;
+               /* We are not in the LRU list but we are already in the
+                * tcp_reuse tree, strange.
+                * Continue to add ourselves to the LRU list. */
+               log_err("internal error: reuse_tcp_insert: in lru list but "
+                       "not in the tree");
        }
        /* insert into LRU, first is newest */
        pend_tcp->reuse.lru_prev = NULL;
        if(outnet->tcp_reuse_first) {
                pend_tcp->reuse.lru_next = outnet->tcp_reuse_first;
+               log_assert(pend_tcp->reuse.lru_next != &pend_tcp->reuse);
                outnet->tcp_reuse_first->lru_prev = &pend_tcp->reuse;
+               log_assert(outnet->tcp_reuse_first->lru_prev !=
+                       outnet->tcp_reuse_first);
        } else {
                pend_tcp->reuse.lru_next = NULL;
                outnet->tcp_reuse_last = &pend_tcp->reuse;
        }
        outnet->tcp_reuse_first = &pend_tcp->reuse;
        pend_tcp->reuse.item_on_lru_list = 1;
+       log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) ||
+               (outnet->tcp_reuse_first && outnet->tcp_reuse_last));
+       log_assert(outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_next &&
+               outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_prev);
+       log_assert(outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_next &&
+               outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_prev);
        return 1;
 }
 
@@ -511,7 +555,7 @@ reuse_tcp_find(struct outside_network* outnet, struct sockaddr_storage* addr,
        while(result && result != RBTREE_NULL &&
                reuse_cmp_addrportssl(result->key, &key_p.reuse) == 0) {
                if(((struct reuse_tcp*)result)->tree_by_id.count <
-                       MAX_REUSE_TCP_QUERIES) {
+                       outnet->max_reuse_tcp_queries) {
                        /* same address, port, ssl-yes-or-no, and has
                         * space for another query */
                        return (struct reuse_tcp*)result;
@@ -567,7 +611,7 @@ outnet_tcp_take_into_use(struct waiting_tcp* w)
        if(s == -1)
                return 0;
 
-       if(!pick_outgoing_tcp(w, s))
+       if(!pick_outgoing_tcp(pend, w, s))
                return 0;
 
        fd_set_nonblock(s);
@@ -689,28 +733,65 @@ outnet_tcp_take_into_use(struct waiting_tcp* w)
 /** Touch the lru of a reuse_tcp element, it is in use.
  * This moves it to the front of the list, where it is not likely to
  * be closed.  Items at the back of the list are closed to make space. */
-static void
+void
 reuse_tcp_lru_touch(struct outside_network* outnet, struct reuse_tcp* reuse)
 {
        if(!reuse->item_on_lru_list) {
                log_err("internal error: we need to touch the lru_list but item not in list");
                return; /* not on the list, no lru to modify */
        }
+       log_assert(reuse->lru_prev ||
+               (!reuse->lru_prev && outnet->tcp_reuse_first == reuse));
        if(!reuse->lru_prev)
                return; /* already first in the list */
        /* remove at current position */
        /* since it is not first, there is a previous element */
        reuse->lru_prev->lru_next = reuse->lru_next;
+       log_assert(reuse->lru_prev->lru_next != reuse->lru_prev);
        if(reuse->lru_next)
                reuse->lru_next->lru_prev = reuse->lru_prev;
        else    outnet->tcp_reuse_last = reuse->lru_prev;
+       log_assert(!reuse->lru_next || reuse->lru_next->lru_prev != reuse->lru_next);
+       log_assert(outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_next &&
+               outnet->tcp_reuse_last != outnet->tcp_reuse_last->lru_prev);
        /* insert at the front */
        reuse->lru_prev = NULL;
        reuse->lru_next = outnet->tcp_reuse_first;
+       if(outnet->tcp_reuse_first) {
+               outnet->tcp_reuse_first->lru_prev = reuse;
+       }
+       log_assert(reuse->lru_next != reuse);
        /* since it is not first, it is not the only element and
         * lru_next is thus not NULL and thus reuse is now not the last in
         * the list, so outnet->tcp_reuse_last does not need to be modified */
        outnet->tcp_reuse_first = reuse;
+       log_assert(outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_next &&
+               outnet->tcp_reuse_first != outnet->tcp_reuse_first->lru_prev);
+       log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) ||
+               (outnet->tcp_reuse_first && outnet->tcp_reuse_last));
+}
+
+/** Snip the last reuse_tcp element off of the LRU list */
+struct reuse_tcp*
+reuse_tcp_lru_snip(struct outside_network* outnet)
+{
+       struct reuse_tcp* reuse = outnet->tcp_reuse_last;
+       if(!reuse) return NULL;
+       /* snip off of LRU */
+       log_assert(reuse->lru_next == NULL);
+       if(reuse->lru_prev) {
+               outnet->tcp_reuse_last = reuse->lru_prev;
+               reuse->lru_prev->lru_next = NULL;
+       } else {
+               outnet->tcp_reuse_last = NULL;
+               outnet->tcp_reuse_first = NULL;
+       }
+       log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) ||
+               (outnet->tcp_reuse_first && outnet->tcp_reuse_last));
+       reuse->item_on_lru_list = 0;
+       reuse->lru_next = NULL;
+       reuse->lru_prev = NULL;
+       return reuse;
 }
 
 /** call callback on waiting_tcp, if not NULL */
@@ -718,30 +799,89 @@ static void
 waiting_tcp_callback(struct waiting_tcp* w, struct comm_point* c, int error,
        struct comm_reply* reply_info)
 {
-       if(w->cb) {
+       if(w && w->cb) {
                fptr_ok(fptr_whitelist_pending_tcp(w->cb));
                (void)(*w->cb)(c, w->cb_arg, error, reply_info);
        }
 }
 
+/** add waiting_tcp element to the outnet tcp waiting list */
+static void
+outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w)
+{
+       struct timeval tv;
+       log_assert(!w->on_tcp_waiting_list);
+       if(w->on_tcp_waiting_list)
+               return;
+       w->next_waiting = NULL;
+       if(outnet->tcp_wait_last)
+               outnet->tcp_wait_last->next_waiting = w;
+       else    outnet->tcp_wait_first = w;
+       outnet->tcp_wait_last = w;
+       w->on_tcp_waiting_list = 1;
+#ifndef S_SPLINT_S
+       tv.tv_sec = w->timeout/1000;
+       tv.tv_usec = (w->timeout%1000)*1000;
+#endif
+       comm_timer_set(w->timer, &tv);
+}
+
+/** add waiting_tcp element as first to the outnet tcp waiting list */
+static void
+outnet_add_tcp_waiting_first(struct outside_network* outnet,
+       struct waiting_tcp* w, int reset_timer)
+{
+       struct timeval tv;
+       log_assert(!w->on_tcp_waiting_list);
+       if(w->on_tcp_waiting_list)
+               return;
+       w->next_waiting = outnet->tcp_wait_first;
+       if(!outnet->tcp_wait_last)
+               outnet->tcp_wait_last = w;
+       outnet->tcp_wait_first = w;
+       w->on_tcp_waiting_list = 1;
+       if(reset_timer) {
+#ifndef S_SPLINT_S
+               tv.tv_sec = w->timeout/1000;
+               tv.tv_usec = (w->timeout%1000)*1000;
+#endif
+               comm_timer_set(w->timer, &tv);
+       }
+       log_assert(
+               (!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) ||
+               (outnet->tcp_reuse_first && outnet->tcp_reuse_last));
+}
+
 /** see if buffers can be used to service TCP queries */
 static void
 use_free_buffer(struct outside_network* outnet)
 {
        struct waiting_tcp* w;
-       while(outnet->tcp_free && outnet->tcp_wait_first 
-               && !outnet->want_to_quit) {
+       while(outnet->tcp_wait_first && !outnet->want_to_quit) {
+#ifdef USE_DNSTAP
+               struct pending_tcp* pend_tcp = NULL;
+#endif
                struct reuse_tcp* reuse = NULL;
                w = outnet->tcp_wait_first;
+               log_assert(w->on_tcp_waiting_list);
                outnet->tcp_wait_first = w->next_waiting;
                if(outnet->tcp_wait_last == w)
                        outnet->tcp_wait_last = NULL;
+               log_assert(
+                       (!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) ||
+                       (outnet->tcp_reuse_first && outnet->tcp_reuse_last));
                w->on_tcp_waiting_list = 0;
                reuse = reuse_tcp_find(outnet, &w->addr, w->addrlen,
                        w->ssl_upstream);
+               /* re-select an ID when moving to a new TCP buffer */
+               w->id = tcp_select_id(outnet, reuse);
+               LDNS_ID_SET(w->pkt, w->id);
                if(reuse) {
                        log_reuse_tcp(VERB_CLIENT, "use free buffer for waiting tcp: "
                                "found reuse", reuse);
+#ifdef USE_DNSTAP
+                       pend_tcp = reuse->pending;
+#endif
                        reuse_tcp_lru_touch(outnet, reuse);
                        comm_timer_disable(w->timer);
                        w->next_waiting = (void*)reuse->pending;
@@ -758,7 +898,7 @@ use_free_buffer(struct outside_network* outnet)
                                        reuse->pending->c->fd, reuse->pending,
                                        w);
                        }
-               } else {
+               } else if(outnet->tcp_free) {
                        struct pending_tcp* pend = w->outnet->tcp_free;
                        rbtree_init(&pend->reuse.tree_by_id, reuse_id_cmp);
                        pend->reuse.pending = pend;
@@ -768,37 +908,47 @@ use_free_buffer(struct outside_network* outnet)
                                waiting_tcp_callback(w, NULL, NETEVENT_CLOSED,
                                        NULL);
                                waiting_tcp_delete(w);
+#ifdef USE_DNSTAP
+                               w = NULL;
+#endif
                        }
+#ifdef USE_DNSTAP
+                       pend_tcp = pend;
+#endif
+               } else {
+                       /* no reuse and no free buffer, put back at the start */
+                       outnet_add_tcp_waiting_first(outnet, w, 0);
+                       break;
+               }
+#ifdef USE_DNSTAP
+               if(outnet->dtenv && pend_tcp && w && w->sq &&
+                       (outnet->dtenv->log_resolver_query_messages ||
+                       outnet->dtenv->log_forwarder_query_messages)) {
+                       sldns_buffer tmp;
+                       sldns_buffer_init_frm_data(&tmp, w->pkt, w->pkt_len);
+                       dt_msg_send_outside_query(outnet->dtenv, &w->sq->addr,
+                               &pend_tcp->pi->addr, comm_tcp, w->sq->zone,
+                               w->sq->zonelen, &tmp);
                }
-       }
-}
-
-/** add waiting_tcp element to the outnet tcp waiting list */
-static void
-outnet_add_tcp_waiting(struct outside_network* outnet, struct waiting_tcp* w)
-{
-       struct timeval tv;
-       if(w->on_tcp_waiting_list)
-               return;
-       w->next_waiting = NULL;
-       if(outnet->tcp_wait_last)
-               outnet->tcp_wait_last->next_waiting = w;
-       else    outnet->tcp_wait_first = w;
-       outnet->tcp_wait_last = w;
-       w->on_tcp_waiting_list = 1;
-#ifndef S_SPLINT_S
-       tv.tv_sec = w->timeout/1000;
-       tv.tv_usec = (w->timeout%1000)*1000;
 #endif
-       comm_timer_set(w->timer, &tv);
+       }
 }
 
 /** delete element from tree by id */
 static void
 reuse_tree_by_id_delete(struct reuse_tcp* reuse, struct waiting_tcp* w)
 {
+#ifdef UNBOUND_DEBUG
+       rbnode_type* rem;
+#endif
        log_assert(w->id_node.key != NULL);
+#ifdef UNBOUND_DEBUG
+       rem =
+#else
+       (void)
+#endif
        rbtree_delete(&reuse->tree_by_id, w);
+       log_assert(rem);  /* should have been there */
        w->id_node.key = NULL;
 }
 
@@ -857,15 +1007,24 @@ reuse_move_writewait_away(struct outside_network* outnet,
 }
 
 /** remove reused element from tree and lru list */
-static void
+void
 reuse_tcp_remove_tree_list(struct outside_network* outnet,
        struct reuse_tcp* reuse)
 {
        verbose(VERB_CLIENT, "reuse_tcp_remove_tree_list");
        if(reuse->node.key) {
                /* delete it from reuse tree */
-               (void)rbtree_delete(&outnet->tcp_reuse, reuse);
+               if(!rbtree_delete(&outnet->tcp_reuse, reuse)) {
+                       /* should not be possible, it should be there */
+                       char buf[256];
+                       addr_to_str(&reuse->addr, reuse->addrlen, buf,
+                               sizeof(buf));
+                       log_err("reuse tcp delete: node not present, internal error, %s ssl %d lru %d", buf, reuse->is_ssl, reuse->item_on_lru_list);
+               }
                reuse->node.key = NULL;
+               /* defend against loops on broken tree by zeroing the
+                * rbnode structure */
+               memset(&reuse->node, 0, sizeof(reuse->node));
        }
        /* delete from reuse list */
        if(reuse->item_on_lru_list) {
@@ -874,21 +1033,38 @@ reuse_tcp_remove_tree_list(struct outside_network* outnet,
                         * and thus have a pending pointer to the struct */
                        log_assert(reuse->lru_prev->pending);
                        reuse->lru_prev->lru_next = reuse->lru_next;
+                       log_assert(reuse->lru_prev->lru_next != reuse->lru_prev);
                } else {
                        log_assert(!reuse->lru_next || reuse->lru_next->pending);
                        outnet->tcp_reuse_first = reuse->lru_next;
+                       log_assert(!outnet->tcp_reuse_first ||
+                               (outnet->tcp_reuse_first !=
+                                outnet->tcp_reuse_first->lru_next &&
+                                outnet->tcp_reuse_first !=
+                                outnet->tcp_reuse_first->lru_prev));
                }
                if(reuse->lru_next) {
                        /* assert that members of the lru list are waiting
                         * and thus have a pending pointer to the struct */
                        log_assert(reuse->lru_next->pending);
                        reuse->lru_next->lru_prev = reuse->lru_prev;
+                       log_assert(reuse->lru_next->lru_prev != reuse->lru_next);
                } else {
                        log_assert(!reuse->lru_prev || reuse->lru_prev->pending);
                        outnet->tcp_reuse_last = reuse->lru_prev;
-               }
+                       log_assert(!outnet->tcp_reuse_last ||
+                               (outnet->tcp_reuse_last !=
+                                outnet->tcp_reuse_last->lru_next &&
+                                outnet->tcp_reuse_last !=
+                                outnet->tcp_reuse_last->lru_prev));
+               }
+               log_assert((!outnet->tcp_reuse_first && !outnet->tcp_reuse_last) ||
+                       (outnet->tcp_reuse_first && outnet->tcp_reuse_last));
                reuse->item_on_lru_list = 0;
+               reuse->lru_next = NULL;
+               reuse->lru_prev = NULL;
        }
+       reuse->pending = NULL;
 }
 
 /** helper function that deletes an element from the tree of readwait
@@ -915,8 +1091,12 @@ decommission_pending_tcp(struct outside_network* outnet,
        struct pending_tcp* pend)
 {
        verbose(VERB_CLIENT, "decommission_pending_tcp");
-       pend->next_free = outnet->tcp_free;
-       outnet->tcp_free = pend;
+       /* A certain code path can lead here twice for the same pending_tcp
+        * creating a loop in the free pending_tcp list. */
+       if(outnet->tcp_free != pend) {
+               pend->next_free = outnet->tcp_free;
+               outnet->tcp_free = pend;
+       }
        if(pend->reuse.node.key) {
                /* needs unlink from the reuse tree to get deleted */
                reuse_tcp_remove_tree_list(outnet, &pend->reuse);
@@ -977,22 +1157,22 @@ static void reuse_cb_and_decommission(struct outside_network* outnet,
 
 /** set timeout on tcp fd and setup read event to catch incoming dns msgs */
 static void
-reuse_tcp_setup_timeout(struct pending_tcp* pend_tcp)
+reuse_tcp_setup_timeout(struct pending_tcp* pend_tcp, int tcp_reuse_timeout)
 {
        log_reuse_tcp(VERB_CLIENT, "reuse_tcp_setup_timeout", &pend_tcp->reuse);
-       comm_point_start_listening(pend_tcp->c, -1, REUSE_TIMEOUT);
+       comm_point_start_listening(pend_tcp->c, -1, tcp_reuse_timeout);
 }
 
 /** set timeout on tcp fd and setup read event to catch incoming dns msgs */
 static void
-reuse_tcp_setup_read_and_timeout(struct pending_tcp* pend_tcp)
+reuse_tcp_setup_read_and_timeout(struct pending_tcp* pend_tcp, int tcp_reuse_timeout)
 {
        log_reuse_tcp(VERB_CLIENT, "reuse_tcp_setup_readtimeout", &pend_tcp->reuse);
        sldns_buffer_clear(pend_tcp->c->buffer);
        pend_tcp->c->tcp_is_reading = 1;
        pend_tcp->c->tcp_byte_count = 0;
        comm_point_stop_listening(pend_tcp->c);
-       comm_point_start_listening(pend_tcp->c, -1, REUSE_TIMEOUT);
+       comm_point_start_listening(pend_tcp->c, -1, tcp_reuse_timeout);
 }
 
 int 
@@ -1002,6 +1182,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error,
        struct pending_tcp* pend = (struct pending_tcp*)arg;
        struct outside_network* outnet = pend->reuse.outnet;
        struct waiting_tcp* w = NULL;
+       log_assert(pend->reuse.item_on_lru_list && pend->reuse.node.key);
        verbose(VERB_ALGO, "outnettcp cb");
        if(error == NETEVENT_TIMEOUT) {
                if(pend->c->tcp_write_and_read) {
@@ -1048,7 +1229,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error,
                        pend->reuse.cp_more_write_again = 0;
                        pend->c->tcp_is_reading = 1;
                        comm_point_stop_listening(pend->c);
-                       reuse_tcp_setup_timeout(pend);
+                       reuse_tcp_setup_timeout(pend, outnet->tcp_reuse_timeout);
                }
                return 0;
        } else if(error != NETEVENT_NOERROR) {
@@ -1101,7 +1282,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error,
                 * and there could be more bytes to read on the input */
                if(pend->reuse.tree_by_id.count != 0)
                        pend->reuse.cp_more_read_again = 1;
-               reuse_tcp_setup_read_and_timeout(pend);
+               reuse_tcp_setup_read_and_timeout(pend, outnet->tcp_reuse_timeout);
                return 0;
        }
        verbose(VERB_CLIENT, "outnet_tcp_cb reuse after cb: decommission it");
@@ -1369,7 +1550,8 @@ outside_network_create(struct comm_base *base, size_t bufsize,
        int numavailports, size_t unwanted_threshold, int tcp_mss,
        void (*unwanted_action)(void*), void* unwanted_param, int do_udp,
        void* sslctx, int delayclose, int tls_use_sni, struct dt_env* dtenv,
-       int udp_connect)
+       int udp_connect, int max_reuse_tcp_queries, int tcp_reuse_timeout,
+       int tcp_auth_query_timeout)
 {
        struct outside_network* outnet = (struct outside_network*)
                calloc(1, sizeof(struct outside_network));
@@ -1381,6 +1563,9 @@ outside_network_create(struct comm_base *base, size_t bufsize,
        comm_base_timept(base, &outnet->now_secs, &outnet->now_tv);
        outnet->base = base;
        outnet->num_tcp = num_tcp;
+       outnet->max_reuse_tcp_queries = max_reuse_tcp_queries;
+       outnet->tcp_reuse_timeout= tcp_reuse_timeout;
+       outnet->tcp_auth_query_timeout = tcp_auth_query_timeout;
        outnet->num_tcp_outgoing = 0;
        outnet->infra = infra;
        outnet->rnd = rnd;
@@ -1457,7 +1642,7 @@ outside_network_create(struct comm_base *base, size_t bufsize,
                        return NULL;
                }
                pc->cp = comm_point_create_udp(outnet->base, -1, 
-                       outnet->udp_buff, outnet_udp_cb, outnet);
+                       outnet->udp_buff, outnet_udp_cb, outnet, NULL);
                if(!pc->cp) {
                        log_err("malloc failed");
                        free(pc);
@@ -1609,22 +1794,19 @@ outside_network_delete(struct outside_network* outnet)
                size_t i;
                for(i=0; i<outnet->num_tcp; i++)
                        if(outnet->tcp_conns[i]) {
-                               if(outnet->tcp_conns[i]->query &&
-                                       !outnet->tcp_conns[i]->query->
-                                       on_tcp_waiting_list) {
+                               struct pending_tcp* pend;
+                               pend = outnet->tcp_conns[i];
+                               if(pend->reuse.item_on_lru_list) {
                                        /* delete waiting_tcp elements that
                                         * the tcp conn is working on */
-                                       struct pending_tcp* pend =
-                                               (struct pending_tcp*)outnet->
-                                               tcp_conns[i]->query->
-                                               next_waiting;
                                        decommission_pending_tcp(outnet, pend);
                                }
                                comm_point_delete(outnet->tcp_conns[i]->c);
-                               waiting_tcp_delete(outnet->tcp_conns[i]->query);
                                free(outnet->tcp_conns[i]);
+                               outnet->tcp_conns[i] = NULL;
                        }
                free(outnet->tcp_conns);
+               outnet->tcp_conns = NULL;
        }
        if(outnet->tcp_wait_first) {
                struct waiting_tcp* p = outnet->tcp_wait_first, *np;
@@ -1742,14 +1924,14 @@ select_id(struct outside_network* outnet, struct pending* pend,
        sldns_buffer* packet)
 {
        int id_tries = 0;
-       pend->id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff;
+       pend->id = GET_RANDOM_ID(outnet->rnd);
        LDNS_ID_SET(sldns_buffer_begin(packet), pend->id);
 
        /* insert in tree */
        pend->node.key = pend;
        while(!rbtree_insert(outnet->pending, &pend->node)) {
                /* change ID to avoid collision */
-               pend->id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff;
+               pend->id = GET_RANDOM_ID(outnet->rnd);
                LDNS_ID_SET(sldns_buffer_begin(packet), pend->id);
                id_tries++;
                if(id_tries == MAX_ID_RETRY) {
@@ -1779,6 +1961,7 @@ static int udp_connect_needs_log(int err)
 #  ifdef ENETDOWN
        case ENETDOWN:
 #  endif
+       case EPERM:
                if(verbosity >= VERB_ALGO)
                        return 1;
                return 0;
@@ -1931,11 +2114,21 @@ randomize_and_send_udp(struct pending* pend, sldns_buffer* packet, int timeout)
        comm_timer_set(pend->timer, &tv);
 
 #ifdef USE_DNSTAP
+       /*
+        * sending src (local service)/dst (upstream) addresses over DNSTAP
+        * There are no chances to get the src (local service) addr if unbound
+        * is not configured with specific outgoing IP-addresses. So we will
+        * pass 0.0.0.0 (::) to argument for
+        * dt_msg_send_outside_query()/dt_msg_send_outside_response() calls.
+        */
        if(outnet->dtenv &&
           (outnet->dtenv->log_resolver_query_messages ||
-           outnet->dtenv->log_forwarder_query_messages))
-               dt_msg_send_outside_query(outnet->dtenv, &pend->addr, comm_udp,
-               pend->sq->zone, pend->sq->zonelen, packet);
+               outnet->dtenv->log_forwarder_query_messages)) {
+                       log_addr(VERB_ALGO, "from local addr", &pend->pc->pif->addr, pend->pc->pif->addrlen);
+                       log_addr(VERB_ALGO, "request to upstream", &pend->addr, pend->addrlen);
+                       dt_msg_send_outside_query(outnet->dtenv, &pend->addr, &pend->pc->pif->addr, comm_udp,
+                               pend->sq->zone, pend->sq->zonelen, packet);
+       }
 #endif
        return 1;
 }
@@ -2011,24 +2204,20 @@ outnet_tcptimer(void* arg)
 static void
 reuse_tcp_close_oldest(struct outside_network* outnet)
 {
-       struct pending_tcp* pend;
+       struct reuse_tcp* reuse;
        verbose(VERB_CLIENT, "reuse_tcp_close_oldest");
-       if(!outnet->tcp_reuse_last) return;
-       pend = outnet->tcp_reuse_last->pending;
-
-       /* snip off of LRU */
-       log_assert(pend->reuse.lru_next == NULL);
-       if(pend->reuse.lru_prev) {
-               outnet->tcp_reuse_last = pend->reuse.lru_prev;
-               pend->reuse.lru_prev->lru_next = NULL;
-       } else {
-               outnet->tcp_reuse_last = NULL;
-               outnet->tcp_reuse_first = NULL;
-       }
-       pend->reuse.item_on_lru_list = 0;
-
+       reuse = reuse_tcp_lru_snip(outnet);
+       if(!reuse) return;
        /* free up */
-       reuse_cb_and_decommission(outnet, pend, NETEVENT_CLOSED);
+       reuse_cb_and_decommission(outnet, reuse->pending, NETEVENT_CLOSED);
+}
+
+static uint16_t
+tcp_select_id(struct outside_network* outnet, struct reuse_tcp* reuse)
+{
+       if(reuse)
+               return reuse_tcp_select_id(reuse, outnet);
+       return GET_RANDOM_ID(outnet->rnd);
 }
 
 /** find spare ID value for reuse tcp stream.  That is random and also does
@@ -2044,13 +2233,13 @@ reuse_tcp_select_id(struct reuse_tcp* reuse, struct outside_network* outnet)
 
        /* make really sure the tree is not empty */
        if(reuse->tree_by_id.count == 0) {
-               id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff;
+               id = GET_RANDOM_ID(outnet->rnd);
                return id;
        }
 
        /* try to find random empty spots by picking them */
        for(i = 0; i<try_random; i++) {
-               id = ((unsigned)ub_random(outnet->rnd)>>8) & 0xffff;
+               id = GET_RANDOM_ID(outnet->rnd);
                if(!reuse_tcp_by_id_find(reuse, id)) {
                        return id;
                }
@@ -2126,6 +2315,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
                reuse_tcp_lru_touch(sq->outnet, reuse);
        }
 
+       log_assert(!reuse || (reuse && pend));
        /* if !pend but we have reuse streams, close a reuse stream
         * to be able to open a new one to this target, no use waiting
         * to reuse a file descriptor while another query needs to use
@@ -2133,6 +2323,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
        if(!pend) {
                reuse_tcp_close_oldest(sq->outnet);
                pend = sq->outnet->tcp_free;
+               log_assert(!reuse || (pend == reuse->pending));
        }
 
        /* allocate space to store query */
@@ -2148,9 +2339,7 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
        w->pkt = (uint8_t*)w + sizeof(struct waiting_tcp);
        w->pkt_len = sldns_buffer_limit(packet);
        memmove(w->pkt, sldns_buffer_begin(packet), w->pkt_len);
-       if(reuse)
-               w->id = reuse_tcp_select_id(reuse, sq->outnet);
-       else    w->id = ((unsigned)ub_random(sq->outnet->rnd)>>8) & 0xffff;
+       w->id = tcp_select_id(sq->outnet, reuse);
        LDNS_ID_SET(w->pkt, w->id);
        memcpy(&w->addr, &sq->addr, sq->addrlen);
        w->addrlen = sq->addrlen;
@@ -2167,9 +2356,13 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
        w->write_wait_next = NULL;
        w->write_wait_queued = 0;
        w->error_count = 0;
+#ifdef USE_DNSTAP
+       w->sq = NULL;
+#endif
        if(pend) {
                /* we have a buffer available right now */
                if(reuse) {
+                       log_assert(reuse == &pend->reuse);
                        /* reuse existing fd, write query and continue */
                        /* store query in tree by id */
                        verbose(VERB_CLIENT, "pending_tcp_query: reuse, store");
@@ -2201,20 +2394,28 @@ pending_tcp_query(struct serviced_query* sq, sldns_buffer* packet,
                                return NULL;
                        }
                }
+#ifdef USE_DNSTAP
+               if(sq->outnet->dtenv &&
+                  (sq->outnet->dtenv->log_resolver_query_messages ||
+                   sq->outnet->dtenv->log_forwarder_query_messages)) {
+                       /* use w->pkt, because it has the ID value */
+                       sldns_buffer tmp;
+                       sldns_buffer_init_frm_data(&tmp, w->pkt, w->pkt_len);
+                       dt_msg_send_outside_query(sq->outnet->dtenv, &sq->addr,
+                               &pend->pi->addr, comm_tcp, sq->zone,
+                               sq->zonelen, &tmp);
+               }
+#endif
        } else {
                /* queue up */
                /* waiting for a buffer on the outside network buffer wait
                 * list */
                verbose(VERB_CLIENT, "pending_tcp_query: queue to wait");
-               outnet_add_tcp_waiting(sq->outnet, w);
-       }
 #ifdef USE_DNSTAP
-       if(sq->outnet->dtenv &&
-          (sq->outnet->dtenv->log_resolver_query_messages ||
-           sq->outnet->dtenv->log_forwarder_query_messages))
-               dt_msg_send_outside_query(sq->outnet->dtenv, &sq->addr,
-                       comm_tcp, sq->zone, sq->zonelen, packet);
+               w->sq = sq;
 #endif
+               outnet_add_tcp_waiting(sq->outnet, w);
+       }
        return w;
 }
 
@@ -2348,6 +2549,9 @@ waiting_list_remove(struct outside_network* outnet, struct waiting_tcp* w)
                prev = p;
                p = p->next_waiting;
        }
+       /* waiting_list_remove is currently called only with items that are
+        * already in the waiting list. */
+       log_assert(0);
 }
 
 /** reuse tcp stream, remove serviced query from stream,
@@ -2386,7 +2590,7 @@ reuse_tcp_remove_serviced_keep(struct waiting_tcp* w,
                if(!reuse_tcp_insert(sq->outnet, pend_tcp)) {
                        return 0;
                }
-               reuse_tcp_setup_timeout(pend_tcp);
+               reuse_tcp_setup_timeout(pend_tcp, sq->outnet->tcp_reuse_timeout);
                return 1;
        }
        return 0;
@@ -2720,6 +2924,15 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error,
 {
        struct serviced_query* sq = (struct serviced_query*)arg;
        struct comm_reply r2;
+#ifdef USE_DNSTAP
+       struct waiting_tcp* w = (struct waiting_tcp*)sq->pending;
+       struct pending_tcp* pend_tcp = NULL;
+       struct port_if* pi = NULL;
+       if(!w->on_tcp_waiting_list && w->next_waiting) {
+               pend_tcp = (struct pending_tcp*)w->next_waiting;
+               pi = pend_tcp->pi;
+       }
+#endif
        sq->pending = NULL; /* removed after this callback */
        if(error != NETEVENT_NOERROR)
                log_addr(VERB_QUERY, "tcp error for address", 
@@ -2728,12 +2941,19 @@ serviced_tcp_callback(struct comm_point* c, void* arg, int error,
                infra_update_tcp_works(sq->outnet->infra, &sq->addr,
                        sq->addrlen, sq->zone, sq->zonelen);
 #ifdef USE_DNSTAP
-       if(error==NETEVENT_NOERROR && sq->outnet->dtenv &&
+       /*
+        * sending src (local service)/dst (upstream) addresses over DNSTAP
+        */
+       if(error==NETEVENT_NOERROR && pi && sq->outnet->dtenv &&
           (sq->outnet->dtenv->log_resolver_response_messages ||
-           sq->outnet->dtenv->log_forwarder_response_messages))
+           sq->outnet->dtenv->log_forwarder_response_messages)) {
+               log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen);
+               log_addr(VERB_ALGO, "to local addr", &pi->addr, pi->addrlen);
                dt_msg_send_outside_response(sq->outnet->dtenv, &sq->addr,
-               c->type, sq->zone, sq->zonelen, sq->qbuf, sq->qbuflen,
-               &sq->last_sent_time, sq->outnet->now_tv, c->buffer);
+                       &pi->addr, c->type, sq->zone, sq->zonelen, sq->qbuf,
+                       sq->qbuflen, &sq->last_sent_time, sq->outnet->now_tv,
+                       c->buffer);
+       }
 #endif
        if(error==NETEVENT_NOERROR && sq->status == serviced_query_TCP_EDNS &&
                (LDNS_RCODE_WIRE(sldns_buffer_begin(c->buffer)) == 
@@ -2804,7 +3024,7 @@ serviced_tcp_initiate(struct serviced_query* sq, sldns_buffer* buff)
                sq->status==serviced_query_TCP_EDNS?"EDNS":"");
        serviced_encode(sq, buff, sq->status == serviced_query_TCP_EDNS);
        sq->last_sent_time = *sq->outnet->now_tv;
-       sq->pending = pending_tcp_query(sq, buff, TCP_AUTH_QUERY_TIMEOUT,
+       sq->pending = pending_tcp_query(sq, buff, sq->outnet->tcp_auth_query_timeout,
                serviced_tcp_callback, sq);
        if(!sq->pending) {
                /* delete from tree so that a retry by above layer does not
@@ -2832,10 +3052,10 @@ serviced_tcp_send(struct serviced_query* sq, sldns_buffer* buff)
        sq->last_sent_time = *sq->outnet->now_tv;
        if(sq->tcp_upstream || sq->ssl_upstream) {
                timeout = rtt;
-               if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < TCP_AUTH_QUERY_TIMEOUT)
-                       timeout = TCP_AUTH_QUERY_TIMEOUT;
+               if(rtt >= UNKNOWN_SERVER_NICENESS && rtt < sq->outnet->tcp_auth_query_timeout)
+                       timeout = sq->outnet->tcp_auth_query_timeout;
        } else {
-               timeout = TCP_AUTH_QUERY_TIMEOUT;
+               timeout = sq->outnet->tcp_auth_query_timeout;
        }
        sq->pending = pending_tcp_query(sq, buff, timeout,
                serviced_tcp_callback, sq);
@@ -2887,6 +3107,10 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
        struct serviced_query* sq = (struct serviced_query*)arg;
        struct outside_network* outnet = sq->outnet;
        struct timeval now = *sq->outnet->now_tv;
+#ifdef USE_DNSTAP
+       struct pending* p = (struct pending*)sq->pending;
+       struct port_if* pi = p->pc->pif;
+#endif
 
        sq->pending = NULL; /* removed after callback */
        if(error == NETEVENT_TIMEOUT) {
@@ -2924,12 +3148,18 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
                return 0;
        }
 #ifdef USE_DNSTAP
+       /*
+        * sending src (local service)/dst (upstream) addresses over DNSTAP
+        */
        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,
-               sq->zone, sq->zonelen, sq->qbuf, sq->qbuflen,
-               &sq->last_sent_time, sq->outnet->now_tv, c->buffer);
+           outnet->dtenv->log_forwarder_response_messages)) {
+               log_addr(VERB_ALGO, "response from upstream", &sq->addr, sq->addrlen);
+               log_addr(VERB_ALGO, "to local addr", &pi->addr, pi->addrlen);
+               dt_msg_send_outside_response(outnet->dtenv, &sq->addr, &pi->addr, c->type,
+                 sq->zone, sq->zonelen, sq->qbuf, sq->qbuflen,
+                 &sq->last_sent_time, sq->outnet->now_tv, c->buffer);
+       }
 #endif
        if( (sq->status == serviced_query_UDP_EDNS 
                ||sq->status == serviced_query_UDP_EDNS_FRAG)
@@ -3203,7 +3433,7 @@ outnet_comm_point_for_udp(struct outside_network* outnet,
                return NULL;
        }
        cp = comm_point_create_udp(outnet->base, fd, outnet->udp_buff,
-               cb, cb_arg);
+               cb, cb_arg, NULL);
        if(!cp) {
                log_err("malloc failure");
                close(fd);
@@ -3309,15 +3539,28 @@ outnet_comm_point_for_tcp(struct outside_network* outnet,
        return cp;
 }
 
+/** setup the User-Agent HTTP header based on http-user-agent configuration */
+static void
+setup_http_user_agent(sldns_buffer* buf, struct config_file* cfg)
+{
+       if(cfg->hide_http_user_agent) return;
+       if(cfg->http_user_agent==NULL || cfg->http_user_agent[0] == 0) {
+               sldns_buffer_printf(buf, "User-Agent: %s/%s\r\n", PACKAGE_NAME,
+                       PACKAGE_VERSION);
+       } else {
+               sldns_buffer_printf(buf, "User-Agent: %s\r\n", cfg->http_user_agent);
+       }
+}
+
 /** setup http request headers in buffer for sending query to destination */
 static int
-setup_http_request(sldns_buffer* buf, char* host, char* path)
+setup_http_request(sldns_buffer* buf, char* host, char* path,
+       struct config_file* cfg)
 {
        sldns_buffer_clear(buf);
        sldns_buffer_printf(buf, "GET /%s HTTP/1.1\r\n", path);
        sldns_buffer_printf(buf, "Host: %s\r\n", host);
-       sldns_buffer_printf(buf, "User-Agent: unbound/%s\r\n",
-               PACKAGE_VERSION);
+       setup_http_user_agent(buf, cfg);
        /* We do not really do multiple queries per connection,
         * but this header setting is also not needed.
         * sldns_buffer_printf(buf, "Connection: close\r\n") */
@@ -3333,7 +3576,7 @@ struct comm_point*
 outnet_comm_point_for_http(struct outside_network* outnet,
        comm_point_callback_type* cb, void* cb_arg,
        struct sockaddr_storage* to_addr, socklen_t to_addrlen, int timeout,
-       int ssl, char* host, char* path)
+       int ssl, char* host, char* path, struct config_file* cfg)
 {
        /* cp calls cb with err=NETEVENT_DONE when transfer is done */
        struct comm_point* cp;
@@ -3369,7 +3612,7 @@ outnet_comm_point_for_http(struct outside_network* outnet,
        comm_point_start_listening(cp, fd, timeout);
 
        /* setup http request in cp->buffer */
-       if(!setup_http_request(cp->buffer, host, path)) {
+       if(!setup_http_request(cp->buffer, host, path, cfg)) {
                log_err("error setting up http request");
                comm_point_delete(cp);
                return NULL;
index fe287af..d0d532e 100644 (file)
@@ -63,6 +63,7 @@ struct edns_option;
 struct module_env;
 struct module_qstate;
 struct query_info;
+struct config_file;
 
 /**
  * Send queries to outside servers and wait for answers from servers.
@@ -158,6 +159,12 @@ struct outside_network {
        size_t num_tcp;
        /** number of tcp communication points in use. */
        size_t num_tcp_outgoing;
+       /** max number of queries on a reuse connection */
+       size_t max_reuse_tcp_queries;
+       /** timeout for REUSE entries in milliseconds. */
+       int tcp_reuse_timeout;
+       /** timeout in milliseconds for TCP queries to auth servers. */
+       int tcp_auth_query_timeout;
        /**
         * tree of still-open and waiting tcp connections for reuse.
         * can be closed and reopened to get a new tcp connection.
@@ -295,11 +302,6 @@ struct reuse_tcp {
        struct outside_network* outnet;
 };
 
-/** max number of queries on a reuse connection */
-#define MAX_REUSE_TCP_QUERIES 200
-/** timeout for REUSE entries in milliseconds. */
-#define REUSE_TIMEOUT 60000
-
 /**
  * A query that has an answer pending for it.
  */
@@ -344,6 +346,8 @@ struct pending {
 struct pending_tcp {
        /** next in list of free tcp comm points, or NULL. */
        struct pending_tcp* next_free;
+       /** port for of the outgoing interface that is used */
+       struct port_if* pi;
        /** tcp comm point it was sent on (and reply must come back on). */
        struct comm_point* c;
        /** the query being serviced, NULL if the pending_tcp is unused. */
@@ -408,6 +412,10 @@ struct waiting_tcp {
        char* tls_auth_name;
        /** the packet was involved in an error, to stop looping errors */
        int error_count;
+#ifdef USE_DNSTAP
+       /** serviced query pointer for dnstap to get logging info, if nonNULL*/
+       struct serviced_query* sq;
+#endif
 };
 
 /**
@@ -534,6 +542,9 @@ struct serviced_query {
  * @param tls_use_sni: if SNI is used for TLS connections.
  * @param dtenv: environment to send dnstap events with (if enabled).
  * @param udp_connect: if the udp_connect option is enabled.
+ * @param max_reuse_tcp_queries: max number of queries on a reuse connection.
+ * @param tcp_reuse_timeout: timeout for REUSE entries in milliseconds.
+ * @param tcp_auth_query_timeout: timeout in milliseconds for TCP queries to auth servers.
  * @return: the new structure (with no pending answers) or NULL on error.
  */
 struct outside_network* outside_network_create(struct comm_base* base,
@@ -543,7 +554,8 @@ struct outside_network* outside_network_create(struct comm_base* base,
        int numavailports, size_t unwanted_threshold, int tcp_mss,
        void (*unwanted_action)(void*), void* unwanted_param, int do_udp,
        void* sslctx, int delayclose, int tls_use_sni, struct dt_env *dtenv,
-       int udp_connect);
+       int udp_connect, int max_reuse_tcp_queries, int tcp_reuse_timeout,
+       int tcp_auth_query_timeout);
 
 /**
  * Delete outside_network structure.
@@ -670,12 +682,28 @@ struct waiting_tcp* reuse_tcp_by_id_find(struct reuse_tcp* reuse, uint16_t id);
 /** insert element in tree by id */
 void reuse_tree_by_id_insert(struct reuse_tcp* reuse, struct waiting_tcp* w);
 
+/** insert element in tcp_reuse tree and LRU list */
+int reuse_tcp_insert(struct outside_network* outnet,
+       struct pending_tcp* pend_tcp);
+
+/** touch the LRU of the element */
+void reuse_tcp_lru_touch(struct outside_network* outnet,
+       struct reuse_tcp* reuse);
+
+/** remove element from tree and LRU list */
+void reuse_tcp_remove_tree_list(struct outside_network* outnet,
+       struct reuse_tcp* reuse);
+
+/** snip the last reuse_tcp element off of the LRU list if any */
+struct reuse_tcp* reuse_tcp_lru_snip(struct outside_network* outnet);
+
 /** delete readwait waiting_tcp elements, deletes the elements in the list */
 void reuse_del_readwait(rbtree_type* tree_by_id);
 
 /** get TCP file descriptor for address, returns -1 on failure,
  * tcp_mss is 0 or maxseg size to set for TCP packets. */
-int outnet_get_tcp_fd(struct sockaddr_storage* addr, socklen_t addrlen, int tcp_mss, int dscp);
+int outnet_get_tcp_fd(struct sockaddr_storage* addr, socklen_t addrlen,
+       int tcp_mss, int dscp);
 
 /**
  * Create udp commpoint suitable for sending packets to the destination.
@@ -729,12 +757,13 @@ struct comm_point* outnet_comm_point_for_tcp(struct outside_network* outnet,
  * @param ssl: set to true for https.
  * @param host: hostname to use for the destination. part of http request.
  * @param path: pathname to lookup, eg. name of the file on the destination.
+ * @param cfg: running configuration for User-Agent setup.
  * @return http_out commpoint, or NULL.
  */
 struct comm_point* outnet_comm_point_for_http(struct outside_network* outnet,
        comm_point_callback_type* cb, void* cb_arg,
        struct sockaddr_storage* to_addr, socklen_t to_addrlen, int timeout,
-       int ssl, char* host, char* path);
+       int ssl, char* host, char* path, struct config_file* cfg);
 
 /** connect tcp connection to addr, 0 on failure */
 int outnet_tcp_connect(int s, struct sockaddr_storage* addr, socklen_t addrlen);
index 2b6b0ac..3a1ec00 100644 (file)
@@ -162,6 +162,7 @@ rpz_rr_to_action(uint16_t rr_type, uint8_t* rdatawl, size_t rdatalen)
                case LDNS_RR_TYPE_RRSIG:
                case LDNS_RR_TYPE_NSEC:
                case LDNS_RR_TYPE_NSEC3:
+               case LDNS_RR_TYPE_NSEC3PARAM:
                        return RPZ_INVALID_ACTION;
                case LDNS_RR_TYPE_CNAME:
                        break;
@@ -479,8 +480,21 @@ rpz_insert_qname_trigger(struct rpz* r, uint8_t* dname, size_t dnamelen,
        int newzone = 0;
 
        if(a == RPZ_TCP_ONLY_ACTION || a == RPZ_INVALID_ACTION) {
-               verbose(VERB_ALGO, "RPZ: skipping unsupported action: %s",
-                       rpz_action_to_string(a));
+               char str[255+1];
+               if(rrtype == LDNS_RR_TYPE_SOA || rrtype == LDNS_RR_TYPE_NS ||
+                       rrtype == LDNS_RR_TYPE_DNAME ||
+                       rrtype == LDNS_RR_TYPE_DNSKEY ||
+                       rrtype == LDNS_RR_TYPE_RRSIG ||
+                       rrtype == LDNS_RR_TYPE_NSEC ||
+                       rrtype == LDNS_RR_TYPE_NSEC3PARAM ||
+                       rrtype == LDNS_RR_TYPE_NSEC3 ||
+                       rrtype == LDNS_RR_TYPE_DS) {
+                       free(dname);
+                       return; /* no need to log these types as unsupported */
+               }
+               dname_str(dname, str);
+               verbose(VERB_ALGO, "RPZ: qname trigger, %s skipping unsupported action: %s",
+                       str, rpz_action_to_string(a));
                free(dname);
                return;
        }
@@ -552,8 +566,10 @@ rpz_insert_response_ip_trigger(struct rpz* r, uint8_t* dname, size_t dnamelen,
 
        if(a == RPZ_TCP_ONLY_ACTION || a == RPZ_INVALID_ACTION ||
                respa == respip_invalid) {
-               verbose(VERB_ALGO, "RPZ: skipping unsupported action: %s",
-                       rpz_action_to_string(a));
+               char str[255+1];
+               dname_str(dname, str);
+               verbose(VERB_ALGO, "RPZ: respip trigger, %s skipping unsupported action: %s",
+                       str, rpz_action_to_string(a));
                return 0;
        }
 
@@ -702,7 +718,7 @@ rpz_find_zone(struct rpz* r, uint8_t* qname, size_t qname_len, uint16_t qclass,
         * zone match, append '*' to that and do another lookup. */
 
        ce = dname_get_shared_topdomain(z->name, qname);
-       if(!ce /* should not happen */ || !*ce /* root */) {
+       if(!ce /* should not happen */) {
                lock_rw_unlock(&z->lock);
                if(zones_keep_lock) {
                        lock_rw_unlock(&r->local_zones->lock);
index 2ec225b..b1e60d8 100644 (file)
 #ifdef HAVE_OPENSSL_BN_H
 #include <openssl/bn.h>
 #endif
-#ifdef HAVE_OPENSSL_RSA_H
-#include <openssl/rsa.h>
-#endif
-#ifdef HAVE_OPENSSL_DSA_H
-#include <openssl/dsa.h>
+#ifdef HAVE_OPENSSL_PARAM_BUILD_H
+#  include <openssl/param_build.h>
+#else
+#  ifdef HAVE_OPENSSL_RSA_H
+#  include <openssl/rsa.h>
+#  endif
+#  ifdef HAVE_OPENSSL_DSA_H
+#  include <openssl/dsa.h>
+#  endif
 #endif
 #endif /* HAVE_SSL */
 
@@ -191,45 +195,59 @@ void sldns_key_EVP_unload_gost(void)
 }
 #endif /* USE_GOST */
 
-DSA *
-sldns_key_buf2dsa_raw(unsigned char* key, size_t len)
+/* Retrieve params as BIGNUM from raw buffer */
+static int
+sldns_key_dsa_buf_bignum(unsigned char* key, size_t len, BIGNUM** p,
+       BIGNUM** q, BIGNUM** g, BIGNUM** y)
 {
        uint8_t T;
        uint16_t length;
        uint16_t offset;
-       DSA *dsa;
-       BIGNUM *Q; BIGNUM *P;
-       BIGNUM *G; BIGNUM *Y;
 
        if(len == 0)
-               return NULL;
+               return 0;
        T = (uint8_t)key[0];
        length = (64 + T * 8);
        offset = 1;
 
        if (T > 8) {
-               return NULL;
+               return 0;
        }
        if(len < (size_t)1 + SHA_DIGEST_LENGTH + 3*length)
-               return NULL;
+               return 0;
 
-       Q = BN_bin2bn(key+offset, SHA_DIGEST_LENGTH, NULL);
+       *q = BN_bin2bn(key+offset, SHA_DIGEST_LENGTH, NULL);
        offset += SHA_DIGEST_LENGTH;
 
-       P = BN_bin2bn(key+offset, (int)length, NULL);
+       *p = BN_bin2bn(key+offset, (int)length, NULL);
        offset += length;
 
-       G = BN_bin2bn(key+offset, (int)length, NULL);
+       *g = BN_bin2bn(key+offset, (int)length, NULL);
        offset += length;
 
-       Y = BN_bin2bn(key+offset, (int)length, NULL);
+       *y = BN_bin2bn(key+offset, (int)length, NULL);
+
+       if(!*q || !*p || !*g || !*y) {
+               BN_free(*q);
+               BN_free(*p);
+               BN_free(*g);
+               BN_free(*y);
+               return 0;
+       }
+       return 1;
+}
 
+#ifndef HAVE_OSSL_PARAM_BLD_NEW
+DSA *
+sldns_key_buf2dsa_raw(unsigned char* key, size_t len)
+{
+       DSA *dsa;
+       BIGNUM *Q=NULL, *P=NULL, *G=NULL, *Y=NULL;
+       if(!sldns_key_dsa_buf_bignum(key, len, &P, &Q, &G, &Y)) {
+               return NULL;
+       }
        /* create the key and set its properties */
-       if(!Q || !P || !G || !Y || !(dsa = DSA_new())) {
-               BN_free(Q);
-               BN_free(P);
-               BN_free(G);
-               BN_free(Y);
+       if(!(dsa = DSA_new())) {
                return NULL;
        }
 #if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL)
@@ -261,22 +279,111 @@ sldns_key_buf2dsa_raw(unsigned char* key, size_t len)
 
        return dsa;
 }
+#endif /* HAVE_OSSL_PARAM_BLD_NEW */
 
-RSA *
-sldns_key_buf2rsa_raw(unsigned char* key, size_t len)
+EVP_PKEY *sldns_key_dsa2pkey_raw(unsigned char* key, size_t len)
+{
+#ifdef HAVE_OSSL_PARAM_BLD_NEW
+       EVP_PKEY* evp_key = NULL;
+       EVP_PKEY_CTX* ctx;
+       BIGNUM *p=NULL, *q=NULL, *g=NULL, *y=NULL;
+       OSSL_PARAM_BLD* param_bld;
+       OSSL_PARAM* params = NULL;
+       if(!sldns_key_dsa_buf_bignum(key, len, &p, &q, &g, &y)) {
+               return NULL;
+       }
+
+       param_bld = OSSL_PARAM_BLD_new();
+       if(!param_bld) {
+               BN_free(p);
+               BN_free(q);
+               BN_free(g);
+               BN_free(y);
+               return NULL;
+       }
+       if(!OSSL_PARAM_BLD_push_BN(param_bld, "p", p) ||
+          !OSSL_PARAM_BLD_push_BN(param_bld, "g", g) ||
+          !OSSL_PARAM_BLD_push_BN(param_bld, "q", q) ||
+          !OSSL_PARAM_BLD_push_BN(param_bld, "pub", y)) {
+               OSSL_PARAM_BLD_free(param_bld);
+               BN_free(p);
+               BN_free(q);
+               BN_free(g);
+               BN_free(y);
+               return NULL;
+       }
+       params = OSSL_PARAM_BLD_to_param(param_bld);
+       OSSL_PARAM_BLD_free(param_bld);
+
+       ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL);
+       if(!ctx) {
+               OSSL_PARAM_free(params);
+               BN_free(p);
+               BN_free(q);
+               BN_free(g);
+               BN_free(y);
+               return NULL;
+       }
+       if(EVP_PKEY_fromdata_init(ctx) <= 0) {
+               EVP_PKEY_CTX_free(ctx);
+               OSSL_PARAM_free(params);
+               BN_free(p);
+               BN_free(q);
+               BN_free(g);
+               BN_free(y);
+               return NULL;
+       }
+       if(EVP_PKEY_fromdata(ctx, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0) {
+               EVP_PKEY_CTX_free(ctx);
+               OSSL_PARAM_free(params);
+               BN_free(p);
+               BN_free(q);
+               BN_free(g);
+               BN_free(y);
+               return NULL;
+       }
+
+       EVP_PKEY_CTX_free(ctx);
+       OSSL_PARAM_free(params);
+       BN_free(p);
+       BN_free(q);
+       BN_free(g);
+       BN_free(y);
+       return evp_key;
+#else
+       DSA* dsa;
+       EVP_PKEY* evp_key = EVP_PKEY_new();
+       if(!evp_key) {
+               return NULL;
+       }
+       dsa = sldns_key_buf2dsa_raw(key, len);
+       if(!dsa) {
+               EVP_PKEY_free(evp_key);
+               return NULL;
+       }
+       if(EVP_PKEY_assign_DSA(evp_key, dsa) == 0) {
+               DSA_free(dsa);
+               EVP_PKEY_free(evp_key);
+               return NULL;
+       }
+       return evp_key;
+#endif
+}
+
+/* Retrieve params as BIGNUM from raw buffer, n is modulus, e is exponent */
+static int
+sldns_key_rsa_buf_bignum(unsigned char* key, size_t len, BIGNUM** n,
+       BIGNUM** e)
 {
        uint16_t offset;
        uint16_t exp;
        uint16_t int16;
-       RSA *rsa;
-       BIGNUM *modulus;
-       BIGNUM *exponent;
 
        if (len == 0)
-               return NULL;
+               return 0;
        if (key[0] == 0) {
                if(len < 3)
-                       return NULL;
+                       return 0;
                memmove(&int16, key+1, 2);
                exp = ntohs(int16);
                offset = 3;
@@ -287,23 +394,34 @@ sldns_key_buf2rsa_raw(unsigned char* key, size_t len)
 
        /* key length at least one */
        if(len < (size_t)offset + exp + 1)
-               return NULL;
+               return 0;
 
        /* Exponent */
-       exponent = BN_new();
-       if(!exponent) return NULL;
-       (void) BN_bin2bn(key+offset, (int)exp, exponent);
+       *e = BN_new();
+       if(!*e) return 0;
+       (void) BN_bin2bn(key+offset, (int)exp, *e);
        offset += exp;
 
        /* Modulus */
-       modulus = BN_new();
-       if(!modulus) {
-               BN_free(exponent);
-               return NULL;
+       *n = BN_new();
+       if(!*n) {
+               BN_free(*e);
+               return 0;
        }
        /* length of the buffer must match the key length! */
-       (void) BN_bin2bn(key+offset, (int)(len - offset), modulus);
+       (void) BN_bin2bn(key+offset, (int)(len - offset), *n);
+       return 1;
+}
 
+#ifndef HAVE_OSSL_PARAM_BLD_NEW
+RSA *
+sldns_key_buf2rsa_raw(unsigned char* key, size_t len)
+{
+       BIGNUM* modulus = NULL;
+       BIGNUM* exponent = NULL;
+       RSA *rsa;
+       if(!sldns_key_rsa_buf_bignum(key, len, &modulus, &exponent))
+               return NULL;
        rsa = RSA_new();
        if(!rsa) {
                BN_free(exponent);
@@ -327,6 +445,88 @@ sldns_key_buf2rsa_raw(unsigned char* key, size_t len)
 
        return rsa;
 }
+#endif /* HAVE_OSSL_PARAM_BLD_NEW */
+
+EVP_PKEY* sldns_key_rsa2pkey_raw(unsigned char* key, size_t len)
+{
+#ifdef HAVE_OSSL_PARAM_BLD_NEW
+       EVP_PKEY* evp_key = NULL;
+       EVP_PKEY_CTX* ctx;
+       BIGNUM *n=NULL, *e=NULL;
+       OSSL_PARAM_BLD* param_bld;
+       OSSL_PARAM* params = NULL;
+
+       if(!sldns_key_rsa_buf_bignum(key, len, &n, &e)) {
+               return NULL;
+       }
+
+       param_bld = OSSL_PARAM_BLD_new();
+       if(!param_bld) {
+               BN_free(n);
+               BN_free(e);
+               return NULL;
+       }
+       if(!OSSL_PARAM_BLD_push_BN(param_bld, "n", n)) {
+               OSSL_PARAM_BLD_free(param_bld);
+               BN_free(n);
+               BN_free(e);
+               return NULL;
+       }
+       if(!OSSL_PARAM_BLD_push_BN(param_bld, "e", e)) {
+               OSSL_PARAM_BLD_free(param_bld);
+               BN_free(n);
+               BN_free(e);
+               return NULL;
+       }
+       params = OSSL_PARAM_BLD_to_param(param_bld);
+       OSSL_PARAM_BLD_free(param_bld);
+
+       ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);
+       if(!ctx) {
+               OSSL_PARAM_free(params);
+               BN_free(n);
+               BN_free(e);
+               return NULL;
+       }
+       if(EVP_PKEY_fromdata_init(ctx) <= 0) {
+               EVP_PKEY_CTX_free(ctx);
+               OSSL_PARAM_free(params);
+               BN_free(n);
+               BN_free(e);
+               return NULL;
+       }
+       if(EVP_PKEY_fromdata(ctx, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0) {
+               EVP_PKEY_CTX_free(ctx);
+               OSSL_PARAM_free(params);
+               BN_free(n);
+               BN_free(e);
+               return NULL;
+       }
+
+       EVP_PKEY_CTX_free(ctx);
+       OSSL_PARAM_free(params);
+       BN_free(n);
+       BN_free(e);
+       return evp_key;
+#else
+       RSA* rsa;
+       EVP_PKEY *evp_key = EVP_PKEY_new();
+       if(!evp_key) {
+               return NULL;
+       }
+       rsa = sldns_key_buf2rsa_raw(key, len);
+       if(!rsa) {
+               EVP_PKEY_free(evp_key);
+               return NULL;
+       }
+       if(EVP_PKEY_assign_RSA(evp_key, rsa) == 0) {
+               RSA_free(rsa);
+               EVP_PKEY_free(evp_key);
+               return NULL;
+       }
+       return evp_key;
+#endif
+}
 
 #ifdef USE_GOST
 EVP_PKEY*
@@ -357,6 +557,62 @@ sldns_gost2pkey_raw(unsigned char* key, size_t keylen)
 EVP_PKEY*
 sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo)
 {
+#ifdef HAVE_OSSL_PARAM_BLD_NEW
+       unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */
+       EVP_PKEY *evp_key = NULL;
+       EVP_PKEY_CTX* ctx;
+       OSSL_PARAM_BLD* param_bld;
+       OSSL_PARAM* params = NULL;
+       char* group = NULL;
+
+       /* check length, which uncompressed must be 2 bignums */
+       if(algo == LDNS_ECDSAP256SHA256) {
+               if(keylen != 2*256/8) return NULL;
+               group = "prime256v1";
+       } else if(algo == LDNS_ECDSAP384SHA384) {
+               if(keylen != 2*384/8) return NULL;
+               group = "P-384";
+       } else {
+               return NULL;
+       }
+       if(keylen+1 > sizeof(buf)) { /* sanity check */
+               return NULL;
+       }
+       /* prepend the 0x04 for uncompressed format */
+       buf[0] = POINT_CONVERSION_UNCOMPRESSED;
+       memmove(buf+1, key, keylen);
+
+       param_bld = OSSL_PARAM_BLD_new();
+       if(!param_bld) {
+               return NULL;
+       }
+       if(!OSSL_PARAM_BLD_push_utf8_string(param_bld, "group", group, 0) ||
+          !OSSL_PARAM_BLD_push_octet_string(param_bld, "pub", buf, keylen+1)) {
+               OSSL_PARAM_BLD_free(param_bld);
+               return NULL;
+       }
+       params = OSSL_PARAM_BLD_to_param(param_bld);
+       OSSL_PARAM_BLD_free(param_bld);
+
+       ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL);
+       if(!ctx) {
+               OSSL_PARAM_free(params);
+               return NULL;
+       }
+       if(EVP_PKEY_fromdata_init(ctx) <= 0) {
+               EVP_PKEY_CTX_free(ctx);
+               OSSL_PARAM_free(params);
+               return NULL;
+       }
+       if(EVP_PKEY_fromdata(ctx, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0) {
+               EVP_PKEY_CTX_free(ctx);
+               OSSL_PARAM_free(params);
+               return NULL;
+       }
+       EVP_PKEY_CTX_free(ctx);
+       OSSL_PARAM_free(params);
+       return evp_key;
+#else
        unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */
         const unsigned char* pp = buf;
         EVP_PKEY *evp_key;
@@ -393,6 +649,7 @@ sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo)
                return NULL;
        }
         return evp_key;
+#endif /* HAVE_OSSL_PARAM_BLD_NEW */
 }
 #endif /* USE_ECDSA */
 
index 989b02c..b1f1974 100644 (file)
@@ -57,6 +57,7 @@ int sldns_key_EVP_load_gost_id(void);
 /** Release the engine reference held for the GOST engine. */
 void sldns_key_EVP_unload_gost(void);
 
+#ifndef HAVE_OSSL_PARAM_BLD_NEW
 /**
  * Like sldns_key_buf2dsa, but uses raw buffer.
  * \param[in] key the uncompressed wireformat of the key.
@@ -64,6 +65,15 @@ void sldns_key_EVP_unload_gost(void);
  * \return a DSA * structure with the key material
  */
 DSA *sldns_key_buf2dsa_raw(unsigned char* key, size_t len);
+#endif
+
+/**
+ * Converts a holding buffer with DSA key material to EVP PKEY in openssl.
+ * \param[in] key the uncompressed wireformat of the key.
+ * \param[in] len length of key data
+ * \return the key or NULL on error.
+ */
+EVP_PKEY *sldns_key_dsa2pkey_raw(unsigned char* key, size_t len);
 
 /**
  * Converts a holding buffer with key material to EVP PKEY in openssl.
@@ -84,6 +94,7 @@ EVP_PKEY* sldns_gost2pkey_raw(unsigned char* key, size_t keylen);
  */
 EVP_PKEY* sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo);
 
+#ifndef HAVE_OSSL_PARAM_BLD_NEW
 /**
  * Like sldns_key_buf2rsa, but uses raw buffer.
  * \param[in] key the uncompressed wireformat of the key.
@@ -91,6 +102,15 @@ EVP_PKEY* sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo);
  * \return a RSA * structure with the key material
  */
 RSA *sldns_key_buf2rsa_raw(unsigned char* key, size_t len);
+#endif
+
+/**
+ * Converts a holding buffer with RSA key material to EVP PKEY in openssl.
+ * \param[in] key the uncompressed wireformat of the key.
+ * \param[in] len length of key data
+ * \return the key or NULL on error.
+ */
+EVP_PKEY* sldns_key_rsa2pkey_raw(unsigned char* key, size_t len);
 
 /**
  * Converts a holding buffer with key material to EVP PKEY in openssl.
index f4de860..491c8f5 100644 (file)
@@ -149,6 +149,9 @@ sldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *l
                if (c != '\0' && c != '\n') {
                        *t++ = c;
                }
+               if (c == '\n' && line_nr) {
+                       *line_nr = *line_nr + 1;
+               }
                if (c == '\\' && prev_c == '\\')
                        prev_c = 0;
                else    prev_c = c;
index 44236bf..fa8f51a 100644 (file)
@@ -153,7 +153,6 @@ int sldns_bgetc(struct sldns_buffer *buffer);
  * the position to the first character that is not in *s.
  * \param[in] *buffer buffer to use
  * \param[in] *s characters to skip
- * \return void
  */
 void sldns_bskipcs(struct sldns_buffer *buffer, const char *s);
 
@@ -162,7 +161,6 @@ void sldns_bskipcs(struct sldns_buffer *buffer, const char *s);
  * the position to the first character that is not in *s.
  * \param[in] *fp file to use
  * \param[in] *s characters to skip
- * \return void
  */
 void sldns_fskipcs(FILE *fp, const char *s);
 
@@ -173,7 +171,6 @@ void sldns_fskipcs(FILE *fp, const char *s);
  * \param[in] *fp file to use
  * \param[in] *s characters to skip
  * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes)
- * \return void
  */
 void sldns_fskipcs_l(FILE *fp, const char *s, int *line_nr);
 
index 9f289d3..ba71df5 100644 (file)
@@ -790,3 +790,18 @@ int sldns_b64url_pton(char const *src, size_t srcsize, uint8_t *target,
        }
        return sldns_b64_pton_base(src, srcsize, target, targsize, 1);
 }
+
+int sldns_b64_contains_nonurl(char const *src, size_t srcsize)
+{
+       const char* s = src;
+       while(*s && srcsize) {
+               char d = *s++;
+               srcsize--;
+               /* the '+' and the '/' and padding '=' is not allowed in b64
+                * url encoding */
+               if(d == '+' || d == '/' || d == '=') {
+                       return 1;
+               }
+       }
+       return 0;
+}
index 7eb2331..74d7c72 100644 (file)
@@ -102,6 +102,7 @@ size_t sldns_b64_pton_calculate_size(size_t srcsize);
 int sldns_b64_pton(char const *src, uint8_t *target, size_t targsize);
 int sldns_b64url_pton(char const *src, size_t srcsize, uint8_t *target,
        size_t targsize);
+int sldns_b64_contains_nonurl(char const *src, size_t srcsize);
 
 /**
  * calculates the size needed to store the result of b32_ntop
index 0af015f..fe5c8e1 100644 (file)
@@ -150,6 +150,12 @@ static const sldns_rdf_type type_openpgpkey_wireformat[] = {
 static const sldns_rdf_type type_csync_wireformat[] = {
        LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC
 };
+static const sldns_rdf_type type_zonemd_wireformat[] = {
+       LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX
+};
+static const sldns_rdf_type type_svcb_wireformat[] = {
+       LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME
+};
 /* nsec3 is some vars, followed by same type of data of nsec */
 static const sldns_rdf_type type_nsec3_wireformat[] = {
 /*     LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/
@@ -372,9 +378,12 @@ static sldns_rr_descriptor rdata_field_descriptors[] = {
 {LDNS_RR_TYPE_OPENPGPKEY, "OPENPGPKEY", 1, 1, type_openpgpkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
        /* 62 */
        {LDNS_RR_TYPE_CSYNC, "CSYNC", 3, 3, type_csync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-{(enum sldns_enum_rr_type)0, "TYPE63", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-{(enum sldns_enum_rr_type)0, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
-{(enum sldns_enum_rr_type)0, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
+       /* 63 */
+       {LDNS_RR_TYPE_ZONEMD, "ZONEMD", 4, 4, type_zonemd_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
+       /* 64 */
+       {LDNS_RR_TYPE_SVCB, "SVCB", 2, 2, type_svcb_wireformat, LDNS_RDF_TYPE_SVCPARAM, LDNS_RR_NO_COMPRESS, 0 },
+       /* 65 */
+       {LDNS_RR_TYPE_HTTPS, "HTTPS", 2, 2, type_svcb_wireformat, LDNS_RDF_TYPE_SVCPARAM, LDNS_RR_NO_COMPRESS, 0 },
 {(enum sldns_enum_rr_type)0, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
 {(enum sldns_enum_rr_type)0, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
 {(enum sldns_enum_rr_type)0, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 },
index e084f35..42d5de0 100644 (file)
@@ -195,6 +195,9 @@ enum sldns_enum_rr_type
        LDNS_RR_TYPE_CDNSKEY = 60, /** RFC 7344 */
        LDNS_RR_TYPE_OPENPGPKEY = 61, /* RFC 7929 */
        LDNS_RR_TYPE_CSYNC = 62, /* RFC 7477 */
+       LDNS_RR_TYPE_ZONEMD = 63, /* draft-ietf-dnsop-dns-zone-digest-12 */
+    LDNS_RR_TYPE_SVCB = 64, /* draft-ietf-dnsop-svcb-https-04 */
+    LDNS_RR_TYPE_HTTPS = 65, /* draft-ietf-dnsop-svcb-https-04 */
 
        LDNS_RR_TYPE_SPF = 99, /* RFC 4408 */
 
@@ -352,8 +355,13 @@ enum sldns_enum_rdf_type
        /** TSIG extended 16bit error value */
        LDNS_RDF_TYPE_TSIGERROR,
 
+       /* draft-ietf-dnsop-svcb-https-05:
+        * each SvcParam consisting of a SvcParamKey=SvcParamValue pair or
+        * a standalone SvcParamKey */
+       LDNS_RDF_TYPE_SVCPARAM,
+
         /* Aliases */
-        LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC
+        LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC,
 };
 typedef enum sldns_enum_rdf_type sldns_rdf_type;
 
index 5dbe988..1b7fe37 100644 (file)
@@ -202,7 +202,6 @@ INLINE void sldns_buffer_clear(sldns_buffer *buffer)
  * the position is set to 0.
  *
  * \param[in] buffer the buffer to flip
- * \return void
  */
 INLINE void sldns_buffer_flip(sldns_buffer *buffer)
 {
@@ -732,7 +731,6 @@ int sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...)
 /**
  * frees the buffer.
  * \param[in] *buffer the buffer to be freed
- * \return void
  */
 void sldns_buffer_free(sldns_buffer *buffer);
 
index 977cda2..fbd615c 100644 (file)
@@ -29,7 +29,6 @@
 #define RET_ERR(e, off) ((int)((e)|((off)<<LDNS_WIREPARSE_SHIFT)))
 /** Move parse error but keep its ID */
 #define RET_ERR_SHIFT(e, move) RET_ERR(LDNS_WIREPARSE_ERROR(e), LDNS_WIREPARSE_OFFSET(e)+(move));
-#define LDNS_IP6ADDRLEN      (128/8)
 
 /*
  * No special care is taken, all dots are translated into
@@ -615,6 +614,122 @@ sldns_affix_token(sldns_buffer* strbuf, char* token, size_t* token_len,
        return 1;
 }
 
+static int sldns_str2wire_svcparam_key_cmp(const void *a, const void *b)
+{
+       return sldns_read_uint16(*(uint8_t**) a)
+            - sldns_read_uint16(*(uint8_t**) b);
+}
+
+/**
+ * Add constraints to the SVCB RRs which involve the whole set
+ */
+static int sldns_str2wire_check_svcbparams(uint8_t* rdata, uint16_t rdata_len)
+{
+       size_t   nparams = 0, i;
+       uint8_t  new_rdata[LDNS_MAX_RDFLEN];
+       uint8_t* new_rdata_ptr = new_rdata;
+       uint8_t* svcparams[MAX_NUMBER_OF_SVCPARAMS];
+       uint8_t* rdata_ptr = rdata;
+       uint16_t rdata_remaining = rdata_len;
+
+       /* find the SvcParams */
+       while (rdata_remaining) {
+               uint16_t svcbparam_len;
+
+               svcparams[nparams] = rdata_ptr;
+               if (rdata_remaining < 4)
+                       return LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA;
+               svcbparam_len = sldns_read_uint16(rdata_ptr + 2);
+               rdata_remaining -= 4;
+               rdata_ptr += 4;
+
+               if (rdata_remaining < svcbparam_len)
+                       return LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA;
+               rdata_remaining -= svcbparam_len;
+               rdata_ptr += svcbparam_len;
+
+               nparams += 1;
+               if (nparams >= MAX_NUMBER_OF_SVCPARAMS)
+                       return LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS;
+       }
+
+       /* In draft-ietf-dnsop-svcb-https-06 Section 7:
+        *
+        *     In wire format, the keys are represented by their numeric
+        *     values in network byte order, concatenated in ascending order.
+        */
+       qsort((void *)svcparams
+            ,nparams
+            ,sizeof(uint8_t*)
+            ,sldns_str2wire_svcparam_key_cmp);
+
+
+       /* The code below revolves around sematic errors in the SVCParam set.
+        * So long as we do not distinguish between running Unbound as a primary
+        * or as a secondary, we default to secondary behavior and we ignore the
+        * sematic errors. */
+
+#ifdef SVCB_SEMANTIC_ERRORS
+       {
+               uint8_t* mandatory = NULL;
+               /* In draft-ietf-dnsop-svcb-https-06 Section 7:
+                *
+                *     Keys (...) MUST NOT appear more than once.
+                *
+                * If they key has already been seen, we have a duplicate
+                */
+               for(i=0; i < nparams; i++) {
+                       uint16_t key = sldns_read_uint16(svcparams[i]);
+                       if(i + 1 < nparams && key == sldns_read_uint16(svcparams[i+1]))
+                               return LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS;
+                       if(key == SVCB_KEY_MANDATORY)
+                               mandatory = svcparams[i];
+               }
+
+               /* 4. verify that all the SvcParamKeys in mandatory are present */
+               if(mandatory) {
+                       /* Divide by sizeof(uint16_t)*/
+                       uint16_t mandatory_nkeys = sldns_read_uint16(mandatory + 2) / sizeof(uint16_t);
+
+                       /* Guaranteed by sldns_str2wire_svcparam_key_value */
+                       assert(mandatory_nkeys > 0);
+
+                       for(i=0; i < mandatory_nkeys; i++) {
+                               uint16_t mandatory_key = sldns_read_uint16(
+                                       mandatory
+                                       + 2 * sizeof(uint16_t)
+                                       + i * sizeof(uint16_t));
+                               uint8_t found = 0;
+                               size_t j;
+
+                               for(j=0; j < nparams; j++) {
+                                       if(mandatory_key == sldns_read_uint16(svcparams[j])) {
+                                               found = 1;
+                                               break;
+                                       }
+                               }
+
+                               if(!found)
+                                       return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM;
+                       }
+               }
+       }
+#endif
+       /* Write rdata in correct order */
+       for (i = 0; i < nparams; i++) {
+               uint16_t svcparam_len = sldns_read_uint16(svcparams[i] + 2)
+                                     + 2 * sizeof(uint16_t);
+
+               if ((unsigned)(new_rdata_ptr - new_rdata) + svcparam_len > sizeof(new_rdata))
+                       return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+
+               memcpy(new_rdata_ptr, svcparams[i], svcparam_len);
+               new_rdata_ptr += svcparam_len;
+       }
+       memcpy(rdata, new_rdata, rdata_len);
+       return LDNS_WIREPARSE_ERR_OK;
+}
+
 /** parse rdata from string into rr buffer(-remainder after dname). */
 static int
 rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len,
@@ -712,6 +827,42 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len,
        /* write rdata length */
        sldns_write_uint16(rr+dname_len+8, (uint16_t)(rr_cur_len-dname_len-10));
        *rr_len = rr_cur_len;
+       /* SVCB/HTTPS handling  */
+       if (rr_type == LDNS_RR_TYPE_SVCB || rr_type == LDNS_RR_TYPE_HTTPS) {
+               size_t rdata_len = rr_cur_len - dname_len - 10;
+               uint8_t *rdata = rr+dname_len + 10;
+               
+               /* skip 1st rdata field SvcPriority (uint16_t) */
+               if (rdata_len < sizeof(uint16_t))
+                       return LDNS_WIREPARSE_ERR_OK;
+
+               rdata_len -= sizeof(uint16_t);
+               rdata += sizeof(uint16_t);
+
+               /* skip 2nd rdata field dname */
+               while (rdata_len && *rdata != 0) {
+                       uint8_t label_len;
+
+                       if (*rdata & 0xC0)
+                               return LDNS_WIREPARSE_ERR_OK;
+
+                       label_len = *rdata + 1;
+                       if (rdata_len < label_len)
+                               return LDNS_WIREPARSE_ERR_OK;
+
+                       rdata_len -= label_len;
+                       rdata += label_len;
+               }
+               /* The root label is one more character, so smaller
+                * than 1 + 1 means no Svcparam Keys */
+               if (rdata_len < 2 || *rdata != 0)
+                       return LDNS_WIREPARSE_ERR_OK;
+
+               rdata_len -= 1;
+               rdata += 1;
+               return sldns_str2wire_check_svcbparams(rdata, rdata_len);
+
+       }
        return LDNS_WIREPARSE_ERR_OK;
 }
 
@@ -929,11 +1080,533 @@ int sldns_fp2wire_rr_buf(FILE* in, uint8_t* rr, size_t* len, size_t* dname_len,
                        memmove(parse_state->prev_rr, rr, *dname_len);
                        parse_state->prev_rr_len = (*dname_len);
                }
+               if(r == LDNS_WIREPARSE_ERR_OK && parse_state) {
+                       parse_state->default_ttl = sldns_wirerr_get_ttl(
+                               rr, *len, *dname_len);
+               }
                return r;
        }
        return LDNS_WIREPARSE_ERR_OK;
 }
 
+static int
+sldns_str2wire_svcparam_key_lookup(const char *key, size_t key_len)
+{
+       char buf[64];
+       char *endptr;
+       unsigned long int key_value;
+
+       if (key_len >= 4  && key_len <= 8 && !strncmp(key, "key", 3)) {
+               memcpy(buf, key + 3, key_len - 3);
+               buf[key_len - 3] = 0;
+               key_value = strtoul(buf, &endptr, 10);
+
+               if (endptr > buf        /* digits seen */
+               && *endptr == 0         /* no non-digit chars after digits */
+               &&  key_value <= 65535) /* no overflow */
+                       return key_value;
+
+       } else switch (key_len) {
+       case sizeof("mandatory")-1:
+               if (!strncmp(key, "mandatory", sizeof("mandatory")-1))
+                       return SVCB_KEY_MANDATORY;
+               if (!strncmp(key, "echconfig", sizeof("echconfig")-1))
+                       return SVCB_KEY_ECH; /* allow "echconfig as well as "ech" */
+               break;
+
+       case sizeof("alpn")-1:
+               if (!strncmp(key, "alpn", sizeof("alpn")-1))
+                       return SVCB_KEY_ALPN;
+               if (!strncmp(key, "port", sizeof("port")-1))
+                       return SVCB_KEY_PORT;
+               break;
+
+       case sizeof("no-default-alpn")-1:
+               if (!strncmp( key  , "no-default-alpn"
+                           , sizeof("no-default-alpn")-1))
+                       return SVCB_KEY_NO_DEFAULT_ALPN;
+               break;
+
+       case sizeof("ipv4hint")-1:
+               if (!strncmp(key, "ipv4hint", sizeof("ipv4hint")-1))
+                       return SVCB_KEY_IPV4HINT;
+               if (!strncmp(key, "ipv6hint", sizeof("ipv6hint")-1))
+                       return SVCB_KEY_IPV6HINT;
+               break;
+
+       case sizeof("ech")-1:
+               if (!strncmp(key, "ech", sizeof("ech")-1))
+                       return SVCB_KEY_ECH;
+               break;
+
+       default:
+               break;
+       }
+
+       /* Although the returned value might be used by the caller,
+        * the parser has erred, so the zone will not be loaded.
+        */
+       return -1;
+}
+
+static int
+sldns_str2wire_svcparam_port(const char* val, uint8_t* rd, size_t* rd_len)
+{
+       unsigned long int port;
+       char *endptr;
+
+       if (*rd_len < 6)
+               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+
+       port = strtoul(val, &endptr, 10);
+
+       if (endptr > val        /* digits seen */
+       && *endptr == 0         /* no non-digit chars after digits */
+       &&  port <= 65535) {    /* no overflow */
+
+               sldns_write_uint16(rd, SVCB_KEY_PORT);
+               sldns_write_uint16(rd + 2, sizeof(uint16_t));
+               sldns_write_uint16(rd + 4, port);
+               *rd_len = 6;
+
+               return LDNS_WIREPARSE_ERR_OK;
+       }
+
+       return LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX;
+}
+
+static int
+sldns_str2wire_svcbparam_ipv4hint(const char* val, uint8_t* rd, size_t* rd_len)
+{
+       size_t count;
+       char ip_str[INET_ADDRSTRLEN+1];
+       char *next_ip_str;
+       size_t i;
+
+       for (i = 0, count = 1; val[i]; i++) {
+               if (val[i] == ',')
+                       count += 1;
+               if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) {
+                       return LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES;
+               }
+       }
+
+       if (*rd_len < (LDNS_IP4ADDRLEN * count) + 4)
+               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+
+       /* count is number of comma's in val + 1; so the actual number of IPv4
+        * addresses in val
+        */
+       sldns_write_uint16(rd, SVCB_KEY_IPV4HINT);
+       sldns_write_uint16(rd + 2, LDNS_IP4ADDRLEN * count);
+       *rd_len = 4;
+
+       while (count) {
+               if (!(next_ip_str = strchr(val, ','))) {
+                       if (inet_pton(AF_INET, val, rd + *rd_len) != 1)
+                               break;
+                       *rd_len += LDNS_IP4ADDRLEN;
+
+                       assert(count == 1);
+
+               } else if (next_ip_str - val >= (int)sizeof(ip_str))
+                       break;
+
+               else {
+                       memcpy(ip_str, val, next_ip_str - val);
+                       ip_str[next_ip_str - val] = 0;
+                       if (inet_pton(AF_INET, ip_str, rd + *rd_len) != 1) {
+                               break;
+                       }
+                       *rd_len += LDNS_IP4ADDRLEN;
+
+                       val = next_ip_str + 1;
+               }
+               count--;
+       }
+       if (count) /* verify that we parsed all values */
+               return LDNS_WIREPARSE_ERR_SYNTAX_IP4;
+
+       return LDNS_WIREPARSE_ERR_OK;
+}
+
+static int
+sldns_str2wire_svcbparam_ipv6hint(const char* val, uint8_t* rd, size_t* rd_len)
+{
+       size_t count;
+       char ip_str[INET6_ADDRSTRLEN+1];
+       char *next_ip_str;
+       size_t i;
+
+       for (i = 0, count = 1; val[i]; i++) {
+               if (val[i] == ',')
+                       count += 1;
+               if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) {
+                       return LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES;
+               }
+       }
+
+       if (*rd_len < (LDNS_IP6ADDRLEN * count) + 4)
+               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+
+       /* count is number of comma's in val + 1; so the actual number of IPv6
+        * addresses in val
+        */
+       sldns_write_uint16(rd, SVCB_KEY_IPV6HINT);
+       sldns_write_uint16(rd + 2, LDNS_IP6ADDRLEN * count);
+       *rd_len = 4;
+
+       while (count) {
+               if (!(next_ip_str = strchr(val, ','))) {
+                       if (inet_pton(AF_INET6, val, rd + *rd_len) != 1)
+                               break;
+                       *rd_len += LDNS_IP6ADDRLEN;
+
+                       assert(count == 1);
+
+               } else if (next_ip_str - val >= (int)sizeof(ip_str))
+                       break;
+
+               else {
+                       memcpy(ip_str, val, next_ip_str - val);
+                       ip_str[next_ip_str - val] = 0;
+                       if (inet_pton(AF_INET6, ip_str, rd + *rd_len) != 1) {
+                               break;
+                       }
+                       *rd_len += LDNS_IP6ADDRLEN;
+
+                       val = next_ip_str + 1;
+               }
+               count--;
+       }
+       if (count) /* verify that we parsed all values */
+               return LDNS_WIREPARSE_ERR_SYNTAX_IP6;
+
+       return LDNS_WIREPARSE_ERR_OK;
+}
+
+/* compare function used for sorting uint16_t's */
+static int
+sldns_network_uint16_cmp(const void *a, const void *b)
+{
+       return ((int)sldns_read_uint16(a)) - ((int)sldns_read_uint16(b));
+}
+
+static int
+sldns_str2wire_svcbparam_mandatory(const char* val, uint8_t* rd, size_t* rd_len)
+{
+       size_t i, count, val_len;
+       char* next_key;
+
+       val_len = strlen(val);
+
+       for (i = 0, count = 1; val[i]; i++) {
+               if (val[i] == ',')
+                       count += 1;
+               if (count > SVCB_MAX_COMMA_SEPARATED_VALUES) {
+                       return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS;
+               }
+       }
+       if (sizeof(uint16_t) * (count + 2) > *rd_len)
+               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+
+       sldns_write_uint16(rd, SVCB_KEY_MANDATORY);
+       sldns_write_uint16(rd + 2, sizeof(uint16_t) * count);
+       *rd_len = 4;
+
+       while (1) {
+               int svcparamkey;
+
+               if (!(next_key = strchr(val, ','))) {
+                       svcparamkey = sldns_str2wire_svcparam_key_lookup(val, val_len);
+
+                       if (svcparamkey < 0) {
+                               return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY;
+                       }
+
+                       sldns_write_uint16(rd + *rd_len, svcparamkey);
+                       *rd_len += 2;
+                       break;
+               } else {
+                       svcparamkey = sldns_str2wire_svcparam_key_lookup(val, next_key - val);
+
+                       if (svcparamkey < 0) {
+                               return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY;
+                       }
+
+                       sldns_write_uint16(rd + *rd_len,
+                               svcparamkey);
+                       *rd_len += 2;
+               }
+
+               val_len -= next_key - val + 1;
+               val = next_key + 1; /* skip the comma */
+       }
+
+       /* In draft-ietf-dnsop-svcb-https-06 Section 7:
+        *
+        *    "In wire format, the keys are represented by their numeric
+        *     values in network byte order, concatenated in ascending order."
+        */
+       qsort((void *)(rd + 4), count, sizeof(uint16_t), sldns_network_uint16_cmp);
+
+       /* The code below revolves around sematic errors in the SVCParam set.
+        * So long as we do not distinguish between running Unbound as a primary
+        * or as a secondary, we default to secondary behavior and we ignore the
+        * semantic errors. */
+#ifdef SVCB_SEMANTIC_ERRORS
+       /* In draft-ietf-dnsop-svcb-https-06 Section 8
+        * automatically mandatory MUST NOT appear in its own value-list
+        */
+       if (sldns_read_uint16(rd + 4) == SVCB_KEY_MANDATORY)
+               return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY;
+
+       /* Guarantee key uniqueness. After the sort we only need to
+        * compare neighbouring keys */
+       if (count > 1) {
+               for (i = 0; i < count - 1; i++) {
+                       uint8_t* current_pos = (rd + 4 + (sizeof(uint16_t) * i));
+                       uint16_t key = sldns_read_uint16(current_pos);
+
+                       if (key == sldns_read_uint16(current_pos + 2)) {
+                               return LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY;
+                       }
+               }
+       }
+#endif
+       return LDNS_WIREPARSE_ERR_OK;
+}
+
+static int
+sldns_str2wire_svcbparam_ech_value(const char* val, uint8_t* rd, size_t* rd_len)
+{
+       uint8_t buffer[LDNS_MAX_RDFLEN];
+       int wire_len;
+
+       /* single 0 represents empty buffer */
+       if(strcmp(val, "0") == 0) {
+               if (*rd_len < 4)
+                       return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+               sldns_write_uint16(rd, SVCB_KEY_ECH);
+               sldns_write_uint16(rd + 2, 0);
+
+               return LDNS_WIREPARSE_ERR_OK;
+       }
+
+       wire_len = sldns_b64_pton(val, buffer, LDNS_MAX_RDFLEN);
+
+       if (wire_len <= 0) {
+               return LDNS_WIREPARSE_ERR_SYNTAX_B64;
+       } else if ((unsigned)wire_len + 4 > *rd_len) {
+               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+       } else {
+               sldns_write_uint16(rd, SVCB_KEY_ECH);
+               sldns_write_uint16(rd + 2, wire_len);
+               memcpy(rd + 4, buffer, wire_len);
+               *rd_len = 4 + wire_len;
+
+               return LDNS_WIREPARSE_ERR_OK;
+       }
+}
+
+static const char*
+sldns_str2wire_svcbparam_parse_next_unescaped_comma(const char *val)
+{
+       while (*val) {
+               /* Only return when the comma is not escaped*/
+               if (*val == '\\'){
+                       ++val;
+                       if (!*val)
+                               break;
+               } else if (*val == ',')
+                               return val;
+
+               val++;
+       }
+       return NULL;
+}
+
+/* The source is already properly unescaped, this double unescaping is purely to allow for
+ * comma's in comma seperated alpn lists.
+ * 
+ * In draft-ietf-dnsop-svcb-https-06 Section 7:
+ * To enable simpler parsing, this SvcParamValue MUST NOT contain escape sequences.
+ */
+static size_t
+sldns_str2wire_svcbparam_parse_copy_unescaped(uint8_t *dst,
+       const char *src, size_t len)
+{
+       uint8_t *orig_dst = dst;
+
+       while (len) {
+               if (*src == '\\') {
+                       src++;
+                       len--;
+                       if (!len)
+                               break;
+               }
+               *dst++ = *src++;
+               len--;
+       }
+       return (size_t)(dst - orig_dst);
+}
+
+static int
+sldns_str2wire_svcbparam_alpn_value(const char* val,
+       uint8_t* rd, size_t* rd_len)
+{
+       uint8_t     unescaped_dst[LDNS_MAX_RDFLEN];
+       uint8_t    *dst = unescaped_dst;
+       const char *next_str;
+       size_t      str_len;
+       size_t      dst_len;
+       size_t      val_len;
+       
+       val_len = strlen(val);
+
+       if (val_len > sizeof(unescaped_dst)) {
+               return LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE;
+       }
+       while (val_len) {
+               size_t key_len;
+
+               str_len = (next_str = sldns_str2wire_svcbparam_parse_next_unescaped_comma(val))
+                       ? (size_t)(next_str - val) : val_len;
+
+               if (str_len > 255) {
+                       return LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE;
+               }
+
+               key_len = sldns_str2wire_svcbparam_parse_copy_unescaped(dst + 1, val, str_len);
+               *dst++ = key_len;
+                dst  += key_len;
+
+               if (!next_str)
+                       break;
+
+               /* skip the comma in the next iteration */
+               val_len -= next_str - val + 1;
+               val = next_str + 1;
+       }
+       dst_len = dst - unescaped_dst;
+       if (*rd_len < 4 + dst_len)
+               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+       sldns_write_uint16(rd, SVCB_KEY_ALPN);
+       sldns_write_uint16(rd + 2, dst_len);
+       memcpy(rd + 4, unescaped_dst, dst_len);
+       *rd_len = 4 + dst_len;
+       
+       return LDNS_WIREPARSE_ERR_OK;
+}
+
+static int
+sldns_str2wire_svcparam_value(const char *key, size_t key_len,
+       const char *val, uint8_t* rd, size_t* rd_len)
+{
+       size_t str_len;
+       int svcparamkey = sldns_str2wire_svcparam_key_lookup(key, key_len);
+
+       if (svcparamkey < 0) {
+               return LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY;
+       }
+
+       /* key without value */
+       if (val == NULL) {
+               switch (svcparamkey) {
+#ifdef SVCB_SEMANTIC_ERRORS
+               case SVCB_KEY_MANDATORY:
+               case SVCB_KEY_ALPN:
+               case SVCB_KEY_PORT:
+               case SVCB_KEY_IPV4HINT:
+               case SVCB_KEY_IPV6HINT:
+                       return LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM;
+#endif
+               default:
+                       if (*rd_len < 4)
+                               return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+                       sldns_write_uint16(rd, svcparamkey);
+                       sldns_write_uint16(rd + 2, 0);
+                       *rd_len = 4;
+
+                       return LDNS_WIREPARSE_ERR_OK;
+               }
+       }
+
+       /* value is non-empty */
+       switch (svcparamkey) {
+       case SVCB_KEY_PORT:
+               return sldns_str2wire_svcparam_port(val, rd, rd_len);
+       case SVCB_KEY_IPV4HINT:
+               return sldns_str2wire_svcbparam_ipv4hint(val, rd, rd_len);
+       case SVCB_KEY_IPV6HINT:
+               return sldns_str2wire_svcbparam_ipv6hint(val, rd, rd_len);
+       case SVCB_KEY_MANDATORY:
+               return sldns_str2wire_svcbparam_mandatory(val, rd, rd_len);
+#ifdef SVCB_SEMANTIC_ERRORS
+       case SVCB_KEY_NO_DEFAULT_ALPN:
+               return LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE;
+#endif
+       case SVCB_KEY_ECH:
+               return sldns_str2wire_svcbparam_ech_value(val, rd, rd_len);
+       case SVCB_KEY_ALPN:
+               return sldns_str2wire_svcbparam_alpn_value(val, rd, rd_len);
+       default:
+               str_len = strlen(val);
+               if (*rd_len < 4 + str_len)
+                       return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
+               sldns_write_uint16(rd, svcparamkey);
+               sldns_write_uint16(rd + 2, str_len);
+               memcpy(rd + 4, val, str_len);
+               *rd_len = 4 + str_len;
+
+               return LDNS_WIREPARSE_ERR_OK;
+       }
+
+       return LDNS_WIREPARSE_ERR_GENERAL;
+}
+
+int sldns_str2wire_svcparam_buf(const char* str, uint8_t* rd, size_t* rd_len)
+{
+       const char* eq_pos;
+       char unescaped_val[LDNS_MAX_RDFLEN];
+       char* val_out = unescaped_val;
+       const char* val_in;
+
+       eq_pos = strchr(str, '=');
+
+       /* case: key=value */
+       if (eq_pos != NULL && eq_pos[1]) {
+               val_in = eq_pos + 1;
+               
+               /* unescape characters and "" blocks */
+               if (*val_in == '"') {
+                       val_in++;
+                       while (*val_in != '"'
+                       && (unsigned)(val_out - unescaped_val + 1) < sizeof(unescaped_val)
+                       && sldns_parse_char( (uint8_t*) val_out, &val_in)) {
+                               val_out++;
+                       }
+               } else {
+                       while ((unsigned)(val_out - unescaped_val + 1) < sizeof(unescaped_val)
+                       && sldns_parse_char( (uint8_t*) val_out, &val_in)) {
+                               val_out++;
+                       }
+               }
+               *val_out = 0;
+
+               return sldns_str2wire_svcparam_value(str, eq_pos - str, 
+                                                        unescaped_val[0] ? unescaped_val : NULL, rd, rd_len);
+       }
+       /* case: key= */
+       else if (eq_pos != NULL && !(eq_pos[1])) { 
+               return sldns_str2wire_svcparam_value(str, eq_pos - str, NULL, rd, rd_len);
+       }
+       /* case: key */
+       else {
+               return sldns_str2wire_svcparam_value(str, strlen(str), NULL, rd, rd_len);
+       }
+}
+
 int sldns_str2wire_rdf_buf(const char* str, uint8_t* rd, size_t* len,
        sldns_rdf_type rdftype)
 {
@@ -1006,6 +1679,8 @@ int sldns_str2wire_rdf_buf(const char* str, uint8_t* rd, size_t* len,
                return sldns_str2wire_hip_buf(str, rd, len);
        case LDNS_RDF_TYPE_INT16_DATA:
                return sldns_str2wire_int16_data_buf(str, rd, len);
+       case LDNS_RDF_TYPE_SVCPARAM:
+               return sldns_str2wire_svcparam_buf(str, rd, len);
        case LDNS_RDF_TYPE_UNKNOWN:
        case LDNS_RDF_TYPE_SERVICE:
                return LDNS_WIREPARSE_ERR_NOT_IMPL;
@@ -1491,13 +2166,17 @@ static int
 loc_parse_cm(char* my_str, char** endstr, uint8_t* m, uint8_t* e)
 {
        uint32_t meters = 0, cm = 0, val;
+       char* cm_endstr;
        while (isblank((unsigned char)*my_str)) {
                my_str++;
        }
        meters = (uint32_t)strtol(my_str, &my_str, 10);
        if (*my_str == '.') {
                my_str++;
-               cm = (uint32_t)strtol(my_str, &my_str, 10);
+               cm = (uint32_t)strtol(my_str, &cm_endstr, 10);
+               if(cm_endstr == my_str + 1)
+                       cm *= 10;
+               my_str = cm_endstr;
        }
        if (meters >= 1) {
                *e = 2;
index 70070e4..0c31649 100644 (file)
@@ -23,10 +23,27 @@ extern "C" {
 #endif
 struct sldns_struct_lookup_table;
 
+#define LDNS_IP4ADDRLEN      (32/8)
+#define LDNS_IP6ADDRLEN      (128/8)
+
 /** buffer to read an RR, cannot be larger than 64K because of packet size */
 #define LDNS_RR_BUF_SIZE 65535 /* bytes */
 #define LDNS_DEFAULT_TTL       3600
 
+/* SVCB keys currently defined in draft-ietf-dnsop-svcb-https */
+#define SVCB_KEY_MANDATORY             0
+#define SVCB_KEY_ALPN                  1
+#define SVCB_KEY_NO_DEFAULT_ALPN       2
+#define SVCB_KEY_PORT                  3
+#define SVCB_KEY_IPV4HINT              4
+#define SVCB_KEY_ECH                   5
+#define SVCB_KEY_IPV6HINT              6
+#define SVCPARAMKEY_COUNT              7
+
+#define MAX_NUMBER_OF_SVCPARAMS        64
+
+#define SVCB_MAX_COMMA_SEPARATED_VALUES        1000
+
 /*
  * To convert class and type to string see
  * sldns_get_rr_class_by_name(str)
@@ -204,6 +221,20 @@ uint8_t* sldns_wirerr_get_rdatawl(uint8_t* rr, size_t len, size_t dname_len);
 #define LDNS_WIREPARSE_ERR_SYNTAX_INTEGER_OVERFLOW 370
 #define LDNS_WIREPARSE_ERR_INCLUDE 371
 #define LDNS_WIREPARSE_ERR_PARENTHESIS 372
+#define LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY 373
+#define LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM 374
+#define LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS 375
+#define LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS 376
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS 377
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM 378
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY 379
+#define LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY 380
+#define LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX 381
+#define LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES 382
+#define LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES 383
+#define LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE 384
+#define LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE 385
+#define LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA 386
 
 /**
  * Get reference to a constant string for the (parse) error.
index d0d1632..6a177ec 100644 (file)
@@ -149,6 +149,30 @@ static sldns_lookup_table sldns_wireparse_errors_data[] = {
        { LDNS_WIREPARSE_ERR_SYNTAX_INTEGER_OVERFLOW, "Syntax error, integer overflow" },
        { LDNS_WIREPARSE_ERR_INCLUDE, "$INCLUDE directive was seen in the zone" },
        { LDNS_WIREPARSE_ERR_PARENTHESIS, "Parse error, parenthesis mismatch" },
+       { LDNS_WIREPARSE_ERR_SVCB_UNKNOWN_KEY, "Unknown SvcParamKey"},
+       { LDNS_WIREPARSE_ERR_SVCB_MISSING_PARAM, "SvcParam is missing a SvcParamValue"},
+       { LDNS_WIREPARSE_ERR_SVCB_DUPLICATE_KEYS, "Duplicate SVCB key found"},
+       { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_TOO_MANY_KEYS, "Too many keys in mandatory" },
+       { LDNS_WIREPARSE_ERR_SVCB_TOO_MANY_PARAMS,
+               "Too many SvcParams. Unbound only allows 63 entries" },
+       { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_MISSING_PARAM,
+               "Mandatory SvcParamKey is missing"},
+       { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_DUPLICATE_KEY,
+               "Keys in SvcParam mandatory MUST be unique" },
+       { LDNS_WIREPARSE_ERR_SVCB_MANDATORY_IN_MANDATORY, 
+               "mandatory MUST not be included as mandatory parameter" },
+       { LDNS_WIREPARSE_ERR_SVCB_PORT_VALUE_SYNTAX,
+               "Could not parse port SvcParamValue" },
+       { LDNS_WIREPARSE_ERR_SVCB_IPV4_TOO_MANY_ADDRESSES,
+               "Too many IPv4 addresses in ipv4hint" },
+       { LDNS_WIREPARSE_ERR_SVCB_IPV6_TOO_MANY_ADDRESSES,
+               "Too many IPv6 addresses in ipv6hint" },
+       { LDNS_WIREPARSE_ERR_SVCB_ALPN_KEY_TOO_LARGE,
+               "Alpn strings need to be smaller than 255 chars"},
+       { LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE,
+               "No-default-alpn should not have a value" },
+       { LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA,
+               "General SVCParam error" },
        { 0, NULL }
 };
 sldns_lookup_table* sldns_wireparse_errors = sldns_wireparse_errors_data;
@@ -196,6 +220,12 @@ static sldns_lookup_table sldns_tsig_errors_data[] = {
 };
 sldns_lookup_table* sldns_tsig_errors = sldns_tsig_errors_data;
 
+/* draft-ietf-dnsop-svcb-https-06: 6. Initial SvcParamKeys */
+const char *svcparamkey_strs[] = {
+       "mandatory", "alpn", "no-default-alpn", "port",
+       "ipv4hint", "ech", "ipv6hint"
+};
+
 char* sldns_wire2str_pkt(uint8_t* data, size_t len)
 {
        size_t slen = (size_t)sldns_wire2str_pkt_buf(data, len, NULL, 0);
@@ -940,6 +970,253 @@ int sldns_wire2str_ttl_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen)
        return sldns_str_print(s, slen, "%u", (unsigned)ttl);
 }
 
+static int
+sldns_print_svcparamkey(char** s, size_t* slen, uint16_t svcparamkey)
+{
+       if (svcparamkey < SVCPARAMKEY_COUNT) {
+               return sldns_str_print(s, slen, "%s", svcparamkey_strs[svcparamkey]);
+       }
+       else {
+               return sldns_str_print(s, slen, "key%d", (int)svcparamkey);
+       }
+}
+
+static int sldns_wire2str_svcparam_port2str(char** s,
+       size_t* slen, uint16_t data_len, uint8_t* data)
+{
+       int w = 0;
+
+       if (data_len != 2)
+               return -1; /* wireformat error, a short is 2 bytes */
+       w = sldns_str_print(s, slen, "=%d", (int)sldns_read_uint16(data));
+
+       return w;
+}
+
+static int sldns_wire2str_svcparam_ipv4hint2str(char** s,
+       size_t* slen, uint16_t data_len, uint8_t* data)
+{
+       char ip_str[INET_ADDRSTRLEN + 1];
+
+       int w = 0;
+
+       assert(data_len > 0);
+
+       if ((data_len % LDNS_IP4ADDRLEN) == 0) {
+               if (inet_ntop(AF_INET, data, ip_str, sizeof(ip_str)) == NULL)
+                       return -1; /* wireformat error, incorrect size or inet family */
+
+               w += sldns_str_print(s, slen, "=%s", ip_str);
+               data += LDNS_IP4ADDRLEN;
+
+               while ((data_len -= LDNS_IP4ADDRLEN) > 0) {
+                       if (inet_ntop(AF_INET, data, ip_str, sizeof(ip_str)) == NULL)
+                               return -1; /* wireformat error, incorrect size or inet family */
+
+                       w += sldns_str_print(s, slen, ",%s", ip_str);
+                       data += LDNS_IP4ADDRLEN;
+               }
+       } else
+               return -1;
+
+       return w;
+}
+
+static int sldns_wire2str_svcparam_ipv6hint2str(char** s,
+       size_t* slen, uint16_t data_len, uint8_t* data)
+{
+       char ip_str[INET6_ADDRSTRLEN + 1];
+
+       int w = 0;
+
+       assert(data_len > 0);
+
+       if ((data_len % LDNS_IP6ADDRLEN) == 0) {
+               if (inet_ntop(AF_INET6, data, ip_str, sizeof(ip_str)) == NULL)
+                       return -1; /* wireformat error, incorrect size or inet family */
+
+               w += sldns_str_print(s, slen, "=%s", ip_str);
+               data += LDNS_IP6ADDRLEN;
+
+               while ((data_len -= LDNS_IP6ADDRLEN) > 0) {
+                       if (inet_ntop(AF_INET6, data, ip_str, sizeof(ip_str)) == NULL)
+                               return -1; /* wireformat error, incorrect size or inet family */
+
+                       w += sldns_str_print(s, slen, ",%s", ip_str);
+                       data += LDNS_IP6ADDRLEN;
+               }
+       } else
+               return -1;
+
+       return w;
+}
+
+static int sldns_wire2str_svcparam_mandatory2str(char** s,
+       size_t* slen, uint16_t data_len, uint8_t* data)
+{
+       int w = 0;
+
+       assert(data_len > 0);
+
+       if (data_len % sizeof(uint16_t))
+               return -1; // wireformat error, data_len must be multiple of shorts
+       w += sldns_str_print(s, slen, "=");
+       w += sldns_print_svcparamkey(s, slen, sldns_read_uint16(data));
+       data += 2;
+
+       while ((data_len -= sizeof(uint16_t))) {
+               w += sldns_str_print(s, slen, ",");
+               w += sldns_print_svcparamkey(s, slen, sldns_read_uint16(data));
+               data += 2;
+       }
+
+       return w;
+}
+
+static int sldns_wire2str_svcparam_alpn2str(char** s,
+       size_t* slen, uint16_t data_len, uint8_t* data)
+{
+       uint8_t *dp = (void *)data;
+       int w = 0;
+
+       assert(data_len > 0); /* Guaranteed by sldns_wire2str_svcparam_scan */
+
+       w += sldns_str_print(s, slen, "=\"");
+       while (data_len) {
+               /* alpn is list of length byte (str_len) followed by a string of that size */
+               uint8_t i, str_len = *dp++;
+
+               if (str_len > --data_len)
+                       return -1;
+
+               for (i = 0; i < str_len; i++) {
+                       if (dp[i] == '"' || dp[i] == '\\')
+                               w += sldns_str_print(s, slen, "\\\\\\%c", dp[i]);
+
+                       else if (dp[i] == ',')
+                               w += sldns_str_print(s, slen, "\\\\%c", dp[i]);
+
+                       else if (!isprint(dp[i]))
+                               w += sldns_str_print(s, slen, "\\%03u", (unsigned) dp[i]);
+
+                       else
+                               w += sldns_str_print(s, slen, "%c", dp[i]);
+               }
+               dp += str_len;
+               if ((data_len -= str_len))
+                       w += sldns_str_print(s, slen, "%s", ",");
+       }
+       w += sldns_str_print(s, slen, "\"");
+       
+       return w;
+}
+
+static int sldns_wire2str_svcparam_ech2str(char** s,
+       size_t* slen, uint16_t data_len, uint8_t* data)
+{
+       int size;
+       int w = 0;
+
+       assert(data_len > 0); /* Guaranteed by sldns_wire2str_svcparam_scan */
+
+       w += sldns_str_print(s, slen, "=\"");
+
+       if ((size = sldns_b64_ntop(data, data_len, *s, *slen)) < 0)
+               return -1;
+
+       (*s) += size;
+       (*slen) -= size;
+
+       w += sldns_str_print(s, slen, "\"");    
+
+       return w + size;
+}
+
+int sldns_wire2str_svcparam_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen)
+{
+       uint8_t ch;
+       uint16_t svcparamkey, data_len;
+       int written_chars = 0;
+       int r, i;
+
+       /* verify that we have enough data to read svcparamkey and data_len */
+       if(*dlen < 4)
+               return -1;
+
+       svcparamkey = sldns_read_uint16(*d);
+       data_len = sldns_read_uint16(*d+2);
+       *d    += 4;
+       *dlen -= 4;
+
+       /* verify that we have data_len data */
+       if (data_len > *dlen)
+               return -1; 
+
+       written_chars += sldns_print_svcparamkey(s, slen, svcparamkey);
+       if (!data_len) {
+
+               /* Some SvcParams MUST have values */
+               switch (svcparamkey) {
+               case SVCB_KEY_ALPN:
+               case SVCB_KEY_PORT:
+               case SVCB_KEY_IPV4HINT:
+               case SVCB_KEY_IPV6HINT:
+               case SVCB_KEY_MANDATORY:
+                       return -1;
+               default:
+                       return written_chars;
+               }
+       }
+
+       switch (svcparamkey) {
+       case SVCB_KEY_PORT:
+               r = sldns_wire2str_svcparam_port2str(s, slen, data_len, *d);
+               break;
+       case SVCB_KEY_IPV4HINT:
+               r = sldns_wire2str_svcparam_ipv4hint2str(s, slen, data_len, *d);
+               break;
+       case SVCB_KEY_IPV6HINT:
+               r = sldns_wire2str_svcparam_ipv6hint2str(s, slen, data_len, *d);
+               break;
+       case SVCB_KEY_MANDATORY:
+               r = sldns_wire2str_svcparam_mandatory2str(s, slen, data_len, *d);
+               break;
+       case SVCB_KEY_NO_DEFAULT_ALPN:
+               return -1;  /* wireformat error, should not have a value */
+       case SVCB_KEY_ALPN:
+               r = sldns_wire2str_svcparam_alpn2str(s, slen, data_len, *d);
+               break;
+       case SVCB_KEY_ECH:
+               r = sldns_wire2str_svcparam_ech2str(s, slen, data_len, *d);
+               break;
+       default:
+               r = sldns_str_print(s, slen, "=\"");
+
+               for (i = 0; i < data_len; i++) {
+                       ch = (*d)[i];
+
+                       if (ch == '"' || ch == '\\')
+                               r += sldns_str_print(s, slen, "\\%c", ch);
+
+                       else if (!isprint(ch))
+                               r += sldns_str_print(s, slen, "\\%03u", (unsigned) ch);
+
+                       else
+                               r += sldns_str_print(s, slen, "%c", ch);
+
+               }
+               r += sldns_str_print(s, slen, "\"");
+               break;
+       }
+       if (r <= 0)
+               return -1; /* wireformat error */
+       
+       written_chars += r;
+       *d    += data_len;
+       *dlen -= data_len;
+       return written_chars;
+}
+
 int sldns_wire2str_rdf_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen,
        int rdftype, uint8_t* pkt, size_t pktlen, int* comprloop)
 {
@@ -1017,6 +1294,8 @@ int sldns_wire2str_rdf_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen,
                return sldns_wire2str_tag_scan(d, dlen, s, slen);
        case LDNS_RDF_TYPE_LONG_STR:
                return sldns_wire2str_long_str_scan(d, dlen, s, slen);
+       case LDNS_RDF_TYPE_SVCPARAM:
+               return sldns_wire2str_svcparam_scan(d, dlen, s, slen);
        case LDNS_RDF_TYPE_TSIGERROR:
                return sldns_wire2str_tsigerror_scan(d, dlen, s, slen);
        }
index 0167fe7..b1ad459 100644 (file)
@@ -494,6 +494,18 @@ int sldns_wire2str_opcode_buf(int opcode, char* str, size_t len);
 int sldns_wire2str_dname_buf(uint8_t* dname, size_t dname_len, char* str,
        size_t len);
 
+/**
+ * Convert wire SVCB to a string with user buffer.
+ * @param d: the SVCB data in uncompressed wireformat.
+ * @param dlen: length of the SVCB data.
+ * @param s: the string to write to.
+ * @param slen: length of string.
+ * @return the number of characters for this element, excluding zerobyte.
+ *     Is larger or equal than str_len if output was truncated.
+ */
+int sldns_wire2str_svcparam_scan(uint8_t** d, size_t* dlen, char** s,
+       size_t* slen);
+
 /**
  * Scan wireformat rdf field to string, with user buffers.
  * It shifts the arguments to move along (see sldns_wire2str_pkt_scan).
index 2fb8d0d..4725e7d 100644 (file)
@@ -105,11 +105,14 @@ config_create(void)
        cfg->do_ip6 = 1;
        cfg->do_udp = 1;
        cfg->do_tcp = 1;
+       cfg->tcp_reuse_timeout = 60 * 1000; /* 60s in milisecs */
+       cfg->max_reuse_tcp_queries = 200;
        cfg->tcp_upstream = 0;
        cfg->udp_upstream_without_downstream = 0;
        cfg->tcp_mss = 0;
        cfg->outgoing_tcp_mss = 0;
        cfg->tcp_idle_timeout = 30 * 1000; /* 30s in millisecs */
+       cfg->tcp_auth_query_timeout = 3 * 1000; /* 3s in millisecs */
        cfg->do_tcp_keepalive = 0;
        cfg->tcp_keepalive_timeout = 120 * 1000; /* 120s in millisecs */
        cfg->ssl_service_key = NULL;
@@ -235,8 +238,10 @@ config_create(void)
        cfg->hide_identity = 0;
        cfg->hide_version = 0;
        cfg->hide_trustanchor = 0;
+       cfg->hide_http_user_agent = 0;
        cfg->identity = NULL;
        cfg->version = NULL;
+       cfg->http_user_agent = NULL;
        cfg->nsid_cfg_str = NULL;
        cfg->nsid = NULL;
        cfg->nsid_len = 0;
@@ -250,6 +255,7 @@ config_create(void)
        cfg->val_date_override = 0;
        cfg->val_sig_skew_min = 3600; /* at least daylight savings trouble */
        cfg->val_sig_skew_max = 86400; /* at most timezone settings trouble */
+       cfg->val_max_restart = 5;
        cfg->val_clean_additional = 1;
        cfg->val_log_level = 0;
        cfg->val_log_squelch = 0;
@@ -262,6 +268,7 @@ config_create(void)
        cfg->serve_expired_reply_ttl = 30;
        cfg->serve_expired_client_timeout = 0;
        cfg->serve_original_ttl = 0;
+       cfg->zonemd_permissive_mode = 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 */
@@ -305,7 +312,7 @@ config_create(void)
        if(!(cfg->module_conf = strdup("validator iterator"))) goto error_exit;
 #endif
        if(!(cfg->val_nsec3_key_iterations = 
-               strdup("1024 150 2048 500 4096 2500"))) goto error_exit;
+               strdup("1024 150 2048 150 4096 150"))) goto error_exit;
 #if defined(DNSTAP_SOCKET_PATH)
        if(!(cfg->dnstap_socket_path = strdup(DNSTAP_SOCKET_PATH)))
                goto error_exit;
@@ -516,7 +523,10 @@ int config_set_option(struct config_file* cfg, const char* opt,
                udp_upstream_without_downstream)
        else S_NUMBER_NONZERO("tcp-mss:", tcp_mss)
        else S_NUMBER_NONZERO("outgoing-tcp-mss:", outgoing_tcp_mss)
+       else S_NUMBER_NONZERO("tcp-auth-query-timeout:", tcp_auth_query_timeout)
        else S_NUMBER_NONZERO("tcp-idle-timeout:", tcp_idle_timeout)
+       else S_NUMBER_NONZERO("max-reuse-tcp-queries:", max_reuse_tcp_queries)
+       else S_NUMBER_NONZERO("tcp-reuse-timeout:", tcp_reuse_timeout)
        else S_YNO("edns-tcp-keepalive:", do_tcp_keepalive)
        else S_NUMBER_NONZERO("edns-tcp-keepalive-timeout:", tcp_keepalive_timeout)
        else S_YNO("ssl-upstream:", ssl_upstream)
@@ -587,8 +597,10 @@ int config_set_option(struct config_file* cfg, const char* opt,
        else S_YNO("hide-identity:", hide_identity)
        else S_YNO("hide-version:", hide_version)
        else S_YNO("hide-trustanchor:", hide_trustanchor)
+       else S_YNO("hide-http-user-agent:", hide_http_user_agent)
        else S_STR("identity:", identity)
        else S_STR("version:", version)
+       else S_STR("http-user-agent:", http_user_agent)
        else if(strcmp(opt, "nsid:") == 0) {
                free(cfg->nsid_cfg_str);
                if (!(cfg->nsid_cfg_str = strdup(val)))
@@ -649,6 +661,7 @@ int config_set_option(struct config_file* cfg, const char* opt,
        else S_NUMBER_OR_ZERO("serve-expired-client-timeout:", serve_expired_client_timeout)
        else S_YNO("serve-original-ttl:", serve_original_ttl)
        else S_STR("val-nsec3-keysize-iterations:", val_nsec3_key_iterations)
+       else S_YNO("zonemd-permissive-mode:", zonemd_permissive_mode)
        else S_UNSIGNED_OR_ZERO("add-holddown:", add_holddown)
        else S_UNSIGNED_OR_ZERO("del-holddown:", del_holddown)
        else S_UNSIGNED_OR_ZERO("keep-missing:", keep_missing)
@@ -756,12 +769,14 @@ int config_set_option(struct config_file* cfg, const char* opt,
 #endif
        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,
-        * so this does not update val_env with set_option */
+       /* val_sig_skew_min, max and val_max_restart are copied into val_env
+        * during init so this does not update val_env with set_option */
        } else if(strcmp(opt, "val-sig-skew-min:") == 0)
        { IS_NUMBER_OR_ZERO; cfg->val_sig_skew_min = (int32_t)atoi(val); }
        else if(strcmp(opt, "val-sig-skew-max:") == 0)
        { IS_NUMBER_OR_ZERO; cfg->val_sig_skew_max = (int32_t)atoi(val); }
+       else if(strcmp(opt, "val-max-restart:") == 0)
+       { IS_NUMBER_OR_ZERO; cfg->val_max_restart = (int32_t)atoi(val); }
        else if (strcmp(opt, "outgoing-interface:") == 0) {
                char* d = strdup(val);
                char** oi = 
@@ -1005,7 +1020,10 @@ config_get_option(struct config_file* cfg, const char* opt,
        else O_YNO(opt, "udp-upstream-without-downstream", udp_upstream_without_downstream)
        else O_DEC(opt, "tcp-mss", tcp_mss)
        else O_DEC(opt, "outgoing-tcp-mss", outgoing_tcp_mss)
+       else O_DEC(opt, "tcp-auth-query-timeout", tcp_auth_query_timeout)
        else O_DEC(opt, "tcp-idle-timeout", tcp_idle_timeout)
+       else O_DEC(opt, "max-reuse-tcp-queries", max_reuse_tcp_queries)
+       else O_DEC(opt, "tcp-reuse-timeout", tcp_reuse_timeout)
        else O_YNO(opt, "edns-tcp-keepalive", do_tcp_keepalive)
        else O_DEC(opt, "edns-tcp-keepalive-timeout", tcp_keepalive_timeout)
        else O_YNO(opt, "ssl-upstream", ssl_upstream)
@@ -1041,8 +1059,10 @@ config_get_option(struct config_file* cfg, const char* opt,
        else O_YNO(opt, "hide-identity", hide_identity)
        else O_YNO(opt, "hide-version", hide_version)
        else O_YNO(opt, "hide-trustanchor", hide_trustanchor)
+       else O_YNO(opt, "hide-http-user-agent", hide_http_user_agent)
        else O_STR(opt, "identity", identity)
        else O_STR(opt, "version", version)
+       else O_STR(opt, "http-user-agent", http_user_agent)
        else O_STR(opt, "nsid", nsid_cfg_str)
        else O_STR(opt, "target-fetch-policy", target_fetch_policy)
        else O_YNO(opt, "harden-short-bufsize", harden_short_bufsize)
@@ -1070,6 +1090,7 @@ config_get_option(struct config_file* cfg, const char* opt,
        else O_DEC(opt, "serve-expired-client-timeout", serve_expired_client_timeout)
        else O_YNO(opt, "serve-original-ttl", serve_original_ttl)
        else O_STR(opt, "val-nsec3-keysize-iterations",val_nsec3_key_iterations)
+       else O_YNO(opt, "zonemd-permissive-mode", zonemd_permissive_mode)
        else O_UNS(opt, "add-holddown", add_holddown)
        else O_UNS(opt, "del-holddown", del_holddown)
        else O_UNS(opt, "keep-missing", keep_missing)
@@ -1178,6 +1199,7 @@ config_get_option(struct config_file* cfg, const char* opt,
        else O_DEC(opt, "fast-server-permil", fast_server_permil)
        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_DEC(opt, "val-max-restart", val_max_restart)
        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)
@@ -1516,6 +1538,7 @@ config_delete(struct config_file* cfg)
 #endif
        free(cfg->identity);
        free(cfg->version);
+       free(cfg->http_user_agent);
        free(cfg->nsid_cfg_str);
        free(cfg->nsid);
        free(cfg->module_conf);
@@ -1681,6 +1704,37 @@ int cfg_condense_ports(struct config_file* cfg, int** avail)
        return num;
 }
 
+void cfg_apply_local_port_policy(struct config_file* cfg, int num) {
+(void)cfg;
+(void)num;
+#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE
+       {
+               int i = 0;
+               FILE* range_fd;
+               if ((range_fd = fopen(LINUX_IP_LOCAL_PORT_RANGE_PATH, "r")) != NULL) {
+                       int min_port = 0;
+                       int max_port = num - 1;
+                       if (fscanf(range_fd, "%d %d", &min_port, &max_port) == 2) {
+                               for(i=0; i<min_port; i++) {
+                                       cfg->outgoing_avail_ports[i] = 0;
+                               }
+                               for(i=max_port+1; i<num; i++) {
+                                       cfg->outgoing_avail_ports[i] = 0;
+                               }
+                       } else {
+                               log_err("unexpected port range in %s",
+                                               LINUX_IP_LOCAL_PORT_RANGE_PATH);
+                       }
+                       fclose(range_fd);
+               } else {
+                       log_err("failed to read from file: %s (%s)",
+                                       LINUX_IP_LOCAL_PORT_RANGE_PATH,
+                                       strerror(errno));
+               }
+       }
+#endif
+}
+
 /** print error with file and line number */
 static void ub_c_error_va_list(const char *fmt, va_list args)
 {
@@ -2605,3 +2659,27 @@ int options_remote_is_address(struct config_file* cfg)
        return (cfg->control_ifs.first->str[0] != '/');
 }
 
+/** see if interface is https, its port number == the https port number */
+int
+if_is_https(const char* ifname, const char* port, int https_port)
+{
+       char* p = strchr(ifname, '@');
+       if(!p && atoi(port) == https_port)
+               return 1;
+       if(p && atoi(p+1) == https_port)
+               return 1;
+       return 0;
+}
+
+/** see if config contains https turned on */
+int cfg_has_https(struct config_file* cfg)
+{
+       int i;
+       char portbuf[32];
+       snprintf(portbuf, sizeof(portbuf), "%d", cfg->port);
+       for(i = 0; i<cfg->num_ifs; i++) {
+               if(if_is_https(cfg->ifs[i], portbuf, cfg->https_port))
+                       return 1;
+       }
+       return 0;
+}
index 7cf27cc..aed6812 100644 (file)
@@ -93,6 +93,12 @@ struct config_file {
        int do_udp;
        /** do tcp query support. */
        int do_tcp;
+       /** max number of queries on a reuse connection. */
+       size_t max_reuse_tcp_queries;
+       /** timeout for REUSE entries in milliseconds. */
+       int tcp_reuse_timeout;
+       /** timeout in milliseconds for TCP queries to auth servers. */
+       int tcp_auth_query_timeout;
        /** tcp upstream queries (no UDP upstream queries) */
        int tcp_upstream;
        /** udp upstream enabled when no UDP downstream is enabled (do_udp no)*/
@@ -334,10 +340,14 @@ struct config_file {
        int hide_version;
        /** do not report trustanchor (trustanchor.unbound) */
        int hide_trustanchor;
+       /** do not report the User-Agent HTTP header */
+       int hide_http_user_agent;
        /** identity, hostname is returned if "". */
        char* identity;
        /** version, package version returned if "". */
        char* version;
+       /** User-Agent for HTTP header */
+       char* http_user_agent;
        /** nsid */
        char *nsid_cfg_str;
        uint8_t *nsid;
@@ -367,6 +377,8 @@ struct config_file {
        int32_t val_sig_skew_min;
        /** the maximum for signature clock skew */
        int32_t val_sig_skew_max;
+       /** max number of query restarts, number of IPs to probe */
+       int32_t val_max_restart;
        /** this value sets the number of seconds before revalidating bogus */
        int bogus_ttl; 
        /** should validator clean additional section for secure msgs */
@@ -396,6 +408,8 @@ struct config_file {
        int serve_original_ttl;
        /** nsec3 maximum iterations per key size, string */
        char* val_nsec3_key_iterations;
+       /** if zonemd failures are permitted, only logged */
+       int zonemd_permissive_mode;
        /** autotrust add holddown time, in seconds */
        unsigned int add_holddown;
        /** autotrust del holddown time, in seconds */
@@ -727,6 +741,10 @@ struct config_auth {
        /** Always reply with this CNAME target if the cname override action is
         * used */
        char* rpz_cname;
+       /** Check ZONEMD records for this zone */
+       int zonemd_check;
+       /** Reject absence of ZONEMD records, zone must have one */
+       int zonemd_reject_absence;
 };
 
 /**
@@ -1172,6 +1190,13 @@ int cfg_mark_ports(const char* str, int allow, int* avail, int num);
  */
 int cfg_condense_ports(struct config_file* cfg, int** avail);
 
+/**
+ * Apply system specific port range policy.
+ * @param cfg: config file.
+ * @param num: size of the array (65536).
+ */
+void cfg_apply_local_port_policy(struct config_file* cfg, int num);
+
 /**
  * Scan ports available
  * @param avail: the array from cfg.
@@ -1301,5 +1326,19 @@ void w_config_adjust_directory(struct config_file* cfg);
 /** debug option for unit tests. */
 extern int fake_dsa, fake_sha1;
 
+/** see if interface is https, its port number == the https port number */
+int if_is_https(const char* ifname, const char* port, int https_port);
+
+/**
+ * Return true if the config contains settings that enable https.
+ * @param cfg: config information.
+ * @return true if https ports are used for server.
+ */
+int cfg_has_https(struct config_file* cfg);
+
+#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE
+#define LINUX_IP_LOCAL_PORT_RANGE_PATH "/proc/sys/net/ipv4/ip_local_port_range"
+#endif
+
 #endif /* UTIL_CONFIG_FILE_H */
 
index 6b0f335..186860b 100644 (file)
@@ -5,7 +5,7 @@
 
 #define  YY_INT_ALIGNED short int
 
-/*     $OpenBSD: configlexer.c,v 1.10 2021/03/16 18:38:05 florian Exp $        */
+/*     $OpenBSD: configlexer.c,v 1.11 2021/08/14 07:32:46 florian Exp $        */
 
 /* A lexical scanner generated by flex */
 
@@ -27,7 +27,7 @@
 
 /* end standard C headers. */
 
-/* $OpenBSD: configlexer.c,v 1.10 2021/03/16 18:38:05 florian Exp $ */
+/* $OpenBSD: configlexer.c,v 1.11 2021/08/14 07:32:46 florian Exp $ */
 
 /* flex integer type definitions */
 
@@ -368,8 +368,8 @@ static void yy_fatal_error (yyconst char msg[]  );
        *yy_cp = '\0'; \
        (yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 343
-#define YY_END_OF_BUFFER 344
+#define YY_NUM_RULES 352
+#define YY_END_OF_BUFFER 353
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -377,377 +377,391 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_accept[3354] =
+static yyconst flex_int16_t yy_accept[3484] =
     {   0,
-        1,    1,  317,  317,  321,  321,  325,  325,  329,  329,
-        1,    1,  333,  333,  337,  337,  344,  341,    1,  315,
-      315,  342,    2,  342,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  317,  318,  318,  319,
-      342,  321,  322,  322,  323,  342,  328,  325,  326,  326,
-      327,  342,  329,  330,  330,  331,  342,  340,  316,    2,
-      320,  342,  340,  336,  333,  334,  334,  335,  342,  337,
-      338,  338,  339,  342,  341,    0,    1,    2,    2,    2,
-        2,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  317,
-        0,  321,    0,  328,    0,  325,  329,    0,  340,    0,
-        2,    2,  340,  336,    0,  333,  337,    0,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  340,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  125,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  134,
-      341,  341,  341,  341,  341,  341,  341,  340,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  109,  341,  314,  341,
-      341,  341,  341,  341,  341,  341,    8,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  126,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  139,  341,  340,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  307,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  340,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,   64,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      239,  341,   14,   15,  341,   19,   18,  341,  341,  223,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  132,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  221,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,    3,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      340,  341,  341,  341,  341,  341,  341,  341,  301,  341,
-      341,  300,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  324,
-      341,  341,  341,  341,  341,  341,  341,  341,   63,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,   67,  341,  270,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  308,  309,  341,  341,
-      341,  341,  341,  341,  341,   68,  341,  341,  133,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  129,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  210,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,   21,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  158,  341,  341,  340,  324,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      107,  341,  341,  341,  341,  341,  341,  341,  278,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  182,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  157,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  106,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-       32,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-       33,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,   65,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  131,  340,  341,  341,
-
-      341,  341,  341,  124,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,   66,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  243,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  183,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,   54,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  261,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,   58,  341,   59,
-      341,  341,  341,  341,  341,  110,  341,  111,  341,  341,
-      341,  341,  108,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,    7,  341,  340,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  232,  341,  341,  341,  341,  160,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  244,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,   45,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,   55,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  202,  341,  201,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,   16,   17,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,   69,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  209,  341,  341,  341,
-      341,  341,  341,  113,  341,  112,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  193,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  140,  340,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  101,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,   89,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  222,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,   94,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,   62,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  196,  197,  341,  341,  341,
-      272,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,    6,  341,  341,  341,  341,  341,  341,
-      291,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  276,  341,
-      341,  341,  341,  341,  341,  302,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,   42,  341,  341,
-      341,  341,   44,  341,  341,  341,   90,  341,  341,  341,
-
-      341,  341,   52,  341,  341,  341,  341,  341,  341,  341,
-      340,  341,  189,  341,  341,  341,  135,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  214,  341,  190,
-      341,  341,  341,  229,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,   53,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  137,  118,  341,  119,  341,
-      341,  341,  117,  341,  341,  341,  341,  341,  341,  341,
-      341,  155,  341,  341,   50,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  260,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  191,  341,  341,  341,  341,  341,  194,  341,  200,
-      341,  341,  341,  341,  341,  228,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  105,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  130,  341,  341,  341,  341,  341,  341,  341,   60,
-      341,  341,  341,   26,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,   20,  341,  341,  341,  341,  341,  341,
-       27,   36,  341,  165,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  340,  341,  341,
-      341,  341,  341,  341,   77,   79,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  280,
-      341,  341,  341,  341,  240,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  120,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  154,  341,   46,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  295,  341,  341,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      159,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  289,  341,  341,  341,  220,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  305,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  176,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  114,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  171,
-      341,  184,  341,  341,  341,  341,  340,  341,  143,  341,
-      341,  341,  341,  341,  100,  341,  341,  341,  341,  212,
-
-      341,  341,  341,  341,  341,  341,  230,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  252,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  136,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  175,
-      341,  341,  341,  341,  341,  341,   80,  341,   81,  341,
-      341,  341,  341,  341,   61,  298,  341,  341,  341,  341,
-      341,   88,  185,  341,  203,  341,  233,  341,  341,  195,
-      273,  341,  341,  341,  341,  341,   73,  341,  187,  341,
-      341,  341,  341,  341,    9,  341,  341,  341,  341,  341,
-
-      104,  341,  341,  341,  341,  265,  341,  341,  341,  341,
-      211,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  340,  341,  341,
-      341,  341,  174,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  161,  341,  279,  341,  341,  341,  341,
-      341,  251,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  224,  341,  341,  341,  341,  341,  271,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      299,  341,  186,  341,  341,  341,  341,  341,  341,  341,
-       72,   74,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  103,  341,  341,  341,  341,  263,  341,  341,  341,
-      341,  275,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  216,   34,   28,   30,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,   35,  341,   29,
-       31,  341,  341,  341,  341,  341,  341,  341,  341,   99,
-
-      341,  341,  341,  341,  341,  341,  340,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  218,  215,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,   71,  341,
-      341,  341,  138,  341,  121,  341,  341,  341,  341,  341,
-      341,  341,  341,  156,   47,  341,  341,  341,  332,   13,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      293,  341,  296,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,   12,  341,  341,   22,  341,  341,  341,
-      341,  341,  269,  341,  341,  341,  341,  277,  341,  341,
-
-      341,   75,  341,  226,  341,  341,  341,  341,  341,  217,
-      341,  341,   70,  341,  341,  341,  341,   23,  341,   43,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  170,  169,  332,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  219,  213,  341,  231,  341,  341,
-      281,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,   82,  341,  341,  341,  341,  264,  341,
-      341,  341,  341,  199,  341,  341,  341,  341,  225,  341,
-
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      303,  304,  167,  341,  341,   76,  341,  341,  341,  341,
-      177,  341,  341,  341,  115,  116,  341,  341,  341,  341,
-      162,  341,  164,  341,  204,  341,  341,  341,  341,  168,
-      341,  341,  234,  341,  341,  341,  341,  341,  341,  341,
-      145,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  242,  341,  341,  341,  341,  341,  341,
-      341,  312,  341,   24,  341,  274,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-       86,  205,  341,  341,  262,  341,  297,  341,  198,  341,
-
-      341,  341,  341,   56,  341,  341,  341,  341,  341,  341,
-        4,  341,  341,  341,  341,  128,  144,  341,  341,  341,
-      181,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  237,   37,   38,  341,
-      341,  341,  341,  341,  341,  341,  282,  341,  341,  341,
-      341,  341,  341,  341,  250,  341,  341,  341,  341,  341,
-      341,  341,  341,  208,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,   85,  341,   57,  268,
-      341,  238,  341,  341,  341,  341,   11,  341,  341,  341,
-      341,  341,  341,  341,  341,  127,  341,  341,  341,  341,
-
-      206,   91,  341,   40,  341,  341,  341,  341,  341,  341,
-      341,  341,  173,  341,  341,  341,  341,  341,  147,  341,
-      341,  341,  341,  241,  341,  341,  341,  341,  341,  249,
-      341,  341,  341,  341,  141,  341,  341,  341,  122,  123,
-      341,  341,  341,   93,   97,   92,  341,  341,  341,  341,
-       83,  341,  341,  341,  341,  341,   10,  341,  341,  341,
-      341,  341,  266,  306,  341,  341,  341,  341,  311,   39,
-      341,  341,  341,  341,  341,  172,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,   98,
-
-       96,  341,   51,  341,  341,   84,  294,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  192,  341,  341,  341,
-      341,  341,  207,  341,  341,  341,  341,  341,  341,  341,
-      341,  163,   78,  341,  341,  341,  341,  341,  283,  341,
-      341,  341,  341,  341,  341,  341,  246,  341,  341,  245,
-      142,  341,  341,   95,   48,  341,  148,  149,  152,  153,
-      150,  151,   87,  292,  341,  341,  267,  341,  341,  341,
-      341,  166,  341,  341,  341,  341,  341,  236,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  179,  178,
-
-       41,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  290,  341,  341,  341,  341,  102,  341,
-      235,  341,  259,  287,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  313,  341,   49,    5,  341,
-      341,  227,  341,  341,  288,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  247,   25,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  248,  341,
-      341,  341,  146,  341,  341,  341,  341,  341,  341,  341,
-      341,  180,  341,  188,  341,  341,  341,  341,  341,  341,
-
-      341,  341,  341,  284,  341,  341,  341,  341,  341,  341,
-      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
-      341,  310,  341,  341,  255,  341,  341,  341,  341,  341,
-      285,  341,  341,  341,  341,  341,  341,  286,  341,  341,
-      341,  253,  341,  256,  257,  341,  341,  341,  341,  341,
-      254,  258,    0
+        1,    1,  326,  326,  330,  330,  334,  334,  338,  338,
+        1,    1,  342,  342,  346,  346,  353,  350,    1,  324,
+      324,  351,    2,  351,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  326,  327,  327,  328,
+      351,  330,  331,  331,  332,  351,  337,  334,  335,  335,
+      336,  351,  338,  339,  339,  340,  351,  349,  325,    2,
+      329,  351,  349,  345,  342,  343,  343,  344,  351,  346,
+      347,  347,  348,  351,  350,    0,    1,    2,    2,    2,
+        2,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  326,
+        0,  330,    0,  337,    0,  334,  338,    0,  349,    0,
+        2,    2,  349,  345,    0,  342,  346,    0,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  349,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  128,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  137,
+      350,  350,  350,  350,  350,  350,  350,  349,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  112,  350,  323,
+      350,  350,  350,  350,  350,  350,  350,    8,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  129,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  142,  350,  350,  349,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  316,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  349,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,   67,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  248,  350,   14,   15,  350,   19,   18,  350,
+      350,  232,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  135,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      230,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+        3,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  349,
+      350,  350,  350,  350,  350,  350,  350,  310,  350,  350,
+      309,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      333,  350,  350,  350,  350,  350,  350,  350,  350,   66,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,   70,  350,  279,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  317,  318,
+      350,  350,  350,  350,  350,  350,  350,   71,  350,  350,
+      136,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  132,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  219,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,   21,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  162,
+      350,  350,  350,  350,  350,  349,  333,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  110,  350,
+      350,  350,  350,  350,  350,  350,  287,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  188,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  161,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  109,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,   35,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,   36,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,   68,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      134,  350,  350,  350,  349,  350,  350,  350,  350,  350,
+      127,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,   69,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  252,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  189,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,   57,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  270,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,   61,  350,   62,
+
+      350,  350,  350,  350,  350,  113,  350,  114,  350,  350,
+      350,  350,  111,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,    7,  350,  350,  350,  350,
+      349,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  241,
+      350,  350,  350,  350,  165,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  253,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+       48,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+       58,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  211,  350,  210,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,   16,   17,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,   72,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  218,  350,  350,  350,  350,
+      350,  350,  116,  350,  115,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  202,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  143,
+      350,  350,  350,  349,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  104,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,   92,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      231,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,   97,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,   65,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  205,  206,  350,  350,  350,  281,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,    6,  350,  350,  350,  350,  350,  350,  300,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  285,  350,  350,  350,
+      350,  350,  350,  311,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,   45,  350,  350,
+      350,  350,   47,  350,  350,  350,   93,  350,  350,  350,
+      350,  350,   55,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  349,  350,  198,  350,  350,  350,
+      138,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  223,  350,  199,  350,  350,  350,  238,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,   56,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  140,
+      121,  350,  122,  350,  350,  350,  120,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  158,  350,  350,   53,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  269,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  200,  350,  350,
+      350,  350,  350,  203,  350,  209,  350,  350,  350,  350,
+      350,  350,  237,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  108,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  133,  350,
+      350,  350,  350,  350,  350,  350,   63,  350,  350,  350,
+       29,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,   20,  350,  350,  350,  350,  350,  350,   30,
+       39,  350,  170,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  196,  350,  350,
+      349,  350,  350,  350,  350,  350,  350,   80,   82,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  289,  350,  350,  350,  350,  249,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      123,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  157,  350,   49,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  304,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  164,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  298,
+
+      350,  350,  350,  229,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  314,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  182,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  117,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  177,  350,  190,
+      350,  350,  350,  350,  350,  350,  350,  349,  350,  146,
+      350,  350,  350,  350,  350,  103,  350,  350,  350,  350,
+      221,  350,  350,  350,  350,  350,  350,  239,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  261,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  139,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  181,  350,  350,  350,  350,  350,  350,   83,
+      350,   84,  350,  350,  350,  350,  350,   64,  307,  350,
+      350,  350,  350,  350,   91,  191,  350,  212,  350,  242,
+      350,  350,  204,  282,  350,  350,  350,  350,  350,  350,
+       76,  350,  193,  350,  350,  350,  350,  350,    9,  350,
+      350,  350,  350,  350,  107,  350,  350,  350,  350,  274,
+      350,  350,  350,  350,  220,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  349,  350,  350,  350,
+      350,  180,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  166,  350,  288,  350,  350,  350,  350,  350,
+      260,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  233,  350,  350,  350,  350,  350,  280,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  163,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  308,  350,  192,  350,  350,  350,  350,  350,  350,
+      350,  350,   75,   77,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  106,  350,  350,  350,  350,  272,  350,
+      350,  350,  350,  284,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  225,   37,   31,   33,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,   38,  350,   32,   34,  350,  350,  350,  350,  350,
+      350,  350,  350,  102,  350,  176,  350,  350,  350,  350,
+
+      350,  350,  350,  349,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  227,  224,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,   74,  350,  350,  350,  141,
+      350,  124,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  159,   50,  350,  350,  350,  341,   13,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  302,  350,
+      305,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,   12,  350,  350,   22,  350,  350,  350,  350,
+      350,  278,  350,  350,  350,  350,  286,  350,  350,  350,
+
+       78,  350,  235,  350,  350,  350,  350,  350,  226,  350,
+      350,   73,  350,  350,  350,  350,  350,   23,  350,  350,
+       46,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  175,  174,  350,  350,  341,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  228,  222,  350,
+      240,  350,  350,  290,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,   85,  350,  350,
+      350,  350,  273,  350,  350,  350,  350,  208,  350,  350,
+
+      350,  350,  350,  234,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  312,  313,  172,  350,  350,
+       79,  350,  350,  350,  350,  183,  350,  350,  350,  118,
+      119,  350,  350,  350,   25,  350,  350,  167,  350,  169,
+      350,  213,  350,  350,  350,  350,  173,  350,  350,  350,
+      350,  243,  350,  350,  350,  350,  350,  350,  350,  148,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  251,  350,  350,  350,  350,  350,  350,  350,
+      321,  350,   27,  350,  283,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+
+       89,  214,  350,  350,  271,  350,  306,  350,  207,  350,
+      350,  350,  350,  350,   59,  350,  350,  350,  350,  350,
+      350,    4,  350,  350,  350,  350,  131,  147,  350,  350,
+      350,  187,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      246,   40,   41,  350,  350,  350,  350,  350,  350,  350,
+      291,  350,  350,  350,  350,  350,  350,  350,  259,  350,
+      350,  350,  350,  350,  350,  350,  350,  217,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,   88,  350,   60,  277,  350,  247,  350,  350,  350,
+
+      350,  350,   11,  350,  350,  350,  350,  350,  350,  350,
+      350,  130,  350,  350,  350,  350,  215,   94,  350,  350,
+       43,  350,  350,  350,  350,  350,  350,  350,  350,  179,
+      350,  350,  350,  350,  350,  350,  350,  150,  350,  350,
+      350,  350,  250,  350,  350,  350,  350,  350,  258,  350,
+      350,  350,  350,  144,  350,  350,  350,  125,  126,  350,
+      350,  350,   96,  100,   95,  160,  350,  350,  350,  350,
+       86,  350,  350,  350,  350,  350,  350,   10,  350,  350,
+      350,  350,  350,  275,  315,  350,  350,  350,  350,  350,
+      320,   42,  350,  350,  350,  350,  350,  178,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  101,   99,  350,   54,  350,  350,   87,
+      303,  350,  350,  350,  350,   24,  350,  350,  350,  350,
+      350,  201,  350,  350,  350,  350,  350,  216,  350,  350,
+      350,  350,  350,  350,  350,  350,  197,  350,  350,  168,
+       81,  350,  350,  350,  350,  350,  292,  350,  350,  350,
+      350,  350,  350,  350,  255,  350,  350,  254,  145,  350,
+      350,   98,   51,  350,  151,  152,  155,  156,  153,  154,
+       90,  301,  350,  350,  276,  350,  350,  350,   26,  350,
+
+      171,  350,  350,  350,  350,  195,  350,  245,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  185,  184,
+       44,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  299,  350,  350,  350,  350,  105,  350,
+      244,  350,  268,  296,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  322,  350,   52,    5,  350,
+      350,  236,  350,  350,  297,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  256,   28,  350,  350,  350,  350,
+
+      350,  350,  350,  350,  350,  350,  350,  350,  257,  350,
+      350,  350,  149,  350,  350,  350,  350,  350,  350,  350,
+      350,  186,  350,  194,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  293,  350,  350,  350,  350,  350,  350,
+      350,  350,  350,  350,  350,  350,  350,  350,  350,  350,
+      350,  319,  350,  350,  264,  350,  350,  350,  350,  350,
+      294,  350,  350,  350,  350,  350,  350,  295,  350,  350,
+      350,  262,  350,  265,  266,  350,  350,  350,  350,  350,
+      263,  267,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -790,17 +804,17 @@ static yyconst flex_int32_t yy_meta[41] =
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[3372] =
+static yyconst flex_int16_t yy_base[3502] =
     {   0,
         0,    0,   38,   41,   44,   46,   59,   65,   71,   77,
-       90,  112,   96,  118,  124,  136, 4327, 4282,   81, 6547,
-     6547, 6547,  129,   52,  130,   63,  131,  152,   70,  140,
+       90,  112,   96,  118,  124,  136, 5204, 5022,   81, 6793,
+     6793, 6793,  129,   52,  130,   63,  131,  152,   70,  140,
       149,  156,   57,   88,   76,  173,  175,   95,  197,  145,
-      185,  199,  208,  213,  178,  123, 4186, 6547, 6547, 6547,
-      107, 4109, 6547, 6547, 6547,  154, 4045, 3722, 6547, 6547,
-     6547,  245, 3578, 6547, 6547, 6547,  163, 3220, 6547,  249,
-     6547,  253,  148, 2696, 2594, 6547, 6547, 6547,  257, 2157,
-     6547, 6547, 6547,  233, 1707,  263,  201,    0,  267,    0,
+      185,  199,  208,  213,  178,  123, 4580, 6793, 6793, 6793,
+      107, 3835, 6793, 6793, 6793,  154, 3459, 3338, 6793, 6793,
+     6793,  245, 3159, 6793, 6793, 6793,  163, 2930, 6793,  249,
+     6793,  253,  148, 2502, 2483, 6793, 6793, 6793,  257, 2236,
+     6793, 6793, 6793,  233, 1695,  263,  201,    0,  267,    0,
         0,  165,  191,  221,  252,  205,  181,  265,   92,  261,
 
       216,  263,  271,  272,  210,  279,  274,  282,  278,  291,
@@ -808,8 +822,8 @@ static yyconst flex_int16_t yy_base[3372] =
       317,  311,  315,  319,  321,  331,  327,  332,  336,  322,
       339,  337,  346,  345,  347,  348,  353,  351,  357,  284,
       358,  359,  369,  360,  380,  365,  381,  379,  375,  366,
-      367,  389,  390,  394,  393,  395,  396,  403,  404, 1665,
-      419, 1172,  422,  924,  429,  854,  832,  433,  781,  437,
+      367,  389,  390,  394,  393,  395,  396,  403,  404, 1436,
+      419, 1297,  422, 1003,  429,  930,  888,  433,  775,  437,
       441,    0,  433,  705,  447,  479,  287,  452,  411,  445,
       426,  446,  447,  448,  449,  450,  451,  453,  452,  456,
       470,  234,  463,  473,  481,  479,  476,  483,  486,  487,
@@ -828,719 +842,749 @@ static yyconst flex_int16_t yy_base[3372] =
       697,  700,  708,  704,  713,  712,  721,  716,  722,  719,
       731,  732,  727,  717,  728,  729,  733,  736,  730,  740,
       738,  741,  745,  743,  750,  752,  760,  755,  756,  771,
-      763,  766,  762,  773,  774,  769,  775,  793,  798,  799,
-      786,  800,  801,  804,  803,  805,  807,  808,  809,  818,
-      811,  823,  815,  824,  825,  829,  836,  834, 6547,  831,
-      833,  847,  848,  849,  852,  765,  856,  858,  839,  868,
-      864,  861,  870,  892,  865,  878,  869,  871,  874, 6547,
-      887,  880,  916,  882,  889,  902,  903,  900,  904,  905,
-      917,  910,  933,  850,  914,  922,  943,  939,  925,  938,
-
-      940,  907,  941,  948,  949,  946,  951,  953,  960,  952,
-      957,  959,  971,  961,  970,  972,  965,  974,  980,  985,
-      987,  992,  975,  984,  995,  978,  990,  998, 1008, 1003,
-     1001, 1009, 1012, 1015, 1023, 1019, 1027, 1028, 1002, 1029,
-     1030, 1035, 1031, 1038, 1041, 1039, 1042, 1051, 1049, 1047,
-     1048, 1054, 1055, 1056, 1058, 1061, 1064, 1063, 1068, 1072,
-     1066, 1073, 1079, 1067, 1085, 1077, 6547, 1089, 6547, 1080,
-     1083, 1087, 1092, 1093, 1094, 1095, 6547, 1097, 1100, 1102,
-     1105, 1109, 1111, 1110, 1116, 1112, 1123, 1124, 1125, 1128,
-     1135, 1130, 1133, 1138, 1137, 1140, 1141, 1144, 1142, 1147,
-
-     1149, 1148, 1154, 1155, 1158, 1175, 6547, 1157, 1167, 1162,
-     1159, 1168, 1169, 1187, 1185, 1188, 1186, 1190, 1203, 1198,
-     1204, 1206, 1207, 1160, 1210, 1212, 1214, 1216, 1217, 1218,
-     1219, 1221, 1222, 1223, 1225, 1224, 1228, 6547, 1226, 1236,
-     1247, 1242, 1245, 1246, 1248, 1249, 1161, 1251, 1250, 1106,
-      517, 1253, 1257, 1258, 1259, 1272, 1267, 1270, 1268, 1269,
-     1275, 1274, 1276, 1278, 1287, 1283, 1289, 1291, 1299, 1298,
-     1301, 1308, 1310, 1303, 1305, 1311, 1307, 1306, 1313, 1315,
-     1322, 1316, 1319, 1326, 1329, 1328, 1331, 1335, 1320, 1336,
-     1333, 1341, 1342, 1343, 1344, 1351, 1350, 1346, 1358, 1353,
-
-     1356, 1354, 1352, 1373, 1374, 1363, 1365, 6547, 1381, 1367,
-     1382, 1383, 1384, 1388, 1390, 1386, 1392, 1393, 1394, 1396,
-     1397, 1399, 1403, 1404, 1405, 1406, 1408, 1419, 1416, 1411,
-     1427, 1426, 1428, 1418, 1430, 1432, 1431, 1440, 1438, 1441,
-     1439, 1445, 1446, 1453, 1448, 1449, 1454, 1463, 1456, 1455,
-     1460, 1458, 1466, 1469, 1468, 1483, 1472, 1480, 1488, 1489,
-     1479, 1491, 1481, 1492, 1496, 1497, 1498, 1499, 1501, 1508,
-     1503, 1510, 1505, 1509, 1511, 1506, 1522, 1512, 1523, 1526,
-     1530, 1513, 1528, 1531, 1533, 1536, 1537, 1538, 1539, 1541,
-     1545, 1543, 1549, 1548, 1550, 1554, 1560, 1561, 1563, 1564,
-
-     1567, 1568, 1571, 1570, 1573, 1581, 1572, 1582, 1584, 1585,
-     1587, 1588, 1592, 1591, 1598, 1595, 1601, 1603, 1605, 1604,
-     1607, 1611, 1614, 1616, 1608, 6547, 1615, 1628, 1623, 1626,
-     1624, 1627, 1629, 1637, 1632, 1635, 1633, 1638, 1639, 1664,
-     6547, 1641, 6547, 6547, 1644, 6547, 6547, 1645, 1649, 6547,
-     1662, 1648, 1658, 1646, 1670, 1677, 1679, 1667, 1675, 1660,
-     1687, 1691, 1694, 1696, 1682, 1697, 1688, 1702, 1708, 1653,
-     1704, 1705, 1711, 1721, 1716, 1724, 1718, 1726, 1727, 1729,
-     1732, 1736, 1738, 1740, 1739, 1743, 1744, 1745, 1747, 1746,
-     1749, 1752, 1755, 1756, 1753, 1758, 1759, 1774, 1772, 1761,
-
-     1779, 6547, 1775, 1782, 1789, 1785, 1792, 1784, 1788, 1791,
-     1764, 1796, 1793, 1797, 1798, 1800, 1802, 1805, 1804, 1809,
-     1810, 1806, 1812, 1822, 1813, 6547, 1817, 1818, 1824, 1825,
-     1828, 1831, 1833, 1829, 1835, 1836, 1839, 1847, 1849, 1840,
-     1842, 1844, 1851, 1854, 1856, 6547, 1862, 1858, 1863, 1865,
-     1866, 1868, 1869, 1871, 1874, 1873, 1876, 1877, 1878, 1879,
-     1886, 1883, 1885, 1890, 1891, 1895, 1900, 1902, 1904, 1906,
-     1908, 1910, 1911, 1912, 1913, 1915, 1916, 1924, 1927, 1923,
-     1928, 1925, 1920, 1944, 1947, 1929, 1931, 1942, 1943, 1945,
-     1951, 1955, 1953, 1946, 1957, 1965, 1958, 1961, 1963, 1967,
-
-     1974, 1969, 1971, 1976, 1979, 1980, 1982, 1983, 6547, 1985,
-     1989, 6547, 1986, 1988, 1990, 2012, 1991, 1993, 1995, 2005,
-     1994, 2014, 1998, 2006, 2022, 2016, 2032, 2025, 2024, 2035,
-     2029, 2037, 2036, 2040, 2041, 2043, 2046, 2047, 2053, 2049,
-     2063, 2067, 2066, 2073, 2075, 2050, 2058, 2062, 2081, 2071,
-     2074, 2070, 2076, 2085, 2091, 2090, 2078, 2093, 2094, 2099,
-     2103, 2104, 2102, 2105, 2106, 2108, 2111, 2116, 2117, 6547,
-     2124, 2125, 2119, 2127, 2121, 2135, 2131, 2130, 6547, 2133,
-     2139, 2140, 2147, 2143, 2144, 2145, 2146, 2151, 2153, 2155,
-     2159, 2160, 2158, 2154, 2176, 6547, 2161, 6547, 2172, 2162,
-
-     2174, 2175, 2178, 2179, 2180, 2183, 6547, 6547, 2187, 2181,
-     2197, 2201, 2191, 2184, 2202, 6547, 2203, 2210, 6547, 2207,
-     2213, 2206, 2205, 2212, 2214, 2217, 2218, 2227, 2222, 2229,
-     2224, 2226, 2234, 6547, 2235, 2236, 2240, 2241, 2237, 2243,
-     2244, 2250, 2247, 6547, 2254, 2251, 2256, 2264, 2266, 2261,
-     2263, 2268, 2272, 2269, 2274, 2275, 2276, 2277, 2284, 2286,
-     2283, 2289, 2291, 2298, 6547, 2282, 2285, 2303, 2299, 2302,
-     2306, 2307, 2308, 2309, 2310, 2311, 1996, 2312, 2318, 2319,
-     2320, 2327, 2329, 2322, 2325, 2333, 2324, 2334, 2335, 2342,
-     2340, 2341, 2344, 2345, 6547, 2346, 2352, 2349,  171, 2353,
-
-     2356, 2354, 2355, 2359, 2362, 2357, 2378, 2379, 2364, 2376,
-     2382, 2383, 2375, 2385, 2386, 2387, 2374, 2390, 2392, 2394,
-     6547, 2396, 2398, 2400, 2401, 2403, 2404, 2406, 6547, 2410,
-     2426, 2423, 2430, 2408, 2405, 2431, 2417, 2421, 2432, 2433,
-     2435, 2437, 2440, 2442, 2444, 2443, 6547, 2447, 2448, 2452,
-     2450, 2458, 2460, 2459, 2451, 2461, 2465, 2467, 2471, 2473,
-     2469, 2472, 2474, 2475, 2477, 2482, 2478, 2485, 2487, 2488,
-     2489, 2490, 2492, 2494, 2499, 2500, 6547, 2507, 2506, 2504,
-     2509, 2510, 2512, 2522, 2513, 2532, 2515, 2523, 2516, 2535,
-     2538, 2540, 2524, 2548, 2544, 2549, 2541, 2558, 2555, 2559,
-
-     2562, 2556, 2565, 2567, 2568, 2569, 2571, 2573, 2574, 2575,
-     2576, 2584, 2591, 2581, 2592, 2590, 2595, 2583, 2601, 2614,
-     2598, 6547, 2603, 2605, 2613, 2615, 2622, 2617, 2618, 2623,
-     2619, 2625, 2627, 2629, 2630, 2638, 2635, 2637, 2639, 2642,
-     2641, 2643, 2649, 2650, 2651, 2654, 2658, 2660, 2662, 2663,
-     6547, 2664, 2666, 2669, 2670, 2673, 2674, 2678, 2680, 2682,
-     2683, 2684, 2686, 2689, 2690, 2691, 2692, 2698, 2699, 2695,
-     6547, 2700, 2702, 2710, 2706, 2714, 2708, 2718, 2721, 2722,
-     2725, 2728, 2712, 2729, 2731, 2732, 6547, 2740, 2742, 2739,
-     2743, 2741, 2746, 2747, 2749, 2751, 6547, 2752, 2753, 2754,
-
-     2761, 2762, 2757, 6547, 2766, 2764, 2759, 2768, 2769, 2772,
-     2774, 2775, 2770, 2780, 2782, 2789, 2796, 2783, 2793, 6547,
-     2785, 2803, 2791, 2799, 2807, 2787, 2810, 2811, 2812, 2813,
-     2814, 2818, 6547, 2827, 2819, 2824, 2834, 2830, 2831, 2836,
-     2837, 2838, 2840, 2839, 2841, 2844, 6547, 2847, 2845, 2848,
-     2850, 2852, 2853, 2855, 2868, 2860, 2865, 2867, 2870, 2873,
-     2875, 2877, 2869, 2878, 2879, 2880, 2886, 2890, 2891, 2892,
-     2895, 2899, 2904, 2901, 2903, 2907, 2906, 2908, 2909, 2916,
-     2917, 2924, 2919, 2925, 6547, 2928, 2930, 2923, 2921, 2931,
-     2933, 2935, 2937, 2940, 2936, 2938, 2948, 2945, 2942, 2955,
-
-     2958, 2951, 2962, 2960, 2964, 2965, 2967, 2966, 2968, 2969,
-     2976, 2973, 2975, 2986, 2977, 2984, 2995, 2981, 2991, 2992,
-     2993, 2994, 2982, 2998, 3004, 2999, 2997, 3006, 3007, 3015,
-     3018, 3021, 3020, 3009, 3023, 3027, 3028, 6547, 3031, 3033,
-     3029, 3035, 3036, 3042, 3043, 3045, 3046, 3037, 3051, 3053,
-     3054, 3059, 3060, 3062, 3063, 3070, 3066, 6547, 3067, 6547,
-     3068, 3069, 3072, 3081, 3076, 6547, 3087, 6547, 3077, 3091,
-     3082, 3084, 6547, 3092, 3088, 3093, 3103, 3094, 3097, 3101,
-     3105, 3099, 3106, 3112, 3111, 3115, 3114, 3116, 3122, 3117,
-     3119, 3127, 3125, 3134, 3124, 3126, 3141, 3135, 3138, 3143,
-
-     3144, 3145, 6547, 3152, 3148, 3153, 3154, 3155, 3156, 3158,
-     3159, 3161, 3162, 3165, 3173, 3167, 3179, 3169, 3178, 3181,
-     3193, 3177, 3194, 6547, 3190, 3192, 3195, 3196, 6547, 3198,
-     3199, 3200, 3205, 3207, 3208, 3209, 3210, 3211, 3215, 3216,
-     3217, 3229, 3225, 3222, 3231, 6547, 3230, 3236, 3218, 3242,
-     3249, 3244, 3246, 3251, 3252, 3254, 3263, 3259, 3258, 3260,
-     3261, 3262, 3265, 3272, 3273, 3269, 3276, 3275, 3279, 3286,
-     3283, 3277, 3281, 3287, 3289, 3290, 3291, 3292, 3293, 3296,
-     3297, 3294, 6547, 3302, 3308, 3306, 3315, 3311, 3312, 3316,
-     3321, 3317, 6547, 3323, 3324, 3325, 3327, 3332, 3326, 3329,
-
-     3334, 3337, 3340, 3342, 3345, 3347, 3346, 6547, 3348, 6547,
-     3350, 3351, 3361, 3365, 3366, 3353, 3367, 3373, 3369, 3374,
-     3376, 3379, 3377, 3383, 3380, 3385, 3386, 3388, 3400, 3391,
-     3387, 3392, 3401, 3402, 3406, 3409, 3410, 3411, 6547, 6547,
-     3412, 3413, 3417, 3414, 3420, 3421, 3424, 3432, 3428, 3427,
-     3434, 3435, 3448, 6547, 3436, 3443, 3438, 3446, 3462, 3449,
-     3464, 3465, 3452, 3440, 3472, 3468, 6547, 3461, 3469, 3476,
-     3471, 3477, 3479, 6547, 3482, 6547, 3475, 3478, 3485, 3487,
-     3488, 3489, 3491, 3492, 3499, 3509, 3510, 3495, 3512, 3507,
-     3500, 3513, 3515, 3516, 3523, 3519, 3521, 3522, 6547, 3525,
-
-     3526, 3530, 3528, 3531, 3538, 3535, 3539, 6547, 3542, 3545,
-     3548, 3549, 3551, 3550, 3553, 3556, 3557, 3555, 3559, 6547,
-     3558, 3561, 3572, 3573, 3565, 3574, 3576, 3579, 3587, 6547,
-     3584, 3588, 3596, 3592, 3593, 3598, 3599, 3594, 3595, 3601,
-     3603, 3604, 3606, 3607, 3608, 3610, 3613, 3615, 3612, 3622,
-     3623, 3626, 3630, 3639, 3631, 6547, 3635, 3636, 3640, 3638,
-     3642, 3643, 3645, 3648, 3650, 3651, 3661, 3662, 3653, 3664,
-     3666, 3668, 3673, 3675, 6547, 3676, 3669, 3683, 3679, 3681,
-     3689, 3680, 3686, 3693, 3682, 3690, 3694, 3695, 3698, 3707,
-     3702, 3705, 3706, 3708, 3718, 3709, 6547, 3723, 3713, 3719,
-
-     3730, 3720, 3726, 3739, 3735, 3736, 3737, 3743, 3738, 3745,
-     3740, 3747, 3748, 3751, 3752, 6547, 6547, 3754, 3755, 3757,
-     6547, 3759, 3761, 3771, 3763, 3767, 3770, 3774, 3775, 3773,
-     3776, 3778, 3779, 6547, 3786, 3789, 3787, 3790, 3798, 3794,
-     6547, 3793, 3806, 3802, 3803, 3805, 3809, 3811, 3810, 3813,
-     3815, 3817, 3818, 3826, 3827, 3824, 3823, 3828, 6547, 3825,
-     3831, 3834, 3836, 3837, 3840, 6547, 3841, 3842, 3849, 3851,
-     3852, 3859, 3862, 3854, 3864, 3847, 3867, 3869, 3871, 3872,
-     3873, 3880, 3875, 3877, 3879, 3883, 3885, 6547, 3886, 3887,
-     3891, 3897, 6547, 3900, 3907, 3908, 6547, 3910, 3894, 3909,
-
-     3905, 3918, 6547, 3913, 3915, 3916, 3921, 3929, 3922, 3930,
-     3926, 3927, 6547, 3933, 3932, 3935, 6547, 3934, 3941, 3948,
-     3950, 3936, 3958, 3953, 3938, 3954, 3955, 6547, 3957, 6547,
-     3963, 3961, 3967, 6547, 3965, 3969, 3970, 3972, 3974, 3979,
-     3980, 3986, 3988, 3976, 3982, 3990, 3978, 3994, 3995, 3999,
-     3992, 4002, 4001, 4003, 6547, 4004, 4006, 4009, 4007, 4012,
-     4014, 4020, 4015, 4021, 4022, 6547, 6547, 4029, 6547, 4030,
-     4025, 4031, 6547, 4034, 4037, 4044, 4039, 4042, 4046, 4053,
-     4050, 6547, 4055, 4059, 6547, 4040, 4061, 4068, 4057, 4065,
-     4066, 4069, 4071, 4072, 4073, 4076, 4074, 4078, 4075, 4077,
-
-     4091, 6547, 4079, 4081, 4082, 4084, 4095, 4096, 4100, 4102,
-     4098, 6547, 4106, 4112, 4105, 4115, 4117, 6547, 4119, 6547,
-     4108, 4121, 4122, 4125, 4129, 6547, 4131, 4132, 4136, 4137,
-     4138, 4139, 4140, 4142, 4144, 4149, 4156, 4152, 4151, 4153,
-     4160, 4158, 6547, 4155, 4161, 4168, 4170, 4172, 4173, 4182,
-     4178, 4177, 4180, 4181, 4185, 4188, 4190, 4194, 4192, 4199,
-     4196, 6547, 4203, 4205, 4202, 4217, 4206, 4210, 4208, 6547,
-     4209, 4222, 4224, 6547, 4213, 4225, 4228, 4231, 4232, 4233,
-     4236, 4234, 4238, 6547, 4235, 4242, 4239, 4241, 4244, 4255,
-     6547, 6547, 4256, 6547, 4257, 4243, 4258, 4260, 4240, 4261,
-
-     4268, 4271, 4277, 4269, 4279, 4281, 4272, 4274, 4290, 4293,
-     4297, 4292, 4294, 4298, 6547, 6547, 4300, 4304, 4301, 4307,
-     4308, 4303, 4311, 4320, 4312, 4321, 4324, 4326, 4333, 6547,
-     4328, 4316, 4334, 4325, 6547, 4335, 4337, 4339, 4340, 4341,
-     4343, 4347, 4344, 4348, 4349, 4351, 4352, 4354, 4365, 4357,
-     4358, 4366, 4367, 4368, 4359, 4374, 4380, 6547, 4377, 4375,
-     4381, 4382, 4384, 4387, 4388, 4389, 4390, 6547, 4395, 6547,
-     4391, 4393, 4396, 4397, 4413, 4398, 4414, 4415, 4416, 4418,
-     4419, 4422, 4423, 4427, 4424, 4429, 4432, 4434, 4436, 4438,
-     4440, 6547, 4444, 4441, 4447, 4448, 4451, 4453, 4454, 4456,
-
-     4457, 4459, 4462, 4463, 4465, 4470, 4466, 4472, 4471, 4474,
-     6547, 4478, 4487, 4476, 4489, 4479, 4484, 4491, 4498, 4501,
-     4492, 4502, 4503, 6547, 4504, 4496, 4507, 6547, 4508, 4509,
-     4510, 4512, 4521, 4518, 4522, 4523, 4524, 6547, 4530, 4513,
-     4534, 4526, 4531, 4535, 4536, 4542, 4545, 4544, 4547, 6547,
-     4557, 4548, 4556, 4558, 4552, 4555, 4559, 4564, 4566, 6547,
-     4570, 4571, 4572, 4579, 4574, 4584, 4581, 4583, 4582, 4585,
-     4590, 4591, 4594, 4596, 4597, 4599, 4608, 4610, 4611, 6547,
-     4589, 6547, 4612, 4616, 4620, 4618, 4623, 4622, 6547, 4624,
-     4625, 4630, 4631, 4626, 6547, 4633, 4632, 4634, 4638, 6547,
-
-     4636, 4647, 4637, 4643, 4654, 4658, 6547, 4661, 4662, 4651,
-     4669, 4670, 4666, 4668, 4671, 4672, 4674, 4676, 4677, 4678,
-     4687, 4680, 4683, 6547, 4689, 4692, 4698, 4699, 4682, 4700,
-     4701, 4702, 4708, 4703, 6547, 4705, 4711, 4712, 4713, 4714,
-     4715, 4717, 4725, 4720, 4723, 4724, 4728, 4729, 4730, 6547,
-     4733, 4736, 4737, 4744, 4740, 4753, 6547, 4749, 6547, 4746,
-     4756, 4759, 4739, 4763, 6547, 6547, 4750, 4767, 4766, 4769,
-     4770, 6547, 6547, 4772, 6547, 4773, 6547, 4774, 4776, 6547,
-     6547, 4775, 4777, 4781, 4782, 4784, 6547, 4790, 6547, 4799,
-     4794, 4785, 4796, 4797, 6547, 4798, 4804, 4800, 4808, 4806,
-
-     6547, 4810, 4815, 4811, 4813, 6547, 4822, 4823, 4814, 4816,
-     6547, 4824, 4831, 4827, 4835, 4836, 4837, 4838, 4841, 4843,
-     4839, 4844, 4846, 4847, 4854, 4861, 4863, 4865, 4869, 4858,
-     4856, 4871, 4872, 4877, 4875, 4879, 4880, 4881, 4883, 4884,
-     4886, 4889, 4890, 4892, 4895, 4893, 4894, 4906, 4896, 4898,
-     4908, 4910, 4899, 4909, 4913, 4912, 4917, 4915, 4920, 4923,
-     4922, 4924, 6547, 4928, 4930, 4933, 4935, 4934, 4940, 4942,
-     4944, 4950, 4953, 6547, 4957, 6547, 4959, 4951, 4955, 4961,
-     4962, 6547, 4963, 4964, 4965, 4968, 4967, 4970, 4848, 4971,
-     4974, 4975, 4972, 6547, 4979, 4981, 4984, 4985, 4997, 6547,
-
-     4989, 5000, 4986, 5001, 5002, 5003, 5005, 5007, 5008, 5010,
-     5012, 5014, 5015, 5016, 5020, 5022, 5028, 5036, 5031, 5017,
-     5033, 5037, 5038, 5039, 5040, 5041, 5042, 5048, 5053, 5057,
-     6547, 5045, 6547, 5054, 5050, 5058, 5061, 5062, 5065, 5068,
-     6547, 6547, 5066, 5071, 5073, 5075, 5076, 5078, 5080, 5082,
-     5079, 6547, 5084, 5088, 5096, 5089, 6547, 5093, 5098, 5100,
-     5104, 6547, 5101, 5105, 5106, 5112, 5107, 5116, 5117, 5119,
-     5109, 5121, 5123, 5130, 6547, 6547, 6547, 6547, 5131, 5124,
-     5135, 5127, 5136, 5138, 5139, 5142, 5137, 6547, 5145, 6547,
-     6547, 5150, 5151, 5153, 5154, 5157, 5158, 5160, 5162, 6547,
-
-     5161, 5163, 5166, 5164, 5173, 5175, 5181, 5178, 5182, 5183,
-     5184, 5192, 5188, 5189, 5191, 5194, 5196, 5198, 6547, 6547,
-     5200, 5204, 5205, 5215, 5207, 5211, 5210, 5223, 5218, 5220,
-     5219, 5221, 5226, 5227, 5235, 5237, 5233, 5230, 6547, 5232,
-     5240, 5241, 6547, 5243, 6547, 5246, 5247, 5249, 5250, 5253,
-     5256, 5257, 5259, 6547, 6547, 5254, 5266, 5264, 6547, 6547,
-     5261, 5269, 5271, 5274, 5275, 5276, 5277, 5278, 5284, 5279,
-     6547, 5281, 6547, 5285, 5287, 5300, 5288, 5303, 5307, 5308,
-     5310, 5304, 5306, 6547, 5314, 5315, 6547, 5322, 5317, 5321,
-     5318, 5319, 6547, 5326, 5324, 5330, 5336, 6547, 5338, 5339,
-
-     5340, 6547, 5347, 6547, 5331, 5344, 5341, 5356, 5348, 6547,
-     5352, 5357, 6547, 5362, 5364, 5365, 5354, 6547, 5359, 6547,
-     5366, 5370, 5373, 5376, 5378, 5380, 5371, 5381, 5382, 5389,
-     5388, 5390, 6547, 6547,  135, 5398, 5385, 5391, 5395, 5400,
-     5407, 5402, 5405, 5404, 6547, 6547, 5412, 6547, 5410, 5413,
-     6547, 5414, 5419, 5420, 5423, 5424, 5425, 5426, 5428, 5431,
-     5433, 5434, 5435, 5432, 5436, 5454, 5456, 5438, 5459, 5460,
-     5462, 5464, 5466, 5452, 5469, 5470, 5471, 5472, 5473, 5475,
-     5476, 5478, 5479, 6547, 5482, 5484, 5486, 5487, 6547, 5494,
-     5488, 5501, 5491, 6547, 5503, 5504, 5506, 5507, 6547, 5508,
-
-     5510, 5514, 5511, 5512, 5517, 5519, 5530, 5522, 5523, 5521,
-     6547, 6547, 6547, 5533, 5537, 6547, 5540, 5527, 5542, 5543,
-     6547, 5545, 5546, 5547, 6547, 6547, 5548, 5549, 5550, 5557,
-     6547, 5552, 6547, 5553, 6547, 5560, 5563, 5571, 5566, 6547,
-     5576, 5578, 6547, 5584, 5586, 5588, 5580, 5577, 5590, 5591,
-     6547, 5562, 5593, 5594, 5601, 5592, 5595, 5602, 5603, 5604,
-     5611, 5606, 5613, 6547, 5614, 5615, 5616, 5624, 5617, 5554,
-     5619, 6547, 5626, 6547, 5628, 6547, 5629, 5630, 5633, 5632,
-     5635, 5638, 5639, 5640, 5648, 5644, 5650, 5652, 5655, 5656,
-     6547, 6547, 5659, 5661, 6547, 5662, 6547, 5664, 6547, 5665,
-
-     5666, 5669, 5667, 6547, 5671, 5673, 5677, 5680, 5676, 5679,
-     6547, 5687, 5689, 5690, 5692, 6547, 6547, 5684, 5700, 5696,
-     6547, 5695, 5706, 5708, 5702, 5711, 5712, 5715, 5713, 5720,
-     5697, 5719, 5718, 5726, 5729, 5727, 6547, 6547, 6547, 5734,
-     5721, 5742, 5740, 5744, 5743, 5735, 6547, 5745, 5749, 5751,
-     5752, 5760, 5755, 5758, 6547, 5762, 5759, 5761, 5763, 5765,
-     5766, 5767, 5769, 6547, 5780, 5782, 5770, 5784, 5787, 5789,
-     5791, 5794, 5795, 5796, 5803, 5799, 6547, 5801, 6547, 6547,
-     5802, 6547, 5805, 5806, 5807, 5809, 6547, 5812, 5813, 5814,
-     5816, 5815, 5817, 5819, 5824, 6547, 5831, 5820, 5832, 5836,
-
-     6547, 6547, 5838, 6547, 5843, 5844, 5834, 5852, 5845, 5847,
-     5854, 5856, 6547, 5850, 5858, 5859, 5860, 5862, 6547, 5863,
-     5865, 5866, 5867, 6547, 5873, 5869, 5875, 5874, 5876, 6547,
-     5877, 5879, 5889, 5896, 6547, 5880, 5894, 5890, 6547, 6547,
-     5905, 5907, 5898, 6547, 6547, 6547, 5909, 5910, 5911, 5913,
-     6547, 5917, 5921, 5925, 5929, 5920, 6547, 5928, 5931, 5935,
-     5914, 5936, 6547, 6547, 5937, 5938, 5939, 5942, 6547, 6547,
-     5943, 5945, 5947, 5946, 5948, 6547, 5949, 5953, 5959, 5965,
-     5970, 5956, 5961, 5972, 5979, 5980, 5975, 5976, 5977, 5982,
-     5983, 5985, 5990, 5992, 5993, 5995, 5997, 6001, 6002, 6547,
-
-     6547, 6006, 6547, 6009, 6003, 6547, 6547, 6011, 6014, 6018,
-     6020, 6022, 6024, 6026, 6028, 6015, 6547, 6029, 6031, 6033,
-     6032, 6034, 6547, 6036, 6040, 6035, 6043, 6037, 6045, 6047,
-     6052, 6547, 6547, 6048, 6057, 6053, 6058, 6063, 6547, 6061,
-     6071, 6068, 6067, 6069, 6073, 6070, 6547, 6074, 6075, 6547,
-     6547, 6083, 6077, 6547, 6547, 6076, 6547, 6547, 6547, 6547,
-     6547, 6547, 6547, 6547, 6085, 6093, 6547, 6094, 6098, 6100,
-     6104, 6547, 6078, 6105, 6106, 6089, 6108, 6547, 6095, 6112,
-     6111, 5292, 6113, 6119, 6117, 6115, 6121, 6124, 6125, 6126,
-     6127, 6131, 6132, 6133, 6142, 6145, 6129, 6146, 6547, 6547,
-
-     6547, 6138, 6135, 6157, 6153, 6159, 6160, 6164, 6166, 6148,
-     6168, 6169, 6170, 6171, 6173, 6174, 6183, 6178, 6179, 6180,
-     6182, 6184, 6187, 6547, 6194, 6190, 6195, 6197, 6547, 6200,
-     6547, 6199, 6547, 6547, 6202, 6206, 6203, 6208, 6216, 6218,
-     6209, 6213, 6219, 6220, 6222, 6547, 6229, 6547, 6547, 6224,
-     6230, 6547, 6232, 6231, 6547, 6233, 6234, 6236, 6241, 6243,
-     6240, 6237, 6244, 6248, 6547, 6547, 6251, 6252, 6257, 6261,
-     6258, 6268, 6264, 6267, 6269, 6273, 6266, 6281, 6547, 6280,
-     6277, 6284, 6547, 6286, 6287, 6288, 6289, 6291, 6298, 6293,
-     6294, 6547, 6296, 6547, 6300, 6302, 6304, 6301, 6303, 6305,
-
-     6315, 6319, 6313, 6547, 6317, 6327, 6321, 6329, 6331, 6333,
-     6334, 6323, 6336, 6339, 6345, 6349, 6346, 6350, 6337, 6354,
-     6351, 6547, 6361, 6352, 6547, 6358, 6362, 6355, 6364, 6365,
-     6547, 6369, 6372, 6373, 6375, 6378, 6379, 6547, 6381, 6385,
-     6382, 6547, 6388, 6547, 6547, 6390, 6387, 6394, 6397, 6399,
-     6547, 6547, 6547, 6427, 6434, 6441, 6448, 6455, 6462, 6469,
-       88, 6476, 6483, 6490, 6497, 6504, 6511, 6518, 6525, 6532,
-     6539
+      763,  766,  762,  774,  773,  765,  769,  794,  799,  782,
+      787,  800,  801,  804,  802,  803,  806,  808,  809,  814,
+      818,  819,  823,  807,  825,  827,  834,  829, 6793,  831,
+      838,  846,  839,  847,  850,  848,  854,  856,  836,  866,
+      864,  867,  876,  898,  849,  871,  868,  878,  881, 6793,
+      884,  882,  922,  890,  891,  908,  910,  859,  909,  911,
+      904,  912,  933,  906,  920,  915,  945,  942,  930,  943,
+
+      944,  946,  952,  954,  955,  953,  957,  958,  966,  861,
+      961,  970,  981,  962,  964,  968,  971,  974,  986,  983,
+      990,  991,  993,  995,  997,  996, 1001,  999, 1022, 1004,
+     1002, 1000, 1016, 1017, 1024, 1023, 1025, 1028, 1030, 1029,
+     1037, 1041, 1038, 1046, 1047, 1048, 1049, 1059, 1054, 1055,
+     1056, 1060, 1062, 1063, 1066, 1068, 1069, 1071, 1073, 1074,
+     1080, 1081, 1085, 1089, 1075, 1090, 1082, 6793, 1097, 6793,
+     1092, 1095, 1099, 1100, 1101, 1102, 1105, 6793, 1107, 1110,
+     1109, 1112, 1120, 1115, 1136, 1111, 1118, 1123, 1135, 1119,
+     1137, 1145, 1140, 1141, 1148, 1143, 1146, 1147, 1149, 1150,
+
+     1153, 1156, 1159, 1161, 1155, 1162, 1178, 6793, 1163, 1167,
+     1165, 1168, 1176, 1182, 1173, 1181, 1191, 1190, 1201, 1193,
+     1199, 1213, 1202, 1203, 1211, 1210, 1215, 1220, 1216, 1222,
+     1224, 1225, 1227, 1228, 1226, 1230, 1231, 1234, 1232, 1238,
+     1240, 6793, 1247, 1244, 1250, 1255, 1257, 1258, 1259, 1260,
+     1261, 1262, 1263, 1264, 1266,  517, 1271, 1282, 1289, 1272,
+     1291, 1275, 1290, 1286, 1288, 1265, 1292, 1296, 1294, 1307,
+     1298, 1309, 1314, 1322, 1318, 1320, 1327, 1329, 1304, 1324,
+     1299, 1326, 1330, 1332, 1334, 1333, 1335, 1341, 1339, 1348,
+     1344, 1346, 1345, 1347, 1351, 1353, 1355, 1356, 1357, 1359,
+
+     1366, 1361, 1373, 1369, 1371, 1372, 1368, 1387, 1376, 1379,
+     1391, 1392, 1389, 1390, 6793, 1399, 1398, 1401, 1402, 1408,
+     1409, 1410, 1400, 1411, 1414, 1417, 1418, 1419, 1425, 1422,
+     1426, 1420, 1427, 1433, 1432, 1440, 1446, 1435, 1450, 1451,
+     1453, 1437, 1449, 1456, 1457, 1465, 1462, 1466, 1468, 1464,
+     1469, 1478, 1470, 1473, 1475, 1485, 1481, 1482, 1487, 1484,
+     1496, 1498, 1490, 1507, 1499, 1509, 1516, 1502, 1488, 1517,
+     1506, 1518, 1512, 1521, 1522, 1523, 1526, 1533, 1528, 1529,
+     1534, 1535, 1536, 1537, 1531, 1544, 1547, 1545, 1548, 1551,
+     1552, 1553, 1557, 1560, 1555, 1561, 1566, 1567, 1568, 1570,
+
+     1558, 1578, 1588, 1569, 1580, 1582, 1581, 1589, 1590, 1591,
+     1596, 1597, 1598, 1600, 1601, 1608, 1611, 1602, 1605, 1614,
+     1615, 1617, 1618, 1627, 1619, 1628, 1632, 1633, 1634, 1622,
+     1635, 1638, 1640, 1641, 1645, 1646, 1648, 6793, 1652, 1660,
+     1653, 1658, 1655, 1656, 1661, 1669, 1664, 1668, 1665, 1666,
+     1670, 1692, 6793, 1674, 6793, 6793, 1676, 6793, 6793, 1677,
+     1678, 6793, 1682, 1687, 1699, 1698, 1705, 1707, 1709, 1685,
+     1710, 1680, 1719, 1725, 1716, 1717, 1718, 1723, 1730, 1721,
+     1731, 1728, 1738, 1742, 1740, 1746, 1749, 1754, 1756, 1758,
+     1750, 1761, 1767, 1764, 1770, 1772, 1775, 1760, 1776, 1778,
+
+     1779, 1780, 1782, 1781, 1784, 1787, 1790, 1791, 1793, 1786,
+     1794, 1805, 1803, 1796, 1813, 6793, 1809, 1821, 1806, 1823,
+     1819, 1826, 1827, 1822, 1810, 1832, 1834, 1829, 1835, 1836,
+     1838, 1839, 1840, 1842, 1844, 1846, 1850, 1848, 1860, 1849,
+     6793, 1862, 1863, 1851, 1859, 1865, 1866, 1873, 1867, 1852,
+     1870, 1876, 1886, 1882, 1884, 1887, 1888, 1890, 1891, 1892,
+     6793, 1894, 1901, 1898, 1902, 1904, 1893, 1908, 1905, 1910,
+     1911, 1912, 1917, 1915, 1918, 1922, 1923, 1924, 1926, 1929,
+     1934, 1931, 1938, 1941, 1948, 1942, 1944, 1949, 1950, 1951,
+     1953, 1954, 1955, 1957, 1962, 1966, 1965, 1969, 1967, 1968,
+
+     1978, 1986, 1971, 1982, 1983, 1984, 1985, 1990, 1993, 1998,
+     1994, 1996, 1999, 2008, 2000, 2005, 2007, 2010, 2013, 2023,
+     2009, 2026, 2018, 2011, 2021, 2027, 2028, 6793, 2034, 2035,
+     6793, 2037, 2036, 2038, 2060, 2039, 2042, 2051, 2044, 2045,
+     2048, 2053, 2061, 2057, 2064, 2073, 2074, 2077, 2080, 2079,
+     2082, 2086, 2085, 2088, 2089, 2092, 2095, 2093, 2100, 2107,
+     2109, 2055, 2113, 2117, 2112, 2114, 2118, 2137, 2115, 2116,
+     2125, 2119, 2122, 2124, 2120, 2126, 2130, 2135, 2140, 2132,
+     2147, 2150, 2146, 2149, 2152, 2153, 2160, 2162, 2165, 2164,
+     6793, 2172, 2170, 2174, 2175, 2176, 2183, 2181, 2179, 6793,
+
+     2182, 2185, 2187, 2196, 2188, 2192, 2195, 2199, 2201, 2202,
+     2204, 2205, 2208, 2206, 2207, 2226, 6793, 2209, 6793, 2213,
+     2210, 2218, 2221, 2228, 2229, 2231, 2232, 2233, 6793, 6793,
+     2234, 2235, 2248, 2251, 2241, 2243, 2252, 6793, 2253, 2260,
+     6793, 2262, 2261, 2256, 2255, 2257, 2267, 2268, 2271, 2278,
+     2274, 2282, 2277, 2279, 2283, 6793, 2287, 2280, 2288, 2291,
+     2289, 2295, 2298, 2302, 2299, 6793, 2300, 2308, 2309, 2316,
+     2313, 2314, 2317, 2318, 2319, 2322, 2325, 2326, 2327, 2328,
+     2337, 2338, 2329, 2342, 2339, 2343, 2351, 6793, 2349, 2350,
+     2336, 2358, 2355, 2362, 2357, 2363, 2353, 2359, 2364, 2370,
+
+     2365, 2369, 2375, 2377, 2379, 2386, 2387, 2382, 2383, 2385,
+     2390, 2391, 2392, 2394, 2399, 2396, 2401, 2400, 2402, 6793,
+     2403, 2407, 2408, 2413, 2415, 2411,  171, 2421, 2417, 2424,
+     2423, 2425, 2430, 2426, 2439, 2443, 2438, 2440, 2442, 2447,
+     2441, 2448, 2451, 2449, 2450, 2453, 2457, 2458, 6793, 2466,
+     2459, 2461, 2463, 2468, 2467, 2470, 6793, 2476, 2481, 2483,
+     2491, 2485, 2493, 2494, 2495, 2498, 2496, 2499, 2500, 2501,
+     2503, 2506, 2510, 2509, 6793, 2512, 2517, 2518, 2515, 2524,
+     2526, 2525, 2527, 2531, 2532, 2533, 2537, 2536, 2538, 2539,
+     2540, 2541, 2547, 2548, 2555, 2544, 2554, 2556, 2557, 2560,
+
+     2566, 2562, 2567, 2568, 2575, 2570, 6793, 2577, 2573, 2580,
+     2576, 2582, 2585, 2586, 2587, 2604, 2589, 2593, 2596, 2605,
+     2610, 2600, 2612, 2620, 2616, 2622, 2625, 2630, 2626, 2632,
+     2635, 2628, 2638, 2640, 2641, 2642, 2650, 2646, 2647, 2648,
+     2651, 2652, 2662, 2663, 2654, 2664, 2666, 2669, 2658, 2676,
+     2681, 2683, 6793, 2685, 2673, 2687, 2690, 2697, 2692, 2671,
+     2695, 2698, 2702, 2703, 2704, 2706, 2713, 2708, 2710, 2714,
+     2716, 2715, 2717, 2724, 2719, 2725, 2727, 2734, 2730, 2736,
+     2595, 6793, 2738, 2739, 2740, 2742, 2747, 2743, 2749, 2752,
+     2755, 2754, 2756, 2758, 2761, 2762, 2764, 2765, 2772, 2768,
+
+     2769, 2774, 2770, 6793, 2780, 2771, 2782, 2784, 2789, 2791,
+     2790, 2793, 2792, 2800, 2802, 2803, 2804, 2805, 2806, 6793,
+     2814, 2815, 2811, 2813, 2823, 2820, 2822, 2824, 2826, 2827,
+     6793, 2828, 2830, 2832, 2831, 2834, 2836, 2843, 2844, 2839,
+     6793, 2855, 2850, 2840, 2851, 2853, 2852, 2856, 2857, 2861,
+     2862, 2867, 2863, 2873, 2869, 2875, 6793, 2876, 2883, 2878,
+     2879, 2886, 2884, 2889, 2890, 2901, 2891, 2897, 2893, 6793,
+     2916, 2911, 2902, 2918, 2903, 2914, 2919, 2920, 2921, 2923,
+     2924, 2927, 2928, 6793, 2929, 2931, 2933, 2934, 2938, 2936,
+     2939, 2952, 2945, 2947, 2950, 2953, 2955, 2956, 2960, 2962,
+
+     2967, 2959, 2961, 2971, 2973, 2963, 2976, 2979, 2983, 2987,
+     2992, 2988, 2989, 2994, 2991, 2995, 2996, 2998, 3006, 3007,
+     3010, 3008, 3012, 6793, 3015, 3016, 3018, 3005, 3019, 3021,
+     3022, 3025, 3028, 3024, 3026, 3033, 3036, 3030, 3046, 3048,
+     3039, 3051, 3041, 3043, 3054, 3053, 3055, 3056, 3057, 3067,
+     3064, 3065, 3066, 3077, 3068, 3072, 3079, 3070, 3080, 3081,
+     3082, 3083, 3084, 3088, 3090, 3093, 3094, 3095, 3086, 3107,
+     3109, 3110, 3112, 3104, 3102, 3118, 3119, 6793, 3122, 3123,
+     3120, 3124, 3126, 3130, 3127, 3139, 3134, 3137, 3136, 3143,
+     3148, 3145, 3146, 3151, 3153, 3161, 3157, 6793, 3154, 6793,
+
+     3158, 3162, 3168, 3176, 3163, 6793, 3175, 6793, 3177, 3182,
+     3171, 3178, 6793, 3185, 3184, 3166, 3189, 3190, 3191, 3193,
+     3195, 3196, 3197, 3199, 3200, 3203, 3204, 3206, 3207, 3209,
+     3217, 3211, 3219, 3223, 3220, 3227, 3230, 3224, 3238, 3214,
+     3231, 3240, 3241, 3233, 3242, 6793, 3249, 3243, 3253, 3254,
+     3255, 3256, 3258, 3257, 3261, 3260, 3262, 3264, 3267, 3268,
+     3279, 3273, 3265, 3280, 3281, 3284, 3292, 3290, 3297, 6793,
+     3293, 3295, 3296, 3298, 6793, 3301, 3299, 3302, 3308, 3305,
+     3311, 3312, 3313, 3317, 3314, 3321, 3320, 3325, 3330, 3334,
+     3335, 6793, 3336, 3337, 3322, 3341, 3349, 3352, 3356, 3353,
+
+     3359, 3361, 3357, 3363, 3364, 3355, 3365, 3366, 3367, 3375,
+     3378, 3371, 3380, 3379, 3382, 3389, 3385, 3381, 3383, 3391,
+     3392, 3393, 3394, 3395, 3396, 3397, 3400, 3411, 3398, 3416,
+     6793, 3406, 3415, 3419, 3426, 3401, 3424, 3405, 3428, 3429,
+     6793, 3431, 3433, 3434, 3435, 3436, 3441, 3438, 3443, 3444,
+     3445, 3446, 3448, 3451, 3449, 6793, 3457, 6793, 3458, 3466,
+     3471, 3474, 3464, 3468, 3475, 3480, 3481, 3482, 3484, 3485,
+     3487, 3490, 3491, 3493, 3495, 3496, 3497, 3504, 3500, 3503,
+     3511, 3510, 3512, 3513, 3521, 3517, 3518, 6793, 6793, 3516,
+     3519, 3531, 3527, 3525, 3533, 3535, 3539, 3540, 3542, 3544,
+
+     3546, 3553, 6793, 3549, 3554, 3555, 3556, 3568, 3557, 3559,
+     3572, 3571, 3567, 3579, 3574, 6793, 3570, 3578, 3588, 3583,
+     3584, 3591, 6793, 3586, 6793, 3589, 3595, 3597, 3598, 3600,
+     3599, 3601, 3602, 3604, 3606, 3617, 3613, 3625, 3611, 3622,
+     3623, 3626, 3627, 3629, 3632, 3636, 3631, 3633, 3634, 6793,
+     3640, 3635, 3637, 3642, 3648, 3651, 3654, 3657, 3650, 6793,
+     3658, 3661, 3660, 3662, 3664, 3672, 3665, 3675, 3667, 3677,
+     3678, 3681, 3682, 3683, 6793, 3680, 3685, 3696, 3689, 3691,
+     3697, 3707, 3708, 3713, 6793, 3693, 3710, 3720, 3716, 3717,
+     3700, 3718, 3704, 3722, 3723, 3725, 3726, 3727, 3728, 3730,
+
+     3733, 3734, 3736, 3735, 3747, 3746, 3738, 3750, 3760, 3740,
+     6793, 3756, 3757, 3762, 3763, 3764, 3765, 3767, 3770, 3772,
+     3773, 3785, 3786, 3774, 3777, 3789, 3790, 3797, 3796, 6793,
+     3806, 3792, 3807, 3803, 3780, 3809, 3814, 3782, 3811, 3818,
+     3804, 3815, 3820, 3821, 3822, 3824, 3833, 3828, 3830, 3831,
+     3832, 3843, 3834, 6793, 3845, 3846, 3838, 3855, 3848, 3851,
+     3862, 3858, 3861, 3863, 3865, 3868, 3869, 3871, 3873, 3874,
+     3877, 3872, 6793, 6793, 3879, 3880, 3887, 6793, 3888, 3882,
+     3889, 3885, 3899, 3886, 3893, 3902, 3904, 3890, 3910, 3900,
+     3906, 6793, 3912, 3920, 3915, 3918, 3927, 3928, 6793, 3919,
+
+     3929, 3932, 3934, 3924, 3936, 3940, 3937, 3941, 3942, 3943,
+     3945, 3953, 3954, 3950, 3951, 3957, 6793, 3952, 3958, 3962,
+     3964, 3955, 3968, 6793, 3965, 3971, 3978, 3976, 3981, 3986,
+     3987, 3988, 3993, 3973, 3989, 3995, 3996, 3997, 3998, 4006,
+     4002, 4007, 4005, 4008, 4012, 4015, 4009, 6793, 4019, 4023,
+     4024, 4026, 6793, 4030, 4033, 4037, 6793, 4041, 4036, 4038,
+     4040, 4048, 6793, 4045, 4046, 4047, 4053, 4049, 4061, 4051,
+     4064, 4066, 4056, 4060, 4063, 4067, 6793, 4069, 4070, 4071,
+     6793, 4082, 4077, 4084, 4087, 4072, 4094, 4090, 4093, 4091,
+     4095, 6793, 4100, 6793, 4099, 4101, 4106, 6793, 4103, 4108,
+
+     4109, 4111, 4112, 4117, 4118, 4116, 4125, 4126, 4127, 4129,
+     4130, 4128, 4133, 4137, 4134, 4135, 4139, 4140, 6793, 4141,
+     4143, 4150, 4145, 4155, 4151, 4158, 4148, 4162, 4163, 6793,
+     6793, 4172, 6793, 4174, 4164, 4166, 6793, 4168, 4173, 4181,
+     4178, 4184, 4186, 4179, 4190, 4191, 6793, 4193, 4200, 6793,
+     4194, 4196, 4204, 4205, 4203, 4206, 4207, 4208, 4211, 4212,
+     4213, 4214, 4215, 4222, 4216, 4221, 4218, 6793, 4223, 4229,
+     4232, 4239, 4231, 4235, 4245, 4241, 4240, 6793, 4251, 4257,
+     4247, 4253, 4254, 6793, 4262, 6793, 4250, 4263, 4264, 4267,
+     4266, 4279, 6793, 4275, 4270, 4281, 4274, 4278, 4286, 4282,
+
+     4289, 4290, 4291, 4298, 4296, 4293, 4295, 4303, 4304, 6793,
+     4299, 4305, 4310, 4313, 4315, 4316, 4323, 4320, 4322, 4321,
+     4326, 4328, 4329, 4331, 4337, 4335, 4340, 4333, 6793, 4343,
+     4346, 4347, 4359, 4349, 4354, 4350, 6793, 4357, 4360, 4366,
+     6793, 4364, 4356, 4370, 4373, 4367, 4374, 4375, 4378, 4380,
+     4381, 4382, 6793, 4383, 4386, 4384, 4388, 4397, 4390, 6793,
+     6793, 4400, 6793, 4401, 4389, 4405, 4408, 4409, 4413, 4411,
+     4414, 4416, 4417, 4418, 4421, 4424, 4427, 6793, 4428, 4436,
+     4431, 4439, 4448, 4449, 4441, 4446, 4432, 6793, 6793, 4451,
+     4455, 4457, 4459, 4460, 4462, 4445, 4471, 4464, 4467, 4473,
+
+     4475, 4482, 6793, 4479, 4477, 4484, 4478, 6793, 4485, 4486,
+     4489, 4487, 4490, 4493, 4492, 4494, 4496, 4499, 4504, 4505,
+     4500, 4513, 4506, 4507, 4516, 4517, 4519, 4520, 4522, 4527,
+     6793, 4523, 4529, 4530, 4534, 4535, 4537, 4539, 4538, 4541,
+     4551, 6793, 4543, 6793, 4542, 4547, 4546, 4563, 4544, 4554,
+     4566, 4567, 4568, 4569, 4572, 4573, 4576, 4577, 4587, 4578,
+     4582, 4588, 4590, 4592, 4597, 4598, 6793, 4600, 4584, 4594,
+     4601, 4607, 4609, 4610, 4612, 4615, 4617, 4619, 4618, 4621,
+     4625, 4622, 4626, 4627, 4628, 4630, 6793, 4632, 4639, 4631,
+     4641, 4643, 4645, 4652, 4646, 4654, 4648, 4656, 4657, 6793,
+
+     4658, 4660, 4664, 6793, 4665, 4666, 4668, 4670, 4676, 4669,
+     4672, 4678, 4680, 6793, 4682, 4684, 4687, 4686, 4690, 4691,
+     4692, 4696, 4698, 4699, 4702, 6793, 4712, 4703, 4711, 4714,
+     4710, 4713, 4717, 4723, 4721, 6793, 4724, 4725, 4727, 4737,
+     4739, 4732, 4734, 4746, 4736, 4743, 4744, 4745, 4751, 4750,
+     4752, 4755, 4756, 4757, 4766, 4768, 4763, 6793, 4770, 6793,
+     4772, 4773, 4774, 4783, 4778, 4776, 4780, 4784, 4786, 6793,
+     4788, 4791, 4794, 4795, 4796, 6793, 4797, 4798, 4800, 4799,
+     6793, 4813, 4812, 4801, 4818, 4803, 4819, 6793, 4823, 4824,
+     4826, 4834, 4835, 4832, 4837, 4825, 4842, 4833, 4838, 4840,
+
+     4846, 4850, 4848, 4849, 6793, 4851, 4853, 4858, 4860, 4861,
+     4863, 4864, 4867, 4869, 4866, 6793, 4873, 4874, 4875, 4876,
+     4877, 4880, 4882, 4889, 4885, 4892, 4886, 4888, 4896, 4897,
+     4898, 4906, 6793, 4899, 4901, 4903, 4916, 4912, 4921, 6793,
+     4909, 6793, 4913, 4924, 4926, 4914, 4930, 6793, 6793, 4928,
+     4939, 4922, 4936, 4937, 6793, 6793, 4942, 6793, 4938, 6793,
+     4943, 4944, 6793, 6793, 4945, 4947, 4948, 4949, 4953, 4952,
+     6793, 4962, 6793, 4965, 4963, 4955, 4966, 4967, 6793, 4968,
+     4974, 4970, 4978, 4976, 6793, 4980, 4985, 4981, 4983, 6793,
+     4992, 4993, 4984, 4986, 6793, 4994, 5001, 4997, 5005, 5006,
+
+     5007, 5008, 5011, 5013, 5009, 5014, 5016, 5017, 5024, 5031,
+     5033, 5035, 5039, 5028, 5026, 5041, 5042, 5047, 5045, 5049,
+     5050, 5051, 5052, 5054, 5056, 5053, 5059, 5061, 5063, 5064,
+     5068, 5065, 5066, 5078, 5067, 5079, 5081, 5082, 5085, 5088,
+     5089, 5090, 5092, 5093, 5095, 5018, 5094, 5096, 5101, 5098,
+     5100, 6793, 5102, 5104, 5105, 5108, 5118, 5119, 5122, 5130,
+     5134, 5135, 6793, 5137, 6793, 5139, 5123, 5131, 5125, 5143,
+     6793, 5145, 5146, 5147, 5148, 5112, 5150, 5149, 5152, 5153,
+     5155, 5156, 6793, 5160, 5161, 5154, 5174, 5163, 6793, 5177,
+     5167, 5178, 5179, 5180, 5184, 5182, 5185, 5188, 5189, 5191,
+
+     5193, 5195, 5181, 5202, 5205, 6793, 5207, 5210, 5218, 5213,
+     5214, 5215, 5216, 5217, 5219, 5221, 5223, 5224, 5233, 5225,
+     5236, 6793, 5237, 6793, 5238, 5240, 5242, 5243, 5244, 5245,
+     5246, 5248, 6793, 6793, 5251, 5252, 5258, 5253, 5260, 5262,
+     5264, 5265, 5269, 6793, 5270, 5272, 5282, 5274, 6793, 5277,
+     5279, 5283, 5289, 6793, 5284, 5286, 5290, 5298, 5291, 5301,
+     5302, 5304, 5293, 5305, 5306, 5312, 6793, 6793, 6793, 6793,
+     5314, 5308, 5319, 5316, 5320, 5322, 5323, 5325, 5328, 5321,
+     5324, 6793, 5336, 6793, 6793, 5337, 5338, 5340, 5344, 5345,
+     5346, 5347, 5350, 6793, 5348, 6793, 5352, 5355, 5351, 5362,
+
+     5368, 5359, 5369, 5371, 5372, 5373, 5374, 5375, 5382, 5380,
+     5383, 5381, 5386, 5390, 5395, 6793, 6793, 5387, 5398, 5399,
+     5407, 5403, 5404, 5405, 5416, 5411, 5412, 5413, 5414, 5418,
+     5420, 5427, 5430, 5423, 5425, 6793, 5431, 5434, 5432, 6793,
+     5433, 6793, 5442, 5443, 5436, 5440, 5446, 5449, 5450, 5452,
+     5457, 6793, 6793, 5456, 5465, 5460, 6793, 6793, 5444, 5464,
+     5467, 5469, 5470, 5471, 5472, 5473, 5476, 5478, 6793, 5479,
+     6793, 5480, 5483, 5492, 5482, 5495, 5499, 5485, 5502, 5505,
+     5498, 5508, 6793, 5501, 5509, 6793, 5517, 5512, 5514, 5516,
+     5519, 6793, 5520, 5523, 5525, 5527, 6793, 5529, 5531, 5532,
+
+     6793, 5539, 6793, 5533, 5540, 5536, 5550, 5542, 6793, 5543,
+     5546, 6793, 5552, 5556, 5557, 5558, 5559, 6793, 5562, 5564,
+     6793, 5565, 5567, 5568, 5574, 5575, 5577, 5570, 5578, 5579,
+     5586, 5588, 5591, 6793, 6793, 5598, 5584,  135, 5600, 5581,
+     5597, 5601, 5602, 5609, 5605, 5606, 5612, 6793, 6793, 5613,
+     6793, 5607, 5616, 6793, 5614, 5620, 5624, 5626, 5622, 5628,
+     5629, 5631, 5633, 5634, 5647, 5637, 5635, 5652, 5642, 5662,
+     5638, 5664, 5665, 5667, 5669, 5671, 5659, 5673, 5674, 5653,
+     5676, 5677, 5680, 5681, 5683, 5684, 5685, 6793, 5688, 5696,
+     5697, 5689, 6793, 5702, 5691, 5709, 5706, 6793, 5713, 5710,
+
+     5714, 5715, 5716, 6793, 5703, 5718, 5722, 5720, 5727, 5728,
+     5640, 5736, 5731, 5732, 5733, 6793, 6793, 6793, 5738, 5748,
+     6793, 5750, 5740, 5734, 5742, 6793, 5752, 5753, 5745, 6793,
+     6793, 5755, 5756, 5758, 6793, 5763, 5770, 6793, 5765, 6793,
+     5766, 6793, 5768, 5769, 5771, 5775, 6793, 5776, 5778, 5779,
+     5785, 6793, 5795, 5797, 5799, 5792, 5782, 5788, 5800, 6793,
+     5809, 5806, 5808, 5815, 5804, 5812, 5810, 5816, 5817, 5825,
+     5818, 5827, 6793, 5828, 5829, 5833, 5836, 5820, 5830, 5840,
+     6793, 5841, 6793, 5847, 6793, 5844, 5849, 5848, 5842, 5850,
+     5853, 5856, 5854, 5858, 5867, 5860, 5863, 5865, 5871, 5873,
+
+     6793, 6793, 5875, 5877, 6793, 5879, 6793, 5883, 6793, 5880,
+     5885, 5884, 5886, 5888, 6793, 5895, 5887, 5890, 5903, 5898,
+     5904, 6793, 5905, 5908, 5909, 5911, 6793, 6793, 5912, 5919,
+     5915, 6793, 5914, 5917, 5925, 5918, 5926, 5930, 5927, 5931,
+     5934, 5941, 5937, 5939, 5942, 5944, 5945, 5947, 5952, 5957,
+     6793, 6793, 6793, 5953, 5948, 5967, 5964, 5966, 5976, 5959,
+     6793, 5973, 5972, 5974, 5975, 5986, 5981, 5983, 6793, 5984,
+     5985, 5987, 5988, 5990, 5991, 5992, 5993, 6793, 6005, 6007,
+     5995, 5997, 6009, 6016, 6018, 6020, 6022, 6013, 6023, 6030,
+     6027, 6793, 6029, 6793, 6793, 6025, 6793, 6031, 6033, 6035,
+
+     6034, 6036, 6793, 6039, 6040, 6041, 6043, 6042, 6050, 6046,
+     6048, 6793, 6058, 6051, 6061, 6063, 6793, 6793, 6064, 6070,
+     6793, 6073, 6074, 6067, 6082, 6065, 6075, 6087, 6084, 6793,
+     6088, 6090, 6078, 6091, 6094, 6093, 6096, 6793, 6100, 6097,
+     6101, 6103, 6793, 6104, 6109, 6110, 6112, 6113, 6793, 6114,
+     6106, 6130, 6115, 6793, 6117, 6129, 6131, 6793, 6793, 6135,
+     6139, 6136, 6793, 6793, 6793, 6793, 6142, 6143, 6145, 6147,
+     6793, 6150, 6154, 6158, 6160, 6165, 6153, 6793, 6161, 6167,
+     6169, 6170, 6171, 6793, 6793, 6172, 6173, 6174, 6178, 6175,
+     6793, 6793, 6180, 6182, 6183, 6181, 6184, 6793, 6186, 6191,
+
+     6198, 6194, 6200, 6207, 6209, 6202, 6210, 6211, 6219, 6222,
+     6212, 6214, 6221, 6225, 6226, 6224, 6228, 6238, 6233, 6235,
+     6241, 6236, 6244, 6793, 6793, 6246, 6793, 6248, 6250, 6793,
+     6793, 6253, 6255, 6257, 6261, 6793, 6263, 6265, 6267, 6269,
+     6258, 6793, 6270, 6272, 6273, 6274, 6275, 6793, 6277, 6278,
+     6281, 6283, 6287, 6289, 6290, 6293, 6793, 6288, 6305, 6793,
+     6793, 6294, 6296, 6285, 6306, 6302, 6793, 6310, 6314, 6309,
+     6316, 6315, 6317, 6322, 6793, 6318, 6319, 6793, 6793, 6325,
+     6326, 6793, 6793, 6327, 6793, 6793, 6793, 6793, 6793, 6793,
+     6793, 6793, 6331, 6330, 6793, 6332, 6340, 6343, 6793, 6347,
+
+     6793, 6337, 6348, 6350, 6344, 6793, 6349, 6793, 6351, 6355,
+     6356, 6365, 6358, 6368, 6359, 6352, 6362, 6370, 6375, 6376,
+     6378, 6377, 6379, 6381, 6383, 6393, 6385, 6390, 6793, 6793,
+     6793, 6382, 6394, 6398, 6399, 6404, 6406, 6410, 6412, 6401,
+     6413, 6415, 6416, 6417, 6419, 6423, 6430, 6425, 6428, 6426,
+     6435, 6427, 6437, 6793, 6442, 6443, 6429, 6446, 6793, 6449,
+     6793, 6432, 6793, 6793, 6452, 6453, 6455, 6456, 6465, 6466,
+     6457, 6461, 6462, 6467, 6469, 6793, 6477, 6793, 6793, 6470,
+     6473, 6793, 6478, 6479, 6793, 6480, 6482, 6484, 6485, 6486,
+     6488, 6489, 6490, 6497, 6793, 6793, 6501, 6502, 6504, 6506,
+
+     6508, 6515, 6510, 6512, 6514, 6522, 6516, 6524, 6793, 6526,
+     6528, 6530, 6793, 6532, 6531, 6534, 6537, 6538, 6545, 6540,
+     6542, 6793, 6543, 6793, 6547, 6549, 6548, 6551, 6552, 6554,
+     6562, 6560, 6564, 6793, 6566, 6568, 6572, 6573, 6575, 6578,
+     6579, 6580, 6582, 6584, 6585, 6594, 6588, 6590, 6596, 6598,
+     6600, 6793, 6602, 6604, 6793, 6605, 6606, 6607, 6608, 6612,
+     6793, 6617, 6609, 6614, 6620, 6625, 6622, 6793, 6631, 6635,
+     6632, 6793, 6636, 6793, 6793, 6637, 6638, 6640, 6644, 6646,
+     6793, 6793, 6793, 6673, 6680, 6687, 6694, 6701, 6708, 6715,
+       88, 6722, 6729, 6736, 6743, 6750, 6757, 6764, 6771, 6778,
+
+     6785
     } ;
 
-static yyconst flex_int16_t yy_def[3372] =
+static yyconst flex_int16_t yy_def[3502] =
     {   0,
-     3353,    1, 3354, 3354, 3355, 3355, 3356, 3356, 3357, 3357,
-     3358, 3358, 3359, 3359, 3360, 3360, 3353, 3361, 3353, 3353,
-     3353, 3353, 3362, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3363, 3353, 3353, 3353,
-     3363, 3364, 3353, 3353, 3353, 3364, 3365, 3353, 3353, 3353,
-     3353, 3365, 3366, 3353, 3353, 3353, 3366, 3367, 3353, 3368,
-     3353, 3367, 3367, 3369, 3353, 3353, 3353, 3353, 3369, 3370,
-     3353, 3353, 3353, 3370, 3361, 3361, 3353, 3371, 3362, 3371,
-     3362, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3363,
-     3363, 3364, 3364, 3365, 3365, 3353, 3366, 3366, 3367, 3367,
-     3368, 3368, 3367, 3369, 3369, 3353, 3370, 3370, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3367, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3367,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3367, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3353, 3353, 3361, 3353, 3353, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3367, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3367, 3367, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3367, 3361, 3361,
-
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3353, 3361, 3367, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3367, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3367, 3361, 3353, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3353, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3353, 3361, 3361, 3361, 3361, 3367, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361,
-     3361, 3353, 3353, 3361, 3353, 3361, 3353, 3361, 3361, 3353,
-     3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-
-     3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3353, 3353, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3367, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3353, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-
-     3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3353,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3353, 3353, 3367, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3353, 3361, 3353, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361,
-
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3353, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361,
-     3353, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3353, 3361, 3361, 3353, 3361, 3353, 3361, 3353, 3361,
-
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3353,
-     3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-
-     3353, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353,
-     3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3353, 3353,
-     3361, 3361, 3361, 3353, 3353, 3353, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361, 3353, 3353,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353,
-
-     3353, 3361, 3353, 3361, 3361, 3353, 3353, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361, 3353,
-     3353, 3361, 3361, 3353, 3353, 3361, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3361, 3361, 3353, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3353,
-
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3353, 3361,
-     3353, 3361, 3353, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3353, 3361, 3353, 3353, 3361,
-     3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3353, 3353, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361,
-     3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-
-     3361, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361, 3361,
-     3361, 3353, 3361, 3361, 3353, 3361, 3361, 3361, 3361, 3361,
-     3353, 3361, 3361, 3361, 3361, 3361, 3361, 3353, 3361, 3361,
-     3361, 3353, 3361, 3353, 3353, 3361, 3361, 3361, 3361, 3361,
-     3353, 3353,    0, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353
+     3483,    1, 3484, 3484, 3485, 3485, 3486, 3486, 3487, 3487,
+     3488, 3488, 3489, 3489, 3490, 3490, 3483, 3491, 3483, 3483,
+     3483, 3483, 3492, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3493, 3483, 3483, 3483,
+     3493, 3494, 3483, 3483, 3483, 3494, 3495, 3483, 3483, 3483,
+     3483, 3495, 3496, 3483, 3483, 3483, 3496, 3497, 3483, 3498,
+     3483, 3497, 3497, 3499, 3483, 3483, 3483, 3483, 3499, 3500,
+     3483, 3483, 3483, 3500, 3491, 3491, 3483, 3501, 3492, 3501,
+     3492, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3493,
+     3493, 3494, 3494, 3495, 3495, 3483, 3496, 3496, 3497, 3497,
+     3498, 3498, 3497, 3499, 3499, 3483, 3500, 3500, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3497, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3497, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3483, 3483, 3491, 3483, 3483, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3497,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3497, 3497, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483,
+
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3497, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3483, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3497, 3491, 3483, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3483, 3491, 3491, 3491, 3483, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3483, 3491, 3483, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3497, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3497, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491,
+     3491, 3491, 3491, 3491, 3483, 3483, 3491, 3483, 3491, 3483,
+     3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3497, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3483, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3497, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3483,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3483, 3491, 3491, 3491, 3483, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+
+     3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3483, 3491, 3491, 3497, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483, 3491,
+     3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3483, 3483, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3483,
+     3483, 3491, 3491, 3491, 3483, 3491, 3491, 3483, 3491, 3483,
+     3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+
+     3483, 3483, 3491, 3491, 3483, 3491, 3483, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3483, 3483, 3491, 3483, 3491, 3491, 3491,
+
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3483, 3483, 3491,
+     3491, 3491, 3483, 3483, 3483, 3483, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491,
+     3483, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3483, 3491, 3483, 3491, 3491, 3483,
+     3483, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3483,
+     3483, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3483, 3491, 3491, 3483, 3483, 3491,
+     3491, 3483, 3483, 3491, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3483, 3491,
+
+     3483, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3483,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3483, 3491,
+     3483, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3483, 3491, 3483, 3483, 3491,
+     3491, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3483, 3483, 3491, 3491, 3491, 3491,
+
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491,
+     3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491,
+     3491, 3483, 3491, 3491, 3483, 3491, 3491, 3491, 3491, 3491,
+     3483, 3491, 3491, 3491, 3491, 3491, 3491, 3483, 3491, 3491,
+     3491, 3483, 3491, 3483, 3483, 3491, 3491, 3491, 3491, 3491,
+     3483, 3483,    0, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+
+     3483
     } ;
 
-static yyconst flex_int16_t yy_nxt[6588] =
+static yyconst flex_int16_t yy_nxt[6834] =
     {   0,
        18,   19,   20,   21,   22,   23,   22,   18,   18,   18,
        18,   18,   22,   24,   25,   26,   27,   28,   29,   30,
@@ -1602,7 +1646,7 @@ static yyconst flex_int16_t yy_nxt[6588] =
       311,   86,   86,   86,   86,  307,   86,  318,   86,   86,
        86,  319,   86,  325,  312,  313,  315,  309,  314,  316,
        86,  320,   86,  329,  321,  328,  322,  330,  327,  326,
-      332,   86,   86,   86,  724,  334,   86,  338,  323,  331,
+      332,   86,   86,   86,  736,  334,   86,  338,  323,  331,
       324,   86,  335,   86,   86,  340,   86,  342,   86,  339,
       341,   86,  333,   86,   86,   86,  344,  336,   86,   86,
        86,  343,   86,   86,  346,   86,  348,   86,  345,   86,
@@ -1627,648 +1671,676 @@ static yyconst flex_int16_t yy_nxt[6588] =
       425,   86,  436,   86,   86,  434,   86,  438,   86,  441,
       431,  437,  433,   86,  430,   86,  443,  446,   86,   86,
       439,  447,  440,   86,  442,   86,   86,  445,   86,   86,
-      457,  448,   86,  444,   86,  455,   86,   86,   86,  458,
-      461,  459,  499,  449,  170,  462,  450,  456,  469,   86,
-
-      463,  451,  452,  453,  454,  466,   86,  460,  464,  465,
-      467,   86,   86,   86,   86,  468,   86,   86,   86,  477,
-       86,   86,   86,  479,   86,  475,  478,  476,   86,  472,
-      470,   86,  480,  471,  473,  474,   86,   86,   86,  481,
-      483,  482,   86,  487,   86,  168,   86,   86,  488,   86,
-      489,  492,   86,  505,  493,  166,  484,  486,  485,  490,
-       86,   86,   86,   86,  491,   86,  494,  495,  497,   86,
-      498,   86,  500,  496,   86,  506,  507,   86,   86,  508,
-      504,   86,   86,   86,   86,  501,  509,   86,  502,  546,
-      503,   86,  510,   86,  520,   86,  511,  522,  519,  523,
-
-       86,  524,   86,  525,  512,   86,  513,  527,  514,  537,
-      535,  536,  521,  170,  538,   86,   86,   86,   86,  526,
-       86,  515,  539,   86,  516,  556,  517,   86,  518,   86,
-       86,  528,  529,  542,  540,   86,  541,  165,   86,  543,
-      545,  530,  544,  531,  532,  533,   86,  547,  534,  548,
-      549,   86,   86,   86,   86,  558,   86,  551,  553,   86,
-      550,   86,   86,  559,   86,   86,   86,  563,  555,  557,
-       86,  554,   86,   86,   86,  552,  561,  566,   86,  560,
-      562,  567,  568,   86,   86,   86,  565,   86,   86,  573,
-      564,   86,  572,   86,  569,  574,  575,   86,   86,  570,
-
-       86,  571,  577,   86,  578,   86,  580,  581,   86,  584,
-      594,   86,  582,  576,   86,   86,   86,  585,  603,  579,
-      586,   86,   86,  595,  583,   86,  589,  596,   86,  597,
-      599,  587,   86,  588,  590,  591,   86,  598,  592,  593,
-       86,   86,   86,   86,   86,  602,  601,  604,   86,  606,
-      608,   86,   86,  600,   86,   86,  611,  607,  612,  609,
-       86,   86,   86,  605,   86,  610,  613,   86,   86,   86,
-      618,   86,  616,  617,   86,  614,   86,   86,  619,   86,
-       86,   86,  615,  620,  624,   86,   86,  627,  623,  625,
-       86,  626,   86,   86,  621,  622,   86,  628,   86,  630,
-
-       86,  629,   86,  632,  634,   86,   86,   86,   86,  635,
-       86,  637,  631,   86,  633,   86,  645,  647,   86,   86,
-      639,  723,   86,   86,   86,   86,  636,  638,  640,   86,
-      641,  642,  644,  646,  648,  643,   86,   86,   86,  649,
-      652,   86,  655,   86,  650,  658,   86,  651,   86,  657,
-       86,   86,  653,   86,   86,   86,  654,   86,  661,  664,
-       86,   86,   86,  656,  660,  665,  667,   86,   86,  659,
-       86,   86,   86,   86,   86,   86,  662,  666,  663,  681,
-       86,   86,   86,  668,  670,  163,  684,  669,   86,  671,
-      679,  682,  720,  698,  672,  680,  673,  683,   86,   86,
-
-       86,   86,  674,   86,  675,  685,  688,  676,  677,  686,
-      692,   86,  691,  687,  678,  689,   86,   86,  690,   86,
-       86,  693,  696,   86,  699,   86,  694,   86,  701,   86,
-       86,   86,   86,  695,   86,   86,   86,   86,   86,   86,
-      707,   86,  703,  697,  702,  708,  704,  711,  712,  170,
-      700,  705,  710,  713,  714,   86,  706,  709,   86,   86,
-       86,   86,   86,   86,   86,  727,   86,  715,  721,  726,
-       86,   86,   86,  716,  725,  718,  722,  719,  717,  729,
-       86,   86,   86,   86,  728,   86,  731,   86,   86,   86,
-      735,   86,  730,  734,  740,  732,   86,  733,  736,  741,
-
-       86,  743,   86,  744,   86,  737,  745,  739,  738,  742,
-      746,   86,   86,  747,   86,  748,   86,  749,   86,   86,
-       86,   86,  750,   86,   86,  754,   86,  753,   86,   86,
-      752,  757,   86,   86,  756,   86,  762,  751,  755,   86,
-      758,   86,   86,  761,   86,  763,   86,  766,   86,   86,
-      767,  760,  759,  765,   86,   86,   86,   86,  773,   86,
-      770,  768,  764,   86,   86,   86,   86,   86,  774,   86,
-      781,   86,  771,  775,  776,  769,   86,  772,   86,  777,
-       86,  783,  778,  779,  780,  782,   86,   86,  788,  789,
-      786,  784,  785,  787,   86,   86,   86,   86,  790,   86,
-
-      791,   86,  793,   86,  794,   86,   86,   86,  795,   86,
-       86,  802,   86,  798,  800,  796,   86,   86,   86,   86,
-      799,   86,  792,  797,   86,  803,  808,  810,  806,   86,
-      801,   86,   86,  807,  805,  809,  804,  811,  812,   86,
-       86,   86,  813,   86,   86,   86,  814,  819,  821,  815,
-      817,   86,   86,   86,   86,  822,  820,  816,   86,   86,
-      825,   86,   86,  818,  824,  826,   86,   86,   86,   86,
-      832,   86,  829,   86,  827,  828,   86,  834,  835,   86,
-      837,   86,   86,  823,  839,   86,  830,  831,  833,  838,
-      841,  836,   86,   86,   86,  845,   86,  842,  843,  840,
-
-      846,   86,   86,  847,   86,   86,  849,  851,  844,   86,
-       86,   86,   86,  850,   86,  857,   86,  848,   86,   86,
-      858,   86,   86,   86,   86,   86,   86,  852,  853,  854,
-      866,  855,  859,  860,  856,   86,   86,  861,  863,   86,
-      865,   86,  862,   86,   86,  869,   86,  864,  871,   86,
-       86,   86,   86,  867,   86,  868,   86,  880,   86,  878,
-      870,   86,   86,   86,  872,  873,  881,   86,  874,  875,
-      876,  877,  879,   86,   86,  882,   86,   86,  884,  886,
-       86,   86,  883,   86,   86,   86,   86,  885,  890,  891,
-      892,  893,  887,  889,   86,   86,  888,   86,   86,  894,
-
-       86,   86,  896,  895,   86,  170,  897,  902,   86,  899,
-      901,   86,  898,  900,   86,  903,   86,   86,   86,  909,
-       86,   86,  904,  905,   86,  910,  912,   86,   86,   86,
-      914,  906,  907,  911,  913,  916,   86,   86,  908,   86,
-       86,   86,   86,  918,  922,   86,   86,  915,   86,  919,
-       86,   86,   86,  923,   86,  924,  917,   86,   86,   86,
-      921,   86,   86,  942,  925,  920,   86,  937,  938,  935,
-      940,   86,  927,   86,  936,   86,  926,   86,  161,  928,
-       86,  939,  929,   86,  943,  965,  930,  941,   86,  931,
-       86,  944,   86,  948,  949,   86,  932,  933,  946,  934,
-
-       86,   86,  947,  945,   86,  950,  951,   86,  952,   86,
-       86,  953,  957,  959,  960,   86,  954,   86,   86,  962,
-       86,   86,  955,  956,   86,  961,  964,  968,  969,   86,
-      958,   86,  966,  970,   86,  963,  971,   86,  972,   86,
-       86,  975,   86,  967,  974,   86,  973,  976,  977,   86,
-      979,   86,   86,   86,  978,  980,   86,   86,   86,   86,
-       86,  983,   86,  987,  981,   86,   86,  986,   86,   86,
-      990,   86,   86,  996,   86,  982, 1007,   86,  984,  985,
-      988,  994,  989,  992,  991,   86,  997,   86,   86, 1000,
-      995,  998,   86,  999,  993,   86, 1001,   86,   86, 1003,
-
-     1004,   86,   86, 1002,   86,   86,   86, 1005, 1008,   86,
-       86,   86, 1006,   86, 1009,   86, 1011,   86,   86,   86,
-     1012, 1016,   86,   86, 1019,   86,   86, 1018, 1010, 1020,
-       86,   86, 1017, 1013, 1014,   86, 1015,   86,   86, 1022,
-     1023,   86,   86, 1025,   86, 1021,   86, 1027,   86,   86,
-     1026, 1028,   86,   86, 1033,   86, 1029,   86, 1031, 1034,
-       86, 1024,   86, 1035,   86, 1032, 1038,   86, 1036,   86,
-     1044,   86, 1041, 1030, 1037,   86,   86, 1043,   86,   86,
-     1042,   86,   86, 1046,   86, 1040,   86,   86, 1039,   86,
-       86,   86,   86, 1057, 1054, 1052,   86, 1045,   86,   86,
-
-     1047, 1048, 1049,   86,   86, 1058, 1050, 1051,   86, 1055,
-     1059, 1056, 1053,   86, 1062,   86, 1065,   86, 1061,   86,
-     1064,   86, 1060,   86,   86,   86,   86, 1063,   86,   86,
-     1067, 1074, 1069,   86, 1075, 1077,   86,   86,   86, 1066,
-       86,   86,   86, 1068,   86, 1070, 1082, 1072, 1071, 1073,
-     1076, 1080, 1078, 1079, 1081,   86,   86,   86,   86,   86,
-       86, 1086, 1089, 1083,   86, 1088,   86, 1084,   86, 1090,
-       86,   86, 1093, 1095,   86, 1085,   86, 1091,   86, 1087,
-       86, 1098,   86, 1092,   86, 1097, 1099,  170, 1101,   86,
-     1102, 1094,   86,   86, 1096,   86,   86, 1100,   86,   86,
-
-     1105,   86,   86,   86,   86, 1118,   86,   86,   86,   86,
-     1119,   86, 1109, 1104, 1103, 1106, 1108, 1121,   86,   86,
-     1278, 1110, 1107, 1120, 1111,   86, 1124,   86, 1112,   86,
-     1113, 1123, 1122, 1125, 1114,   86, 1115,   86,   86, 1128,
-     1126, 1116,   86, 1127, 1129,   86, 1117, 1130,   86,   86,
-       86, 1131, 1132,   86,   86, 1135,   86, 1134, 1138,   86,
-       86, 1137,   86,   86, 1133, 1136,   86, 1144, 1139, 1142,
-     1145,   86, 1143, 1141, 1146,   86,   86, 1140, 1147,   86,
-       86, 1148, 1149,   86,   86, 1150,   86,   86,   86,   86,
-     1151,   86, 1161, 1152,   86, 1153, 1160, 1162,   86, 1164,
-
-     1154, 1163, 1155,   86,   86, 1167,   86,   86, 1156, 1165,
-     1171, 1166,   86, 1157, 1158,   86,   86,   86,   86,   86,
-     1159,   86, 1172, 1177,   86, 1168, 1169, 1173, 1170,   86,
-       86, 1180,   86, 1178,   86, 1175, 1174,   86,   86, 1176,
-       86, 1181, 1185,   86,   86, 1183,   86, 1184,   86, 1186,
-     1179, 1182,   86,   86, 1191, 1188,   86,   86,   86,   86,
-       86, 1189, 1187, 1194,   86, 1192,   86,   86,   86, 1190,
-      178,   86,   86,   86,   86,   86, 1193, 1201, 1196, 1195,
-     1198, 1199, 1200, 1203, 1202,   86, 1197,   86,   86,   86,
-     1204,   86,   86,   86,   86, 1206,   86,   86, 1211, 1205,
-
-       86, 1212, 1208, 1214,   86, 1213, 1207, 1210, 1216, 1209,
-       86, 1215, 1218, 1217,   86,   86,   86, 1221,   86,   86,
-       86, 1223, 1222,   86, 1224,   86,   86,   86, 1219, 1225,
-       86,   86, 1220, 1226, 1232,   86, 1234,   86, 1227,   86,
-       86, 1228,   86, 1230, 1236, 1229, 1231,   86,   86,   86,
-       86, 1238, 1235,   86,   86, 1233,   86,   86, 1240, 1241,
-       86, 1237, 1244,   86,   86, 1243, 1242,   86, 1245,   86,
-     1239, 1250, 1246, 1247,   86, 1249,   86,   86, 1251,   86,
-     1248,   86,   86, 1252, 1254,   86, 1255,   86,   86,   86,
-       86, 1261, 1259, 1262, 1253,   86,   86,   86,   86,   86,
-
-     1256, 1263,   86, 1260,   86, 1266, 1257, 1264, 1258, 1265,
-     1269,   86,   86, 1267, 1271,   86,   86, 1270, 1268,   86,
-       86,   86,   86,   86,   86,   86, 1276, 1277, 1272, 1273,
-     1279,   86,   86,   86, 1283,   86, 1284,   86,   86, 1274,
-       86, 1275,   86, 1286, 1281, 1287,   86,   86,   86, 1280,
-     1285, 1291, 1282,   86,   86,   86, 1288,   86,   86,   86,
-     1290, 1289,  170, 1293, 1297,   86,   86,   86,   86,   86,
-       86, 1292,   86, 1302, 1304,   86, 1294,   86, 1296, 1301,
-     1299, 1303, 1298, 1295, 1300, 1306, 1307,   86,   86,   86,
-     1305,   86,   86, 1308, 1309,   86,   86, 1310,   86,   86,
-
-       86, 1311, 1312,   86, 1314,   86, 1316,   86, 1320,   86,
-     1317,   86, 1313,   86,   86, 1315,   86,   86,   86,   86,
-     1318,   86, 1324,   86, 1326, 1321, 1319, 1330, 1334, 1323,
-       86, 1322, 1335, 1327,   86, 1328,   86, 1325, 1329,   86,
-     1331, 1332, 1333,   86,   86,   86,   86, 1336,   86, 1337,
-       86, 1340, 1338,   86, 1339,   86,   86,   86, 1343, 1347,
-       86,   86, 1342,   86,   86,   86, 1348, 1341, 1345, 1344,
-     1349,   86,   86,   86,   86, 1346, 1351, 1352,   86, 1354,
-       86, 1353,   86, 1350,   86,   86,   86,   86,   86, 1355,
-       86,   86, 1357, 1359, 1360,   86, 1364, 1356,   86, 1358,
-
-       86,   86,   86,   86, 1361,   86, 1363,   86, 1362, 1368,
-     1365, 1366,   86,   86, 1376, 1371, 1369,   86, 1367,   86,
-       86, 1370,   86,   86, 1372,   86,   86, 1374,   86,   86,
-     1379, 1378, 1373, 1375, 1377,   86,   86,   86, 1383, 1384,
-     1382, 1381, 1388, 1380, 1385,   86, 1398, 1386,   86, 1389,
-     1387,   86, 1390,   86,   86, 1399, 1391,   86, 1400, 1392,
-     1393,   86,   86, 1402, 1394, 1403, 1397, 1401,   86,   86,
-     1395,   86,   86, 1404, 1396,   86, 1406, 1405,   86, 1408,
-       86,   86,   86, 1409,   86, 1410,   86,   86,   86,   86,
-     1407, 1418, 1415, 1413,   86,  176,   86,   86, 1419, 1420,
-
-     1412, 1411, 1416,   86,   86,   86, 1414, 1417,   86, 1421,
-     1428,   86, 1422, 1427,   86, 1429,   86, 1423,   86, 1424,
-     1433, 1425, 1432, 1426, 1430, 1431,   86,   86,   86, 1437,
-       86,   86,   86, 1434, 1438,   86,   86, 1436,   86, 1439,
-       86, 1441,   86,   86, 1435, 1447, 1442, 1443,   86, 1448,
-       86,   86,   86, 1440,   86,   86,   86, 1446, 1449, 1444,
-     1451, 1445,   86,   86,   86, 1453, 1450,   86, 1452, 1454,
-     1458,   86, 1457,   86, 1460,   86,   86,   86, 1461,   86,
-     1462, 1455,   86,   86, 1463, 1466,   86,   86, 1459, 1456,
-     1468,   86, 1465,   86, 1469,   86,   86,   86, 1473,   86,
-
-     1470, 1464,   86,   86,   86,   86, 1475, 1467,   86,  175,
-     1477,   86,   86,   86, 1479,   86, 1481, 1471, 1472,   86,
-     1478,   86, 1474,   86, 1476,   86, 1480,   86, 1483, 1486,
-     1482,   86, 1485, 1484,   86,   86, 1487, 1488,   86, 1490,
-     1489,   86,   86, 1492,   86,   86, 1491, 1496, 1493, 1497,
-     1499, 1494,   86,   86,   86,   86,   86, 1498, 1495,   86,
-       86, 1503,   86, 1500,   86,  170,   86,   86, 1508, 1509,
-       86, 1502,   86, 1511,   86,   86, 1510,   86, 1501,   86,
-     1505,   86,   86,   86, 1504,   86, 1506,   86,   86, 1519,
-     1507, 1512, 1514,   86, 1516,   86,   86, 1513,   86, 1517,
-
-       86, 1515,   86, 1520,   86, 1518,   86, 1523, 1524,   86,
-     1528, 1526,   86, 1522, 1533, 1529,   86, 1527, 1521, 1525,
-       86, 1531, 1530,   86,   86,   86,   86,   86, 1532, 1540,
-     1537,   86,   86, 1538, 1542, 1539, 1543,   86, 1534, 1535,
-       86, 1545, 1536,   86,   86, 1541, 1546,   86, 1544,   86,
-       86,   86,   86,   86,   86, 1550, 1551,   86,   86, 1554,
-       86,   86, 1547,   86, 1559,   86,   86, 1549,   86, 1560,
-     1548, 1552, 1553,   86, 1556, 1563, 1557, 1555,   86, 1558,
-       86,   86,   86,   86, 1561, 1564,   86, 1562,   86, 1571,
-       86,   86,   86,   86, 1566, 1570, 1572, 1565, 1567,   86,
-
-     1575, 1568, 1574,   86,   86,   86, 1580, 1569,   86, 1579,
-     1573, 1581,   86, 1577,   86, 1583,   86,   86, 1576,   86,
-       86,   86,   86, 1588, 1589, 1578, 1584, 1587, 1582,   86,
-       86, 1590,   86, 1591,   86, 1585,   86,   86,   86, 1592,
-     1593,   86, 1586,   86,   86, 1595,   86, 1594,   86,   86,
-       86,   86, 1596,   86, 1601,   86, 1597, 1600,   86, 1603,
-     1598,   86, 1607, 1599,   86, 1609, 1604, 1608,   86, 1602,
-     1610,   86, 1605,   86, 1606,   86, 1612,   86,   86,   86,
-       86,   86,   86, 1620, 1611, 1616,   86, 1615,   86,   86,
-       86, 1621, 1613, 1623,   86,   86, 1614,   86, 1617,   86,
-
-     1619, 1618, 1626, 1625,   86,   86,   86,   86,   86, 1624,
-       86,   86,   86, 1627, 1622, 1635, 1632,   86, 1634,   86,
-       86, 1631,   86, 1628, 1629, 1630, 1633, 1639,   86, 1636,
-     1640,   86, 1638,   86,   86, 1643,   86, 1642, 1637, 1641,
-       86,   86,   86, 1646,   86, 1644,   86, 1647,   86,   86,
-       86, 1650, 1656, 1645, 1654,   86,   86, 1651,   86,   86,
-     1648, 1655, 1649, 1658,   86, 1653,   86,   86, 1652, 1659,
-     1660, 1661,   86,   86, 1657,   86,   86, 1666, 1667,   86,
-       86,   86,   86,   86, 1664,   86, 1671, 1670, 1672,   86,
-       86, 1663, 1662, 1675,   86,   86, 1665,   86, 1668, 1674,
-
-       86,   86, 1669, 1676,   86,   86,   86,   86, 1679, 1673,
-       86, 1677,   86, 1678,   86, 1681,   86, 1682,   86,   86,
-     1688, 1680, 1683, 1686,   86,   86, 1687,   86,   86,   86,
-       86, 1684,   86, 1685, 1689,   86, 1694,   86,   86,   86,
-       86, 1700, 1690, 1691, 1695, 1697, 1699,   86,   86, 1693,
-     1696,   86, 1692, 1698,   86, 1702,   86,   86,   86, 1701,
-     1705,  170, 1704, 1707, 1708,   86,   86,   86,   86,   86,
-     1703,   86,   86, 1716,   86,   86, 1706, 1709,   86, 1717,
-       86, 1711,   86, 1714, 1710, 1720,   86, 1712, 1713, 1721,
-       86,   86,   86, 1724,   86, 1718, 1715, 1722, 1719, 1725,
-
-     1726, 1728, 1723,   86, 1730,   86,   86,   86,   86,   86,
-     1727,   86,   86,   86, 1735, 1732, 1733, 1729,   86, 1736,
-       86,   86,   86,   86,   86, 1741, 1740, 1731,   86,   86,
-       86,   86, 1748,  170, 1737,   86, 1734, 1739,   86, 1738,
-     1749, 1743,   86,   86,   86, 1745, 1742, 1750, 1746,   86,
-     1744, 1757, 1752, 1758, 1753,   86, 1754,   86, 1755,   86,
-     1747, 1756,   86, 1751,   86,   86, 1760,   86, 1761, 1759,
-     1762,   86,   86,   86,   86,   86,   86, 1763,   86, 1769,
-     1770, 1768,   86, 1772, 1764,   86,   86, 1771,   86,   86,
-       86, 1765,   86, 1766,   86, 1767,   86, 1774, 1775,   86,
-
-       86, 1776,   86,   86,   86,   86,   86,   86, 1777,   86,
-       86, 1773, 1786, 1785, 1778,   86, 1780, 1781, 1782,   86,
-     1779,   86, 1791, 1783,   86,   86, 1787, 1788,   86,   86,
-       86, 1784, 1790, 1789,   86, 1797,   86,   86,   86,   86,
-       86, 1793,   86, 1799, 1792,   86, 1801,   86, 1795, 1794,
-       86, 1796, 1800,   86, 1802,   86, 1803, 1798,   86,   86,
-       86,   86, 1806,   86,   86, 1808,   86, 1815, 1805, 1809,
-     1807, 1804, 1810, 1816,   86, 1811, 1812, 1817,   86,   86,
-       86, 1813,   86, 1820, 1819, 1821,   86,   86, 1814,   86,
-       86, 1818,   86,   86, 1824, 1822,   86, 1825,   86,   86,
-
-       86,   86, 1828, 1834,   86,   86, 1823, 1833, 1830, 1826,
-     1832, 1831, 1827,   86,   86,   86, 1840, 1829, 1836,   86,
-     1835, 1841,   86,   86,   86,   86,   86,   86, 1842, 1838,
-       86, 1846, 1837,   86,   86, 1839, 1843,   86, 1850, 1849,
-       86,   86, 1848, 1847, 1845,   86, 1854,   86,   86,   86,
-     1844,   86, 1851,   86, 1852, 1858,   86, 1853, 1855,   86,
-     1859,   86,   86, 1860, 1863,   86, 1857, 1869, 1856, 1864,
-     1868, 1861, 1867, 1862,   86,   86, 1866,   86,   86, 1870,
-     1865,   86,   86, 1874,   86,   86, 1878, 1871,   86,   86,
-       86,   86,   86, 1876, 1872,   86, 1873, 1875,   86, 1877,
-
-       86,   86,   86, 1879,   86,   86, 1882, 1880,   86, 1883,
-     1881, 1888,   86,   86, 1884, 1885, 1890, 1891, 1886, 1887,
-       86, 1892,   86,   86, 1893,   86,   86, 1897,   86,   86,
-     1899, 1895,   86, 1889,   86,   86,   86, 1903,   86,   86,
-     1894,   86, 1898,   86,   86, 1896, 1906, 1905,   86, 1907,
-     1901,   86,   86, 1902, 1900,  170, 1908, 1909,   86, 1904,
-     1913,   86,   86,   86,   86, 1917,   86, 1911,   86,   86,
-       86,   86,   86, 1912,   86, 1910, 1915, 1919,   86, 1924,
-     1920, 1914, 1916, 1918, 1921,   86,   86,   86, 1928,   86,
-     1922,  168,   86, 1927, 1923, 1929, 1926,   86, 1925, 1930,
-
-       86,   86, 1931, 1933, 1934,   86,   86,   86,   86,   86,
-     1932,   86,   86, 1936,   86, 1937,   86,   86, 1935,   86,
-       86,   86, 1942,   86, 1943,   86,   86, 1938,   86, 1944,
-     1939, 1947, 1940, 1945, 1941,   86,   86, 1948, 1946,   86,
-     1951, 1953, 1955,   86,   86, 1950, 1956, 1952,   86,   86,
-     1949,   86,   86,   86, 1954,   86,   86, 1962,   86, 1965,
-     1966,   86, 1967,   86,   86, 1957,   86, 1958, 1959, 1960,
-     1963, 1961, 1964, 1969,   86,   86, 1970,   86, 1973,   86,
-     1975,   86,   86, 1977, 1968, 1974,   86, 1971,   86,   86,
-     1979, 1976,   86,   86,   86,   86,   86, 1981, 1972,   86,
-
-     1978, 1982,   86,   86, 1984, 1985,   86,   86,   86, 1989,
-     1986,   86, 1988, 1983, 1991,   86, 1990, 1980,   86,   86,
-       86,   86,   86,  166, 1987, 1999,   86, 1992, 1993, 1994,
-     2001,   86,   86,   86, 1995, 2002,   86, 1997, 1996,   86,
-     2003, 1998, 2000,   86, 2006, 2005, 2008, 2004,   86,   86,
-       86,   86,   86,   86, 2007, 2012,   86, 2009,   86, 2014,
-       86,   86, 2017, 2018,   86,   86, 2020,   86,   86, 2010,
-       86, 2011,   86, 2015,   86, 2026,   86, 2013, 2025, 2022,
-       86, 2023, 2016,   86,   86, 2019,   86,   86,   86,   86,
-     2032,   86,   86, 2021, 2029, 2024, 2036, 2030, 2028,   86,
-
-       86, 2027,   86,   86, 2035, 2039,   86,   86, 2034, 2040,
-     2038,   86, 2031, 2042, 2043,   86,   86, 2033,   86,   86,
-     2037, 2044,   86,   86,   86, 2041,   86, 2045,   86, 2049,
-       86,   86, 2052, 2053, 2054, 2048,   86,   86,   86,   86,
-       86,   86, 2046, 2047,   86, 2057, 2050,   86, 2062,   86,
-       86, 2056, 2061,   86,   86,   86, 2051, 2055, 2059, 2066,
-       86, 2058,   86, 2067,   86,   86, 2060,   86, 2064, 2063,
-     2068, 2070,   86, 2065, 2069,   86, 2074,   86, 2072, 2071,
-       86, 2075,   86, 2073,   86,   86,   86, 2081,   86, 2078,
-       86, 2084,   86,   86, 2076, 2083,   86, 2085,   86,   86,
-
-       86, 2077, 2086, 2082,   86, 2079, 2080,   86, 2087, 2091,
-       86, 2088, 2092,   86, 2093, 2095, 2089, 2096,   86, 2094,
-       86,   86,   86,   86, 2090, 2100,   86, 2098,   86,   86,
-     2099,   86, 2102, 2097,   86,   86, 2105, 2107, 2101,  170,
-       86, 2103,   86,   86, 2108,   86,   86,   86,   86,   86,
-     2113,   86, 2109, 2112,   86, 2114, 2120, 2106, 2110, 2104,
-     2115,   86, 2116,   86, 2111, 2118,   86,   86,   86, 2117,
-       86,   86, 2119, 2121,   86, 2123,   86, 2122,   86, 2124,
-       86, 2126,   86,   86, 2130,   86, 2125,   86, 2129,   86,
-     2127,   86,   86,   86, 2128,   86, 2131, 2132, 2133,   86,
-
-     2135,   86, 2134,   86, 2137,   86, 2142,   86,   86, 2136,
-     2139, 2140,   86, 2141,   86,   86,   86,   86, 2147,   86,
-       86, 2138,   86, 2143, 2144,   86, 2152,   86,   86, 2148,
-     2146, 2150, 2145,   86,   86,   86, 2153, 2149,   86, 2156,
-     2151, 2158,   86,   86,   86, 2154, 2159,   86, 2157, 2155,
-       86, 2164,   86,   86, 2160,   86, 2166,   86,  165,   86,
-     2161, 2167, 2162,   86, 2163, 2168,   86, 2170,   86, 2165,
-       86, 2169,   86, 2171,   86, 2174, 2172, 2175,   86,   86,
-     2173,   86,   86, 2178,   86,   86,   86,   86,   86,   86,
-       86,   86,   86, 2179,   86,   86, 2192,   86, 2181, 2177,
-
-     2176, 2182, 2183, 2184,   86, 2186, 2180, 2191,   86,   86,
-     2187,   86, 2189,   86, 2185,   86, 2195, 2190,   86,   86,
-     2196,   86,  163, 2188, 2198,   86, 2193, 2199,   86, 2194,
-       86, 2197,   86, 2201,   86,   86, 2200, 2202,   86, 2204,
-     2207, 2203,   86, 2205,   86,   86, 2209, 2206, 2211,   86,
-       86,   86,   86,   86, 2214,   86, 2213,   86, 2215, 2210,
-     2216, 2208,   86, 2219,   86,   86,   86, 2223,   86,   86,
-     2220,   86, 2224,   86,   86, 2217, 2212, 2221, 2222, 2225,
-     2228,   86, 2218,   86, 2229,   86,   86, 2226, 2227, 2232,
-       86,   86, 2234,   86,   86,   86, 2233, 2238,   86,  161,
-
-     2230,   86, 2236,   86, 2240,   86, 2231,   86, 2241,   86,
-     2237, 2235,   86, 2239, 2242,   86,   86, 2243,   86,   86,
-     2247,   86,   86,   86, 2249, 2245,   86, 2244, 2246, 2250,
-       86, 2251, 2252, 2253, 2254,   86, 2248,   86,   86, 2257,
-     2255,   86, 2256, 2260,   86,   86,   86,   86,   86,   86,
-     2259,   86,   86,   86,   86,   86,   86,   86, 2258, 2269,
-     2266, 2264, 2270, 2261, 2262, 2263, 2265, 2267,   86,   86,
-       86,   86, 2268,   86,   86, 2272, 2274, 2271, 2278, 2275,
-     2280,   86,   86, 2279,   86,   86, 2276,  170, 2273, 2282,
-       86, 2277,   86, 2281,   86,   86, 2284, 2288, 2286, 2285,
-
-     2290, 2283, 2289,   86, 2291,   86,   86,   86, 2292, 2287,
-       86,   86, 2295,   86,   86, 2293,   86,   86, 2296, 2300,
-       86,   86, 2301, 2299,   86,   86, 3353, 2304, 2302,   86,
-     2305, 2294, 2297,   86,   86, 2306, 2307,   86,   86,   86,
-     2309,   86, 2303, 2298, 2308, 2310,   86,   86,   86, 2311,
-       86, 2312,   86,   86,   86, 2315,   86,   86, 2313, 2318,
-       86,   86,   86, 2324,   86,   86, 2322,   86, 2317, 2325,
-       86,   86,   86, 2314, 2319, 2316, 2320, 2321,   86,   86,
-       86,   86, 2326, 2327, 2323, 2333, 2332,   86,   86, 2329,
-       86, 2330, 2335,   86,   86,   86, 2328,   86, 2336, 2331,
-
-       86,   86,   86,   86,   86, 2334,   86, 2337,   86,   86,
-       86,   86, 2349, 2338, 2343, 2348, 2351, 2346, 2339, 2341,
-     2347, 2340, 2342, 2345, 2344, 2350,   86,   86,   86,   86,
-     2352,   86,   86, 2356, 2357,   86,   86,   86, 2358, 2359,
-       86, 2353,   86, 2354, 2355,   86, 2362,   86, 2365,   86,
-     2366,   86, 2360,   86,   86, 2361, 2363,   86, 2367, 2364,
-       86,   86, 2368, 2372,   86, 2373,   86,   86, 2375,   86,
-       86, 2377,   86, 2371, 2369,   86,   86, 2380,   86,   86,
-     2370, 2379, 2381,   86,   86,   86, 2374,   86, 2376,   86,
-     2378,   86,   86, 2382, 2383, 3353, 2386,   86, 2384, 2387,
-
-       86, 2389,   86, 2391,   86,   86, 2385, 2392, 2388,   86,
-     2390,   86, 2393, 2395,   86,   86,   86,   86, 2398, 2401,
-       86,   86,   86,   86, 2396,   86,   86, 2394, 2400, 2405,
-     2397,   86, 2399, 2406,   86,   86,   86,   86, 2404,   86,
-     2408, 2402, 2411,   86,   86, 2403, 2412,   86,   86,   86,
-     2407, 2409, 2410, 2414, 2413,   86, 2418,   86,   86, 2420,
-       86,   86, 2415, 2421, 2424,   86, 2416, 2419,   86,   86,
-       86,   86,   86, 2425, 2426, 2417, 2427,   86, 2422,   86,
-     2423, 2429, 2431,   86,   86,   86, 2436,   86, 2433, 2434,
-     2428, 2438,   86, 2430,   86,   86,   86,   86,   86, 2439,
-
-     2435, 2440,   86,   86,   86, 2432, 2443,   86, 2437,   86,
-       86, 2442,   86, 2444, 3353, 2449, 2445, 2450, 2446, 2447,
-     2441,   86, 2452,   86,   86,   86, 2448, 2455, 2451,   86,
-     2454,   86, 2456,   86, 2453,   86,  170,   86,   86,   86,
-     2457, 2458, 2463,   86,   86,   86,   86,   86, 2465,   86,
-       86,   86, 2470, 2461, 2462, 2459,   86, 2460, 2466, 2464,
-       86, 2467, 2468, 2469,   86, 2471, 2474,   86, 2473, 2478,
-     2472,   86, 2475, 2476,   86,   86, 2479, 2480, 2477,   86,
-     2482,   86,   86,   86,   86,   86, 2484,   86, 2481,   86,
-       86,   86, 2488,   86, 2489,   86,   86, 3353, 2483, 2485,
-
-       86, 2491,   86, 2486, 2496,   86, 2492, 2490, 2493, 2487,
-     2494,   86,   86,   86,   86,   86,   86, 2495,   86, 2499,
-     2500,   86, 2497, 2502,   86,   86,   86,   86,   86, 2501,
-       86, 2506, 2509,   86, 2498, 2508,   86,   86,   86, 2510,
-     2505,   86,   86,   86, 2503, 2504,   86, 2514, 2507,   86,
-       86, 2519,   86,   86, 2511, 2518, 2512,   86, 2516,   86,
-     2513, 2520,   86,   86, 2515, 2517,   86, 2528, 2521,   86,
-     2524, 2522,   86, 2523, 2529, 2525,   86, 2527, 2526,   86,
-       86, 2531,   86,   86, 2533,   86,   86,   86,   86,   86,
-       86, 2530, 2532, 2537,   86,   86, 2541,   86,   86, 2539,
-
-     2540, 2535, 2542,   86, 2534, 2536, 2543,   86, 2544,   86,
-       86,   86,   86,   86, 2545, 2547, 2538,   86, 2552,   86,
-     2549,   86, 2554,   86,   86, 2550,   86,   86,   86,   86,
-     2548, 2546, 2553, 2551, 2557,   86,   86,   86, 2561, 2558,
-       86, 2556, 2555, 2562,   86, 2563, 2559, 2560,   86,   86,
-       86,   86,   86, 2567,   86, 2566,   86,   86, 2565,   86,
-       86,   86, 2571, 2634, 2570, 3353, 2564,   86, 2568,   86,
-     2569,   86, 2574, 2575,   86, 2576,   86, 2577,   86, 2572,
-     2573, 2578,   86, 2579,   86,   86, 2582, 2580,   86, 2581,
-       86, 2583,   86,   86,   86, 2588,   86,   86, 2590,   86,
-
-     2584, 2591,   86,   86, 2585,   86,   86,   86,   86,   86,
-     2587,   86,   86, 2586, 2592, 2594, 2589, 2593, 2595,   86,
-     2600,   86,   86,   86, 2597,   86,   86, 2596,  170, 2598,
-       86, 2599, 2601,   86, 2608,   86,   86,   86, 2602, 2604,
-     2607,   86, 2603,   86, 2606, 2609,   86,   86,   86, 2605,
-     2610, 2615, 2611,   86, 3353,   86, 2619,   86, 2617, 2612,
-     2618, 2616, 2620,   86,   86, 2613,   86, 2621,   86, 2614,
-       86, 2622,   86, 2623,   86,   86,   86,   86,   86, 2625,
-       86,   86, 2624,   86,   86,   86, 2638,   86,   86, 2632,
-     2627, 2639,   86, 2626,   86, 2629, 2628,   86,   86,   86,
-
-     2630, 2631,   86, 2633, 2635, 2636, 2637, 2642, 2640, 2643,
-       86, 2644, 2645,   86,   86,   86,   86, 2646,   86, 2641,
-       86,   86, 2648,   86, 2654,   86, 2655,   86,   86,   86,
-       86, 2649, 2647,   86, 2659,   86, 2650, 2652, 2651, 2658,
-     2660,   86, 2653, 2661,   86, 2663,   86, 2657, 2656,   86,
-       86,   86,   86,   86,   86,   86, 2666, 2670,   86, 2669,
-     2671,   86, 2662,   86, 2665, 2664,   86,   86, 2672, 2673,
-       86,   86, 2667, 2668,   86,   86, 2675, 2674,   86,   86,
-     2679,   86, 2676, 2677,   86, 2684,   86, 2683,   86,   86,
-     2687,   86,   86,   86, 2678,   86, 2690,   86, 2680, 2682,
-
-     2681,   86,   86, 2685, 2688, 2692,   86, 2686, 2693,   86,
-     2689,   86, 2691,   86,   86, 2694, 2698,   86,   86,   86,
-       86, 2695,   86, 2701, 2702,   86, 2699, 2700, 2704,   86,
-       86, 2696,   86, 2697,   86, 2705,   86,   86, 2707, 2703,
-       86, 2706, 2710,   86,   86, 2711, 2708, 2713,   86,   86,
-       86,   86,   86, 2714, 2718,   86, 2709, 2720,   86, 2712,
-     2716, 2717, 2715,   86,   86, 2719,   86,   86, 2721, 2722,
-       86,   86, 2724,   86,   86,   86,   86,   86, 2725,   86,
-     2723, 2730, 2727, 2728, 2731, 2733,   86, 2734,   86, 2729,
-     2726,   86, 2732, 2735,  170,   86,   86,   86, 2736, 2740,
-
-     2737,   86,   86, 2742,   86,   86, 2741,   86, 2745,   86,
-     2746,   86, 2744,   86, 2738, 2739, 2748,   86,   86, 2743,
-       86, 2749, 2750,   86,   86, 2752, 2747, 2751,   86, 2753,
-     2755,   86,   86,   86,   86, 2756,   86, 2754, 2757,   86,
-       86, 2758, 2762,   86, 2763,   86,   86, 2760,   86, 2759,
-       86, 2764, 2766,   86,   86, 2765,   86, 2768, 2767,   86,
-       86, 2761,   86,   86, 2770, 2771,   86,   86, 2769,   86,
-       86, 2776,   86, 2779,   86, 2774, 2773,   86, 2775,   86,
-     2772, 2777,   86, 2780,   86, 2778, 2784,   86,   86,   86,
-       86,   86,   86, 2781,   86, 2785, 2789,   86,   86, 2787,
-
-       86,   86, 2782, 2783, 2793,   86, 2788, 3210, 2786, 2791,
-     2796, 2790, 2794,   86, 2797, 2798,   86,   86, 2792,   86,
-       86,   86, 2799,   86, 2801, 2800, 2795,   86,   86, 2804,
-       86,   86,   86, 2805,   86,   86, 2802,   86, 2806,   86,
-     2809, 2803, 2811,   86,   86, 2807, 3353, 2808, 2812,   86,
-     2813,   86,   86,   86,   86, 2810, 2814,   86, 2815, 2816,
-       86,   86, 2818, 2820, 2817,   86, 2819,   86, 2821,   86,
-       86, 2824,   86, 2822, 2825,   86, 2826,   86,   86,   86,
-     2828, 2827, 2831,   86,   86, 2823,   86, 2832, 2833,   86,
-     2829,   86, 2835,   86,   86,   86, 2839, 2836,   86, 2830,
-
-     2840,   86,   86,   86,   86, 2842, 2834, 2841,   86, 2838,
-     2843,   86, 2837,   86, 2848,   86, 2851,   86,   86, 2847,
-       86, 2844, 2850,   86, 2845,   86,   86,   86, 2846, 2854,
-     2852, 2853,   86,   86, 2857, 2856,   86,   86,   86,   86,
-     2849,   86, 2860, 2864,   86,   86,   86,   86,   86,   86,
-     2866,   86, 2855, 2858, 2859, 2863, 2861, 2870, 2867, 2862,
-     2865, 2871, 2868, 2873, 2869,   86, 2872,   86, 2874,   86,
-     2875, 2876,   86,   86, 2877,   86, 2878,   86, 2879,   86,
-     2880, 2881,   86,   86,   86,   86,   86, 2882,   86,   86,
-     2885,   86,   86, 2887, 2891,   86, 2892,   86, 2888,   86,
-
-       86,   86, 2893, 2883,   86, 2886, 2895,   86, 2896, 2898,
-     2884, 2889, 2890, 2897,   86, 2899,   86,   86, 2894,   86,
-       86,   86, 2904,   86,   86,   86, 2900,   86, 2901, 2902,
-       86, 2905,   86, 2906,   86,   86,   86, 2910, 2914, 2903,
-       86, 2908, 2911,   86, 2907, 2913,   86, 2909, 2912, 2916,
-       86, 2915, 2917,   86, 2918,   86,   86, 2921,   86,   86,
-       86,   86,   86,   86, 2927,   86,   86,   86, 2922, 2944,
-       86, 2925, 2923,   86, 2920,   86,   86, 2928, 2930,   86,
-     2919, 2931, 2961, 2926,   86, 2932, 2924, 2929, 2933,   86,
-       86,   86, 2935,   86, 2934, 2936, 2937,   86, 2938,   86,
-
-     2939,   86, 2940,   86,   86,   86,   86,   86,   86, 2943,
-     2941, 2945, 2946, 2947,   86,   86,   86,   86, 2953,   86,
-     2949, 2951, 2942, 2948,   86, 2955,   86,   86,   86,   86,
-       86, 2956,   86, 2957, 2958, 2952, 2950,   86, 2959,   86,
-     2964,   86,   86,   86, 2954,   86,   86, 2962,   86, 2960,
-     2967,   86,   86,   86, 2968, 2965, 2966,   86, 2972, 2963,
-     2971,   86, 2973,   86, 2969,   86, 2974, 2977,   86,   86,
-     2970, 2979,   86, 2980,   86,   86, 2982,   86,   86,   86,
-       86, 2975,   86, 2987,   86, 2986,   86, 2990, 2978,   86,
-       86, 2976,   86,   86, 2983, 2984, 2981,   86, 2985, 2989,
-
-       86, 2993,   86,   86, 2996,   86, 2988, 2998,   86,   86,
-       86, 2992, 2991,   86, 2999,   86, 2994, 2997, 3001,   86,
-     3002,   86, 2995, 3004,   86,   86,   86, 3009,   86, 3010,
-     3000,   86,   86,   86,   86, 3003, 3006, 3007, 3013,   86,
-       86, 3015,   86, 3005, 3011, 3014, 3008,   86,   86, 3018,
-     3021, 3012, 3019,   86, 3017,   86,   86,   86,   86, 3016,
-     3020, 3024,   86, 3023,   86,   86, 3022, 3027,   86, 3025,
-     3030,   86,   86,   86,   86,   86,   86, 3035,   86,   86,
-       86, 3353,   86,   86, 3026, 3028, 3029, 3031, 3041, 3034,
-     3032, 3038, 3039,   86, 3040,   86, 3037,   86, 3036, 3033,
-
-       86, 3044,   86, 3045,   86, 3043, 3046,   86,   86,   86,
-     3049, 3042,   86, 3051,   86,   86,   86, 3050,   86,   86,
-       86, 3047,   86, 3056, 3057,   86,   86,   86,   86,   86,
-       86, 3063,   86,   86, 3052, 3048, 3064,   86, 3065, 3062,
-     3053, 3054, 3055, 3060,   86,   86, 3059,   86, 3061,   86,
-     3069,   86, 3058, 3066, 3068, 3070,   86,   86,   86, 3073,
-       86, 3072, 3071,   86, 3067,   86, 3076,   86, 3075,   86,
-     3074,   86,   86,   86, 3077,   86,   86, 3080,   86,   86,
-       86, 3082,   86, 3078, 3083, 3081,   86,   86,   86,   86,
-       86, 3079,   86,   86, 3092, 3093, 3095, 3084, 3088, 3085,
-
-     3086, 3353,   86,   86, 3087, 3089, 3090,   86, 3091,   86,
-     3098,   86, 3094, 3097, 3096, 3102, 3099, 3100,   86, 3101,
-       86, 3103,   86,   86,   86, 3106,   86,   86, 3104, 3107,
-       86, 3108, 3109,   86,   86, 3110, 3111, 3114,   86, 3112,
-     3113,   86,   86, 3105,   86, 3118, 3115, 3117,   86,   86,
-       86,   86,   86, 3116, 3123,   86,   86, 3122,   86,   86,
-       86,   86,   86, 3119, 3126, 3125,   86, 3353, 3127,   86,
-     3120, 3121,   86, 3131,   86, 3130, 3128, 3132,   86, 3135,
-     3129, 3124, 3133,   86, 3134,   86, 3138, 3140,   86,   86,
-       86, 3139,   86,   86, 3136,   86,   86, 3137,   86, 3148,
-
-     3144, 3145, 3147,   86, 3142,   86,   86, 3150,   86, 3151,
-       86, 3143, 3149, 3141,   86,   86,   86, 3146, 3154,   86,
-     3153, 3155,   86, 3157,   86, 3156, 3158,   86,   86, 3152,
-     3159,   86, 3160,   86, 3161,   86, 3162,   86, 3163,   86,
-     3164,   86,   86, 3167,   86,   86,   86,   86,   86,   86,
-       86, 3166, 3172,   86, 3165, 3168,   86, 3169,   86, 3176,
-       86,   86, 3175, 3173, 3178,   86,   86, 3170, 3171, 3174,
-       86,   86, 3182, 3180,   86, 3177,   86, 3184, 3185, 3179,
-       86,   86,   86,   86,   86, 3187,   86,   86,   86,   86,
-       86,   86, 3181, 3191, 3183, 3186,   86, 3192,   86, 3190,
-
-     3193, 3188,   86, 3196, 3189, 3194,   86,   86,   86, 3197,
-     3199,   86, 3200,   86, 3202, 3195, 3201,   86,   86,   86,
-     3198,   86, 3205, 3204,   86,   86,   86, 3203,   86, 3209,
-       86, 3207,   86, 3212,   86, 3206, 3208,   86,   86,   86,
-       86, 3211,   86, 3213,   86,   86,   86, 3214,   86, 3219,
-     3221,   86, 3215, 3216, 3218,   86, 3220, 3224,   86,   86,
-     3223,   86, 3225, 3217, 3226, 3227,   86, 3222, 3228, 3229,
-       86, 3231,   86,   86, 3232, 3230, 3233,   86, 3234,   86,
-     3235,   86,   86,   86,   86, 3237,   86,   86, 3238, 3239,
-     3242,   86,   86,   86, 3246,   86,   86,   86, 3245, 3248,
-
-       86, 3236, 3241,   86, 3244, 3243, 3249,   86,   86, 3252,
-       86, 3240,   86,   86, 3255,   86,   86, 3247, 3250,   86,
-     3256,   86,   86, 3259, 3257, 3260,   86, 3251, 3253,   86,
-     3254,   86,   86,   86, 3265,   86, 3261,   86, 3264, 3262,
-     3258, 3266,   86,   86,   86,   86,   86,   86, 3270,   86,
-       86, 3263, 3272,   86,   86, 3277,   86,   86, 3267, 3269,
-     3279,   86, 3278, 3268,   86,   86, 3271, 3274, 3273, 3275,
-       86,   86, 3276, 3283,   86, 3285, 3284,   86, 3286,   86,
-       86,   86,   86, 3281, 3280, 3287,   86, 3288, 3291, 3282,
-       86, 3289, 3292,   86,   86, 3293, 3294,   86, 3290,   86,
-
-       86,   86,   86, 3295,   86, 3300,   86,   86, 3297,   86,
-     3303,   86, 3304,   86,   86,   86,   86,   86,   86, 3296,
-     3302, 3298, 3307, 3299, 3305, 3301,   86, 3306,   86, 3311,
-       86, 3310,   86, 3308,   86, 3309,   86, 3312, 3353, 3313,
-       86, 3315,   86, 3317,   86, 3318,   86,   86, 3322,   86,
-       86, 3319,   86, 3316, 3320, 3321, 3314, 3323,   86,   86,
-     3324, 3325,   86,   86,   86,   86, 3326,   86,   86, 3328,
-     3327,   86, 3329, 3331,   86,   86, 3333,   86,   86, 3337,
-     3334, 3338,   86, 3330, 3332,   86,   86, 3335,   86, 3341,
-     3342,   86,   86, 3344,   86,   86, 3336, 3345,   86, 3343,
-
-       86,   86, 3346,   86, 3339, 3340, 3347,   86, 3348, 3351,
-       86, 3352,   86, 3353, 3353, 3353, 3353, 3353, 3353, 3349,
-     3353, 3353, 3353, 3353, 3353, 3353, 3350,   47,   47,   47,
-       47,   47,   47,   47,   52,   52,   52,   52,   52,   52,
-       52,   57,   57,   57,   57,   57,   57,   57,   63,   63,
-       63,   63,   63,   63,   63,   68,   68,   68,   68,   68,
-       68,   68,   74,   74,   74,   74,   74,   74,   74,   80,
-       80,   80,   80,   80,   80,   80,   89,   89, 3353,   89,
-       89,   89,   89,  160,  160, 3353, 3353, 3353,  160,  160,
-      162,  162, 3353, 3353,  162, 3353,  162,  164, 3353, 3353,
-
-     3353, 3353, 3353,  164,  167,  167, 3353, 3353, 3353,  167,
-      167,  169, 3353, 3353, 3353, 3353, 3353,  169,  171,  171,
-     3353,  171,  171,  171,  171,  174, 3353, 3353, 3353, 3353,
-     3353,  174,  177,  177, 3353, 3353, 3353,  177,  177,   90,
-       90, 3353,   90,   90,   90,   90,   17, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353
+      457,  448,   86,  444,   86,  455,   86,   86,  170,  462,
+      458,  463,  459,  449,  464,   86,  450,  456,  469,  470,
+
+       86,  451,  452,  453,  454,  460,  467,   86,  461,  465,
+      466,  468,   86,   86,   86,   86,   86,   86,  478,   86,
+       86,   86,   86,  480,  476,  477,  479,   86,  481,  473,
+      471,   86,   86,  472,  474,  475,   86,  483,   86,  485,
+       86,  488,   86,  489,   86,  490,  482,   86,  484,   86,
+      506,   86,   86,  494,  491,  487,  493,  495,  486,   86,
+       86,   86,   86,   86,  492,  496,  498,   86,  499,   86,
+      501,  497,  170,  507,   86,  500,  508,   86,  505,   86,
+       86,   86,  522,  502,   86,  509,  503,  523,  504,   86,
+      510,   86,  511,  545,   86,   86,  525,   86,  512,  569,
+
+      528,  168,  513,   86,   86,  524,  526,  514,  527,  530,
+      515,   86,  516,  540,  517,  541,  529,   86,  539,   86,
+      542,   86,   86,   86,   86,   86,  548,  518,   86,  543,
+      519,  166,  520,   86,  521,   86,  544,  531,  532,  547,
+      550,  546,  553,   86,  549,  551,   86,  533,  534,  535,
+      536,  537,  554,  552,  538,   86,   86,   86,   86,   86,
+      556,  563,  555,  558,  561,   86,   86,   86,   86,  564,
+       86,   86,  560,  568,   86,   86,  559,   86,  557,   86,
+      562,   86,  566,   86,   86,  567,  565,   86,  571,  578,
+      570,  572,  573,  575,   86,  574,   86,  576,  577,   86,
+
+      582,  579,  580,   86,   86,  585,   86,  583,   86,   86,
+       86,  601,   86,   86,   86,   86,  165,   86,  603,  581,
+      591,  592,  584,  587,  602,  586,  588,  589,  590,   86,
+       86,  606,  593,  604,  594,   86,   86,   86,   86,  605,
+      595,   86,   86,   86,  608,  609,  610,  611,  596,  597,
+       86,   86,  598,  599,   86,  613,  600,  607,  615,   86,
+       86,   86,   86,  618,  614,  616,  619,   86,   86,   86,
+      612,  620,   86,   86,  617,   86,   86,  625,  623,   86,
+      624,   86,   86,  621,   86,  626,   86,   86,   86,  631,
+      622,  627,  632,   86,   86,   86,  630,  633,   86,  635,
+
+      629,  628,   86,   86,  638,   86,  634,  636,   86,  637,
+       86,  640,   86,   86,   86,   86,  642,  639,   86,  645,
+       86,  643,   86,   86,   86,   86,  641,  653,   86,  656,
+      647,   86,   86,   86,  644,  646,   86,  654,  648,  652,
+      649,  650,  651,  655,  658,  657,  661,  659,   86,   86,
+       86,  660,  663,   86,   86,  666,   86,  665,   86,   86,
+       86,   86,   86,   86,  669,  662,   86,  672,   86,   86,
+      668,  673,   86,  664,   86,   86,   86,  675,   86,  667,
+       86,   86,  670,  671,  674,  690,   86,  677,  678,   86,
+      676,   86,  679,  689,   86,   86,  687,  680,  694,  681,
+
+      692,  688,  693,   86,   86,  682,   86,  683,  691,  695,
+      684,  685,   86,  696,   86,   86,   86,  686,  697,  698,
+      702,  701,  699,   86,   86,  700,   86,  706,   86,   86,
+      704,  703,  705,   86,  709,   86,  711,   86,   86,   86,
+       86,   86,  715,   86,   86,   86,  707,   86,  708,  718,
+      713,   86,  712,   86,  710,  714,  719,   86,  716,  722,
+       86,  724,  726,  170,  720,  717,  721,  725,   86,  723,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+      733,  735,  727,  746,   86,   86,  728,  730,   86,  731,
+      734,  729,  737,  732,  738,   86,  739,  740,  741,   86,
+
+      742,   86,   86,   86,   86,   86,  743,   86,  747,   86,
+      163,   86,   86,  744,  752,  765,  745,   86,  748,  753,
+       86,  755,   86,  751,  754,  749,  756,   86,  750,  757,
+      758,   86,  759,   86,  760,   86,  761,   86,  763,   86,
+       86,  762,   86,   86,  766,   86,   86,   86,   86,  764,
+      769,  770,   86,  768,   86,  774,  773,   86,   86,   86,
+       86,   86,  767,  776,   86,  778,   86,  780,   86,   86,
+       86,  771,   86,  772,   86,  783,  777,  775,  779,   86,
+      787,   86,   86,  781,   86,   86,   86,  788,  790,   86,
+      782,  784,   86,  791,  786,  785,  792,  793,  789,  794,
+
+       86,  795,   86,   86,   86,   86,  802,  796,  797,  798,
+      799,   86,   86,   86,   86,   86,  800,  804,  801,  805,
+      803,   86,   86,   86,   86,  808,  807,   86,  809,  810,
+       86,   86,   86,   86,  812,   86,  814,  816,   86,   86,
+       86,  806,  811,  813,  817,   86,   86,  823,   86,  161,
+       86,  825,  815,   86,  819,  821,  820,  822,  818,   86,
+      826,  827,   86,   86,   86,  824,   86,  828,  830,   86,
+       86,  829,  834,  836,  832,   86,  831,   86,   86,   86,
+      835,   86,   86,   86,  837,  840,   86,  839,   86,  833,
+      841,   86,  847,  844,   86,   86,  842,   86,   86,  843,
+
+       86,   86,  838,   86,  849,  850,  854,  845,  846,   86,
+      852,   86,   86,  848,  856,   86,  862,  851,  853,   86,
+       86,  855,   86,  860,  857,   86,  863,  858,  861,   86,
+       86,   86,  864,  866,   86,   86,   86,  859,  865,   86,
+      872,   86,   86,  867,   86,  873,   86,   86,   86,   86,
+       86,  874,  868,  869,  881,  870,  879,   86,   86,  871,
+       86,   86,  875,  876,   86,   86,   86,  877,   86,  878,
+       86,   86,  880,   86,   86,  883,  884,  888,  882,   86,
+       86,   86,   86,   86,  885,  896,  889,  886,  895,  887,
+      890,   86,  897,   86,   86,   86,  899,  891,  892,  893,
+
+      894,   86,   86,   86,   86,  898,  901,  903,  902,   86,
+       86,   86,  900,   86,   86,   86,  908,  907,   86,  904,
+      909,   86,  906,  905,   86,  914,  911,   86,   86,  912,
+       86,   86,  170,  913,  919,   86,  915,  920,  910,  917,
+       86,   86,  916,  918,  921,   86,   86,   86,   86,  922,
+      925,   86,  928,   86,   86,  929,  924,  931,   86,   86,
+      923,   86,  926,  930,  932,   86,   86,  935,   86,   86,
+      933,   86,  927,   86,   86,  937,  941,   86,   86,   86,
+      938,   86,   86,   86,  934,  942,  936,   86,  943,   86,
+       86,   86,  940,   86,  939,   86,  944,  957,   86,  956,
+
+       86,  958,  954,  946,  945,   86,  955,  947,   86,  959,
+      948,   86,   86,  967,  949,  961,  965,  950,   86,  962,
+       86,  963,   86,   86,  951,  952,  968,  953,  960,   86,
+       86,   86,   86,  964,   86,  977,   86,  966,   86,  969,
+      970,   86,  971,   86,   86,  972,  984,  980,  982,  976,
+      973,   86,  978,   86,  979,   86,  974,  975,  981,   86,
+      986,  990,   86,   86,  983,  989,  991,   86,  987,   86,
+      985,   86,  993,   86,   86, 1001,  992,   86,  994,  995,
+       86,  996,  997,   86,  988,   86,  998, 1000,   86,   86,
+      999,   86,   86,   86,   86,   86, 1004,   86, 1008,   86,
+
+       86, 1002, 1007,   86,   86, 1011,   86,   86, 1017,   86,
+     1003, 1013, 1015, 1005, 1006, 1009,   86, 1010,   86,   86,
+     1018, 1016,   86,   86, 1012, 1019,   86, 1020, 1021, 1014,
+     1023, 1028,   86, 1025,   86,   86,   86, 1024, 1022,   86,
+       86, 1027,   86, 1026, 1029,   86, 1030,   86,   86,   86,
+     1031,   86,   86,   86, 1033,   86, 1038,   86, 1034,   86,
+     1041,   86,   86,   86,   86,   86, 1032, 1042, 1039, 1036,
+     1035, 1040,   86,   86, 1037,   86,   86, 1047,   86,   86,
+       86, 1043, 1049,   86, 1044, 1045,   86, 1048, 1046,   86,
+     1052, 1050, 1053, 1055, 1051,   86, 1057,   86, 1056,   86,
+
+       86,   86, 1054,   86,   86,   86,   86,   86, 1063, 1065,
+     1060,   86, 1058, 1066,   86,   86, 1064,   86,   86, 1059,
+     1068,   86, 1062,   86,   86,   86, 1070, 1061,   86, 1079,
+       86,   86, 1067, 1074, 1076,   86,   86,   86, 1069,   86,
+     1072, 1071,   86, 1073,   86, 1080, 1077,   86, 1075, 1081,
+     1078,   86, 1085, 1084,   86,   86, 1083,   86, 1082, 1087,
+     1088,   86,   86,   86,   86, 1086,   86,   86,   86, 1098,
+       86, 1091, 1093, 1099, 1089,   86, 1101, 1090,   86,   86,
+       86,   86,   86, 1092,   86, 1104, 1094, 1096, 1106, 1095,
+     1097,   86, 1100, 1105, 1102,   86,   86,   86,   86,   86,
+
+     1113, 1103, 1110,   86, 1112, 1114,   86,   86, 1108,   86,
+     1115,   86,   86,   86, 1107, 1118, 1109, 1120,   86, 1111,
+       86,   86,   86,   86,   86, 1117,   86, 1116, 1122, 1123,
+     1126,   86, 1130, 1119,   86, 1127,  170, 1128, 1121,   86,
+       86,   86, 1124, 1129, 1125, 1133, 1131,   86,   86,   86,
+       86,   86,   86, 1146, 1132,   86, 1149,   86,   86, 1147,
+     1134,   86, 1136, 1137,   86, 1151,   86, 1175,   86, 1138,
+       86, 1135, 1139,   86,   86, 1154, 1140,   86, 1141, 1148,
+     1156, 1152, 1142, 1150, 1143, 1157,   86,   86, 1153, 1144,
+       86, 1155,   86,   86, 1145,   86, 1158, 1160,   86,   86,
+
+     1163,   86,   86, 1166, 1159,   86,   86, 1162,   86, 1161,
+     1164, 1165, 1171,   86, 1173, 1167, 1174, 1170, 1172, 1169,
+       86, 1176,   86, 1168, 1177,   86,   86,   86,   86,   86,
+       86,   86,   86,   86, 1189,   86, 1192,   86,   86,   86,
+     1188, 1194, 1193,   86, 1191,   86, 1179, 1178,   86, 1180,
+       86, 1181, 1190,   86, 1200, 1195, 1182, 1196, 1183,   86,
+       86, 1199,   86,   86, 1184,   86,   86, 1197, 1201, 1185,
+     1186, 1202, 1198,   86, 1207,   86, 1187,   86,   86, 1210,
+     1203, 1204, 1208,   86, 1205,   86, 1211,   86,   86,   86,
+     1215, 1206,   86, 1213,   86,   86,   86, 1209,   86, 1216,
+
+       86,   86, 1214, 1221, 1218,   86, 1212, 1219,   86,   86,
+     1222, 1217,   86, 1224,   86,   86, 1220,   86,   86,   86,
+       86,   86,   86,   86, 1223, 1231,   86, 1229, 1226, 1228,
+     1230,   86, 1225, 1233,   86, 1227, 1237, 1232, 1234,   86,
+     1235,   86,   86, 1236,   86,   86,   86,   86,   86,  178,
+     1242, 1243, 1244, 1238,   86, 1239,   86, 1245, 1247, 1241,
+     1240,   86, 1246, 1248,   86,   86,   86, 1252,   86,   86,
+       86, 1249, 1253,   86,   86,   86, 1254, 1256, 1250, 1255,
+       86,   86, 1251, 1257,   86, 1263, 1259,   86, 1258, 1265,
+       86,   86,   86,   86, 1261,   86,   86, 1267, 1260, 1262,
+
+       86,   86,   86, 1269,   86, 1266, 1271, 1264,   86, 1272,
+     1268,   86,   86,   86, 1270,   86, 1275, 1274, 1273, 1278,
+     1276,   86,   86, 1281, 1277, 1282,   86,   86, 1280,   86,
+       86,   86,   86, 1286, 1285,   86, 1283, 1279,   86,   86,
+       86,   86,   86, 1290, 1292, 1293, 1296, 1294, 1284,   86,
+       86,   86,   86, 1287, 1291,   86,   86, 1288, 1298, 1289,
+     1295, 1297,   86,   86,   86, 1302,   86, 1299,   86, 1301,
+       86,   86,   86, 1303, 1304,   86,   86,   86,   86, 1305,
+     1309, 1300,   86,   86, 1307, 1306, 1310, 1312,   86, 1311,
+       86, 1308,   86, 1316, 1317,   86,   86, 1320,   86,   86,
+
+       86, 1319, 1314,   86,   86,   86, 1313,   86, 1325,   86,
+     1318, 1315,   86,   86,   86,   86,   86, 1323, 1322, 1331,
+       86,   86, 1321, 1327,  170, 1324,   86, 1326,   86, 1332,
+       86, 1333, 1328, 1334,   86, 1330,   86,   86,   86,   86,
+     1329, 1339, 1341,   86, 1335, 1337, 1343, 1340, 1336, 1338,
+     1344,   86,   86,   86,   86,   86,   86, 1347, 1346, 1342,
+       86,   86,   86,   86,   86, 1348,   86, 1345, 1349, 1351,
+       86,   86,   86, 1354,   86, 1350,   86, 1352, 1357,   86,
+       86,   86, 1353,   86,  176, 1355, 1358, 1361, 1363,   86,
+     1356, 1360, 1359, 1367,   86, 1368,   86, 1364,   86, 1365,
+
+     1362, 1369, 1366, 1370,   86, 1371,   86,   86,   86,   86,
+     1373,   86,   86,   86,   86,  175,   86, 1377, 1376,   86,
+     1372, 1380,   86,   86, 1384,   86, 1379, 1374,   86, 1375,
+       86,   86, 1378, 1381, 1382, 1385, 1386,   86,   86,   86,
+       86, 1383, 1388, 1389,   86,   86,   86, 1390, 1387,   86,
+       86,   86,   86,   86,   86, 1391, 1396,   86, 1394, 1392,
+       86,   86, 1403, 1397, 1393, 1395, 1401,   86,   86,   86,
+       86, 1398, 1400,   86, 1399,   86, 1402, 1404, 1406,   86,
+       86,   86, 1413,   86, 1415, 1407,   86, 1405,   86,   86,
+       86, 1409, 1408,   86, 1410,   86, 1412, 1418,   86,   86,
+
+       86, 1416,   86, 1414, 1421, 1411,   86, 1417,   86,   86,
+     1501, 1423, 1422,   86, 1420, 1419, 1424,   86,   86, 1428,
+     1426, 1425, 1427,   86, 1429,   86, 1436, 1438, 1430,   86,
+     1439, 1431, 1432,   86, 1437,   86, 1433, 1442,   86,   86,
+     1440,   86, 1434,   86, 1443,   86, 1435, 1441,   86, 1445,
+     1444,   86, 1447,   86,   86,   86, 1448, 1452, 1449,   86,
+       86,   86, 1446,   86,   86,   86, 1455,   86, 1453, 1458,
+     1459,   86, 1460, 1451, 1450,   86,   86,   86, 1456,   86,
+     1454, 1461,   86, 1457,   86, 1468,   86, 1467, 1462,   86,
+     1469, 1470, 1471, 1463,   86, 1464,   86, 1465,   86, 1466,
+
+       86, 1474, 1473,   86, 1477,   86, 1480, 1472,   86, 1478,
+       86,   86, 1476, 1481, 1479,   86,   86,   86, 1475,   86,
+     1487,   86, 1488,   86, 1483, 1482,   86,   86,   86,   86,
+       86, 1489,   86, 1486, 1491, 1484, 1485,   86,   86, 1493,
+       86, 1490, 1492,   86, 1494, 1497, 1498,   86, 1500,   86,
+     1495,   86,   86,   86, 1502,   86,   86, 1503, 1499, 1506,
+       86, 1508,   86, 1496, 1505,   86, 1509,   86,   86,   86,
+     1513,   86, 1504, 1510,   86,   86, 1507,   86,   86, 1518,
+     1516,   86,   86,   86,   86,   86, 1519,   86, 1511, 1521,
+     1512, 1520, 1515,   86, 1514,   86, 1523,   86, 1517, 1524,
+
+     1525, 1522,   86,   86,   86,   86,   86, 1527, 1529, 1530,
+     1531, 1526, 1528,   86, 1532,   86,   86,   86,   86,   86,
+     1533, 1538, 1539, 1535,   86, 1536,   86,   86,   86, 1540,
+     1542, 1541, 1537,   86, 1534,   86,   86,   86, 1546,   86,
+       86,   86, 1543,   86,  170,   86, 1548,   86, 1545,   86,
+     1554, 1555,   86,   86, 1544, 1550,   86,   86, 1556, 1551,
+     1547, 1549, 1557,   86,   86,   86,   86, 1552,   86,   86,
+       86, 1565, 1553, 1560,   86,   86,   86, 1558, 1562, 1563,
+       86, 1569,   86, 1559, 1561, 1570,   86, 1564,   86,   86,
+     1574,   86,   86, 1572, 1566, 1575,   86,   86, 1568,   86,
+
+     1567, 1577,   86,   86,   86, 1571,   86, 1578, 1573, 1576,
+       86, 1579, 1586, 1585,   86,   86,   86, 1580, 1581, 1583,
+     1587, 1582, 1584, 1588,   86, 1591, 1590,   86, 1589,   86,
+     1592,   86,   86,   86,   86, 1593,   86,   86, 1596, 1597,
+       86,   86,   86,  170,   86, 1600,   86,   86, 1605,   86,
+     1595,   86,   86, 1594, 1598, 1606, 1602, 1599,   86, 1609,
+       86, 1601, 1603,   86, 1604,   86,   86, 1607,   86,   86,
+     1610, 1608,   86,   86,   86,   86,   86, 1612, 1616, 1611,
+       86, 1613, 1617, 1614,   86, 1618,   86, 1622, 1615,   86,
+     1619, 1623,   86, 1621, 1627, 1620,   86, 1626, 1624, 1628,
+
+       86,   86,   86, 1630,   86,   86, 1631,   86,   86,   86,
+     1632,   86, 1625, 1636, 1637, 1629, 1635, 1638,   86,   86,
+       86,   86, 1639,   86, 1633,   86, 1640, 1641,   86,   86,
+     1634,   86,   86, 1642,   86,   86, 1644,   86,   86,   86,
+     1643,   86, 1649,   86, 1645, 1648,   86, 1651, 1646,   86,
+     1647, 1652,   86, 1655,   86, 1657,   86, 1650, 1656,   86,
+     1658,   86, 1654, 1653,   86, 1660,   86,   86,   86,   86,
+       86, 1664, 1659, 1661, 1668, 1662, 1663,   86,   86,   86,
+       86,   86, 1669,   86, 1672,   86, 1675, 1665, 1667, 1666,
+       86, 1674,   86,   86,   86,   86,   86,   86, 1670,   86,
+
+     1673,   86, 1676,   86, 1683, 1671,   86,   86,   86, 1684,
+     1680, 1687, 1677, 1678, 1679,   86, 1682,   86, 1681, 1688,
+       86, 1689,   86,   86, 1693,   86, 1685, 1686, 1690, 1691,
+     1692,   86,   86,   86, 1695,   86,   86,   86, 1696,   86,
+       86, 1699, 1703,   86, 1694, 1704, 1705,   86, 1700,   86,
+       86, 1697,   86, 1698, 1708, 1702,   86, 1701,   86,   86,
+     1709,   86, 1706, 1707,   86, 1710,   86,   86, 1715, 1716,
+       86,   86,  168, 1713,   86,   86,   86, 1712, 1711,   86,
+     1719,   86, 1720, 1721,   86, 1717, 1714, 1723,   86,   86,
+       86,   86, 1718, 1724, 1725,   86, 1722,   86,   86, 1730,
+
+     1726, 1728,   86,   86,   86, 1733,   86, 1727,   86,   86,
+       86, 1731,   86,   86, 1739, 1737,   86,   86, 1729,   86,
+       86, 1734,   86, 1732,   86, 1740, 1738,   86, 1736, 1735,
+       86, 1745,   86,   86, 1742, 1741,   86,   86, 1746, 1750,
+       86, 1748, 1744,   86,   86, 1743,   86, 1751, 1749, 1754,
+     1747,   86, 1753,   86,   86,   86,   86, 1752, 1757, 1761,
+     1759, 1760,   86, 1755, 1756, 1758,   86,   86,  170,   86,
+       86,   86, 1763,   86,   86,   86, 1771,   86,   86, 1762,
+       86,   86, 1772, 1777, 1764, 1766,   86, 1765, 1769, 1767,
+     1768, 1775,   86,   86,   86, 1776, 1779,   86, 1770, 1781,
+
+     1773, 1774, 1780,   86, 1783,   86,   86, 1785,   86,   86,
+       86,   86,   86, 1778,   86,   86, 1790, 1787,   86, 1788,
+     1784,   86, 1791, 1782,   86,   86,   86,   86, 1786, 1795,
+       86, 1796, 1792,   86,   86,   86, 1789, 1803,   86,  166,
+     1794, 1800, 1793,   86, 1801, 1797, 1798,   86,   86,   86,
+       86, 1805, 1804, 1799,   86, 1808, 1802, 1810, 1807, 1812,
+     1809, 1811,   86, 1813, 1817,   86,   86, 1806,   86,   86,
+       86, 1814,   86, 1815,   86, 1816,   86,   86,   86,   86,
+       86, 1818, 1824, 1823,   86, 1825, 1820, 1827,   86, 1826,
+     1819,   86,   86,   86,   86,   86,   86, 1821,   86, 1822,
+
+     1829, 1830,   86, 1831,   86,   86,   86,   86,   86,   86,
+       86,   86, 1832,   86,   86, 1828, 1833, 1841,   86,   86,
+     1836, 1837, 1838, 1834,   86, 1835, 1842, 1839,   86,   86,
+     1843, 1845,   86, 1848, 1849, 1840, 1844,   86, 1851,   86,
+     1846,   86,   86, 1854,   86, 1847,   86,   86,   86,   86,
+     1858,   86, 1856, 1850,   86, 1852,   86,   86,   86,   86,
+     1857,   86,   86, 1853,   86, 1860, 1855, 1863, 1865, 1859,
+       86,   86,  165, 1866, 1864, 1862, 1867,   86, 1868,   86,
+     1861,   86, 1872, 1873,   86, 1869, 1874,   86,   86, 1875,
+     1870, 1877, 1878,   86,   86,   86, 1871,   86,   86, 1876,
+
+       86, 1882, 1881,   86,   86, 1883,   86, 1879,   86,   86,
+       86, 1891, 1892,   86, 1880, 1886,   86,   86, 1888, 1890,
+     1885, 1889, 1884,   86,   86,   86,   86, 1887, 1898,   86,
+       86,   86,   86, 1899,   86, 1900, 1893, 1894,   86, 1896,
+       86, 1895, 1897, 1901,   86, 1904,   86, 1906,   86, 1908,
+     1903, 1907,   86,   86, 1902,   86, 1905,   86, 1912,   86,
+     1916, 1910,   86, 1909, 1911, 1917,   86,   86,   86,   86,
+       86, 1924,   86, 1913, 1921, 1922, 1918, 1915, 1914, 1925,
+       86,   86, 1919,   86,   86,   86, 1928,   86, 1923, 1926,
+     1920,   86,   86, 1929, 1927, 1932,   86,   86, 1936,   86,
+
+     1934,   86,   86, 1930,   86, 1931, 1935, 1937,   86, 1933,
+       86,   86,   86,   86,   86,   86, 1941,   86, 1940,   86,
+     1950, 1938, 1942, 1944,   86, 1943,   86, 1939, 1945, 1948,
+       86, 1946, 1951, 1947, 1953,   86,   86, 1952,   86,   86,
+       86, 1957,   86, 1959,   86,   86,   86,   86,   86,   86,
+       86, 1949, 1963,   86, 1965,   86, 1954, 1955, 1958, 1956,
+     1966,   86, 1961,   86,   86, 1962, 1960,   86, 1964, 1968,
+       86,   86, 1969,   86,   86,  170, 1974,   86,   86, 1970,
+       86, 1967, 1972, 1973, 1977,   86, 1971, 1975,   86, 1981,
+       86,   86, 1976,   86,   86,   86,   86, 1978,   86, 1980,
+
+     1979, 1983,   86, 1988,   86, 1982,   86, 1984, 1985,   86,
+       86, 1995, 1986,   86, 1989, 2000, 1991,   86, 1987, 1992,
+       86,   86, 1990,   86, 1993, 1994,   86, 1997, 1998,   86,
+       86,   86, 1996,   86, 2001,   86,   86, 2002,   86,   86,
+       86,   86, 1999,   86, 2006, 2007,   86,   86,   86,   86,
+     2008,   86, 2011,   86, 2004, 2009, 2005, 2003, 2012,   86,
+       86, 2010, 2019,   86, 2017, 2015, 2018, 2020, 2014,   86,
+       86, 2013, 2016,   86, 2021,   86,   86,   86,   86, 2026,
+       86, 2029, 2030,   86, 2031,   86,   86,   86, 2022, 2023,
+       86, 2024, 2027,   86, 2028,   86, 2025, 2033,   86,   86,
+
+     2034, 2037,   86,   86, 2039,   86, 2032, 2038, 2035,   86,
+       86, 2036, 2040, 2041, 2043, 2048,   86,   86, 2045,   86,
+       86, 2044,   86, 2042,   86, 2046, 2047,   86,   86, 2049,
+     2050,   86, 2051,   86,   86,   86, 2055,   86, 2053, 2054,
+     2057,   86, 2056,   86,   86,   86,   86,   86,  163, 2052,
+     2065,   86, 2067, 2058, 2059, 2060,   86, 2068,   86,   86,
+     2061,   86, 2063, 2062,   86, 2064, 2070, 2066,   86, 2074,
+     2071,   86, 2072, 2069,   86,   86,   86, 2078,   86, 2073,
+     2075,   86,   86, 2080,   86,   86,   86,   86, 2083, 2084,
+       86, 2086,   86,   86, 2076,   86, 2091, 2077,   86,   86,
+
+       86,   86,   86,   86, 2081, 2085,   86, 2079, 2082, 2088,
+     2089, 2093,   86,   86, 2092,   86, 2090,   86, 2087,   86,
+     2094, 2095, 2096,   86, 2099,   86, 2097, 2103,   86, 2098,
+     2102,   86,   86,   86, 2106, 2101, 2109,   86, 2105, 2100,
+       86,   86,   86, 2107, 2110,   86, 2112,   86, 2104,   86,
+       86, 2108, 2111,   86,   86,   86,   86, 2116,   86, 2119,
+     2120, 2121, 2115,   86,   86,   86,   86,   86,   86, 2113,
+       86,   86, 2114, 2117, 2124,   86, 2129,   86,   86, 2123,
+     2128,   86, 2118, 2122,   86, 2126,   86, 2130, 2133,   86,
+     2125,   86, 2134, 2127,   86, 2135, 2131, 2132, 2137,   86,
+
+       86,   86,   86, 2136, 2138, 2141,   86, 2142,   86,   86,
+       86,   86, 2139, 2148, 2145,   86, 2143, 2140,   86,   86,
+       86,   86,   86, 2151, 2153,   86, 2155, 2144,   86, 2154,
+     2146, 2147,   86, 2149, 2152, 2150,   86,   86, 2160,   86,
+     2162, 2156, 2161,   86, 2164, 2163,   86, 2157, 2165,   86,
+       86,   86, 2158,   86,   86, 2169, 2167, 2159,   86,   86,
+       86,   86,   86, 2171,   86, 2168,   86, 2173, 2175,   86,
+     2170, 2177, 2172,   86,   86, 2166,  170,   86, 2178,   86,
+       86, 2181,   86,   86,   86,   86, 2176, 2174, 2179, 2185,
+       86, 2187, 2182, 2180, 2183,   86, 2188,   86, 2186, 2189,
+
+       86, 2191, 2184,   86,   86, 2190,   86,   86,   86, 2192,
+     2194, 2193,   86,   86,   86, 2197,   86, 2195, 2196,   86,
+     2199,   86,   86, 2203,   86,   86, 2198, 2202, 2200,   86,
+       86,   86, 2207, 2201, 2204, 2205, 2206, 2208,   86,   86,
+       86,   86,   86,   86, 2215, 2213,   86,   86,   86, 2210,
+       86, 2214,   86,   86,   86, 2220,   86, 2217,   86, 2209,
+     2211,   86, 2212,   86,   86, 2216, 2221, 2219,   86, 2225,
+     2218,   86, 2223, 2226, 2222,   86,   86,   86, 2224,   86,
+     2229,   86, 2228, 2227, 2231,   86,   86,   86, 2237, 2230,
+     2232,   86,   86, 2233,   86, 2234, 2235,   86, 2239,   86,
+
+     2236, 2240, 2242,   86,   86, 2244,   86,   86, 2238,   86,
+     2241, 2248, 2243,   86, 2245, 2247,   86,   86,   86,   86,
+       86,   86, 2253, 2250,   86,   86,   86,   86,   86,   86,
+     2246,   86, 2249, 2254,   86,   86,   86, 2262, 2256, 2257,
+     2252, 2251,   86, 2258,   86,   86, 2255, 2259,   86, 2261,
+     2263, 2267,   86,   86,   86, 2260, 2264, 2266,   86, 2271,
+       86, 2270, 2268,   86,   86, 2265,   86,   86, 2269, 2273,
+       86, 2276, 2274, 2272, 2277,   86,   86,   86, 2275,   86,
+       86, 2279, 2282,   86, 2278, 2280, 2284,   86,   86, 2281,
+     2285,   86,   86, 2287,   86,   86, 2289, 2286, 2283,   86,
+
+     2291, 2290,   86,   86,   86, 2295,   86, 2292,   86,   86,
+     2299,   86,   86, 2288, 2296, 2300,   86,   86,   86, 2297,
+     2298, 2293, 2304,   86, 2294, 2301,   86, 2305,   86,   86,
+     2308, 2302, 2303,   86,   86,   86,   86, 2310, 2309,   86,
+     2314,   86,   86, 2306,   86, 2316,   86, 2312,   86, 2307,
+       86, 2317, 2311,   86, 2315, 2313,   86, 2318, 2319,   86,
+       86, 2323,   86,   86, 2320, 2321, 2325,   86, 2322,   86,
+       86, 2326,   86,   86, 2327, 2329, 2328,   86, 2331,   86,
+       86, 2324, 2330,   86, 2332, 2336,   86,   86,   86, 2334,
+     2333,   86, 2335,   86,   86,   86,   86,   86, 2337,   86,
+
+     2343,   86,   86,   86, 2339, 2338, 2347, 2341, 2344, 2342,
+       86, 2345, 2349,   86,   86, 2348, 2340, 2346,   86, 2350,
+     2352,   86,   86, 2358,   86, 2353,   86,   86, 2360,   86,
+       86,   86, 2351, 2354,   86, 2357, 2359,   86, 2363, 2355,
+       86,   86, 2364, 2367,  170,   86, 2369, 2356, 2361,   86,
+     2362, 2370,   86, 2365,   86, 2371, 2372, 2373,   86,   86,
+     2366,   86,   86, 2376,   86, 2375, 2368, 2374,   86, 2377,
+       86, 2381,   86,   86, 2382,   86, 2384,   86, 2385, 2380,
+       86, 2387, 2386, 2378,   86, 2388,   86, 2383,   86, 2390,
+       86,   86,   86, 2389, 2379,   86, 2391,   86,   86,   86,
+
+       86, 2393,   86,   86, 2396,   86,   86,   86, 2399,   86,
+     2392, 2394,   86,   86, 2403, 2398, 2405,   86,   86,   86,
+       86, 2401, 2406, 2395, 2400, 2397,   86, 2402, 2407,   86,
+       86, 2408,   86,   86, 2404,   86,   86, 2413, 2410, 2416,
+       86, 2411,   86,   86, 2417, 2409, 2414,   86,   86, 2412,
+       86,   86,   86, 2415,   86,   86,   86,   86, 2426,   86,
+       86, 2418, 2419, 2424,   86, 2430, 2433,   86, 2428, 2422,
+     2420, 2427, 2421, 2423, 2429, 2425,   86, 2432, 2431,   86,
+       86,   86,   86, 2435, 2434,   86,   86, 2439, 2440,   86,
+       86,   86, 2441,  161, 2436,   86, 2437,   86, 2438, 2442,
+
+       86,   86, 2445,   86, 2448,   86, 2443,   86, 2444, 2449,
+       86,   86, 2446,   86,   86, 2447, 2450, 2452, 2451, 2455,
+       86, 2456,   86,   86, 2458,   86, 2454, 2453,   86, 2460,
+       86,   86,   86, 2463,   86,   86, 2462, 2464,   86,   86,
+       86,   86, 2457,   86,   86,   86, 2459, 2461, 2466, 2465,
+     2470, 2471,   86, 2473,   86, 2468,   86, 2467,   86,   86,
+     2477,   86, 2469, 2472, 2475,   86, 2479,   86, 2476,   86,
+       86,   86, 2482,   86, 2474, 2478, 2485,   86,   86,   86,
+     2480,   86,   86,   86, 2481,   86, 2483, 2489, 2490,   86,
+     2492,   86, 2484,   86, 2495,   86, 2488,   86, 2486,   86,
+
+       86, 2491, 2487,   86,   86,   86, 2493, 2497, 2494,   86,
+     2502,   86,   86, 2498, 2504,   86,   86, 2496, 2505, 2508,
+     2503, 2499, 2500,   86,   86,   86,   86,   86, 2509, 2510,
+       86, 2501, 2511, 2506,   86, 2507,   86,   86,   86, 2513,
+       86, 2515, 2517, 2518, 2520,   86, 2521,   86, 2512,   86,
+       86, 2514,   86, 2524, 2525, 2519,   86,   86,   86,   86,
+     2516, 2526, 2523,   86,   86,   86, 2522, 2529,   86,   86,
+       86, 2528, 2530, 2535, 2531, 2536,   86, 2532, 2533,   86,
+     2537,   86, 2527,   86, 2534,   86,   86,   86, 2541,   86,
+     2542,   86, 2543,   86, 2546, 2540,   86,  170, 2545,   86,
+
+     2544,   86, 2547, 2538,   86, 2539, 2552,   86,   86,   86,
+       86,   86,   86,   86,   86, 2563,   86, 2550, 2554, 2548,
+     2551, 2549, 2555, 2553, 2558,   86,   86, 2556, 2557, 2559,
+     2560,   86,   86, 2564, 2561, 2565,   86,   86,   86,   86,
+     2566, 2568, 2569, 2562, 2567,   86,   86,   86,   86, 2571,
+       86,   86, 2572,   86, 2570,   86, 2573, 2578, 2574,   86,
+     2577,   86,   86,   86,   86, 2575,   86, 2580, 2581, 2582,
+     2583,   86, 2576,   86,   86, 2579,   86,   86, 2584,   86,
+       86, 2589,   86, 2585, 2588, 2586,   86,   86,   86,   86,
+       86, 2591, 2590,   86, 2595,   86, 2598, 2587,   86,   86,
+
+     2597,   86,   86, 2594, 2599,   86, 2600, 2592, 2593,   86,
+       86,   86,   86, 2596,   86, 2604,   86, 2601, 2606,   86,
+     2602, 2609,   86, 2610, 2607,   86,   86,   86, 2603,   86,
+     2608, 2613, 2605, 2611,   86,   86, 2612,   86, 2615,   86,
+     2614,   86, 2616,   86, 2618, 2619, 2620, 2621, 2622,   86,
+       86,   86,   86, 2617, 2624,   86,   86,   86,   86, 2623,
+       86,   86,   86, 2628, 2633,   86,   86, 2631,   86, 2625,
+     2626, 2632, 2635, 2627, 2634,   86,   86, 2636,   86,   86,
+       86,   86, 2630,   86, 2637, 2639, 2629,   86, 2644,   86,
+     2641,   86, 2646,   86,   86, 2642,   86,   86,   86,   86,
+
+     2640, 2638, 2645, 2643, 2649,   86,   86,   86, 2653, 2650,
+       86, 2648, 2647, 2654,   86, 2655, 2651, 2652,   86,   86,
+       86,   86,   86, 2659,   86, 2658,   86,   86, 2657,   86,
+       86,   86, 2663, 2703, 2662,   86, 2656,   86, 2660,   86,
+     2661,   86, 2666, 2667,   86, 2668,   86, 2669,   86, 2664,
+     2665, 2670,   86, 2671,   86,   86, 2674, 2672,   86, 2673,
+       86, 2675,   86,   86,   86,   86,   86,   86, 2682,   86,
+     2676, 2684,   86, 2685,   86, 2678,   86,   86,   86,   86,
+       86,   86, 2677, 2681, 2679, 2683, 2680, 2686, 2688, 2687,
+     2689,   86,   86, 2694,   86,   86, 2691, 2696,   86, 2690,
+
+     2692,   86,   86,   86, 2695,   86,   86,  170,   86,   86,
+     2705,   86, 2693,   86,   86,   86, 2699,   86,   86, 2704,
+     2701,   86, 2698, 2706, 2712,   86, 2707, 2697, 2708, 2700,
+     2702,   86,   86, 2709, 2729,   86,   86, 2714,   86, 2710,
+     2715, 2711, 2716,   86,   86, 2713, 2717,   86,   86, 2718,
+       86, 2719,   86, 2720, 2721, 2722,   86, 2723,   86,   86,
+       86,   86,   86,   86, 2731,   86,   86,   86,   86,   86,
+     2735, 2724, 2736,   86,   86, 2740,   86, 2726, 2725, 2742,
+       86, 2728, 2727, 2730, 2733, 2732, 2734,   86, 2737, 2738,
+       86,   86,   86,   86,   86,   86, 2739,   86,   86, 2741,
+
+     2745,   86,   86, 3483,   86, 2752,   86, 2753,   86, 2743,
+     2744, 2751, 2746, 2747, 2754,   86, 2748, 2749,   86, 2757,
+       86, 2750, 2758,   86, 2756, 2759,   86,   86,   86,   86,
+       86,   86,   86, 2755,   86, 2764,   86,   86,   86, 2768,
+     2770, 2767, 2761, 2763, 2760, 2769,   86, 2762, 2771,   86,
+       86,   86, 2765,   86, 2766,   86,   86,   86,   86,   86,
+     2773,   86, 2777, 2778,   86,   86,   86, 2775, 2782, 2772,
+     2783,   86, 2774,   86, 2786,   86, 2776,   86,   86, 2779,
+     2780, 2784,   86,   86, 2781,   86, 2789,   86, 2787, 2791,
+       86, 2785,   86, 2788, 2792,   86,   86,   86, 2790,   86,
+
+     2793, 2797,   86,   86,   86, 2794,   86, 2800, 2799, 2798,
+     2801,   86, 2795, 2803,   86,   86, 2796,   86,   86,   86,
+     2804,   86, 2806, 2802, 2809,   86, 2805,   86, 2810,   86,
+     2807, 2812,   86,   86,   86,   86,   86,   86,   86, 2808,
+     2818,   86, 2813, 2811, 2815, 2816, 2814, 2817, 2821,   86,
+       86,   86, 2820,   86, 2819, 2822, 2823,   86,   86,   86,
+       86,   86, 2825,   86,   86,   86, 2826, 2824,   86, 2828,
+     2831, 2829,   86, 2832, 2834,   86, 2830, 2836, 2827, 2833,
+     2835,   86,   86, 2838,  170,   86,   86,   86,   86, 2843,
+     3483, 2840, 2839,   86,   86,   86,   86, 2845, 2844,   86,
+
+       86, 2837, 2848,   86, 2847, 2841, 2842, 2849,   86, 2846,
+     2851,   86,   86, 2850, 2853, 2852,   86,   86,   86, 2854,
+       86, 2855, 2856, 2858,   86,   86,   86,   86, 2859,   86,
+     2860,   86, 2857,   86, 2865, 2861,   86, 2866,   86, 2863,
+       86, 2867, 2862,   86,   86,   86,   86,   86, 2871,   86,
+     2868, 2869, 2870,   86, 2864,   86,   86,   86, 2872,   86,
+     2873, 2874,   86,   86, 2879,   86, 2876, 2875, 2877,   86,
+       86, 2878, 2883,   86, 2880, 2881, 2885,   86,   86, 2884,
+       86, 2888,   86,   86,   86,   86,   86, 2882, 2893,   86,
+     2889,   86,   86,   86, 2891,   86,   86, 2886,   86, 2887,
+
+     2897, 2892, 2900, 2890, 2898,   86, 2901, 2895,   86, 2903,
+     2894,   86,   86, 2896,   86,   86, 2902, 2904,   86, 2905,
+     2899,   86,   86, 2907, 2909,   86, 2906,   86, 2910,   86,
+       86, 2911,   86,   86, 2914, 2908,   86, 2916,   86, 2917,
+       86, 2918,   86, 2912,   86,   86,   86, 2913, 2919,   86,
+     2920, 2921,   86,   86, 2915,   86,   86, 2925, 2923,   86,
+     2929, 2924, 2926,   86, 2930,   86, 2922, 2927, 2931,   86,
+       86,   86,   86, 2932, 2935,   86, 2928,   86,   86, 2938,
+       86,   86, 2939,   86, 2933, 2934, 2940,   86,   86, 2942,
+       86,   86,   86, 2946,   86, 2936, 2943,   86, 2937,   86,
+
+     2947,   86, 2950, 2941,   86, 2949, 2945, 2951, 2948, 2944,
+       86,   86, 2952,   86,   86,   86, 2957, 2953,   86,   86,
+       86, 2956,   86, 2959, 2960,   86,   86,   86, 2962,   86,
+     2954, 2961, 2963,   86, 2955,   86, 2965,   86, 2966,   86,
+     2969,   86,   86, 2958,   86, 2973,   86,   86,   86, 2980,
+       86,   86, 2964,   86, 2981,   86, 2967, 2968, 2972, 2970,
+       86, 2974, 2971, 2975, 2977,   86,   86, 2978, 3020, 2982,
+     2984, 2976,   86, 2979, 2983,   86, 2985,   86,   86, 2986,
+       86, 2987,   86, 2988,   86, 2989,   86,   86, 2990,   86,
+       86, 2991, 2993,   86,   86, 2995,   86,   86,   86, 2997,
+
+     3001,   86,   86, 2994,   86, 2998, 3483, 2992, 3002,   86,
+       86, 3006, 2996, 3003, 3005,   86,   86, 2999, 3000,   86,
+     3004, 3007,   86,   86, 3008, 3009,   86,   86,   86,   86,
+     3015,   86, 3010,   86, 3014,   86, 3011, 3012, 3013, 3016,
+       86,   86, 3017, 3021,   86,   86,   86,   86, 3022,   86,
+     3025,   86, 3019,   86, 3024,   86, 3026, 3023,   86, 3018,
+     3027,   86, 3028,   86, 3032,   86,   86, 3029,   86,   86,
+     3034,   86, 3030, 3031, 3036, 3033,   86, 3039,   86,   86,
+     3037,   86,   86,   86,   86, 3044, 3042, 3043,   86,   86,
+     3040,   86,   86, 3035, 3046,   86, 3038, 3045,   86, 3049,
+
+     3041,   86, 3050, 3483, 3047,   86, 3048, 3051,   86, 3052,
+       86, 3053,   86,   86, 3054, 3055, 3058,   86, 3057,   86,
+     3056,   86,   86,   86, 3059,   86, 3060, 3061,   86,   86,
+       86,   86, 3067,   86, 3065, 3062, 3483, 3063,   86, 3069,
+       86,   86,   86,   86, 3064, 3070,   86, 3071, 3066,   86,
+     3073, 3072, 3074,   86,   86,   86, 3068,   86, 3075, 3078,
+       86,   86,   86,   86, 3082, 3081,   86,   86, 3076,   86,
+     3079,   86, 3086,   86, 3077, 3080,   86, 3085,   86, 3083,
+       86, 3088, 3089, 3092,   86, 3084,   86, 3094,   86, 3095,
+       86, 3087,   86,   86, 3090, 3097,   86,   86,   86,   86,
+
+       86,   86, 3100,   86, 3091, 3093, 3102, 3103,   86, 3098,
+     3106,   86, 3105, 3096, 3099, 3101,   86,   86,   86, 3109,
+     3104,   86,   86, 3112,   86,   86, 3114,   86,   86, 3117,
+       86,   86,   86, 3115, 3107, 3110, 3108, 3118,   86,   86,
+       86, 3111, 3121,   86,   86, 3113, 3119,   86, 3126, 3116,
+       86, 3123,   86, 3124,   86,   86, 3130,   86,   86, 3120,
+       86,   86, 3122, 3132, 3128,   86,   86, 3125, 3133, 3127,
+       86, 3134,   86, 3131, 3137, 3129, 3138,   86, 3135,   86,
+       86, 3136, 3139, 3140, 3143,   86,   86,   86,   86,   86,
+     3141, 3142, 3144, 3146,   86, 3149,   86,   86,   86,   86,
+
+       86,   86, 3154,   86,   86,   86,   86, 3145,   86, 3150,
+       86, 3147, 3148, 3160, 3153, 3157, 3151, 3158,   86, 3159,
+       86, 3156,   86, 3155, 3161, 3152,   86, 3162, 3163,   86,
+     3164,   86, 3165,   86, 3166,   86,   86, 3169,   86, 3167,
+       86, 3171,   86,   86,   86, 3170,   86,   86,   86,   86,
+     3177, 3178,   86,   86,   86,   86,   86, 3172, 3184,   86,
+     3185,   86, 3168,   86,   86, 3186, 3173, 3175, 3174, 3176,
+     3181,   86, 3183, 3180,   86, 3182,   86,   86,   86, 3179,
+       86, 3189, 3191,   86, 3187, 3192,   86,   86,   86, 3195,
+     3196,   86, 3193, 3188, 3194,   86, 3197,   86, 3190, 3198,
+
+       86,   86, 3199,   86,   86, 3200,   86,   86, 3201,   86,
+       86, 3202, 3204,   86,   86, 3206,   86,   86, 3205,   86,
+     3483, 3207,   86,   86, 3203,   86,   86,   86,   86, 3208,
+       86, 3216, 3217, 3220, 3209, 3211, 3210, 3219, 3212, 3218,
+     3213, 3214,   86,   86,   86, 3222, 3215, 3224,   86,   86,
+     3221, 3225,   86, 3226, 3227,   86,   86, 3223,   86, 3230,
+       86, 3228, 3231,   86, 3232, 3233,   86,   86, 3234, 3235,
+     3239,   86, 3236,   86,   86, 3237, 3238, 3229,   86, 3240,
+       86, 3242,   86,   86,   86,   86,   86,   86,   86, 3241,
+     3248,   86, 3247,   86,   86,   86,   86,   86, 3244,   86,
+
+     3252, 3243, 3251, 3253,   86, 3245, 3246,   86, 3249, 3256,
+     3257,   86, 3254,   86, 3259,   86, 3258, 3255, 3250, 3260,
+       86, 3261,   86,   86,   86,   86, 3266,   86, 3263, 3268,
+     3262, 3267,   86, 3264,   86,   86, 3265,   86,   86,   86,
+     3275,   86, 3270, 3272, 3273, 3276,   86, 3278,   86,   86,
+     3269,   86, 3277, 3279,   86, 3271, 3274,   86, 3282,   86,
+     3283,   86, 3281,   86, 3280, 3285,   86, 3286,   86, 3287,
+       86,   86, 3284, 3288,   86, 3289,   86, 3290,   86, 3291,
+       86, 3292,   86,   86, 3295,   86,   86,   86,   86, 3299,
+       86,   86, 3294, 3301,   86, 3296,   86, 3293,   86, 3297,
+
+       86,   86,   86,   86, 3305, 3306,   86,   86, 3298,   86,
+     3300, 3302, 3310, 3303, 3304,   86, 3307, 3308,   86,   86,
+     3312, 3315,   86,   86, 3311, 3309, 3314,   86,   86,   86,
+       86,   86,   86, 3313, 3317,   86, 3316, 3321,   86,   86,
+       86, 3322, 3323,   86,   86,   86, 3327, 3318, 3319, 3326,
+       86, 3320, 3329,   86, 3324, 3330,   86,   86, 3328, 3331,
+       86,   86,   86,   86,   86,   86, 3325, 3334,   86,   86,
+     3333,   86,   86, 3332, 3339,   86, 3336, 3335,   86, 3338,
+     3340,   86, 3342,   86, 3344, 3343, 3341, 3337,   86,   86,
+       86,   86,   86, 3345,   86,   86,   86, 3351,   86, 3346,
+
+     3349, 3353, 3350,   86, 3348, 3354,   86,   86, 3356, 3357,
+     3359,   86,   86, 3347,   86, 3352, 3361,   86, 3355,   86,
+     3362, 3360, 3363,   86, 3364,   86,   86, 3358,   86,   86,
+       86, 3367,   86, 3365, 3368, 3369,   86, 3372,   86,   86,
+       86,   86,   86,   86, 3375,   86, 3366, 3376,   86, 3378,
+       86, 3371, 3373, 3374, 3379,   86,   86, 3370, 3382,   86,
+     3377, 3381,   86, 3384, 3385,   86,   86, 3386,   86,   86,
+       86, 3380, 3389, 3390,   86,   86, 3387, 3383,   86,   86,
+       86, 3395,   86,   86, 3391, 3394,   86, 3392, 3388, 3396,
+       86,   86,   86,   86, 3393,   86, 3400,   86,   86,   86,
+
+     3402,   86,   86,   86, 3397, 3399, 3398, 3407, 3408, 3409,
+       86, 3404, 3405, 3401,   86,   86, 3403,   86, 3413,   86,
+     3406,   86, 3415,   86, 3416,   86, 3414,   86,   86,   86,
+     3417, 3421, 3418, 3411, 3410,   86, 3412,   86, 3422,   86,
+     3419,   86, 3424,   86,   86,   86, 3423,   86, 3420, 3425,
+       86,   86, 3430,   86, 3427,   86,   86, 3433,   86, 3434,
+       86,   86,   86, 3426,   86,   86, 3437,   86, 3432, 3428,
+     3429, 3435, 3431,   86, 3436,   86, 3441,   86, 3442,   86,
+     3440,   86, 3445, 3438, 3439,   86,   86, 3447,   86, 3448,
+     3443,   86,   86,   86, 3452,   86, 3449,   86,   86, 3450,
+
+     3454,   86, 3453,   86, 3446, 3444, 3455,   86, 3456,   86,
+     3457,   86, 3451,   86, 3461,   86, 3459,   86,   86,   86,
+       86,   86,   86, 3463, 3464,   86, 3467,   86, 3458, 3468,
+       86, 3483, 3460,   86, 3471,   86, 3462, 3472,   86, 3465,
+     3466, 3469, 3473, 3474,   86,   86, 3470, 3475,   86,   86,
+       86,   86, 3476,   86, 3477, 3478, 3481,   86, 3482,   86,
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3479, 3483, 3480,   47,   47,   47,   47,   47,   47,   47,
+       52,   52,   52,   52,   52,   52,   52,   57,   57,   57,
+       57,   57,   57,   57,   63,   63,   63,   63,   63,   63,
+
+       63,   68,   68,   68,   68,   68,   68,   68,   74,   74,
+       74,   74,   74,   74,   74,   80,   80,   80,   80,   80,
+       80,   80,   89,   89, 3483,   89,   89,   89,   89,  160,
+      160, 3483, 3483, 3483,  160,  160,  162,  162, 3483, 3483,
+      162, 3483,  162,  164, 3483, 3483, 3483, 3483, 3483,  164,
+      167,  167, 3483, 3483, 3483,  167,  167,  169, 3483, 3483,
+     3483, 3483, 3483,  169,  171,  171, 3483,  171,  171,  171,
+      171,  174, 3483, 3483, 3483, 3483, 3483,  174,  177,  177,
+     3483, 3483, 3483,  177,  177,   90,   90, 3483,   90,   90,
+       90,   90,   17, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483
     } ;
 
-static yyconst flex_int16_t yy_chk[6588] =
+static yyconst flex_int16_t yy_chk[6834] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -2278,18 +2350,18 @@ static yyconst flex_int16_t yy_chk[6588] =
         5,    3,    6,   24,    4,   24,   24,    5,   24,    6,
         7,    7,    7,    7,   24,    7,    8,    8,    8,    8,
        33,    8,    7,    9,    9,    9,   26,   26,    8,   10,
-       10,   10,   19,   29,    9,   33,   19,   29, 3361,   35,
+       10,   10,   19,   29,    9,   33,   19,   29, 3491,   35,
        10,   11,   11,   11,   11,   11,   11,   13,   13,   13,
 
        13,   34,   13,   11,   35,   99,   34,   29,   38,   13,
        51,   51,   11,   12,   12,   12,   12,   12,   12,   14,
        14,   14,   14,   99,   14,   12,   15,   15,   15,   38,
        23,   14,   23,   23,   12,   23,   46,   15,   16,   16,
-       16,   23,   23,   25,   27,   27,   25,   25, 2735,   16,
+       16,   23,   23,   25,   27,   27,   25,   25, 2838,   16,
        25,   46,   27,   30,   30,   25,   27,   56,   40,   27,
        56,   73,   31,   31,   25,   28,   67,   67,   30,   32,
        28,   31,   40,   32,   28,   73,   32,   28,   92,   28,
-       28,   92,   31,   32, 1099,   32,   36,   36,   37,   37,
+       28,   92,   31,   32, 1127,   32,   36,   36,   37,   37,
        28,   45,   45,   37,   97,   36,   45,   97,   41,   41,
 
        45,   36,   87,   41,   93,   36,   87,   37,   93,   37,
@@ -2328,9 +2400,9 @@ static yyconst flex_int16_t yy_chk[6588] =
       200,  201,  202,  197,  203,  204,  201,  202,  205,  197,
       197,  199,  196,  206,  205,  207,  203,  206,  208,  200,
       207,  209,  213,  210,  211,  204,  214,  213,  216,  217,
-      551,  214,  218,  216,  208,  209,  211,  205,  210,  211,
+      556,  214,  218,  216,  208,  209,  211,  205,  210,  211,
       215,  215,  220,  220,  215,  219,  215,  221,  218,  217,
-      222,  219,  223,  221,  551,  224,  222,  227,  215,  221,
+      222,  219,  223,  221,  556,  224,  222,  227,  215,  221,
       215,  224,  225,  227,  228,  229,  230,  231,  225,  228,
       230,  229,  223,  231,  232,  234,  233,  225,  235,  236,
       237,  232,  233,  238,  235,  239,  237,  240,  234,  241,
@@ -2354,646 +2426,674 @@ static yyconst flex_int16_t yy_chk[6588] =
       313,  315,  316,  319,  311,  312,  317,  317,  314,  318,
       308,  321,  318,  320,  322,  316,  324,  320,  323,  323,
       313,  319,  315,  325,  312,  326,  325,  327,  328,  329,
-      321,  328,  322,  327,  324,  333,  331,  326,  366,  332,
-      333,  329,  336,  325,  330,  331,  334,  335,  337,  334,
-      335,  334,  366,  330,  169,  336,  330,  332,  341,  341,
-
-      337,  330,  330,  330,  330,  339,  338,  334,  338,  338,
-      339,  339,  340,  342,  343,  340,  345,  344,  346,  347,
-      347,  348,  349,  349,  351,  345,  348,  346,  353,  343,
-      342,  350,  350,  342,  344,  344,  352,  354,  355,  351,
-      353,  352,  356,  357,  360,  167,  361,  358,  358,  357,
-      358,  361,  369,  369,  362,  166,  354,  356,  355,  358,
-      362,  363,  364,  394,  360,  365,  363,  364,  365,  367,
-      365,  368,  367,  364,  372,  370,  371,  371,  375,  372,
-      368,  370,  377,  373,  378,  367,  373,  379,  367,  394,
-      367,  376,  373,  382,  376,  384,  373,  377,  375,  378,
-
-      381,  379,  385,  381,  373,  374,  374,  382,  374,  386,
-      384,  385,  376,  388,  386,  386,  387,  389,  390,  381,
-      402,  374,  387,  392,  374,  402,  374,  395,  374,  383,
-      391,  383,  383,  390,  388,  396,  389,  164,  399,  391,
-      393,  383,  392,  383,  383,  383,  393,  395,  383,  396,
-      397,  400,  398,  401,  403,  404,  397,  398,  399,  406,
-      397,  404,  405,  405,  407,  410,  408,  409,  401,  403,
-      411,  400,  412,  409,  414,  398,  407,  412,  417,  406,
-      408,  413,  413,  415,  413,  416,  411,  418,  423,  418,
-      410,  426,  417,  419,  414,  419,  419,  424,  420,  415,
-
-      421,  416,  420,  427,  421,  422,  422,  423,  425,  426,
-      430,  428,  424,  419,  431,  439,  430,  427,  439,  421,
-      428,  429,  432,  431,  425,  433,  429,  432,  434,  433,
-      435,  428,  436,  428,  429,  429,  435,  434,  429,  429,
-      437,  438,  440,  441,  443,  438,  437,  440,  442,  442,
-      444,  444,  446,  436,  445,  447,  447,  443,  448,  445,
-      450,  451,  449,  441,  448,  446,  449,  452,  453,  454,
-      454,  455,  452,  453,  456,  450,  458,  457,  454,  461,
-      464,  459,  451,  455,  459,  460,  462,  462,  458,  460,
-      466,  461,  463,  470,  456,  457,  471,  463,  465,  465,
-
-      472,  464,  468,  468,  471,  473,  474,  475,  476,  472,
-      478,  474,  466,  479,  470,  480,  482,  484,  481,  550,
-      476,  550,  482,  484,  483,  486,  473,  475,  478,  485,
-      478,  479,  481,  483,  485,  480,  487,  488,  489,  486,
-      488,  490,  491,  492,  487,  494,  493,  487,  491,  493,
-      495,  494,  489,  496,  497,  499,  490,  498,  496,  499,
-      500,  502,  501,  492,  495,  500,  502,  503,  504,  494,
-      508,  505,  511,  524,  547,  510,  497,  501,  498,  510,
-      509,  512,  513,  503,  505,  162,  513,  504,  506,  506,
-      508,  511,  547,  524,  506,  509,  506,  512,  515,  517,
-
-      514,  516,  506,  518,  506,  514,  516,  506,  506,  514,
-      519,  520,  518,  515,  506,  517,  519,  521,  517,  522,
-      523,  519,  522,  525,  525,  526,  520,  527,  527,  528,
-      529,  530,  531,  521,  532,  533,  534,  536,  535,  539,
-      533,  537,  529,  523,  528,  534,  530,  537,  539,  540,
-      526,  531,  536,  540,  541,  542,  532,  535,  543,  544,
-      541,  545,  546,  549,  548,  554,  552,  542,  548,  553,
-      553,  554,  555,  543,  552,  545,  549,  546,  544,  556,
-      557,  559,  560,  558,  555,  556,  558,  562,  561,  563,
-      562,  564,  557,  561,  565,  559,  566,  560,  563,  565,
-
-      565,  567,  567,  568,  568,  563,  569,  564,  563,  566,
-      570,  570,  569,  571,  571,  572,  574,  573,  575,  578,
-      577,  572,  573,  573,  576,  577,  579,  576,  580,  582,
-      575,  580,  583,  589,  579,  581,  585,  574,  578,  584,
-      581,  586,  585,  584,  587,  586,  591,  589,  588,  590,
-      590,  583,  582,  588,  592,  593,  594,  595,  596,  598,
-      593,  591,  587,  597,  596,  603,  600,  602,  597,  601,
-      601,  599,  594,  598,  599,  592,  606,  595,  607,  599,
-      610,  603,  599,  599,  600,  602,  604,  605,  609,  610,
-      606,  604,  605,  607,  609,  611,  612,  613,  611,  616,
-
-      612,  614,  613,  615,  614,  617,  618,  619,  615,  620,
-      621,  622,  622,  618,  620,  616,  623,  624,  625,  626,
-      619,  627,  612,  617,  630,  623,  628,  630,  626,  629,
-      621,  634,  628,  627,  625,  629,  624,  631,  631,  632,
-      631,  633,  632,  635,  637,  636,  633,  638,  640,  634,
-      636,  639,  641,  638,  640,  641,  639,  635,  642,  643,
-      644,  645,  646,  637,  643,  644,  644,  647,  650,  649,
-      648,  652,  647,  651,  645,  646,  648,  650,  651,  653,
-      653,  655,  654,  642,  655,  657,  647,  647,  649,  654,
-      656,  652,  661,  658,  663,  659,  656,  657,  658,  655,
-
-      659,  659,  660,  660,  662,  664,  662,  664,  658,  665,
-      666,  667,  668,  663,  669,  670,  671,  661,  673,  676,
-      671,  670,  674,  672,  675,  678,  682,  665,  666,  667,
-      679,  668,  672,  673,  669,  677,  679,  674,  676,  680,
-      678,  683,  675,  681,  684,  682,  685,  677,  684,  686,
-      687,  688,  689,  680,  690,  681,  692,  692,  691,  690,
-      683,  694,  693,  695,  685,  686,  693,  696,  687,  688,
-      688,  689,  691,  697,  698,  694,  699,  700,  696,  698,
-      701,  702,  695,  704,  703,  707,  705,  697,  702,  703,
-      704,  705,  699,  701,  706,  708,  700,  709,  710,  706,
-
-      711,  712,  708,  707,  714,  713,  709,  714,  716,  711,
-      713,  715,  710,  712,  717,  715,  718,  720,  719,  721,
-      721,  725,  716,  717,  722,  722,  723,  723,  727,  724,
-      725,  718,  719,  722,  724,  728,  729,  731,  720,  730,
-      732,  728,  733,  730,  734,  735,  737,  727,  736,  731,
-      734,  738,  739,  735,  742,  736,  729,  745,  748,  754,
-      733,  752,  749,  754,  737,  732,  770,  748,  749,  742,
-      752,  753,  739,  760,  745,  751,  738,  740,  160,  740,
-      758,  751,  740,  755,  755,  770,  740,  753,  759,  740,
-      756,  756,  757,  760,  761,  765,  740,  740,  758,  740,
-
-      761,  767,  759,  757,  762,  762,  762,  763,  762,  764,
-      766,  762,  763,  765,  766,  768,  762,  771,  772,  768,
-       85,  769,  762,  762,  773,  767,  769,  773,  774,  775,
-      764,  777,  771,  774,  774,  768,  775,  776,  776,  778,
-      779,  779,  780,  772,  778,  781,  777,  780,  781,  782,
-      783,  783,  785,  784,  782,  784,  786,  787,  788,  790,
-      789,  787,  791,  791,  785,  792,  795,  790,  793,  794,
-      794,  796,  797,  800,  800,  786,  811,  811,  788,  789,
-      792,  798,  793,  796,  795,  799,  801,  798,  803,  804,
-      799,  801,  801,  803,  797,  804,  805,  808,  806,  807,
-
-      808,  809,  805,  806,  810,  807,  813,  809,  812,  812,
-      814,  815,  810,  816,  813,  817,  815,  819,  818,  822,
-      816,  820,  820,  821,  823,  823,  825,  822,  814,  824,
-      827,  828,  821,  817,  818,  824,  819,  829,  830,  827,
-      828,  831,  834,  830,  832,  825,  833,  832,  835,  836,
-      831,  833,  837,  840,  838,  841,  834,  842,  836,  838,
-      838,  829,  839,  839,  843,  837,  842,  844,  840,  845,
-      848,  848,  845,  835,  841,  847,  849,  847,  850,  851,
-      845,  852,  853,  850,  854,  844,  856,  855,  843,  857,
-      858,  859,  860,  861,  858,  856,  862,  849,  863,  861,
-
-      851,  852,  853,  864,  865,  862,  854,  855,  866,  859,
-      863,  860,  857,  867,  866,  868,  869,  869,  865,  870,
-      868,  871,  864,  872,  873,  874,  875,  867,  876,  877,
-      871,  878,  873,  883,  879,  881,  880,  878,  882,  870,
-      879,  881,  886,  872,  887,  874,  886,  876,  875,  877,
-      880,  884,  882,  883,  885,  888,  889,  884,  890,  894,
-      885,  889,  892,  887,  891,  891,  893,  888,  892,  893,
-      895,  897,  896,  898,  898,  888,  899,  894,  896,  890,
-      900,  901,  902,  895,  903,  900,  901,  901,  903,  904,
-      904,  897,  905,  906,  899,  907,  908,  902,  910,  913,
-
-      907,  914,  911,  915,  917,  917,  918,  921,  919, 1077,
-      918,  923,  913,  906,  905,  908,  911,  920,  920,  924,
-     1077,  914,  910,  919,  915,  916,  923,  922,  916,  926,
-      916,  922,  921,  924,  916,  925,  916,  929,  928,  927,
-      925,  916,  931,  926,  927,  927,  916,  928,  930,  933,
-      932,  929,  930,  934,  935,  932,  936,  931,  934,  937,
-      938,  933,  940,  946,  930,  932,  939,  940,  935,  938,
-      941,  947,  939,  937,  942,  948,  941,  936,  943,  943,
-      942,  944,  945,  952,  950,  946,  944,  951,  945,  953,
-      947,  957,  951,  948,  949,  949,  950,  952,  954,  954,
-
-      949,  953,  949,  956,  955,  957,  958,  959,  949,  955,
-      961,  956,  960,  949,  949,  963,  961,  962,  964,  965,
-      949,  966,  962,  967,  967,  958,  959,  963,  960,  968,
-      969,  971,  973,  968,  975,  965,  964,  971,  972,  966,
-      974,  972,  976,  978,  977,  974,  980,  975,  976,  977,
-      969,  973,  981,  982,  983,  980,  984,  985,  986,  987,
-      983,  981,  978,  986,  988,  984,  989,  994,  990,  982,
-       80,  993,  991,  992,  997, 1000,  985,  993,  988,  987,
-      990,  991,  992,  995,  994,  999,  989, 1001, 1002,  995,
-      997, 1003, 1004, 1005, 1010, 1000, 1006, 1014, 1005,  999,
-
-     1009, 1006, 1002, 1010, 1013, 1009, 1001, 1004, 1012, 1003,
-     1011, 1011, 1014, 1013, 1012, 1015, 1017, 1018, 1023, 1022,
-     1020, 1020, 1018, 1018, 1020, 1024, 1021, 1025, 1015, 1021,
-     1026, 1027, 1017, 1022, 1028, 1029, 1030, 1031, 1023, 1032,
-     1028, 1024, 1030, 1026, 1032, 1025, 1027, 1033, 1035, 1036,
-     1039, 1035, 1031, 1037, 1038, 1029, 1040, 1041, 1037, 1038,
-     1043, 1033, 1041, 1042, 1046, 1040, 1039, 1045, 1042, 1047,
-     1036, 1048, 1043, 1045, 1050, 1047, 1051, 1048, 1049, 1049,
-     1046, 1052, 1054, 1050, 1052, 1053, 1053, 1055, 1056, 1057,
-     1058, 1059, 1057, 1060, 1051, 1066, 1061, 1059, 1067, 1060,
-
-     1054, 1061, 1062, 1058, 1063, 1064, 1055, 1062, 1056, 1063,
-     1068, 1064, 1069, 1066, 1070, 1070, 1068, 1069, 1067, 1071,
-     1072, 1073, 1074, 1075, 1076, 1078, 1075, 1076, 1071, 1072,
-     1078, 1079, 1080, 1081, 1082, 1084, 1083, 1087, 1085, 1073,
-     1082, 1074, 1083, 1085, 1080, 1086, 1086, 1088, 1089, 1079,
-     1084, 1090, 1081, 1091, 1092, 1090, 1087, 1093, 1094, 1096,
-     1089, 1088, 1098, 1092, 1097, 1097, 1100, 1102, 1103, 1101,
-     1106, 1091, 1104, 1103, 1105, 1105, 1093, 1109, 1096, 1102,
-     1100, 1104, 1098, 1094, 1101, 1107, 1108, 1117, 1113, 1110,
-     1106, 1107, 1108, 1109, 1110, 1111, 1112, 1111, 1114, 1115,
-
-     1116, 1112, 1113, 1118, 1115, 1119, 1117, 1120, 1122, 1122,
-     1118, 1123, 1114, 1124, 1125, 1116, 1126, 1127, 1135, 1128,
-     1119, 1134, 1126, 1130, 1128, 1123, 1120, 1130, 1134, 1125,
-     1137, 1124, 1135, 1128, 1138, 1128, 1132, 1127, 1128, 1131,
-     1131, 1132, 1133, 1133, 1136, 1139, 1140, 1136, 1141, 1137,
-     1142, 1140, 1138, 1143, 1139, 1144, 1146, 1145, 1143, 1148,
-     1148, 1149, 1142, 1151, 1155, 1150, 1149, 1141, 1145, 1144,
-     1150, 1152, 1154, 1153, 1156, 1146, 1152, 1153, 1157, 1155,
-     1158, 1154, 1161, 1151, 1159, 1162, 1160, 1163, 1164, 1156,
-     1165, 1167, 1158, 1160, 1161, 1166, 1165, 1157, 1168, 1159,
-
-     1169, 1170, 1171, 1172, 1162, 1173, 1164, 1174, 1163, 1169,
-     1166, 1167, 1175, 1176, 1178, 1172, 1170, 1180, 1168, 1179,
-     1178, 1171, 1181, 1182, 1173, 1183, 1185, 1175, 1187, 1189,
-     1181, 1180, 1174, 1176, 1179, 1184, 1188, 1193, 1185, 1186,
-     1184, 1183, 1189, 1182, 1186, 1186, 1193, 1187, 1190, 1190,
-     1188, 1191, 1191, 1192, 1197, 1194, 1191, 1195, 1195, 1191,
-     1191, 1194, 1196, 1197, 1191, 1198, 1192, 1196, 1199, 1202,
-     1191, 1198, 1200, 1199, 1191, 1201, 1201, 1200, 1203, 1203,
-     1204, 1205, 1206, 1204, 1207, 1204, 1208, 1209, 1210, 1211,
-     1202, 1212, 1209, 1207, 1214,   75, 1218, 1212, 1213, 1214,
-
-     1206, 1205, 1210, 1216, 1213, 1215, 1208, 1211, 1217, 1215,
-     1218, 1221, 1216, 1217, 1219, 1219, 1223, 1216, 1224, 1216,
-     1223, 1216, 1221, 1216, 1220, 1220, 1225, 1220, 1226, 1227,
-     1228, 1229, 1231, 1224, 1227, 1227, 1230, 1226, 1232, 1228,
-     1233, 1230, 1234, 1235, 1225, 1236, 1231, 1232, 1237, 1237,
-     1238, 1236, 1239, 1229, 1241, 1240, 1242, 1235, 1238, 1233,
-     1240, 1234, 1243, 1244, 1245, 1242, 1239, 1246, 1241, 1243,
-     1247, 1247, 1246, 1248, 1249, 1249, 1250, 1252, 1250, 1253,
-     1252, 1244, 1254, 1255, 1253, 1256, 1256, 1257, 1248, 1245,
-     1258, 1258, 1255, 1259, 1259, 1260, 1261, 1262, 1263, 1263,
-
-     1260, 1254, 1264, 1265, 1266, 1267, 1265, 1257, 1270,   74,
-     1267, 1268, 1269, 1272, 1269, 1273, 1272, 1261, 1262, 1275,
-     1268, 1277, 1264, 1274, 1266, 1283, 1270, 1276, 1274, 1277,
-     1273, 1278, 1276, 1275, 1279, 1280, 1278, 1279, 1281, 1281,
-     1280, 1282, 1284, 1283, 1285, 1286, 1282, 1288, 1284, 1289,
-     1291, 1285, 1290, 1288, 1292, 1289, 1291, 1290, 1286, 1293,
-     1294, 1295, 1295, 1292, 1296, 1298, 1299, 1300, 1301, 1302,
-     1303, 1294, 1307, 1305, 1301, 1302, 1303, 1306, 1293, 1305,
-     1298, 1308, 1309, 1313, 1296, 1310, 1299, 1311, 1312, 1312,
-     1300, 1306, 1307, 1314, 1309, 1315, 1318, 1306, 1321, 1310,
-
-     1326, 1308, 1316, 1313, 1323, 1311, 1319, 1316, 1317, 1317,
-     1322, 1319, 1324, 1315, 1326, 1322, 1322, 1321, 1314, 1318,
-     1325, 1324, 1323, 1327, 1328, 1329, 1330, 1331, 1325, 1331,
-     1329, 1332, 1335, 1329, 1334, 1330, 1335, 1336, 1327, 1328,
-     1334, 1337, 1328, 1338, 1339, 1332, 1337, 1337, 1336, 1340,
-     1341, 1342, 1344, 1343, 1345, 1341, 1342, 1346, 1349, 1345,
-     1348, 1350, 1338, 1351, 1351, 1352, 1353, 1340, 1354, 1352,
-     1339, 1343, 1344, 1356, 1348, 1355, 1349, 1346, 1357, 1350,
-     1358, 1355, 1363, 1359, 1353, 1356, 1360, 1354, 1361, 1363,
-     1362, 1364, 1365, 1366, 1358, 1362, 1364, 1357, 1359, 1367,
-
-     1367, 1360, 1366, 1368, 1369, 1370, 1372, 1361, 1371, 1371,
-     1365, 1373, 1372, 1369, 1374, 1375, 1375, 1373, 1368, 1377,
-     1376, 1378, 1379, 1380, 1381, 1370, 1376, 1379, 1374, 1380,
-     1381, 1382, 1383, 1383, 1389, 1377, 1388, 1382, 1384, 1384,
-     1386, 1386, 1378, 1387, 1390, 1388, 1391, 1387, 1392, 1395,
-     1393, 1396, 1389, 1394, 1394, 1399, 1390, 1393, 1398, 1396,
-     1391, 1397, 1400, 1392, 1402, 1401, 1397, 1400, 1400, 1395,
-     1401, 1401, 1398, 1404, 1399, 1403, 1403, 1405, 1406, 1408,
-     1407, 1409, 1410, 1411, 1402, 1407, 1412, 1406, 1413, 1411,
-     1415, 1412, 1404, 1414, 1418, 1423, 1405, 1416, 1408, 1414,
-
-     1410, 1409, 1417, 1416, 1419, 1420, 1421, 1422, 1417, 1415,
-     1427, 1424, 1426, 1418, 1413, 1426, 1423, 1425, 1425, 1428,
-     1429, 1422, 1434, 1419, 1420, 1421, 1424, 1430, 1430, 1427,
-     1431, 1431, 1429, 1433, 1432, 1434, 1435, 1433, 1428, 1432,
-     1436, 1437, 1441, 1437, 1439, 1435, 1440, 1437, 1442, 1443,
-     1448, 1440, 1446, 1436, 1444, 1444, 1445, 1441, 1446, 1447,
-     1437, 1445, 1439, 1448, 1449, 1443, 1450, 1451, 1442, 1449,
-     1450, 1451, 1452, 1453, 1447, 1454, 1455, 1456, 1457, 1457,
-     1459, 1461, 1462, 1456, 1454, 1463, 1463, 1462, 1464, 1465,
-     1469, 1453, 1452, 1469, 1464, 1471, 1455, 1472, 1459, 1467,
-
-     1467, 1475, 1461, 1470, 1470, 1474, 1476, 1478, 1474, 1465,
-     1479, 1471, 1482, 1472, 1480, 1476, 1477, 1477, 1481, 1483,
-     1483, 1475, 1478, 1481, 1485, 1484, 1482, 1487, 1486, 1488,
-     1490, 1479, 1491, 1480, 1484, 1489, 1489, 1495, 1493, 1496,
-     1492, 1495, 1485, 1486, 1490, 1492, 1494, 1494, 1498, 1488,
-     1491, 1499, 1487, 1493, 1497, 1497, 1500, 1501, 1502, 1496,
-     1500, 1505, 1499, 1502, 1504, 1504, 1506, 1507, 1508, 1509,
-     1498, 1510, 1511, 1511, 1512, 1513, 1501, 1505, 1514, 1512,
-     1516, 1507, 1518, 1509, 1506, 1515, 1515, 1508, 1508, 1516,
-     1522, 1519, 1517, 1519, 1520, 1513, 1510, 1517, 1514, 1520,
-
-     1521, 1523, 1518, 1525, 1526, 1526, 1521, 1523, 1527, 1528,
-     1522, 1530, 1531, 1532, 1532, 1528, 1530, 1525, 1533, 1533,
-     1534, 1535, 1536, 1537, 1538, 1538, 1537, 1527, 1539, 1540,
-     1541, 1549, 1543,   68, 1534, 1544, 1531, 1536, 1543, 1535,
-     1544, 1540, 1542, 1547, 1545, 1542, 1539, 1545, 1542, 1548,
-     1541, 1552, 1547, 1553, 1548, 1550, 1549, 1552, 1550, 1553,
-     1542, 1551, 1551, 1545, 1554, 1555, 1555, 1556, 1556, 1554,
-     1557, 1559, 1558, 1560, 1561, 1562, 1557, 1558, 1563, 1564,
-     1565, 1563, 1566, 1567, 1559, 1564, 1565, 1566, 1568, 1567,
-     1572, 1560, 1569, 1561, 1573, 1562, 1571, 1569, 1570, 1570,
-
-     1574, 1571, 1575, 1576, 1577, 1578, 1579, 1582, 1572, 1580,
-     1581, 1568, 1581, 1580, 1573, 1584, 1575, 1576, 1577, 1586,
-     1574, 1585, 1587, 1578, 1588, 1589, 1582, 1584, 1587, 1590,
-     1592, 1579, 1586, 1585, 1591, 1594, 1594, 1595, 1596, 1599,
-     1597, 1589, 1600, 1596, 1588, 1598, 1598, 1601, 1591, 1590,
-     1602, 1592, 1597, 1603, 1599, 1604, 1600, 1595, 1605, 1607,
-     1606, 1609, 1603, 1611, 1612, 1605, 1616, 1612, 1602, 1606,
-     1604, 1601, 1606, 1613, 1613, 1607, 1609, 1614, 1614, 1615,
-     1617, 1609, 1619, 1617, 1616, 1618, 1618, 1620, 1611, 1621,
-     1623, 1615, 1622, 1625, 1621, 1619, 1624, 1622, 1626, 1627,
-
-     1631, 1628, 1625, 1630, 1630, 1632, 1620, 1629, 1627, 1623,
-     1628, 1627, 1624, 1629, 1633, 1634, 1636, 1626, 1632, 1635,
-     1631, 1636, 1636, 1637, 1638, 1641, 1642, 1644, 1637, 1634,
-     1643, 1643, 1633, 1645, 1646, 1635, 1638, 1647, 1647, 1646,
-     1650, 1649, 1645, 1644, 1642, 1648, 1649, 1651, 1652, 1655,
-     1641, 1657, 1647, 1664, 1648, 1653, 1656, 1648, 1650, 1658,
-     1653, 1653, 1660, 1655, 1658, 1663, 1652, 1664, 1651, 1659,
-     1663, 1656, 1662, 1657, 1668, 1659, 1661, 1661, 1662, 1665,
-     1660, 1666, 1669, 1670, 1671, 1665, 1673, 1666, 1677, 1670,
-     1672, 1678, 1673, 1672, 1668, 1675, 1669, 1671, 1679, 1672,
-
-     1680, 1681, 1682, 1675, 1683, 1684, 1679, 1677, 1688, 1680,
-     1678, 1685, 1685, 1691, 1681, 1682, 1686, 1687, 1683, 1684,
-     1690, 1688, 1686, 1687, 1689, 1689, 1692, 1693, 1693, 1694,
-     1695, 1691, 1696, 1685, 1697, 1698, 1695, 1700, 1700, 1701,
-     1690, 1703, 1694, 1702, 1704, 1692, 1703, 1702, 1706, 1704,
-     1697, 1705, 1707, 1698, 1696, 1709, 1705, 1706, 1710, 1701,
-     1711, 1711, 1712, 1714, 1713, 1715, 1715, 1709, 1718, 1716,
-     1717, 1721, 1719, 1710, 1722, 1707, 1713, 1717, 1725, 1723,
-     1718, 1712, 1714, 1716, 1719, 1723, 1724, 1726, 1727, 1727,
-     1721,   63, 1728, 1726, 1722, 1728, 1725, 1731, 1724, 1729,
-
-     1729, 1732, 1731, 1733, 1734, 1734, 1735, 1738, 1739, 1733,
-     1732, 1736, 1737, 1736, 1740, 1737, 1741, 1742, 1735, 1743,
-     1744, 1745, 1742, 1746, 1743, 1749, 1747, 1738, 1748, 1744,
-     1739, 1747, 1740, 1745, 1741, 1750, 1751, 1748, 1746, 1752,
-     1750, 1751, 1753, 1753, 1755, 1749, 1754, 1750, 1757, 1758,
-     1748, 1760, 1754, 1759, 1752, 1761, 1762, 1761, 1763, 1763,
-     1764, 1764, 1765, 1765, 1766, 1755, 1769, 1757, 1758, 1759,
-     1762, 1760, 1762, 1767, 1767, 1768, 1768, 1770, 1771, 1771,
-     1773, 1772, 1777, 1776, 1766, 1772, 1773, 1769, 1774, 1776,
-     1778, 1774, 1779, 1782, 1780, 1785, 1778, 1780, 1770, 1783,
-
-     1777, 1781, 1781, 1786, 1783, 1784, 1784, 1787, 1788, 1788,
-     1785, 1789, 1787, 1782, 1790, 1791, 1789, 1779, 1792, 1793,
-     1790, 1794, 1796,   58, 1786, 1795, 1799, 1791, 1791, 1791,
-     1798, 1795, 1800, 1802, 1791, 1798, 1798, 1793, 1792, 1803,
-     1799, 1794, 1796, 1801, 1802, 1801, 1804, 1800, 1805, 1806,
-     1807, 1809, 1804, 1811, 1803, 1808, 1808, 1805, 1810, 1810,
-     1812, 1813, 1813, 1814, 1814, 1815, 1818, 1818, 1819, 1806,
-     1820, 1807, 1822, 1811, 1823, 1825, 1825, 1809, 1824, 1820,
-     1826, 1822, 1812, 1827, 1824, 1815, 1830, 1828, 1829, 1831,
-     1831, 1832, 1833, 1819, 1828, 1823, 1836, 1829, 1827, 1835,
-
-     1837, 1826, 1836, 1838, 1835, 1839, 1842, 1840, 1833, 1840,
-     1838, 1839, 1830, 1843, 1844, 1844, 1845, 1832, 1846, 1843,
-     1837, 1845, 1847, 1849, 1848, 1842, 1850, 1846, 1851, 1850,
-     1852, 1853, 1853, 1854, 1855, 1849, 1857, 1856, 1860, 1854,
-     1855, 1858, 1847, 1848, 1861, 1858, 1851, 1862, 1863, 1863,
-     1864, 1857, 1862, 1865, 1867, 1868, 1852, 1856, 1860, 1868,
-     1876, 1858, 1869, 1869, 1870, 1871, 1861, 1874, 1865, 1864,
-     1870, 1872, 1872, 1867, 1871, 1873, 1875, 1875, 1874, 1873,
-     1877, 1876, 1878, 1874, 1879, 1880, 1881, 1882, 1883, 1879,
-     1884, 1885, 1885, 1882, 1877, 1884, 1886, 1886, 1887, 1889,
-
-     1890, 1878, 1887, 1883, 1891, 1880, 1881, 1899, 1889, 1892,
-     1892, 1890, 1894, 1894, 1895, 1896, 1890, 1898, 1901, 1895,
-     1895, 1896, 1900, 1898, 1891, 1902, 1904, 1900, 1905, 1906,
-     1901, 1902, 1905, 1899, 1907, 1909, 1908, 1910, 1904, 1911,
-     1912, 1906, 1908, 1910, 1911, 1915, 1914, 1918, 1916, 1922,
-     1918, 1925, 1912, 1916, 1919, 1919, 1925, 1909, 1914, 1907,
-     1920, 1920, 1921, 1921, 1915, 1923, 1924, 1926, 1927, 1922,
-     1929, 1923, 1924, 1926, 1932, 1929, 1931, 1927, 1935, 1931,
-     1933, 1933, 1936, 1937, 1938, 1938, 1932, 1939, 1937, 1944,
-     1935, 1947, 1940, 1941, 1936, 1945, 1939, 1940, 1941, 1942,
-
-     1943, 1943, 1942, 1946, 1945, 1951, 1950, 1948, 1949, 1944,
-     1947, 1948, 1950, 1949, 1953, 1952, 1954, 1956, 1956, 1957,
-     1959, 1946, 1958, 1951, 1952, 1960, 1960, 1961, 1963, 1956,
-     1954, 1958, 1953, 1962, 1964, 1965, 1961, 1957, 1971, 1964,
-     1959, 1968, 1968, 1970, 1972, 1962, 1970, 1974, 1965, 1963,
-     1975, 1976, 1977, 1986, 1971, 1978, 1978, 1976,   57, 1979,
-     1972, 1979, 1974, 1981, 1975, 1980, 1980, 1983, 1983, 1977,
-     1989, 1981, 1984, 1984, 1987, 1988, 1986, 1989, 1990, 1991,
-     1987, 1988, 1992, 1992, 1993, 1994, 1995, 1997, 1999, 1996,
-     2000, 1998, 2003, 1993, 2004, 2005, 2006, 2006, 1995, 1991,
-
-     1990, 1996, 1997, 1998, 2001, 2000, 1994, 2005, 2007, 2008,
-     2001, 2011, 2003, 2009, 1999, 2010, 2009, 2004, 2015, 2013,
-     2010, 2021,   52, 2001, 2013, 2014, 2007, 2014, 2016, 2008,
-     2017, 2011, 2019, 2016, 2022, 2023, 2015, 2017, 2024, 2021,
-     2024, 2019, 2025, 2022, 2027, 2028, 2027, 2023, 2029, 2029,
-     2030, 2031, 2032, 2033, 2032, 2034, 2031, 2035, 2033, 2028,
-     2034, 2025, 2036, 2037, 2039, 2038, 2040, 2041, 2044, 2037,
-     2038, 2042, 2041, 2041, 2045, 2035, 2030, 2039, 2040, 2042,
-     2046, 2046, 2036, 2047, 2047, 2048, 2049, 2044, 2045, 2050,
-     2052, 2051, 2052, 2053, 2054, 2050, 2051, 2055, 2055,   47,
-
-     2048, 2056, 2054, 2057, 2057, 2059, 2049, 2058, 2058, 2061,
-     2054, 2053, 2060, 2056, 2059, 2065, 2063, 2060, 2064, 2067,
-     2064, 2069, 2071, 2068, 2066, 2063, 2075, 2061, 2063, 2066,
-     2066, 2067, 2068, 2069, 2071, 2072, 2065, 2073, 2076, 2075,
-     2072, 2077, 2073, 2078, 2078, 2079, 2080, 2082, 2085, 2081,
-     2077, 2083, 2087, 2099, 2088, 2086, 2096, 2089, 2076, 2088,
-     2085, 2082, 2089, 2079, 2080, 2081, 2083, 2086, 2090, 2093,
-     2095, 2097, 2087, 2098, 2100, 2093, 2095, 2090, 2099, 2096,
-     2101, 2101, 2104, 2100, 2102, 2107, 2097, 2108, 2093, 2103,
-     2103, 2098, 2105, 2102, 2106,   18, 2105, 2109, 2107, 2106,
-
-     2110, 2104, 2109, 2109, 2111, 2112, 2110, 2113, 2112, 2108,
-     2111, 2114, 2117, 2117, 2119, 2113, 2122, 2118, 2118, 2120,
-     2120, 2121, 2121, 2119, 2123, 2125,   17, 2124, 2122, 2132,
-     2125, 2114, 2118, 2124, 2126, 2126, 2127, 2127, 2134, 2128,
-     2129, 2131, 2123, 2118, 2128, 2131, 2129, 2133, 2136, 2132,
-     2137, 2133, 2138, 2139, 2140, 2137, 2141, 2143, 2134, 2140,
-     2142, 2144, 2145, 2146, 2146, 2147, 2144, 2148, 2139, 2147,
-     2150, 2151, 2155, 2136, 2141, 2138, 2142, 2143, 2149, 2152,
-     2153, 2154, 2148, 2149, 2145, 2155, 2154, 2156, 2160, 2151,
-     2159, 2152, 2157, 2157, 2161, 2162, 2150, 2163, 2159, 2153,
-
-     2164, 2165, 2166, 2167, 2171, 2156, 2172, 2160, 2169, 2173,
-     2174, 2176, 2174, 2161, 2166, 2173, 2176, 2171, 2162, 2164,
-     2172, 2163, 2165, 2169, 2167, 2175, 2175, 2177, 2178, 2179,
-     2177, 2180, 2181, 2181, 2182, 2182, 2183, 2185, 2183, 2184,
-     2184, 2178, 2186, 2179, 2180, 2187, 2187, 2188, 2189, 2189,
-     2190, 2190, 2185, 2191, 2194, 2186, 2188, 2193, 2191, 2188,
-     2195, 2196, 2193, 2197, 2197, 2198, 2198, 2199, 2200, 2200,
-     2201, 2202, 2202, 2196, 2194, 2203, 2204, 2205, 2205, 2207,
-     2195, 2204, 2206, 2206, 2209, 2208, 2199, 2210, 2201, 2214,
-     2203, 2212, 2216, 2207, 2208,    0, 2212, 2217, 2209, 2213,
-
-     2213, 2215, 2215, 2217, 2218, 2221, 2210, 2218, 2214, 2226,
-     2216, 2219, 2219, 2220, 2220, 2222, 2223, 2225, 2223, 2227,
-     2227, 2229, 2230, 2231, 2221, 2232, 2240, 2219, 2226, 2232,
-     2222, 2234, 2225, 2233, 2233, 2235, 2236, 2237, 2231, 2242,
-     2235, 2229, 2239, 2239, 2243, 2230, 2240, 2241, 2244, 2245,
-     2234, 2236, 2237, 2242, 2241, 2246, 2246, 2248, 2247, 2248,
-     2249, 2252, 2243, 2249, 2251, 2255, 2244, 2247, 2256, 2253,
-     2251, 2254, 2257, 2252, 2253, 2245, 2254, 2258, 2249, 2259,
-     2249, 2256, 2258, 2261, 2262, 2263, 2264, 2265, 2261, 2262,
-     2255, 2266, 2264, 2257, 2267, 2269, 2268, 2266, 2270, 2267,
-
-     2263, 2268, 2281, 2271, 2272, 2259, 2271, 2273, 2265, 2274,
-     2275, 2270, 2276, 2272,    0, 2277, 2273, 2278, 2274, 2275,
-     2269, 2277, 2281, 2278, 2279, 2283, 2276, 2285, 2279, 2284,
-     2284, 2286, 2286, 2285, 2283, 2288, 2287, 2290, 2291, 2294,
-     2286, 2287, 2292, 2292, 2293, 2297, 2296, 2298, 2294, 2301,
-     2303, 2299, 2301, 2290, 2291, 2288, 2304, 2288, 2296, 2293,
-     2302, 2297, 2298, 2299, 2310, 2302, 2305, 2305, 2304, 2310,
-     2303, 2306, 2306, 2308, 2308, 2309, 2311, 2312, 2309, 2313,
-     2314, 2314, 2311, 2312, 2315, 2316, 2316, 2317, 2313, 2318,
-     2319, 2320, 2320, 2322, 2321, 2329, 2323,    0, 2315, 2317,
-
-     2321, 2323, 2325, 2318, 2329, 2326, 2325, 2322, 2326, 2319,
-     2327, 2327, 2328, 2330, 2331, 2332, 2334, 2328, 2336, 2332,
-     2333, 2333, 2330, 2336, 2337, 2338, 2339, 2340, 2341, 2334,
-     2342, 2340, 2343, 2344, 2331, 2342, 2345, 2346, 2343, 2344,
-     2339, 2347, 2348, 2349, 2337, 2338, 2351, 2348, 2341, 2352,
-     2353, 2354, 2363, 2355, 2345, 2353, 2346, 2354, 2351, 2360,
-     2347, 2355, 2358, 2367, 2349, 2352, 2356, 2367, 2356, 2361,
-     2361, 2358, 2362, 2360, 2368, 2362, 2364, 2364, 2363, 2369,
-     2368, 2370, 2370, 2371, 2374, 2374, 2376, 2378, 2382, 2379,
-     2383, 2369, 2371, 2382, 2384, 2385, 2386, 2386, 2392, 2384,
-
-     2385, 2378, 2388, 2388, 2376, 2379, 2390, 2391, 2391, 2393,
-     2394, 2396, 2390, 2398, 2392, 2394, 2383, 2397, 2400, 2400,
-     2397, 2399, 2403, 2402, 2404, 2398, 2405, 2409, 2403, 2410,
-     2396, 2393, 2402, 2399, 2407, 2407, 2408, 2412, 2412, 2408,
-     2414, 2405, 2404, 2413, 2413, 2414, 2409, 2410, 2415, 2416,
-     2417, 2418, 2421, 2418, 2419, 2417, 2420, 2422, 2416, 2423,
-     2424, 2489, 2422, 2489, 2421,    0, 2415, 2425, 2419, 2431,
-     2420, 2430, 2425, 2426, 2426, 2427, 2427, 2428, 2428, 2423,
-     2424, 2429, 2429, 2430, 2432, 2433, 2433, 2431, 2435, 2432,
-     2434, 2434, 2436, 2437, 2438, 2439, 2439, 2440, 2441, 2441,
-
-     2435, 2442, 2442, 2443, 2436, 2444, 2446, 2447, 2445, 2449,
-     2438, 2450, 2453, 2437, 2443, 2445, 2440, 2444, 2446, 2448,
-     2451, 2451, 2454, 2452, 2448, 2456, 2455, 2447, 2458, 2449,
-     2457, 2450, 2452, 2459, 2459, 2461, 2460, 2462, 2453, 2455,
-     2458, 2464, 2454, 2465, 2457, 2460, 2466, 2468, 2467, 2456,
-     2461, 2467, 2462, 2469,    0, 2470, 2471, 2471, 2469, 2464,
-     2470, 2468, 2472, 2472, 2478, 2465, 2473, 2473, 2479, 2466,
-     2475, 2475, 2477, 2477, 2480, 2481, 2483, 2484, 2485, 2479,
-     2487, 2486, 2478, 2488, 2490, 2493, 2493, 2491, 2492, 2487,
-     2481, 2495, 2495, 2480, 2496, 2484, 2483, 2497, 2498, 2503,
-
-     2485, 2486, 2501, 2488, 2490, 2491, 2492, 2498, 2496, 2499,
-     2499, 2501, 2502, 2502, 2504, 2505, 2506, 2503, 2507, 2497,
-     2508, 2509, 2505, 2510, 2511, 2511, 2512, 2512, 2513, 2514,
-     2520, 2506, 2504, 2515, 2516, 2516, 2507, 2509, 2508, 2515,
-     2517, 2517, 2510, 2518, 2519, 2520, 2521, 2514, 2513, 2518,
-     2522, 2523, 2524, 2525, 2526, 2527, 2523, 2527, 2532, 2526,
-     2528, 2528, 2519, 2535, 2522, 2521, 2529, 2534, 2529, 2530,
-     2530, 2536, 2524, 2525, 2537, 2538, 2534, 2532, 2539, 2543,
-     2538, 2540, 2535, 2536, 2544, 2545, 2545, 2544, 2546, 2547,
-     2548, 2548, 2551, 2549, 2537, 2550, 2551, 2553, 2539, 2543,
-
-     2540, 2554, 2556, 2546, 2549, 2554, 2558, 2547, 2555, 2555,
-     2550, 2559, 2553, 2560, 2563, 2556, 2561, 2561, 2564, 2565,
-     2567, 2558, 2571, 2565, 2566, 2566, 2563, 2564, 2568, 2568,
-     2569, 2559, 2570, 2560, 2572, 2569, 2573, 2580, 2571, 2567,
-     2582, 2570, 2574, 2574, 2579, 2579, 2572, 2581, 2581, 2583,
-     2587, 2584, 2585, 2582, 2586, 2586, 2573, 2589, 2589, 2580,
-     2584, 2585, 2583, 2592, 2593, 2587, 2594, 2595, 2592, 2593,
-     2596, 2597, 2595, 2598, 2601, 2599, 2602, 2604, 2596, 2603,
-     2594, 2602, 2598, 2599, 2603, 2605, 2605, 2606, 2606, 2601,
-     2597, 2608, 2604, 2607, 2607, 2609, 2610, 2611, 2608, 2612,
-
-     2609, 2613, 2614, 2614, 2615, 2612, 2613, 2616, 2617, 2617,
-     2618, 2618, 2616, 2621, 2610, 2611, 2622, 2622, 2623, 2615,
-     2625, 2623, 2624, 2627, 2626, 2625, 2621, 2624, 2624, 2626,
-     2628, 2629, 2631, 2630, 2632, 2629, 2628, 2627, 2630, 2633,
-     2634, 2631, 2635, 2638, 2636, 2640, 2637, 2633, 2635, 2632,
-     2636, 2637, 2640, 2641, 2642, 2638, 2644, 2642, 2641, 2646,
-     2647, 2634, 2648, 2649, 2646, 2647, 2650, 2656, 2644, 2651,
-     2652, 2652, 2653, 2657, 2661, 2650, 2649, 2658, 2651, 2657,
-     2648, 2653, 2662, 2658, 2663, 2656, 2664, 2664, 2665, 2666,
-     2667, 2668, 2670, 2661, 2672, 2665, 2669, 2669, 2674, 2667,
-
-     2675, 2677, 2662, 2663, 2675, 3182, 2668, 3182, 2666, 2672,
-     2678, 2670, 2676, 2676, 2679, 2680, 2678, 2682, 2674, 2683,
-     2679, 2680, 2681, 2681, 2683, 2682, 2677, 2685, 2686, 2688,
-     2689, 2691, 2692, 2689, 2690, 2688, 2685, 2695, 2690, 2694,
-     2694, 2686, 2696, 2696, 2705, 2691,    0, 2692, 2697, 2697,
-     2699, 2699, 2700, 2701, 2707, 2695, 2700, 2706, 2701, 2703,
-     2703, 2709, 2706, 2708, 2705, 2711, 2707, 2717, 2708, 2708,
-     2712, 2712, 2719, 2709, 2714, 2714, 2715, 2715, 2716, 2721,
-     2717, 2716, 2722, 2722, 2727, 2711, 2723, 2723, 2724, 2724,
-     2719, 2725, 2726, 2726, 2728, 2729, 2730, 2727, 2737, 2721,
-
-     2731, 2731, 2730, 2732, 2738, 2736, 2725, 2732, 2739, 2729,
-     2736, 2736, 2728, 2740, 2741, 2742, 2744, 2744, 2743, 2740,
-     2741, 2737, 2743, 2749, 2738, 2747, 2750, 2752, 2739, 2750,
-     2747, 2749, 2753, 2754, 2754, 2753, 2755, 2756, 2757, 2758,
-     2742, 2759, 2756, 2760, 2760, 2764, 2761, 2762, 2763, 2765,
-     2762, 2768, 2752, 2755, 2755, 2759, 2757, 2765, 2762, 2758,
-     2761, 2766, 2763, 2767, 2764, 2774, 2766, 2766, 2767, 2767,
-     2768, 2769, 2769, 2770, 2770, 2771, 2771, 2772, 2772, 2773,
-     2773, 2774, 2775, 2776, 2777, 2778, 2779, 2775, 2780, 2781,
-     2778, 2782, 2783, 2780, 2785, 2785, 2786, 2786, 2781, 2787,
-
-     2788, 2791, 2787, 2776, 2793, 2779, 2790, 2790, 2791, 2793,
-     2777, 2782, 2783, 2792, 2792, 2795, 2795, 2796, 2788, 2797,
-     2798, 2800, 2801, 2801, 2803, 2804, 2796, 2802, 2797, 2798,
-     2805, 2802, 2806, 2803, 2810, 2808, 2809, 2807, 2810, 2800,
-     2818, 2805, 2807, 2807, 2804, 2809, 2814, 2806, 2808, 2815,
-     2815, 2814, 2817, 2817, 2818, 2819, 2820, 2822, 2822, 2823,
-     2824, 2827, 2828, 2829, 2830, 2832, 2834, 2870, 2823, 2852,
-     2830, 2828, 2824, 2836, 2820, 2852, 2837, 2832, 2836, 2839,
-     2819, 2837, 2870, 2829, 2838, 2838, 2827, 2834, 2839, 2841,
-     2848, 2842, 2842, 2847, 2841, 2842, 2844, 2844, 2845, 2845,
-
-     2846, 2846, 2847, 2849, 2850, 2856, 2853, 2854, 2857, 2850,
-     2848, 2853, 2854, 2855, 2855, 2858, 2859, 2860, 2861, 2862,
-     2857, 2859, 2849, 2856, 2861, 2863, 2863, 2865, 2866, 2867,
-     2869, 2865, 2871, 2866, 2867, 2860, 2858, 2868, 2868, 2873,
-     2875, 2875, 2877, 2878, 2862, 2880, 2879, 2871, 2881, 2869,
-     2879, 2882, 2883, 2884, 2880, 2877, 2878, 2886, 2884, 2873,
-     2883, 2885, 2885, 2887, 2881, 2888, 2886, 2889, 2889, 2890,
-     2882, 2893, 2893, 2894, 2894, 2896, 2898, 2898, 2900, 2901,
-     2903, 2887, 2902, 2905, 2905, 2903, 2906, 2908, 2890, 2909,
-     2907, 2888, 2910, 2908, 2900, 2901, 2896, 2918, 2902, 2907,
-
-     2912, 2912, 2913, 2914, 2915, 2915, 2906, 2919, 2922, 2920,
-     2931, 2910, 2909, 2919, 2920, 2925, 2913, 2918, 2923, 2923,
-     2924, 2924, 2914, 2926, 2926, 2927, 2929, 2930, 2928, 2931,
-     2922, 2933, 2932, 2930, 2941, 2925, 2927, 2928, 2934, 2934,
-     2936, 2936, 2935, 2926, 2932, 2935, 2929, 2940, 2946, 2942,
-     2945, 2933, 2943, 2943, 2941, 2942, 2945, 2944, 2948, 2940,
-     2944, 2949, 2949, 2948, 2950, 2951, 2946, 2952, 2953, 2950,
-     2954, 2954, 2957, 2952, 2958, 2956, 2959, 2960, 2960, 2961,
-     2962,    0, 2963, 2967, 2951, 2953, 2953, 2956, 2967, 2959,
-     2957, 2963, 2965, 2965, 2966, 2966, 2962, 2968, 2961, 2958,
-
-     2969, 2970, 2970, 2971, 2971, 2969, 2972, 2972, 2973, 2974,
-     2975, 2968, 2976, 2978, 2978, 2981, 2975, 2976, 2983, 2984,
-     2985, 2973, 2986, 2986, 2988, 2988, 2989, 2990, 2992, 2991,
-     2993, 2994, 2994, 2998, 2981, 2974, 2995, 2995, 2997, 2993,
-     2983, 2984, 2985, 2991, 2997, 2999, 2990, 3007, 2992, 3000,
-     3003, 3003, 2989, 2998, 3000, 3005, 3005, 3006, 3009, 3008,
-     3010, 3007, 3006, 3014, 2999, 3008, 3011, 3011, 3010, 3012,
-     3009, 3015, 3016, 3017, 3012, 3018, 3020, 3016, 3021, 3022,
-     3023, 3018, 3026, 3014, 3020, 3017, 3025, 3028, 3027, 3029,
-     3031, 3015, 3032, 3036, 3029, 3031, 3033, 3021, 3026, 3022,
-
-     3023,    0, 3033, 3038, 3025, 3027, 3027, 3037, 3028, 3034,
-     3037, 3043, 3032, 3036, 3034, 3043, 3038, 3041, 3041, 3042,
-     3042, 3047, 3047, 3048, 3049, 3050, 3050, 3061, 3048, 3052,
-     3052, 3053, 3053, 3056, 3053, 3054, 3054, 3056, 3054, 3055,
-     3055, 3058, 3055, 3049, 3059, 3061, 3058, 3060, 3060, 3062,
-     3065, 3066, 3067, 3059, 3068, 3068, 3071, 3067, 3072, 3074,
-     3073, 3075, 3077, 3062, 3073, 3072, 3078,    0, 3074, 3082,
-     3065, 3066, 3079, 3079, 3083, 3078, 3075, 3080, 3080, 3083,
-     3077, 3071, 3081, 3081, 3082, 3084, 3085, 3086, 3087, 3088,
-     3089, 3085, 3085, 3086, 3084, 3090, 3091, 3084, 3092, 3094,
-
-     3090, 3091, 3093, 3093, 3088, 3094, 3095, 3096, 3096, 3097,
-     3097, 3089, 3095, 3087, 3098, 3099, 3105, 3092, 3102, 3102,
-     3099, 3104, 3104, 3108, 3108, 3105, 3109, 3109, 3116, 3098,
-     3110, 3110, 3111, 3111, 3112, 3112, 3113, 3113, 3114, 3114,
-     3115, 3115, 3118, 3119, 3119, 3121, 3120, 3122, 3126, 3124,
-     3128, 3118, 3125, 3125, 3116, 3120, 3127, 3121, 3129, 3129,
-     3130, 3134, 3128, 3126, 3131, 3131, 3136, 3122, 3124, 3127,
-     3135, 3137, 3137, 3135, 3140, 3130, 3138, 3140, 3141, 3134,
-     3143, 3142, 3144, 3146, 3141, 3143, 3145, 3148, 3149, 3156,
-     3153, 3173, 3136, 3148, 3138, 3142, 3152, 3149, 3165, 3146,
-
-     3152, 3144, 3176, 3165, 3145, 3153, 3166, 3168, 3179, 3166,
-     3169, 3169, 3170, 3170, 3173, 3156, 3171, 3171, 3174, 3175,
-     3168, 3177, 3176, 3175, 3181, 3180, 3183, 3174, 3186, 3181,
-     3185, 3179, 3184, 3184, 3187, 3177, 3180, 3188, 3189, 3190,
-     3191, 3183, 3197, 3185, 3192, 3193, 3194, 3186, 3203, 3191,
-     3193, 3202, 3187, 3188, 3190, 3195, 3192, 3196, 3196, 3198,
-     3195, 3210, 3197, 3189, 3198, 3202, 3205, 3194, 3203, 3204,
-     3204, 3206, 3206, 3207, 3207, 3205, 3208, 3208, 3209, 3209,
-     3210, 3211, 3212, 3213, 3214, 3212, 3215, 3216, 3213, 3214,
-     3217, 3218, 3219, 3220, 3221, 3221, 3217, 3222, 3220, 3223,
-
-     3223, 3211, 3216, 3226, 3219, 3218, 3225, 3225, 3227, 3228,
-     3228, 3215, 3232, 3230, 3235, 3235, 3237, 3222, 3226, 3236,
-     3236, 3238, 3241, 3239, 3237, 3240, 3242, 3227, 3230, 3239,
-     3232, 3240, 3243, 3244, 3245, 3245, 3241, 3250, 3244, 3242,
-     3238, 3247, 3247, 3251, 3254, 3253, 3256, 3257, 3254, 3258,
-     3262, 3243, 3257, 3261, 3259, 3262, 3260, 3263, 3250, 3253,
-     3264, 3264, 3263, 3251, 3267, 3268, 3256, 3259, 3258, 3260,
-     3269, 3271, 3261, 3270, 3270, 3272, 3271, 3273, 3273, 3277,
-     3274, 3272, 3275, 3268, 3267, 3274, 3276, 3275, 3278, 3269,
-     3281, 3276, 3280, 3280, 3278, 3281, 3282, 3282, 3277, 3284,
-
-     3285, 3286, 3287, 3284, 3288, 3289, 3290, 3291, 3286, 3293,
-     3293, 3289, 3295, 3295, 3298, 3296, 3299, 3297, 3300, 3285,
-     3291, 3287, 3297, 3288, 3296, 3290, 3303, 3296, 3301, 3301,
-     3305, 3300, 3302, 3298, 3307, 3299, 3312, 3302,    0, 3303,
-     3306, 3306, 3308, 3308, 3309, 3309, 3310, 3311, 3313, 3313,
-     3319, 3310, 3314, 3307, 3311, 3312, 3305, 3314, 3315, 3317,
-     3315, 3316, 3316, 3318, 3321, 3324, 3317, 3320, 3328, 3319,
-     3318, 3326, 3320, 3323, 3323, 3327, 3326, 3329, 3330, 3330,
-     3327, 3332, 3332, 3321, 3324, 3333, 3334, 3328, 3335, 3335,
-     3336, 3336, 3337, 3339, 3339, 3341, 3329, 3340, 3340, 3337,
-
-     3347, 3343, 3341, 3346, 3333, 3334, 3343, 3348, 3346, 3349,
-     3349, 3350, 3350,    0,    0,    0,    0,    0,    0, 3347,
-        0,    0,    0,    0,    0,    0, 3348, 3354, 3354, 3354,
-     3354, 3354, 3354, 3354, 3355, 3355, 3355, 3355, 3355, 3355,
-     3355, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3357, 3357,
-     3357, 3357, 3357, 3357, 3357, 3358, 3358, 3358, 3358, 3358,
-     3358, 3358, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3360,
-     3360, 3360, 3360, 3360, 3360, 3360, 3362, 3362,    0, 3362,
-     3362, 3362, 3362, 3363, 3363,    0,    0,    0, 3363, 3363,
-     3364, 3364,    0,    0, 3364,    0, 3364, 3365,    0,    0,
-
-        0,    0,    0, 3365, 3366, 3366,    0,    0,    0, 3366,
-     3366, 3367,    0,    0,    0,    0,    0, 3367, 3368, 3368,
-        0, 3368, 3368, 3368, 3368, 3369,    0,    0,    0,    0,
-        0, 3369, 3370, 3370,    0,    0,    0, 3370, 3370, 3371,
-     3371,    0, 3371, 3371, 3371, 3371, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
-     3353, 3353, 3353, 3353, 3353, 3353, 3353
+      321,  328,  322,  327,  324,  333,  331,  326,  336,  332,
+      333,  329,  337,  325,  330,  331,  335,  334,  169,  335,
+      334,  336,  334,  330,  337,  340,  330,  332,  340,  341,
+
+      341,  330,  330,  330,  330,  334,  339,  338,  334,  338,
+      338,  339,  339,  342,  343,  345,  346,  344,  347,  347,
+      354,  348,  349,  349,  345,  346,  348,  350,  350,  343,
+      342,  351,  352,  342,  344,  344,  353,  352,  355,  354,
+      356,  357,  358,  358,  360,  358,  351,  357,  353,  369,
+      369,  361,  363,  362,  358,  356,  361,  363,  355,  362,
+      364,  366,  375,  365,  360,  364,  365,  367,  365,  368,
+      367,  364,  388,  370,  410,  366,  371,  371,  368,  370,
+      372,  377,  375,  367,  376,  372,  367,  376,  367,  373,
+      373,  378,  373,  388,  379,  382,  377,  381,  373,  410,
+
+      381,  167,  373,  384,  385,  376,  378,  373,  379,  382,
+      373,  374,  374,  385,  374,  386,  381,  391,  384,  394,
+      386,  386,  389,  387,  390,  392,  391,  374,  396,  387,
+      374,  166,  374,  395,  374,  383,  387,  383,  383,  390,
+      393,  389,  396,  399,  392,  394,  393,  383,  383,  383,
+      383,  383,  397,  395,  383,  398,  400,  401,  397,  402,
+      398,  404,  397,  399,  402,  403,  406,  404,  405,  405,
+      407,  408,  401,  409,  411,  414,  400,  415,  398,  409,
+      403,  416,  407,  412,  417,  408,  406,  418,  412,  418,
+      411,  413,  413,  415,  413,  414,  420,  416,  417,  419,
+
+      420,  419,  419,  421,  422,  422,  423,  421,  424,  426,
+      425,  430,  428,  432,  427,  431,  164,  430,  432,  419,
+      428,  428,  421,  424,  431,  423,  425,  426,  427,  433,
+      434,  435,  428,  433,  428,  429,  436,  435,  437,  434,
+      429,  438,  440,  439,  437,  438,  439,  440,  429,  429,
+      441,  443,  429,  429,  442,  442,  429,  436,  444,  444,
+      445,  446,  447,  447,  443,  445,  448,  449,  450,  451,
+      441,  449,  448,  452,  446,  453,  454,  454,  452,  455,
+      453,  456,  457,  450,  458,  454,  459,  460,  465,  459,
+      451,  455,  460,  461,  462,  467,  458,  461,  463,  463,
+
+      457,  456,  464,  466,  466,  471,  462,  464,  472,  465,
+      469,  469,  473,  474,  475,  476,  472,  467,  477,  475,
+      479,  473,  481,  480,  486,  482,  471,  483,  484,  486,
+      477,  487,  490,  483,  474,  476,  488,  484,  479,  482,
+      479,  480,  481,  485,  488,  487,  490,  488,  489,  485,
+      491,  489,  492,  493,  494,  495,  496,  494,  492,  497,
+      498,  495,  499,  500,  497,  491,  501,  500,  505,  502,
+      496,  501,  503,  493,  504,  506,  509,  503,  511,  495,
+      510,  512,  498,  499,  502,  512,  515,  505,  506,  513,
+      504,  507,  507,  511,  516,  514,  509,  507,  516,  507,
+
+      514,  510,  515,  518,  517,  507,  520,  507,  513,  517,
+      507,  507,  521,  517,  519,  523,  524,  507,  518,  519,
+      522,  521,  520,  526,  525,  520,  522,  525,  527,  529,
+      523,  522,  524,  528,  528,  530,  530,  531,  532,  535,
+      533,  534,  534,  536,  537,  539,  526,  538,  527,  537,
+      532,  540,  531,  541,  529,  533,  538,  544,  535,  541,
+      543,  544,  546,  545,  539,  536,  540,  545,  546,  543,
+      547,  548,  549,  550,  551,  552,  553,  554,  566,  555,
+      553,  555,  547,  566,  557,  560,  548,  550,  562,  551,
+      554,  549,  557,  552,  558,  558,  559,  560,  561,  564,
+
+      562,  565,  559,  563,  561,  567,  563,  569,  567,  568,
+      162,  571,  581,  564,  570,  581,  565,  579,  568,  570,
+      570,  572,  572,  569,  571,  568,  573,  573,  568,  574,
+      575,  575,  576,  576,  577,  574,  578,  580,  579,  582,
+      577,  578,  578,  583,  582,  584,  586,  585,  587,  580,
+      585,  586,  589,  584,  588,  590,  589,  591,  593,  592,
+      594,  590,  583,  592,  595,  594,  596,  596,  597,  598,
+      599,  587,  600,  588,  602,  599,  593,  591,  595,  601,
+      603,  607,  604,  597,  605,  606,  603,  604,  606,  609,
+      598,  600,  610,  606,  602,  601,  606,  606,  605,  607,
+
+      608,  608,  613,  614,  611,  612,  616,  609,  610,  611,
+      612,  617,  616,  623,  618,  619,  613,  618,  614,  619,
+      617,  620,  621,  622,  624,  621,  620,  625,  622,  623,
+      626,  627,  628,  632,  625,  630,  627,  629,  629,  631,
+      633,  619,  624,  626,  630,  635,  634,  636,  638,  160,
+      642,  638,  628,  636,  632,  634,  633,  635,  631,  637,
+      639,  639,  643,  639,  640,  637,  641,  640,  642,  644,
+      645,  641,  646,  648,  644,  647,  643,  650,  646,  648,
+      647,  649,  651,  653,  649,  652,  654,  651,  655,  645,
+      652,  652,  656,  655,  657,  658,  653,  660,  656,  654,
+
+      659,  669,  650,  663,  658,  659,  663,  655,  655,  661,
+      661,  662,  665,  657,  664,  668,  668,  660,  662,  671,
+      664,  663,  666,  667,  665,  673,  669,  666,  667,  667,
+      670,  672,  670,  672,  674,  675,  676,  666,  671,  677,
+      678,  679,  680,  673,  685,  679,  678,  681,  682,  683,
+      684,  680,  674,  675,  687,  676,  685,  686,  688,  677,
+      687,  689,  681,  682,  690,  691,  692,  683,  695,  684,
+      693,  701,  686,  694,  696,  689,  690,  694,  688,  697,
+      698,  699,  704,  700,  691,  701,  695,  692,  700,  693,
+      696,  702,  702,  705,  707,  706,  704,  697,  698,  698,
+
+      699,  703,  708,  709,  710,  703,  706,  708,  707,  711,
+      712,  713,  705,  714,  715,  718,  713,  712,  719,  709,
+      714,  716,  711,  710,  717,  719,  716,  720,  721,  717,
+      722,  723,  725,  718,  724,  730,  720,  725,  715,  722,
+      724,  726,  721,  723,  726,  727,  728,  729,  731,  727,
+      730,  732,  733,  733,  734,  734,  729,  735,  735,  736,
+      728,  737,  731,  734,  736,  739,  741,  740,  743,  744,
+      737,  742,  732,  740,  745,  742,  746,  747,  749,  750,
+      743,  748,  746,  751,  739,  747,  741,  754,  748,  757,
+      760,  761,  745,  772,  744,  763,  749,  761,  770,  760,
+
+      764,  763,  754,  751,  750,  752,  757,  752,   85,  764,
+      752,  766,  765,  772,  752,  766,  770,  752,  767,  767,
+      768,  768,  769,  771,  752,  752,  773,  752,  765,  775,
+      776,  777,  773,  769,  780,  776,  778,  771,  774,  774,
+      774,  782,  774,  779,  781,  774,  782,  779,  781,  775,
+      774,  783,  777,  785,  778,  784,  774,  774,  780,  786,
+      784,  788,  787,  791,  781,  787,  788,  788,  785,  789,
+      783,  790,  790,  798,  792,  798,  789,  794,  791,  792,
+      793,  793,  794,  795,  786,  796,  795,  797,  797,  799,
+      796,  800,  801,  802,  804,  803,  801,  805,  805,  810,
+
+      806,  799,  804,  807,  808,  808,  809,  811,  814,  814,
+      800,  810,  812,  802,  803,  806,  813,  807,  812,  819,
+      815,  813,  817,  825,  809,  815,  815,  817,  818,  811,
+      820,  825,  821,  822,  818,  824,  820,  821,  819,  822,
+      823,  824,  828,  823,  826,  826,  827,  827,  829,  830,
+      828,  831,  832,  833,  830,  834,  835,  835,  831,  836,
+      838,  838,  840,  837,  844,  850,  829,  839,  836,  833,
+      832,  837,  845,  839,  834,  842,  843,  845,  846,  847,
+      849,  840,  847,  851,  842,  843,  848,  846,  844,  852,
+      850,  848,  851,  853,  849,  854,  854,  855,  853,  853,
+
+      856,  857,  852,  858,  859,  860,  867,  862,  860,  862,
+      857,  864,  855,  863,  863,  865,  860,  866,  869,  856,
+      865,  868,  859,  870,  871,  872,  867,  858,  874,  876,
+      873,  875,  864,  871,  873,  876,  877,  878,  866,  879,
+      869,  868,  880,  870,  882,  877,  874,  881,  872,  878,
+      875,  883,  882,  881,  884,  886,  880,  887,  879,  884,
+      885,  885,  888,  889,  890,  883,  891,  892,  893,  895,
+      894,  888,  890,  896,  886,  895,  898,  887,  897,  896,
+      899,  900,  898,  889,  903,  901,  891,  893,  903,  892,
+      894,  901,  897,  902,  899,  904,  905,  906,  907,  902,
+
+      909,  900,  906,  908,  908,  910,  909,  911,  905,  912,
+      911,  910,  913,  915,  904,  914,  905,  916,  916,  907,
+      917,  914,  921,  918,  924,  913,  919,  912,  918,  919,
+      920,  923,  923,  915,  925,  920,  920,  921,  917,  922,
+      926,  927,  919,  922,  919,  926,  924,  929,  930,  933,
+      932,  934,  936,  936,  925,  937,  939,  939,  940,  937,
+      927,  941,  930,  932,  938,  941,  942,  962,  962,  933,
+      944,  929,  934,  935,  943,  944,  935,  945,  935,  938,
+      946,  942,  935,  940,  935,  946,  946,  947,  943,  935,
+      948,  945,  950,  949,  935,  951,  947,  949,  953,  952,
+
+      951,  954,  955,  953,  948,  956,  958,  950,  957,  949,
+      951,  952,  958,  959,  960,  954,  961,  957,  959,  956,
+      960,  963,  961,  955,  964,  965,  963,  966,  969,  970,
+      964,  967,  972,  975,  970,  973,  973,  974,  971,  976,
+      969,  975,  974,  977,  972,  980,  966,  965,  978,  967,
+      968,  968,  971,  979,  981,  976,  968,  977,  968,  983,
+      981,  980,  984,  982,  968,  985,  986,  978,  982,  968,
+      968,  983,  979,  987,  988,  988,  968,  990,  989,  992,
+      984,  985,  989,  993,  986,  992,  993,  994,  995,  996,
+      997,  987,  999,  995,  998, 1001,  997,  990, 1002,  998,
+
+     1003, 1005,  996, 1004, 1001, 1006,  994, 1002, 1007, 1004,
+     1005,  999, 1008, 1007, 1009, 1010, 1003, 1011, 1012, 1014,
+     1015, 1013, 1018, 1021, 1006, 1014, 1020, 1012, 1009, 1011,
+     1013, 1022, 1008, 1016, 1023, 1010, 1022, 1015, 1018, 1016,
+     1020, 1024, 1025, 1021, 1026, 1027, 1028, 1031, 1032,   80,
+     1027, 1028, 1031, 1023, 1035, 1024, 1036, 1032, 1034, 1026,
+     1025, 1033, 1033, 1035, 1034, 1037, 1039, 1040, 1045, 1044,
+     1046, 1036, 1040, 1040, 1043, 1042, 1042, 1043, 1037, 1042,
+     1047, 1048, 1039, 1044, 1049, 1050, 1046, 1051, 1045, 1052,
+     1053, 1050, 1054, 1058, 1048, 1052, 1055, 1054, 1047, 1049,
+
+     1057, 1059, 1061, 1057, 1060, 1053, 1059, 1051, 1062, 1060,
+     1055, 1063, 1065, 1067, 1058, 1064, 1063, 1062, 1061, 1067,
+     1064, 1068, 1069, 1070, 1065, 1071, 1071, 1072, 1069, 1070,
+     1073, 1074, 1075, 1075, 1074, 1076, 1072, 1068, 1077, 1078,
+     1079, 1080, 1083, 1079, 1081, 1082, 1085, 1083, 1073, 1091,
+     1081, 1082, 1085, 1076, 1080, 1084, 1086, 1077, 1087, 1078,
+     1084, 1086, 1089, 1090, 1087, 1092, 1097, 1089, 1093, 1091,
+     1095, 1092, 1098, 1093, 1094, 1094, 1096, 1099, 1101, 1095,
+     1099, 1090, 1102, 1100, 1097, 1096, 1100, 1102, 1103, 1101,
+     1104, 1098, 1105, 1106, 1107, 1108, 1109, 1110, 1110, 1106,
+
+     1107, 1109, 1104, 1111, 1112, 1113, 1103, 1114, 1115, 1116,
+     1108, 1105, 1115, 1118, 1117, 1119, 1121, 1113, 1112, 1122,
+     1122, 1123, 1111, 1117, 1126, 1114, 1124, 1116, 1125, 1123,
+     1129, 1124, 1118, 1125, 1128, 1121, 1131, 1130, 1132, 1134,
+     1119, 1131, 1133, 1133, 1126, 1129, 1135, 1132, 1128, 1130,
+     1136, 1137, 1135, 1138, 1141, 1139, 1136, 1139, 1138, 1134,
+     1140, 1142, 1144, 1145, 1143, 1140, 1146, 1137, 1141, 1143,
+     1147, 1148, 1151, 1146, 1152, 1142, 1153, 1144, 1150, 1150,
+     1155, 1154, 1145, 1156,   75, 1147, 1151, 1154, 1156, 1158,
+     1148, 1153, 1152, 1158, 1159, 1159, 1160, 1156, 1162, 1156,
+
+     1155, 1160, 1156, 1161, 1161, 1162, 1163, 1164, 1165, 1167,
+     1164, 1166, 1168, 1169, 1170,   74, 1171, 1168, 1167, 1172,
+     1163, 1171, 1174, 1173, 1176, 1176, 1170, 1165, 1179, 1166,
+     1177, 1178, 1169, 1172, 1173, 1177, 1178, 1180, 1182, 1181,
+     1183, 1174, 1180, 1181, 1184, 1185, 1186, 1182, 1179, 1188,
+     1187, 1189, 1190, 1191, 1192, 1183, 1188, 1196, 1186, 1184,
+     1193, 1194, 1195, 1189, 1185, 1187, 1193, 1197, 1195, 1198,
+     1199, 1190, 1192, 1200, 1191, 1202, 1194, 1196, 1198, 1201,
+     1203, 1204, 1205, 1206, 1208, 1199, 1209, 1197, 1205, 1211,
+     1208, 1201, 1200, 1210, 1202, 1212, 1204, 1211, 1213, 1214,
+
+     1215, 1209, 1217, 1206, 1214, 1203, 1218, 1210, 1281, 1219,
+     1281, 1216, 1215, 1222, 1213, 1212, 1216, 1216, 1220, 1220,
+     1218, 1217, 1219, 1221, 1221, 1223, 1222, 1224, 1221, 1225,
+     1225, 1221, 1221, 1224, 1223, 1226, 1221, 1228, 1227, 1229,
+     1226, 1232, 1221, 1228, 1229, 1230, 1221, 1227, 1231, 1231,
+     1230, 1233, 1233, 1234, 1235, 1236, 1234, 1237, 1234, 1238,
+     1239, 1240, 1232, 1237, 1241, 1242, 1240, 1245, 1238, 1243,
+     1244, 1249, 1245, 1236, 1235, 1243, 1244, 1246, 1241, 1247,
+     1239, 1246, 1248, 1242, 1260, 1249, 1255, 1248, 1247, 1250,
+     1250, 1251, 1251, 1247, 1251, 1247, 1252, 1247, 1254, 1247,
+
+     1256, 1255, 1254, 1257, 1258, 1259, 1260, 1252, 1261, 1258,
+     1258, 1262, 1257, 1261, 1259, 1263, 1264, 1265, 1256, 1266,
+     1267, 1268, 1268, 1269, 1263, 1262, 1267, 1270, 1272, 1271,
+     1273, 1269, 1275, 1266, 1271, 1264, 1265, 1274, 1276, 1273,
+     1277, 1270, 1272, 1279, 1274, 1277, 1278, 1278, 1280, 1280,
+     1275, 1283, 1284, 1285, 1283, 1286, 1288, 1284, 1279, 1287,
+     1287, 1289, 1289, 1276, 1286, 1290, 1290, 1292, 1291, 1293,
+     1294, 1294, 1285, 1291, 1295, 1296, 1288, 1297, 1298, 1299,
+     1297, 1300, 1301, 1303, 1306, 1299, 1300, 1302, 1292, 1302,
+     1293, 1301, 1296, 1305, 1295, 1307, 1305, 1308, 1298, 1306,
+
+     1307, 1303, 1309, 1311, 1310, 1313, 1312, 1309, 1311, 1312,
+     1313, 1308, 1310, 1314, 1314, 1315, 1316, 1317, 1318, 1319,
+     1315, 1321, 1322, 1317, 1323, 1318, 1324, 1321, 1322, 1323,
+     1325, 1324, 1319, 1326, 1316, 1327, 1325, 1328, 1329, 1329,
+     1330, 1332, 1326, 1333, 1335, 1334, 1332, 1336, 1328, 1337,
+     1338, 1339, 1340, 1344, 1327, 1334, 1338, 1339, 1340, 1335,
+     1330, 1333, 1342, 1343, 1345, 1347, 1346, 1336, 1342, 1348,
+     1349, 1349, 1337, 1344, 1350, 1351, 1353, 1343, 1346, 1347,
+     1352, 1353, 1355, 1343, 1345, 1354, 1354, 1348, 1356, 1358,
+     1359, 1360, 1361, 1356, 1350, 1359, 1359, 1363, 1352, 1362,
+
+     1351, 1361, 1364, 1365, 1367, 1355, 1369, 1362, 1358, 1360,
+     1368, 1363, 1368, 1367, 1366, 1373, 1375, 1364, 1365, 1366,
+     1369, 1365, 1366, 1371, 1372, 1374, 1373, 1376, 1372, 1371,
+     1374, 1374, 1377, 1378, 1379, 1375, 1380, 1381, 1378, 1379,
+     1382, 1383, 1385,   68, 1386, 1382, 1387, 1388, 1388, 1390,
+     1377, 1389, 1391, 1376, 1380, 1389, 1385, 1381, 1393, 1392,
+     1394, 1383, 1386, 1395, 1387, 1392, 1396, 1390, 1397, 1398,
+     1393, 1391, 1402, 1399, 1403, 1400, 1406, 1395, 1399, 1394,
+     1401, 1396, 1400, 1397, 1404, 1401, 1405, 1405, 1398, 1407,
+     1402, 1406, 1408, 1404, 1410, 1403, 1409, 1409, 1407, 1411,
+
+     1410, 1412, 1413, 1413, 1415, 1411, 1414, 1414, 1416, 1417,
+     1415, 1418, 1408, 1419, 1420, 1412, 1418, 1421, 1428, 1419,
+     1420, 1422, 1422, 1421, 1416, 1423, 1423, 1425, 1425, 1426,
+     1417, 1427, 1429, 1426, 1430, 1431, 1428, 1434, 1432, 1435,
+     1427, 1433, 1433, 1438, 1429, 1432, 1436, 1435, 1430, 1437,
+     1431, 1436, 1441, 1439, 1443, 1440, 1444, 1434, 1439, 1439,
+     1440, 1440, 1438, 1437, 1442, 1442, 1446, 1445, 1447, 1448,
+     1449, 1446, 1441, 1443, 1450, 1444, 1445, 1451, 1452, 1453,
+     1450, 1455, 1451, 1458, 1454, 1456, 1457, 1447, 1449, 1448,
+     1454, 1456, 1457, 1459, 1460, 1461, 1462, 1463, 1452, 1469,
+
+     1455, 1464, 1458, 1465, 1465, 1453, 1466, 1467, 1468, 1466,
+     1462, 1469, 1459, 1460, 1461, 1475, 1464, 1474, 1463, 1470,
+     1470, 1471, 1471, 1472, 1475, 1473, 1467, 1468, 1472, 1473,
+     1474, 1476, 1477, 1481, 1477, 1479, 1480, 1482, 1477, 1483,
+     1485, 1480, 1484, 1484, 1476, 1485, 1486, 1487, 1481, 1489,
+     1488, 1477, 1486, 1479, 1489, 1483, 1490, 1482, 1492, 1493,
+     1490, 1491, 1487, 1488, 1494, 1491, 1495, 1499, 1496, 1497,
+     1497, 1501,   63, 1494, 1496, 1502, 1505, 1493, 1492, 1516,
+     1502, 1503, 1503, 1504, 1511, 1499, 1495, 1507, 1507, 1504,
+     1509, 1512, 1501, 1509, 1510, 1510, 1505, 1515, 1514, 1516,
+
+     1511, 1514, 1517, 1518, 1519, 1519, 1520, 1512, 1521, 1522,
+     1523, 1517, 1524, 1525, 1525, 1523, 1526, 1527, 1515, 1528,
+     1529, 1520, 1530, 1518, 1532, 1526, 1524, 1540, 1522, 1521,
+     1531, 1531, 1533, 1535, 1528, 1527, 1534, 1538, 1532, 1536,
+     1536, 1534, 1530, 1537, 1541, 1529, 1544, 1537, 1535, 1540,
+     1533, 1539, 1539, 1542, 1543, 1545, 1548, 1538, 1543, 1548,
+     1545, 1547, 1547, 1541, 1542, 1544, 1549, 1550, 1551, 1552,
+     1554, 1553, 1550, 1556, 1555, 1557, 1557, 1558, 1563, 1549,
+     1559, 1560, 1558, 1563, 1551, 1553, 1562, 1552, 1555, 1554,
+     1554, 1561, 1561, 1564, 1565, 1562, 1565, 1566, 1556, 1567,
+
+     1559, 1560, 1566, 1568, 1569, 1567, 1571, 1572, 1572, 1573,
+     1569, 1574, 1577, 1564, 1576, 1578, 1578, 1574, 1580, 1576,
+     1571, 1579, 1579, 1568, 1581, 1582, 1583, 1585, 1573, 1583,
+     1584, 1584, 1580, 1587, 1586, 1595, 1577, 1589, 1588,   58,
+     1582, 1588, 1581, 1589, 1588, 1585, 1586, 1590, 1591, 1593,
+     1594, 1591, 1590, 1587, 1596, 1594, 1588, 1596, 1593, 1598,
+     1595, 1597, 1597, 1599, 1603, 1598, 1600, 1591, 1606, 1599,
+     1603, 1600, 1601, 1601, 1602, 1602, 1604, 1605, 1607, 1608,
+     1609, 1604, 1610, 1609, 1612, 1611, 1606, 1613, 1610, 1612,
+     1605, 1611, 1614, 1613, 1618, 1615, 1619, 1607, 1617, 1608,
+
+     1615, 1616, 1616, 1617, 1620, 1621, 1622, 1623, 1624, 1625,
+     1626, 1629, 1618, 1627, 1636, 1614, 1619, 1627, 1638, 1632,
+     1622, 1623, 1624, 1620, 1628, 1621, 1628, 1625, 1633, 1630,
+     1629, 1632, 1634, 1635, 1636, 1626, 1630, 1637, 1638, 1635,
+     1633, 1639, 1640, 1642, 1642, 1634, 1643, 1644, 1645, 1646,
+     1646, 1648, 1644, 1637, 1647, 1639, 1649, 1650, 1651, 1652,
+     1645, 1653, 1655, 1640, 1654, 1648, 1643, 1651, 1653, 1647,
+     1657, 1659,   57, 1654, 1652, 1650, 1654, 1663, 1655, 1660,
+     1649, 1664, 1660, 1661, 1661, 1657, 1662, 1662, 1665, 1663,
+     1657, 1665, 1666, 1666, 1667, 1668, 1659, 1669, 1670, 1664,
+
+     1671, 1670, 1669, 1672, 1673, 1671, 1674, 1667, 1675, 1676,
+     1677, 1678, 1679, 1679, 1668, 1674, 1680, 1678, 1676, 1677,
+     1673, 1676, 1672, 1682, 1681, 1683, 1684, 1675, 1685, 1690,
+     1686, 1687, 1691, 1685, 1685, 1686, 1680, 1681, 1694, 1683,
+     1693, 1682, 1684, 1687, 1692, 1692, 1695, 1694, 1696, 1696,
+     1691, 1695, 1697, 1698, 1690, 1699, 1693, 1700, 1698, 1701,
+     1702, 1697, 1704, 1696, 1697, 1702, 1702, 1705, 1706, 1707,
+     1709, 1710, 1710, 1699, 1707, 1708, 1704, 1701, 1700, 1711,
+     1713, 1708, 1705, 1717, 1712, 1711, 1714, 1715, 1709, 1712,
+     1706, 1718, 1714, 1715, 1713, 1719, 1720, 1721, 1722, 1724,
+
+     1721, 1719, 1726, 1717, 1722, 1718, 1721, 1724, 1727, 1720,
+     1728, 1729, 1731, 1730, 1732, 1733, 1729, 1734, 1728, 1735,
+     1737, 1726, 1730, 1732, 1739, 1731, 1737, 1727, 1733, 1736,
+     1736, 1734, 1738, 1735, 1740, 1740, 1741, 1739, 1738, 1742,
+     1743, 1744, 1744, 1746, 1747, 1745, 1748, 1749, 1752, 1746,
+     1753, 1736, 1751, 1751, 1753, 1754, 1741, 1742, 1745, 1743,
+     1754, 1755, 1748, 1759, 1756, 1749, 1747, 1757, 1752, 1756,
+     1758, 1761, 1757, 1763, 1762, 1764, 1763, 1765, 1767, 1758,
+     1769, 1755, 1761, 1762, 1766, 1766, 1759, 1764, 1768, 1770,
+     1770, 1771, 1765, 1776, 1772, 1773, 1774, 1767, 1777, 1769,
+
+     1768, 1772, 1779, 1778, 1780, 1771, 1786, 1773, 1774, 1778,
+     1781, 1786, 1776, 1791, 1779, 1791, 1781, 1793, 1777, 1782,
+     1782, 1783, 1780, 1787, 1783, 1784, 1784, 1788, 1789, 1789,
+     1790, 1792, 1787, 1788, 1792, 1794, 1795, 1793, 1796, 1797,
+     1798, 1799, 1790, 1800, 1797, 1798, 1801, 1802, 1804, 1803,
+     1799, 1807, 1802, 1810, 1795, 1800, 1796, 1794, 1803, 1806,
+     1805, 1801, 1808, 1808, 1806, 1805, 1807, 1809, 1804, 1812,
+     1813, 1803, 1805, 1809, 1810, 1814, 1815, 1816, 1817, 1816,
+     1818, 1818, 1819, 1819, 1820, 1820, 1821, 1824, 1812, 1813,
+     1825, 1814, 1817, 1835, 1817, 1838, 1815, 1822, 1822, 1823,
+
+     1823, 1826, 1826, 1827, 1828, 1832, 1821, 1827, 1824, 1829,
+     1828, 1825, 1829, 1831, 1833, 1838, 1834, 1841, 1835, 1831,
+     1833, 1834, 1836, 1832, 1839, 1836, 1837, 1837, 1842, 1839,
+     1840, 1840, 1841, 1843, 1844, 1845, 1845, 1846, 1843, 1844,
+     1847, 1848, 1846, 1849, 1850, 1851, 1847, 1853,   52, 1842,
+     1852, 1857, 1855, 1848, 1848, 1848, 1852, 1855, 1855, 1856,
+     1848, 1859, 1850, 1849, 1860, 1851, 1857, 1853, 1858, 1861,
+     1858, 1862, 1859, 1856, 1863, 1861, 1864, 1865, 1865, 1860,
+     1862, 1866, 1867, 1867, 1868, 1872, 1869, 1870, 1870, 1871,
+     1871, 1875, 1875, 1876, 1863, 1880, 1881, 1864, 1882, 1884,
+
+     1877, 1879, 1881, 1888, 1868, 1872, 1885, 1866, 1869, 1877,
+     1879, 1883, 1883, 1890, 1882, 1886, 1880, 1887, 1876, 1891,
+     1884, 1885, 1886, 1889, 1889, 1893, 1887, 1894, 1895, 1888,
+     1893, 1896, 1900, 1894, 1897, 1891, 1901, 1904, 1896, 1890,
+     1897, 1898, 1901, 1898, 1902, 1902, 1904, 1903, 1895, 1905,
+     1907, 1900, 1903, 1906, 1908, 1909, 1910, 1908, 1911, 1911,
+     1912, 1913, 1907, 1914, 1915, 1918, 1912, 1913, 1922, 1905,
+     1916, 1919, 1906, 1909, 1916, 1920, 1921, 1921, 1925, 1915,
+     1920, 1923, 1910, 1914, 1926, 1918, 1934, 1922, 1926, 1928,
+     1916, 1927, 1927, 1919, 1929, 1928, 1923, 1925, 1930, 1930,
+
+     1931, 1932, 1935, 1929, 1931, 1933, 1933, 1934, 1936, 1937,
+     1938, 1939, 1932, 1940, 1937, 1941, 1935, 1932, 1943, 1940,
+     1942, 1944, 1947, 1943, 1945, 1945, 1947, 1936, 1946, 1946,
+     1938, 1939, 1949, 1941, 1944, 1942, 1950, 1951, 1952, 1952,
+     1955, 1949, 1954, 1954, 1956, 1955, 1955, 1950, 1958, 1959,
+     1956, 1960, 1950, 1961, 1958, 1962, 1960, 1951, 1964, 1965,
+     1966, 1962, 1968, 1965, 1970, 1961, 1967, 1967, 1969, 1973,
+     1964, 1971, 1966, 1974, 1969, 1959, 1975, 1971, 1972, 1972,
+     1976, 1975, 1978, 1979, 1980, 1986, 1970, 1968, 1973, 1980,
+     1983, 1983, 1976, 1974, 1978, 1982, 1984, 1984, 1982, 1985,
+
+     1985, 1987, 1979, 1988, 1990, 1986, 1989, 1987, 1991, 1988,
+     1990, 1989, 1995, 1993, 1996, 1995, 1999, 1991, 1993, 1997,
+     1997, 2000, 2001, 2002, 2002, 2003, 1996, 2001, 1999, 2006,
+     2004, 2005, 2006, 2000, 2003, 2004, 2005, 2007, 2007, 2008,
+     2009, 2012, 2010, 2011, 2014, 2012, 2013, 2015, 2016, 2009,
+     2014, 2013, 2017, 2018, 2020, 2020, 2021, 2016, 2023, 2008,
+     2010, 2027, 2011, 2022, 2025, 2015, 2020, 2018, 2024, 2024,
+     2017, 2026, 2022, 2025, 2021, 2028, 2029, 2035, 2023, 2036,
+     2028, 2038, 2027, 2026, 2032, 2032, 2039, 2034, 2040, 2029,
+     2034, 2041, 2044, 2035, 2040, 2036, 2038, 2042, 2042, 2043,
+
+     2039, 2043, 2045, 2045, 2046, 2048, 2048, 2051, 2041, 2052,
+     2044, 2053, 2046, 2049, 2049, 2052, 2055, 2053, 2054, 2056,
+     2057, 2058, 2058, 2055, 2059, 2060, 2061, 2062, 2063, 2065,
+     2051, 2067, 2054, 2059, 2066, 2064, 2069, 2067, 2061, 2062,
+     2057, 2056, 2070, 2063, 2073, 2071, 2060, 2064, 2074, 2066,
+     2067, 2072, 2072, 2077, 2076, 2065, 2069, 2071, 2075, 2076,
+     2081, 2075, 2073, 2087, 2079, 2070, 2082, 2083, 2074, 2079,
+     2080, 2082, 2080, 2077, 2083, 2085, 2088, 2089, 2081, 2091,
+     2090, 2087, 2090, 2095, 2085, 2088, 2092, 2097, 2094, 2089,
+     2094, 2098, 2092, 2096, 2096, 2100, 2098, 2095, 2091, 2099,
+
+     2100, 2099, 2101, 2102, 2103, 2104, 2106, 2101, 2107, 2105,
+     2108, 2104, 2111, 2097, 2105, 2108, 2108, 2109, 2112, 2106,
+     2107, 2102, 2113, 2113, 2103, 2109, 2114, 2114, 2115, 2116,
+     2117, 2111, 2112, 2118, 2120, 2119, 2117, 2119, 2118, 2121,
+     2122, 2122, 2123, 2115, 2124, 2124, 2128, 2121, 2126, 2116,
+     2125, 2125, 2120, 2127, 2123, 2121, 2130, 2126, 2127, 2131,
+     2132, 2131, 2134, 2136, 2128, 2130, 2133, 2135, 2130, 2143,
+     2138, 2133, 2133, 2139, 2134, 2136, 2135, 2142, 2139, 2140,
+     2146, 2132, 2138, 2144, 2140, 2145, 2145, 2147, 2148, 2143,
+     2142, 2149, 2144, 2150, 2151, 2152, 2154, 2156, 2146, 2155,
+
+     2152, 2157, 2165, 2159, 2148, 2147, 2157, 2150, 2154, 2151,
+     2158, 2155, 2159, 2162, 2164, 2158, 2149, 2156, 2166, 2162,
+     2164, 2167, 2168, 2170, 2170, 2165, 2169, 2171, 2172, 2172,
+     2173, 2174, 2162, 2166, 2175, 2169, 2171, 2176, 2175, 2167,
+     2177, 2179, 2176, 2180, 2181, 2187, 2182, 2168, 2173, 2180,
+     2174, 2182, 2182, 2177, 2185, 2183, 2184, 2185, 2196, 2186,
+     2179, 2183, 2184, 2190, 2190, 2187, 2181, 2186, 2191, 2191,
+     2192, 2193, 2193, 2194, 2194, 2195, 2196, 2198, 2197, 2192,
+     2199, 2199, 2198, 2191, 2197, 2200, 2200, 2195, 2201, 2202,
+     2205, 2207, 2204, 2201, 2191, 2202, 2204, 2206, 2209, 2210,
+
+     2212, 2206, 2211, 2213, 2210, 2215, 2214, 2216, 2213, 2217,
+     2205, 2207, 2218, 2221, 2217, 2212, 2219, 2219, 2220, 2223,
+     2224, 2215, 2220, 2209, 2214, 2211, 2222, 2216, 2221, 2225,
+     2226, 2222, 2227, 2228, 2218, 2229, 2232, 2227, 2224, 2230,
+     2230, 2225, 2233, 2234, 2232, 2223, 2228, 2235, 2236, 2226,
+     2237, 2239, 2238, 2229, 2240, 2245, 2243, 2249, 2241, 2247,
+     2246, 2233, 2234, 2239, 2241, 2247, 2250, 2250, 2245, 2237,
+     2235, 2243, 2236, 2238, 2246, 2240, 2248, 2249, 2248, 2251,
+     2252, 2253, 2254, 2252, 2251, 2255, 2256, 2256, 2257, 2257,
+     2258, 2260, 2258,   47, 2253, 2261, 2254, 2269, 2255, 2259,
+
+     2259, 2262, 2262, 2263, 2264, 2264, 2260, 2270, 2261, 2265,
+     2265, 2266, 2263, 2268, 2271, 2263, 2266, 2269, 2268, 2272,
+     2272, 2273, 2273, 2274, 2275, 2275, 2271, 2270, 2276, 2277,
+     2277, 2279, 2278, 2280, 2280, 2282, 2279, 2281, 2281, 2283,
+     2284, 2285, 2274, 2286, 2290, 2288, 2276, 2278, 2283, 2282,
+     2288, 2289, 2289, 2291, 2291, 2285, 2292, 2284, 2293, 2295,
+     2295, 2297, 2286, 2290, 2293, 2294, 2296, 2296, 2294, 2298,
+     2299, 2301, 2299, 2302, 2292, 2295, 2303, 2303, 2305, 2306,
+     2297, 2307, 2310, 2308, 2298, 2311, 2301, 2308, 2309, 2309,
+     2311, 2312, 2302, 2313, 2315, 2315, 2307, 2316, 2305, 2318,
+
+     2317, 2310, 2306, 2319, 2320, 2321, 2312, 2317, 2313, 2322,
+     2322, 2323, 2324, 2318, 2324, 2325, 2328, 2316, 2325, 2327,
+     2323, 2319, 2320, 2331, 2329, 2327, 2332, 2330, 2328, 2329,
+     2333, 2321, 2330, 2325, 2335, 2325, 2334, 2337, 2338, 2332,
+     2339, 2334, 2337, 2338, 2340, 2342, 2341, 2343, 2331, 2345,
+     2340, 2333, 2341, 2344, 2345, 2339, 2346, 2347, 2348, 2344,
+     2335, 2346, 2343, 2350, 2349, 2351, 2342, 2349, 2352, 2353,
+     2354, 2348, 2350, 2355, 2351, 2356, 2357, 2352, 2353, 2355,
+     2357, 2356, 2347, 2359, 2354, 2361, 2362, 2363, 2363, 2366,
+     2364, 2365, 2365, 2367, 2367, 2362, 2364, 2368, 2366, 2369,
+
+     2365, 2371, 2368, 2359, 2372, 2361, 2373, 2373, 2374, 2375,
+     2377, 2378, 2380, 2379, 2384, 2386, 2386, 2371, 2375, 2369,
+     2372, 2369, 2377, 2374, 2380, 2383, 2382, 2378, 2379, 2382,
+     2383, 2385, 2387, 2387, 2384, 2389, 2389, 2390, 2396, 2391,
+     2390, 2392, 2393, 2385, 2391, 2394, 2398, 2392, 2393, 2395,
+     2395, 2399, 2396, 2400, 2394, 2397, 2397, 2402, 2398, 2401,
+     2401, 2403, 2404, 2402, 2406, 2399, 2407, 2404, 2406, 2407,
+     2408, 2408, 2400, 2409, 2410, 2403, 2411, 2412, 2409, 2415,
+     2413, 2414, 2414, 2410, 2413, 2411, 2417, 2418, 2419, 2420,
+     2421, 2417, 2415, 2422, 2421, 2423, 2424, 2412, 2425, 2427,
+
+     2423, 2428, 2424, 2420, 2425, 2426, 2426, 2418, 2419, 2429,
+     2430, 2431, 2434, 2422, 2435, 2430, 2436, 2427, 2432, 2432,
+     2428, 2436, 2441, 2437, 2434, 2438, 2443, 2446, 2429, 2437,
+     2435, 2441, 2431, 2438, 2439, 2452, 2439, 2444, 2444, 2445,
+     2443, 2450, 2445, 2447, 2447, 2450, 2451, 2452, 2453, 2453,
+     2454, 2459, 2451, 2446, 2457, 2457, 2461, 2462, 2465, 2454,
+     2466, 2467, 2468, 2465, 2470, 2470, 2469, 2468, 2476, 2459,
+     2461, 2469, 2474, 2462, 2472, 2472, 2475, 2475, 2474, 2477,
+     2478, 2480, 2467, 2482, 2476, 2478, 2466, 2481, 2484, 2484,
+     2481, 2483, 2487, 2486, 2488, 2482, 2489, 2493, 2487, 2494,
+
+     2480, 2477, 2486, 2483, 2491, 2491, 2492, 2496, 2496, 2492,
+     2498, 2489, 2488, 2497, 2497, 2498, 2493, 2494, 2499, 2500,
+     2501, 2502, 2505, 2502, 2503, 2501, 2504, 2506, 2500, 2507,
+     2508, 2546, 2506, 2546, 2505,   18, 2499, 2509, 2503, 2515,
+     2504, 2514, 2509, 2510, 2510, 2511, 2511, 2512, 2512, 2507,
+     2508, 2513, 2513, 2514, 2516, 2517, 2517, 2515, 2519, 2516,
+     2518, 2518, 2520, 2521, 2522, 2523, 2526, 2524, 2525, 2525,
+     2519, 2527, 2527, 2528, 2528, 2521, 2529, 2530, 2532, 2533,
+     2535, 2531, 2520, 2524, 2522, 2526, 2523, 2529, 2531, 2530,
+     2532, 2534, 2536, 2537, 2537, 2538, 2534, 2539, 2539, 2533,
+
+     2535, 2540, 2541, 2542, 2538, 2543, 2544, 2547, 2545, 2548,
+     2548, 2550, 2536, 2551, 2549, 2553, 2542, 2554, 2555, 2547,
+     2544, 2556, 2541, 2549, 2556, 2576, 2550, 2540, 2551, 2543,
+     2545, 2557, 2558, 2553, 2576, 2559, 2567, 2558, 2569, 2554,
+     2559, 2555, 2560, 2560, 2568, 2557, 2561, 2561, 2562, 2562,
+     2564, 2564, 2566, 2566, 2567, 2568, 2570, 2569, 2572, 2573,
+     2574, 2575, 2578, 2577, 2578, 2579, 2580, 2586, 2581, 2582,
+     2582, 2570, 2584, 2584, 2585, 2588, 2588, 2573, 2572, 2591,
+     2591, 2575, 2574, 2577, 2580, 2579, 2581, 2587, 2585, 2586,
+     2590, 2592, 2593, 2594, 2603, 2596, 2587, 2595, 2597, 2590,
+
+     2594, 2598, 2599,   17, 2600, 2601, 2601, 2602, 2602, 2592,
+     2593, 2600, 2595, 2596, 2603, 2604, 2597, 2598, 2605, 2607,
+     2607, 2599, 2608, 2608, 2605, 2609, 2610, 2611, 2612, 2613,
+     2614, 2609, 2615, 2604, 2616, 2614, 2617, 2618, 2620, 2618,
+     2620, 2617, 2611, 2613, 2610, 2619, 2619, 2612, 2621, 2621,
+     2623, 2625, 2615, 2626, 2616, 2627, 2628, 2629, 2630, 2631,
+     2625, 2632, 2629, 2630, 2635, 2636, 2638, 2627, 2636, 2623,
+     2637, 2637, 2626, 2639, 2640, 2640, 2628, 2641, 2642, 2631,
+     2632, 2638, 2643, 2645, 2635, 2646, 2643, 2648, 2641, 2646,
+     2650, 2639, 2651, 2642, 2647, 2647, 2652, 2655, 2645, 2656,
+
+     2648, 2653, 2653, 2657, 2659, 2650, 2663, 2657, 2656, 2655,
+     2658, 2658, 2651, 2660, 2660, 2661, 2652, 2662, 2664, 2665,
+     2661, 2672, 2663, 2659, 2666, 2666, 2662, 2671, 2671, 2674,
+     2664, 2673, 2673, 2675, 2680, 2676, 2677, 2681, 2678, 2665,
+     2679, 2679, 2674, 2672, 2676, 2677, 2675, 2678, 2683, 2683,
+     2686, 2687, 2681, 2688, 2680, 2686, 2687, 2689, 2690, 2691,
+     2692, 2695, 2689, 2693, 2699, 2697, 2690, 2688, 2698, 2692,
+     2697, 2693, 2702, 2698, 2700, 2700, 2695, 2702, 2691, 2699,
+     2701, 2701, 2703, 2704, 2704, 2705, 2706, 2707, 2708, 2709,
+        0, 2706, 2705, 2710, 2712, 2709, 2711, 2711, 2710, 2713,
+
+     2718, 2703, 2714, 2714, 2713, 2707, 2708, 2715, 2715, 2712,
+     2719, 2719, 2720, 2718, 2721, 2720, 2722, 2723, 2724, 2721,
+     2721, 2722, 2723, 2725, 2726, 2727, 2728, 2729, 2726, 2725,
+     2727, 2730, 2724, 2731, 2732, 2728, 2734, 2733, 2735, 2730,
+     2732, 2734, 2729, 2733, 2737, 2739, 2741, 2738, 2739, 2745,
+     2735, 2737, 2738, 2746, 2731, 2743, 2744, 2759, 2741, 2747,
+     2743, 2744, 2748, 2749, 2749, 2750, 2746, 2745, 2747, 2754,
+     2751, 2748, 2755, 2756, 2750, 2751, 2759, 2760, 2755, 2756,
+     2761, 2762, 2762, 2763, 2764, 2765, 2766, 2754, 2767, 2767,
+     2763, 2768, 2770, 2772, 2765, 2775, 2773, 2760, 2778, 2761,
+
+     2773, 2766, 2776, 2764, 2774, 2774, 2777, 2770, 2776, 2779,
+     2768, 2781, 2777, 2772, 2784, 2779, 2778, 2780, 2780, 2781,
+     2775, 2782, 2785, 2784, 2787, 2788, 2782, 2789, 2788, 2790,
+     2787, 2789, 2791, 2793, 2793, 2785, 2794, 2795, 2795, 2796,
+     2796, 2798, 2798, 2790, 2799, 2800, 2804, 2791, 2799, 2806,
+     2800, 2802, 2802, 2805, 2794, 2808, 2810, 2807, 2805, 2811,
+     2811, 2806, 2807, 2807, 2813, 2813, 2804, 2808, 2814, 2814,
+     2815, 2816, 2817, 2815, 2819, 2819, 2810, 2820, 2822, 2823,
+     2823, 2824, 2824, 2828, 2816, 2817, 2825, 2825, 2826, 2827,
+     2827, 2829, 2830, 2831, 2840, 2820, 2828, 2837, 2822, 2831,
+
+     2832, 2832, 2837, 2826, 2833, 2836, 2830, 2839, 2833, 2829,
+     2841, 2836, 2839, 2839, 2842, 2843, 2844, 2840, 2845, 2846,
+     2852, 2843, 2844, 2846, 2847, 2847, 2850, 2855, 2852, 2853,
+     2841, 2850, 2853, 2856, 2842, 2859, 2856, 2857, 2857, 2858,
+     2859, 2860, 2861, 2845, 2862, 2863, 2863, 2864, 2867, 2869,
+     2866, 2871, 2855, 2911, 2869, 2869, 2858, 2858, 2862, 2860,
+     2865, 2864, 2861, 2865, 2866, 2868, 2880, 2867, 2911, 2870,
+     2871, 2865, 2877, 2868, 2870, 2870, 2872, 2872, 2873, 2873,
+     2874, 2874, 2875, 2875, 2876, 2876, 2878, 2879, 2877, 2881,
+     2882, 2878, 2880, 2883, 2884, 2882, 2885, 2886, 2887, 2884,
+
+     2889, 2889, 2892, 2881, 2895, 2885,    0, 2879, 2890, 2890,
+     2891, 2895, 2883, 2891, 2894, 2894, 2905, 2886, 2887, 2897,
+     2892, 2896, 2896, 2900, 2897, 2899, 2899, 2901, 2902, 2903,
+     2906, 2906, 2900, 2908, 2905, 2907, 2901, 2902, 2903, 2907,
+     2909, 2910, 2908, 2912, 2913, 2914, 2915, 2924, 2912, 2912,
+     2915, 2919, 2910, 2923, 2914, 2925, 2919, 2913, 2929, 2909,
+     2920, 2920, 2922, 2922, 2927, 2927, 2928, 2923, 2932, 2933,
+     2929, 2934, 2924, 2925, 2933, 2928, 2936, 2937, 2939, 2941,
+     2934, 2943, 2944, 2937, 2945, 2945, 2943, 2944, 2946, 2948,
+     2939, 2949, 2950, 2932, 2948, 2957, 2936, 2946, 2951, 2951,
+
+     2941, 2958, 2951,    0, 2949, 2956, 2950, 2953, 2953, 2954,
+     2954, 2955, 2955, 2959, 2956, 2957, 2961, 2965, 2959, 2962,
+     2958, 2963, 2961, 2967, 2962, 2966, 2963, 2964, 2964, 2968,
+     2969, 2971, 2970, 2978, 2968, 2965,    0, 2966, 2970, 2972,
+     2972, 2974, 2975, 2979, 2967, 2974, 2976, 2975, 2969, 2977,
+     2977, 2976, 2978, 2980, 2982, 2989, 2971, 2986, 2979, 2984,
+     2984, 2988, 2987, 2990, 2989, 2988, 2991, 2993, 2980, 2992,
+     2986, 2994, 2993, 2996, 2982, 2987, 2997, 2992, 2998, 2990,
+     2995, 2995, 2996, 2999, 2999, 2991, 3000, 3003, 3003, 3004,
+     3004, 2994, 3006, 3010, 2997, 3008, 3008, 3012, 3011, 3013,
+
+     3017, 3014, 3012, 3018, 2998, 3000, 3014, 3016, 3016, 3010,
+     3019, 3020, 3018, 3006, 3011, 3013, 3019, 3021, 3023, 3023,
+     3017, 3024, 3025, 3026, 3026, 3029, 3030, 3033, 3031, 3034,
+     3034, 3036, 3030, 3031, 3020, 3024, 3021, 3035, 3035, 3037,
+     3039, 3025, 3038, 3038, 3040, 3029, 3036, 3041, 3042, 3033,
+     3043, 3039, 3044, 3040, 3042, 3045, 3046, 3046, 3047, 3037,
+     3048, 3055, 3038, 3048, 3044, 3049, 3054, 3041, 3049, 3043,
+     3050, 3050, 3060, 3047, 3056, 3045, 3057, 3057, 3054, 3058,
+     3056, 3055, 3058, 3059, 3063, 3063, 3062, 3064, 3065, 3059,
+     3060, 3062, 3064, 3066, 3067, 3068, 3068, 3070, 3071, 3066,
+
+     3072, 3073, 3074, 3074, 3075, 3076, 3077, 3065, 3081, 3070,
+     3082, 3067, 3067, 3081, 3073, 3077, 3071, 3079, 3079, 3080,
+     3080, 3076, 3083, 3075, 3082, 3072, 3088, 3083, 3084, 3084,
+     3085, 3085, 3086, 3086, 3087, 3087, 3089, 3090, 3096, 3088,
+     3091, 3093, 3093, 3090, 3098, 3091, 3099, 3101, 3100, 3102,
+     3102, 3104, 3104, 3105, 3106, 3108, 3107, 3096, 3110, 3110,
+     3111, 3111, 3089, 3109, 3114, 3113, 3098, 3100, 3099, 3101,
+     3107, 3113, 3109, 3106, 3115, 3108, 3116, 3119, 3126, 3105,
+     3124, 3116, 3120, 3120, 3114, 3122, 3122, 3123, 3127, 3125,
+     3126, 3133, 3123, 3115, 3124, 3125, 3127, 3129, 3119, 3128,
+
+     3128, 3131, 3129, 3132, 3134, 3131, 3136, 3135, 3132, 3137,
+     3140, 3133, 3135, 3139, 3141, 3137, 3142, 3144, 3136, 3151,
+        0, 3139, 3145, 3146, 3134, 3147, 3148, 3150, 3153, 3140,
+     3155, 3148, 3150, 3153, 3141, 3144, 3142, 3152, 3145, 3151,
+     3146, 3146, 3156, 3152, 3157, 3156, 3147, 3160, 3160, 3162,
+     3155, 3161, 3161, 3162, 3167, 3167, 3168, 3157, 3169, 3170,
+     3170, 3168, 3172, 3172, 3173, 3173, 3177, 3173, 3174, 3174,
+     3177, 3174, 3175, 3175, 3179, 3176, 3176, 3169, 3176, 3179,
+     3180, 3181, 3181, 3182, 3183, 3186, 3187, 3188, 3190, 3180,
+     3189, 3189, 3188, 3193, 3196, 3194, 3195, 3197, 3183, 3199,
+
+     3195, 3182, 3194, 3196, 3200, 3186, 3187, 3202, 3190, 3200,
+     3201, 3201, 3197, 3203, 3203, 3206, 3202, 3199, 3193, 3204,
+     3204, 3205, 3205, 3207, 3208, 3211, 3209, 3212, 3207, 3210,
+     3206, 3209, 3209, 3208, 3213, 3210, 3208, 3216, 3214, 3215,
+     3217, 3217, 3212, 3214, 3215, 3218, 3219, 3220, 3220, 3222,
+     3211, 3218, 3219, 3221, 3221, 3213, 3216, 3223, 3226, 3226,
+     3228, 3228, 3223, 3229, 3222, 3232, 3232, 3233, 3233, 3234,
+     3234, 3241, 3229, 3235, 3235, 3237, 3237, 3238, 3238, 3239,
+     3239, 3240, 3240, 3243, 3244, 3244, 3245, 3246, 3247, 3249,
+     3249, 3250, 3243, 3251, 3251, 3245, 3252, 3241, 3264, 3246,
+
+     3253, 3258, 3254, 3255, 3255, 3256, 3256, 3262, 3247, 3263,
+     3250, 3252, 3263, 3253, 3254, 3266, 3258, 3259, 3259, 3265,
+     3265, 3269, 3270, 3268, 3264, 3262, 3268, 3269, 3272, 3271,
+     3273, 3276, 3277, 3266, 3271, 3274, 3270, 3276, 3280, 3281,
+     3284, 3277, 3280, 3294, 3293, 3296, 3294, 3272, 3273, 3293,
+     3302, 3274, 3297, 3297, 3281, 3298, 3298, 3305, 3296, 3300,
+     3300, 3303, 3307, 3304, 3309, 3316, 3284, 3304, 3310, 3311,
+     3303, 3313, 3315, 3302, 3311, 3317, 3307, 3305, 3312, 3310,
+     3312, 3314, 3314, 3318, 3316, 3315, 3313, 3309, 3319, 3320,
+     3322, 3321, 3323, 3317, 3324, 3332, 3325, 3323, 3327, 3318,
+
+     3321, 3325, 3322, 3328, 3320, 3326, 3326, 3333, 3328, 3332,
+     3334, 3334, 3335, 3319, 3340, 3324, 3336, 3336, 3327, 3337,
+     3337, 3335, 3338, 3338, 3339, 3339, 3341, 3333, 3342, 3343,
+     3344, 3342, 3345, 3340, 3343, 3344, 3346, 3347, 3348, 3350,
+     3352, 3349, 3357, 3347, 3350, 3362, 3341, 3351, 3351, 3353,
+     3353, 3346, 3348, 3349, 3355, 3355, 3356, 3345, 3358, 3358,
+     3352, 3357, 3360, 3362, 3365, 3365, 3366, 3366, 3367, 3368,
+     3371, 3356, 3369, 3370, 3372, 3373, 3367, 3360, 3369, 3370,
+     3374, 3375, 3375, 3380, 3371, 3374, 3381, 3372, 3368, 3377,
+     3377, 3383, 3384, 3386, 3373, 3387, 3384, 3388, 3389, 3390,
+
+     3387, 3391, 3392, 3393, 3380, 3383, 3381, 3392, 3393, 3394,
+     3394, 3389, 3390, 3386, 3397, 3398, 3388, 3399, 3400, 3400,
+     3391, 3401, 3402, 3403, 3403, 3404, 3401, 3405, 3402, 3407,
+     3404, 3408, 3405, 3398, 3397, 3406, 3399, 3408, 3410, 3410,
+     3406, 3411, 3412, 3412, 3415, 3414, 3411, 3416, 3407, 3414,
+     3417, 3418, 3419, 3420, 3416, 3421, 3423, 3423, 3419, 3425,
+     3425, 3427, 3426, 3415, 3428, 3429, 3427, 3430, 3421, 3417,
+     3418, 3426, 3420, 3432, 3426, 3431, 3431, 3433, 3432, 3435,
+     3430, 3436, 3436, 3428, 3429, 3437, 3438, 3438, 3439, 3439,
+     3433, 3440, 3441, 3442, 3443, 3443, 3440, 3444, 3445, 3441,
+
+     3445, 3447, 3444, 3448, 3437, 3435, 3446, 3446, 3447, 3449,
+     3448, 3450, 3442, 3451, 3453, 3453, 3450, 3454, 3456, 3457,
+     3458, 3459, 3463, 3456, 3457, 3460, 3460, 3464, 3449, 3462,
+     3462,    0, 3451, 3465, 3465, 3467, 3454, 3466, 3466, 3458,
+     3459, 3463, 3467, 3469, 3469, 3471, 3464, 3470, 3470, 3473,
+     3476, 3477, 3471, 3478, 3473, 3476, 3479, 3479, 3480, 3480,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+     3477,    0, 3478, 3484, 3484, 3484, 3484, 3484, 3484, 3484,
+     3485, 3485, 3485, 3485, 3485, 3485, 3485, 3486, 3486, 3486,
+     3486, 3486, 3486, 3486, 3487, 3487, 3487, 3487, 3487, 3487,
+
+     3487, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3489, 3489,
+     3489, 3489, 3489, 3489, 3489, 3490, 3490, 3490, 3490, 3490,
+     3490, 3490, 3492, 3492,    0, 3492, 3492, 3492, 3492, 3493,
+     3493,    0,    0,    0, 3493, 3493, 3494, 3494,    0,    0,
+     3494,    0, 3494, 3495,    0,    0,    0,    0,    0, 3495,
+     3496, 3496,    0,    0,    0, 3496, 3496, 3497,    0,    0,
+        0,    0,    0, 3497, 3498, 3498,    0, 3498, 3498, 3498,
+     3498, 3499,    0,    0,    0,    0,    0, 3499, 3500, 3500,
+        0,    0,    0, 3500, 3500, 3501, 3501,    0, 3501, 3501,
+     3501, 3501, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483,
+     3483, 3483, 3483
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -3208,7 +3308,7 @@ static void config_end_include(void)
 #define YY_NO_INPUT 1
 #endif
 
-#line 3210 "<stdout>"
+#line 3310 "<stdout>"
 
 #define INITIAL 0
 #define quotedstring 1
@@ -3426,7 +3526,7 @@ YY_DECL
        {
 #line 211 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 
-#line 3428 "<stdout>"
+#line 3528 "<stdout>"
 
        while ( 1 )             /* loops until end-of-file is reached */
                {
@@ -3459,13 +3559,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 >= 3354 )
+                               if ( yy_current_state >= 3484 )
                                        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] != 6547 );
+               while ( yy_base[yy_current_state] != 6793 );
 
 yy_find_action:
                yy_act = yy_accept[yy_current_state];
@@ -3610,82 +3710,82 @@ YY_RULE_SETUP
 case 24:
 YY_RULE_SETUP
 #line 238 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) }
+{ YDVAR(1, VAR_MAX_REUSE_TCP_QUERIES) }
        YY_BREAK
 case 25:
 YY_RULE_SETUP
 #line 239 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) }
+{ YDVAR(1, VAR_TCP_REUSE_TIMEOUT) }
        YY_BREAK
 case 26:
 YY_RULE_SETUP
 #line 240 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_TCP_AUTH_QUERY_TIMEOUT) }
        YY_BREAK
 case 27:
 YY_RULE_SETUP
 #line 241 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) }
        YY_BREAK
 case 28:
 YY_RULE_SETUP
 #line 242 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
+{ YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) }
        YY_BREAK
 case 29:
 YY_RULE_SETUP
 #line 243 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
+{ YDVAR(1, VAR_SSL_UPSTREAM) }
        YY_BREAK
 case 30:
 YY_RULE_SETUP
 #line 244 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
+{ YDVAR(1, VAR_SSL_UPSTREAM) }
        YY_BREAK
 case 31:
 YY_RULE_SETUP
 #line 245 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
+{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
        YY_BREAK
 case 32:
 YY_RULE_SETUP
 #line 246 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_PORT) }
+{ YDVAR(1, VAR_SSL_SERVICE_KEY) }
        YY_BREAK
 case 33:
 YY_RULE_SETUP
 #line 247 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SSL_PORT) }
+{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
        YY_BREAK
 case 34:
 YY_RULE_SETUP
 #line 248 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
+{ YDVAR(1, VAR_SSL_SERVICE_PEM) }
        YY_BREAK
 case 35:
 YY_RULE_SETUP
 #line 249 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
+{ YDVAR(1, VAR_SSL_PORT) }
        YY_BREAK
 case 36:
 YY_RULE_SETUP
 #line 250 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_WIN_CERT) }
+{ YDVAR(1, VAR_SSL_PORT) }
        YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 251 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
+{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
        YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 252 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
+{ YDVAR(1, VAR_TLS_CERT_BUNDLE) }
        YY_BREAK
 case 39:
 YY_RULE_SETUP
 #line 253 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
+{ YDVAR(1, VAR_TLS_WIN_CERT) }
        YY_BREAK
 case 40:
 YY_RULE_SETUP
@@ -3695,1419 +3795,1464 @@ YY_RULE_SETUP
 case 41:
 YY_RULE_SETUP
 #line 255 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_SESSION_TICKET_KEYS) }
+{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
        YY_BREAK
 case 42:
 YY_RULE_SETUP
 #line 256 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_CIPHERS) }
+{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
        YY_BREAK
 case 43:
 YY_RULE_SETUP
 #line 257 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_CIPHERSUITES) }
+{ YDVAR(1, VAR_TLS_ADDITIONAL_PORT) }
        YY_BREAK
 case 44:
 YY_RULE_SETUP
 #line 258 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TLS_USE_SNI) }
+{ YDVAR(1, VAR_TLS_SESSION_TICKET_KEYS) }
        YY_BREAK
 case 45:
 YY_RULE_SETUP
 #line 259 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HTTPS_PORT) }
+{ YDVAR(1, VAR_TLS_CIPHERS) }
        YY_BREAK
 case 46:
 YY_RULE_SETUP
 #line 260 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_ENDPOINT) }
+{ YDVAR(1, VAR_TLS_CIPHERSUITES) }
        YY_BREAK
 case 47:
 YY_RULE_SETUP
 #line 261 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_MAX_STREAMS) }
+{ YDVAR(1, VAR_TLS_USE_SNI) }
        YY_BREAK
 case 48:
 YY_RULE_SETUP
 #line 262 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_QUERY_BUFFER_SIZE) }
+{ YDVAR(1, VAR_HTTPS_PORT) }
        YY_BREAK
 case 49:
 YY_RULE_SETUP
 #line 263 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_RESPONSE_BUFFER_SIZE) }
+{ YDVAR(1, VAR_HTTP_ENDPOINT) }
        YY_BREAK
 case 50:
 YY_RULE_SETUP
 #line 264 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_NODELAY) }
+{ YDVAR(1, VAR_HTTP_MAX_STREAMS) }
        YY_BREAK
 case 51:
 YY_RULE_SETUP
 #line 265 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HTTP_NOTLS_DOWNSTREAM) }
+{ YDVAR(1, VAR_HTTP_QUERY_BUFFER_SIZE) }
        YY_BREAK
 case 52:
 YY_RULE_SETUP
 #line 266 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSTEMD) }
+{ YDVAR(1, VAR_HTTP_RESPONSE_BUFFER_SIZE) }
        YY_BREAK
 case 53:
 YY_RULE_SETUP
 #line 267 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DO_DAEMONIZE) }
+{ YDVAR(1, VAR_HTTP_NODELAY) }
        YY_BREAK
 case 54:
 YY_RULE_SETUP
 #line 268 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_HTTP_NOTLS_DOWNSTREAM) }
        YY_BREAK
 case 55:
 YY_RULE_SETUP
 #line 269 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE) }
+{ YDVAR(1, VAR_USE_SYSTEMD) }
        YY_BREAK
 case 56:
 YY_RULE_SETUP
 #line 270 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
+{ YDVAR(1, VAR_DO_DAEMONIZE) }
        YY_BREAK
 case 57:
 YY_RULE_SETUP
 #line 271 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
+{ YDVAR(1, VAR_INTERFACE) }
        YY_BREAK
 case 58:
 YY_RULE_SETUP
 #line 272 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SO_RCVBUF) }
+{ YDVAR(1, VAR_INTERFACE) }
        YY_BREAK
 case 59:
 YY_RULE_SETUP
 #line 273 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SO_SNDBUF) }
+{ YDVAR(1, VAR_OUTGOING_INTERFACE) }
        YY_BREAK
 case 60:
 YY_RULE_SETUP
 #line 274 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SO_REUSEPORT) }
+{ YDVAR(1, VAR_INTERFACE_AUTOMATIC) }
        YY_BREAK
 case 61:
 YY_RULE_SETUP
 #line 275 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_TRANSPARENT) }
+{ YDVAR(1, VAR_SO_RCVBUF) }
        YY_BREAK
 case 62:
 YY_RULE_SETUP
 #line 276 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_FREEBIND) }
+{ YDVAR(1, VAR_SO_SNDBUF) }
        YY_BREAK
 case 63:
 YY_RULE_SETUP
 #line 277 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_DSCP) }
+{ YDVAR(1, VAR_SO_REUSEPORT) }
        YY_BREAK
 case 64:
 YY_RULE_SETUP
 #line 278 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CHROOT) }
+{ YDVAR(1, VAR_IP_TRANSPARENT) }
        YY_BREAK
 case 65:
 YY_RULE_SETUP
 #line 279 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_USERNAME) }
+{ YDVAR(1, VAR_IP_FREEBIND) }
        YY_BREAK
 case 66:
 YY_RULE_SETUP
 #line 280 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DIRECTORY) }
+{ YDVAR(1, VAR_IP_DSCP) }
        YY_BREAK
 case 67:
 YY_RULE_SETUP
 #line 281 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOGFILE) }
+{ YDVAR(1, VAR_CHROOT) }
        YY_BREAK
 case 68:
 YY_RULE_SETUP
 #line 282 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PIDFILE) }
+{ YDVAR(1, VAR_USERNAME) }
        YY_BREAK
 case 69:
 YY_RULE_SETUP
 #line 283 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_HINTS) }
+{ YDVAR(1, VAR_DIRECTORY) }
        YY_BREAK
 case 70:
 YY_RULE_SETUP
 #line 284 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STREAM_WAIT_SIZE) }
+{ YDVAR(1, VAR_LOGFILE) }
        YY_BREAK
 case 71:
 YY_RULE_SETUP
 #line 285 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
+{ YDVAR(1, VAR_PIDFILE) }
        YY_BREAK
 case 72:
 YY_RULE_SETUP
 #line 286 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
+{ YDVAR(1, VAR_ROOT_HINTS) }
        YY_BREAK
 case 73:
 YY_RULE_SETUP
 #line 287 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
+{ YDVAR(1, VAR_STREAM_WAIT_SIZE) }
        YY_BREAK
 case 74:
 YY_RULE_SETUP
 #line 288 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
+{ YDVAR(1, VAR_EDNS_BUFFER_SIZE) }
        YY_BREAK
 case 75:
 YY_RULE_SETUP
 #line 289 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
+{ YDVAR(1, VAR_MSG_BUFFER_SIZE) }
        YY_BREAK
 case 76:
 YY_RULE_SETUP
 #line 290 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
+{ YDVAR(1, VAR_MSG_CACHE_SIZE) }
        YY_BREAK
 case 77:
 YY_RULE_SETUP
 #line 291 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_TTL) }
+{ YDVAR(1, VAR_MSG_CACHE_SLABS) }
        YY_BREAK
 case 78:
 YY_RULE_SETUP
 #line 292 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SIZE) }
        YY_BREAK
 case 79:
 YY_RULE_SETUP
 #line 293 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHE_MIN_TTL) }
+{ YDVAR(1, VAR_RRSET_CACHE_SLABS) }
        YY_BREAK
 case 80:
 YY_RULE_SETUP
 #line 294 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_HOST_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_TTL) }
        YY_BREAK
 case 81:
 YY_RULE_SETUP
 #line 295 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_LAME_TTL) }
+{ YDVAR(1, VAR_CACHE_MAX_NEGATIVE_TTL) }
        YY_BREAK
 case 82:
 YY_RULE_SETUP
 #line 296 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
+{ YDVAR(1, VAR_CACHE_MIN_TTL) }
        YY_BREAK
 case 83:
 YY_RULE_SETUP
 #line 297 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
+{ YDVAR(1, VAR_INFRA_HOST_TTL) }
        YY_BREAK
 case 84:
 YY_RULE_SETUP
 #line 298 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
+{ YDVAR(1, VAR_INFRA_LAME_TTL) }
        YY_BREAK
 case 85:
 YY_RULE_SETUP
 #line 299 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
+{ YDVAR(1, VAR_INFRA_CACHE_SLABS) }
        YY_BREAK
 case 86:
 YY_RULE_SETUP
 #line 300 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INFRA_KEEP_PROBING) }
+{ YDVAR(1, VAR_INFRA_CACHE_NUMHOSTS) }
        YY_BREAK
 case 87:
 YY_RULE_SETUP
 #line 301 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
+{ YDVAR(1, VAR_INFRA_CACHE_LAME_SIZE) }
        YY_BREAK
 case 88:
 YY_RULE_SETUP
 #line 302 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
+{ YDVAR(1, VAR_INFRA_CACHE_MIN_RTT) }
        YY_BREAK
 case 89:
 YY_RULE_SETUP
 #line 303 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DELAY_CLOSE) }
+{ YDVAR(1, VAR_INFRA_KEEP_PROBING) }
        YY_BREAK
 case 90:
 YY_RULE_SETUP
 #line 304 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_CONNECT) }
+{ YDVAR(1, VAR_NUM_QUERIES_PER_THREAD) }
        YY_BREAK
 case 91:
 YY_RULE_SETUP
 #line 305 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
+{ YDVAR(1, VAR_JOSTLE_TIMEOUT) }
        YY_BREAK
 case 92:
 YY_RULE_SETUP
 #line 306 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
+{ YDVAR(1, VAR_DELAY_CLOSE) }
        YY_BREAK
 case 93:
 YY_RULE_SETUP
 #line 307 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
+{ YDVAR(1, VAR_UDP_CONNECT) }
        YY_BREAK
 case 94:
 YY_RULE_SETUP
 #line 308 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_GLUE) }
+{ YDVAR(1, VAR_TARGET_FETCH_POLICY) }
        YY_BREAK
 case 95:
 YY_RULE_SETUP
 #line 309 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
+{ YDVAR(1, VAR_HARDEN_SHORT_BUFSIZE) }
        YY_BREAK
 case 96:
 YY_RULE_SETUP
 #line 310 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
+{ YDVAR(1, VAR_HARDEN_LARGE_QUERIES) }
        YY_BREAK
 case 97:
 YY_RULE_SETUP
 #line 311 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
+{ YDVAR(1, VAR_HARDEN_GLUE) }
        YY_BREAK
 case 98:
 YY_RULE_SETUP
 #line 312 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
+{ YDVAR(1, VAR_HARDEN_DNSSEC_STRIPPED) }
        YY_BREAK
 case 99:
 YY_RULE_SETUP
 #line 313 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
+{ YDVAR(1, VAR_HARDEN_BELOW_NXDOMAIN) }
        YY_BREAK
 case 100:
 YY_RULE_SETUP
 #line 314 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+{ YDVAR(1, VAR_HARDEN_REFERRAL_PATH) }
        YY_BREAK
 case 101:
 YY_RULE_SETUP
 #line 315 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CAPS_WHITELIST) }
+{ YDVAR(1, VAR_HARDEN_ALGO_DOWNGRADE) }
        YY_BREAK
 case 102:
 YY_RULE_SETUP
 #line 316 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
+{ YDVAR(1, VAR_USE_CAPS_FOR_ID) }
        YY_BREAK
 case 103:
 YY_RULE_SETUP
 #line 317 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
        YY_BREAK
 case 104:
 YY_RULE_SETUP
 #line 318 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
+{ YDVAR(1, VAR_CAPS_WHITELIST) }
        YY_BREAK
 case 105:
 YY_RULE_SETUP
 #line 319 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH_KEY) }
+{ YDVAR(1, VAR_UNWANTED_REPLY_THRESHOLD) }
        YY_BREAK
 case 106:
 YY_RULE_SETUP
 #line 320 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PREFETCH) }
+{ YDVAR(1, VAR_PRIVATE_ADDRESS) }
        YY_BREAK
 case 107:
 YY_RULE_SETUP
 #line 321 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DENY_ANY) }
+{ YDVAR(1, VAR_PRIVATE_DOMAIN) }
        YY_BREAK
 case 108:
 YY_RULE_SETUP
 #line 322 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_STUB_ZONE) }
+{ YDVAR(1, VAR_PREFETCH_KEY) }
        YY_BREAK
 case 109:
 YY_RULE_SETUP
 #line 323 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_NAME) }
+{ YDVAR(1, VAR_PREFETCH) }
        YY_BREAK
 case 110:
 YY_RULE_SETUP
 #line 324 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_ADDR) }
+{ YDVAR(1, VAR_DENY_ANY) }
        YY_BREAK
 case 111:
 YY_RULE_SETUP
 #line 325 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_HOST) }
+{ YDVAR(0, VAR_STUB_ZONE) }
        YY_BREAK
 case 112:
 YY_RULE_SETUP
 #line 326 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_PRIME) }
+{ YDVAR(1, VAR_NAME) }
        YY_BREAK
 case 113:
 YY_RULE_SETUP
 #line 327 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_FIRST) }
+{ YDVAR(1, VAR_STUB_ADDR) }
        YY_BREAK
 case 114:
 YY_RULE_SETUP
 #line 328 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_NO_CACHE) }
+{ YDVAR(1, VAR_STUB_HOST) }
        YY_BREAK
 case 115:
 YY_RULE_SETUP
 #line 329 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_PRIME) }
        YY_BREAK
 case 116:
 YY_RULE_SETUP
 #line 330 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_STUB_FIRST) }
        YY_BREAK
 case 117:
 YY_RULE_SETUP
 #line 331 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_FORWARD_ZONE) }
+{ YDVAR(1, VAR_STUB_NO_CACHE) }
        YY_BREAK
 case 118:
 YY_RULE_SETUP
 #line 332 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_ADDR) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
        YY_BREAK
 case 119:
 YY_RULE_SETUP
 #line 333 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_HOST) }
+{ YDVAR(1, VAR_STUB_SSL_UPSTREAM) }
        YY_BREAK
 case 120:
 YY_RULE_SETUP
 #line 334 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_FIRST) }
+{ YDVAR(0, VAR_FORWARD_ZONE) }
        YY_BREAK
 case 121:
 YY_RULE_SETUP
 #line 335 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_NO_CACHE) }
+{ YDVAR(1, VAR_FORWARD_ADDR) }
        YY_BREAK
 case 122:
 YY_RULE_SETUP
 #line 336 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_HOST) }
        YY_BREAK
 case 123:
 YY_RULE_SETUP
 #line 337 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
+{ YDVAR(1, VAR_FORWARD_FIRST) }
        YY_BREAK
 case 124:
 YY_RULE_SETUP
 #line 338 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_AUTH_ZONE) }
+{ YDVAR(1, VAR_FORWARD_NO_CACHE) }
        YY_BREAK
 case 125:
 YY_RULE_SETUP
 #line 339 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_RPZ) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
        YY_BREAK
 case 126:
 YY_RULE_SETUP
 #line 340 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TAGS) }
+{ YDVAR(1, VAR_FORWARD_SSL_UPSTREAM) }
        YY_BREAK
 case 127:
 YY_RULE_SETUP
 #line 341 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) }
+{ YDVAR(0, VAR_AUTH_ZONE) }
        YY_BREAK
 case 128:
 YY_RULE_SETUP
 #line 342 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) }
+{ YDVAR(0, VAR_RPZ) }
        YY_BREAK
 case 129:
 YY_RULE_SETUP
 #line 343 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_LOG) }
+{ YDVAR(1, VAR_TAGS) }
        YY_BREAK
 case 130:
 YY_RULE_SETUP
 #line 344 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RPZ_LOG_NAME) }
+{ YDVAR(1, VAR_RPZ_ACTION_OVERRIDE) }
        YY_BREAK
 case 131:
 YY_RULE_SETUP
 #line 345 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_ZONEFILE) }
+{ YDVAR(1, VAR_RPZ_CNAME_OVERRIDE) }
        YY_BREAK
 case 132:
 YY_RULE_SETUP
 #line 346 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MASTER) }
+{ YDVAR(1, VAR_RPZ_LOG) }
        YY_BREAK
 case 133:
 YY_RULE_SETUP
 #line 347 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MASTER) }
+{ YDVAR(1, VAR_RPZ_LOG_NAME) }
        YY_BREAK
 case 134:
 YY_RULE_SETUP
 #line 348 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_URL) }
+{ YDVAR(1, VAR_ZONEFILE) }
        YY_BREAK
 case 135:
 YY_RULE_SETUP
 #line 349 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_ALLOW_NOTIFY) }
+{ YDVAR(1, VAR_MASTER) }
        YY_BREAK
 case 136:
 YY_RULE_SETUP
 #line 350 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
+{ YDVAR(1, VAR_MASTER) }
        YY_BREAK
 case 137:
 YY_RULE_SETUP
 #line 351 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FOR_UPSTREAM) }
+{ YDVAR(1, VAR_URL) }
        YY_BREAK
 case 138:
 YY_RULE_SETUP
 #line 352 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FALLBACK_ENABLED) }
+{ YDVAR(1, VAR_ALLOW_NOTIFY) }
        YY_BREAK
 case 139:
 YY_RULE_SETUP
 #line 353 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_VIEW) }
+{ YDVAR(1, VAR_FOR_DOWNSTREAM) }
        YY_BREAK
 case 140:
 YY_RULE_SETUP
 #line 354 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VIEW_FIRST) }
+{ YDVAR(1, VAR_FOR_UPSTREAM) }
        YY_BREAK
 case 141:
 YY_RULE_SETUP
 #line 355 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
+{ YDVAR(1, VAR_FALLBACK_ENABLED) }
        YY_BREAK
 case 142:
 YY_RULE_SETUP
 #line 356 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
+{ YDVAR(0, VAR_VIEW) }
        YY_BREAK
 case 143:
 YY_RULE_SETUP
 #line 357 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL) }
+{ YDVAR(1, VAR_VIEW_FIRST) }
        YY_BREAK
 case 144:
 YY_RULE_SETUP
 #line 358 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_ADDRESS) }
        YY_BREAK
 case 145:
 YY_RULE_SETUP
 #line 359 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
+{ YDVAR(1, VAR_DO_NOT_QUERY_LOCALHOST) }
        YY_BREAK
 case 146:
 YY_RULE_SETUP
 #line 360 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
+{ YDVAR(2, VAR_ACCESS_CONTROL) }
        YY_BREAK
 case 147:
 YY_RULE_SETUP
 #line 361 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
+{ YDVAR(1, VAR_SEND_CLIENT_SUBNET) }
        YY_BREAK
 case 148:
 YY_RULE_SETUP
 #line 362 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ZONE) }
        YY_BREAK
 case 149:
 YY_RULE_SETUP
 #line 363 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_ALWAYS_FORWARD) }
        YY_BREAK
 case 150:
 YY_RULE_SETUP
 #line 364 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) }
+{ YDVAR(1, VAR_CLIENT_SUBNET_OPCODE) }
        YY_BREAK
 case 151:
 YY_RULE_SETUP
 #line 365 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV4) }
        YY_BREAK
 case 152:
 YY_RULE_SETUP
 #line 366 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) }
+{ YDVAR(1, VAR_MAX_CLIENT_SUBNET_IPV6) }
        YY_BREAK
 case 153:
 YY_RULE_SETUP
 #line 367 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
+{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV4) }
        YY_BREAK
 case 154:
 YY_RULE_SETUP
 #line 368 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_IDENTITY) }
+{ YDVAR(1, VAR_MIN_CLIENT_SUBNET_IPV6) }
        YY_BREAK
 case 155:
 YY_RULE_SETUP
 #line 369 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_VERSION) }
+{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV4) }
        YY_BREAK
 case 156:
 YY_RULE_SETUP
 #line 370 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
+{ YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
        YY_BREAK
 case 157:
 YY_RULE_SETUP
 #line 371 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IDENTITY) }
+{ YDVAR(1, VAR_HIDE_IDENTITY) }
        YY_BREAK
 case 158:
 YY_RULE_SETUP
 #line 372 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VERSION) }
+{ YDVAR(1, VAR_HIDE_VERSION) }
        YY_BREAK
 case 159:
 YY_RULE_SETUP
 #line 373 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MODULE_CONF) }
+{ YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
        YY_BREAK
 case 160:
 YY_RULE_SETUP
 #line 374 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR) }
+{ YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) }
        YY_BREAK
 case 161:
 YY_RULE_SETUP
 #line 375 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
+{ YDVAR(1, VAR_IDENTITY) }
        YY_BREAK
 case 162:
 YY_RULE_SETUP
 #line 376 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_VERSION) }
        YY_BREAK
 case 163:
 YY_RULE_SETUP
 #line 377 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
+{ YDVAR(1, VAR_HTTP_USER_AGENT) }
        YY_BREAK
 case 164:
 YY_RULE_SETUP
 #line 378 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
+{ YDVAR(1, VAR_MODULE_CONF) }
        YY_BREAK
 case 165:
 YY_RULE_SETUP
 #line 379 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR) }
+{ YDVAR(1, VAR_DLV_ANCHOR) }
        YY_BREAK
 case 166:
 YY_RULE_SETUP
 #line 380 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
+{ YDVAR(1, VAR_DLV_ANCHOR_FILE) }
        YY_BREAK
 case 167:
 YY_RULE_SETUP
 #line 381 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_FILE) }
        YY_BREAK
 case 168:
 YY_RULE_SETUP
 #line 382 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
+{ YDVAR(1, VAR_AUTO_TRUST_ANCHOR_FILE) }
        YY_BREAK
 case 169:
 YY_RULE_SETUP
 #line 383 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
+{ YDVAR(1, VAR_TRUSTED_KEYS_FILE) }
        YY_BREAK
 case 170:
 YY_RULE_SETUP
 #line 384 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+{ YDVAR(1, VAR_TRUST_ANCHOR) }
        YY_BREAK
 case 171:
 YY_RULE_SETUP
 #line 385 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_BOGUS_TTL) }
+{ YDVAR(1, VAR_TRUST_ANCHOR_SIGNALING) }
        YY_BREAK
 case 172:
 YY_RULE_SETUP
 #line 386 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
+{ YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
        YY_BREAK
 case 173:
 YY_RULE_SETUP
 #line 387 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
+{ YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
        YY_BREAK
 case 174:
 YY_RULE_SETUP
 #line 388 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
        YY_BREAK
 case 175:
 YY_RULE_SETUP
 #line 389 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
+{ YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
        YY_BREAK
 case 176:
 YY_RULE_SETUP
 #line 390 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED) }
+{ YDVAR(1, VAR_VAL_MAX_RESTART) }
        YY_BREAK
 case 177:
 YY_RULE_SETUP
 #line 391 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
+{ YDVAR(1, VAR_BOGUS_TTL) }
        YY_BREAK
 case 178:
 YY_RULE_SETUP
 #line 392 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
+{ YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
        YY_BREAK
 case 179:
 YY_RULE_SETUP
 #line 393 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
+{ YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
        YY_BREAK
 case 180:
 YY_RULE_SETUP
 #line 394 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
+{ YDVAR(1, VAR_AGGRESSIVE_NSEC) }
        YY_BREAK
 case 181:
 YY_RULE_SETUP
 #line 395 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) }
+{ YDVAR(1, VAR_IGNORE_CD_FLAG) }
        YY_BREAK
 case 182:
 YY_RULE_SETUP
 #line 396 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_DSA) }
+{ YDVAR(1, VAR_SERVE_EXPIRED) }
        YY_BREAK
 case 183:
 YY_RULE_SETUP
 #line 397 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAKE_SHA1) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL) }
        YY_BREAK
 case 184:
 YY_RULE_SETUP
 #line 398 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_TTL_RESET) }
        YY_BREAK
 case 185:
 YY_RULE_SETUP
 #line 399 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_REPLY_TTL) }
        YY_BREAK
 case 186:
 YY_RULE_SETUP
 #line 400 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
+{ YDVAR(1, VAR_SERVE_EXPIRED_CLIENT_TIMEOUT) }
        YY_BREAK
 case 187:
 YY_RULE_SETUP
 #line 401 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
+{ YDVAR(1, VAR_SERVE_ORIGINAL_TTL) }
        YY_BREAK
 case 188:
 YY_RULE_SETUP
 #line 402 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ 
-                                 YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+{ YDVAR(1, VAR_FAKE_DSA) }
        YY_BREAK
 case 189:
 YY_RULE_SETUP
-#line 404 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_ADD_HOLDDOWN) }
+#line 403 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_FAKE_SHA1) }
        YY_BREAK
 case 190:
 YY_RULE_SETUP
-#line 405 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DEL_HOLDDOWN) }
+#line 404 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_VAL_LOG_LEVEL) }
        YY_BREAK
 case 191:
 YY_RULE_SETUP
-#line 406 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_KEEP_MISSING) }
+#line 405 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SIZE) }
        YY_BREAK
 case 192:
 YY_RULE_SETUP
-#line 407 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
+#line 406 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_KEY_CACHE_SLABS) }
        YY_BREAK
 case 193:
 YY_RULE_SETUP
-#line 408 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_USE_SYSLOG) }
+#line 407 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_NEG_CACHE_SIZE) }
        YY_BREAK
 case 194:
 YY_RULE_SETUP
-#line 409 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_IDENTITY) }
+#line 408 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ 
+                                 YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
        YY_BREAK
 case 195:
 YY_RULE_SETUP
 #line 410 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TIME_ASCII) }
+{ YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) }
        YY_BREAK
 case 196:
 YY_RULE_SETUP
 #line 411 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_QUERIES) }
+{ YDVAR(1, VAR_ZONEMD_CHECK) }
        YY_BREAK
 case 197:
 YY_RULE_SETUP
 #line 412 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_REPLIES) }
+{ YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) }
        YY_BREAK
 case 198:
 YY_RULE_SETUP
 #line 413 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
+{ YDVAR(1, VAR_ADD_HOLDDOWN) }
        YY_BREAK
 case 199:
 YY_RULE_SETUP
 #line 414 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
+{ YDVAR(1, VAR_DEL_HOLDDOWN) }
        YY_BREAK
 case 200:
 YY_RULE_SETUP
 #line 415 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOG_SERVFAIL) }
+{ YDVAR(1, VAR_KEEP_MISSING) }
        YY_BREAK
 case 201:
 YY_RULE_SETUP
 #line 416 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE) }
+{ YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
        YY_BREAK
 case 202:
 YY_RULE_SETUP
 #line 417 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA) }
+{ YDVAR(1, VAR_USE_SYSLOG) }
        YY_BREAK
 case 203:
 YY_RULE_SETUP
 #line 418 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
+{ YDVAR(1, VAR_LOG_IDENTITY) }
        YY_BREAK
 case 204:
 YY_RULE_SETUP
 #line 419 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
+{ YDVAR(1, VAR_LOG_TIME_ASCII) }
        YY_BREAK
 case 205:
 YY_RULE_SETUP
 #line 420 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
+{ YDVAR(1, VAR_LOG_QUERIES) }
        YY_BREAK
 case 206:
 YY_RULE_SETUP
 #line 421 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
+{ YDVAR(1, VAR_LOG_REPLIES) }
        YY_BREAK
 case 207:
 YY_RULE_SETUP
 #line 422 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
+{ YDVAR(1, VAR_LOG_TAG_QUERYREPLY) }
        YY_BREAK
 case 208:
 YY_RULE_SETUP
 #line 423 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
+{ YDVAR(1, VAR_LOG_LOCAL_ACTIONS) }
        YY_BREAK
 case 209:
 YY_RULE_SETUP
 #line 424 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_ENABLE) }
+{ YDVAR(1, VAR_LOG_SERVFAIL) }
        YY_BREAK
 case 210:
 YY_RULE_SETUP
 #line 425 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SHM_KEY) }
+{ YDVAR(2, VAR_LOCAL_ZONE) }
        YY_BREAK
 case 211:
 YY_RULE_SETUP
 #line 426 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_REMOTE_CONTROL) }
+{ YDVAR(1, VAR_LOCAL_DATA) }
        YY_BREAK
 case 212:
 YY_RULE_SETUP
 #line 427 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_ENABLE) }
+{ YDVAR(1, VAR_LOCAL_DATA_PTR) }
        YY_BREAK
 case 213:
 YY_RULE_SETUP
 #line 428 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_INTERFACE) }
+{ YDVAR(1, VAR_UNBLOCK_LAN_ZONES) }
        YY_BREAK
 case 214:
 YY_RULE_SETUP
 #line 429 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_PORT) }
+{ YDVAR(1, VAR_INSECURE_LAN_ZONES) }
        YY_BREAK
 case 215:
 YY_RULE_SETUP
 #line 430 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_USE_CERT) }
+{ YDVAR(1, VAR_STATISTICS_INTERVAL) }
        YY_BREAK
 case 216:
 YY_RULE_SETUP
 #line 431 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_KEY_FILE) }
+{ YDVAR(1, VAR_STATISTICS_CUMULATIVE) }
        YY_BREAK
 case 217:
 YY_RULE_SETUP
 #line 432 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_SERVER_CERT_FILE) }
+{ YDVAR(1, VAR_EXTENDED_STATISTICS) }
        YY_BREAK
 case 218:
 YY_RULE_SETUP
 #line 433 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
+{ YDVAR(1, VAR_SHM_ENABLE) }
        YY_BREAK
 case 219:
 YY_RULE_SETUP
 #line 434 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
+{ YDVAR(1, VAR_SHM_KEY) }
        YY_BREAK
 case 220:
 YY_RULE_SETUP
 #line 435 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PYTHON_SCRIPT) }
+{ YDVAR(0, VAR_REMOTE_CONTROL) }
        YY_BREAK
 case 221:
 YY_RULE_SETUP
 #line 436 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_PYTHON) }
+{ YDVAR(1, VAR_CONTROL_ENABLE) }
        YY_BREAK
 case 222:
 YY_RULE_SETUP
 #line 437 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DYNLIB_FILE) }
+{ YDVAR(1, VAR_CONTROL_INTERFACE) }
        YY_BREAK
 case 223:
 YY_RULE_SETUP
 #line 438 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_DYNLIB) }
+{ YDVAR(1, VAR_CONTROL_PORT) }
        YY_BREAK
 case 224:
 YY_RULE_SETUP
 #line 439 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DOMAIN_INSECURE) }
+{ YDVAR(1, VAR_CONTROL_USE_CERT) }
        YY_BREAK
 case 225:
 YY_RULE_SETUP
 #line 440 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
+{ YDVAR(1, VAR_SERVER_KEY_FILE) }
        YY_BREAK
 case 226:
 YY_RULE_SETUP
 #line 441 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
+{ YDVAR(1, VAR_SERVER_CERT_FILE) }
        YY_BREAK
 case 227:
 YY_RULE_SETUP
 #line 442 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
+{ YDVAR(1, VAR_CONTROL_KEY_FILE) }
        YY_BREAK
 case 228:
 YY_RULE_SETUP
 #line 443 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_MAX_UDP_SIZE) }
+{ YDVAR(1, VAR_CONTROL_CERT_FILE) }
        YY_BREAK
 case 229:
 YY_RULE_SETUP
 #line 444 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_PREFIX) }
+{ YDVAR(1, VAR_PYTHON_SCRIPT) }
        YY_BREAK
 case 230:
 YY_RULE_SETUP
 #line 445 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_SYNTHALL) }
+{ YDVAR(0, VAR_PYTHON) }
        YY_BREAK
 case 231:
 YY_RULE_SETUP
 #line 446 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
+{ YDVAR(1, VAR_DYNLIB_FILE) }
        YY_BREAK
 case 232:
 YY_RULE_SETUP
 #line 447 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DEFINE_TAG) }
+{ YDVAR(0, VAR_DYNLIB) }
        YY_BREAK
 case 233:
 YY_RULE_SETUP
 #line 448 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
+{ YDVAR(1, VAR_DOMAIN_INSECURE) }
        YY_BREAK
 case 234:
 YY_RULE_SETUP
 #line 449 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
+{ YDVAR(1, VAR_MINIMAL_RESPONSES) }
        YY_BREAK
 case 235:
 YY_RULE_SETUP
 #line 450 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
+{ YDVAR(1, VAR_RRSET_ROUNDROBIN) }
        YY_BREAK
 case 236:
 YY_RULE_SETUP
 #line 451 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
+{ YDVAR(1, VAR_UNKNOWN_SERVER_TIME_LIMIT) }
        YY_BREAK
 case 237:
 YY_RULE_SETUP
 #line 452 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
+{ YDVAR(1, VAR_MAX_UDP_SIZE) }
        YY_BREAK
 case 238:
 YY_RULE_SETUP
 #line 453 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
+{ YDVAR(1, VAR_DNS64_PREFIX) }
        YY_BREAK
 case 239:
 YY_RULE_SETUP
 #line 454 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_DNSTAP) }
+{ YDVAR(1, VAR_DNS64_SYNTHALL) }
        YY_BREAK
 case 240:
 YY_RULE_SETUP
 #line 455 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_ENABLE) }
+{ YDVAR(1, VAR_DNS64_IGNORE_AAAA) }
        YY_BREAK
 case 241:
 YY_RULE_SETUP
 #line 456 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) }
+{ YDVAR(1, VAR_DEFINE_TAG) }
        YY_BREAK
 case 242:
 YY_RULE_SETUP
 #line 457 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
+{ YDVAR(2, VAR_LOCAL_ZONE_TAG) }
        YY_BREAK
 case 243:
 YY_RULE_SETUP
 #line 458 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IP) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
        YY_BREAK
 case 244:
 YY_RULE_SETUP
 #line 459 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
        YY_BREAK
 case 245:
 YY_RULE_SETUP
 #line 460 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) }
+{ YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
        YY_BREAK
 case 246:
 YY_RULE_SETUP
 #line 461 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) }
+{ YDVAR(2, VAR_ACCESS_CONTROL_VIEW) }
        YY_BREAK
 case 247:
 YY_RULE_SETUP
 #line 462 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) }
+{ YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
        YY_BREAK
 case 248:
 YY_RULE_SETUP
-#line 464 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) }
+#line 463 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(0, VAR_DNSTAP) }
        YY_BREAK
 case 249:
 YY_RULE_SETUP
-#line 466 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
+#line 464 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_ENABLE) }
        YY_BREAK
 case 250:
 YY_RULE_SETUP
-#line 467 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
+#line 465 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_BIDIRECTIONAL) }
        YY_BREAK
 case 251:
 YY_RULE_SETUP
-#line 468 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
+#line 466 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
        YY_BREAK
 case 252:
 YY_RULE_SETUP
-#line 469 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSTAP_VERSION) }
+#line 467 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IP) }
        YY_BREAK
 case 253:
 YY_RULE_SETUP
-#line 470 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
+#line 468 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS) }
        YY_BREAK
 case 254:
 YY_RULE_SETUP
-#line 472 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
+#line 469 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS_SERVER_NAME) }
        YY_BREAK
 case 255:
 YY_RULE_SETUP
-#line 474 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
+#line 470 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_TLS_CERT_BUNDLE) }
        YY_BREAK
 case 256:
 YY_RULE_SETUP
-#line 476 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 471 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
-               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
+               YDVAR(1, VAR_DNSTAP_TLS_CLIENT_KEY_FILE) }
        YY_BREAK
 case 257:
 YY_RULE_SETUP
-#line 478 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 473 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
-               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
+               YDVAR(1, VAR_DNSTAP_TLS_CLIENT_CERT_FILE) }
        YY_BREAK
 case 258:
 YY_RULE_SETUP
-#line 480 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
+#line 475 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_IDENTITY) }
        YY_BREAK
 case 259:
 YY_RULE_SETUP
-#line 482 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
+#line 476 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_SEND_VERSION) }
        YY_BREAK
 case 260:
 YY_RULE_SETUP
-#line 483 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT) }
+#line 477 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_IDENTITY) }
        YY_BREAK
 case 261:
 YY_RULE_SETUP
-#line 484 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT) }
+#line 478 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSTAP_VERSION) }
        YY_BREAK
 case 262:
 YY_RULE_SETUP
-#line 485 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
+#line 479 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES) }
        YY_BREAK
 case 263:
 YY_RULE_SETUP
-#line 486 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SLABS) }
+#line 481 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES) }
        YY_BREAK
 case 264:
 YY_RULE_SETUP
-#line 487 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
+#line 483 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES) }
        YY_BREAK
 case 265:
 YY_RULE_SETUP
-#line 488 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_SIZE) }
+#line 485 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES) }
        YY_BREAK
 case 266:
 YY_RULE_SETUP
-#line 489 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
+#line 487 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES) }
        YY_BREAK
 case 267:
 YY_RULE_SETUP
-#line 490 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
+#line 489 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES) }
        YY_BREAK
 case 268:
 YY_RULE_SETUP
 #line 491 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_DISABLE_DNSSEC_LAME_CHECK) }
        YY_BREAK
 case 269:
 YY_RULE_SETUP
 #line 492 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
+{ YDVAR(1, VAR_IP_RATELIMIT) }
        YY_BREAK
 case 270:
 YY_RULE_SETUP
 #line 493 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_LOW_RTT) }
+{ YDVAR(1, VAR_RATELIMIT) }
        YY_BREAK
 case 271:
 YY_RULE_SETUP
 #line 494 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_NUM) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SLABS) }
        YY_BREAK
 case 272:
 YY_RULE_SETUP
 #line 495 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_RATELIMIT_SLABS) }
        YY_BREAK
 case 273:
 YY_RULE_SETUP
 #line 496 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_IP_RATELIMIT_SIZE) }
        YY_BREAK
 case 274:
 YY_RULE_SETUP
 #line 497 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
+{ YDVAR(1, VAR_RATELIMIT_SIZE) }
        YY_BREAK
 case 275:
 YY_RULE_SETUP
 #line 498 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
+{ YDVAR(2, VAR_RATELIMIT_FOR_DOMAIN) }
        YY_BREAK
 case 276:
 YY_RULE_SETUP
 #line 499 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP) }
+{ YDVAR(2, VAR_RATELIMIT_BELOW_DOMAIN) }
        YY_BREAK
 case 277:
 YY_RULE_SETUP
 #line 500 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
+{ YDVAR(1, VAR_IP_RATELIMIT_FACTOR) }
        YY_BREAK
 case 278:
 YY_RULE_SETUP
 #line 501 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_DNSCRYPT) }
+{ YDVAR(1, VAR_RATELIMIT_FACTOR) }
        YY_BREAK
 case 279:
 YY_RULE_SETUP
 #line 502 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
+{ YDVAR(1, VAR_LOW_RTT) }
        YY_BREAK
 case 280:
 YY_RULE_SETUP
 #line 503 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PORT) }
+{ YDVAR(1, VAR_FAST_SERVER_NUM) }
        YY_BREAK
 case 281:
 YY_RULE_SETUP
 #line 504 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
        YY_BREAK
 case 282:
 YY_RULE_SETUP
 #line 505 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
        YY_BREAK
 case 283:
 YY_RULE_SETUP
 #line 506 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
+{ YDVAR(1, VAR_FAST_SERVER_PERMIL) }
        YY_BREAK
 case 284:
 YY_RULE_SETUP
 #line 507 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
+{ YDVAR(2, VAR_RESPONSE_IP_TAG) }
        YY_BREAK
 case 285:
 YY_RULE_SETUP
 #line 508 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
+{ YDVAR(2, VAR_RESPONSE_IP) }
        YY_BREAK
 case 286:
 YY_RULE_SETUP
-#line 510 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{
-               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
+#line 509 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(2, VAR_RESPONSE_IP_DATA) }
        YY_BREAK
 case 287:
 YY_RULE_SETUP
-#line 512 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
+#line 510 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(0, VAR_DNSCRYPT) }
        YY_BREAK
 case 288:
 YY_RULE_SETUP
-#line 513 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
+#line 511 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_ENABLE) }
        YY_BREAK
 case 289:
 YY_RULE_SETUP
-#line 514 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES) }
+#line 512 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PORT) }
        YY_BREAK
 case 290:
 YY_RULE_SETUP
-#line 515 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
+#line 513 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER) }
        YY_BREAK
 case 291:
 YY_RULE_SETUP
-#line 516 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES) }
+#line 514 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_SECRET_KEY) }
        YY_BREAK
 case 292:
 YY_RULE_SETUP
-#line 517 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
+#line 515 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT) }
        YY_BREAK
 case 293:
 YY_RULE_SETUP
-#line 518 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
+#line 516 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_DNSCRYPT_PROVIDER_CERT_ROTATED) }
        YY_BREAK
 case 294:
 YY_RULE_SETUP
-#line 519 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
+#line 517 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE) }
        YY_BREAK
 case 295:
 YY_RULE_SETUP
-#line 520 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_HOOK) }
+#line 519 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{
+               YDVAR(1, VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS) }
        YY_BREAK
 case 296:
 YY_RULE_SETUP
 #line 521 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SIZE) }
        YY_BREAK
 case 297:
 YY_RULE_SETUP
 #line 522 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_DNSCRYPT_NONCE_CACHE_SLABS) }
        YY_BREAK
 case 298:
 YY_RULE_SETUP
 #line 523 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
+{ YDVAR(1, VAR_PAD_RESPONSES) }
        YY_BREAK
 case 299:
 YY_RULE_SETUP
 #line 524 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSECMOD_STRICT) }
+{ YDVAR(1, VAR_PAD_RESPONSES_BLOCK_SIZE) }
        YY_BREAK
 case 300:
 YY_RULE_SETUP
 #line 525 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_CACHEDB) }
+{ YDVAR(1, VAR_PAD_QUERIES) }
        YY_BREAK
 case 301:
 YY_RULE_SETUP
 #line 526 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_BACKEND) }
+{ YDVAR(1, VAR_PAD_QUERIES_BLOCK_SIZE) }
        YY_BREAK
 case 302:
 YY_RULE_SETUP
 #line 527 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
+{ YDVAR(1, VAR_IPSECMOD_ENABLED) }
        YY_BREAK
 case 303:
 YY_RULE_SETUP
 #line 528 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
+{ YDVAR(1, VAR_IPSECMOD_IGNORE_BOGUS) }
        YY_BREAK
 case 304:
 YY_RULE_SETUP
 #line 529 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
+{ YDVAR(1, VAR_IPSECMOD_HOOK) }
        YY_BREAK
 case 305:
 YY_RULE_SETUP
 #line 530 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
+{ YDVAR(1, VAR_IPSECMOD_MAX_TTL) }
        YY_BREAK
 case 306:
 YY_RULE_SETUP
 #line 531 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
        YY_BREAK
 case 307:
 YY_RULE_SETUP
 #line 532 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(0, VAR_IPSET) }
+{ YDVAR(1, VAR_IPSECMOD_WHITELIST) }
        YY_BREAK
 case 308:
 YY_RULE_SETUP
 #line 533 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V4) }
+{ YDVAR(1, VAR_IPSECMOD_STRICT) }
        YY_BREAK
 case 309:
 YY_RULE_SETUP
 #line 534 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_IPSET_NAME_V6) }
+{ YDVAR(0, VAR_CACHEDB) }
        YY_BREAK
 case 310:
 YY_RULE_SETUP
 #line 535 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+{ YDVAR(1, VAR_CACHEDB_BACKEND) }
        YY_BREAK
 case 311:
 YY_RULE_SETUP
 #line 536 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+{ YDVAR(1, VAR_CACHEDB_SECRETSEED) }
        YY_BREAK
 case 312:
 YY_RULE_SETUP
 #line 537 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
+{ YDVAR(1, VAR_CACHEDB_REDISHOST) }
        YY_BREAK
 case 313:
 YY_RULE_SETUP
 #line 538 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
+{ YDVAR(1, VAR_CACHEDB_REDISPORT) }
        YY_BREAK
 case 314:
 YY_RULE_SETUP
 #line 539 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ YDVAR(1, VAR_NSID ) }
+{ YDVAR(1, VAR_CACHEDB_REDISTIMEOUT) }
        YY_BREAK
 case 315:
-/* rule 315 can match eol */
 YY_RULE_SETUP
 #line 540 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
-{ LEXOUT(("NL\n")); cfg_parser->line++; }
+{ YDVAR(1, VAR_CACHEDB_REDISEXPIRERECORDS) }
        YY_BREAK
-/* Quoted strings. Strip leading and ending quotes */
 case 316:
 YY_RULE_SETUP
+#line 541 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(0, VAR_IPSET) }
+       YY_BREAK
+case 317:
+YY_RULE_SETUP
+#line 542 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_IPSET_NAME_V4) }
+       YY_BREAK
+case 318:
+YY_RULE_SETUP
 #line 543 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_IPSET_NAME_V6) }
+       YY_BREAK
+case 319:
+YY_RULE_SETUP
+#line 544 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM) }
+       YY_BREAK
+case 320:
+YY_RULE_SETUP
+#line 545 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(2, VAR_TCP_CONNECTION_LIMIT) }
+       YY_BREAK
+case 321:
+YY_RULE_SETUP
+#line 546 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(2, VAR_EDNS_CLIENT_STRING) }
+       YY_BREAK
+case 322:
+YY_RULE_SETUP
+#line 547 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_EDNS_CLIENT_STRING_OPCODE) }
+       YY_BREAK
+case 323:
+YY_RULE_SETUP
+#line 548 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ YDVAR(1, VAR_NSID ) }
+       YY_BREAK
+case 324:
+/* rule 324 can match eol */
+YY_RULE_SETUP
+#line 549 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+{ LEXOUT(("NL\n")); cfg_parser->line++; }
+       YY_BREAK
+/* Quoted strings. Strip leading and ending quotes */
+case 325:
+YY_RULE_SETUP
+#line 552 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { BEGIN(quotedstring); LEXOUT(("QS ")); }
        YY_BREAK
 case YY_STATE_EOF(quotedstring):
-#line 544 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 553 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
        if(--num_args == 0) { BEGIN(INITIAL); }
        else                { BEGIN(val); }
 }
        YY_BREAK
-case 317:
+case 326:
 YY_RULE_SETUP
-#line 549 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 558 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 318:
-/* rule 318 can match eol */
+case 327:
+/* rule 327 can match eol */
 YY_RULE_SETUP
-#line 550 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 559 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { yyerror("newline inside quoted string, no end \""); 
                          cfg_parser->line++; BEGIN(INITIAL); }
        YY_BREAK
-case 319:
+case 328:
 YY_RULE_SETUP
-#line 552 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 561 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         LEXOUT(("QE "));
        if(--num_args == 0) { BEGIN(INITIAL); }
@@ -5120,34 +5265,34 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* Single Quoted strings. Strip leading and ending quotes */
-case 320:
+case 329:
 YY_RULE_SETUP
-#line 564 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 573 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { BEGIN(singlequotedstr); LEXOUT(("SQS ")); }
        YY_BREAK
 case YY_STATE_EOF(singlequotedstr):
-#line 565 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 574 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
        if(--num_args == 0) { BEGIN(INITIAL); }
        else                { BEGIN(val); }
 }
        YY_BREAK
-case 321:
+case 330:
 YY_RULE_SETUP
-#line 570 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 579 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("STR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 322:
-/* rule 322 can match eol */
+case 331:
+/* rule 331 can match eol */
 YY_RULE_SETUP
-#line 571 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 580 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { yyerror("newline inside quoted string, no end '"); 
                             cfg_parser->line++; BEGIN(INITIAL); }
        YY_BREAK
-case 323:
+case 332:
 YY_RULE_SETUP
-#line 573 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 582 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         LEXOUT(("SQE "));
        if(--num_args == 0) { BEGIN(INITIAL); }
@@ -5160,38 +5305,38 @@ YY_RULE_SETUP
 }
        YY_BREAK
 /* include: directive */
-case 324:
+case 333:
 YY_RULE_SETUP
-#line 585 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 594 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { 
        LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include); }
        YY_BREAK
 case YY_STATE_EOF(include):
-#line 587 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 596 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         yyerror("EOF inside include directive");
         BEGIN(inc_prev);
 }
        YY_BREAK
-case 325:
+case 334:
 YY_RULE_SETUP
-#line 591 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 600 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ISP ")); /* ignore */ }
        YY_BREAK
-case 326:
-/* rule 326 can match eol */
+case 335:
+/* rule 335 can match eol */
 YY_RULE_SETUP
-#line 592 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 601 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++;}
        YY_BREAK
-case 327:
+case 336:
 YY_RULE_SETUP
-#line 593 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 602 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("IQS ")); BEGIN(include_quoted); }
        YY_BREAK
-case 328:
+case 337:
 YY_RULE_SETUP
-#line 594 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 603 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("Iunquotedstr(%s) ", yytext));
        config_start_include_glob(yytext, 0);
@@ -5199,27 +5344,27 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(include_quoted):
-#line 599 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 608 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
         yyerror("EOF inside quoted string");
         BEGIN(inc_prev);
 }
        YY_BREAK
-case 329:
+case 338:
 YY_RULE_SETUP
-#line 603 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 612 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ISTR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 330:
-/* rule 330 can match eol */
+case 339:
+/* rule 339 can match eol */
 YY_RULE_SETUP
-#line 604 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 613 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { yyerror("newline before \" in include name"); 
                                  cfg_parser->line++; BEGIN(inc_prev); }
        YY_BREAK
-case 331:
+case 340:
 YY_RULE_SETUP
-#line 606 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 615 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("IQE "));
        yytext[yyleng - 1] = '\0';
@@ -5229,7 +5374,7 @@ YY_RULE_SETUP
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(val):
-#line 612 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 621 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("LEXEOF "));
        yy_set_bol(1); /* Set beginning of line, so "^" rules match.  */
@@ -5244,39 +5389,39 @@ case YY_STATE_EOF(val):
 }
        YY_BREAK
 /* include-toplevel: directive */
-case 332:
+case 341:
 YY_RULE_SETUP
-#line 626 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 635 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("v(%s) ", yytext)); inc_prev = YYSTATE; BEGIN(include_toplevel);
 }
        YY_BREAK
 case YY_STATE_EOF(include_toplevel):
-#line 629 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 638 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        yyerror("EOF inside include_toplevel directive");
        BEGIN(inc_prev);
 }
        YY_BREAK
-case 333:
+case 342:
 YY_RULE_SETUP
-#line 633 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 642 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ITSP ")); /* ignore */ }
        YY_BREAK
-case 334:
-/* rule 334 can match eol */
+case 343:
+/* rule 343 can match eol */
 YY_RULE_SETUP
-#line 634 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 643 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("NL\n")); cfg_parser->line++; }
        YY_BREAK
-case 335:
+case 344:
 YY_RULE_SETUP
-#line 635 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 644 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ITQS ")); BEGIN(include_toplevel_quoted); }
        YY_BREAK
-case 336:
+case 345:
 YY_RULE_SETUP
-#line 636 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 645 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("ITunquotedstr(%s) ", yytext));
        config_start_include_glob(yytext, 1);
@@ -5285,29 +5430,29 @@ YY_RULE_SETUP
 }
        YY_BREAK
 case YY_STATE_EOF(include_toplevel_quoted):
-#line 642 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 651 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        yyerror("EOF inside quoted string");
        BEGIN(inc_prev);
 }
        YY_BREAK
-case 337:
+case 346:
 YY_RULE_SETUP
-#line 646 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 655 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("ITSTR(%s) ", yytext)); yymore(); }
        YY_BREAK
-case 338:
-/* rule 338 can match eol */
+case 347:
+/* rule 347 can match eol */
 YY_RULE_SETUP
-#line 647 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 656 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        yyerror("newline before \" in include name");
        cfg_parser->line++; BEGIN(inc_prev);
 }
        YY_BREAK
-case 339:
+case 348:
 YY_RULE_SETUP
-#line 651 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 660 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        LEXOUT(("ITQE "));
        yytext[yyleng - 1] = '\0';
@@ -5316,33 +5461,33 @@ YY_RULE_SETUP
        return (VAR_FORCE_TOPLEVEL);
 }
        YY_BREAK
-case 340:
+case 349:
 YY_RULE_SETUP
-#line 659 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 668 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 { LEXOUT(("unquotedstr(%s) ", yytext)); 
                        if(--num_args == 0) { BEGIN(INITIAL); }
                        yylval.str = strdup(yytext); return STRING_ARG; }
        YY_BREAK
-case 341:
+case 350:
 YY_RULE_SETUP
-#line 663 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 672 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        ub_c_error_msg("unknown keyword '%s'", yytext);
        }
        YY_BREAK
-case 342:
+case 351:
 YY_RULE_SETUP
-#line 667 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 676 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 {
        ub_c_error_msg("stray '%s'", yytext);
        }
        YY_BREAK
-case 343:
+case 352:
 YY_RULE_SETUP
-#line 671 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 680 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 ECHO;
        YY_BREAK
-#line 5344 "<stdout>"
+#line 5489 "<stdout>"
 
        case YY_END_OF_BUFFER:
                {
@@ -5635,7 +5780,7 @@ static int yy_get_next_buffer (void)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 3354 )
+                       if ( yy_current_state >= 3484 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -5663,11 +5808,11 @@ static int yy_get_next_buffer (void)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 3354 )
+               if ( yy_current_state >= 3484 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-       yy_is_jam = (yy_current_state == 3353);
+       yy_is_jam = (yy_current_state == 3483);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -6300,7 +6445,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 671 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
+#line 680 "/usr/src/usr.sbin/unbound/util/configlexer.lex"
 
 
 
index bc4e92c..dbfc17d 100644 (file)
@@ -235,6 +235,9 @@ tcp-upstream{COLON}         { YDVAR(1, VAR_TCP_UPSTREAM) }
 tcp-mss{COLON}                 { YDVAR(1, VAR_TCP_MSS) }
 outgoing-tcp-mss{COLON}                { YDVAR(1, VAR_OUTGOING_TCP_MSS) }
 tcp-idle-timeout{COLON}                { YDVAR(1, VAR_TCP_IDLE_TIMEOUT) }
+max-reuse-tcp-queries{COLON}   { YDVAR(1, VAR_MAX_REUSE_TCP_QUERIES) }
+tcp-reuse-timeout{COLON}       { YDVAR(1, VAR_TCP_REUSE_TIMEOUT) }
+tcp-auth-query-timeout{COLON}  { YDVAR(1, VAR_TCP_AUTH_QUERY_TIMEOUT) }
 edns-tcp-keepalive{COLON}      { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE) }
 edns-tcp-keepalive-timeout{COLON} { YDVAR(1, VAR_EDNS_TCP_KEEPALIVE_TIMEOUT) }
 ssl-upstream{COLON}            { YDVAR(1, VAR_SSL_UPSTREAM) }
@@ -368,8 +371,10 @@ max-ecs-tree-size-ipv6{COLON}      { YDVAR(1, VAR_MAX_ECS_TREE_SIZE_IPV6) }
 hide-identity{COLON}           { YDVAR(1, VAR_HIDE_IDENTITY) }
 hide-version{COLON}            { YDVAR(1, VAR_HIDE_VERSION) }
 hide-trustanchor{COLON}                { YDVAR(1, VAR_HIDE_TRUSTANCHOR) }
+hide-http-user-agent{COLON}            { YDVAR(1, VAR_HIDE_HTTP_USER_AGENT) }
 identity{COLON}                        { YDVAR(1, VAR_IDENTITY) }
 version{COLON}                 { YDVAR(1, VAR_VERSION) }
+http-user-agent{COLON}                 { YDVAR(1, VAR_HTTP_USER_AGENT) }
 module-config{COLON}           { YDVAR(1, VAR_MODULE_CONF) }
 dlv-anchor{COLON}              { YDVAR(1, VAR_DLV_ANCHOR) }
 dlv-anchor-file{COLON}         { YDVAR(1, VAR_DLV_ANCHOR_FILE) }
@@ -382,6 +387,7 @@ root-key-sentinel{COLON}    { YDVAR(1, VAR_ROOT_KEY_SENTINEL) }
 val-override-date{COLON}       { YDVAR(1, VAR_VAL_OVERRIDE_DATE) }
 val-sig-skew-min{COLON}                { YDVAR(1, VAR_VAL_SIG_SKEW_MIN) }
 val-sig-skew-max{COLON}                { YDVAR(1, VAR_VAL_SIG_SKEW_MAX) }
+val-max-restart{COLON}         { YDVAR(1, VAR_VAL_MAX_RESTART) }
 val-bogus-ttl{COLON}           { YDVAR(1, VAR_BOGUS_TTL) }
 val-clean-additional{COLON}    { YDVAR(1, VAR_VAL_CLEAN_ADDITIONAL) }
 val-permissive-mode{COLON}     { YDVAR(1, VAR_VAL_PERMISSIVE_MODE) }
@@ -401,6 +407,9 @@ key-cache-slabs{COLON}              { YDVAR(1, VAR_KEY_CACHE_SLABS) }
 neg-cache-size{COLON}          { YDVAR(1, VAR_NEG_CACHE_SIZE) }
 val-nsec3-keysize-iterations{COLON}    { 
                                  YDVAR(1, VAR_VAL_NSEC3_KEYSIZE_ITERATIONS) }
+zonemd-permissive-mode{COLON}  { YDVAR(1, VAR_ZONEMD_PERMISSIVE_MODE) }
+zonemd-check{COLON}            { YDVAR(1, VAR_ZONEMD_CHECK) }
+zonemd-reject-absence{COLON}   { YDVAR(1, VAR_ZONEMD_REJECT_ABSENCE) }
 add-holddown{COLON}            { YDVAR(1, VAR_ADD_HOLDDOWN) }
 del-holddown{COLON}            { YDVAR(1, VAR_DEL_HOLDDOWN) }
 keep-missing{COLON}            { YDVAR(1, VAR_KEEP_MISSING) }
index d9c4cbc..5760334 100644 (file)
 #define VAR_CONTROL_KEY_FILE 356
 #define VAR_CONTROL_CERT_FILE 357
 #define VAR_CONTROL_USE_CERT 358
-#define VAR_EXTENDED_STATISTICS 359
-#define VAR_LOCAL_DATA_PTR 360
-#define VAR_JOSTLE_TIMEOUT 361
-#define VAR_STUB_PRIME 362
-#define VAR_UNWANTED_REPLY_THRESHOLD 363
-#define VAR_LOG_TIME_ASCII 364
-#define VAR_DOMAIN_INSECURE 365
-#define VAR_PYTHON 366
-#define VAR_PYTHON_SCRIPT 367
-#define VAR_VAL_SIG_SKEW_MIN 368
-#define VAR_VAL_SIG_SKEW_MAX 369
-#define VAR_CACHE_MIN_TTL 370
-#define VAR_VAL_LOG_LEVEL 371
-#define VAR_AUTO_TRUST_ANCHOR_FILE 372
-#define VAR_KEEP_MISSING 373
-#define VAR_ADD_HOLDDOWN 374
-#define VAR_DEL_HOLDDOWN 375
-#define VAR_SO_RCVBUF 376
-#define VAR_EDNS_BUFFER_SIZE 377
-#define VAR_PREFETCH 378
-#define VAR_PREFETCH_KEY 379
-#define VAR_SO_SNDBUF 380
-#define VAR_SO_REUSEPORT 381
-#define VAR_HARDEN_BELOW_NXDOMAIN 382
-#define VAR_IGNORE_CD_FLAG 383
-#define VAR_LOG_QUERIES 384
-#define VAR_LOG_REPLIES 385
-#define VAR_LOG_LOCAL_ACTIONS 386
-#define VAR_TCP_UPSTREAM 387
-#define VAR_SSL_UPSTREAM 388
-#define VAR_SSL_SERVICE_KEY 389
-#define VAR_SSL_SERVICE_PEM 390
-#define VAR_SSL_PORT 391
-#define VAR_FORWARD_FIRST 392
-#define VAR_STUB_SSL_UPSTREAM 393
-#define VAR_FORWARD_SSL_UPSTREAM 394
-#define VAR_TLS_CERT_BUNDLE 395
-#define VAR_HTTPS_PORT 396
-#define VAR_HTTP_ENDPOINT 397
-#define VAR_HTTP_MAX_STREAMS 398
-#define VAR_HTTP_QUERY_BUFFER_SIZE 399
-#define VAR_HTTP_RESPONSE_BUFFER_SIZE 400
-#define VAR_HTTP_NODELAY 401
-#define VAR_HTTP_NOTLS_DOWNSTREAM 402
-#define VAR_STUB_FIRST 403
-#define VAR_MINIMAL_RESPONSES 404
-#define VAR_RRSET_ROUNDROBIN 405
-#define VAR_MAX_UDP_SIZE 406
-#define VAR_DELAY_CLOSE 407
-#define VAR_UDP_CONNECT 408
-#define VAR_UNBLOCK_LAN_ZONES 409
-#define VAR_INSECURE_LAN_ZONES 410
-#define VAR_INFRA_CACHE_MIN_RTT 411
-#define VAR_INFRA_KEEP_PROBING 412
-#define VAR_DNS64_PREFIX 413
-#define VAR_DNS64_SYNTHALL 414
-#define VAR_DNS64_IGNORE_AAAA 415
-#define VAR_DNSTAP 416
-#define VAR_DNSTAP_ENABLE 417
-#define VAR_DNSTAP_SOCKET_PATH 418
-#define VAR_DNSTAP_IP 419
-#define VAR_DNSTAP_TLS 420
-#define VAR_DNSTAP_TLS_SERVER_NAME 421
-#define VAR_DNSTAP_TLS_CERT_BUNDLE 422
-#define VAR_DNSTAP_TLS_CLIENT_KEY_FILE 423
-#define VAR_DNSTAP_TLS_CLIENT_CERT_FILE 424
-#define VAR_DNSTAP_SEND_IDENTITY 425
-#define VAR_DNSTAP_SEND_VERSION 426
-#define VAR_DNSTAP_BIDIRECTIONAL 427
-#define VAR_DNSTAP_IDENTITY 428
-#define VAR_DNSTAP_VERSION 429
-#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 430
-#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 431
-#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 432
-#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 433
-#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 434
-#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 435
-#define VAR_RESPONSE_IP_TAG 436
-#define VAR_RESPONSE_IP 437
-#define VAR_RESPONSE_IP_DATA 438
-#define VAR_HARDEN_ALGO_DOWNGRADE 439
-#define VAR_IP_TRANSPARENT 440
-#define VAR_IP_DSCP 441
-#define VAR_DISABLE_DNSSEC_LAME_CHECK 442
-#define VAR_IP_RATELIMIT 443
-#define VAR_IP_RATELIMIT_SLABS 444
-#define VAR_IP_RATELIMIT_SIZE 445
-#define VAR_RATELIMIT 446
-#define VAR_RATELIMIT_SLABS 447
-#define VAR_RATELIMIT_SIZE 448
-#define VAR_RATELIMIT_FOR_DOMAIN 449
-#define VAR_RATELIMIT_BELOW_DOMAIN 450
-#define VAR_IP_RATELIMIT_FACTOR 451
-#define VAR_RATELIMIT_FACTOR 452
-#define VAR_SEND_CLIENT_SUBNET 453
-#define VAR_CLIENT_SUBNET_ZONE 454
-#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 455
-#define VAR_CLIENT_SUBNET_OPCODE 456
-#define VAR_MAX_CLIENT_SUBNET_IPV4 457
-#define VAR_MAX_CLIENT_SUBNET_IPV6 458
-#define VAR_MIN_CLIENT_SUBNET_IPV4 459
-#define VAR_MIN_CLIENT_SUBNET_IPV6 460
-#define VAR_MAX_ECS_TREE_SIZE_IPV4 461
-#define VAR_MAX_ECS_TREE_SIZE_IPV6 462
-#define VAR_CAPS_WHITELIST 463
-#define VAR_CACHE_MAX_NEGATIVE_TTL 464
-#define VAR_PERMIT_SMALL_HOLDDOWN 465
-#define VAR_QNAME_MINIMISATION 466
-#define VAR_QNAME_MINIMISATION_STRICT 467
-#define VAR_IP_FREEBIND 468
-#define VAR_DEFINE_TAG 469
-#define VAR_LOCAL_ZONE_TAG 470
-#define VAR_ACCESS_CONTROL_TAG 471
-#define VAR_LOCAL_ZONE_OVERRIDE 472
-#define VAR_ACCESS_CONTROL_TAG_ACTION 473
-#define VAR_ACCESS_CONTROL_TAG_DATA 474
-#define VAR_VIEW 475
-#define VAR_ACCESS_CONTROL_VIEW 476
-#define VAR_VIEW_FIRST 477
-#define VAR_SERVE_EXPIRED 478
-#define VAR_SERVE_EXPIRED_TTL 479
-#define VAR_SERVE_EXPIRED_TTL_RESET 480
-#define VAR_SERVE_EXPIRED_REPLY_TTL 481
-#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 482
-#define VAR_SERVE_ORIGINAL_TTL 483
-#define VAR_FAKE_DSA 484
-#define VAR_FAKE_SHA1 485
-#define VAR_LOG_IDENTITY 486
-#define VAR_HIDE_TRUSTANCHOR 487
-#define VAR_TRUST_ANCHOR_SIGNALING 488
-#define VAR_AGGRESSIVE_NSEC 489
-#define VAR_USE_SYSTEMD 490
-#define VAR_SHM_ENABLE 491
-#define VAR_SHM_KEY 492
-#define VAR_ROOT_KEY_SENTINEL 493
-#define VAR_DNSCRYPT 494
-#define VAR_DNSCRYPT_ENABLE 495
-#define VAR_DNSCRYPT_PORT 496
-#define VAR_DNSCRYPT_PROVIDER 497
-#define VAR_DNSCRYPT_SECRET_KEY 498
-#define VAR_DNSCRYPT_PROVIDER_CERT 499
-#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 500
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 501
-#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 502
-#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 503
-#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 504
-#define VAR_PAD_RESPONSES 505
-#define VAR_PAD_RESPONSES_BLOCK_SIZE 506
-#define VAR_PAD_QUERIES 507
-#define VAR_PAD_QUERIES_BLOCK_SIZE 508
-#define VAR_IPSECMOD_ENABLED 509
-#define VAR_IPSECMOD_HOOK 510
-#define VAR_IPSECMOD_IGNORE_BOGUS 511
-#define VAR_IPSECMOD_MAX_TTL 512
-#define VAR_IPSECMOD_WHITELIST 513
-#define VAR_IPSECMOD_STRICT 514
-#define VAR_CACHEDB 515
-#define VAR_CACHEDB_BACKEND 516
-#define VAR_CACHEDB_SECRETSEED 517
-#define VAR_CACHEDB_REDISHOST 518
-#define VAR_CACHEDB_REDISPORT 519
-#define VAR_CACHEDB_REDISTIMEOUT 520
-#define VAR_CACHEDB_REDISEXPIRERECORDS 521
-#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 522
-#define VAR_FOR_UPSTREAM 523
-#define VAR_AUTH_ZONE 524
-#define VAR_ZONEFILE 525
-#define VAR_MASTER 526
-#define VAR_URL 527
-#define VAR_FOR_DOWNSTREAM 528
-#define VAR_FALLBACK_ENABLED 529
-#define VAR_TLS_ADDITIONAL_PORT 530
-#define VAR_LOW_RTT 531
-#define VAR_LOW_RTT_PERMIL 532
-#define VAR_FAST_SERVER_PERMIL 533
-#define VAR_FAST_SERVER_NUM 534
-#define VAR_ALLOW_NOTIFY 535
-#define VAR_TLS_WIN_CERT 536
-#define VAR_TCP_CONNECTION_LIMIT 537
-#define VAR_FORWARD_NO_CACHE 538
-#define VAR_STUB_NO_CACHE 539
-#define VAR_LOG_SERVFAIL 540
-#define VAR_DENY_ANY 541
-#define VAR_UNKNOWN_SERVER_TIME_LIMIT 542
-#define VAR_LOG_TAG_QUERYREPLY 543
-#define VAR_STREAM_WAIT_SIZE 544
-#define VAR_TLS_CIPHERS 545
-#define VAR_TLS_CIPHERSUITES 546
-#define VAR_TLS_USE_SNI 547
-#define VAR_IPSET 548
-#define VAR_IPSET_NAME_V4 549
-#define VAR_IPSET_NAME_V6 550
-#define VAR_TLS_SESSION_TICKET_KEYS 551
-#define VAR_RPZ 552
-#define VAR_TAGS 553
-#define VAR_RPZ_ACTION_OVERRIDE 554
-#define VAR_RPZ_CNAME_OVERRIDE 555
-#define VAR_RPZ_LOG 556
-#define VAR_RPZ_LOG_NAME 557
-#define VAR_DYNLIB 558
-#define VAR_DYNLIB_FILE 559
-#define VAR_EDNS_CLIENT_STRING 560
-#define VAR_EDNS_CLIENT_STRING_OPCODE 561
-#define VAR_NSID 562
+#define VAR_TCP_REUSE_TIMEOUT 359
+#define VAR_MAX_REUSE_TCP_QUERIES 360
+#define VAR_EXTENDED_STATISTICS 361
+#define VAR_LOCAL_DATA_PTR 362
+#define VAR_JOSTLE_TIMEOUT 363
+#define VAR_STUB_PRIME 364
+#define VAR_UNWANTED_REPLY_THRESHOLD 365
+#define VAR_LOG_TIME_ASCII 366
+#define VAR_DOMAIN_INSECURE 367
+#define VAR_PYTHON 368
+#define VAR_PYTHON_SCRIPT 369
+#define VAR_VAL_SIG_SKEW_MIN 370
+#define VAR_VAL_SIG_SKEW_MAX 371
+#define VAR_VAL_MAX_RESTART 372
+#define VAR_CACHE_MIN_TTL 373
+#define VAR_VAL_LOG_LEVEL 374
+#define VAR_AUTO_TRUST_ANCHOR_FILE 375
+#define VAR_KEEP_MISSING 376
+#define VAR_ADD_HOLDDOWN 377
+#define VAR_DEL_HOLDDOWN 378
+#define VAR_SO_RCVBUF 379
+#define VAR_EDNS_BUFFER_SIZE 380
+#define VAR_PREFETCH 381
+#define VAR_PREFETCH_KEY 382
+#define VAR_SO_SNDBUF 383
+#define VAR_SO_REUSEPORT 384
+#define VAR_HARDEN_BELOW_NXDOMAIN 385
+#define VAR_IGNORE_CD_FLAG 386
+#define VAR_LOG_QUERIES 387
+#define VAR_LOG_REPLIES 388
+#define VAR_LOG_LOCAL_ACTIONS 389
+#define VAR_TCP_UPSTREAM 390
+#define VAR_SSL_UPSTREAM 391
+#define VAR_TCP_AUTH_QUERY_TIMEOUT 392
+#define VAR_SSL_SERVICE_KEY 393
+#define VAR_SSL_SERVICE_PEM 394
+#define VAR_SSL_PORT 395
+#define VAR_FORWARD_FIRST 396
+#define VAR_STUB_SSL_UPSTREAM 397
+#define VAR_FORWARD_SSL_UPSTREAM 398
+#define VAR_TLS_CERT_BUNDLE 399
+#define VAR_HTTPS_PORT 400
+#define VAR_HTTP_ENDPOINT 401
+#define VAR_HTTP_MAX_STREAMS 402
+#define VAR_HTTP_QUERY_BUFFER_SIZE 403
+#define VAR_HTTP_RESPONSE_BUFFER_SIZE 404
+#define VAR_HTTP_NODELAY 405
+#define VAR_HTTP_NOTLS_DOWNSTREAM 406
+#define VAR_STUB_FIRST 407
+#define VAR_MINIMAL_RESPONSES 408
+#define VAR_RRSET_ROUNDROBIN 409
+#define VAR_MAX_UDP_SIZE 410
+#define VAR_DELAY_CLOSE 411
+#define VAR_UDP_CONNECT 412
+#define VAR_UNBLOCK_LAN_ZONES 413
+#define VAR_INSECURE_LAN_ZONES 414
+#define VAR_INFRA_CACHE_MIN_RTT 415
+#define VAR_INFRA_KEEP_PROBING 416
+#define VAR_DNS64_PREFIX 417
+#define VAR_DNS64_SYNTHALL 418
+#define VAR_DNS64_IGNORE_AAAA 419
+#define VAR_DNSTAP 420
+#define VAR_DNSTAP_ENABLE 421
+#define VAR_DNSTAP_SOCKET_PATH 422
+#define VAR_DNSTAP_IP 423
+#define VAR_DNSTAP_TLS 424
+#define VAR_DNSTAP_TLS_SERVER_NAME 425
+#define VAR_DNSTAP_TLS_CERT_BUNDLE 426
+#define VAR_DNSTAP_TLS_CLIENT_KEY_FILE 427
+#define VAR_DNSTAP_TLS_CLIENT_CERT_FILE 428
+#define VAR_DNSTAP_SEND_IDENTITY 429
+#define VAR_DNSTAP_SEND_VERSION 430
+#define VAR_DNSTAP_BIDIRECTIONAL 431
+#define VAR_DNSTAP_IDENTITY 432
+#define VAR_DNSTAP_VERSION 433
+#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 434
+#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 435
+#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 436
+#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 437
+#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 438
+#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 439
+#define VAR_RESPONSE_IP_TAG 440
+#define VAR_RESPONSE_IP 441
+#define VAR_RESPONSE_IP_DATA 442
+#define VAR_HARDEN_ALGO_DOWNGRADE 443
+#define VAR_IP_TRANSPARENT 444
+#define VAR_IP_DSCP 445
+#define VAR_DISABLE_DNSSEC_LAME_CHECK 446
+#define VAR_IP_RATELIMIT 447
+#define VAR_IP_RATELIMIT_SLABS 448
+#define VAR_IP_RATELIMIT_SIZE 449
+#define VAR_RATELIMIT 450
+#define VAR_RATELIMIT_SLABS 451
+#define VAR_RATELIMIT_SIZE 452
+#define VAR_RATELIMIT_FOR_DOMAIN 453
+#define VAR_RATELIMIT_BELOW_DOMAIN 454
+#define VAR_IP_RATELIMIT_FACTOR 455
+#define VAR_RATELIMIT_FACTOR 456
+#define VAR_SEND_CLIENT_SUBNET 457
+#define VAR_CLIENT_SUBNET_ZONE 458
+#define VAR_CLIENT_SUBNET_ALWAYS_FORWARD 459
+#define VAR_CLIENT_SUBNET_OPCODE 460
+#define VAR_MAX_CLIENT_SUBNET_IPV4 461
+#define VAR_MAX_CLIENT_SUBNET_IPV6 462
+#define VAR_MIN_CLIENT_SUBNET_IPV4 463
+#define VAR_MIN_CLIENT_SUBNET_IPV6 464
+#define VAR_MAX_ECS_TREE_SIZE_IPV4 465
+#define VAR_MAX_ECS_TREE_SIZE_IPV6 466
+#define VAR_CAPS_WHITELIST 467
+#define VAR_CACHE_MAX_NEGATIVE_TTL 468
+#define VAR_PERMIT_SMALL_HOLDDOWN 469
+#define VAR_QNAME_MINIMISATION 470
+#define VAR_QNAME_MINIMISATION_STRICT 471
+#define VAR_IP_FREEBIND 472
+#define VAR_DEFINE_TAG 473
+#define VAR_LOCAL_ZONE_TAG 474
+#define VAR_ACCESS_CONTROL_TAG 475
+#define VAR_LOCAL_ZONE_OVERRIDE 476
+#define VAR_ACCESS_CONTROL_TAG_ACTION 477
+#define VAR_ACCESS_CONTROL_TAG_DATA 478
+#define VAR_VIEW 479
+#define VAR_ACCESS_CONTROL_VIEW 480
+#define VAR_VIEW_FIRST 481
+#define VAR_SERVE_EXPIRED 482
+#define VAR_SERVE_EXPIRED_TTL 483
+#define VAR_SERVE_EXPIRED_TTL_RESET 484
+#define VAR_SERVE_EXPIRED_REPLY_TTL 485
+#define VAR_SERVE_EXPIRED_CLIENT_TIMEOUT 486
+#define VAR_SERVE_ORIGINAL_TTL 487
+#define VAR_FAKE_DSA 488
+#define VAR_FAKE_SHA1 489
+#define VAR_LOG_IDENTITY 490
+#define VAR_HIDE_TRUSTANCHOR 491
+#define VAR_HIDE_HTTP_USER_AGENT 492
+#define VAR_HTTP_USER_AGENT 493
+#define VAR_TRUST_ANCHOR_SIGNALING 494
+#define VAR_AGGRESSIVE_NSEC 495
+#define VAR_USE_SYSTEMD 496
+#define VAR_SHM_ENABLE 497
+#define VAR_SHM_KEY 498
+#define VAR_ROOT_KEY_SENTINEL 499
+#define VAR_DNSCRYPT 500
+#define VAR_DNSCRYPT_ENABLE 501
+#define VAR_DNSCRYPT_PORT 502
+#define VAR_DNSCRYPT_PROVIDER 503
+#define VAR_DNSCRYPT_SECRET_KEY 504
+#define VAR_DNSCRYPT_PROVIDER_CERT 505
+#define VAR_DNSCRYPT_PROVIDER_CERT_ROTATED 506
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SIZE 507
+#define VAR_DNSCRYPT_SHARED_SECRET_CACHE_SLABS 508
+#define VAR_DNSCRYPT_NONCE_CACHE_SIZE 509
+#define VAR_DNSCRYPT_NONCE_CACHE_SLABS 510
+#define VAR_PAD_RESPONSES 511
+#define VAR_PAD_RESPONSES_BLOCK_SIZE 512
+#define VAR_PAD_QUERIES 513
+#define VAR_PAD_QUERIES_BLOCK_SIZE 514
+#define VAR_IPSECMOD_ENABLED 515
+#define VAR_IPSECMOD_HOOK 516
+#define VAR_IPSECMOD_IGNORE_BOGUS 517
+#define VAR_IPSECMOD_MAX_TTL 518
+#define VAR_IPSECMOD_WHITELIST 519
+#define VAR_IPSECMOD_STRICT 520
+#define VAR_CACHEDB 521
+#define VAR_CACHEDB_BACKEND 522
+#define VAR_CACHEDB_SECRETSEED 523
+#define VAR_CACHEDB_REDISHOST 524
+#define VAR_CACHEDB_REDISPORT 525
+#define VAR_CACHEDB_REDISTIMEOUT 526
+#define VAR_CACHEDB_REDISEXPIRERECORDS 527
+#define VAR_UDP_UPSTREAM_WITHOUT_DOWNSTREAM 528
+#define VAR_FOR_UPSTREAM 529
+#define VAR_AUTH_ZONE 530
+#define VAR_ZONEFILE 531
+#define VAR_MASTER 532
+#define VAR_URL 533
+#define VAR_FOR_DOWNSTREAM 534
+#define VAR_FALLBACK_ENABLED 535
+#define VAR_TLS_ADDITIONAL_PORT 536
+#define VAR_LOW_RTT 537
+#define VAR_LOW_RTT_PERMIL 538
+#define VAR_FAST_SERVER_PERMIL 539
+#define VAR_FAST_SERVER_NUM 540
+#define VAR_ALLOW_NOTIFY 541
+#define VAR_TLS_WIN_CERT 542
+#define VAR_TCP_CONNECTION_LIMIT 543
+#define VAR_FORWARD_NO_CACHE 544
+#define VAR_STUB_NO_CACHE 545
+#define VAR_LOG_SERVFAIL 546
+#define VAR_DENY_ANY 547
+#define VAR_UNKNOWN_SERVER_TIME_LIMIT 548
+#define VAR_LOG_TAG_QUERYREPLY 549
+#define VAR_STREAM_WAIT_SIZE 550
+#define VAR_TLS_CIPHERS 551
+#define VAR_TLS_CIPHERSUITES 552
+#define VAR_TLS_USE_SNI 553
+#define VAR_IPSET 554
+#define VAR_IPSET_NAME_V4 555
+#define VAR_IPSET_NAME_V6 556
+#define VAR_TLS_SESSION_TICKET_KEYS 557
+#define VAR_RPZ 558
+#define VAR_TAGS 559
+#define VAR_RPZ_ACTION_OVERRIDE 560
+#define VAR_RPZ_CNAME_OVERRIDE 561
+#define VAR_RPZ_LOG 562
+#define VAR_RPZ_LOG_NAME 563
+#define VAR_DYNLIB 564
+#define VAR_DYNLIB_FILE 565
+#define VAR_EDNS_CLIENT_STRING 566
+#define VAR_EDNS_CLIENT_STRING_OPCODE 567
+#define VAR_NSID 568
+#define VAR_ZONEMD_PERMISSIVE_MODE 569
+#define VAR_ZONEMD_CHECK 570
+#define VAR_ZONEMD_REJECT_ABSENCE 571
 #ifndef YYSTYPE_DEFINED
 #define YYSTYPE_DEFINED
 typedef union {
index 272a979..e22d48d 100644 (file)
@@ -100,17 +100,18 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_PRIVATE_DOMAIN VAR_REMOTE_CONTROL VAR_CONTROL_ENABLE
 %token VAR_CONTROL_INTERFACE VAR_CONTROL_PORT VAR_SERVER_KEY_FILE
 %token VAR_SERVER_CERT_FILE VAR_CONTROL_KEY_FILE VAR_CONTROL_CERT_FILE
-%token VAR_CONTROL_USE_CERT
+%token VAR_CONTROL_USE_CERT VAR_TCP_REUSE_TIMEOUT VAR_MAX_REUSE_TCP_QUERIES
 %token VAR_EXTENDED_STATISTICS VAR_LOCAL_DATA_PTR VAR_JOSTLE_TIMEOUT
 %token VAR_STUB_PRIME VAR_UNWANTED_REPLY_THRESHOLD VAR_LOG_TIME_ASCII
 %token VAR_DOMAIN_INSECURE VAR_PYTHON VAR_PYTHON_SCRIPT VAR_VAL_SIG_SKEW_MIN
-%token VAR_VAL_SIG_SKEW_MAX VAR_CACHE_MIN_TTL VAR_VAL_LOG_LEVEL
-%token VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING VAR_ADD_HOLDDOWN 
-%token VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE VAR_PREFETCH
-%token VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT VAR_HARDEN_BELOW_NXDOMAIN
-%token VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS
-%token VAR_TCP_UPSTREAM VAR_SSL_UPSTREAM
-%token VAR_SSL_SERVICE_KEY VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
+%token VAR_VAL_SIG_SKEW_MAX VAR_VAL_MAX_RESTART VAR_CACHE_MIN_TTL
+%token VAR_VAL_LOG_LEVEL VAR_AUTO_TRUST_ANCHOR_FILE VAR_KEEP_MISSING
+%token VAR_ADD_HOLDDOWN VAR_DEL_HOLDDOWN VAR_SO_RCVBUF VAR_EDNS_BUFFER_SIZE
+%token VAR_PREFETCH VAR_PREFETCH_KEY VAR_SO_SNDBUF VAR_SO_REUSEPORT
+%token VAR_HARDEN_BELOW_NXDOMAIN VAR_IGNORE_CD_FLAG VAR_LOG_QUERIES
+%token VAR_LOG_REPLIES VAR_LOG_LOCAL_ACTIONS VAR_TCP_UPSTREAM
+%token VAR_SSL_UPSTREAM VAR_TCP_AUTH_QUERY_TIMEOUT VAR_SSL_SERVICE_KEY
+%token VAR_SSL_SERVICE_PEM VAR_SSL_PORT VAR_FORWARD_FIRST
 %token VAR_STUB_SSL_UPSTREAM VAR_FORWARD_SSL_UPSTREAM VAR_TLS_CERT_BUNDLE
 %token VAR_HTTPS_PORT VAR_HTTP_ENDPOINT VAR_HTTP_MAX_STREAMS
 %token VAR_HTTP_QUERY_BUFFER_SIZE VAR_HTTP_RESPONSE_BUFFER_SIZE
@@ -153,6 +154,7 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_SERVE_EXPIRED_TTL_RESET VAR_SERVE_EXPIRED_REPLY_TTL
 %token VAR_SERVE_EXPIRED_CLIENT_TIMEOUT VAR_SERVE_ORIGINAL_TTL VAR_FAKE_DSA
 %token VAR_FAKE_SHA1 VAR_LOG_IDENTITY VAR_HIDE_TRUSTANCHOR
+%token VAR_HIDE_HTTP_USER_AGENT VAR_HTTP_USER_AGENT
 %token VAR_TRUST_ANCHOR_SIGNALING VAR_AGGRESSIVE_NSEC VAR_USE_SYSTEMD
 %token VAR_SHM_ENABLE VAR_SHM_KEY VAR_ROOT_KEY_SENTINEL
 %token VAR_DNSCRYPT VAR_DNSCRYPT_ENABLE VAR_DNSCRYPT_PORT VAR_DNSCRYPT_PROVIDER
@@ -182,6 +184,7 @@ extern struct config_parser_state* cfg_parser;
 %token VAR_RPZ_CNAME_OVERRIDE VAR_RPZ_LOG VAR_RPZ_LOG_NAME
 %token VAR_DYNLIB VAR_DYNLIB_FILE VAR_EDNS_CLIENT_STRING
 %token VAR_EDNS_CLIENT_STRING_OPCODE VAR_NSID
+%token VAR_ZONEMD_PERMISSIVE_MODE VAR_ZONEMD_CHECK VAR_ZONEMD_REJECT_ABSENCE
 
 %%
 toplevelvars: /* empty */ | toplevelvars toplevelvar ;
@@ -223,6 +226,7 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_harden_short_bufsize | server_harden_large_queries |
        server_do_not_query_address | server_hide_identity |
        server_hide_version | server_identity | server_version |
+       server_hide_http_user_agent | server_http_user_agent |
        server_harden_glue | server_module_conf | server_trust_anchor_file |
        server_trust_anchor | server_val_override_date | server_bogus_ttl |
        server_val_clean_additional | server_val_permissive_mode |
@@ -242,8 +246,9 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_local_data_ptr | server_jostle_timeout | 
        server_unwanted_reply_threshold | server_log_time_ascii | 
        server_domain_insecure | server_val_sig_skew_min | 
-       server_val_sig_skew_max | server_cache_min_ttl | server_val_log_level |
-       server_auto_trust_anchor_file | server_add_holddown | 
+       server_val_sig_skew_max | server_val_max_restart |
+       server_cache_min_ttl | server_val_log_level |
+       server_auto_trust_anchor_file | server_add_holddown |
        server_del_holddown | server_keep_missing | server_so_rcvbuf |
        server_edns_buffer_size | server_prefetch | server_prefetch_key |
        server_so_sndbuf | server_harden_below_nxdomain | server_ignore_cd_flag |
@@ -299,7 +304,10 @@ content_server: server_num_threads | server_verbosity | server_port |
        server_stream_wait_size | server_tls_ciphers |
        server_tls_ciphersuites | server_tls_session_ticket_keys |
        server_tls_use_sni | server_edns_client_string |
-       server_edns_client_string_opcode | server_nsid
+       server_edns_client_string_opcode | server_nsid |
+       server_zonemd_permissive_mode | server_max_reuse_tcp_queries |
+       server_tcp_reuse_timeout | server_tcp_auth_query_timeout
+
        ;
 stubstart: VAR_STUB_ZONE
        {
@@ -366,6 +374,8 @@ authstart: VAR_AUTH_ZONE
                        s->for_downstream = 1;
                        s->for_upstream = 1;
                        s->fallback_enabled = 0;
+                       s->zonemd_check = 0;
+                       s->zonemd_reject_absence = 0;
                        s->isrpz = 0;
                } else 
                        yyerror("out of memory");
@@ -375,7 +385,7 @@ contents_auth: contents_auth content_auth
        | ;
 content_auth: auth_name | auth_zonefile | auth_master | auth_url |
        auth_for_downstream | auth_for_upstream | auth_fallback_enabled |
-       auth_allow_notify
+       auth_allow_notify | auth_zonemd_check | auth_zonemd_reject_absence
        ;
 
 rpz_tag: VAR_TAGS STRING_ARG
@@ -856,6 +866,39 @@ server_tcp_idle_timeout: VAR_TCP_IDLE_TIMEOUT STRING_ARG
                free($2);
        }
        ;
+server_max_reuse_tcp_queries: VAR_MAX_REUSE_TCP_QUERIES STRING_ARG
+       {
+               OUTYY(("P(server_max_reuse_tcp_queries:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else if (atoi($2) < 1)
+                       cfg_parser->cfg->max_reuse_tcp_queries = 0;
+               else cfg_parser->cfg->max_reuse_tcp_queries = atoi($2);
+               free($2);
+       }
+       ;
+server_tcp_reuse_timeout: VAR_TCP_REUSE_TIMEOUT STRING_ARG
+       {
+               OUTYY(("P(server_tcp_reuse_timeout:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else if (atoi($2) < 1)
+                       cfg_parser->cfg->tcp_reuse_timeout = 0;
+               else cfg_parser->cfg->tcp_reuse_timeout = atoi($2);
+               free($2);
+       }
+       ;
+server_tcp_auth_query_timeout: VAR_TCP_AUTH_QUERY_TIMEOUT STRING_ARG
+       {
+               OUTYY(("P(server_tcp_auth_query_timeout:%s)\n", $2));
+               if(atoi($2) == 0 && strcmp($2, "0") != 0)
+                       yyerror("number expected");
+               else if (atoi($2) < 1)
+                       cfg_parser->cfg->tcp_auth_query_timeout = 0;
+               else cfg_parser->cfg->tcp_auth_query_timeout = atoi($2);
+               free($2);
+       }
+       ;
 server_tcp_keepalive: VAR_EDNS_TCP_KEEPALIVE STRING_ARG
        {
                OUTYY(("P(server_tcp_keepalive:%s)\n", $2));
@@ -1296,6 +1339,15 @@ server_hide_trustanchor: VAR_HIDE_TRUSTANCHOR STRING_ARG
                free($2);
        }
        ;
+server_hide_http_user_agent: VAR_HIDE_HTTP_USER_AGENT STRING_ARG
+       {
+               OUTYY(("P(server_hide_user_agent:%s)\n", $2));
+               if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+                       yyerror("expected yes or no.");
+               else cfg_parser->cfg->hide_http_user_agent = (strcmp($2, "yes")==0);
+               free($2);
+       }
+       ;
 server_identity: VAR_IDENTITY STRING_ARG
        {
                OUTYY(("P(server_identity:%s)\n", $2));
@@ -1310,6 +1362,13 @@ server_version: VAR_VERSION STRING_ARG
                cfg_parser->cfg->version = $2;
        }
        ;
+server_http_user_agent: VAR_HTTP_USER_AGENT STRING_ARG
+       {
+               OUTYY(("P(server_http_user_agent:%s)\n", $2));
+               free(cfg_parser->cfg->http_user_agent);
+               cfg_parser->cfg->http_user_agent = $2;
+       }
+       ;
 server_nsid: VAR_NSID STRING_ARG
        {
                OUTYY(("P(server_nsid:%s)\n", $2));
@@ -1814,6 +1873,19 @@ server_val_sig_skew_max: VAR_VAL_SIG_SKEW_MAX STRING_ARG
                free($2);
        }
        ;
+server_val_max_restart: VAR_VAL_MAX_RESTART STRING_ARG
+       {
+               OUTYY(("P(server_val_max_restart:%s)\n", $2));
+               if(*$2 == '\0' || strcmp($2, "0") == 0) {
+                       cfg_parser->cfg->val_max_restart = 0;
+               } else {
+                       cfg_parser->cfg->val_max_restart = atoi($2);
+                       if(!cfg_parser->cfg->val_max_restart)
+                               yyerror("number expected");
+               }
+               free($2);
+       }
+       ;
 server_cache_max_ttl: VAR_CACHE_MAX_TTL STRING_ARG
        {
                OUTYY(("P(server_cache_max_ttl:%s)\n", $2));
@@ -1986,6 +2058,15 @@ server_val_nsec3_keysize_iterations: VAR_VAL_NSEC3_KEYSIZE_ITERATIONS STRING_ARG
                cfg_parser->cfg->val_nsec3_key_iterations = $2;
        }
        ;
+server_zonemd_permissive_mode: VAR_ZONEMD_PERMISSIVE_MODE STRING_ARG
+       {
+               OUTYY(("P(server_zonemd_permissive_mode:%s)\n", $2));
+               if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+                       yyerror("expected yes or no.");
+               else    cfg_parser->cfg->zonemd_permissive_mode = (strcmp($2, "yes")==0);
+               free($2);
+       }
+       ;
 server_add_holddown: VAR_ADD_HOLDDOWN STRING_ARG
        {
                OUTYY(("P(server_add_holddown:%s)\n", $2));
@@ -2741,6 +2822,26 @@ auth_allow_notify: VAR_ALLOW_NOTIFY STRING_ARG
                        yyerror("out of memory");
        }
        ;
+auth_zonemd_check: VAR_ZONEMD_CHECK STRING_ARG
+       {
+               OUTYY(("P(zonemd-check:%s)\n", $2));
+               if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+                       yyerror("expected yes or no.");
+               else cfg_parser->cfg->auths->zonemd_check =
+                       (strcmp($2, "yes")==0);
+               free($2);
+       }
+       ;
+auth_zonemd_reject_absence: VAR_ZONEMD_REJECT_ABSENCE STRING_ARG
+       {
+               OUTYY(("P(zonemd-reject-absence:%s)\n", $2));
+               if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
+                       yyerror("expected yes or no.");
+               else cfg_parser->cfg->auths->zonemd_reject_absence =
+                       (strcmp($2, "yes")==0);
+               free($2);
+       }
+       ;
 auth_for_downstream: VAR_FOR_DOWNSTREAM STRING_ARG
        {
                OUTYY(("P(for-downstream:%s)\n", $2));
@@ -2791,13 +2892,20 @@ view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
                   && strcmp($3, "always_transparent")!=0
                   && strcmp($3, "always_refuse")!=0
                   && strcmp($3, "always_nxdomain")!=0
+                  && strcmp($3, "always_nodata")!=0
+                  && strcmp($3, "always_deny")!=0
+                  && strcmp($3, "always_null")!=0
                   && strcmp($3, "noview")!=0
-                  && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0) {
+                  && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0
+                  && strcmp($3, "inform_redirect") != 0
+                  && strcmp($3, "ipset") != 0) {
                        yyerror("local-zone type: expected static, deny, "
                                "refuse, redirect, transparent, "
                                "typetransparent, inform, inform_deny, "
-                               "always_transparent, always_refuse, "
-                               "always_nxdomain, noview or nodefault");
+                               "inform_redirect, always_transparent, "
+                               "always_refuse, always_nxdomain, "
+                               "always_nodata, always_deny, always_null, "
+                               "noview, nodefault or ipset");
                        free($2);
                        free($3);
                } else if(strcmp($3, "nodefault")==0) {
index e37c118..cb0f673 100644 (file)
@@ -261,7 +261,7 @@ int dname_is_root(uint8_t* dname);
  * Snip off first label from a dname, returning the parent zone.
  * @param dname: from what to strip off. uncompressed wireformat.
  * @param len: length, adjusted to become less.
- * @return stripped off, or "." if input was ".".
+ * return stripped off, or "." if input was ".".
  */
 void dname_remove_label(uint8_t** dname, size_t* len);
 
@@ -271,7 +271,7 @@ void dname_remove_label(uint8_t** dname, size_t* len);
  * @param len: length, adjusted to become less.
  * @param n: number of labels to strip off (from the left).
  *     if 0, nothing happens.
- * @return stripped off, or "." if input was ".".
+ * return stripped off, or "." if input was ".".
  */
 void dname_remove_labels(uint8_t** dname, size_t* len, int n);
 
index 4830b34..00272fd 100644 (file)
@@ -329,7 +329,10 @@ parse_create_rrset(sldns_buffer* pkt, struct rrset_parse* pset,
                return 0;
        /* copy & decompress */
        if(!parse_rr_copy(pkt, pset, *data)) {
-               if(!region) free(*data);
+               if(!region) {
+                       free(*data);
+                       *data = NULL;
+               }
                return 0;
        }
        return 1;
@@ -394,8 +397,13 @@ parse_copy_decompress_rrset(sldns_buffer* pkt, struct msg_parse* msg,
        pk->rk.type = htons(pset->type);
        pk->rk.rrset_class = pset->rrset_class;
        /** read data part. */
-       if(!parse_create_rrset(pkt, pset, &data, region))
+       if(!parse_create_rrset(pkt, pset, &data, region)) {
+               if(!region) {
+                       free(pk->rk.dname);
+                       pk->rk.dname = NULL;
+               }
                return 0;
+       }
        pk->entry.data = (void*)data;
        pk->entry.key = (void*)pk;
        pk->entry.hash = pset->hash;
@@ -825,9 +833,15 @@ log_dns_msg(const char* str, struct query_info* qinfo, struct reply_info* rep)
        /* not particularly fast but flexible, make wireformat and print */
        sldns_buffer* buf = sldns_buffer_new(65535);
        struct regional* region = regional_create();
-       if(!reply_info_encode(qinfo, rep, 0, rep->flags, buf, 0, 
+       if(!(buf && region)) {
+               log_err("%s: log_dns_msg: out of memory", str);
+               sldns_buffer_free(buf);
+               regional_destroy(region);
+               return;
+       }
+       if(!reply_info_encode(qinfo, rep, 0, rep->flags, buf, 0,
                region, 65535, 1, 0)) {
-               log_info("%s: log_dns_msg: out of memory", str);
+               log_err("%s: log_dns_msg: out of memory", str);
        } else {
                char* s = sldns_wire2str_pkt(sldns_buffer_begin(buf),
                        sldns_buffer_limit(buf));
index a9e9d3a..de6dbd0 100644 (file)
@@ -196,8 +196,6 @@ int
 fptr_whitelist_pending_udp(comm_point_callback_type *fptr)
 {
        if(fptr == &serviced_udp_callback) return 1;
-       else if(fptr == &worker_handle_reply) return 1;
-       else if(fptr == &libworker_handle_reply) return 1;
        return 0;
 }
 
@@ -205,8 +203,6 @@ int
 fptr_whitelist_pending_tcp(comm_point_callback_type *fptr)
 {
        if(fptr == &serviced_tcp_callback) return 1;
-       else if(fptr == &worker_handle_reply) return 1;
-       else if(fptr == &libworker_handle_reply) return 1;
        return 0;
 }
 
@@ -583,6 +579,7 @@ int fptr_whitelist_mesh_cb(mesh_cb_func_type fptr)
        else if(fptr == &probe_answer_cb) return 1;
        else if(fptr == &auth_xfer_probe_lookup_callback) return 1;
        else if(fptr == &auth_xfer_transfer_lookup_callback) return 1;
+       else if(fptr == &auth_zonemd_dnskey_lookup_callback) return 1;
        return 0;
 }
 
index 875851e..b93af01 100644 (file)
 140,
 141,
 142,
-143,
 144,
 145,
 146,
 990,
 991,
 992,
-993,
 995,
 996,
 997,
 5504,
 5505,
 5506,
+5540,
 5553,
 5554,
 5555,
 8006,
 8007,
 8008,
+8017,
 8019,
 8020,
 8021,
 30999,
 31016,
 31029,
+31337,
 31416,
 31457,
 31620,
index 3b5527a..06bc1f5 100644 (file)
@@ -887,7 +887,7 @@ log_cert(unsigned level, const char* str, void* cert)
 }
 #endif /* HAVE_SSL */
 
-#if defined(HAVE_SSL) && defined(HAVE_NGHTTP2)
+#if defined(HAVE_SSL) && defined(HAVE_NGHTTP2) && defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
 static int alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
        unsigned char* outlen, const unsigned char* in, unsigned int inlen,
        void* ATTR_UNUSED(arg))
@@ -1609,5 +1609,4 @@ sock_close(int socket)
 {
        closesocket(socket);
 }
-
 #  endif /* USE_WINSOCK */
index 45b607a..7983527 100644 (file)
@@ -42,6 +42,7 @@
 #ifndef NET_HELP_H
 #define NET_HELP_H
 #include "util/log.h"
+#include "util/random.h"
 struct sock_list;
 struct regional;
 struct config_strlist;
@@ -76,8 +77,6 @@ struct config_strlist;
 
 /** timeout in milliseconds for UDP queries to auth servers. */
 #define UDP_AUTH_QUERY_TIMEOUT 3000
-/** timeout in milliseconds for TCP queries to auth servers. */
-#define TCP_AUTH_QUERY_TIMEOUT 3000
 /** Advertised version of EDNS capabilities */
 #define EDNS_ADVERTISED_VERSION         0
 /** Advertised size of EDNS capabilities */
@@ -94,6 +93,9 @@ extern uint16_t EDNS_ADVERTISED_SIZE;
 /** DNSKEY secure entry point, KSK flag */
 #define DNSKEY_BIT_SEP 0x0001
 
+/** return a random 16-bit number given a random source */
+#define GET_RANDOM_ID(rnd) (((unsigned)ub_random(rnd)>>8) & 0xffff)
+
 /** minimal responses when positive answer */
 extern int MINIMAL_RESPONSES;
 
index a2c0e60..11c642a 100644 (file)
 #include "dnstap/dnstap.h"
 #include "dnscrypt/dnscrypt.h"
 #include "services/listen_dnsport.h"
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
 #ifdef HAVE_OPENSSL_SSL_H
 #include <openssl/ssl.h>
 #endif
@@ -152,7 +162,7 @@ struct internal_signal {
 static struct comm_point* comm_point_create_tcp_handler(
        struct comm_base *base, struct comm_point* parent, size_t bufsize,
        struct sldns_buffer* spoolbuf, comm_point_callback_type* callback,
-       void* callback_arg);
+       void* callback_arg, struct unbound_socket* socket);
 
 /* -------- End of local definitions -------- */
 
@@ -289,6 +299,7 @@ udp_send_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
 #  ifdef ENETDOWN
                case ENETDOWN:
 #  endif
+               case EPERM:
                        if(verbosity < VERB_ALGO)
                                return 0;
                default:
@@ -302,7 +313,7 @@ udp_send_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
                /* 'Cannot assign requested address' also when disconnected */
                || (errno == EADDRNOTAVAIL)
 #  endif
-               ) && verbosity < VERB_DETAIL)
+               ) && verbosity < VERB_ALGO)
                return 0;
 #  ifdef EADDRINUSE
        /* If SO_REUSEADDR is set, we could try to connect to the same server
@@ -408,7 +419,9 @@ static void p_ancil(const char* str, struct comm_reply* r)
                log_info("%s: unknown srctype %d", str, r->srctype);
                return;
        }
+
        if(r->srctype == 6) {
+#ifdef IPV6_PKTINFO
                char buf[1024];
                if(inet_ntop(AF_INET6, &r->pktinfo.v6info.ipi6_addr, 
                        buf, (socklen_t)sizeof(buf)) == 0) {
@@ -416,6 +429,7 @@ static void p_ancil(const char* str, struct comm_reply* r)
                }
                buf[sizeof(buf)-1]=0;
                log_info("%s: %s %d", str, buf, r->pktinfo.v6info.ipi6_ifindex);
+#endif
        } else if(r->srctype == 4) {
 #ifdef IP_PKTINFO
                char buf1[1024], buf2[1024];
@@ -1200,7 +1214,7 @@ ssl_handshake(struct comm_point* c)
        int r;
        if(c->ssl_shake_state == comm_ssl_shake_hs_read) {
                /* read condition satisfied back to writing */
-               comm_point_listen_for_rw(c, 1, 1);
+               comm_point_listen_for_rw(c, 0, 1);
                c->ssl_shake_state = comm_ssl_shake_none;
                return 1;
        }
@@ -1257,7 +1271,11 @@ ssl_handshake(struct comm_point* c)
        if((SSL_get_verify_mode(c->ssl)&SSL_VERIFY_PEER)) {
                /* verification */
                if(SSL_get_verify_result(c->ssl) == X509_V_OK) {
+#ifdef HAVE_SSL_GET1_PEER_CERTIFICATE
+                       X509* x = SSL_get1_peer_certificate(c->ssl);
+#else
                        X509* x = SSL_get_peer_certificate(c->ssl);
+#endif
                        if(!x) {
                                log_addr(VERB_ALGO, "SSL connection failed: "
                                        "no certificate",
@@ -1283,7 +1301,11 @@ ssl_handshake(struct comm_point* c)
 #endif
                        X509_free(x);
                } else {
+#ifdef HAVE_SSL_GET1_PEER_CERTIFICATE
+                       X509* x = SSL_get1_peer_certificate(c->ssl);
+#else
                        X509* x = SSL_get_peer_certificate(c->ssl);
+#endif
                        if(x) {
                                log_cert(VERB_ALGO, "peer certificate", x);
                                X509_free(x);
@@ -1300,6 +1322,7 @@ ssl_handshake(struct comm_point* c)
                        c->repinfo.addrlen);
        }
 
+#ifdef HAVE_SSL_GET0_ALPN_SELECTED
        /* check if http2 use is negotiated */
        if(c->type == comm_http && c->h2_session) {
                const unsigned char *alpn;
@@ -1311,13 +1334,14 @@ ssl_handshake(struct comm_point* c)
                        c->use_h2 = 1;
                }
        }
+#endif
 
        /* setup listen rw correctly */
        if(c->tcp_is_reading) {
                if(c->ssl_shake_state != comm_ssl_shake_read)
                        comm_point_listen_for_rw(c, 1, 0);
        } else {
-               comm_point_listen_for_rw(c, 1, 1);
+               comm_point_listen_for_rw(c, 0, 1);
        }
        c->ssl_shake_state = comm_ssl_shake_none;
        return 1;
@@ -1348,7 +1372,9 @@ ssl_handle_read(struct comm_point* c)
                                        return tcp_req_info_handle_read_close(c->tcp_req_info);
                                return 0; /* shutdown, closed */
                        } else if(want == SSL_ERROR_WANT_READ) {
+#ifdef USE_WINSOCK
                                ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
+#endif
                                return 1; /* read more later */
                        } else if(want == SSL_ERROR_WANT_WRITE) {
                                c->ssl_shake_state = comm_ssl_shake_hs_write;
@@ -1396,7 +1422,9 @@ ssl_handle_read(struct comm_point* c)
                                        return tcp_req_info_handle_read_close(c->tcp_req_info);
                                return 0; /* shutdown, closed */
                        } else if(want == SSL_ERROR_WANT_READ) {
+#ifdef USE_WINSOCK
                                ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
+#endif
                                return 1; /* read more later */
                        } else if(want == SSL_ERROR_WANT_WRITE) {
                                c->ssl_shake_state = comm_ssl_shake_hs_write;
@@ -1489,7 +1517,9 @@ ssl_handle_write(struct comm_point* c)
                                comm_point_listen_for_rw(c, 1, 0);
                                return 1; /* wait for read condition */
                        } else if(want == SSL_ERROR_WANT_WRITE) {
+#ifdef USE_WINSOCK
                                ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE);
+#endif
                                return 1; /* write more later */
                        } else if(want == SSL_ERROR_SYSCALL) {
 #ifdef EPIPE
@@ -1539,7 +1569,9 @@ ssl_handle_write(struct comm_point* c)
                        comm_point_listen_for_rw(c, 1, 0);
                        return 1; /* wait for read condition */
                } else if(want == SSL_ERROR_WANT_WRITE) {
+#ifdef USE_WINSOCK
                        ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE);
+#endif
                        return 1; /* write more later */
                } else if(want == SSL_ERROR_SYSCALL) {
 #ifdef EPIPE
@@ -1620,6 +1652,10 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
                        if(errno == ECONNRESET && verbosity < 2)
                                return 0; /* silence reset by peer */
 #endif
+#ifdef ECONNREFUSED
+                       if(errno == ECONNREFUSED && verbosity < 2)
+                               return 0; /* silence reset by peer */
+#endif
 #ifdef ENETUNREACH
                        if(errno == ENETUNREACH && verbosity < 2)
                                return 0; /* silence it */
@@ -1648,6 +1684,16 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
                        }
 #endif
 #else /* USE_WINSOCK */
+                       if(WSAGetLastError() == WSAECONNREFUSED && verbosity < 2)
+                               return 0;
+                       if(WSAGetLastError() == WSAEHOSTDOWN && verbosity < 2)
+                               return 0;
+                       if(WSAGetLastError() == WSAEHOSTUNREACH && verbosity < 2)
+                               return 0;
+                       if(WSAGetLastError() == WSAENETDOWN && verbosity < 2)
+                               return 0;
+                       if(WSAGetLastError() == WSAENETUNREACH && verbosity < 2)
+                               return 0;
                        if(WSAGetLastError() == WSAECONNRESET)
                                return 0;
                        if(WSAGetLastError() == WSAEINPROGRESS)
@@ -1681,7 +1727,8 @@ comm_point_tcp_handle_read(int fd, struct comm_point* c, int short_ok)
                        (int)sldns_buffer_limit(c->buffer));
        }
 
-       log_assert(sldns_buffer_remaining(c->buffer) > 0);
+       if(sldns_buffer_remaining(c->buffer) == 0)
+               log_err("in comm_point_tcp_handle_read buffer_remaining is not > 0 as expected, continuing with (harmless) 0 length recv");
        r = recv(fd, (void*)sldns_buffer_current(c->buffer), 
                sldns_buffer_remaining(c->buffer), 0);
        if(r == 0) {
@@ -2197,6 +2244,8 @@ ssl_http_read_more(struct comm_point* c)
                log_crypto_err("could not SSL_read");
                return 0;
        }
+       verbose(VERB_ALGO, "ssl http read more skip to %d + %d",
+               (int)sldns_buffer_position(c->buffer), (int)r);
        sldns_buffer_skip(c->buffer, (ssize_t)r);
        return 1;
 #else
@@ -2233,6 +2282,8 @@ http_read_more(int fd, struct comm_point* c)
                        &c->repinfo.addr, c->repinfo.addrlen);
                return 0;
        }
+       verbose(VERB_ALGO, "http read more skip to %d + %d",
+               (int)sldns_buffer_position(c->buffer), (int)r);
        sldns_buffer_skip(c->buffer, r);
        return 1;
 }
@@ -2370,7 +2421,7 @@ http_process_chunk_header(struct comm_point* c)
        return 1;
 }
 
-/** handle nonchunked data segment */
+/** handle nonchunked data segment, 0=fail, 1=wait */
 static int
 http_nonchunk_segment(struct comm_point* c)
 {
@@ -2379,7 +2430,7 @@ http_nonchunk_segment(struct comm_point* c)
         * we are looking to read tcp_byte_count more data
         * and then the transfer is done. */
        size_t remainbufferlen;
-       size_t got_now = sldns_buffer_limit(c->buffer) - c->http_stored;
+       size_t got_now = sldns_buffer_limit(c->buffer);
        if(c->tcp_byte_count <= got_now) {
                /* done, this is the last data fragment */
                c->http_stored = 0;
@@ -2388,13 +2439,12 @@ http_nonchunk_segment(struct comm_point* c)
                (void)(*c->callback)(c, c->cb_arg, NETEVENT_DONE, NULL);
                return 1;
        }
-       c->tcp_byte_count -= got_now;
        /* if we have the buffer space,
         * read more data collected into the buffer */
        remainbufferlen = sldns_buffer_capacity(c->buffer) -
                sldns_buffer_limit(c->buffer);
-       if(remainbufferlen >= c->tcp_byte_count ||
-               remainbufferlen >= 2048) {
+       if(remainbufferlen+got_now >= c->tcp_byte_count ||
+               remainbufferlen >= (c->ssl?16384:2048)) {
                size_t total = sldns_buffer_limit(c->buffer);
                sldns_buffer_clear(c->buffer);
                sldns_buffer_set_position(c->buffer, total);
@@ -2404,6 +2454,7 @@ http_nonchunk_segment(struct comm_point* c)
        }
        /* call callback with this data amount, then
         * wait for more */
+       c->tcp_byte_count -= got_now;
        c->http_stored = 0;
        sldns_buffer_set_position(c->buffer, 0);
        fptr_ok(fptr_whitelist_comm_point(c->callback));
@@ -2762,6 +2813,11 @@ comm_point_http_handle_read(int fd, struct comm_point* c)
                        return 0;
        }
 
+       if(c->http_stored >= sldns_buffer_position(c->buffer)) {
+               /* read did not work but we wanted more data, there is
+                * no bytes to process now. */
+               return 1;
+       }
        sldns_buffer_flip(c->buffer);
        /* if we are partway in a segment of data, position us at the point
         * where we left off previously */
@@ -3184,7 +3240,7 @@ void comm_point_raw_handle_callback(int ATTR_UNUSED(fd),
 
 struct comm_point* 
 comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
-       comm_point_callback_type* callback, void* callback_arg)
+       comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket)
 {
        struct comm_point* c = (struct comm_point*)calloc(1,
                sizeof(struct comm_point));
@@ -3223,6 +3279,7 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
        c->inuse = 0;
        c->callback = callback;
        c->cb_arg = callback_arg;
+       c->socket = socket;
        evbits = UB_EV_READ | UB_EV_PERSIST;
        /* ub_event stuff */
        c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
@@ -3244,7 +3301,7 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
 struct comm_point* 
 comm_point_create_udp_ancil(struct comm_base *base, int fd, 
        sldns_buffer* buffer, 
-       comm_point_callback_type* callback, void* callback_arg)
+       comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket)
 {
        struct comm_point* c = (struct comm_point*)calloc(1,
                sizeof(struct comm_point));
@@ -3283,6 +3340,7 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd,
 #endif
        c->callback = callback;
        c->cb_arg = callback_arg;
+       c->socket = socket;
        evbits = UB_EV_READ | UB_EV_PERSIST;
        /* ub_event stuff */
        c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
@@ -3305,7 +3363,7 @@ static struct comm_point*
 comm_point_create_tcp_handler(struct comm_base *base, 
        struct comm_point* parent, size_t bufsize,
        struct sldns_buffer* spoolbuf, comm_point_callback_type* callback,
-       void* callback_arg)
+       void* callback_arg, struct unbound_socket* socket)
 {
        struct comm_point* c = (struct comm_point*)calloc(1,
                sizeof(struct comm_point));
@@ -3361,6 +3419,7 @@ comm_point_create_tcp_handler(struct comm_base *base,
        c->repinfo.c = c;
        c->callback = callback;
        c->cb_arg = callback_arg;
+       c->socket = socket;
        if(spoolbuf) {
                c->tcp_req_info = tcp_req_info_create(spoolbuf);
                if(!c->tcp_req_info) {
@@ -3400,7 +3459,8 @@ static struct comm_point*
 comm_point_create_http_handler(struct comm_base *base, 
        struct comm_point* parent, size_t bufsize, int harden_large_queries,
        uint32_t http_max_streams, char* http_endpoint,
-       comm_point_callback_type* callback, void* callback_arg)
+       comm_point_callback_type* callback, void* callback_arg,
+       struct unbound_socket* socket)
 {
        struct comm_point* c = (struct comm_point*)calloc(1,
                sizeof(struct comm_point));
@@ -3454,6 +3514,7 @@ comm_point_create_http_handler(struct comm_base *base,
        c->repinfo.c = c;
        c->callback = callback;
        c->cb_arg = callback_arg;
+       c->socket = socket;
 
        c->http_min_version = http_version_2;
        c->http2_stream_max_qbuffer_size = bufsize;
@@ -3518,7 +3579,7 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num,
        uint32_t http_max_streams, char* http_endpoint,
        struct tcl_list* tcp_conn_limit, size_t bufsize,
        struct sldns_buffer* spoolbuf, enum listen_type port_type,
-       comm_point_callback_type* callback, void* callback_arg)
+       comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket)
 {
        struct comm_point* c = (struct comm_point*)calloc(1,
                sizeof(struct comm_point));
@@ -3568,6 +3629,7 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num,
 #endif
        c->callback = NULL;
        c->cb_arg = NULL;
+       c->socket = socket;
        evbits = UB_EV_READ | UB_EV_PERSIST;
        /* ub_event stuff */
        c->ev->ev = ub_event_new(base->eb->base, c->fd, evbits,
@@ -3589,12 +3651,12 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num,
                        port_type == listen_type_ssl ||
                        port_type == listen_type_tcp_dnscrypt) {
                        c->tcp_handlers[i] = comm_point_create_tcp_handler(base,
-                               c, bufsize, spoolbuf, callback, callback_arg);
+                               c, bufsize, spoolbuf, callback, callback_arg, socket);
                } else if(port_type == listen_type_http) {
                        c->tcp_handlers[i] = comm_point_create_http_handler(
                                base, c, bufsize, harden_large_queries,
                                http_max_streams, http_endpoint,
-                               callback, callback_arg);
+                               callback, callback_arg, socket);
                }
                else {
                        log_err("could not create tcp handler, unknown listen "
@@ -3895,11 +3957,13 @@ comm_point_close(struct comm_point* c)
 
        /* close fd after removing from event lists, or epoll.. is messed up */
        if(c->fd != -1 && !c->do_not_close) {
+#ifdef USE_WINSOCK
                if(c->type == comm_tcp || c->type == comm_http) {
                        /* delete sticky events for the fd, it gets closed */
                        ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_READ);
                        ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE);
                }
+#endif
                verbose(VERB_ALGO, "close fd %d", c->fd);
                sock_close(c->fd);
        }
@@ -3970,20 +4034,26 @@ comm_point_send_reply(struct comm_reply *repinfo)
                        comm_point_send_udp_msg(repinfo->c, buffer,
                        (struct sockaddr*)&repinfo->addr, repinfo->addrlen, 0);
 #ifdef USE_DNSTAP
-               if(repinfo->c->dtenv != NULL &&
-                  repinfo->c->dtenv->log_client_response_messages)
-                       dt_msg_send_client_response(repinfo->c->dtenv,
-                       &repinfo->addr, repinfo->c->type, repinfo->c->buffer);
+               /*
+                * sending src (client)/dst (local service) addresses over DNSTAP from udp callback
+                */
+               if(repinfo->c->dtenv != NULL && repinfo->c->dtenv->log_client_response_messages) {
+                       log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen);
+                       log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen);
+                       dt_msg_send_client_response(repinfo->c->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type, repinfo->c->buffer);
+               }
 #endif
        } else {
 #ifdef USE_DNSTAP
-               if(repinfo->c->tcp_parent->dtenv != NULL &&
-                  repinfo->c->tcp_parent->dtenv->log_client_response_messages)
-                       dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv,
-                       &repinfo->addr, repinfo->c->type,
-                       ( repinfo->c->tcp_req_info
-                       ? repinfo->c->tcp_req_info->spool_buffer
-                       : repinfo->c->buffer ));
+               /*
+                * sending src (client)/dst (local service) addresses over DNSTAP from TCP callback
+                */
+               if(repinfo->c->tcp_parent->dtenv != NULL && repinfo->c->tcp_parent->dtenv->log_client_response_messages) {
+                       log_addr(VERB_ALGO, "from local addr", (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->socket->addr->ai_addrlen);
+                       log_addr(VERB_ALGO, "response to client", &repinfo->addr, repinfo->addrlen);
+                       dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv, &repinfo->addr, (void*)repinfo->c->socket->addr->ai_addr, repinfo->c->type,
+                               ( repinfo->c->tcp_req_info? repinfo->c->tcp_req_info->spool_buffer: repinfo->c->buffer ));
+               }
 #endif
                if(repinfo->c->tcp_req_info) {
                        tcp_req_info_send_reply(repinfo->c->tcp_req_info);
index 4a2aa16..c79f99b 100644 (file)
@@ -70,6 +70,7 @@ struct comm_point;
 struct comm_reply;
 struct tcl_list;
 struct ub_event_base;
+struct unbound_socket;
 
 struct mesh_state;
 struct mesh_area;
@@ -169,6 +170,8 @@ struct comm_point {
        /** if the event is added or not */
        int event_added;
 
+       struct unbound_socket* socket;
+
        /** file descriptor for communication point */
        int fd;
 
@@ -495,12 +498,13 @@ struct ub_event_base* comm_base_internal(struct comm_base* b);
  * @param buffer: shared buffer by UDP sockets from this thread.
  * @param callback: callback function pointer.
  * @param callback_arg: will be passed to your callback function.
+ * @param socket: and opened socket properties will be passed to your callback function.
  * @return: returns the allocated communication point. NULL on error.
  * Sets timeout to NULL. Turns off TCP options.
  */
 struct comm_point* comm_point_create_udp(struct comm_base* base,
        int fd, struct sldns_buffer* buffer, 
-       comm_point_callback_type* callback, void* callback_arg);
+       comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket);
 
 /**
  * Create an UDP with ancillary data comm point. Calls malloc.
@@ -511,12 +515,13 @@ struct comm_point* comm_point_create_udp(struct comm_base* base,
  * @param buffer: shared buffer by UDP sockets from this thread.
  * @param callback: callback function pointer.
  * @param callback_arg: will be passed to your callback function.
+ * @param socket: and opened socket properties will be passed to your callback function.
  * @return: returns the allocated communication point. NULL on error.
  * Sets timeout to NULL. Turns off TCP options.
  */
 struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
        int fd, struct sldns_buffer* buffer, 
-       comm_point_callback_type* callback, void* callback_arg);
+       comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket);
 
 /**
  * Create a TCP listener comm point. Calls malloc.
@@ -539,6 +544,7 @@ struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
  *     to select handler type to use.
  * @param callback: callback function pointer for TCP handlers.
  * @param callback_arg: will be passed to your callback function.
+ * @param socket: and opened socket properties will be passed to your callback function.
  * @return: returns the TCP listener commpoint. You can find the
  *     TCP handlers in the array inside the listener commpoint.
  *     returns NULL on error.
@@ -550,7 +556,7 @@ struct comm_point* comm_point_create_tcp(struct comm_base* base,
        struct tcl_list* tcp_conn_limit,
        size_t bufsize, struct sldns_buffer* spoolbuf,
        enum listen_type port_type,
-       comm_point_callback_type* callback, void* callback_arg);
+       comm_point_callback_type* callback, void* callback_arg, struct unbound_socket* socket);
 
 /**
  * Create an outgoing TCP commpoint. No file descriptor is opened, left at -1.
index af8c5bc..51039ab 100644 (file)
@@ -130,6 +130,7 @@ int shm_main_init(struct daemon* daemon)
 
                /* Just release memory unused */
                free(daemon->shm_info);
+               daemon->shm_info = NULL;
 
                return 0;
        }
@@ -143,6 +144,7 @@ int shm_main_init(struct daemon* daemon)
 
                /* Just release memory unused */
                free(daemon->shm_info);
+               daemon->shm_info = NULL;
 
                return 0;
        }
@@ -156,6 +158,7 @@ int shm_main_init(struct daemon* daemon)
 
                /* Just release memory unused */
                free(daemon->shm_info);
+               daemon->shm_info = NULL;
 
                return 0;
        }
@@ -170,6 +173,7 @@ int shm_main_init(struct daemon* daemon)
 
                /* Just release memory unused */
                free(daemon->shm_info);
+               daemon->shm_info = NULL;
 
                return 0;
        }
@@ -210,6 +214,8 @@ void shm_main_shutdown(struct daemon* daemon)
        if (daemon->shm_info->ptr_arr)
                shmdt(daemon->shm_info->ptr_arr);
 
+       free(daemon->shm_info);
+       daemon->shm_info = NULL;
 #else
        (void)daemon;
 #endif /* HAVE_SHMGET */
index bb25eb4..c402662 100644 (file)
@@ -53,21 +53,69 @@ on 1 byte), but shoehorning those bytes into integers efficiently is messy.
 #include "util/storage/lookup3.h"
 #include <stdio.h>      /* defines printf for tests */
 #include <time.h>       /* defines time_t for timings in the test */
-/*#include <stdint.h>     defines uint32_t etc  (from config.h) */
-#include <sys/param.h>  /* attempt to define endianness */
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h> /* attempt to define endianness (solaris) */
-#endif
-#if defined(linux) || defined(__OpenBSD__)
+
+/*
+ * If our build system provides endianness info, signalled by
+ * HAVE_TARGET_ENDIANNESS and the presence or absence of TARGET_IS_BIG_ENDIAN,
+ * use that. Otherwise try to work out the endianness.
+ */
+#if defined(HAVE_TARGET_ENDIANNESS)
+# if defined(TARGET_IS_BIG_ENDIAN)
+#  define HASH_LITTLE_ENDIAN 0
+#  define HASH_BIG_ENDIAN 1
+# else
+#  define HASH_LITTLE_ENDIAN 1
+#  define HASH_BIG_ENDIAN 0
+# endif
+#else
+# include <sys/param.h>  /* attempt to define endianness */
+# ifdef HAVE_SYS_TYPES_H
+#  include <sys/types.h> /* attempt to define endianness (solaris) */
+# endif
+# if defined(linux) || defined(__OpenBSD__)
 #  ifdef HAVE_ENDIAN_H
 #    include <endian.h>    /* attempt to define endianness */
 #  else
 #    include <machine/endian.h> /* on older OpenBSD */
 #  endif
-#endif
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
-#include <sys/endian.h> /* attempt to define endianness */
-#endif
+# endif
+# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
+#  include <sys/endian.h> /* attempt to define endianness */
+# endif
+  /*
+   * My best guess at if you are big-endian or little-endian.  This may
+   * need adjustment.
+   */
+# if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
+      __BYTE_ORDER == __LITTLE_ENDIAN) || \
+     (defined(i386) || defined(__i386__) || defined(__i486__) || \
+      defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL) || defined(__x86))
+#  define HASH_LITTLE_ENDIAN 1
+#  define HASH_BIG_ENDIAN 0
+# elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
+        __BYTE_ORDER == __BIG_ENDIAN) || \
+       (defined(sparc) || defined(__sparc) || defined(__sparc__) || defined(POWERPC) || defined(mc68000) || defined(sel))
+#  define HASH_LITTLE_ENDIAN 0
+#  define HASH_BIG_ENDIAN 1
+# elif defined(_MACHINE_ENDIAN_H_)
+  /* test for machine_endian_h protects failure if some are empty strings */
+#  if defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && _BYTE_ORDER == _BIG_ENDIAN
+#   define HASH_LITTLE_ENDIAN 0
+#   define HASH_BIG_ENDIAN 1
+#  endif
+#  if defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && _BYTE_ORDER == _LITTLE_ENDIAN
+#   define HASH_LITTLE_ENDIAN 1
+#   define HASH_BIG_ENDIAN 0
+#  endif /* _MACHINE_ENDIAN_H_ */
+# else
+#  define HASH_LITTLE_ENDIAN 0
+#  define HASH_BIG_ENDIAN 0
+# endif
+#endif /* defined(HAVE_TARGET_ENDIANNESS) */
+
+#define hashsize(n) ((uint32_t)1<<(n))
+#define hashmask(n) (hashsize(n)-1)
+#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
 
 /* random initial value */
 static uint32_t raninit = (uint32_t)0xdeadbeef;
@@ -78,40 +126,6 @@ hash_set_raninit(uint32_t v)
        raninit = v;
 }
 
-/*
- * My best guess at if you are big-endian or little-endian.  This may
- * need adjustment.
- */
-#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
-     __BYTE_ORDER == __LITTLE_ENDIAN) || \
-    (defined(i386) || defined(__i386__) || defined(__i486__) || \
-     defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL) || defined(__x86))
-# define HASH_LITTLE_ENDIAN 1
-# define HASH_BIG_ENDIAN 0
-#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
-       __BYTE_ORDER == __BIG_ENDIAN) || \
-      (defined(sparc) || defined(__sparc) || defined(__sparc__) || defined(POWERPC) || defined(mc68000) || defined(sel))
-# define HASH_LITTLE_ENDIAN 0
-# define HASH_BIG_ENDIAN 1
-#elif defined(_MACHINE_ENDIAN_H_)
-/* test for machine_endian_h protects failure if some are empty strings */
-# if defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && _BYTE_ORDER == _BIG_ENDIAN
-#  define HASH_LITTLE_ENDIAN 0
-#  define HASH_BIG_ENDIAN 1
-# endif
-# if defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && _BYTE_ORDER == _LITTLE_ENDIAN
-#  define HASH_LITTLE_ENDIAN 1
-#  define HASH_BIG_ENDIAN 0
-# endif /* _MACHINE_ENDIAN_H_ */
-#else
-# define HASH_LITTLE_ENDIAN 0
-# define HASH_BIG_ENDIAN 0
-#endif
-
-#define hashsize(n) ((uint32_t)1<<(n))
-#define hashmask(n) (hashsize(n)-1)
-#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
-
 /*
 -------------------------------------------------------------------------------
 mix -- mix 3 32-bit values reversibly.
index 235bba6..4280d4d 100644 (file)
@@ -666,7 +666,8 @@ ub_winsock_tcp_wouldblock(struct ub_event* ev, int eventbits)
                fptr_ok(ev->vmt != &default_event_vmt ||
                        ev->vmt->winsock_tcp_wouldblock ==
                        my_winsock_tcp_wouldblock);
-               (*ev->vmt->winsock_tcp_wouldblock)(ev, eventbits);
+               if (ev->vmt->winsock_tcp_wouldblock)
+                       (*ev->vmt->winsock_tcp_wouldblock)(ev, eventbits);
        }
 }
 
index 7ce07e0..9643a3d 100644 (file)
@@ -1077,6 +1077,17 @@ trustanchor_state2str(autr_state_type s)
         return " UNKNOWN ";
 }
 
+/** ctime r for autotrust */
+static char* autr_ctime_r(time_t* t, char* s)
+{
+       ctime_r(t, s);
+#ifdef USE_WINSOCK
+       if(strlen(s) > 10 && s[7]==' ' && s[8]=='0')
+               s[8]=' '; /* fix error in windows ctime */
+#endif
+       return s;
+}
+
 /** print ID to file */
 static int
 print_id(FILE* out, char* fname, uint8_t* nm, size_t nmlen, uint16_t dclass)
@@ -1123,13 +1134,13 @@ autr_write_contents(FILE* out, char* fn, struct trust_anchor* tp)
        }
        if(fprintf(out, ";;last_queried: %u ;;%s", 
                (unsigned int)tp->autr->last_queried, 
-               ctime_r(&(tp->autr->last_queried), tmi)) < 0 ||
+               autr_ctime_r(&(tp->autr->last_queried), tmi)) < 0 ||
           fprintf(out, ";;last_success: %u ;;%s", 
                (unsigned int)tp->autr->last_success,
-               ctime_r(&(tp->autr->last_success), tmi)) < 0 ||
+               autr_ctime_r(&(tp->autr->last_success), tmi)) < 0 ||
           fprintf(out, ";;next_probe_time: %u ;;%s", 
                (unsigned int)tp->autr->next_probe_time,
-               ctime_r(&(tp->autr->next_probe_time), tmi)) < 0 ||
+               autr_ctime_r(&(tp->autr->next_probe_time), tmi)) < 0 ||
           fprintf(out, ";;query_failed: %d\n", (int)tp->autr->query_failed)<0
           || fprintf(out, ";;query_interval: %d\n", 
           (int)tp->autr->query_interval) < 0 ||
@@ -1160,7 +1171,7 @@ autr_write_contents(FILE* out, char* fn, struct trust_anchor* tp)
                        ";;lastchange=%u ;;%s", str, (int)ta->s, 
                        trustanchor_state2str(ta->s), (int)ta->pending_count,
                        (unsigned int)ta->last_change, 
-                       ctime_r(&(ta->last_change), tmi)) < 0) {
+                       autr_ctime_r(&(ta->last_change), tmi)) < 0) {
                   log_err("could not write to %s: %s", fn, strerror(errno));
                   free(str);
                   return 0;
@@ -1579,6 +1590,7 @@ key_matches_a_ds(struct module_env* env, struct val_env* ve,
        for(ds_idx=0; ds_idx<num; ds_idx++) {
                if(!ds_digest_algo_is_supported(ds_rrset, ds_idx) ||
                        !ds_key_algo_is_supported(ds_rrset, ds_idx) ||
+                       !dnskey_size_is_supported(dnskey_rrset, key_idx) ||
                        ds_get_digest_algo(ds_rrset, ds_idx) != d)
                        continue;
                if(ds_get_key_algo(ds_rrset, ds_idx)
@@ -1633,7 +1645,8 @@ update_events(struct module_env* env, struct val_env* ve,
                }
                /* is a key of this type supported?. Note rr_list and
                 * packed_rrset are in the same order. */
-               if(!dnskey_algo_is_supported(dnskey_rrset, i)) {
+               if(!dnskey_algo_is_supported(dnskey_rrset, i) ||
+                       !dnskey_size_is_supported(dnskey_rrset, i)) {
                        /* skip unknown algorithm key, it is useless to us */
                        log_nametypeclass(VERB_DETAIL, "trust point has "
                                "unsupported algorithm at", 
@@ -2262,7 +2275,7 @@ autr_debug_print_ta(struct autr_ta* ta)
                return;
        }
        if(str[0]) str[strlen(str)-1]=0; /* remove newline */
-       ctime_r(&ta->last_change, buf);
+       (void)autr_ctime_r(&ta->last_change, buf);
        if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */
        log_info("[%s] %s ;;state:%d ;;pending_count:%d%s%s last:%s",
                trustanchor_state2str(ta->s), str, ta->s, ta->pending_count,
@@ -2289,13 +2302,13 @@ autr_debug_print_tp(struct trust_anchor* tp)
                log_packed_rrset(NO_VERBOSE, "DNSKEY:", tp->dnskey_rrset);
        }
        log_info("file %s", tp->autr->file);
-       ctime_r(&tp->autr->last_queried, buf);
+       (void)autr_ctime_r(&tp->autr->last_queried, buf);
        if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */
        log_info("last_queried: %u %s", (unsigned)tp->autr->last_queried, buf);
-       ctime_r(&tp->autr->last_success, buf);
+       (void)autr_ctime_r(&tp->autr->last_success, buf);
        if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */
        log_info("last_success: %u %s", (unsigned)tp->autr->last_success, buf);
-       ctime_r(&tp->autr->next_probe_time, buf);
+       (void)autr_ctime_r(&tp->autr->next_probe_time, buf);
        if(buf[0]) buf[strlen(buf)-1]=0; /* remove newline */
        log_info("next_probe_time: %u %s", (unsigned)tp->autr->next_probe_time,
                buf);
index 9b6574c..b1a54e1 100644 (file)
@@ -971,7 +971,8 @@ anchors_dnskey_unsupported(struct trust_anchor* ta)
 {
        size_t i, num = 0;
        for(i=0; i<ta->numDNSKEY; i++) {
-               if(!dnskey_algo_is_supported(ta->dnskey_rrset, i))
+               if(!dnskey_algo_is_supported(ta->dnskey_rrset, i) ||
+                       !dnskey_size_is_supported(ta->dnskey_rrset, i))
                        num++;
        }
        return num;
@@ -1048,6 +1049,10 @@ anchors_apply_cfg(struct val_anchors* anchors, struct config_file* cfg)
        const char** zstr;
        char* nm;
        sldns_buffer* parsebuf = sldns_buffer_new(65535);
+       if(!parsebuf) {
+               log_err("malloc error in anchors_apply_cfg.");
+               return 0;
+       }
        if(cfg->insecure_lan_zones) {
                for(zstr = as112_zones; *zstr; zstr++) {
                        if(!anchor_insert_insecure(anchors, *zstr)) {
index 032d2ae..a4e5b31 100644 (file)
@@ -180,6 +180,7 @@ nsec_verify_rrset(struct module_env* env, struct val_env* ve,
 {
        struct packed_rrset_data* d = (struct packed_rrset_data*)
                nsec->entry.data;
+       if(!d) return 0;
        if(d->security == sec_status_secure)
                return 1;
        rrset_check_sec_status(env->rrset_cache, nsec, *env->now);
index 15cccf0..7abf66f 100644 (file)
@@ -141,6 +141,69 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
 #endif
 }
 
+/** hash structure for keeping track of running hashes */
+struct secalgo_hash {
+       /** the openssl message digest context */
+       EVP_MD_CTX* ctx;
+};
+
+/** create secalgo hash with hash type */
+static struct secalgo_hash* secalgo_hash_create_md(const EVP_MD* md)
+{
+       struct secalgo_hash* h;
+       if(!md)
+               return NULL;
+       h = calloc(1, sizeof(*h));
+       if(!h)
+               return NULL;
+       h->ctx = EVP_MD_CTX_create();
+       if(!h->ctx) {
+               free(h);
+               return NULL;
+       }
+       if(!EVP_DigestInit_ex(h->ctx, md, NULL)) {
+               EVP_MD_CTX_destroy(h->ctx);
+               free(h);
+               return NULL;
+       }
+       return h;
+}
+
+struct secalgo_hash* secalgo_hash_create_sha384(void)
+{
+       return secalgo_hash_create_md(EVP_sha384());
+}
+
+struct secalgo_hash* secalgo_hash_create_sha512(void)
+{
+       return secalgo_hash_create_md(EVP_sha512());
+}
+
+int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
+{
+       return EVP_DigestUpdate(hash->ctx, (unsigned char*)data,
+               (unsigned int)len);
+}
+
+int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
+        size_t maxlen, size_t* resultlen)
+{
+       if(EVP_MD_CTX_size(hash->ctx) > (int)maxlen) {
+               *resultlen = 0;
+               log_err("secalgo_hash_final: hash buffer too small");
+               return 0;
+       }
+       *resultlen = EVP_MD_CTX_size(hash->ctx);
+       return EVP_DigestFinal_ex(hash->ctx, result, NULL);
+}
+
+void secalgo_hash_delete(struct secalgo_hash* hash)
+{
+       if(!hash) return;
+       EVP_MD_CTX_destroy(hash->ctx);
+       free(hash);
+}
+
 /**
  * Return size of DS digest according to its hash algorithm.
  * @param algo: DS digest algo.
@@ -450,29 +513,13 @@ static int
 setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type, 
        unsigned char* key, size_t keylen)
 {
-#if defined(USE_DSA) && defined(USE_SHA1)
-       DSA* dsa;
-#endif
-       RSA* rsa;
-
        switch(algo) {
 #if defined(USE_DSA) && defined(USE_SHA1)
                case LDNS_DSA:
                case LDNS_DSA_NSEC3:
-                       *evp_key = EVP_PKEY_new();
+                       *evp_key = sldns_key_dsa2pkey_raw(key, keylen);
                        if(!*evp_key) {
-                               log_err("verify: malloc failure in crypto");
-                               return 0;
-                       }
-                       dsa = sldns_key_buf2dsa_raw(key, keylen);
-                       if(!dsa) {
-                               verbose(VERB_QUERY, "verify: "
-                                       "sldns_key_buf2dsa_raw failed");
-                               return 0;
-                       }
-                       if(EVP_PKEY_assign_DSA(*evp_key, dsa) == 0) {
-                               verbose(VERB_QUERY, "verify: "
-                                       "EVP_PKEY_assign_DSA failed");
+                               verbose(VERB_QUERY, "verify: sldns_key_dsa2pkey failed");
                                return 0;
                        }
 #ifdef HAVE_EVP_DSS1
@@ -495,20 +542,9 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
 #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2)
                case LDNS_RSASHA512:
 #endif
-                       *evp_key = EVP_PKEY_new();
+                       *evp_key = sldns_key_rsa2pkey_raw(key, keylen);
                        if(!*evp_key) {
-                               log_err("verify: malloc failure in crypto");
-                               return 0;
-                       }
-                       rsa = sldns_key_buf2rsa_raw(key, keylen);
-                       if(!rsa) {
-                               verbose(VERB_QUERY, "verify: "
-                                       "sldns_key_buf2rsa_raw SHA failed");
-                               return 0;
-                       }
-                       if(EVP_PKEY_assign_RSA(*evp_key, rsa) == 0) {
-                               verbose(VERB_QUERY, "verify: "
-                                       "EVP_PKEY_assign_RSA SHA failed");
+                               verbose(VERB_QUERY, "verify: sldns_key_rsa2pkey SHA failed");
                                return 0;
                        }
 
@@ -532,20 +568,9 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
 #endif /* defined(USE_SHA1) || (defined(HAVE_EVP_SHA256) && defined(USE_SHA2)) || (defined(HAVE_EVP_SHA512) && defined(USE_SHA2)) */
 
                case LDNS_RSAMD5:
-                       *evp_key = EVP_PKEY_new();
+                       *evp_key = sldns_key_rsa2pkey_raw(key, keylen);
                        if(!*evp_key) {
-                               log_err("verify: malloc failure in crypto");
-                               return 0;
-                       }
-                       rsa = sldns_key_buf2rsa_raw(key, keylen);
-                       if(!rsa) {
-                               verbose(VERB_QUERY, "verify: "
-                                       "sldns_key_buf2rsa_raw MD5 failed");
-                               return 0;
-                       }
-                       if(EVP_PKEY_assign_RSA(*evp_key, rsa) == 0) {
-                               verbose(VERB_QUERY, "verify: "
-                                       "EVP_PKEY_assign_RSA MD5 failed");
+                               verbose(VERB_QUERY, "verify: sldns_key_rsa2pkey MD5 failed");
                                return 0;
                        }
                        *digest_type = EVP_md5();
@@ -823,6 +848,64 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
        (void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len);
 }
 
+/** the secalgo hash structure */
+struct secalgo_hash {
+       /** hash context */
+       HASHContext* ctx;
+};
+
+/** create hash struct of type */
+static struct secalgo_hash* secalgo_hash_create_type(HASH_HashType tp)
+{
+       struct secalgo_hash* h = calloc(1, sizeof(*h));
+       if(!h)
+               return NULL;
+       h->ctx = HASH_Create(tp);
+       if(!h->ctx) {
+               free(h);
+               return NULL;
+       }
+       return h;
+}
+
+struct secalgo_hash* secalgo_hash_create_sha384(void)
+{
+       return secalgo_hash_create_type(HASH_AlgSHA384);
+}
+
+struct secalgo_hash* secalgo_hash_create_sha512(void)
+{
+       return secalgo_hash_create_type(HASH_AlgSHA512);
+}
+
+int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
+{
+       HASH_Update(hash->ctx, (unsigned char*)data, (unsigned int)len);
+       return 1;
+}
+
+int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
+        size_t maxlen, size_t* resultlen)
+{
+       unsigned int reslen = 0;
+       if(HASH_ResultLenContext(hash->ctx) > (unsigned int)maxlen) {
+               *resultlen = 0;
+               log_err("secalgo_hash_final: hash buffer too small");
+               return 0;
+       }
+       HASH_End(hash->ctx, (unsigned char*)result, &reslen,
+               (unsigned int)maxlen);
+       *resultlen = (size_t)reslen;
+       return 1;
+}
+
+void secalgo_hash_delete(struct secalgo_hash* hash)
+{
+       if(!hash) return;
+       HASH_Destroy(hash->ctx);
+       free(hash);
+}
+
 size_t
 ds_digest_size_supported(int algo)
 {
@@ -1451,6 +1534,82 @@ secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
        _digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res);
 }
 
+/** secalgo hash structure */
+struct secalgo_hash {
+       /** if it is 384 or 512 */
+       int active;
+       /** context for sha384 */
+       struct sha384_ctx ctx384;
+       /** context for sha512 */
+       struct sha512_ctx ctx512;
+};
+
+struct secalgo_hash* secalgo_hash_create_sha384(void)
+{
+       struct secalgo_hash* h = calloc(1, sizeof(*h));
+       if(!h)
+               return NULL;
+       h->active = 384;
+       sha384_init(&h->ctx384);
+       return h;
+}
+
+struct secalgo_hash* secalgo_hash_create_sha512(void)
+{
+       struct secalgo_hash* h = calloc(1, sizeof(*h));
+       if(!h)
+               return NULL;
+       h->active = 512;
+       sha512_init(&h->ctx512);
+       return h;
+}
+
+int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
+{
+       if(hash->active == 384) {
+               sha384_update(&hash->ctx384, len, data);
+       } else if(hash->active == 512) {
+               sha512_update(&hash->ctx512, len, data);
+       } else {
+               return 0;
+       }
+       return 1;
+}
+
+int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
+        size_t maxlen, size_t* resultlen)
+{
+       if(hash->active == 384) {
+               if(SHA384_DIGEST_SIZE > maxlen) {
+                       *resultlen = 0;
+                       log_err("secalgo_hash_final: hash buffer too small");
+                       return 0;
+               }
+               *resultlen = SHA384_DIGEST_SIZE;
+               sha384_digest(&hash->ctx384, SHA384_DIGEST_SIZE,
+                       (unsigned char*)result);
+       } else if(hash->active == 512) {
+               if(SHA512_DIGEST_SIZE > maxlen) {
+                       *resultlen = 0;
+                       log_err("secalgo_hash_final: hash buffer too small");
+                       return 0;
+               }
+               *resultlen = SHA512_DIGEST_SIZE;
+               sha512_digest(&hash->ctx512, SHA512_DIGEST_SIZE,
+                       (unsigned char*)result);
+       } else {
+               *resultlen = 0;
+               return 0;
+       }
+       return 1;
+}
+
+void secalgo_hash_delete(struct secalgo_hash* hash)
+{
+       if(!hash) return;
+       free(hash);
+}
+
 /**
  * Return size of DS digest according to its hash algorithm.
  * @param algo: DS digest algo.
index 52aaeb9..8b6080d 100644 (file)
@@ -43,6 +43,7 @@
 #ifndef VALIDATOR_VAL_SECALGO_H
 #define VALIDATOR_VAL_SECALGO_H
 struct sldns_buffer;
+struct secalgo_hash;
 
 /** Return size of nsec3 hash algorithm, 0 if not supported */
 size_t nsec3_hash_algo_size_supported(int id);
@@ -67,6 +68,48 @@ int secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
  */
 void secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res);
 
+/**
+ * Start a hash of type sha384. Allocates structure, then inits it,
+ * so that a series of updates can be performed, before the final result.
+ * @return hash structure.  NULL on malloc failure or no support.
+ */
+struct secalgo_hash* secalgo_hash_create_sha384(void);
+
+/**
+ * Start a hash of type sha512. Allocates structure, then inits it,
+ * so that a series of updates can be performed, before the final result.
+ * @return hash structure.  NULL on malloc failure or no support.
+ */
+struct secalgo_hash* secalgo_hash_create_sha512(void);
+
+/**
+ * Update a hash with more information to add to it.
+ * @param hash: the hash that is updated.
+ * @param data: data to add.
+ * @param len: length of data.
+ * @return false on failure.
+ */
+int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len);
+
+/**
+ * Get the final result of the hash.
+ * @param hash: the hash that has had updates to it.
+ * @param result: where to store the result.
+ * @param maxlen: length of the result buffer, eg. size of the allocation.
+ *     If not large enough the routine fails.
+ * @param resultlen: the length of the result, returned to the caller.
+ *     How much of maxlen is used.
+ * @return false on failure.
+ */
+int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
+       size_t maxlen, size_t* resultlen);
+
+/**
+ * Delete the hash structure.
+ * @param hash: the hash to delete.
+ */
+void secalgo_hash_delete(struct secalgo_hash* hash);
+
 /**
  * Return size of DS digest according to its hash algorithm.
  * @param algo: DS digest algo.
index de730f6..b15fba3 100644 (file)
@@ -386,6 +386,49 @@ int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
                dnskey_idx));
 }
 
+int dnskey_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
+       size_t dnskey_idx)
+{
+#ifdef DEPRECATE_RSA_1024
+       uint8_t* rdata;
+       size_t len;
+       int alg = dnskey_get_algo(dnskey_rrset, dnskey_idx);
+       size_t keysize;
+
+       rrset_get_rdata(dnskey_rrset, dnskey_idx, &rdata, &len);
+       if(len < 2+4)
+               return 0;
+       keysize = sldns_rr_dnskey_key_size_raw(rdata+2+4, len-2-4, alg);
+
+       switch((sldns_algorithm)alg) {
+       case LDNS_RSAMD5:
+       case LDNS_RSASHA1:
+       case LDNS_RSASHA1_NSEC3:
+       case LDNS_RSASHA256:
+       case LDNS_RSASHA512:
+               /* reject RSA keys of 1024 bits and shorter */
+               if(keysize <= 1024)
+                       return 0;
+               break;
+       default:
+               break;
+       }
+#else
+       (void)dnskey_rrset; (void)dnskey_idx;
+#endif /* DEPRECATE_RSA_1024 */
+       return 1;
+}
+
+int dnskeyset_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset)
+{
+       size_t i, num = rrset_get_count(dnskey_rrset);
+       for(i=0; i<num; i++) {
+               if(!dnskey_size_is_supported(dnskey_rrset, i))
+                       return 0;
+       }
+       return 1;
+}
+
 void algo_needs_init_dnskey_add(struct algo_needs* n,
         struct ub_packed_rrset_key* dnskey, uint8_t* sigalg)
 {
@@ -1187,7 +1230,7 @@ rrset_canonical(struct regional* region, sldns_buffer* buf,
         * section, to prevent that a wildcard synthesized NSEC can be used in
         * the non-existence proves. */
        if(ntohs(k->rk.type) == LDNS_RR_TYPE_NSEC &&
-               section == LDNS_SECTION_AUTHORITY) {
+               section == LDNS_SECTION_AUTHORITY && qstate) {
                k->rk.dname = regional_alloc_init(qstate->region, can_owner,
                        can_owner_len);
                if(!k->rk.dname)
@@ -1199,6 +1242,59 @@ rrset_canonical(struct regional* region, sldns_buffer* buf,
        return 1;
 }
 
+int
+rrset_canonicalize_to_buffer(struct regional* region, sldns_buffer* buf,
+       struct ub_packed_rrset_key* k)
+{
+       struct rbtree_type* sortree = NULL;
+       struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data;
+       uint8_t* can_owner = NULL;
+       size_t can_owner_len = 0;
+       struct canon_rr* walk;
+       struct canon_rr* rrs;
+
+       sortree = (struct rbtree_type*)regional_alloc(region,
+               sizeof(rbtree_type));
+       if(!sortree)
+               return 0;
+       if(d->count > RR_COUNT_MAX)
+               return 0; /* integer overflow protection */
+       rrs = regional_alloc(region, sizeof(struct canon_rr)*d->count);
+       if(!rrs) {
+               return 0;
+       }
+       rbtree_init(sortree, &canonical_tree_compare);
+       canonical_sort(k, d, sortree, rrs);
+
+       sldns_buffer_clear(buf);
+       RBTREE_FOR(walk, struct canon_rr*, sortree) {
+               /* see if there is enough space left in the buffer */
+               if(sldns_buffer_remaining(buf) < can_owner_len + 2 + 2 + 4
+                       + d->rr_len[walk->rr_idx]) {
+                       log_err("verify: failed to canonicalize, "
+                               "rrset too big");
+                       return 0;
+               }
+               /* determine canonical owner name */
+               if(can_owner)
+                       sldns_buffer_write(buf, can_owner, can_owner_len);
+               else    {
+                       can_owner = sldns_buffer_current(buf);
+                       sldns_buffer_write(buf, k->rk.dname, k->rk.dname_len);
+                       query_dname_tolower(can_owner);
+                       can_owner_len = k->rk.dname_len;
+               }
+               sldns_buffer_write(buf, &k->rk.type, 2);
+               sldns_buffer_write(buf, &k->rk.rrset_class, 2);
+               sldns_buffer_write_u32(buf, d->rr_ttl[walk->rr_idx]);
+               sldns_buffer_write(buf, d->rr_data[walk->rr_idx],
+                       d->rr_len[walk->rr_idx]);
+               canonicalize_rdata(buf, k, d->rr_len[walk->rr_idx]);
+       }
+       sldns_buffer_flip(buf);
+       return 1;
+}
+
 /** pretty print rrsig error with dates */
 static void
 sigdate_error(const char* str, int32_t expi, int32_t incep, int32_t now)
index 755a1d6..bbb9578 100644 (file)
@@ -180,6 +180,23 @@ uint16_t ds_get_keytag(struct ub_packed_rrset_key* ds_rrset, size_t ds_idx);
 int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset, 
        size_t dnskey_idx);
 
+/**
+ * See if the DNSKEY size at that algorithm is supported.
+ * @param dnskey_rrset: DNSKEY rrset.
+ * @param dnskey_idx: index of RR in rrset.
+ * @return true if supported.
+ */
+int dnskey_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
+       size_t dnskey_idx);
+
+/**
+ * See if the DNSKEY size at that algorithm is supported for all the
+ * RRs in the DNSKEY RRset.
+ * @param dnskey_rrset: DNSKEY rrset.
+ * @return true if supported.
+ */
+int dnskeyset_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset);
+
 /** 
  * See if DS digest algorithm is supported 
  * @param ds_rrset: DS rrset
@@ -334,4 +351,16 @@ int canonical_tree_compare(const void* k1, const void* k2);
 int rrset_canonical_equal(struct regional* region,
        struct ub_packed_rrset_key* k1, struct ub_packed_rrset_key* k2);
 
+/**
+ * Canonicalize an rrset into the buffer.  For an auth zone record, so
+ * this does not use a signature, or the RRSIG TTL or the wildcard label
+ * count from the RRSIG.
+ * @param region: temporary region.
+ * @param buf: the buffer to use.
+ * @param k: the rrset to insert.
+ * @return false on alloc error.
+ */
+int rrset_canonicalize_to_buffer(struct regional* region,
+       struct sldns_buffer* buf, struct ub_packed_rrset_key* k);
+
 #endif /* VALIDATOR_VAL_SIGCRYPT_H */
index 2f36fcc..dd8d320 100644 (file)
@@ -418,7 +418,7 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
        struct module_qstate* qstate)
 {
        enum sec_status sec = sec_status_bogus;
-       size_t i, num, numchecked = 0, numhashok = 0;
+       size_t i, num, numchecked = 0, numhashok = 0, numsizesupp = 0;
        num = rrset_get_count(dnskey_rrset);
        for(i=0; i<num; i++) {
                /* Skip DNSKEYs that don't match the basic criteria. */
@@ -441,6 +441,11 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
                        continue;
                }
                numhashok++;
+               if(!dnskey_size_is_supported(dnskey_rrset, i)) {
+                       verbose(VERB_ALGO, "DS okay but that DNSKEY size is not supported");
+                       numsizesupp++;
+                       continue;
+               }
                verbose(VERB_ALGO, "DS match digest ok, trying signature");
 
                /* Otherwise, we have a match! Make sure that the DNSKEY 
@@ -452,6 +457,10 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve,
                }
                /* If it didn't validate with the DNSKEY, try the next one! */
        }
+       if(numsizesupp != 0) {
+               /* there is a working DS, but that DNSKEY is not supported */
+               return sec_status_insecure;
+       }
        if(numchecked == 0)
                algo_needs_reason(env, ds_get_key_algo(ds_rrset, ds_idx),
                        reason, "no keys have a DS");
@@ -519,17 +528,24 @@ val_verify_DNSKEY_with_DS(struct module_env* env, struct val_env* ve,
                        continue;
                }
 
+               sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
+                       ds_rrset, i, reason, qstate);
+               if(sec == sec_status_insecure)
+                       continue;
+
                /* Once we see a single DS with a known digestID and 
                 * algorithm, we cannot return INSECURE (with a 
                 * "null" KeyEntry). */
                has_useful_ds = 1;
 
-               sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset, 
-                       ds_rrset, i, reason, qstate);
                if(sec == sec_status_secure) {
                        if(!sigalg || algo_needs_set_secure(&needs,
                                (uint8_t)ds_get_key_algo(ds_rrset, i))) {
                                verbose(VERB_ALGO, "DS matched DNSKEY.");
+                               if(!dnskeyset_size_is_supported(dnskey_rrset)) {
+                                       verbose(VERB_ALGO, "DS works, but dnskeyset contain keys that are unsupported, treat as insecure");
+                                       return sec_status_insecure;
+                               }
                                return sec_status_secure;
                        }
                } else if(sigalg && sec == sec_status_bogus) {
@@ -631,17 +647,24 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
                        ds_get_digest_algo(ta_ds, i) != digest_algo)
                        continue;
 
+               sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset,
+                       ta_ds, i, reason, qstate);
+               if(sec == sec_status_insecure)
+                       continue;
+
                /* Once we see a single DS with a known digestID and 
                 * algorithm, we cannot return INSECURE (with a 
                 * "null" KeyEntry). */
                has_useful_ta = 1;
 
-               sec = verify_dnskeys_with_ds_rr(env, ve, dnskey_rrset, 
-                       ta_ds, i, reason, qstate);
                if(sec == sec_status_secure) {
                        if(!sigalg || algo_needs_set_secure(&needs,
                                (uint8_t)ds_get_key_algo(ta_ds, i))) {
                                verbose(VERB_ALGO, "DS matched DNSKEY.");
+                               if(!dnskeyset_size_is_supported(dnskey_rrset)) {
+                                       verbose(VERB_ALGO, "trustanchor works, but dnskeyset contain keys that are unsupported, treat as insecure");
+                                       return sec_status_insecure;
+                               }
                                return sec_status_secure;
                        }
                } else if(sigalg && sec == sec_status_bogus) {
@@ -658,6 +681,8 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
                /* Check to see if we can understand this DNSKEY */
                if(!dnskey_algo_is_supported(ta_dnskey, i))
                        continue;
+               if(!dnskey_size_is_supported(ta_dnskey, i))
+                       continue;
 
                /* we saw a useful TA */
                has_useful_ta = 1;
@@ -668,6 +693,10 @@ val_verify_DNSKEY_with_TA(struct module_env* env, struct val_env* ve,
                        if(!sigalg || algo_needs_set_secure(&needs,
                                (uint8_t)dnskey_get_algo(ta_dnskey, i))) {
                                verbose(VERB_ALGO, "anchor matched DNSKEY.");
+                               if(!dnskeyset_size_is_supported(dnskey_rrset)) {
+                                       verbose(VERB_ALGO, "trustanchor works, but dnskeyset contain keys that are unsupported, treat as insecure");
+                                       return sec_status_insecure;
+                               }
                                return sec_status_secure;
                        }
                } else if(sigalg && sec == sec_status_bogus) {
index e12180b..d4d48d9 100644 (file)
@@ -137,6 +137,7 @@ val_apply_cfg(struct module_env* env, struct val_env* val_env,
        val_env->date_override = cfg->val_date_override;
        val_env->skew_min = cfg->val_sig_skew_min;
        val_env->skew_max = cfg->val_sig_skew_max;
+       val_env->max_restart = cfg->val_max_restart;
        c = cfg_count_numbers(cfg->val_nsec3_key_iterations);
        if(c < 1 || (c&1)) {
                log_err("validator: unparseable or odd nsec3 key "
@@ -1487,7 +1488,7 @@ processInit(struct module_qstate* qstate, struct val_qstate* vq,
        enum val_classification subtype = val_classify_response(
                qstate->query_flags, &qstate->qinfo, &vq->qchase, 
                vq->orig_msg->rep, vq->rrset_skip);
-       if(vq->restart_count > VAL_MAX_RESTART_COUNT) {
+       if(vq->restart_count > ve->max_restart) {
                verbose(VERB_ALGO, "restart count exceeded");
                return val_error(qstate, id);
        }
@@ -1640,7 +1641,7 @@ processInit(struct module_qstate* qstate, struct val_qstate* vq,
                        errinf(qstate, key_entry_get_reason(vq->key_entry));
                }
                /* no retries, stop bothering the authority until timeout */
-               vq->restart_count = VAL_MAX_RESTART_COUNT;
+               vq->restart_count = ve->max_restart;
                vq->chase_reply->security = sec_status_bogus;
                vq->state = VAL_FINISHED_STATE;
                return 1;
@@ -1848,7 +1849,7 @@ processValidate(struct module_qstate* qstate, struct val_qstate* vq,
                        LDNS_RR_TYPE_DNSKEY, vq->key_entry->key_class);
                vq->chase_reply->security = sec_status_bogus;
                errinf(qstate, "while building chain of trust");
-               if(vq->restart_count >= VAL_MAX_RESTART_COUNT)
+               if(vq->restart_count >= ve->max_restart)
                        key_cache_insert(ve->kcache, vq->key_entry, qstate);
                return 1;
        }
@@ -2064,7 +2065,7 @@ processFinished(struct module_qstate* qstate, struct val_qstate* vq,
         * endless bogus revalidation */
        if(vq->orig_msg->rep->security == sec_status_bogus) {
                /* see if we can try again to fetch data */
-               if(vq->restart_count < VAL_MAX_RESTART_COUNT) {
+               if(vq->restart_count < ve->max_restart) {
                        int restart_count = vq->restart_count+1;
                        verbose(VERB_ALGO, "validation failed, "
                                "blacklist and retry to fetch data");
@@ -2605,6 +2606,7 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq,
        int id, int rcode, struct dns_msg* msg, struct query_info* qinfo,
        struct sock_list* origin)
 {
+       struct val_env* ve = (struct val_env*)qstate->env->modinfo[id];
        struct key_entry_key* dske = NULL;
        uint8_t* olds = vq->empty_DS_name;
        vq->empty_DS_name = NULL;
@@ -2638,7 +2640,7 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq,
                vq->chain_blacklist = NULL; /* fresh blacklist for next part*/
                /* Keep the forState.state on FINDKEY. */
        } else if(key_entry_isbad(dske) 
-               && vq->restart_count < VAL_MAX_RESTART_COUNT) {
+               && vq->restart_count < ve->max_restart) {
                vq->empty_DS_name = olds;
                val_blacklist(&vq->chain_blacklist, qstate->region, origin, 1);
                qstate->errinf = NULL;
@@ -2691,7 +2693,7 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
                /* bad response */
                verbose(VERB_DETAIL, "Missing DNSKEY RRset in response to "
                        "DNSKEY query.");
-               if(vq->restart_count < VAL_MAX_RESTART_COUNT) {
+               if(vq->restart_count < ve->max_restart) {
                        val_blacklist(&vq->chain_blacklist, qstate->region,
                                origin, 1);
                        qstate->errinf = NULL;
@@ -2730,7 +2732,7 @@ process_dnskey_response(struct module_qstate* qstate, struct val_qstate* vq,
         * state. */
        if(!key_entry_isgood(vq->key_entry)) {
                if(key_entry_isbad(vq->key_entry)) {
-                       if(vq->restart_count < VAL_MAX_RESTART_COUNT) {
+                       if(vq->restart_count < ve->max_restart) {
                                val_blacklist(&vq->chain_blacklist, 
                                        qstate->region, origin, 1);
                                qstate->errinf = NULL;
@@ -2807,7 +2809,7 @@ process_prime_response(struct module_qstate* qstate, struct val_qstate* vq,
        lock_basic_unlock(&ta->lock);
        if(vq->key_entry) {
                if(key_entry_isbad(vq->key_entry) 
-                       && vq->restart_count < VAL_MAX_RESTART_COUNT) {
+                       && vq->restart_count < ve->max_restart) {
                        val_blacklist(&vq->chain_blacklist, qstate->region, 
                                origin, 1);
                        qstate->errinf = NULL;
index 35da192..a928e10 100644 (file)
@@ -64,9 +64,6 @@ struct config_strlist;
  */
 #define BOGUS_KEY_TTL  60 /* seconds */
 
-/** max number of query restarts, number of IPs to probe */
-#define VAL_MAX_RESTART_COUNT 5
-
 /** Root key sentinel is ta preamble */
 #define SENTINEL_IS            "root-key-sentinel-is-ta-"
 /** Root key sentinel is not ta preamble */
@@ -95,6 +92,9 @@ struct val_env {
        /** clock skew max for signatures */
        int32_t skew_max;
 
+       /** max number of query restarts, number of IPs to probe */
+       int32_t max_restart;
+
        /** TTL for bogus data; used instead of untrusted TTL from data.
         * Bogus data will not be verified more often than this interval. 
         * seconds. */